tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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_