Changeset 95158 in webkit


Ignore:
Timestamp:
Sep 14, 2011 9:06:49 PM (13 years ago)
Author:
commit-queue@webkit.org
Message:

Chromium: Add a layer for rubber-band overhang painting to the hardware path.
https://bugs.webkit.org/show_bug.cgi?id=66969

Also, add layout tests for rubber-band overhang drawing for compositing path.

Patch by Alexei Svitkine <asvitkine@chromium.org> on 2011-09-14
Reviewed by James Robinson.

  • page/FrameView.cpp:

(WebCore::FrameView::layerForOverhangAreas):

  • page/FrameView.h:
  • platform/ScrollView.cpp:

(WebCore::ScrollView::scrollContents):
(WebCore::ScrollView::wheelEvent):

  • platform/ScrollView.h:
  • platform/ScrollableArea.h:

(WebCore::ScrollableArea::layerForOverhangAreas):

  • rendering/RenderLayerCompositor.cpp:

(WebCore::RenderLayerCompositor::frameViewDidChangeSize):
(WebCore::RenderLayerCompositor::paintContents):
(WebCore::RenderLayerCompositor::updateOverflowControlsLayers):
(WebCore::RenderLayerCompositor::destroyRootLayer):

  • rendering/RenderLayerCompositor.h:

(WebCore::RenderLayerCompositor::layerForOverhangAreas):

