mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-13 05:15:45 +00:00
Share code to compute timing functions. (Bug 651801, patch 2) r=bzbarsky
This commit is contained in:
parent
c52e471a70
commit
6242cc7dee
@ -3709,6 +3709,49 @@ CountTransitionProps(const TransitionPropInfo* aInfo,
|
||||
return numTransitions;
|
||||
}
|
||||
|
||||
static void
|
||||
ComputeTimingFunction(const nsCSSValue& aValue, nsTimingFunction& aResult)
|
||||
{
|
||||
switch (aValue.GetUnit()) {
|
||||
case eCSSUnit_Enumerated:
|
||||
aResult = nsTimingFunction(aValue.GetIntValue());
|
||||
break;
|
||||
case eCSSUnit_Cubic_Bezier:
|
||||
{
|
||||
nsCSSValue::Array* array = aValue.GetArrayValue();
|
||||
NS_ASSERTION(array && array->Count() == 4,
|
||||
"Need 4 control points");
|
||||
aResult = nsTimingFunction(array->Item(0).GetFloatValue(),
|
||||
array->Item(1).GetFloatValue(),
|
||||
array->Item(2).GetFloatValue(),
|
||||
array->Item(3).GetFloatValue());
|
||||
}
|
||||
break;
|
||||
case eCSSUnit_Steps:
|
||||
{
|
||||
nsCSSValue::Array* array = aValue.GetArrayValue();
|
||||
NS_ASSERTION(array && array->Count() == 2,
|
||||
"Need 2 items");
|
||||
NS_ASSERTION(array->Item(0).GetUnit() == eCSSUnit_Integer,
|
||||
"unexpected first value");
|
||||
NS_ASSERTION(array->Item(1).GetUnit() == eCSSUnit_Enumerated &&
|
||||
(array->Item(1).GetIntValue() ==
|
||||
NS_STYLE_TRANSITION_TIMING_FUNCTION_STEP_START ||
|
||||
array->Item(1).GetIntValue() ==
|
||||
NS_STYLE_TRANSITION_TIMING_FUNCTION_STEP_END),
|
||||
"unexpected second value");
|
||||
nsTimingFunction::Type type =
|
||||
(array->Item(1).GetIntValue() ==
|
||||
NS_STYLE_TRANSITION_TIMING_FUNCTION_STEP_END)
|
||||
? nsTimingFunction::StepEnd : nsTimingFunction::StepStart;
|
||||
aResult = nsTimingFunction(type, array->Item(0).GetIntValue());
|
||||
}
|
||||
break;
|
||||
default:
|
||||
NS_NOTREACHED("Invalid transition property unit");
|
||||
}
|
||||
}
|
||||
|
||||
const void*
|
||||
nsRuleNode::ComputeDisplayData(void* aStartStruct,
|
||||
const nsRuleData* aRuleData,
|
||||
@ -3856,49 +3899,8 @@ nsRuleNode::ComputeDisplayData(void* aStartStruct,
|
||||
transition->SetTimingFunction(
|
||||
nsTimingFunction(NS_STYLE_TRANSITION_TIMING_FUNCTION_EASE));
|
||||
} else if (timingFunction.list) {
|
||||
switch (timingFunction.list->mValue.GetUnit()) {
|
||||
case eCSSUnit_Enumerated:
|
||||
transition->SetTimingFunction(
|
||||
nsTimingFunction(timingFunction.list->mValue.GetIntValue()));
|
||||
break;
|
||||
case eCSSUnit_Cubic_Bezier:
|
||||
{
|
||||
nsCSSValue::Array* array =
|
||||
timingFunction.list->mValue.GetArrayValue();
|
||||
NS_ASSERTION(array && array->Count() == 4,
|
||||
"Need 4 control points");
|
||||
transition->SetTimingFunction(
|
||||
nsTimingFunction(array->Item(0).GetFloatValue(),
|
||||
array->Item(1).GetFloatValue(),
|
||||
array->Item(2).GetFloatValue(),
|
||||
array->Item(3).GetFloatValue()));
|
||||
}
|
||||
break;
|
||||
case eCSSUnit_Steps:
|
||||
{
|
||||
nsCSSValue::Array* array =
|
||||
timingFunction.list->mValue.GetArrayValue();
|
||||
NS_ASSERTION(array && array->Count() == 2,
|
||||
"Need 2 items");
|
||||
NS_ASSERTION(array->Item(0).GetUnit() == eCSSUnit_Integer,
|
||||
"unexpected first value");
|
||||
NS_ASSERTION(array->Item(1).GetUnit() == eCSSUnit_Enumerated &&
|
||||
(array->Item(1).GetIntValue() ==
|
||||
NS_STYLE_TRANSITION_TIMING_FUNCTION_STEP_START ||
|
||||
array->Item(1).GetIntValue() ==
|
||||
NS_STYLE_TRANSITION_TIMING_FUNCTION_STEP_END),
|
||||
"unexpected second value");
|
||||
transition->SetTimingFunction(
|
||||
nsTimingFunction((
|
||||
array->Item(1).GetIntValue() ==
|
||||
NS_STYLE_TRANSITION_TIMING_FUNCTION_STEP_END)
|
||||
? nsTimingFunction::StepEnd : nsTimingFunction::StepStart,
|
||||
array->Item(0).GetIntValue()));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
NS_NOTREACHED("Invalid transition property unit");
|
||||
}
|
||||
ComputeTimingFunction(timingFunction.list->mValue,
|
||||
transition->TimingFunctionSlot());
|
||||
}
|
||||
|
||||
FOR_ALL_TRANSITION_PROPS(p) {
|
||||
@ -4057,49 +4059,8 @@ nsRuleNode::ComputeDisplayData(void* aStartStruct,
|
||||
animation->SetTimingFunction(
|
||||
nsTimingFunction(NS_STYLE_TRANSITION_TIMING_FUNCTION_EASE));
|
||||
} else if (animTimingFunction.list) {
|
||||
switch (animTimingFunction.list->mValue.GetUnit()) {
|
||||
case eCSSUnit_Enumerated:
|
||||
animation->SetTimingFunction(
|
||||
nsTimingFunction(animTimingFunction.list->mValue.GetIntValue()));
|
||||
break;
|
||||
case eCSSUnit_Cubic_Bezier:
|
||||
{
|
||||
nsCSSValue::Array* array =
|
||||
animTimingFunction.list->mValue.GetArrayValue();
|
||||
NS_ASSERTION(array && array->Count() == 4,
|
||||
"Need 4 control points");
|
||||
animation->SetTimingFunction(
|
||||
nsTimingFunction(array->Item(0).GetFloatValue(),
|
||||
array->Item(1).GetFloatValue(),
|
||||
array->Item(2).GetFloatValue(),
|
||||
array->Item(3).GetFloatValue()));
|
||||
}
|
||||
break;
|
||||
case eCSSUnit_Steps:
|
||||
{
|
||||
nsCSSValue::Array* array =
|
||||
animTimingFunction.list->mValue.GetArrayValue();
|
||||
NS_ASSERTION(array && array->Count() == 2,
|
||||
"Need 2 items");
|
||||
NS_ASSERTION(array->Item(0).GetUnit() == eCSSUnit_Integer,
|
||||
"unexpected first value");
|
||||
NS_ASSERTION(array->Item(1).GetUnit() == eCSSUnit_Enumerated &&
|
||||
(array->Item(1).GetIntValue() ==
|
||||
NS_STYLE_TRANSITION_TIMING_FUNCTION_STEP_START ||
|
||||
array->Item(1).GetIntValue() ==
|
||||
NS_STYLE_TRANSITION_TIMING_FUNCTION_STEP_END),
|
||||
"unexpected second value");
|
||||
animation->SetTimingFunction(
|
||||
nsTimingFunction((
|
||||
array->Item(1).GetIntValue() ==
|
||||
NS_STYLE_TRANSITION_TIMING_FUNCTION_STEP_END)
|
||||
? nsTimingFunction::StepEnd : nsTimingFunction::StepStart,
|
||||
array->Item(0).GetIntValue()));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
NS_NOTREACHED("Invalid animation property unit");
|
||||
}
|
||||
ComputeTimingFunction(animTimingFunction.list->mValue,
|
||||
animation->TimingFunctionSlot());
|
||||
}
|
||||
|
||||
if (i >= animDirection.num) {
|
||||
|
@ -1334,16 +1334,8 @@ struct nsTimingFunction {
|
||||
}
|
||||
|
||||
nsTimingFunction(const nsTimingFunction& aOther)
|
||||
: mType(aOther.mType)
|
||||
{
|
||||
if (mType == Function) {
|
||||
mFunc.mX1 = aOther.mFunc.mX1;
|
||||
mFunc.mY1 = aOther.mFunc.mY1;
|
||||
mFunc.mX2 = aOther.mFunc.mX2;
|
||||
mFunc.mY2 = aOther.mFunc.mY2;
|
||||
} else {
|
||||
mSteps = aOther.mSteps;
|
||||
}
|
||||
*this = aOther;
|
||||
}
|
||||
|
||||
Type mType;
|
||||
@ -1357,6 +1349,26 @@ struct nsTimingFunction {
|
||||
PRUint32 mSteps;
|
||||
};
|
||||
|
||||
nsTimingFunction&
|
||||
operator=(const nsTimingFunction& aOther)
|
||||
{
|
||||
if (&aOther == this)
|
||||
return *this;
|
||||
|
||||
mType = aOther.mType;
|
||||
|
||||
if (mType == Function) {
|
||||
mFunc.mX1 = aOther.mFunc.mX1;
|
||||
mFunc.mY1 = aOther.mFunc.mY1;
|
||||
mFunc.mX2 = aOther.mFunc.mX2;
|
||||
mFunc.mY2 = aOther.mFunc.mY2;
|
||||
} else {
|
||||
mSteps = aOther.mSteps;
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool operator==(const nsTimingFunction& aOther) const
|
||||
{
|
||||
if (mType != aOther.mType) {
|
||||
@ -1408,6 +1420,8 @@ struct nsTransition {
|
||||
mUnknownProperty = aOther.mUnknownProperty;
|
||||
}
|
||||
|
||||
nsTimingFunction& TimingFunctionSlot() { return mTimingFunction; }
|
||||
|
||||
private:
|
||||
nsTimingFunction mTimingFunction;
|
||||
float mDuration;
|
||||
@ -1446,6 +1460,8 @@ struct nsAnimation {
|
||||
void SetIterationCount(float aIterationCount)
|
||||
{ mIterationCount = aIterationCount; }
|
||||
|
||||
nsTimingFunction& TimingFunctionSlot() { return mTimingFunction; }
|
||||
|
||||
private:
|
||||
nsTimingFunction mTimingFunction;
|
||||
float mDuration;
|
||||
|
Loading…
Reference in New Issue
Block a user