OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "config.h" | 5 #include "config.h" |
6 | 6 |
7 #if USE(ACCELERATED_COMPOSITING) | 7 #if USE(ACCELERATED_COMPOSITING) |
8 | 8 |
9 #include "CCDamageTracker.h" | 9 #include "CCDamageTracker.h" |
10 | 10 |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 m_currentDamageRect.uniteIfNonZero(damageRectForThisUpdate); | 144 m_currentDamageRect.uniteIfNonZero(damageRectForThisUpdate); |
145 | 145 |
146 // The next history map becomes the current map for the next frame. Note thi
s must | 146 // The next history map becomes the current map for the next frame. Note thi
s must |
147 // happen every frame to correctly track changes, even if damage accumulates
over | 147 // happen every frame to correctly track changes, even if damage accumulates
over |
148 // multiple frames before actually being drawn. | 148 // multiple frames before actually being drawn. |
149 swap(m_currentRectHistory, m_nextRectHistory); | 149 swap(m_currentRectHistory, m_nextRectHistory); |
150 } | 150 } |
151 | 151 |
152 FloatRect CCDamageTracker::removeRectFromCurrentFrame(int layerID, bool& layerIs
New) | 152 FloatRect CCDamageTracker::removeRectFromCurrentFrame(int layerID, bool& layerIs
New) |
153 { | 153 { |
154 layerIsNew = !m_currentRectHistory->contains(layerID); | 154 RectMap::iterator iter = m_currentRectHistory->find(layerID); |
| 155 layerIsNew = iter == m_currentRectHistory->end(); |
| 156 if (layerIsNew) |
| 157 return FloatRect(); |
155 | 158 |
156 // take() will remove the entry from the map, or if not found, return a defa
ult (empty) rect. | 159 FloatRect ret = iter->second; |
157 return m_currentRectHistory->take(layerID); | 160 m_currentRectHistory->erase(iter); |
| 161 return ret; |
158 } | 162 } |
159 | 163 |
160 void CCDamageTracker::saveRectForNextFrame(int layerID, const FloatRect& targetS
paceRect) | 164 void CCDamageTracker::saveRectForNextFrame(int layerID, const FloatRect& targetS
paceRect) |
161 { | 165 { |
162 // This layer should not yet exist in next frame's history. | 166 // This layer should not yet exist in next frame's history. |
163 ASSERT(layerID > 0); | 167 ASSERT(layerID > 0); |
164 ASSERT(m_nextRectHistory->find(layerID) == m_nextRectHistory->end()); | 168 ASSERT(m_nextRectHistory->find(layerID) == m_nextRectHistory->end()); |
165 m_nextRectHistory->set(layerID, targetSpaceRect); | 169 (*m_nextRectHistory)[layerID] = targetSpaceRect; |
166 } | 170 } |
167 | 171 |
168 FloatRect CCDamageTracker::trackDamageFromActiveLayers(const std::vector<CCLayer
Impl*>& layerList, int targetSurfaceLayerID) | 172 FloatRect CCDamageTracker::trackDamageFromActiveLayers(const std::vector<CCLayer
Impl*>& layerList, int targetSurfaceLayerID) |
169 { | 173 { |
170 FloatRect damageRect = FloatRect(); | 174 FloatRect damageRect = FloatRect(); |
171 | 175 |
172 for (unsigned layerIndex = 0; layerIndex < layerList.size(); ++layerIndex) { | 176 for (unsigned layerIndex = 0; layerIndex < layerList.size(); ++layerIndex) { |
173 // Visit layers in back-to-front order. | 177 // Visit layers in back-to-front order. |
174 CCLayerImpl* layer = layerList[layerIndex]; | 178 CCLayerImpl* layer = layerList[layerIndex]; |
175 | 179 |
(...skipping 24 matching lines...) Expand all Loading... |
200 | 204 |
201 FloatRect CCDamageTracker::trackDamageFromLeftoverRects() | 205 FloatRect CCDamageTracker::trackDamageFromLeftoverRects() |
202 { | 206 { |
203 // After computing damage for all active layers, any leftover items in the c
urrent | 207 // After computing damage for all active layers, any leftover items in the c
urrent |
204 // rect history correspond to layers/surfaces that no longer exist. So, thes
e regions | 208 // rect history correspond to layers/surfaces that no longer exist. So, thes
e regions |
205 // are now exposed on the target surface. | 209 // are now exposed on the target surface. |
206 | 210 |
207 FloatRect damageRect = FloatRect(); | 211 FloatRect damageRect = FloatRect(); |
208 | 212 |
209 for (RectMap::iterator it = m_currentRectHistory->begin(); it != m_currentRe
ctHistory->end(); ++it) | 213 for (RectMap::iterator it = m_currentRectHistory->begin(); it != m_currentRe
ctHistory->end(); ++it) |
210 #if WTF_NEW_HASHMAP_ITERATORS_INTERFACE | |
211 damageRect.unite(it->value); | |
212 #else | |
213 damageRect.unite(it->second); | 214 damageRect.unite(it->second); |
214 #endif | |
215 | 215 |
216 m_currentRectHistory->clear(); | 216 m_currentRectHistory->clear(); |
217 | 217 |
218 return damageRect; | 218 return damageRect; |
219 } | 219 } |
220 | 220 |
221 static bool layerNeedsToRedrawOntoItsTargetSurface(CCLayerImpl* layer) | 221 static bool layerNeedsToRedrawOntoItsTargetSurface(CCLayerImpl* layer) |
222 { | 222 { |
223 // If the layer does NOT own a surface but has SurfacePropertyChanged, | 223 // If the layer does NOT own a surface but has SurfacePropertyChanged, |
224 // this means that its target surface is affected and needs to be redrawn. | 224 // this means that its target surface is affected and needs to be redrawn. |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 // at or below this layer. We expand the damage from this layer too, as we n
eed to readback those pixels from the surface with only | 340 // at or below this layer. We expand the damage from this layer too, as we n
eed to readback those pixels from the surface with only |
341 // the contents of layers below this one in them. This means we need to redr
aw any pixels in the surface being used for the blur in | 341 // the contents of layers below this one in them. This means we need to redr
aw any pixels in the surface being used for the blur in |
342 // this layer this frame. | 342 // this layer this frame. |
343 if (layer->backgroundFilters().hasFilterThatMovesPixels()) | 343 if (layer->backgroundFilters().hasFilterThatMovesPixels()) |
344 expandDamageRectInsideRectWithFilters(targetDamageRect, surfaceRectInTar
getSpace, layer->backgroundFilters()); | 344 expandDamageRectInsideRectWithFilters(targetDamageRect, surfaceRectInTar
getSpace, layer->backgroundFilters()); |
345 } | 345 } |
346 | 346 |
347 } // namespace cc | 347 } // namespace cc |
348 | 348 |
349 #endif // USE(ACCELERATED_COMPOSITING) | 349 #endif // USE(ACCELERATED_COMPOSITING) |
OLD | NEW |