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 "SkCanvas.h"
11 #include "SkChecksum.h"
12 #include "SkReadBuffer.h"
13 #include "SkWriteBuffer.h"
14 #include "SkPaint.h"
15 #include "SkPicture.h"
16 #include "SkPtrRecorder.h"
17 #include "SkTDynamicHash.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,
34 DRAW_BITMAP_MATRIX, // deprecated, M41 was last Chromium version to write this to an .skp
35 DRAW_BITMAP_NINE,
36 DRAW_BITMAP_RECT,
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,
45 DRAW_POS_TEXT_TOP_BOTTOM, // fast variant of DRAW_POS_TEXT
46 DRAW_POS_TEXT_H,
47 DRAW_POS_TEXT_H_TOP_BOTTOM, // fast variant of DRAW_POS_TEXT_H
48 DRAW_RECT,
49 DRAW_RRECT,
50 DRAW_SPRITE,
51 DRAW_TEXT,
52 DRAW_TEXT_ON_PATH,
53 DRAW_TEXT_TOP_BOTTOM, // fast variant of DRAW_TEXT
54 DRAW_VERTICES_RETIRED_03_2017,
55 RESTORE,
56 ROTATE,
57 SAVE,
58 SAVE_LAYER_SAVEFLAGS_DEPRECATED,
59 SCALE,
60 SET_MATRIX,
61 SKEW,
62 TRANSLATE,
63 NOOP,
64 BEGIN_COMMENT_GROUP, // deprecated (M44)
65 COMMENT, // deprecated (M44)
66 END_COMMENT_GROUP, // deprecated (M44)
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, // deprecated (M45)
78 DRAW_ATLAS,
79 DRAW_IMAGE_NINE,
80 DRAW_IMAGE_RECT,
81
82 SAVE_LAYER_SAVELAYERFLAGS_DEPRECATED_JAN_2016,
83 SAVE_LAYER_SAVELAYERREC,
84
85 DRAW_ANNOTATION,
86 DRAW_DRAWABLE,
87 DRAW_DRAWABLE_MATRIX,
88 DRAW_TEXT_RSXFORM,
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 LAST_DRAWTYPE_ENUM = DRAW_VERTICES_OBJECT
99 };
100
101 // In the 'match' method, this constant will match any flavor of DRAW_BITMAP*
102 static const int kDRAW_BITMAP_FLAVOR = LAST_DRAWTYPE_ENUM+1;
103
104 enum DrawVertexFlags {
105 DRAW_VERTICES_HAS_TEXS = 0x01,
106 DRAW_VERTICES_HAS_COLORS = 0x02,
107 DRAW_VERTICES_HAS_INDICES = 0x04,
108 DRAW_VERTICES_HAS_XFER = 0x08,
109 };
110
111 enum DrawAtlasFlags {
112 DRAW_ATLAS_HAS_COLORS = 1 << 0,
113 DRAW_ATLAS_HAS_CULL = 1 << 1,
114 };
115
116 enum DrawTextRSXformFlags {
117 DRAW_TEXT_RSXFORM_HAS_CULL = 1 << 0,
118 };
119
120 enum SaveLayerRecFlatFlags {
121 SAVELAYERREC_HAS_BOUNDS = 1 << 0,
122 SAVELAYERREC_HAS_PAINT = 1 << 1,
123 SAVELAYERREC_HAS_BACKDROP = 1 << 2,
124 SAVELAYERREC_HAS_FLAGS = 1 << 3,
125 SAVELAYERREC_HAS_CLIPMASK = 1 << 4,
126 SAVELAYERREC_HAS_CLIPMATRIX = 1 << 5,
127 };
128
129 ///////////////////////////////////////////////////////////////////////////////
130 // clipparams are packed in 5 bits
131 // doAA:1 | clipOp:4
132
ClipParams_pack(SkClipOp op,bool doAA)133 static inline uint32_t ClipParams_pack(SkClipOp op, bool doAA) {
134 unsigned doAABit = doAA ? 1 : 0;
135 return (doAABit << 4) | static_cast<int>(op);
136 }
137
asValidEnum(SkReadBuffer * buffer,uint32_t candidate)138 template <typename T> T asValidEnum(SkReadBuffer* buffer, uint32_t candidate) {
139
140 if (buffer->validate(candidate <= static_cast<uint32_t>(T::kMax_EnumValue))) {
141 return static_cast<T>(candidate);
142 }
143
144 return T::kMax_EnumValue;
145 }
146
ClipParams_unpackRegionOp(SkReadBuffer * buffer,uint32_t packed)147 static inline SkClipOp ClipParams_unpackRegionOp(SkReadBuffer* buffer, uint32_t packed) {
148 return asValidEnum<SkClipOp>(buffer, packed & 0xF);
149 }
150
ClipParams_unpackDoAA(uint32_t packed)151 static inline bool ClipParams_unpackDoAA(uint32_t packed) {
152 return SkToBool((packed >> 4) & 1);
153 }
154
155 ///////////////////////////////////////////////////////////////////////////////
156
157 class SkTypefacePlayback {
158 public:
159 SkTypefacePlayback();
160 virtual ~SkTypefacePlayback();
161
count()162 int count() const { return fCount; }
163
164 void reset(const SkRefCntSet*);
165
166 void setCount(int count);
167 SkRefCnt* set(int index, SkRefCnt*);
168
setupBuffer(SkReadBuffer & buffer)169 void setupBuffer(SkReadBuffer& buffer) const {
170 buffer.setTypefaceArray((SkTypeface**)fArray, fCount);
171 }
172
173 protected:
174 int fCount;
175 SkRefCnt** fArray;
176 };
177
178 class SkFactoryPlayback {
179 public:
SkFactoryPlayback(int count)180 SkFactoryPlayback(int count) : fCount(count) { fArray = new SkFlattenable::Factory[count]; }
181
~SkFactoryPlayback()182 ~SkFactoryPlayback() { delete[] fArray; }
183
base()184 SkFlattenable::Factory* base() const { return fArray; }
185
setupBuffer(SkReadBuffer & buffer)186 void setupBuffer(SkReadBuffer& buffer) const {
187 buffer.setFactoryPlayback(fArray, fCount);
188 }
189
190 private:
191 int fCount;
192 SkFlattenable::Factory* fArray;
193 };
194
195 #endif
196