Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(297)

Side by Side Diff: cc/trees/layer_tree_impl.cc

Issue 23983047: Pinch/Zoom Infrastructure & Plumbing CL (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address review comments. Created 6 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/trees/layer_tree_impl.h" 5 #include "cc/trees/layer_tree_impl.h"
6 6
7 #include "base/debug/trace_event.h" 7 #include "base/debug/trace_event.h"
8 #include "cc/animation/keyframed_animation_curve.h" 8 #include "cc/animation/keyframed_animation_curve.h"
9 #include "cc/animation/scrollbar_animation_controller.h" 9 #include "cc/animation/scrollbar_animation_controller.h"
10 #include "cc/base/math_util.h" 10 #include "cc/base/math_util.h"
11 #include "cc/base/util.h" 11 #include "cc/base/util.h"
12 #include "cc/debug/traced_value.h" 12 #include "cc/debug/traced_value.h"
13 #include "cc/layers/heads_up_display_layer_impl.h" 13 #include "cc/layers/heads_up_display_layer_impl.h"
14 #include "cc/layers/layer.h" 14 #include "cc/layers/layer.h"
15 #include "cc/layers/render_surface_impl.h" 15 #include "cc/layers/render_surface_impl.h"
16 #include "cc/layers/scrollbar_layer_impl_base.h" 16 #include "cc/layers/scrollbar_layer_impl_base.h"
17 #include "cc/resources/ui_resource_request.h" 17 #include "cc/resources/ui_resource_request.h"
18 #include "cc/trees/layer_tree_host_common.h" 18 #include "cc/trees/layer_tree_host_common.h"
19 #include "cc/trees/layer_tree_host_impl.h" 19 #include "cc/trees/layer_tree_host_impl.h"
20 #include "ui/gfx/size_conversions.h" 20 #include "ui/gfx/size_conversions.h"
21 #include "ui/gfx/vector2d_conversions.h" 21 #include "ui/gfx/vector2d_conversions.h"
22 22
23 namespace cc { 23 namespace cc {
24 24
25 class LayerScrollOffsetDelegateProxy : public LayerScrollOffsetDelegate {
26 public:
27 LayerScrollOffsetDelegateProxy(LayerImpl* layer,
28 LayerScrollOffsetDelegate* delegate,
29 LayerTreeImpl* layer_tree)
30 : layer_(layer),
31 delegate_(delegate),
32 layer_tree_impl_(layer_tree) {}
33
34 gfx::Vector2dF last_set_scroll_offset() const {
35 return last_set_scroll_offset_;
36 }
37
38 // LayerScrollOffsetDelegate implementation.
39
40 virtual void SetMaxScrollOffset(gfx::Vector2dF) OVERRIDE {
41 NOTIMPLEMENTED();
42 }
43
44 virtual void SetTotalScrollOffset(gfx::Vector2dF new_offset) OVERRIDE {
45 last_set_scroll_offset_ = new_offset;
46 layer_tree_impl_->UpdateScrollOffsetDelegate();
47 }
48
49 virtual gfx::Vector2dF GetTotalScrollOffset() OVERRIDE {
50 return layer_tree_impl_->GetDelegatedScrollOffset(layer_);
51 }
52
53 virtual bool IsExternalFlingActive() const OVERRIDE {
54 return delegate_->IsExternalFlingActive();
55 }
56
57 virtual void SetTotalPageScaleFactor(float scale) OVERRIDE {
58 NOTIMPLEMENTED();
59 }
60
61 virtual void SetScrollableSize(gfx::SizeF size) OVERRIDE {
62 NOTIMPLEMENTED();
63 }
64
65 private:
66 LayerImpl* layer_;
67 LayerScrollOffsetDelegate* delegate_;
68 LayerTreeImpl* layer_tree_impl_;
69 gfx::Vector2dF last_set_scroll_offset_;
70 };
71
25 LayerTreeImpl::LayerTreeImpl(LayerTreeHostImpl* layer_tree_host_impl) 72 LayerTreeImpl::LayerTreeImpl(LayerTreeHostImpl* layer_tree_host_impl)
26 : layer_tree_host_impl_(layer_tree_host_impl), 73 : layer_tree_host_impl_(layer_tree_host_impl),
27 source_frame_number_(-1), 74 source_frame_number_(-1),
28 hud_layer_(0), 75 hud_layer_(0),
29 root_scroll_layer_(NULL),
30 currently_scrolling_layer_(NULL), 76 currently_scrolling_layer_(NULL),
31 root_layer_scroll_offset_delegate_(NULL), 77 root_layer_scroll_offset_delegate_(NULL),
32 background_color_(0), 78 background_color_(0),
33 has_transparent_background_(false), 79 has_transparent_background_(false),
34 page_scale_layer_(NULL), 80 page_scale_layer_(NULL),
35 inner_viewport_scroll_layer_(NULL), 81 inner_viewport_scroll_layer_(NULL),
36 outer_viewport_scroll_layer_(NULL), 82 outer_viewport_scroll_layer_(NULL),
37 page_scale_factor_(1), 83 page_scale_factor_(1),
38 page_scale_delta_(1), 84 page_scale_delta_(1),
39 sent_page_scale_delta_(1), 85 sent_page_scale_delta_(1),
40 min_page_scale_factor_(0), 86 min_page_scale_factor_(0),
41 max_page_scale_factor_(0), 87 max_page_scale_factor_(0),
42 scrolling_layer_id_from_previous_tree_(0), 88 scrolling_layer_id_from_previous_tree_(0),
43 contents_textures_purged_(false), 89 contents_textures_purged_(false),
44 viewport_size_invalid_(false), 90 viewport_size_invalid_(false),
45 needs_update_draw_properties_(true), 91 needs_update_draw_properties_(true),
46 needs_full_tree_sync_(true), 92 needs_full_tree_sync_(true),
47 next_activation_forces_redraw_(false) { 93 next_activation_forces_redraw_(false) {
48 } 94 }
49 95
50 LayerTreeImpl::~LayerTreeImpl() { 96 LayerTreeImpl::~LayerTreeImpl() {
51 // Need to explicitly clear the tree prior to destroying this so that 97 // Need to explicitly clear the tree prior to destroying this so that
52 // the LayerTreeImpl pointer is still valid in the LayerImpl dtor. 98 // the LayerTreeImpl pointer is still valid in the LayerImpl dtor.
53 root_layer_.reset(); 99 root_layer_.reset();
54 } 100 }
55 101
56 static LayerImpl* FindRootScrollLayerRecursive(LayerImpl* layer) { 102 void LayerTreeImpl::SetRootLayer(scoped_ptr<LayerImpl> layer) {
57 if (!layer) 103 if (inner_viewport_scroll_layer_)
58 return NULL; 104 inner_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
105 if (outer_viewport_scroll_layer_)
106 outer_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
107 inner_viewport_scroll_delegate_proxy_.reset();
108 outer_viewport_scroll_delegate_proxy_.reset();
59 109
60 if (layer->scrollable())
61 return layer;
62
63 for (size_t i = 0; i < layer->children().size(); ++i) {
64 LayerImpl* found = FindRootScrollLayerRecursive(layer->children()[i]);
65 if (found)
66 return found;
67 }
68
69 return NULL;
70 }
71
72 void LayerTreeImpl::SetRootLayer(scoped_ptr<LayerImpl> layer) {
73 if (root_scroll_layer_)
74 root_scroll_layer_->SetScrollOffsetDelegate(NULL);
75 root_layer_ = layer.Pass(); 110 root_layer_ = layer.Pass();
76 currently_scrolling_layer_ = NULL; 111 currently_scrolling_layer_ = NULL;
77 root_scroll_layer_ = NULL; 112 inner_viewport_scroll_layer_ = NULL;
113 outer_viewport_scroll_layer_ = NULL;
114 page_scale_layer_ = NULL;
78 115
79 layer_tree_host_impl_->OnCanDrawStateChangedForTree(); 116 layer_tree_host_impl_->OnCanDrawStateChangedForTree();
80 } 117 }
81 118
82 void LayerTreeImpl::FindRootScrollLayer() { 119 LayerImpl* LayerTreeImpl::InnerViewportScrollLayer() const {
83 root_scroll_layer_ = FindRootScrollLayerRecursive(root_layer_.get()); 120 return inner_viewport_scroll_layer_;
121 }
84 122
85 if (root_scroll_layer_) { 123 LayerImpl* LayerTreeImpl::OuterViewportScrollLayer() const {
86 UpdateMaxScrollOffset(); 124 return outer_viewport_scroll_layer_;
87 root_scroll_layer_->SetScrollOffsetDelegate( 125 }
88 root_layer_scroll_offset_delegate_);
89 }
90 126
91 if (scrolling_layer_id_from_previous_tree_) { 127 gfx::Vector2dF LayerTreeImpl::TotalScrollOffset() const {
92 currently_scrolling_layer_ = LayerTreeHostCommon::FindLayerInSubtree( 128 gfx::Vector2dF offset;
93 root_layer_.get(),
94 scrolling_layer_id_from_previous_tree_);
95 }
96 129
97 scrolling_layer_id_from_previous_tree_ = 0; 130 if (inner_viewport_scroll_layer_)
131 offset += inner_viewport_scroll_layer_->TotalScrollOffset();
132
133 if (outer_viewport_scroll_layer_)
134 offset += outer_viewport_scroll_layer_->TotalScrollOffset();
135
136 return offset;
137 }
138
139 gfx::Vector2dF LayerTreeImpl::TotalMaxScrollOffset() const {
140 gfx::Vector2dF offset;
141
142 if (inner_viewport_scroll_layer_)
143 offset += inner_viewport_scroll_layer_->MaxScrollOffset();
144
145 if (outer_viewport_scroll_layer_)
146 offset += outer_viewport_scroll_layer_->MaxScrollOffset();
147
148 return offset;
149 }
150 gfx::Vector2dF LayerTreeImpl::TotalScrollDelta() const {
151 DCHECK(inner_viewport_scroll_layer_);
152 gfx::Vector2dF delta = inner_viewport_scroll_layer_->ScrollDelta();
153
154 if (outer_viewport_scroll_layer_)
155 delta += outer_viewport_scroll_layer_->ScrollDelta();
156
157 return delta;
98 } 158 }
99 159
100 scoped_ptr<LayerImpl> LayerTreeImpl::DetachLayerTree() { 160 scoped_ptr<LayerImpl> LayerTreeImpl::DetachLayerTree() {
101 // Clear all data structures that have direct references to the layer tree. 161 // Clear all data structures that have direct references to the layer tree.
102 scrolling_layer_id_from_previous_tree_ = 162 scrolling_layer_id_from_previous_tree_ =
103 currently_scrolling_layer_ ? currently_scrolling_layer_->id() : 0; 163 currently_scrolling_layer_ ? currently_scrolling_layer_->id() : 0;
104 if (root_scroll_layer_) 164 if (inner_viewport_scroll_layer_)
105 root_scroll_layer_->SetScrollOffsetDelegate(NULL); 165 inner_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
106 root_scroll_layer_ = NULL; 166 if (outer_viewport_scroll_layer_)
167 outer_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
168 inner_viewport_scroll_delegate_proxy_.reset();
169 outer_viewport_scroll_delegate_proxy_.reset();
170 inner_viewport_scroll_layer_ = NULL;
171 outer_viewport_scroll_layer_ = NULL;
172 page_scale_layer_ = NULL;
107 currently_scrolling_layer_ = NULL; 173 currently_scrolling_layer_ = NULL;
108 174
109 render_surface_layer_list_.clear(); 175 render_surface_layer_list_.clear();
110 set_needs_update_draw_properties(); 176 set_needs_update_draw_properties();
111 return root_layer_.Pass(); 177 return root_layer_.Pass();
112 } 178 }
113 179
114 void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) { 180 void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) {
115 // The request queue should have been processed and does not require a push. 181 // The request queue should have been processed and does not require a push.
116 DCHECK_EQ(ui_resource_request_queue_.size(), 0u); 182 DCHECK_EQ(ui_resource_request_queue_.size(), 0u);
117 183
118 if (next_activation_forces_redraw_) { 184 if (next_activation_forces_redraw_) {
119 layer_tree_host_impl_->SetFullRootLayerDamage(); 185 layer_tree_host_impl_->SetFullRootLayerDamage();
120 next_activation_forces_redraw_ = false; 186 next_activation_forces_redraw_ = false;
121 } 187 }
122 188
123 target_tree->PassSwapPromises(&swap_promise_list_); 189 target_tree->PassSwapPromises(&swap_promise_list_);
124 190
125 target_tree->SetPageScaleFactorAndLimits( 191 target_tree->SetPageScaleFactorAndLimits(
126 page_scale_factor(), min_page_scale_factor(), max_page_scale_factor()); 192 page_scale_factor(), min_page_scale_factor(), max_page_scale_factor());
127 target_tree->SetPageScaleDelta( 193 target_tree->SetPageScaleDelta(
128 target_tree->page_scale_delta() / target_tree->sent_page_scale_delta()); 194 target_tree->page_scale_delta() / target_tree->sent_page_scale_delta());
129 target_tree->set_sent_page_scale_delta(1); 195 target_tree->set_sent_page_scale_delta(1);
130 196
131 if (settings().use_pinch_virtual_viewport) { 197 if (page_scale_layer_ && inner_viewport_scroll_layer_) {
132 target_tree->SetViewportLayersFromIds( 198 target_tree->SetViewportLayersFromIds(
133 page_scale_layer_->id(), 199 page_scale_layer_->id(),
134 inner_viewport_scroll_layer_->id(), 200 inner_viewport_scroll_layer_->id(),
135 outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id() 201 outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id()
136 : Layer::INVALID_ID); 202 : Layer::INVALID_ID);
203 } else {
204 target_tree->ClearViewportLayers();
137 } 205 }
138 // This should match the property synchronization in 206 // This should match the property synchronization in
139 // LayerTreeHost::finishCommitOnImplThread(). 207 // LayerTreeHost::finishCommitOnImplThread().
140 target_tree->set_source_frame_number(source_frame_number()); 208 target_tree->set_source_frame_number(source_frame_number());
141 target_tree->set_background_color(background_color()); 209 target_tree->set_background_color(background_color());
142 target_tree->set_has_transparent_background(has_transparent_background()); 210 target_tree->set_has_transparent_background(has_transparent_background());
143 211
144 if (ContentsTexturesPurged()) 212 if (ContentsTexturesPurged())
145 target_tree->SetContentsTexturesPurged(); 213 target_tree->SetContentsTexturesPurged();
146 else 214 else
147 target_tree->ResetContentsTexturesPurged(); 215 target_tree->ResetContentsTexturesPurged();
148 216
149 if (ViewportSizeInvalid()) 217 if (ViewportSizeInvalid())
150 target_tree->SetViewportSizeInvalid(); 218 target_tree->SetViewportSizeInvalid();
151 else 219 else
152 target_tree->ResetViewportSizeInvalid(); 220 target_tree->ResetViewportSizeInvalid();
153 221
154 if (hud_layer()) 222 if (hud_layer())
155 target_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>( 223 target_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(
156 LayerTreeHostCommon::FindLayerInSubtree( 224 LayerTreeHostCommon::FindLayerInSubtree(
157 target_tree->root_layer(), hud_layer()->id()))); 225 target_tree->root_layer(), hud_layer()->id())));
158 else 226 else
159 target_tree->set_hud_layer(NULL); 227 target_tree->set_hud_layer(NULL);
160 } 228 }
161 229
162 LayerImpl* LayerTreeImpl::RootScrollLayer() const {
163 return root_scroll_layer_;
164 }
165
166 LayerImpl* LayerTreeImpl::RootContainerLayer() const { 230 LayerImpl* LayerTreeImpl::RootContainerLayer() const {
167 return root_scroll_layer_ ? root_scroll_layer_->parent() : NULL; 231 return inner_viewport_scroll_layer_ ? inner_viewport_scroll_layer_->parent()
232 : NULL;
168 } 233 }
169 234
170 LayerImpl* LayerTreeImpl::CurrentlyScrollingLayer() const { 235 LayerImpl* LayerTreeImpl::CurrentlyScrollingLayer() const {
171 DCHECK(IsActiveTree()); 236 DCHECK(IsActiveTree());
172 return currently_scrolling_layer_; 237 return currently_scrolling_layer_;
173 } 238 }
174 239
175 void LayerTreeImpl::SetCurrentlyScrollingLayer(LayerImpl* layer) { 240 void LayerTreeImpl::SetCurrentlyScrollingLayer(LayerImpl* layer) {
176 if (currently_scrolling_layer_ == layer) 241 if (currently_scrolling_layer_ == layer)
177 return; 242 return;
178 243
179 if (currently_scrolling_layer_ && 244 if (currently_scrolling_layer_ &&
180 currently_scrolling_layer_->scrollbar_animation_controller()) 245 currently_scrolling_layer_->scrollbar_animation_controller())
181 currently_scrolling_layer_->scrollbar_animation_controller()-> 246 currently_scrolling_layer_->scrollbar_animation_controller()->
182 DidScrollGestureEnd(CurrentPhysicalTimeTicks()); 247 DidScrollGestureEnd(CurrentPhysicalTimeTicks());
183 currently_scrolling_layer_ = layer; 248 currently_scrolling_layer_ = layer;
184 if (layer && layer->scrollbar_animation_controller()) 249 if (layer && layer->scrollbar_animation_controller())
185 layer->scrollbar_animation_controller()->DidScrollGestureBegin(); 250 layer->scrollbar_animation_controller()->DidScrollGestureBegin();
186 } 251 }
187 252
188 void LayerTreeImpl::ClearCurrentlyScrollingLayer() { 253 void LayerTreeImpl::ClearCurrentlyScrollingLayer() {
189 SetCurrentlyScrollingLayer(NULL); 254 SetCurrentlyScrollingLayer(NULL);
190 scrolling_layer_id_from_previous_tree_ = 0; 255 scrolling_layer_id_from_previous_tree_ = 0;
191 } 256 }
192 257
258 float LayerTreeImpl::VerticalAdjust(const LayerImpl* layer) const {
259 DCHECK(layer);
260 if (layer->parent() != RootContainerLayer())
261 return 0.f;
262
263 return layer_tree_host_impl_->UnscaledScrollableViewportSize().height() -
264 RootContainerLayer()->bounds().height();
265 }
266
193 void LayerTreeImpl::SetPageScaleFactorAndLimits(float page_scale_factor, 267 void LayerTreeImpl::SetPageScaleFactorAndLimits(float page_scale_factor,
194 float min_page_scale_factor, float max_page_scale_factor) { 268 float min_page_scale_factor, float max_page_scale_factor) {
195 if (!page_scale_factor) 269 if (!page_scale_factor)
196 return; 270 return;
197 271
198 min_page_scale_factor_ = min_page_scale_factor; 272 min_page_scale_factor_ = min_page_scale_factor;
199 max_page_scale_factor_ = max_page_scale_factor; 273 max_page_scale_factor_ = max_page_scale_factor;
200 page_scale_factor_ = page_scale_factor; 274 page_scale_factor_ = page_scale_factor;
201 275
202 if (root_layer_scroll_offset_delegate_) { 276 if (root_layer_scroll_offset_delegate_) {
(...skipping 17 matching lines...) Expand all
220 294
221 if (IsActiveTree()) { 295 if (IsActiveTree()) {
222 LayerTreeImpl* pending_tree = layer_tree_host_impl_->pending_tree(); 296 LayerTreeImpl* pending_tree = layer_tree_host_impl_->pending_tree();
223 if (pending_tree) { 297 if (pending_tree) {
224 DCHECK_EQ(1, pending_tree->sent_page_scale_delta()); 298 DCHECK_EQ(1, pending_tree->sent_page_scale_delta());
225 pending_tree->SetPageScaleDelta( 299 pending_tree->SetPageScaleDelta(
226 page_scale_delta_ / sent_page_scale_delta_); 300 page_scale_delta_ / sent_page_scale_delta_);
227 } 301 }
228 } 302 }
229 303
230 UpdateMaxScrollOffset();
231 set_needs_update_draw_properties(); 304 set_needs_update_draw_properties();
232 305
233 if (root_layer_scroll_offset_delegate_) { 306 if (root_layer_scroll_offset_delegate_) {
234 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactor( 307 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactor(
235 total_page_scale_factor()); 308 total_page_scale_factor());
236 } 309 }
237 } 310 }
238 311
239 gfx::SizeF LayerTreeImpl::ScrollableViewportSize() const { 312 gfx::SizeF LayerTreeImpl::ScrollableViewportSize() const {
240 return gfx::ScaleSize(layer_tree_host_impl_->UnscaledScrollableViewportSize(), 313 if (outer_viewport_scroll_layer_)
241 1.0f / total_page_scale_factor()); 314 return layer_tree_host_impl_->UnscaledScrollableViewportSize();
315 else
316 return gfx::ScaleSize(
317 layer_tree_host_impl_->UnscaledScrollableViewportSize(),
318 1.0f / total_page_scale_factor());
242 } 319 }
243 320
244 gfx::Rect LayerTreeImpl::RootScrollLayerDeviceViewportBounds() const { 321 gfx::Rect LayerTreeImpl::RootScrollLayerDeviceViewportBounds() const {
245 if (!root_scroll_layer_ || root_scroll_layer_->children().empty()) 322 LayerImpl* root_scroll_layer =
323 OuterViewportScrollLayer() ? OuterViewportScrollLayer()
324 : InnerViewportScrollLayer();
325 if (!root_scroll_layer || root_scroll_layer->children().empty())
246 return gfx::Rect(); 326 return gfx::Rect();
247 LayerImpl* layer = root_scroll_layer_->children()[0]; 327 LayerImpl* layer = root_scroll_layer->children()[0];
248 return MathUtil::MapClippedRect( 328 return MathUtil::MapClippedRect(
249 layer->screen_space_transform(), 329 layer->screen_space_transform(),
250 gfx::Rect(layer->content_bounds())); 330 gfx::Rect(layer->content_bounds()));
251 } 331 }
252 332
253 void LayerTreeImpl::UpdateMaxScrollOffset() {
254 LayerImpl* root_scroll = RootScrollLayer();
255 if (!root_scroll || !root_scroll->children().size())
256 return;
257
258 gfx::Vector2dF max_scroll = gfx::Rect(ScrollableSize()).bottom_right() -
259 gfx::RectF(ScrollableViewportSize()).bottom_right();
260
261 // The viewport may be larger than the contents in some cases, such as
262 // having a vertical scrollbar but no horizontal overflow.
263 max_scroll.SetToMax(gfx::Vector2dF());
264
265 root_scroll_layer_->SetMaxScrollOffset(gfx::ToFlooredVector2d(max_scroll));
266 }
267
268 static void ApplySentScrollDeltasFromAbortedCommitTo(LayerImpl* layer) { 333 static void ApplySentScrollDeltasFromAbortedCommitTo(LayerImpl* layer) {
269 layer->ApplySentScrollDeltasFromAbortedCommit(); 334 layer->ApplySentScrollDeltasFromAbortedCommit();
270 } 335 }
271 336
272 void LayerTreeImpl::ApplySentScrollAndScaleDeltasFromAbortedCommit() { 337 void LayerTreeImpl::ApplySentScrollAndScaleDeltasFromAbortedCommit() {
273 DCHECK(IsActiveTree()); 338 DCHECK(IsActiveTree());
274 339
275 page_scale_factor_ *= sent_page_scale_delta_; 340 page_scale_factor_ *= sent_page_scale_delta_;
276 page_scale_delta_ /= sent_page_scale_delta_; 341 page_scale_delta_ /= sent_page_scale_delta_;
277 sent_page_scale_delta_ = 1.f; 342 sent_page_scale_delta_ = 1.f;
(...skipping 26 matching lines...) Expand all
304 DCHECK(page_scale_layer_); 369 DCHECK(page_scale_layer_);
305 370
306 inner_viewport_scroll_layer_ = 371 inner_viewport_scroll_layer_ =
307 LayerById(inner_viewport_scroll_layer_id); 372 LayerById(inner_viewport_scroll_layer_id);
308 DCHECK(inner_viewport_scroll_layer_); 373 DCHECK(inner_viewport_scroll_layer_);
309 374
310 outer_viewport_scroll_layer_ = 375 outer_viewport_scroll_layer_ =
311 LayerById(outer_viewport_scroll_layer_id); 376 LayerById(outer_viewport_scroll_layer_id);
312 DCHECK(outer_viewport_scroll_layer_ || 377 DCHECK(outer_viewport_scroll_layer_ ||
313 outer_viewport_scroll_layer_id == Layer::INVALID_ID); 378 outer_viewport_scroll_layer_id == Layer::INVALID_ID);
379
380 if (!root_layer_scroll_offset_delegate_)
381 return;
382
383 inner_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
384 new LayerScrollOffsetDelegateProxy(inner_viewport_scroll_layer_,
385 root_layer_scroll_offset_delegate_,
386 this));
387
388 if (outer_viewport_scroll_layer_)
389 outer_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
390 new LayerScrollOffsetDelegateProxy(outer_viewport_scroll_layer_,
391 root_layer_scroll_offset_delegate_,
392 this));
314 } 393 }
315 394
316 void LayerTreeImpl::ClearViewportLayers() { 395 void LayerTreeImpl::ClearViewportLayers() {
317 page_scale_layer_ = NULL; 396 page_scale_layer_ = NULL;
318 inner_viewport_scroll_layer_ = NULL; 397 inner_viewport_scroll_layer_ = NULL;
319 outer_viewport_scroll_layer_ = NULL; 398 outer_viewport_scroll_layer_ = NULL;
320 } 399 }
321 400
322 // TODO(wjmaclean) This needs to go away, and be replaced with a single core
323 // of login that works for both scrollbar layer types. This is already planned
324 // as part of the larger pinch-zoom re-factoring viewport.
325 void LayerTreeImpl::UpdateSolidColorScrollbars() {
326 LayerImpl* root_scroll = RootScrollLayer();
327 DCHECK(root_scroll);
328 DCHECK(IsActiveTree());
329
330 gfx::RectF scrollable_viewport(
331 gfx::PointAtOffsetFromOrigin(root_scroll->TotalScrollOffset()),
332 ScrollableViewportSize());
333 float vertical_adjust = 0.0f;
334 if (RootContainerLayer())
335 vertical_adjust =
336 layer_tree_host_impl_->UnscaledScrollableViewportSize().height() -
337 RootContainerLayer()->bounds().height();
338 if (ScrollbarLayerImplBase* horiz =
339 root_scroll->horizontal_scrollbar_layer()) {
340 horiz->SetVerticalAdjust(vertical_adjust);
341 horiz->SetVisibleToTotalLengthRatio(
342 scrollable_viewport.width() / ScrollableSize().width());
343 }
344 if (ScrollbarLayerImplBase* vertical =
345 root_scroll->vertical_scrollbar_layer()) {
346 vertical->SetVerticalAdjust(vertical_adjust);
347 vertical->SetVisibleToTotalLengthRatio(
348 scrollable_viewport.height() / ScrollableSize().height());
349 }
350 }
351
352 void LayerTreeImpl::UpdateDrawProperties() { 401 void LayerTreeImpl::UpdateDrawProperties() {
353 if (IsActiveTree() && RootScrollLayer() && RootContainerLayer()) 402 if (IsActiveTree() && RootContainerLayer())
354 UpdateRootScrollLayerSizeDelta(); 403 UpdateRootScrollLayerSizeDelta();
355 404
356 if (IsActiveTree() &&
357 RootContainerLayer()
358 && !RootContainerLayer()->masks_to_bounds()) {
359 UpdateSolidColorScrollbars();
360 }
361
362 needs_update_draw_properties_ = false; 405 needs_update_draw_properties_ = false;
363 render_surface_layer_list_.clear(); 406 render_surface_layer_list_.clear();
364 407
365 // For max_texture_size. 408 // For max_texture_size.
366 if (!layer_tree_host_impl_->renderer()) 409 if (!layer_tree_host_impl_->renderer())
367 return; 410 return;
368 411
369 if (!root_layer()) 412 if (!root_layer())
370 return; 413 return;
371 414
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
430 "CalcDrawProperties should not set_needs_update_draw_properties()"; 473 "CalcDrawProperties should not set_needs_update_draw_properties()";
431 } 474 }
432 475
433 const LayerImplList& LayerTreeImpl::RenderSurfaceLayerList() const { 476 const LayerImplList& LayerTreeImpl::RenderSurfaceLayerList() const {
434 // If this assert triggers, then the list is dirty. 477 // If this assert triggers, then the list is dirty.
435 DCHECK(!needs_update_draw_properties_); 478 DCHECK(!needs_update_draw_properties_);
436 return render_surface_layer_list_; 479 return render_surface_layer_list_;
437 } 480 }
438 481
439 gfx::Size LayerTreeImpl::ScrollableSize() const { 482 gfx::Size LayerTreeImpl::ScrollableSize() const {
440 if (!root_scroll_layer_ || root_scroll_layer_->children().empty()) 483 LayerImpl* root_scroll_layer = OuterViewportScrollLayer() ?
484 OuterViewportScrollLayer() : InnerViewportScrollLayer();
485 if (!root_scroll_layer || root_scroll_layer->children().empty())
441 return gfx::Size(); 486 return gfx::Size();
442 return root_scroll_layer_->children()[0]->bounds(); 487 return root_scroll_layer->children()[0]->bounds();
443 } 488 }
444 489
445 LayerImpl* LayerTreeImpl::LayerById(int id) { 490 LayerImpl* LayerTreeImpl::LayerById(int id) {
446 LayerIdMap::iterator iter = layer_id_map_.find(id); 491 LayerIdMap::iterator iter = layer_id_map_.find(id);
447 return iter != layer_id_map_.end() ? iter->second : NULL; 492 return iter != layer_id_map_.end() ? iter->second : NULL;
448 } 493 }
449 494
450 void LayerTreeImpl::RegisterLayer(LayerImpl* layer) { 495 void LayerTreeImpl::RegisterLayer(LayerImpl* layer) {
451 DCHECK(!LayerById(layer->id())); 496 DCHECK(!LayerById(layer->id()));
452 layer_id_map_[layer->id()] = layer; 497 layer_id_map_[layer->id()] = layer;
(...skipping 13 matching lines...) Expand all
466 static void DidBecomeActiveRecursive(LayerImpl* layer) { 511 static void DidBecomeActiveRecursive(LayerImpl* layer) {
467 layer->DidBecomeActive(); 512 layer->DidBecomeActive();
468 for (size_t i = 0; i < layer->children().size(); ++i) 513 for (size_t i = 0; i < layer->children().size(); ++i)
469 DidBecomeActiveRecursive(layer->children()[i]); 514 DidBecomeActiveRecursive(layer->children()[i]);
470 } 515 }
471 516
472 void LayerTreeImpl::DidBecomeActive() { 517 void LayerTreeImpl::DidBecomeActive() {
473 if (!root_layer()) 518 if (!root_layer())
474 return; 519 return;
475 520
521 if (scrolling_layer_id_from_previous_tree_) {
522 currently_scrolling_layer_ = LayerTreeHostCommon::FindLayerInSubtree(
523 root_layer_.get(),
524 scrolling_layer_id_from_previous_tree_);
525 }
526
476 DidBecomeActiveRecursive(root_layer()); 527 DidBecomeActiveRecursive(root_layer());
477 FindRootScrollLayer();
478 } 528 }
479 529
480 bool LayerTreeImpl::ContentsTexturesPurged() const { 530 bool LayerTreeImpl::ContentsTexturesPurged() const {
481 return contents_textures_purged_; 531 return contents_textures_purged_;
482 } 532 }
483 533
484 void LayerTreeImpl::SetContentsTexturesPurged() { 534 void LayerTreeImpl::SetContentsTexturesPurged() {
485 if (contents_textures_purged_) 535 if (contents_textures_purged_)
486 return; 536 return;
487 contents_textures_purged_ = true; 537 contents_textures_purged_ = true;
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
658 state->Set("render_surface_layer_list", 708 state->Set("render_surface_layer_list",
659 render_surface_layer_list.release()); 709 render_surface_layer_list.release());
660 return state.PassAs<base::Value>(); 710 return state.PassAs<base::Value>();
661 } 711 }
662 712
663 void LayerTreeImpl::SetRootLayerScrollOffsetDelegate( 713 void LayerTreeImpl::SetRootLayerScrollOffsetDelegate(
664 LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) { 714 LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) {
665 if (root_layer_scroll_offset_delegate_ == root_layer_scroll_offset_delegate) 715 if (root_layer_scroll_offset_delegate_ == root_layer_scroll_offset_delegate)
666 return; 716 return;
667 717
718 if (!root_layer_scroll_offset_delegate) {
719 // Make sure we remove the proxies from their layers before
720 // releasing them.
721 if (InnerViewportScrollLayer())
722 InnerViewportScrollLayer()->SetScrollOffsetDelegate(NULL);
723 if (OuterViewportScrollLayer())
724 OuterViewportScrollLayer()->SetScrollOffsetDelegate(NULL);
725 inner_viewport_scroll_delegate_proxy_.reset();
726 outer_viewport_scroll_delegate_proxy_.reset();
727 }
728
668 root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate; 729 root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate;
669 730
670 if (root_scroll_layer_) {
671 root_scroll_layer_->SetScrollOffsetDelegate(
672 root_layer_scroll_offset_delegate_);
673 }
674
675 if (root_layer_scroll_offset_delegate_) { 731 if (root_layer_scroll_offset_delegate_) {
732 root_layer_scroll_offset_delegate_->SetTotalScrollOffset(
733 TotalScrollOffset());
734 root_layer_scroll_offset_delegate_->SetMaxScrollOffset(
735 TotalMaxScrollOffset());
676 root_layer_scroll_offset_delegate_->SetScrollableSize(ScrollableSize()); 736 root_layer_scroll_offset_delegate_->SetScrollableSize(ScrollableSize());
677 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactor( 737 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactor(
678 total_page_scale_factor()); 738 total_page_scale_factor());
739
740 if (inner_viewport_scroll_layer_) {
741 inner_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
742 new LayerScrollOffsetDelegateProxy(InnerViewportScrollLayer(),
743 root_layer_scroll_offset_delegate_,
744 this));
745 inner_viewport_scroll_layer_->SetScrollOffsetDelegate(
746 inner_viewport_scroll_delegate_proxy_.get());
747 }
748
749 if (outer_viewport_scroll_layer_) {
750 outer_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
751 new LayerScrollOffsetDelegateProxy(OuterViewportScrollLayer(),
752 root_layer_scroll_offset_delegate_,
753 this));
754 outer_viewport_scroll_layer_->SetScrollOffsetDelegate(
755 outer_viewport_scroll_delegate_proxy_.get());
756 }
679 } 757 }
680 } 758 }
681 759
760 void LayerTreeImpl::UpdateScrollOffsetDelegate() {
761 DCHECK(InnerViewportScrollLayer());
762 DCHECK(root_layer_scroll_offset_delegate_);
763
764 gfx::Vector2dF offset =
765 inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
766
767 if (OuterViewportScrollLayer())
768 offset +=
769 outer_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
770
771 root_layer_scroll_offset_delegate_->SetTotalScrollOffset(offset);
772 root_layer_scroll_offset_delegate_->SetMaxScrollOffset(
773 TotalMaxScrollOffset());
774 }
775
776 gfx::Vector2dF LayerTreeImpl::GetDelegatedScrollOffset(LayerImpl* layer) {
777 DCHECK(root_layer_scroll_offset_delegate_);
778 DCHECK(InnerViewportScrollLayer());
779 if (layer == InnerViewportScrollLayer() && !OuterViewportScrollLayer())
780 return root_layer_scroll_offset_delegate_->GetTotalScrollOffset();
781
782 // If we get here, we have both inner/outer viewports, and need to distribute
783 // the scroll offset between them.
784 DCHECK(inner_viewport_scroll_delegate_proxy_);
785 DCHECK(outer_viewport_scroll_delegate_proxy_);
786 gfx::Vector2dF inner_viewport_offset =
787 inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
788 gfx::Vector2dF outer_viewport_offset =
789 outer_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
790
791 // It may be nothing has changed.
792 gfx::Vector2dF delegate_offset =
793 root_layer_scroll_offset_delegate_->GetTotalScrollOffset();
794 if (inner_viewport_offset + outer_viewport_offset == delegate_offset) {
795 if (layer == InnerViewportScrollLayer())
796 return inner_viewport_offset;
797 else
798 return outer_viewport_offset;
799 }
800
801 gfx::Vector2d max_outer_viewport_scroll_offset =
802 OuterViewportScrollLayer()->MaxScrollOffset();
803
804 outer_viewport_offset = delegate_offset - inner_viewport_offset;
805 outer_viewport_offset.SetToMin(max_outer_viewport_scroll_offset);
806 outer_viewport_offset.SetToMax(gfx::Vector2d());
807
808 if (layer == OuterViewportScrollLayer())
809 return outer_viewport_offset;
810
811 inner_viewport_offset = delegate_offset - outer_viewport_offset;
812
813 return inner_viewport_offset;
814 }
815
816 // TODO(wjmaclean) Rename this function, as we no longer have a
817 // "RootScrollLayer".
682 void LayerTreeImpl::UpdateRootScrollLayerSizeDelta() { 818 void LayerTreeImpl::UpdateRootScrollLayerSizeDelta() {
683 LayerImpl* root_scroll = RootScrollLayer(); 819 // TODO(wjmaclean) verify this is really the right thing to do in cases where
820 // the pinch virtual viewport is active.
821 LayerImpl* root_scroll = InnerViewportScrollLayer();
684 LayerImpl* root_container = RootContainerLayer(); 822 LayerImpl* root_container = RootContainerLayer();
685 DCHECK(root_scroll); 823 DCHECK(root_scroll);
686 DCHECK(root_container); 824 DCHECK(root_container);
687 DCHECK(IsActiveTree()); 825 DCHECK(IsActiveTree());
688 826
689 gfx::Vector2dF scrollable_viewport_size = 827 gfx::Vector2dF scrollable_viewport_size =
690 gfx::RectF(ScrollableViewportSize()).bottom_right() - gfx::PointF(); 828 gfx::RectF(ScrollableViewportSize()).bottom_right() - gfx::PointF();
691 829
692 gfx::Vector2dF original_viewport_size = 830 gfx::Vector2dF original_viewport_size =
693 gfx::RectF(root_container->bounds()).bottom_right() - 831 gfx::RectF(root_container->bounds()).bottom_right() -
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
793 const std::vector<LayerImpl*>& LayerTreeImpl::LayersWithCopyOutputRequest() 931 const std::vector<LayerImpl*>& LayerTreeImpl::LayersWithCopyOutputRequest()
794 const { 932 const {
795 // Only the active tree needs to know about layers with copy requests, as 933 // Only the active tree needs to know about layers with copy requests, as
796 // they are aborted if not serviced during draw. 934 // they are aborted if not serviced during draw.
797 DCHECK(IsActiveTree()); 935 DCHECK(IsActiveTree());
798 936
799 return layers_with_copy_output_request_; 937 return layers_with_copy_output_request_;
800 } 938 }
801 939
802 } // namespace cc 940 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698