void Layer::SetAnimations(const AnimationArray& aAnimations) { mAnimations = aAnimations; mAnimationData.Clear(); for (uint32_t i = 0; i < mAnimations.Length(); i++) { AnimData* data = mAnimationData.AppendElement(); InfallibleTArray<nsAutoPtr<css::ComputedTimingFunction> >& functions = data->mFunctions; nsTArray<AnimationSegment> segments = mAnimations.ElementAt(i).segments(); for (uint32_t j = 0; j < segments.Length(); j++) { TimingFunction tf = segments.ElementAt(j).sampleFn(); css::ComputedTimingFunction* ctf = new css::ComputedTimingFunction(); switch (tf.type()) { case TimingFunction::TCubicBezierFunction: { CubicBezierFunction cbf = tf.get_CubicBezierFunction(); ctf->Init(nsTimingFunction(cbf.x1(), cbf.y1(), cbf.x2(), cbf.y2())); break; } default: { NS_ASSERTION(tf.type() == TimingFunction::TStepFunction, "Function must be bezier or step"); StepFunction sf = tf.get_StepFunction(); nsTimingFunction::Type type = sf.type() == 1 ? nsTimingFunction::StepStart : nsTimingFunction::StepEnd; ctf->Init(nsTimingFunction(type, sf.steps())); break; } } functions.AppendElement(ctf); } // Precompute the nsStyleAnimation::Values that we need if this is a transform // animation. InfallibleTArray<nsStyleAnimation::Value>& startValues = data->mStartValues; InfallibleTArray<nsStyleAnimation::Value>& endValues = data->mEndValues; for (uint32_t j = 0; j < mAnimations[i].segments().Length(); j++) { const AnimationSegment& segment = mAnimations[i].segments()[j]; nsStyleAnimation::Value* startValue = startValues.AppendElement(); nsStyleAnimation::Value* endValue = endValues.AppendElement(); if (segment.endState().type() == Animatable::TArrayOfTransformFunction) { const InfallibleTArray<TransformFunction>& startFunctions = segment.startState().get_ArrayOfTransformFunction(); startValue->SetAndAdoptCSSValueListValue(CreateCSSValueList(startFunctions), nsStyleAnimation::eUnit_Transform); const InfallibleTArray<TransformFunction>& endFunctions = segment.endState().get_ArrayOfTransformFunction(); endValue->SetAndAdoptCSSValueListValue(CreateCSSValueList(endFunctions), nsStyleAnimation::eUnit_Transform); } else { NS_ASSERTION(segment.endState().type() == Animatable::Tfloat, "Unknown Animatable type"); startValue->SetFloatValue(segment.startState().get_float()); endValue->SetFloatValue(segment.endState().get_float()); } } } Mutated(); }
/* static */ Maybe<ComputedTimingFunction> AnimationUtils::TimingFunctionToComputedTimingFunction( const TimingFunction& aTimingFunction) { switch (aTimingFunction.type()) { case TimingFunction::Tnull_t: return Nothing(); case TimingFunction::TCubicBezierFunction: { CubicBezierFunction cbf = aTimingFunction.get_CubicBezierFunction(); return Some(ComputedTimingFunction::CubicBezier(cbf.x1(), cbf.y1(), cbf.x2(), cbf.y2())); } case TimingFunction::TStepFunction: { StepFunction sf = aTimingFunction.get_StepFunction(); StyleStepPosition pos = static_cast<StyleStepPosition>(sf.type()); return Some(ComputedTimingFunction::Steps(sf.steps(), pos)); } default: MOZ_ASSERT_UNREACHABLE("Function must be null, bezier, step or frames"); break; } return Nothing(); }