in batik-anim/src/main/java/org/apache/batik/anim/timing/TimedElement.java [897:1028]
protected Interval computeInterval(boolean first, boolean fixedBegin,
float beginAfter, boolean incl) {
// Trace.enter(this, "computeInterval", new Object[] { new Boolean(first), new Boolean(fixedBegin), Float.valueOf(beginAfter)} ); try {
// Trace.print("computing interval from begins=" + beginInstanceTimes + ", ends=" + endInstanceTimes);
Iterator beginIterator = beginInstanceTimes.iterator();
Iterator endIterator = endInstanceTimes.iterator();
float parentSimpleDur = parent.getSimpleDur();
InstanceTime endInstanceTime = endIterator.hasNext()
? (InstanceTime) endIterator.next()
: null;
boolean firstEnd = true;
InstanceTime beginInstanceTime = null;
InstanceTime nextBeginInstanceTime = null;
for (;;) {
float tempBegin;
if (fixedBegin) {
tempBegin = beginAfter;
while (beginIterator.hasNext()) {
nextBeginInstanceTime = (InstanceTime) beginIterator.next();
if (nextBeginInstanceTime.getTime() > tempBegin) {
break;
}
}
} else {
for (;;) {
if (!beginIterator.hasNext()) {
// ran out of begin values
// Trace.print("returning null interval");
return null;
}
beginInstanceTime = (InstanceTime) beginIterator.next();
tempBegin = beginInstanceTime.getTime();
if (incl && tempBegin >= beginAfter
|| !incl && tempBegin > beginAfter) {
if (beginIterator.hasNext()) {
nextBeginInstanceTime =
(InstanceTime) beginIterator.next();
if (beginInstanceTime.getTime()
== nextBeginInstanceTime.getTime()) {
// XXX Not sure if this is exactly correct to
// skip past these identical times, but it
// avoids an infinite loop of 0s intervals
// being created.
nextBeginInstanceTime = null;
continue;
}
}
break;
}
}
}
if (tempBegin >= parentSimpleDur) {
// the begin value is after the parent has ended
// Trace.print("returning null interval");
return null;
}
float tempEnd;
if (endTimes.length == 0) {
// no 'end' attribute specified
tempEnd = tempBegin + getActiveDur(tempBegin, INDEFINITE);
// Trace.print("no end specified, so tempEnd = " + tempEnd);
} else {
if (endInstanceTimes.isEmpty()) {
tempEnd = UNRESOLVED;
} else {
tempEnd = endInstanceTime.getTime();
if (first && !firstEnd && tempEnd == tempBegin
|| !first && currentInterval != null
&& tempEnd == currentInterval.getEnd()
&& (incl && beginAfter >= tempEnd
|| !incl && beginAfter > tempEnd)) {
for (;;) {
if (!endIterator.hasNext()) {
if (endHasEventConditions()) {
tempEnd = UNRESOLVED;
break;
}
// Trace.print("returning null interval");
return null;
}
endInstanceTime = (InstanceTime) endIterator.next();
tempEnd = endInstanceTime.getTime();
if (tempEnd > tempBegin) {
break;
}
}
}
firstEnd = false;
for (;;) {
if (tempEnd >= tempBegin) {
break;
}
if (!endIterator.hasNext()) {
if (endHasEventConditions()) {
tempEnd = UNRESOLVED;
break;
}
// Trace.print("returning null interval");
return null;
}
endInstanceTime = (InstanceTime) endIterator.next();
tempEnd = endInstanceTime.getTime();
}
}
float ad = getActiveDur(tempBegin, tempEnd);
tempEnd = tempBegin + ad;
}
if (!first || tempEnd > 0 || tempBegin == 0 && tempEnd == 0
|| isUnresolved(tempEnd)) {
// Trace.print("considering restart semantics");
if (restartMode == RESTART_ALWAYS
&& nextBeginInstanceTime != null) {
float nextBegin = nextBeginInstanceTime.getTime();
// Trace.print("nextBegin == " + nextBegin);
if (nextBegin < tempEnd || isUnresolved(tempEnd)) {
tempEnd = nextBegin;
endInstanceTime = nextBeginInstanceTime;
}
}
Interval i = new Interval(tempBegin, tempEnd,
beginInstanceTime, endInstanceTime);
// Trace.print("returning interval: " + i);
return i;
}
if (fixedBegin) {
// Trace.print("returning null interval");
return null;
}
beginAfter = tempEnd;
}
// } finally { Trace.exit(); }
}