• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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(&region);
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