2012-07-20 06:48:25 +00:00
|
|
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
2013-10-03 01:03:04 +00:00
|
|
|
/* vim: set sw=2 ts=8 et tw=80 : */
|
2012-07-20 06:48:25 +00:00
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
|
|
|
|
#ifndef mozilla_layers_Axis_h
|
|
|
|
#define mozilla_layers_Axis_h
|
|
|
|
|
2013-08-11 23:17:23 +00:00
|
|
|
#include <sys/types.h> // for int32_t
|
|
|
|
#include "Units.h" // for CSSRect, CSSPoint
|
|
|
|
#include "mozilla/TimeStamp.h" // for TimeDuration
|
|
|
|
#include "nsTArray.h" // for nsTArray
|
2012-07-20 06:48:25 +00:00
|
|
|
|
|
|
|
namespace mozilla {
|
|
|
|
namespace layers {
|
|
|
|
|
|
|
|
class AsyncPanZoomController;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Helper class to maintain each axis of movement (X,Y) for panning and zooming.
|
|
|
|
* Note that everything here is specific to one axis; that is, the X axis knows
|
|
|
|
* nothing about the Y axis and vice versa.
|
|
|
|
*/
|
|
|
|
class Axis {
|
|
|
|
public:
|
|
|
|
Axis(AsyncPanZoomController* aAsyncPanZoomController);
|
|
|
|
|
|
|
|
enum Overscroll {
|
|
|
|
// Overscroll is not happening at all.
|
|
|
|
OVERSCROLL_NONE = 0,
|
|
|
|
// Overscroll is happening in the negative direction. This means either to
|
|
|
|
// the left or to the top depending on the axis.
|
|
|
|
OVERSCROLL_MINUS,
|
|
|
|
// Overscroll is happening in the positive direction. This means either to
|
|
|
|
// the right or to the bottom depending on the axis.
|
|
|
|
OVERSCROLL_PLUS,
|
|
|
|
// Overscroll is happening both ways. This only means something when the
|
|
|
|
// page is scaled out to a smaller size than the viewport.
|
|
|
|
OVERSCROLL_BOTH
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Notify this Axis that a new touch has been received, including a time delta
|
|
|
|
* indicating how long it has been since the previous one. This triggers a
|
|
|
|
* recalculation of velocity.
|
|
|
|
*/
|
2012-08-22 15:56:38 +00:00
|
|
|
void UpdateWithTouchAtDevicePoint(int32_t aPos, const TimeDuration& aTimeDelta);
|
2012-07-20 06:48:25 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Notify this Axis that a touch has begun, i.e. the user has put their finger
|
|
|
|
* on the screen but has not yet tried to pan.
|
|
|
|
*/
|
2012-08-22 15:56:38 +00:00
|
|
|
void StartTouch(int32_t aPos);
|
2012-07-20 06:48:25 +00:00
|
|
|
|
|
|
|
/**
|
2012-08-14 04:08:38 +00:00
|
|
|
* Notify this Axis that a touch has ended gracefully. This may perform
|
|
|
|
* recalculations of the axis velocity.
|
2012-07-20 06:48:25 +00:00
|
|
|
*/
|
2012-08-14 04:08:38 +00:00
|
|
|
void EndTouch();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Notify this Axis that a touch has ended forcefully. Useful for stopping
|
|
|
|
* flings when a user puts their finger down in the middle of one (i.e. to
|
|
|
|
* stop a previous touch including its fling so that a new one can take its
|
|
|
|
* place).
|
|
|
|
*/
|
|
|
|
void CancelTouch();
|
2012-07-20 06:48:25 +00:00
|
|
|
|
|
|
|
/**
|
2013-08-20 23:00:57 +00:00
|
|
|
* Takes a requested displacement to the position of this axis, and adjusts
|
2013-10-03 01:03:04 +00:00
|
|
|
* it to account for acceleration (which might increase the displacement),
|
|
|
|
* overscroll (which might decrease the displacement; this is to prevent the
|
|
|
|
* viewport from overscrolling the page rect), and axis locking (which might
|
|
|
|
* prevent any displacement from happening). If overscroll ocurred, its amount
|
|
|
|
* is written to |aOverscrollAmountOut|.
|
2013-08-20 23:00:57 +00:00
|
|
|
* The adjusted displacement is returned.
|
2012-07-20 06:48:25 +00:00
|
|
|
*/
|
2013-08-20 23:00:57 +00:00
|
|
|
float AdjustDisplacement(float aDisplacement, float& aOverscrollAmountOut);
|
2012-07-20 06:48:25 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets the distance between the starting position of the touch supplied in
|
|
|
|
* startTouch() and the current touch from the last
|
|
|
|
* updateWithTouchAtDevicePoint().
|
|
|
|
*/
|
|
|
|
float PanDistance();
|
|
|
|
|
2013-10-03 01:03:04 +00:00
|
|
|
/**
|
|
|
|
* Gets the distance between the starting position of the touch supplied in
|
|
|
|
* startTouch() and the supplied position.
|
|
|
|
*/
|
|
|
|
float PanDistance(float aPos);
|
|
|
|
|
2012-07-20 06:48:25 +00:00
|
|
|
/**
|
|
|
|
* Applies friction during a fling, or cancels the fling if the velocity is
|
|
|
|
* too low. Returns true if the fling should continue to another frame, or
|
|
|
|
* false if it should end. |aDelta| is the amount of time that has passed
|
|
|
|
* since the last time friction was applied.
|
|
|
|
*/
|
|
|
|
bool FlingApplyFrictionOrCancel(const TimeDuration& aDelta);
|
|
|
|
|
2013-10-03 01:03:04 +00:00
|
|
|
/*
|
|
|
|
* Returns true if the page is zoomed in to some degree along this axis such that scrolling is
|
|
|
|
* possible and this axis has not been scroll locked while panning. Otherwise, returns false.
|
|
|
|
*/
|
|
|
|
bool Scrollable();
|
|
|
|
|
|
|
|
void SetScrollingDisabled(bool aDisabled) { mScrollingDisabled = aDisabled; }
|
|
|
|
|
2012-07-20 06:48:25 +00:00
|
|
|
/**
|
|
|
|
* Gets the overscroll state of the axis in its current position.
|
|
|
|
*/
|
|
|
|
Overscroll GetOverscroll();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* If there is overscroll, returns the amount. Sign depends on in what
|
|
|
|
* direction it is overscrolling. Positive excess means that it is
|
|
|
|
* overscrolling in the positive direction, whereas negative excess means
|
|
|
|
* that it is overscrolling in the negative direction. If there is overscroll
|
|
|
|
* in both directions, this returns 0; it assumes that you check
|
|
|
|
* GetOverscroll() first.
|
|
|
|
*/
|
2012-08-22 04:37:15 +00:00
|
|
|
float GetExcess();
|
2012-07-20 06:48:25 +00:00
|
|
|
|
2012-09-29 04:02:45 +00:00
|
|
|
/**
|
|
|
|
* Gets the factor of acceleration applied to the velocity, based on the
|
|
|
|
* amount of flings that have been done successively.
|
|
|
|
*/
|
|
|
|
float GetAccelerationFactor();
|
|
|
|
|
2012-07-20 06:48:25 +00:00
|
|
|
/**
|
|
|
|
* Gets the raw velocity of this axis at this moment.
|
|
|
|
*/
|
|
|
|
float GetVelocity();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets the overscroll state of the axis given an additional displacement.
|
|
|
|
* That is to say, if the given displacement is applied, this will tell you
|
|
|
|
* whether or not it will overscroll, and in what direction.
|
|
|
|
*/
|
2013-05-02 13:24:16 +00:00
|
|
|
Overscroll DisplacementWillOverscroll(float aDisplacement);
|
2012-07-20 06:48:25 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* If a displacement will overscroll the axis, this returns the amount and in
|
|
|
|
* what direction. Similar to getExcess() but takes a displacement to apply.
|
|
|
|
*/
|
2013-05-02 13:24:16 +00:00
|
|
|
float DisplacementWillOverscrollAmount(float aDisplacement);
|
2012-07-20 06:48:25 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets the overscroll state of the axis given a scaling of the page. That is
|
|
|
|
* to say, if the given scale is applied, this will tell you whether or not
|
|
|
|
* it will overscroll, and in what direction.
|
|
|
|
*
|
|
|
|
* |aFocus| is the point at which the scale is focused at. We will offset the
|
|
|
|
* scroll offset in such a way that it remains in the same place on the page
|
|
|
|
* relative.
|
|
|
|
*/
|
2013-08-26 13:50:30 +00:00
|
|
|
Overscroll ScaleWillOverscroll(ScreenToScreenScale aScale, float aFocus);
|
2012-07-20 06:48:25 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* If a scale will overscroll the axis, this returns the amount and in what
|
|
|
|
* direction. Similar to getExcess() but takes a displacement to apply.
|
|
|
|
*
|
|
|
|
* |aFocus| is the point at which the scale is focused at. We will offset the
|
|
|
|
* scroll offset in such a way that it remains in the same place on the page
|
|
|
|
* relative.
|
|
|
|
*/
|
2013-08-26 13:50:30 +00:00
|
|
|
float ScaleWillOverscrollAmount(ScreenToScreenScale aScale, float aFocus);
|
2012-07-20 06:48:25 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Checks if an axis will overscroll in both directions by computing the
|
|
|
|
* content rect and checking that its height/width (depending on the axis)
|
|
|
|
* does not overextend past the viewport.
|
|
|
|
*
|
|
|
|
* This gets called by ScaleWillOverscroll().
|
|
|
|
*/
|
2013-08-26 13:50:30 +00:00
|
|
|
bool ScaleWillOverscrollBothSides(ScreenToScreenScale aScale);
|
2012-07-20 06:48:25 +00:00
|
|
|
|
2012-08-22 04:37:15 +00:00
|
|
|
float GetOrigin();
|
2012-09-29 02:16:34 +00:00
|
|
|
float GetCompositionLength();
|
2012-08-22 04:37:15 +00:00
|
|
|
float GetPageStart();
|
|
|
|
float GetPageLength();
|
2012-09-29 02:16:34 +00:00
|
|
|
float GetCompositionEnd();
|
2012-08-22 04:37:15 +00:00
|
|
|
float GetPageEnd();
|
2012-07-20 06:48:25 +00:00
|
|
|
|
2013-08-20 23:00:57 +00:00
|
|
|
int32_t GetPos() const { return mPos; }
|
|
|
|
|
2013-05-31 01:30:13 +00:00
|
|
|
virtual float GetPointOffset(const CSSPoint& aPoint) = 0;
|
2013-06-03 13:52:44 +00:00
|
|
|
virtual float GetRectLength(const CSSRect& aRect) = 0;
|
|
|
|
virtual float GetRectOffset(const CSSRect& aRect) = 0;
|
2012-07-20 06:48:25 +00:00
|
|
|
|
|
|
|
protected:
|
2012-08-22 15:56:38 +00:00
|
|
|
int32_t mPos;
|
|
|
|
int32_t mStartPos;
|
2012-07-20 06:48:25 +00:00
|
|
|
float mVelocity;
|
2012-08-14 04:08:38 +00:00
|
|
|
// Acceleration is represented by an int, which is the power we raise a
|
|
|
|
// constant to and then multiply the velocity by whenever it is sampled. We do
|
|
|
|
// this only when we detect that the user wants to do a fast fling; that is,
|
|
|
|
// they are flinging multiple times in a row very quickly, probably trying to
|
|
|
|
// reach one of the extremes of the page.
|
2012-08-22 15:56:38 +00:00
|
|
|
int32_t mAcceleration;
|
2013-10-03 01:03:04 +00:00
|
|
|
bool mScrollingDisabled; // Whether movement on this axis is locked.
|
2013-01-25 03:59:10 +00:00
|
|
|
AsyncPanZoomController* mAsyncPanZoomController;
|
2013-02-20 22:59:15 +00:00
|
|
|
nsTArray<float> mVelocityQueue;
|
2012-07-20 06:48:25 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class AxisX : public Axis {
|
|
|
|
public:
|
|
|
|
AxisX(AsyncPanZoomController* mAsyncPanZoomController);
|
2013-05-31 01:30:13 +00:00
|
|
|
virtual float GetPointOffset(const CSSPoint& aPoint);
|
2013-06-03 13:52:44 +00:00
|
|
|
virtual float GetRectLength(const CSSRect& aRect);
|
|
|
|
virtual float GetRectOffset(const CSSRect& aRect);
|
2012-07-20 06:48:25 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class AxisY : public Axis {
|
|
|
|
public:
|
|
|
|
AxisY(AsyncPanZoomController* mAsyncPanZoomController);
|
2013-05-31 01:30:13 +00:00
|
|
|
virtual float GetPointOffset(const CSSPoint& aPoint);
|
2013-06-03 13:52:44 +00:00
|
|
|
virtual float GetRectLength(const CSSRect& aRect);
|
|
|
|
virtual float GetRectOffset(const CSSRect& aRect);
|
2012-07-20 06:48:25 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|