| Index: cc/layer_tree_host_impl.cc
|
| diff --git a/cc/layer_tree_host_impl.cc b/cc/layer_tree_host_impl.cc
|
| index 5675aba5d41e0d1de80352007ae649aba787fe42..389b63633d466e32dcd06a7e1db0110f51568eef 100644
|
| --- a/cc/layer_tree_host_impl.cc
|
| +++ b/cc/layer_tree_host_impl.cc
|
| @@ -292,26 +292,34 @@ void LayerTreeHostImpl::animate(base::TimeTicks monotonicTime, base::Time wallCl
|
| animateScrollbars(monotonicTime);
|
| }
|
|
|
| -void LayerTreeHostImpl::startPageScaleAnimation(gfx::Vector2d targetOffset, bool anchorPoint, float pageScale, base::TimeTicks startTime, base::TimeDelta duration)
|
| +void LayerTreeHostImpl::startPageScaleAnimation(gfx::Vector2d targetPosition, bool anchorPoint, float pageScale, base::TimeTicks startTime, base::TimeDelta duration)
|
| {
|
| if (!m_rootScrollLayerImpl)
|
| return;
|
|
|
| gfx::Vector2dF scrollTotal = m_rootScrollLayerImpl->scrollOffset() + m_rootScrollLayerImpl->scrollDelta();
|
| - scrollTotal.Scale(m_pinchZoomViewport.pageScaleDelta());
|
| - float scaleTotal = m_pinchZoomViewport.totalPageScaleFactor();
|
| - gfx::Size scaledContentSize = gfx::ToFlooredSize(contentSize().Scale(m_pinchZoomViewport.pageScaleDelta()));
|
| + gfx::SizeF scaledContentSize = contentSize();
|
| + if (!Settings::pageScalePinchZoomEnabled()) {
|
| + scrollTotal.Scale(1 / m_pinchZoomViewport.pageScaleFactor());
|
| + scaledContentSize.Scale(1 / m_pinchZoomViewport.pageScaleFactor());
|
| + }
|
| + gfx::SizeF viewportSize = m_deviceViewportSize;
|
| + viewportSize.Scale(1 / m_deviceScaleFactor);
|
|
|
| double startTimeSeconds = (startTime - base::TimeTicks()).InSecondsF();
|
| - m_pageScaleAnimation = PageScaleAnimation::create(gfx::ToFlooredVector2d(scrollTotal), scaleTotal, m_deviceViewportSize, scaledContentSize, startTimeSeconds);
|
| + m_pageScaleAnimation = PageScaleAnimation::create(scrollTotal, m_pinchZoomViewport.totalPageScaleFactor(), viewportSize, scaledContentSize, startTimeSeconds);
|
|
|
| if (anchorPoint) {
|
| - gfx::Vector2dF windowAnchor = targetOffset;
|
| - windowAnchor.Scale(scaleTotal / pageScale);
|
| - windowAnchor -= scrollTotal;
|
| - m_pageScaleAnimation->zoomWithAnchor(gfx::ToFlooredVector2d(windowAnchor), pageScale, duration.InSecondsF());
|
| - } else
|
| - m_pageScaleAnimation->zoomTo(targetOffset, pageScale, duration.InSecondsF());
|
| + gfx::Vector2dF anchor(targetPosition);
|
| + if (!Settings::pageScalePinchZoomEnabled())
|
| + anchor.Scale(1 / pageScale);
|
| + m_pageScaleAnimation->zoomWithAnchor(anchor, pageScale, duration.InSecondsF());
|
| + } else {
|
| + gfx::Vector2dF scaledTargetPosition = targetPosition;
|
| + if (!Settings::pageScalePinchZoomEnabled())
|
| + scaledTargetPosition.Scale(1 / pageScale);
|
| + m_pageScaleAnimation->zoomTo(scaledTargetPosition, pageScale, duration.InSecondsF());
|
| + }
|
|
|
| m_client->setNeedsRedrawOnImplThread();
|
| m_client->setNeedsCommitOnImplThread();
|
| @@ -1246,10 +1254,10 @@ void LayerTreeHostImpl::pinchGestureEnd()
|
|
|
| void LayerTreeHostImpl::computeDoubleTapZoomDeltas(ScrollAndScaleSet* scrollInfo)
|
| {
|
| - float pageScale = m_pageScaleAnimation->finalPageScale();
|
| - gfx::Vector2dF scrollOffset = m_pageScaleAnimation->finalScrollOffset();
|
| - scrollOffset.Scale(m_pinchZoomViewport.pageScaleFactor() / pageScale);
|
| - makeScrollAndScaleSet(scrollInfo, gfx::ToRoundedVector2d(scrollOffset), pageScale);
|
| + gfx::Vector2dF scaledScrollOffset = m_pageScaleAnimation->targetScrollOffset();
|
| + if (!Settings::pageScalePinchZoomEnabled())
|
| + scaledScrollOffset.Scale(m_pinchZoomViewport.pageScaleFactor());
|
| + makeScrollAndScaleSet(scrollInfo, ToFlooredVector2d(scaledScrollOffset), m_pageScaleAnimation->targetPageScaleFactor());
|
| }
|
|
|
| void LayerTreeHostImpl::computePinchZoomDeltas(ScrollAndScaleSet* scrollInfo)
|
| @@ -1323,14 +1331,12 @@ scoped_ptr<ScrollAndScaleSet> LayerTreeHostImpl::processScrollDeltas()
|
| if (m_pinchGestureActive || m_pageScaleAnimation) {
|
| scrollInfo->pageScaleDelta = 1;
|
| m_pinchZoomViewport.setSentPageScaleDelta(1);
|
| - // FIXME(aelias): Make these painting optimizations compatible with
|
| + // FIXME(aelias): Make pinch-zoom painting optimization compatible with
|
| // compositor-side scaling.
|
| - if (!Settings::pageScalePinchZoomEnabled()) {
|
| - if (m_pinchGestureActive)
|
| - computePinchZoomDeltas(scrollInfo.get());
|
| - else if (m_pageScaleAnimation.get())
|
| - computeDoubleTapZoomDeltas(scrollInfo.get());
|
| - }
|
| + if (!Settings::pageScalePinchZoomEnabled() && m_pinchGestureActive)
|
| + computePinchZoomDeltas(scrollInfo.get());
|
| + else if (m_pageScaleAnimation.get())
|
| + computeDoubleTapZoomDeltas(scrollInfo.get());
|
| return scrollInfo.Pass();
|
| }
|
|
|
| @@ -1363,9 +1369,11 @@ void LayerTreeHostImpl::animatePageScale(base::TimeTicks time)
|
| double monotonicTime = (time - base::TimeTicks()).InSecondsF();
|
| gfx::Vector2dF scrollTotal = m_rootScrollLayerImpl->scrollOffset() + m_rootScrollLayerImpl->scrollDelta();
|
|
|
| - setPageScaleDelta(m_pageScaleAnimation->pageScaleAtTime(monotonicTime) / m_pinchZoomViewport.pageScaleFactor());
|
| + setPageScaleDelta(m_pageScaleAnimation->pageScaleFactorAtTime(monotonicTime) / m_pinchZoomViewport.pageScaleFactor());
|
| gfx::Vector2dF nextScroll = m_pageScaleAnimation->scrollOffsetAtTime(monotonicTime);
|
| - nextScroll.Scale(1 / m_pinchZoomViewport.pageScaleDelta());
|
| +
|
| + if (!Settings::pageScalePinchZoomEnabled())
|
| + nextScroll.Scale(m_pinchZoomViewport.pageScaleFactor());
|
| m_rootScrollLayerImpl->scrollBy(nextScroll - scrollTotal);
|
| m_client->setNeedsRedrawOnImplThread();
|
|
|
|
|