Commit 7ea5fa00 authored by Boris Chiou's avatar Boris Chiou
Browse files

Bug 1676791 - Part 4: Make TimingParams be a LiteralType. r=hiro

And so we can make ScrollTimeline::GetTiming() be a constexpr function.

Differential Revision: https://phabricator.services.mozilla.com/D131449
parent 193a6c3d
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -30,8 +30,11 @@ class ComputedTimingFunction {
  };

  struct StepFunc {
    uint32_t mSteps;
    StyleStepPosition mPos;
    uint32_t mSteps = 1;
    StyleStepPosition mPos = StyleStepPosition::End;
    constexpr StepFunc() = default;
    constexpr StepFunc(uint32_t aSteps, StyleStepPosition aPos)
        : mSteps(aSteps), mPos(aPos){};
    bool operator==(const StepFunc& aOther) const {
      return mSteps == aOther.mSteps && mPos == aOther.mPos;
    }
@@ -46,7 +49,7 @@ class ComputedTimingFunction {
    return ComputedTimingFunction(aSteps, aPos);
  }

  ComputedTimingFunction() = default;
  constexpr ComputedTimingFunction() = default;
  explicit ComputedTimingFunction(const nsTimingFunction& aFunction) {
    Init(aFunction);
  }
@@ -109,7 +112,7 @@ class ComputedTimingFunction {
  ComputedTimingFunction(uint32_t aSteps, StyleStepPosition aPos)
      : mType(Type::Step), mSteps{aSteps, aPos} {}

  Type mType;
  Type mType = Type::Ease;
  SMILKeySpline mTimingFunction;
  StepFunc mSteps;
};
+10 −0
Original line number Diff line number Diff line
@@ -12,6 +12,8 @@
#include "nsIScrollableFrame.h"
#include "nsLayoutUtils.h"

#define SCROLL_TIMELINE_DURATION_MILLISEC 100000

namespace mozilla::dom {

// ---------------------------------
@@ -38,6 +40,8 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_END
NS_IMPL_ISUPPORTS_CYCLE_COLLECTION_INHERITED_0(ScrollTimeline,
                                               AnimationTimeline)

TimingParams ScrollTimeline::sTiming;

ScrollTimeline::ScrollTimeline(Document* aDocument, Element* aScroller)
    : AnimationTimeline(aDocument->GetParentObject()),
      mDocument(aDocument),
@@ -54,6 +58,12 @@ ScrollTimeline::ScrollTimeline(Document* aDocument, Element* aScroller)
      mDirection(StyleScrollDirection::Auto) {
  MOZ_ASSERT(aDocument);

  // Use default values except for |mDuration| and |mFill|.
  // Use a fixed duration defined in SCROLL_TIMELINE_DURATIONMILLISEC, and use
  // FillMode::Both to make sure the animation is in effect at 100%.
  sTiming = TimingParams(SCROLL_TIMELINE_DURATION_MILLISEC, 0.0, 1.0,
                         PlaybackDirection::Normal, FillMode::Both);

  RegisterWithScrollSource();
}

+6 −14
Original line number Diff line number Diff line
@@ -13,8 +13,6 @@
#include "mozilla/TimingParams.h"
#include "mozilla/WritingModes.h"

#define SCROLL_TIMELINE_DURATION_MILLISEC 100000

namespace mozilla {
namespace dom {

@@ -99,18 +97,7 @@ class ScrollTimeline final : public AnimationTimeline {
    Tick();
  }

  static const TimingParams& GetTiming() {
    // Use default values except for mDuration and mFill.
    // Use a fixed duration defined in SCROLL_TIMELINE_DURATIONMILLISEC, and use
    // FillMode::Both to make sure the animation is in effect at 100%.
    // Note: it's unfortunate TimingParams cannot be a const variable because
    // we have to use StickyTimingDuration::FromMilliseconds() in its
    // constructor.
    static TimingParams sTiming =
        TimingParams(SCROLL_TIMELINE_DURATION_MILLISEC, 0.0, 1.0,
                     PlaybackDirection::Normal, FillMode::Both);
    return sTiming;
  }
  static constexpr const TimingParams& GetTiming() { return sTiming; }

 protected:
  virtual ~ScrollTimeline() { Teardown(); }
@@ -152,6 +139,11 @@ class ScrollTimeline final : public AnimationTimeline {
  // So now we will only use the scroll direction from @scroll-timeline rule.
  RefPtr<Element> mSource;
  StyleScrollDirection mDirection;

  // Note: it's unfortunate TimingParams cannot be a const variable because
  // we have to use StickyTimingDuration::FromMilliseconds() in its
  // constructor.
  static TimingParams sTiming;
};

/**
+11 −8
Original line number Diff line number Diff line
@@ -29,19 +29,22 @@ class UnrestrictedDoubleOrKeyframeAnimationOptions;
}  // namespace dom

struct TimingParams {
  TimingParams() = default;
  constexpr TimingParams() = default;

  TimingParams(float aDuration, float aDelay, float aIterationCount,
               dom::PlaybackDirection aDirection, dom::FillMode aFillMode)
  constexpr TimingParams(float aDuration, float aDelay, float aIterationCount,
                         dom::PlaybackDirection aDirection,
                         dom::FillMode aFillMode)
      : mIterations(aIterationCount), mDirection(aDirection), mFill(aFillMode) {
    mDuration.emplace(StickyTimeDuration::FromMilliseconds(aDuration));
    mDelay = TimeDuration::FromMilliseconds(aDelay);
    Update();
  }

  TimingParams(const TimeDuration& aDuration, const TimeDuration& aDelay,
  constexpr TimingParams(const TimeDuration& aDuration,
                         const TimeDuration& aDelay,
                         const TimeDuration& aEndDelay, float aIterations,
               float aIterationStart, dom::PlaybackDirection aDirection,
                         float aIterationStart,
                         dom::PlaybackDirection aDirection,
                         dom::FillMode aFillMode,
                         Maybe<ComputedTimingFunction>&& aFunction)
      : mDelay(aDelay),
+2 −2
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@ namespace mozilla {
 */
class SMILKeySpline {
 public:
  SMILKeySpline() : mX1(0), mY1(0), mX2(0), mY2(0) {
  constexpr SMILKeySpline() : mX1(0), mY1(0), mX2(0), mY2(0) {
    /* caller must call Init later */\
  }

@@ -97,7 +97,7 @@ class SMILKeySpline {
    double mY2;

    enum { kSplineTableSize = 11 };
    double mSampleValues[kSplineTableSize];
    double mSampleValues[kSplineTableSize] = {};

    static const double kSampleStepSize;
};