1 /* 2 * Copyright (C) 2000 Lars Knoll (knoll (at) kde.org) 3 * (C) 2000 Antti Koivisto (koivisto (at) kde.org) 4 * (C) 2000 Dirk Mueller (mueller (at) kde.org) 5 * Copyright (C) 2003, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. 6 * Copyright (C) 2006 Graham Dennis (graham.dennis (at) gmail.com) 7 * 8 * This library is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU Library General Public 10 * License as published by the Free Software Foundation; either 11 * version 2 of the License, or (at your option) any later version. 12 * 13 * This library is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * Library General Public License for more details. 17 * 18 * You should have received a copy of the GNU Library General Public License 19 * along with this library; see the file COPYING.LIB. If not, write to 20 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 21 * Boston, MA 02110-1301, USA. 22 * 23 */ 24 25 #ifndef TimingFunction_h 26 #define TimingFunction_h 27 28 #include <wtf/RefCounted.h> 29 30 namespace WebCore { 31 32 class TimingFunction : public RefCounted<TimingFunction> { 33 public: 34 35 enum TimingFunctionType { 36 LinearFunction, CubicBezierFunction, StepsFunction 37 }; 38 39 virtual ~TimingFunction() { } 40 41 bool isLinearTimingFunction() const { return m_type == LinearFunction; } 42 bool isCubicBezierTimingFunction() const { return m_type == CubicBezierFunction; } 43 bool isStepsTimingFunction() const { return m_type == StepsFunction; } 44 45 virtual bool operator==(const TimingFunction& other) = 0; 46 47 protected: 48 TimingFunction(TimingFunctionType type) 49 : m_type(type) 50 { 51 } 52 53 TimingFunctionType m_type; 54 }; 55 56 class LinearTimingFunction : public TimingFunction { 57 public: 58 static PassRefPtr<LinearTimingFunction> create() 59 { 60 return adoptRef(new LinearTimingFunction); 61 } 62 63 ~LinearTimingFunction() { } 64 65 virtual bool operator==(const TimingFunction& other) 66 { 67 return other.isLinearTimingFunction(); 68 } 69 70 private: 71 LinearTimingFunction() 72 : TimingFunction(LinearFunction) 73 { 74 } 75 }; 76 77 class CubicBezierTimingFunction : public TimingFunction { 78 public: 79 static PassRefPtr<CubicBezierTimingFunction> create(double x1, double y1, double x2, double y2) 80 { 81 return adoptRef(new CubicBezierTimingFunction(x1, y1, x2, y2)); 82 } 83 84 static PassRefPtr<CubicBezierTimingFunction> create() 85 { 86 return adoptRef(new CubicBezierTimingFunction()); 87 } 88 89 ~CubicBezierTimingFunction() { } 90 91 virtual bool operator==(const TimingFunction& other) 92 { 93 if (other.isCubicBezierTimingFunction()) { 94 const CubicBezierTimingFunction* ctf = static_cast<const CubicBezierTimingFunction*>(&other); 95 return m_x1 == ctf->m_x1 && m_y1 == ctf->m_y1 && m_x2 == ctf->m_x2 && m_y2 == ctf->m_y2; 96 } 97 return false; 98 } 99 100 double x1() const { return m_x1; } 101 double y1() const { return m_y1; } 102 double x2() const { return m_x2; } 103 double y2() const { return m_y2; } 104 105 static const CubicBezierTimingFunction* defaultTimingFunction() 106 { 107 static const CubicBezierTimingFunction* dtf = create().leakRef(); 108 return dtf; 109 } 110 111 private: 112 CubicBezierTimingFunction(double x1 = 0.25, double y1 = 0.1, double x2 = 0.25, double y2 = 1.0) 113 : TimingFunction(CubicBezierFunction) 114 , m_x1(x1) 115 , m_y1(y1) 116 , m_x2(x2) 117 , m_y2(y2) 118 { 119 } 120 121 double m_x1; 122 double m_y1; 123 double m_x2; 124 double m_y2; 125 }; 126 127 class StepsTimingFunction : public TimingFunction { 128 public: 129 static PassRefPtr<StepsTimingFunction> create(int steps, bool stepAtStart) 130 { 131 return adoptRef(new StepsTimingFunction(steps, stepAtStart)); 132 } 133 134 ~StepsTimingFunction() { } 135 136 virtual bool operator==(const TimingFunction& other) 137 { 138 if (other.isStepsTimingFunction()) { 139 const StepsTimingFunction* stf = static_cast<const StepsTimingFunction*>(&other); 140 return m_steps == stf->m_steps && m_stepAtStart == stf->m_stepAtStart; 141 } 142 return false; 143 } 144 145 int numberOfSteps() const { return m_steps; } 146 bool stepAtStart() const { return m_stepAtStart; } 147 148 private: 149 StepsTimingFunction(int steps, bool stepAtStart) 150 : TimingFunction(StepsFunction) 151 , m_steps(steps) 152 , m_stepAtStart(stepAtStart) 153 { 154 } 155 156 int m_steps; 157 bool m_stepAtStart; 158 }; 159 160 } // namespace WebCore 161 162 #endif // TimingFunction_h 163