Share code to compute timing functions. (Bug 651801, patch 2) r=bzbarsky

This commit is contained in:
L. David Baron 2011-04-21 20:17:30 -07:00
parent c52e471a70
commit 6242cc7dee
2 changed files with 72 additions and 95 deletions

View File

@ -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) {

View File

@ -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;