Changeset 95852 in webkit
- Timestamp:
- Sep 23, 2011 12:56:21 PM (13 years ago)
- Location:
- trunk
- Files:
-
- 47 added
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r95845 r95852 1 2011-09-23 Konstantin Scheglov <scheglov@google.com> 2 3 Redrawing dirty parts of a large table is very slow 4 https://bugs.webkit.org/show_bug.cgi?id=64546 5 6 Reviewed by David Hyatt. 7 8 Tests for invalidating collapsed borders cache. 9 10 * fast/table/border-collapsing/cached-cell-append-expected.png: Added. 11 * fast/table/border-collapsing/cached-cell-append-expected.txt: Added. 12 * fast/table/border-collapsing/cached-cell-append.html: Added. 13 * fast/table/border-collapsing/cached-cell-remove-expected.png: Added. 14 * fast/table/border-collapsing/cached-cell-remove-expected.txt: Added. 15 * fast/table/border-collapsing/cached-cell-remove.html: Added. 16 * fast/table/border-collapsing/cached-change-cell-border-color-expected.png: Added. 17 * fast/table/border-collapsing/cached-change-cell-border-color-expected.txt: Added. 18 * fast/table/border-collapsing/cached-change-cell-border-color.html: Added. 19 * fast/table/border-collapsing/cached-change-cell-border-width-expected.png: Added. 20 * fast/table/border-collapsing/cached-change-cell-border-width-expected.txt: Added. 21 * fast/table/border-collapsing/cached-change-cell-border-width.html: Added. 22 * fast/table/border-collapsing/cached-change-col-border-color-expected.png: Added. 23 * fast/table/border-collapsing/cached-change-col-border-color-expected.txt: Added. 24 * fast/table/border-collapsing/cached-change-col-border-color.html: Added. 25 * fast/table/border-collapsing/cached-change-col-border-width-expected.png: Added. 26 * fast/table/border-collapsing/cached-change-col-border-width-expected.txt: Added. 27 * fast/table/border-collapsing/cached-change-col-border-width.html: Added. 28 * fast/table/border-collapsing/cached-change-colgroup-border-color-expected.png: Added. 29 * fast/table/border-collapsing/cached-change-colgroup-border-color-expected.txt: Added. 30 * fast/table/border-collapsing/cached-change-colgroup-border-color.html: Added. 31 * fast/table/border-collapsing/cached-change-colgroup-border-width-expected.png: Added. 32 * fast/table/border-collapsing/cached-change-colgroup-border-width-expected.txt: Added. 33 * fast/table/border-collapsing/cached-change-colgroup-border-width.html: Added. 34 * fast/table/border-collapsing/cached-change-row-border-color-expected.png: Added. 35 * fast/table/border-collapsing/cached-change-row-border-color-expected.txt: Added. 36 * fast/table/border-collapsing/cached-change-row-border-color.html: Added. 37 * fast/table/border-collapsing/cached-change-row-border-width-expected.png: Added. 38 * fast/table/border-collapsing/cached-change-row-border-width-expected.txt: Added. 39 * fast/table/border-collapsing/cached-change-row-border-width.html: Added. 40 * fast/table/border-collapsing/cached-change-table-border-color-expected.png: Added. 41 * fast/table/border-collapsing/cached-change-table-border-color-expected.txt: Added. 42 * fast/table/border-collapsing/cached-change-table-border-color.html: Added. 43 * fast/table/border-collapsing/cached-change-table-border-width-expected.png: Added. 44 * fast/table/border-collapsing/cached-change-table-border-width-expected.txt: Added. 45 * fast/table/border-collapsing/cached-change-table-border-width.html: Added. 46 * fast/table/border-collapsing/cached-change-tbody-border-color-expected.png: Added. 47 * fast/table/border-collapsing/cached-change-tbody-border-color-expected.txt: Added. 48 * fast/table/border-collapsing/cached-change-tbody-border-color.html: Added. 49 * fast/table/border-collapsing/cached-change-tbody-border-width-expected.png: Added. 50 * fast/table/border-collapsing/cached-change-tbody-border-width-expected.txt: Added. 51 * fast/table/border-collapsing/cached-change-tbody-border-width.html: Added. 52 1 53 2011-09-23 Jochen Eisinger <jochen@chromium.org> 2 54 -
trunk/Source/WebCore/ChangeLog
r95849 r95852 1 2011-09-23 Konstantin Scheglov <scheglov@google.com> 2 3 Redrawing dirty parts of a large table is very slow 4 https://bugs.webkit.org/show_bug.cgi?id=64546 5 6 Reviewed by David Hyatt. 7 8 Move CollapsedBorderValues into RenderTable.h. 9 Calculate collapsed borders only once and re-use during paintObject(). 10 Invalidate cache when cell, row, row group, col, col group or table border is changed. 11 12 Tests: fast/table/border-collapsing/cached-cell-append.html 13 fast/table/border-collapsing/cached-cell-remove.html 14 fast/table/border-collapsing/cached-change-cell-border-color.html 15 fast/table/border-collapsing/cached-change-cell-border-width.html 16 fast/table/border-collapsing/cached-change-col-border-color.html 17 fast/table/border-collapsing/cached-change-col-border-width.html 18 fast/table/border-collapsing/cached-change-colgroup-border-color.html 19 fast/table/border-collapsing/cached-change-colgroup-border-width.html 20 fast/table/border-collapsing/cached-change-row-border-color.html 21 fast/table/border-collapsing/cached-change-row-border-width.html 22 fast/table/border-collapsing/cached-change-table-border-color.html 23 fast/table/border-collapsing/cached-change-table-border-width.html 24 fast/table/border-collapsing/cached-change-tbody-border-color.html 25 fast/table/border-collapsing/cached-change-tbody-border-width.html 26 27 * rendering/RenderTable.cpp: 28 (WebCore::RenderTable::RenderTable): 29 (WebCore::RenderTable::styleDidChange): Invalidate cache on border change. 30 (WebCore::RenderTable::layout): Invalidate cache if layout changed. 31 (WebCore::RenderTable::recalcCollapsedBorders): Ensures that cache is valid. 32 (WebCore::RenderTable::paintObject): Use cached collapsed borders. 33 * rendering/RenderTable.h: 34 (WebCore::RenderTable::invalidateCollapsedBorders): Accessor to mark cache invalid. 35 (WebCore::RenderTable::currentBorderValue): Rename to use word "value". 36 * rendering/RenderTableCell.cpp: 37 (WebCore::RenderTableCell::styleDidChange): If border changed, invalidate cache. 38 39 Rename to use word "value". 40 (WebCore::addBorderStyle): 41 (WebCore::RenderTableCell::collectBorderValues): 42 (WebCore::compareBorderValuesForQSort): 43 (WebCore::RenderTableCell::sortBorderValues): 44 (WebCore::RenderTableCell::paintCollapsedBorder): 45 * rendering/RenderTableCell.h: 46 47 If border changed, invalidate cache. 48 * rendering/RenderTableCol.cpp: 49 (WebCore::RenderTableCol::styleDidChange): 50 * rendering/RenderTableCol.h: 51 * rendering/RenderTableRow.cpp: 52 (WebCore::RenderTableRow::styleDidChange): 53 * rendering/RenderTableSection.cpp: 54 (WebCore::RenderTableSection::styleDidChange): 55 1 56 2011-09-23 Mark Hahnenberg <mhahnenberg@apple.com> 2 57 -
trunk/Source/WebCore/rendering/RenderTable.cpp
r95671 r95852 55 55 , m_firstBody(0) 56 56 , m_currentBorder(0) 57 , m_collapsedBordersValid(false) 57 58 , m_hasColElements(false) 58 , m_needsSectionRecalc( 0)59 , m_needsSectionRecalc(false) 59 60 , m_hSpacing(0) 60 61 , m_vSpacing(0) … … 92 93 m_tableLayout = adoptPtr(new AutoTableLayout(this)); 93 94 } 95 96 // If border was changed, invalidate collapsed borders cache. 97 if (!needsLayout() && oldStyle && oldStyle->border() != style()->border()) 98 invalidateCollapsedBorders(); 94 99 } 95 100 … … 397 402 updateLayerTransform(); 398 403 404 // Layout was changed, so probably borders too. 405 invalidateCollapsedBorders(); 406 399 407 computeOverflow(clientLogicalBottom()); 400 408 … … 415 423 setNeedsLayout(false); 416 424 } 425 426 // Collect all the unique border values that we want to paint in a sorted list. 427 void RenderTable::recalcCollapsedBorders() 428 { 429 if (m_collapsedBordersValid) 430 return; 431 m_collapsedBordersValid = true; 432 m_collapsedBorders.clear(); 433 RenderObject* stop = nextInPreOrderAfterChildren(); 434 for (RenderObject* o = firstChild(); o && o != stop; o = o->nextInPreOrder()) { 435 if (o->isTableCell()) 436 toRenderTableCell(o)->collectBorderValues(m_collapsedBorders); 437 } 438 RenderTableCell::sortBorderValues(m_collapsedBorders); 439 } 440 417 441 418 442 void RenderTable::addOverflowFromChildren() … … 506 530 507 531 if (collapseBorders() && paintPhase == PaintPhaseChildBlockBackground && style()->visibility() == VISIBLE) { 508 // Collect all the unique border styles that we want to paint in a sorted list. Once we509 // have all the styles sorted, we then do individual passes, painting each style of border510 // from lowest precedence to highest precedence.532 recalcCollapsedBorders(); 533 // Using our cached sorted styles, we then do individual passes, 534 // painting each style of border from lowest precedence to highest precedence. 511 535 info.phase = PaintPhaseCollapsedTableBorders; 512 RenderTableCell::CollapsedBorderStyles borderStyles; 513 RenderObject* stop = nextInPreOrderAfterChildren(); 514 for (RenderObject* o = firstChild(); o && o != stop; o = o->nextInPreOrder()) { 515 if (o->isTableCell()) 516 toRenderTableCell(o)->collectBorderStyles(borderStyles); 517 } 518 RenderTableCell::sortBorderStyles(borderStyles); 519 size_t count = borderStyles.size(); 536 size_t count = m_collapsedBorders.size(); 520 537 for (size_t i = 0; i < count; ++i) { 521 m_currentBorder = & borderStyles[i];538 m_currentBorder = &m_collapsedBorders[i]; 522 539 for (RenderObject* child = firstChild(); child; child = child->nextSibling()) 523 540 if (child->isTableSection()) { -
trunk/Source/WebCore/rendering/RenderTable.h
r94776 r95852 27 27 28 28 #include "CSSPropertyNames.h" 29 #include "CollapsedBorderValue.h" 29 30 #include "RenderBlock.h" 30 31 #include <wtf/Vector.h> … … 32 33 namespace WebCore { 33 34 34 class CollapsedBorderValue;35 35 class RenderTableCol; 36 36 class RenderTableCell; … … 201 201 RenderTableCell* cellAfter(const RenderTableCell*) const; 202 202 203 const CollapsedBorderValue* currentBorderStyle() const { return m_currentBorder; } 203 typedef Vector<CollapsedBorderValue> CollapsedBorderValues; 204 void invalidateCollapsedBorders() 205 { 206 m_collapsedBordersValid = false; 207 m_collapsedBorders.clear(); 208 } 209 const CollapsedBorderValue* currentBorderValue() const { return m_currentBorder; } 204 210 205 211 bool hasSections() const { return m_head || m_foot || m_firstBody; } … … 246 252 void subtractCaptionRect(LayoutRect&) const; 247 253 254 void recalcCollapsedBorders(); 248 255 void recalcCaption(RenderBlock*) const; 249 256 void recalcSections() const; … … 260 267 OwnPtr<TableLayout> m_tableLayout; 261 268 269 CollapsedBorderValues m_collapsedBorders; 262 270 const CollapsedBorderValue* m_currentBorder; 271 bool m_collapsedBordersValid : 1; 263 272 264 273 mutable bool m_hasColElements : 1; -
trunk/Source/WebCore/rendering/RenderTableCell.cpp
r95777 r95852 318 318 RenderBlock::styleDidChange(diff, oldStyle); 319 319 setHasBoxDecorations(true); 320 321 // If border was changed, notify table. 322 if (parent()) { 323 RenderTable* table = this->table(); 324 if (table && !table->selfNeedsLayout() && !table->normalChildNeedsLayout()&& oldStyle && oldStyle->border() != style()->border()) 325 table->invalidateCollapsedBorders(); 326 } 320 327 } 321 328 … … 872 879 }; 873 880 874 static void addBorderStyle(RenderTableCell::CollapsedBorderStyles& borderStyles, CollapsedBorderValue borderValue) 881 static void addBorderStyle(RenderTable::CollapsedBorderValues& borderValues, 882 CollapsedBorderValue borderValue) 875 883 { 876 884 if (!borderValue.exists()) 877 885 return; 878 size_t count = border Styles.size();886 size_t count = borderValues.size(); 879 887 for (size_t i = 0; i < count; ++i) 880 if (border Styles[i] == borderValue)888 if (borderValues[i] == borderValue) 881 889 return; 882 border Styles.append(borderValue);883 } 884 885 void RenderTableCell::collectBorder Styles(CollapsedBorderStyles& borderStyles) const886 { 887 addBorderStyle(border Styles, collapsedStartBorder());888 addBorderStyle(border Styles, collapsedEndBorder());889 addBorderStyle(border Styles, collapsedBeforeBorder());890 addBorderStyle(border Styles, collapsedAfterBorder());891 } 892 893 static int compareBorder StylesForQSort(const void* pa, const void* pb)890 borderValues.append(borderValue); 891 } 892 893 void RenderTableCell::collectBorderValues(RenderTable::CollapsedBorderValues& borderValues) const 894 { 895 addBorderStyle(borderValues, collapsedStartBorder()); 896 addBorderStyle(borderValues, collapsedEndBorder()); 897 addBorderStyle(borderValues, collapsedBeforeBorder()); 898 addBorderStyle(borderValues, collapsedAfterBorder()); 899 } 900 901 static int compareBorderValuesForQSort(const void* pa, const void* pb) 894 902 { 895 903 const CollapsedBorderValue* a = static_cast<const CollapsedBorderValue*>(pa); … … 900 908 } 901 909 902 void RenderTableCell::sortBorder Styles(CollapsedBorderStyles& borderStyles)903 { 904 qsort(border Styles.data(), borderStyles.size(), sizeof(CollapsedBorderValue),905 compareBorder StylesForQSort);910 void RenderTableCell::sortBorderValues(RenderTable::CollapsedBorderValues& borderValues) 911 { 912 qsort(borderValues.data(), borderValues.size(), sizeof(CollapsedBorderValue), 913 compareBorderValuesForQSort); 906 914 } 907 915 908 916 void RenderTableCell::paintCollapsedBorder(GraphicsContext* graphicsContext, const LayoutRect& paintRect) 909 917 { 910 if (!table()->currentBorder Style() || graphicsContext->paintingDisabled())918 if (!table()->currentBorderValue() || graphicsContext->paintingDisabled()) 911 919 return; 912 920 … … 948 956 949 957 for (CollapsedBorder* border = borders.nextBorder(); border; border = borders.nextBorder()) { 950 if (border->borderValue == *table()->currentBorder Style())958 if (border->borderValue == *table()->currentBorderValue()) 951 959 drawLineForBoxSide(graphicsContext, border->x1, border->y1, border->x2, border->y2, border->side, 952 960 border->borderValue.color(), border->style, 0, 0, antialias); -
trunk/Source/WebCore/rendering/RenderTableCell.h
r95573 r95852 87 87 CollapsedBorderValue collapsedBottomBorder() const; 88 88 89 typedef Vector<CollapsedBorderValue, 100> CollapsedBorderStyles; 90 void collectBorderStyles(CollapsedBorderStyles&) const; 91 static void sortBorderStyles(CollapsedBorderStyles&); 89 void collectBorderValues(RenderTable::CollapsedBorderValues&) const; 90 static void sortBorderValues(RenderTable::CollapsedBorderValues&); 92 91 93 92 virtual void updateFromElement(); -
trunk/Source/WebCore/rendering/RenderTableCol.cpp
r92992 r95852 43 43 setInline(true); // our object is not Inline 44 44 updateFromElement(); 45 } 46 47 void RenderTableCol::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle) 48 { 49 RenderBox::styleDidChange(diff, oldStyle); 50 51 // If border was changed, notify table. 52 if (parent()) { 53 RenderTable* table = this->table(); 54 if (table && !table->selfNeedsLayout() && !table->normalChildNeedsLayout() && oldStyle && oldStyle->border() != style()->border()) 55 table->invalidateCollapsedBorders(); 56 } 45 57 } 46 58 -
trunk/Source/WebCore/rendering/RenderTableCol.h
r92252 r95852 60 60 virtual void imageChanged(WrappedImagePtr, const IntRect* = 0); 61 61 62 virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle); 63 62 64 RenderTable* table() const; 63 65 -
trunk/Source/WebCore/rendering/RenderTableRow.cpp
r95671 r95852 79 79 if (parent()) 80 80 updateBeforeAndAfterContent(); 81 82 // If border was changed, notify table. 83 if (parent()) { 84 RenderTable* table = this->table(); 85 if (table && !table->selfNeedsLayout() && !table->normalChildNeedsLayout() && oldStyle && oldStyle->border() != style()->border()) 86 table->invalidateCollapsedBorders(); 87 } 81 88 } 82 89 -
trunk/Source/WebCore/rendering/RenderTableSection.cpp
r95671 r95852 82 82 RenderBox::styleDidChange(diff, oldStyle); 83 83 propagateStyleToAnonymousChildren(); 84 85 // If border was changed, notify table. 86 RenderTable* table = this->table(); 87 if (table && !table->selfNeedsLayout() && !table->normalChildNeedsLayout() && oldStyle && oldStyle->border() != style()->border()) 88 table->invalidateCollapsedBorders(); 84 89 } 85 90
Note: See TracChangeset
for help on using the changeset viewer.