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( ...@@ -904,48 +904,40 @@ void SVGSMILElement::DiscardOrRevalidateCurrentInterval(
} }
} }
void SVGSMILElement::UpdateInterval(SMILTime presentation_time) { bool SVGSMILElement::HandleIntervalRestart(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) {
Restart restart = GetRestart(); Restart restart = GetRestart();
if (restart == kRestartNever) if (restart == kRestartNever)
return base::nullopt; return false;
if (!interval_.IsResolved() || interval_.EndsBefore(presentation_time))
if (restart == kRestartAlways && interval_.EndsAfter(elapsed)) { return true;
if (restart == kRestartAlways) {
SMILTime next_begin = FindInstanceTime(kBegin, interval_.begin, false); SMILTime next_begin = FindInstanceTime(kBegin, interval_.begin, false);
if (interval_.EndsAfter(next_begin)) { if (interval_.EndsAfter(next_begin)) {
interval_.end = next_begin; interval_.end = next_begin;
NotifyDependentsOnNewInterval(interval_); NotifyDependentsOnNewInterval(interval_);
interval_has_changed_ = true; return interval_.EndsBefore(presentation_time);
} }
} }
return false;
}
if (interval_.EndsAfter(elapsed)) void SVGSMILElement::UpdateInterval(SMILTime presentation_time) {
return base::nullopt; DCHECK(!is_waiting_for_first_interval_);
if (instance_lists_have_changed_) {
SMILInterval next_interval = ResolveInterval(interval_.end, elapsed); 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_) if (!next_interval.IsResolved() || next_interval == interval_)
return base::nullopt; return;
return next_interval; previous_interval_ = interval_;
interval_ = next_interval;
NotifyDependentsOnNewInterval(interval_);
interval_has_changed_ = true;
} }
const SMILInterval& SVGSMILElement::GetActiveInterval(SMILTime elapsed) const { const SMILInterval& SVGSMILElement::GetActiveInterval(SMILTime elapsed) const {
......
...@@ -161,9 +161,9 @@ class CORE_EXPORT SVGSMILElement : public SVGElement, public SVGTests { ...@@ -161,9 +161,9 @@ class CORE_EXPORT SVGSMILElement : public SVGElement, public SVGTests {
SMILInterval ResolveInterval(SMILTime begin_after, SMILTime end_after) const; SMILInterval ResolveInterval(SMILTime begin_after, SMILTime end_after) const;
bool ResolveFirstInterval(); bool ResolveFirstInterval();
// Check if the current interval is still current, and if not compute the // Check if the current interval is still current, and apply restart
// next interval. // semantics. Returns true if a new interval should be resolved.
base::Optional<SMILInterval> CheckAndUpdateInterval(SMILTime elapsed); bool HandleIntervalRestart(SMILTime presentation_time);
void DiscardOrRevalidateCurrentInterval(SMILTime presentation_time); void DiscardOrRevalidateCurrentInterval(SMILTime presentation_time);
SMILTime ResolveActiveEnd(SMILTime resolved_begin, SMILTime ResolveActiveEnd(SMILTime resolved_begin,
SMILTime resolved_end) const; 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