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

Unified Diff: ui/gfx/compositor/layer_animation_element.cc

Issue 8247009: Explicit animation support (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix VS2010 Created 9 years, 2 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
« no previous file with comments | « ui/gfx/compositor/layer_animation_element.h ('k') | ui/gfx/compositor/layer_animation_element_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gfx/compositor/layer_animation_element.cc
diff --git a/ui/gfx/compositor/layer_animation_element.cc b/ui/gfx/compositor/layer_animation_element.cc
new file mode 100644
index 0000000000000000000000000000000000000000..fb52bbb3c14c5829091fb7a1af0f17a8dae6e3ec
--- /dev/null
+++ b/ui/gfx/compositor/layer_animation_element.cc
@@ -0,0 +1,190 @@
+// Copyright (c) 2011 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 "ui/gfx/compositor/layer_animation_element.h"
+
+#include "base/compiler_specific.h"
+#include "ui/base/animation/tween.h"
+#include "ui/gfx/compositor/layer_animation_delegate.h"
+#include "ui/gfx/rect.h"
+#include "ui/gfx/transform.h"
+
+namespace ui {
+
+namespace {
+
+// Pause -----------------------------------------------------------------------
+class Pause : public LayerAnimationElement {
+ public:
+ Pause(const AnimatableProperties& properties, base::TimeDelta duration)
+ : LayerAnimationElement(properties, duration) {
+ }
+ virtual ~Pause() {}
+
+ private:
+ virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {}
+ virtual void OnProgress(double t,
+ LayerAnimationDelegate* delegate) OVERRIDE {}
+ virtual void OnAbort() OVERRIDE {}
+
+ DISALLOW_COPY_AND_ASSIGN(Pause);
+};
+
+// TransformTransition ---------------------------------------------------------
+
+class TransformTransition : public LayerAnimationElement {
+ public:
+ TransformTransition(const Transform& target, base::TimeDelta duration)
+ : LayerAnimationElement(GetProperties(), duration),
+ target_(target) {
+ }
+ virtual ~TransformTransition() {}
+
+ protected:
+ virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {
+ start_ = delegate->GetTransformForAnimation();
+ }
+
+ virtual void OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE {
+ delegate->SetTransformFromAnimation(
+ Tween::ValueBetween(t, start_, target_));
+ }
+
+ virtual void OnAbort() OVERRIDE {}
+
+ private:
+ static const AnimatableProperties& GetProperties() {
+ static AnimatableProperties properties;
+ if (properties.size() == 0)
+ properties.insert(LayerAnimationElement::TRANSFORM);
+ return properties;
+ }
+
+ Transform start_;
+ const Transform target_;
+
+ DISALLOW_COPY_AND_ASSIGN(TransformTransition);
+};
+
+// BoundsTransition ------------------------------------------------------------
+
+class BoundsTransition : public LayerAnimationElement {
+ public:
+ BoundsTransition(const gfx::Rect& target, base::TimeDelta duration)
+ : LayerAnimationElement(GetProperties(), duration),
+ target_(target) {
+ }
+ virtual ~BoundsTransition() {}
+
+ protected:
+ virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {
+ start_ = delegate->GetBoundsForAnimation();
+ }
+
+ virtual void OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE {
+ delegate->SetBoundsFromAnimation(Tween::ValueBetween(t, start_, target_));
+ }
+
+ virtual void OnAbort() OVERRIDE {}
+
+ private:
+ static const AnimatableProperties& GetProperties() {
+ static AnimatableProperties properties;
+ if (properties.size() == 0)
+ properties.insert(LayerAnimationElement::BOUNDS);
+ return properties;
+ }
+
+ gfx::Rect start_;
+ const gfx::Rect target_;
+
+ DISALLOW_COPY_AND_ASSIGN(BoundsTransition);
+};
+
+class OpacityTransition : public LayerAnimationElement {
+ public:
+ OpacityTransition(float target, base::TimeDelta duration)
+ : LayerAnimationElement(GetProperties(), duration),
+ target_(target) {
+ }
+ virtual ~OpacityTransition() {}
+
+ protected:
+ virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {
+ start_ = delegate->GetOpacityForAnimation();
+ }
+
+ virtual void OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE {
+ delegate->SetOpacityFromAnimation(Tween::ValueBetween(t, start_, target_));
+ }
+
+ virtual void OnAbort() OVERRIDE {}
+
+ private:
+ static const AnimatableProperties& GetProperties() {
+ static AnimatableProperties properties;
+ if (properties.size() == 0)
+ properties.insert(LayerAnimationElement::OPACITY);
+ return properties;
+ }
+
+ float start_;
+ const float target_;
+
+ DISALLOW_COPY_AND_ASSIGN(OpacityTransition);
+};
+
+} // namespace
+
+// LayerAnimationElement -------------------------------------------------------
+
+LayerAnimationElement::LayerAnimationElement(
+ const AnimatableProperties& properties,
+ base::TimeDelta duration)
+ : first_frame_(true),
+ properties_(properties),
+ duration_(duration) {
+}
+
+LayerAnimationElement::~LayerAnimationElement() {
+}
+
+void LayerAnimationElement::Progress(double t,
+ LayerAnimationDelegate* delegate) {
+ if (first_frame_)
+ OnStart(delegate);
+ OnProgress(t, delegate);
+ first_frame_ = t == 1.0;
+}
+
+void LayerAnimationElement::Abort() {
+ first_frame_ = true;
+ OnAbort();
+}
+
+// static
+LayerAnimationElement* LayerAnimationElement::CreateTransformElement(
+ const Transform& transform, base::TimeDelta duration) {
+ return new TransformTransition(transform, duration);
+}
+
+// static
+LayerAnimationElement* LayerAnimationElement::CreateBoundsElement(
+ const gfx::Rect& bounds, base::TimeDelta duration) {
+ return new BoundsTransition(bounds, duration);
+}
+
+// static
+LayerAnimationElement* LayerAnimationElement::CreateOpacityElement(
+ float opacity, base::TimeDelta duration) {
+ return new OpacityTransition(opacity, duration);
+}
+
+// static
+LayerAnimationElement* LayerAnimationElement::CreatePauseElement(
+ const AnimatableProperties& properties, base::TimeDelta duration) {
+ return new Pause(properties, duration);
+}
+
+} // namespace ui
« no previous file with comments | « ui/gfx/compositor/layer_animation_element.h ('k') | ui/gfx/compositor/layer_animation_element_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698