| OLD | NEW |
| 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/debug/traced_value.h" | 10 #include "cc/debug/traced_value.h" |
| 11 #include "cc/layers/heads_up_display_layer_impl.h" | 11 #include "cc/layers/heads_up_display_layer_impl.h" |
| 12 #include "cc/layers/layer.h" | 12 #include "cc/layers/layer.h" |
| 13 #include "cc/layers/render_surface_impl.h" | 13 #include "cc/layers/render_surface_impl.h" |
| 14 #include "cc/layers/scrollbar_layer_impl_base.h" | 14 #include "cc/layers/scrollbar_layer_impl_base.h" |
| 15 #include "cc/trees/layer_tree_host_common.h" | 15 #include "cc/trees/layer_tree_host_common.h" |
| 16 #include "cc/trees/layer_tree_host_impl.h" | 16 #include "cc/trees/layer_tree_host_impl.h" |
| 17 #include "ui/gfx/size_conversions.h" | 17 #include "ui/gfx/size_conversions.h" |
| 18 #include "ui/gfx/vector2d_conversions.h" | 18 #include "ui/gfx/vector2d_conversions.h" |
| 19 | 19 |
| 20 namespace cc { | 20 namespace cc { |
| 21 | 21 |
| 22 LayerTreeImpl::LayerTreeImpl(LayerTreeHostImpl* layer_tree_host_impl) | 22 LayerTreeImpl::LayerTreeImpl(LayerTreeHostImpl* layer_tree_host_impl) |
| 23 : layer_tree_host_impl_(layer_tree_host_impl), | 23 : layer_tree_host_impl_(layer_tree_host_impl), |
| 24 source_frame_number_(-1), | 24 source_frame_number_(-1), |
| 25 hud_layer_(0), | 25 hud_layer_(0), |
| 26 root_scroll_layer_(NULL), | |
| 27 currently_scrolling_layer_(NULL), | 26 currently_scrolling_layer_(NULL), |
| 28 root_layer_scroll_offset_delegate_(NULL), | 27 root_layer_scroll_offset_delegate_(NULL), |
| 29 background_color_(0), | 28 background_color_(0), |
| 30 has_transparent_background_(false), | 29 has_transparent_background_(false), |
| 31 page_scale_layer_(NULL), | 30 page_scale_layer_(NULL), |
| 32 inner_viewport_scroll_layer_(NULL), | 31 inner_viewport_scroll_layer_(NULL), |
| 33 outer_viewport_scroll_layer_(NULL), | 32 outer_viewport_scroll_layer_(NULL), |
| 34 page_scale_factor_(1), | 33 page_scale_factor_(1), |
| 35 page_scale_delta_(1), | 34 page_scale_delta_(1), |
| 36 sent_page_scale_delta_(1), | 35 sent_page_scale_delta_(1), |
| 37 min_page_scale_factor_(0), | 36 min_page_scale_factor_(0), |
| 38 max_page_scale_factor_(0), | 37 max_page_scale_factor_(0), |
| 39 scrolling_layer_id_from_previous_tree_(0), | 38 scrolling_layer_id_from_previous_tree_(0), |
| 40 contents_textures_purged_(false), | 39 contents_textures_purged_(false), |
| 41 viewport_size_invalid_(false), | 40 viewport_size_invalid_(false), |
| 42 needs_update_draw_properties_(true), | 41 needs_update_draw_properties_(true), |
| 43 needs_full_tree_sync_(true), | 42 needs_full_tree_sync_(true), |
| 44 next_activation_forces_redraw_(false) { | 43 next_activation_forces_redraw_(false) { |
| 45 } | 44 } |
| 46 | 45 |
| 47 LayerTreeImpl::~LayerTreeImpl() { | 46 LayerTreeImpl::~LayerTreeImpl() { |
| 48 // Need to explicitly clear the tree prior to destroying this so that | 47 // Need to explicitly clear the tree prior to destroying this so that |
| 49 // the LayerTreeImpl pointer is still valid in the LayerImpl dtor. | 48 // the LayerTreeImpl pointer is still valid in the LayerImpl dtor. |
| 50 root_layer_.reset(); | 49 root_layer_.reset(); |
| 51 } | 50 } |
| 52 | 51 |
| 53 static LayerImpl* FindRootScrollLayerRecursive(LayerImpl* layer) { | 52 void LayerTreeImpl::SetRootLayer(scoped_ptr<LayerImpl> layer) { |
| 54 if (!layer) | 53 if (inner_viewport_scroll_layer_) |
| 55 return NULL; | 54 inner_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL); |
| 55 if (outer_viewport_scroll_layer_) |
| 56 outer_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL); |
| 56 | 57 |
| 57 if (layer->scrollable()) | |
| 58 return layer; | |
| 59 | |
| 60 for (size_t i = 0; i < layer->children().size(); ++i) { | |
| 61 LayerImpl* found = FindRootScrollLayerRecursive(layer->children()[i]); | |
| 62 if (found) | |
| 63 return found; | |
| 64 } | |
| 65 | |
| 66 return NULL; | |
| 67 } | |
| 68 | |
| 69 void LayerTreeImpl::SetRootLayer(scoped_ptr<LayerImpl> layer) { | |
| 70 if (root_scroll_layer_) | |
| 71 root_scroll_layer_->SetScrollOffsetDelegate(NULL); | |
| 72 root_layer_ = layer.Pass(); | 58 root_layer_ = layer.Pass(); |
| 73 currently_scrolling_layer_ = NULL; | 59 currently_scrolling_layer_ = NULL; |
| 74 root_scroll_layer_ = NULL; | 60 inner_viewport_scroll_layer_ = NULL; |
| 61 outer_viewport_scroll_layer_ = NULL; |
| 62 page_scale_layer_ = NULL; |
| 75 | 63 |
| 76 layer_tree_host_impl_->OnCanDrawStateChangedForTree(); | 64 layer_tree_host_impl_->OnCanDrawStateChangedForTree(); |
| 77 } | 65 } |
| 78 | 66 |
| 79 void LayerTreeImpl::FindRootScrollLayer() { | 67 LayerImpl* LayerTreeImpl::InnerViewportScrollLayer() const { |
| 80 root_scroll_layer_ = FindRootScrollLayerRecursive(root_layer_.get()); | 68 return inner_viewport_scroll_layer_; |
| 69 } |
| 81 | 70 |
| 82 if (root_scroll_layer_) { | 71 LayerImpl* LayerTreeImpl::OuterViewportScrollLayer() const { |
| 83 UpdateMaxScrollOffset(); | 72 return outer_viewport_scroll_layer_; |
| 84 root_scroll_layer_->SetScrollOffsetDelegate( | 73 } |
| 85 root_layer_scroll_offset_delegate_); | |
| 86 } | |
| 87 | 74 |
| 88 if (scrolling_layer_id_from_previous_tree_) { | 75 gfx::Vector2dF LayerTreeImpl::TotalScrollOffset() const { |
| 89 currently_scrolling_layer_ = LayerTreeHostCommon::FindLayerInSubtree( | 76 gfx::Vector2dF offset; |
| 90 root_layer_.get(), | |
| 91 scrolling_layer_id_from_previous_tree_); | |
| 92 } | |
| 93 | 77 |
| 94 scrolling_layer_id_from_previous_tree_ = 0; | 78 if (inner_viewport_scroll_layer_) |
| 79 offset += inner_viewport_scroll_layer_->TotalScrollOffset(); |
| 80 |
| 81 if (outer_viewport_scroll_layer_) |
| 82 offset += outer_viewport_scroll_layer_->TotalScrollOffset(); |
| 83 |
| 84 return offset; |
| 85 } |
| 86 |
| 87 gfx::Vector2dF LayerTreeImpl::TotalMaxScrollOffset() const { |
| 88 gfx::Vector2dF offset; |
| 89 |
| 90 if (inner_viewport_scroll_layer_) |
| 91 offset += inner_viewport_scroll_layer_->MaxScrollOffset(); |
| 92 |
| 93 if (outer_viewport_scroll_layer_) |
| 94 offset += outer_viewport_scroll_layer_->MaxScrollOffset(); |
| 95 |
| 96 return offset; |
| 97 } |
| 98 gfx::Vector2dF LayerTreeImpl::TotalScrollDelta() const { |
| 99 DCHECK(inner_viewport_scroll_layer_); |
| 100 gfx::Vector2dF delta = inner_viewport_scroll_layer_->ScrollDelta(); |
| 101 |
| 102 if (outer_viewport_scroll_layer_) |
| 103 delta += outer_viewport_scroll_layer_->ScrollDelta(); |
| 104 |
| 105 return delta; |
| 95 } | 106 } |
| 96 | 107 |
| 97 scoped_ptr<LayerImpl> LayerTreeImpl::DetachLayerTree() { | 108 scoped_ptr<LayerImpl> LayerTreeImpl::DetachLayerTree() { |
| 98 // Clear all data structures that have direct references to the layer tree. | 109 // Clear all data structures that have direct references to the layer tree. |
| 99 scrolling_layer_id_from_previous_tree_ = | 110 scrolling_layer_id_from_previous_tree_ = |
| 100 currently_scrolling_layer_ ? currently_scrolling_layer_->id() : 0; | 111 currently_scrolling_layer_ ? currently_scrolling_layer_->id() : 0; |
| 101 if (root_scroll_layer_) | 112 if (inner_viewport_scroll_layer_) |
| 102 root_scroll_layer_->SetScrollOffsetDelegate(NULL); | 113 inner_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL); |
| 103 root_scroll_layer_ = NULL; | 114 if (outer_viewport_scroll_layer_) |
| 115 outer_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL); |
| 116 inner_viewport_scroll_layer_ = NULL; |
| 117 outer_viewport_scroll_layer_ = NULL; |
| 118 page_scale_layer_ = NULL; |
| 104 currently_scrolling_layer_ = NULL; | 119 currently_scrolling_layer_ = NULL; |
| 105 | 120 |
| 106 render_surface_layer_list_.clear(); | 121 render_surface_layer_list_.clear(); |
| 107 set_needs_update_draw_properties(); | 122 set_needs_update_draw_properties(); |
| 108 return root_layer_.Pass(); | 123 return root_layer_.Pass(); |
| 109 } | 124 } |
| 110 | 125 |
| 111 void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) { | 126 void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) { |
| 112 // The request queue should have been processed and does not require a push. | 127 // The request queue should have been processed and does not require a push. |
| 113 DCHECK_EQ(ui_resource_request_queue_.size(), 0u); | 128 DCHECK_EQ(ui_resource_request_queue_.size(), 0u); |
| 114 | 129 |
| 115 if (next_activation_forces_redraw_) { | 130 if (next_activation_forces_redraw_) { |
| 116 layer_tree_host_impl_->SetFullRootLayerDamage(); | 131 layer_tree_host_impl_->SetFullRootLayerDamage(); |
| 117 next_activation_forces_redraw_ = false; | 132 next_activation_forces_redraw_ = false; |
| 118 } | 133 } |
| 119 | 134 |
| 120 target_tree->SetLatencyInfo(latency_info_); | 135 target_tree->SetLatencyInfo(latency_info_); |
| 121 latency_info_.Clear(); | 136 latency_info_.Clear(); |
| 122 target_tree->SetPageScaleFactorAndLimits( | 137 target_tree->SetPageScaleFactorAndLimits( |
| 123 page_scale_factor(), min_page_scale_factor(), max_page_scale_factor()); | 138 page_scale_factor(), min_page_scale_factor(), max_page_scale_factor()); |
| 124 target_tree->SetPageScaleDelta( | 139 target_tree->SetPageScaleDelta( |
| 125 target_tree->page_scale_delta() / target_tree->sent_page_scale_delta()); | 140 target_tree->page_scale_delta() / target_tree->sent_page_scale_delta()); |
| 126 target_tree->set_sent_page_scale_delta(1); | 141 target_tree->set_sent_page_scale_delta(1); |
| 127 | 142 |
| 128 if (settings().use_pinch_virtual_viewport) { | 143 if (page_scale_layer_ && inner_viewport_scroll_layer_) { |
| 129 target_tree->SetViewportLayersFromIds( | 144 target_tree->SetViewportLayersFromIds( |
| 130 page_scale_layer_->id(), | 145 page_scale_layer_->id(), |
| 131 inner_viewport_scroll_layer_->id(), | 146 inner_viewport_scroll_layer_->id(), |
| 132 outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id() | 147 outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id() |
| 133 : Layer::INVALID_ID); | 148 : Layer::INVALID_ID); |
| 149 } else { |
| 150 target_tree->ClearViewportLayers(); |
| 134 } | 151 } |
| 135 // This should match the property synchronization in | 152 // This should match the property synchronization in |
| 136 // LayerTreeHost::finishCommitOnImplThread(). | 153 // LayerTreeHost::finishCommitOnImplThread(). |
| 137 target_tree->set_source_frame_number(source_frame_number()); | 154 target_tree->set_source_frame_number(source_frame_number()); |
| 138 target_tree->set_background_color(background_color()); | 155 target_tree->set_background_color(background_color()); |
| 139 target_tree->set_has_transparent_background(has_transparent_background()); | 156 target_tree->set_has_transparent_background(has_transparent_background()); |
| 140 | 157 |
| 141 if (ContentsTexturesPurged()) | 158 if (ContentsTexturesPurged()) |
| 142 target_tree->SetContentsTexturesPurged(); | 159 target_tree->SetContentsTexturesPurged(); |
| 143 else | 160 else |
| 144 target_tree->ResetContentsTexturesPurged(); | 161 target_tree->ResetContentsTexturesPurged(); |
| 145 | 162 |
| 146 if (ViewportSizeInvalid()) | 163 if (ViewportSizeInvalid()) |
| 147 target_tree->SetViewportSizeInvalid(); | 164 target_tree->SetViewportSizeInvalid(); |
| 148 else | 165 else |
| 149 target_tree->ResetViewportSizeInvalid(); | 166 target_tree->ResetViewportSizeInvalid(); |
| 150 | 167 |
| 151 if (hud_layer()) | 168 if (hud_layer()) |
| 152 target_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>( | 169 target_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>( |
| 153 LayerTreeHostCommon::FindLayerInSubtree( | 170 LayerTreeHostCommon::FindLayerInSubtree( |
| 154 target_tree->root_layer(), hud_layer()->id()))); | 171 target_tree->root_layer(), hud_layer()->id()))); |
| 155 else | 172 else |
| 156 target_tree->set_hud_layer(NULL); | 173 target_tree->set_hud_layer(NULL); |
| 157 } | 174 } |
| 158 | 175 |
| 159 LayerImpl* LayerTreeImpl::RootScrollLayer() const { | |
| 160 return root_scroll_layer_; | |
| 161 } | |
| 162 | |
| 163 LayerImpl* LayerTreeImpl::RootContainerLayer() const { | 176 LayerImpl* LayerTreeImpl::RootContainerLayer() const { |
| 164 return root_scroll_layer_ ? root_scroll_layer_->parent() : NULL; | 177 return inner_viewport_scroll_layer_ ? inner_viewport_scroll_layer_->parent() |
| 178 : NULL; |
| 165 } | 179 } |
| 166 | 180 |
| 167 LayerImpl* LayerTreeImpl::CurrentlyScrollingLayer() const { | 181 LayerImpl* LayerTreeImpl::CurrentlyScrollingLayer() const { |
| 168 DCHECK(IsActiveTree()); | 182 DCHECK(IsActiveTree()); |
| 169 return currently_scrolling_layer_; | 183 return currently_scrolling_layer_; |
| 170 } | 184 } |
| 171 | 185 |
| 172 void LayerTreeImpl::SetCurrentlyScrollingLayer(LayerImpl* layer) { | 186 void LayerTreeImpl::SetCurrentlyScrollingLayer(LayerImpl* layer) { |
| 173 if (currently_scrolling_layer_ == layer) | 187 if (currently_scrolling_layer_ == layer) |
| 174 return; | 188 return; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 217 | 231 |
| 218 if (IsActiveTree()) { | 232 if (IsActiveTree()) { |
| 219 LayerTreeImpl* pending_tree = layer_tree_host_impl_->pending_tree(); | 233 LayerTreeImpl* pending_tree = layer_tree_host_impl_->pending_tree(); |
| 220 if (pending_tree) { | 234 if (pending_tree) { |
| 221 DCHECK_EQ(1, pending_tree->sent_page_scale_delta()); | 235 DCHECK_EQ(1, pending_tree->sent_page_scale_delta()); |
| 222 pending_tree->SetPageScaleDelta( | 236 pending_tree->SetPageScaleDelta( |
| 223 page_scale_delta_ / sent_page_scale_delta_); | 237 page_scale_delta_ / sent_page_scale_delta_); |
| 224 } | 238 } |
| 225 } | 239 } |
| 226 | 240 |
| 227 UpdateMaxScrollOffset(); | |
| 228 set_needs_update_draw_properties(); | 241 set_needs_update_draw_properties(); |
| 229 | 242 |
| 230 if (root_layer_scroll_offset_delegate_) { | 243 if (root_layer_scroll_offset_delegate_) { |
| 231 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactor( | 244 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactor( |
| 232 total_page_scale_factor()); | 245 total_page_scale_factor()); |
| 233 } | 246 } |
| 234 } | 247 } |
| 235 | 248 |
| 236 gfx::SizeF LayerTreeImpl::ScrollableViewportSize() const { | 249 gfx::SizeF LayerTreeImpl::ScrollableViewportSize() const { |
| 237 return gfx::ScaleSize(layer_tree_host_impl_->UnscaledScrollableViewportSize(), | 250 if (page_scale_layer_) |
| 238 1.0f / total_page_scale_factor()); | 251 return layer_tree_host_impl_->UnscaledScrollableViewportSize(); |
| 239 } | 252 else |
| 240 | 253 return gfx::ScaleSize( |
| 241 void LayerTreeImpl::UpdateMaxScrollOffset() { | 254 layer_tree_host_impl_->UnscaledScrollableViewportSize(), |
| 242 LayerImpl* root_scroll = RootScrollLayer(); | 255 1.0f / total_page_scale_factor()); |
| 243 if (!root_scroll || !root_scroll->children().size()) | |
| 244 return; | |
| 245 | |
| 246 gfx::Vector2dF max_scroll = gfx::Rect(ScrollableSize()).bottom_right() - | |
| 247 gfx::RectF(ScrollableViewportSize()).bottom_right(); | |
| 248 | |
| 249 // The viewport may be larger than the contents in some cases, such as | |
| 250 // having a vertical scrollbar but no horizontal overflow. | |
| 251 max_scroll.SetToMax(gfx::Vector2dF()); | |
| 252 | |
| 253 root_scroll_layer_->SetMaxScrollOffset(gfx::ToFlooredVector2d(max_scroll)); | |
| 254 } | 256 } |
| 255 | 257 |
| 256 static void ApplySentScrollDeltasFromAbortedCommitTo(LayerImpl* layer) { | 258 static void ApplySentScrollDeltasFromAbortedCommitTo(LayerImpl* layer) { |
| 257 layer->ApplySentScrollDeltasFromAbortedCommit(); | 259 layer->ApplySentScrollDeltasFromAbortedCommit(); |
| 258 } | 260 } |
| 259 | 261 |
| 260 void LayerTreeImpl::ApplySentScrollAndScaleDeltasFromAbortedCommit() { | 262 void LayerTreeImpl::ApplySentScrollAndScaleDeltasFromAbortedCommit() { |
| 261 DCHECK(IsActiveTree()); | 263 DCHECK(IsActiveTree()); |
| 262 | 264 |
| 263 page_scale_factor_ *= sent_page_scale_delta_; | 265 page_scale_factor_ *= sent_page_scale_delta_; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 DCHECK(outer_viewport_scroll_layer_ || | 302 DCHECK(outer_viewport_scroll_layer_ || |
| 301 outer_viewport_scroll_layer_id == Layer::INVALID_ID); | 303 outer_viewport_scroll_layer_id == Layer::INVALID_ID); |
| 302 } | 304 } |
| 303 | 305 |
| 304 void LayerTreeImpl::ClearViewportLayers() { | 306 void LayerTreeImpl::ClearViewportLayers() { |
| 305 page_scale_layer_ = NULL; | 307 page_scale_layer_ = NULL; |
| 306 inner_viewport_scroll_layer_ = NULL; | 308 inner_viewport_scroll_layer_ = NULL; |
| 307 outer_viewport_scroll_layer_ = NULL; | 309 outer_viewport_scroll_layer_ = NULL; |
| 308 } | 310 } |
| 309 | 311 |
| 310 // TODO(wjmaclean) This needs to go away, and be replaced with a single core | |
| 311 // of login that works for both scrollbar layer types. This is already planned | |
| 312 // as part of the larger pinch-zoom re-factoring viewport. | |
| 313 void LayerTreeImpl::UpdateSolidColorScrollbars() { | |
| 314 LayerImpl* root_scroll = RootScrollLayer(); | |
| 315 DCHECK(root_scroll); | |
| 316 DCHECK(IsActiveTree()); | |
| 317 | |
| 318 gfx::RectF scrollable_viewport( | |
| 319 gfx::PointAtOffsetFromOrigin(root_scroll->TotalScrollOffset()), | |
| 320 ScrollableViewportSize()); | |
| 321 float vertical_adjust = 0.0f; | |
| 322 if (RootContainerLayer()) | |
| 323 vertical_adjust = | |
| 324 layer_tree_host_impl_->UnscaledScrollableViewportSize().height() - | |
| 325 RootContainerLayer()->bounds().height(); | |
| 326 if (ScrollbarLayerImplBase* horiz = | |
| 327 root_scroll->horizontal_scrollbar_layer()) { | |
| 328 horiz->SetVerticalAdjust(vertical_adjust); | |
| 329 horiz->SetVisibleToTotalLengthRatio( | |
| 330 scrollable_viewport.width() / ScrollableSize().width()); | |
| 331 } | |
| 332 if (ScrollbarLayerImplBase* vertical = | |
| 333 root_scroll->vertical_scrollbar_layer()) { | |
| 334 vertical->SetVerticalAdjust(vertical_adjust); | |
| 335 vertical->SetVisibleToTotalLengthRatio( | |
| 336 scrollable_viewport.height() / ScrollableSize().height()); | |
| 337 } | |
| 338 } | |
| 339 | |
| 340 void LayerTreeImpl::UpdateDrawProperties() { | 312 void LayerTreeImpl::UpdateDrawProperties() { |
| 341 if (IsActiveTree() && RootScrollLayer() && RootContainerLayer()) | 313 if (IsActiveTree() && RootContainerLayer()) |
| 342 UpdateRootScrollLayerSizeDelta(); | 314 UpdateRootScrollLayerSizeDelta(); |
| 343 | 315 |
| 344 if (IsActiveTree() && | |
| 345 RootContainerLayer() | |
| 346 && !RootContainerLayer()->masks_to_bounds()) { | |
| 347 UpdateSolidColorScrollbars(); | |
| 348 } | |
| 349 | |
| 350 needs_update_draw_properties_ = false; | 316 needs_update_draw_properties_ = false; |
| 351 render_surface_layer_list_.clear(); | 317 render_surface_layer_list_.clear(); |
| 352 | 318 |
| 353 // For max_texture_size. | 319 // For max_texture_size. |
| 354 if (!layer_tree_host_impl_->renderer()) | 320 if (!layer_tree_host_impl_->renderer()) |
| 355 return; | 321 return; |
| 356 | 322 |
| 357 if (!root_layer()) | 323 if (!root_layer()) |
| 358 return; | 324 return; |
| 359 | 325 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 418 "CalcDrawProperties should not set_needs_update_draw_properties()"; | 384 "CalcDrawProperties should not set_needs_update_draw_properties()"; |
| 419 } | 385 } |
| 420 | 386 |
| 421 const LayerImplList& LayerTreeImpl::RenderSurfaceLayerList() const { | 387 const LayerImplList& LayerTreeImpl::RenderSurfaceLayerList() const { |
| 422 // If this assert triggers, then the list is dirty. | 388 // If this assert triggers, then the list is dirty. |
| 423 DCHECK(!needs_update_draw_properties_); | 389 DCHECK(!needs_update_draw_properties_); |
| 424 return render_surface_layer_list_; | 390 return render_surface_layer_list_; |
| 425 } | 391 } |
| 426 | 392 |
| 427 gfx::Size LayerTreeImpl::ScrollableSize() const { | 393 gfx::Size LayerTreeImpl::ScrollableSize() const { |
| 428 if (!root_scroll_layer_ || root_scroll_layer_->children().empty()) | 394 LayerImpl* root_scroll_layer = OuterViewportScrollLayer() ? |
| 395 OuterViewportScrollLayer() : InnerViewportScrollLayer(); |
| 396 if (!root_scroll_layer || root_scroll_layer->children().empty()) |
| 429 return gfx::Size(); | 397 return gfx::Size(); |
| 430 return root_scroll_layer_->children()[0]->bounds(); | 398 return root_scroll_layer->children()[0]->bounds(); |
| 431 } | 399 } |
| 432 | 400 |
| 433 LayerImpl* LayerTreeImpl::LayerById(int id) { | 401 LayerImpl* LayerTreeImpl::LayerById(int id) { |
| 434 LayerIdMap::iterator iter = layer_id_map_.find(id); | 402 LayerIdMap::iterator iter = layer_id_map_.find(id); |
| 435 return iter != layer_id_map_.end() ? iter->second : NULL; | 403 return iter != layer_id_map_.end() ? iter->second : NULL; |
| 436 } | 404 } |
| 437 | 405 |
| 438 void LayerTreeImpl::RegisterLayer(LayerImpl* layer) { | 406 void LayerTreeImpl::RegisterLayer(LayerImpl* layer) { |
| 439 DCHECK(!LayerById(layer->id())); | 407 DCHECK(!LayerById(layer->id())); |
| 440 layer_id_map_[layer->id()] = layer; | 408 layer_id_map_[layer->id()] = layer; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 456 static void DidBecomeActiveRecursive(LayerImpl* layer) { | 424 static void DidBecomeActiveRecursive(LayerImpl* layer) { |
| 457 layer->DidBecomeActive(); | 425 layer->DidBecomeActive(); |
| 458 for (size_t i = 0; i < layer->children().size(); ++i) | 426 for (size_t i = 0; i < layer->children().size(); ++i) |
| 459 DidBecomeActiveRecursive(layer->children()[i]); | 427 DidBecomeActiveRecursive(layer->children()[i]); |
| 460 } | 428 } |
| 461 | 429 |
| 462 void LayerTreeImpl::DidBecomeActive() { | 430 void LayerTreeImpl::DidBecomeActive() { |
| 463 if (!root_layer()) | 431 if (!root_layer()) |
| 464 return; | 432 return; |
| 465 | 433 |
| 434 if (scrolling_layer_id_from_previous_tree_) { |
| 435 currently_scrolling_layer_ = LayerTreeHostCommon::FindLayerInSubtree( |
| 436 root_layer_.get(), |
| 437 scrolling_layer_id_from_previous_tree_); |
| 438 } |
| 439 |
| 466 DidBecomeActiveRecursive(root_layer()); | 440 DidBecomeActiveRecursive(root_layer()); |
| 467 FindRootScrollLayer(); | |
| 468 } | 441 } |
| 469 | 442 |
| 470 bool LayerTreeImpl::ContentsTexturesPurged() const { | 443 bool LayerTreeImpl::ContentsTexturesPurged() const { |
| 471 return contents_textures_purged_; | 444 return contents_textures_purged_; |
| 472 } | 445 } |
| 473 | 446 |
| 474 void LayerTreeImpl::SetContentsTexturesPurged() { | 447 void LayerTreeImpl::SetContentsTexturesPurged() { |
| 475 if (contents_textures_purged_) | 448 if (contents_textures_purged_) |
| 476 return; | 449 return; |
| 477 contents_textures_purged_ = true; | 450 contents_textures_purged_ = true; |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 646 return state.PassAs<base::Value>(); | 619 return state.PassAs<base::Value>(); |
| 647 } | 620 } |
| 648 | 621 |
| 649 void LayerTreeImpl::SetRootLayerScrollOffsetDelegate( | 622 void LayerTreeImpl::SetRootLayerScrollOffsetDelegate( |
| 650 LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) { | 623 LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) { |
| 651 if (root_layer_scroll_offset_delegate_ == root_layer_scroll_offset_delegate) | 624 if (root_layer_scroll_offset_delegate_ == root_layer_scroll_offset_delegate) |
| 652 return; | 625 return; |
| 653 | 626 |
| 654 root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate; | 627 root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate; |
| 655 | 628 |
| 656 if (root_scroll_layer_) { | 629 if (root_layer_scroll_offset_delegate_) { |
| 657 root_scroll_layer_->SetScrollOffsetDelegate( | 630 root_layer_scroll_offset_delegate_->SetTotalScrollOffset(TotalScrollOffset()
); |
| 631 root_layer_scroll_offset_delegate_->SetMaxScrollOffset( |
| 632 TotalMaxScrollOffset()); |
| 633 } |
| 634 |
| 635 if (inner_viewport_scroll_layer_) { |
| 636 inner_viewport_scroll_layer_->SetScrollOffsetDelegate( |
| 658 root_layer_scroll_offset_delegate_); | 637 root_layer_scroll_offset_delegate_); |
| 659 } | 638 } |
| 660 | 639 |
| 640 if (outer_viewport_scroll_layer_) { |
| 641 outer_viewport_scroll_layer_->SetScrollOffsetDelegate( |
| 642 root_layer_scroll_offset_delegate_); |
| 643 } |
| 644 |
| 661 if (root_layer_scroll_offset_delegate_) { | 645 if (root_layer_scroll_offset_delegate_) { |
| 662 root_layer_scroll_offset_delegate_->SetScrollableSize(ScrollableSize()); | 646 root_layer_scroll_offset_delegate_->SetScrollableSize(ScrollableSize()); |
| 663 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactor( | 647 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactor( |
| 664 total_page_scale_factor()); | 648 total_page_scale_factor()); |
| 665 } | 649 } |
| 666 } | 650 } |
| 667 | 651 |
| 652 // TODO(wjmaclean) Rename this function, as we no longer have a |
| 653 // "RootScrollLayer". |
| 668 void LayerTreeImpl::UpdateRootScrollLayerSizeDelta() { | 654 void LayerTreeImpl::UpdateRootScrollLayerSizeDelta() { |
| 669 LayerImpl* root_scroll = RootScrollLayer(); | 655 // TODO(wjmaclean) verify this is really the right thing to do in cases where |
| 656 // the pinch virtual viewport is active. |
| 657 LayerImpl* root_scroll = InnerViewportScrollLayer(); |
| 670 LayerImpl* root_container = RootContainerLayer(); | 658 LayerImpl* root_container = RootContainerLayer(); |
| 671 DCHECK(root_scroll); | 659 DCHECK(root_scroll); |
| 672 DCHECK(root_container); | 660 DCHECK(root_container); |
| 673 DCHECK(IsActiveTree()); | 661 DCHECK(IsActiveTree()); |
| 674 | 662 |
| 675 gfx::Vector2dF scrollable_viewport_size = | 663 gfx::Vector2dF scrollable_viewport_size = |
| 676 gfx::RectF(ScrollableViewportSize()).bottom_right() - gfx::PointF(); | 664 gfx::RectF(ScrollableViewportSize()).bottom_right() - gfx::PointF(); |
| 677 | 665 |
| 678 gfx::Vector2dF original_viewport_size = | 666 gfx::Vector2dF original_viewport_size = |
| 679 gfx::RectF(root_container->bounds()).bottom_right() - | 667 gfx::RectF(root_container->bounds()).bottom_right() - |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 761 const std::vector<LayerImpl*> LayerTreeImpl::LayersWithCopyOutputRequest() | 749 const std::vector<LayerImpl*> LayerTreeImpl::LayersWithCopyOutputRequest() |
| 762 const { | 750 const { |
| 763 // Only the active tree needs to know about layers with copy requests, as | 751 // Only the active tree needs to know about layers with copy requests, as |
| 764 // they are aborted if not serviced during draw. | 752 // they are aborted if not serviced during draw. |
| 765 DCHECK(IsActiveTree()); | 753 DCHECK(IsActiveTree()); |
| 766 | 754 |
| 767 return layers_with_copy_output_request_; | 755 return layers_with_copy_output_request_; |
| 768 } | 756 } |
| 769 | 757 |
| 770 } // namespace cc | 758 } // namespace cc |
| OLD | NEW |