Location:
trunk
Files:
25 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/platform/chromium/test_expectations.txt

    r95131 r95158  
    480480// Rubber-banding is currently a Mac only feature.
    481481WONTFIX WIN LINUX : platform/chromium/rubberbanding = FAIL
     482WONTFIX WIN LINUX : platform/chromium-gpu/compositing/rubberbanding = IMAGE
    482483
    483484// -----------------------------------------------------------------
  • trunk/Source/WebCore/ChangeLog

    r95152 r95158  
     12011-09-14  Alexei Svitkine  <asvitkine@chromium.org>
     2
     3        Chromium: Add a layer for rubber-band overhang painting to the hardware path.
     4        https://bugs.webkit.org/show_bug.cgi?id=66969
     5
     6        Also, add layout tests for rubber-band overhang drawing for compositing path.
     7
     8        Reviewed by James Robinson.
     9
     10        * page/FrameView.cpp:
     11        (WebCore::FrameView::layerForOverhangAreas):
     12        * page/FrameView.h:
     13        * platform/ScrollView.cpp:
     14        (WebCore::ScrollView::scrollContents):
     15        (WebCore::ScrollView::wheelEvent):
     16        * platform/ScrollView.h:
     17        * platform/ScrollableArea.h:
     18        (WebCore::ScrollableArea::layerForOverhangAreas):
     19        * rendering/RenderLayerCompositor.cpp:
     20        (WebCore::RenderLayerCompositor::frameViewDidChangeSize):
     21        (WebCore::RenderLayerCompositor::paintContents):
     22        (WebCore::RenderLayerCompositor::updateOverflowControlsLayers):
     23        (WebCore::RenderLayerCompositor::destroyRootLayer):
     24        * rendering/RenderLayerCompositor.h:
     25        (WebCore::RenderLayerCompositor::layerForOverhangAreas):
     26
    1272011-09-14  Antoine Labour  <piman@chromium.org>
    228
  • trunk/Source/WebCore/page/FrameView.cpp

    r94464 r95158  
    686686}
    687687
     688#if PLATFORM(CHROMIUM) && ENABLE(RUBBER_BANDING)
     689GraphicsLayer* FrameView::layerForOverhangAreas() const
     690{
     691    RenderView* view = m_frame->contentRenderer();
     692    if (!view)
     693        return 0;
     694    return view->compositor()->layerForOverhangAreas();
     695}
     696#endif
     697
    688698bool FrameView::syncCompositingStateForThisFrame(Frame* rootFrameForSync)
    689699{
  • trunk/Source/WebCore/page/FrameView.h

    r94107 r95158  
    350350    virtual GraphicsLayer* layerForVerticalScrollbar() const;
    351351    virtual GraphicsLayer* layerForScrollCorner() const;
     352#if PLATFORM(CHROMIUM) && ENABLE(RUBBER_BANDING)
     353    virtual GraphicsLayer* layerForOverhangAreas() const;
     354#endif
    352355#endif
    353356
  • trunk/Source/WebCore/platform/ScrollView.cpp

    r94243 r95158  
    645645    IntRect verticalOverhangRect;
    646646    calculateOverhangAreasForPainting(horizontalOverhangRect, verticalOverhangRect);
     647#if USE(ACCELERATED_COMPOSITING) && PLATFORM(CHROMIUM) && ENABLE(RUBBER_BANDING)
     648    if (GraphicsLayer* overhangLayer = layerForOverhangAreas()) {
     649        bool hasOverhangArea = !horizontalOverhangRect.isEmpty() || !verticalOverhangRect.isEmpty();
     650        overhangLayer->setDrawsContent(hasOverhangArea);
     651    }
     652#endif
    647653    if (!horizontalOverhangRect.isEmpty())
    648654        hostWindow()->invalidateContentsAndWindow(horizontalOverhangRect, false /*immediate*/);
     
    10261032    }
    10271033
    1028     IntRect horizontalOverhangRect;
    1029     IntRect verticalOverhangRect;
    1030     calculateOverhangAreasForPainting(horizontalOverhangRect, verticalOverhangRect);
    1031 
    1032     if (rect.intersects(horizontalOverhangRect) || rect.intersects(verticalOverhangRect))
    1033         paintOverhangAreas(context, horizontalOverhangRect, verticalOverhangRect, rect);
     1034#if USE(ACCELERATED_COMPOSITING) && PLATFORM(CHROMIUM) && ENABLE(RUBBER_BANDING)
     1035    if (!layerForOverhangAreas())
     1036        calculateAndPaintOverhangAreas(context, rect);
     1037#else
     1038    calculateAndPaintOverhangAreas(context, rect);
     1039#endif
    10341040
    10351041    // Now paint the scrollbars.
     
    10931099}
    10941100
     1101void ScrollView::calculateAndPaintOverhangAreas(GraphicsContext* context, const IntRect& dirtyRect)
     1102{
     1103    IntRect horizontalOverhangRect;
     1104    IntRect verticalOverhangRect;
     1105    calculateOverhangAreasForPainting(horizontalOverhangRect, verticalOverhangRect);
     1106
     1107    if (dirtyRect.intersects(horizontalOverhangRect) || dirtyRect.intersects(verticalOverhangRect))
     1108        paintOverhangAreas(context, horizontalOverhangRect, verticalOverhangRect, dirtyRect);
     1109}
     1110
    10951111bool ScrollView::isPointInScrollbarCorner(const IntPoint& windowPoint)
    10961112{
  • trunk/Source/WebCore/platform/ScrollView.h

    r91435 r95158  
    287287    void setContainsScrollableAreaWithOverlayScrollbars(bool contains) { m_containsScrollableAreaWithOverlayScrollbars = contains; }
    288288
     289    void calculateAndPaintOverhangAreas(GraphicsContext*, const IntRect& dirtyRect);
     290
    289291protected:
    290292    ScrollView();
  • trunk/Source/WebCore/platform/ScrollableArea.h

    r94705 r95158  
    185185    virtual GraphicsLayer* layerForVerticalScrollbar() const { return 0; }
    186186    virtual GraphicsLayer* layerForScrollCorner() const { return 0; }
     187#if PLATFORM(CHROMIUM) && ENABLE(RUBBER_BANDING)
     188    virtual GraphicsLayer* layerForOverhangAreas() const { return 0; }
     189#endif
    187190#endif
    188191    bool hasLayerForHorizontalScrollbar() const;
  • trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp

    r94889 r95158  
    957957        m_scrollLayer->setPosition(FloatPoint(-scrollPosition.x(), -scrollPosition.y()));
    958958        updateOverflowControlsLayers();
     959
     960#if PLATFORM(CHROMIUM) && ENABLE(RUBBER_BANDING)
     961        if (m_layerForOverhangAreas)
     962            m_layerForOverhangAreas->setSize(frameView->frameRect().size());
     963#endif
    959964    }
    960965}
     
    15451550        m_renderView->frameView()->paintScrollCorner(&context, transformedClip);
    15461551        context.restore();
     1552#if PLATFORM(CHROMIUM) && ENABLE(RUBBER_BANDING)
     1553    } else if (graphicsLayer == layerForOverhangAreas()) {
     1554        ScrollView* view = m_renderView->frameView();
     1555        view->calculateAndPaintOverhangAreas(&context, clip);
     1556#endif
    15471557    }
    15481558}
     
    16101620}
    16111621
     1622#if PLATFORM(CHROMIUM) && ENABLE(RUBBER_BANDING)
     1623bool RenderLayerCompositor::requiresOverhangAreasLayer() const
     1624{
     1625    // Only if this is a top level frame (not iframe).
     1626    return !m_renderView->document()->ownerElement();
     1627}
     1628#endif
     1629
    16121630void RenderLayerCompositor::updateOverflowControlsLayers()
    16131631{
    16141632    bool layersChanged = false;
     1633 
     1634#if PLATFORM(CHROMIUM) && ENABLE(RUBBER_BANDING)
     1635    if (requiresOverhangAreasLayer()) {
     1636        if (!m_layerForOverhangAreas) {
     1637            m_layerForOverhangAreas = GraphicsLayer::create(this);
     1638#ifndef NDEBUG
     1639            m_layerForOverhangAreas->setName("overhang areas");
     1640#endif
     1641            m_layerForOverhangAreas->setDrawsContent(false);
     1642            m_layerForOverhangAreas->setSize(m_renderView->frameView()->frameRect().size());
     1643            m_overflowControlsHostLayer->addChild(m_layerForOverhangAreas.get());
     1644            layersChanged = true;
     1645        }
     1646    } else if (m_layerForOverhangAreas) {
     1647        m_layerForOverhangAreas->removeFromParent();
     1648        m_layerForOverhangAreas = nullptr;
     1649        layersChanged = true;
     1650    }
     1651#endif
    16151652
    16161653    if (requiresHorizontalScrollbarLayer()) {
     
    17271764
    17281765    detachRootLayer();
     1766
     1767#if PLATFORM(CHROMIUM) && ENABLE(RUBBER_BANDING)
     1768    if (m_layerForOverhangAreas) {
     1769        m_layerForOverhangAreas->removeFromParent();
     1770        m_layerForOverhangAreas = nullptr;
     1771    }
     1772#endif
    17291773
    17301774    if (m_layerForHorizontalScrollbar) {
  • trunk/Source/WebCore/rendering/RenderLayerCompositor.h

    r93760 r95158  
    197197    GraphicsLayer* layerForVerticalScrollbar() const { return m_layerForVerticalScrollbar.get(); }
    198198    GraphicsLayer* layerForScrollCorner() const { return m_layerForScrollCorner.get(); }
     199#if PLATFORM(CHROMIUM) && ENABLE(RUBBER_BANDING)
     200    GraphicsLayer* layerForOverhangAreas() const { return m_layerForOverhangAreas.get(); }
     201#endif
    199202
    200203private:
     
    276279    bool requiresVerticalScrollbarLayer() const;
    277280    bool requiresScrollCornerLayer() const;
     281#if PLATFORM(CHROMIUM) && ENABLE(RUBBER_BANDING)
     282    bool requiresOverhangAreasLayer() const;
     283#endif
    278284
    279285private:
     
    312318    OwnPtr<GraphicsLayer> m_layerForVerticalScrollbar;
    313319    OwnPtr<GraphicsLayer> m_layerForScrollCorner;
     320#if PLATFORM(CHROMIUM) && ENABLE(RUBBER_BANDING)
     321    OwnPtr<GraphicsLayer> m_layerForOverhangAreas;
     322#endif
    314323#if PROFILE_LAYER_REBUILD
    315324    int m_rootLayerUpdateCount;
Note: See TracChangeset for help on using the changeset viewer.