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 "SkCanvasPriv.h"
10 #include "SkDeduper.h"
11 #include "SkDrawShadowInfo.h"
12 #include "SkPicture.h"
13 #include "SkPictureRecorder.h"
14 #include "SkPipe.h"
15 #include "SkPipeFormat.h"
16 #include "SkReadBuffer.h"
17 #include "SkRefSet.h"
18 #include "SkRSXform.h"
19 #include "SkTextBlob.h"
20 #include "SkTypeface.h"
21 #include "SkVertices.h"
22
23 class SkPipeReader;
24
25 static bool do_playback(SkPipeReader& reader, SkCanvas* canvas, int* endPictureIndex = nullptr);
26
27 ///////////////////////////////////////////////////////////////////////////////////////////////////
28
29 class SkPipeInflator : public SkInflator {
30 public:
SkPipeInflator(SkRefSet<SkImage> * images,SkRefSet<SkPicture> * pictures,SkRefSet<SkTypeface> * typefaces,SkTDArray<SkFlattenable::Factory> * factories,const SkDeserialProcs & procs)31 SkPipeInflator(SkRefSet<SkImage>* images, SkRefSet<SkPicture>* pictures,
32 SkRefSet<SkTypeface>* typefaces, SkTDArray<SkFlattenable::Factory>* factories,
33 const SkDeserialProcs& procs)
34 : fImages(images)
35 , fPictures(pictures)
36 , fTypefaces(typefaces)
37 , fFactories(factories)
38 , fProcs(procs)
39 {}
40
getImage(int index)41 SkImage* getImage(int index) override {
42 return index ? fImages->get(index - 1) : nullptr;
43 }
getPicture(int index)44 SkPicture* getPicture(int index) override {
45 return index ? fPictures->get(index - 1) : nullptr;
46 }
getTypeface(int index)47 SkTypeface* getTypeface(int index) override {
48 return fTypefaces->get(index - 1);
49 }
getFactory(int index)50 SkFlattenable::Factory getFactory(int index) override {
51 return index ? fFactories->getAt(index - 1) : nullptr;
52 }
53
setImage(int index,SkImage * img)54 bool setImage(int index, SkImage* img) {
55 return fImages->set(index - 1, img);
56 }
setPicture(int index,SkPicture * pic)57 bool setPicture(int index, SkPicture* pic) {
58 return fPictures->set(index - 1, pic);
59 }
setTypeface(int index,SkTypeface * face)60 bool setTypeface(int index, SkTypeface* face) {
61 return fTypefaces->set(index - 1, face);
62 }
setFactory(int index,SkFlattenable::Factory factory)63 bool setFactory(int index, SkFlattenable::Factory factory) {
64 SkASSERT(index > 0);
65 SkASSERT(factory);
66 index -= 1;
67 if ((unsigned)index < (unsigned)fFactories->count()) {
68 (*fFactories)[index] = factory;
69 return true;
70 }
71 if (fFactories->count() == index) {
72 *fFactories->append() = factory;
73 return true;
74 }
75 SkDebugf("setFactory: index [%d] out of range %d\n", index, fFactories->count());
76 return false;
77 }
78
setDeserialProcs(const SkDeserialProcs & procs)79 void setDeserialProcs(const SkDeserialProcs& procs) {
80 fProcs = procs;
81 }
82
83 sk_sp<SkTypeface> makeTypeface(const void* data, size_t size);
84 sk_sp<SkImage> makeImage(const sk_sp<SkData>&);
85
86 private:
87 SkRefSet<SkImage>* fImages;
88 SkRefSet<SkPicture>* fPictures;
89 SkRefSet<SkTypeface>* fTypefaces;
90 SkTDArray<SkFlattenable::Factory>* fFactories;
91 SkDeserialProcs fProcs;
92 };
93
94 ///////////////////////////////////////////////////////////////////////////////////////////////////
95
read_rrect(SkReadBuffer & reader)96 static SkRRect read_rrect(SkReadBuffer& reader) {
97 SkRRect rrect;
98 rrect.readFromMemory(reader.skip(SkRRect::kSizeInMemory), SkRRect::kSizeInMemory);
99 return rrect;
100 }
101
read_sparse_matrix(SkReadBuffer & reader,SkMatrix::TypeMask tm)102 static SkMatrix read_sparse_matrix(SkReadBuffer& reader, SkMatrix::TypeMask tm) {
103 SkMatrix matrix;
104 matrix.reset();
105
106 if (tm & SkMatrix::kPerspective_Mask) {
107 matrix.set9(reader.skipT<SkScalar>(9));
108 } else if (tm & SkMatrix::kAffine_Mask) {
109 const SkScalar* tmp = reader.skipT<SkScalar>(6);
110 matrix[SkMatrix::kMScaleX] = tmp[0];
111 matrix[SkMatrix::kMSkewX] = tmp[1];
112 matrix[SkMatrix::kMTransX] = tmp[2];
113 matrix[SkMatrix::kMScaleY] = tmp[3];
114 matrix[SkMatrix::kMSkewY] = tmp[4];
115 matrix[SkMatrix::kMTransY] = tmp[5];
116 } else if (tm & SkMatrix::kScale_Mask) {
117 const SkScalar* tmp = reader.skipT<SkScalar>(4);
118 matrix[SkMatrix::kMScaleX] = tmp[0];
119 matrix[SkMatrix::kMTransX] = tmp[1];
120 matrix[SkMatrix::kMScaleY] = tmp[2];
121 matrix[SkMatrix::kMTransY] = tmp[3];
122 } else if (tm & SkMatrix::kTranslate_Mask) {
123 const SkScalar* tmp = reader.skipT<SkScalar>(2);
124 matrix[SkMatrix::kMTransX] = tmp[0];
125 matrix[SkMatrix::kMTransY] = tmp[1];
126 }
127 // else read nothing for Identity
128 return matrix;
129 }
130
131 ///////////////////////////////////////////////////////////////////////////////////////////////////
132
133 #define CHECK_SET_SCALAR(Field) \
134 do { if (nondef & k##Field##_NonDef) { \
135 paint.set##Field(reader.readScalar()); \
136 }} while (0)
137
138 #define CHECK_SET_FLATTENABLE(Field) \
139 do { if (nondef & k##Field##_NonDef) { \
140 paint.set##Field(reader.read##Field()); \
141 }} while (0)
142
143 /*
144 * Header:
145 * paint flags : 32
146 * non_def bits : 16
147 * xfermode enum : 8
148 * pad zeros : 8
149 */
read_paint(SkReadBuffer & reader)150 static SkPaint read_paint(SkReadBuffer& reader) {
151 SkPaint paint;
152
153 uint32_t packedFlags = reader.read32();
154 uint32_t extra = reader.read32();
155 unsigned nondef = extra >> 16;
156 paint.setBlendMode(SkBlendMode((extra >> 8) & 0xFF));
157 SkASSERT((extra & 0xFF) == 0); // zero pad byte
158
159 packedFlags >>= 2; // currently unused
160 paint.setTextEncoding((SkPaint::TextEncoding)(packedFlags & 3)); packedFlags >>= 2;
161 paint.setTextAlign((SkPaint::Align)(packedFlags & 3)); packedFlags >>= 2;
162 paint.setHinting((SkPaint::Hinting)(packedFlags & 3)); packedFlags >>= 2;
163 paint.setStrokeJoin((SkPaint::Join)(packedFlags & 3)); packedFlags >>= 2;
164 paint.setStrokeCap((SkPaint::Cap)(packedFlags & 3)); packedFlags >>= 2;
165 paint.setStyle((SkPaint::Style)(packedFlags & 3)); packedFlags >>= 2;
166 paint.setFilterQuality((SkFilterQuality)(packedFlags & 3)); packedFlags >>= 2;
167 paint.setFlags(packedFlags);
168
169 CHECK_SET_SCALAR(TextSize);
170 CHECK_SET_SCALAR(TextScaleX);
171 CHECK_SET_SCALAR(TextSkewX);
172 CHECK_SET_SCALAR(StrokeWidth);
173 CHECK_SET_SCALAR(StrokeMiter);
174
175 if (nondef & kColor_NonDef) {
176 paint.setColor(reader.read32());
177 }
178
179 CHECK_SET_FLATTENABLE(Typeface);
180 CHECK_SET_FLATTENABLE(PathEffect);
181 CHECK_SET_FLATTENABLE(Shader);
182 CHECK_SET_FLATTENABLE(MaskFilter);
183 CHECK_SET_FLATTENABLE(ColorFilter);
184 CHECK_SET_FLATTENABLE(ImageFilter);
185 CHECK_SET_FLATTENABLE(DrawLooper);
186
187 return paint;
188 }
189
190 class SkPipeReader : public SkReadBuffer {
191 public:
SkPipeReader(SkPipeDeserializer * sink,const void * data,size_t size)192 SkPipeReader(SkPipeDeserializer* sink, const void* data, size_t size)
193 : SkReadBuffer(data, size)
194 , fSink(sink)
195 {}
196
197 SkPipeDeserializer* fSink;
198
findFactory(const char name[])199 SkFlattenable::Factory findFactory(const char name[]) {
200 SkFlattenable::Factory factory;
201 // Check if a custom Factory has been specified for this flattenable.
202 if (!(factory = this->getCustomFactory(SkString(name)))) {
203 // If there is no custom Factory, check for a default.
204 factory = SkFlattenable::NameToFactory(name);
205 }
206 return factory;
207 }
208
readPaint(SkPaint * paint)209 bool readPaint(SkPaint* paint) override {
210 *paint = read_paint(*this);
211 return this->isValid();
212 }
213 };
214
215 ///////////////////////////////////////////////////////////////////////////////////////////////////
216
217 typedef void (*SkPipeHandler)(SkPipeReader&, uint32_t packedVerb, SkCanvas*);
218
save_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)219 static void save_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
220 SkASSERT(SkPipeVerb::kSave == unpack_verb(packedVerb));
221 canvas->save();
222 }
223
saveLayer_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)224 static void saveLayer_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
225 SkASSERT(SkPipeVerb::kSaveLayer == unpack_verb(packedVerb));
226 unsigned extra = unpack_verb_extra(packedVerb);
227 const SkRect* bounds = (extra & kHasBounds_SaveLayerMask) ? reader.skipT<SkRect>() : nullptr;
228 SkPaint paintStorage, *paint = nullptr;
229 if (extra & kHasPaint_SaveLayerMask) {
230 paintStorage = read_paint(reader);
231 paint = &paintStorage;
232 }
233 sk_sp<SkImageFilter> backdrop;
234 if (extra & kHasBackdrop_SaveLayerMask) {
235 backdrop = reader.readImageFilter();
236 }
237 sk_sp<SkImage> clipMask;
238 if (extra & kHasClipMask_SaveLayerMask) {
239 clipMask = reader.readImage();
240 }
241 SkMatrix clipMatrix;
242 if (extra & kHasClipMatrix_SaveLayerMask) {
243 reader.readMatrix(&clipMatrix);
244 }
245 SkCanvas::SaveLayerFlags flags = (SkCanvas::SaveLayerFlags)(extra & kFlags_SaveLayerMask);
246
247 // unremap this wacky flag
248 if (extra & kDontClipToLayer_SaveLayerMask) {
249 flags |= (1 << 31);//SkCanvas::kDontClipToLayer_PrivateSaveLayerFlag;
250 }
251
252 canvas->saveLayer(SkCanvas::SaveLayerRec(bounds, paint, backdrop.get(), clipMask.get(),
253 (extra & kHasClipMatrix_SaveLayerMask) ? &clipMatrix : nullptr, flags));
254 }
255
restore_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)256 static void restore_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
257 SkASSERT(SkPipeVerb::kRestore == unpack_verb(packedVerb));
258 canvas->restore();
259 }
260
concat_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)261 static void concat_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
262 SkASSERT(SkPipeVerb::kConcat == unpack_verb(packedVerb));
263 SkMatrix::TypeMask tm = (SkMatrix::TypeMask)(packedVerb & kTypeMask_ConcatMask);
264 const SkMatrix matrix = read_sparse_matrix(reader, tm);
265 if (packedVerb & kSetMatrix_ConcatMask) {
266 canvas->setMatrix(matrix);
267 } else {
268 canvas->concat(matrix);
269 }
270 }
271
clipRect_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)272 static void clipRect_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
273 SkASSERT(SkPipeVerb::kClipRect == unpack_verb(packedVerb));
274 SkClipOp op = (SkClipOp)(unpack_verb_extra(packedVerb) >> 1);
275 bool isAA = unpack_verb_extra(packedVerb) & 1;
276 canvas->clipRect(*reader.skipT<SkRect>(), op, isAA);
277 }
278
clipRRect_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)279 static void clipRRect_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
280 SkASSERT(SkPipeVerb::kClipRRect == unpack_verb(packedVerb));
281 SkClipOp op = (SkClipOp)(unpack_verb_extra(packedVerb) >> 1);
282 bool isAA = unpack_verb_extra(packedVerb) & 1;
283 canvas->clipRRect(read_rrect(reader), op, isAA);
284 }
285
clipPath_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)286 static void clipPath_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
287 SkASSERT(SkPipeVerb::kClipPath == unpack_verb(packedVerb));
288 SkClipOp op = (SkClipOp)(unpack_verb_extra(packedVerb) >> 1);
289 bool isAA = unpack_verb_extra(packedVerb) & 1;
290 SkPath path;
291 reader.readPath(&path);
292 canvas->clipPath(path, op, isAA);
293 }
294
clipRegion_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)295 static void clipRegion_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
296 SkASSERT(SkPipeVerb::kClipRegion == unpack_verb(packedVerb));
297 SkClipOp op = (SkClipOp)(unpack_verb_extra(packedVerb) >> 1);
298 SkRegion region;
299 reader.readRegion(®ion);
300 canvas->clipRegion(region, op);
301 }
302
drawArc_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)303 static void drawArc_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
304 SkASSERT(SkPipeVerb::kDrawArc == unpack_verb(packedVerb));
305 const bool useCenter = (bool)(unpack_verb_extra(packedVerb) & 1);
306 const SkScalar* scalars = reader.skipT<SkScalar>(6); // bounds[0..3], start[4], sweep[5]
307 const SkRect* bounds = (const SkRect*)scalars;
308 canvas->drawArc(*bounds, scalars[4], scalars[5], useCenter, read_paint(reader));
309 }
310
drawAtlas_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)311 static void drawAtlas_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
312 SkASSERT(SkPipeVerb::kDrawAtlas == unpack_verb(packedVerb));
313 SkBlendMode mode = (SkBlendMode)(packedVerb & kMode_DrawAtlasMask);
314 sk_sp<SkImage> image(reader.readImage());
315 int count = reader.read32();
316 const SkRSXform* xform = reader.skipT<SkRSXform>(count);
317 const SkRect* rect = reader.skipT<SkRect>(count);
318 const SkColor* color = nullptr;
319 if (packedVerb & kHasColors_DrawAtlasMask) {
320 color = reader.skipT<SkColor>(count);
321 }
322 const SkRect* cull = nullptr;
323 if (packedVerb & kHasCull_DrawAtlasMask) {
324 cull = reader.skipT<SkRect>();
325 }
326 SkPaint paintStorage, *paint = nullptr;
327 if (packedVerb & kHasPaint_DrawAtlasMask) {
328 paintStorage = read_paint(reader);
329 paint = &paintStorage;
330 }
331 canvas->drawAtlas(image, xform, rect, color, count, mode, cull, paint);
332 }
333
drawDRRect_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)334 static void drawDRRect_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
335 SkASSERT(SkPipeVerb::kDrawDRRect == unpack_verb(packedVerb));
336 const SkRRect outer = read_rrect(reader);
337 const SkRRect inner = read_rrect(reader);
338 canvas->drawDRRect(outer, inner, read_paint(reader));
339 }
340
drawText_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)341 static void drawText_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
342 SkASSERT(SkPipeVerb::kDrawText == unpack_verb(packedVerb));
343 uint32_t len = unpack_verb_extra(packedVerb);
344 if (0 == len) {
345 len = reader.read32();
346 }
347 const void* text = reader.skip(SkAlign4(len));
348 SkScalar x = reader.readScalar();
349 SkScalar y = reader.readScalar();
350 canvas->drawText(text, len, x, y, read_paint(reader));
351 }
352
drawPosText_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)353 static void drawPosText_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
354 SkASSERT(SkPipeVerb::kDrawPosText == unpack_verb(packedVerb));
355 uint32_t len = unpack_verb_extra(packedVerb);
356 if (0 == len) {
357 len = reader.read32();
358 }
359 const void* text = reader.skip(SkAlign4(len));
360 int count = reader.read32();
361 const SkPoint* pos = reader.skipT<SkPoint>(count);
362 SkPaint paint = read_paint(reader);
363 SkASSERT(paint.countText(text, len) == count);
364 canvas->drawPosText(text, len, pos, paint);
365 }
366
drawPosTextH_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)367 static void drawPosTextH_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
368 SkASSERT(SkPipeVerb::kDrawPosTextH == unpack_verb(packedVerb));
369 uint32_t len = unpack_verb_extra(packedVerb);
370 if (0 == len) {
371 len = reader.read32();
372 }
373 const void* text = reader.skip(SkAlign4(len));
374 int count = reader.read32();
375 const SkScalar* xpos = reader.skipT<SkScalar>(count);
376 SkScalar constY = reader.readScalar();
377 SkPaint paint = read_paint(reader);
378 SkASSERT(paint.countText(text, len) == count);
379 canvas->drawPosTextH(text, len, xpos, constY, paint);
380 }
381
drawTextOnPath_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)382 static void drawTextOnPath_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
383 SkASSERT(SkPipeVerb::kDrawTextOnPath == unpack_verb(packedVerb));
384 uint32_t byteLength = packedVerb & kTextLength_DrawTextOnPathMask;
385 SkMatrix::TypeMask tm = (SkMatrix::TypeMask)
386 ((packedVerb & kMatrixType_DrawTextOnPathMask) >> kMatrixType_DrawTextOnPathShift);
387
388 if (0 == byteLength) {
389 byteLength = reader.read32();
390 }
391 const void* text = reader.skip(SkAlign4(byteLength));
392 SkPath path;
393 reader.readPath(&path);
394 const SkMatrix* matrix = nullptr;
395 SkMatrix matrixStorage;
396 if (tm != SkMatrix::kIdentity_Mask) {
397 matrixStorage = read_sparse_matrix(reader, tm);
398 matrix = &matrixStorage;
399 }
400 canvas->drawTextOnPath(text, byteLength, path, matrix, read_paint(reader));
401 }
402
drawTextBlob_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)403 static void drawTextBlob_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
404 sk_sp<SkTextBlob> tb = SkTextBlob::MakeFromBuffer(reader);
405 SkScalar x = reader.readScalar();
406 SkScalar y = reader.readScalar();
407 canvas->drawTextBlob(tb, x, y, read_paint(reader));
408 }
409
drawTextRSXform_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)410 static void drawTextRSXform_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
411 SkASSERT(SkPipeVerb::kDrawTextRSXform == unpack_verb(packedVerb));
412 uint32_t len = unpack_verb_extra(packedVerb) >> 1;
413 if (0 == len) {
414 len = reader.read32();
415 }
416 const void* text = reader.skip(SkAlign4(len));
417 int count = reader.read32();
418 const SkRSXform* xform = reader.skipT<SkRSXform>(count);
419 const SkRect* cull = (packedVerb & 1) ? reader.skipT<SkRect>() : nullptr;
420 SkPaint paint = read_paint(reader);
421 SkASSERT(paint.countText(text, len) == count);
422 canvas->drawTextRSXform(text, len, xform, cull, paint);
423 }
424
drawPatch_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)425 static void drawPatch_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
426 SkASSERT(SkPipeVerb::kDrawPatch == unpack_verb(packedVerb));
427 const SkColor* colors = nullptr;
428 const SkPoint* tex = nullptr;
429 const SkPoint* cubics = reader.skipT<SkPoint>(12);
430 if (packedVerb & kHasColors_DrawPatchExtraMask) {
431 colors = reader.skipT<SkColor>(4);
432 }
433 if (packedVerb & kHasTexture_DrawPatchExtraMask) {
434 tex = reader.skipT<SkPoint>(4);
435 }
436 SkBlendMode mode = (SkBlendMode)(packedVerb & kModeEnum_DrawPatchExtraMask);
437 canvas->drawPatch(cubics, colors, tex, mode, read_paint(reader));
438 }
439
drawPaint_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)440 static void drawPaint_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
441 SkASSERT(SkPipeVerb::kDrawPaint == unpack_verb(packedVerb));
442 canvas->drawPaint(read_paint(reader));
443 }
444
drawRect_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)445 static void drawRect_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
446 SkASSERT(SkPipeVerb::kDrawRect == unpack_verb(packedVerb));
447 const SkRect* rect = reader.skipT<SkRect>();
448 canvas->drawRect(*rect, read_paint(reader));
449 }
450
drawRegion_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)451 static void drawRegion_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
452 SkASSERT(SkPipeVerb::kDrawRegion == unpack_verb(packedVerb));
453 size_t size = unpack_verb_extra(packedVerb);
454 if (0 == size) {
455 size = reader.read32();
456 }
457 SkRegion region;
458 region.readFromMemory(reader.skipT<char>(size), size);
459 canvas->drawRegion(region, read_paint(reader));
460 }
461
drawOval_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)462 static void drawOval_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
463 SkASSERT(SkPipeVerb::kDrawOval == unpack_verb(packedVerb));
464 const SkRect* rect = reader.skipT<SkRect>();
465 canvas->drawOval(*rect, read_paint(reader));
466 }
467
drawRRect_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)468 static void drawRRect_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
469 SkASSERT(SkPipeVerb::kDrawRRect == unpack_verb(packedVerb));
470 SkRRect rrect = read_rrect(reader);
471 canvas->drawRRect(rrect, read_paint(reader));
472 }
473
drawPath_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)474 static void drawPath_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
475 SkASSERT(SkPipeVerb::kDrawPath == unpack_verb(packedVerb));
476 SkPath path;
477 reader.readPath(&path);
478 canvas->drawPath(path, read_paint(reader));
479 }
480
drawShadowRec_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)481 static void drawShadowRec_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
482 SkASSERT(SkPipeVerb::kDrawShadowRec == unpack_verb(packedVerb));
483 SkPath path;
484 reader.readPath(&path);
485 SkDrawShadowRec rec;
486 reader.readPad32(&rec, sizeof(rec));
487 canvas->private_draw_shadow_rec(path, rec);
488 }
489
drawPoints_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)490 static void drawPoints_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
491 SkASSERT(SkPipeVerb::kDrawPoints == unpack_verb(packedVerb));
492 SkCanvas::PointMode mode = (SkCanvas::PointMode)unpack_verb_extra(packedVerb);
493 int count = reader.read32();
494 const SkPoint* points = reader.skipT<SkPoint>(count);
495 canvas->drawPoints(mode, count, points, read_paint(reader));
496 }
497
drawImage_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)498 static void drawImage_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
499 SkASSERT(SkPipeVerb::kDrawImage == unpack_verb(packedVerb));
500 sk_sp<SkImage> image(reader.readImage());
501 SkScalar x = reader.readScalar();
502 SkScalar y = reader.readScalar();
503 SkPaint paintStorage, *paint = nullptr;
504 if (packedVerb & kHasPaint_DrawImageMask) {
505 paintStorage = read_paint(reader);
506 paint = &paintStorage;
507 }
508 canvas->drawImage(image, x, y, paint);
509 }
510
drawImageRect_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)511 static void drawImageRect_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
512 SkASSERT(SkPipeVerb::kDrawImageRect == unpack_verb(packedVerb));
513 sk_sp<SkImage> image(reader.readImage());
514 SkCanvas::SrcRectConstraint constraint =
515 (SkCanvas::SrcRectConstraint)(packedVerb & kConstraint_DrawImageRectMask);
516 const SkRect* src = (packedVerb & kHasSrcRect_DrawImageRectMask) ?
517 reader.skipT<SkRect>() : nullptr;
518 const SkRect* dst = reader.skipT<SkRect>();
519 SkPaint paintStorage, *paint = nullptr;
520 if (packedVerb & kHasPaint_DrawImageRectMask) {
521 paintStorage = read_paint(reader);
522 paint = &paintStorage;
523 }
524 if (src) {
525 canvas->drawImageRect(image, *src, *dst, paint, constraint);
526 } else {
527 canvas->drawImageRect(image, *dst, paint);
528 }
529 }
530
drawImageNine_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)531 static void drawImageNine_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
532 SkASSERT(SkPipeVerb::kDrawImageNine == unpack_verb(packedVerb));
533 sk_sp<SkImage> image(reader.readImage());
534 const SkIRect* center = reader.skipT<SkIRect>();
535 const SkRect* dst = reader.skipT<SkRect>();
536 SkPaint paintStorage, *paint = nullptr;
537 if (packedVerb & kHasPaint_DrawImageNineMask) {
538 paintStorage = read_paint(reader);
539 paint = &paintStorage;
540 }
541 canvas->drawImageNine(image, *center, *dst, paint);
542 }
543
drawImageLattice_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)544 static void drawImageLattice_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
545 SkASSERT(SkPipeVerb::kDrawImageLattice == unpack_verb(packedVerb));
546 sk_sp<SkImage> image(reader.readImage());
547
548 SkCanvas::Lattice lattice;
549 if (!SkCanvasPriv::ReadLattice(reader, &lattice)) {
550 return;
551 }
552 const SkRect* dst = reader.skipT<SkRect>();
553
554 SkPaint paintStorage, *paint = nullptr;
555 if (packedVerb & kHasPaint_DrawImageLatticeMask) {
556 paintStorage = read_paint(reader);
557 paint = &paintStorage;
558 }
559 canvas->drawImageLattice(image.get(), lattice, *dst, paint);
560 }
561
drawVertices_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)562 static void drawVertices_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
563 SkASSERT(SkPipeVerb::kDrawVertices == unpack_verb(packedVerb));
564 SkBlendMode bmode = (SkBlendMode)unpack_verb_extra(packedVerb);
565 sk_sp<SkData> data = reader.readByteArrayAsData();
566 canvas->drawVertices(SkVertices::Decode(data->data(), data->size()), bmode, read_paint(reader));
567 }
568
drawPicture_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)569 static void drawPicture_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
570 SkASSERT(SkPipeVerb::kDrawPicture == unpack_verb(packedVerb));
571 unsigned extra = unpack_verb_extra(packedVerb);
572 int index = extra & kIndex_ObjectDefinitionMask;
573 SkPicture* pic = reader.getInflator()->getPicture(index);
574 SkMatrix matrixStorage, *matrix = nullptr;
575 SkPaint paintStorage, *paint = nullptr;
576 if (extra & kHasMatrix_DrawPictureExtra) {
577 reader.readMatrix(&matrixStorage);
578 matrix = &matrixStorage;
579 }
580 if (extra & kHasPaint_DrawPictureExtra) {
581 paintStorage = read_paint(reader);
582 paint = &paintStorage;
583 }
584 canvas->drawPicture(pic, matrix, paint);
585 }
586
drawAnnotation_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)587 static void drawAnnotation_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
588 SkASSERT(SkPipeVerb::kDrawAnnotation == unpack_verb(packedVerb));
589 const SkRect* rect = reader.skipT<SkRect>();
590
591 // len includes the key's trailing 0
592 uint32_t len = unpack_verb_extra(packedVerb) >> 1;
593 if (0 == len) {
594 len = reader.read32();
595 }
596 const char* key = reader.skipT<char>(len);
597 sk_sp<SkData> data;
598 if (packedVerb & 1) {
599 uint32_t size = reader.read32();
600 data = SkData::MakeWithCopy(reader.skip(SkAlign4(size)), size);
601 }
602 canvas->drawAnnotation(*rect, key, data);
603 }
604
605 #if 0
606 stream.write("skiacodc", 8);
607 stream.write32(pmap.width());
608 stream.write32(pmap.height());
609 stream.write16(pmap.colorType());
610 stream.write16(pmap.alphaType());
611 stream.write32(0); // no colorspace for now
612 for (int y = 0; y < pmap.height(); ++y) {
613 stream.write(pmap.addr8(0, y), pmap.width());
614 }
615 #endif
616
makeImage(const sk_sp<SkData> & data)617 sk_sp<SkImage> SkPipeInflator::makeImage(const sk_sp<SkData>& data) {
618 if (fProcs.fImageProc) {
619 return fProcs.fImageProc(data->data(), data->size(), fProcs.fImageCtx);
620 }
621 return SkImage::MakeFromEncoded(data);
622 }
623
624
defineImage_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas *)625 static void defineImage_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas*) {
626 SkASSERT(SkPipeVerb::kDefineImage == unpack_verb(packedVerb));
627 SkPipeInflator* inflator = (SkPipeInflator*)reader.getInflator();
628 uint32_t extra = unpack_verb_extra(packedVerb);
629 int index = extra & kIndex_ObjectDefinitionMask;
630
631 if (extra & kUndef_ObjectDefinitionMask) {
632 // zero-index means we are "forgetting" that cache entry
633 inflator->setImage(index, nullptr);
634 } else {
635 // we are defining a new image
636 sk_sp<SkData> data = reader.readByteArrayAsData();
637 sk_sp<SkImage> image = inflator->makeImage(data);
638 if (!image) {
639 SkDebugf("-- failed to decode\n");
640 }
641 inflator->setImage(index, image.get());
642 }
643 }
644
makeTypeface(const void * data,size_t size)645 sk_sp<SkTypeface> SkPipeInflator::makeTypeface(const void* data, size_t size) {
646 if (fProcs.fTypefaceProc) {
647 return fProcs.fTypefaceProc(data, size, fProcs.fTypefaceCtx);
648 }
649 SkMemoryStream stream(data, size, false);
650 return SkTypeface::MakeDeserialize(&stream);
651 }
652
defineTypeface_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)653 static void defineTypeface_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
654 SkASSERT(SkPipeVerb::kDefineTypeface == unpack_verb(packedVerb));
655 SkPipeInflator* inflator = (SkPipeInflator*)reader.getInflator();
656 uint32_t extra = unpack_verb_extra(packedVerb);
657 int index = extra & kIndex_ObjectDefinitionMask;
658
659 if (extra & kUndef_ObjectDefinitionMask) {
660 // zero-index means we are "forgetting" that cache entry
661 inflator->setTypeface(index, nullptr);
662 } else {
663 // we are defining a new image
664 sk_sp<SkData> data = reader.readByteArrayAsData();
665 // TODO: seems like we could "peek" to see the array, and not need to copy it.
666 sk_sp<SkTypeface> tf = inflator->makeTypeface(data->data(), data->size());
667 inflator->setTypeface(index, tf.get());
668 }
669 }
670
defineFactory_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)671 static void defineFactory_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
672 SkASSERT(SkPipeVerb::kDefineFactory == unpack_verb(packedVerb));
673 SkPipeInflator* inflator = (SkPipeInflator*)reader.getInflator();
674 uint32_t extra = unpack_verb_extra(packedVerb);
675 int index = extra >> kNameLength_DefineFactoryExtraBits;
676 size_t len = extra & kNameLength_DefineFactoryExtraMask;
677 // +1 for the trailing null char
678 const char* name = (const char*)reader.skip(SkAlign4(len + 1));
679 SkFlattenable::Factory factory = reader.findFactory(name);
680 if (factory) {
681 inflator->setFactory(index, factory);
682 }
683 }
684
definePicture_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)685 static void definePicture_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
686 SkASSERT(SkPipeVerb::kDefinePicture == unpack_verb(packedVerb));
687 int deleteIndex = unpack_verb_extra(packedVerb);
688
689 SkPipeInflator* inflator = (SkPipeInflator*)reader.getInflator();
690
691 if (deleteIndex) {
692 inflator->setPicture(deleteIndex - 1, nullptr);
693 } else {
694 SkPictureRecorder recorder;
695 int pictureIndex = -1; // invalid
696 const SkRect* cull = reader.skipT<SkRect>();
697 if (!cull) {
698 return;
699 }
700 do_playback(reader, recorder.beginRecording(*cull), &pictureIndex);
701 SkASSERT(pictureIndex > 0);
702 sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
703 inflator->setPicture(pictureIndex, picture.get());
704 }
705 }
706
endPicture_handler(SkPipeReader & reader,uint32_t packedVerb,SkCanvas * canvas)707 static void endPicture_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
708 SK_ABORT("not reached"); // never call me
709 }
710
711 ///////////////////////////////////////////////////////////////////////////////////////////////////
712
713 struct HandlerRec {
714 SkPipeHandler fProc;
715 const char* fName;
716 };
717
718 #define HANDLER(name) { name##_handler, #name }
719 const HandlerRec gPipeHandlers[] = {
720 HANDLER(save),
721 HANDLER(saveLayer),
722 HANDLER(restore),
723 HANDLER(concat),
724
725 HANDLER(clipRect),
726 HANDLER(clipRRect),
727 HANDLER(clipPath),
728 HANDLER(clipRegion),
729
730 HANDLER(drawArc),
731 HANDLER(drawAtlas),
732 HANDLER(drawDRRect),
733 HANDLER(drawText),
734 HANDLER(drawPosText),
735 HANDLER(drawPosTextH),
736 HANDLER(drawRegion),
737 HANDLER(drawTextOnPath),
738 HANDLER(drawTextBlob),
739 HANDLER(drawTextRSXform),
740 HANDLER(drawPatch),
741 HANDLER(drawPaint),
742 HANDLER(drawPoints),
743 HANDLER(drawRect),
744 HANDLER(drawPath),
745 HANDLER(drawShadowRec),
746 HANDLER(drawOval),
747 HANDLER(drawRRect),
748
749 HANDLER(drawImage),
750 HANDLER(drawImageRect),
751 HANDLER(drawImageNine),
752 HANDLER(drawImageLattice),
753
754 HANDLER(drawVertices),
755
756 HANDLER(drawPicture),
757 HANDLER(drawAnnotation),
758
759 HANDLER(defineImage),
760 HANDLER(defineTypeface),
761 HANDLER(defineFactory),
762 HANDLER(definePicture),
763 HANDLER(endPicture), // handled special -- should never be called
764 };
765 #undef HANDLER
766
767 ///////////////////////////////////////////////////////////////////////////////////////////////////
768
769 class SkPipeDeserializer::Impl {
770 public:
771 SkRefSet<SkImage> fImages;
772 SkRefSet<SkPicture> fPictures;
773 SkRefSet<SkTypeface> fTypefaces;
774 SkTDArray<SkFlattenable::Factory> fFactories;
775 SkDeserialProcs fProcs;
776 };
777
SkPipeDeserializer()778 SkPipeDeserializer::SkPipeDeserializer() : fImpl(new Impl) {}
~SkPipeDeserializer()779 SkPipeDeserializer::~SkPipeDeserializer() {}
780
setDeserialProcs(const SkDeserialProcs & procs)781 void SkPipeDeserializer::setDeserialProcs(const SkDeserialProcs& procs) {
782 fImpl->fProcs = procs;
783 }
784
readImage(const void * data,size_t size)785 sk_sp<SkImage> SkPipeDeserializer::readImage(const void* data, size_t size) {
786 if (size < sizeof(uint32_t)) {
787 SkDebugf("-------- data length too short for readImage %d\n", size);
788 return nullptr;
789 }
790
791 const uint32_t* ptr = (const uint32_t*)data;
792 uint32_t packedVerb = *ptr++;
793 size -= 4;
794
795 if (SkPipeVerb::kDefineImage == unpack_verb(packedVerb)) {
796 SkPipeInflator inflator(&fImpl->fImages, &fImpl->fPictures,
797 &fImpl->fTypefaces, &fImpl->fFactories,
798 fImpl->fProcs);
799 SkPipeReader reader(this, ptr, size);
800 reader.setInflator(&inflator);
801 defineImage_handler(reader, packedVerb, nullptr);
802 packedVerb = reader.read32(); // read the next verb
803 }
804 if (SkPipeVerb::kWriteImage != unpack_verb(packedVerb)) {
805 SkDebugf("-------- unexpected verb for readImage %d\n", unpack_verb(packedVerb));
806 return nullptr;
807 }
808 int index = unpack_verb_extra(packedVerb);
809 if (0 == index) {
810 return nullptr; // writer failed
811 }
812 return sk_ref_sp(fImpl->fImages.get(index - 1));
813 }
814
readPicture(const void * data,size_t size)815 sk_sp<SkPicture> SkPipeDeserializer::readPicture(const void* data, size_t size) {
816 if (size < sizeof(uint32_t)) {
817 SkDebugf("-------- data length too short for readPicture %d\n", size);
818 return nullptr;
819 }
820
821 const uint32_t* ptr = (const uint32_t*)data;
822 uint32_t packedVerb = *ptr++;
823 size -= 4;
824
825 if (SkPipeVerb::kDefinePicture == unpack_verb(packedVerb)) {
826 SkPipeInflator inflator(&fImpl->fImages, &fImpl->fPictures,
827 &fImpl->fTypefaces, &fImpl->fFactories,
828 fImpl->fProcs);
829 SkPipeReader reader(this, ptr, size);
830 reader.setInflator(&inflator);
831 definePicture_handler(reader, packedVerb, nullptr);
832 packedVerb = reader.read32(); // read the next verb
833 }
834 if (SkPipeVerb::kWritePicture != unpack_verb(packedVerb)) {
835 SkDebugf("-------- unexpected verb for readPicture %d\n", unpack_verb(packedVerb));
836 return nullptr;
837 }
838 int index = unpack_verb_extra(packedVerb);
839 if (0 == index) {
840 return nullptr; // writer failed
841 }
842 return sk_ref_sp(fImpl->fPictures.get(index - 1));
843 }
844
do_playback(SkPipeReader & reader,SkCanvas * canvas,int * endPictureIndex)845 static bool do_playback(SkPipeReader& reader, SkCanvas* canvas, int* endPictureIndex) {
846 int indent = 0;
847
848 const bool showEachVerb = false;
849 int counter = 0;
850 while (!reader.eof()) {
851 uint32_t prevOffset = reader.offset();
852 uint32_t packedVerb = reader.read32();
853 SkPipeVerb verb = unpack_verb(packedVerb);
854 if ((unsigned)verb >= SK_ARRAY_COUNT(gPipeHandlers)) {
855 SkDebugf("------- bad verb %d\n", verb);
856 return false;
857 }
858 if (SkPipeVerb::kRestore == verb) {
859 indent -= 1;
860 SkASSERT(indent >= 0);
861 }
862
863 if (SkPipeVerb::kEndPicture == verb) {
864 if (endPictureIndex) {
865 *endPictureIndex = unpack_verb_extra(packedVerb);
866 }
867 return true;
868 }
869 HandlerRec rec = gPipeHandlers[(unsigned)verb];
870 rec.fProc(reader, packedVerb, canvas);
871 if (showEachVerb) {
872 for (int i = 0; i < indent; ++i) {
873 SkDebugf(" ");
874 }
875 SkDebugf("%d [%d] %s %d\n", prevOffset, counter++, rec.fName, reader.offset() - prevOffset);
876 }
877 if (!reader.isValid()) {
878 SkDebugf("-------- bad reader\n");
879 return false;
880 }
881
882 switch (verb) {
883 case SkPipeVerb::kSave:
884 case SkPipeVerb::kSaveLayer:
885 indent += 1;
886 break;
887 default:
888 break;
889 }
890 }
891 return true;
892 }
893
playback(const void * data,size_t size,SkCanvas * canvas)894 bool SkPipeDeserializer::playback(const void* data, size_t size, SkCanvas* canvas) {
895 SkPipeInflator inflator(&fImpl->fImages, &fImpl->fPictures,
896 &fImpl->fTypefaces, &fImpl->fFactories,
897 fImpl->fProcs);
898 SkPipeReader reader(this, data, size);
899 reader.setInflator(&inflator);
900 return do_playback(reader, canvas);
901 }
902
903