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

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: Use layer ids instead of pointers for registering scroll/clip layers. Created 6 years, 10 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 // This class exists to split the LayerScrollOffsetDelegate between the
26 // InnerViewportScrollLayer and the OuterViewportScrollLayer in a manner
27 // that never requires the embedder or LayerImpl to know about.
28 class LayerScrollOffsetDelegateProxy : public LayerScrollOffsetDelegate {
29 public:
30 LayerScrollOffsetDelegateProxy(LayerImpl* layer,
31 LayerScrollOffsetDelegate* delegate,
32 LayerTreeImpl* layer_tree)
33 : layer_(layer),
34 delegate_(delegate),
35 layer_tree_impl_(layer_tree) {}
36
37 gfx::Vector2dF last_set_scroll_offset() const {
38 return last_set_scroll_offset_;
39 }
40
41 // LayerScrollOffsetDelegate implementation.
42
43 virtual void SetTotalScrollOffset(const gfx::Vector2dF& new_offset) OVERRIDE {
44 last_set_scroll_offset_ = new_offset;
45 layer_tree_impl_->UpdateScrollOffsetDelegate();
46 }
47
48 virtual gfx::Vector2dF GetTotalScrollOffset() OVERRIDE {
49 return layer_tree_impl_->GetDelegatedScrollOffset(layer_);
50 }
51
52 virtual bool IsExternalFlingActive() const OVERRIDE {
53 return delegate_->IsExternalFlingActive();
54 }
55
56 // Functions below this point are never called by LayerImpl on its
57 // LayerScrollOffsetDelegate, and so are not implemented.
58 virtual void SetMaxScrollOffset(const gfx::Vector2dF&) OVERRIDE {
59 NOTIMPLEMENTED();
60 }
61
62 virtual void SetTotalPageScaleFactor(float scale) OVERRIDE {
63 NOTIMPLEMENTED();
64 }
65
66 virtual void SetScrollableSize(const gfx::SizeF& scrollable_size) OVERRIDE {
67 NOTIMPLEMENTED();
68 }
69
70 private:
71 LayerImpl* layer_;
72 LayerScrollOffsetDelegate* delegate_;
73 LayerTreeImpl* layer_tree_impl_;
74 gfx::Vector2dF last_set_scroll_offset_;
75 };
76
25 LayerTreeImpl::LayerTreeImpl(LayerTreeHostImpl* layer_tree_host_impl) 77 LayerTreeImpl::LayerTreeImpl(LayerTreeHostImpl* layer_tree_host_impl)
26 : layer_tree_host_impl_(layer_tree_host_impl), 78 : layer_tree_host_impl_(layer_tree_host_impl),
27 source_frame_number_(-1), 79 source_frame_number_(-1),
28 hud_layer_(0), 80 hud_layer_(0),
29 root_scroll_layer_(NULL),
30 currently_scrolling_layer_(NULL), 81 currently_scrolling_layer_(NULL),
31 root_layer_scroll_offset_delegate_(NULL), 82 root_layer_scroll_offset_delegate_(NULL),
32 background_color_(0), 83 background_color_(0),
33 has_transparent_background_(false), 84 has_transparent_background_(false),
34 page_scale_layer_(NULL), 85 page_scale_layer_(NULL),
35 inner_viewport_scroll_layer_(NULL), 86 inner_viewport_scroll_layer_(NULL),
36 outer_viewport_scroll_layer_(NULL), 87 outer_viewport_scroll_layer_(NULL),
37 page_scale_factor_(1), 88 page_scale_factor_(1),
38 page_scale_delta_(1), 89 page_scale_delta_(1),
39 sent_page_scale_delta_(1), 90 sent_page_scale_delta_(1),
40 min_page_scale_factor_(0), 91 min_page_scale_factor_(0),
41 max_page_scale_factor_(0), 92 max_page_scale_factor_(0),
42 scrolling_layer_id_from_previous_tree_(0), 93 scrolling_layer_id_from_previous_tree_(0),
43 contents_textures_purged_(false), 94 contents_textures_purged_(false),
44 viewport_size_invalid_(false), 95 viewport_size_invalid_(false),
45 needs_update_draw_properties_(true), 96 needs_update_draw_properties_(true),
46 needs_full_tree_sync_(true), 97 needs_full_tree_sync_(true),
47 next_activation_forces_redraw_(false) { 98 next_activation_forces_redraw_(false) {
48 } 99 }
49 100
50 LayerTreeImpl::~LayerTreeImpl() { 101 LayerTreeImpl::~LayerTreeImpl() {
51 // Need to explicitly clear the tree prior to destroying this so that 102 // Need to explicitly clear the tree prior to destroying this so that
52 // the LayerTreeImpl pointer is still valid in the LayerImpl dtor. 103 // the LayerTreeImpl pointer is still valid in the LayerImpl dtor.
53 root_layer_.reset(); 104 root_layer_.reset();
54 } 105 }
55 106
56 static LayerImpl* FindRootScrollLayerRecursive(LayerImpl* layer) { 107 void LayerTreeImpl::SetRootLayer(scoped_ptr<LayerImpl> layer) {
57 if (!layer) 108 if (inner_viewport_scroll_layer_)
58 return NULL; 109 inner_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
110 if (outer_viewport_scroll_layer_)
111 outer_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
112 inner_viewport_scroll_delegate_proxy_.reset();
113 outer_viewport_scroll_delegate_proxy_.reset();
59 114
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(); 115 root_layer_ = layer.Pass();
76 currently_scrolling_layer_ = NULL; 116 currently_scrolling_layer_ = NULL;
77 root_scroll_layer_ = NULL; 117 inner_viewport_scroll_layer_ = NULL;
118 outer_viewport_scroll_layer_ = NULL;
119 page_scale_layer_ = NULL;
78 120
79 layer_tree_host_impl_->OnCanDrawStateChangedForTree(); 121 layer_tree_host_impl_->OnCanDrawStateChangedForTree();
80 } 122 }
81 123
82 void LayerTreeImpl::FindRootScrollLayer() { 124 LayerImpl* LayerTreeImpl::InnerViewportScrollLayer() const {
83 root_scroll_layer_ = FindRootScrollLayerRecursive(root_layer_.get()); 125 return inner_viewport_scroll_layer_;
126 }
84 127
85 if (root_scroll_layer_) { 128 LayerImpl* LayerTreeImpl::OuterViewportScrollLayer() const {
86 UpdateMaxScrollOffset(); 129 return outer_viewport_scroll_layer_;
87 root_scroll_layer_->SetScrollOffsetDelegate( 130 }
88 root_layer_scroll_offset_delegate_);
89 }
90 131
91 if (scrolling_layer_id_from_previous_tree_) { 132 gfx::Vector2dF LayerTreeImpl::TotalScrollOffset() const {
92 currently_scrolling_layer_ = LayerTreeHostCommon::FindLayerInSubtree( 133 gfx::Vector2dF offset;
93 root_layer_.get(),
94 scrolling_layer_id_from_previous_tree_);
95 }
96 134
97 scrolling_layer_id_from_previous_tree_ = 0; 135 if (inner_viewport_scroll_layer_)
136 offset += inner_viewport_scroll_layer_->TotalScrollOffset();
137
138 if (outer_viewport_scroll_layer_)
139 offset += outer_viewport_scroll_layer_->TotalScrollOffset();
140
141 return offset;
142 }
143
144 gfx::Vector2dF LayerTreeImpl::TotalMaxScrollOffset() const {
145 gfx::Vector2dF offset;
146
147 if (inner_viewport_scroll_layer_)
148 offset += inner_viewport_scroll_layer_->MaxScrollOffset();
149
150 if (outer_viewport_scroll_layer_)
151 offset += outer_viewport_scroll_layer_->MaxScrollOffset();
152
153 return offset;
154 }
155 gfx::Vector2dF LayerTreeImpl::TotalScrollDelta() const {
156 DCHECK(inner_viewport_scroll_layer_);
157 gfx::Vector2dF delta = inner_viewport_scroll_layer_->ScrollDelta();
158
159 if (outer_viewport_scroll_layer_)
160 delta += outer_viewport_scroll_layer_->ScrollDelta();
161
162 return delta;
98 } 163 }
99 164
100 scoped_ptr<LayerImpl> LayerTreeImpl::DetachLayerTree() { 165 scoped_ptr<LayerImpl> LayerTreeImpl::DetachLayerTree() {
101 // Clear all data structures that have direct references to the layer tree. 166 // Clear all data structures that have direct references to the layer tree.
102 scrolling_layer_id_from_previous_tree_ = 167 scrolling_layer_id_from_previous_tree_ =
103 currently_scrolling_layer_ ? currently_scrolling_layer_->id() : 0; 168 currently_scrolling_layer_ ? currently_scrolling_layer_->id() : 0;
104 if (root_scroll_layer_) 169 if (inner_viewport_scroll_layer_)
105 root_scroll_layer_->SetScrollOffsetDelegate(NULL); 170 inner_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
106 root_scroll_layer_ = NULL; 171 if (outer_viewport_scroll_layer_)
172 outer_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
173 inner_viewport_scroll_delegate_proxy_.reset();
174 outer_viewport_scroll_delegate_proxy_.reset();
175 inner_viewport_scroll_layer_ = NULL;
176 outer_viewport_scroll_layer_ = NULL;
177 page_scale_layer_ = NULL;
107 currently_scrolling_layer_ = NULL; 178 currently_scrolling_layer_ = NULL;
108 179
109 render_surface_layer_list_.clear(); 180 render_surface_layer_list_.clear();
110 set_needs_update_draw_properties(); 181 set_needs_update_draw_properties();
111 return root_layer_.Pass(); 182 return root_layer_.Pass();
112 } 183 }
113 184
114 void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) { 185 void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) {
115 // The request queue should have been processed and does not require a push. 186 // The request queue should have been processed and does not require a push.
116 DCHECK_EQ(ui_resource_request_queue_.size(), 0u); 187 DCHECK_EQ(ui_resource_request_queue_.size(), 0u);
117 188
118 if (next_activation_forces_redraw_) { 189 if (next_activation_forces_redraw_) {
119 layer_tree_host_impl_->SetFullRootLayerDamage(); 190 layer_tree_host_impl_->SetFullRootLayerDamage();
120 next_activation_forces_redraw_ = false; 191 next_activation_forces_redraw_ = false;
121 } 192 }
122 193
123 target_tree->PassSwapPromises(&swap_promise_list_); 194 target_tree->PassSwapPromises(&swap_promise_list_);
124 195
125 target_tree->SetPageScaleFactorAndLimits( 196 target_tree->SetPageScaleFactorAndLimits(
126 page_scale_factor(), min_page_scale_factor(), max_page_scale_factor()); 197 page_scale_factor(), min_page_scale_factor(), max_page_scale_factor());
127 target_tree->SetPageScaleDelta( 198 target_tree->SetPageScaleDelta(
128 target_tree->page_scale_delta() / target_tree->sent_page_scale_delta()); 199 target_tree->page_scale_delta() / target_tree->sent_page_scale_delta());
129 target_tree->set_sent_page_scale_delta(1); 200 target_tree->set_sent_page_scale_delta(1);
130 201
131 if (settings().use_pinch_virtual_viewport) { 202 if (page_scale_layer_ && inner_viewport_scroll_layer_) {
132 target_tree->SetViewportLayersFromIds( 203 target_tree->SetViewportLayersFromIds(
133 page_scale_layer_->id(), 204 page_scale_layer_->id(),
134 inner_viewport_scroll_layer_->id(), 205 inner_viewport_scroll_layer_->id(),
135 outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id() 206 outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id()
136 : Layer::INVALID_ID); 207 : Layer::INVALID_ID);
208 } else {
209 target_tree->ClearViewportLayers();
137 } 210 }
138 // This should match the property synchronization in 211 // This should match the property synchronization in
139 // LayerTreeHost::finishCommitOnImplThread(). 212 // LayerTreeHost::finishCommitOnImplThread().
140 target_tree->set_source_frame_number(source_frame_number()); 213 target_tree->set_source_frame_number(source_frame_number());
141 target_tree->set_background_color(background_color()); 214 target_tree->set_background_color(background_color());
142 target_tree->set_has_transparent_background(has_transparent_background()); 215 target_tree->set_has_transparent_background(has_transparent_background());
143 216
144 if (ContentsTexturesPurged()) 217 if (ContentsTexturesPurged())
145 target_tree->SetContentsTexturesPurged(); 218 target_tree->SetContentsTexturesPurged();
146 else 219 else
147 target_tree->ResetContentsTexturesPurged(); 220 target_tree->ResetContentsTexturesPurged();
148 221
149 if (ViewportSizeInvalid()) 222 if (ViewportSizeInvalid())
150 target_tree->SetViewportSizeInvalid(); 223 target_tree->SetViewportSizeInvalid();
151 else 224 else
152 target_tree->ResetViewportSizeInvalid(); 225 target_tree->ResetViewportSizeInvalid();
153 226
154 if (hud_layer()) 227 if (hud_layer())
155 target_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>( 228 target_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(
156 LayerTreeHostCommon::FindLayerInSubtree( 229 LayerTreeHostCommon::FindLayerInSubtree(
157 target_tree->root_layer(), hud_layer()->id()))); 230 target_tree->root_layer(), hud_layer()->id())));
158 else 231 else
159 target_tree->set_hud_layer(NULL); 232 target_tree->set_hud_layer(NULL);
160 } 233 }
161 234
162 LayerImpl* LayerTreeImpl::RootScrollLayer() const {
163 return root_scroll_layer_;
164 }
165
166 LayerImpl* LayerTreeImpl::RootContainerLayer() const { 235 LayerImpl* LayerTreeImpl::RootContainerLayer() const {
167 return root_scroll_layer_ ? root_scroll_layer_->parent() : NULL; 236 return inner_viewport_scroll_layer_ ? inner_viewport_scroll_layer_->parent()
237 : NULL;
168 } 238 }
169 239
170 LayerImpl* LayerTreeImpl::CurrentlyScrollingLayer() const { 240 LayerImpl* LayerTreeImpl::CurrentlyScrollingLayer() const {
171 DCHECK(IsActiveTree()); 241 DCHECK(IsActiveTree());
172 return currently_scrolling_layer_; 242 return currently_scrolling_layer_;
173 } 243 }
174 244
175 void LayerTreeImpl::SetCurrentlyScrollingLayer(LayerImpl* layer) { 245 void LayerTreeImpl::SetCurrentlyScrollingLayer(LayerImpl* layer) {
176 if (currently_scrolling_layer_ == layer) 246 if (currently_scrolling_layer_ == layer)
177 return; 247 return;
178 248
179 if (currently_scrolling_layer_ && 249 if (currently_scrolling_layer_ &&
180 currently_scrolling_layer_->scrollbar_animation_controller()) 250 currently_scrolling_layer_->scrollbar_animation_controller())
181 currently_scrolling_layer_->scrollbar_animation_controller()-> 251 currently_scrolling_layer_->scrollbar_animation_controller()->
182 DidScrollGestureEnd(CurrentPhysicalTimeTicks()); 252 DidScrollGestureEnd(CurrentPhysicalTimeTicks());
183 currently_scrolling_layer_ = layer; 253 currently_scrolling_layer_ = layer;
184 if (layer && layer->scrollbar_animation_controller()) 254 if (layer && layer->scrollbar_animation_controller())
185 layer->scrollbar_animation_controller()->DidScrollGestureBegin(); 255 layer->scrollbar_animation_controller()->DidScrollGestureBegin();
186 } 256 }
187 257
188 void LayerTreeImpl::ClearCurrentlyScrollingLayer() { 258 void LayerTreeImpl::ClearCurrentlyScrollingLayer() {
189 SetCurrentlyScrollingLayer(NULL); 259 SetCurrentlyScrollingLayer(NULL);
190 scrolling_layer_id_from_previous_tree_ = 0; 260 scrolling_layer_id_from_previous_tree_ = 0;
191 } 261 }
192 262
263 float LayerTreeImpl::VerticalAdjust(const LayerImpl* layer) const {
264 DCHECK(layer);
265 if (layer->parent() != RootContainerLayer())
266 return 0.f;
267
268 return layer_tree_host_impl_->UnscaledScrollableViewportSize().height() -
269 RootContainerLayer()->bounds().height();
270 }
271
272 namespace {
273
274 void ForceScrollbarParameterUpdateAfterScaleChange(LayerImpl* current_layer) {
275 if (!current_layer)
276 return;
277
278 while (current_layer) {
279 current_layer->ScrollbarParametersDidChange();
280 current_layer = current_layer->parent();
281 }
282 }
283
284 } // namespace
285
193 void LayerTreeImpl::SetPageScaleFactorAndLimits(float page_scale_factor, 286 void LayerTreeImpl::SetPageScaleFactorAndLimits(float page_scale_factor,
194 float min_page_scale_factor, float max_page_scale_factor) { 287 float min_page_scale_factor, float max_page_scale_factor) {
195 if (!page_scale_factor) 288 if (!page_scale_factor)
196 return; 289 return;
197 290
198 min_page_scale_factor_ = min_page_scale_factor; 291 min_page_scale_factor_ = min_page_scale_factor;
199 max_page_scale_factor_ = max_page_scale_factor; 292 max_page_scale_factor_ = max_page_scale_factor;
200 page_scale_factor_ = page_scale_factor; 293 page_scale_factor_ = page_scale_factor;
201 294
202 if (root_layer_scroll_offset_delegate_) { 295 if (root_layer_scroll_offset_delegate_) {
203 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactor( 296 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactor(
204 total_page_scale_factor()); 297 total_page_scale_factor());
205 } 298 }
299
300 ForceScrollbarParameterUpdateAfterScaleChange(page_scale_layer());
206 } 301 }
207 302
208 void LayerTreeImpl::SetPageScaleDelta(float delta) { 303 void LayerTreeImpl::SetPageScaleDelta(float delta) {
209 // Clamp to the current min/max limits. 304 // Clamp to the current min/max limits.
210 float total = page_scale_factor_ * delta; 305 float total = page_scale_factor_ * delta;
211 if (min_page_scale_factor_ && total < min_page_scale_factor_) 306 if (min_page_scale_factor_ && total < min_page_scale_factor_)
212 delta = min_page_scale_factor_ / page_scale_factor_; 307 delta = min_page_scale_factor_ / page_scale_factor_;
213 else if (max_page_scale_factor_ && total > max_page_scale_factor_) 308 else if (max_page_scale_factor_ && total > max_page_scale_factor_)
214 delta = max_page_scale_factor_ / page_scale_factor_; 309 delta = max_page_scale_factor_ / page_scale_factor_;
215 310
216 if (delta == page_scale_delta_) 311 if (delta == page_scale_delta_)
217 return; 312 return;
218 313
219 page_scale_delta_ = delta; 314 page_scale_delta_ = delta;
220 315
221 if (IsActiveTree()) { 316 if (IsActiveTree()) {
222 LayerTreeImpl* pending_tree = layer_tree_host_impl_->pending_tree(); 317 LayerTreeImpl* pending_tree = layer_tree_host_impl_->pending_tree();
223 if (pending_tree) { 318 if (pending_tree) {
224 DCHECK_EQ(1, pending_tree->sent_page_scale_delta()); 319 DCHECK_EQ(1, pending_tree->sent_page_scale_delta());
225 pending_tree->SetPageScaleDelta( 320 pending_tree->SetPageScaleDelta(
226 page_scale_delta_ / sent_page_scale_delta_); 321 page_scale_delta_ / sent_page_scale_delta_);
227 } 322 }
228 } 323 }
229 324
230 UpdateMaxScrollOffset();
231 set_needs_update_draw_properties(); 325 set_needs_update_draw_properties();
232 326
233 if (root_layer_scroll_offset_delegate_) { 327 if (root_layer_scroll_offset_delegate_) {
234 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactor( 328 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactor(
235 total_page_scale_factor()); 329 total_page_scale_factor());
236 } 330 }
237 } 331 }
238 332
239 gfx::SizeF LayerTreeImpl::ScrollableViewportSize() const { 333 gfx::SizeF LayerTreeImpl::ScrollableViewportSize() const {
240 return gfx::ScaleSize(layer_tree_host_impl_->UnscaledScrollableViewportSize(), 334 if (outer_viewport_scroll_layer_)
241 1.0f / total_page_scale_factor()); 335 return layer_tree_host_impl_->UnscaledScrollableViewportSize();
336 else
337 return gfx::ScaleSize(
338 layer_tree_host_impl_->UnscaledScrollableViewportSize(),
339 1.0f / total_page_scale_factor());
242 } 340 }
243 341
244 gfx::Rect LayerTreeImpl::RootScrollLayerDeviceViewportBounds() const { 342 gfx::Rect LayerTreeImpl::RootScrollLayerDeviceViewportBounds() const {
245 if (!root_scroll_layer_ || root_scroll_layer_->children().empty()) 343 LayerImpl* root_scroll_layer =
344 OuterViewportScrollLayer() ? OuterViewportScrollLayer()
345 : InnerViewportScrollLayer();
346 if (!root_scroll_layer || root_scroll_layer->children().empty())
246 return gfx::Rect(); 347 return gfx::Rect();
247 LayerImpl* layer = root_scroll_layer_->children()[0]; 348 LayerImpl* layer = root_scroll_layer->children()[0];
248 return MathUtil::MapClippedRect( 349 return MathUtil::MapClippedRect(
249 layer->screen_space_transform(), 350 layer->screen_space_transform(),
250 gfx::Rect(layer->content_bounds())); 351 gfx::Rect(layer->content_bounds()));
251 } 352 }
252 353
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) { 354 static void ApplySentScrollDeltasFromAbortedCommitTo(LayerImpl* layer) {
269 layer->ApplySentScrollDeltasFromAbortedCommit(); 355 layer->ApplySentScrollDeltasFromAbortedCommit();
270 } 356 }
271 357
272 void LayerTreeImpl::ApplySentScrollAndScaleDeltasFromAbortedCommit() { 358 void LayerTreeImpl::ApplySentScrollAndScaleDeltasFromAbortedCommit() {
273 DCHECK(IsActiveTree()); 359 DCHECK(IsActiveTree());
274 360
275 page_scale_factor_ *= sent_page_scale_delta_; 361 page_scale_factor_ *= sent_page_scale_delta_;
276 page_scale_delta_ /= sent_page_scale_delta_; 362 page_scale_delta_ /= sent_page_scale_delta_;
277 sent_page_scale_delta_ = 1.f; 363 sent_page_scale_delta_ = 1.f;
(...skipping 26 matching lines...) Expand all
304 DCHECK(page_scale_layer_); 390 DCHECK(page_scale_layer_);
305 391
306 inner_viewport_scroll_layer_ = 392 inner_viewport_scroll_layer_ =
307 LayerById(inner_viewport_scroll_layer_id); 393 LayerById(inner_viewport_scroll_layer_id);
308 DCHECK(inner_viewport_scroll_layer_); 394 DCHECK(inner_viewport_scroll_layer_);
309 395
310 outer_viewport_scroll_layer_ = 396 outer_viewport_scroll_layer_ =
311 LayerById(outer_viewport_scroll_layer_id); 397 LayerById(outer_viewport_scroll_layer_id);
312 DCHECK(outer_viewport_scroll_layer_ || 398 DCHECK(outer_viewport_scroll_layer_ ||
313 outer_viewport_scroll_layer_id == Layer::INVALID_ID); 399 outer_viewport_scroll_layer_id == Layer::INVALID_ID);
400
401 if (!root_layer_scroll_offset_delegate_)
402 return;
403
404 inner_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
405 new LayerScrollOffsetDelegateProxy(inner_viewport_scroll_layer_,
406 root_layer_scroll_offset_delegate_,
407 this));
408
409 if (outer_viewport_scroll_layer_)
410 outer_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
411 new LayerScrollOffsetDelegateProxy(outer_viewport_scroll_layer_,
412 root_layer_scroll_offset_delegate_,
413 this));
314 } 414 }
315 415
316 void LayerTreeImpl::ClearViewportLayers() { 416 void LayerTreeImpl::ClearViewportLayers() {
317 page_scale_layer_ = NULL; 417 page_scale_layer_ = NULL;
318 inner_viewport_scroll_layer_ = NULL; 418 inner_viewport_scroll_layer_ = NULL;
319 outer_viewport_scroll_layer_ = NULL; 419 outer_viewport_scroll_layer_ = NULL;
320 } 420 }
321 421
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() { 422 void LayerTreeImpl::UpdateDrawProperties() {
353 if (IsActiveTree() && RootScrollLayer() && RootContainerLayer()) 423 if (IsActiveTree() && RootContainerLayer())
354 UpdateRootScrollLayerSizeDelta(); 424 UpdateRootScrollLayerSizeDelta();
355 425
356 if (IsActiveTree() && RootContainerLayer())
357 UpdateSolidColorScrollbars();
358
359 needs_update_draw_properties_ = false; 426 needs_update_draw_properties_ = false;
360 render_surface_layer_list_.clear(); 427 render_surface_layer_list_.clear();
361 428
362 // For max_texture_size. 429 // For max_texture_size.
363 if (!layer_tree_host_impl_->renderer()) 430 if (!layer_tree_host_impl_->renderer())
364 return; 431 return;
365 432
366 if (!root_layer()) 433 if (!root_layer())
367 return; 434 return;
368 435
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 "CalcDrawProperties should not set_needs_update_draw_properties()"; 494 "CalcDrawProperties should not set_needs_update_draw_properties()";
428 } 495 }
429 496
430 const LayerImplList& LayerTreeImpl::RenderSurfaceLayerList() const { 497 const LayerImplList& LayerTreeImpl::RenderSurfaceLayerList() const {
431 // If this assert triggers, then the list is dirty. 498 // If this assert triggers, then the list is dirty.
432 DCHECK(!needs_update_draw_properties_); 499 DCHECK(!needs_update_draw_properties_);
433 return render_surface_layer_list_; 500 return render_surface_layer_list_;
434 } 501 }
435 502
436 gfx::Size LayerTreeImpl::ScrollableSize() const { 503 gfx::Size LayerTreeImpl::ScrollableSize() const {
437 if (!root_scroll_layer_ || root_scroll_layer_->children().empty()) 504 LayerImpl* root_scroll_layer = OuterViewportScrollLayer() ?
505 OuterViewportScrollLayer() : InnerViewportScrollLayer();
506 if (!root_scroll_layer || root_scroll_layer->children().empty())
438 return gfx::Size(); 507 return gfx::Size();
439 return root_scroll_layer_->children()[0]->bounds(); 508 return root_scroll_layer->children()[0]->bounds();
440 } 509 }
441 510
442 LayerImpl* LayerTreeImpl::LayerById(int id) { 511 LayerImpl* LayerTreeImpl::LayerById(int id) {
443 LayerIdMap::iterator iter = layer_id_map_.find(id); 512 LayerIdMap::iterator iter = layer_id_map_.find(id);
444 return iter != layer_id_map_.end() ? iter->second : NULL; 513 return iter != layer_id_map_.end() ? iter->second : NULL;
445 } 514 }
446 515
447 void LayerTreeImpl::RegisterLayer(LayerImpl* layer) { 516 void LayerTreeImpl::RegisterLayer(LayerImpl* layer) {
448 DCHECK(!LayerById(layer->id())); 517 DCHECK(!LayerById(layer->id()));
449 layer_id_map_[layer->id()] = layer; 518 layer_id_map_[layer->id()] = layer;
(...skipping 13 matching lines...) Expand all
463 static void DidBecomeActiveRecursive(LayerImpl* layer) { 532 static void DidBecomeActiveRecursive(LayerImpl* layer) {
464 layer->DidBecomeActive(); 533 layer->DidBecomeActive();
465 for (size_t i = 0; i < layer->children().size(); ++i) 534 for (size_t i = 0; i < layer->children().size(); ++i)
466 DidBecomeActiveRecursive(layer->children()[i]); 535 DidBecomeActiveRecursive(layer->children()[i]);
467 } 536 }
468 537
469 void LayerTreeImpl::DidBecomeActive() { 538 void LayerTreeImpl::DidBecomeActive() {
470 if (!root_layer()) 539 if (!root_layer())
471 return; 540 return;
472 541
542 if (scrolling_layer_id_from_previous_tree_) {
543 currently_scrolling_layer_ = LayerTreeHostCommon::FindLayerInSubtree(
544 root_layer_.get(),
545 scrolling_layer_id_from_previous_tree_);
546 }
547
473 DidBecomeActiveRecursive(root_layer()); 548 DidBecomeActiveRecursive(root_layer());
474 FindRootScrollLayer();
475 } 549 }
476 550
477 bool LayerTreeImpl::ContentsTexturesPurged() const { 551 bool LayerTreeImpl::ContentsTexturesPurged() const {
478 return contents_textures_purged_; 552 return contents_textures_purged_;
479 } 553 }
480 554
481 void LayerTreeImpl::SetContentsTexturesPurged() { 555 void LayerTreeImpl::SetContentsTexturesPurged() {
482 if (contents_textures_purged_) 556 if (contents_textures_purged_)
483 return; 557 return;
484 contents_textures_purged_ = true; 558 contents_textures_purged_ = true;
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
655 state->Set("render_surface_layer_list", 729 state->Set("render_surface_layer_list",
656 render_surface_layer_list.release()); 730 render_surface_layer_list.release());
657 return state.PassAs<base::Value>(); 731 return state.PassAs<base::Value>();
658 } 732 }
659 733
660 void LayerTreeImpl::SetRootLayerScrollOffsetDelegate( 734 void LayerTreeImpl::SetRootLayerScrollOffsetDelegate(
661 LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) { 735 LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) {
662 if (root_layer_scroll_offset_delegate_ == root_layer_scroll_offset_delegate) 736 if (root_layer_scroll_offset_delegate_ == root_layer_scroll_offset_delegate)
663 return; 737 return;
664 738
739 if (!root_layer_scroll_offset_delegate) {
740 // Make sure we remove the proxies from their layers before
741 // releasing them.
742 if (InnerViewportScrollLayer())
743 InnerViewportScrollLayer()->SetScrollOffsetDelegate(NULL);
744 if (OuterViewportScrollLayer())
745 OuterViewportScrollLayer()->SetScrollOffsetDelegate(NULL);
746 inner_viewport_scroll_delegate_proxy_.reset();
747 outer_viewport_scroll_delegate_proxy_.reset();
748 }
749
665 root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate; 750 root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate;
666 751
667 if (root_scroll_layer_) {
668 root_scroll_layer_->SetScrollOffsetDelegate(
669 root_layer_scroll_offset_delegate_);
670 }
671
672 if (root_layer_scroll_offset_delegate_) { 752 if (root_layer_scroll_offset_delegate_) {
753 root_layer_scroll_offset_delegate_->SetTotalScrollOffset(
754 TotalScrollOffset());
755 root_layer_scroll_offset_delegate_->SetMaxScrollOffset(
756 TotalMaxScrollOffset());
673 root_layer_scroll_offset_delegate_->SetScrollableSize(ScrollableSize()); 757 root_layer_scroll_offset_delegate_->SetScrollableSize(ScrollableSize());
674 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactor( 758 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactor(
675 total_page_scale_factor()); 759 total_page_scale_factor());
760
761 if (inner_viewport_scroll_layer_) {
762 inner_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
763 new LayerScrollOffsetDelegateProxy(InnerViewportScrollLayer(),
764 root_layer_scroll_offset_delegate_,
765 this));
766 inner_viewport_scroll_layer_->SetScrollOffsetDelegate(
767 inner_viewport_scroll_delegate_proxy_.get());
768 }
769
770 if (outer_viewport_scroll_layer_) {
771 outer_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
772 new LayerScrollOffsetDelegateProxy(OuterViewportScrollLayer(),
773 root_layer_scroll_offset_delegate_,
774 this));
775 outer_viewport_scroll_layer_->SetScrollOffsetDelegate(
776 outer_viewport_scroll_delegate_proxy_.get());
777 }
676 } 778 }
677 } 779 }
678 780
781 void LayerTreeImpl::UpdateScrollOffsetDelegate() {
782 DCHECK(InnerViewportScrollLayer());
783 DCHECK(root_layer_scroll_offset_delegate_);
784
785 gfx::Vector2dF offset =
786 inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
787
788 if (OuterViewportScrollLayer())
789 offset +=
790 outer_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
791
792 root_layer_scroll_offset_delegate_->SetTotalScrollOffset(offset);
793 root_layer_scroll_offset_delegate_->SetMaxScrollOffset(
794 TotalMaxScrollOffset());
795 }
796
797 gfx::Vector2dF LayerTreeImpl::GetDelegatedScrollOffset(LayerImpl* layer) {
798 DCHECK(root_layer_scroll_offset_delegate_);
799 DCHECK(InnerViewportScrollLayer());
800 if (layer == InnerViewportScrollLayer() && !OuterViewportScrollLayer())
801 return root_layer_scroll_offset_delegate_->GetTotalScrollOffset();
802
803 // If we get here, we have both inner/outer viewports, and need to distribute
804 // the scroll offset between them.
805 DCHECK(inner_viewport_scroll_delegate_proxy_);
806 DCHECK(outer_viewport_scroll_delegate_proxy_);
807 gfx::Vector2dF inner_viewport_offset =
808 inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
809 gfx::Vector2dF outer_viewport_offset =
810 outer_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
811
812 // It may be nothing has changed.
813 gfx::Vector2dF delegate_offset =
814 root_layer_scroll_offset_delegate_->GetTotalScrollOffset();
815 if (inner_viewport_offset + outer_viewport_offset == delegate_offset) {
816 if (layer == InnerViewportScrollLayer())
817 return inner_viewport_offset;
818 else
819 return outer_viewport_offset;
820 }
821
822 gfx::Vector2d max_outer_viewport_scroll_offset =
823 OuterViewportScrollLayer()->MaxScrollOffset();
824
825 outer_viewport_offset = delegate_offset - inner_viewport_offset;
826 outer_viewport_offset.SetToMin(max_outer_viewport_scroll_offset);
827 outer_viewport_offset.SetToMax(gfx::Vector2d());
828
829 if (layer == OuterViewportScrollLayer())
830 return outer_viewport_offset;
831
832 inner_viewport_offset = delegate_offset - outer_viewport_offset;
833
834 return inner_viewport_offset;
835 }
836
837 // TODO(wjmaclean) Rename this function, as we no longer have a
838 // "RootScrollLayer".
679 void LayerTreeImpl::UpdateRootScrollLayerSizeDelta() { 839 void LayerTreeImpl::UpdateRootScrollLayerSizeDelta() {
680 LayerImpl* root_scroll = RootScrollLayer(); 840 // TODO(wjmaclean) verify this is really the right thing to do in cases where
841 // the pinch virtual viewport is active.
842 LayerImpl* root_scroll = InnerViewportScrollLayer();
681 LayerImpl* root_container = RootContainerLayer(); 843 LayerImpl* root_container = RootContainerLayer();
682 DCHECK(root_scroll); 844 DCHECK(root_scroll);
683 DCHECK(root_container); 845 DCHECK(root_container);
684 DCHECK(IsActiveTree()); 846 DCHECK(IsActiveTree());
685 847
686 gfx::Vector2dF scrollable_viewport_size = 848 gfx::Vector2dF scrollable_viewport_size =
687 gfx::RectF(ScrollableViewportSize()).bottom_right() - gfx::PointF(); 849 gfx::RectF(ScrollableViewportSize()).bottom_right() - gfx::PointF();
688 850
689 gfx::Vector2dF original_viewport_size = 851 gfx::Vector2dF original_viewport_size =
690 gfx::RectF(root_container->bounds()).bottom_right() - 852 gfx::RectF(root_container->bounds()).bottom_right() -
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
790 const std::vector<LayerImpl*>& LayerTreeImpl::LayersWithCopyOutputRequest() 952 const std::vector<LayerImpl*>& LayerTreeImpl::LayersWithCopyOutputRequest()
791 const { 953 const {
792 // Only the active tree needs to know about layers with copy requests, as 954 // Only the active tree needs to know about layers with copy requests, as
793 // they are aborted if not serviced during draw. 955 // they are aborted if not serviced during draw.
794 DCHECK(IsActiveTree()); 956 DCHECK(IsActiveTree());
795 957
796 return layers_with_copy_output_request_; 958 return layers_with_copy_output_request_;
797 } 959 }
798 960
799 } // namespace cc 961 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698