Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1540)

Unified Diff: Source/core/svg/animation/SVGSMILElement.cpp

Issue 478273002: Use NaN/Inf to represent unresolved/indefinite SMILTimes (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fix regression. Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/svg/animation/SVGSMILElement.cpp
diff --git a/Source/core/svg/animation/SVGSMILElement.cpp b/Source/core/svg/animation/SVGSMILElement.cpp
index aaa39d929f2665b29e14044bda8185c54b06e170..9f7aa230d04542fe3415eb1eca898ed0dadca48e 100644
--- a/Source/core/svg/animation/SVGSMILElement.cpp
+++ b/Source/core/svg/animation/SVGSMILElement.cpp
@@ -491,15 +491,17 @@ void SVGSMILElement::parseBeginOrEnd(const String& parseString, BeginOrEnd begin
if (beginOrEnd == End)
m_hasEndEventConditions = false;
HashSet<double> existing;
- for (unsigned n = 0; n < timeList.size(); ++n)
- existing.add(timeList[n].time().value());
+ for (unsigned n = 0; n < timeList.size(); ++n) {
+ if (timeList[n].time().isFinite())
fs 2014/08/19 21:49:43 Could this be isUnresolved instead? I.e. I don't s
reni 2014/08/21 14:20:06 Done.
+ existing.add(timeList[n].time().value());
+ }
Vector<String> splitString;
parseString.split(';', splitString);
for (unsigned n = 0; n < splitString.size(); ++n) {
SMILTime value = parseClockValue(splitString[n]);
if (value.isUnresolved())
parseCondition(splitString[n], beginOrEnd);
- else if (!existing.contains(value.value()))
+ else if (value.isFinite() && !existing.contains(value.value()))
fs 2014/08/19 21:49:44 I think 'indefinite' is [sometimes] valid here, so
reni 2014/08/21 14:20:06 HashSet can really contain Inf value without conse
fs 2014/08/21 15:30:39 Ok. I noticed: static T emptyValue() { return
reni 2014/08/21 20:52:31 I agree with =/, but done :)
timeList.append(SMILTimeWithOrigin(value, SMILTimeWithOrigin::ParserOrigin));
}
sortTimeList(timeList);
@@ -801,12 +803,14 @@ SMILTime SVGSMILElement::minValue() const
SMILTime SVGSMILElement::simpleDuration() const
{
- return std::min(dur(), SMILTime::indefinite());
+ SMILTime duration = dur();
+ return duration.isUnresolved() ? SMILTime::indefinite() : duration;
fs 2014/08/19 21:49:44 I think this could've been left as min(), but mayb
reni 2014/08/21 14:20:06 Done.
}
void SVGSMILElement::addBeginTime(SMILTime eventTime, SMILTime beginTime, SMILTimeWithOrigin::Origin origin)
{
- ASSERT(!std::isnan(beginTime.value()));
+ if (!beginTime.isFinite())
fs 2014/08/19 21:49:43 Could we drop this (and the below) back to asserts
reni 2014/08/21 14:20:06 I set them back to asserts. However, are we sure t
fs 2014/08/21 15:30:39 If nothing else, they serve to communicate the pre
reni 2014/08/21 20:52:31 They are dropped.
+ return;
m_beginTimes.append(SMILTimeWithOrigin(beginTime, origin));
sortTimeList(m_beginTimes);
beginListChanged(eventTime);
@@ -814,7 +818,8 @@ void SVGSMILElement::addBeginTime(SMILTime eventTime, SMILTime beginTime, SMILTi
void SVGSMILElement::addEndTime(SMILTime eventTime, SMILTime endTime, SMILTimeWithOrigin::Origin origin)
{
- ASSERT(!std::isnan(endTime.value()));
+ if (!endTime.isFinite())
+ return;
m_endTimes.append(SMILTimeWithOrigin(endTime, origin));
sortTimeList(m_endTimes);
endListChanged(eventTime);
@@ -873,6 +878,8 @@ SMILTime SVGSMILElement::repeatingDuration() const
if (!simpleDuration || (repeatDur.isUnresolved() && repeatCount.isUnresolved()))
return simpleDuration;
SMILTime repeatCountDuration = simpleDuration * repeatCount;
+ if (repeatCountDuration.isUnresolved())
+ return std::min(repeatDur, SMILTime::indefinite());
fs 2014/08/19 21:49:44 This would probably look more obvious if the min(r
reni 2014/08/21 14:20:07 Done.
return std::min(repeatCountDuration, std::min(repeatDur, SMILTime::indefinite()));
}
@@ -896,7 +903,7 @@ SMILTime SVGSMILElement::resolveActiveEnd(SMILTime resolvedBegin, SMILTime resol
minValue = 0;
maxValue = SMILTime::indefinite();
}
- return resolvedBegin + std::min(maxValue, std::max(minValue, preliminaryActiveDuration));
+ return resolvedBegin + (preliminaryActiveDuration.isUnresolved() ? preliminaryActiveDuration : std::max(minValue, preliminaryActiveDuration));
fs 2014/08/19 21:49:44 Looks like maxValue disappeared? Also, if |prelimi
reni 2014/08/21 14:20:07 Done.
}
SMILInterval SVGSMILElement::resolveInterval(ResolveInterval resolveIntervalType) const
@@ -940,7 +947,7 @@ void SVGSMILElement::resolveFirstInterval()
if (!firstInterval.begin.isUnresolved() && firstInterval != m_interval) {
m_interval = firstInterval;
notifyDependentsIntervalChanged();
- m_nextProgressTime = std::min(m_nextProgressTime, m_interval.begin);
+ m_nextProgressTime = m_nextProgressTime.isUnresolved() ? m_interval.begin : std::min(m_nextProgressTime, m_interval.begin);
if (m_timeContainer)
m_timeContainer->notifyIntervalsChanged();
@@ -955,7 +962,7 @@ bool SVGSMILElement::resolveNextInterval()
if (!nextInterval.begin.isUnresolved() && nextInterval.begin != m_interval.begin) {
m_interval = nextInterval;
notifyDependentsIntervalChanged();
- m_nextProgressTime = std::min(m_nextProgressTime, m_interval.begin);
+ m_nextProgressTime = m_nextProgressTime.isUnresolved() ? m_interval.begin : std::min(m_nextProgressTime, m_interval.begin);
return true;
}
« Source/core/svg/animation/SMILTime.cpp ('K') | « Source/core/svg/animation/SMILTime.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698