diff options
Diffstat (limited to 'chromium/cc/layers/tiled_layer_impl.cc')
-rw-r--r-- | chromium/cc/layers/tiled_layer_impl.cc | 45 |
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(); } |