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

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

Issue 8247009: Explicit animation support (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Updated views desktop demo. 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
Index: ui/gfx/compositor/layer.cc
diff --git a/ui/gfx/compositor/layer.cc b/ui/gfx/compositor/layer.cc
index b9b1cd373afcf86a586e1d9b4309764fbc424fd6..644ff51e7869ce5d3c31ed5dfe83df5c29e46610 100644
--- a/ui/gfx/compositor/layer.cc
+++ b/ui/gfx/compositor/layer.cc
@@ -8,7 +8,6 @@
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
-#include "ui/base/animation/animation.h"
#include "ui/gfx/compositor/layer_animator.h"
#include "ui/gfx/canvas_skia.h"
#include "ui/gfx/interpolated_transform.h"
@@ -106,43 +105,37 @@ bool Layer::Contains(const Layer* other) const {
return false;
}
-void Layer::SetAnimation(Animation* animation) {
- if (animation) {
- if (!animator_.get())
- animator_.reset(new LayerAnimator(this));
- animation->Start();
- animator_->SetAnimation(animation);
- } else {
- animator_.reset();
+void Layer::SetAnimator(LayerAnimator* animator) {
+ animator->SetLayer(this);
+ animator_.reset(animator);
+}
+
+LayerAnimator& Layer::GetAnimator() {
+ if (!animator_.get()) {
+ SetAnimator(LayerAnimator::CreateDefaultAnimator());
}
+ return *animator_;
}
void Layer::SetTransform(const ui::Transform& transform) {
- StopAnimatingIfNecessary(LayerAnimator::TRANSFORM);
- if (animator_.get() && animator_->IsRunning()) {
- animator_->AnimateTransform(transform);
- return;
- }
- SetTransformImmediately(transform);
+ if (animator_.get())
+ animator_->SetTransform(transform);
+ else
+ SetTransformImmediately(transform);
}
void Layer::SetBounds(const gfx::Rect& bounds) {
- StopAnimatingIfNecessary(LayerAnimator::LOCATION);
- if (animator_.get() && animator_->IsRunning() &&
- bounds.size() == bounds_.size()) {
- animator_->AnimateToPoint(bounds.origin());
- return;
- }
- SetBoundsImmediately(bounds);
+ if (animator_.get())
+ animator_->SetBounds(bounds);
+ else
+ SetBoundsImmediately(bounds);
}
void Layer::SetOpacity(float opacity) {
- StopAnimatingIfNecessary(LayerAnimator::OPACITY);
- if (animator_.get() && animator_->IsRunning()) {
- animator_->AnimateOpacity(opacity);
- return;
- }
- SetOpacityImmediately(opacity);
+ if (animator_.get())
+ animator_->SetOpacity(opacity);
+ else
+ SetOpacityImmediately(opacity);
}
void Layer::SetVisible(bool visible) {
@@ -328,8 +321,15 @@ void Layer::RecomputeHole() {
!IsApproximateMultilpleOf(degrees, 90.0f))
continue;
- gfx::Rect candidate_hole = children_[i]->bounds();
- children_[i]->transform().TransformRect(&candidate_hole);
+ // The reason why we don't just take the bounds and apply the transform is
+ // that the bounds encodes a position, too, so the effective transformation
+ // matrix is actually different that the one reported. As well, the bounds
+ // will not necessarily be at the origin.
+ gfx::Rect candidate_hole(children_[i]->bounds_.size());
+ ui::Transform transform = children_[i]->transform();
+ transform.ConcatTranslate(static_cast<float>(children_[i]->bounds_.x()),
+ static_cast<float>(children_[i]->bounds_.y()));
+ transform.TransformRect(&candidate_hole);
// This layer might not contain the child (e.g., a portion of the child may
// be offscreen). Only the portion of the child that overlaps this layer is
@@ -343,7 +343,7 @@ void Layer::RecomputeHole() {
// Free up texture memory if the hole fills bounds of layer.
if (!ShouldDraw() && !layer_updated_externally_)
- texture_ = NULL;
+ DropTextures();
}
bool Layer::IsCompletelyOpaque() const {
@@ -425,29 +425,6 @@ bool Layer::GetTransformRelativeTo(const Layer* ancestor,
return p == ancestor;
}
-void Layer::StopAnimatingIfNecessary(
- LayerAnimator::AnimationProperty property) {
- if (!animator_.get() || !animator_->IsRunning() ||
- !animator_->got_initial_tick()) {
- return;
- }
-
- if (property != LayerAnimator::LOCATION &&
- animator_->IsAnimating(LayerAnimator::LOCATION)) {
- SetBoundsImmediately(
- gfx::Rect(animator_->GetTargetPoint(), bounds_.size()));
- }
- if (property != LayerAnimator::OPACITY &&
- animator_->IsAnimating(LayerAnimator::OPACITY)) {
- SetOpacityImmediately(animator_->GetTargetOpacity());
- }
- if (property != LayerAnimator::TRANSFORM &&
- animator_->IsAnimating(LayerAnimator::TRANSFORM)) {
- SetTransformImmediately(animator_->GetTargetTransform());
- }
- animator_.reset();
-}
-
void Layer::SetBoundsImmediately(const gfx::Rect& bounds) {
bounds_ = bounds;
@@ -484,16 +461,32 @@ void Layer::SetOpacityImmediately(float opacity) {
}
}
-void Layer::SetBoundsFromAnimator(const gfx::Rect& bounds) {
+void Layer::SetBoundsFromAnimation(const gfx::Rect& bounds) {
SetBoundsImmediately(bounds);
}
-void Layer::SetTransformFromAnimator(const Transform& transform) {
+void Layer::SetTransformFromAnimation(const Transform& transform) {
SetTransformImmediately(transform);
}
-void Layer::SetOpacityFromAnimator(float opacity) {
+void Layer::SetOpacityFromAnimation(float opacity) {
SetOpacityImmediately(opacity);
}
+void Layer::ScheduleDrawForAnimation() {
+ ScheduleDraw();
+}
+
+const gfx::Rect& Layer::GetBoundsForAnimation() const {
+ return bounds();
+}
+
+const Transform& Layer::GetTransformForAnimation() const {
+ return transform();
+}
+
+const float Layer::GetOpacityForAnimation() const {
+ return opacity();
+}
+
} // namespace ui

Powered by Google App Engine
This is Rietveld 408576698