| 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 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 return properties; | 84 return properties; |
| 85 } | 85 } |
| 86 | 86 |
| 87 PassRefPtrWillBeRawPtr<Keyframe> Keyframe::cloneWithOffset(double offset) const | 87 PassRefPtrWillBeRawPtr<Keyframe> Keyframe::cloneWithOffset(double offset) const |
| 88 { | 88 { |
| 89 RefPtrWillBeRawPtr<Keyframe> theClone = clone(); | 89 RefPtrWillBeRawPtr<Keyframe> theClone = clone(); |
| 90 theClone->setOffset(offset); | 90 theClone->setOffset(offset); |
| 91 return theClone.release(); | 91 return theClone.release(); |
| 92 } | 92 } |
| 93 | 93 |
| 94 void Keyframe::trace(Visitor* visitor) |
| 95 { |
| 96 visitor->trace(m_propertyValues); |
| 97 } |
| 98 |
| 94 KeyframeEffectModel::KeyframeEffectModel(const KeyframeVector& keyframes) | 99 KeyframeEffectModel::KeyframeEffectModel(const KeyframeVector& keyframes) |
| 95 : m_keyframes(keyframes) | 100 : m_keyframes(keyframes) |
| 96 { | 101 { |
| 97 } | 102 } |
| 98 | 103 |
| 99 PropertySet KeyframeEffectModel::properties() const | 104 PropertySet KeyframeEffectModel::properties() const |
| 100 { | 105 { |
| 101 PropertySet result; | 106 PropertySet result; |
| 102 if (!m_keyframes.size()) { | 107 if (!m_keyframes.size()) { |
| 103 return result; | 108 return result; |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 184 } | 189 } |
| 185 } | 190 } |
| 186 return result; | 191 return result; |
| 187 } | 192 } |
| 188 | 193 |
| 189 void KeyframeEffectModel::ensureKeyframeGroups() const | 194 void KeyframeEffectModel::ensureKeyframeGroups() const |
| 190 { | 195 { |
| 191 if (m_keyframeGroups) | 196 if (m_keyframeGroups) |
| 192 return; | 197 return; |
| 193 | 198 |
| 194 m_keyframeGroups = adoptPtr(new KeyframeGroupMap); | 199 m_keyframeGroups = adoptPtrWillBeNoop(new KeyframeGroupMap); |
| 195 const KeyframeVector keyframes = normalizedKeyframes(getFrames()); | 200 const KeyframeVector keyframes = normalizedKeyframes(getFrames()); |
| 196 for (KeyframeVector::const_iterator keyframeIter = keyframes.begin(); keyfra
meIter != keyframes.end(); ++keyframeIter) { | 201 for (KeyframeVector::const_iterator keyframeIter = keyframes.begin(); keyfra
meIter != keyframes.end(); ++keyframeIter) { |
| 197 const Keyframe* keyframe = keyframeIter->get(); | 202 const Keyframe* keyframe = keyframeIter->get(); |
| 198 PropertySet keyframeProperties = keyframe->properties(); | 203 PropertySet keyframeProperties = keyframe->properties(); |
| 199 for (PropertySet::const_iterator propertyIter = keyframeProperties.begin
(); propertyIter != keyframeProperties.end(); ++propertyIter) { | 204 for (PropertySet::const_iterator propertyIter = keyframeProperties.begin
(); propertyIter != keyframeProperties.end(); ++propertyIter) { |
| 200 CSSPropertyID property = *propertyIter; | 205 CSSPropertyID property = *propertyIter; |
| 201 KeyframeGroupMap::iterator groupIter = m_keyframeGroups->find(proper
ty); | 206 KeyframeGroupMap::iterator groupIter = m_keyframeGroups->find(proper
ty); |
| 202 PropertySpecificKeyframeGroup* group; | 207 PropertySpecificKeyframeGroup* group; |
| 203 if (groupIter == m_keyframeGroups->end()) | 208 if (groupIter == m_keyframeGroups->end()) |
| 204 group = m_keyframeGroups->add(property, adoptPtr(new PropertySpe
cificKeyframeGroup)).storedValue->value.get(); | 209 group = m_keyframeGroups->add(property, adoptPtrWillBeNoop(new P
ropertySpecificKeyframeGroup)).storedValue->value.get(); |
| 205 else | 210 else |
| 206 group = groupIter->value.get(); | 211 group = groupIter->value.get(); |
| 207 | 212 |
| 208 ASSERT(keyframe->composite() == AnimationEffect::CompositeReplace); | 213 ASSERT(keyframe->composite() == AnimationEffect::CompositeReplace); |
| 209 group->appendKeyframe(adoptPtr( | 214 group->appendKeyframe(adoptPtrWillBeNoop( |
| 210 new PropertySpecificKeyframe(keyframe->offset(), keyframe->easin
g(), keyframe->propertyValue(property), keyframe->composite()))); | 215 new PropertySpecificKeyframe(keyframe->offset(), keyframe->easin
g(), keyframe->propertyValue(property), keyframe->composite()))); |
| 211 } | 216 } |
| 212 } | 217 } |
| 213 | 218 |
| 214 // Add synthetic keyframes. | 219 // Add synthetic keyframes. |
| 215 for (KeyframeGroupMap::iterator iter = m_keyframeGroups->begin(); iter != m_
keyframeGroups->end(); ++iter) { | 220 for (KeyframeGroupMap::iterator iter = m_keyframeGroups->begin(); iter != m_
keyframeGroups->end(); ++iter) { |
| 216 iter->value->addSyntheticKeyframeIfRequired(); | 221 iter->value->addSyntheticKeyframeIfRequired(); |
| 217 iter->value->removeRedundantKeyframes(); | 222 iter->value->removeRedundantKeyframes(); |
| 218 } | 223 } |
| 219 } | 224 } |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 for (KeyframeGroupMap::iterator iter = m_keyframeGroups->begin(); iter != m_
keyframeGroups->end(); ++iter) { | 257 for (KeyframeGroupMap::iterator iter = m_keyframeGroups->begin(); iter != m_
keyframeGroups->end(); ++iter) { |
| 253 const PropertySpecificKeyframeVector& keyframeVector = iter->value->keyf
rames(); | 258 const PropertySpecificKeyframeVector& keyframeVector = iter->value->keyf
rames(); |
| 254 for (size_t i = 0; i < keyframeVector.size(); ++i) { | 259 for (size_t i = 0; i < keyframeVector.size(); ++i) { |
| 255 if (keyframeVector[i]->composite() != AnimationEffect::CompositeRepl
ace) | 260 if (keyframeVector[i]->composite() != AnimationEffect::CompositeRepl
ace) |
| 256 return false; | 261 return false; |
| 257 } | 262 } |
| 258 } | 263 } |
| 259 return true; | 264 return true; |
| 260 } | 265 } |
| 261 | 266 |
| 267 void KeyframeEffectModel::trace(Visitor* visitor) |
| 268 { |
| 269 visitor->trace(m_keyframes); |
| 270 #if ENABLE_OILPAN |
| 271 visitor->trace(m_keyframeGroups); |
| 272 #endif |
| 273 } |
| 274 |
| 262 KeyframeEffectModel::PropertySpecificKeyframe::PropertySpecificKeyframe(double o
ffset, PassRefPtr<TimingFunction> easing, const AnimatableValue* value, Composit
eOperation composite) | 275 KeyframeEffectModel::PropertySpecificKeyframe::PropertySpecificKeyframe(double o
ffset, PassRefPtr<TimingFunction> easing, const AnimatableValue* value, Composit
eOperation composite) |
| 263 : m_offset(offset) | 276 : m_offset(offset) |
| 264 , m_easing(easing) | 277 , m_easing(easing) |
| 265 , m_composite(composite) | 278 , m_composite(composite) |
| 266 { | 279 { |
| 267 m_value = AnimatableValue::takeConstRef(value); | 280 m_value = AnimatableValue::takeConstRef(value); |
| 268 } | 281 } |
| 269 | 282 |
| 270 KeyframeEffectModel::PropertySpecificKeyframe::PropertySpecificKeyframe(double o
ffset, PassRefPtr<TimingFunction> easing, PassRefPtr<AnimatableValue> value, Com
positeOperation composite) | 283 KeyframeEffectModel::PropertySpecificKeyframe::PropertySpecificKeyframe(double o
ffset, PassRefPtr<TimingFunction> easing, PassRefPtrWillBeRawPtr<AnimatableValue
> value, CompositeOperation composite) |
| 271 : m_offset(offset) | 284 : m_offset(offset) |
| 272 , m_easing(easing) | 285 , m_easing(easing) |
| 273 , m_value(value) | 286 , m_value(value) |
| 274 , m_composite(composite) | 287 , m_composite(composite) |
| 275 { | 288 { |
| 276 ASSERT(!isNull(m_offset)); | 289 ASSERT(!isNull(m_offset)); |
| 277 } | 290 } |
| 278 | 291 |
| 279 PassOwnPtr<KeyframeEffectModel::PropertySpecificKeyframe> KeyframeEffectModel::P
ropertySpecificKeyframe::cloneWithOffset(double offset) const | 292 PassOwnPtrWillBeRawPtr<KeyframeEffectModel::PropertySpecificKeyframe> KeyframeEf
fectModel::PropertySpecificKeyframe::cloneWithOffset(double offset) const |
| 280 { | 293 { |
| 281 return adoptPtr(new PropertySpecificKeyframe(offset, m_easing, m_value, m_co
mposite)); | 294 return adoptPtrWillBeNoop(new PropertySpecificKeyframe(offset, m_easing, m_v
alue.get(), m_composite)); |
| 282 } | 295 } |
| 283 | 296 |
| 297 void KeyframeEffectModel::PropertySpecificKeyframe::trace(Visitor* visitor) |
| 298 { |
| 299 visitor->trace(m_value); |
| 300 } |
| 284 | 301 |
| 285 void KeyframeEffectModel::PropertySpecificKeyframeGroup::appendKeyframe(PassOwnP
tr<PropertySpecificKeyframe> keyframe) | 302 void KeyframeEffectModel::PropertySpecificKeyframeGroup::appendKeyframe(PassOwnP
trWillBeRawPtr<PropertySpecificKeyframe> keyframe) |
| 286 { | 303 { |
| 287 ASSERT(m_keyframes.isEmpty() || m_keyframes.last()->offset() <= keyframe->of
fset()); | 304 ASSERT(m_keyframes.isEmpty() || m_keyframes.last()->offset() <= keyframe->of
fset()); |
| 288 m_keyframes.append(keyframe); | 305 m_keyframes.append(keyframe); |
| 289 } | 306 } |
| 290 | 307 |
| 291 void KeyframeEffectModel::PropertySpecificKeyframeGroup::removeRedundantKeyframe
s() | 308 void KeyframeEffectModel::PropertySpecificKeyframeGroup::removeRedundantKeyframe
s() |
| 292 { | 309 { |
| 293 // As an optimization, removes keyframes in the following categories, as | 310 // As an optimization, removes keyframes in the following categories, as |
| 294 // they will never be used by sample(). | 311 // they will never be used by sample(). |
| 295 // - End keyframes with the same offset as their neighbor | 312 // - End keyframes with the same offset as their neighbor |
| 296 // - Interior keyframes with the same offset as both their neighbors | 313 // - Interior keyframes with the same offset as both their neighbors |
| 297 // Note that synthetic keyframes must be added before this method is | 314 // Note that synthetic keyframes must be added before this method is |
| 298 // called. | 315 // called. |
| 299 ASSERT(m_keyframes.size() >= 2); | 316 ASSERT(m_keyframes.size() >= 2); |
| 300 for (int i = m_keyframes.size() - 1; i >= 0; --i) { | 317 for (int i = m_keyframes.size() - 1; i >= 0; --i) { |
| 301 double offset = m_keyframes[i]->offset(); | 318 double offset = m_keyframes[i]->offset(); |
| 302 bool hasSameOffsetAsPreviousNeighbor = !i || m_keyframes[i - 1]->offset(
) == offset; | 319 bool hasSameOffsetAsPreviousNeighbor = !i || m_keyframes[i - 1]->offset(
) == offset; |
| 303 bool hasSameOffsetAsNextNeighbor = i == static_cast<int>(m_keyframes.siz
e() - 1) || m_keyframes[i + 1]->offset() == offset; | 320 bool hasSameOffsetAsNextNeighbor = i == static_cast<int>(m_keyframes.siz
e() - 1) || m_keyframes[i + 1]->offset() == offset; |
| 304 if (hasSameOffsetAsPreviousNeighbor && hasSameOffsetAsNextNeighbor) | 321 if (hasSameOffsetAsPreviousNeighbor && hasSameOffsetAsNextNeighbor) |
| 305 m_keyframes.remove(i); | 322 m_keyframes.remove(i); |
| 306 } | 323 } |
| 307 ASSERT(m_keyframes.size() >= 2); | 324 ASSERT(m_keyframes.size() >= 2); |
| 308 } | 325 } |
| 309 | 326 |
| 310 void KeyframeEffectModel::PropertySpecificKeyframeGroup::addSyntheticKeyframeIfR
equired() | 327 void KeyframeEffectModel::PropertySpecificKeyframeGroup::addSyntheticKeyframeIfR
equired() |
| 311 { | 328 { |
| 312 ASSERT(!m_keyframes.isEmpty()); | 329 ASSERT(!m_keyframes.isEmpty()); |
| 313 if (m_keyframes.first()->offset() != 0.0) | 330 if (m_keyframes.first()->offset() != 0.0) |
| 314 m_keyframes.insert(0, adoptPtr(new PropertySpecificKeyframe(0, nullptr,
AnimatableValue::neutralValue(), CompositeAdd))); | 331 m_keyframes.insert(0, adoptPtrWillBeNoop(new PropertySpecificKeyframe(0,
nullptr, AnimatableValue::neutralValue(), CompositeAdd))); |
| 315 if (m_keyframes.last()->offset() != 1.0) | 332 if (m_keyframes.last()->offset() != 1.0) |
| 316 appendKeyframe(adoptPtr(new PropertySpecificKeyframe(1, nullptr, Animata
bleValue::neutralValue(), CompositeAdd))); | 333 appendKeyframe(adoptPtrWillBeNoop(new PropertySpecificKeyframe(1, nullpt
r, AnimatableValue::neutralValue(), CompositeAdd))); |
| 317 } | 334 } |
| 318 | 335 |
| 319 void KeyframeEffectModel::trace(Visitor* visitor) | 336 void KeyframeEffectModel::PropertySpecificKeyframeGroup::trace(Visitor* visitor) |
| 320 { | 337 { |
| 338 #if ENABLE_OILPAN |
| 321 visitor->trace(m_keyframes); | 339 visitor->trace(m_keyframes); |
| 340 #endif |
| 322 } | 341 } |
| 323 | 342 |
| 324 } // namespace | 343 } // namespace |
| OLD | NEW |