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

Side by Side Diff: Source/platform/graphics/paint/DisplayItem.h

Issue 1287863003: Avoid re-iterate out-of-order display items (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Address pdr's comments 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
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 #ifndef DisplayItem_h 5 #ifndef DisplayItem_h
6 #define DisplayItem_h 6 #define DisplayItem_h
7 7
8 #include "platform/PlatformExport.h" 8 #include "platform/PlatformExport.h"
9 #include "platform/graphics/ContiguousContainer.h" 9 #include "platform/graphics/ContiguousContainer.h"
10 #include "platform/graphics/paint/DisplayItemClient.h" 10 #include "platform/graphics/paint/DisplayItemClient.h"
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 UninitializedType, 177 UninitializedType,
178 TypeLast = UninitializedType 178 TypeLast = UninitializedType
179 }; 179 };
180 180
181 DisplayItem(const DisplayItemClientWrapper& client, Type type, size_t derive dSize) 181 DisplayItem(const DisplayItemClientWrapper& client, Type type, size_t derive dSize)
182 : m_client(client.displayItemClient()) 182 : m_client(client.displayItemClient())
183 , m_scope(0) 183 , m_scope(0)
184 , m_type(type) 184 , m_type(type)
185 , m_derivedSize(derivedSize) 185 , m_derivedSize(derivedSize)
186 , m_skippedCache(false) 186 , m_skippedCache(false)
187 , m_ignoredFromList(false)
188 #ifndef NDEBUG 187 #ifndef NDEBUG
189 , m_clientDebugString(client.debugName()) 188 , m_clientDebugString(client.debugName())
190 #endif 189 #endif
191 { 190 {
192 // derivedSize must fit in m_derivedSize. 191 // derivedSize must fit in m_derivedSize.
193 // If it doesn't, enlarge m_derivedSize and fix this assert. 192 // If it doesn't, enlarge m_derivedSize and fix this assert.
194 ASSERT_WITH_SECURITY_IMPLICATION(derivedSize < (1 << 8)); 193 ASSERT_WITH_SECURITY_IMPLICATION(derivedSize < (1 << 8));
195 ASSERT_WITH_SECURITY_IMPLICATION(derivedSize >= sizeof(*this)); 194 ASSERT_WITH_SECURITY_IMPLICATION(derivedSize >= sizeof(*this));
196 } 195 }
197 196
197 virtual ~DisplayItem() { }
198
198 // Ids are for matching new DisplayItems with existing DisplayItems. 199 // Ids are for matching new DisplayItems with existing DisplayItems.
199 struct Id { 200 struct Id {
200 Id(const DisplayItemClient client, const Type type, const unsigned scope ) 201 Id(const DisplayItemClient client, const Type type, const unsigned scope )
201 : client(client) 202 : client(client)
202 , type(type) 203 , type(type)
203 , scope(scope) { } 204 , scope(scope) { }
204 205
205 bool matches(const DisplayItem& item) const 206 bool matches(const DisplayItem& item) const
206 { 207 {
207 // We should always convert to non-cached types before matching. 208 // We should always convert to non-cached types before matching.
(...skipping 18 matching lines...) Expand all
226 return cachedSubtreeTypeToBeginSubtreeType(m_type); 227 return cachedSubtreeTypeToBeginSubtreeType(m_type);
227 return m_type; 228 return m_type;
228 } 229 }
229 230
230 // Return the Id with cached type converted to non-cached type. 231 // Return the Id with cached type converted to non-cached type.
231 Id nonCachedId() const 232 Id nonCachedId() const
232 { 233 {
233 return Id(m_client, nonCachedType(), m_scope); 234 return Id(m_client, nonCachedType(), m_scope);
234 } 235 }
235 236
236 virtual ~DisplayItem() { }
237
238 virtual void replay(GraphicsContext&) { } 237 virtual void replay(GraphicsContext&) { }
239 238
240 DisplayItemClient client() const { return m_client; } 239 DisplayItemClient client() const { return m_client; }
241 Type type() const { return m_type; } 240 Type type() const { return m_type; }
242 241
243 void setScope(unsigned scope) { m_scope = scope; } 242 void setScope(unsigned scope) { m_scope = scope; }
244 unsigned scope() { return m_scope; } 243 unsigned scope() { return m_scope; }
245 244
246 // Size of this object in memory, used to move it with memcpy. 245 // Size of this object in memory, used to move it with memcpy.
247 // This is not sizeof(*this), because it needs to account for the size of 246 // This is not sizeof(*this), because it needs to account for the size of
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 321
323 virtual bool isBegin() const { return false; } 322 virtual bool isBegin() const { return false; }
324 virtual bool isEnd() const { return false; } 323 virtual bool isEnd() const { return false; }
325 324
326 #if ENABLE(ASSERT) 325 #if ENABLE(ASSERT)
327 virtual bool isEndAndPairedWith(DisplayItem::Type otherType) const { return false; } 326 virtual bool isEndAndPairedWith(DisplayItem::Type otherType) const { return false; }
328 #endif 327 #endif
329 328
330 virtual bool drawsContent() const { return false; } 329 virtual bool drawsContent() const { return false; }
331 330
332 bool ignoreFromDisplayList() const { return m_ignoredFromList; } 331 bool isValid() const { return m_client; }
333 void setIgnoredFromDisplayList() { m_ignoredFromList = true; } 332 // Re-construct this display item as a permanently invalid item with no clie nt set.
333 void invalidate()
pdr. 2015/08/18 06:15:21 This looks correct now, but it's tricky. Because t
Xianzhu 2015/08/18 16:24:44 Acknowledged and Done.
334 {
335 this->~DisplayItem();
336 new (this) DisplayItem;
337 }
334 338
335 #ifndef NDEBUG 339 #ifndef NDEBUG
336 static WTF::String typeAsDebugString(DisplayItem::Type); 340 static WTF::String typeAsDebugString(DisplayItem::Type);
337 const WTF::String& clientDebugString() const { return m_clientDebugString; } 341 const WTF::String& clientDebugString() const { return m_clientDebugString; }
338 WTF::String asDebugString() const; 342 WTF::String asDebugString() const;
339 virtual void dumpPropertiesAsDebugString(WTF::StringBuilder&) const; 343 virtual void dumpPropertiesAsDebugString(WTF::StringBuilder&) const;
340 #endif 344 #endif
341 345
342 private: 346 private:
343 // The default DisplayItem constructor is only used by 347 // The default DisplayItem constructor is only used by
344 // ContiguousContainer::appendByMoving where an invalid DisplaItem is 348 // ContiguousContainer::appendByMoving where an invalid DisplaItem is
345 // constructed at the source location. 349 // constructed at the source location.
346 template <typename T, unsigned alignment> friend class ContiguousContainer; 350 template <typename T, unsigned alignment> friend class ContiguousContainer;
347 351
348 DisplayItem() 352 DisplayItem()
349 : m_client(nullptr) 353 : m_client(nullptr)
350 , m_scope(0) 354 , m_scope(0)
351 , m_type(UninitializedType) 355 , m_type(UninitializedType)
352 , m_derivedSize(sizeof(*this)) 356 , m_derivedSize(sizeof(*this))
353 , m_skippedCache(false) 357 , m_skippedCache(false)
354 , m_ignoredFromList(true)
355 #ifndef NDEBUG 358 #ifndef NDEBUG
356 , m_clientDebugString("invalid") 359 , m_clientDebugString("invalid")
357 #endif 360 #endif
358 { } 361 { }
359 362
360 const DisplayItemClient m_client; 363 const DisplayItemClient m_client;
361 unsigned m_scope; 364 unsigned m_scope;
362 static_assert(TypeLast < (1 << 16), "DisplayItem::Type should fit in 16 bits "); 365 static_assert(TypeLast < (1 << 16), "DisplayItem::Type should fit in 16 bits ");
363 const Type m_type : 16; 366 const Type m_type : 16;
364 unsigned m_derivedSize : 8; // size of the actual derived class 367 unsigned m_derivedSize : 8; // size of the actual derived class
365 unsigned m_skippedCache : 1; 368 unsigned m_skippedCache : 1;
366 unsigned m_ignoredFromList : 1;
367 369
368 #ifndef NDEBUG 370 #ifndef NDEBUG
369 WTF::String m_clientDebugString; 371 WTF::String m_clientDebugString;
370 #endif 372 #endif
371 }; 373 };
372 374
373 class PLATFORM_EXPORT PairedBeginDisplayItem : public DisplayItem { 375 class PLATFORM_EXPORT PairedBeginDisplayItem : public DisplayItem {
374 protected: 376 protected:
375 PairedBeginDisplayItem(const DisplayItemClientWrapper& client, Type type, si ze_t derivedSize) : DisplayItem(client, type, derivedSize) { } 377 PairedBeginDisplayItem(const DisplayItemClientWrapper& client, Type type, si ze_t derivedSize) : DisplayItem(client, type, derivedSize) { }
376 378
377 private: 379 private:
378 bool isBegin() const final { return true; } 380 bool isBegin() const final { return true; }
379 }; 381 };
380 382
381 class PLATFORM_EXPORT PairedEndDisplayItem : public DisplayItem { 383 class PLATFORM_EXPORT PairedEndDisplayItem : public DisplayItem {
382 protected: 384 protected:
383 PairedEndDisplayItem(const DisplayItemClientWrapper& client, Type type, size _t derivedSize) : DisplayItem(client, type, derivedSize) { } 385 PairedEndDisplayItem(const DisplayItemClientWrapper& client, Type type, size _t derivedSize) : DisplayItem(client, type, derivedSize) { }
384 386
385 #if ENABLE(ASSERT) 387 #if ENABLE(ASSERT)
386 bool isEndAndPairedWith(DisplayItem::Type otherType) const override = 0; 388 bool isEndAndPairedWith(DisplayItem::Type otherType) const override = 0;
387 #endif 389 #endif
388 390
389 private: 391 private:
390 bool isEnd() const final { return true; } 392 bool isEnd() const final { return true; }
391 }; 393 };
392 394
393 } // namespace blink 395 } // namespace blink
394 396
395 #endif // DisplayItem_h 397 #endif // DisplayItem_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698