diff options
Diffstat (limited to 'cc')
-rw-r--r-- | cc/layers/picture_layer_impl.cc | 28 | ||||
-rw-r--r-- | cc/layers/picture_layer_impl_unittest.cc | 59 |
2 files changed, 76 insertions, 11 deletions
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc index 558ef91..89e8c53 100644 --- a/cc/layers/picture_layer_impl.cc +++ b/cc/layers/picture_layer_impl.cc @@ -149,7 +149,11 @@ void PictureLayerImpl::AppendQuads(QuadSink* quad_sink, gfx::Rect geometry_rect = rect; gfx::Rect opaque_rect = contents_opaque() ? geometry_rect : gfx::Rect(); - gfx::Rect visible_geometry_rect = geometry_rect; + gfx::Rect visible_geometry_rect = + quad_sink->UnoccludedContentRect(geometry_rect, draw_transform()); + if (visible_geometry_rect.IsEmpty()) + return; + gfx::Size texture_size = rect.size(); gfx::RectF texture_rect = gfx::RectF(texture_size); gfx::Rect quad_content_rect = rect; @@ -166,8 +170,8 @@ void PictureLayerImpl::AppendQuads(QuadSink* quad_sink, quad_content_rect, contents_scale, pile_); - if (quad_sink->MaybeAppend(quad.PassAs<DrawQuad>())) - append_quads_data->num_missing_tiles++; + quad_sink->Append(quad.PassAs<DrawQuad>()); + append_quads_data->num_missing_tiles++; return; } @@ -216,7 +220,7 @@ void PictureLayerImpl::AppendQuads(QuadSink* quad_sink, visible_geometry_rect, color, width); - quad_sink->MaybeAppend(debug_border_quad.PassAs<DrawQuad>()); + quad_sink->Append(debug_border_quad.PassAs<DrawQuad>()); } } @@ -229,16 +233,18 @@ void PictureLayerImpl::AppendQuads(QuadSink* quad_sink, iter; ++iter) { gfx::Rect geometry_rect = iter.geometry_rect(); - gfx::Rect visible_geometry_rect = geometry_rect; + gfx::Rect visible_geometry_rect = + quad_sink->UnoccludedContentRect(geometry_rect, draw_transform()); + if (visible_geometry_rect.IsEmpty()) + continue; + if (!*iter || !iter->IsReadyToDraw()) { if (draw_checkerboard_for_missing_tiles()) { - // TODO(enne): Figure out how to show debug "invalidated checker" color scoped_ptr<CheckerboardDrawQuad> quad = CheckerboardDrawQuad::Create(); SkColor color = DebugColors::DefaultCheckerboardColor(); quad->SetNew( shared_quad_state, geometry_rect, visible_geometry_rect, color); - if (quad_sink->MaybeAppend(quad.PassAs<DrawQuad>())) - append_quads_data->num_missing_tiles++; + quad_sink->Append(quad.PassAs<DrawQuad>()); } else { SkColor color = SafeOpaqueBackgroundColor(); scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create(); @@ -247,10 +253,10 @@ void PictureLayerImpl::AppendQuads(QuadSink* quad_sink, visible_geometry_rect, color, false); - if (quad_sink->MaybeAppend(quad.PassAs<DrawQuad>())) - append_quads_data->num_missing_tiles++; + quad_sink->Append(quad.PassAs<DrawQuad>()); } + append_quads_data->num_missing_tiles++; append_quads_data->had_incomplete_tile = true; continue; } @@ -315,7 +321,7 @@ void PictureLayerImpl::AppendQuads(QuadSink* quad_sink, } DCHECK(draw_quad); - quad_sink->MaybeAppend(draw_quad.Pass()); + quad_sink->Append(draw_quad.Pass()); if (seen_tilings.empty() || seen_tilings.back() != iter.CurrentTiling()) seen_tilings.push_back(iter.CurrentTiling()); diff --git a/cc/layers/picture_layer_impl_unittest.cc b/cc/layers/picture_layer_impl_unittest.cc index d0cb1cb..8fd7185 100644 --- a/cc/layers/picture_layer_impl_unittest.cc +++ b/cc/layers/picture_layer_impl_unittest.cc @@ -19,6 +19,7 @@ #include "cc/test/fake_picture_pile_impl.h" #include "cc/test/geometry_test_utils.h" #include "cc/test/impl_side_painting_settings.h" +#include "cc/test/layer_test_common.h" #include "cc/test/mock_quad_culler.h" #include "cc/test/test_shared_bitmap_manager.h" #include "cc/test/test_web_graphics_context_3d.h" @@ -129,6 +130,7 @@ class PictureLayerImplTest : public testing::Test { scoped_ptr<FakePictureLayerImpl> pending_layer = FakePictureLayerImpl::CreateWithPile(pending_tree, id_, pile); pending_layer->SetDrawsContent(true); + pending_layer->SetAnchorPoint(gfx::PointF()); pending_tree->SetRootLayer(pending_layer.PassAs<LayerImpl>()); pending_layer_ = static_cast<FakePictureLayerImpl*>( @@ -2161,5 +2163,62 @@ TEST_F(PictureLayerImplTest, LayerEvictionTileIterator) { EXPECT_EQ(all_tiles_set.size(), unique_tiles.size()); } +TEST_F(PictureLayerImplTest, Occlusion) { + gfx::Size tile_size(102, 102); + gfx::Size layer_bounds(1000, 1000); + gfx::Size viewport_size(1000, 1000); + + LayerTestCommon::LayerImplTest impl; + + scoped_refptr<FakePicturePileImpl> pending_pile = + FakePicturePileImpl::CreateFilledPile(layer_bounds, layer_bounds); + SetupPendingTree(pending_pile); + pending_layer_->SetBounds(layer_bounds); + ActivateTree(); + active_layer_->set_fixed_tile_size(tile_size); + + host_impl_.SetViewportSize(viewport_size); + host_impl_.active_tree()->UpdateDrawProperties(); + + std::vector<Tile*> tiles = + active_layer_->HighResTiling()->AllTilesForTesting(); + host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(tiles); + + { + SCOPED_TRACE("No occlusion"); + gfx::Rect occluded; + impl.AppendQuadsWithOcclusion(active_layer_, occluded); + + LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(), + gfx::Rect(layer_bounds)); + EXPECT_EQ(100u, impl.quad_list().size()); + } + + { + SCOPED_TRACE("Full occlusion"); + gfx::Rect occluded(active_layer_->visible_content_rect()); + impl.AppendQuadsWithOcclusion(active_layer_, occluded); + + LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(), gfx::Rect()); + EXPECT_EQ(impl.quad_list().size(), 0u); + } + + { + SCOPED_TRACE("Partial occlusion"); + gfx::Rect occluded(150, 0, 200, 1000); + impl.AppendQuadsWithOcclusion(active_layer_, occluded); + + size_t partially_occluded_count = 0; + LayerTestCommon::VerifyQuadsCoverRectWithOcclusion( + impl.quad_list(), + gfx::Rect(layer_bounds), + occluded, + &partially_occluded_count); + // The layer outputs one quad, which is partially occluded. + EXPECT_EQ(100u - 10u, impl.quad_list().size()); + EXPECT_EQ(10u + 10u, partially_occluded_count); + } +} + } // namespace } // namespace cc |