| Index: third_party/WebKit/Source/platform/graphics/paint/PaintChunk.h
|
| diff --git a/third_party/WebKit/Source/platform/graphics/paint/PaintChunk.h b/third_party/WebKit/Source/platform/graphics/paint/PaintChunk.h
|
| index bafb8298ecdc2ba775afed614f996c1d485bfab7..a23c84f530d36573f7cb431035f878e733719a38 100644
|
| --- a/third_party/WebKit/Source/platform/graphics/paint/PaintChunk.h
|
| +++ b/third_party/WebKit/Source/platform/graphics/paint/PaintChunk.h
|
| @@ -6,8 +6,10 @@
|
| #define PaintChunk_h
|
|
|
| #include "platform/geometry/FloatRect.h"
|
| +#include "platform/graphics/paint/DisplayItem.h"
|
| #include "platform/graphics/paint/PaintChunkProperties.h"
|
| #include "wtf/Allocator.h"
|
| +#include "wtf/Optional.h"
|
| #include <iosfwd>
|
|
|
| namespace blink {
|
| @@ -21,8 +23,12 @@ namespace blink {
|
| struct PaintChunk {
|
| DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
|
| PaintChunk() : beginIndex(0), endIndex(0), knownToBeOpaque(false) { }
|
| - PaintChunk(unsigned begin, unsigned end, const PaintChunkProperties& props)
|
| - : beginIndex(begin), endIndex(end), properties(props), knownToBeOpaque(false) { }
|
| + PaintChunk(unsigned begin, unsigned end, const DisplayItem::Id* chunkId, const PaintChunkProperties& props)
|
| + : beginIndex(begin), endIndex(end), properties(props), knownToBeOpaque(false)
|
| + {
|
| + if (chunkId)
|
| + id.emplace(*chunkId);
|
| + }
|
|
|
| unsigned size() const
|
| {
|
| @@ -30,6 +36,24 @@ struct PaintChunk {
|
| return endIndex - beginIndex;
|
| }
|
|
|
| + // Check if a new PaintChunk (this) created in the latest paint matches an old
|
| + // PaintChunk created in the previous paint.
|
| + bool matches(const PaintChunk& old) const
|
| + {
|
| + // A PaintChunk without an id doesn't match any other PaintChunks.
|
| + if (!id || !old.id)
|
| + return false;
|
| + if (*id != *old.id)
|
| + return false;
|
| +#if CHECK_DISPLAY_ITEM_CLIENT_ALIVENESS
|
| + CHECK(id->client.isAlive());
|
| +#endif
|
| + // A chunk whose client is just created should not match any cached chunk,
|
| + // even if it's id equals the old chunk's id (which may happen if this chunk's
|
| + // client is just created at the same address of the old chunk's deleted client).
|
| + return !id->client.isJustCreated();
|
| + }
|
| +
|
| // Index of the first drawing in this chunk.
|
| unsigned beginIndex;
|
|
|
| @@ -37,6 +61,15 @@ struct PaintChunk {
|
| // |endIndex - beginIndex| drawings in the chunk.
|
| unsigned endIndex;
|
|
|
| + // Identifier of this chunk. If it has a value, it should be unique.
|
| + // It's used to match a new chunk to a cached old chunk to track changes of chunk
|
| + // contents, so the id should be stable across document cycles.
|
| + // If the contents of the chunk can't be cached (e.g. it's created when PaintController
|
| + // is skipping cache, normally because display items can't be uniquely identified),
|
| + // id is nullopt so that the chunk won't match any other chunk.
|
| + using Id = DisplayItem::Id;
|
| + Optional<Id> id;
|
| +
|
| // The paint properties which apply to this chunk.
|
| PaintChunkProperties properties;
|
|
|
| @@ -51,6 +84,7 @@ inline bool operator==(const PaintChunk& a, const PaintChunk& b)
|
| {
|
| return a.beginIndex == b.beginIndex
|
| && a.endIndex == b.endIndex
|
| + && a.id == b.id
|
| && a.properties == b.properties
|
| && a.bounds == b.bounds
|
| && a.knownToBeOpaque == b.knownToBeOpaque;
|
|
|