OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2007, 2012 Apple Inc. All rights reserved. | 2 * Copyright (C) 2007, 2012 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 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
90 | 90 |
91 const double fractionalTime = this->fractionalTime(1, elapsedTime, 0); | 91 const double fractionalTime = this->fractionalTime(1, elapsedTime, 0); |
92 | 92 |
93 size_t numKeyframes = m_keyframes.size(); | 93 size_t numKeyframes = m_keyframes.size(); |
94 if (!numKeyframes) | 94 if (!numKeyframes) |
95 return; | 95 return; |
96 | 96 |
97 ASSERT(!m_keyframes[0].key()); | 97 ASSERT(!m_keyframes[0].key()); |
98 ASSERT(m_keyframes[m_keyframes.size() - 1].key() == 1); | 98 ASSERT(m_keyframes[m_keyframes.size() - 1].key() == 1); |
99 | 99 |
100 size_t currentIndex = 0; | |
101 size_t firstIndex = 0; | |
102 size_t lastIndex = numKeyframes - 1; | |
103 size_t distance = numKeyframes; | |
104 | |
105 // Find keyframe that is closest to elapsed time. | |
106 while (distance > 1) { | |
107 currentIndex = (lastIndex + firstIndex) >> 1; | |
108 float key = m_keyframes[currentIndex].key(); | |
109 distance = lastIndex - currentIndex; | |
110 | |
111 if (key == fractionalTime) | |
apavlov
2013/04/22 14:23:02
I think this will _rarely_ be true, as you are com
| |
112 break; | |
113 | |
114 if (key < fractionalTime) { | |
115 if (distance < 2) | |
116 currentIndex++; | |
117 firstIndex = currentIndex; | |
118 } else | |
119 lastIndex = currentIndex; | |
120 } | |
121 | |
100 int prevIndex = -1; | 122 int prevIndex = -1; |
101 int nextIndex = -1; | 123 int nextIndex = -1; |
102 | |
103 // FIXME: with a lot of keys, this linear search will be slow. We could bina ry search. | |
104 for (size_t i = 0; i < numKeyframes; ++i) { | |
105 const KeyframeValue& currKeyFrame = m_keyframes[i]; | |
106 | 124 |
107 if (!currKeyFrame.containsProperty(property)) | 125 // Interate forward to find next keyframe that is used to animate CSS proper ty. |
108 continue; | 126 for (size_t i = currentIndex; i < numKeyframes; ++i) { |
109 | 127 const KeyframeValue& keyFrame = m_keyframes[i]; |
110 if (fractionalTime < currKeyFrame.key()) { | 128 if (keyFrame.containsProperty(property) && keyFrame.key() > fractionalTi me) { |
111 nextIndex = i; | 129 nextIndex = i; |
112 break; | 130 break; |
113 } | 131 } |
114 | 132 } |
115 prevIndex = i; | 133 |
134 // Interate backward to find previous keyframe. | |
135 for (size_t i = currentIndex; i < numKeyframes; --i) { | |
apavlov
2013/04/22 14:23:02
The condition should definitely be "i >= 0"
| |
136 const KeyframeValue& keyFrame = m_keyframes[i]; | |
137 if (keyFrame.containsProperty(property) && keyFrame.key() <= fractionalT ime) { | |
138 prevIndex = i; | |
139 break; | |
140 } | |
116 } | 141 } |
117 | 142 |
118 double scale = 1; | 143 double scale = 1; |
119 double offset = 0; | 144 double offset = 0; |
120 | 145 |
121 if (prevIndex == -1) | 146 if (prevIndex == -1) |
122 prevIndex = 0; | 147 prevIndex = 0; |
123 | 148 |
124 if (nextIndex == -1) | 149 if (nextIndex == -1) |
125 nextIndex = m_keyframes.size() - 1; | 150 nextIndex = m_keyframes.size() - 1; |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
444 | 469 |
445 if (acceleratedPropertiesOnly) { | 470 if (acceleratedPropertiesOnly) { |
446 bool isLooping; | 471 bool isLooping; |
447 getTimeToNextEvent(t, isLooping); | 472 getTimeToNextEvent(t, isLooping); |
448 } | 473 } |
449 | 474 |
450 return t; | 475 return t; |
451 } | 476 } |
452 | 477 |
453 } // namespace WebCore | 478 } // namespace WebCore |
OLD | NEW |