From d9976e8dd6d4277ddc83dc7546786ae3d1f14a5d Mon Sep 17 00:00:00 2001 From: ap Date: Mon, 24 Jul 2006 16:55:02 +0000 Subject: [PATCH] Fix by Mitz Pettel, reviewed by Hyatt. - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=9669 Incomplete repaint when changing an inline's border Test: fast/repaint/line-overflow.html * rendering/RenderBlock.h: * rendering/bidi.cpp: (WebCore::RenderBlock::layoutInlineChildren): Added repaintTop and repaintBottom variables to track the vertical edges of the area that changed, accounting for lines that were deleted, inserted or moved. Removed unnecessary updating of m_overflowHeight. (WebCore::RenderBlock::determineStartPosition): Removed unnecessary updating of m_overflowHeight. (WebCore::RenderBlock::determineEndPosition): (WebCore::RenderBlock::matchedEndLine): Added repaintTop and repaintBottom arguments, which this method updates to account for deleted lines. (WebCore::RenderBlock::checkLinesForOverflow): Removed outdated FIXME. git-svn-id: https://svn.webkit.org/repository/webkit/trunk@15602 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- LayoutTests/ChangeLog | 12 ++++ .../repaint/line-overflow-expected.checksum | 1 + .../fast/repaint/line-overflow-expected.png | Bin 0 -> 31530 bytes .../fast/repaint/line-overflow-expected.txt | 34 +++++++++ LayoutTests/fast/repaint/line-overflow.html | 28 ++++++++ WebCore/ChangeLog | 22 ++++++ WebCore/rendering/RenderBlock.h | 4 +- WebCore/rendering/bidi.cpp | 68 ++++++++---------- 8 files changed, 128 insertions(+), 41 deletions(-) create mode 100644 LayoutTests/fast/repaint/line-overflow-expected.checksum create mode 100644 LayoutTests/fast/repaint/line-overflow-expected.png create mode 100644 LayoutTests/fast/repaint/line-overflow-expected.txt create mode 100644 LayoutTests/fast/repaint/line-overflow.html diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog index 861f9c33287a..315670c1338f 100644 --- a/LayoutTests/ChangeLog +++ b/LayoutTests/ChangeLog @@ -1,3 +1,15 @@ +2006-07-24 Mitz Pettel + + Reviewed by Hyatt. + + - repaint test for http://bugzilla.opendarwin.org/show_bug.cgi?id=9669 + Incomplete repaint when changing an inline's border + + * fast/repaint/line-overflow-expected.checksum: Added. + * fast/repaint/line-overflow-expected.png: Added. + * fast/repaint/line-overflow-expected.txt: Added. + * fast/repaint/line-overflow.html: Added. + 2006-07-24 Mitz Pettel Reviewed by Darin. diff --git a/LayoutTests/fast/repaint/line-overflow-expected.checksum b/LayoutTests/fast/repaint/line-overflow-expected.checksum new file mode 100644 index 000000000000..d19178aef294 --- /dev/null +++ b/LayoutTests/fast/repaint/line-overflow-expected.checksum @@ -0,0 +1 @@ +8551d6ed1a5a5dcc87796f285231cba1 \ No newline at end of file diff --git a/LayoutTests/fast/repaint/line-overflow-expected.png b/LayoutTests/fast/repaint/line-overflow-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..1087778355fd698546b095c3f91df1e5e45e8a33 GIT binary patch literal 31530 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 literal 0 HcmV?d00001 diff --git a/LayoutTests/fast/repaint/line-overflow-expected.txt b/LayoutTests/fast/repaint/line-overflow-expected.txt new file mode 100644 index 000000000000..534e6fed0810 --- /dev/null +++ b/LayoutTests/fast/repaint/line-overflow-expected.txt @@ -0,0 +1,34 @@ +layer at (0,0) size 800x600 + RenderView at (0,0) size 800x600 +layer at (0,0) size 800x286 + RenderBlock {HTML} at (0,0) size 800x286 + RenderBody {BODY} at (8,16) size 784x262 + RenderBlock {P} at (0,0) size 784x36 + RenderText {#text} at (0,0) size 104x18 + text run at (0,0) width 104: "This is a test for " + RenderInline {I} at (0,0) size 744x36 + RenderInline {A} at (0,0) size 348x18 [color=#0000EE] + RenderText {#text} at (104,0) size 348x18 + text run at (104,0) width 348: "http://bugzilla.opendarwin.org/show_bug.cgi?id=9669" + RenderText {#text} at (452,0) size 744x36 + text run at (452,0) width 4: " " + text run at (456,0) width 288: "Incomplete repaint when changing an inline's" + text run at (0,18) width 43: "border" + RenderText {#text} at (43,18) size 4x18 + text run at (43,18) width 4: "." + RenderBlock {HR} at (0,52) size 784x2 [border: (1px inset #000000)] + RenderBlock {DIV} at (0,62) size 200x200 + RenderText {#text} at (0,0) size 192x54 + text run at (0,0) width 129: "Cras faucibus. Nunc" + text run at (0,18) width 192: "adipiscing, enim in scelerisque" + text run at (0,36) width 64: "convallis, " + text run at (64,36) width 42: "augue " + RenderInline {SPAN} at (0,0) size 35x48 [border: (30px solid #0000FF) none] + RenderText {#text} at (106,36) size 35x18 + text run at (106,36) width 35: "purus" + RenderText {#text} at (141,36) size 195x90 + text run at (141,36) width 54: " eleifend" + text run at (0,54) width 151: "lacus, at sagittis eros leo" + text run at (0,72) width 135: "pulvinar velit. Integer" + text run at (0,90) width 190: "sollicitudin nisi ut urna blandit" + text run at (0,108) width 60: "convallis." diff --git a/LayoutTests/fast/repaint/line-overflow.html b/LayoutTests/fast/repaint/line-overflow.html new file mode 100644 index 000000000000..30e65d03cd7f --- /dev/null +++ b/LayoutTests/fast/repaint/line-overflow.html @@ -0,0 +1,28 @@ + + + + + + + + +

+ This is a test for http://bugzilla.opendarwin.org/show_bug.cgi?id=9669 + Incomplete repaint when changing an inline's border. +

+
+
+ Cras faucibus. Nunc adipiscing, enim in scelerisque convallis, + augue purus eleifend lacus, at sagittis eros leo pulvinar velit. Integer sollicitudin nisi ut urna blandit convallis. +
+ diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog index 3226f7e65dd3..4761cfda4bc9 100644 --- a/WebCore/ChangeLog +++ b/WebCore/ChangeLog @@ -1,3 +1,25 @@ +2006-07-24 Mitz Pettel + + Reviewed by Hyatt. + + - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=9669 + Incomplete repaint when changing an inline's border + + Test: fast/repaint/line-overflow.html + + * rendering/RenderBlock.h: + * rendering/bidi.cpp: + (WebCore::RenderBlock::layoutInlineChildren): Added repaintTop and repaintBottom + variables to track the vertical edges of the area that changed, accounting for + lines that were deleted, inserted or moved. Removed unnecessary updating of + m_overflowHeight. + (WebCore::RenderBlock::determineStartPosition): Removed unnecessary updating of + m_overflowHeight. + (WebCore::RenderBlock::determineEndPosition): + (WebCore::RenderBlock::matchedEndLine): Added repaintTop and repaintBottom + arguments, which this method updates to account for deleted lines. + (WebCore::RenderBlock::checkLinesForOverflow): Removed outdated FIXME. + 2006-07-24 Mitz Pettel Reviewed by Darin. diff --git a/WebCore/rendering/RenderBlock.h b/WebCore/rendering/RenderBlock.h index 8edb170cb818..4d7124214a06 100644 --- a/WebCore/rendering/RenderBlock.h +++ b/WebCore/rendering/RenderBlock.h @@ -134,8 +134,8 @@ public: BidiStatus& cleanLineBidiStatus, BidiContext*& cleanLineBidiContext, int& yPos); bool matchedEndLine(const BidiIterator& start, const BidiStatus& status, BidiContext* context, - const BidiIterator& endLineStart, const BidiStatus& endLineStatus, - BidiContext* endLineContext, RootInlineBox*& endLine, int& endYPos); + const BidiIterator& endLineStart, const BidiStatus& endLineStatus, BidiContext* endLineContext, + RootInlineBox*& endLine, int& endYPos, int& repaintBottom, int& repaintTop); int skipWhitespace(BidiIterator& , BidiState &); BidiIterator findNextLineBreak(BidiIterator& start, BidiState &info ); RootInlineBox* constructLine(const BidiIterator& start, const BidiIterator& end); diff --git a/WebCore/rendering/bidi.cpp b/WebCore/rendering/bidi.cpp index 15d745c14dcf..b2de68dc541e 100644 --- a/WebCore/rendering/bidi.cpp +++ b/WebCore/rendering/bidi.cpp @@ -1480,7 +1480,8 @@ IntRect RenderBlock::layoutInlineChildren(bool relayoutChildren) BidiState bidi; bool useRepaintRect = false; - IntRect repaintRect(0,0,0,0); + int repaintTop = 0; + int repaintBottom = 0; m_overflowHeight = 0; @@ -1509,9 +1510,6 @@ IntRect RenderBlock::layoutInlineChildren(bool relayoutChildren) if (hasTextOverflow) deleteEllipsisLineBoxes(); - int oldLineBottom = lastRootBox() ? lastRootBox()->bottomOverflow() : m_height; - int startLineBottom = 0; - if (firstChild()) { // layout replaced elements bool endOfInline = false; @@ -1595,11 +1593,13 @@ IntRect RenderBlock::layoutInlineChildren(bool relayoutChildren) cleanLineBidiContext->ref(); if (startLine) { useRepaintRect = true; - startLineBottom = startLine->bottomOverflow(); - repaintRect.setY(min(m_height, startLine->topOverflow())); + repaintTop = m_height; + repaintBottom = m_height; RenderArena* arena = renderArena(); RootInlineBox* box = startLine; while (box) { + repaintTop = min(repaintTop, box->topOverflow()); + repaintBottom = max(repaintBottom, box->bottomOverflow()); RootInlineBox* next = box->nextRootBox(); box->deleteLine(arena); box = next; @@ -1612,7 +1612,7 @@ IntRect RenderBlock::layoutInlineChildren(bool relayoutChildren) bool endLineMatched = false; while (!end.atEnd()) { start = end; - if (endLine && (endLineMatched = matchedEndLine(start, bidi.status, bidi.context.get(), cleanLineStart, cleanLineBidiStatus, cleanLineBidiContext, endLine, endLineYPos))) + if (endLine && (endLineMatched = matchedEndLine(start, bidi.status, bidi.context.get(), cleanLineStart, cleanLineBidiStatus, cleanLineBidiContext, endLine, endLineYPos, repaintBottom, repaintTop))) break; betweenMidpoints = false; @@ -1661,8 +1661,13 @@ IntRect RenderBlock::layoutInlineChildren(bool relayoutChildren) bidi.adjustEmbedding = false; } - if (lineBox) + if (lineBox) { lineBox->setLineBreakInfo(end.obj, end.pos, &bidi.status, bidi.context.get()); + if (useRepaintRect) { + repaintTop = min(repaintTop, lineBox->topOverflow()); + repaintBottom = max(repaintBottom, lineBox->bottomOverflow()); + } + } m_firstLine = false; newLine(); @@ -1676,12 +1681,6 @@ IntRect RenderBlock::layoutInlineChildren(bool relayoutChildren) if (endLine) { if (endLineMatched) { - // Note our current y-position for correct repainting when no lines move. If no lines move, we still have to - // repaint up to the maximum of the bottom overflow of the old start line or the bottom overflow of the new last line. - int currYPos = max(startLineBottom, m_height); - if (lastRootBox()) - currYPos = max(currYPos, lastRootBox()->bottomOverflow()); - // Attach all the remaining lines, and then adjust their y-positions as needed. for (RootInlineBox* line = endLine; line; line = line->nextRootBox()) line->attachLine(); @@ -1689,28 +1688,21 @@ IntRect RenderBlock::layoutInlineChildren(bool relayoutChildren) // Now apply the offset to each line if needed. int delta = m_height - endLineYPos; if (delta) { - for (RootInlineBox* line = endLine; line; line = line->nextRootBox()) + for (RootInlineBox* line = endLine; line; line = line->nextRootBox()) { + repaintTop = min(repaintTop, line->topOverflow() + (delta < 0 ? delta : 0)); + repaintBottom = max(repaintBottom, line->bottomOverflow() + (delta > 0 ? delta : 0)); line->adjustPosition(0, delta); + } } m_height = lastRootBox()->blockHeight(); - m_overflowHeight = max(m_height, m_overflowHeight); - int bottomOfLine = lastRootBox()->bottomOverflow(); - if (bottomOfLine > m_height && bottomOfLine > m_overflowHeight) - m_overflowHeight = bottomOfLine; - if (delta) - repaintRect.setHeight(max(m_overflowHeight-delta, m_overflowHeight) - repaintRect.y()); - else - repaintRect.setHeight(currYPos - repaintRect.y()); - } - else { + } else { // Delete all the remaining lines. - m_overflowHeight = max(m_height, m_overflowHeight); InlineRunBox* line = endLine; RenderArena* arena = renderArena(); while (line) { + repaintTop = min(repaintTop, line->topOverflow()); + repaintBottom = max(repaintBottom, line->bottomOverflow()); InlineRunBox* next = line->nextLineBox(); - if (!next) - repaintRect.setHeight(max(m_overflowHeight, line->bottomOverflow()) - repaintRect.y()); line->deleteLine(arena); line = next; } @@ -1737,11 +1729,12 @@ IntRect RenderBlock::layoutInlineChildren(bool relayoutChildren) // See if any lines spill out of the block. If so, we need to update our overflow width. checkLinesForOverflow(); + IntRect repaintRect(0, 0, 0, 0); if (useRepaintRect) { repaintRect.setX(m_overflowLeft); - repaintRect.setWidth(max((int)m_width, m_overflowWidth) - m_overflowLeft); - if (repaintRect.height() == 0) - repaintRect.setHeight(max(oldLineBottom, m_overflowHeight) - repaintRect.y()); + repaintRect.setWidth(m_overflowWidth - m_overflowLeft); + repaintRect.setY(repaintTop); + repaintRect.setHeight(repaintBottom - repaintTop); if (hasOverflowClip()) // Don't allow this rect to spill out of our overflow box. repaintRect.intersect(IntRect(0, 0, m_width, m_height)); @@ -1805,9 +1798,6 @@ RootInlineBox* RenderBlock::determineStartPosition(bool fullLayout, BidiIterator previousLineBrokeCleanly = !last || last->endsWithBreak(); if (last) { m_height = last->blockHeight(); - int bottomOfLine = last->bottomOverflow(); - if (bottomOfLine > m_height && bottomOfLine > m_overflowHeight) - m_overflowHeight = bottomOfLine; startObj = last->lineBreakObj(); pos = last->lineBreakPos(); bidi.status = last->lineBreakBidiStatus(); @@ -1846,7 +1836,7 @@ RootInlineBox* RenderBlock::determineEndPosition(RootInlineBox* startLine, BidiI cleanLineStart = BidiIterator(this, prev->lineBreakObj(), prev->lineBreakPos()); cleanLineBidiStatus = prev->lineBreakBidiStatus(); cleanLineBidiContext = prev->lineBreakBidiContext(); - yPos = last->prevRootBox()->blockHeight(); + yPos = prev->blockHeight(); for (RootInlineBox* line = last; line; line = line->nextRootBox()) line->extractLine(); // Disconnect all line boxes from their render objects while preserving @@ -1856,8 +1846,8 @@ RootInlineBox* RenderBlock::determineEndPosition(RootInlineBox* startLine, BidiI } bool RenderBlock::matchedEndLine(const BidiIterator& start, const BidiStatus& status, BidiContext* context, - const BidiIterator& endLineStart, const BidiStatus& endLineStatus, - BidiContext* endLineContext, RootInlineBox*& endLine, int& endYPos) + const BidiIterator& endLineStart, const BidiStatus& endLineStatus, BidiContext* endLineContext, + RootInlineBox*& endLine, int& endYPos, int& repaintBottom, int& repaintTop) { if (start == endLineStart) return status == endLineStatus && *context == *endLineContext; @@ -1881,6 +1871,8 @@ bool RenderBlock::matchedEndLine(const BidiIterator& start, const BidiStatus& st RootInlineBox* boxToDelete = endLine; RenderArena* arena = renderArena(); while (boxToDelete && boxToDelete != result) { + repaintTop = min(repaintTop, boxToDelete->topOverflow()); + repaintBottom = max(repaintBottom, boxToDelete->bottomOverflow()); RootInlineBox* next = boxToDelete->nextRootBox(); boxToDelete->deleteLine(arena); boxToDelete = next; @@ -2548,8 +2540,6 @@ BidiIterator RenderBlock::findNextLineBreak(BidiIterator &start, BidiState &bidi void RenderBlock::checkLinesForOverflow() { - // FIXME: Inline blocks can have overflow. Need to understand when those objects are present on a line - // and factor that in somehow. m_overflowWidth = m_width; for (RootInlineBox* curr = firstRootBox(); curr; curr = curr->nextRootBox()) { m_overflowLeft = min(curr->leftOverflow(), m_overflowLeft); -- 2.36.0