Changeset 116472 in webkit
- Timestamp:
- May 8, 2012 5:54:45 PM (12 years ago)
- Location:
- trunk/Source
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r116471 r116472 1 2012-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 1 36 2012-05-08 Eric Seidel <eric@webkit.org> 2 37 -
trunk/Source/WebCore/platform/graphics/chromium/RenderSurfaceChromium.cpp
r114197 r116472 70 70 } 71 71 72 bool RenderSurfaceChromium::hasMask() const 73 { 74 return m_maskLayer; 75 } 76 77 bool RenderSurfaceChromium::replicaHasMask() const 78 { 79 return hasReplica() && (m_maskLayer || m_owningLayer->replicaLayer()->maskLayer()); 80 } 81 72 82 } 73 83 #endif // USE(ACCELERATED_COMPOSITING) -
trunk/Source/WebCore/platform/graphics/chromium/RenderSurfaceChromium.h
r114197 r116472 110 110 bool hasReplica() const; 111 111 112 bool hasMask() const; 113 bool replicaHasMask() const; 114 112 115 private: 113 116 LayerChromium* m_owningLayer; -
trunk/Source/WebCore/platform/graphics/chromium/cc/CCOcclusionTracker.cpp
r115944 r116472 231 231 const RenderSurfaceType* oldTarget = m_stack[lastIndex].surface; 232 232 Region oldTargetOcclusionInNewTarget = transformSurfaceOpaqueRegion<RenderSurfaceType>(oldTarget, m_stack[lastIndex].occlusionInTarget, oldTarget->originTransform()); 233 if (oldTarget->hasReplica() )233 if (oldTarget->hasReplica() && !oldTarget->replicaHasMask()) 234 234 oldTargetOcclusionInNewTarget.unite(transformSurfaceOpaqueRegion<RenderSurfaceType>(oldTarget, m_stack[lastIndex].occlusionInTarget, oldTarget->replicaOriginTransform())); 235 235 -
trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.cpp
r115403 r116472 397 397 } 398 398 399 bool CCRenderSurface::hasMask() const 400 { 401 return m_maskLayer; 402 } 403 404 bool CCRenderSurface::replicaHasMask() const 405 { 406 return hasReplica() && (m_maskLayer || m_owningLayer->replicaLayer()->maskLayer()); 407 } 408 399 409 void CCRenderSurface::setClipRect(const IntRect& clipRect) 400 410 { -
trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.h
r115403 r116472 142 142 bool hasReplica() const; 143 143 144 bool hasMask() const; 145 bool replicaHasMask() const; 146 144 147 void resetPropertyChangedFlag() { m_surfacePropertyChanged = false; } 145 148 bool surfacePropertyChanged() const; -
trunk/Source/WebKit/chromium/ChangeLog
r116463 r116472 1 2012-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 1 17 2012-05-08 Dana Jansens <danakj@chromium.org> 2 18 -
trunk/Source/WebKit/chromium/tests/CCOcclusionTrackerTest.cpp
r115944 r116472 173 173 m_renderSurfaceLayerListImpl.clear(); 174 174 m_replicaLayers.clear(); 175 m_maskLayers.clear(); 175 176 CCLayerTreeHost::setNeedsFilterContext(false); 176 177 } … … 234 235 } 235 236 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 236 246 typename Types::ContentLayerType* createDrawingSurface(typename Types::LayerType* parent, const TransformationMatrix& transform, const FloatPoint& position, const IntSize& bounds, bool opaque) 237 247 { … … 359 369 { 360 370 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); 361 382 } 362 383 … … 369 390 typename Types::LayerType* m_lastLayerVisited; 370 391 Vector<RefPtr<LayerChromium> > m_replicaLayers; 392 Vector<RefPtr<LayerChromium> > m_maskLayers; 371 393 }; 372 394 … … 1331 1353 1332 1354 template<class Types, bool opaqueLayers> 1355 class CCOcclusionTrackerTestReplicaWithMask : public CCOcclusionTrackerTest<Types, opaqueLayers> { 1356 protected: 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 1384 ALL_CCOCCLUSIONTRACKER_TEST(CCOcclusionTrackerTestReplicaWithMask); 1385 1386 template<class Types, bool opaqueLayers> 1333 1387 class CCOcclusionTrackerTestLayerScissorRectOutsideChild : public CCOcclusionTrackerTest<Types, opaqueLayers> { 1334 1388 protected:
Note: See TracChangeset
for help on using the changeset viewer.