summaryrefslogtreecommitdiffstats
path: root/cc/page_scale_animation.h
blob: 1a4193bdd08209948e0c061b48e355e54ba06b8e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
// Copyright 2011 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.

#ifndef CCPageScaleAnimation_h
#define CCPageScaleAnimation_h

#include "base/memory/scoped_ptr.h"
#include "IntSize.h"

namespace cc {

// A small helper class that does the math for zoom animations, primarily for
// double-tap zoom. Initialize it with starting and ending scroll/page scale
// positions and an animation length time, then call ...AtTime() at every frame
// to obtain the current interpolated position.
class PageScaleAnimation {
public:
    // Construct with the starting page scale and scroll offset (which is in
    // pageScaleStart space). The window size is the user-viewable area
    // in pixels.
    static scoped_ptr<PageScaleAnimation> create(const IntSize& scrollStart, float pageScaleStart, const IntSize& windowSize, const IntSize& contentSize, double startTime);

    // The following methods initialize the animation. Call one of them
    // immediately after construction to set the final scroll and page scale.

    // Zoom while explicitly specifying the top-left scroll position. The
    // scroll offset is in finalPageScale coordinates.
    void zoomTo(const IntSize& finalScroll, float finalPageScale, double duration);

    // Zoom based on a specified onscreen anchor, which will remain at the same
    // position on the screen throughout the animation. The anchor is in local
    // space relative to scrollStart.
    void zoomWithAnchor(const IntSize& anchor, float finalPageScale, double duration);

    // Call these functions while the animation is in progress to output the
    // current state.
    IntSize scrollOffsetAtTime(double time) const;
    float pageScaleAtTime(double time) const;
    bool isAnimationCompleteAtTime(double time) const;

    // The following methods return state which is invariant throughout the
    // course of the animation.
    double startTime() const { return m_startTime; }
    double duration() const { return m_duration; }
    double endTime() const { return m_startTime + m_duration; }
    const IntSize& finalScrollOffset() const { return m_scrollEnd; }
    float finalPageScale() const { return m_pageScaleEnd; }

protected:
    PageScaleAnimation(const IntSize& scrollStart, float pageScaleStart, const IntSize& windowSize, const IntSize& contentSize, double startTime);

private:
    float progressRatioForTime(double time) const;
    IntSize scrollOffsetAtRatio(float ratio) const;
    float pageScaleAtRatio(float ratio) const;

    IntSize m_scrollStart;
    float m_pageScaleStart;
    IntSize m_windowSize;
    IntSize m_contentSize;

    bool m_anchorMode;
    IntSize m_anchor;
    IntSize m_scrollEnd;
    float m_pageScaleEnd;

    double m_startTime;
    double m_duration;
};

}  // namespace cc

#endif