OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "config.h" | 5 #include "config.h" |
6 #include "core/animation/StringKeyframe.h" | 6 #include "core/animation/StringKeyframe.h" |
7 | 7 |
8 #include "core/animation/AngleSVGInterpolation.h" | 8 #include "core/animation/AngleSVGInterpolation.h" |
9 #include "core/animation/CSSValueInterpolationType.h" | 9 #include "core/animation/CSSValueInterpolationType.h" |
10 #include "core/animation/ColorStyleInterpolation.h" | 10 #include "core/animation/ColorStyleInterpolation.h" |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 } | 176 } |
177 break; | 177 break; |
178 } | 178 } |
179 applicableTypes->append(new CSSValueInterpolationType(property)); | 179 applicableTypes->append(new CSSValueInterpolationType(property)); |
180 applicableTypesMap.add(property, applicableTypes); | 180 applicableTypesMap.add(property, applicableTypes); |
181 return applicableTypes; | 181 return applicableTypes; |
182 } | 182 } |
183 | 183 |
184 } // namespace | 184 } // namespace |
185 | 185 |
| 186 PassRefPtrWillBeRawPtr<Interpolation> StringKeyframe::CSSPropertySpecificKeyfram
e::createLegacyStyleInterpolation(CSSPropertyID property, Keyframe::PropertySpec
ificKeyframe& end, Element* element, const ComputedStyle* baseStyle) const |
| 187 { |
| 188 CSSValue& fromCSSValue = *m_value.get(); |
| 189 CSSValue& toCSSValue = *toCSSPropertySpecificKeyframe(end).value(); |
| 190 if (DeferredLegacyStyleInterpolation::interpolationRequiresStyleResolve(from
CSSValue) || DeferredLegacyStyleInterpolation::interpolationRequiresStyleResolve
(toCSSValue)) { |
| 191 // FIXME: Handle these cases outside of DeferredLegacyStyleInterpolation
. |
| 192 return DeferredLegacyStyleInterpolation::create(&fromCSSValue, &toCSSVal
ue, property); |
| 193 } |
| 194 |
| 195 // FIXME: Remove the use of AnimatableValues and Elements here. |
| 196 ASSERT(element); |
| 197 populateAnimatableValue(property, *element, baseStyle); |
| 198 end.populateAnimatableValue(property, *element, baseStyle); |
| 199 return LegacyStyleInterpolation::create(getAnimatableValue(), end.getAnimata
bleValue(), property); |
| 200 } |
| 201 |
186 PassRefPtrWillBeRawPtr<Interpolation> StringKeyframe::CSSPropertySpecificKeyfram
e::maybeCreateInterpolation(PropertyHandle propertyHandle, Keyframe::PropertySpe
cificKeyframe& end, Element* element, const ComputedStyle* baseStyle) const | 202 PassRefPtrWillBeRawPtr<Interpolation> StringKeyframe::CSSPropertySpecificKeyfram
e::maybeCreateInterpolation(PropertyHandle propertyHandle, Keyframe::PropertySpe
cificKeyframe& end, Element* element, const ComputedStyle* baseStyle) const |
187 { | 203 { |
188 CSSPropertyID property = propertyHandle.cssProperty(); | 204 CSSPropertyID property = propertyHandle.cssProperty(); |
189 const Vector<const InterpolationType*>* applicableTypes = applicableTypesFor
Property(property); | 205 const Vector<const InterpolationType*>* applicableTypes = applicableTypesFor
Property(property); |
190 if (applicableTypes) | 206 if (applicableTypes) |
191 return InvalidatableStyleInterpolation::create(*applicableTypes, *this,
toCSSPropertySpecificKeyframe(end)); | 207 return InvalidatableStyleInterpolation::create(*applicableTypes, *this,
toCSSPropertySpecificKeyframe(end)); |
192 | 208 |
193 // TODO(alancutter): Remove the remainder of this function. | 209 // TODO(alancutter): Remove the remainder of this function. |
194 | 210 |
195 // FIXME: Refactor this into a generic piece that lives in InterpolationEffe
ct, and a template parameter specific converter. | 211 // FIXME: Refactor this into a generic piece that lives in InterpolationEffe
ct, and a template parameter specific converter. |
196 CSSValue* fromCSSValue = m_value.get(); | 212 CSSValue* fromCSSValue = m_value.get(); |
197 CSSValue* toCSSValue = toCSSPropertySpecificKeyframe(end).value(); | 213 CSSValue* toCSSValue = toCSSPropertySpecificKeyframe(end).value(); |
198 InterpolationRange range = RangeAll; | 214 InterpolationRange range = RangeAll; |
199 bool fallBackToLegacy = false; | |
200 | 215 |
201 // FIXME: Remove this flag once we can rely on legacy's behaviour being corr
ect. | 216 // FIXME: Remove this flag once we can rely on legacy's behaviour being corr
ect. |
202 bool forceDefaultInterpolation = false; | 217 bool forceDefaultInterpolation = false; |
203 | 218 |
204 // FIXME: Remove this check once neutral keyframes are implemented in String
Keyframes. | 219 // FIXME: Remove this check once neutral keyframes are implemented in String
Keyframes. |
205 if (!fromCSSValue || !toCSSValue) | 220 if (!fromCSSValue || !toCSSValue) |
206 return DeferredLegacyStyleInterpolation::create(fromCSSValue, toCSSValue
, property); | 221 return DeferredLegacyStyleInterpolation::create(fromCSSValue, toCSSValue
, property); |
207 | 222 |
208 ASSERT(fromCSSValue && toCSSValue); | 223 ASSERT(fromCSSValue && toCSSValue); |
209 | 224 |
210 if (!CSSPropertyMetadata::isInterpolableProperty(property)) { | 225 if (!CSSPropertyMetadata::isInterpolableProperty(property)) { |
211 if (fromCSSValue == toCSSValue) | 226 if (fromCSSValue == toCSSValue) |
212 return ConstantStyleInterpolation::create(fromCSSValue, property); | 227 return ConstantStyleInterpolation::create(fromCSSValue, property); |
213 | 228 |
214 return nullptr; | 229 return nullptr; |
215 } | 230 } |
216 | 231 |
| 232 if (fromCSSValue->isCSSWideKeyword() || toCSSValue->isCSSWideKeyword()) |
| 233 return createLegacyStyleInterpolation(property, end, element, baseStyle)
; |
| 234 |
217 switch (property) { | 235 switch (property) { |
218 case CSSPropertyLineHeight: | 236 case CSSPropertyLineHeight: |
219 if (LengthStyleInterpolation::canCreateFrom(*fromCSSValue) && LengthStyl
eInterpolation::canCreateFrom(*toCSSValue)) | 237 if (LengthStyleInterpolation::canCreateFrom(*fromCSSValue) && LengthStyl
eInterpolation::canCreateFrom(*toCSSValue)) |
220 return LengthStyleInterpolation::create(*fromCSSValue, *toCSSValue,
property, RangeNonNegative); | 238 return LengthStyleInterpolation::create(*fromCSSValue, *toCSSValue,
property, RangeNonNegative); |
221 | 239 |
222 if (DoubleStyleInterpolation::canCreateFrom(*fromCSSValue) && DoubleStyl
eInterpolation::canCreateFrom(*toCSSValue)) | 240 if (DoubleStyleInterpolation::canCreateFrom(*fromCSSValue) && DoubleStyl
eInterpolation::canCreateFrom(*toCSSValue)) |
223 return DoubleStyleInterpolation::create(*fromCSSValue, *toCSSValue,
property, true, RangeNonNegative); | 241 return DoubleStyleInterpolation::create(*fromCSSValue, *toCSSValue,
property, true, RangeNonNegative); |
224 | 242 |
225 break; | 243 break; |
226 case CSSPropertyBorderBottomWidth: | 244 case CSSPropertyBorderBottomWidth: |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
275 case CSSPropertyWebkitTransformOriginX: | 293 case CSSPropertyWebkitTransformOriginX: |
276 case CSSPropertyWebkitTransformOriginY: | 294 case CSSPropertyWebkitTransformOriginY: |
277 case CSSPropertyWebkitTransformOriginZ: | 295 case CSSPropertyWebkitTransformOriginZ: |
278 case CSSPropertyX: | 296 case CSSPropertyX: |
279 case CSSPropertyY: | 297 case CSSPropertyY: |
280 if (LengthStyleInterpolation::canCreateFrom(*fromCSSValue, property) &&
LengthStyleInterpolation::canCreateFrom(*toCSSValue, property)) | 298 if (LengthStyleInterpolation::canCreateFrom(*fromCSSValue, property) &&
LengthStyleInterpolation::canCreateFrom(*toCSSValue, property)) |
281 return LengthStyleInterpolation::create(*fromCSSValue, *toCSSValue,
property, range); | 299 return LengthStyleInterpolation::create(*fromCSSValue, *toCSSValue,
property, range); |
282 | 300 |
283 // FIXME: Handle keywords e.g. 'smaller', 'larger'. | 301 // FIXME: Handle keywords e.g. 'smaller', 'larger'. |
284 if (property == CSSPropertyFontSize) | 302 if (property == CSSPropertyFontSize) |
285 fallBackToLegacy = true; | 303 return createLegacyStyleInterpolation(property, end, element, baseSt
yle); |
286 | 304 |
287 // FIXME: Handle keywords e.g. 'baseline', 'sub'. | 305 // FIXME: Handle keywords e.g. 'baseline', 'sub'. |
288 if (property == CSSPropertyBaselineShift) | 306 if (property == CSSPropertyBaselineShift) |
289 fallBackToLegacy = true; | 307 return createLegacyStyleInterpolation(property, end, element, baseSt
yle); |
290 | 308 |
291 break; | 309 break; |
292 case CSSPropertyOrphans: | 310 case CSSPropertyOrphans: |
293 case CSSPropertyWidows: | 311 case CSSPropertyWidows: |
294 case CSSPropertyZIndex: | 312 case CSSPropertyZIndex: |
295 case CSSPropertyWebkitColumnCount: | 313 case CSSPropertyWebkitColumnCount: |
296 case CSSPropertyShapeImageThreshold: | 314 case CSSPropertyShapeImageThreshold: |
297 case CSSPropertyFillOpacity: | 315 case CSSPropertyFillOpacity: |
298 case CSSPropertyFloodOpacity: | 316 case CSSPropertyFloodOpacity: |
299 case CSSPropertyFontSizeAdjust: | 317 case CSSPropertyFontSizeAdjust: |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
332 case CSSPropertyTextDecorationColor: | 350 case CSSPropertyTextDecorationColor: |
333 case CSSPropertyWebkitColumnRuleColor: | 351 case CSSPropertyWebkitColumnRuleColor: |
334 case CSSPropertyWebkitTextStrokeColor: | 352 case CSSPropertyWebkitTextStrokeColor: |
335 { | 353 { |
336 RefPtrWillBeRawPtr<Interpolation> interpolation = ColorStyleInterpol
ation::maybeCreateFromColor(*fromCSSValue, *toCSSValue, property); | 354 RefPtrWillBeRawPtr<Interpolation> interpolation = ColorStyleInterpol
ation::maybeCreateFromColor(*fromCSSValue, *toCSSValue, property); |
337 if (interpolation) | 355 if (interpolation) |
338 return interpolation.release(); | 356 return interpolation.release(); |
339 | 357 |
340 // Current color should use LegacyStyleInterpolation | 358 // Current color should use LegacyStyleInterpolation |
341 if (ColorStyleInterpolation::shouldUseLegacyStyleInterpolation(*from
CSSValue, *toCSSValue)) | 359 if (ColorStyleInterpolation::shouldUseLegacyStyleInterpolation(*from
CSSValue, *toCSSValue)) |
342 fallBackToLegacy = true; | 360 return createLegacyStyleInterpolation(property, end, element, ba
seStyle); |
343 | 361 |
344 break; | 362 break; |
345 } | 363 } |
346 | 364 |
347 case CSSPropertyBorderImageSource: | 365 case CSSPropertyBorderImageSource: |
348 case CSSPropertyListStyleImage: | 366 case CSSPropertyListStyleImage: |
349 case CSSPropertyWebkitMaskBoxImageSource: | 367 case CSSPropertyWebkitMaskBoxImageSource: |
350 if (fromCSSValue == toCSSValue) | 368 if (fromCSSValue == toCSSValue) |
351 return ConstantStyleInterpolation::create(fromCSSValue, property); | 369 return ConstantStyleInterpolation::create(fromCSSValue, property); |
352 | 370 |
(...skipping 13 matching lines...) Expand all Loading... |
366 return LengthPairStyleInterpolation::create(*fromCSSValue, *toCSSVal
ue, property, range); | 384 return LengthPairStyleInterpolation::create(*fromCSSValue, *toCSSVal
ue, property, range); |
367 break; | 385 break; |
368 | 386 |
369 case CSSPropertyPerspectiveOrigin: | 387 case CSSPropertyPerspectiveOrigin: |
370 case CSSPropertyTransformOrigin: { | 388 case CSSPropertyTransformOrigin: { |
371 RefPtrWillBeRawPtr<Interpolation> interpolation = ListStyleInterpolation
<LengthStyleInterpolation>::maybeCreateFromList(*fromCSSValue, *toCSSValue, prop
erty, range); | 389 RefPtrWillBeRawPtr<Interpolation> interpolation = ListStyleInterpolation
<LengthStyleInterpolation>::maybeCreateFromList(*fromCSSValue, *toCSSValue, prop
erty, range); |
372 if (interpolation) | 390 if (interpolation) |
373 return interpolation.release(); | 391 return interpolation.release(); |
374 | 392 |
375 // FIXME: Handle keywords: top, right, left, center, bottom | 393 // FIXME: Handle keywords: top, right, left, center, bottom |
376 fallBackToLegacy = true; | 394 return createLegacyStyleInterpolation(property, end, element, baseStyle)
; |
377 | |
378 break; | |
379 } | 395 } |
380 | 396 |
381 case CSSPropertyBoxShadow: | 397 case CSSPropertyBoxShadow: |
382 case CSSPropertyTextShadow: { | 398 case CSSPropertyTextShadow: { |
383 RefPtrWillBeRawPtr<Interpolation> interpolation = ListStyleInterpolation
<ShadowStyleInterpolation>::maybeCreateFromList(*fromCSSValue, *toCSSValue, prop
erty); | 399 RefPtrWillBeRawPtr<Interpolation> interpolation = ListStyleInterpolation
<ShadowStyleInterpolation>::maybeCreateFromList(*fromCSSValue, *toCSSValue, prop
erty); |
384 if (interpolation) | 400 if (interpolation) |
385 return interpolation.release(); | 401 return interpolation.release(); |
386 | 402 |
387 // FIXME: AnimatableShadow incorrectly animates between inset and non-in
set values so it will never indicate it needs default interpolation | 403 // FIXME: AnimatableShadow incorrectly animates between inset and non-in
set values so it will never indicate it needs default interpolation |
388 if (ShadowStyleInterpolation::usesDefaultStyleInterpolation(*fromCSSValu
e, *toCSSValue)) { | 404 if (ShadowStyleInterpolation::usesDefaultStyleInterpolation(*fromCSSValu
e, *toCSSValue)) { |
389 forceDefaultInterpolation = true; | 405 forceDefaultInterpolation = true; |
390 break; | 406 break; |
391 } | 407 } |
392 | 408 |
393 // FIXME: Handle interpolation from/to none, unspecified color values | 409 // FIXME: Handle interpolation from/to none, unspecified color values |
394 fallBackToLegacy = true; | 410 return createLegacyStyleInterpolation(property, end, element, baseStyle)
; |
395 | |
396 break; | |
397 | |
398 } | 411 } |
399 | 412 |
400 case CSSPropertyClip: { | 413 case CSSPropertyClip: { |
401 if (LengthBoxStyleInterpolation::usesDefaultInterpolation(*fromCSSValue,
*toCSSValue)) { | 414 if (LengthBoxStyleInterpolation::usesDefaultInterpolation(*fromCSSValue,
*toCSSValue)) { |
402 forceDefaultInterpolation = true; | 415 forceDefaultInterpolation = true; |
403 break; | 416 break; |
404 } | 417 } |
405 RefPtrWillBeRawPtr<Interpolation> interpolation = LengthBoxStyleInterpol
ation::maybeCreateFrom(*fromCSSValue, *toCSSValue, property); | 418 RefPtrWillBeRawPtr<Interpolation> interpolation = LengthBoxStyleInterpol
ation::maybeCreateFrom(*fromCSSValue, *toCSSValue, property); |
406 if (interpolation) | 419 if (interpolation) |
407 return interpolation.release(); | 420 return interpolation.release(); |
(...skipping 18 matching lines...) Expand all Loading... |
426 | 439 |
427 break; | 440 break; |
428 } | 441 } |
429 | 442 |
430 case CSSPropertyWebkitFilter: { | 443 case CSSPropertyWebkitFilter: { |
431 RefPtrWillBeRawPtr<Interpolation> interpolation = FilterStyleInterpolati
on::maybeCreateList(*fromCSSValue, *toCSSValue, property); | 444 RefPtrWillBeRawPtr<Interpolation> interpolation = FilterStyleInterpolati
on::maybeCreateList(*fromCSSValue, *toCSSValue, property); |
432 if (interpolation) | 445 if (interpolation) |
433 return interpolation.release(); | 446 return interpolation.release(); |
434 | 447 |
435 // FIXME: Support drop shadow interpolation. | 448 // FIXME: Support drop shadow interpolation. |
436 fallBackToLegacy = true; | 449 return createLegacyStyleInterpolation(property, end, element, baseStyle)
; |
437 break; | 450 break; |
438 } | 451 } |
439 | 452 |
440 case CSSPropertyTranslate: { | 453 case CSSPropertyTranslate: { |
441 RefPtrWillBeRawPtr<Interpolation> interpolation = ListStyleInterpolation
<LengthStyleInterpolation>::maybeCreateFromList(*fromCSSValue, *toCSSValue, prop
erty, range); | 454 RefPtrWillBeRawPtr<Interpolation> interpolation = ListStyleInterpolation
<LengthStyleInterpolation>::maybeCreateFromList(*fromCSSValue, *toCSSValue, prop
erty, range); |
442 if (interpolation) | 455 if (interpolation) |
443 return interpolation.release(); | 456 return interpolation.release(); |
444 | 457 |
445 // TODO(soonm): Legacy mode is used when from and to cssvaluelist length
does not match. | 458 // TODO(soonm): Legacy mode is used when from and to cssvaluelist length
does not match. |
446 fallBackToLegacy = true; | 459 return createLegacyStyleInterpolation(property, end, element, baseStyle)
; |
447 break; | 460 break; |
448 } | 461 } |
449 | 462 |
450 case CSSPropertyScale: { | 463 case CSSPropertyScale: { |
451 RefPtrWillBeRawPtr<Interpolation> interpolation = ListStyleInterpolation
<DoubleStyleInterpolation>::maybeCreateFromList(*fromCSSValue, *toCSSValue, prop
erty, range); | 464 RefPtrWillBeRawPtr<Interpolation> interpolation = ListStyleInterpolation
<DoubleStyleInterpolation>::maybeCreateFromList(*fromCSSValue, *toCSSValue, prop
erty, range); |
452 if (interpolation) | 465 if (interpolation) |
453 return interpolation.release(); | 466 return interpolation.release(); |
454 | 467 |
455 // TODO(soonm): Legacy mode is used when from and to cssvaluelist length
does not match. | 468 // TODO(soonm): Legacy mode is used when from and to cssvaluelist length
does not match. |
456 fallBackToLegacy = true; | 469 return createLegacyStyleInterpolation(property, end, element, baseStyle)
; |
457 break; | 470 break; |
458 } | 471 } |
459 | 472 |
460 default: | 473 default: |
461 // Fall back to LegacyStyleInterpolation. | 474 // Fall back to LegacyStyleInterpolation. |
462 fallBackToLegacy = true; | 475 return createLegacyStyleInterpolation(property, end, element, baseStyle)
; |
463 break; | 476 break; |
464 } | 477 } |
465 | 478 |
466 if (fromCSSValue == toCSSValue) | 479 if (fromCSSValue == toCSSValue) |
467 return ConstantStyleInterpolation::create(fromCSSValue, property); | 480 return ConstantStyleInterpolation::create(fromCSSValue, property); |
468 | 481 |
469 if (forceDefaultInterpolation) | 482 if (!forceDefaultInterpolation) { |
470 return nullptr; | 483 ASSERT(AnimatableValue::usesDefaultInterpolation( |
471 | 484 StyleResolver::createAnimatableValueSnapshot(*element, baseStyle, pr
operty, fromCSSValue).get(), |
472 if (fromCSSValue->isCSSWideKeyword() || toCSSValue->isCSSWideKeyword()) | 485 StyleResolver::createAnimatableValueSnapshot(*element, baseStyle, pr
operty, toCSSValue).get())); |
473 fallBackToLegacy = true; | |
474 | |
475 if (fallBackToLegacy) { | |
476 if (DeferredLegacyStyleInterpolation::interpolationRequiresStyleResolve(
*fromCSSValue) || DeferredLegacyStyleInterpolation::interpolationRequiresStyleRe
solve(*toCSSValue)) { | |
477 // FIXME: Handle these cases outside of DeferredLegacyStyleInterpola
tion. | |
478 return DeferredLegacyStyleInterpolation::create(fromCSSValue, toCSSV
alue, property); | |
479 } | |
480 | |
481 // FIXME: Remove the use of AnimatableValues and Elements here. | |
482 ASSERT(element); | |
483 populateAnimatableValue(property, *element, baseStyle); | |
484 end.populateAnimatableValue(property, *element, baseStyle); | |
485 return LegacyStyleInterpolation::create(getAnimatableValue(), end.getAni
matableValue(), property); | |
486 } | 486 } |
487 | 487 |
488 ASSERT(AnimatableValue::usesDefaultInterpolation( | |
489 StyleResolver::createAnimatableValueSnapshot(*element, baseStyle, proper
ty, fromCSSValue).get(), | |
490 StyleResolver::createAnimatableValueSnapshot(*element, baseStyle, proper
ty, toCSSValue).get())); | |
491 | |
492 return nullptr; | 488 return nullptr; |
493 | 489 |
494 } | 490 } |
495 | 491 |
496 PassOwnPtrWillBeRawPtr<Keyframe::PropertySpecificKeyframe> StringKeyframe::CSSPr
opertySpecificKeyframe::neutralKeyframe(double offset, PassRefPtr<TimingFunction
> easing) const | 492 PassOwnPtrWillBeRawPtr<Keyframe::PropertySpecificKeyframe> StringKeyframe::CSSPr
opertySpecificKeyframe::neutralKeyframe(double offset, PassRefPtr<TimingFunction
> easing) const |
497 { | 493 { |
498 return adoptPtrWillBeNoop(new CSSPropertySpecificKeyframe(offset, easing, st
atic_cast<CSSValue*>(0), EffectModel::CompositeAdd)); | 494 return adoptPtrWillBeNoop(new CSSPropertySpecificKeyframe(offset, easing, st
atic_cast<CSSValue*>(0), EffectModel::CompositeAdd)); |
499 } | 495 } |
500 | 496 |
501 PassOwnPtrWillBeRawPtr<Keyframe::PropertySpecificKeyframe> StringKeyframe::CSSPr
opertySpecificKeyframe::cloneWithOffset(double offset) const | 497 PassOwnPtrWillBeRawPtr<Keyframe::PropertySpecificKeyframe> StringKeyframe::CSSPr
opertySpecificKeyframe::cloneWithOffset(double offset) const |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
604 RefPtrWillBeRawPtr<SVGPropertyBase> fromValue = attribute->currentValueBase(
)->cloneForAnimation(m_value); | 600 RefPtrWillBeRawPtr<SVGPropertyBase> fromValue = attribute->currentValueBase(
)->cloneForAnimation(m_value); |
605 RefPtrWillBeRawPtr<SVGPropertyBase> toValue = attribute->currentValueBase()-
>cloneForAnimation(toSVGPropertySpecificKeyframe(end).value()); | 601 RefPtrWillBeRawPtr<SVGPropertyBase> toValue = attribute->currentValueBase()-
>cloneForAnimation(toSVGPropertySpecificKeyframe(end).value()); |
606 | 602 |
607 if (!fromValue || !toValue) | 603 if (!fromValue || !toValue) |
608 return nullptr; | 604 return nullptr; |
609 | 605 |
610 return createSVGInterpolation(fromValue.get(), toValue.get(), attribute.get(
)); | 606 return createSVGInterpolation(fromValue.get(), toValue.get(), attribute.get(
)); |
611 } | 607 } |
612 | 608 |
613 } // namespace blink | 609 } // namespace blink |
OLD | NEW |