[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdelibs/khtml
From:       Allan Sandfeld Jensen <kde () carewolf ! com>
Date:       2010-11-14 22:59:45
Message-ID: 20101114225945.405DAAC8A1 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1197123 by carewolf:

Use less memory by sharing more RenderStyle sub-objects between elements.

 M  +44 -1     css/cssstyleselector.cpp  
 M  +2 -0      css/cssstyleselector.h  
 M  +22 -0     rendering/render_style.cpp  
 M  +1 -0      rendering/render_style.h  


--- trunk/KDE/kdelibs/khtml/css/cssstyleselector.cpp #1197122:1197123
@@ -3,7 +3,7 @@
  *
  * Copyright 1999-2003 Lars Knoll (knoll@kde.org)
  * Copyright 2003-2004 Apple Computer, Inc.
- * Copyright 2004-2006 Allan Sandfeld Jensen (kde@carewolf.com)
+ * Copyright 2004-2010 Allan Sandfeld Jensen (kde@carewolf.com)
  * Copyright 2004-2008 Germain Garand (germain@ebooksfrance.org)
  * Copyright 2008 Vyacheslav Tokarev (tsjoker@gmail.com)
  *           (C) 2005, 2006, 2008 Apple Computer, Inc.
@@ -543,6 +543,44 @@
 
 #undef MAXFONTSIZES
 
+RenderStyle* CSSStyleSelector::locateSimilarStyle()
+{
+    ElementImpl *s=0, *t=0, *c=0;
+    if (!element) return 0;
+    // Check previous siblings.
+    unsigned count = 0;
+    NodeImpl* n;
+    do {
+        for (n = element->previousSibling(); n && !n->isElementNode(); n = \
n->previousSibling()); +        if (!n) break;
+        ElementImpl *e = static_cast<ElementImpl*>(n);
+        if (++count > 10) break;
+        if (!s) s = e; // sibling match
+        if (e->id() != element->id()) continue;
+        if (!t) t = e; // tag match
+        if (element->hasClass()) {
+            if (!e->hasClass()) continue;
+            const DOMString& class1 = element->getAttribute(ATTR_CLASS);
+            const DOMString& class2 = e->getAttribute(ATTR_CLASS);
+            if  (class1 != class2) continue;
+        }
+        if (!c) c = e; // class match
+        break;
+    } while(true);
+
+    // if possible return sibling that matches tag and class
+    if (c && c->renderer() && c->renderer()->style()) return c->renderer()->style();
+    // second best: return sibling that matches tag
+    if (t && t->renderer() && t->renderer()->style()) return t->renderer()->style();
+    // third best: return sibling element
+    if (s && s->renderer() && s->renderer()->style()) return s->renderer()->style();
+    // last attempt: return parent element
+    NodeImpl* p = element->parentNode();
+    if (p && p->renderer()) return p->renderer()->style();
+
+    return 0;
+}
+
 static inline void bubbleSort( CSSOrderedProperty **b, CSSOrderedProperty **e )
 {
     while( b < e ) {
@@ -774,6 +812,11 @@
         pseudoStyle = pseudoStyle->pseudoStyle;
     }
 
+    // Try and share or partially share the style with our siblings
+    RenderStyle *commonStyle = locateSimilarStyle();
+    if (commonStyle)
+        style->compactWith(commonStyle);
+
     // Now return the style.
     return style;
 }
--- trunk/KDE/kdelibs/khtml/css/cssstyleselector.h #1197122:1197123
@@ -227,6 +227,8 @@
 	   current generic font family has changed. -dwh */
 	void checkForGenericFamilyChange(RenderStyle* aStyle, RenderStyle* aParentStyle);
 #endif
+        // locates potentially similar style
+        RenderStyle* locateSimilarStyle();
 
 	/* builds up the selectors and properties lists from the CSSStyleSelectorList's */
 	void buildLists();
--- trunk/KDE/kdelibs/khtml/rendering/render_style.cpp #1197122:1197123
@@ -618,6 +618,28 @@
         setWhiteSpace(PRE_LINE);
 }
 
+void RenderStyle::compactWith(const RenderStyle* similarStyle)
+{
+    if (this == similarStyle) return;
+
+    if (box.get() != similarStyle->box.get() && box == similarStyle->box)
+        box = similarStyle->box;
+    if (visual.get() != similarStyle->visual.get() && visual == \
similarStyle->visual) +        visual = similarStyle->visual;
+    if (background.get() != similarStyle->background.get() && background == \
similarStyle->background) +        background = similarStyle->background;
+    if (surround.get() != similarStyle->surround.get() && surround == \
similarStyle->surround) +        surround = similarStyle->surround;
+    if (generated.get() != similarStyle->generated.get() && generated == \
similarStyle->generated) +        generated = similarStyle->generated;
+    if (css3NonInheritedData.get() != similarStyle->css3NonInheritedData.get() && \
css3NonInheritedData == similarStyle->css3NonInheritedData) +        \
css3NonInheritedData = similarStyle->css3NonInheritedData; +    if \
(css3InheritedData.get() != similarStyle->css3InheritedData.get() && \
css3InheritedData == similarStyle->css3InheritedData) +        css3InheritedData = \
similarStyle->css3InheritedData; +    if (inherited.get() != \
similarStyle->inherited.get() && inherited == similarStyle->inherited) +        \
inherited = similarStyle->inherited; +}
+
 RenderStyle::~RenderStyle()
 {
     RenderStyle *ps = pseudoStyle;
--- trunk/KDE/kdelibs/khtml/rendering/render_style.h #1197122:1197123
@@ -983,6 +983,7 @@
     ~RenderStyle();
 
     void inheritFrom(const RenderStyle* inheritParent);
+    void compactWith(const RenderStyle* similarStyle);
 
     PseudoId styleType() const { return KDE_CAST_BF_ENUM(PseudoId, \
                noninherited_flags.f._styleType); }
     void setStyleType(PseudoId pi) { noninherited_flags.f._styleType = pi; }


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic