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

Side by Side Diff: cc/CCLayerTreeHostImpl.cpp

Issue 10916279: Chromium compositor change implementing page-scale driven pinch-zoom. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Remove dependency on content_common from cc for access to kEnablePinchZoomInCompositor. Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 6
7 #include "CCLayerTreeHostImpl.h" 7 #include "CCLayerTreeHostImpl.h"
8 8
9 #include "CCAppendQuadsData.h" 9 #include "CCAppendQuadsData.h"
10 #include "CCDamageTracker.h" 10 #include "CCDamageTracker.h"
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 return; 42 return;
43 } 43 }
44 44
45 TRACE_EVENT_ASYNC_END0("webkit", "CCLayerTreeHostImpl::setVisible", id); 45 TRACE_EVENT_ASYNC_END0("webkit", "CCLayerTreeHostImpl::setVisible", id);
46 } 46 }
47 47
48 } // namespace 48 } // namespace
49 49
50 namespace cc { 50 namespace cc {
51 51
52 float CCPinchZoomViewport::totalPageScaleFactor() const
53 {
54 return m_pageScaleFactor * m_pageScaleDelta;
55 }
56
57 void CCPinchZoomViewport::setPageScaleDelta(float delta)
58 {
59 // Clamp to the current min/max limits.
60 float finalMagnifyScale = m_pageScaleFactor * delta;
aelias_OOO_until_Jul13 2012/09/26 23:15:09 Rename "finalMagnifyScale" to "totalPageScaleFacto
Jeff Timanus 2012/10/01 21:42:36 Done.
61 if (m_minPageScaleFactor && finalMagnifyScale < m_minPageScaleFactor)
62 delta = m_minPageScaleFactor / m_pageScaleFactor;
63 else if (m_maxPageScaleFactor && finalMagnifyScale > m_maxPageScaleFactor)
64 delta = m_maxPageScaleFactor / m_pageScaleFactor;
65
66 if (delta == m_pageScaleDelta)
67 return;
68
69 m_pageScaleDelta = delta;
70 }
71
72 bool CCPinchZoomViewport::setPageScaleFactorAndLimits(float pageScaleFactor, flo at minPageScaleFactor, float maxPageScaleFactor)
73 {
74 if (!pageScaleFactor)
aelias_OOO_until_Jul13 2012/09/26 23:15:09 Replace this with ASSERT(pageScaleFactor); since i
Jeff Timanus 2012/10/01 21:42:36 Done.
75 return false;
76
77 if (m_sentPageScaleDelta == 1 && pageScaleFactor == m_pageScaleFactor && min PageScaleFactor == m_minPageScaleFactor && maxPageScaleFactor == m_maxPageScaleF actor)
78 return false;
79
80 m_minPageScaleFactor = minPageScaleFactor;
81 m_maxPageScaleFactor = maxPageScaleFactor;
82
83 m_pageScaleFactor = pageScaleFactor;
84 return true;
85 }
86
87 FloatRect CCPinchZoomViewport::bounds() const
88 {
89 FloatSize scaledBounds = m_unpinchedBounds;
90 float totalScale = totalPageScaleFactor();
aelias_OOO_until_Jul13 2012/09/26 23:15:09 No need for this local variable.
Jeff Timanus 2012/10/01 21:42:36 Done.
91 if (totalScale > 1)
aelias_OOO_until_Jul13 2012/09/26 23:15:09 Remove this if(). It's correct in the == 1 or < 1
aelias_OOO_until_Jul13 2012/09/26 23:19:04 Actually, maybe it's not. As I suggested in my co
92 scaledBounds.scale(1 / totalScale);
93
94 FloatRect bounds;
95 bounds.setSize(scaledBounds);
aelias_OOO_until_Jul13 2012/09/26 23:15:09 Use the FloatRect constructor instead.
Jeff Timanus 2012/10/01 21:42:36 Done.
96 bounds.setLocation(m_pinchViewportScrollDelta);
97
98 return bounds;
99 }
100
101 FloatSize CCPinchZoomViewport::applyScroll(FloatSize& delta)
102 {
103 FloatSize overflow;
104 FloatRect pinchedBounds = bounds();
105
106 pinchedBounds.move(delta);
107 if (pinchedBounds.x() < 0) {
108 pinchedBounds.setX(0);
109 overflow.setWidth(pinchedBounds.x());
aelias_OOO_until_Jul13 2012/09/26 23:15:09 Looks like a bug here. Seems overflow values shou
Jeff Timanus 2012/10/01 21:42:36 Good catch. I'm surprised that this wasn't causin
Jeff Timanus 2012/10/01 21:42:36 Good catch. Fixed.
110 }
111
112 if (pinchedBounds.y() < 0) {
113 pinchedBounds.setY(0);
114 overflow.setHeight(pinchedBounds.y());
115 }
116
117 if (pinchedBounds.maxX() > m_unpinchedBounds.width()) {
118 pinchedBounds.move(m_unpinchedBounds.width() - pinchedBounds.maxX(), 0);
119 overflow.setWidth(pinchedBounds.maxX() - m_unpinchedBounds.width());
120 }
121
122 if (pinchedBounds.maxY() > m_unpinchedBounds.height()) {
123 pinchedBounds.move(0, m_unpinchedBounds.height() - pinchedBounds.maxY()) ;
124 overflow.setHeight(pinchedBounds.maxY() - m_unpinchedBounds.height());
125 }
126 m_pinchViewportScrollDelta = pinchedBounds.location();
127
128 return overflow;
129 }
130
52 class CCLayerTreeHostImplTimeSourceAdapter : public CCTimeSourceClient { 131 class CCLayerTreeHostImplTimeSourceAdapter : public CCTimeSourceClient {
53 WTF_MAKE_NONCOPYABLE(CCLayerTreeHostImplTimeSourceAdapter); 132 WTF_MAKE_NONCOPYABLE(CCLayerTreeHostImplTimeSourceAdapter);
54 public: 133 public:
55 static PassOwnPtr<CCLayerTreeHostImplTimeSourceAdapter> create(CCLayerTreeHo stImpl* layerTreeHostImpl, PassRefPtr<CCDelayBasedTimeSource> timeSource) 134 static PassOwnPtr<CCLayerTreeHostImplTimeSourceAdapter> create(CCLayerTreeHo stImpl* layerTreeHostImpl, PassRefPtr<CCDelayBasedTimeSource> timeSource)
56 { 135 {
57 return adoptPtr(new CCLayerTreeHostImplTimeSourceAdapter(layerTreeHostIm pl, timeSource)); 136 return adoptPtr(new CCLayerTreeHostImplTimeSourceAdapter(layerTreeHostIm pl, timeSource));
58 } 137 }
59 virtual ~CCLayerTreeHostImplTimeSourceAdapter() 138 virtual ~CCLayerTreeHostImplTimeSourceAdapter()
60 { 139 {
61 m_timeSource->setClient(0); 140 m_timeSource->setClient(0);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 , m_rootScrollLayerImpl(0) 188 , m_rootScrollLayerImpl(0)
110 , m_currentlyScrollingLayerImpl(0) 189 , m_currentlyScrollingLayerImpl(0)
111 , m_hudLayerImpl(0) 190 , m_hudLayerImpl(0)
112 , m_scrollingLayerIdFromPreviousTree(-1) 191 , m_scrollingLayerIdFromPreviousTree(-1)
113 , m_scrollDeltaIsInScreenSpace(false) 192 , m_scrollDeltaIsInScreenSpace(false)
114 , m_settings(settings) 193 , m_settings(settings)
115 , m_deviceScaleFactor(1) 194 , m_deviceScaleFactor(1)
116 , m_visible(true) 195 , m_visible(true)
117 , m_contentsTexturesPurged(false) 196 , m_contentsTexturesPurged(false)
118 , m_memoryAllocationLimitBytes(CCPrioritizedTextureManager::defaultMemoryAll ocationLimit()) 197 , m_memoryAllocationLimitBytes(CCPrioritizedTextureManager::defaultMemoryAll ocationLimit())
119 , m_pageScale(1)
120 , m_pageScaleDelta(1)
121 , m_sentPageScaleDelta(1)
122 , m_minPageScale(0)
123 , m_maxPageScale(0)
124 , m_backgroundColor(0) 198 , m_backgroundColor(0)
125 , m_hasTransparentBackground(false) 199 , m_hasTransparentBackground(false)
126 , m_needsAnimateLayers(false) 200 , m_needsAnimateLayers(false)
127 , m_pinchGestureActive(false) 201 , m_pinchGestureActive(false)
128 , m_fpsCounter(CCFrameRateCounter::create()) 202 , m_fpsCounter(CCFrameRateCounter::create())
129 , m_debugRectHistory(CCDebugRectHistory::create()) 203 , m_debugRectHistory(CCDebugRectHistory::create())
130 { 204 {
131 ASSERT(CCProxy::isImplThread()); 205 ASSERT(CCProxy::isImplThread());
132 didVisibilityChange(this, m_visible); 206 didVisibilityChange(this, m_visible);
133 } 207 }
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 animateLayers(monotonicTime, wallClockTime); 263 animateLayers(monotonicTime, wallClockTime);
190 animateScrollbars(monotonicTime); 264 animateScrollbars(monotonicTime);
191 } 265 }
192 266
193 void CCLayerTreeHostImpl::startPageScaleAnimation(const IntSize& targetPosition, bool anchorPoint, float pageScale, double startTime, double duration) 267 void CCLayerTreeHostImpl::startPageScaleAnimation(const IntSize& targetPosition, bool anchorPoint, float pageScale, double startTime, double duration)
194 { 268 {
195 if (!m_rootScrollLayerImpl) 269 if (!m_rootScrollLayerImpl)
196 return; 270 return;
197 271
198 IntSize scrollTotal = flooredIntSize(m_rootScrollLayerImpl->scrollPosition() + m_rootScrollLayerImpl->scrollDelta()); 272 IntSize scrollTotal = flooredIntSize(m_rootScrollLayerImpl->scrollPosition() + m_rootScrollLayerImpl->scrollDelta());
199 scrollTotal.scale(m_pageScaleDelta); 273 scrollTotal.scale(m_pinchZoomViewport.pageScaleDelta());
200 float scaleTotal = m_pageScale * m_pageScaleDelta; 274 float scaleTotal = m_pinchZoomViewport.totalPageScaleFactor();
201 IntSize scaledContentSize = contentSize(); 275 IntSize scaledContentSize = contentSize();
202 scaledContentSize.scale(m_pageScaleDelta); 276 scaledContentSize.scale(m_pinchZoomViewport.pageScaleDelta());
203 277
204 m_pageScaleAnimation = CCPageScaleAnimation::create(scrollTotal, scaleTotal, m_deviceViewportSize, scaledContentSize, startTime); 278 m_pageScaleAnimation = CCPageScaleAnimation::create(scrollTotal, scaleTotal, m_deviceViewportSize, scaledContentSize, startTime);
205 279
206 if (anchorPoint) { 280 if (anchorPoint) {
207 IntSize windowAnchor(targetPosition); 281 IntSize windowAnchor(targetPosition);
208 windowAnchor.scale(scaleTotal / pageScale); 282 windowAnchor.scale(scaleTotal / pageScale);
209 windowAnchor -= scrollTotal; 283 windowAnchor -= scrollTotal;
210 m_pageScaleAnimation->zoomWithAnchor(windowAnchor, pageScale, duration); 284 m_pageScaleAnimation->zoomWithAnchor(windowAnchor, pageScale, duration);
211 } else 285 } else
212 m_pageScaleAnimation->zoomTo(targetPosition, pageScale, duration); 286 m_pageScaleAnimation->zoomTo(targetPosition, pageScale, duration);
(...skipping 14 matching lines...) Expand all
227 // damage rect. The root damage rect is then used to scissor each surface. 301 // damage rect. The root damage rect is then used to scissor each surface.
228 302
229 for (int surfaceIndex = renderSurfaceLayerList.size() - 1; surfaceIndex >= 0 ; --surfaceIndex) { 303 for (int surfaceIndex = renderSurfaceLayerList.size() - 1; surfaceIndex >= 0 ; --surfaceIndex) {
230 CCLayerImpl* renderSurfaceLayer = renderSurfaceLayerList[surfaceIndex]; 304 CCLayerImpl* renderSurfaceLayer = renderSurfaceLayerList[surfaceIndex];
231 CCRenderSurface* renderSurface = renderSurfaceLayer->renderSurface(); 305 CCRenderSurface* renderSurface = renderSurfaceLayer->renderSurface();
232 ASSERT(renderSurface); 306 ASSERT(renderSurface);
233 renderSurface->damageTracker()->updateDamageTrackingState(renderSurface- >layerList(), renderSurfaceLayer->id(), renderSurface->surfacePropertyChangedOnl yFromDescendant(), renderSurface->contentRect(), renderSurfaceLayer->maskLayer() , renderSurfaceLayer->filters()); 307 renderSurface->damageTracker()->updateDamageTrackingState(renderSurface- >layerList(), renderSurfaceLayer->id(), renderSurface->surfacePropertyChangedOnl yFromDescendant(), renderSurface->contentRect(), renderSurfaceLayer->maskLayer() , renderSurfaceLayer->filters());
234 } 308 }
235 } 309 }
236 310
311 void CCLayerTreeHostImpl::updateRootScrollLayerImplTransform()
312 {
313 if (m_rootScrollLayerImpl) {
314 m_rootScrollLayerImpl->setImplTransform(implTransform());
315 }
316 }
317
237 void CCLayerTreeHostImpl::calculateRenderSurfaceLayerList(CCLayerList& renderSur faceLayerList) 318 void CCLayerTreeHostImpl::calculateRenderSurfaceLayerList(CCLayerList& renderSur faceLayerList)
238 { 319 {
239 ASSERT(renderSurfaceLayerList.isEmpty()); 320 ASSERT(renderSurfaceLayerList.isEmpty());
240 ASSERT(m_rootLayerImpl); 321 ASSERT(m_rootLayerImpl);
241 ASSERT(m_renderer); // For maxTextureSize. 322 ASSERT(m_renderer); // For maxTextureSize.
242 323
243 { 324 {
325 updateRootScrollLayerImplTransform();
326
244 TRACE_EVENT0("cc", "CCLayerTreeHostImpl::calcDrawEtc"); 327 TRACE_EVENT0("cc", "CCLayerTreeHostImpl::calcDrawEtc");
245 CCLayerTreeHostCommon::calculateDrawTransforms(m_rootLayerImpl.get(), de viceViewportSize(), m_deviceScaleFactor, &m_layerSorter, rendererCapabilities(). maxTextureSize, renderSurfaceLayerList); 328 CCLayerTreeHostCommon::calculateDrawTransforms(m_rootLayerImpl.get(), de viceViewportSize(), m_deviceScaleFactor, &m_layerSorter, rendererCapabilities(). maxTextureSize, renderSurfaceLayerList);
246 CCLayerTreeHostCommon::calculateVisibleRects(renderSurfaceLayerList); 329 CCLayerTreeHostCommon::calculateVisibleRects(renderSurfaceLayerList);
247 330
248 trackDamageForAllSurfaces(m_rootLayerImpl.get(), renderSurfaceLayerList) ; 331 trackDamageForAllSurfaces(m_rootLayerImpl.get(), renderSurfaceLayerList) ;
249 } 332 }
250 } 333 }
251 334
252 void CCLayerTreeHostImpl::FrameData::appendRenderPass(PassOwnPtr<CCRenderPass> r enderPass) 335 void CCLayerTreeHostImpl::FrameData::appendRenderPass(PassOwnPtr<CCRenderPass> r enderPass)
253 { 336 {
(...skipping 508 matching lines...) Expand 10 before | Expand all | Expand 10 after
762 } 845 }
763 846
764 void CCLayerTreeHostImpl::setViewportSize(const IntSize& layoutViewportSize, con st IntSize& deviceViewportSize) 847 void CCLayerTreeHostImpl::setViewportSize(const IntSize& layoutViewportSize, con st IntSize& deviceViewportSize)
765 { 848 {
766 if (layoutViewportSize == m_layoutViewportSize && deviceViewportSize == m_de viceViewportSize) 849 if (layoutViewportSize == m_layoutViewportSize && deviceViewportSize == m_de viceViewportSize)
767 return; 850 return;
768 851
769 m_layoutViewportSize = layoutViewportSize; 852 m_layoutViewportSize = layoutViewportSize;
770 m_deviceViewportSize = deviceViewportSize; 853 m_deviceViewportSize = deviceViewportSize;
771 854
855 m_pinchZoomViewport.setUnpinchedBounds(FloatSize(layoutViewportSize));
856
772 updateMaxScrollPosition(); 857 updateMaxScrollPosition();
773 858
774 if (m_renderer) 859 if (m_renderer)
775 m_renderer->viewportChanged(); 860 m_renderer->viewportChanged();
776 861
777 m_client->onCanDrawStateChanged(canDraw()); 862 m_client->onCanDrawStateChanged(canDraw());
778 } 863 }
779 864
780 static void adjustScrollsForPageScaleChange(CCLayerImpl* layerImpl, float pageSc aleChange) 865 static void adjustScrollsForPageScaleChange(CCLayerImpl* layerImpl, float pageSc aleChange)
781 { 866 {
(...skipping 13 matching lines...) Expand all
795 880
796 void CCLayerTreeHostImpl::setDeviceScaleFactor(float deviceScaleFactor) 881 void CCLayerTreeHostImpl::setDeviceScaleFactor(float deviceScaleFactor)
797 { 882 {
798 if (deviceScaleFactor == m_deviceScaleFactor) 883 if (deviceScaleFactor == m_deviceScaleFactor)
799 return; 884 return;
800 m_deviceScaleFactor = deviceScaleFactor; 885 m_deviceScaleFactor = deviceScaleFactor;
801 886
802 updateMaxScrollPosition(); 887 updateMaxScrollPosition();
803 } 888 }
804 889
890 float CCLayerTreeHostImpl::pageScaleFactor() const
891 {
892 return m_pinchZoomViewport.pageScaleFactor();
893 }
805 894
806 void CCLayerTreeHostImpl::setPageScaleFactorAndLimits(float pageScale, float min PageScale, float maxPageScale) 895 void CCLayerTreeHostImpl::setPageScaleFactorAndLimits(float pageScaleFactor, flo at minPageScaleFactor, float maxPageScaleFactor)
807 { 896 {
808 if (!pageScale) 897 if (!pageScaleFactor)
809 return; 898 return;
810 899
811 if (m_sentPageScaleDelta == 1 && pageScale == m_pageScale && minPageScale == m_minPageScale && maxPageScale == m_maxPageScale) 900 float pageScaleChange = pageScaleFactor / m_pinchZoomViewport.pageScaleFacto r();
812 return; 901 m_pinchZoomViewport.setPageScaleFactorAndLimits(pageScaleFactor, minPageScal eFactor, maxPageScaleFactor);
813 902
814 m_minPageScale = minPageScale; 903 if (!CCSettings::pageScalePinchZoomEnabled()) {
815 m_maxPageScale = maxPageScale; 904 if (pageScaleChange != 1)
816 905 adjustScrollsForPageScaleChange(m_rootScrollLayerImpl, pageScaleChan ge);
817 float pageScaleChange = pageScale / m_pageScale; 906 }
818 m_pageScale = pageScale;
819
820 if (pageScaleChange != 1)
821 adjustScrollsForPageScaleChange(m_rootScrollLayerImpl, pageScaleChange);
822 907
823 // Clamp delta to limits and refresh display matrix. 908 // Clamp delta to limits and refresh display matrix.
824 setPageScaleDelta(m_pageScaleDelta / m_sentPageScaleDelta); 909 setPageScaleDelta(m_pinchZoomViewport.pageScaleDelta() / m_pinchZoomViewport .sentPageScaleDelta());
825 m_sentPageScaleDelta = 1; 910 m_pinchZoomViewport.setSentPageScaleDelta(1);
826 if (m_rootScrollLayerImpl)
827 m_rootScrollLayerImpl->setPageScaleDelta(m_pageScaleDelta);
828 } 911 }
829 912
830 void CCLayerTreeHostImpl::setPageScaleDelta(float delta) 913 void CCLayerTreeHostImpl::setPageScaleDelta(float delta)
831 { 914 {
832 // Clamp to the current min/max limits. 915 m_pinchZoomViewport.setPageScaleDelta(delta);
833 float finalMagnifyScale = m_pageScale * delta;
834 if (m_minPageScale && finalMagnifyScale < m_minPageScale)
835 delta = m_minPageScale / m_pageScale;
836 else if (m_maxPageScale && finalMagnifyScale > m_maxPageScale)
837 delta = m_maxPageScale / m_pageScale;
838
839 if (delta == m_pageScaleDelta)
840 return;
841
842 m_pageScaleDelta = delta;
843 916
844 updateMaxScrollPosition(); 917 updateMaxScrollPosition();
845 if (m_rootScrollLayerImpl)
846 m_rootScrollLayerImpl->setPageScaleDelta(m_pageScaleDelta);
847 } 918 }
848 919
849 void CCLayerTreeHostImpl::updateMaxScrollPosition() 920 void CCLayerTreeHostImpl::updateMaxScrollPosition()
850 { 921 {
851 if (!m_rootScrollLayerImpl || !m_rootScrollLayerImpl->children().size()) 922 if (!m_rootScrollLayerImpl || !m_rootScrollLayerImpl->children().size())
852 return; 923 return;
853 924
854 FloatSize viewBounds = m_deviceViewportSize; 925 FloatSize viewBounds = m_deviceViewportSize;
855 if (CCLayerImpl* clipLayer = m_rootScrollLayerImpl->parent()) { 926 if (CCLayerImpl* clipLayer = m_rootScrollLayerImpl->parent()) {
856 // Compensate for non-overlay scrollbars. 927 // Compensate for non-overlay scrollbars.
857 if (clipLayer->masksToBounds()) { 928 if (clipLayer->masksToBounds()) {
858 viewBounds = clipLayer->bounds(); 929 viewBounds = clipLayer->bounds();
859 viewBounds.scale(m_deviceScaleFactor); 930 viewBounds.scale(m_deviceScaleFactor);
860 } 931 }
861 } 932 }
862 viewBounds.scale(1 / m_pageScaleDelta);
863 933
864 // maxScroll is computed in physical pixels, but scroll positions are in lay out pixels. 934 IntSize contentBounds = contentSize();
865 IntSize maxScroll = contentSize() - expandedIntSize(viewBounds); 935 if (CCSettings::pageScalePinchZoomEnabled()) {
936 // Pinch with pageScale scrolls entirely in layout space. contentSize
937 // returns the bounds including the page scale factor, so calculate the
938 // pre page-scale layout size here.
939 float pageScaleFactor = m_pinchZoomViewport.pageScaleFactor();
940 contentBounds.setWidth(contentBounds.width() / pageScaleFactor);
941 contentBounds.setHeight(contentBounds.height() / pageScaleFactor);
942 } else {
943 viewBounds.scale(1 / m_pinchZoomViewport.pageScaleDelta());
944 }
945
946 IntSize maxScroll = contentBounds - expandedIntSize(viewBounds);
866 maxScroll.scale(1 / m_deviceScaleFactor); 947 maxScroll.scale(1 / m_deviceScaleFactor);
948
867 // The viewport may be larger than the contents in some cases, such as 949 // The viewport may be larger than the contents in some cases, such as
868 // having a vertical scrollbar but no horizontal overflow. 950 // having a vertical scrollbar but no horizontal overflow.
869 maxScroll.clampNegativeToZero(); 951 maxScroll.clampNegativeToZero();
870 952
871 m_rootScrollLayerImpl->setMaxScrollPosition(maxScroll); 953 m_rootScrollLayerImpl->setMaxScrollPosition(maxScroll);
872 } 954 }
873 955
874 void CCLayerTreeHostImpl::setNeedsRedraw() 956 void CCLayerTreeHostImpl::setNeedsRedraw()
875 { 957 {
876 m_client->setNeedsRedrawOnImplThread(); 958 m_client->setNeedsRedrawOnImplThread();
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
939 m_currentlyScrollingLayerImpl = potentiallyScrollingLayerImpl; 1021 m_currentlyScrollingLayerImpl = potentiallyScrollingLayerImpl;
940 // Gesture events need to be transformed from screen coordinates to loca l layer coordinates 1022 // Gesture events need to be transformed from screen coordinates to loca l layer coordinates
941 // so that the scrolling contents exactly follow the user's finger. In c ontrast, wheel 1023 // so that the scrolling contents exactly follow the user's finger. In c ontrast, wheel
942 // events are already in local layer coordinates so we can just apply th em directly. 1024 // events are already in local layer coordinates so we can just apply th em directly.
943 m_scrollDeltaIsInScreenSpace = (type == Gesture); 1025 m_scrollDeltaIsInScreenSpace = (type == Gesture);
944 return ScrollStarted; 1026 return ScrollStarted;
945 } 1027 }
946 return ScrollIgnored; 1028 return ScrollIgnored;
947 } 1029 }
948 1030
949 static FloatSize scrollLayerWithScreenSpaceDelta(CCLayerImpl& layerImpl, const F loatPoint& screenSpacePoint, const FloatSize& screenSpaceDelta) 1031 static FloatSize scrollLayerWithScreenSpaceDelta(CCPinchZoomViewport* viewport, CCLayerImpl& layerImpl, const FloatPoint& screenSpacePoint, const FloatSize& scr eenSpaceDelta)
950 { 1032 {
951 // Layers with non-invertible screen space transforms should not have passed the scroll hit 1033 // Layers with non-invertible screen space transforms should not have passed the scroll hit
952 // test in the first place. 1034 // test in the first place.
953 ASSERT(layerImpl.screenSpaceTransform().isInvertible()); 1035 ASSERT(layerImpl.screenSpaceTransform().isInvertible());
954 WebTransformationMatrix inverseScreenSpaceTransform = layerImpl.screenSpaceT ransform().inverse(); 1036 WebTransformationMatrix inverseScreenSpaceTransform = layerImpl.screenSpaceT ransform().inverse();
955 1037
956 // First project the scroll start and end points to local layer space to fin d the scroll delta 1038 // First project the scroll start and end points to local layer space to fin d the scroll delta
957 // in layer coordinates. 1039 // in layer coordinates.
958 bool startClipped, endClipped; 1040 bool startClipped, endClipped;
959 FloatPoint screenSpaceEndPoint = screenSpacePoint + screenSpaceDelta; 1041 FloatPoint screenSpaceEndPoint = screenSpacePoint + screenSpaceDelta;
960 FloatPoint localStartPoint = CCMathUtil::projectPoint(inverseScreenSpaceTran sform, screenSpacePoint, startClipped); 1042 FloatPoint localStartPoint = CCMathUtil::projectPoint(inverseScreenSpaceTran sform, screenSpacePoint, startClipped);
961 FloatPoint localEndPoint = CCMathUtil::projectPoint(inverseScreenSpaceTransf orm, screenSpaceEndPoint, endClipped); 1043 FloatPoint localEndPoint = CCMathUtil::projectPoint(inverseScreenSpaceTransf orm, screenSpaceEndPoint, endClipped);
962 1044
963 // In general scroll point coordinates should not get clipped. 1045 // In general scroll point coordinates should not get clipped.
964 ASSERT(!startClipped); 1046 ASSERT(!startClipped);
965 ASSERT(!endClipped); 1047 ASSERT(!endClipped);
966 if (startClipped || endClipped) 1048 if (startClipped || endClipped)
967 return FloatSize(); 1049 return FloatSize();
968 1050
969 // Apply the scroll delta. 1051 // Apply the scroll delta.
970 FloatSize previousDelta(layerImpl.scrollDelta()); 1052 FloatSize previousDelta(layerImpl.scrollDelta());
971 layerImpl.scrollBy(localEndPoint - localStartPoint); 1053 FloatSize unscrolled = layerImpl.scrollBy(localEndPoint - localStartPoint);
1054
1055 if (viewport)
1056 viewport->applyScroll(unscrolled);
972 1057
973 // Calculate the applied scroll delta in screen space coordinates. 1058 // Calculate the applied scroll delta in screen space coordinates.
974 FloatPoint actualLocalEndPoint = localStartPoint + layerImpl.scrollDelta() - previousDelta; 1059 FloatPoint actualLocalEndPoint = localStartPoint + layerImpl.scrollDelta() - previousDelta;
975 FloatPoint actualScreenSpaceEndPoint = CCMathUtil::mapPoint(layerImpl.screen SpaceTransform(), actualLocalEndPoint, endClipped); 1060 FloatPoint actualScreenSpaceEndPoint = CCMathUtil::mapPoint(layerImpl.screen SpaceTransform(), actualLocalEndPoint, endClipped);
976 ASSERT(!endClipped); 1061 ASSERT(!endClipped);
977 if (endClipped) 1062 if (endClipped)
978 return FloatSize(); 1063 return FloatSize();
979 return actualScreenSpaceEndPoint - screenSpacePoint; 1064 return actualScreenSpaceEndPoint - screenSpacePoint;
980 } 1065 }
981 1066
(...skipping 11 matching lines...) Expand all
993 return; 1078 return;
994 1079
995 FloatSize pendingDelta(scrollDelta); 1080 FloatSize pendingDelta(scrollDelta);
996 1081
997 pendingDelta.scale(m_deviceScaleFactor); 1082 pendingDelta.scale(m_deviceScaleFactor);
998 1083
999 for (CCLayerImpl* layerImpl = m_currentlyScrollingLayerImpl; layerImpl; laye rImpl = layerImpl->parent()) { 1084 for (CCLayerImpl* layerImpl = m_currentlyScrollingLayerImpl; layerImpl; laye rImpl = layerImpl->parent()) {
1000 if (!layerImpl->scrollable()) 1085 if (!layerImpl->scrollable())
1001 continue; 1086 continue;
1002 1087
1088 CCPinchZoomViewport* viewport = layerImpl == m_rootScrollLayerImpl ? &m_ pinchZoomViewport : 0;
1003 FloatSize appliedDelta; 1089 FloatSize appliedDelta;
1004 if (m_scrollDeltaIsInScreenSpace) 1090 if (m_scrollDeltaIsInScreenSpace)
1005 appliedDelta = scrollLayerWithScreenSpaceDelta(*layerImpl, viewportP oint, pendingDelta); 1091 appliedDelta = scrollLayerWithScreenSpaceDelta(viewport, *layerImpl, viewportPoint, pendingDelta);
1006 else 1092 else
1007 appliedDelta = scrollLayerWithLocalDelta(*layerImpl, pendingDelta); 1093 appliedDelta = scrollLayerWithLocalDelta(*layerImpl, pendingDelta);
1008 1094
1009 // If the layer wasn't able to move, try the next one in the hierarchy. 1095 // If the layer wasn't able to move, try the next one in the hierarchy.
1010 float moveThresholdSquared = 0.1f * 0.1f; 1096 float moveThresholdSquared = 0.1f * 0.1f;
1011 if (appliedDelta.diagonalLengthSquared() < moveThresholdSquared) 1097 if (appliedDelta.diagonalLengthSquared() < moveThresholdSquared)
1012 continue; 1098 continue;
1013 1099
1014 // If the applied delta is within 45 degrees of the input delta, bail ou t to make it easier 1100 // If the applied delta is within 45 degrees of the input delta, bail ou t to make it easier
1015 // to scroll just one layer in one direction without affecting any of it s parents. 1101 // to scroll just one layer in one direction without affecting any of it s parents.
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1060 TRACE_EVENT0("cc", "CCLayerTreeHostImpl::pinchGestureUpdate"); 1146 TRACE_EVENT0("cc", "CCLayerTreeHostImpl::pinchGestureUpdate");
1061 1147
1062 if (!m_rootScrollLayerImpl) 1148 if (!m_rootScrollLayerImpl)
1063 return; 1149 return;
1064 1150
1065 if (m_previousPinchAnchor == IntPoint::zero()) 1151 if (m_previousPinchAnchor == IntPoint::zero())
1066 m_previousPinchAnchor = anchor; 1152 m_previousPinchAnchor = anchor;
1067 1153
1068 // Keep the center-of-pinch anchor specified by (x, y) in a stable 1154 // Keep the center-of-pinch anchor specified by (x, y) in a stable
1069 // position over the course of the magnify. 1155 // position over the course of the magnify.
1070 FloatPoint previousScaleAnchor(m_previousPinchAnchor.x() / m_pageScaleDelta, m_previousPinchAnchor.y() / m_pageScaleDelta); 1156 float pageScaleDelta = m_pinchZoomViewport.pageScaleDelta();
1071 setPageScaleDelta(m_pageScaleDelta * magnifyDelta); 1157 FloatPoint previousScaleAnchor(m_previousPinchAnchor.x() / pageScaleDelta,
1072 FloatPoint newScaleAnchor(anchor.x() / m_pageScaleDelta, anchor.y() / m_page ScaleDelta); 1158 m_previousPinchAnchor.y() / pageScaleDelta);
1159 setPageScaleDelta(pageScaleDelta * magnifyDelta);
1160 pageScaleDelta = m_pinchZoomViewport.pageScaleDelta();
1161 FloatPoint newScaleAnchor(anchor.x() / pageScaleDelta, anchor.y() / pageScal eDelta);
1073 FloatSize move = previousScaleAnchor - newScaleAnchor; 1162 FloatSize move = previousScaleAnchor - newScaleAnchor;
1074 1163
1075 m_previousPinchAnchor = anchor; 1164 m_previousPinchAnchor = anchor;
1076 1165
1077 m_rootScrollLayerImpl->scrollBy(roundedIntSize(move)); 1166 if (CCSettings::pageScalePinchZoomEnabled()) {
1167 // Compute the application of the delta with respect to the current page zoom of the page.
1168 move.scale(1 / (m_pinchZoomViewport.pageScaleFactor() * m_deviceScaleFac tor));
1169 }
1170
1171 FloatSize scrollOverflow = CCSettings::pageScalePinchZoomEnabled() ? m_pinch ZoomViewport.applyScroll(move) : move;
1172 m_rootScrollLayerImpl->scrollBy(roundedIntSize(scrollOverflow));
1078 1173
1079 if (m_rootScrollLayerImpl->scrollbarAnimationController()) 1174 if (m_rootScrollLayerImpl->scrollbarAnimationController())
1080 m_rootScrollLayerImpl->scrollbarAnimationController()->didPinchGestureUp date(); 1175 m_rootScrollLayerImpl->scrollbarAnimationController()->didPinchGestureUp date();
1081 1176
1082 m_client->setNeedsCommitOnImplThread(); 1177 m_client->setNeedsCommitOnImplThread();
1083 m_client->setNeedsRedrawOnImplThread(); 1178 m_client->setNeedsRedrawOnImplThread();
1084 } 1179 }
1085 1180
1086 void CCLayerTreeHostImpl::pinchGestureEnd() 1181 void CCLayerTreeHostImpl::pinchGestureEnd()
1087 { 1182 {
1088 m_pinchGestureActive = false; 1183 m_pinchGestureActive = false;
1089 1184
1090 if (m_rootScrollLayerImpl && m_rootScrollLayerImpl->scrollbarAnimationContro ller()) 1185 if (m_rootScrollLayerImpl && m_rootScrollLayerImpl->scrollbarAnimationContro ller())
1091 m_rootScrollLayerImpl->scrollbarAnimationController()->didPinchGestureEn d(); 1186 m_rootScrollLayerImpl->scrollbarAnimationController()->didPinchGestureEn d();
1092 1187
1093 m_client->setNeedsCommitOnImplThread(); 1188 m_client->setNeedsCommitOnImplThread();
1094 } 1189 }
1095 1190
1096 void CCLayerTreeHostImpl::computeDoubleTapZoomDeltas(CCScrollAndScaleSet* scroll Info) 1191 void CCLayerTreeHostImpl::computeDoubleTapZoomDeltas(CCScrollAndScaleSet* scroll Info)
1097 { 1192 {
1098 float pageScale = m_pageScaleAnimation->finalPageScale(); 1193 float pageScale = m_pageScaleAnimation->finalPageScale();
1099 IntSize scrollOffset = m_pageScaleAnimation->finalScrollOffset(); 1194 IntSize scrollOffset = m_pageScaleAnimation->finalScrollOffset();
1100 scrollOffset.scale(m_pageScale / pageScale); 1195 scrollOffset.scale(m_pinchZoomViewport.pageScaleFactor() / pageScale);
1101 makeScrollAndScaleSet(scrollInfo, scrollOffset, pageScale); 1196 makeScrollAndScaleSet(scrollInfo, scrollOffset, pageScale);
1102 } 1197 }
1103 1198
1104 void CCLayerTreeHostImpl::computePinchZoomDeltas(CCScrollAndScaleSet* scrollInfo ) 1199 void CCLayerTreeHostImpl::computePinchZoomDeltas(CCScrollAndScaleSet* scrollInfo )
1105 { 1200 {
1106 if (!m_rootScrollLayerImpl) 1201 if (!m_rootScrollLayerImpl)
1107 return; 1202 return;
1108 1203
1109 // Only send fake scroll/zoom deltas if we're pinch zooming out by a 1204 // Only send fake scroll/zoom deltas if we're pinch zooming out by a
1110 // significant amount. This also ensures only one fake delta set will be 1205 // significant amount. This also ensures only one fake delta set will be
1111 // sent. 1206 // sent.
1112 const float pinchZoomOutSensitivity = 0.95f; 1207 const float pinchZoomOutSensitivity = 0.95f;
1113 if (m_pageScaleDelta > pinchZoomOutSensitivity) 1208 if (m_pinchZoomViewport.pageScaleDelta() > pinchZoomOutSensitivity)
1114 return; 1209 return;
1115 1210
1116 // Compute where the scroll offset/page scale would be if fully pinch-zoomed 1211 // Compute where the scroll offset/page scale would be if fully pinch-zoomed
1117 // out from the anchor point. 1212 // out from the anchor point.
1118 IntSize scrollBegin = flooredIntSize(m_rootScrollLayerImpl->scrollPosition() + m_rootScrollLayerImpl->scrollDelta()); 1213 IntSize scrollBegin = flooredIntSize(m_rootScrollLayerImpl->scrollPosition() + m_rootScrollLayerImpl->scrollDelta());
1119 scrollBegin.scale(m_pageScaleDelta); 1214 scrollBegin.scale(m_pinchZoomViewport.pageScaleDelta());
1120 float scaleBegin = m_pageScale * m_pageScaleDelta; 1215 float scaleBegin = m_pinchZoomViewport.totalPageScaleFactor();
1121 float pageScaleDeltaToSend = m_minPageScale / m_pageScale; 1216 float pageScaleDeltaToSend = m_pinchZoomViewport.minPageScaleFactor() / m_pi nchZoomViewport.pageScaleFactor();
1122 FloatSize scaledContentsSize = contentSize(); 1217 FloatSize scaledContentsSize = contentSize();
1123 scaledContentsSize.scale(pageScaleDeltaToSend); 1218 scaledContentsSize.scale(pageScaleDeltaToSend);
1124 1219
1125 FloatSize anchor = toSize(m_previousPinchAnchor); 1220 FloatSize anchor = toSize(m_previousPinchAnchor);
1126 FloatSize scrollEnd = scrollBegin + anchor; 1221 FloatSize scrollEnd = scrollBegin + anchor;
1127 scrollEnd.scale(m_minPageScale / scaleBegin); 1222 scrollEnd.scale(m_pinchZoomViewport.minPageScaleFactor() / scaleBegin);
1128 scrollEnd -= anchor; 1223 scrollEnd -= anchor;
1129 scrollEnd = scrollEnd.shrunkTo(roundedIntSize(scaledContentsSize - m_deviceV iewportSize)).expandedTo(FloatSize(0, 0)); 1224 scrollEnd = scrollEnd.shrunkTo(roundedIntSize(scaledContentsSize - m_deviceV iewportSize)).expandedTo(FloatSize(0, 0));
1130 scrollEnd.scale(1 / pageScaleDeltaToSend); 1225 scrollEnd.scale(1 / pageScaleDeltaToSend);
1131 scrollEnd.scale(m_deviceScaleFactor); 1226 scrollEnd.scale(m_deviceScaleFactor);
1132 1227
1133 makeScrollAndScaleSet(scrollInfo, roundedIntSize(scrollEnd), m_minPageScale) ; 1228 makeScrollAndScaleSet(scrollInfo, roundedIntSize(scrollEnd), m_pinchZoomView port.minPageScaleFactor());
1134 } 1229 }
1135 1230
1136 void CCLayerTreeHostImpl::makeScrollAndScaleSet(CCScrollAndScaleSet* scrollInfo, const IntSize& scrollOffset, float pageScale) 1231 void CCLayerTreeHostImpl::makeScrollAndScaleSet(CCScrollAndScaleSet* scrollInfo, const IntSize& scrollOffset, float pageScale)
1137 { 1232 {
1138 if (!m_rootScrollLayerImpl) 1233 if (!m_rootScrollLayerImpl)
1139 return; 1234 return;
1140 1235
1141 CCLayerTreeHostCommon::ScrollUpdateInfo scroll; 1236 CCLayerTreeHostCommon::ScrollUpdateInfo scroll;
1142 scroll.layerId = m_rootScrollLayerImpl->id(); 1237 scroll.layerId = m_rootScrollLayerImpl->id();
1143 scroll.scrollDelta = scrollOffset - toSize(m_rootScrollLayerImpl->scrollPosi tion()); 1238 scroll.scrollDelta = scrollOffset - toSize(m_rootScrollLayerImpl->scrollPosi tion());
1144 scrollInfo->scrolls.append(scroll); 1239 scrollInfo->scrolls.append(scroll);
1145 m_rootScrollLayerImpl->setSentScrollDelta(scroll.scrollDelta); 1240 m_rootScrollLayerImpl->setSentScrollDelta(scroll.scrollDelta);
1146 m_sentPageScaleDelta = scrollInfo->pageScaleDelta = pageScale / m_pageScale; 1241 scrollInfo->pageScaleDelta = pageScale / m_pinchZoomViewport.pageScaleFactor ();
1242 m_pinchZoomViewport.setSentPageScaleDelta(scrollInfo->pageScaleDelta);
1147 } 1243 }
1148 1244
1149 static void collectScrollDeltas(CCScrollAndScaleSet* scrollInfo, CCLayerImpl* la yerImpl) 1245 static void collectScrollDeltas(CCScrollAndScaleSet* scrollInfo, CCLayerImpl* la yerImpl)
1150 { 1246 {
1151 if (!layerImpl) 1247 if (!layerImpl)
1152 return; 1248 return;
1153 1249
1154 if (!layerImpl->scrollDelta().isZero()) { 1250 if (!layerImpl->scrollDelta().isZero()) {
1155 IntSize scrollDelta = flooredIntSize(layerImpl->scrollDelta()); 1251 IntSize scrollDelta = flooredIntSize(layerImpl->scrollDelta());
1156 CCLayerTreeHostCommon::ScrollUpdateInfo scroll; 1252 CCLayerTreeHostCommon::ScrollUpdateInfo scroll;
1157 scroll.layerId = layerImpl->id(); 1253 scroll.layerId = layerImpl->id();
1158 scroll.scrollDelta = scrollDelta; 1254 scroll.scrollDelta = scrollDelta;
1159 scrollInfo->scrolls.append(scroll); 1255 scrollInfo->scrolls.append(scroll);
1160 layerImpl->setSentScrollDelta(scrollDelta); 1256 layerImpl->setSentScrollDelta(scrollDelta);
1161 } 1257 }
1162 1258
1163 for (size_t i = 0; i < layerImpl->children().size(); ++i) 1259 for (size_t i = 0; i < layerImpl->children().size(); ++i)
1164 collectScrollDeltas(scrollInfo, layerImpl->children()[i]); 1260 collectScrollDeltas(scrollInfo, layerImpl->children()[i]);
1165 } 1261 }
1166 1262
1167 PassOwnPtr<CCScrollAndScaleSet> CCLayerTreeHostImpl::processScrollDeltas() 1263 PassOwnPtr<CCScrollAndScaleSet> CCLayerTreeHostImpl::processScrollDeltas()
1168 { 1264 {
1169 OwnPtr<CCScrollAndScaleSet> scrollInfo = adoptPtr(new CCScrollAndScaleSet()) ; 1265 OwnPtr<CCScrollAndScaleSet> scrollInfo = adoptPtr(new CCScrollAndScaleSet()) ;
1170 1266
1171 if (m_pinchGestureActive || m_pageScaleAnimation) { 1267 if (m_pinchGestureActive || m_pageScaleAnimation) {
1172 m_sentPageScaleDelta = scrollInfo->pageScaleDelta = 1; 1268 scrollInfo->pageScaleDelta = 1;
1173 if (m_pinchGestureActive) 1269 m_pinchZoomViewport.setSentPageScaleDelta(1);
1174 computePinchZoomDeltas(scrollInfo.get()); 1270 // If pinch zoom is applied in the impl thread, then there is no need to
aelias_OOO_until_Jul13 2012/09/26 23:15:09 There is still a need for this in some form. It's
Jeff Timanus 2012/10/01 21:42:36 Done.
1175 else if (m_pageScaleAnimation.get()) 1271 // calculate these intermediate scale deltas.
1176 computeDoubleTapZoomDeltas(scrollInfo.get()); 1272 if (!CCSettings::pageScalePinchZoomEnabled()) {
1273 if (m_pinchGestureActive)
1274 computePinchZoomDeltas(scrollInfo.get());
1275 else if (m_pageScaleAnimation.get())
1276 computeDoubleTapZoomDeltas(scrollInfo.get());
1277 }
1177 return scrollInfo.release(); 1278 return scrollInfo.release();
1178 } 1279 }
1179 1280
1180 collectScrollDeltas(scrollInfo.get(), m_rootLayerImpl.get()); 1281 collectScrollDeltas(scrollInfo.get(), m_rootLayerImpl.get());
1181 m_sentPageScaleDelta = scrollInfo->pageScaleDelta = m_pageScaleDelta; 1282 scrollInfo->pageScaleDelta = m_pinchZoomViewport.pageScaleDelta();
1283 m_pinchZoomViewport.setSentPageScaleDelta(scrollInfo->pageScaleDelta);
1182 1284
1183 return scrollInfo.release(); 1285 return scrollInfo.release();
1184 } 1286 }
1185 1287
1288 WebTransformationMatrix CCLayerTreeHostImpl::implTransform() const
aelias_OOO_until_Jul13 2012/09/26 23:15:09 Move this method into CCPinchZoomViewport.
Jeff Timanus 2012/10/01 21:42:36 Done.
1289 {
1290 WebTransformationMatrix transform;
1291 transform.scale(m_pinchZoomViewport.pageScaleDelta());
1292
1293 // If the pinch state is applied in the impl, then push it to the
1294 // impl transform, otherwise the scale is handled by WebCore.
1295 if (CCSettings::pageScalePinchZoomEnabled()) {
1296 transform.scale(m_pinchZoomViewport.pageScaleFactor());
1297 transform.translate(-m_pinchZoomViewport.scrollDelta().x(),
1298 -m_pinchZoomViewport.scrollDelta().y());
1299 }
1300
1301 return transform;
1302 }
1303
1186 void CCLayerTreeHostImpl::setFullRootLayerDamage() 1304 void CCLayerTreeHostImpl::setFullRootLayerDamage()
1187 { 1305 {
1188 if (m_rootLayerImpl) { 1306 if (m_rootLayerImpl) {
1189 CCRenderSurface* renderSurface = m_rootLayerImpl->renderSurface(); 1307 CCRenderSurface* renderSurface = m_rootLayerImpl->renderSurface();
1190 if (renderSurface) 1308 if (renderSurface)
1191 renderSurface->damageTracker()->forceFullDamageNextUpdate(); 1309 renderSurface->damageTracker()->forceFullDamageNextUpdate();
1192 } 1310 }
1193 } 1311 }
1194 1312
1195 void CCLayerTreeHostImpl::animatePageScale(double monotonicTime) 1313 void CCLayerTreeHostImpl::animatePageScale(double monotonicTime)
1196 { 1314 {
1197 if (!m_pageScaleAnimation || !m_rootScrollLayerImpl) 1315 if (!m_pageScaleAnimation || !m_rootScrollLayerImpl)
1198 return; 1316 return;
1199 1317
1200 IntSize scrollTotal = flooredIntSize(m_rootScrollLayerImpl->scrollPosition() + m_rootScrollLayerImpl->scrollDelta()); 1318 IntSize scrollTotal = flooredIntSize(m_rootScrollLayerImpl->scrollPosition() + m_rootScrollLayerImpl->scrollDelta());
1201 1319
1202 setPageScaleDelta(m_pageScaleAnimation->pageScaleAtTime(monotonicTime) / m_p ageScale); 1320 setPageScaleDelta(m_pageScaleAnimation->pageScaleAtTime(monotonicTime) / m_p inchZoomViewport.pageScaleFactor());
1203 IntSize nextScroll = m_pageScaleAnimation->scrollOffsetAtTime(monotonicTime) ; 1321 IntSize nextScroll = m_pageScaleAnimation->scrollOffsetAtTime(monotonicTime) ;
1204 nextScroll.scale(1 / m_pageScaleDelta); 1322 nextScroll.scale(1 / m_pinchZoomViewport.pageScaleDelta());
1205 m_rootScrollLayerImpl->scrollBy(nextScroll - scrollTotal); 1323 m_rootScrollLayerImpl->scrollBy(nextScroll - scrollTotal);
1206 m_client->setNeedsRedrawOnImplThread(); 1324 m_client->setNeedsRedrawOnImplThread();
1207 1325
1208 if (m_pageScaleAnimation->isAnimationCompleteAtTime(monotonicTime)) { 1326 if (m_pageScaleAnimation->isAnimationCompleteAtTime(monotonicTime)) {
1209 m_pageScaleAnimation.clear(); 1327 m_pageScaleAnimation.clear();
1210 m_client->setNeedsCommitOnImplThread(); 1328 m_client->setNeedsCommitOnImplThread();
1211 } 1329 }
1212 } 1330 }
1213 1331
1214 void CCLayerTreeHostImpl::animateLayers(double monotonicTime, double wallClockTi me) 1332 void CCLayerTreeHostImpl::animateLayers(double monotonicTime, double wallClockTi me)
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
1306 1424
1307 CCScrollbarAnimationController* scrollbarController = layer->scrollbarAnimat ionController(); 1425 CCScrollbarAnimationController* scrollbarController = layer->scrollbarAnimat ionController();
1308 if (scrollbarController && scrollbarController->animate(monotonicTime)) 1426 if (scrollbarController && scrollbarController->animate(monotonicTime))
1309 m_client->setNeedsRedrawOnImplThread(); 1427 m_client->setNeedsRedrawOnImplThread();
1310 1428
1311 for (size_t i = 0; i < layer->children().size(); ++i) 1429 for (size_t i = 0; i < layer->children().size(); ++i)
1312 animateScrollbarsRecursive(layer->children()[i], monotonicTime); 1430 animateScrollbarsRecursive(layer->children()[i], monotonicTime);
1313 } 1431 }
1314 1432
1315 } // namespace cc 1433 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698