Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(320)

Side by Side Diff: Source/platform/graphics/paint/DisplayItemList.cpp

Issue 1287863003: Avoid re-iterate out-of-order display items (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/platform/graphics/paint/DisplayItemList.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 #include "platform/graphics/paint/DisplayItemList.h" 6 #include "platform/graphics/paint/DisplayItemList.h"
7 7
8 #include "platform/NotImplemented.h" 8 #include "platform/NotImplemented.h"
9 #include "platform/RuntimeEnabledFeatures.h" 9 #include "platform/RuntimeEnabledFeatures.h"
10 #include "platform/TraceEvent.h" 10 #include "platform/TraceEvent.h"
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 size_t DisplayItemList::findMatchingItemFromIndex(const DisplayItem::Id& id, con st DisplayItemIndicesByClientMap& displayItemIndicesByClient, const DisplayItems & list) 142 size_t DisplayItemList::findMatchingItemFromIndex(const DisplayItem::Id& id, con st DisplayItemIndicesByClientMap& displayItemIndicesByClient, const DisplayItems & list)
143 { 143 {
144 DisplayItemIndicesByClientMap::const_iterator it = displayItemIndicesByClien t.find(id.client); 144 DisplayItemIndicesByClientMap::const_iterator it = displayItemIndicesByClien t.find(id.client);
145 if (it == displayItemIndicesByClient.end()) 145 if (it == displayItemIndicesByClient.end())
146 return kNotFound; 146 return kNotFound;
147 147
148 const Vector<size_t>& indices = it->value; 148 const Vector<size_t>& indices = it->value;
149 for (size_t index : indices) { 149 for (size_t index : indices) {
150 // TODO(pdr): elementAt is not cheap so this should be refactored (See c rbug.com/505965). 150 // TODO(pdr): elementAt is not cheap so this should be refactored (See c rbug.com/505965).
151 const DisplayItem& existingItem = list[index]; 151 const DisplayItem& existingItem = list[index];
152 ASSERT(existingItem.ignoreFromDisplayList() || existingItem.client() == id.client); 152 ASSERT(!existingItem.isValid() || existingItem.client() == id.client);
153 if (!existingItem.ignoreFromDisplayList() && id.matches(existingItem)) 153 if (existingItem.isValid() && id.matches(existingItem))
154 return index; 154 return index;
155 } 155 }
156 156
157 return kNotFound; 157 return kNotFound;
158 } 158 }
159 159
160 void DisplayItemList::addItemToIndexIfNeeded(const DisplayItem& displayItem, siz e_t index, DisplayItemIndicesByClientMap& displayItemIndicesByClient) 160 void DisplayItemList::addItemToIndexIfNeeded(const DisplayItem& displayItem, siz e_t index, DisplayItemIndicesByClientMap& displayItemIndicesByClient)
161 { 161 {
162 if (!displayItem.isCacheable()) 162 if (!displayItem.isCacheable())
163 return; 163 return;
164 164
165 DisplayItemIndicesByClientMap::iterator it = displayItemIndicesByClient.find (displayItem.client()); 165 DisplayItemIndicesByClientMap::iterator it = displayItemIndicesByClient.find (displayItem.client());
166 Vector<size_t>& indices = it == displayItemIndicesByClient.end() ? 166 Vector<size_t>& indices = it == displayItemIndicesByClient.end() ?
167 displayItemIndicesByClient.add(displayItem.client(), Vector<size_t>()).s toredValue->value : it->value; 167 displayItemIndicesByClient.add(displayItem.client(), Vector<size_t>()).s toredValue->value : it->value;
168 indices.append(index); 168 indices.append(index);
169 } 169 }
170 170
171 DisplayItems::iterator DisplayItemList::findOutOfOrderCachedItem(DisplayItems::i terator currentIt, const DisplayItem::Id& id, DisplayItemIndicesByClientMap& dis playItemIndicesByClient) 171 struct DisplayItemList::OutOfOrderIndexContext {
172 OutOfOrderIndexContext(DisplayItems::iterator begin) : nextItemToIndex(begin ) { }
173
174 DisplayItems::iterator nextItemToIndex;
175 DisplayItemIndicesByClientMap displayItemIndicesByClient;
176 };
177
178 DisplayItems::iterator DisplayItemList::findOutOfOrderCachedItem(DisplayItems::i terator currentIt, const DisplayItem::Id& id, OutOfOrderIndexContext& context)
172 { 179 {
173 ASSERT(clientCacheIsValid(id.client)); 180 ASSERT(clientCacheIsValid(id.client));
174 181
175 size_t foundIndex = findMatchingItemFromIndex(id, displayItemIndicesByClient , m_currentDisplayItems); 182 // Skip indexing of copied items.
183 if (currentIt - context.nextItemToIndex > 0)
184 context.nextItemToIndex = currentIt;
185
186 size_t foundIndex = findMatchingItemFromIndex(id, context.displayItemIndices ByClient, m_currentDisplayItems);
176 if (foundIndex != kNotFound) 187 if (foundIndex != kNotFound)
177 return m_currentDisplayItems.begin() + foundIndex; 188 return m_currentDisplayItems.begin() + foundIndex;
178 189
179 return findOutOfOrderCachedItemForward(currentIt, id, displayItemIndicesByCl ient); 190 return findOutOfOrderCachedItemForward(id, context);
180 } 191 }
181 192
182 // Find forward for the item and index all skipped indexable items. 193 // Find forward for the item and index all skipped indexable items.
183 DisplayItems::iterator DisplayItemList::findOutOfOrderCachedItemForward(DisplayI tems::iterator currentIt, const DisplayItem::Id& id, DisplayItemIndicesByClientM ap& displayItemIndicesByClient) 194 DisplayItems::iterator DisplayItemList::findOutOfOrderCachedItemForward(const Di splayItem::Id& id, OutOfOrderIndexContext& context)
184 { 195 {
185 DisplayItems::iterator currentEnd = m_currentDisplayItems.end(); 196 DisplayItems::iterator currentEnd = m_currentDisplayItems.end();
186 for (; currentIt != currentEnd; ++currentIt) { 197 for (; context.nextItemToIndex != currentEnd; ++context.nextItemToIndex) {
187 const DisplayItem& item = *currentIt; 198 const DisplayItem& item = *context.nextItemToIndex;
188 if (!item.ignoreFromDisplayList() 199 ASSERT(item.isValid());
189 && item.isCacheable() 200 if (item.isCacheable() && clientCacheIsValid(item.client())) {
190 && m_validlyCachedClients.contains(item.client())) {
191 if (id.matches(item)) 201 if (id.matches(item))
192 return currentIt; 202 return context.nextItemToIndex++;
193 203
194 addItemToIndexIfNeeded(item, currentIt - m_currentDisplayItems.begin (), displayItemIndicesByClient); 204 addItemToIndexIfNeeded(item, context.nextItemToIndex - m_currentDisp layItems.begin(), context.displayItemIndicesByClient);
195 } 205 }
196 } 206 }
197 return currentEnd; 207 return currentEnd;
198 } 208 }
199 209
200 void DisplayItemList::copyCachedSubtree(DisplayItems::iterator& currentIt, Displ ayItems& updatedList) 210 void DisplayItemList::copyCachedSubtree(DisplayItems::iterator& currentIt, Displ ayItems& updatedList)
201 { 211 {
202 ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled()); 212 ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled());
203 ASSERT(currentIt->isBeginSubtree()); 213 ASSERT(currentIt->isBeginSubtree());
204 ASSERT(!currentIt->scope()); 214 ASSERT(!currentIt->scope());
205 DisplayItem::Id endSubtreeId(currentIt->client(), DisplayItem::beginSubtreeT ypeToEndSubtreeType(currentIt->type()), 0); 215 DisplayItem::Id endSubtreeId(currentIt->client(), DisplayItem::beginSubtreeT ypeToEndSubtreeType(currentIt->type()), 0);
206 while (true) { 216 do {
207 updatedList.appendByMoving(*currentIt, currentIt->derivedSize());
208 if (endSubtreeId.matches(updatedList.last()))
209 break;
210 ++currentIt;
211 // We should always find the EndSubtree display item. 217 // We should always find the EndSubtree display item.
212 ASSERT(currentIt != m_currentDisplayItems.end()); 218 ASSERT(currentIt != m_currentDisplayItems.end());
213 } 219 updatedList.appendByMoving(*currentIt, currentIt->derivedSize());
220 ++currentIt;
221 } while (!endSubtreeId.matches(updatedList.last()));
214 } 222 }
215 223
216 // Update the existing display items by removing invalidated entries, updating 224 // Update the existing display items by removing invalidated entries, updating
217 // repainted ones, and appending new items. 225 // repainted ones, and appending new items.
218 // - For CachedDisplayItem, copy the corresponding cached DrawingDisplayItem; 226 // - For CachedDisplayItem, copy the corresponding cached DrawingDisplayItem;
219 // - For SubtreeCachedDisplayItem, copy the cached display items between the 227 // - For SubtreeCachedDisplayItem, copy the cached display items between the
220 // corresponding BeginSubtreeDisplayItem and EndSubtreeDisplayItem (incl.); 228 // corresponding BeginSubtreeDisplayItem and EndSubtreeDisplayItem (incl.);
221 // - Otherwise, copy the new display item. 229 // - Otherwise, copy the new display item.
222 // 230 //
223 // The algorithm is O(|m_currentDisplayItems| + |m_newDisplayItems|). 231 // The algorithm is O(|m_currentDisplayItems| + |m_newDisplayItems|).
(...skipping 26 matching lines...) Expand all
250 return; 258 return;
251 } 259 }
252 260
253 updateValidlyCachedClientsIfNeeded(); 261 updateValidlyCachedClientsIfNeeded();
254 262
255 // Stores indices to valid DrawingDisplayItems in m_currentDisplayItems that have not been matched 263 // Stores indices to valid DrawingDisplayItems in m_currentDisplayItems that have not been matched
256 // by CachedDisplayItems during synchronized matching. The indexed items wil l be matched 264 // by CachedDisplayItems during synchronized matching. The indexed items wil l be matched
257 // by later out-of-order CachedDisplayItems in m_newDisplayItems. This ensur es that when 265 // by later out-of-order CachedDisplayItems in m_newDisplayItems. This ensur es that when
258 // out-of-order CachedDisplayItems occur, we only traverse at most once over m_currentDisplayItems 266 // out-of-order CachedDisplayItems occur, we only traverse at most once over m_currentDisplayItems
259 // looking for potential matches. Thus we can ensure that the algorithm runs in linear time. 267 // looking for potential matches. Thus we can ensure that the algorithm runs in linear time.
260 DisplayItemIndicesByClientMap displayItemIndicesByClient; 268 OutOfOrderIndexContext outOfOrderIndexContext(m_currentDisplayItems.begin()) ;
261 269
262 #if ENABLE(ASSERT) 270 #if ENABLE(ASSERT)
263 if (RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEnabled()) { 271 if (RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEnabled()) {
264 // Under-invalidation checking requires a full index of m_currentDisplay Items. 272 // Under-invalidation checking requires a full index of m_currentDisplay Items.
265 size_t i = 0; 273 size_t i = 0;
266 for (const auto& item : m_currentDisplayItems) { 274 for (const auto& item : m_currentDisplayItems) {
267 addItemToIndexIfNeeded(item, i, displayItemIndicesByClient); 275 addItemToIndexIfNeeded(item, i, outOfOrderIndexContext.displayItemIn dicesByClient);
268 ++i; 276 ++i;
269 } 277 }
270 } 278 }
271 #endif // ENABLE(ASSERT) 279 #endif // ENABLE(ASSERT)
272 280
273 // TODO(jbroman): Consider revisiting this heuristic. 281 // TODO(jbroman): Consider revisiting this heuristic.
274 DisplayItems updatedList( 282 DisplayItems updatedList(
275 kMaximumDisplayItemSize, 283 kMaximumDisplayItemSize,
276 std::max(m_currentDisplayItems.usedCapacityInBytes(), m_newDisplayItems. usedCapacityInBytes())); 284 std::max(m_currentDisplayItems.usedCapacityInBytes(), m_newDisplayItems. usedCapacityInBytes()));
277 DisplayItems::iterator currentIt = m_currentDisplayItems.begin(); 285 DisplayItems::iterator currentIt = m_currentDisplayItems.begin();
278 DisplayItems::iterator currentEnd = m_currentDisplayItems.end(); 286 DisplayItems::iterator currentEnd = m_currentDisplayItems.end();
279 for (DisplayItems::iterator newIt = m_newDisplayItems.begin(); newIt != m_ne wDisplayItems.end(); ++newIt) { 287 for (DisplayItems::iterator newIt = m_newDisplayItems.begin(); newIt != m_ne wDisplayItems.end(); ++newIt) {
280 const DisplayItem& newDisplayItem = *newIt; 288 const DisplayItem& newDisplayItem = *newIt;
281 const DisplayItem::Id newDisplayItemId = newDisplayItem.nonCachedId(); 289 const DisplayItem::Id newDisplayItemId = newDisplayItem.nonCachedId();
282 bool newDisplayItemHasCachedType = newDisplayItem.type() != newDisplayIt emId.type; 290 bool newDisplayItemHasCachedType = newDisplayItem.type() != newDisplayIt emId.type;
283 291
284 bool isSynchronized = currentIt != currentEnd 292 bool isSynchronized = currentIt != currentEnd && newDisplayItemId.matche s(*currentIt);
285 && !currentIt->ignoreFromDisplayList()
286 && newDisplayItemId.matches(*currentIt);
287 293
288 if (newDisplayItemHasCachedType) { 294 if (newDisplayItemHasCachedType) {
289 ASSERT(!RuntimeEnabledFeatures::slimmingPaintUnderInvalidationChecki ngEnabled()); 295 ASSERT(!RuntimeEnabledFeatures::slimmingPaintUnderInvalidationChecki ngEnabled());
290 ASSERT(newDisplayItem.isCached()); 296 ASSERT(newDisplayItem.isCached());
291 ASSERT(clientCacheIsValid(newDisplayItem.client())); 297 ASSERT(clientCacheIsValid(newDisplayItem.client()));
292 if (!isSynchronized) { 298 if (!isSynchronized) {
293 DisplayItems::iterator foundIt = findOutOfOrderCachedItem(curren tIt, newDisplayItemId, displayItemIndicesByClient); 299 DisplayItems::iterator foundIt = findOutOfOrderCachedItem(curren tIt, newDisplayItemId, outOfOrderIndexContext);
294 ASSERT(foundIt != currentIt);
295 300
296 if (foundIt == currentEnd) { 301 if (foundIt == currentEnd) {
297 #ifndef NDEBUG 302 #ifndef NDEBUG
298 showDebugData(); 303 showDebugData();
299 WTFLogAlways("%s not found in m_currentDisplayItems\n", newD isplayItem.asDebugString().utf8().data()); 304 WTFLogAlways("%s not found in m_currentDisplayItems\n", newD isplayItem.asDebugString().utf8().data());
300 #endif 305 #endif
301 ASSERT_NOT_REACHED(); 306 ASSERT_NOT_REACHED();
302 307
303 // If foundIt == currentEnd, it means that we did not find t he cached display item. This should be impossible, but may occur 308 // If foundIt == currentEnd, it means that we did not find t he cached display item. This should be impossible, but may occur
304 // if there is a bug in the system, such as under-invalidati on, incorrect cache checking or duplicate display ids. In this case, 309 // if there is a bug in the system, such as under-invalidati on, incorrect cache checking or duplicate display ids. In this case,
305 // attempt to recover rather than crashing or bailing on dis play of the rest of the display list. 310 // attempt to recover rather than crashing or bailing on dis play of the rest of the display list.
306 continue; 311 continue;
307 } 312 }
313
314 ASSERT(foundIt != currentIt); // because we are in 'if (!isSynch ronized)'
308 currentIt = foundIt; 315 currentIt = foundIt;
309 } 316 }
310 317
311 if (newDisplayItem.isCachedDrawing()) { 318 if (newDisplayItem.isCachedDrawing()) {
312 updatedList.appendByMoving(*currentIt, currentIt->derivedSize()) ; 319 updatedList.appendByMoving(*currentIt, currentIt->derivedSize()) ;
320 ++currentIt;
313 } else { 321 } else {
314 ASSERT(newDisplayItem.isCachedSubtree()); 322 ASSERT(newDisplayItem.isCachedSubtree());
315 copyCachedSubtree(currentIt, updatedList); 323 copyCachedSubtree(currentIt, updatedList);
316 ASSERT(updatedList.last().isEndSubtree()); 324 ASSERT(updatedList.last().isEndSubtree());
317 } 325 }
318 } else { 326 } else {
319 #if ENABLE(ASSERT) 327 #if ENABLE(ASSERT)
320 if (RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEn abled()) 328 if (RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEn abled())
321 checkCachedDisplayItemIsUnchanged(newDisplayItem, displayItemInd icesByClient); 329 checkCachedDisplayItemIsUnchanged(newDisplayItem, outOfOrderInde xContext.displayItemIndicesByClient);
322 else 330 else
323 ASSERT(!newDisplayItem.isDrawing() || newDisplayItem.skippedCach e() || !clientCacheIsValid(newDisplayItem.client())); 331 ASSERT(!newDisplayItem.isDrawing() || newDisplayItem.skippedCach e() || !clientCacheIsValid(newDisplayItem.client()));
324 #endif // ENABLE(ASSERT) 332 #endif // ENABLE(ASSERT)
325 updatedList.appendByMoving(*newIt, newIt->derivedSize()); 333 updatedList.appendByMoving(*newIt, newIt->derivedSize());
334
335 if (isSynchronized)
336 ++currentIt;
326 } 337 }
327
328 if (isSynchronized)
329 ++currentIt;
330 } 338 }
331 339
332 #if ENABLE(ASSERT) 340 #if ENABLE(ASSERT)
333 if (RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEnabled()) 341 if (RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEnabled())
334 checkNoRemainingCachedDisplayItems(); 342 checkNoRemainingCachedDisplayItems();
335 #endif // ENABLE(ASSERT) 343 #endif // ENABLE(ASSERT)
336 344
337 m_newDisplayItems.clear(); 345 m_newDisplayItems.clear();
338 m_validlyCachedClientsDirty = true; 346 m_validlyCachedClientsDirty = true;
339 m_currentDisplayItems.swap(updatedList); 347 m_currentDisplayItems.swap(updatedList);
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
433 size_t index = findMatchingItemFromIndex(displayItem.nonCachedId(), displayI temIndicesByClient, m_currentDisplayItems); 441 size_t index = findMatchingItemFromIndex(displayItem.nonCachedId(), displayI temIndicesByClient, m_currentDisplayItems);
434 if (index == kNotFound) { 442 if (index == kNotFound) {
435 showUnderInvalidationError("ERROR: under-invalidation: no cached display item", displayItem); 443 showUnderInvalidationError("ERROR: under-invalidation: no cached display item", displayItem);
436 ASSERT_NOT_REACHED(); 444 ASSERT_NOT_REACHED();
437 return; 445 return;
438 } 446 }
439 447
440 DisplayItems::iterator foundItem = m_currentDisplayItems.begin() + index; 448 DisplayItems::iterator foundItem = m_currentDisplayItems.begin() + index;
441 RefPtr<const SkPicture> newPicture = static_cast<const DrawingDisplayItem&>( displayItem).picture(); 449 RefPtr<const SkPicture> newPicture = static_cast<const DrawingDisplayItem&>( displayItem).picture();
442 RefPtr<const SkPicture> oldPicture = static_cast<const DrawingDisplayItem&>( *foundItem).picture(); 450 RefPtr<const SkPicture> oldPicture = static_cast<const DrawingDisplayItem&>( *foundItem).picture();
443 // Mark the display item as ignored so that we can check if there are any re maining cached display items after merging. 451 // Invalidate the display item so that we can check if there are any remaini ng cached display items after merging.
444 foundItem->setIgnoredFromDisplayList(); 452 foundItem->clearClientForUnderInvalidationChecking();
445 453
446 if (!newPicture && !oldPicture) 454 if (!newPicture && !oldPicture)
447 return; 455 return;
448 if (newPicture && oldPicture) { 456 if (newPicture && oldPicture) {
449 switch (static_cast<const DrawingDisplayItem&>(displayItem).underInvalid ationCheckingMode()) { 457 switch (static_cast<const DrawingDisplayItem&>(displayItem).underInvalid ationCheckingMode()) {
450 case DrawingDisplayItem::CheckPicture: 458 case DrawingDisplayItem::CheckPicture:
451 if (newPicture->approximateOpCount() == oldPicture->approximateOpCou nt()) { 459 if (newPicture->approximateOpCount() == oldPicture->approximateOpCou nt()) {
452 SkDynamicMemoryWStream newPictureSerialized; 460 SkDynamicMemoryWStream newPictureSerialized;
453 newPicture->serialize(&newPictureSerialized); 461 newPicture->serialize(&newPictureSerialized);
454 SkDynamicMemoryWStream oldPictureSerialized; 462 SkDynamicMemoryWStream oldPictureSerialized;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
490 #endif // NDEBUG 498 #endif // NDEBUG
491 499
492 ASSERT_NOT_REACHED(); 500 ASSERT_NOT_REACHED();
493 } 501 }
494 502
495 void DisplayItemList::checkNoRemainingCachedDisplayItems() 503 void DisplayItemList::checkNoRemainingCachedDisplayItems()
496 { 504 {
497 ASSERT(RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEnabled ()); 505 ASSERT(RuntimeEnabledFeatures::slimmingPaintUnderInvalidationCheckingEnabled ());
498 506
499 for (const auto& displayItem : m_currentDisplayItems) { 507 for (const auto& displayItem : m_currentDisplayItems) {
500 if (displayItem.ignoreFromDisplayList() || !displayItem.isDrawing() || ! clientCacheIsValid(displayItem.client())) 508 if (!displayItem.isValid() || !displayItem.isDrawing() || !clientCacheIs Valid(displayItem.client()))
501 continue; 509 continue;
502 showUnderInvalidationError("May be under-invalidation: no new display it em", displayItem); 510 showUnderInvalidationError("May be under-invalidation: no new display it em", displayItem);
503 } 511 }
504 } 512 }
505 513
506 #endif // ENABLE(ASSERT) 514 #endif // ENABLE(ASSERT)
507 515
508 #ifndef NDEBUG 516 #ifndef NDEBUG
509 517
510 WTF::String DisplayItemList::displayItemsAsDebugString(const DisplayItems& list) const 518 WTF::String DisplayItemList::displayItemsAsDebugString(const DisplayItems& list) const
511 { 519 {
512 StringBuilder stringBuilder; 520 StringBuilder stringBuilder;
513 size_t i = 0; 521 size_t i = 0;
514 for (auto it = list.begin(); it != list.end(); ++it, ++i) { 522 for (auto it = list.begin(); it != list.end(); ++it, ++i) {
515 const DisplayItem& displayItem = *it; 523 const DisplayItem& displayItem = *it;
516 if (i) 524 if (i)
517 stringBuilder.append(",\n"); 525 stringBuilder.append(",\n");
518 if (displayItem.ignoreFromDisplayList()) { 526 if (!displayItem.isValid()) {
519 stringBuilder.append("null"); 527 stringBuilder.append("null");
520 continue; 528 continue;
521 } 529 }
522 stringBuilder.append(String::format("{index: %d, ", (int)i)); 530 stringBuilder.append(String::format("{index: %d, ", (int)i));
523 displayItem.dumpPropertiesAsDebugString(stringBuilder); 531 displayItem.dumpPropertiesAsDebugString(stringBuilder);
524 stringBuilder.append(", cacheIsValid: "); 532 stringBuilder.append(", cacheIsValid: ");
525 stringBuilder.append(clientCacheIsValid(displayItem.client()) ? "true" : "false"); 533 stringBuilder.append(clientCacheIsValid(displayItem.client()) ? "true" : "false");
526 stringBuilder.append('}'); 534 stringBuilder.append('}');
527 } 535 }
528 return stringBuilder.toString(); 536 return stringBuilder.toString();
529 } 537 }
530 538
531 void DisplayItemList::showDebugData() const 539 void DisplayItemList::showDebugData() const
532 { 540 {
533 WTFLogAlways("current display items: [%s]\n", displayItemsAsDebugString(m_cu rrentDisplayItems).utf8().data()); 541 WTFLogAlways("current display items: [%s]\n", displayItemsAsDebugString(m_cu rrentDisplayItems).utf8().data());
534 WTFLogAlways("new display items: [%s]\n", displayItemsAsDebugString(m_newDis playItems).utf8().data()); 542 WTFLogAlways("new display items: [%s]\n", displayItemsAsDebugString(m_newDis playItems).utf8().data());
535 } 543 }
536 544
537 #endif // ifndef NDEBUG 545 #endif // ifndef NDEBUG
538 546
539 void DisplayItemList::replay(GraphicsContext& context) 547 void DisplayItemList::replay(GraphicsContext& context)
540 { 548 {
541 TRACE_EVENT0("blink,benchmark", "DisplayItemList::replay"); 549 TRACE_EVENT0("blink,benchmark", "DisplayItemList::replay");
542 ASSERT(m_newDisplayItems.isEmpty()); 550 ASSERT(m_newDisplayItems.isEmpty());
543 for (DisplayItem& displayItem : m_currentDisplayItems) 551 for (DisplayItem& displayItem : m_currentDisplayItems)
544 displayItem.replay(context); 552 displayItem.replay(context);
545 } 553 }
546 554
547 } // namespace blink 555 } // namespace blink
OLDNEW
« no previous file with comments | « Source/platform/graphics/paint/DisplayItemList.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698