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 "config.h" | 5 #include "config.h" |
6 | 6 |
7 #include "cc/layer_tree_host_impl.h" | 7 #include "cc/layer_tree_host_impl.h" |
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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 if (m_sentPageScaleDelta == 1 && pageScaleFactor == m_pageScaleFactor && min
PageScaleFactor == m_minPageScaleFactor && maxPageScaleFactor == m_maxPageScaleF
actor) | 87 if (m_sentPageScaleDelta == 1 && pageScaleFactor == m_pageScaleFactor && min
PageScaleFactor == m_minPageScaleFactor && maxPageScaleFactor == m_maxPageScaleF
actor) |
88 return false; | 88 return false; |
89 | 89 |
90 m_minPageScaleFactor = minPageScaleFactor; | 90 m_minPageScaleFactor = minPageScaleFactor; |
91 m_maxPageScaleFactor = maxPageScaleFactor; | 91 m_maxPageScaleFactor = maxPageScaleFactor; |
92 | 92 |
93 m_pageScaleFactor = pageScaleFactor; | 93 m_pageScaleFactor = pageScaleFactor; |
94 return true; | 94 return true; |
95 } | 95 } |
96 | 96 |
97 FloatRect PinchZoomViewport::bounds() const | 97 gfx::RectF PinchZoomViewport::bounds() const |
98 { | 98 { |
99 FloatSize scaledViewportSize = m_layoutViewportSize; | 99 gfx::SizeF scaledViewportSize = m_layoutViewportSize; |
100 scaledViewportSize.scale(1 / totalPageScaleFactor()); | 100 scaledViewportSize = scaledViewportSize.Scale(1 / totalPageScaleFactor()); |
101 | 101 |
102 FloatRect bounds(FloatPoint(0, 0), scaledViewportSize); | 102 gfx::RectF bounds(gfx::PointF(), scaledViewportSize); |
103 bounds.setLocation(m_pinchViewportScrollDelta); | 103 bounds.set_origin(m_pinchViewportScrollDelta); |
104 | 104 |
105 return bounds; | 105 return bounds; |
106 } | 106 } |
107 | 107 |
108 FloatSize PinchZoomViewport::applyScroll(FloatSize& delta) | 108 FloatSize PinchZoomViewport::applyScroll(FloatSize& delta) |
109 { | 109 { |
110 FloatSize overflow; | 110 FloatSize overflow; |
111 FloatRect pinchedBounds = bounds(); | 111 FloatRect pinchedBounds = cc::FloatRect(bounds()); |
112 | 112 |
113 pinchedBounds.move(delta); | 113 pinchedBounds.move(delta); |
114 if (pinchedBounds.x() < 0) { | 114 if (pinchedBounds.x() < 0) { |
115 overflow.setWidth(pinchedBounds.x()); | 115 overflow.setWidth(pinchedBounds.x()); |
116 pinchedBounds.setX(0); | 116 pinchedBounds.setX(0); |
117 } | 117 } |
118 | 118 |
119 if (pinchedBounds.y() < 0) { | 119 if (pinchedBounds.y() < 0) { |
120 overflow.setHeight(pinchedBounds.y()); | 120 overflow.setHeight(pinchedBounds.y()); |
121 pinchedBounds.setY(0); | 121 pinchedBounds.setY(0); |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 bool LayerTreeHostImpl::canDraw() | 259 bool LayerTreeHostImpl::canDraw() |
260 { | 260 { |
261 // Note: If you are changing this function or any other function that might | 261 // Note: If you are changing this function or any other function that might |
262 // affect the result of canDraw, make sure to call m_client->onCanDrawStateC
hanged | 262 // affect the result of canDraw, make sure to call m_client->onCanDrawStateC
hanged |
263 // in the proper places and update the notifyIfCanDrawChanged test. | 263 // in the proper places and update the notifyIfCanDrawChanged test. |
264 | 264 |
265 if (!m_rootLayerImpl) { | 265 if (!m_rootLayerImpl) { |
266 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw no root layer"); | 266 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw no root layer"); |
267 return false; | 267 return false; |
268 } | 268 } |
269 if (deviceViewportSize().isEmpty()) { | 269 if (deviceViewportSize().IsEmpty()) { |
270 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw empty viewport"); | 270 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw empty viewport"); |
271 return false; | 271 return false; |
272 } | 272 } |
273 if (!m_renderer) { | 273 if (!m_renderer) { |
274 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw no renderer"); | 274 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw no renderer"); |
275 return false; | 275 return false; |
276 } | 276 } |
277 if (m_contentsTexturesPurged) { | 277 if (m_contentsTexturesPurged) { |
278 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw contents textures
purged"); | 278 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw contents textures
purged"); |
279 return false; | 279 return false; |
(...skipping 14 matching lines...) Expand all Loading... |
294 } | 294 } |
295 | 295 |
296 void LayerTreeHostImpl::startPageScaleAnimation(const IntSize& targetPosition, b
ool anchorPoint, float pageScale, base::TimeTicks startTime, base::TimeDelta dur
ation) | 296 void LayerTreeHostImpl::startPageScaleAnimation(const IntSize& targetPosition, b
ool anchorPoint, float pageScale, base::TimeTicks startTime, base::TimeDelta dur
ation) |
297 { | 297 { |
298 if (!m_rootScrollLayerImpl) | 298 if (!m_rootScrollLayerImpl) |
299 return; | 299 return; |
300 | 300 |
301 IntSize scrollTotal = flooredIntSize(m_rootScrollLayerImpl->scrollPosition()
+ m_rootScrollLayerImpl->scrollDelta()); | 301 IntSize scrollTotal = flooredIntSize(m_rootScrollLayerImpl->scrollPosition()
+ m_rootScrollLayerImpl->scrollDelta()); |
302 scrollTotal.scale(m_pinchZoomViewport.pageScaleDelta()); | 302 scrollTotal.scale(m_pinchZoomViewport.pageScaleDelta()); |
303 float scaleTotal = m_pinchZoomViewport.totalPageScaleFactor(); | 303 float scaleTotal = m_pinchZoomViewport.totalPageScaleFactor(); |
304 IntSize scaledContentSize = contentSize(); | 304 IntSize scaledContentSize = cc::IntSize(contentSize()); |
305 scaledContentSize.scale(m_pinchZoomViewport.pageScaleDelta()); | 305 scaledContentSize.scale(m_pinchZoomViewport.pageScaleDelta()); |
306 | 306 |
307 double startTimeSeconds = (startTime - base::TimeTicks()).InSecondsF(); | 307 double startTimeSeconds = (startTime - base::TimeTicks()).InSecondsF(); |
308 m_pageScaleAnimation = PageScaleAnimation::create(scrollTotal, scaleTotal, m
_deviceViewportSize, scaledContentSize, startTimeSeconds); | 308 m_pageScaleAnimation = PageScaleAnimation::create(scrollTotal, scaleTotal, c
c::IntSize(m_deviceViewportSize), scaledContentSize, startTimeSeconds); |
309 | 309 |
310 if (anchorPoint) { | 310 if (anchorPoint) { |
311 IntSize windowAnchor(targetPosition); | 311 IntSize windowAnchor(targetPosition); |
312 windowAnchor.scale(scaleTotal / pageScale); | 312 windowAnchor.scale(scaleTotal / pageScale); |
313 windowAnchor -= scrollTotal; | 313 windowAnchor -= scrollTotal; |
314 m_pageScaleAnimation->zoomWithAnchor(windowAnchor, pageScale, duration.I
nSecondsF()); | 314 m_pageScaleAnimation->zoomWithAnchor(windowAnchor, pageScale, duration.I
nSecondsF()); |
315 } else | 315 } else |
316 m_pageScaleAnimation->zoomTo(targetPosition, pageScale, duration.InSecon
dsF()); | 316 m_pageScaleAnimation->zoomTo(targetPosition, pageScale, duration.InSecon
dsF()); |
317 | 317 |
318 m_client->setNeedsRedrawOnImplThread(); | 318 m_client->setNeedsRedrawOnImplThread(); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
404 RenderPass* targetRenderPass = frame.renderPassesById.get(targetRenderPa
ssId); | 404 RenderPass* targetRenderPass = frame.renderPassesById.get(targetRenderPa
ssId); |
405 | 405 |
406 occlusionTracker.enterLayer(it); | 406 occlusionTracker.enterLayer(it); |
407 | 407 |
408 AppendQuadsData appendQuadsData(targetRenderPass->id()); | 408 AppendQuadsData appendQuadsData(targetRenderPass->id()); |
409 | 409 |
410 if (it.representsContributingRenderSurface()) { | 410 if (it.representsContributingRenderSurface()) { |
411 RenderPass::Id contributingRenderPassId = it->renderSurface()->rende
rPassId(); | 411 RenderPass::Id contributingRenderPassId = it->renderSurface()->rende
rPassId(); |
412 RenderPass* contributingRenderPass = frame.renderPassesById.get(cont
ributingRenderPassId); | 412 RenderPass* contributingRenderPass = frame.renderPassesById.get(cont
ributingRenderPassId); |
413 targetRenderPass->appendQuadsForRenderSurfaceLayer(*it, contributing
RenderPass, &occlusionTracker, appendQuadsData); | 413 targetRenderPass->appendQuadsForRenderSurfaceLayer(*it, contributing
RenderPass, &occlusionTracker, appendQuadsData); |
414 } else if (it.representsItself() && !it->visibleContentRect().isEmpty())
{ | 414 } else if (it.representsItself() && !it->visibleContentRect().IsEmpty())
{ |
415 bool hasOcclusionFromOutsideTargetSurface; | 415 bool hasOcclusionFromOutsideTargetSurface; |
416 bool implDrawTransformIsUnknown = false; | 416 bool implDrawTransformIsUnknown = false; |
417 if (occlusionTracker.occluded(it->renderTarget(), it->visibleContent
Rect(), it->drawTransform(), implDrawTransformIsUnknown, it->drawableContentRect
(), &hasOcclusionFromOutsideTargetSurface)) | 417 if (occlusionTracker.occluded(it->renderTarget(), it->visibleContent
Rect(), it->drawTransform(), implDrawTransformIsUnknown, it->drawableContentRect
(), &hasOcclusionFromOutsideTargetSurface)) |
418 appendQuadsData.hadOcclusionFromOutsideTargetSurface |= hasOcclu
sionFromOutsideTargetSurface; | 418 appendQuadsData.hadOcclusionFromOutsideTargetSurface |= hasOcclu
sionFromOutsideTargetSurface; |
419 else { | 419 else { |
420 it->willDraw(m_resourceProvider.get()); | 420 it->willDraw(m_resourceProvider.get()); |
421 frame.willDrawLayers.push_back(*it); | 421 frame.willDrawLayers.push_back(*it); |
422 | 422 |
423 if (it->hasContributingDelegatedRenderPasses()) { | 423 if (it->hasContributingDelegatedRenderPasses()) { |
424 RenderPass::Id contributingRenderPassId = it->firstContribut
ingRenderPassId(); | 424 RenderPass::Id contributingRenderPassId = it->firstContribut
ingRenderPassId(); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
502 | 502 |
503 void LayerTreeHostImpl::setBackgroundTickingEnabled(bool enabled) | 503 void LayerTreeHostImpl::setBackgroundTickingEnabled(bool enabled) |
504 { | 504 { |
505 // Lazily create the timeSource adapter so that we can vary the interval for
testing. | 505 // Lazily create the timeSource adapter so that we can vary the interval for
testing. |
506 if (!m_timeSourceClientAdapter) | 506 if (!m_timeSourceClientAdapter) |
507 m_timeSourceClientAdapter = LayerTreeHostImplTimeSourceAdapter::create(t
his, DelayBasedTimeSource::create(lowFrequencyAnimationInterval(), Proxy::curren
tThread())); | 507 m_timeSourceClientAdapter = LayerTreeHostImplTimeSourceAdapter::create(t
his, DelayBasedTimeSource::create(lowFrequencyAnimationInterval(), Proxy::curren
tThread())); |
508 | 508 |
509 m_timeSourceClientAdapter->setActive(enabled); | 509 m_timeSourceClientAdapter->setActive(enabled); |
510 } | 510 } |
511 | 511 |
512 IntSize LayerTreeHostImpl::contentSize() const | 512 gfx::Size LayerTreeHostImpl::contentSize() const |
513 { | 513 { |
514 // TODO(aelias): Hardcoding the first child here is weird. Think of | 514 // TODO(aelias): Hardcoding the first child here is weird. Think of |
515 // a cleaner way to get the contentBounds on the Impl side. | 515 // a cleaner way to get the contentBounds on the Impl side. |
516 if (!m_rootScrollLayerImpl || m_rootScrollLayerImpl->children().isEmpty()) | 516 if (!m_rootScrollLayerImpl || m_rootScrollLayerImpl->children().isEmpty()) |
517 return IntSize(); | 517 return gfx::Size(); |
518 return m_rootScrollLayerImpl->children()[0]->contentBounds(); | 518 return m_rootScrollLayerImpl->children()[0]->contentBounds(); |
519 } | 519 } |
520 | 520 |
521 static inline RenderPass* findRenderPassById(RenderPass::Id renderPassId, const
LayerTreeHostImpl::FrameData& frame) | 521 static inline RenderPass* findRenderPassById(RenderPass::Id renderPassId, const
LayerTreeHostImpl::FrameData& frame) |
522 { | 522 { |
523 RenderPassIdHashMap::const_iterator it = frame.renderPassesById.find(renderP
assId); | 523 RenderPassIdHashMap::const_iterator it = frame.renderPassesById.find(renderP
assId); |
524 DCHECK(it != frame.renderPassesById.end()); | 524 DCHECK(it != frame.renderPassesById.end()); |
525 return it->second; | 525 return it->second; |
526 } | 526 } |
527 | 527 |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
726 } | 726 } |
727 | 727 |
728 bool LayerTreeHostImpl::swapBuffers() | 728 bool LayerTreeHostImpl::swapBuffers() |
729 { | 729 { |
730 DCHECK(m_renderer); | 730 DCHECK(m_renderer); |
731 | 731 |
732 m_fpsCounter->markEndOfFrame(); | 732 m_fpsCounter->markEndOfFrame(); |
733 return m_renderer->swapBuffers(); | 733 return m_renderer->swapBuffers(); |
734 } | 734 } |
735 | 735 |
736 const IntSize& LayerTreeHostImpl::deviceViewportSize() const | 736 const gfx::Size& LayerTreeHostImpl::deviceViewportSize() const |
737 { | 737 { |
738 return m_deviceViewportSize; | 738 return m_deviceViewportSize; |
739 } | 739 } |
740 | 740 |
741 const LayerTreeSettings& LayerTreeHostImpl::settings() const | 741 const LayerTreeSettings& LayerTreeHostImpl::settings() const |
742 { | 742 { |
743 return m_settings; | 743 return m_settings; |
744 } | 744 } |
745 | 745 |
746 void LayerTreeHostImpl::didLoseContext() | 746 void LayerTreeHostImpl::didLoseContext() |
747 { | 747 { |
748 m_client->didLoseContextOnImplThread(); | 748 m_client->didLoseContextOnImplThread(); |
749 } | 749 } |
750 | 750 |
751 void LayerTreeHostImpl::onSwapBuffersComplete() | 751 void LayerTreeHostImpl::onSwapBuffersComplete() |
752 { | 752 { |
753 m_client->onSwapBuffersCompleteOnImplThread(); | 753 m_client->onSwapBuffersCompleteOnImplThread(); |
754 } | 754 } |
755 | 755 |
756 void LayerTreeHostImpl::readback(void* pixels, const IntRect& rect) | 756 void LayerTreeHostImpl::readback(void* pixels, const gfx::Rect& rect) |
757 { | 757 { |
758 DCHECK(m_renderer); | 758 DCHECK(m_renderer); |
759 m_renderer->getFramebufferPixels(pixels, rect); | 759 m_renderer->getFramebufferPixels(pixels, rect); |
760 } | 760 } |
761 | 761 |
762 static LayerImpl* findRootScrollLayer(LayerImpl* layer) | 762 static LayerImpl* findRootScrollLayer(LayerImpl* layer) |
763 { | 763 { |
764 if (!layer) | 764 if (!layer) |
765 return 0; | 765 return 0; |
766 | 766 |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
879 m_contentsTexturesPurged = true; | 879 m_contentsTexturesPurged = true; |
880 m_client->onCanDrawStateChanged(canDraw()); | 880 m_client->onCanDrawStateChanged(canDraw()); |
881 } | 881 } |
882 | 882 |
883 void LayerTreeHostImpl::resetContentsTexturesPurged() | 883 void LayerTreeHostImpl::resetContentsTexturesPurged() |
884 { | 884 { |
885 m_contentsTexturesPurged = false; | 885 m_contentsTexturesPurged = false; |
886 m_client->onCanDrawStateChanged(canDraw()); | 886 m_client->onCanDrawStateChanged(canDraw()); |
887 } | 887 } |
888 | 888 |
889 void LayerTreeHostImpl::setViewportSize(const IntSize& layoutViewportSize, const
IntSize& deviceViewportSize) | 889 void LayerTreeHostImpl::setViewportSize(const gfx::Size& layoutViewportSize, con
st gfx::Size& deviceViewportSize) |
890 { | 890 { |
891 if (layoutViewportSize == m_layoutViewportSize && deviceViewportSize == m_de
viceViewportSize) | 891 if (layoutViewportSize == m_layoutViewportSize && deviceViewportSize == m_de
viceViewportSize) |
892 return; | 892 return; |
893 | 893 |
894 m_layoutViewportSize = layoutViewportSize; | 894 m_layoutViewportSize = layoutViewportSize; |
895 m_deviceViewportSize = deviceViewportSize; | 895 m_deviceViewportSize = deviceViewportSize; |
896 | 896 |
897 m_pinchZoomViewport.setLayoutViewportSize(FloatSize(layoutViewportSize)); | 897 m_pinchZoomViewport.setLayoutViewportSize(FloatSize(layoutViewportSize)); |
898 | 898 |
899 updateMaxScrollPosition(); | 899 updateMaxScrollPosition(); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
957 m_pinchZoomViewport.setPageScaleDelta(delta); | 957 m_pinchZoomViewport.setPageScaleDelta(delta); |
958 | 958 |
959 updateMaxScrollPosition(); | 959 updateMaxScrollPosition(); |
960 } | 960 } |
961 | 961 |
962 void LayerTreeHostImpl::updateMaxScrollPosition() | 962 void LayerTreeHostImpl::updateMaxScrollPosition() |
963 { | 963 { |
964 if (!m_rootScrollLayerImpl || !m_rootScrollLayerImpl->children().size()) | 964 if (!m_rootScrollLayerImpl || !m_rootScrollLayerImpl->children().size()) |
965 return; | 965 return; |
966 | 966 |
967 FloatSize viewBounds = m_deviceViewportSize; | 967 gfx::SizeF viewBounds = m_deviceViewportSize; |
968 if (LayerImpl* clipLayer = m_rootScrollLayerImpl->parent()) { | 968 if (LayerImpl* clipLayer = m_rootScrollLayerImpl->parent()) { |
969 // Compensate for non-overlay scrollbars. | 969 // Compensate for non-overlay scrollbars. |
970 if (clipLayer->masksToBounds()) { | 970 if (clipLayer->masksToBounds()) { |
971 viewBounds = clipLayer->bounds(); | 971 viewBounds = clipLayer->bounds(); |
972 viewBounds.scale(m_deviceScaleFactor); | 972 viewBounds = viewBounds.Scale(m_deviceScaleFactor); |
973 } | 973 } |
974 } | 974 } |
975 | 975 |
976 IntSize contentBounds = contentSize(); | 976 gfx::Size contentBounds = contentSize(); |
977 if (Settings::pageScalePinchZoomEnabled()) { | 977 if (Settings::pageScalePinchZoomEnabled()) { |
978 // Pinch with pageScale scrolls entirely in layout space. contentSize | 978 // Pinch with pageScale scrolls entirely in layout space. contentSize |
979 // returns the bounds including the page scale factor, so calculate the | 979 // returns the bounds including the page scale factor, so calculate the |
980 // pre page-scale layout size here. | 980 // pre page-scale layout size here. |
981 float pageScaleFactor = m_pinchZoomViewport.pageScaleFactor(); | 981 float pageScaleFactor = m_pinchZoomViewport.pageScaleFactor(); |
982 contentBounds.setWidth(contentBounds.width() / pageScaleFactor); | 982 contentBounds.set_width(contentBounds.width() / pageScaleFactor); |
983 contentBounds.setHeight(contentBounds.height() / pageScaleFactor); | 983 contentBounds.set_height(contentBounds.height() / pageScaleFactor); |
984 } else { | 984 } else { |
985 viewBounds.scale(1 / m_pinchZoomViewport.pageScaleDelta()); | 985 viewBounds = viewBounds.Scale(1 / m_pinchZoomViewport.pageScaleDelta()); |
986 } | 986 } |
987 | 987 |
988 IntSize maxScroll = contentBounds - expandedIntSize(viewBounds); | 988 IntSize maxScroll = cc::IntSize(contentBounds) - expandedIntSize(cc::FloatSi
ze(viewBounds)); |
989 maxScroll.scale(1 / m_deviceScaleFactor); | 989 maxScroll.scale(1 / m_deviceScaleFactor); |
990 | 990 |
991 // The viewport may be larger than the contents in some cases, such as | 991 // The viewport may be larger than the contents in some cases, such as |
992 // having a vertical scrollbar but no horizontal overflow. | 992 // having a vertical scrollbar but no horizontal overflow. |
993 maxScroll.clampNegativeToZero(); | 993 maxScroll.clampNegativeToZero(); |
994 | 994 |
995 m_rootScrollLayerImpl->setMaxScrollPosition(maxScroll); | 995 m_rootScrollLayerImpl->setMaxScrollPosition(maxScroll); |
996 } | 996 } |
997 | 997 |
998 void LayerTreeHostImpl::setNeedsRedraw() | 998 void LayerTreeHostImpl::setNeedsRedraw() |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1085 FloatPoint screenSpacePoint = viewportPoint; | 1085 FloatPoint screenSpacePoint = viewportPoint; |
1086 screenSpacePoint.scale(scaleFromViewportToScreenSpace, scaleFromViewportToSc
reenSpace); | 1086 screenSpacePoint.scale(scaleFromViewportToScreenSpace, scaleFromViewportToSc
reenSpace); |
1087 | 1087 |
1088 FloatSize screenSpaceDelta = viewportDelta; | 1088 FloatSize screenSpaceDelta = viewportDelta; |
1089 screenSpaceDelta.scale(scaleFromViewportToScreenSpace, scaleFromViewportToSc
reenSpace); | 1089 screenSpaceDelta.scale(scaleFromViewportToScreenSpace, scaleFromViewportToSc
reenSpace); |
1090 | 1090 |
1091 // First project the scroll start and end points to local layer space to fin
d the scroll delta | 1091 // First project the scroll start and end points to local layer space to fin
d the scroll delta |
1092 // in layer coordinates. | 1092 // in layer coordinates. |
1093 bool startClipped, endClipped; | 1093 bool startClipped, endClipped; |
1094 FloatPoint screenSpaceEndPoint = screenSpacePoint + screenSpaceDelta; | 1094 FloatPoint screenSpaceEndPoint = screenSpacePoint + screenSpaceDelta; |
1095 FloatPoint localStartPoint = MathUtil::projectPoint(inverseScreenSpaceTransf
orm, screenSpacePoint, startClipped); | 1095 FloatPoint localStartPoint = cc::FloatPoint(MathUtil::projectPoint(inverseSc
reenSpaceTransform, screenSpacePoint, startClipped)); |
1096 FloatPoint localEndPoint = MathUtil::projectPoint(inverseScreenSpaceTransfor
m, screenSpaceEndPoint, endClipped); | 1096 FloatPoint localEndPoint = cc::FloatPoint(MathUtil::projectPoint(inverseScre
enSpaceTransform, screenSpaceEndPoint, endClipped)); |
1097 | 1097 |
1098 // In general scroll point coordinates should not get clipped. | 1098 // In general scroll point coordinates should not get clipped. |
1099 DCHECK(!startClipped); | 1099 DCHECK(!startClipped); |
1100 DCHECK(!endClipped); | 1100 DCHECK(!endClipped); |
1101 if (startClipped || endClipped) | 1101 if (startClipped || endClipped) |
1102 return FloatSize(); | 1102 return FloatSize(); |
1103 | 1103 |
1104 // localStartPoint and localEndPoint are in content space but we want to mov
e them to layer space for scrolling. | 1104 // localStartPoint and localEndPoint are in content space but we want to mov
e them to layer space for scrolling. |
1105 float widthScale = 1.0 / layerImpl.contentsScaleX(); | 1105 float widthScale = 1 / layerImpl.contentsScaleX(); |
1106 float heightScale = 1.0 / layerImpl.contentsScaleY(); | 1106 float heightScale = 1 / layerImpl.contentsScaleY(); |
1107 localStartPoint.scale(widthScale, heightScale); | 1107 localStartPoint.scale(widthScale, heightScale); |
1108 localEndPoint.scale(widthScale, heightScale); | 1108 localEndPoint.scale(widthScale, heightScale); |
1109 | 1109 |
1110 // Apply the scroll delta. | 1110 // Apply the scroll delta. |
1111 FloatSize previousDelta(layerImpl.scrollDelta()); | 1111 FloatSize previousDelta(layerImpl.scrollDelta()); |
1112 FloatSize unscrolled = layerImpl.scrollBy(localEndPoint - localStartPoint); | 1112 FloatSize unscrolled = layerImpl.scrollBy(localEndPoint - localStartPoint); |
1113 | 1113 |
1114 if (viewport) | 1114 if (viewport) |
1115 viewport->applyScroll(unscrolled); | 1115 viewport->applyScroll(unscrolled); |
1116 | 1116 |
1117 // Get the end point in the layer's content space so we can apply its screen
SpaceTransform. | 1117 // Get the end point in the layer's content space so we can apply its screen
SpaceTransform. |
1118 FloatPoint actualLocalEndPoint = localStartPoint + layerImpl.scrollDelta() -
previousDelta; | 1118 FloatPoint actualLocalEndPoint = localStartPoint + layerImpl.scrollDelta() -
previousDelta; |
1119 FloatPoint actualLocalContentEndPoint = actualLocalEndPoint; | 1119 gfx::PointF actualLocalContentEndPoint = actualLocalEndPoint; |
1120 actualLocalContentEndPoint.scale(1 / widthScale, 1 / heightScale); | 1120 actualLocalContentEndPoint = actualLocalContentEndPoint.Scale(1 / widthScale
, 1 / heightScale); |
1121 | 1121 |
1122 // Calculate the applied scroll delta in viewport space coordinates. | 1122 // Calculate the applied scroll delta in viewport space coordinates. |
1123 FloatPoint actualScreenSpaceEndPoint = MathUtil::mapPoint(layerImpl.screenSp
aceTransform(), actualLocalContentEndPoint, endClipped); | 1123 FloatPoint actualScreenSpaceEndPoint = cc::FloatPoint(MathUtil::mapPoint(lay
erImpl.screenSpaceTransform(), actualLocalContentEndPoint, endClipped)); |
1124 DCHECK(!endClipped); | 1124 DCHECK(!endClipped); |
1125 if (endClipped) | 1125 if (endClipped) |
1126 return FloatSize(); | 1126 return FloatSize(); |
1127 FloatPoint actualViewportEndPoint = actualScreenSpaceEndPoint; | 1127 FloatPoint actualViewportEndPoint = actualScreenSpaceEndPoint; |
1128 actualViewportEndPoint.scale(1 / scaleFromViewportToScreenSpace, 1 / scaleFr
omViewportToScreenSpace); | 1128 actualViewportEndPoint.scale(1 / scaleFromViewportToScreenSpace, 1 / scaleFr
omViewportToScreenSpace); |
1129 return actualViewportEndPoint - viewportPoint; | 1129 return actualViewportEndPoint - viewportPoint; |
1130 } | 1130 } |
1131 | 1131 |
1132 static FloatSize scrollLayerWithLocalDelta(LayerImpl& layerImpl, const FloatSize
& localDelta) | 1132 static FloatSize scrollLayerWithLocalDelta(LayerImpl& layerImpl, const FloatSize
& localDelta) |
1133 { | 1133 { |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1198 void LayerTreeHostImpl::pinchGestureBegin() | 1198 void LayerTreeHostImpl::pinchGestureBegin() |
1199 { | 1199 { |
1200 m_pinchGestureActive = true; | 1200 m_pinchGestureActive = true; |
1201 m_previousPinchAnchor = IntPoint(); | 1201 m_previousPinchAnchor = IntPoint(); |
1202 | 1202 |
1203 if (m_rootScrollLayerImpl && m_rootScrollLayerImpl->scrollbarAnimationContro
ller()) | 1203 if (m_rootScrollLayerImpl && m_rootScrollLayerImpl->scrollbarAnimationContro
ller()) |
1204 m_rootScrollLayerImpl->scrollbarAnimationController()->didPinchGestureBe
gin(); | 1204 m_rootScrollLayerImpl->scrollbarAnimationController()->didPinchGestureBe
gin(); |
1205 } | 1205 } |
1206 | 1206 |
1207 void LayerTreeHostImpl::pinchGestureUpdate(float magnifyDelta, | 1207 void LayerTreeHostImpl::pinchGestureUpdate(float magnifyDelta, |
1208 const IntPoint& anchor) | 1208 const IntPoint& anchor) |
1209 { | 1209 { |
1210 TRACE_EVENT0("cc", "LayerTreeHostImpl::pinchGestureUpdate"); | 1210 TRACE_EVENT0("cc", "LayerTreeHostImpl::pinchGestureUpdate"); |
1211 | 1211 |
1212 if (!m_rootScrollLayerImpl) | 1212 if (!m_rootScrollLayerImpl) |
1213 return; | 1213 return; |
1214 | 1214 |
1215 if (m_previousPinchAnchor == IntPoint::zero()) | 1215 if (m_previousPinchAnchor == IntPoint::zero()) |
1216 m_previousPinchAnchor = anchor; | 1216 m_previousPinchAnchor = anchor; |
1217 | 1217 |
1218 // Keep the center-of-pinch anchor specified by (x, y) in a stable | 1218 // Keep the center-of-pinch anchor specified by (x, y) in a stable |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1271 const float pinchZoomOutSensitivity = 0.95f; | 1271 const float pinchZoomOutSensitivity = 0.95f; |
1272 if (m_pinchZoomViewport.pageScaleDelta() > pinchZoomOutSensitivity) | 1272 if (m_pinchZoomViewport.pageScaleDelta() > pinchZoomOutSensitivity) |
1273 return; | 1273 return; |
1274 | 1274 |
1275 // Compute where the scroll offset/page scale would be if fully pinch-zoomed | 1275 // Compute where the scroll offset/page scale would be if fully pinch-zoomed |
1276 // out from the anchor point. | 1276 // out from the anchor point. |
1277 IntSize scrollBegin = flooredIntSize(m_rootScrollLayerImpl->scrollPosition()
+ m_rootScrollLayerImpl->scrollDelta()); | 1277 IntSize scrollBegin = flooredIntSize(m_rootScrollLayerImpl->scrollPosition()
+ m_rootScrollLayerImpl->scrollDelta()); |
1278 scrollBegin.scale(m_pinchZoomViewport.pageScaleDelta()); | 1278 scrollBegin.scale(m_pinchZoomViewport.pageScaleDelta()); |
1279 float scaleBegin = m_pinchZoomViewport.totalPageScaleFactor(); | 1279 float scaleBegin = m_pinchZoomViewport.totalPageScaleFactor(); |
1280 float pageScaleDeltaToSend = m_pinchZoomViewport.minPageScaleFactor() / m_pi
nchZoomViewport.pageScaleFactor(); | 1280 float pageScaleDeltaToSend = m_pinchZoomViewport.minPageScaleFactor() / m_pi
nchZoomViewport.pageScaleFactor(); |
1281 FloatSize scaledContentsSize = contentSize(); | 1281 gfx::SizeF scaledContentsSize = contentSize().Scale(pageScaleDeltaToSend); |
1282 scaledContentsSize.scale(pageScaleDeltaToSend); | |
1283 | 1282 |
1284 FloatSize anchor = toSize(m_previousPinchAnchor); | 1283 FloatSize anchor = toSize(m_previousPinchAnchor); |
1285 FloatSize scrollEnd = scrollBegin + anchor; | 1284 FloatSize scrollEnd = scrollBegin + anchor; |
1286 scrollEnd.scale(m_pinchZoomViewport.minPageScaleFactor() / scaleBegin); | 1285 scrollEnd.scale(m_pinchZoomViewport.minPageScaleFactor() / scaleBegin); |
1287 scrollEnd -= anchor; | 1286 scrollEnd -= anchor; |
1288 scrollEnd = scrollEnd.shrunkTo(roundedIntSize(scaledContentsSize - m_deviceV
iewportSize)).expandedTo(FloatSize(0, 0)); | 1287 scrollEnd = scrollEnd.shrunkTo(roundedIntSize(cc::FloatSize(scaledContentsSi
ze) - cc::IntSize(m_deviceViewportSize))).expandedTo(FloatSize(0, 0)); |
1289 scrollEnd.scale(1 / pageScaleDeltaToSend); | 1288 scrollEnd.scale(1 / pageScaleDeltaToSend); |
1290 scrollEnd.scale(m_deviceScaleFactor); | 1289 scrollEnd.scale(m_deviceScaleFactor); |
1291 | 1290 |
1292 makeScrollAndScaleSet(scrollInfo, roundedIntSize(scrollEnd), m_pinchZoomView
port.minPageScaleFactor()); | 1291 makeScrollAndScaleSet(scrollInfo, roundedIntSize(scrollEnd), m_pinchZoomView
port.minPageScaleFactor()); |
1293 } | 1292 } |
1294 | 1293 |
1295 void LayerTreeHostImpl::makeScrollAndScaleSet(ScrollAndScaleSet* scrollInfo, con
st IntSize& scrollOffset, float pageScale) | 1294 void LayerTreeHostImpl::makeScrollAndScaleSet(ScrollAndScaleSet* scrollInfo, con
st IntSize& scrollOffset, float pageScale) |
1296 { | 1295 { |
1297 if (!m_rootScrollLayerImpl) | 1296 if (!m_rootScrollLayerImpl) |
1298 return; | 1297 return; |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1481 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); | 1480 ScrollbarAnimationController* scrollbarController = layer->scrollbarAnimatio
nController(); |
1482 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); | 1481 double monotonicTime = (time - base::TimeTicks()).InSecondsF(); |
1483 if (scrollbarController && scrollbarController->animate(monotonicTime)) | 1482 if (scrollbarController && scrollbarController->animate(monotonicTime)) |
1484 m_client->setNeedsRedrawOnImplThread(); | 1483 m_client->setNeedsRedrawOnImplThread(); |
1485 | 1484 |
1486 for (size_t i = 0; i < layer->children().size(); ++i) | 1485 for (size_t i = 0; i < layer->children().size(); ++i) |
1487 animateScrollbarsRecursive(layer->children()[i], time); | 1486 animateScrollbarsRecursive(layer->children()[i], time); |
1488 } | 1487 } |
1489 | 1488 |
1490 } // namespace cc | 1489 } // namespace cc |
OLD | NEW |