| Index: cc/trees/layer_tree_impl.cc
|
| diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
|
| index a278fbfc988e51fc8cf63086720e4b010d545642..3a4d36dd11a5cb48ffa499cc558bd7028dd490ca 100644
|
| --- a/cc/trees/layer_tree_impl.cc
|
| +++ b/cc/trees/layer_tree_impl.cc
|
| @@ -14,6 +14,7 @@
|
| #include "cc/animation/scrollbar_animation_controller_linear_fade.h"
|
| #include "cc/animation/scrollbar_animation_controller_thinning.h"
|
| #include "cc/base/math_util.h"
|
| +#include "cc/base/synced_property.h"
|
| #include "cc/base/util.h"
|
| #include "cc/debug/devtools_instrumentation.h"
|
| #include "cc/debug/traced_value.h"
|
| @@ -72,7 +73,9 @@ class LayerScrollOffsetDelegateProxy : public LayerImpl::ScrollOffsetDelegate {
|
| gfx::ScrollOffset last_set_scroll_offset_;
|
| };
|
|
|
| -LayerTreeImpl::LayerTreeImpl(LayerTreeHostImpl* layer_tree_host_impl)
|
| +LayerTreeImpl::LayerTreeImpl(
|
| + LayerTreeHostImpl* layer_tree_host_impl,
|
| + scoped_refptr<SyncedProperty<ScaleGroup>> page_scale_factor)
|
| : layer_tree_host_impl_(layer_tree_host_impl),
|
| source_frame_number_(-1),
|
| hud_layer_(0),
|
| @@ -83,9 +86,7 @@ LayerTreeImpl::LayerTreeImpl(LayerTreeHostImpl* layer_tree_host_impl)
|
| page_scale_layer_(NULL),
|
| inner_viewport_scroll_layer_(NULL),
|
| outer_viewport_scroll_layer_(NULL),
|
| - page_scale_factor_(1),
|
| - page_scale_delta_(1),
|
| - sent_page_scale_delta_(1),
|
| + page_scale_factor_(page_scale_factor),
|
| min_page_scale_factor_(0),
|
| max_page_scale_factor_(0),
|
| scrolling_layer_id_from_previous_tree_(0),
|
| @@ -96,7 +97,8 @@ LayerTreeImpl::LayerTreeImpl(LayerTreeHostImpl* layer_tree_host_impl)
|
| next_activation_forces_redraw_(false),
|
| has_ever_been_drawn_(false),
|
| render_surface_layer_list_id_(0),
|
| - top_controls_layout_height_(0),
|
| + top_controls_shrink_blink_size_(false),
|
| + top_controls_height_(0),
|
| top_controls_content_offset_(0),
|
| top_controls_delta_(0),
|
| sent_top_controls_delta_(0) {
|
| @@ -209,17 +211,25 @@ void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) {
|
|
|
| target_tree->PassSwapPromises(&swap_promise_list_);
|
|
|
| - target_tree->top_controls_layout_height_ = top_controls_layout_height_;
|
| + // Track the change in top controls height to offset the top_controls_delta
|
| + // properly. This is so that the top controls offset will be maintained
|
| + // across height changes.
|
| + float top_controls_height_delta =
|
| + target_tree->top_controls_height_ - top_controls_height_;
|
| +
|
| + target_tree->top_controls_shrink_blink_size_ =
|
| + top_controls_shrink_blink_size_;
|
| + target_tree->top_controls_height_ = top_controls_height_;
|
| target_tree->top_controls_content_offset_ = top_controls_content_offset_;
|
| - target_tree->top_controls_delta_ =
|
| - target_tree->top_controls_delta_ -
|
| - target_tree->sent_top_controls_delta_;
|
| + target_tree->top_controls_delta_ = target_tree->top_controls_delta_ -
|
| + target_tree->sent_top_controls_delta_ -
|
| + top_controls_height_delta;
|
| target_tree->sent_top_controls_delta_ = 0.f;
|
|
|
| - target_tree->SetPageScaleValues(
|
| - page_scale_factor(), min_page_scale_factor(), max_page_scale_factor(),
|
| - target_tree->page_scale_delta() / target_tree->sent_page_scale_delta());
|
| - target_tree->set_sent_page_scale_delta(1);
|
| + // Active tree already shares the page_scale_factor object with pending
|
| + // tree so only the limits need to be provided.
|
| + target_tree->PushPageScaleFactorAndLimits(nullptr, min_page_scale_factor(),
|
| + max_page_scale_factor());
|
|
|
| target_tree->pending_page_scale_animation_ =
|
| pending_page_scale_animation_.Pass();
|
| @@ -312,72 +322,91 @@ void ForceScrollbarParameterUpdateAfterScaleChange(LayerImpl* current_layer) {
|
|
|
| } // namespace
|
|
|
| -void LayerTreeImpl::SetPageScaleFactorAndLimits(float page_scale_factor,
|
| - float min_page_scale_factor, float max_page_scale_factor) {
|
| - SetPageScaleValues(page_scale_factor, min_page_scale_factor,
|
| - max_page_scale_factor, page_scale_delta_);
|
| +float LayerTreeImpl::ClampPageScaleFactorToLimits(
|
| + float page_scale_factor) const {
|
| + if (min_page_scale_factor_ && page_scale_factor < min_page_scale_factor_)
|
| + page_scale_factor = min_page_scale_factor_;
|
| + else if (max_page_scale_factor_ && page_scale_factor > max_page_scale_factor_)
|
| + page_scale_factor = max_page_scale_factor_;
|
| + return page_scale_factor;
|
| }
|
|
|
| -void LayerTreeImpl::SetPageScaleDelta(float delta) {
|
| - SetPageScaleValues(page_scale_factor_, min_page_scale_factor_,
|
| - max_page_scale_factor_, delta);
|
| +void LayerTreeImpl::SetPageScaleOnActiveTree(float active_page_scale) {
|
| + DCHECK(IsActiveTree());
|
| + if (page_scale_factor()->SetCurrent(
|
| + ClampPageScaleFactorToLimits(active_page_scale)))
|
| + DidUpdatePageScale();
|
| +}
|
| +
|
| +void LayerTreeImpl::PushPageScaleFromMainThread(float page_scale_factor,
|
| + float min_page_scale_factor,
|
| + float max_page_scale_factor) {
|
| + PushPageScaleFactorAndLimits(&page_scale_factor, min_page_scale_factor,
|
| + max_page_scale_factor);
|
| +}
|
| +
|
| +void LayerTreeImpl::PushPageScaleFactorAndLimits(const float* page_scale_factor,
|
| + float min_page_scale_factor,
|
| + float max_page_scale_factor) {
|
| + DCHECK(page_scale_factor || IsActiveTree());
|
| + bool changed_page_scale = false;
|
| + if (page_scale_factor) {
|
| + DCHECK(!IsActiveTree() || !layer_tree_host_impl_->pending_tree());
|
| + changed_page_scale |=
|
| + page_scale_factor_->PushFromMainThread(*page_scale_factor);
|
| + }
|
| + if (IsActiveTree())
|
| + changed_page_scale |= page_scale_factor_->PushPendingToActive();
|
| + changed_page_scale |=
|
| + SetPageScaleFactorLimits(min_page_scale_factor, max_page_scale_factor);
|
| +
|
| + if (changed_page_scale)
|
| + DidUpdatePageScale();
|
| }
|
|
|
| -void LayerTreeImpl::SetPageScaleValues(float page_scale_factor,
|
| - float min_page_scale_factor, float max_page_scale_factor,
|
| - float page_scale_delta) {
|
| - bool page_scale_changed =
|
| - min_page_scale_factor != min_page_scale_factor_ ||
|
| - max_page_scale_factor != max_page_scale_factor_ ||
|
| - page_scale_factor != page_scale_factor_;
|
| +bool LayerTreeImpl::SetPageScaleFactorLimits(float min_page_scale_factor,
|
| + float max_page_scale_factor) {
|
| + if (min_page_scale_factor == min_page_scale_factor_ &&
|
| + max_page_scale_factor == max_page_scale_factor_)
|
| + return false;
|
|
|
| min_page_scale_factor_ = min_page_scale_factor;
|
| max_page_scale_factor_ = max_page_scale_factor;
|
| - page_scale_factor_ = page_scale_factor;
|
|
|
| - float total = page_scale_factor_ * page_scale_delta;
|
| - if (min_page_scale_factor_ && total < min_page_scale_factor_)
|
| - page_scale_delta = min_page_scale_factor_ / page_scale_factor_;
|
| - else if (max_page_scale_factor_ && total > max_page_scale_factor_)
|
| - page_scale_delta = max_page_scale_factor_ / page_scale_factor_;
|
| -
|
| - if (page_scale_delta_ == page_scale_delta && !page_scale_changed)
|
| - return;
|
| -
|
| - if (page_scale_delta_ != page_scale_delta) {
|
| - page_scale_delta_ = page_scale_delta;
|
| + return true;
|
| +}
|
|
|
| - if (IsActiveTree()) {
|
| - LayerTreeImpl* pending_tree = layer_tree_host_impl_->pending_tree();
|
| - if (pending_tree) {
|
| - DCHECK_EQ(1, pending_tree->sent_page_scale_delta());
|
| - pending_tree->SetPageScaleDelta(
|
| - page_scale_delta_ / sent_page_scale_delta_);
|
| - }
|
| - }
|
| +void LayerTreeImpl::DidUpdatePageScale() {
|
| + if (IsActiveTree())
|
| + page_scale_factor()->SetCurrent(
|
| + ClampPageScaleFactorToLimits(current_page_scale_factor()));
|
|
|
| - set_needs_update_draw_properties();
|
| - }
|
| + set_needs_update_draw_properties();
|
|
|
| if (root_layer_scroll_offset_delegate_) {
|
| root_layer_scroll_offset_delegate_->UpdateRootLayerState(
|
| - TotalScrollOffset(),
|
| - TotalMaxScrollOffset(),
|
| - ScrollableSize(),
|
| - total_page_scale_factor(),
|
| - min_page_scale_factor_,
|
| + TotalScrollOffset(), TotalMaxScrollOffset(), ScrollableSize(),
|
| + current_page_scale_factor(), min_page_scale_factor_,
|
| max_page_scale_factor_);
|
| }
|
|
|
| ForceScrollbarParameterUpdateAfterScaleChange(page_scale_layer());
|
| }
|
|
|
| +SyncedProperty<ScaleGroup>* LayerTreeImpl::page_scale_factor() {
|
| + return page_scale_factor_.get();
|
| +}
|
| +
|
| +const SyncedProperty<ScaleGroup>* LayerTreeImpl::page_scale_factor() const {
|
| + return page_scale_factor_.get();
|
| +}
|
| +
|
| gfx::SizeF LayerTreeImpl::ScrollableViewportSize() const {
|
| if (!InnerViewportContainerLayer())
|
| return gfx::SizeF();
|
|
|
| return gfx::ScaleSize(InnerViewportContainerLayer()->BoundsForScrolling(),
|
| - 1.0f / total_page_scale_factor());
|
| + 1.0f / current_page_scale_factor());
|
| }
|
|
|
| gfx::Rect LayerTreeImpl::RootScrollLayerDeviceViewportBounds() const {
|
| @@ -398,9 +427,7 @@ static void ApplySentScrollDeltasFromAbortedCommitTo(LayerImpl* layer) {
|
| void LayerTreeImpl::ApplySentScrollAndScaleDeltasFromAbortedCommit() {
|
| DCHECK(IsActiveTree());
|
|
|
| - page_scale_factor_ *= sent_page_scale_delta_;
|
| - page_scale_delta_ /= sent_page_scale_delta_;
|
| - sent_page_scale_delta_ = 1.f;
|
| + page_scale_factor()->AbortCommit();
|
|
|
| top_controls_content_offset_ += sent_top_controls_delta_;
|
| top_controls_delta_ -= sent_top_controls_delta_;
|
| @@ -496,7 +523,7 @@ bool LayerTreeImpl::UpdateDrawProperties() {
|
| LayerTreeHostCommon::CalcDrawPropsImplInputs inputs(
|
| root_layer(), DrawViewportSize(),
|
| layer_tree_host_impl_->DrawTransform(), device_scale_factor(),
|
| - total_page_scale_factor(), page_scale_layer,
|
| + current_page_scale_factor(), page_scale_layer,
|
| resource_provider()->max_texture_size(), settings().can_use_lcd_text,
|
| settings().layers_always_allowed_lcd_text,
|
| can_render_to_separate_surface,
|
| @@ -910,11 +937,8 @@ void LayerTreeImpl::SetRootLayerScrollOffsetDelegate(
|
|
|
| if (root_layer_scroll_offset_delegate_) {
|
| root_layer_scroll_offset_delegate_->UpdateRootLayerState(
|
| - TotalScrollOffset(),
|
| - TotalMaxScrollOffset(),
|
| - ScrollableSize(),
|
| - total_page_scale_factor(),
|
| - min_page_scale_factor(),
|
| + TotalScrollOffset(), TotalMaxScrollOffset(), ScrollableSize(),
|
| + current_page_scale_factor(), min_page_scale_factor(),
|
| max_page_scale_factor());
|
|
|
| if (inner_viewport_scroll_layer_) {
|
| @@ -962,11 +986,8 @@ void LayerTreeImpl::UpdateScrollOffsetDelegate() {
|
| offset += outer_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
|
|
|
| root_layer_scroll_offset_delegate_->UpdateRootLayerState(
|
| - offset,
|
| - TotalMaxScrollOffset(),
|
| - ScrollableSize(),
|
| - total_page_scale_factor(),
|
| - min_page_scale_factor(),
|
| + offset, TotalMaxScrollOffset(), ScrollableSize(),
|
| + current_page_scale_factor(), min_page_scale_factor(),
|
| max_page_scale_factor());
|
| }
|
|
|
|
|