| Index: cc/CCPageScaleAnimation.cpp
|
| diff --git a/cc/CCPageScaleAnimation.cpp b/cc/CCPageScaleAnimation.cpp
|
| deleted file mode 100644
|
| index 12dda09f147ee8c47528f43e0133c87876fe3ec1..0000000000000000000000000000000000000000
|
| --- a/cc/CCPageScaleAnimation.cpp
|
| +++ /dev/null
|
| @@ -1,159 +0,0 @@
|
| -// Copyright 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "config.h"
|
| -
|
| -#include "CCPageScaleAnimation.h"
|
| -
|
| -#include "FloatRect.h"
|
| -#include "FloatSize.h"
|
| -
|
| -#include <math.h>
|
| -
|
| -namespace cc {
|
| -
|
| -PassOwnPtr<CCPageScaleAnimation> CCPageScaleAnimation::create(const IntSize& scrollStart, float pageScaleStart, const IntSize& windowSize, const IntSize& contentSize, double startTime)
|
| -{
|
| - return adoptPtr(new CCPageScaleAnimation(scrollStart, pageScaleStart, windowSize, contentSize, startTime));
|
| -}
|
| -
|
| -
|
| -CCPageScaleAnimation::CCPageScaleAnimation(const IntSize& scrollStart, float pageScaleStart, const IntSize& windowSize, const IntSize& contentSize, double startTime)
|
| - : m_scrollStart(scrollStart)
|
| - , m_pageScaleStart(pageScaleStart)
|
| - , m_windowSize(windowSize)
|
| - , m_contentSize(contentSize)
|
| - , m_anchorMode(false)
|
| - , m_scrollEnd(scrollStart)
|
| - , m_pageScaleEnd(pageScaleStart)
|
| - , m_startTime(startTime)
|
| - , m_duration(0)
|
| -{
|
| -}
|
| -
|
| -void CCPageScaleAnimation::zoomTo(const IntSize& finalScroll, float finalPageScale, double duration)
|
| -{
|
| - if (m_pageScaleStart != finalPageScale) {
|
| - // For uniform-looking zooming, infer the anchor (point that remains in
|
| - // place throughout the zoom) from the start and end rects.
|
| - FloatRect startRect(IntPoint(m_scrollStart), m_windowSize);
|
| - FloatRect endRect(IntPoint(finalScroll), m_windowSize);
|
| - endRect.scale(m_pageScaleStart / finalPageScale);
|
| -
|
| - // The anchor is the point which is at the same ratio of the sides of
|
| - // both startRect and endRect. For example, a zoom-in double-tap to a
|
| - // perfectly centered rect will have anchor ratios (0.5, 0.5), while one
|
| - // to a rect touching the bottom-right of the screen will have anchor
|
| - // ratios (1.0, 1.0). In other words, it obeys the equations:
|
| - // anchorX = start_width * ratioX + start_x
|
| - // anchorX = end_width * ratioX + end_x
|
| - // anchorY = start_height * ratioY + start_y
|
| - // anchorY = end_height * ratioY + end_y
|
| - // where both anchor{x,y} and ratio{x,y} begin as unknowns. Solving
|
| - // for the ratios, we get the following formulas:
|
| - float ratioX = (startRect.x() - endRect.x()) / (endRect.width() - startRect.width());
|
| - float ratioY = (startRect.y() - endRect.y()) / (endRect.height() - startRect.height());
|
| -
|
| - IntSize anchor(m_windowSize.width() * ratioX, m_windowSize.height() * ratioY);
|
| - zoomWithAnchor(anchor, finalPageScale, duration);
|
| - } else {
|
| - // If this is a pure translation, then there exists no anchor. Linearly
|
| - // interpolate the scroll offset instead.
|
| - m_scrollEnd = finalScroll;
|
| - m_pageScaleEnd = finalPageScale;
|
| - m_duration = duration;
|
| - m_anchorMode = false;
|
| - }
|
| -}
|
| -
|
| -void CCPageScaleAnimation::zoomWithAnchor(const IntSize& anchor, float finalPageScale, double duration)
|
| -{
|
| - m_scrollEnd = m_scrollStart + anchor;
|
| - m_scrollEnd.scale(finalPageScale / m_pageScaleStart);
|
| - m_scrollEnd -= anchor;
|
| -
|
| - m_scrollEnd.clampNegativeToZero();
|
| - FloatSize scaledContentSize(m_contentSize);
|
| - scaledContentSize.scale(finalPageScale / m_pageScaleStart);
|
| - IntSize maxScrollPosition = roundedIntSize(scaledContentSize - m_windowSize);
|
| - m_scrollEnd = m_scrollEnd.shrunkTo(maxScrollPosition);
|
| -
|
| - m_anchor = anchor;
|
| - m_pageScaleEnd = finalPageScale;
|
| - m_duration = duration;
|
| - m_anchorMode = true;
|
| -}
|
| -
|
| -IntSize CCPageScaleAnimation::scrollOffsetAtTime(double time) const
|
| -{
|
| - return scrollOffsetAtRatio(progressRatioForTime(time));
|
| -}
|
| -
|
| -float CCPageScaleAnimation::pageScaleAtTime(double time) const
|
| -{
|
| - return pageScaleAtRatio(progressRatioForTime(time));
|
| -}
|
| -
|
| -bool CCPageScaleAnimation::isAnimationCompleteAtTime(double time) const
|
| -{
|
| - return time >= endTime();
|
| -}
|
| -
|
| -float CCPageScaleAnimation::progressRatioForTime(double time) const
|
| -{
|
| - if (isAnimationCompleteAtTime(time))
|
| - return 1;
|
| -
|
| - return (time - m_startTime) / m_duration;
|
| -}
|
| -
|
| -IntSize CCPageScaleAnimation::scrollOffsetAtRatio(float ratio) const
|
| -{
|
| - if (ratio <= 0)
|
| - return m_scrollStart;
|
| - if (ratio >= 1)
|
| - return m_scrollEnd;
|
| -
|
| - float currentPageScale = pageScaleAtRatio(ratio);
|
| - IntSize currentScrollOffset;
|
| - if (m_anchorMode) {
|
| - // Keep the anchor stable on the screen at the current scale.
|
| - IntSize documentAnchor = m_scrollStart + m_anchor;
|
| - documentAnchor.scale(currentPageScale / m_pageScaleStart);
|
| - currentScrollOffset = documentAnchor - m_anchor;
|
| - } else {
|
| - // First move both scroll offsets to the current coordinate space.
|
| - FloatSize scaledStartScroll(m_scrollStart);
|
| - scaledStartScroll.scale(currentPageScale / m_pageScaleStart);
|
| - FloatSize scaledEndScroll(m_scrollEnd);
|
| - scaledEndScroll.scale(currentPageScale / m_pageScaleEnd);
|
| -
|
| - // Linearly interpolate between them.
|
| - FloatSize delta = scaledEndScroll - scaledStartScroll;
|
| - delta.scale(ratio);
|
| - currentScrollOffset = roundedIntSize(scaledStartScroll + delta);
|
| - }
|
| -
|
| - return currentScrollOffset;
|
| -}
|
| -
|
| -float CCPageScaleAnimation::pageScaleAtRatio(float ratio) const
|
| -{
|
| - if (ratio <= 0)
|
| - return m_pageScaleStart;
|
| - if (ratio >= 1)
|
| - return m_pageScaleEnd;
|
| -
|
| - // Linearly interpolate the magnitude in log scale.
|
| - // Log scale is needed to maintain the appearance of uniform zoom. For
|
| - // example, if we zoom from 0.5 to 4.0 in 3 seconds, then we should
|
| - // be zooming by 2x every second.
|
| - float diff = m_pageScaleEnd / m_pageScaleStart;
|
| - float logDiff = log(diff);
|
| - logDiff *= ratio;
|
| - diff = exp(logDiff);
|
| - return m_pageScaleStart * diff;
|
| -}
|
| -
|
| -} // namespace cc
|
|
|