Changeset 116472 in webkit


Ignore:
Timestamp:
May 8, 2012 5:54:45 PM (12 years ago)
Author:
danakj@chromium.org
Message:

[chromium] Reflections with masks should not occlude
https://bugs.webkit.org/show_bug.cgi?id=85927

Reviewed by James Robinson.

Source/WebCore:

When a surface does not have a mask, we make both it and its reflection
occlude the things below them. However, if the reflection has a mask
applied to it, then we should not consider it as occluding.

Adds replicaHasMask() to the render surface classes so we can test if
the mask is present.

Unit Tests: CCOcclusionTrackerTestReplicaWithMask

  • platform/graphics/chromium/RenderSurfaceChromium.cpp:

(WebCore::RenderSurfaceChromium::hasMask):
This is unusued right now, but will allow us to remove a FIXME from
CCOcclusionTracker::finishedTargetRenderSurface().
(WebCore):
(WebCore::RenderSurfaceChromium::replicaHasMask):

  • platform/graphics/chromium/RenderSurfaceChromium.h:

(RenderSurfaceChromium):

  • platform/graphics/chromium/cc/CCOcclusionTracker.cpp:

(WebCore::::leaveToTargetRenderSurface):

  • platform/graphics/chromium/cc/CCRenderSurface.cpp:

(WebCore::CCRenderSurface::hasMask):
This is unusued right now, but will allow us to remove a FIXME from
CCOcclusionTracker::finishedTargetRenderSurface().
(WebCore):
(WebCore::CCRenderSurface::replicaHasMask):

  • platform/graphics/chromium/cc/CCRenderSurface.h:

(CCRenderSurface):

Source/WebKit/chromium:

  • tests/CCOcclusionTrackerTest.cpp:

(WebKitTests::CCOcclusionTrackerTest::TearDown):
(WebKitTests::CCOcclusionTrackerTest::createMaskLayer):
(CCOcclusionTrackerTest):
(WebKitTests::CCOcclusionTrackerTest::setMask):
(CCOcclusionTrackerTestReplicaWithMask):
(WebKitTests::CCOcclusionTrackerTestReplicaWithMask::runMyTest):
(WebKitTests):

