1 /* 2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org) 3 * (C) 2000 Antti Koivisto (koivisto@kde.org) 4 * (C) 2000 Dirk Mueller (mueller@kde.org) 5 * Copyright (C) 2003, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. 6 * Copyright (C) 2006 Graham Dennis (graham.dennis@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 CSSAnimationData_h 26 #define CSSAnimationData_h 27 28 #include "CSSPropertyNames.h" 29 #include "core/platform/animation/TimingFunction.h" 30 #include "core/rendering/style/RenderStyleConstants.h" 31 #include "wtf/PassRefPtr.h" 32 #include "wtf/RefCounted.h" 33 #include "wtf/text/WTFString.h" 34 35 namespace WebCore { 36 37 class CSSAnimationData : public RefCounted<CSSAnimationData> { 38 public: 39 ~CSSAnimationData(); 40 create()41 static PassRefPtr<CSSAnimationData> create() { return adoptRef(new CSSAnimationData); } create(const CSSAnimationData * o)42 static PassRefPtr<CSSAnimationData> create(const CSSAnimationData* o) { return adoptRef(new CSSAnimationData(*o)); } 43 isDelaySet()44 bool isDelaySet() const { return m_delaySet; } isDirectionSet()45 bool isDirectionSet() const { return m_directionSet; } isDurationSet()46 bool isDurationSet() const { return m_durationSet; } isFillModeSet()47 bool isFillModeSet() const { return m_fillModeSet; } isIterationCountSet()48 bool isIterationCountSet() const { return m_iterationCountSet; } isNameSet()49 bool isNameSet() const { return m_nameSet; } isPlayStateSet()50 bool isPlayStateSet() const { return m_playStateSet; } isPropertySet()51 bool isPropertySet() const { return m_propertySet; } isTimingFunctionSet()52 bool isTimingFunctionSet() const { return m_timingFunctionSet; } 53 54 // Flags this to be the special "none" animation (animation-name: none) isNoneAnimation()55 bool isNoneAnimation() const { return m_isNone; } 56 // We can make placeholder CSSAnimationData objects to keep the comma-separated lists 57 // of properties in sync. isValidAnimation means this is not a placeholder. isValidAnimation()58 bool isValidAnimation() const { return !m_isNone && !m_name.isEmpty(); } 59 isEmpty()60 bool isEmpty() const 61 { 62 return (!m_directionSet && !m_durationSet && !m_fillModeSet 63 && !m_nameSet && !m_playStateSet && !m_iterationCountSet 64 && !m_delaySet && !m_timingFunctionSet && !m_propertySet); 65 } 66 isEmptyOrZeroDuration()67 bool isEmptyOrZeroDuration() const 68 { 69 return isEmpty() || (m_duration == 0 && m_delay <= 0); 70 } 71 clearDelay()72 void clearDelay() { m_delaySet = false; } clearDirection()73 void clearDirection() { m_directionSet = false; } clearDuration()74 void clearDuration() { m_durationSet = false; } clearFillMode()75 void clearFillMode() { m_fillModeSet = false; } clearIterationCount()76 void clearIterationCount() { m_iterationCountSet = false; } clearName()77 void clearName() { m_nameSet = false; } clearPlayState()78 void clearPlayState() { m_playStateSet = AnimPlayStatePlaying; } clearProperty()79 void clearProperty() { m_propertySet = false; } clearTimingFunction()80 void clearTimingFunction() { m_timingFunctionSet = false; } 81 clearAll()82 void clearAll() 83 { 84 clearDelay(); 85 clearDirection(); 86 clearDuration(); 87 clearFillMode(); 88 clearIterationCount(); 89 clearName(); 90 clearPlayState(); 91 clearProperty(); 92 clearTimingFunction(); 93 } 94 delay()95 double delay() const { return m_delay; } 96 97 enum AnimationMode { 98 AnimateAll, 99 AnimateNone, 100 AnimateSingleProperty 101 }; 102 103 enum AnimationDirection { 104 AnimationDirectionNormal, 105 AnimationDirectionAlternate, 106 AnimationDirectionReverse, 107 AnimationDirectionAlternateReverse 108 }; direction()109 AnimationDirection direction() const { return static_cast<AnimationDirection>(m_direction); } directionIsForwards()110 bool directionIsForwards() const { return m_direction == AnimationDirectionNormal || m_direction == AnimationDirectionAlternate; } 111 fillMode()112 unsigned fillMode() const { return m_fillMode; } 113 duration()114 double duration() const { return m_duration; } 115 116 enum { IterationCountInfinite = -1 }; iterationCount()117 double iterationCount() const { return m_iterationCount; } name()118 const AtomicString& name() const { return m_name; } playState()119 EAnimPlayState playState() const { return static_cast<EAnimPlayState>(m_playState); } property()120 CSSPropertyID property() const { return m_property; } timingFunction()121 TimingFunction* timingFunction() const { return m_timingFunction.get(); } animationMode()122 AnimationMode animationMode() const { return m_mode; } 123 setDelay(double c)124 void setDelay(double c) { m_delay = c; m_delaySet = true; } setDirection(AnimationDirection d)125 void setDirection(AnimationDirection d) { m_direction = d; m_directionSet = true; } setDuration(double d)126 void setDuration(double d) { ASSERT(d >= 0); m_duration = d; m_durationSet = true; } setFillMode(unsigned f)127 void setFillMode(unsigned f) { m_fillMode = f; m_fillModeSet = true; } setIterationCount(double c)128 void setIterationCount(double c) { m_iterationCount = c; m_iterationCountSet = true; } setName(const AtomicString & n)129 void setName(const AtomicString& n) { m_name = n; m_nameSet = true; } setPlayState(EAnimPlayState d)130 void setPlayState(EAnimPlayState d) { m_playState = d; m_playStateSet = true; } setProperty(CSSPropertyID t)131 void setProperty(CSSPropertyID t) { m_property = t; m_propertySet = true; } setTimingFunction(PassRefPtr<TimingFunction> f)132 void setTimingFunction(PassRefPtr<TimingFunction> f) { m_timingFunction = f; m_timingFunctionSet = true; } setAnimationMode(AnimationMode mode)133 void setAnimationMode(AnimationMode mode) { m_mode = mode; } 134 setIsNoneAnimation(bool n)135 void setIsNoneAnimation(bool n) { m_isNone = n; } 136 137 CSSAnimationData& operator=(const CSSAnimationData& o); 138 139 // return true every CSSAnimationData in the chain (defined by m_next) match 140 bool operator==(const CSSAnimationData& o) const { return animationsMatchForStyleRecalc(&o); } 141 bool operator!=(const CSSAnimationData& o) const { return !(*this == o); } 142 fillsBackwards()143 bool fillsBackwards() const { return m_fillModeSet && (m_fillMode == AnimationFillModeBackwards || m_fillMode == AnimationFillModeBoth); } fillsForwards()144 bool fillsForwards() const { return m_fillModeSet && (m_fillMode == AnimationFillModeForwards || m_fillMode == AnimationFillModeBoth); } 145 146 private: 147 CSSAnimationData(); 148 explicit CSSAnimationData(const CSSAnimationData&); 149 150 // Return whether this object matches another CSSAnimationData object for 151 // the purposes of style recalc. This excludes some properties. 152 bool animationsMatchForStyleRecalc(const CSSAnimationData*) const; 153 154 AtomicString m_name; 155 CSSPropertyID m_property; 156 AnimationMode m_mode; 157 double m_iterationCount; 158 double m_delay; 159 double m_duration; 160 RefPtr<TimingFunction> m_timingFunction; 161 unsigned m_direction : 2; // AnimationDirection 162 unsigned m_fillMode : 2; 163 164 unsigned m_playState : 2; 165 166 bool m_delaySet : 1; 167 bool m_directionSet : 1; 168 bool m_durationSet : 1; 169 bool m_fillModeSet : 1; 170 bool m_iterationCountSet : 1; 171 bool m_nameSet : 1; 172 bool m_playStateSet : 1; 173 bool m_propertySet : 1; 174 bool m_timingFunctionSet : 1; 175 176 bool m_isNone : 1; 177 178 public: initialAnimationDelay()179 static double initialAnimationDelay() { return 0; } initialAnimationDirection()180 static AnimationDirection initialAnimationDirection() { return AnimationDirectionNormal; } initialAnimationDuration()181 static double initialAnimationDuration() { return 0; } initialAnimationFillMode()182 static unsigned initialAnimationFillMode() { return AnimationFillModeNone; } initialAnimationIterationCount()183 static double initialAnimationIterationCount() { return 1.0; } 184 static const AtomicString& initialAnimationName(); initialAnimationPlayState()185 static EAnimPlayState initialAnimationPlayState() { return AnimPlayStatePlaying; } initialAnimationProperty()186 static CSSPropertyID initialAnimationProperty() { return CSSPropertyInvalid; } initialAnimationTimingFunction()187 static const PassRefPtr<TimingFunction> initialAnimationTimingFunction() { return CubicBezierTimingFunction::preset(CubicBezierTimingFunction::Ease); } 188 }; 189 190 } // namespace WebCore 191 192 #endif // CSSAnimationData_h 193