Commit 5fdf190d authored by Edvard Thörnros's avatar Edvard Thörnros Committed by Commit Bot

Refactor SVGSMILElement::ResolveNextInterval()

The method has been simplified and state mutation has
been hoisted to the calling methods to make it clearer
what is mutating what.

This is the first step in a series of commits to be able
to separate the timing logic from the updating logic. This
aims to make it easier to make upcoming edits.

No changes should be made with this commit in how the
application functions or the runtime.

Bug: 981522, 641437
Change-Id: I7a969bf08d93988d500c512f3d56aebc6e2e071c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1692567
Commit-Queue: Edvard Thörnros <edvardt@opera.com>
Auto-Submit: Edvard Thörnros <edvardt@opera.com>
Reviewed-by: default avatarFredrik Söderquist <fs@opera.com>
Cr-Commit-Position: refs/heads/master@{#675593}
parent 2392d5bc
......@@ -853,21 +853,16 @@ void SVGSMILElement::ResolveFirstInterval() {
}
}
bool SVGSMILElement::ResolveNextInterval() {
base::Optional<SMILInterval> SVGSMILElement::ResolveNextInterval() {
SMILInterval next_interval = ResolveInterval(kNextInterval);
DCHECK(!next_interval.begin.IsIndefinite());
if (!next_interval.begin.IsUnresolved() &&
next_interval.begin != interval_.begin) {
interval_ = next_interval;
NotifyDependentsIntervalChanged();
next_progress_time_ = next_progress_time_.IsUnresolved()
? interval_.begin
: std::min(next_progress_time_, interval_.begin);
return true;
return next_interval;
}
return false;
return base::nullopt;
}
SMILTime SVGSMILElement::NextProgressTime() const {
......@@ -942,8 +937,17 @@ SVGSMILElement::RestartedInterval SVGSMILElement::MaybeRestartInterval(
}
if (elapsed >= interval_.end) {
if (ResolveNextInterval() && elapsed >= interval_.begin)
return kDidRestartInterval;
base::Optional<SMILInterval> next_interval = ResolveNextInterval();
if (next_interval) {
interval_ = *next_interval;
NotifyDependentsIntervalChanged();
next_progress_time_ =
next_progress_time_.IsUnresolved()
? interval_.begin
: std::min(next_progress_time_, interval_.begin);
if (elapsed >= interval_.begin)
return kDidRestartInterval;
}
}
return kDidNotRestartInterval;
}
......@@ -971,16 +975,33 @@ void SVGSMILElement::SeekToIntervalCorrespondingToTime(double elapsed) {
// End current interval, and start a new interval from the 'nextBegin'
// time.
interval_.end = next_begin;
if (!ResolveNextInterval())
base::Optional<SMILInterval> next_interval = ResolveNextInterval();
if (!next_interval)
break;
interval_ = *next_interval;
NotifyDependentsIntervalChanged();
next_progress_time_ =
next_progress_time_.IsUnresolved()
? interval_.begin
: std::min(next_progress_time_, interval_.begin);
continue;
}
// If the desired 'elapsed' time is past the current interval, advance to
// the next.
if (elapsed >= interval_.end) {
if (!ResolveNextInterval())
base::Optional<SMILInterval> next_interval = ResolveNextInterval();
if (!next_interval)
break;
interval_ = *next_interval;
NotifyDependentsIntervalChanged();
next_progress_time_ =
next_progress_time_.IsUnresolved()
? interval_.begin
: std::min(next_progress_time_, interval_.begin);
continue;
}
......
......@@ -180,7 +180,7 @@ class CORE_EXPORT SVGSMILElement : public SVGElement, public SVGTests {
SMILInterval ResolveInterval(IntervalSelector) const;
void ResolveFirstInterval();
bool ResolveNextInterval();
base::Optional<SMILInterval> ResolveNextInterval();
SMILTime ResolveActiveEnd(SMILTime resolved_begin,
SMILTime resolved_end) const;
SMILTime RepeatingDuration() const;
......
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