| 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 |