| Index: Source/core/platform/animation/TimingFunction.h
|
| diff --git a/Source/core/platform/animation/TimingFunction.h b/Source/core/platform/animation/TimingFunction.h
|
| deleted file mode 100644
|
| index 147d86b390b94b7227a3df631d79b8bc23365e37..0000000000000000000000000000000000000000
|
| --- a/Source/core/platform/animation/TimingFunction.h
|
| +++ /dev/null
|
| @@ -1,330 +0,0 @@
|
| -/*
|
| - * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
|
| - * (C) 2000 Antti Koivisto (koivisto@kde.org)
|
| - * (C) 2000 Dirk Mueller (mueller@kde.org)
|
| - * Copyright (C) 2003, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
|
| - * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com)
|
| - *
|
| - * This library is free software; you can redistribute it and/or
|
| - * modify it under the terms of the GNU Library General Public
|
| - * License as published by the Free Software Foundation; either
|
| - * version 2 of the License, or (at your option) any later version.
|
| - *
|
| - * This library is distributed in the hope that it will be useful,
|
| - * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
| - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
| - * Library General Public License for more details.
|
| - *
|
| - * You should have received a copy of the GNU Library General Public License
|
| - * along with this library; see the file COPYING.LIB. If not, write to
|
| - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
| - * Boston, MA 02110-1301, USA.
|
| - *
|
| - */
|
| -
|
| -#ifndef TimingFunction_h
|
| -#define TimingFunction_h
|
| -
|
| -#include "RuntimeEnabledFeatures.h"
|
| -#include "platform/animation/AnimationUtilities.h" // For blend()
|
| -#include "platform/animation/UnitBezier.h"
|
| -#include "wtf/OwnPtr.h"
|
| -#include "wtf/PassOwnPtr.h"
|
| -#include "wtf/PassRefPtr.h"
|
| -#include "wtf/RefCounted.h"
|
| -#include "wtf/StdLibExtras.h"
|
| -#include "wtf/Vector.h"
|
| -#include <algorithm>
|
| -
|
| -
|
| -namespace WebCore {
|
| -
|
| -class TimingFunction : public RefCounted<TimingFunction> {
|
| -public:
|
| -
|
| - enum Type {
|
| - LinearFunction, CubicBezierFunction, StepsFunction, ChainedFunction
|
| - };
|
| -
|
| - virtual ~TimingFunction() { }
|
| -
|
| - Type type() const { return m_type; }
|
| -
|
| - // Evaluates the timing function at the given fraction. The accuracy parameter provides a hint as to the required
|
| - // accuracy and is not guaranteed.
|
| - virtual double evaluate(double fraction, double accuracy) const = 0;
|
| -
|
| -protected:
|
| - TimingFunction(Type type)
|
| - : m_type(type)
|
| - {
|
| - }
|
| -
|
| -private:
|
| - Type m_type;
|
| -};
|
| -
|
| -class LinearTimingFunction : public TimingFunction {
|
| -public:
|
| - static PassRefPtr<LinearTimingFunction> create()
|
| - {
|
| - return adoptRef(new LinearTimingFunction);
|
| - }
|
| -
|
| - ~LinearTimingFunction() { }
|
| -
|
| - virtual double evaluate(double fraction, double) const
|
| - {
|
| - ASSERT(RuntimeEnabledFeatures::webAnimationsCSSEnabled() || (fraction >= 0 && fraction <= 1));
|
| - ASSERT_WITH_MESSAGE(!RuntimeEnabledFeatures::webAnimationsCSSEnabled() || (fraction >= 0 && fraction <= 1), "Web Animations not yet implemented: Timing function behavior outside the range [0, 1] is not yet specified");
|
| - return fraction;
|
| - }
|
| -
|
| -private:
|
| - LinearTimingFunction()
|
| - : TimingFunction(LinearFunction)
|
| - {
|
| - }
|
| -};
|
| -
|
| -
|
| -// Forward declare so we can friend it below. Don't use in production code!
|
| -class ChainedTimingFunctionTestHelper;
|
| -
|
| -class CubicBezierTimingFunction : public TimingFunction {
|
| -public:
|
| - enum SubType {
|
| - Ease,
|
| - EaseIn,
|
| - EaseOut,
|
| - EaseInOut,
|
| - Custom
|
| - };
|
| -
|
| - static PassRefPtr<CubicBezierTimingFunction> create(double x1, double y1, double x2, double y2)
|
| - {
|
| - return adoptRef(new CubicBezierTimingFunction(Custom, x1, y1, x2, y2));
|
| - }
|
| -
|
| - static CubicBezierTimingFunction* preset(SubType subType)
|
| - {
|
| - switch (subType) {
|
| - case Ease:
|
| - {
|
| - DEFINE_STATIC_REF(CubicBezierTimingFunction, ease, (adoptRef(new CubicBezierTimingFunction(Ease, 0.25, 0.1, 0.25, 1.0))));
|
| - return ease;
|
| - }
|
| - case EaseIn:
|
| - {
|
| - DEFINE_STATIC_REF(CubicBezierTimingFunction, easeIn, (adoptRef(new CubicBezierTimingFunction(EaseIn, 0.42, 0.0, 1.0, 1.0))));
|
| - return easeIn;
|
| - }
|
| - case EaseOut:
|
| - {
|
| - DEFINE_STATIC_REF(CubicBezierTimingFunction, easeOut, (adoptRef(new CubicBezierTimingFunction(EaseOut, 0.0, 0.0, 0.58, 1.0))));
|
| - return easeOut;
|
| - }
|
| - case EaseInOut:
|
| - {
|
| - DEFINE_STATIC_REF(CubicBezierTimingFunction, easeInOut, (adoptRef(new CubicBezierTimingFunction(EaseInOut, 0.42, 0.0, 0.58, 1.0))));
|
| - return easeInOut;
|
| - }
|
| - default:
|
| - ASSERT_NOT_REACHED();
|
| - return 0;
|
| - }
|
| - }
|
| -
|
| - ~CubicBezierTimingFunction() { }
|
| -
|
| - virtual double evaluate(double fraction, double accuracy) const
|
| - {
|
| - ASSERT(RuntimeEnabledFeatures::webAnimationsCSSEnabled() || (fraction >= 0 && fraction <= 1));
|
| - ASSERT_WITH_MESSAGE(!RuntimeEnabledFeatures::webAnimationsCSSEnabled() || (fraction >= 0 && fraction <= 1), "Web Animations not yet implemented: Timing function behavior outside the range [0, 1] is not yet specified");
|
| - if (!m_bezier)
|
| - m_bezier = adoptPtr(new UnitBezier(m_x1, m_y1, m_x2, m_y2));
|
| - return m_bezier->solve(fraction, accuracy);
|
| - }
|
| -
|
| - double x1() const { return m_x1; }
|
| - double y1() const { return m_y1; }
|
| - double x2() const { return m_x2; }
|
| - double y2() const { return m_y2; }
|
| -
|
| - SubType subType() const { return m_subType; }
|
| -
|
| -private:
|
| - explicit CubicBezierTimingFunction(SubType subType, double x1, double y1, double x2, double y2)
|
| - : TimingFunction(CubicBezierFunction)
|
| - , m_x1(x1)
|
| - , m_y1(y1)
|
| - , m_x2(x2)
|
| - , m_y2(y2)
|
| - , m_subType(subType)
|
| - {
|
| - }
|
| -
|
| - double m_x1;
|
| - double m_y1;
|
| - double m_x2;
|
| - double m_y2;
|
| - SubType m_subType;
|
| - mutable OwnPtr<UnitBezier> m_bezier;
|
| -};
|
| -
|
| -class StepsTimingFunction : public TimingFunction {
|
| -public:
|
| - enum SubType {
|
| - Start,
|
| - End,
|
| - Custom
|
| - };
|
| -
|
| - static PassRefPtr<StepsTimingFunction> create(int steps, bool stepAtStart)
|
| - {
|
| - return adoptRef(new StepsTimingFunction(Custom, steps, stepAtStart));
|
| - }
|
| -
|
| - static StepsTimingFunction* preset(SubType subType)
|
| - {
|
| - switch (subType) {
|
| - case Start:
|
| - {
|
| - DEFINE_STATIC_REF(StepsTimingFunction, start, (adoptRef(new StepsTimingFunction(Start, 1, true))));
|
| - return start;
|
| - }
|
| - case End:
|
| - {
|
| - DEFINE_STATIC_REF(StepsTimingFunction, end, (adoptRef(new StepsTimingFunction(End, 1, false))));
|
| - return end;
|
| - }
|
| - default:
|
| - ASSERT_NOT_REACHED();
|
| - return 0;
|
| - }
|
| - }
|
| -
|
| -
|
| - ~StepsTimingFunction() { }
|
| -
|
| - virtual double evaluate(double fraction, double) const
|
| - {
|
| - ASSERT(RuntimeEnabledFeatures::webAnimationsCSSEnabled() || (fraction >= 0 && fraction <= 1));
|
| - ASSERT_WITH_MESSAGE(!RuntimeEnabledFeatures::webAnimationsCSSEnabled() || (fraction >= 0 && fraction <= 1), "Web Animations not yet implemented: Timing function behavior outside the range [0, 1] is not yet specified");
|
| - return std::min(1.0, (floor(m_steps * fraction) + m_stepAtStart) / m_steps);
|
| - }
|
| -
|
| - int numberOfSteps() const { return m_steps; }
|
| - bool stepAtStart() const { return m_stepAtStart; }
|
| -
|
| - SubType subType() const { return m_subType; }
|
| -
|
| -private:
|
| - StepsTimingFunction(SubType subType, int steps, bool stepAtStart)
|
| - : TimingFunction(StepsFunction)
|
| - , m_steps(steps)
|
| - , m_stepAtStart(stepAtStart)
|
| - , m_subType(subType)
|
| - {
|
| - }
|
| -
|
| - int m_steps;
|
| - bool m_stepAtStart;
|
| - SubType m_subType;
|
| -};
|
| -
|
| -class ChainedTimingFunction : public TimingFunction {
|
| -public:
|
| - static PassRefPtr<ChainedTimingFunction> create()
|
| - {
|
| - return adoptRef(new ChainedTimingFunction);
|
| - }
|
| -
|
| - void appendSegment(double upperBound, TimingFunction* timingFunction)
|
| - {
|
| - double max = m_segments.isEmpty() ? 0 : m_segments.last().max();
|
| - ASSERT(upperBound > max);
|
| - m_segments.append(Segment(max, upperBound, timingFunction));
|
| - }
|
| - virtual double evaluate(double fraction, double accuracy) const
|
| - {
|
| - ASSERT_WITH_MESSAGE(fraction >= 0 && fraction <= 1, "Web Animations not yet implemented: Timing function behavior outside the range [0, 1] is not yet specified");
|
| - ASSERT(!m_segments.isEmpty());
|
| - ASSERT(m_segments.last().max() == 1);
|
| - size_t i = 0;
|
| - const Segment* segment = &m_segments[i++];
|
| - while (fraction >= segment->max() && i < m_segments.size()) {
|
| - segment = &m_segments[i++];
|
| - }
|
| - return segment->evaluate(fraction, accuracy);
|
| - }
|
| -
|
| -private:
|
| - class Segment {
|
| - public:
|
| - Segment(double min, double max, TimingFunction* timingFunction)
|
| - : m_min(min)
|
| - , m_max(max)
|
| - , m_timingFunction(timingFunction)
|
| - { ASSERT(timingFunction); }
|
| -
|
| - double max() const { return m_max; }
|
| - double evaluate(double fraction, double accuracy) const
|
| - {
|
| - return scaleFromLocal(m_timingFunction->evaluate(scaleToLocal(fraction), accuracy));
|
| - }
|
| -
|
| - private:
|
| - double scaleToLocal(double x) const { return (x - m_min) / (m_max - m_min); }
|
| - double scaleFromLocal(double x) const { return blend(m_min, m_max, x); }
|
| -
|
| - double m_min;
|
| - double m_max;
|
| - RefPtr<TimingFunction> m_timingFunction;
|
| -
|
| - // FIXME: Come up with a public API for the segments and remove this.
|
| - friend class CompositorAnimationsImpl;
|
| - friend class CompositorAnimations;
|
| -
|
| - // Allow the compositor to reverse the timing function.
|
| - friend class CompositorAnimationsTimingFunctionReverser;
|
| -
|
| - // Allow PrintTo/operator== of the segments. Can be removed once
|
| - // ChainedTimingFunction has a public API for segments.
|
| - friend class ChainedTimingFunctionTestHelper;
|
| - };
|
| -
|
| - ChainedTimingFunction()
|
| - : TimingFunction(ChainedFunction)
|
| - {
|
| - ASSERT(RuntimeEnabledFeatures::webAnimationsCSSEnabled());
|
| - }
|
| -
|
| - Vector<Segment> m_segments;
|
| -
|
| - // FIXME: Come up with a public API for the segments and remove this.
|
| - friend class CompositorAnimationsImpl;
|
| - friend class CompositorAnimations;
|
| -
|
| - // Allow the compositor to reverse the timing function.
|
| - friend class CompositorAnimationsTimingFunctionReverser;
|
| -
|
| - // Allow PrintTo/operator== of the segments. Can be removed once
|
| - // ChainedTimingFunction has a public API for segments.
|
| - friend class ChainedTimingFunctionTestHelper;
|
| -};
|
| -
|
| -#define DEFINE_TIMING_FUNCTION_TYPE_CASTS(typeName) \
|
| - DEFINE_TYPE_CASTS( \
|
| - typeName##TimingFunction, TimingFunction, value, \
|
| - value->type() == TimingFunction::typeName##Function, \
|
| - value.type() == TimingFunction::typeName##Function)
|
| -
|
| -DEFINE_TIMING_FUNCTION_TYPE_CASTS(Linear);
|
| -DEFINE_TIMING_FUNCTION_TYPE_CASTS(CubicBezier);
|
| -DEFINE_TIMING_FUNCTION_TYPE_CASTS(Steps);
|
| -DEFINE_TIMING_FUNCTION_TYPE_CASTS(Chained);
|
| -
|
| -} // namespace WebCore
|
| -
|
| -#endif // TimingFunction_h
|
|
|