Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(138)

Side by Side Diff: src/pipe/SkPipeReader.cpp

Issue 2201323003: add pipecanvas (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: initial reader Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« src/pipe/SkPipeFormat.h ('K') | « src/pipe/SkPipeFormat.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*
2 * Copyright 2016 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
8 #include "SkCanvas.h"
9 #include "SkPipeFormat.h"
10 #include "SkReadBuffer.h"
11
12 class SkPipeReader {
13 public:
14
15 bool parse(SkReadBuffer&, SkCanvas*);
16 };
17
18 template <typename T> const T* skip(SkReadBuffer& reader, int count) {
19 return (const T*)reader.skip(count * sizeof(T));
20 }
21
22 template <typename T> const T* skip(SkReadBuffer& reader) {
23 return (const T*)reader.skip(sizeof(T));
24 }
25
26 static SkRRect read_rrect(SkReadBuffer& reader) {
27 SkRRect rrect;
28 rrect.readFromMemory(reader.skip(SkRRect::kSizeInMemory), SkRRect::kSizeInMe mory);
29 return rrect;
30 }
31
32 //////////////////////////////////////////////////////////////////////////////// ///////////////////
33
34 #define CHECK_SET_SCALAR(Field) \
35 do { if (nondef & k##Field##_NonDef) { \
36 paint.set##Field(reader.readScalar()); \
37 }} while (0)
38
39 #define CHECK_SET_FLATTENABLE(Field) \
40 do { if (nondef & k##Field##_NonDef) { \
41 paint.set##Field(reader.read##Field()); \
42 }} while (0)
43
44 /*
45 * Header:
46 * paint flags : 32
47 * non_def bits : 16
48 * xfermode enum : 8
49 * pad zeros : 8
50 */
51 static SkPaint read_paint(SkReadBuffer& reader) {
52 uint32_t packedFlags = reader.read32();
53 uint32_t extra = reader.read32();
54 unsigned nondef = extra >> 16;
55 SkXfermode::Mode mode = (SkXfermode::Mode)((extra >> 8) & 0xFF);
56 SkASSERT((extra & 0xFF) == 0);
57
58 SkPaint paint;
59
60 packedFlags >>= 6;
61 paint.setStrokeJoin((SkPaint::Join)(packedFlags & 3)); packedFlags >>= 2;
62 paint.setStrokeCap((SkPaint::Cap)(packedFlags & 3)); packedFlags >>= 2;
63 paint.setFilterQuality((SkFilterQuality)(packedFlags & 3)); packedFlags >>= 2;
64 paint.setTextAlign((SkPaint::Align)(packedFlags & 3)); packedFlags >>= 2;
65 paint.setHinting((SkPaint::Hinting)(packedFlags & 2)); packedFlags >>= 2;
66 paint.setFlags(packedFlags);
67
68 CHECK_SET_SCALAR(TextSize);
69 CHECK_SET_SCALAR(TextScaleX);
70 CHECK_SET_SCALAR(TextSkewX);
71 CHECK_SET_SCALAR(StrokeWidth);
72 CHECK_SET_SCALAR(StrokeMiter);
73
74 if (nondef & kColor_NonDef) {
75 paint.setColor(reader.read32());
76 }
77 if (nondef & kTypeface_NonDef) {
78 }
79
80 CHECK_SET_FLATTENABLE(PathEffect);
81 CHECK_SET_FLATTENABLE(Shader);
82 CHECK_SET_FLATTENABLE(Xfermode);
83 CHECK_SET_FLATTENABLE(MaskFilter);
84 CHECK_SET_FLATTENABLE(ColorFilter);
85 CHECK_SET_FLATTENABLE(Rasterizer);
86 CHECK_SET_FLATTENABLE(ImageFilter);
87
88 if (!(nondef & kXfermode_NonDef)) {
89 paint.setXfermodeMode(mode);
90 }
91
92 return paint;
93 }
94
95 //////////////////////////////////////////////////////////////////////////////// ///////////////////
96
97 typedef void (*SkPipeHandler)(SkReadBuffer&, uint32_t packedVerb, SkCanvas*);
98
99 static void save_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanvas* ca nvas) {
100 SkASSERT(kSave_Verb == unpack_verb(packedVerb));
101 canvas->save();
102 }
103
104 static void restore_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanvas* canvas) {
105 SkASSERT(kRestore_Verb == unpack_verb(packedVerb));
106 canvas->restore();
107 }
108
109 static void concat_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanvas* canvas) {
110 SkASSERT(kConcat_Verb == unpack_verb(packedVerb));
111 SkMatrix::TypeMask tm = (SkMatrix::TypeMask)unpack_verb_extra(packedVerb);
112
113 SkMatrix matrix;
114 matrix.reset();
115 if (tm & SkMatrix::kPerspective_Mask) {
116 matrix.set9(skip<SkScalar>(reader, 9));
117 } else if (tm & SkMatrix::kAffine_Mask) {
118 const SkScalar* tmp = skip<SkScalar>(reader, 6);
119 matrix[SkMatrix::kMScaleX] = tmp[0];
120 matrix[SkMatrix::kMSkewX] = tmp[1];
121 matrix[SkMatrix::kMTransX] = tmp[2];
122 matrix[SkMatrix::kMScaleY] = tmp[3];
123 matrix[SkMatrix::kMSkewY] = tmp[4];
124 matrix[SkMatrix::kMTransY] = tmp[5];
125 } else if (tm & SkMatrix::kScale_Mask) {
126 const SkScalar* tmp = skip<SkScalar>(reader, 4);
127 matrix[SkMatrix::kMScaleX] = tmp[0];
128 matrix[SkMatrix::kMTransX] = tmp[1];
129 matrix[SkMatrix::kMScaleY] = tmp[2];
130 matrix[SkMatrix::kMTransY] = tmp[3];
131 } else if (tm & SkMatrix::kTranslate_Mask) {
132 const SkScalar* tmp = skip<SkScalar>(reader, 2);
133 matrix[SkMatrix::kMTransX] = tmp[0];
134 matrix[SkMatrix::kMTransY] = tmp[1];
135 }
136 canvas->concat(matrix);
137 }
138
139 static void clipRect_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanvas * canvas) {
140 SkASSERT(kClipRect_Verb == unpack_verb(packedVerb));
141 SkRegion::Op op = (SkRegion::Op)(unpack_verb_extra(packedVerb) >> 1);
142 bool isAA = unpack_verb_extra(packedVerb) & 1;
143 canvas->clipRect(*skip<SkRect>(reader), op, isAA);
144 }
145
146 static void clipRRect_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanva s* canvas) {
147 SkASSERT(kClipRect_Verb == unpack_verb(packedVerb));
148 SkRegion::Op op = (SkRegion::Op)(unpack_verb_extra(packedVerb) >> 1);
149 bool isAA = unpack_verb_extra(packedVerb) & 1;
150 canvas->clipRRect(read_rrect(reader), op, isAA);
151 }
152
153 static void clipPath_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanvas * canvas) {
154 SkASSERT(kClipRect_Verb == unpack_verb(packedVerb));
155 SkRegion::Op op = (SkRegion::Op)(unpack_verb_extra(packedVerb) >> 1);
156 bool isAA = unpack_verb_extra(packedVerb) & 1;
157 SkPath path;
158 reader.readPath(&path);
159 canvas->clipPath(path, op, isAA);
160 }
161
162 static void clipRegion_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanv as* canvas) {
163 SkASSERT(kClipRect_Verb == unpack_verb(packedVerb));
164 SkRegion::Op op = (SkRegion::Op)(unpack_verb_extra(packedVerb) >> 1);
165 SkRegion region;
166 reader.readRegion(&region);
167 canvas->clipRegion(region, op);
168 }
169
170 static void drawDRRect_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanv as* canvas) {
171 SkASSERT(kDrawDRRect_Verb == unpack_verb(packedVerb));
172 const SkRRect* outer = skip<SkRRect>(reader);
173 const SkRRect* inner = skip<SkRRect>(reader);
174 canvas->drawDRRect(*outer, *inner, read_paint(reader));
175 }
176
177 static void drawText_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanvas * canvas) {
178 SkASSERT(kDrawText_Verb == unpack_verb(packedVerb));
179 uint32_t len = unpack_verb_extra(packedVerb);
180 if (0 == len) {
181 len = reader.read32();
182 }
183 const void* text = reader.skip(SkAlign4(len));
184 SkScalar x = reader.readScalar();
185 SkScalar y = reader.readScalar();
186 canvas->drawText(text, len, x, y, read_paint(reader));
187 }
188
189 static void drawPosText_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCan vas* canvas) {
190 SkASSERT(kDrawPosText_Verb == unpack_verb(packedVerb));
191 uint32_t len = unpack_verb_extra(packedVerb);
192 if (0 == len) {
193 len = reader.read32();
194 }
195 const void* text = reader.skip(SkAlign4(len));
196 int count = reader.read32();
197 const SkPoint* pos = skip<SkPoint>(reader);
198 SkPaint paint = read_paint(reader);
199 SkASSERT(paint.countText(text, len) == count);
200 canvas->drawPosText(text, len, pos, paint);
201 }
202
203 static void drawPosTextH_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCa nvas* canvas) {
204 SkASSERT(kDrawPosTextH_Verb == unpack_verb(packedVerb));
205 uint32_t len = unpack_verb_extra(packedVerb);
206 if (0 == len) {
207 len = reader.read32();
208 }
209 const void* text = reader.skip(SkAlign4(len));
210 int count = reader.read32();
211 const SkScalar* xpos = skip<SkScalar>(reader);
212 SkScalar constY = reader.readScalar();
213 SkPaint paint = read_paint(reader);
214 SkASSERT(paint.countText(text, len) == count);
215 canvas->drawPosTextH(text, len, xpos, constY, paint);
216 }
217
218 static void drawTextOnPath_handler(SkReadBuffer& reader, uint32_t packedVerb, Sk Canvas* canvas) {
219 sk_throw();
220 }
221
222 static void drawTextBlob_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCa nvas* canvas) {
223 sk_throw();
224 }
225
226 static void drawTextRSXform_handler(SkReadBuffer& reader, uint32_t packedVerb, S kCanvas* canvas) {
227 sk_throw();
228 }
229
230 static void drawPatch_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanva s* canvas) {
231 sk_throw();
232 }
233
234 static void drawPaint_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanva s* canvas) {
235 sk_throw();
236 }
237
238 static void drawRect_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanvas * canvas) {
239 sk_throw();
240 }
241
242 static void drawOval_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanvas * canvas) {
243 sk_throw();
244 }
245
246 static void drawRRect_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanva s* canvas) {
247 sk_throw();
248 }
249
250 static void drawPath_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanvas * canvas) {
251 sk_throw();
252 }
253
254 static void drawPoints_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanv as* canvas) {
255 sk_throw();
256 }
257
258 static void drawImage_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCanva s* canvas) {
259 sk_throw();
260 }
261
262 static void drawImageRect_handler(SkReadBuffer& reader, uint32_t packedVerb, SkC anvas* canvas) {
263 sk_throw();
264 }
265
266 static void drawImageNine_handler(SkReadBuffer& reader, uint32_t packedVerb, SkC anvas* canvas) {
267 sk_throw();
268 }
269
270 static void drawVertices_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCa nvas* canvas) {
271 sk_throw();
272 }
273
274 static void drawPicture_handler(SkReadBuffer& reader, uint32_t packedVerb, SkCan vas* canvas) {
275 sk_throw();
276 }
277
278 static void drawAnnotation_handler(SkReadBuffer& reader, uint32_t packedVerb, Sk Canvas* canvas) {
279 sk_throw();
280 }
281
282 const SkPipeHandler gPipeHandlers[] = {
283 save_handler,
284 restore_handler,
285 concat_handler,
286
287 clipRect_handler,
288 clipRRect_handler,
289 clipPath_handler,
290 clipRegion_handler,
291
292 drawDRRect_handler,
293 drawText_handler,
294 drawPosText_handler,
295 drawPosTextH_handler,
296 drawTextOnPath_handler,
297 drawTextBlob_handler,
298 drawTextRSXform_handler,
299 drawPatch_handler,
300 drawPaint_handler,
301 drawPoints_handler,
302 drawRect_handler,
303 drawPath_handler,
304 drawOval_handler,
305 drawRRect_handler,
306
307 drawImage_handler,
308 drawImageRect_handler,
309 drawImageNine_handler,
310
311 drawVertices_handler,
312
313 drawPicture_handler,
314 drawAnnotation_handler,
315 };
316
317 //////////////////////////////////////////////////////////////////////////////// ///////////////////
318
319 bool SkPipeReader::parse(SkReadBuffer& reader, SkCanvas* canvas) {
320 while (!reader.eof()) {
321 uint32_t packedVerb = reader.read32();
322 Verb verb = unpack_verb(packedVerb);
323 if (verb > SK_ARRAY_COUNT(gPipeHandlers)) {
324 return false;
325 }
326 gPipeHandlers[verb](reader, packedVerb, canvas);
327 if (!reader.isValid()) {
328 return false;
329 }
330 }
331 return true;
332 }
OLDNEW
« src/pipe/SkPipeFormat.h ('K') | « src/pipe/SkPipeFormat.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698