ScrollAnimationMSDPhysics.h (2776B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef mozilla_layout_ScrollAnimationMSDPhysics_h_ 8 #define mozilla_layout_ScrollAnimationMSDPhysics_h_ 9 10 #include "ScrollAnimationPhysics.h" 11 #include "mozilla/layers/APZPublicUtils.h" 12 #include "mozilla/layers/AxisPhysicsMSDModel.h" 13 14 namespace mozilla { 15 16 // This class implements a cubic MSD timing function and automatically 17 // adapts the animation duration based on the scrolling rate. 18 class ScrollAnimationMSDPhysics final : public ScrollAnimationPhysics { 19 public: 20 using AxisPhysicsMSDModel = mozilla::layers::AxisPhysicsMSDModel; 21 using ScrollAnimationKind = mozilla::layers::apz::ScrollAnimationKind; 22 23 explicit ScrollAnimationMSDPhysics(ScrollAnimationKind aAnimationKind, 24 const nsPoint& aStartPos, 25 nscoord aSmallestVisibleIncrement); 26 27 void Update(const TimeStamp& aTime, const nsPoint& aDestination, 28 const nsSize& aCurrentVelocity) override; 29 30 void ApplyContentShift(const CSSPoint& aShiftDelta) override; 31 32 // Get the velocity at a point in time in nscoords/sec. 33 nsSize VelocityAt(const TimeStamp& aTime) override; 34 35 // Returns the expected scroll position at a given point in time, in app 36 // units, relative to the scroll frame. 37 nsPoint PositionAt(const TimeStamp& aTime) override; 38 39 bool IsFinished(const TimeStamp& aTime) override; 40 41 protected: 42 // A wrapper around AxisPhysicsMSDModel which takes additional steps to avoid 43 // oscillating motion. 44 class NonOscillatingAxisPhysicsMSDModel : public AxisPhysicsMSDModel { 45 public: 46 NonOscillatingAxisPhysicsMSDModel(double aInitialPosition, 47 double aInitialDestination, 48 double aInitialVelocity, 49 double aSpringConstant, 50 double aDampingRatio); 51 }; 52 53 double ComputeSpringConstant(const TimeStamp& aTime); 54 double GetDampingRatio() const; 55 void SimulateUntil(const TimeStamp& aTime); 56 57 ScrollAnimationKind mAnimationKind; 58 nscoord mSmallestVisibleIncrement; 59 60 TimeStamp mPreviousEventTime; 61 TimeDuration mPreviousDelta; 62 63 TimeStamp mStartTime; 64 65 nsPoint mStartPos; 66 nsPoint mDestination; 67 TimeStamp mLastSimulatedTime; 68 NonOscillatingAxisPhysicsMSDModel mModelX; 69 NonOscillatingAxisPhysicsMSDModel mModelY; 70 bool mIsFirstIteration; 71 }; 72 73 } // namespace mozilla 74 75 #endif // mozilla_layout_ScrollAnimationMSDPhysics_h_