Index: cc/trees/occlusion_tracker_unittest.cc |
diff --git a/cc/trees/occlusion_tracker_unittest.cc b/cc/trees/occlusion_tracker_unittest.cc |
index 172b22798b28a4423826613db2b01d80b4d34003..e3639adeb0a99f04a9022e459b09fd3aedda8204 100644 |
--- a/cc/trees/occlusion_tracker_unittest.cc |
+++ b/cc/trees/occlusion_tracker_unittest.cc |
@@ -101,8 +101,9 @@ class TestOcclusionTrackerWithClip : public TestOcclusionTracker<LayerType> { |
gfx::Rect UnoccludedSurfaceContentRect(const LayerType* layer, |
const gfx::Rect& content_rect) const { |
typename LayerType::RenderSurfaceType* surface = layer->render_surface(); |
- return this->UnoccludedContributingSurfaceContentRect( |
- content_rect, surface->draw_transform()); |
+ return this->GetCurrentOcclusionForContributingSurface( |
+ surface->draw_transform()) |
+ .GetUnoccludedContentRect(content_rect); |
} |
}; |
@@ -2671,6 +2672,53 @@ ALL_OCCLUSIONTRACKER_TEST( |
OcclusionTrackerTestReduceOcclusionWhenBackgroundFilterIsPartiallyOccluded); |
template <class Types> |
+class OcclusionTrackerTestBlendModeDoesNotOcclude |
+ : public OcclusionTrackerTest<Types> { |
+ protected: |
+ explicit OcclusionTrackerTestBlendModeDoesNotOcclude(bool opaque_layers) |
+ : OcclusionTrackerTest<Types>(opaque_layers) {} |
+ void RunMyTest() override { |
+ typename Types::ContentLayerType* parent = this->CreateRoot( |
+ this->identity_matrix, gfx::PointF(), gfx::Size(100, 100)); |
+ typename Types::LayerType* blend_mode_layer = this->CreateDrawingLayer( |
+ parent, this->identity_matrix, gfx::PointF(0.f, 0.f), |
+ gfx::Size(100, 100), true); |
+ typename Types::LayerType* top_layer = this->CreateDrawingLayer( |
+ parent, this->identity_matrix, gfx::PointF(10.f, 12.f), |
+ gfx::Size(20, 22), true); |
+ |
+ // Blend mode makes the layer own a surface. |
+ Types::SetForceRenderSurface(blend_mode_layer, true); |
+ blend_mode_layer->SetBlendMode(SkXfermode::kMultiply_Mode); |
+ |
+ this->CalcDrawEtc(parent); |
+ |
+ TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
+ gfx::Rect(0, 0, 1000, 1000)); |
+ |
+ this->VisitLayer(top_layer, &occlusion); |
+ // |top_layer| occludes. |
+ EXPECT_EQ(gfx::Rect(10, 12, 20, 22).ToString(), |
+ occlusion.occlusion_from_inside_target().ToString()); |
+ EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); |
+ |
+ this->VisitLayer(blend_mode_layer, &occlusion); |
+ // |top_layer| occludes but not |blend_mode_layer|. |
+ EXPECT_EQ(gfx::Rect(10, 12, 20, 22).ToString(), |
+ occlusion.occlusion_from_outside_target().ToString()); |
+ EXPECT_TRUE(occlusion.occlusion_from_inside_target().IsEmpty()); |
+ |
+ this->VisitContributingSurface(blend_mode_layer, &occlusion); |
+ // |top_layer| occludes but not |blend_mode_layer|. |
+ EXPECT_EQ(gfx::Rect(10, 12, 20, 22).ToString(), |
+ occlusion.occlusion_from_inside_target().ToString()); |
+ EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); |
+ } |
+}; |
+ |
+ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestBlendModeDoesNotOcclude); |
+ |
+template <class Types> |
class OcclusionTrackerTestMinimumTrackingSize |
: public OcclusionTrackerTest<Types> { |
protected: |
@@ -2816,12 +2864,22 @@ class OcclusionTrackerTestCopyRequestDoesOcclude |
gfx::PointF(), |
gfx::Size(200, 400), |
true); |
+ typename Types::LayerType* top_layer = |
+ this->CreateDrawingLayer(root, this->identity_matrix, |
+ gfx::PointF(50, 0), gfx::Size(50, 400), true); |
this->CalcDrawEtc(root); |
TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( |
gfx::Rect(0, 0, 1000, 1000)); |
+ this->VisitLayer(top_layer, &occlusion); |
+ EXPECT_EQ(gfx::Rect().ToString(), |
+ occlusion.occlusion_from_outside_target().ToString()); |
+ EXPECT_EQ(gfx::Rect(50, 0, 50, 400).ToString(), |
+ occlusion.occlusion_from_inside_target().ToString()); |
+ |
this->VisitLayer(copy_child, &occlusion); |
+ // Layers outside the copy request do not occlude. |
EXPECT_EQ(gfx::Rect().ToString(), |
occlusion.occlusion_from_outside_target().ToString()); |
EXPECT_EQ(gfx::Rect(200, 400).ToString(), |
@@ -2833,7 +2891,7 @@ class OcclusionTrackerTestCopyRequestDoesOcclude |
// The occlusion from the copy should be kept. |
EXPECT_EQ(gfx::Rect().ToString(), |
occlusion.occlusion_from_outside_target().ToString()); |
- EXPECT_EQ(gfx::Rect(100, 0, 200, 400).ToString(), |
+ EXPECT_EQ(gfx::Rect(50, 0, 250, 400).ToString(), |
occlusion.occlusion_from_inside_target().ToString()); |
} |
}; |