Changeset 93144 in webkit


Ignore:
Timestamp:
Aug 16, 2011 12:43:21 PM (13 years ago)
Author:
hyatt@apple.com
Message:

https://bugs.webkit.org/show_bug.cgi?id=66254

Source/WebCore:

Make region invalidation and repainting work properly. We do this by making RenderFlowThreads into
repaint containers and then issuing new repaints in the regions that contain the invalidated flow thread
content.

Reviewed by Simon Fraser.

Added new tests in fast/repaint.

  • rendering/RenderFlowThread.cpp:

(WebCore::RenderFlowThread::repaintRectangleInRegions):

  • rendering/RenderFlowThread.h:
  • rendering/RenderObject.cpp:

(WebCore::RenderObject::enclosingRenderFlowThread):
(WebCore::RenderObject::containerForRepaint):
(WebCore::RenderObject::repaintUsingContainer):

  • rendering/RenderObject.h:
  • rendering/RenderView.cpp:

(WebCore::RenderView::RenderView):
(WebCore::RenderView::renderFlowThreadWithName):

  • rendering/RenderView.h:

(WebCore::RenderView::hasRenderFlowThreads):

LayoutTests:

Make regions repaint properly. Added new repaint tests.

Reviewed by Simon Fraser.

  • fast/repaint/japanese-rl-selection-repaint-in-regions.html: Added.
  • fast/repaint/line-flow-with-floats-in-regions.html: Added.
  • fast/repaint/overflow-flipped-writing-mode-block-in-regions.html: Added.
  • platform/mac/fast/repaint/japanese-rl-selection-repaint-in-regions-expected.png: Added.
  • platform/mac/fast/repaint/japanese-rl-selection-repaint-in-regions-expected.txt: Added.
  • platform/mac/fast/repaint/line-flow-with-floats-in-regions-expected.png: Added.
  • platform/mac/fast/repaint/line-flow-with-floats-in-regions-expected.txt: Added.
  • platform/mac/fast/repaint/overflow-flipped-writing-mode-block-in-regions-expected.png: Added.
  • platform/mac/fast/repaint/overflow-flipped-writing-mode-block-in-regions-expected.txt: Added.
