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(
// Compositor's time offset is positive for seeking into the animation.
DCHECK(animation_playback_rate);
out.scaled_time_offset = -base::TimeDelta::FromSecondsD(
timing.start_delay / animation_playback_rate) +
time_offset;
// Start delay is effectively +/- infinity.
double delay = animation_playback_rate > 0 ? timing.start_delay : 0;
out.scaled_time_offset =
-base::TimeDelta::FromSecondsD(delay / animation_playback_rate) +
time_offset;
// Delay is effectively +/- infinity.
if (out.scaled_time_offset.is_max() || out.scaled_time_offset.is_min())
return false;
......
......@@ -171,9 +171,10 @@ class AnimationCompositorAnimationsTest : public PaintTestConfigurations,
public:
bool ConvertTimingForCompositor(const Timing& t,
CompositorAnimations::CompositorTiming& out) {
CompositorAnimations::CompositorTiming& out,
double playback_rate = 1) {
return CompositorAnimations::ConvertTimingForCompositor(
t, base::TimeDelta(), out, 1);
t, base::TimeDelta(), out, playback_rate);
}
CompositorAnimations::FailureReasons CanStartEffectOnCompositor(
......@@ -719,15 +720,25 @@ TEST_P(AnimationCompositorAnimationsTest,
TEST_P(AnimationCompositorAnimationsTest,
ConvertTimingForCompositorStartDelay) {
const double play_forward = 1;
const double play_reverse = -1;
timing_.iteration_duration = AnimationTimeDelta::FromSecondsD(20);
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_TRUE(
ConvertTimingForCompositor(timing_, compositor_timing_, play_reverse));
EXPECT_DOUBLE_EQ(0.0, compositor_timing_.scaled_time_offset.InSecondsF());
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_TRUE(
ConvertTimingForCompositor(timing_, compositor_timing_, play_reverse));
EXPECT_DOUBLE_EQ(0.0, compositor_timing_.scaled_time_offset.InSecondsF());
}
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