OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 PaintChunk_h | 5 #ifndef PaintChunk_h |
6 #define PaintChunk_h | 6 #define PaintChunk_h |
7 | 7 |
8 #include "platform/geometry/FloatRect.h" | 8 #include "platform/geometry/FloatRect.h" |
9 #include "platform/graphics/paint/DisplayItem.h" | |
9 #include "platform/graphics/paint/PaintChunkProperties.h" | 10 #include "platform/graphics/paint/PaintChunkProperties.h" |
10 #include "wtf/Allocator.h" | 11 #include "wtf/Allocator.h" |
12 #include "wtf/Optional.h" | |
11 #include <iosfwd> | 13 #include <iosfwd> |
12 | 14 |
13 namespace blink { | 15 namespace blink { |
14 | 16 |
15 // A contiguous sequence of drawings with common paint properties. | 17 // A contiguous sequence of drawings with common paint properties. |
16 // | 18 // |
17 // This is expected to be owned by the paint artifact which also owns the | 19 // This is expected to be owned by the paint artifact which also owns the |
18 // related drawings. | 20 // related drawings. |
19 // | 21 // |
20 // This is a Slimming Paint v2 class. | 22 // This is a Slimming Paint v2 class. |
21 struct PaintChunk { | 23 struct PaintChunk { |
22 DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); | 24 DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); |
23 PaintChunk() : beginIndex(0), endIndex(0), knownToBeOpaque(false) { } | 25 PaintChunk() : beginIndex(0), endIndex(0), knownToBeOpaque(false) { } |
24 PaintChunk(unsigned begin, unsigned end, const PaintChunkProperties& props) | 26 PaintChunk(unsigned begin, unsigned end, const DisplayItem::Id* chunkId, con st PaintChunkProperties& props) |
25 : beginIndex(begin), endIndex(end), properties(props), knownToBeOpaque(f alse) { } | 27 : beginIndex(begin), endIndex(end), properties(props), knownToBeOpaque(f alse) |
28 { | |
29 if (chunkId) | |
30 id.emplace(*chunkId); | |
31 } | |
26 | 32 |
27 unsigned size() const | 33 unsigned size() const |
28 { | 34 { |
29 ASSERT(endIndex >= beginIndex); | 35 ASSERT(endIndex >= beginIndex); |
30 return endIndex - beginIndex; | 36 return endIndex - beginIndex; |
31 } | 37 } |
32 | 38 |
39 // Check if a new PaintChunk (this) created in the latest paint matches an o ld | |
40 // PaintChunk created in the previous paint. | |
41 bool idMatches(const PaintChunk& old) const | |
42 { | |
43 // A PaintChunk without an id doesn't match any other PaintChunks. | |
44 if (!id || !old.id) | |
45 return false; | |
46 if (*id != *old.id) | |
47 return false; | |
48 #if CHECK_DISPLAY_ITEM_CLIENT_ALIVENESS | |
49 CHECK(id->client.isAlive()); | |
50 #endif | |
51 // A chunk whose client is just created should not match any cached chun k, | |
pdr.
2016/07/14 22:22:06
I see what you mean about why this is needed, but
Xianzhu
2016/07/14 23:03:24
Chunk ids should be stable even if the contents ch
| |
52 // even if it's id equals the old chunk's id (which may happen if this c hunk's | |
53 // client is just created at the same address of the old chunk's deleted client). | |
54 return !id->client.isJustCreated(); | |
55 } | |
56 | |
33 // Index of the first drawing in this chunk. | 57 // Index of the first drawing in this chunk. |
34 unsigned beginIndex; | 58 unsigned beginIndex; |
35 | 59 |
36 // Index of the first drawing not in this chunk, so that there are | 60 // Index of the first drawing not in this chunk, so that there are |
37 // |endIndex - beginIndex| drawings in the chunk. | 61 // |endIndex - beginIndex| drawings in the chunk. |
38 unsigned endIndex; | 62 unsigned endIndex; |
39 | 63 |
64 // Identifier of this chunk. If it has a value, it should be unique. | |
65 Optional<DisplayItem::Id> id; | |
pdr.
2016/07/14 22:22:06
Can you add a comment here about what a null value
Xianzhu
2016/07/14 23:03:24
Done.
| |
66 | |
40 // The paint properties which apply to this chunk. | 67 // The paint properties which apply to this chunk. |
41 PaintChunkProperties properties; | 68 PaintChunkProperties properties; |
42 | 69 |
43 // The total bounds of this paint chunk's contents. | 70 // The total bounds of this paint chunk's contents. |
44 FloatRect bounds; | 71 FloatRect bounds; |
45 | 72 |
46 // True if the bounds are filled entirely with opaque contents. | 73 // True if the bounds are filled entirely with opaque contents. |
47 bool knownToBeOpaque; | 74 bool knownToBeOpaque; |
48 }; | 75 }; |
49 | 76 |
50 inline bool operator==(const PaintChunk& a, const PaintChunk& b) | 77 inline bool operator==(const PaintChunk& a, const PaintChunk& b) |
51 { | 78 { |
52 return a.beginIndex == b.beginIndex | 79 return a.beginIndex == b.beginIndex |
53 && a.endIndex == b.endIndex | 80 && a.endIndex == b.endIndex |
81 && a.id == b.id | |
54 && a.properties == b.properties | 82 && a.properties == b.properties |
55 && a.bounds == b.bounds | 83 && a.bounds == b.bounds |
56 && a.knownToBeOpaque == b.knownToBeOpaque; | 84 && a.knownToBeOpaque == b.knownToBeOpaque; |
57 } | 85 } |
58 | 86 |
59 inline bool operator!=(const PaintChunk& a, const PaintChunk& b) | 87 inline bool operator!=(const PaintChunk& a, const PaintChunk& b) |
60 { | 88 { |
61 return !(a == b); | 89 return !(a == b); |
62 } | 90 } |
63 | 91 |
64 // Redeclared here to avoid ODR issues. | 92 // Redeclared here to avoid ODR issues. |
65 // See platform/testing/PaintPrinters.h. | 93 // See platform/testing/PaintPrinters.h. |
66 void PrintTo(const PaintChunk&, std::ostream*); | 94 void PrintTo(const PaintChunk&, std::ostream*); |
67 | 95 |
68 } // namespace blink | 96 } // namespace blink |
69 | 97 |
70 #endif // PaintChunk_h | 98 #endif // PaintChunk_h |
OLD | NEW |