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
75
76
|
// 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 CC_PAGE_SCALE_ANIMATION_H_
#define CC_PAGE_SCALE_ANIMATION_H_
#include "base/memory/scoped_ptr.h"
#include "ui/gfx/size.h"
#include "ui/gfx/vector2d.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(gfx::Vector2d scrollStart, float pageScaleStart, const gfx::Size& windowSize, const gfx::Size& contentSize, double startTime);
~PageScaleAnimation();
// 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(gfx::Vector2d 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(gfx::Vector2d anchor, float finalPageScale, double duration);
// Call these functions while the animation is in progress to output the
// current state.
gfx::Vector2d 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; }
gfx::Vector2d finalScrollOffset() const { return m_scrollEnd; }
float finalPageScale() const { return m_pageScaleEnd; }
protected:
PageScaleAnimation(gfx::Vector2d scrollStart, float pageScaleStart, const gfx::Size& windowSize, const gfx::Size& contentSize, double startTime);
private:
float progressRatioForTime(double time) const;
gfx::Vector2d scrollOffsetAtRatio(float ratio) const;
float pageScaleAtRatio(float ratio) const;
gfx::Vector2d m_scrollStart;
float m_pageScaleStart;
gfx::Size m_windowSize;
gfx::Size m_contentSize;
bool m_anchorMode;
gfx::Vector2d m_anchor;
gfx::Vector2d m_scrollEnd;
float m_pageScaleEnd;
double m_startTime;
double m_duration;
};
} // namespace cc
#endif // CC_PAGE_SCALE_ANIMATION_H_
|