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 964 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
975 } | 975 } |
976 } | 976 } |
977 } | 977 } |
978 m_nextProgressTime = elapsed; | 978 m_nextProgressTime = elapsed; |
979 | 979 |
980 if (m_timeContainer) | 980 if (m_timeContainer) |
981 m_timeContainer->notifyIntervalsChanged(); | 981 m_timeContainer->notifyIntervalsChanged(); |
982 } | 982 } |
983 | 983 |
984 SVGSMILElement::RestartedInterval SVGSMILElement::maybeRestartInterval( | 984 SVGSMILElement::RestartedInterval SVGSMILElement::maybeRestartInterval( |
985 SMILTime elapsed) { | 985 double elapsed) { |
986 ASSERT(!m_isWaitingForFirstInterval); | 986 DCHECK(!m_isWaitingForFirstInterval); |
987 ASSERT(elapsed >= m_interval.begin); | 987 DCHECK(elapsed >= m_interval.begin); |
988 | 988 |
989 Restart restart = this->getRestart(); | 989 Restart restart = this->getRestart(); |
990 if (restart == RestartNever) | 990 if (restart == RestartNever) |
991 return DidNotRestartInterval; | 991 return DidNotRestartInterval; |
992 | 992 |
993 if (elapsed < m_interval.end) { | 993 if (elapsed < m_interval.end) { |
994 if (restart != RestartAlways) | 994 if (restart != RestartAlways) |
995 return DidNotRestartInterval; | 995 return DidNotRestartInterval; |
996 SMILTime nextBegin = findInstanceTime(Begin, m_interval.begin, false); | 996 SMILTime nextBegin = findInstanceTime(Begin, m_interval.begin, false); |
997 if (nextBegin < m_interval.end) { | 997 if (nextBegin < m_interval.end) { |
998 m_interval.end = nextBegin; | 998 m_interval.end = nextBegin; |
999 notifyDependentsIntervalChanged(); | 999 notifyDependentsIntervalChanged(); |
1000 } | 1000 } |
1001 } | 1001 } |
1002 | 1002 |
1003 if (elapsed >= m_interval.end) { | 1003 if (elapsed >= m_interval.end) { |
1004 if (resolveNextInterval() && elapsed >= m_interval.begin) | 1004 if (resolveNextInterval() && elapsed >= m_interval.begin) |
1005 return DidRestartInterval; | 1005 return DidRestartInterval; |
1006 } | 1006 } |
1007 return DidNotRestartInterval; | 1007 return DidNotRestartInterval; |
1008 } | 1008 } |
1009 | 1009 |
1010 void SVGSMILElement::seekToIntervalCorrespondingToTime(SMILTime elapsed) { | 1010 void SVGSMILElement::seekToIntervalCorrespondingToTime(double elapsed) { |
1011 ASSERT(!m_isWaitingForFirstInterval); | 1011 DCHECK(!m_isWaitingForFirstInterval); |
1012 ASSERT(elapsed >= m_interval.begin); | 1012 DCHECK(elapsed >= m_interval.begin); |
1013 | 1013 |
1014 // Manually seek from interval to interval, just as if the animation would run | 1014 // Manually seek from interval to interval, just as if the animation would run |
1015 // regulary. | 1015 // regulary. |
1016 while (true) { | 1016 while (true) { |
1017 // Figure out the next value in the begin time list after the current | 1017 // Figure out the next value in the begin time list after the current |
1018 // interval begin. | 1018 // interval begin. |
1019 SMILTime nextBegin = findInstanceTime(Begin, m_interval.begin, false); | 1019 SMILTime nextBegin = findInstanceTime(Begin, m_interval.begin, false); |
1020 | 1020 |
1021 // If the 'nextBegin' time is unresolved (eg. just one defined interval), | 1021 // If the 'nextBegin' time is unresolved (eg. just one defined interval), |
1022 // we're done seeking. | 1022 // we're done seeking. |
(...skipping 18 matching lines...) Expand all Loading... |
1041 if (!resolveNextInterval()) | 1041 if (!resolveNextInterval()) |
1042 break; | 1042 break; |
1043 continue; | 1043 continue; |
1044 } | 1044 } |
1045 | 1045 |
1046 return; | 1046 return; |
1047 } | 1047 } |
1048 } | 1048 } |
1049 | 1049 |
1050 float SVGSMILElement::calculateAnimationPercentAndRepeat( | 1050 float SVGSMILElement::calculateAnimationPercentAndRepeat( |
1051 SMILTime elapsed, | 1051 double elapsed, |
1052 unsigned& repeat) const { | 1052 unsigned& repeat) const { |
1053 SMILTime simpleDuration = this->simpleDuration(); | 1053 SMILTime simpleDuration = this->simpleDuration(); |
1054 repeat = 0; | 1054 repeat = 0; |
1055 if (simpleDuration.isIndefinite()) { | 1055 if (simpleDuration.isIndefinite()) { |
1056 repeat = 0; | 1056 repeat = 0; |
1057 return 0.f; | 1057 return 0.f; |
1058 } | 1058 } |
1059 if (!simpleDuration) { | 1059 if (!simpleDuration) { |
1060 repeat = 0; | 1060 repeat = 0; |
1061 return 1.f; | 1061 return 1.f; |
1062 } | 1062 } |
1063 ASSERT(m_interval.begin.isFinite()); | 1063 DCHECK(m_interval.begin.isFinite()); |
1064 ASSERT(simpleDuration.isFinite()); | 1064 DCHECK(simpleDuration.isFinite()); |
1065 SMILTime activeTime = elapsed - m_interval.begin; | 1065 double activeTime = elapsed - m_interval.begin.value(); |
1066 SMILTime repeatingDuration = this->repeatingDuration(); | 1066 SMILTime repeatingDuration = this->repeatingDuration(); |
1067 if (elapsed >= m_interval.end || activeTime > repeatingDuration) { | 1067 if (elapsed >= m_interval.end || activeTime > repeatingDuration) { |
1068 repeat = static_cast<unsigned>(repeatingDuration.value() / | 1068 repeat = static_cast<unsigned>(repeatingDuration.value() / |
1069 simpleDuration.value()); | 1069 simpleDuration.value()); |
1070 if (!fmod(repeatingDuration.value(), simpleDuration.value())) | 1070 if (!fmod(repeatingDuration.value(), simpleDuration.value())) |
1071 repeat--; | 1071 repeat--; |
1072 | 1072 |
1073 double percent = (m_interval.end.value() - m_interval.begin.value()) / | 1073 double percent = (m_interval.end.value() - m_interval.begin.value()) / |
1074 simpleDuration.value(); | 1074 simpleDuration.value(); |
1075 percent = percent - floor(percent); | 1075 percent = percent - floor(percent); |
1076 if (percent < std::numeric_limits<float>::epsilon() || | 1076 if (percent < std::numeric_limits<float>::epsilon() || |
1077 1 - percent < std::numeric_limits<float>::epsilon()) | 1077 1 - percent < std::numeric_limits<float>::epsilon()) |
1078 return 1.0f; | 1078 return 1.0f; |
1079 return clampTo<float>(percent); | 1079 return clampTo<float>(percent); |
1080 } | 1080 } |
1081 repeat = static_cast<unsigned>(activeTime.value() / simpleDuration.value()); | 1081 repeat = static_cast<unsigned>(activeTime / simpleDuration.value()); |
1082 SMILTime simpleTime = fmod(activeTime.value(), simpleDuration.value()); | 1082 double simpleTime = fmod(activeTime, simpleDuration.value()); |
1083 return clampTo<float>(simpleTime.value() / simpleDuration.value()); | 1083 return clampTo<float>(simpleTime / simpleDuration.value()); |
1084 } | 1084 } |
1085 | 1085 |
1086 SMILTime SVGSMILElement::calculateNextProgressTime(SMILTime elapsed) const { | 1086 SMILTime SVGSMILElement::calculateNextProgressTime(double elapsed) const { |
1087 if (m_activeState == Active) { | 1087 if (m_activeState == Active) { |
1088 // If duration is indefinite the value does not actually change over time. | 1088 // If duration is indefinite the value does not actually change over time. |
1089 // Same is true for <set>. | 1089 // Same is true for <set>. |
1090 SMILTime simpleDuration = this->simpleDuration(); | 1090 SMILTime simpleDuration = this->simpleDuration(); |
1091 if (simpleDuration.isIndefinite() || isSVGSetElement(*this)) { | 1091 if (simpleDuration.isIndefinite() || isSVGSetElement(*this)) { |
1092 SMILTime repeatingDurationEnd = m_interval.begin + repeatingDuration(); | 1092 SMILTime repeatingDurationEnd = m_interval.begin + repeatingDuration(); |
1093 // We are supposed to do freeze semantics when repeating ends, even if the | 1093 // We are supposed to do freeze semantics when repeating ends, even if the |
1094 // element is still active. | 1094 // element is still active. |
1095 // Take care that we get a timer callback at that point. | 1095 // Take care that we get a timer callback at that point. |
1096 if (elapsed < repeatingDurationEnd && | 1096 if (elapsed < repeatingDurationEnd && |
1097 repeatingDurationEnd < m_interval.end && | 1097 repeatingDurationEnd < m_interval.end && |
1098 repeatingDurationEnd.isFinite()) | 1098 repeatingDurationEnd.isFinite()) |
1099 return repeatingDurationEnd; | 1099 return repeatingDurationEnd; |
1100 return m_interval.end; | 1100 return m_interval.end; |
1101 } | 1101 } |
1102 return elapsed + 0.025; | 1102 return elapsed + 0.025; |
1103 } | 1103 } |
1104 return m_interval.begin >= elapsed ? m_interval.begin | 1104 return m_interval.begin >= elapsed ? m_interval.begin |
1105 : SMILTime::unresolved(); | 1105 : SMILTime::unresolved(); |
1106 } | 1106 } |
1107 | 1107 |
1108 SVGSMILElement::ActiveState SVGSMILElement::determineActiveState( | 1108 SVGSMILElement::ActiveState SVGSMILElement::determineActiveState( |
1109 SMILTime elapsed) const { | 1109 SMILTime elapsed) const { |
1110 if (elapsed >= m_interval.begin && elapsed < m_interval.end) | 1110 if (elapsed >= m_interval.begin && elapsed < m_interval.end) |
1111 return Active; | 1111 return Active; |
1112 | 1112 |
1113 return fill() == FillFreeze ? Frozen : Inactive; | 1113 return fill() == FillFreeze ? Frozen : Inactive; |
1114 } | 1114 } |
1115 | 1115 |
1116 bool SVGSMILElement::isContributing(SMILTime elapsed) const { | 1116 bool SVGSMILElement::isContributing(double elapsed) const { |
1117 // Animation does not contribute during the active time if it is past its | 1117 // Animation does not contribute during the active time if it is past its |
1118 // repeating duration and has fill=remove. | 1118 // repeating duration and has fill=remove. |
1119 return (m_activeState == Active && | 1119 return (m_activeState == Active && |
1120 (fill() == FillFreeze || | 1120 (fill() == FillFreeze || |
1121 elapsed <= m_interval.begin + repeatingDuration())) || | 1121 elapsed <= m_interval.begin + repeatingDuration())) || |
1122 m_activeState == Frozen; | 1122 m_activeState == Frozen; |
1123 } | 1123 } |
1124 | 1124 |
1125 bool SVGSMILElement::progress(SMILTime elapsed, bool seekToTime) { | 1125 bool SVGSMILElement::progress(double elapsed, bool seekToTime) { |
1126 ASSERT(m_timeContainer); | 1126 ASSERT(m_timeContainer); |
1127 ASSERT(m_isWaitingForFirstInterval || m_interval.begin.isFinite()); | 1127 ASSERT(m_isWaitingForFirstInterval || m_interval.begin.isFinite()); |
1128 | 1128 |
1129 if (!m_syncBaseConditionsConnected) | 1129 if (!m_syncBaseConditionsConnected) |
1130 connectSyncBaseConditions(); | 1130 connectSyncBaseConditions(); |
1131 | 1131 |
1132 if (!m_interval.begin.isFinite()) { | 1132 if (!m_interval.begin.isFinite()) { |
1133 ASSERT(m_activeState == Inactive); | 1133 ASSERT(m_activeState == Inactive); |
1134 m_nextProgressTime = SMILTime::unresolved(); | 1134 m_nextProgressTime = SMILTime::unresolved(); |
1135 return false; | 1135 return false; |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1352 DEFINE_TRACE(SVGSMILElement) { | 1352 DEFINE_TRACE(SVGSMILElement) { |
1353 visitor->trace(m_targetElement); | 1353 visitor->trace(m_targetElement); |
1354 visitor->trace(m_timeContainer); | 1354 visitor->trace(m_timeContainer); |
1355 visitor->trace(m_conditions); | 1355 visitor->trace(m_conditions); |
1356 visitor->trace(m_syncBaseDependents); | 1356 visitor->trace(m_syncBaseDependents); |
1357 SVGElement::trace(visitor); | 1357 SVGElement::trace(visitor); |
1358 SVGTests::trace(visitor); | 1358 SVGTests::trace(visitor); |
1359 } | 1359 } |
1360 | 1360 |
1361 } // namespace blink | 1361 } // namespace blink |
OLD | NEW |