Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 29 */ | 29 */ |
| 30 | 30 |
| 31 #include "config.h" | 31 #include "config.h" |
| 32 #include "core/animation/KeyframeEffectModel.h" | 32 #include "core/animation/KeyframeEffectModel.h" |
| 33 | 33 |
| 34 #include "StylePropertyShorthand.h" | |
| 34 #include "core/animation/AnimatableDouble.h" | 35 #include "core/animation/AnimatableDouble.h" |
| 35 #include "core/animation/TimedItem.h" | 36 #include "core/animation/TimedItem.h" |
| 37 #include "core/animation/css/CSSAnimations.h" | |
| 38 #include "core/css/StylePropertySet.h" | |
| 39 #include "core/css/resolver/StyleResolver.h" | |
| 36 #include "wtf/text/StringHash.h" | 40 #include "wtf/text/StringHash.h" |
| 37 | 41 |
| 38 namespace WebCore { | 42 namespace WebCore { |
| 39 | 43 |
| 40 bool KeyframeEffectModelBase::Keyframe::compareOffsets(const RefPtrWillBeRawPtr< Keyframe>& a, const RefPtrWillBeRawPtr<Keyframe>& b) | 44 bool KeyframeEffectModelBase::Keyframe::compareOffsets(const RefPtrWillBeRawPtr< Keyframe>& a, const RefPtrWillBeRawPtr<Keyframe>& b) |
| 41 { | 45 { |
| 42 return a->offset() < b->offset(); | 46 return a->offset() < b->offset(); |
| 43 } | 47 } |
| 44 | 48 |
| 45 PropertySet KeyframeEffectModelBase::properties() const | 49 PropertySet KeyframeEffectModelBase::properties() const |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 138 if (m_keyframeGroups) | 142 if (m_keyframeGroups) |
| 139 return; | 143 return; |
| 140 | 144 |
| 141 m_keyframeGroups = adoptPtr(new KeyframeGroupMap); | 145 m_keyframeGroups = adoptPtr(new KeyframeGroupMap); |
| 142 const KeyframeVector keyframes = normalizedKeyframes(getFrames()); | 146 const KeyframeVector keyframes = normalizedKeyframes(getFrames()); |
| 143 for (KeyframeVector::const_iterator keyframeIter = keyframes.begin(); keyfra meIter != keyframes.end(); ++keyframeIter) { | 147 for (KeyframeVector::const_iterator keyframeIter = keyframes.begin(); keyfra meIter != keyframes.end(); ++keyframeIter) { |
| 144 const Keyframe* keyframe = keyframeIter->get(); | 148 const Keyframe* keyframe = keyframeIter->get(); |
| 145 PropertySet keyframeProperties = keyframe->properties(); | 149 PropertySet keyframeProperties = keyframe->properties(); |
| 146 for (PropertySet::const_iterator propertyIter = keyframeProperties.begin (); propertyIter != keyframeProperties.end(); ++propertyIter) { | 150 for (PropertySet::const_iterator propertyIter = keyframeProperties.begin (); propertyIter != keyframeProperties.end(); ++propertyIter) { |
| 147 CSSPropertyID property = *propertyIter; | 151 CSSPropertyID property = *propertyIter; |
| 152 ASSERT_WITH_MESSAGE(!isExpandedShorthand(property), "Web Animations: Encountered shorthand CSS property (%d) in normalized keyframes.", property); | |
| 148 KeyframeGroupMap::iterator groupIter = m_keyframeGroups->find(proper ty); | 153 KeyframeGroupMap::iterator groupIter = m_keyframeGroups->find(proper ty); |
| 149 PropertySpecificKeyframeGroup* group; | 154 PropertySpecificKeyframeGroup* group; |
| 150 if (groupIter == m_keyframeGroups->end()) | 155 if (groupIter == m_keyframeGroups->end()) |
| 151 group = m_keyframeGroups->add(property, adoptPtr(new PropertySpe cificKeyframeGroup)).storedValue->value.get(); | 156 group = m_keyframeGroups->add(property, adoptPtr(new PropertySpe cificKeyframeGroup)).storedValue->value.get(); |
| 152 else | 157 else |
| 153 group = groupIter->value.get(); | 158 group = groupIter->value.get(); |
| 154 | 159 |
| 155 group->appendKeyframe(keyframe->createPropertySpecificKeyframe(prope rty)); | 160 group->appendKeyframe(keyframe->createPropertySpecificKeyframe(prope rty)); |
| 156 } | 161 } |
| 157 } | 162 } |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 248 if (property == CSSPropertyOpacity) | 253 if (property == CSSPropertyOpacity) |
| 249 return OpacityStyleInterpolation::create(toAnimatableDouble(from->value( ))->toDouble(), toAnimatableDouble(to->value())->toDouble()); | 254 return OpacityStyleInterpolation::create(toAnimatableDouble(from->value( ))->toDouble(), toAnimatableDouble(to->value())->toDouble()); |
| 250 return LegacyStyleInterpolation::create(from->value(), to->value(), property ); | 255 return LegacyStyleInterpolation::create(from->value(), to->value(), property ); |
| 251 } | 256 } |
| 252 | 257 |
| 253 PassOwnPtr<KeyframeEffectModelBase::PropertySpecificKeyframe> AVKeyframeEffectMo del::neutralKeyframe(double offset, PassRefPtr<TimingFunction> easing) const | 258 PassOwnPtr<KeyframeEffectModelBase::PropertySpecificKeyframe> AVKeyframeEffectMo del::neutralKeyframe(double offset, PassRefPtr<TimingFunction> easing) const |
| 254 { | 259 { |
| 255 return adoptPtr(new PropertySpecificKeyframe(offset, easing, AnimatableValue ::neutralValue(), CompositeAdd)); | 260 return adoptPtr(new PropertySpecificKeyframe(offset, easing, AnimatableValue ::neutralValue(), CompositeAdd)); |
| 256 } | 261 } |
| 257 | 262 |
| 263 void SKeyframe::setPropertyValue(CSSPropertyID property, const String& value) | |
| 264 { | |
| 265 ASSERT(property != CSSPropertyInvalid); | |
| 266 RefPtr<MutableStylePropertySet> propertySet = MutableStylePropertySet::creat e(); | |
| 267 propertySet->setProperty(property, value); | |
| 268 for (size_t i = 0; i < propertySet->propertyCount(); ++i) { | |
| 269 CSSPropertyID id = propertySet->propertyAt(i).id(); | |
| 270 if (CSSAnimations::isAnimatableProperty(id)) | |
| 271 m_propertyValues.add(id, propertySet->getPropertyCSSValue(id)); | |
| 272 } | |
| 273 } | |
| 274 | |
| 275 static bool checkDocumentAndRenderer(Element& element) | |
| 276 { | |
| 277 if (!element.inActiveDocument()) | |
| 278 return false; | |
| 279 element.document().updateStyleIfNeeded(); | |
| 280 return element.renderer(); | |
| 281 } | |
| 282 | |
| 258 PassRefPtr<Interpolation> SKeyframeEffectModel::createInterpolation(CSSPropertyI D property, KeyframeEffectModelBase::PropertySpecificKeyframe *start, KeyframeEf fectModelBase::PropertySpecificKeyframe *end) const | 283 PassRefPtr<Interpolation> SKeyframeEffectModel::createInterpolation(CSSPropertyI D property, KeyframeEffectModelBase::PropertySpecificKeyframe *start, KeyframeEf fectModelBase::PropertySpecificKeyframe *end) const |
| 259 { | 284 { |
| 260 PropertySpecificKeyframe *from = toPropertySpecificKeyframe(start); | 285 // FIXME: This check will not be neccessary once we can avoid snapshotting c omputed style values for keyframes. |
| 261 PropertySpecificKeyframe *to = toPropertySpecificKeyframe(end); | 286 RELEASE_ASSERT(checkDocumentAndRenderer(*m_element.get())); |
| 262 ASSERT_UNUSED(from, from); | 287 |
| 263 ASSERT_UNUSED(to, to); | 288 CSSValue* fromCSSValue = toPropertySpecificKeyframe(start)->value(); |
| 264 // create Interpolation here | 289 CSSValue* toCSSValue = toPropertySpecificKeyframe(end)->value(); |
| 265 return RefPtr<Interpolation>(); | 290 |
| 291 RefPtr<AnimatableValue> from = StyleResolver::createAnimatableValueSnapshot( *m_element.get(), *m_renderStyle.get(), property, fromCSSValue); | |
| 292 RefPtr<AnimatableValue> to = StyleResolver::createAnimatableValueSnapshot(*m _element.get(), *m_renderStyle.get(), property, toCSSValue); | |
| 293 | |
| 294 return LegacyStyleInterpolation::create(from, to, property); | |
|
alancutter (OOO until 2018)
2014/03/11 09:45:33
from.release(), to.release()
| |
| 266 } | 295 } |
| 267 | 296 |
| 268 PassOwnPtr<KeyframeEffectModelBase::PropertySpecificKeyframe> SKeyframeEffectMod el::neutralKeyframe(double offset, PassRefPtr<TimingFunction> easing) const | 297 PassOwnPtr<KeyframeEffectModelBase::PropertySpecificKeyframe> SKeyframeEffectMod el::neutralKeyframe(double offset, PassRefPtr<TimingFunction> easing) const |
| 269 { | 298 { |
| 270 return adoptPtr(new PropertySpecificKeyframe(offset, easing, "invalid", Comp ositeAdd)); | 299 return adoptPtr(new PropertySpecificKeyframe(offset, easing, nullptr, Compos iteAdd)); |
| 271 } | 300 } |
| 272 | 301 |
| 273 } // namespace | 302 } // namespace |
| OLD | NEW |