OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #ifndef GrRecordReplaceDraw_DEFINED | 8 #ifndef GrRecordReplaceDraw_DEFINED |
9 #define GrRecordReplaceDraw_DEFINED | 9 #define GrRecordReplaceDraw_DEFINED |
10 | 10 |
11 #include "SkChecksum.h" | |
12 #include "SkDrawPictureCallback.h" | 11 #include "SkDrawPictureCallback.h" |
13 #include "SkImage.h" | |
14 #include "SkRect.h" | |
15 #include "SkTDynamicHash.h" | |
16 | 12 |
17 class SkBBoxHierarchy; | 13 class GrLayerCache; |
18 class SkBitmap; | |
19 class SkCanvas; | 14 class SkCanvas; |
20 class SkImage; | |
21 class SkMatrix; | 15 class SkMatrix; |
22 class SkPaint; | |
23 class SkPicture; | 16 class SkPicture; |
24 class SkRecord; | |
25 | |
26 // GrReplacements collects op ranges that can be replaced with | |
27 // a single drawBitmap call (using a precomputed bitmap). | |
28 class GrReplacements { | |
29 public: | |
30 // All the operations between fStart and fStop (inclusive) will be replaced
with | |
31 // a single drawBitmap call using fPos, fImage and fPaint. | |
32 class ReplacementInfo { | |
33 public: | |
34 struct Key { | |
35 Key(uint32_t pictureID, const SkMatrix& initialMat, | |
36 const int* key, int keySize, bool copyKey = false) | |
37 : fKeySize(keySize) | |
38 , fFreeKey(copyKey) { | |
39 fIDMatrix.fPictureID = pictureID; | |
40 fIDMatrix.fInitialMat = initialMat; | |
41 fIDMatrix.fInitialMat.getType(); // force initialization of type
so hashes match | |
42 | |
43 if (copyKey) { | |
44 int* tempKey = SkNEW_ARRAY(int, keySize); | |
45 memcpy(tempKey, key, keySize * sizeof(int)); | |
46 fKey = tempKey; | |
47 } else { | |
48 fKey = key; | |
49 } | |
50 | |
51 // The pictureID/matrix portion needs to be tightly packed. | |
52 GR_STATIC_ASSERT(sizeof(IDMatrix) == sizeof(uint32_t)+
// pictureID | |
53 9 * sizeof(SkScalar)+sizeof(uint32
_t)); // matrix | |
54 } | |
55 | |
56 ~Key() { | |
57 if (fFreeKey) { | |
58 SkDELETE_ARRAY(fKey); | |
59 } | |
60 } | |
61 bool operator==(const Key& other) const { | |
62 if (fKeySize != other.fKeySize) { | |
63 return false; | |
64 } | |
65 return fIDMatrix.fPictureID == other.fIDMatrix.fPictureID && | |
66 fIDMatrix.fInitialMat.cheapEqualTo(other.fIDMatrix.fIniti
alMat) && | |
67 !memcmp(fKey, other.fKey, fKeySize * sizeof(int)); | |
68 } | |
69 | |
70 uint32_t hash() const { | |
71 uint32_t hash = SkChecksum::Murmur3(reinterpret_cast<const uint3
2_t*>(fKey), | |
72 fKeySize * sizeof(int)); | |
73 return SkChecksum::Murmur3(reinterpret_cast<const uint32_t*>(&fI
DMatrix), | |
74 sizeof(IDMatrix), hash); | |
75 } | |
76 | |
77 private: | |
78 struct IDMatrix { | |
79 uint32_t fPictureID; | |
80 SkMatrix fInitialMat; | |
81 } fIDMatrix; | |
82 | |
83 const int* fKey; | |
84 const int fKeySize; | |
85 const bool fFreeKey; | |
86 }; | |
87 | |
88 static const Key& GetKey(const ReplacementInfo& layer) { return layer.fK
ey; } | |
89 static uint32_t Hash(const Key& key) { return key.hash(); } | |
90 | |
91 ReplacementInfo(uint32_t pictureID, const SkMatrix& initialMat, | |
92 const int* key, int keySize) | |
93 : fKey(pictureID, initialMat, key, keySize, true) | |
94 , fImage(NULL) | |
95 , fPaint(NULL) { | |
96 } | |
97 ~ReplacementInfo() { fImage->unref(); SkDELETE(fPaint); } | |
98 | |
99 const Key fKey; | |
100 unsigned fStop; | |
101 SkIPoint fPos; | |
102 SkImage* fImage; // Owns a ref | |
103 const SkPaint* fPaint; // Owned by this object | |
104 | |
105 SkIRect fSrcRect; | |
106 }; | |
107 | |
108 ~GrReplacements() { this->freeAll(); } | |
109 | |
110 // Add a new replacement range. | |
111 ReplacementInfo* newReplacement(uint32_t pictureID, const SkMatrix& initialM
at, | |
112 const int* key, int keySize); | |
113 | |
114 const ReplacementInfo* lookup(uint32_t pictureID, const SkMatrix& initalMat, | |
115 const int* key, int keySize) const; | |
116 | |
117 private: | |
118 SkTDynamicHash<ReplacementInfo, ReplacementInfo::Key> fReplacementHash; | |
119 | |
120 void freeAll(); | |
121 }; | |
122 | 17 |
123 // Draw an SkPicture into an SkCanvas replacing saveLayer/restore blocks with | 18 // Draw an SkPicture into an SkCanvas replacing saveLayer/restore blocks with |
124 // drawBitmap calls. A convenience wrapper around SkRecords::Draw. | 19 // drawBitmap calls. A convenience wrapper around SkRecords::Draw. |
125 // It returns the number of saveLayer/restore blocks replaced with drawBitmap ca
lls. | 20 // It returns the number of saveLayer/restore blocks replaced with drawBitmap ca
lls. |
126 int GrRecordReplaceDraw(const SkPicture*, | 21 int GrRecordReplaceDraw(const SkPicture*, |
127 SkCanvas*, | 22 SkCanvas*, |
128 const GrReplacements*, | 23 GrLayerCache* layerCache, |
129 const SkMatrix& initialMatrix, | 24 const SkMatrix& initialMatrix, |
130 SkDrawPictureCallback*); | 25 SkDrawPictureCallback*); |
131 | 26 |
132 #endif // GrRecordReplaceDraw_DEFINED | 27 #endif // GrRecordReplaceDraw_DEFINED |
OLD | NEW |