Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3406)

Unified Diff: cc/page_scale_animation.h

Issue 11090062: cc: Rewrite PageScaleAnimation for new coordinate system. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Address gfx::Size::Scale() currently not being mutating Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: cc/page_scale_animation.h
diff --git a/cc/page_scale_animation.h b/cc/page_scale_animation.h
index c4c2940b7456c922dd84662f23f4b49cf3c0b3d3..2d8f6d568705dfc05c8e2762f853dd8c330e7639 100644
--- a/cc/page_scale_animation.h
+++ b/cc/page_scale_animation.h
@@ -7,7 +7,7 @@
#include "base/memory/scoped_ptr.h"
#include "ui/gfx/size.h"
-#include "ui/gfx/vector2d.h"
+#include "ui/gfx/vector2d_f.h"
namespace cc {
@@ -15,30 +15,32 @@ namespace cc {
// 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.
+//
+// All sizes and vectors in this class's public methods are in the root scroll
+// layer's coordinate space.
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);
+ // Construct with the state at the beginning of the animation.
+ static scoped_ptr<PageScaleAnimation> create(const gfx::Vector2dF& startScrollOffset, float startPageScaleFactor, const gfx::SizeF& viewportSize, const gfx::SizeF& rootLayerSize, 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 while explicitly specifying the top-left scroll position.
+ void zoomTo(const gfx::Vector2dF& targetScrollOffset, float targetPageScaleFactor, 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);
+ // Zoom based on a specified anchor. The animator will attempt to keep it
+ // at the same position on the physical display throughout the animation,
+ // unless the edges of the root layer are hit. The anchor is specified
+ // as an offset from the content layer.
+ void zoomWithAnchor(const gfx::Vector2dF& anchor, float targetPageScaleFactor, 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;
+ gfx::Vector2dF scrollOffsetAtTime(double time) const;
+ float pageScaleFactorAtTime(double time) const;
bool isAnimationCompleteAtTime(double time) const;
// The following methods return state which is invariant throughout the
@@ -46,26 +48,34 @@ public:
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; }
+ const gfx::Vector2dF& targetScrollOffset() const { return m_targetScrollOffset; }
+ float targetPageScaleFactor() const { return m_targetPageScaleFactor; }
protected:
- PageScaleAnimation(gfx::Vector2d scrollStart, float pageScaleStart, const gfx::Size& windowSize, const gfx::Size& contentSize, double startTime);
+ PageScaleAnimation(const gfx::Vector2dF& startScrollOffset, float startPageScaleFactor, const gfx::SizeF& viewportSize, const gfx::SizeF& rootLayerSize, 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;
+ void clampTargetScrollOffset();
+ void inferTargetScrollOffsetFromStartAnchor();
+ void inferTargetAnchorFromScrollOffsets();
+ gfx::SizeF viewportSizeAtScale(float pageScaleFactor) const;
+
+ float interpAtTime(double time) const;
+ gfx::Vector2dF scrollOffsetAt(float interp) const;
+ gfx::Vector2dF anchorAt(float interp) const;
+ gfx::Vector2dF viewportRelativeAnchorAt(float interp) const;
+ float pageScaleFactorAt(float interp) const;
+
+ float m_startPageScaleFactor;
+ float m_targetPageScaleFactor;
+ gfx::Vector2dF m_startScrollOffset;
+ gfx::Vector2dF m_targetScrollOffset;
+
+ gfx::Vector2dF m_startAnchor;
+ gfx::Vector2dF m_targetAnchor;
+
+ gfx::SizeF m_viewportSize;
+ gfx::SizeF m_rootLayerSize;
double m_startTime;
double m_duration;

Powered by Google App Engine
This is Rietveld 408576698