Commit c1b20814 authored by Fredrik Söderquist's avatar Fredrik Söderquist Committed by Commit Bot

Refactor SVGSMILElement::CheckAndUpdateInterval

Rename it to HandleIntervalRestart(...), and fold the check for an
unresolved interval into it while sinking the actual interval resolution
out into the caller (UpdateInterval). This allows merging the two
ResolveInterval() calls.

Bug: 998526
Change-Id: I23e3caab69a09aa701f16c0bda6a8751676149b1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1834089Reviewed-by: default avatarPhilip Rogers <pdr@chromium.org>
Commit-Queue: Fredrik Söderquist <fs@opera.com>
Cr-Commit-Position: refs/heads/master@{#702119}
parent 3ddb2073
......@@ -904,48 +904,40 @@ void SVGSMILElement::DiscardOrRevalidateCurrentInterval(
}
}
void SVGSMILElement::UpdateInterval(SMILTime presentation_time) {
DCHECK(!is_waiting_for_first_interval_);
if (instance_lists_have_changed_) {
instance_lists_have_changed_ = false;
DiscardOrRevalidateCurrentInterval(presentation_time);
}
base::Optional<SMILInterval> new_interval;
if (!interval_.IsResolved()) {
new_interval = ResolveInterval(SMILTime::Earliest(), presentation_time);
} else {
new_interval = CheckAndUpdateInterval(presentation_time);
}
if (new_interval) {
previous_interval_ = interval_;
interval_ = *new_interval;
NotifyDependentsOnNewInterval(interval_);
interval_has_changed_ = true;
}
}
base::Optional<SMILInterval> SVGSMILElement::CheckAndUpdateInterval(
SMILTime elapsed) {
bool SVGSMILElement::HandleIntervalRestart(SMILTime presentation_time) {
Restart restart = GetRestart();
if (restart == kRestartNever)
return base::nullopt;
if (restart == kRestartAlways && interval_.EndsAfter(elapsed)) {
return false;
if (!interval_.IsResolved() || interval_.EndsBefore(presentation_time))
return true;
if (restart == kRestartAlways) {
SMILTime next_begin = FindInstanceTime(kBegin, interval_.begin, false);
if (interval_.EndsAfter(next_begin)) {
interval_.end = next_begin;
NotifyDependentsOnNewInterval(interval_);
interval_has_changed_ = true;
return interval_.EndsBefore(presentation_time);
}
}
return false;
}
if (interval_.EndsAfter(elapsed))
return base::nullopt;
SMILInterval next_interval = ResolveInterval(interval_.end, elapsed);
void SVGSMILElement::UpdateInterval(SMILTime presentation_time) {
DCHECK(!is_waiting_for_first_interval_);
if (instance_lists_have_changed_) {
instance_lists_have_changed_ = false;
DiscardOrRevalidateCurrentInterval(presentation_time);
}
if (!HandleIntervalRestart(presentation_time))
return;
SMILTime begin_after =
interval_.IsResolved() ? interval_.end : SMILTime::Earliest();
SMILInterval next_interval = ResolveInterval(begin_after, presentation_time);
if (!next_interval.IsResolved() || next_interval == interval_)
return base::nullopt;
return next_interval;
return;
previous_interval_ = interval_;
interval_ = next_interval;
NotifyDependentsOnNewInterval(interval_);
interval_has_changed_ = true;
}
const SMILInterval& SVGSMILElement::GetActiveInterval(SMILTime elapsed) const {
......
......@@ -161,9 +161,9 @@ class CORE_EXPORT SVGSMILElement : public SVGElement, public SVGTests {
SMILInterval ResolveInterval(SMILTime begin_after, SMILTime end_after) const;
bool ResolveFirstInterval();
// Check if the current interval is still current, and if not compute the
// next interval.
base::Optional<SMILInterval> CheckAndUpdateInterval(SMILTime elapsed);
// Check if the current interval is still current, and apply restart
// semantics. Returns true if a new interval should be resolved.
bool HandleIntervalRestart(SMILTime presentation_time);
void DiscardOrRevalidateCurrentInterval(SMILTime presentation_time);
SMILTime ResolveActiveEnd(SMILTime resolved_begin,
SMILTime resolved_end) 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