Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(233)

Side by Side Diff: Source/core/animation/CompositorAnimations.cpp

Issue 178263006: Handle direction control in compositor Animations (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: new patch: add a reference to chromium issue Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 #include "public/platform/WebTransformAnimationCurve.h" 51 #include "public/platform/WebTransformAnimationCurve.h"
52 #include "public/platform/WebTransformKeyframe.h" 52 #include "public/platform/WebTransformKeyframe.h"
53 53
54 #include <algorithm> 54 #include <algorithm>
55 #include <cmath> 55 #include <cmath>
56 56
57 namespace WebCore { 57 namespace WebCore {
58 58
59 namespace { 59 namespace {
60 60
61 void getKeyframeValuesForProperty(const KeyframeEffectModel* effect, CSSProperty ID id, double scale, bool reverse, KeyframeVector& values) 61 void getKeyframeValuesForProperty(const KeyframeEffectModel* effect, CSSProperty ID id, double scale, KeyframeVector& values)
62 { 62 {
63 ASSERT(values.isEmpty()); 63 ASSERT(values.isEmpty());
64 const KeyframeVector& group = effect->getPropertySpecificKeyframes(id); 64 const KeyframeVector& group = effect->getPropertySpecificKeyframes(id);
65 65
66 if (reverse) { 66 for (size_t i = 0; i < group.size(); ++i) {
67 for (size_t i = group.size(); i--;) { 67 double offset = group[i]->offset() * scale;
68 double offset = (1 - group[i]->offset()) * scale; 68 values.append(group[i]->cloneWithOffset(offset));
69 values.append(group[i]->cloneWithOffset(offset));
70 }
71 } else {
72 for (size_t i = 0; i < group.size(); ++i) {
73 double offset = group[i]->offset() * scale;
74 values.append(group[i]->cloneWithOffset(offset));
75 }
76 } 69 }
77 } 70 }
78 71
79 } 72 }
80 73
81 // ----------------------------------------------------------------------- 74 // -----------------------------------------------------------------------
82 // TimingFunctionReverser methods
83 // -----------------------------------------------------------------------
84
85 PassRefPtr<TimingFunction> CompositorAnimationsTimingFunctionReverser::reverse(c onst LinearTimingFunction* timefunc)
86 {
87 return const_cast<LinearTimingFunction*>(timefunc);
88 }
89
90 PassRefPtr<TimingFunction> CompositorAnimationsTimingFunctionReverser::reverse(c onst CubicBezierTimingFunction* timefunc)
91 {
92 switch (timefunc->subType()) {
93 case CubicBezierTimingFunction::EaseIn:
94 return CubicBezierTimingFunction::preset(CubicBezierTimingFunction::Ease Out);
95 case CubicBezierTimingFunction::EaseOut:
96 return CubicBezierTimingFunction::preset(CubicBezierTimingFunction::Ease In);
97 case CubicBezierTimingFunction::EaseInOut:
98 return const_cast<CubicBezierTimingFunction*>(timefunc);
99 case CubicBezierTimingFunction::Ease: // Ease is not symmetrical
100 case CubicBezierTimingFunction::Custom:
101 return CubicBezierTimingFunction::create(1 - timefunc->x2(), 1 - timefun c->y2(), 1 - timefunc->x1(), 1 - timefunc->y1());
102 default:
103 ASSERT_NOT_REACHED();
104 return PassRefPtr<TimingFunction>();
105 }
106 }
107
108 PassRefPtr<TimingFunction> CompositorAnimationsTimingFunctionReverser::reverse(c onst ChainedTimingFunction* timefunc)
109 {
110 RefPtr<ChainedTimingFunction> reversed = ChainedTimingFunction::create();
111 for (size_t i = 0; i < timefunc->m_segments.size(); i++) {
112 size_t index = timefunc->m_segments.size() - i - 1;
113
114 RefPtr<TimingFunction> rtf = reverse(timefunc->m_segments[index].m_timin gFunction.get());
115 reversed->appendSegment(1 - timefunc->m_segments[index].m_min, rtf.get() );
116 }
117 return reversed;
118 }
119
120 PassRefPtr<TimingFunction> CompositorAnimationsTimingFunctionReverser::reverse(c onst TimingFunction* timefunc)
121 {
122 switch (timefunc->type()) {
123 case TimingFunction::LinearFunction: {
124 const LinearTimingFunction* linear = toLinearTimingFunction(timefunc);
125 return reverse(linear);
126 }
127 case TimingFunction::CubicBezierFunction: {
128 const CubicBezierTimingFunction* cubic = toCubicBezierTimingFunction(tim efunc);
129 return reverse(cubic);
130 }
131 case TimingFunction::ChainedFunction: {
132 const ChainedTimingFunction* chained = toChainedTimingFunction(timefunc) ;
133 return reverse(chained);
134 }
135
136 // Steps function can not be reversed.
137 case TimingFunction::StepsFunction:
138 default:
139 ASSERT_NOT_REACHED();
140 return PassRefPtr<TimingFunction>();
141 }
142 }
143
144 // -----------------------------------------------------------------------
145 // CompositorAnimations public API 75 // CompositorAnimations public API
146 // ----------------------------------------------------------------------- 76 // -----------------------------------------------------------------------
147 77
148 bool CompositorAnimations::isCandidateForAnimationOnCompositor(const Timing& tim ing, const AnimationEffect& effect) 78 bool CompositorAnimations::isCandidateForAnimationOnCompositor(const Timing& tim ing, const AnimationEffect& effect)
149 { 79 {
150 const KeyframeEffectModel& keyframeEffect = *toKeyframeEffectModel(&effect); 80 const KeyframeEffectModel& keyframeEffect = *toKeyframeEffectModel(&effect);
151 81
152 // Are the keyframes convertible? 82 // Are the keyframes convertible?
153 const KeyframeEffectModel::KeyframeVector frames = keyframeEffect.getFrames( ); 83 const KeyframeEffectModel::KeyframeVector frames = keyframeEffect.getFrames( );
154 for (size_t i = 0; i < frames.size(); ++i) { 84 for (size_t i = 0; i < frames.size(); ++i) {
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 // All directions are supported. 262 // All directions are supported.
333 263
334 // Now attempt an actual conversion 264 // Now attempt an actual conversion
335 out.scaledDuration = timing.iterationDuration; 265 out.scaledDuration = timing.iterationDuration;
336 ASSERT(out.scaledDuration > 0); 266 ASSERT(out.scaledDuration > 0);
337 267
338 double scaledStartDelay = timing.startDelay; 268 double scaledStartDelay = timing.startDelay;
339 if (scaledStartDelay > 0 && scaledStartDelay > out.scaledDuration * timing.i terationCount) 269 if (scaledStartDelay > 0 && scaledStartDelay > out.scaledDuration * timing.i terationCount)
340 return false; 270 return false;
341 271
342 out.reverse = (timing.direction == Timing::PlaybackDirectionReverse 272 out.direction = static_cast<CompositorTiming::Direction>(timing.direction);
343 || timing.direction == Timing::PlaybackDirectionAlternateReverse);
344 out.alternate = (timing.direction == Timing::PlaybackDirectionAlternate
345 || timing.direction == Timing::PlaybackDirectionAlternateReverse);
346 273
347 if (!std::isfinite(timing.iterationCount)) { 274 if (!std::isfinite(timing.iterationCount)) {
348 out.adjustedIterationCount = -1; 275 out.adjustedIterationCount = -1;
349 } else { 276 } else {
350 out.adjustedIterationCount = std::floor(timing.iterationCount); 277 out.adjustedIterationCount = std::floor(timing.iterationCount);
351 ASSERT(out.adjustedIterationCount > 0); 278 ASSERT(out.adjustedIterationCount > 0);
352 } 279 }
353 280
354 // Compositor's time offset is positive for seeking into the animation. 281 // Compositor's time offset is positive for seeking into the animation.
355 out.scaledTimeOffset = -scaledStartDelay; 282 out.scaledTimeOffset = -scaledStartDelay;
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
477 } 404 }
478 405
479 void CompositorAnimationsImpl::getAnimationOnCompositor(const Timing& timing, co nst KeyframeEffectModel& effect, Vector<OwnPtr<blink::WebAnimation> >& animation s) 406 void CompositorAnimationsImpl::getAnimationOnCompositor(const Timing& timing, co nst KeyframeEffectModel& effect, Vector<OwnPtr<blink::WebAnimation> >& animation s)
480 { 407 {
481 ASSERT(animations.isEmpty()); 408 ASSERT(animations.isEmpty());
482 CompositorTiming compositorTiming; 409 CompositorTiming compositorTiming;
483 bool timingValid = convertTimingForCompositor(timing, compositorTiming); 410 bool timingValid = convertTimingForCompositor(timing, compositorTiming);
484 ASSERT_UNUSED(timingValid, timingValid); 411 ASSERT_UNUSED(timingValid, timingValid);
485 412
486 RefPtr<TimingFunction> timingFunction = timing.timingFunction; 413 RefPtr<TimingFunction> timingFunction = timing.timingFunction;
487 if (compositorTiming.reverse)
488 timingFunction = CompositorAnimationsTimingFunctionReverser::reverse(tim ingFunction.get());
489
490 PropertySet properties = effect.properties(); 414 PropertySet properties = effect.properties();
491 ASSERT(!properties.isEmpty()); 415 ASSERT(!properties.isEmpty());
492 for (PropertySet::iterator it = properties.begin(); it != properties.end(); ++it) { 416 for (PropertySet::iterator it = properties.begin(); it != properties.end(); ++it) {
493 417
494 KeyframeVector values; 418 KeyframeVector values;
495 getKeyframeValuesForProperty(&effect, *it, compositorTiming.scaledDurati on, compositorTiming.reverse, values); 419 getKeyframeValuesForProperty(&effect, *it, compositorTiming.scaledDurati on, values);
496 420
497 blink::WebAnimation::TargetProperty targetProperty; 421 blink::WebAnimation::TargetProperty targetProperty;
498 OwnPtr<blink::WebAnimationCurve> curve; 422 OwnPtr<blink::WebAnimationCurve> curve;
499 switch (*it) { 423 switch (*it) {
500 case CSSPropertyOpacity: { 424 case CSSPropertyOpacity: {
501 targetProperty = blink::WebAnimation::TargetPropertyOpacity; 425 targetProperty = blink::WebAnimation::TargetPropertyOpacity;
502 426
503 blink::WebFloatAnimationCurve* floatCurve = blink::Platform::current ()->compositorSupport()->createFloatAnimationCurve(); 427 blink::WebFloatAnimationCurve* floatCurve = blink::Platform::current ()->compositorSupport()->createFloatAnimationCurve();
504 addKeyframesToCurve(*floatCurve, values, *timingFunction.get()); 428 addKeyframesToCurve(*floatCurve, values, *timingFunction.get());
505 curve = adoptPtr(floatCurve); 429 curve = adoptPtr(floatCurve);
(...skipping 16 matching lines...) Expand all
522 default: 446 default:
523 ASSERT_NOT_REACHED(); 447 ASSERT_NOT_REACHED();
524 continue; 448 continue;
525 } 449 }
526 ASSERT(curve.get()); 450 ASSERT(curve.get());
527 451
528 OwnPtr<blink::WebAnimation> animation = adoptPtr(blink::Platform::curren t()->compositorSupport()->createAnimation(*curve, targetProperty)); 452 OwnPtr<blink::WebAnimation> animation = adoptPtr(blink::Platform::curren t()->compositorSupport()->createAnimation(*curve, targetProperty));
529 453
530 animation->setIterations(compositorTiming.adjustedIterationCount); 454 animation->setIterations(compositorTiming.adjustedIterationCount);
531 animation->setTimeOffset(compositorTiming.scaledTimeOffset); 455 animation->setTimeOffset(compositorTiming.scaledTimeOffset);
532 animation->setAlternatesDirection(compositorTiming.alternate); 456 animation->setDirection(static_cast<blink::WebAnimation::Direction>(comp ositorTiming.direction));
533 457
534 animations.append(animation.release()); 458 animations.append(animation.release());
535 } 459 }
536 ASSERT(!animations.isEmpty()); 460 ASSERT(!animations.isEmpty());
537 } 461 }
538 462
539 } // namespace WebCore 463 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698