1 | /* |
2 | * Copyright 2011 Google Inc. |
3 | * |
4 | * Use of this source code is governed by a BSD-style license that can be |
5 | * found in the LICENSE file. |
6 | */ |
7 | #ifndef SkPictureFlat_DEFINED |
8 | #define SkPictureFlat_DEFINED |
9 | |
10 | #include "include/core/SkCanvas.h" |
11 | #include "include/core/SkPaint.h" |
12 | #include "include/core/SkPicture.h" |
13 | #include "include/private/SkChecksum.h" |
14 | #include "src/core/SkPtrRecorder.h" |
15 | #include "src/core/SkReadBuffer.h" |
16 | #include "src/core/SkTDynamicHash.h" |
17 | #include "src/core/SkWriteBuffer.h" |
18 | |
19 | /* |
20 | * Note: While adding new DrawTypes, it is necessary to add to the end of this list |
21 | * and update LAST_DRAWTYPE_ENUM to avoid having the code read older skps wrong. |
22 | * (which can cause segfaults) |
23 | * |
24 | * Reordering can be done during version updates. |
25 | */ |
26 | enum DrawType { |
27 | UNUSED, |
28 | CLIP_PATH, |
29 | CLIP_REGION, |
30 | CLIP_RECT, |
31 | CLIP_RRECT, |
32 | CONCAT, |
33 | DRAW_BITMAP_RETIRED_2016_REMOVED_2018, |
34 | DRAW_BITMAP_MATRIX_RETIRED_2016_REMOVED_2018, |
35 | DRAW_BITMAP_NINE_RETIRED_2016_REMOVED_2018, |
36 | DRAW_BITMAP_RECT_RETIRED_2016_REMOVED_2018, |
37 | DRAW_CLEAR, |
38 | DRAW_DATA, |
39 | DRAW_OVAL, |
40 | DRAW_PAINT, |
41 | DRAW_PATH, |
42 | DRAW_PICTURE, |
43 | DRAW_POINTS, |
44 | DRAW_POS_TEXT_REMOVED_1_2019, |
45 | DRAW_POS_TEXT_TOP_BOTTOM_REMOVED_1_2019, |
46 | DRAW_POS_TEXT_H_REMOVED_1_2019, |
47 | DRAW_POS_TEXT_H_TOP_BOTTOM_REMOVED_1_2019, |
48 | DRAW_RECT, |
49 | DRAW_RRECT, |
50 | DRAW_SPRITE_RETIRED_2015_REMOVED_2018, |
51 | DRAW_TEXT_REMOVED_1_2019, |
52 | DRAW_TEXT_ON_PATH_RETIRED_08_2018_REMOVED_10_2018, |
53 | DRAW_TEXT_TOP_BOTTOM_REMOVED_1_2019, |
54 | DRAW_VERTICES_RETIRED_03_2017_REMOVED_01_2018, |
55 | RESTORE, |
56 | ROTATE, |
57 | SAVE, |
58 | SAVE_LAYER_SAVEFLAGS_DEPRECATED, |
59 | SCALE, |
60 | SET_MATRIX, |
61 | SKEW, |
62 | TRANSLATE, |
63 | NOOP, |
64 | , |
65 | , |
66 | , |
67 | |
68 | // new ops -- feel free to re-alphabetize on next version bump |
69 | DRAW_DRRECT, |
70 | PUSH_CULL, // deprecated, M41 was last Chromium version to write this to an .skp |
71 | POP_CULL, // deprecated, M41 was last Chromium version to write this to an .skp |
72 | |
73 | DRAW_PATCH, // could not add in aphabetical order |
74 | DRAW_PICTURE_MATRIX_PAINT, |
75 | DRAW_TEXT_BLOB, |
76 | DRAW_IMAGE, |
77 | DRAW_IMAGE_RECT_STRICT_obsolete, |
78 | DRAW_ATLAS, |
79 | DRAW_IMAGE_NINE, |
80 | DRAW_IMAGE_RECT, |
81 | |
82 | SAVE_LAYER_SAVELAYERFLAGS_DEPRECATED_JAN_2016_REMOVED_01_2018, |
83 | SAVE_LAYER_SAVELAYERREC, |
84 | |
85 | DRAW_ANNOTATION, |
86 | DRAW_DRAWABLE, |
87 | DRAW_DRAWABLE_MATRIX, |
88 | DRAW_TEXT_RSXFORM_DEPRECATED_DEC_2018, |
89 | |
90 | TRANSLATE_Z, // deprecated (M60) |
91 | |
92 | DRAW_SHADOW_REC, |
93 | DRAW_IMAGE_LATTICE, |
94 | DRAW_ARC, |
95 | DRAW_REGION, |
96 | DRAW_VERTICES_OBJECT, |
97 | |
98 | FLUSH, |
99 | |
100 | DRAW_EDGEAA_IMAGE_SET, |
101 | |
102 | SAVE_BEHIND, |
103 | |
104 | DRAW_EDGEAA_QUAD, |
105 | |
106 | DRAW_BEHIND_PAINT, |
107 | CONCAT44, |
108 | CLIP_SHADER_IN_PAINT, |
109 | MARK_CTM, |
110 | |
111 | LAST_DRAWTYPE_ENUM = MARK_CTM, |
112 | }; |
113 | |
114 | enum DrawVertexFlags { |
115 | DRAW_VERTICES_HAS_TEXS = 0x01, |
116 | DRAW_VERTICES_HAS_COLORS = 0x02, |
117 | DRAW_VERTICES_HAS_INDICES = 0x04, |
118 | DRAW_VERTICES_HAS_XFER = 0x08, |
119 | }; |
120 | |
121 | enum DrawAtlasFlags { |
122 | DRAW_ATLAS_HAS_COLORS = 1 << 0, |
123 | DRAW_ATLAS_HAS_CULL = 1 << 1, |
124 | }; |
125 | |
126 | enum DrawTextRSXformFlags { |
127 | DRAW_TEXT_RSXFORM_HAS_CULL = 1 << 0, |
128 | }; |
129 | |
130 | enum SaveLayerRecFlatFlags { |
131 | SAVELAYERREC_HAS_BOUNDS = 1 << 0, |
132 | SAVELAYERREC_HAS_PAINT = 1 << 1, |
133 | SAVELAYERREC_HAS_BACKDROP = 1 << 2, |
134 | SAVELAYERREC_HAS_FLAGS = 1 << 3, |
135 | SAVELAYERREC_HAS_CLIPMASK = 1 << 4, |
136 | SAVELAYERREC_HAS_CLIPMATRIX = 1 << 5, |
137 | }; |
138 | |
139 | enum SaveBehindFlatFlags { |
140 | SAVEBEHIND_HAS_SUBSET = 1 << 0, |
141 | }; |
142 | |
143 | /////////////////////////////////////////////////////////////////////////////// |
144 | // clipparams are packed in 5 bits |
145 | // doAA:1 | clipOp:4 |
146 | |
147 | static inline uint32_t ClipParams_pack(SkClipOp op, bool doAA) { |
148 | unsigned doAABit = doAA ? 1 : 0; |
149 | return (doAABit << 4) | static_cast<int>(op); |
150 | } |
151 | |
152 | template <typename T> T asValidEnum(SkReadBuffer* buffer, uint32_t candidate) { |
153 | |
154 | if (buffer->validate(candidate <= static_cast<uint32_t>(T::kMax_EnumValue))) { |
155 | return static_cast<T>(candidate); |
156 | } |
157 | |
158 | return T::kMax_EnumValue; |
159 | } |
160 | |
161 | static inline SkClipOp ClipParams_unpackRegionOp(SkReadBuffer* buffer, uint32_t packed) { |
162 | return asValidEnum<SkClipOp>(buffer, packed & 0xF); |
163 | } |
164 | |
165 | static inline bool ClipParams_unpackDoAA(uint32_t packed) { |
166 | return SkToBool((packed >> 4) & 1); |
167 | } |
168 | |
169 | /////////////////////////////////////////////////////////////////////////////// |
170 | |
171 | class SkTypefacePlayback { |
172 | public: |
173 | SkTypefacePlayback() : fCount(0), fArray(nullptr) {} |
174 | ~SkTypefacePlayback() = default; |
175 | |
176 | void setCount(size_t count); |
177 | |
178 | size_t count() const { return fCount; } |
179 | |
180 | sk_sp<SkTypeface>& operator[](size_t index) { |
181 | SkASSERT(index < fCount); |
182 | return fArray[index]; |
183 | } |
184 | |
185 | void setupBuffer(SkReadBuffer& buffer) const { |
186 | buffer.setTypefaceArray(fArray.get(), fCount); |
187 | } |
188 | |
189 | protected: |
190 | size_t fCount; |
191 | std::unique_ptr<sk_sp<SkTypeface>[]> fArray; |
192 | }; |
193 | |
194 | class SkFactoryPlayback { |
195 | public: |
196 | SkFactoryPlayback(int count) : fCount(count) { fArray = new SkFlattenable::Factory[count]; } |
197 | |
198 | ~SkFactoryPlayback() { delete[] fArray; } |
199 | |
200 | SkFlattenable::Factory* base() const { return fArray; } |
201 | |
202 | void setupBuffer(SkReadBuffer& buffer) const { |
203 | buffer.setFactoryPlayback(fArray, fCount); |
204 | } |
205 | |
206 | private: |
207 | int fCount; |
208 | SkFlattenable::Factory* fArray; |
209 | }; |
210 | |
211 | #endif |
212 | |