summaryrefslogtreecommitdiffstats
path: root/cc
diff options
context:
space:
mode:
Diffstat (limited to 'cc')
-rw-r--r--cc/layers/picture_layer_impl.cc28
-rw-r--r--cc/layers/picture_layer_impl_unittest.cc59
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