diff options
author | wangxianzhu@chromium.org <wangxianzhu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-11 02:23:50 +0000 |
---|---|---|
committer | wangxianzhu@chromium.org <wangxianzhu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-11 02:23:50 +0000 |
commit | 1b437cae660fa183de00199d819b008fa1b8b50a (patch) | |
tree | 7da8d4ef05a5e95cf389974680a32ea5a0ecf90b /cc | |
parent | 34709a7605a64c8abc4235cc4a0589d40ec78c8d (diff) | |
download | chromium_src-1b437cae660fa183de00199d819b008fa1b8b50a.zip chromium_src-1b437cae660fa183de00199d819b008fa1b8b50a.tar.gz chromium_src-1b437cae660fa183de00199d819b008fa1b8b50a.tar.bz2 |
Ensure opaque background for missing tiles for opaque layers
For an opaque layer, when some tiles are missing and
background_color_instead_of_checkerboard is set,
the background color used must be opaque to meet the expectations of the occlusion
tracker, otherwise residue (release) or blue blocks (debug) will appear.
BTW removed the background_color_instead_of_checkerboard part from
TileLayerImpl because it is unused and isn't worth to fix.
BUG=223697
Review URL: https://chromiumcodereview.appspot.com/13729003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@193544 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc')
-rw-r--r-- | cc/layers/picture_layer_impl.cc | 19 | ||||
-rw-r--r-- | cc/layers/tiled_layer_impl.cc | 39 |
2 files changed, 33 insertions, 25 deletions
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc index feafa1e..aa9b7f7 100644 --- a/cc/layers/picture_layer_impl.cc +++ b/cc/layers/picture_layer_impl.cc @@ -166,8 +166,25 @@ void PictureLayerImpl::AppendQuads(QuadSink* quad_sink, if (quad_sink->Append(quad.PassAs<DrawQuad>(), append_quads_data)) append_quads_data->num_missing_tiles++; } else { + SkColor color = background_color(); + // TODO(wangxianzhu): Change the next |if| condition once we support + // finer-grain opaqueness. Ensure with the following DCHECK. + DCHECK(contents_opaque() || VisibleContentOpaqueRegion().IsEmpty()); + if (SkColorGetA(color) != 255 && contents_opaque()) { + // If content is opaque, the occlusion tracker expects this layer to + // cover the background, so needs an opaque color. + for (const LayerImpl* layer = parent(); layer; + layer = layer->parent()) { + color = layer->background_color(); + if (SkColorGetA(color) == 255) + break; + } + if (SkColorGetA(color) != 255) + color = layer_tree_impl()->background_color(); + DCHECK_EQ(SkColorGetA(color), 255u); + } scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create(); - quad->SetNew(shared_quad_state, geometry_rect, background_color()); + quad->SetNew(shared_quad_state, geometry_rect, color); if (quad_sink->Append(quad.PassAs<DrawQuad>(), append_quads_data)) append_quads_data->num_missing_tiles++; } diff --git a/cc/layers/tiled_layer_impl.cc b/cc/layers/tiled_layer_impl.cc index 2ebad54..69f8905 100644 --- a/cc/layers/tiled_layer_impl.cc +++ b/cc/layers/tiled_layer_impl.cc @@ -189,32 +189,23 @@ void TiledLayerImpl::AppendQuads(QuadSink* quad_sink, continue; if (!tile || !tile->resource_id()) { - if (DrawCheckerboardForMissingTiles()) { - SkColor checker_color; - if (ShowDebugBorders()) { - checker_color = - tile ? DebugColors::InvalidatedTileCheckerboardColor() - : DebugColors::EvictedTileCheckerboardColor(); - } else { - checker_color = DebugColors::DefaultCheckerboardColor(); - } - - 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++; + SkColor checker_color; + if (ShowDebugBorders()) { + checker_color = + tile ? DebugColors::InvalidatedTileCheckerboardColor() + : DebugColors::EvictedTileCheckerboardColor(); } else { - scoped_ptr<SolidColorDrawQuad> solid_color_quad = - SolidColorDrawQuad::Create(); - solid_color_quad->SetNew( - shared_quad_state, tile_rect, background_color()); - if (quad_sink->Append(solid_color_quad.PassAs<DrawQuad>(), - append_quads_data)) - append_quads_data->num_missing_tiles++; + checker_color = DebugColors::DefaultCheckerboardColor(); } + + 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++; + continue; } |