// The generic PrintTo *must* come after the non-generic PrintTo otherwise it // will end up calling itself. void PrintTo(const TimingFunction& timingFunction, ::std::ostream* os) { switch (timingFunction.type()) { case TimingFunction::LinearFunction: { const LinearTimingFunction& linear = toLinearTimingFunction(timingFunction); PrintTo(linear, os); return; } case TimingFunction::CubicBezierFunction: { const CubicBezierTimingFunction& cubic = toCubicBezierTimingFunction(timingFunction); PrintTo(cubic, os); return; } case TimingFunction::StepsFunction: { const StepsTimingFunction& step = toStepsTimingFunction(timingFunction); PrintTo(step, os); return; } case TimingFunction::ChainedFunction: { const ChainedTimingFunction& chained = toChainedTimingFunction(timingFunction); PrintTo(chained, os); return; } default: ASSERT_NOT_REACHED(); } }
bool operator==(const StepsTimingFunction& lhs, const TimingFunction& rhs) { if (rhs.type() != TimingFunction::StepsFunction) return false; const StepsTimingFunction& stf = toStepsTimingFunction(rhs); return (lhs.numberOfSteps() == stf.numberOfSteps()) && (lhs.stepAtPosition() == stf.stepAtPosition()); }
bool operator==(const StepsTimingFunction& lhs, const TimingFunction& rhs) { if (rhs.type() != TimingFunction::StepsFunction) return false; const StepsTimingFunction& stf = toStepsTimingFunction(rhs); if ((lhs.subType() == StepsTimingFunction::Custom) && (stf.subType() == StepsTimingFunction::Custom)) return (lhs.numberOfSteps() == stf.numberOfSteps()) && (lhs.stepAtStart() == stf.stepAtStart()); return lhs.subType() == stf.subType(); }
// The generic operator== *must* come after the // non-generic operator== otherwise it will end up calling itself. bool operator==(const TimingFunction& lhs, const TimingFunction& rhs) { switch (lhs.type()) { case TimingFunction::LinearFunction: { const LinearTimingFunction& linear = toLinearTimingFunction(lhs); return (linear == rhs); } case TimingFunction::CubicBezierFunction: { const CubicBezierTimingFunction& cubic = toCubicBezierTimingFunction(lhs); return (cubic == rhs); } case TimingFunction::StepsFunction: { const StepsTimingFunction& step = toStepsTimingFunction(lhs); return (step == rhs); } default: ASSERT_NOT_REACHED(); } return false; }
void CSSToStyleMap::mapAnimationTimingFunction(CSSAnimationData* animation, CSSValue* value) const { RefPtr<TimingFunction> timingFunction = animationTimingFunction(value, true); if (timingFunction) { // Step middle timing functions are supported up to this point for use in the Web Animations API, // but should not be supported for CSS Animations and Transitions. bool isStepMiddleFunction = (timingFunction->type() == TimingFunction::StepsFunction) && (toStepsTimingFunction(*timingFunction).stepAtPosition() == StepsTimingFunction::StepAtMiddle); if (isStepMiddleFunction) animation->setTimingFunction(CubicBezierTimingFunction::preset(CubicBezierTimingFunction::Ease)); else animation->setTimingFunction(timingFunction); } }