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/layer_tree_host_impl.h" | 5 #include "cc/layer_tree_host_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
(...skipping 1374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1385 // When hiding top controls is enabled and the controls are hidden or | 1385 // When hiding top controls is enabled and the controls are hidden or |
1386 // overlaying the content, force scrolls to be enabled on the root layer to | 1386 // overlaying the content, force scrolls to be enabled on the root layer to |
1387 // allow bringing the top controls back into view. | 1387 // allow bringing the top controls back into view. |
1388 if (!potentially_scrolling_layer_impl && top_controls_manager_ && | 1388 if (!potentially_scrolling_layer_impl && top_controls_manager_ && |
1389 top_controls_manager_->content_top_offset() != | 1389 top_controls_manager_->content_top_offset() != |
1390 settings_.topControlsHeight) { | 1390 settings_.topControlsHeight) { |
1391 potentially_scrolling_layer_impl = RootScrollLayer(); | 1391 potentially_scrolling_layer_impl = RootScrollLayer(); |
1392 } | 1392 } |
1393 | 1393 |
1394 if (potentially_scrolling_layer_impl) { | 1394 if (potentially_scrolling_layer_impl) { |
1395 active_tree_->set_currently_scrolling_layer( | 1395 active_tree_->SetCurrentlyScrollingLayer( |
1396 potentially_scrolling_layer_impl); | 1396 potentially_scrolling_layer_impl); |
1397 should_bubble_scrolls_ = (type != NonBubblingGesture); | 1397 should_bubble_scrolls_ = (type != NonBubblingGesture); |
1398 wheel_scrolling_ = (type == Wheel); | 1398 wheel_scrolling_ = (type == Wheel); |
1399 num_impl_thread_scrolls_++; | 1399 num_impl_thread_scrolls_++; |
1400 client_->RenewTreePriority(); | 1400 client_->RenewTreePriority(); |
1401 UMA_HISTOGRAM_BOOLEAN("TryScroll.SlowScroll", false); | 1401 UMA_HISTOGRAM_BOOLEAN("TryScroll.SlowScroll", false); |
1402 active_tree()->DidBeginScroll(); | 1402 active_tree()->DidBeginScroll(); |
1403 return ScrollStarted; | 1403 return ScrollStarted; |
1404 } | 1404 } |
1405 return ScrollIgnored; | 1405 return ScrollIgnored; |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1527 float move_threshold_squared = 0.1f * 0.1f; | 1527 float move_threshold_squared = 0.1f * 0.1f; |
1528 if (applied_delta.LengthSquared() < move_threshold_squared) { | 1528 if (applied_delta.LengthSquared() < move_threshold_squared) { |
1529 if (should_bubble_scrolls_ || !did_lock_scrolling_layer_) | 1529 if (should_bubble_scrolls_ || !did_lock_scrolling_layer_) |
1530 continue; | 1530 continue; |
1531 else | 1531 else |
1532 break; | 1532 break; |
1533 } | 1533 } |
1534 did_scroll = true; | 1534 did_scroll = true; |
1535 did_lock_scrolling_layer_ = true; | 1535 did_lock_scrolling_layer_ = true; |
1536 if (!should_bubble_scrolls_) { | 1536 if (!should_bubble_scrolls_) { |
1537 active_tree_->set_currently_scrolling_layer(layer_impl); | 1537 active_tree_->SetCurrentlyScrollingLayer(layer_impl); |
1538 break; | 1538 break; |
1539 } | 1539 } |
1540 | 1540 |
1541 // If the applied delta is within 45 degrees of the input delta, bail out to | 1541 // If the applied delta is within 45 degrees of the input delta, bail out to |
1542 // make it easier to scroll just one layer in one direction without | 1542 // make it easier to scroll just one layer in one direction without |
1543 // affecting any of its parents. | 1543 // affecting any of its parents. |
1544 float angle_threshold = 45; | 1544 float angle_threshold = 45; |
1545 if (MathUtil::SmallestAngleBetweenVectors( | 1545 if (MathUtil::SmallestAngleBetweenVectors( |
1546 applied_delta, pending_delta) < angle_threshold) { | 1546 applied_delta, pending_delta) < angle_threshold) { |
1547 pending_delta = gfx::Vector2d(); | 1547 pending_delta = gfx::Vector2d(); |
(...skipping 21 matching lines...) Expand all Loading... |
1569 void LayerTreeHostImpl::ClearCurrentlyScrollingLayer() { | 1569 void LayerTreeHostImpl::ClearCurrentlyScrollingLayer() { |
1570 active_tree_->ClearCurrentlyScrollingLayer(); | 1570 active_tree_->ClearCurrentlyScrollingLayer(); |
1571 did_lock_scrolling_layer_ = false; | 1571 did_lock_scrolling_layer_ = false; |
1572 } | 1572 } |
1573 | 1573 |
1574 void LayerTreeHostImpl::ScrollEnd() { | 1574 void LayerTreeHostImpl::ScrollEnd() { |
1575 if (top_controls_manager_) | 1575 if (top_controls_manager_) |
1576 top_controls_manager_->ScrollEnd(); | 1576 top_controls_manager_->ScrollEnd(); |
1577 ClearCurrentlyScrollingLayer(); | 1577 ClearCurrentlyScrollingLayer(); |
1578 active_tree()->DidEndScroll(); | 1578 active_tree()->DidEndScroll(); |
| 1579 StartScrollbarAnimation(base::TimeTicks::Now()); |
1579 } | 1580 } |
1580 | 1581 |
1581 void LayerTreeHostImpl::PinchGestureBegin() { | 1582 void LayerTreeHostImpl::PinchGestureBegin() { |
1582 pinch_gesture_active_ = true; | 1583 pinch_gesture_active_ = true; |
1583 previous_pinch_anchor_ = gfx::Point(); | 1584 previous_pinch_anchor_ = gfx::Point(); |
1584 client_->RenewTreePriority(); | 1585 client_->RenewTreePriority(); |
1585 } | 1586 } |
1586 | 1587 |
1587 void LayerTreeHostImpl::PinchGestureUpdate(float magnify_delta, | 1588 void LayerTreeHostImpl::PinchGestureUpdate(float magnify_delta, |
1588 gfx::Point anchor) { | 1589 gfx::Point anchor) { |
(...skipping 12 matching lines...) Expand all Loading... |
1601 gfx::PointF new_scale_anchor = | 1602 gfx::PointF new_scale_anchor = |
1602 gfx::ScalePoint(anchor, 1.f / page_scale_delta); | 1603 gfx::ScalePoint(anchor, 1.f / page_scale_delta); |
1603 gfx::Vector2dF move = previous_scale_anchor - new_scale_anchor; | 1604 gfx::Vector2dF move = previous_scale_anchor - new_scale_anchor; |
1604 | 1605 |
1605 previous_pinch_anchor_ = anchor; | 1606 previous_pinch_anchor_ = anchor; |
1606 | 1607 |
1607 move.Scale(1 / active_tree_->page_scale_factor()); | 1608 move.Scale(1 / active_tree_->page_scale_factor()); |
1608 | 1609 |
1609 RootScrollLayer()->ScrollBy(move); | 1610 RootScrollLayer()->ScrollBy(move); |
1610 | 1611 |
1611 if (RootScrollLayer()->scrollbar_animation_controller()) { | |
1612 RootScrollLayer()->scrollbar_animation_controller()-> | |
1613 didPinchGestureUpdate(base::TimeTicks::Now()); | |
1614 } | |
1615 | |
1616 client_->SetNeedsCommitOnImplThread(); | 1612 client_->SetNeedsCommitOnImplThread(); |
1617 client_->SetNeedsRedrawOnImplThread(); | 1613 client_->SetNeedsRedrawOnImplThread(); |
1618 client_->RenewTreePriority(); | 1614 client_->RenewTreePriority(); |
1619 } | 1615 } |
1620 | 1616 |
1621 void LayerTreeHostImpl::PinchGestureEnd() { | 1617 void LayerTreeHostImpl::PinchGestureEnd() { |
1622 pinch_gesture_active_ = false; | 1618 pinch_gesture_active_ = false; |
1623 | |
1624 if (RootScrollLayer() && | |
1625 RootScrollLayer()->scrollbar_animation_controller()) { | |
1626 RootScrollLayer()->scrollbar_animation_controller()-> | |
1627 didPinchGestureEnd(base::TimeTicks::Now()); | |
1628 } | |
1629 | |
1630 client_->SetNeedsCommitOnImplThread(); | 1619 client_->SetNeedsCommitOnImplThread(); |
1631 } | 1620 } |
1632 | 1621 |
1633 static void CollectScrollDeltas(ScrollAndScaleSet* scroll_info, | 1622 static void CollectScrollDeltas(ScrollAndScaleSet* scroll_info, |
1634 LayerImpl* layer_impl) { | 1623 LayerImpl* layer_impl) { |
1635 if (!layer_impl) | 1624 if (!layer_impl) |
1636 return; | 1625 return; |
1637 | 1626 |
1638 gfx::Vector2d scroll_delta = | 1627 gfx::Vector2d scroll_delta = |
1639 gfx::ToFlooredVector2d(layer_impl->scroll_delta()); | 1628 gfx::ToFlooredVector2d(layer_impl->scroll_delta()); |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1848 AnimateScrollbarsRecursive(active_tree_->root_layer(), time); | 1837 AnimateScrollbarsRecursive(active_tree_->root_layer(), time); |
1849 } | 1838 } |
1850 | 1839 |
1851 void LayerTreeHostImpl::AnimateScrollbarsRecursive(LayerImpl* layer, | 1840 void LayerTreeHostImpl::AnimateScrollbarsRecursive(LayerImpl* layer, |
1852 base::TimeTicks time) { | 1841 base::TimeTicks time) { |
1853 if (!layer) | 1842 if (!layer) |
1854 return; | 1843 return; |
1855 | 1844 |
1856 ScrollbarAnimationController* scrollbar_controller = | 1845 ScrollbarAnimationController* scrollbar_controller = |
1857 layer->scrollbar_animation_controller(); | 1846 layer->scrollbar_animation_controller(); |
1858 if (scrollbar_controller && scrollbar_controller->animate(time)) | 1847 if (scrollbar_controller && scrollbar_controller->animate(time)) { |
| 1848 TRACE_EVENT_INSTANT0( |
| 1849 "cc", "LayerTreeHostImpl::SetNeedsRedraw due to AnimateScrollbars"); |
1859 client_->SetNeedsRedrawOnImplThread(); | 1850 client_->SetNeedsRedrawOnImplThread(); |
| 1851 } |
1860 | 1852 |
1861 for (size_t i = 0; i < layer->children().size(); ++i) | 1853 for (size_t i = 0; i < layer->children().size(); ++i) |
1862 AnimateScrollbarsRecursive(layer->children()[i], time); | 1854 AnimateScrollbarsRecursive(layer->children()[i], time); |
1863 } | 1855 } |
1864 | 1856 |
| 1857 void LayerTreeHostImpl::StartScrollbarAnimation(base::TimeTicks time) { |
| 1858 TRACE_EVENT0("cc", "LayerTreeHostImpl::StartScrollbarAnimation"); |
| 1859 StartScrollbarAnimationRecursive(RootLayer(), time); |
| 1860 } |
| 1861 |
| 1862 void LayerTreeHostImpl::StartScrollbarAnimationRecursive(LayerImpl* layer, |
| 1863 base::TimeTicks time) { |
| 1864 if (!layer) |
| 1865 return; |
| 1866 |
| 1867 ScrollbarAnimationController* scrollbar_controller = |
| 1868 layer->scrollbar_animation_controller(); |
| 1869 if (scrollbar_controller && scrollbar_controller->isAnimating()) { |
| 1870 base::TimeDelta delay = scrollbar_controller->delayBeforeStart(time); |
| 1871 if (delay > base::TimeDelta()) |
| 1872 client_->RequestScrollbarAnimationOnImplThread(delay); |
| 1873 else if (scrollbar_controller->animate(time)) |
| 1874 client_->SetNeedsRedrawOnImplThread(); |
| 1875 } |
| 1876 |
| 1877 for (size_t i = 0; i < layer->children().size(); ++i) |
| 1878 StartScrollbarAnimationRecursive(layer->children()[i], time); |
| 1879 } |
| 1880 |
1865 void LayerTreeHostImpl::SetTreePriority(TreePriority priority) { | 1881 void LayerTreeHostImpl::SetTreePriority(TreePriority priority) { |
1866 if (!tile_manager_) | 1882 if (!tile_manager_) |
1867 return; | 1883 return; |
1868 | 1884 |
1869 GlobalStateThatImpactsTilePriority new_state(tile_manager_->GlobalState()); | 1885 GlobalStateThatImpactsTilePriority new_state(tile_manager_->GlobalState()); |
1870 if (new_state.tree_priority == priority) | 1886 if (new_state.tree_priority == priority) |
1871 return; | 1887 return; |
1872 | 1888 |
1873 new_state.tree_priority = priority; | 1889 new_state.tree_priority = priority; |
1874 tile_manager_->SetGlobalState(new_state); | 1890 tile_manager_->SetGlobalState(new_state); |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1947 tile_manager_->SetRecordRenderingStats(debug_state_.recordRenderingStats()); | 1963 tile_manager_->SetRecordRenderingStats(debug_state_.recordRenderingStats()); |
1948 } | 1964 } |
1949 | 1965 |
1950 void LayerTreeHostImpl::SavePaintTime(const base::TimeDelta& total_paint_time, | 1966 void LayerTreeHostImpl::SavePaintTime(const base::TimeDelta& total_paint_time, |
1951 int commit_number) { | 1967 int commit_number) { |
1952 DCHECK(debug_state_.continuousPainting); | 1968 DCHECK(debug_state_.continuousPainting); |
1953 paint_time_counter_->SavePaintTime(total_paint_time, commit_number); | 1969 paint_time_counter_->SavePaintTime(total_paint_time, commit_number); |
1954 } | 1970 } |
1955 | 1971 |
1956 } // namespace cc | 1972 } // namespace cc |
OLD | NEW |