Index: cc/trees/layer_tree_host.cc |
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc |
index 5e19eb3eb3c8acb70f68dba1d64863f6bb806297..bb81ee8a4497a084e8c2f91df0286007db1512a9 100644 |
--- a/cc/trees/layer_tree_host.cc |
+++ b/cc/trees/layer_tree_host.cc |
@@ -20,6 +20,7 @@ |
#include "cc/base/thread.h" |
#include "cc/debug/overdraw_metrics.h" |
#include "cc/debug/rendering_stats_instrumentation.h" |
+#include "cc/input/inner_viewport_scrollbar.h" |
#include "cc/input/top_controls_manager.h" |
#include "cc/layers/heads_up_display_layer.h" |
#include "cc/layers/heads_up_display_layer_impl.h" |
@@ -314,6 +315,14 @@ void LayerTreeHost::FinishCommitOnImplThread(LayerTreeHostImpl* host_impl) { |
sync_tree->FindRootScrollLayer(); |
+ if (settings_.use_pinch_virtual_viewport && page_scale_layer_) { |
+ DCHECK(inner_viewport_scroll_layer_); |
+ DCHECK(outer_viewport_scroll_layer_); |
+ sync_tree->SetPinchViewportLayerIds(page_scale_layer_->id(), |
+ inner_viewport_scroll_layer_->id(), |
+ outer_viewport_scroll_layer_->id()); |
+ } |
+ |
float page_scale_delta, sent_page_scale_delta; |
if (settings_.impl_side_painting) { |
// Update the delta from the active tree, which may have |
@@ -544,6 +553,58 @@ void LayerTreeHost::SetRootLayer(scoped_refptr<Layer> root_layer) { |
SetNeedsFullTreeSync(); |
} |
+static void SetupInnerViewportScrollbar(Layer* parent, |
+ scoped_refptr<Layer>& scrollbar, |
+ scoped_refptr<Layer> scroll_layer, |
+ scoped_refptr<Layer> clip_layer, |
+ ScrollbarOrientation orientation) { |
+ int scrollbar_thickness = |
+ orientation == HORIZONTAL ? parent->bounds().height() |
+ : parent->bounds().width(); |
+ scrollbar = ScrollbarLayer::Create( |
+ make_scoped_ptr(new InnerViewportScrollbar( |
+ scroll_layer, clip_layer, orientation, scrollbar_thickness)) |
+ .PassAs<Scrollbar>(), |
+ scroll_layer->id()); |
+ parent->RemoveAllChildren(); |
+ parent->AddChild(scrollbar); |
+ scrollbar->SetBounds(parent->bounds()); |
+ scrollbar->SetIsDrawable(true); |
+} |
+ |
+void LayerTreeHost::RegisterPinchViewportLayers( |
+ scoped_refptr<Layer> inner_viewport_clip_layer, |
+ scoped_refptr<Layer> page_scale_layer, |
+ scoped_refptr<Layer> inner_viewport_scroll_layer, |
+ scoped_refptr<Layer> outer_viewport_scroll_layer, |
+ scoped_refptr<Layer> inner_viewport_horizontal_scrollbar_layer, |
+ scoped_refptr<Layer> inner_viewport_vertical_scrollbar_layer) { |
+ inner_viewport_clip_layer_ = inner_viewport_clip_layer; |
+ page_scale_layer_ = page_scale_layer; |
+ inner_viewport_scroll_layer_ = inner_viewport_scroll_layer; |
+ outer_viewport_scroll_layer_ = outer_viewport_scroll_layer; |
+ |
+ if (inner_viewport_horizontal_scrollbar_layer) { |
+ SetupInnerViewportScrollbar(inner_viewport_horizontal_scrollbar_layer, |
+ inner_viewport_horizontal_scrollbar_layer_, |
+ inner_viewport_scroll_layer, |
+ inner_viewport_clip_layer, |
+ HORIZONTAL); |
+ } else { |
+ inner_viewport_horizontal_scrollbar_layer_ = nullptr; |
+ } |
+ |
+ if (inner_viewport_vertical_scrollbar_layer) { |
+ SetupInnerViewportScrollbar(inner_viewport_vertical_scrollbar_layer, |
+ inner_viewport_vertical_scrollbar_layer_, |
+ inner_viewport_scroll_layer, |
+ inner_viewport_clip_layer, |
+ VERTICAL); |
+ } else { |
+ inner_viewport_vertical_scrollbar_layer_ = nullptr; |
+ } |
+} |
+ |
void LayerTreeHost::SetDebugState(const LayerTreeDebugState& debug_state) { |
LayerTreeDebugState new_debug_state = |
LayerTreeDebugState::Unite(settings_.initial_debug_state, debug_state); |
@@ -717,6 +778,8 @@ void LayerTreeHost::UpdateLayers(Layer* root_layer, |
UpdateHudLayer(); |
Layer* root_scroll = FindFirstScrollableLayer(root_layer); |
+ Layer* page_scale_layer = |
+ page_scale_layer_ ? page_scale_layer_.get() : root_scroll; |
TRACE_EVENT0("cc", "LayerTreeHost::UpdateLayers::CalcDrawProps"); |
LayerTreeHostCommon::CalculateDrawProperties( |
@@ -725,7 +788,7 @@ void LayerTreeHost::UpdateLayers(Layer* root_layer, |
gfx::Transform(), |
device_scale_factor_, |
page_scale_factor_, |
- root_scroll, |
+ page_scale_layer, |
GetRendererCapabilities().max_texture_size, |
settings_.can_use_lcd_text, |
settings_.layer_transforms_should_scale_layer_contents, |