OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2008 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 1105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1116 | 1116 |
1117 return fill() == FillFreeze ? Frozen : Inactive; | 1117 return fill() == FillFreeze ? Frozen : Inactive; |
1118 } | 1118 } |
1119 | 1119 |
1120 bool SVGSMILElement::isContributing(SMILTime elapsed) const | 1120 bool SVGSMILElement::isContributing(SMILTime elapsed) const |
1121 { | 1121 { |
1122 // Animation does not contribute during the active time if it is past its re
peating duration and has fill=remove. | 1122 // Animation does not contribute during the active time if it is past its re
peating duration and has fill=remove. |
1123 return (m_activeState == Active && (fill() == FillFreeze || elapsed <= m_int
erval.begin + repeatingDuration())) || m_activeState == Frozen; | 1123 return (m_activeState == Active && (fill() == FillFreeze || elapsed <= m_int
erval.begin + repeatingDuration())) || m_activeState == Frozen; |
1124 } | 1124 } |
1125 | 1125 |
1126 bool SVGSMILElement::progress(SMILTime elapsed, SVGSMILElement* resultElement, b
ool seekToTime) | 1126 bool SVGSMILElement::progress(SMILTime elapsed, bool seekToTime) |
1127 { | 1127 { |
1128 ASSERT(resultElement); | |
1129 ASSERT(m_timeContainer); | 1128 ASSERT(m_timeContainer); |
1130 ASSERT(m_isWaitingForFirstInterval || m_interval.begin.isFinite()); | 1129 ASSERT(m_isWaitingForFirstInterval || m_interval.begin.isFinite()); |
1131 | 1130 |
1132 if (!m_syncBaseConditionsConnected) | 1131 if (!m_syncBaseConditionsConnected) |
1133 connectSyncBaseConditions(); | 1132 connectSyncBaseConditions(); |
1134 | 1133 |
1135 if (!m_interval.begin.isFinite()) { | 1134 if (!m_interval.begin.isFinite()) { |
1136 ASSERT(m_activeState == Inactive); | 1135 ASSERT(m_activeState == Inactive); |
1137 m_nextProgressTime = SMILTime::unresolved(); | 1136 m_nextProgressTime = SMILTime::unresolved(); |
1138 return false; | 1137 return false; |
1139 } | 1138 } |
1140 | 1139 |
1141 if (elapsed < m_interval.begin) { | 1140 if (elapsed < m_interval.begin) { |
1142 ASSERT(m_activeState != Active); | 1141 ASSERT(m_activeState != Active); |
1143 bool isFrozen = (m_activeState == Frozen); | |
1144 if (isFrozen) { | |
1145 if (this == resultElement) | |
1146 resetAnimatedType(); | |
1147 updateAnimation(m_lastPercent, m_lastRepeat, resultElement); | |
1148 } | |
1149 m_nextProgressTime = m_interval.begin; | 1142 m_nextProgressTime = m_interval.begin; |
1150 // If the animation is frozen, it's still contributing. | 1143 // If the animation is frozen, it's still contributing. |
1151 return isFrozen; | 1144 return m_activeState == Frozen; |
1152 } | 1145 } |
1153 | 1146 |
1154 m_previousIntervalBegin = m_interval.begin; | 1147 m_previousIntervalBegin = m_interval.begin; |
1155 | 1148 |
1156 if (m_isWaitingForFirstInterval) { | 1149 if (m_isWaitingForFirstInterval) { |
1157 m_isWaitingForFirstInterval = false; | 1150 m_isWaitingForFirstInterval = false; |
1158 resolveFirstInterval(); | 1151 resolveFirstInterval(); |
1159 } | 1152 } |
1160 | 1153 |
1161 // This call may obtain a new interval -- never call calculateAnimationPerce
ntAndRepeat() before! | 1154 // This call may obtain a new interval -- never call calculateAnimationPerce
ntAndRepeat() before! |
1162 if (seekToTime) { | 1155 if (seekToTime) { |
1163 seekToIntervalCorrespondingToTime(elapsed); | 1156 seekToIntervalCorrespondingToTime(elapsed); |
1164 if (elapsed < m_interval.begin) { | 1157 if (elapsed < m_interval.begin) { |
1165 // elapsed is not within an interval. | 1158 // elapsed is not within an interval. |
1166 m_nextProgressTime = m_interval.begin; | 1159 m_nextProgressTime = m_interval.begin; |
1167 return false; | 1160 return false; |
1168 } | 1161 } |
1169 } | 1162 } |
1170 | 1163 |
1171 unsigned repeat = 0; | 1164 unsigned repeat = 0; |
1172 float percent = calculateAnimationPercentAndRepeat(elapsed, repeat); | 1165 float percent = calculateAnimationPercentAndRepeat(elapsed, repeat); |
1173 RestartedInterval restartedInterval = maybeRestartInterval(elapsed); | 1166 RestartedInterval restartedInterval = maybeRestartInterval(elapsed); |
1174 | 1167 |
1175 ActiveState oldActiveState = m_activeState; | 1168 ActiveState oldActiveState = m_activeState; |
1176 m_activeState = determineActiveState(elapsed); | 1169 m_activeState = determineActiveState(elapsed); |
1177 bool animationIsContributing = isContributing(elapsed); | 1170 bool animationIsContributing = isContributing(elapsed); |
1178 | 1171 |
1179 // Only reset the animated type to the base value once for the lowest priori
ty animation that animates and contributes to a particular element/attribute pai
r. | |
1180 if (this == resultElement && animationIsContributing) | |
1181 resetAnimatedType(); | |
1182 | |
1183 if (animationIsContributing) { | 1172 if (animationIsContributing) { |
1184 if (oldActiveState == Inactive || restartedInterval == DidRestartInterva
l) { | 1173 if (oldActiveState == Inactive || restartedInterval == DidRestartInterva
l) { |
1185 smilBeginEventSender().dispatchEventSoon(this); | 1174 smilBeginEventSender().dispatchEventSoon(this); |
1186 startedActiveInterval(); | 1175 startedActiveInterval(); |
1187 } | 1176 } |
1188 | 1177 |
1189 if (repeat && repeat != m_lastRepeat) | 1178 if (repeat && repeat != m_lastRepeat) |
1190 dispatchRepeatEvents(repeat); | 1179 dispatchRepeatEvents(repeat); |
1191 | 1180 |
1192 updateAnimation(percent, repeat, resultElement); | |
1193 m_lastPercent = percent; | 1181 m_lastPercent = percent; |
1194 m_lastRepeat = repeat; | 1182 m_lastRepeat = repeat; |
1195 } | 1183 } |
1196 | 1184 |
1197 if ((oldActiveState == Active && m_activeState != Active) || restartedInterv
al == DidRestartInterval) { | 1185 if ((oldActiveState == Active && m_activeState != Active) || restartedInterv
al == DidRestartInterval) { |
1198 smilEndEventSender().dispatchEventSoon(this); | 1186 smilEndEventSender().dispatchEventSoon(this); |
1199 endedActiveInterval(); | 1187 endedActiveInterval(); |
1200 } | 1188 } |
1201 | 1189 |
1202 // Triggering all the pending events if the animation timeline is changed. | 1190 // Triggering all the pending events if the animation timeline is changed. |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1361 { | 1349 { |
1362 visitor->trace(m_targetElement); | 1350 visitor->trace(m_targetElement); |
1363 visitor->trace(m_timeContainer); | 1351 visitor->trace(m_timeContainer); |
1364 visitor->trace(m_conditions); | 1352 visitor->trace(m_conditions); |
1365 visitor->trace(m_syncBaseDependents); | 1353 visitor->trace(m_syncBaseDependents); |
1366 SVGElement::trace(visitor); | 1354 SVGElement::trace(visitor); |
1367 SVGTests::trace(visitor); | 1355 SVGTests::trace(visitor); |
1368 } | 1356 } |
1369 | 1357 |
1370 } // namespace blink | 1358 } // namespace blink |
OLD | NEW |