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

Unified Diff: third_party/WebKit/Source/platform/graphics/paint/PaintChunk.h

Issue 2116693002: PaintChunk::id (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@CommitOnTheWay
Patch Set: Address chrishtr's comments. Created 4 years, 5 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 side-by-side diff with in-line comments
Download patch
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;

Powered by Google App Engine
This is Rietveld 408576698