Chromium Code Reviews| Index: cc/layers/picture_layer_impl.cc |
| diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc |
| old mode 100755 |
| new mode 100644 |
| index 250dafa34eac9f2ed6d7846e18f102e5797c3352..c01368111de2ff13b3730355f9d6f18383b897f6 |
| --- a/cc/layers/picture_layer_impl.cc |
| +++ b/cc/layers/picture_layer_impl.cc |
| @@ -139,10 +139,25 @@ void PictureLayerImpl::PushPropertiesTo(LayerImpl* base_layer) { |
| void PictureLayerImpl::AppendQuads(QuadSink* quad_sink, |
| AppendQuadsData* append_quads_data) { |
| DCHECK(!needs_post_commit_initialization_); |
| - gfx::Rect rect(visible_content_rect()); |
| + |
| + float max_contents_scale = MaximumTilingContentScale(); |
| + gfx::Transform scaled_draw_transform = draw_transform(); |
| + scaled_draw_transform.Scale(SK_MScalar1 / max_contents_scale, |
| + SK_MScalar1 / max_contents_scale); |
| + gfx::Size scaled_content_bounds = |
| + gfx::ToCeiledSize(gfx::ScaleSize(content_bounds(), max_contents_scale)); |
| + |
| + gfx::Rect scaled_visible_content_rect = |
| + gfx::ScaleToEnclosingRect(visible_content_rect(), max_contents_scale); |
| + scaled_visible_content_rect.Intersect(gfx::Rect(scaled_content_bounds)); |
| SharedQuadState* shared_quad_state = quad_sink->CreateSharedQuadState(); |
| - PopulateSharedQuadState(shared_quad_state); |
| + PopulateSharedQuadStateWithOverrides(shared_quad_state, |
|
enne (OOO)
2014/05/27 21:41:21
I don't think this function adds much. Can you ju
|
| + scaled_draw_transform, |
| + scaled_content_bounds, |
| + scaled_visible_content_rect); |
| + |
| + gfx::Rect rect = scaled_visible_content_rect; |
| if (current_draw_mode_ == DRAW_MODE_RESOURCELESS_SOFTWARE) { |
| AppendDebugBorderQuad( |
| @@ -162,7 +177,7 @@ void PictureLayerImpl::AppendQuads(QuadSink* quad_sink, |
| gfx::Size texture_size = rect.size(); |
| gfx::RectF texture_rect = gfx::RectF(texture_size); |
| gfx::Rect quad_content_rect = rect; |
| - float contents_scale = contents_scale_x(); |
| + float contents_scale = max_contents_scale; |
| scoped_ptr<PictureDrawQuad> quad = PictureDrawQuad::Create(); |
| quad->SetNew(shared_quad_state, |
| @@ -184,7 +199,7 @@ void PictureLayerImpl::AppendQuads(QuadSink* quad_sink, |
| if (ShowDebugBorders()) { |
| for (PictureLayerTilingSet::CoverageIterator iter( |
| - tilings_.get(), contents_scale_x(), rect, ideal_contents_scale_); |
| + tilings_.get(), max_contents_scale, rect, ideal_contents_scale_); |
| iter; |
| ++iter) { |
| SkColor color; |
| @@ -204,7 +219,7 @@ void PictureLayerImpl::AppendQuads(QuadSink* quad_sink, |
| } else if (iter->priority(ACTIVE_TREE).resolution == LOW_RESOLUTION) { |
| color = DebugColors::LowResTileBorderColor(); |
| width = DebugColors::LowResTileBorderWidth(layer_tree_impl()); |
| - } else if (iter->contents_scale() > contents_scale_x()) { |
| + } else if (iter->contents_scale() > max_contents_scale) { |
| color = DebugColors::ExtraHighResTileBorderColor(); |
| width = DebugColors::ExtraHighResTileBorderWidth(layer_tree_impl()); |
| } else { |
| @@ -235,7 +250,7 @@ void PictureLayerImpl::AppendQuads(QuadSink* quad_sink, |
| bool had_checkerboard_quads = false; |
| for (PictureLayerTilingSet::CoverageIterator iter( |
| - tilings_.get(), contents_scale_x(), rect, ideal_contents_scale_); |
| + tilings_.get(), max_contents_scale, rect, ideal_contents_scale_); |
| iter; |
| ++iter) { |
| gfx::Rect geometry_rect = iter.geometry_rect(); |
| @@ -366,8 +381,14 @@ void PictureLayerImpl::DidUnregisterLayer() { |
| void PictureLayerImpl::UpdateTilePriorities() { |
| TRACE_EVENT0("cc", "PictureLayerImpl::UpdateTilePriorities"); |
| - DCHECK(!needs_post_commit_initialization_); |
| - CHECK(should_update_tile_priorities_); |
| + DoPostCommitInitializationIfNeeded(); |
| + UpdateIdealScales(); |
| + // TODO(sohanjg): Avoid needlessly update priorities when syncing to a |
| + // non-updated tree which will then be updated immediately afterwards. |
| + should_update_tile_priorities_ = true; |
| + if (CanHaveTilings()) |
|
enne (OOO)
2014/05/27 21:41:21
style nit: add {} for multiline bodies
|
| + ManageTilings(draw_properties().screen_space_transform_is_animating, |
| + draw_properties().maximum_animation_contents_scale); |
| if (layer_needs_to_register_itself_) { |
| layer_tree_impl()->tile_manager()->RegisterPictureLayerImpl(this); |
| @@ -459,74 +480,6 @@ void PictureLayerImpl::ReleaseResources() { |
| layer_tree_impl()->set_needs_update_draw_properties(); |
| } |
| -void PictureLayerImpl::CalculateContentsScale( |
| - float ideal_contents_scale, |
| - float device_scale_factor, |
| - float page_scale_factor, |
| - float maximum_animation_contents_scale, |
| - bool animating_transform_to_screen, |
| - float* contents_scale_x, |
| - float* contents_scale_y, |
| - gfx::Size* content_bounds) { |
| - DoPostCommitInitializationIfNeeded(); |
| - |
| - // This function sets valid raster scales and manages tilings, so tile |
| - // priorities can now be updated. |
| - should_update_tile_priorities_ = true; |
| - |
| - if (!CanHaveTilings()) { |
| - ideal_page_scale_ = page_scale_factor; |
| - ideal_device_scale_ = device_scale_factor; |
| - ideal_contents_scale_ = ideal_contents_scale; |
| - ideal_source_scale_ = |
| - ideal_contents_scale_ / ideal_page_scale_ / ideal_device_scale_; |
| - *contents_scale_x = ideal_contents_scale_; |
| - *contents_scale_y = ideal_contents_scale_; |
| - *content_bounds = gfx::ToCeiledSize(gfx::ScaleSize(bounds(), |
| - ideal_contents_scale_, |
| - ideal_contents_scale_)); |
| - return; |
| - } |
| - |
| - float min_contents_scale = MinimumContentsScale(); |
| - DCHECK_GT(min_contents_scale, 0.f); |
| - float min_page_scale = layer_tree_impl()->min_page_scale_factor(); |
| - DCHECK_GT(min_page_scale, 0.f); |
| - float min_device_scale = 1.f; |
| - float min_source_scale = |
| - min_contents_scale / min_page_scale / min_device_scale; |
| - |
| - float ideal_page_scale = page_scale_factor; |
| - float ideal_device_scale = device_scale_factor; |
| - float ideal_source_scale = |
| - ideal_contents_scale / ideal_page_scale / ideal_device_scale; |
| - |
| - ideal_contents_scale_ = std::max(ideal_contents_scale, min_contents_scale); |
| - ideal_page_scale_ = ideal_page_scale; |
| - ideal_device_scale_ = ideal_device_scale; |
| - ideal_source_scale_ = std::max(ideal_source_scale, min_source_scale); |
| - |
| - ManageTilings(animating_transform_to_screen, |
| - maximum_animation_contents_scale); |
| - |
| - // The content scale and bounds for a PictureLayerImpl is somewhat fictitious. |
| - // There are (usually) several tilings at different scales. However, the |
| - // content bounds is the (integer!) space in which quads are generated. |
| - // In order to guarantee that we can fill this integer space with any set of |
| - // tilings (and then map back to floating point texture coordinates), the |
| - // contents scale must be at least as large as the largest of the tilings. |
| - float max_contents_scale = min_contents_scale; |
| - for (size_t i = 0; i < tilings_->num_tilings(); ++i) { |
| - const PictureLayerTiling* tiling = tilings_->tiling_at(i); |
| - max_contents_scale = std::max(max_contents_scale, tiling->contents_scale()); |
| - } |
| - |
| - *contents_scale_x = max_contents_scale; |
| - *contents_scale_y = max_contents_scale; |
| - *content_bounds = gfx::ToCeiledSize( |
| - gfx::ScaleSize(bounds(), max_contents_scale, max_contents_scale)); |
| -} |
| - |
| skia::RefPtr<SkPicture> PictureLayerImpl::GetPicture() { |
| return pile_->GetFlattenedPicture(); |
| } |
| @@ -738,7 +691,7 @@ void PictureLayerImpl::SetIsMask(bool is_mask) { |
| ResourceProvider::ResourceId PictureLayerImpl::ContentsResourceId() const { |
| gfx::Rect content_rect(content_bounds()); |
| - float scale = contents_scale_x(); |
| + float scale = MaximumTilingContentScale(); |
| PictureLayerTilingSet::CoverageIterator iter( |
| tilings_.get(), scale, content_rect, ideal_contents_scale_); |
| @@ -1302,6 +1255,58 @@ void PictureLayerImpl::SanityCheckTilingState() const { |
| #endif |
| } |
| +float PictureLayerImpl::MaximumTilingContentScale() const { |
| + float max_contents_scale = MinimumContentsScale(); |
| + for (size_t i = 0; i < tilings_->num_tilings(); ++i) { |
| + const PictureLayerTiling* tiling = tilings_->tiling_at(i); |
| + max_contents_scale = std::max(max_contents_scale, tiling->contents_scale()); |
| + } |
| + return max_contents_scale; |
| +} |
| + |
| +void PictureLayerImpl::PopulateSharedQuadStateWithOverrides( |
| + SharedQuadState* state, |
| + gfx::Transform target_space_transform, |
| + gfx::Size content_bounds, |
| + gfx::Rect visible_content_rect) const { |
| + state->SetAll(target_space_transform, |
| + content_bounds, |
| + visible_content_rect, |
| + draw_properties().clip_rect, |
| + draw_properties().is_clipped, |
| + draw_properties().opacity, |
| + blend_mode()); |
| +} |
| + |
| +void PictureLayerImpl::UpdateIdealScales() { |
| + if (!CanHaveTilings()) { |
| + ideal_page_scale_ = draw_properties().page_scale_factor; |
| + ideal_device_scale_ = draw_properties().device_scale_factor; |
| + ideal_contents_scale_ = draw_properties().ideal_contents_scale; |
| + ideal_source_scale_ = |
| + ideal_contents_scale_ / ideal_page_scale_ / ideal_device_scale_; |
| + return; |
| + } |
| + |
| + float min_contents_scale = MinimumContentsScale(); |
| + DCHECK_GT(min_contents_scale, 0.f); |
| + float min_page_scale = layer_tree_impl()->min_page_scale_factor(); |
| + DCHECK_GT(min_page_scale, 0.f); |
| + float min_device_scale = 1.f; |
| + float min_source_scale = |
| + min_contents_scale / min_page_scale / min_device_scale; |
| + |
| + float ideal_page_scale = draw_properties().page_scale_factor; |
| + float ideal_device_scale = draw_properties().device_scale_factor; |
| + float ideal_source_scale = draw_properties().ideal_contents_scale / |
| + ideal_page_scale / ideal_device_scale; |
| + ideal_contents_scale_ = |
| + std::max(draw_properties().ideal_contents_scale, min_contents_scale); |
| + ideal_page_scale_ = draw_properties().page_scale_factor; |
| + ideal_device_scale_ = draw_properties().device_scale_factor; |
| + ideal_source_scale_ = std::max(ideal_source_scale, min_source_scale); |
| +} |
| + |
| void PictureLayerImpl::GetDebugBorderProperties( |
| SkColor* color, |
| float* width) const { |
| @@ -1313,7 +1318,7 @@ void PictureLayerImpl::AsValueInto(base::DictionaryValue* state) const { |
| const_cast<PictureLayerImpl*>(this)->DoPostCommitInitializationIfNeeded(); |
| LayerImpl::AsValueInto(state); |
| state->SetDouble("ideal_contents_scale", ideal_contents_scale_); |
| - state->SetDouble("geometry_contents_scale", contents_scale_x()); |
| + state->SetDouble("geometry_contents_scale", MaximumTilingContentScale()); |
| state->Set("tilings", tilings_->AsValue().release()); |
| state->Set("pictures", pile_->AsValue().release()); |
| state->Set("invalidation", invalidation_.AsValue().release()); |