Line data Source code
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,
91 :
92 : DRAW_SHADOWED_PICTURE_LIGHTS,
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 : };
126 :
127 : ///////////////////////////////////////////////////////////////////////////////
128 : // clipparams are packed in 5 bits
129 : // doAA:1 | clipOp:4
130 :
131 0 : static inline uint32_t ClipParams_pack(SkClipOp op, bool doAA) {
132 0 : unsigned doAABit = doAA ? 1 : 0;
133 0 : return (doAABit << 4) | static_cast<int>(op);
134 : }
135 :
136 0 : template <typename T> T asValidEnum(SkReadBuffer* buffer, uint32_t candidate) {
137 :
138 0 : if (buffer->validate(candidate <= static_cast<uint32_t>(T::kMax_EnumValue))) {
139 0 : return static_cast<T>(candidate);
140 : }
141 :
142 0 : return T::kMax_EnumValue;
143 : }
144 :
145 0 : static inline SkClipOp ClipParams_unpackRegionOp(SkReadBuffer* buffer, uint32_t packed) {
146 0 : return asValidEnum<SkClipOp>(buffer, packed & 0xF);
147 : }
148 :
149 0 : static inline bool ClipParams_unpackDoAA(uint32_t packed) {
150 0 : return SkToBool((packed >> 4) & 1);
151 : }
152 :
153 : ///////////////////////////////////////////////////////////////////////////////
154 :
155 : class SkTypefacePlayback {
156 : public:
157 : SkTypefacePlayback();
158 : virtual ~SkTypefacePlayback();
159 :
160 0 : int count() const { return fCount; }
161 :
162 : void reset(const SkRefCntSet*);
163 :
164 : void setCount(int count);
165 : SkRefCnt* set(int index, SkRefCnt*);
166 :
167 0 : void setupBuffer(SkReadBuffer& buffer) const {
168 0 : buffer.setTypefaceArray((SkTypeface**)fArray, fCount);
169 0 : }
170 :
171 : protected:
172 : int fCount;
173 : SkRefCnt** fArray;
174 : };
175 :
176 : class SkFactoryPlayback {
177 : public:
178 0 : SkFactoryPlayback(int count) : fCount(count) { fArray = new SkFlattenable::Factory[count]; }
179 :
180 0 : ~SkFactoryPlayback() { delete[] fArray; }
181 :
182 0 : SkFlattenable::Factory* base() const { return fArray; }
183 :
184 0 : void setupBuffer(SkReadBuffer& buffer) const {
185 0 : buffer.setFactoryPlayback(fArray, fCount);
186 0 : }
187 :
188 : private:
189 : int fCount;
190 : SkFlattenable::Factory* fArray;
191 : };
192 :
193 : #endif
|