Bug 1248340 - Part 1: Add the type of Frames in nsTimingFunction. r=birtles
MozReview-Commit-ID: GPn8D9gwjqa
--- a/dom/animation/ComputedTimingFunction.cpp
+++ b/dom/animation/ComputedTimingFunction.cpp
@@ -13,17 +13,20 @@ namespace mozilla {
void
ComputedTimingFunction::Init(const nsTimingFunction &aFunction)
{
mType = aFunction.mType;
if (nsTimingFunction::IsSplineType(mType)) {
mTimingFunction.Init(aFunction.mFunc.mX1, aFunction.mFunc.mY1,
aFunction.mFunc.mX2, aFunction.mFunc.mY2);
} else {
- mSteps = aFunction.mSteps;
+ // TODO: Support Frames
+ MOZ_ASSERT(nsTimingFunction::Type::StepStart ||
+ nsTimingFunction::Type::StepEnd);
+ mSteps = aFunction.mStepsOrFrames;
}
}
static inline double
StepTiming(uint32_t aSteps,
double aPortion,
ComputedTimingFunction::BeforeFlag aBeforeFlag,
nsTimingFunction::Type aType)
--- a/layout/style/nsComputedDOMStyle.cpp
+++ b/layout/style/nsComputedDOMStyle.cpp
@@ -6563,17 +6563,17 @@ nsComputedDOMStyle::AppendTimingFunction
aTimingFunction.mFunc.mY1,
aTimingFunction.mFunc.mX2,
aTimingFunction.mFunc.mY2,
tmp);
break;
case nsTimingFunction::Type::StepStart:
case nsTimingFunction::Type::StepEnd:
nsStyleUtil::AppendStepsTimingFunction(aTimingFunction.mType,
- aTimingFunction.mSteps,
+ aTimingFunction.mStepsOrFrames,
tmp);
break;
default:
nsStyleUtil::AppendCubicBezierKeywordTimingFunction(aTimingFunction.mType,
tmp);
break;
}
timingFunction->SetString(tmp);
--- a/layout/style/nsStyleStruct.cpp
+++ b/layout/style/nsStyleStruct.cpp
@@ -3077,23 +3077,23 @@ nsStyleBackground::IsTransparent(nsStyle
}
void
nsTimingFunction::AssignFromKeyword(int32_t aTimingFunctionType)
{
switch (aTimingFunctionType) {
case NS_STYLE_TRANSITION_TIMING_FUNCTION_STEP_START:
mType = Type::StepStart;
- mSteps = 1;
+ mStepsOrFrames = 1;
return;
default:
MOZ_FALLTHROUGH_ASSERT("aTimingFunctionType must be a keyword value");
case NS_STYLE_TRANSITION_TIMING_FUNCTION_STEP_END:
mType = Type::StepEnd;
- mSteps = 1;
+ mStepsOrFrames = 1;
return;
case NS_STYLE_TRANSITION_TIMING_FUNCTION_EASE:
case NS_STYLE_TRANSITION_TIMING_FUNCTION_LINEAR:
case NS_STYLE_TRANSITION_TIMING_FUNCTION_EASE_IN:
case NS_STYLE_TRANSITION_TIMING_FUNCTION_EASE_OUT:
case NS_STYLE_TRANSITION_TIMING_FUNCTION_EASE_IN_OUT:
mType = static_cast<Type>(aTimingFunctionType);
break;
--- a/layout/style/nsStyleStruct.h
+++ b/layout/style/nsStyleStruct.h
@@ -2342,23 +2342,26 @@ struct nsTimingFunction
Ease, // ease
Linear, // linear
EaseIn, // ease-in
EaseOut, // ease-out
EaseInOut, // ease-in-out
StepStart, // step-start and steps(..., start)
StepEnd, // step-end, steps(..., end) and steps(...)
CubicBezier, // cubic-bezier()
+ Frames, // frames()
};
// Whether the timing function type is represented by a spline,
// and thus will have mFunc filled in.
static bool IsSplineType(Type aType)
{
- return aType != Type::StepStart && aType != Type::StepEnd;
+ return aType != Type::StepStart &&
+ aType != Type::StepEnd &&
+ aType != Type::Frames;
}
explicit nsTimingFunction(int32_t aTimingFunctionType
= NS_STYLE_TRANSITION_TIMING_FUNCTION_EASE)
{
AssignFromKeyword(aTimingFunctionType);
}
@@ -2368,39 +2371,41 @@ struct nsTimingFunction
mFunc.mX1 = x1;
mFunc.mY1 = y1;
mFunc.mX2 = x2;
mFunc.mY2 = y2;
}
enum class Keyword { Implicit, Explicit };
- nsTimingFunction(Type aType, uint32_t aSteps)
+ nsTimingFunction(Type aType, uint32_t aStepsOrFrames)
: mType(aType)
{
- MOZ_ASSERT(mType == Type::StepStart || mType == Type::StepEnd,
+ MOZ_ASSERT(mType == Type::StepStart ||
+ mType == Type::StepEnd ||
+ mType == Type::Frames,
"wrong type");
- mSteps = aSteps;
+ mStepsOrFrames = aStepsOrFrames;
}
nsTimingFunction(const nsTimingFunction& aOther)
{
*this = aOther;
}
Type mType;
union {
struct {
float mX1;
float mY1;
float mX2;
float mY2;
} mFunc;
struct {
- uint32_t mSteps;
+ uint32_t mStepsOrFrames;
};
};
nsTimingFunction&
operator=(const nsTimingFunction& aOther)
{
if (&aOther == this) {
return *this;
@@ -2409,32 +2414,32 @@ struct nsTimingFunction
mType = aOther.mType;
if (HasSpline()) {
mFunc.mX1 = aOther.mFunc.mX1;
mFunc.mY1 = aOther.mFunc.mY1;
mFunc.mX2 = aOther.mFunc.mX2;
mFunc.mY2 = aOther.mFunc.mY2;
} else {
- mSteps = aOther.mSteps;
+ mStepsOrFrames = aOther.mStepsOrFrames;
}
return *this;
}
bool operator==(const nsTimingFunction& aOther) const
{
if (mType != aOther.mType) {
return false;
}
if (HasSpline()) {
return mFunc.mX1 == aOther.mFunc.mX1 && mFunc.mY1 == aOther.mFunc.mY1 &&
mFunc.mX2 == aOther.mFunc.mX2 && mFunc.mY2 == aOther.mFunc.mY2;
}
- return mSteps == aOther.mSteps;
+ return mStepsOrFrames == aOther.mStepsOrFrames;
}
bool operator!=(const nsTimingFunction& aOther) const
{
return !(*this == aOther);
}
bool HasSpline() const { return IsSplineType(mType); }