Location:
trunk
Files:
9 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r93139 r93144  
     12011-08-16  David Hyatt  <hyatt@apple.com>
     2
     3        https://bugs.webkit.org/show_bug.cgi?id=66254
     4
     5        Make regions repaint properly. Added new repaint tests.
     6
     7        Reviewed by Simon Fraser.
     8
     9        * fast/repaint/japanese-rl-selection-repaint-in-regions.html: Added.
     10        * fast/repaint/line-flow-with-floats-in-regions.html: Added.
     11        * fast/repaint/overflow-flipped-writing-mode-block-in-regions.html: Added.
     12        * platform/mac/fast/repaint/japanese-rl-selection-repaint-in-regions-expected.png: Added.
     13        * platform/mac/fast/repaint/japanese-rl-selection-repaint-in-regions-expected.txt: Added.
     14        * platform/mac/fast/repaint/line-flow-with-floats-in-regions-expected.png: Added.
     15        * platform/mac/fast/repaint/line-flow-with-floats-in-regions-expected.txt: Added.
     16        * platform/mac/fast/repaint/overflow-flipped-writing-mode-block-in-regions-expected.png: Added.
     17        * platform/mac/fast/repaint/overflow-flipped-writing-mode-block-in-regions-expected.txt: Added.
     18
    1192011-08-16  Adam Roben  <aroben@apple.com>
    220
  • trunk/Source/WebCore/ChangeLog

    r93140 r93144  
     12011-08-16  David Hyatt  <hyatt@apple.com>
     2
     3        https://bugs.webkit.org/show_bug.cgi?id=66254
     4
     5        Make region invalidation and repainting work properly. We do this by making RenderFlowThreads into
     6        repaint containers and then issuing new repaints in the regions that contain the invalidated flow thread
     7        content.
     8
     9        Reviewed by Simon Fraser.
     10
     11        Added new tests in fast/repaint.
     12
     13        * rendering/RenderFlowThread.cpp:
     14        (WebCore::RenderFlowThread::repaintRectangleInRegions):
     15        * rendering/RenderFlowThread.h:
     16        * rendering/RenderObject.cpp:
     17        (WebCore::RenderObject::enclosingRenderFlowThread):
     18        (WebCore::RenderObject::containerForRepaint):
     19        (WebCore::RenderObject::repaintUsingContainer):
     20        * rendering/RenderObject.h:
     21        * rendering/RenderView.cpp:
     22        (WebCore::RenderView::RenderView):
     23        (WebCore::RenderView::renderFlowThreadWithName):
     24        * rendering/RenderView.h:
     25        (WebCore::RenderView::hasRenderFlowThreads):
     26
    1272011-08-16  Joseph Pecoraro  <joepeck@webkit.org>
    228
  • trunk/Source/WebCore/rendering/RenderFlowThread.cpp

    r92993 r93144  
    296296}
    297297
     298void RenderFlowThread::repaintRectangleInRegions(const LayoutRect& repaintRect, bool immediate)
     299{
     300    for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) {
     301        RenderRegion* region = *iter;
     302
     303        // We only have to issue a repaint in this region if the region rect intersects the repaint rect.
     304        LayoutRect flippedRegionRect(region->regionRect());
     305        flipForWritingMode(flippedRegionRect); // Put the region rect into physical coordinates.
     306       
     307        IntRect clippedRect(flippedRegionRect);
     308        clippedRect.intersect(repaintRect);
     309        if (clippedRect.isEmpty())
     310            continue;
     311       
     312        // Put the region rect into the region's physical coordinate space.
     313        clippedRect.setLocation(region->contentBoxRect().location() + (repaintRect.location() - flippedRegionRect.location()));
     314       
     315        // Now switch to the region's writing mode coordinate space and let it repaint itself.
     316        region->flipForWritingMode(clippedRect);
     317        region->repaintRectangle(clippedRect, immediate);
     318    }
     319}
     320
    298321} // namespace WebCore
  • trunk/Source/WebCore/rendering/RenderFlowThread.h

    r92993 r93144  
    8989    void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
    9090
     91    void repaintRectangleInRegions(const LayoutRect&, bool immediate);
     92
    9193private:
    9294    virtual const char* renderName() const { return "RenderFlowThread"; }
  • trunk/Source/WebCore/rendering/RenderObject.cpp

    r93040 r93144  
    4646#include "RenderDeprecatedFlexibleBox.h"
    4747#include "RenderFlexibleBox.h"
     48#include "RenderFlowThread.h"
    4849#include "RenderImage.h"
    4950#include "RenderImageResourceStyleImage.h"
     
    566567
    567568    ASSERT_NOT_REACHED();
     569    return 0;
     570}
     571
     572RenderFlowThread* RenderObject::enclosingRenderFlowThread() const
     573{
     574    RenderObject* curr = const_cast<RenderObject*>(this);
     575    while (curr) {
     576        if (curr->isRenderFlowThread())
     577            return toRenderFlowThread(curr);
     578        curr = curr->parent();
     579    }
    568580    return 0;
    569581}
     
    11461158RenderBoxModelObject* RenderObject::containerForRepaint() const
    11471159{
     1160    RenderView* v = view();
     1161    if (!v)
     1162        return 0;
     1163   
     1164    RenderBoxModelObject* repaintContainer = 0;
     1165
    11481166#if USE(ACCELERATED_COMPOSITING)
    1149     if (RenderView* v = view()) {
    1150         if (v->usesCompositing()) {
    1151             RenderLayer* compLayer = enclosingLayer()->enclosingCompositingLayer();
    1152             return compLayer ? compLayer->renderer() : 0;
    1153         }
     1167    if (v->usesCompositing()) {
     1168        RenderLayer* compLayer = enclosingLayer()->enclosingCompositingLayer();
     1169        if (compLayer)
     1170            repaintContainer = compLayer->renderer();
    11541171    }
    11551172#endif
    1156     // Do root-relative repaint.
    1157     return 0;
     1173
     1174    // If we have a flow thread, then we need to do individual repaints within the RenderRegions instead.
     1175    // Return the flow thread as a repaint container in order to create a chokepoint that allows us to change
     1176    // repainting to do individual region repaints.
     1177    // FIXME: Composited layers inside a flow thread will bypass this mechanism and will malfunction. It's not
     1178    // clear how to address this problem for composited descendants of a RenderFlowThread.
     1179    if (!repaintContainer && v->hasRenderFlowThreads())
     1180        repaintContainer = enclosingRenderFlowThread();
     1181    return repaintContainer;
    11581182}
    11591183
     
    11641188        return;
    11651189    }
     1190
     1191    if (repaintContainer->isRenderFlowThread())
     1192        return toRenderFlowThread(repaintContainer)->repaintRectangleInRegions(r, immediate);
    11661193
    11671194#if USE(ACCELERATED_COMPOSITING)
  • trunk/Source/WebCore/rendering/RenderObject.h

    r92888 r93144  
    5656class RenderInline;
    5757class RenderBlock;
    58 class RenderFlow;
     58class RenderFlowThread;
    5959class RenderLayer;
    6060class RenderTheme;
     
    185185    RenderBox* enclosingBox() const;
    186186    RenderBoxModelObject* enclosingBoxModelObject() const;
     187
     188    // Function to return our enclosing flow thread if we are contained inside one.
     189    RenderFlowThread* enclosingRenderFlowThread() const;
    187190
    188191    virtual bool isEmpty() const { return firstChild() == 0; }
  • trunk/Source/WebCore/rendering/RenderView.cpp

    r92969 r93144  
    5353    , m_pageLogicalHeight(0)
    5454    , m_pageLogicalHeightChanged(false)
     55    , m_hasRenderFlowThreads(false)
    5556    , m_layoutState(0)
    5657    , m_layoutStateDisableCount(0)
     
    819820    flowRenderer->setStyle(RenderFlowThread::createFlowThreadStyle(style()));
    820821    addChild(flowRenderer);
    821    
     822    m_hasRenderFlowThreads = true;
    822823    return flowRenderer;
    823824}
  • trunk/Source/WebCore/rendering/RenderView.h

    r92969 r93144  
    168168
    169169    RenderFlowThread* renderFlowThreadWithName(const AtomicString& flowThread);
     170    bool hasRenderFlowThreads() const { return m_hasRenderFlowThreads; }
    170171
    171172    void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
     
    246247    unsigned m_pageLogicalHeight;
    247248    bool m_pageLogicalHeightChanged;
     249    bool m_hasRenderFlowThreads;
    248250    LayoutState* m_layoutState;
    249251    unsigned m_layoutStateDisableCount;
Note: See TracChangeset for help on using the changeset viewer.