| Index: cc/layers/picture_layer_impl.cc
|
| diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
|
| index 76ab5bb69b647eb42294b39c63a7192ceb9b9ed2..acf012a890963c5d829df2ea8c713c4183d1ddea 100644
|
| --- a/cc/layers/picture_layer_impl.cc
|
| +++ b/cc/layers/picture_layer_impl.cc
|
| @@ -139,10 +139,28 @@ 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);
|
| + shared_quad_state->SetAll(scaled_draw_transform,
|
| + scaled_content_bounds,
|
| + scaled_visible_content_rect,
|
| + draw_properties().clip_rect,
|
| + draw_properties().is_clipped,
|
| + draw_properties().opacity,
|
| + blend_mode());
|
| +
|
| + gfx::Rect rect = scaled_visible_content_rect;
|
|
|
| if (current_draw_mode_ == DRAW_MODE_RESOURCELESS_SOFTWARE) {
|
| AppendDebugBorderQuad(
|
| @@ -162,7 +180,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 +202,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 +222,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 {
|
| @@ -236,7 +254,7 @@ void PictureLayerImpl::AppendQuads(QuadSink* quad_sink,
|
| size_t missing_tile_count = 0u;
|
| size_t on_demand_missing_tile_count = 0u;
|
| 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();
|
| @@ -379,8 +397,15 @@ 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()) {
|
| + 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);
|
| @@ -472,74 +497,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();
|
| }
|
| @@ -751,7 +708,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_);
|
|
|
| @@ -1315,6 +1272,44 @@ 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::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 {
|
| @@ -1326,7 +1321,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());
|
|
|