Location:
trunk/Source
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r116471 r116472  
     12012-05-08  Dana Jansens  <danakj@chromium.org>
     2
     3        [chromium] Reflections with masks should not occlude
     4        https://bugs.webkit.org/show_bug.cgi?id=85927
     5
     6        Reviewed by James Robinson.
     7
     8        When a surface does not have a mask, we make both it and its reflection
     9        occlude the things below them. However, if the reflection has a mask
     10        applied to it, then we should not consider it as occluding.
     11
     12        Adds replicaHasMask() to the render surface classes so we can test if
     13        the mask is present.
     14
     15        Unit Tests: CCOcclusionTrackerTestReplicaWithMask
     16
     17        * platform/graphics/chromium/RenderSurfaceChromium.cpp:
     18        (WebCore::RenderSurfaceChromium::hasMask):
     19        This is unusued right now, but will allow us to remove a FIXME from
     20        CCOcclusionTracker::finishedTargetRenderSurface().
     21        (WebCore):
     22        (WebCore::RenderSurfaceChromium::replicaHasMask):
     23        * platform/graphics/chromium/RenderSurfaceChromium.h:
     24        (RenderSurfaceChromium):
     25        * platform/graphics/chromium/cc/CCOcclusionTracker.cpp:
     26        (WebCore::::leaveToTargetRenderSurface):
     27        * platform/graphics/chromium/cc/CCRenderSurface.cpp:
     28        (WebCore::CCRenderSurface::hasMask):
     29        This is unusued right now, but will allow us to remove a FIXME from
     30        CCOcclusionTracker::finishedTargetRenderSurface().
     31        (WebCore):
     32        (WebCore::CCRenderSurface::replicaHasMask):
     33        * platform/graphics/chromium/cc/CCRenderSurface.h:
     34        (CCRenderSurface):
     35
    1362012-05-08  Eric Seidel  <eric@webkit.org>
    237
  • trunk/Source/WebCore/platform/graphics/chromium/RenderSurfaceChromium.cpp

    r114197 r116472  
    7070}
    7171
     72bool RenderSurfaceChromium::hasMask() const
     73{
     74    return m_maskLayer;
     75}
     76
     77bool RenderSurfaceChromium::replicaHasMask() const
     78{
     79    return hasReplica() && (m_maskLayer || m_owningLayer->replicaLayer()->maskLayer());
     80}
     81
    7282}
    7383#endif // USE(ACCELERATED_COMPOSITING)
  • trunk/Source/WebCore/platform/graphics/chromium/RenderSurfaceChromium.h

    r114197 r116472  
    110110    bool hasReplica() const;
    111111
     112    bool hasMask() const;
     113    bool replicaHasMask() const;
     114
    112115private:
    113116    LayerChromium* m_owningLayer;
  • trunk/Source/WebCore/platform/graphics/chromium/cc/CCOcclusionTracker.cpp

    r115944 r116472  
    231231    const RenderSurfaceType* oldTarget = m_stack[lastIndex].surface;
    232232    Region oldTargetOcclusionInNewTarget = transformSurfaceOpaqueRegion<RenderSurfaceType>(oldTarget, m_stack[lastIndex].occlusionInTarget, oldTarget->originTransform());
    233     if (oldTarget->hasReplica())
     233    if (oldTarget->hasReplica() && !oldTarget->replicaHasMask())
    234234        oldTargetOcclusionInNewTarget.unite(transformSurfaceOpaqueRegion<RenderSurfaceType>(oldTarget, m_stack[lastIndex].occlusionInTarget, oldTarget->replicaOriginTransform()));
    235235
  • trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.cpp

    r115403 r116472  
    397397}
    398398
     399bool CCRenderSurface::hasMask() const
     400{
     401    return m_maskLayer;
     402}
     403
     404bool CCRenderSurface::replicaHasMask() const
     405{
     406    return hasReplica() && (m_maskLayer || m_owningLayer->replicaLayer()->maskLayer());
     407}
     408
    399409void CCRenderSurface::setClipRect(const IntRect& clipRect)
    400410{
  • trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.h

    r115403 r116472  
    142142    bool hasReplica() const;
    143143
     144    bool hasMask() const;
     145    bool replicaHasMask() const;
     146
    144147    void resetPropertyChangedFlag() { m_surfacePropertyChanged = false; }
    145148    bool surfacePropertyChanged() const;
  • trunk/Source/WebKit/chromium/ChangeLog

    r116463 r116472  
     12012-05-08  Dana Jansens  <danakj@chromium.org>
     2
     3        [chromium] Reflections with masks should not occlude
     4        https://bugs.webkit.org/show_bug.cgi?id=85927
     5
     6        Reviewed by James Robinson.
     7
     8        * tests/CCOcclusionTrackerTest.cpp:
     9        (WebKitTests::CCOcclusionTrackerTest::TearDown):
     10        (WebKitTests::CCOcclusionTrackerTest::createMaskLayer):
     11        (CCOcclusionTrackerTest):
     12        (WebKitTests::CCOcclusionTrackerTest::setMask):
     13        (CCOcclusionTrackerTestReplicaWithMask):
     14        (WebKitTests::CCOcclusionTrackerTestReplicaWithMask::runMyTest):
     15        (WebKitTests):
     16
    1172012-05-08  Dana Jansens  <danakj@chromium.org>
    218
  • trunk/Source/WebKit/chromium/tests/CCOcclusionTrackerTest.cpp

    r115944 r116472  
    173173        m_renderSurfaceLayerListImpl.clear();
    174174        m_replicaLayers.clear();
     175        m_maskLayers.clear();
    175176        CCLayerTreeHost::setNeedsFilterContext(false);
    176177    }
     
    234235    }
    235236
     237    typename Types::LayerType* createMaskLayer(typename Types::LayerType* owningLayer, const IntSize& bounds)
     238    {
     239        typename Types::ContentLayerPtrType layer(Types::createContentLayer());
     240        typename Types::ContentLayerType* layerPtr = layer.get();
     241        setProperties(layerPtr, identityMatrix, FloatPoint(), bounds);
     242        setMask(owningLayer, layer.release());
     243        return layerPtr;
     244    }
     245
    236246    typename Types::ContentLayerType* createDrawingSurface(typename Types::LayerType* parent, const TransformationMatrix& transform, const FloatPoint& position, const IntSize& bounds, bool opaque)
    237247    {
     
    359369    {
    360370        owningLayer->setReplicaLayer(layer);
     371    }
     372
     373    void setMask(LayerChromium* owningLayer, PassRefPtr<LayerChromium> layer)
     374    {
     375        owningLayer->setMaskLayer(layer.get());
     376        m_maskLayers.append(layer);
     377    }
     378
     379    void setMask(CCLayerImpl* owningLayer, PassOwnPtr<CCLayerImpl> layer)
     380    {
     381        owningLayer->setMaskLayer(layer);
    361382    }
    362383
     
    369390    typename Types::LayerType* m_lastLayerVisited;
    370391    Vector<RefPtr<LayerChromium> > m_replicaLayers;
     392    Vector<RefPtr<LayerChromium> > m_maskLayers;
    371393};
    372394
     
    13311353
    13321354template<class Types, bool opaqueLayers>
     1355class CCOcclusionTrackerTestReplicaWithMask : public CCOcclusionTrackerTest<Types, opaqueLayers> {
     1356protected:
     1357    void runMyTest()
     1358    {
     1359        typename Types::ContentLayerType* parent = this->createRoot(this->identityMatrix, FloatPoint(0, 0), IntSize(100, 200));
     1360        typename Types::LayerType* surface = this->createDrawingSurface(parent, this->identityMatrix, FloatPoint(0, 100), IntSize(50, 50), true);
     1361        typename Types::LayerType* replica = this->createReplicaLayer(surface, this->identityMatrix, FloatPoint(50, 50), IntSize());
     1362        this->createMaskLayer(replica, IntSize(10, 10));
     1363        this->calcDrawEtc(parent);
     1364
     1365        TestCCOcclusionTrackerWithScissor<typename Types::LayerType, typename Types::RenderSurfaceType> occlusion(IntRect(0, 0, 1000, 1000));
     1366        occlusion.setLayerScissorRect(IntRect(0, 0, 1000, 1000));
     1367
     1368        this->visitLayer(surface, occlusion);
     1369
     1370        EXPECT_EQ_RECT(IntRect(0, 100, 50, 50), occlusion.occlusionInScreenSpace().bounds());
     1371        EXPECT_EQ(1u, occlusion.occlusionInScreenSpace().rects().size());
     1372        EXPECT_EQ_RECT(IntRect(0, 0, 50, 50), occlusion.occlusionInTargetSurface().bounds());
     1373        EXPECT_EQ(1u, occlusion.occlusionInTargetSurface().rects().size());
     1374
     1375        this->visitContributingSurface(surface, occlusion);
     1376        this->enterLayer(parent, occlusion);
     1377
     1378        // The replica should not be occluding the parent, since it has a mask applied to it.
     1379        EXPECT_EQ_RECT(IntRect(0, 100, 50, 50), occlusion.occlusionInTargetSurface().bounds());
     1380        EXPECT_EQ(1u, occlusion.occlusionInTargetSurface().rects().size());
     1381    }
     1382};
     1383
     1384ALL_CCOCCLUSIONTRACKER_TEST(CCOcclusionTrackerTestReplicaWithMask);
     1385
     1386template<class Types, bool opaqueLayers>
    13331387class CCOcclusionTrackerTestLayerScissorRectOutsideChild : public CCOcclusionTrackerTest<Types, opaqueLayers> {
    13341388protected:
Note: See TracChangeset for help on using the changeset viewer.