Commit b13101f9 authored by Peter Kasting's avatar Peter Kasting Committed by Commit Bot

Handle infinite-elapsed-time progress in animations.

This is primarily to address the case of "inf / inf", which in terms of
doubles is 1, but in terms of TimeDeltas is a checkfailure.

Bug: 1148774
Change-Id: Iee4d80a721915ab2251535585153d9f6e2eb7f33
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2545026Reviewed-by: default avatarKevin Ellis <kevers@chromium.org>
Reviewed-by: default avatarRobert Flack <flackr@chromium.org>
Commit-Queue: Peter Kasting <pkasting@chromium.org>
Cr-Commit-Position: refs/heads/master@{#828863}
parent de2b2888
......@@ -35,6 +35,27 @@ void InsertKeyframe(std::unique_ptr<KeyframeType> keyframe,
keyframes->push_back(std::move(keyframe));
}
struct TimeValues {
base::TimeDelta start_time;
base::TimeDelta duration;
double progress;
};
template <typename KeyframeType>
TimeValues GetTimeValues(const KeyframeType& start_frame,
const KeyframeType& end_frame,
double scaled_duration,
base::TimeDelta time) {
TimeValues values;
values.start_time = start_frame.Time() * scaled_duration;
values.duration = (end_frame.Time() * scaled_duration) - values.start_time;
const base::TimeDelta elapsed = time - values.start_time;
values.progress = (elapsed.is_inf() || values.duration.is_zero())
? 1.0
: (elapsed / values.duration);
return values;
}
template <typename KeyframeType>
base::TimeDelta TransformedAnimationTime(
const std::vector<std::unique_ptr<KeyframeType>>& keyframes,
......@@ -42,14 +63,10 @@ base::TimeDelta TransformedAnimationTime(
double scaled_duration,
base::TimeDelta time) {
if (timing_function) {
base::TimeDelta start_time = keyframes.front()->Time() * scaled_duration;
base::TimeDelta duration =
(keyframes.back()->Time() - keyframes.front()->Time()) *
scaled_duration;
const double progress =
duration.is_zero() ? 1.0 : ((time - start_time) / duration);
time = (duration * timing_function->GetValue(progress)) + start_time;
const auto values = GetTimeValues(*keyframes.front(), *keyframes.back(),
scaled_duration, time);
time = (values.duration * timing_function->GetValue(values.progress)) +
values.start_time;
}
return time;
......@@ -75,12 +92,9 @@ double TransformedKeyframeProgress(
double scaled_duration,
base::TimeDelta time,
size_t i) {
const base::TimeDelta start_time = keyframes[i]->Time() * scaled_duration;
const base::TimeDelta duration =
keyframes[i + 1]->Time() * scaled_duration - start_time;
const double progress =
duration.is_zero() ? 1.0 : ((time - start_time) / duration);
GetTimeValues(*keyframes[i], *keyframes[i + 1], scaled_duration, time)
.progress;
return keyframes[i]->timing_function()
? keyframes[i]->timing_function()->GetValue(progress)
: progress;
......
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