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

Side by Side Diff: cc/trees/layer_tree_host_impl.cc

Issue 23983047: Pinch/Zoom Infrastructure & Plumbing CL (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Backup 2013.10.29 Created 7 years, 1 month 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_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 369 matching lines...) Expand 10 before | Expand all | Expand 10 after
380 &memory_used_bytes); 380 &memory_used_bytes);
381 SendManagedMemoryStats(memory_required_bytes, 381 SendManagedMemoryStats(memory_required_bytes,
382 memory_nice_to_have_bytes, 382 memory_nice_to_have_bytes,
383 memory_used_bytes); 383 memory_used_bytes);
384 } 384 }
385 385
386 void LayerTreeHostImpl::StartPageScaleAnimation(gfx::Vector2d target_offset, 386 void LayerTreeHostImpl::StartPageScaleAnimation(gfx::Vector2d target_offset,
387 bool anchor_point, 387 bool anchor_point,
388 float page_scale, 388 float page_scale,
389 base::TimeDelta duration) { 389 base::TimeDelta duration) {
390 if (!RootScrollLayer()) 390 if (!InnerViewportScrollLayer())
391 return; 391 return;
392 392
393 // Should we attempt to set to OuterViewportScrollingLayer if it's available?
394 active_tree_->SetCurrentlyScrollingLayer(InnerViewportScrollLayer());
395
393 gfx::Vector2dF scroll_total = 396 gfx::Vector2dF scroll_total =
394 RootScrollLayer()->scroll_offset() + RootScrollLayer()->ScrollDelta(); 397 active_tree_->TotalScrollOffset() + active_tree_->TotalScrollDelta();
395 gfx::SizeF scaled_scrollable_size = active_tree_->ScrollableSize(); 398 gfx::SizeF scaled_scrollable_size = active_tree_->ScrollableSize();
396 gfx::SizeF viewport_size = UnscaledScrollableViewportSize(); 399 gfx::SizeF viewport_size = UnscaledScrollableViewportSize();
397 400
398 // Easing constants experimentally determined. 401 // Easing constants experimentally determined.
399 scoped_ptr<TimingFunction> timing_function = 402 scoped_ptr<TimingFunction> timing_function =
400 CubicBezierTimingFunction::Create(.8, 0, .3, .9).PassAs<TimingFunction>(); 403 CubicBezierTimingFunction::Create(.8, 0, .3, .9).PassAs<TimingFunction>();
401 404
402 page_scale_animation_ = 405 page_scale_animation_ =
403 PageScaleAnimation::Create(scroll_total, 406 PageScaleAnimation::Create(scroll_total,
404 active_tree_->total_page_scale_factor(), 407 active_tree_->total_page_scale_factor(),
(...skipping 832 matching lines...) Expand 10 before | Expand all | Expand 10 after
1237 metadata.max_page_scale_factor = active_tree_->max_page_scale_factor(); 1240 metadata.max_page_scale_factor = active_tree_->max_page_scale_factor();
1238 metadata.latency_info = active_tree_->GetLatencyInfo(); 1241 metadata.latency_info = active_tree_->GetLatencyInfo();
1239 if (top_controls_manager_) { 1242 if (top_controls_manager_) {
1240 metadata.location_bar_offset = 1243 metadata.location_bar_offset =
1241 gfx::Vector2dF(0.f, top_controls_manager_->controls_top_offset()); 1244 gfx::Vector2dF(0.f, top_controls_manager_->controls_top_offset());
1242 metadata.location_bar_content_translation = 1245 metadata.location_bar_content_translation =
1243 gfx::Vector2dF(0.f, top_controls_manager_->content_top_offset()); 1246 gfx::Vector2dF(0.f, top_controls_manager_->content_top_offset());
1244 metadata.overdraw_bottom_height = overdraw_bottom_height_; 1247 metadata.overdraw_bottom_height = overdraw_bottom_height_;
1245 } 1248 }
1246 1249
1247 if (!RootScrollLayer()) 1250 if (!InnerViewportScrollLayer())
1248 return metadata; 1251 return metadata;
1249 1252
1250 metadata.root_scroll_offset = RootScrollLayer()->TotalScrollOffset(); 1253 metadata.root_scroll_offset = active_tree_->TotalScrollOffset();
1251 1254
1252 return metadata; 1255 return metadata;
1253 } 1256 }
1254 1257
1255 static void LayerTreeHostImplDidBeginTracingCallback(LayerImpl* layer) { 1258 static void LayerTreeHostImplDidBeginTracingCallback(LayerImpl* layer) {
1256 layer->DidBeginTracing(); 1259 layer->DidBeginTracing();
1257 } 1260 }
1258 1261
1259 void LayerTreeHostImpl::DrawLayers(FrameData* frame, 1262 void LayerTreeHostImpl::DrawLayers(FrameData* frame,
1260 base::TimeTicks frame_begin_time) { 1263 base::TimeTicks frame_begin_time) {
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
1428 client_->DidLoseOutputSurfaceOnImplThread(); 1431 client_->DidLoseOutputSurfaceOnImplThread();
1429 } 1432 }
1430 1433
1431 void LayerTreeHostImpl::Readback(void* pixels, 1434 void LayerTreeHostImpl::Readback(void* pixels,
1432 gfx::Rect rect_in_device_viewport) { 1435 gfx::Rect rect_in_device_viewport) {
1433 DCHECK(renderer_); 1436 DCHECK(renderer_);
1434 renderer_->GetFramebufferPixels(pixels, rect_in_device_viewport); 1437 renderer_->GetFramebufferPixels(pixels, rect_in_device_viewport);
1435 } 1438 }
1436 1439
1437 bool LayerTreeHostImpl::HaveRootScrollLayer() const { 1440 bool LayerTreeHostImpl::HaveRootScrollLayer() const {
1438 return !!RootScrollLayer(); 1441 return !!InnerViewportScrollLayer();
1439 } 1442 }
1440 1443
1441 LayerImpl* LayerTreeHostImpl::RootLayer() const { 1444 LayerImpl* LayerTreeHostImpl::RootLayer() const {
1442 return active_tree_->root_layer(); 1445 return active_tree_->root_layer();
1443 } 1446 }
1444 1447
1445 LayerImpl* LayerTreeHostImpl::RootScrollLayer() const { 1448 LayerImpl* LayerTreeHostImpl::InnerViewportScrollLayer() const {
1446 return active_tree_->RootScrollLayer(); 1449 return active_tree_->InnerViewportScrollLayer();
1450 }
1451
1452 LayerImpl* LayerTreeHostImpl::OuterViewportScrollLayer() const {
1453 return active_tree_->OuterViewportScrollLayer();
1447 } 1454 }
1448 1455
1449 LayerImpl* LayerTreeHostImpl::CurrentlyScrollingLayer() const { 1456 LayerImpl* LayerTreeHostImpl::CurrentlyScrollingLayer() const {
1450 return active_tree_->CurrentlyScrollingLayer(); 1457 return active_tree_->CurrentlyScrollingLayer();
1451 } 1458 }
1452 1459
1453 bool LayerTreeHostImpl::IsCurrentlyScrolling() const { 1460 bool LayerTreeHostImpl::IsCurrentlyScrolling() const {
1454 return CurrentlyScrollingLayer() || 1461 return CurrentlyScrollingLayer() ||
1455 (RootScrollLayer() && RootScrollLayer()->IsExternalFlingActive()); 1462 (InnerViewportScrollLayer() &&
1463 InnerViewportScrollLayer()->IsExternalFlingActive()) ||
1464 (OuterViewportScrollLayer() &&
1465 OuterViewportScrollLayer()->IsExternalFlingActive());
1456 } 1466 }
1457 1467
1458 // Content layers can be either directly scrollable or contained in an outer 1468 // Content layers can be either directly scrollable or contained in an outer
1459 // scrolling layer which applies the scroll transform. Given a content layer, 1469 // scrolling layer which applies the scroll transform. Given a content layer,
1460 // this function returns the associated scroll layer if any. 1470 // this function returns the associated scroll layer if any.
1461 static LayerImpl* FindScrollLayerForContentLayer(LayerImpl* layer_impl) { 1471 static LayerImpl* FindScrollLayerForContentLayer(LayerImpl* layer_impl) {
1462 if (!layer_impl) 1472 if (!layer_impl)
1463 return NULL; 1473 return NULL;
1464 1474
1465 if (layer_impl->scrollable()) 1475 if (layer_impl->scrollable())
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
1819 1829
1820 void LayerTreeHostImpl::SetViewportSize(gfx::Size device_viewport_size) { 1830 void LayerTreeHostImpl::SetViewportSize(gfx::Size device_viewport_size) {
1821 if (device_viewport_size == device_viewport_size_) 1831 if (device_viewport_size == device_viewport_size_)
1822 return; 1832 return;
1823 1833
1824 if (pending_tree_) 1834 if (pending_tree_)
1825 active_tree_->SetViewportSizeInvalid(); 1835 active_tree_->SetViewportSizeInvalid();
1826 1836
1827 device_viewport_size_ = device_viewport_size; 1837 device_viewport_size_ = device_viewport_size;
1828 1838
1829 UpdateMaxScrollOffset();
1830
1831 if (renderer_) 1839 if (renderer_)
1832 renderer_->ViewportChanged(); 1840 renderer_->ViewportChanged();
1833 1841
1834 client_->OnCanDrawStateChanged(CanDraw()); 1842 client_->OnCanDrawStateChanged(CanDraw());
1835 SetFullRootLayerDamage(); 1843 SetFullRootLayerDamage();
1836 } 1844 }
1837 1845
1838 void LayerTreeHostImpl::SetOverdrawBottomHeight(float overdraw_bottom_height) { 1846 void LayerTreeHostImpl::SetOverdrawBottomHeight(float overdraw_bottom_height) {
1839 if (overdraw_bottom_height == overdraw_bottom_height_) 1847 if (overdraw_bottom_height == overdraw_bottom_height_)
1840 return; 1848 return;
1841 overdraw_bottom_height_ = overdraw_bottom_height; 1849 overdraw_bottom_height_ = overdraw_bottom_height;
1842 1850
1843 UpdateMaxScrollOffset();
1844 SetFullRootLayerDamage(); 1851 SetFullRootLayerDamage();
1845 } 1852 }
1846 1853
1847 void LayerTreeHostImpl::SetOverhangUIResource( 1854 void LayerTreeHostImpl::SetOverhangUIResource(
1848 UIResourceId overhang_ui_resource_id, 1855 UIResourceId overhang_ui_resource_id,
1849 gfx::Size overhang_ui_resource_size) { 1856 gfx::Size overhang_ui_resource_size) {
1850 overhang_ui_resource_id_ = overhang_ui_resource_id; 1857 overhang_ui_resource_id_ = overhang_ui_resource_id;
1851 overhang_ui_resource_size_ = overhang_ui_resource_size; 1858 overhang_ui_resource_size_ = overhang_ui_resource_size;
1852 } 1859 }
1853 1860
1854 void LayerTreeHostImpl::SetDeviceScaleFactor(float device_scale_factor) { 1861 void LayerTreeHostImpl::SetDeviceScaleFactor(float device_scale_factor) {
1855 if (device_scale_factor == device_scale_factor_) 1862 if (device_scale_factor == device_scale_factor_)
1856 return; 1863 return;
1857 device_scale_factor_ = device_scale_factor; 1864 device_scale_factor_ = device_scale_factor;
1858 1865
1859 if (renderer_) 1866 if (renderer_)
1860 renderer_->ViewportChanged(); 1867 renderer_->ViewportChanged();
1861 1868
1862 UpdateMaxScrollOffset();
1863 SetFullRootLayerDamage(); 1869 SetFullRootLayerDamage();
1864 } 1870 }
1865 1871
1866 gfx::Size LayerTreeHostImpl::DrawViewportSize() const { 1872 gfx::Size LayerTreeHostImpl::DrawViewportSize() const {
1867 return DeviceViewport().size(); 1873 return DeviceViewport().size();
1868 } 1874 }
1869 1875
1870 gfx::Rect LayerTreeHostImpl::DeviceViewport() const { 1876 gfx::Rect LayerTreeHostImpl::DeviceViewport() const {
1871 if (external_viewport_.IsEmpty()) 1877 if (external_viewport_.IsEmpty())
1872 return gfx::Rect(device_viewport_size_); 1878 return gfx::Rect(device_viewport_size_);
1873 1879
1874 return external_viewport_; 1880 return external_viewport_;
1875 } 1881 }
1876 1882
1877 gfx::Rect LayerTreeHostImpl::DeviceClip() const { 1883 gfx::Rect LayerTreeHostImpl::DeviceClip() const {
1878 if (external_clip_.IsEmpty()) 1884 if (external_clip_.IsEmpty())
1879 return DeviceViewport(); 1885 return DeviceViewport();
1880 1886
1881 return external_clip_; 1887 return external_clip_;
1882 } 1888 }
1883 1889
1884 const gfx::Transform& LayerTreeHostImpl::DrawTransform() const { 1890 const gfx::Transform& LayerTreeHostImpl::DrawTransform() const {
1885 return external_transform_; 1891 return external_transform_;
1886 } 1892 }
1887 1893
1888 void LayerTreeHostImpl::UpdateMaxScrollOffset() {
1889 active_tree_->UpdateMaxScrollOffset();
1890 }
1891
1892 void LayerTreeHostImpl::DidChangeTopControlsPosition() { 1894 void LayerTreeHostImpl::DidChangeTopControlsPosition() {
1893 client_->SetNeedsRedrawOnImplThread(); 1895 client_->SetNeedsRedrawOnImplThread();
1894 active_tree_->set_needs_update_draw_properties(); 1896 active_tree_->set_needs_update_draw_properties();
1895 SetFullRootLayerDamage(); 1897 SetFullRootLayerDamage();
1896 } 1898 }
1897 1899
1898 bool LayerTreeHostImpl::EnsureRenderSurfaceLayerList() { 1900 bool LayerTreeHostImpl::EnsureRenderSurfaceLayerList() {
1899 active_tree_->UpdateDrawProperties(); 1901 active_tree_->UpdateDrawProperties();
1900 return !active_tree_->RenderSurfaceLayerList().empty(); 1902 return !active_tree_->RenderSurfaceLayerList().empty();
1901 } 1903 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1941 if (status == ScrollStarted && !potentially_scrolling_layer_impl) 1943 if (status == ScrollStarted && !potentially_scrolling_layer_impl)
1942 potentially_scrolling_layer_impl = scroll_layer_impl; 1944 potentially_scrolling_layer_impl = scroll_layer_impl;
1943 } 1945 }
1944 1946
1945 // When hiding top controls is enabled and the controls are hidden or 1947 // When hiding top controls is enabled and the controls are hidden or
1946 // overlaying the content, force scrolls to be enabled on the root layer to 1948 // overlaying the content, force scrolls to be enabled on the root layer to
1947 // allow bringing the top controls back into view. 1949 // allow bringing the top controls back into view.
1948 if (!potentially_scrolling_layer_impl && top_controls_manager_ && 1950 if (!potentially_scrolling_layer_impl && top_controls_manager_ &&
1949 top_controls_manager_->content_top_offset() != 1951 top_controls_manager_->content_top_offset() !=
1950 settings_.top_controls_height) { 1952 settings_.top_controls_height) {
1951 potentially_scrolling_layer_impl = RootScrollLayer(); 1953 potentially_scrolling_layer_impl =
1954 OuterViewportScrollLayer() ? OuterViewportScrollLayer()
1955 : InnerViewportScrollLayer();
1952 } 1956 }
1953 1957
1954 return potentially_scrolling_layer_impl; 1958 return potentially_scrolling_layer_impl;
1955 } 1959 }
1956 1960
1957 InputHandler::ScrollStatus LayerTreeHostImpl::ScrollBegin( 1961 InputHandler::ScrollStatus LayerTreeHostImpl::ScrollBegin(
1958 gfx::Point viewport_point, InputHandler::ScrollInputType type) { 1962 gfx::Point viewport_point, InputHandler::ScrollInputType type) {
1959 TRACE_EVENT0("cc", "LayerTreeHostImpl::ScrollBegin"); 1963 TRACE_EVENT0("cc", "LayerTreeHostImpl::ScrollBegin");
1960 1964
1961 if (top_controls_manager_) 1965 if (top_controls_manager_)
(...skipping 15 matching lines...) Expand all
1977 FindScrollLayerForDeviceViewportPoint(device_viewport_point, type, 1981 FindScrollLayerForDeviceViewportPoint(device_viewport_point, type,
1978 layer_impl, &scroll_on_main_thread); 1982 layer_impl, &scroll_on_main_thread);
1979 1983
1980 if (scroll_on_main_thread) { 1984 if (scroll_on_main_thread) {
1981 UMA_HISTOGRAM_BOOLEAN("TryScroll.SlowScroll", true); 1985 UMA_HISTOGRAM_BOOLEAN("TryScroll.SlowScroll", true);
1982 return ScrollOnMainThread; 1986 return ScrollOnMainThread;
1983 } 1987 }
1984 1988
1985 // If we want to send a DidOverscroll for this scroll it can't be ignored. 1989 // If we want to send a DidOverscroll for this scroll it can't be ignored.
1986 if (!potentially_scrolling_layer_impl && settings_.always_overscroll) 1990 if (!potentially_scrolling_layer_impl && settings_.always_overscroll)
1987 potentially_scrolling_layer_impl = RootScrollLayer(); 1991 potentially_scrolling_layer_impl =
1992 OuterViewportScrollLayer() ? OuterViewportScrollLayer()
1993 : InnerViewportScrollLayer();
1988 1994
1989 if (potentially_scrolling_layer_impl) { 1995 if (potentially_scrolling_layer_impl) {
1990 active_tree_->SetCurrentlyScrollingLayer( 1996 active_tree_->SetCurrentlyScrollingLayer(
1991 potentially_scrolling_layer_impl); 1997 potentially_scrolling_layer_impl);
1992 should_bubble_scrolls_ = (type != NonBubblingGesture); 1998 should_bubble_scrolls_ = (type != NonBubblingGesture);
1993 last_scroll_did_bubble_ = false; 1999 last_scroll_did_bubble_ = false;
1994 wheel_scrolling_ = (type == Wheel); 2000 wheel_scrolling_ = (type == Wheel);
1995 client_->RenewTreePriority(); 2001 client_->RenewTreePriority();
1996 UMA_HISTOGRAM_BOOLEAN("TryScroll.SlowScroll", false); 2002 UMA_HISTOGRAM_BOOLEAN("TryScroll.SlowScroll", false);
1997 return ScrollStarted; 2003 return ScrollStarted;
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
2086 gfx::Vector2dF scroll_delta) { 2092 gfx::Vector2dF scroll_delta) {
2087 TRACE_EVENT0("cc", "LayerTreeHostImpl::ScrollBy"); 2093 TRACE_EVENT0("cc", "LayerTreeHostImpl::ScrollBy");
2088 if (!CurrentlyScrollingLayer()) 2094 if (!CurrentlyScrollingLayer())
2089 return false; 2095 return false;
2090 2096
2091 gfx::Vector2dF pending_delta = scroll_delta; 2097 gfx::Vector2dF pending_delta = scroll_delta;
2092 gfx::Vector2dF unused_root_delta; 2098 gfx::Vector2dF unused_root_delta;
2093 bool did_scroll_x = false; 2099 bool did_scroll_x = false;
2094 bool did_scroll_y = false; 2100 bool did_scroll_y = false;
2095 bool consume_by_top_controls = top_controls_manager_ && 2101 bool consume_by_top_controls = top_controls_manager_ &&
2096 (CurrentlyScrollingLayer() == RootScrollLayer() || scroll_delta.y() < 0); 2102 (CurrentlyScrollingLayer() == InnerViewportScrollLayer() || scroll_delta.y () < 0);
2097 last_scroll_did_bubble_ = false; 2103 last_scroll_did_bubble_ = false;
2098 2104
2099 for (LayerImpl* layer_impl = CurrentlyScrollingLayer(); 2105 for (LayerImpl* layer_impl = CurrentlyScrollingLayer();
2100 layer_impl; 2106 layer_impl;
2101 layer_impl = layer_impl->parent()) { 2107 layer_impl = layer_impl->parent()) {
2102 if (!layer_impl->scrollable()) 2108 if (!layer_impl->scrollable())
2103 continue; 2109 continue;
2104 2110
2105 if (layer_impl == RootScrollLayer()) { 2111 if (layer_impl == InnerViewportScrollLayer()) {
2106 // Only allow bubble scrolling when the scroll is in the direction to make 2112 // Only allow bubble scrolling when the scroll is in the direction to make
2107 // the top controls visible. 2113 // the top controls visible.
2108 if (consume_by_top_controls && layer_impl == RootScrollLayer()) { 2114 if (consume_by_top_controls && layer_impl == InnerViewportScrollLayer())
2109 pending_delta = top_controls_manager_->ScrollBy(pending_delta); 2115 pending_delta = top_controls_manager_->ScrollBy(pending_delta);
2110 UpdateMaxScrollOffset();
2111 }
2112 // Track root layer deltas for reporting overscroll. 2116 // Track root layer deltas for reporting overscroll.
2113 unused_root_delta = pending_delta; 2117 unused_root_delta = pending_delta;
2114 } 2118 }
2115 2119
2116 gfx::Vector2dF applied_delta; 2120 gfx::Vector2dF applied_delta;
2117 // Gesture events need to be transformed from viewport coordinates to local 2121 // Gesture events need to be transformed from viewport coordinates to local
2118 // layer coordinates so that the scrolling contents exactly follow the 2122 // layer coordinates so that the scrolling contents exactly follow the
2119 // user's finger. In contrast, wheel events represent a fixed amount of 2123 // user's finger. In contrast, wheel events represent a fixed amount of
2120 // scrolling so we can just apply them directly. 2124 // scrolling so we can just apply them directly.
2121 if (!wheel_scrolling_) { 2125 if (!wheel_scrolling_) {
(...skipping 17 matching lines...) Expand all
2139 continue; 2143 continue;
2140 2144
2141 if (should_bubble_scrolls_) { 2145 if (should_bubble_scrolls_) {
2142 last_scroll_did_bubble_ = true; 2146 last_scroll_did_bubble_ = true;
2143 continue; 2147 continue;
2144 } 2148 }
2145 2149
2146 break; 2150 break;
2147 } 2151 }
2148 2152
2149 if (layer_impl == RootScrollLayer()) 2153 if (layer_impl == InnerViewportScrollLayer() ||
2154 layer_impl == OuterViewportScrollLayer())
2150 unused_root_delta.Subtract(applied_delta); 2155 unused_root_delta.Subtract(applied_delta);
2151 2156
2152 did_lock_scrolling_layer_ = true; 2157 did_lock_scrolling_layer_ = true;
2153 if (!should_bubble_scrolls_) { 2158 if (!should_bubble_scrolls_) {
2154 active_tree_->SetCurrentlyScrollingLayer(layer_impl); 2159 active_tree_->SetCurrentlyScrollingLayer(layer_impl);
2155 break; 2160 break;
2156 } 2161 }
2157 2162
2158 // If the applied delta is within 45 degrees of the input delta, bail out to 2163 // If the applied delta is within 45 degrees of the input delta, bail out to
2159 // make it easier to scroll just one layer in one direction without 2164 // make it easier to scroll just one layer in one direction without
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2206 bool LayerTreeHostImpl::ScrollVerticallyByPage(gfx::Point viewport_point, 2211 bool LayerTreeHostImpl::ScrollVerticallyByPage(gfx::Point viewport_point,
2207 ScrollDirection direction) { 2212 ScrollDirection direction) {
2208 DCHECK(wheel_scrolling_); 2213 DCHECK(wheel_scrolling_);
2209 2214
2210 for (LayerImpl* layer_impl = CurrentlyScrollingLayer(); 2215 for (LayerImpl* layer_impl = CurrentlyScrollingLayer();
2211 layer_impl; 2216 layer_impl;
2212 layer_impl = layer_impl->parent()) { 2217 layer_impl = layer_impl->parent()) {
2213 if (!layer_impl->scrollable()) 2218 if (!layer_impl->scrollable())
2214 continue; 2219 continue;
2215 2220
2216 if (!layer_impl->vertical_scrollbar_layer()) 2221 if (!layer_impl->HasScrollbar(VERTICAL))
2217 continue; 2222 continue;
2218 2223
2219 float height = layer_impl->vertical_scrollbar_layer()->bounds().height(); 2224 // TODO(wjmaclean) make sure this is ok!
2225 float height = layer_impl->clip_height();
2220 2226
2221 // These magical values match WebKit and are designed to scroll nearly the 2227 // These magical values match WebKit and are designed to scroll nearly the
2222 // entire visible content height but leave a bit of overlap. 2228 // entire visible content height but leave a bit of overlap.
2223 float page = std::max(height * 0.875f, 1.f); 2229 float page = std::max(height * 0.875f, 1.f);
2224 if (direction == SCROLL_BACKWARD) 2230 if (direction == SCROLL_BACKWARD)
2225 page = -page; 2231 page = -page;
2226 2232
2227 gfx::Vector2dF delta = gfx::Vector2dF(0.f, page); 2233 gfx::Vector2dF delta = gfx::Vector2dF(0.f, page);
2228 2234
2229 gfx::Vector2dF applied_delta = ScrollLayerWithLocalDelta(layer_impl, delta); 2235 gfx::Vector2dF applied_delta = ScrollLayerWithLocalDelta(layer_impl, delta);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
2265 top_controls_manager_->ScrollEnd(); 2271 top_controls_manager_->ScrollEnd();
2266 ClearCurrentlyScrollingLayer(); 2272 ClearCurrentlyScrollingLayer();
2267 StartScrollbarAnimation(); 2273 StartScrollbarAnimation();
2268 } 2274 }
2269 2275
2270 InputHandler::ScrollStatus LayerTreeHostImpl::FlingScrollBegin() { 2276 InputHandler::ScrollStatus LayerTreeHostImpl::FlingScrollBegin() {
2271 if (!active_tree_->CurrentlyScrollingLayer()) 2277 if (!active_tree_->CurrentlyScrollingLayer())
2272 return ScrollIgnored; 2278 return ScrollIgnored;
2273 2279
2274 if (settings_.ignore_root_layer_flings && 2280 if (settings_.ignore_root_layer_flings &&
2275 active_tree_->CurrentlyScrollingLayer() == 2281 (active_tree_->CurrentlyScrollingLayer() == InnerViewportScrollLayer() ||
2276 active_tree_->RootScrollLayer()) { 2282 active_tree_->CurrentlyScrollingLayer() == OuterViewportScrollLayer())) {
2277 ClearCurrentlyScrollingLayer(); 2283 ClearCurrentlyScrollingLayer();
2278 return ScrollIgnored; 2284 return ScrollIgnored;
2279 } 2285 }
2280 2286
2281 if (!wheel_scrolling_) 2287 if (!wheel_scrolling_)
2282 should_bubble_scrolls_ = last_scroll_did_bubble_; 2288 should_bubble_scrolls_ = last_scroll_did_bubble_;
2283 2289
2284 return ScrollStarted; 2290 return ScrollStarted;
2285 } 2291 }
2286 2292
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
2326 scroll_layer_impl->scrollbar_animation_controller(); 2332 scroll_layer_impl->scrollbar_animation_controller();
2327 if (animation_controller) { 2333 if (animation_controller) {
2328 animation_controller->DidMouseMoveOffScrollbar( 2334 animation_controller->DidMouseMoveOffScrollbar(
2329 CurrentPhysicalTimeTicks()); 2335 CurrentPhysicalTimeTicks());
2330 StartScrollbarAnimation(); 2336 StartScrollbarAnimation();
2331 } 2337 }
2332 scroll_layer_id_when_mouse_over_scrollbar_ = 0; 2338 scroll_layer_id_when_mouse_over_scrollbar_ = 0;
2333 } 2339 }
2334 2340
2335 bool scroll_on_main_thread = false; 2341 bool scroll_on_main_thread = false;
2342 // wjm - what does FindScrollLayerForDeviceViewportPoint exactly do?
2336 LayerImpl* scroll_layer_impl = FindScrollLayerForDeviceViewportPoint( 2343 LayerImpl* scroll_layer_impl = FindScrollLayerForDeviceViewportPoint(
2337 device_viewport_point, InputHandler::Gesture, layer_impl, 2344 device_viewport_point, InputHandler::Gesture, layer_impl,
2338 &scroll_on_main_thread); 2345 &scroll_on_main_thread);
2339 if (scroll_on_main_thread || !scroll_layer_impl) 2346 if (scroll_on_main_thread || !scroll_layer_impl)
2340 return; 2347 return;
2341 2348
2342 ScrollbarAnimationController* animation_controller = 2349 ScrollbarAnimationController* animation_controller =
2343 scroll_layer_impl->scrollbar_animation_controller(); 2350 scroll_layer_impl->scrollbar_animation_controller();
2344 if (!animation_controller) 2351 if (!animation_controller)
2345 return; 2352 return;
2346 2353
2347 float distance_to_scrollbar = std::min( 2354 // TODO(wjmaclean) What to do with this? is it ok to choose from more than
2348 DeviceSpaceDistanceToLayer(device_viewport_point, 2355 // two scrollbars?
2349 scroll_layer_impl->horizontal_scrollbar_layer()), 2356 float distance_to_scrollbar = std::numeric_limits<float>::max();
2350 DeviceSpaceDistanceToLayer(device_viewport_point, 2357 for (LayerImpl::ScrollbarSet::iterator it =
2351 scroll_layer_impl->vertical_scrollbar_layer())); 2358 scroll_layer_impl->scrollbars()->begin();
2359 it != scroll_layer_impl->scrollbars()->end();
2360 ++it)
2361 distance_to_scrollbar = std::min(distance_to_scrollbar,
2362 DeviceSpaceDistanceToLayer(device_viewport_point, *it));
2352 2363
2353 bool should_animate = animation_controller->DidMouseMoveNear( 2364 bool should_animate = animation_controller->DidMouseMoveNear(
2354 CurrentPhysicalTimeTicks(), distance_to_scrollbar / device_scale_factor_); 2365 CurrentPhysicalTimeTicks(), distance_to_scrollbar / device_scale_factor_);
2355 if (should_animate) { 2366 if (should_animate) {
2356 client_->SetNeedsRedrawOnImplThread(); 2367 client_->SetNeedsRedrawOnImplThread();
2357 StartScrollbarAnimation(); 2368 StartScrollbarAnimation();
2358 } 2369 }
2359 } 2370 }
2360 2371
2361 bool LayerTreeHostImpl::HandleMouseOverScrollbar(LayerImpl* layer_impl, 2372 bool LayerTreeHostImpl::HandleMouseOverScrollbar(LayerImpl* layer_impl,
(...skipping 13 matching lines...) Expand all
2375 } 2386 }
2376 2387
2377 return false; 2388 return false;
2378 } 2389 }
2379 2390
2380 void LayerTreeHostImpl::PinchGestureBegin() { 2391 void LayerTreeHostImpl::PinchGestureBegin() {
2381 pinch_gesture_active_ = true; 2392 pinch_gesture_active_ = true;
2382 previous_pinch_anchor_ = gfx::Point(); 2393 previous_pinch_anchor_ = gfx::Point();
2383 client_->RenewTreePriority(); 2394 client_->RenewTreePriority();
2384 pinch_gesture_end_should_clear_scrolling_layer_ = !CurrentlyScrollingLayer(); 2395 pinch_gesture_end_should_clear_scrolling_layer_ = !CurrentlyScrollingLayer();
2385 active_tree_->SetCurrentlyScrollingLayer(RootScrollLayer()); 2396 if (active_tree_->OuterViewportScrollLayer()) {
2397 active_tree_->SetCurrentlyScrollingLayer(
2398 active_tree_->OuterViewportScrollLayer());
2399 } else {
2400 active_tree_->SetCurrentlyScrollingLayer(
2401 active_tree_->InnerViewportScrollLayer());
2402 }
2386 } 2403 }
2387 2404
2388 void LayerTreeHostImpl::PinchGestureUpdate(float magnify_delta, 2405 void LayerTreeHostImpl::PinchGestureUpdate(float magnify_delta,
2389 gfx::Point anchor) { 2406 gfx::Point anchor) {
2390 TRACE_EVENT0("cc", "LayerTreeHostImpl::PinchGestureUpdate"); 2407 TRACE_EVENT0("cc", "LayerTreeHostImpl::PinchGestureUpdate");
2391 2408
2392 if (!RootScrollLayer()) 2409 LayerImpl* pinch_scroll_layer = CurrentlyScrollingLayer();
2410 if (!pinch_scroll_layer)
2411 pinch_scroll_layer = InnerViewportScrollLayer();
2412
2413 if (!pinch_scroll_layer)
2393 return; 2414 return;
2394 2415
2395 // Keep the center-of-pinch anchor specified by (x, y) in a stable 2416 // Keep the center-of-pinch anchor specified by (x, y) in a stable
2396 // position over the course of the magnify. 2417 // position over the course of the magnify.
2397 float page_scale_delta = active_tree_->page_scale_delta(); 2418 float page_scale_delta = active_tree_->page_scale_delta();
2398 gfx::PointF previous_scale_anchor = 2419 gfx::PointF previous_scale_anchor =
2399 gfx::ScalePoint(anchor, 1.f / page_scale_delta); 2420 gfx::ScalePoint(anchor, 1.f / page_scale_delta);
2400 active_tree_->SetPageScaleDelta(page_scale_delta * magnify_delta); 2421 active_tree_->SetPageScaleDelta(page_scale_delta * magnify_delta);
2401 page_scale_delta = active_tree_->page_scale_delta(); 2422 page_scale_delta = active_tree_->page_scale_delta();
2402 gfx::PointF new_scale_anchor = 2423 gfx::PointF new_scale_anchor =
2403 gfx::ScalePoint(anchor, 1.f / page_scale_delta); 2424 gfx::ScalePoint(anchor, 1.f / page_scale_delta);
2404 gfx::Vector2dF move = previous_scale_anchor - new_scale_anchor; 2425 gfx::Vector2dF move = previous_scale_anchor - new_scale_anchor;
2405 2426
2406 previous_pinch_anchor_ = anchor; 2427 previous_pinch_anchor_ = anchor;
2407 2428
2408 move.Scale(1 / active_tree_->page_scale_factor()); 2429 move.Scale(1 / active_tree_->page_scale_factor());
2430 // When shrinking the page, the current scroll offset of the inner viewport
2431 // scroll layer may need to be adjusted so that it doesn't exceed its maximum
2432 // at the new page scale factor.
2433 if (magnify_delta < 1.f) {
2434 // If clamping the inner viewport scroll offset causes a change, it should
2435 // be accounted for from the intended move.
2436 move -= InnerViewportScrollLayer()->ClampScrollToMaxScrollOffset();
2437 }
2409 2438
2410 RootScrollLayer()->ScrollBy(move); 2439 // We manually manage the bubbling behaviour here as it is different to that
2440 // implemented in LayerTreeHostImpl::ScrollBy(). Specifically:
2441 // 1) we want to explicit limit the bubbling to the outer/inner viewports,
2442 // 2) we don't want the directional limitations on the unused parts that
2443 // ScrollBy() implements, and
2444 // 3) pinching should not engage the top controls manager.
2445 gfx::Vector2dF unused = pinch_scroll_layer->ScrollBy(move);
2411 2446
2447 if (!unused.IsZero() && pinch_scroll_layer == OuterViewportScrollLayer()) {
2448 InnerViewportScrollLayer()->ScrollBy(unused);
2449 InnerViewportScrollLayer()->ClampScrollToMaxScrollOffset();
2450 active_tree_->SetCurrentlyScrollingLayer(
2451 active_tree_->InnerViewportScrollLayer());
2452 }
2453 /*
2454 // Don't enable during unit tests.
2455 {
2456 gfx::Vector2d maxi = InnerViewportScrollLayer()->MaxScrollOffset();
2457 gfx::Vector2d maxo = OuterViewportScrollLayer()->MaxScrollOffset();
2458 gfx::Vector2dF offi = InnerViewportScrollLayer()->TotalScrollOffset();
2459 gfx::Vector2dF offo = OuterViewportScrollLayer()->TotalScrollOffset();
2460 fprintf(stderr, "wjm: Viewport summary: ovsl = (%f,%f) of (%d,%d), ivsl = (%f, %f) of (%d,%d)\n",
2461 offo.x(), offo.y(),
2462 maxo.x(), maxo.y(),
2463 offi.x(), offi.y(),
2464 maxi.x(), maxi.y());
2465 }
2466 */
2412 client_->SetNeedsCommitOnImplThread(); 2467 client_->SetNeedsCommitOnImplThread();
2413 client_->SetNeedsRedrawOnImplThread(); 2468 client_->SetNeedsRedrawOnImplThread();
2414 client_->RenewTreePriority(); 2469 client_->RenewTreePriority();
2415 } 2470 }
2416 2471
2417 void LayerTreeHostImpl::PinchGestureEnd() { 2472 void LayerTreeHostImpl::PinchGestureEnd() {
2418 pinch_gesture_active_ = false; 2473 pinch_gesture_active_ = false;
2419 if (pinch_gesture_end_should_clear_scrolling_layer_) { 2474 if (pinch_gesture_end_should_clear_scrolling_layer_) {
2420 pinch_gesture_end_should_clear_scrolling_layer_ = false; 2475 pinch_gesture_end_should_clear_scrolling_layer_ = false;
2421 ClearCurrentlyScrollingLayer(); 2476 ClearCurrentlyScrollingLayer();
(...skipping 28 matching lines...) Expand all
2450 active_tree_->set_sent_page_scale_delta(scroll_info->page_scale_delta); 2505 active_tree_->set_sent_page_scale_delta(scroll_info->page_scale_delta);
2451 2506
2452 return scroll_info.Pass(); 2507 return scroll_info.Pass();
2453 } 2508 }
2454 2509
2455 void LayerTreeHostImpl::SetFullRootLayerDamage() { 2510 void LayerTreeHostImpl::SetFullRootLayerDamage() {
2456 SetViewportDamage(gfx::Rect(DrawViewportSize())); 2511 SetViewportDamage(gfx::Rect(DrawViewportSize()));
2457 } 2512 }
2458 2513
2459 void LayerTreeHostImpl::AnimatePageScale(base::TimeTicks time) { 2514 void LayerTreeHostImpl::AnimatePageScale(base::TimeTicks time) {
2460 if (!page_scale_animation_ || !RootScrollLayer()) 2515 if (!page_scale_animation_)
2461 return; 2516 return;
2462 2517
2463 double monotonic_time = (time - base::TimeTicks()).InSecondsF(); 2518 double monotonic_time = (time - base::TimeTicks()).InSecondsF();
2464 gfx::Vector2dF scroll_total = RootScrollLayer()->scroll_offset() + 2519 gfx::Vector2dF scroll_total = active_tree_->TotalScrollOffset();
2465 RootScrollLayer()->ScrollDelta();
2466 2520
2467 if (!page_scale_animation_->IsAnimationStarted()) 2521 if (!page_scale_animation_->IsAnimationStarted())
2468 page_scale_animation_->StartAnimation(monotonic_time); 2522 page_scale_animation_->StartAnimation(monotonic_time);
2469 2523
2470 active_tree_->SetPageScaleDelta( 2524 active_tree_->SetPageScaleDelta(
2471 page_scale_animation_->PageScaleFactorAtTime(monotonic_time) / 2525 page_scale_animation_->PageScaleFactorAtTime(monotonic_time) /
2472 active_tree_->page_scale_factor()); 2526 active_tree_->page_scale_factor());
2473 gfx::Vector2dF next_scroll = 2527 gfx::Vector2dF next_scroll =
2474 page_scale_animation_->ScrollOffsetAtTime(monotonic_time); 2528 page_scale_animation_->ScrollOffsetAtTime(monotonic_time);
2475 2529
2476 RootScrollLayer()->ScrollBy(next_scroll - scroll_total); 2530 ScrollBy(gfx::Point(), next_scroll - scroll_total);
2477 client_->SetNeedsRedrawOnImplThread(); 2531 client_->SetNeedsRedrawOnImplThread();
2478 2532
2479 if (page_scale_animation_->IsAnimationCompleteAtTime(monotonic_time)) { 2533 if (page_scale_animation_->IsAnimationCompleteAtTime(monotonic_time)) {
2480 page_scale_animation_.reset(); 2534 page_scale_animation_.reset();
2481 client_->SetNeedsCommitOnImplThread(); 2535 client_->SetNeedsCommitOnImplThread();
2482 client_->RenewTreePriority(); 2536 client_->RenewTreePriority();
2483 } 2537 }
2484 } 2538 }
2485 2539
2486 void LayerTreeHostImpl::AnimateTopControls(base::TimeTicks time) { 2540 void LayerTreeHostImpl::AnimateTopControls(base::TimeTicks time) {
2487 if (!top_controls_manager_ || !RootScrollLayer()) 2541 if (!top_controls_manager_)
2488 return; 2542 return;
2489 gfx::Vector2dF scroll = top_controls_manager_->Animate(time); 2543 gfx::Vector2dF scroll = top_controls_manager_->Animate(time);
2490 UpdateMaxScrollOffset(); 2544 if (active_tree_->TotalScrollOffset().y() == 0.f)
2491 if (RootScrollLayer()->TotalScrollOffset().y() == 0.f)
2492 return; 2545 return;
2493 RootScrollLayer()->ScrollBy(gfx::ScaleVector2d( 2546 ScrollBy(gfx::Point(),
2494 scroll, 1.f / active_tree_->total_page_scale_factor())); 2547 gfx::ScaleVector2d(scroll,
2548 1.f / active_tree_->total_page_scale_factor()));
2495 } 2549 }
2496 2550
2497 void LayerTreeHostImpl::AnimateLayers(base::TimeTicks monotonic_time, 2551 void LayerTreeHostImpl::AnimateLayers(base::TimeTicks monotonic_time,
2498 base::Time wall_clock_time) { 2552 base::Time wall_clock_time) {
2499 if (!settings_.accelerated_animation_enabled || 2553 if (!settings_.accelerated_animation_enabled ||
2500 animation_registrar_->active_animation_controllers().empty() || 2554 animation_registrar_->active_animation_controllers().empty() ||
2501 !active_tree_->root_layer()) 2555 !active_tree_->root_layer())
2502 return; 2556 return;
2503 2557
2504 TRACE_EVENT0("cc", "LayerTreeHostImpl::AnimateLayers"); 2558 TRACE_EVENT0("cc", "LayerTreeHostImpl::AnimateLayers");
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
2816 std::set<UIResourceId>::iterator found_in_evicted = 2870 std::set<UIResourceId>::iterator found_in_evicted =
2817 evicted_ui_resources_.find(uid); 2871 evicted_ui_resources_.find(uid);
2818 if (found_in_evicted == evicted_ui_resources_.end()) 2872 if (found_in_evicted == evicted_ui_resources_.end())
2819 return; 2873 return;
2820 evicted_ui_resources_.erase(found_in_evicted); 2874 evicted_ui_resources_.erase(found_in_evicted);
2821 if (evicted_ui_resources_.empty()) 2875 if (evicted_ui_resources_.empty())
2822 client_->OnCanDrawStateChanged(CanDraw()); 2876 client_->OnCanDrawStateChanged(CanDraw());
2823 } 2877 }
2824 2878
2825 } // namespace cc 2879 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698