| 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_host_impl.h" | 5 #include "cc/trees/layer_tree_host_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 | 9 |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 228 is_likely_to_require_a_draw_(false), | 228 is_likely_to_require_a_draw_(false), |
| 229 frame_timing_tracker_(FrameTimingTracker::Create()) { | 229 frame_timing_tracker_(FrameTimingTracker::Create()) { |
| 230 DCHECK(proxy_->IsImplThread()); | 230 DCHECK(proxy_->IsImplThread()); |
| 231 DidVisibilityChange(this, visible_); | 231 DidVisibilityChange(this, visible_); |
| 232 animation_registrar_->set_supports_scroll_animations( | 232 animation_registrar_->set_supports_scroll_animations( |
| 233 proxy_->SupportsImplScrolling()); | 233 proxy_->SupportsImplScrolling()); |
| 234 | 234 |
| 235 SetDebugState(settings.initial_debug_state); | 235 SetDebugState(settings.initial_debug_state); |
| 236 | 236 |
| 237 // LTHI always has an active tree. | 237 // LTHI always has an active tree. |
| 238 active_tree_ = LayerTreeImpl::create(this, new SyncedProperty<ScaleGroup>(), | 238 active_tree_ = |
| 239 new SyncedElasticOverscroll); | 239 LayerTreeImpl::create(this, new SyncedProperty<ScaleGroup>(), |
| 240 new SyncedTopControls, new SyncedElasticOverscroll); |
| 240 | 241 |
| 241 TRACE_EVENT_OBJECT_CREATED_WITH_ID( | 242 TRACE_EVENT_OBJECT_CREATED_WITH_ID( |
| 242 TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::LayerTreeHostImpl", id_); | 243 TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::LayerTreeHostImpl", id_); |
| 243 | 244 |
| 244 if (settings.calculate_top_controls_position) { | 245 if (settings.calculate_top_controls_position) { |
| 245 top_controls_manager_ = | 246 top_controls_manager_ = |
| 246 TopControlsManager::Create(this, | 247 TopControlsManager::Create(this, |
| 247 settings.top_controls_show_threshold, | 248 settings.top_controls_show_threshold, |
| 248 settings.top_controls_hide_threshold); | 249 settings.top_controls_hide_threshold); |
| 249 } | 250 } |
| (...skipping 856 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1106 EnforceManagedMemoryPolicy(ManagedMemoryPolicy(0)); | 1107 EnforceManagedMemoryPolicy(ManagedMemoryPolicy(0)); |
| 1107 } | 1108 } |
| 1108 | 1109 |
| 1109 void LayerTreeHostImpl::BlockNotifyReadyToActivateForTesting(bool block) { | 1110 void LayerTreeHostImpl::BlockNotifyReadyToActivateForTesting(bool block) { |
| 1110 NOTREACHED(); | 1111 NOTREACHED(); |
| 1111 } | 1112 } |
| 1112 | 1113 |
| 1113 void LayerTreeHostImpl::ResetTreesForTesting() { | 1114 void LayerTreeHostImpl::ResetTreesForTesting() { |
| 1114 if (active_tree_) | 1115 if (active_tree_) |
| 1115 active_tree_->DetachLayerTree(); | 1116 active_tree_->DetachLayerTree(); |
| 1116 active_tree_ = LayerTreeImpl::create(this, active_tree()->page_scale_factor(), | 1117 active_tree_ = |
| 1117 active_tree()->elastic_overscroll()); | 1118 LayerTreeImpl::create(this, active_tree()->page_scale_factor(), |
| 1119 active_tree()->top_controls_shown_ratio(), |
| 1120 active_tree()->elastic_overscroll()); |
| 1118 if (pending_tree_) | 1121 if (pending_tree_) |
| 1119 pending_tree_->DetachLayerTree(); | 1122 pending_tree_->DetachLayerTree(); |
| 1120 pending_tree_ = nullptr; | 1123 pending_tree_ = nullptr; |
| 1121 if (recycle_tree_) | 1124 if (recycle_tree_) |
| 1122 recycle_tree_->DetachLayerTree(); | 1125 recycle_tree_->DetachLayerTree(); |
| 1123 recycle_tree_ = nullptr; | 1126 recycle_tree_ = nullptr; |
| 1124 } | 1127 } |
| 1125 | 1128 |
| 1126 void LayerTreeHostImpl::EnforceManagedMemoryPolicy( | 1129 void LayerTreeHostImpl::EnforceManagedMemoryPolicy( |
| 1127 const ManagedMemoryPolicy& policy) { | 1130 const ManagedMemoryPolicy& policy) { |
| (...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1671 | 1674 |
| 1672 ViewportAnchor anchor(InnerViewportScrollLayer(), | 1675 ViewportAnchor anchor(InnerViewportScrollLayer(), |
| 1673 OuterViewportScrollLayer()); | 1676 OuterViewportScrollLayer()); |
| 1674 | 1677 |
| 1675 // Adjust the inner viewport by shrinking/expanding the container to account | 1678 // Adjust the inner viewport by shrinking/expanding the container to account |
| 1676 // for the change in top controls height since the last Resize from Blink. | 1679 // for the change in top controls height since the last Resize from Blink. |
| 1677 float top_controls_layout_height = | 1680 float top_controls_layout_height = |
| 1678 active_tree_->top_controls_shrink_blink_size() | 1681 active_tree_->top_controls_shrink_blink_size() |
| 1679 ? active_tree_->top_controls_height() | 1682 ? active_tree_->top_controls_height() |
| 1680 : 0.f; | 1683 : 0.f; |
| 1681 inner_container->SetBoundsDelta( | 1684 inner_container->SetBoundsDelta(gfx::Vector2dF( |
| 1682 gfx::Vector2dF(0, top_controls_layout_height - | 1685 0, |
| 1683 active_tree_->total_top_controls_content_offset())); | 1686 top_controls_layout_height - top_controls_manager_->ContentTopOffset())); |
| 1684 | 1687 |
| 1685 if (!outer_container || outer_container->BoundsForScrolling().IsEmpty()) | 1688 if (!outer_container || outer_container->BoundsForScrolling().IsEmpty()) |
| 1686 return; | 1689 return; |
| 1687 | 1690 |
| 1688 // Adjust the outer viewport container as well, since adjusting only the | 1691 // Adjust the outer viewport container as well, since adjusting only the |
| 1689 // inner may cause its bounds to exceed those of the outer, causing scroll | 1692 // inner may cause its bounds to exceed those of the outer, causing scroll |
| 1690 // clamping. We adjust it so it maintains the same aspect ratio as the | 1693 // clamping. We adjust it so it maintains the same aspect ratio as the |
| 1691 // inner viewport. | 1694 // inner viewport. |
| 1692 float aspect_ratio = inner_container->BoundsForScrolling().width() / | 1695 float aspect_ratio = inner_container->BoundsForScrolling().width() / |
| 1693 inner_container->BoundsForScrolling().height(); | 1696 inner_container->BoundsForScrolling().height(); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1761 return NULL; | 1764 return NULL; |
| 1762 } | 1765 } |
| 1763 | 1766 |
| 1764 void LayerTreeHostImpl::CreatePendingTree() { | 1767 void LayerTreeHostImpl::CreatePendingTree() { |
| 1765 CHECK(!pending_tree_); | 1768 CHECK(!pending_tree_); |
| 1766 if (recycle_tree_) | 1769 if (recycle_tree_) |
| 1767 recycle_tree_.swap(pending_tree_); | 1770 recycle_tree_.swap(pending_tree_); |
| 1768 else | 1771 else |
| 1769 pending_tree_ = | 1772 pending_tree_ = |
| 1770 LayerTreeImpl::create(this, active_tree()->page_scale_factor(), | 1773 LayerTreeImpl::create(this, active_tree()->page_scale_factor(), |
| 1774 active_tree()->top_controls_shown_ratio(), |
| 1771 active_tree()->elastic_overscroll()); | 1775 active_tree()->elastic_overscroll()); |
| 1772 | 1776 |
| 1773 // Update the delta from the active tree, which may have | |
| 1774 // adjusted its delta prior to the pending tree being created. | |
| 1775 DCHECK_EQ(0.f, pending_tree_->sent_top_controls_delta()); | |
| 1776 pending_tree_->set_top_controls_delta( | |
| 1777 active_tree_->top_controls_delta() - | |
| 1778 active_tree_->sent_top_controls_delta()); | |
| 1779 pending_tree_->set_top_controls_height(active_tree_->top_controls_height()); | |
| 1780 | |
| 1781 client_->OnCanDrawStateChanged(CanDraw()); | 1777 client_->OnCanDrawStateChanged(CanDraw()); |
| 1782 TRACE_EVENT_ASYNC_BEGIN0("cc", "PendingTree:waiting", pending_tree_.get()); | 1778 TRACE_EVENT_ASYNC_BEGIN0("cc", "PendingTree:waiting", pending_tree_.get()); |
| 1783 } | 1779 } |
| 1784 | 1780 |
| 1785 void LayerTreeHostImpl::ActivateSyncTree() { | 1781 void LayerTreeHostImpl::ActivateSyncTree() { |
| 1786 if (pending_tree_) { | 1782 if (pending_tree_) { |
| 1787 TRACE_EVENT_ASYNC_END0("cc", "PendingTree:waiting", pending_tree_.get()); | 1783 TRACE_EVENT_ASYNC_END0("cc", "PendingTree:waiting", pending_tree_.get()); |
| 1788 | 1784 |
| 1789 active_tree_->SetRootLayerScrollOffsetDelegate(NULL); | 1785 active_tree_->SetRootLayerScrollOffsetDelegate(NULL); |
| 1790 active_tree_->PushPersistedState(pending_tree_.get()); | 1786 active_tree_->PushPersistedState(pending_tree_.get()); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1805 | 1801 |
| 1806 // Now that we've synced everything from the pending tree to the active | 1802 // Now that we've synced everything from the pending tree to the active |
| 1807 // tree, rename the pending tree the recycle tree so we can reuse it on the | 1803 // tree, rename the pending tree the recycle tree so we can reuse it on the |
| 1808 // next sync. | 1804 // next sync. |
| 1809 DCHECK(!recycle_tree_); | 1805 DCHECK(!recycle_tree_); |
| 1810 pending_tree_.swap(recycle_tree_); | 1806 pending_tree_.swap(recycle_tree_); |
| 1811 | 1807 |
| 1812 active_tree_->SetRootLayerScrollOffsetDelegate( | 1808 active_tree_->SetRootLayerScrollOffsetDelegate( |
| 1813 root_layer_scroll_offset_delegate_); | 1809 root_layer_scroll_offset_delegate_); |
| 1814 | 1810 |
| 1815 if (top_controls_manager_) { | |
| 1816 top_controls_manager_->SetTopControlsHeight( | |
| 1817 active_tree_->top_controls_height()); | |
| 1818 top_controls_manager_->SetControlsTopOffset( | |
| 1819 active_tree_->total_top_controls_content_offset() - | |
| 1820 active_tree_->top_controls_height()); | |
| 1821 } | |
| 1822 | |
| 1823 UpdateViewportContainerSizes(); | 1811 UpdateViewportContainerSizes(); |
| 1824 } else { | 1812 } else { |
| 1825 active_tree_->ProcessUIResourceRequestQueue(); | 1813 active_tree_->ProcessUIResourceRequestQueue(); |
| 1826 } | 1814 } |
| 1827 | 1815 |
| 1828 active_tree_->DidBecomeActive(); | 1816 active_tree_->DidBecomeActive(); |
| 1829 ActivateAnimations(); | 1817 ActivateAnimations(); |
| 1830 if (settings_.impl_side_painting) { | 1818 if (settings_.impl_side_painting) { |
| 1831 client_->RenewTreePriority(); | 1819 client_->RenewTreePriority(); |
| 1832 // If we have any picture layers, then by activating we also modified tile | 1820 // If we have any picture layers, then by activating we also modified tile |
| (...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2291 } | 2279 } |
| 2292 | 2280 |
| 2293 void LayerTreeHostImpl::DidChangeTopControlsPosition() { | 2281 void LayerTreeHostImpl::DidChangeTopControlsPosition() { |
| 2294 UpdateViewportContainerSizes(); | 2282 UpdateViewportContainerSizes(); |
| 2295 SetNeedsRedraw(); | 2283 SetNeedsRedraw(); |
| 2296 SetNeedsAnimate(); | 2284 SetNeedsAnimate(); |
| 2297 active_tree_->set_needs_update_draw_properties(); | 2285 active_tree_->set_needs_update_draw_properties(); |
| 2298 SetFullRootLayerDamage(); | 2286 SetFullRootLayerDamage(); |
| 2299 } | 2287 } |
| 2300 | 2288 |
| 2301 void LayerTreeHostImpl::SetControlsTopOffset(float offset) { | 2289 float LayerTreeHostImpl::TopControlsHeight() const { |
| 2302 float current_top_offset = active_tree_->top_controls_content_offset() - | 2290 return active_tree_->top_controls_height(); |
| 2303 active_tree_->top_controls_height(); | |
| 2304 active_tree_->set_top_controls_delta(offset - current_top_offset); | |
| 2305 } | 2291 } |
| 2306 | 2292 |
| 2307 float LayerTreeHostImpl::ControlsTopOffset() const { | 2293 void LayerTreeHostImpl::SetCurrentTopControlsShownRatio(float ratio) { |
| 2308 return active_tree_->total_top_controls_content_offset() - | 2294 if (active_tree_->SetCurrentTopControlsShownRatio(ratio)) |
| 2309 active_tree_->top_controls_height(); | 2295 DidChangeTopControlsPosition(); |
| 2296 } |
| 2297 |
| 2298 float LayerTreeHostImpl::CurrentTopControlsShownRatio() const { |
| 2299 return active_tree_->CurrentTopControlsShownRatio(); |
| 2310 } | 2300 } |
| 2311 | 2301 |
| 2312 void LayerTreeHostImpl::BindToClient(InputHandlerClient* client) { | 2302 void LayerTreeHostImpl::BindToClient(InputHandlerClient* client) { |
| 2313 DCHECK(input_handler_client_ == NULL); | 2303 DCHECK(input_handler_client_ == NULL); |
| 2314 input_handler_client_ = client; | 2304 input_handler_client_ = client; |
| 2315 } | 2305 } |
| 2316 | 2306 |
| 2317 LayerImpl* LayerTreeHostImpl::FindScrollLayerForDeviceViewportPoint( | 2307 LayerImpl* LayerTreeHostImpl::FindScrollLayerForDeviceViewportPoint( |
| 2318 const gfx::PointF& device_viewport_point, | 2308 const gfx::PointF& device_viewport_point, |
| 2319 InputHandler::ScrollInputType type, | 2309 InputHandler::ScrollInputType type, |
| (...skipping 732 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3052 for (size_t i = 0; i < layer_impl->children().size(); ++i) | 3042 for (size_t i = 0; i < layer_impl->children().size(); ++i) |
| 3053 CollectScrollDeltas(scroll_info, layer_impl->children()[i]); | 3043 CollectScrollDeltas(scroll_info, layer_impl->children()[i]); |
| 3054 } | 3044 } |
| 3055 | 3045 |
| 3056 scoped_ptr<ScrollAndScaleSet> LayerTreeHostImpl::ProcessScrollDeltas() { | 3046 scoped_ptr<ScrollAndScaleSet> LayerTreeHostImpl::ProcessScrollDeltas() { |
| 3057 scoped_ptr<ScrollAndScaleSet> scroll_info(new ScrollAndScaleSet()); | 3047 scoped_ptr<ScrollAndScaleSet> scroll_info(new ScrollAndScaleSet()); |
| 3058 | 3048 |
| 3059 CollectScrollDeltas(scroll_info.get(), active_tree_->root_layer()); | 3049 CollectScrollDeltas(scroll_info.get(), active_tree_->root_layer()); |
| 3060 scroll_info->page_scale_delta = | 3050 scroll_info->page_scale_delta = |
| 3061 active_tree_->page_scale_factor()->PullDeltaForMainThread(); | 3051 active_tree_->page_scale_factor()->PullDeltaForMainThread(); |
| 3052 scroll_info->top_controls_delta = |
| 3053 active_tree()->top_controls_shown_ratio()->PullDeltaForMainThread(); |
| 3062 scroll_info->elastic_overscroll_delta = | 3054 scroll_info->elastic_overscroll_delta = |
| 3063 active_tree_->elastic_overscroll()->PullDeltaForMainThread(); | 3055 active_tree_->elastic_overscroll()->PullDeltaForMainThread(); |
| 3064 scroll_info->swap_promises.swap(swap_promises_for_main_thread_scroll_update_); | 3056 scroll_info->swap_promises.swap(swap_promises_for_main_thread_scroll_update_); |
| 3065 scroll_info->top_controls_delta = active_tree()->top_controls_delta(); | |
| 3066 active_tree_->set_sent_top_controls_delta(scroll_info->top_controls_delta); | |
| 3067 | 3057 |
| 3068 return scroll_info.Pass(); | 3058 return scroll_info.Pass(); |
| 3069 } | 3059 } |
| 3070 | 3060 |
| 3071 void LayerTreeHostImpl::SetFullRootLayerDamage() { | 3061 void LayerTreeHostImpl::SetFullRootLayerDamage() { |
| 3072 SetViewportDamage(gfx::Rect(DrawViewportSize())); | 3062 SetViewportDamage(gfx::Rect(DrawViewportSize())); |
| 3073 } | 3063 } |
| 3074 | 3064 |
| 3075 void LayerTreeHostImpl::ScrollViewportInnerFirst(gfx::Vector2dF scroll_delta) { | 3065 void LayerTreeHostImpl::ScrollViewportInnerFirst(gfx::Vector2dF scroll_delta) { |
| 3076 DCHECK(InnerViewportScrollLayer()); | 3066 DCHECK(InnerViewportScrollLayer()); |
| (...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3516 } | 3506 } |
| 3517 | 3507 |
| 3518 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { | 3508 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { |
| 3519 std::vector<PictureLayerImpl*>::iterator it = | 3509 std::vector<PictureLayerImpl*>::iterator it = |
| 3520 std::find(picture_layers_.begin(), picture_layers_.end(), layer); | 3510 std::find(picture_layers_.begin(), picture_layers_.end(), layer); |
| 3521 DCHECK(it != picture_layers_.end()); | 3511 DCHECK(it != picture_layers_.end()); |
| 3522 picture_layers_.erase(it); | 3512 picture_layers_.erase(it); |
| 3523 } | 3513 } |
| 3524 | 3514 |
| 3525 } // namespace cc | 3515 } // namespace cc |
| OLD | NEW |