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

Unified Diff: third_party/WebKit/Source/core/animation/CustomCompositorAnimations.cpp

Issue 1602343002: compositor-worker: cc->blink mutation plumbing (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@compositor-worker-ian-patch
Patch Set: Merge master + s/scoped_ptr/unique_ptr/ Created 4 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/animation/CustomCompositorAnimations.cpp
diff --git a/third_party/WebKit/Source/core/animation/CustomCompositorAnimations.cpp b/third_party/WebKit/Source/core/animation/CustomCompositorAnimations.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..00aac4028b4ce439a04940f39105b1c545b2c14b
--- /dev/null
+++ b/third_party/WebKit/Source/core/animation/CustomCompositorAnimations.cpp
@@ -0,0 +1,88 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "CustomCompositorAnimations.h"
+
+#include "core/animation/Animation.h"
+#include "core/animation/AnimationTimeline.h"
+#include "core/animation/KeyframeEffect.h"
+#include "core/animation/KeyframeEffectModel.h"
+#include "core/animation/animatable/AnimatableDouble.h"
+#include "core/animation/animatable/AnimatableTransform.h"
+#include "core/animation/animatable/AnimatableValue.h"
+#include "platform/TraceEvent.h"
+#include "platform/graphics/CompositorMutation.h"
+#include "platform/transforms/Matrix3DTransformOperation.h"
+#include "platform/transforms/MatrixTransformOperation.h"
+#include "platform/transforms/TransformOperations.h"
+
+namespace blink {
+
+namespace {
+
+// Create keyframe effect with zero duration, fill mode forward, and two key
+// frames with same value. This corresponding animation is always running and by
+// updating the key frames we are able to control the applied value.
+static KeyframeEffect* createInfiniteKeyFrameEffect(Element& element, CSSPropertyID propertyId, PassRefPtr<AnimatableValue> value)
+{
+ AnimatableValueKeyframeVector keyframes(2);
+ keyframes[0] = AnimatableValueKeyframe::create();
+ keyframes[0]->setOffset(0.0);
+ keyframes[0]->setPropertyValue(propertyId, value.get());
+ keyframes[1] = AnimatableValueKeyframe::create();
+ keyframes[1]->setOffset(1.0);
+ keyframes[1]->setPropertyValue(propertyId, value.get());
+ keyframes[1]->setComposite(EffectModel::CompositeReplace);
+
+ Timing timing;
+ timing.iterationDuration = 0;
+ timing.fillMode = Timing::FillModeForwards;
+
+ AnimatableValueKeyframeEffectModel* effectModel = AnimatableValueKeyframeEffectModel::create(keyframes);
+ return KeyframeEffect::create(&element, effectModel, timing);
+}
+
+static KeyframeEffect* updateInfiniteKeyframeEffect(const KeyframeEffect& keyframeEffect, CSSPropertyID propertyId, PassRefPtr<AnimatableValue> value)
+{
+ const KeyframeVector& oldFrames = toAnimatableValueKeyframeEffectModel(keyframeEffect.model())->getFrames();
+ AnimatableValueKeyframeVector keyframes(2);
+ keyframes[0] = toAnimatableValueKeyframe(oldFrames[0]->clone().get());
+ keyframes[1] = toAnimatableValueKeyframe(oldFrames[1]->clone().get());
+ keyframes[0]->setPropertyValue(propertyId, value.get());
+ keyframes[1]->setPropertyValue(propertyId, value.get());
+
+ AnimatableValueKeyframeEffectModel* effectModel = AnimatableValueKeyframeEffectModel::create(keyframes);
+ return KeyframeEffect::create(keyframeEffect.target(), effectModel, keyframeEffect.specifiedTiming());
+}
+
+static Animation* createOrUpdateAnimation(Animation* animation, Element& element, CSSPropertyID propertyId, PassRefPtr<AnimatableValue> newValue)
+{
+ if (!animation) {
+ KeyframeEffect* keyframeEffect = createInfiniteKeyFrameEffect(element, propertyId, newValue);
+ return element.document().timeline().play(keyframeEffect);
+ }
+ KeyframeEffect* keyframeEffect = updateInfiniteKeyframeEffect(*toKeyframeEffect(animation->effect()), propertyId, newValue);
+ animation->setEffect(keyframeEffect);
+ return animation;
+}
+
+} // namespace
+
+void CustomCompositorAnimations::applyUpdate(Element& element, const CompositorMutation& mutation)
+{
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("compositor-worker"), "CustomCompositorAnimations::applyUpdate");
+
+ if (mutation.isOpacityMutated()) {
+ RefPtr<AnimatableValue> animatableValue = AnimatableDouble::create(mutation.opacity());
+ m_animation = createOrUpdateAnimation(m_animation, element, CSSPropertyOpacity, animatableValue.release());
+ }
+ if (mutation.isTransformMutated()) {
+ TransformOperations ops;
+ ops.operations().append(Matrix3DTransformOperation::create(TransformationMatrix(mutation.transform())));
+ RefPtr<AnimatableValue> animatableValue = AnimatableTransform::create(ops, 1);
+ m_animation = createOrUpdateAnimation(m_animation, element, CSSPropertyTransform, animatableValue.release());
+ }
+}
+
+} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698