Commit 1c47f925 authored by Kevin Ellis's avatar Kevin Ellis Committed by Commit Bot

Fix reversal of a composited animation with a start delay

CompositorAnimations::ConvertTimingForCompositor does not take the play
direction into account when adjusting the time offset for the start
delay.

Note that a similar trick might work for end delays; however, deferring
to a separate CL given the comment:

  // FIXME: Compositor does not know anything about endDelay.

which suggests that other CC changes may be required to accommodate
end delays properly.

Difference between composited and main thread animation can be observed
in the following CodePen without the patch.

https://codepen.io/kevers-google/pen/NWNPGRg


Bug: 1095813
Change-Id: I3d5d09618f6e58795bc527c18bc6deabe9abed13
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2339712Reviewed-by: default avatarXida Chen <xidachen@chromium.org>
Commit-Queue: Kevin Ellis <kevers@chromium.org>
Cr-Commit-Position: refs/heads/master@{#795569}
parent 68a277ff
...@@ -538,10 +538,11 @@ bool CompositorAnimations::ConvertTimingForCompositor( ...@@ -538,10 +538,11 @@ bool CompositorAnimations::ConvertTimingForCompositor(
// Compositor's time offset is positive for seeking into the animation. // Compositor's time offset is positive for seeking into the animation.
DCHECK(animation_playback_rate); DCHECK(animation_playback_rate);
out.scaled_time_offset = -base::TimeDelta::FromSecondsD( double delay = animation_playback_rate > 0 ? timing.start_delay : 0;
timing.start_delay / animation_playback_rate) + out.scaled_time_offset =
-base::TimeDelta::FromSecondsD(delay / animation_playback_rate) +
time_offset; time_offset;
// Start delay is effectively +/- infinity. // Delay is effectively +/- infinity.
if (out.scaled_time_offset.is_max() || out.scaled_time_offset.is_min()) if (out.scaled_time_offset.is_max() || out.scaled_time_offset.is_min())
return false; return false;
......
...@@ -171,9 +171,10 @@ class AnimationCompositorAnimationsTest : public PaintTestConfigurations, ...@@ -171,9 +171,10 @@ class AnimationCompositorAnimationsTest : public PaintTestConfigurations,
public: public:
bool ConvertTimingForCompositor(const Timing& t, bool ConvertTimingForCompositor(const Timing& t,
CompositorAnimations::CompositorTiming& out) { CompositorAnimations::CompositorTiming& out,
double playback_rate = 1) {
return CompositorAnimations::ConvertTimingForCompositor( return CompositorAnimations::ConvertTimingForCompositor(
t, base::TimeDelta(), out, 1); t, base::TimeDelta(), out, playback_rate);
} }
CompositorAnimations::FailureReasons CanStartEffectOnCompositor( CompositorAnimations::FailureReasons CanStartEffectOnCompositor(
...@@ -719,15 +720,25 @@ TEST_P(AnimationCompositorAnimationsTest, ...@@ -719,15 +720,25 @@ TEST_P(AnimationCompositorAnimationsTest,
TEST_P(AnimationCompositorAnimationsTest, TEST_P(AnimationCompositorAnimationsTest,
ConvertTimingForCompositorStartDelay) { ConvertTimingForCompositorStartDelay) {
const double play_forward = 1;
const double play_reverse = -1;
timing_.iteration_duration = AnimationTimeDelta::FromSecondsD(20); timing_.iteration_duration = AnimationTimeDelta::FromSecondsD(20);
timing_.start_delay = 2.0; timing_.start_delay = 2.0;
EXPECT_TRUE(ConvertTimingForCompositor(timing_, compositor_timing_)); EXPECT_TRUE(
ConvertTimingForCompositor(timing_, compositor_timing_, play_forward));
EXPECT_DOUBLE_EQ(-2.0, compositor_timing_.scaled_time_offset.InSecondsF()); EXPECT_DOUBLE_EQ(-2.0, compositor_timing_.scaled_time_offset.InSecondsF());
EXPECT_TRUE(
ConvertTimingForCompositor(timing_, compositor_timing_, play_reverse));
EXPECT_DOUBLE_EQ(0.0, compositor_timing_.scaled_time_offset.InSecondsF());
timing_.start_delay = -2.0; timing_.start_delay = -2.0;
EXPECT_TRUE(ConvertTimingForCompositor(timing_, compositor_timing_)); EXPECT_TRUE(
ConvertTimingForCompositor(timing_, compositor_timing_, play_forward));
EXPECT_DOUBLE_EQ(2.0, compositor_timing_.scaled_time_offset.InSecondsF()); EXPECT_DOUBLE_EQ(2.0, compositor_timing_.scaled_time_offset.InSecondsF());
EXPECT_TRUE(
ConvertTimingForCompositor(timing_, compositor_timing_, play_reverse));
EXPECT_DOUBLE_EQ(0.0, compositor_timing_.scaled_time_offset.InSecondsF());
} }
TEST_P(AnimationCompositorAnimationsTest, TEST_P(AnimationCompositorAnimationsTest,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment