| Index: third_party/WebKit/Source/platform/graphics/paint/DisplayItem.h
|
| diff --git a/third_party/WebKit/Source/platform/graphics/paint/DisplayItem.h b/third_party/WebKit/Source/platform/graphics/paint/DisplayItem.h
|
| index 0cc8cf31997441ee3289b0ae76d1314c6df377de..a54f911f81676020ef9acbc3461864f9dd74f6bb 100644
|
| --- a/third_party/WebKit/Source/platform/graphics/paint/DisplayItem.h
|
| +++ b/third_party/WebKit/Source/platform/graphics/paint/DisplayItem.h
|
| @@ -182,6 +182,7 @@ public:
|
| kSubsequence,
|
| kEndSubsequence,
|
|
|
| + kHasBeenMoved,
|
| kUninitializedType,
|
| kTypeLast = kUninitializedType
|
| };
|
| @@ -224,11 +225,17 @@ public:
|
| const Type type;
|
| };
|
|
|
| - Id getId() const { return Id(*m_client, m_type); }
|
| + Id getId() const { return Id(client(), getType()); }
|
|
|
| virtual void replay(GraphicsContext&) const { }
|
|
|
| - const DisplayItemClient& client() const { ASSERT(m_client); return *m_client; }
|
| + const DisplayItemClient& client() const
|
| + {
|
| + DCHECK(!hasBeenMoved());
|
| + DCHECK(m_client);
|
| + return *m_client;
|
| + }
|
| +
|
| Type getType() const { return m_type; }
|
|
|
| // Size of this object in memory, used to move it with memcpy.
|
| @@ -312,11 +319,10 @@ public:
|
| }
|
| #endif
|
|
|
| - // True if the client is non-null. Because m_client is const, this should
|
| - // never be false except when we explicitly create a tombstone/"dead display
|
| - // item" as part of moving an item from one list to another (see:
|
| - // DisplayItemList::appendByMoving).
|
| - bool hasValidClient() const { return m_client; }
|
| + // True if the item is a placeholder at the place of the original item that
|
| + // has been moved by DisplayItemList::appendByMoving().
|
| + bool hasBeenMoved() const { return m_type == kHasBeenMoved; }
|
| + size_t movedToIndex() const { DCHECK(hasBeenMoved()); return m_movedToIndex; }
|
|
|
| virtual bool drawsContent() const { return false; }
|
|
|
| @@ -332,19 +338,21 @@ public:
|
| #endif
|
|
|
| private:
|
| - // The default DisplayItem constructor is only used by
|
| - // ContiguousContainer::appendByMoving where an invalid DisplaItem is
|
| + // The DisplayItem(size_t) constructor is only used by
|
| + // ContiguousContainer::appendByMoving() where a placeholder DisplayItem is
|
| // constructed at the source location.
|
| template <typename T, unsigned alignment> friend class ContiguousContainer;
|
| -
|
| - DisplayItem()
|
| - : m_client(nullptr)
|
| - , m_type(kUninitializedType)
|
| + DisplayItem(size_t movedToIndex)
|
| + : m_movedToIndex(movedToIndex)
|
| + , m_type(kHasBeenMoved)
|
| , m_derivedSize(sizeof(*this))
|
| , m_skippedCache(false)
|
| { }
|
|
|
| - const DisplayItemClient* m_client;
|
| + union {
|
| + const DisplayItemClient* m_client; // For m_type != HasBeenMoved.
|
| + size_t m_movedToIndex; // For m_type == HasBeenMoved.
|
| + };
|
| static_assert(kTypeLast < (1 << 16), "DisplayItem::Type should fit in 16 bits");
|
| const Type m_type : 16;
|
| const unsigned m_derivedSize : 8; // size of the actual derived class
|
|
|