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

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: Remove content_bounds() usage, fix unit test. Created 6 years, 11 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 {
enne (OOO) 2014/01/21 19:00:06 I am not sure that I follow the need for this prox
wjmaclean 2014/01/21 22:37:27 OK.
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(const gfx::SizeF& scrollable_size) OVERRIDE {
62 // TODO(wjmaclean) put something here?
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
267 namespace {
268
269 void ForceScrollbarParameterUpdateAfterScaleChange(LayerImpl* current_layer) {
270 if (!current_layer)
271 return;
272
273 while (current_layer) {
274 current_layer->ScrollbarParametersDidChange();
275 current_layer = current_layer->parent();
276 }
277 }
278
279 } // namespace
280
193 void LayerTreeImpl::SetPageScaleFactorAndLimits(float page_scale_factor, 281 void LayerTreeImpl::SetPageScaleFactorAndLimits(float page_scale_factor,
194 float min_page_scale_factor, float max_page_scale_factor) { 282 float min_page_scale_factor, float max_page_scale_factor) {
195 if (!page_scale_factor) 283 if (!page_scale_factor)
196 return; 284 return;
197 285
198 min_page_scale_factor_ = min_page_scale_factor; 286 min_page_scale_factor_ = min_page_scale_factor;
199 max_page_scale_factor_ = max_page_scale_factor; 287 max_page_scale_factor_ = max_page_scale_factor;
200 page_scale_factor_ = page_scale_factor; 288 page_scale_factor_ = page_scale_factor;
201 289
202 if (root_layer_scroll_offset_delegate_) { 290 if (root_layer_scroll_offset_delegate_) {
203 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactor( 291 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactor(
204 total_page_scale_factor()); 292 total_page_scale_factor());
205 } 293 }
294
295 ForceScrollbarParameterUpdateAfterScaleChange(page_scale_layer());
206 } 296 }
207 297
208 void LayerTreeImpl::SetPageScaleDelta(float delta) { 298 void LayerTreeImpl::SetPageScaleDelta(float delta) {
209 // Clamp to the current min/max limits. 299 // Clamp to the current min/max limits.
210 float total = page_scale_factor_ * delta; 300 float total = page_scale_factor_ * delta;
211 if (min_page_scale_factor_ && total < min_page_scale_factor_) 301 if (min_page_scale_factor_ && total < min_page_scale_factor_)
212 delta = min_page_scale_factor_ / page_scale_factor_; 302 delta = min_page_scale_factor_ / page_scale_factor_;
213 else if (max_page_scale_factor_ && total > max_page_scale_factor_) 303 else if (max_page_scale_factor_ && total > max_page_scale_factor_)
214 delta = max_page_scale_factor_ / page_scale_factor_; 304 delta = max_page_scale_factor_ / page_scale_factor_;
215 305
216 if (delta == page_scale_delta_) 306 if (delta == page_scale_delta_)
217 return; 307 return;
218 308
219 page_scale_delta_ = delta; 309 page_scale_delta_ = delta;
220 310
221 if (IsActiveTree()) { 311 if (IsActiveTree()) {
222 LayerTreeImpl* pending_tree = layer_tree_host_impl_->pending_tree(); 312 LayerTreeImpl* pending_tree = layer_tree_host_impl_->pending_tree();
223 if (pending_tree) { 313 if (pending_tree) {
224 DCHECK_EQ(1, pending_tree->sent_page_scale_delta()); 314 DCHECK_EQ(1, pending_tree->sent_page_scale_delta());
225 pending_tree->SetPageScaleDelta( 315 pending_tree->SetPageScaleDelta(
226 page_scale_delta_ / sent_page_scale_delta_); 316 page_scale_delta_ / sent_page_scale_delta_);
227 } 317 }
228 } 318 }
229 319
230 UpdateMaxScrollOffset();
231 set_needs_update_draw_properties(); 320 set_needs_update_draw_properties();
232 321
233 if (root_layer_scroll_offset_delegate_) { 322 if (root_layer_scroll_offset_delegate_) {
234 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactor( 323 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactor(
235 total_page_scale_factor()); 324 total_page_scale_factor());
236 } 325 }
237 } 326 }
238 327
239 gfx::SizeF LayerTreeImpl::ScrollableViewportSize() const { 328 gfx::SizeF LayerTreeImpl::ScrollableViewportSize() const {
240 return gfx::ScaleSize(layer_tree_host_impl_->UnscaledScrollableViewportSize(), 329 if (outer_viewport_scroll_layer_)
241 1.0f / total_page_scale_factor()); 330 return layer_tree_host_impl_->UnscaledScrollableViewportSize();
331 else
332 return gfx::ScaleSize(
333 layer_tree_host_impl_->UnscaledScrollableViewportSize(),
334 1.0f / total_page_scale_factor());
242 } 335 }
243 336
244 gfx::Rect LayerTreeImpl::RootScrollLayerDeviceViewportBounds() const { 337 gfx::Rect LayerTreeImpl::RootScrollLayerDeviceViewportBounds() const {
245 if (!root_scroll_layer_ || root_scroll_layer_->children().empty()) 338 LayerImpl* root_scroll_layer =
339 OuterViewportScrollLayer() ? OuterViewportScrollLayer()
340 : InnerViewportScrollLayer();
341 if (!root_scroll_layer || root_scroll_layer->children().empty())
246 return gfx::Rect(); 342 return gfx::Rect();
247 LayerImpl* layer = root_scroll_layer_->children()[0]; 343 LayerImpl* layer = root_scroll_layer->children()[0];
248 return MathUtil::MapClippedRect( 344 return MathUtil::MapClippedRect(
249 layer->screen_space_transform(), 345 layer->screen_space_transform(),
250 gfx::Rect(layer->content_bounds())); 346 gfx::Rect(layer->content_bounds()));
251 } 347 }
252 348
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) { 349 static void ApplySentScrollDeltasFromAbortedCommitTo(LayerImpl* layer) {
269 layer->ApplySentScrollDeltasFromAbortedCommit(); 350 layer->ApplySentScrollDeltasFromAbortedCommit();
270 } 351 }
271 352
272 void LayerTreeImpl::ApplySentScrollAndScaleDeltasFromAbortedCommit() { 353 void LayerTreeImpl::ApplySentScrollAndScaleDeltasFromAbortedCommit() {
273 DCHECK(IsActiveTree()); 354 DCHECK(IsActiveTree());
274 355
275 page_scale_factor_ *= sent_page_scale_delta_; 356 page_scale_factor_ *= sent_page_scale_delta_;
276 page_scale_delta_ /= sent_page_scale_delta_; 357 page_scale_delta_ /= sent_page_scale_delta_;
277 sent_page_scale_delta_ = 1.f; 358 sent_page_scale_delta_ = 1.f;
(...skipping 26 matching lines...) Expand all
304 DCHECK(page_scale_layer_); 385 DCHECK(page_scale_layer_);
305 386
306 inner_viewport_scroll_layer_ = 387 inner_viewport_scroll_layer_ =
307 LayerById(inner_viewport_scroll_layer_id); 388 LayerById(inner_viewport_scroll_layer_id);
308 DCHECK(inner_viewport_scroll_layer_); 389 DCHECK(inner_viewport_scroll_layer_);
309 390
310 outer_viewport_scroll_layer_ = 391 outer_viewport_scroll_layer_ =
311 LayerById(outer_viewport_scroll_layer_id); 392 LayerById(outer_viewport_scroll_layer_id);
312 DCHECK(outer_viewport_scroll_layer_ || 393 DCHECK(outer_viewport_scroll_layer_ ||
313 outer_viewport_scroll_layer_id == Layer::INVALID_ID); 394 outer_viewport_scroll_layer_id == Layer::INVALID_ID);
395
396 if (!root_layer_scroll_offset_delegate_)
397 return;
398
399 inner_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
400 new LayerScrollOffsetDelegateProxy(inner_viewport_scroll_layer_,
401 root_layer_scroll_offset_delegate_,
402 this));
403
404 if (outer_viewport_scroll_layer_)
405 outer_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
406 new LayerScrollOffsetDelegateProxy(outer_viewport_scroll_layer_,
407 root_layer_scroll_offset_delegate_,
408 this));
314 } 409 }
315 410
316 void LayerTreeImpl::ClearViewportLayers() { 411 void LayerTreeImpl::ClearViewportLayers() {
317 page_scale_layer_ = NULL; 412 page_scale_layer_ = NULL;
318 inner_viewport_scroll_layer_ = NULL; 413 inner_viewport_scroll_layer_ = NULL;
319 outer_viewport_scroll_layer_ = NULL; 414 outer_viewport_scroll_layer_ = NULL;
320 } 415 }
321 416
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() { 417 void LayerTreeImpl::UpdateDrawProperties() {
353 if (IsActiveTree() && RootScrollLayer() && RootContainerLayer()) 418 if (IsActiveTree() && RootContainerLayer())
354 UpdateRootScrollLayerSizeDelta(); 419 UpdateRootScrollLayerSizeDelta();
355 420
356 if (IsActiveTree() && RootContainerLayer())
357 UpdateSolidColorScrollbars();
358
359 needs_update_draw_properties_ = false; 421 needs_update_draw_properties_ = false;
360 render_surface_layer_list_.clear(); 422 render_surface_layer_list_.clear();
361 423
362 // For max_texture_size. 424 // For max_texture_size.
363 if (!layer_tree_host_impl_->renderer()) 425 if (!layer_tree_host_impl_->renderer())
364 return; 426 return;
365 427
366 if (!root_layer()) 428 if (!root_layer())
367 return; 429 return;
368 430
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 "CalcDrawProperties should not set_needs_update_draw_properties()"; 489 "CalcDrawProperties should not set_needs_update_draw_properties()";
428 } 490 }
429 491
430 const LayerImplList& LayerTreeImpl::RenderSurfaceLayerList() const { 492 const LayerImplList& LayerTreeImpl::RenderSurfaceLayerList() const {
431 // If this assert triggers, then the list is dirty. 493 // If this assert triggers, then the list is dirty.
432 DCHECK(!needs_update_draw_properties_); 494 DCHECK(!needs_update_draw_properties_);
433 return render_surface_layer_list_; 495 return render_surface_layer_list_;
434 } 496 }
435 497
436 gfx::Size LayerTreeImpl::ScrollableSize() const { 498 gfx::Size LayerTreeImpl::ScrollableSize() const {
437 if (!root_scroll_layer_ || root_scroll_layer_->children().empty()) 499 LayerImpl* root_scroll_layer = OuterViewportScrollLayer() ?
500 OuterViewportScrollLayer() : InnerViewportScrollLayer();
501 if (!root_scroll_layer || root_scroll_layer->children().empty())
438 return gfx::Size(); 502 return gfx::Size();
439 return root_scroll_layer_->children()[0]->bounds(); 503 return root_scroll_layer->children()[0]->bounds();
440 } 504 }
441 505
442 LayerImpl* LayerTreeImpl::LayerById(int id) { 506 LayerImpl* LayerTreeImpl::LayerById(int id) {
443 LayerIdMap::iterator iter = layer_id_map_.find(id); 507 LayerIdMap::iterator iter = layer_id_map_.find(id);
444 return iter != layer_id_map_.end() ? iter->second : NULL; 508 return iter != layer_id_map_.end() ? iter->second : NULL;
445 } 509 }
446 510
447 void LayerTreeImpl::RegisterLayer(LayerImpl* layer) { 511 void LayerTreeImpl::RegisterLayer(LayerImpl* layer) {
448 DCHECK(!LayerById(layer->id())); 512 DCHECK(!LayerById(layer->id()));
449 layer_id_map_[layer->id()] = layer; 513 layer_id_map_[layer->id()] = layer;
(...skipping 13 matching lines...) Expand all
463 static void DidBecomeActiveRecursive(LayerImpl* layer) { 527 static void DidBecomeActiveRecursive(LayerImpl* layer) {
464 layer->DidBecomeActive(); 528 layer->DidBecomeActive();
465 for (size_t i = 0; i < layer->children().size(); ++i) 529 for (size_t i = 0; i < layer->children().size(); ++i)
466 DidBecomeActiveRecursive(layer->children()[i]); 530 DidBecomeActiveRecursive(layer->children()[i]);
467 } 531 }
468 532
469 void LayerTreeImpl::DidBecomeActive() { 533 void LayerTreeImpl::DidBecomeActive() {
470 if (!root_layer()) 534 if (!root_layer())
471 return; 535 return;
472 536
537 if (scrolling_layer_id_from_previous_tree_) {
538 currently_scrolling_layer_ = LayerTreeHostCommon::FindLayerInSubtree(
539 root_layer_.get(),
540 scrolling_layer_id_from_previous_tree_);
541 }
542
473 DidBecomeActiveRecursive(root_layer()); 543 DidBecomeActiveRecursive(root_layer());
474 FindRootScrollLayer();
475 } 544 }
476 545
477 bool LayerTreeImpl::ContentsTexturesPurged() const { 546 bool LayerTreeImpl::ContentsTexturesPurged() const {
478 return contents_textures_purged_; 547 return contents_textures_purged_;
479 } 548 }
480 549
481 void LayerTreeImpl::SetContentsTexturesPurged() { 550 void LayerTreeImpl::SetContentsTexturesPurged() {
482 if (contents_textures_purged_) 551 if (contents_textures_purged_)
483 return; 552 return;
484 contents_textures_purged_ = true; 553 contents_textures_purged_ = true;
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
655 state->Set("render_surface_layer_list", 724 state->Set("render_surface_layer_list",
656 render_surface_layer_list.release()); 725 render_surface_layer_list.release());
657 return state.PassAs<base::Value>(); 726 return state.PassAs<base::Value>();
658 } 727 }
659 728
660 void LayerTreeImpl::SetRootLayerScrollOffsetDelegate( 729 void LayerTreeImpl::SetRootLayerScrollOffsetDelegate(
661 LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) { 730 LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) {
662 if (root_layer_scroll_offset_delegate_ == root_layer_scroll_offset_delegate) 731 if (root_layer_scroll_offset_delegate_ == root_layer_scroll_offset_delegate)
663 return; 732 return;
664 733
734 if (!root_layer_scroll_offset_delegate) {
735 // Make sure we remove the proxies from their layers before
736 // releasing them.
737 if (InnerViewportScrollLayer())
738 InnerViewportScrollLayer()->SetScrollOffsetDelegate(NULL);
739 if (OuterViewportScrollLayer())
740 OuterViewportScrollLayer()->SetScrollOffsetDelegate(NULL);
741 inner_viewport_scroll_delegate_proxy_.reset();
742 outer_viewport_scroll_delegate_proxy_.reset();
743 }
744
665 root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate; 745 root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate;
666 746
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_) { 747 if (root_layer_scroll_offset_delegate_) {
748 root_layer_scroll_offset_delegate_->SetTotalScrollOffset(
749 TotalScrollOffset());
750 root_layer_scroll_offset_delegate_->SetMaxScrollOffset(
751 TotalMaxScrollOffset());
673 root_layer_scroll_offset_delegate_->SetScrollableSize(ScrollableSize()); 752 root_layer_scroll_offset_delegate_->SetScrollableSize(ScrollableSize());
674 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactor( 753 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactor(
675 total_page_scale_factor()); 754 total_page_scale_factor());
755
756 if (inner_viewport_scroll_layer_) {
757 inner_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
758 new LayerScrollOffsetDelegateProxy(InnerViewportScrollLayer(),
759 root_layer_scroll_offset_delegate_,
760 this));
761 inner_viewport_scroll_layer_->SetScrollOffsetDelegate(
762 inner_viewport_scroll_delegate_proxy_.get());
763 }
764
765 if (outer_viewport_scroll_layer_) {
766 outer_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
767 new LayerScrollOffsetDelegateProxy(OuterViewportScrollLayer(),
768 root_layer_scroll_offset_delegate_,
769 this));
770 outer_viewport_scroll_layer_->SetScrollOffsetDelegate(
771 outer_viewport_scroll_delegate_proxy_.get());
772 }
676 } 773 }
677 } 774 }
678 775
776 void LayerTreeImpl::UpdateScrollOffsetDelegate() {
777 DCHECK(InnerViewportScrollLayer());
778 DCHECK(root_layer_scroll_offset_delegate_);
779
780 gfx::Vector2dF offset =
781 inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
782
783 if (OuterViewportScrollLayer())
784 offset +=
785 outer_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
786
787 root_layer_scroll_offset_delegate_->SetTotalScrollOffset(offset);
788 root_layer_scroll_offset_delegate_->SetMaxScrollOffset(
789 TotalMaxScrollOffset());
790 }
791
792 gfx::Vector2dF LayerTreeImpl::GetDelegatedScrollOffset(LayerImpl* layer) {
793 DCHECK(root_layer_scroll_offset_delegate_);
794 DCHECK(InnerViewportScrollLayer());
795 if (layer == InnerViewportScrollLayer() && !OuterViewportScrollLayer())
796 return root_layer_scroll_offset_delegate_->GetTotalScrollOffset();
797
798 // If we get here, we have both inner/outer viewports, and need to distribute
799 // the scroll offset between them.
800 DCHECK(inner_viewport_scroll_delegate_proxy_);
801 DCHECK(outer_viewport_scroll_delegate_proxy_);
802 gfx::Vector2dF inner_viewport_offset =
803 inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
804 gfx::Vector2dF outer_viewport_offset =
805 outer_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
806
807 // It may be nothing has changed.
808 gfx::Vector2dF delegate_offset =
809 root_layer_scroll_offset_delegate_->GetTotalScrollOffset();
810 if (inner_viewport_offset + outer_viewport_offset == delegate_offset) {
811 if (layer == InnerViewportScrollLayer())
812 return inner_viewport_offset;
813 else
814 return outer_viewport_offset;
815 }
816
817 gfx::Vector2d max_outer_viewport_scroll_offset =
818 OuterViewportScrollLayer()->MaxScrollOffset();
819
820 outer_viewport_offset = delegate_offset - inner_viewport_offset;
821 outer_viewport_offset.SetToMin(max_outer_viewport_scroll_offset);
822 outer_viewport_offset.SetToMax(gfx::Vector2d());
823
824 if (layer == OuterViewportScrollLayer())
825 return outer_viewport_offset;
826
827 inner_viewport_offset = delegate_offset - outer_viewport_offset;
828
829 return inner_viewport_offset;
830 }
831
832 // TODO(wjmaclean) Rename this function, as we no longer have a
833 // "RootScrollLayer".
679 void LayerTreeImpl::UpdateRootScrollLayerSizeDelta() { 834 void LayerTreeImpl::UpdateRootScrollLayerSizeDelta() {
680 LayerImpl* root_scroll = RootScrollLayer(); 835 // TODO(wjmaclean) verify this is really the right thing to do in cases where
836 // the pinch virtual viewport is active.
837 LayerImpl* root_scroll = InnerViewportScrollLayer();
681 LayerImpl* root_container = RootContainerLayer(); 838 LayerImpl* root_container = RootContainerLayer();
682 DCHECK(root_scroll); 839 DCHECK(root_scroll);
683 DCHECK(root_container); 840 DCHECK(root_container);
684 DCHECK(IsActiveTree()); 841 DCHECK(IsActiveTree());
685 842
686 gfx::Vector2dF scrollable_viewport_size = 843 gfx::Vector2dF scrollable_viewport_size =
687 gfx::RectF(ScrollableViewportSize()).bottom_right() - gfx::PointF(); 844 gfx::RectF(ScrollableViewportSize()).bottom_right() - gfx::PointF();
688 845
689 gfx::Vector2dF original_viewport_size = 846 gfx::Vector2dF original_viewport_size =
690 gfx::RectF(root_container->bounds()).bottom_right() - 847 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() 947 const std::vector<LayerImpl*>& LayerTreeImpl::LayersWithCopyOutputRequest()
791 const { 948 const {
792 // Only the active tree needs to know about layers with copy requests, as 949 // Only the active tree needs to know about layers with copy requests, as
793 // they are aborted if not serviced during draw. 950 // they are aborted if not serviced during draw.
794 DCHECK(IsActiveTree()); 951 DCHECK(IsActiveTree());
795 952
796 return layers_with_copy_output_request_; 953 return layers_with_copy_output_request_;
797 } 954 }
798 955
799 } // namespace cc 956 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698