summaryrefslogtreecommitdiffstats
path: root/chromium/cc/layers/tiled_layer_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/cc/layers/tiled_layer_impl.cc')
-rw-r--r--chromium/cc/layers/tiled_layer_impl.cc45
1 files changed, 30 insertions, 15 deletions
diff --git a/chromium/cc/layers/tiled_layer_impl.cc b/chromium/cc/layers/tiled_layer_impl.cc
index 88797c224dd..6aacd1e16b7 100644
--- a/chromium/cc/layers/tiled_layer_impl.cc
+++ b/chromium/cc/layers/tiled_layer_impl.cc
@@ -54,6 +54,12 @@ TiledLayerImpl::~TiledLayerImpl() {
ResourceProvider::ResourceId TiledLayerImpl::ContentsResourceId() const {
// This function is only valid for single texture layers, e.g. masks.
DCHECK(tiler_);
+ // It's possible the mask layer is created but has no size or otherwise
+ // can't draw.
+ if (tiler_->num_tiles_x() == 0 || tiler_->num_tiles_y() == 0)
+ return 0;
+
+ // Any other number of tiles other than 0 or 1 is incorrect for masks.
DCHECK_EQ(tiler_->num_tiles_x(), 1);
DCHECK_EQ(tiler_->num_tiles_y(), 1);
@@ -152,9 +158,11 @@ void TiledLayerImpl::AppendQuads(QuadSink* quad_sink,
DCHECK(!visible_content_rect().IsEmpty());
gfx::Rect content_rect = visible_content_rect();
- SharedQuadState* shared_quad_state =
- quad_sink->UseSharedQuadState(CreateSharedQuadState());
- AppendDebugBorderQuad(quad_sink, shared_quad_state, append_quads_data);
+ SharedQuadState* shared_quad_state = quad_sink->CreateSharedQuadState();
+ PopulateSharedQuadState(shared_quad_state);
+
+ AppendDebugBorderQuad(
+ quad_sink, content_bounds(), shared_quad_state, append_quads_data);
int left, top, right, bottom;
tiler_->ContentRectToTileIndices(content_rect, &left, &top, &right, &bottom);
@@ -164,6 +172,7 @@ void TiledLayerImpl::AppendQuads(QuadSink* quad_sink,
for (int i = left; i <= right; ++i) {
DrawableTile* tile = TileAt(i, j);
gfx::Rect tile_rect = tiler_->tile_bounds(i, j);
+ gfx::Rect visible_tile_rect = tile_rect;
SkColor border_color;
float border_width;
@@ -176,10 +185,12 @@ void TiledLayerImpl::AppendQuads(QuadSink* quad_sink,
}
scoped_ptr<DebugBorderDrawQuad> debug_border_quad =
DebugBorderDrawQuad::Create();
- debug_border_quad->SetNew(
- shared_quad_state, tile_rect, border_color, border_width);
- quad_sink->Append(debug_border_quad.PassAs<DrawQuad>(),
- append_quads_data);
+ debug_border_quad->SetNew(shared_quad_state,
+ tile_rect,
+ visible_tile_rect,
+ border_color,
+ border_width);
+ quad_sink->Append(debug_border_quad.PassAs<DrawQuad>());
}
}
}
@@ -198,6 +209,11 @@ void TiledLayerImpl::AppendQuads(QuadSink* quad_sink,
if (tile_rect.IsEmpty())
continue;
+ gfx::Rect visible_tile_rect =
+ quad_sink->UnoccludedContentRect(tile_rect, draw_transform());
+ if (visible_tile_rect.IsEmpty())
+ continue;
+
if (!tile || !tile->resource_id()) {
SkColor checker_color;
if (ShowDebugBorders()) {
@@ -211,11 +227,9 @@ void TiledLayerImpl::AppendQuads(QuadSink* quad_sink,
scoped_ptr<CheckerboardDrawQuad> checkerboard_quad =
CheckerboardDrawQuad::Create();
checkerboard_quad->SetNew(
- shared_quad_state, tile_rect, checker_color);
- if (quad_sink->Append(checkerboard_quad.PassAs<DrawQuad>(),
- append_quads_data))
- append_quads_data->num_missing_tiles++;
-
+ shared_quad_state, tile_rect, visible_tile_rect, checker_color);
+ quad_sink->Append(checkerboard_quad.PassAs<DrawQuad>());
+ append_quads_data->num_missing_tiles++;
continue;
}
@@ -238,11 +252,12 @@ void TiledLayerImpl::AppendQuads(QuadSink* quad_sink,
quad->SetNew(shared_quad_state,
tile_rect,
tile_opaque_rect,
+ visible_tile_rect,
tile->resource_id(),
tex_coord_rect,
texture_size,
tile->contents_swizzled());
- quad_sink->Append(quad.PassAs<DrawQuad>(), append_quads_data);
+ quad_sink->Append(quad.PassAs<DrawQuad>());
}
}
}
@@ -263,7 +278,7 @@ void TiledLayerImpl::PushTileProperties(
int i,
int j,
ResourceProvider::ResourceId resource_id,
- gfx::Rect opaque_rect,
+ const gfx::Rect& opaque_rect,
bool contents_swizzled) {
DrawableTile* tile = TileAt(i, j);
if (!tile)
@@ -290,7 +305,7 @@ Region TiledLayerImpl::VisibleContentOpaqueRegion() const {
return tiler_->OpaqueRegionInContentRect(visible_content_rect());
}
-void TiledLayerImpl::DidLoseOutputSurface() {
+void TiledLayerImpl::ReleaseResources() {
tiler_->reset();
}