Index: ui/compositor/transform_animation_curve_adapter.cc |
diff --git a/ui/compositor/transform_animation_curve_adapter.cc b/ui/compositor/transform_animation_curve_adapter.cc |
index 96500b3de521210c77a8bb853a5db7dace2e708c..ff3948047e07e883dc9b134f6aa77a242af24336 100644 |
--- a/ui/compositor/transform_animation_curve_adapter.cc |
+++ b/ui/compositor/transform_animation_curve_adapter.cc |
@@ -51,4 +51,43 @@ gfx::Transform TransformAnimationCurveAdapter::GetValue( |
return gfx::ComposeTransform(to_return); |
} |
+CounterTransformCurveAdapter::CounterTransformCurveAdapter( |
+ TransformAnimationCurveAdapter parent_curve, |
+ gfx::Transform initial_value, |
+ base::TimeDelta duration) |
+ : parent_curve_(parent_curve), |
+ initial_value_(initial_value), |
+ duration_(duration) { |
+ effective_initial_value_ = parent_curve_.GetValue(0.0) * initial_value_; |
+} |
+ |
+CounterTransformCurveAdapter::~CounterTransformCurveAdapter() { |
+} |
+ |
+double CounterTransformCurveAdapter::Duration() const { |
+ return duration_.InSeconds(); |
+} |
+ |
+scoped_ptr<cc::AnimationCurve> CounterTransformCurveAdapter::Clone() const { |
+ scoped_ptr<CounterTransformCurveAdapter> to_return( |
+ new CounterTransformCurveAdapter(parent_curve_, |
+ initial_value_, |
+ duration_)); |
+ return to_return.PassAs<cc::AnimationCurve>(); |
+} |
+ |
+gfx::Transform CounterTransformCurveAdapter::GetValue( |
+ double t) const { |
+ if (t <= 0.0) |
+ return initial_value_; |
+ |
+ gfx::Transform parent_transform = parent_curve_.GetValue(t); |
+ // Invert parent |
+ gfx::Transform to_return(gfx::Transform::kSkipInitialization); |
+ DCHECK(parent_transform.GetInverse(&to_return)); |
+ |
+ to_return.PreconcatTransform(effective_initial_value_); |
+ return to_return; |
+} |
+ |
} // namespace ui |