blob: 6310b15baefe72975f1fb90e1e29c1938ca2a83c [file] [log] [blame]
reed54dc4872016-09-13 08:09:45 -07001/*
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 "SkDeduper.h"
Mike Reed65820db2016-10-20 10:39:22 -040010#include "SkImageDeserializer.h"
reed54dc4872016-09-13 08:09:45 -070011#include "SkPicture.h"
12#include "SkPictureRecorder.h"
13#include "SkPipe.h"
14#include "SkPipeFormat.h"
15#include "SkReadBuffer.h"
16#include "SkRefSet.h"
17#include "SkRSXform.h"
18#include "SkTextBlob.h"
19#include "SkTypeface.h"
20
21class SkPipeReader;
22
23static bool do_playback(SkPipeReader& reader, SkCanvas* canvas, int* endPictureIndex = nullptr);
24
25///////////////////////////////////////////////////////////////////////////////////////////////////
26
27class SkPipeInflator : public SkInflator {
28public:
29 SkPipeInflator(SkRefSet<SkImage>* images, SkRefSet<SkPicture>* pictures,
30 SkRefSet<SkTypeface>* typefaces, SkTDArray<SkFlattenable::Factory>* factories,
Mike Reed3ac64b42016-10-18 19:34:08 -040031 SkTypefaceDeserializer* tfd, SkImageDeserializer* imd)
reed54dc4872016-09-13 08:09:45 -070032 : fImages(images)
33 , fPictures(pictures)
34 , fTypefaces(typefaces)
35 , fFactories(factories)
36 , fTFDeserializer(tfd)
Mike Reed3ac64b42016-10-18 19:34:08 -040037 , fIMDeserializer(imd)
reed54dc4872016-09-13 08:09:45 -070038 {}
39
40 SkImage* getImage(int index) override {
41 return index ? fImages->get(index - 1) : nullptr;
42 }
43 SkPicture* getPicture(int index) override {
44 return index ? fPictures->get(index - 1) : nullptr;
45 }
46 SkTypeface* getTypeface(int index) override {
47 return fTypefaces->get(index - 1);
48 }
49 SkFlattenable::Factory getFactory(int index) override {
50 return index ? fFactories->getAt(index - 1) : nullptr;
51 }
52
53 bool setImage(int index, SkImage* img) {
54 return fImages->set(index - 1, img);
55 }
56 bool setPicture(int index, SkPicture* pic) {
57 return fPictures->set(index - 1, pic);
58 }
59 bool setTypeface(int index, SkTypeface* face) {
60 return fTypefaces->set(index - 1, face);
61 }
62 bool setFactory(int index, SkFlattenable::Factory factory) {
63 SkASSERT(index > 0);
64 SkASSERT(factory);
65 index -= 1;
66 if ((unsigned)index < (unsigned)fFactories->count()) {
67 (*fFactories)[index] = factory;
68 return true;
69 }
70 if (fFactories->count() == index) {
71 *fFactories->append() = factory;
72 return true;
73 }
74 SkDebugf("setFactory: index [%d] out of range %d\n", index, fFactories->count());
75 return false;
76 }
77
78 void setTypefaceDeserializer(SkTypefaceDeserializer* tfd) {
79 fTFDeserializer = tfd;
80 }
Mike Reed3ac64b42016-10-18 19:34:08 -040081
82 void setImageDeserializer(SkImageDeserializer* imd) {
83 fIMDeserializer = imd;
84 }
85
reed54dc4872016-09-13 08:09:45 -070086 sk_sp<SkTypeface> makeTypeface(const void* data, size_t size);
Mike Reed3ac64b42016-10-18 19:34:08 -040087 sk_sp<SkImage> makeImage(const sk_sp<SkData>&);
reed54dc4872016-09-13 08:09:45 -070088
89private:
90 SkRefSet<SkImage>* fImages;
91 SkRefSet<SkPicture>* fPictures;
92 SkRefSet<SkTypeface>* fTypefaces;
93 SkTDArray<SkFlattenable::Factory>* fFactories;
94
95 SkTypefaceDeserializer* fTFDeserializer;
Mike Reed3ac64b42016-10-18 19:34:08 -040096 SkImageDeserializer* fIMDeserializer;
reed54dc4872016-09-13 08:09:45 -070097};
98
99///////////////////////////////////////////////////////////////////////////////////////////////////
100
101template <typename T> const T* skip(SkReadBuffer& reader, int count = 1) {
102 return (const T*)reader.skip(count * sizeof(T));
103}
104
105static SkRRect read_rrect(SkReadBuffer& reader) {
106 SkRRect rrect;
107 rrect.readFromMemory(reader.skip(SkRRect::kSizeInMemory), SkRRect::kSizeInMemory);
108 return rrect;
109}
110
111static SkMatrix read_sparse_matrix(SkReadBuffer& reader, SkMatrix::TypeMask tm) {
112 SkMatrix matrix;
113 matrix.reset();
114
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 // else read nothing for Identity
137 return matrix;
138}
139
140///////////////////////////////////////////////////////////////////////////////////////////////////
141
142#define CHECK_SET_SCALAR(Field) \
143 do { if (nondef & k##Field##_NonDef) { \
144 paint.set##Field(reader.readScalar()); \
145 }} while (0)
146
147#define CHECK_SET_FLATTENABLE(Field) \
148 do { if (nondef & k##Field##_NonDef) { \
149 paint.set##Field(reader.read##Field()); \
150 }} while (0)
151
152/*
153 * Header:
154 * paint flags : 32
155 * non_def bits : 16
156 * xfermode enum : 8
157 * pad zeros : 8
158 */
159static SkPaint read_paint(SkReadBuffer& reader) {
reed374772b2016-10-05 17:33:02 -0700160 SkPaint paint;
161
reed54dc4872016-09-13 08:09:45 -0700162 uint32_t packedFlags = reader.read32();
163 uint32_t extra = reader.read32();
164 unsigned nondef = extra >> 16;
reed374772b2016-10-05 17:33:02 -0700165 paint.setBlendMode(SkBlendMode((extra >> 8) & 0xFF));
166 SkASSERT((extra & 0xFF) == 0); // zero pad byte
reed54dc4872016-09-13 08:09:45 -0700167
168 packedFlags >>= 2; // currently unused
169 paint.setTextEncoding((SkPaint::TextEncoding)(packedFlags & 3)); packedFlags >>= 2;
170 paint.setTextAlign((SkPaint::Align)(packedFlags & 3)); packedFlags >>= 2;
171 paint.setHinting((SkPaint::Hinting)(packedFlags & 3)); packedFlags >>= 2;
172 paint.setStrokeJoin((SkPaint::Join)(packedFlags & 3)); packedFlags >>= 2;
173 paint.setStrokeCap((SkPaint::Cap)(packedFlags & 3)); packedFlags >>= 2;
174 paint.setStyle((SkPaint::Style)(packedFlags & 3)); packedFlags >>= 2;
175 paint.setFilterQuality((SkFilterQuality)(packedFlags & 3)); packedFlags >>= 2;
176 paint.setFlags(packedFlags);
177
178 CHECK_SET_SCALAR(TextSize);
179 CHECK_SET_SCALAR(TextScaleX);
180 CHECK_SET_SCALAR(TextSkewX);
181 CHECK_SET_SCALAR(StrokeWidth);
182 CHECK_SET_SCALAR(StrokeMiter);
183
184 if (nondef & kColor_NonDef) {
185 paint.setColor(reader.read32());
186 }
187
188 CHECK_SET_FLATTENABLE(Typeface);
189 CHECK_SET_FLATTENABLE(PathEffect);
190 CHECK_SET_FLATTENABLE(Shader);
reed54dc4872016-09-13 08:09:45 -0700191 CHECK_SET_FLATTENABLE(MaskFilter);
192 CHECK_SET_FLATTENABLE(ColorFilter);
193 CHECK_SET_FLATTENABLE(Rasterizer);
194 CHECK_SET_FLATTENABLE(ImageFilter);
195 CHECK_SET_FLATTENABLE(DrawLooper);
196
reed54dc4872016-09-13 08:09:45 -0700197 return paint;
198}
199
200class SkPipeReader : public SkReadBuffer {
201public:
202 SkPipeReader(SkPipeDeserializer* sink, const void* data, size_t size)
203 : SkReadBuffer(data, size)
204 , fSink(sink)
205 {}
206
207 SkPipeDeserializer* fSink;
208
209 SkFlattenable::Factory findFactory(const char name[]) {
210 SkFlattenable::Factory factory;
211 // Check if a custom Factory has been specified for this flattenable.
212 if (!(factory = this->getCustomFactory(SkString(name)))) {
213 // If there is no custom Factory, check for a default.
214 factory = SkFlattenable::NameToFactory(name);
215 }
216 return factory;
217 }
218
219 void readPaint(SkPaint* paint) override {
220 *paint = read_paint(*this);
221 }
222};
223
224///////////////////////////////////////////////////////////////////////////////////////////////////
225
226typedef void (*SkPipeHandler)(SkPipeReader&, uint32_t packedVerb, SkCanvas*);
227
228static void save_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
229 SkASSERT(SkPipeVerb::kSave == unpack_verb(packedVerb));
230 canvas->save();
231}
232
233static void saveLayer_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
234 SkASSERT(SkPipeVerb::kSaveLayer == unpack_verb(packedVerb));
235 unsigned extra = unpack_verb_extra(packedVerb);
236 const SkRect* bounds = (extra & kHasBounds_SaveLayerMask) ? skip<SkRect>(reader) : nullptr;
237 SkPaint paintStorage, *paint = nullptr;
238 if (extra & kHasPaint_SaveLayerMask) {
239 paintStorage = read_paint(reader);
240 paint = &paintStorage;
241 }
242 sk_sp<SkImageFilter> backdrop;
243 if (extra & kHasBackdrop_SaveLayerMask) {
244 backdrop = reader.readImageFilter();
245 }
246 SkCanvas::SaveLayerFlags flags = (SkCanvas::SaveLayerFlags)(extra & kFlags_SaveLayerMask);
247
248 // unremap this wacky flag
249 if (extra & kDontClipToLayer_SaveLayerMask) {
250 flags |= (1 << 31);//SkCanvas::kDontClipToLayer_PrivateSaveLayerFlag;
251 }
252
253 canvas->saveLayer(SkCanvas::SaveLayerRec(bounds, paint, backdrop.get(), flags));
254}
255
256static void restore_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
257 SkASSERT(SkPipeVerb::kRestore == unpack_verb(packedVerb));
258 canvas->restore();
259}
260
261static 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
272static void clipRect_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
273 SkASSERT(SkPipeVerb::kClipRect == unpack_verb(packedVerb));
Mike Reed8e7432b2016-12-08 16:06:37 -0500274 SkClipOp op = (SkClipOp)(unpack_verb_extra(packedVerb) >> 1);
reed54dc4872016-09-13 08:09:45 -0700275 bool isAA = unpack_verb_extra(packedVerb) & 1;
276 canvas->clipRect(*skip<SkRect>(reader), op, isAA);
277}
278
279static void clipRRect_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
280 SkASSERT(SkPipeVerb::kClipRRect == unpack_verb(packedVerb));
Mike Reed8e7432b2016-12-08 16:06:37 -0500281 SkClipOp op = (SkClipOp)(unpack_verb_extra(packedVerb) >> 1);
reed54dc4872016-09-13 08:09:45 -0700282 bool isAA = unpack_verb_extra(packedVerb) & 1;
283 canvas->clipRRect(read_rrect(reader), op, isAA);
284}
285
286static void clipPath_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
287 SkASSERT(SkPipeVerb::kClipPath == unpack_verb(packedVerb));
Mike Reed8e7432b2016-12-08 16:06:37 -0500288 SkClipOp op = (SkClipOp)(unpack_verb_extra(packedVerb) >> 1);
reed54dc4872016-09-13 08:09:45 -0700289 bool isAA = unpack_verb_extra(packedVerb) & 1;
290 SkPath path;
291 reader.readPath(&path);
292 canvas->clipPath(path, op, isAA);
293}
294
295static void clipRegion_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
296 SkASSERT(SkPipeVerb::kClipRegion == unpack_verb(packedVerb));
Mike Reed8e7432b2016-12-08 16:06:37 -0500297 SkClipOp op = (SkClipOp)(unpack_verb_extra(packedVerb) >> 1);
reed54dc4872016-09-13 08:09:45 -0700298 SkRegion region;
299 reader.readRegion(&region);
300 canvas->clipRegion(region, op);
301}
302
303static 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 = skip<SkScalar>(reader, 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
311static void drawAtlas_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
312 SkASSERT(SkPipeVerb::kDrawAtlas == unpack_verb(packedVerb));
Mike Reed7d954ad2016-10-28 15:42:34 -0400313 SkBlendMode mode = (SkBlendMode)(packedVerb & kMode_DrawAtlasMask);
reed54dc4872016-09-13 08:09:45 -0700314 sk_sp<SkImage> image(reader.readImage());
315 int count = reader.read32();
316 const SkRSXform* xform = skip<SkRSXform>(reader, count);
317 const SkRect* rect = skip<SkRect>(reader, count);
318 const SkColor* color = nullptr;
319 if (packedVerb & kHasColors_DrawAtlasMask) {
320 color = skip<SkColor>(reader, count);
321 }
322 const SkRect* cull = nullptr;
323 if (packedVerb & kHasCull_DrawAtlasMask) {
324 cull = skip<SkRect>(reader);
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
334static 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
341static 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
353static 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 = skip<SkPoint>(reader, count);
362 SkPaint paint = read_paint(reader);
363 SkASSERT(paint.countText(text, len) == count);
364 canvas->drawPosText(text, len, pos, paint);
365}
366
367static 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 = skip<SkScalar>(reader, 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
382static 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
403static 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
410static 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 = skip<SkRSXform>(reader, count);
419 const SkRect* cull = (packedVerb & 1) ? skip<SkRect>(reader) : nullptr;
420 SkPaint paint = read_paint(reader);
421 SkASSERT(paint.countText(text, len) == count);
422 canvas->drawTextRSXform(text, len, xform, cull, paint);
423}
424
425static 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 = skip<SkPoint>(reader, 12);
430 if (packedVerb & kHasColors_DrawPatchExtraMask) {
431 colors = skip<SkColor>(reader, 4);
432 }
433 if (packedVerb & kHasTexture_DrawPatchExtraMask) {
434 tex = skip<SkPoint>(reader, 4);
435 }
Mike Reed7d954ad2016-10-28 15:42:34 -0400436 SkBlendMode mode = (SkBlendMode)(packedVerb & kModeEnum_DrawPatchExtraMask);
437 canvas->drawPatch(cubics, colors, tex, mode, read_paint(reader));
reed54dc4872016-09-13 08:09:45 -0700438}
439
440static 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
445static void drawRect_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
446 SkASSERT(SkPipeVerb::kDrawRect == unpack_verb(packedVerb));
447 const SkRect* rect = skip<SkRect>(reader);
448 canvas->drawRect(*rect, read_paint(reader));
449}
450
451static 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(skip<char>(reader, SkAlign4(size)), size);
459 canvas->drawRegion(region, read_paint(reader));
460}
461
462static void drawOval_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
463 SkASSERT(SkPipeVerb::kDrawOval == unpack_verb(packedVerb));
464 const SkRect* rect = skip<SkRect>(reader);
465 canvas->drawOval(*rect, read_paint(reader));
466}
467
468static 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
474static 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
481static void drawPoints_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
482 SkASSERT(SkPipeVerb::kDrawPoints == unpack_verb(packedVerb));
483 SkCanvas::PointMode mode = (SkCanvas::PointMode)unpack_verb_extra(packedVerb);
484 int count = reader.read32();
485 const SkPoint* points = skip<SkPoint>(reader, count);
486 canvas->drawPoints(mode, count, points, read_paint(reader));
487}
488
489static void drawImage_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
490 SkASSERT(SkPipeVerb::kDrawImage == unpack_verb(packedVerb));
491 sk_sp<SkImage> image(reader.readImage());
492 SkScalar x = reader.readScalar();
493 SkScalar y = reader.readScalar();
494 SkPaint paintStorage, *paint = nullptr;
495 if (packedVerb & kHasPaint_DrawImageMask) {
496 paintStorage = read_paint(reader);
497 paint = &paintStorage;
498 }
499 canvas->drawImage(image, x, y, paint);
500}
501
502static void drawImageRect_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
503 SkASSERT(SkPipeVerb::kDrawImageRect == unpack_verb(packedVerb));
504 sk_sp<SkImage> image(reader.readImage());
505 SkCanvas::SrcRectConstraint constraint =
506 (SkCanvas::SrcRectConstraint)(packedVerb & kConstraint_DrawImageRectMask);
507 const SkRect* src = (packedVerb & kHasSrcRect_DrawImageRectMask) ?
508 skip<SkRect>(reader) : nullptr;
509 const SkRect* dst = skip<SkRect>(reader);
510 SkPaint paintStorage, *paint = nullptr;
511 if (packedVerb & kHasPaint_DrawImageRectMask) {
512 paintStorage = read_paint(reader);
513 paint = &paintStorage;
514 }
515 if (src) {
516 canvas->drawImageRect(image, *src, *dst, paint, constraint);
517 } else {
518 canvas->drawImageRect(image, *dst, paint);
519 }
520}
521
522static void drawImageNine_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
523 SkASSERT(SkPipeVerb::kDrawImageNine == unpack_verb(packedVerb));
524 sk_sp<SkImage> image(reader.readImage());
525 const SkIRect* center = skip<SkIRect>(reader);
526 const SkRect* dst = skip<SkRect>(reader);
527 SkPaint paintStorage, *paint = nullptr;
528 if (packedVerb & kHasPaint_DrawImageNineMask) {
529 paintStorage = read_paint(reader);
530 paint = &paintStorage;
531 }
532 canvas->drawImageNine(image, *center, *dst, paint);
533}
534
535static void drawImageLattice_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
536 SkASSERT(SkPipeVerb::kDrawImageLattice == unpack_verb(packedVerb));
537 sk_sp<SkImage> image(reader.readImage());
538
539 SkCanvas::Lattice lattice;
540 lattice.fXCount = (packedVerb >> kXCount_DrawImageLatticeShift) & kCount_DrawImageLatticeMask;
541 if (lattice.fXCount == kCount_DrawImageLatticeMask) {
542 lattice.fXCount = reader.read32();
543 }
544 lattice.fYCount = (packedVerb >> kXCount_DrawImageLatticeShift) & kCount_DrawImageLatticeMask;
545 if (lattice.fYCount == kCount_DrawImageLatticeMask) {
546 lattice.fYCount = reader.read32();
547 }
548 lattice.fXDivs = skip<int32_t>(reader, lattice.fXCount);
549 lattice.fYDivs = skip<int32_t>(reader, lattice.fYCount);
550 if (packedVerb & kHasFlags_DrawImageLatticeMask) {
551 int32_t count = (lattice.fXCount + 1) * (lattice.fYCount + 1);
552 SkASSERT(count > 0);
553 lattice.fFlags = skip<SkCanvas::Lattice::Flags>(reader, SkAlign4(count));
554 } else {
555 lattice.fFlags = nullptr;
556 }
msarett71df2d72016-09-30 12:41:42 -0700557 lattice.fBounds = skip<SkIRect>(reader);
reed54dc4872016-09-13 08:09:45 -0700558 const SkRect* dst = skip<SkRect>(reader);
559
560 SkPaint paintStorage, *paint = nullptr;
561 if (packedVerb & kHasPaint_DrawImageLatticeMask) {
562 paintStorage = read_paint(reader);
563 paint = &paintStorage;
564 }
565 canvas->drawImageLattice(image.get(), lattice, *dst, paint);
566}
567
568static void drawVertices_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
569 SkASSERT(SkPipeVerb::kDrawVertices == unpack_verb(packedVerb));
570 SkCanvas::VertexMode vmode = (SkCanvas::VertexMode)
571 ((packedVerb & kVMode_DrawVerticesMask) >> kVMode_DrawVerticesShift);
572 int vertexCount = packedVerb & kVCount_DrawVerticesMask;
573 if (0 == vertexCount) {
574 vertexCount = reader.read32();
575 }
Mike Reed7d954ad2016-10-28 15:42:34 -0400576 SkBlendMode bmode = (SkBlendMode)
577 ((packedVerb & kXMode_DrawVerticesMask) >> kXMode_DrawVerticesShift);
reed54dc4872016-09-13 08:09:45 -0700578 const SkPoint* vertices = skip<SkPoint>(reader, vertexCount);
579 const SkPoint* texs = nullptr;
580 if (packedVerb & kHasTex_DrawVerticesMask) {
581 texs = skip<SkPoint>(reader, vertexCount);
582 }
583 const SkColor* colors = nullptr;
584 if (packedVerb & kHasColors_DrawVerticesMask) {
585 colors = skip<SkColor>(reader, vertexCount);
586 }
587 int indexCount = 0;
588 const uint16_t* indices = nullptr;
589 if (packedVerb & kHasIndices_DrawVerticesMask) {
590 indexCount = reader.read32();
591 indices = skip<uint16_t>(reader, indexCount);
592 }
593
Mike Reed7d954ad2016-10-28 15:42:34 -0400594 canvas->drawVertices(vmode, vertexCount, vertices, texs, colors, bmode,
reed54dc4872016-09-13 08:09:45 -0700595 indices, indexCount, read_paint(reader));
596}
597
598static void drawPicture_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
599 SkASSERT(SkPipeVerb::kDrawPicture == unpack_verb(packedVerb));
600 unsigned extra = unpack_verb_extra(packedVerb);
601 int index = extra & kIndex_ObjectDefinitionMask;
602 SkPicture* pic = reader.getInflator()->getPicture(index);
603 SkMatrix matrixStorage, *matrix = nullptr;
604 SkPaint paintStorage, *paint = nullptr;
605 if (extra & kHasMatrix_DrawPictureExtra) {
606 reader.readMatrix(&matrixStorage);
607 matrix = &matrixStorage;
608 }
609 if (extra & kHasPaint_DrawPictureExtra) {
610 paintStorage = read_paint(reader);
611 paint = &paintStorage;
612 }
613 canvas->drawPicture(pic, matrix, paint);
614}
615
616static void drawAnnotation_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
617 SkASSERT(SkPipeVerb::kDrawAnnotation == unpack_verb(packedVerb));
618 const SkRect* rect = skip<SkRect>(reader);
619
620 // len includes the key's trailing 0
621 uint32_t len = unpack_verb_extra(packedVerb) >> 1;
622 if (0 == len) {
623 len = reader.read32();
624 }
625 const char* key = skip<char>(reader, len);
626 sk_sp<SkData> data;
627 if (packedVerb & 1) {
628 uint32_t size = reader.read32();
629 data = SkData::MakeWithCopy(reader.skip(SkAlign4(size)), size);
630 }
631 canvas->drawAnnotation(*rect, key, data);
632}
633
634#if 0
635 stream.write("skiacodc", 8);
636 stream.write32(pmap.width());
637 stream.write32(pmap.height());
638 stream.write16(pmap.colorType());
639 stream.write16(pmap.alphaType());
640 stream.write32(0); // no colorspace for now
641 for (int y = 0; y < pmap.height(); ++y) {
642 stream.write(pmap.addr8(0, y), pmap.width());
643 }
644#endif
645
646static sk_sp<SkImage> make_from_skiaimageformat(const void* encoded, size_t encodedSize) {
647 if (encodedSize < 24) {
648 return nullptr;
649 }
650
651 SkMemoryStream stream(encoded, encodedSize);
652 char signature[8];
653 stream.read(signature, 8);
654 if (memcmp(signature, "skiaimgf", 8)) {
655 return nullptr;
656 }
657
658 int width = stream.readU32();
659 int height = stream.readU32();
660 SkColorType ct = (SkColorType)stream.readU16();
661 SkAlphaType at = (SkAlphaType)stream.readU16();
662 SkASSERT(kAlpha_8_SkColorType == ct);
663
664 SkDEBUGCODE(size_t colorSpaceSize =) stream.readU32();
665 SkASSERT(0 == colorSpaceSize);
666
667 SkImageInfo info = SkImageInfo::Make(width, height, ct, at);
668 size_t size = width * height;
669 sk_sp<SkData> pixels = SkData::MakeUninitialized(size);
670 stream.read(pixels->writable_data(), size);
671 SkASSERT(encodedSize == SkAlign4(stream.getPosition()));
672 return SkImage::MakeRasterData(info, pixels, width);
673}
674
Mike Reed3ac64b42016-10-18 19:34:08 -0400675sk_sp<SkImage> SkPipeInflator::makeImage(const sk_sp<SkData>& data) {
676 if (fIMDeserializer) {
Mike Reed65820db2016-10-20 10:39:22 -0400677 return fIMDeserializer->makeFromData(data.get(), nullptr);
Mike Reed3ac64b42016-10-18 19:34:08 -0400678 }
reed54dc4872016-09-13 08:09:45 -0700679 sk_sp<SkImage> image = make_from_skiaimageformat(data->data(), data->size());
680 if (!image) {
681 image = SkImage::MakeFromEncoded(data);
682 }
683 return image;
684}
685
Mike Reed3ac64b42016-10-18 19:34:08 -0400686
reed7e3ba9f2016-09-13 17:25:19 -0700687static void defineImage_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas*) {
reed54dc4872016-09-13 08:09:45 -0700688 SkASSERT(SkPipeVerb::kDefineImage == unpack_verb(packedVerb));
689 SkPipeInflator* inflator = (SkPipeInflator*)reader.getInflator();
690 uint32_t extra = unpack_verb_extra(packedVerb);
691 int index = extra & kIndex_ObjectDefinitionMask;
692
693 if (extra & kUndef_ObjectDefinitionMask) {
694 // zero-index means we are "forgetting" that cache entry
695 inflator->setImage(index, nullptr);
696 } else {
697 // we are defining a new image
698 sk_sp<SkData> data = reader.readByteArrayAsData();
Mike Reed3ac64b42016-10-18 19:34:08 -0400699 sk_sp<SkImage> image = inflator->makeImage(data);
reed54dc4872016-09-13 08:09:45 -0700700 if (!image) {
701 SkDebugf("-- failed to decode\n");
702 }
703 inflator->setImage(index, image.get());
704 }
705}
706
707sk_sp<SkTypeface> SkPipeInflator::makeTypeface(const void* data, size_t size) {
708 if (fTFDeserializer) {
709 return fTFDeserializer->deserialize(data, size);
710 }
711 SkMemoryStream stream(data, size, false);
712 return SkTypeface::MakeDeserialize(&stream);
713}
714
715static void defineTypeface_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
716 SkASSERT(SkPipeVerb::kDefineTypeface == unpack_verb(packedVerb));
717 SkPipeInflator* inflator = (SkPipeInflator*)reader.getInflator();
718 uint32_t extra = unpack_verb_extra(packedVerb);
719 int index = extra & kIndex_ObjectDefinitionMask;
720
721 if (extra & kUndef_ObjectDefinitionMask) {
722 // zero-index means we are "forgetting" that cache entry
723 inflator->setTypeface(index, nullptr);
724 } else {
725 // we are defining a new image
726 sk_sp<SkData> data = reader.readByteArrayAsData();
727 // TODO: seems like we could "peek" to see the array, and not need to copy it.
728 sk_sp<SkTypeface> tf = inflator->makeTypeface(data->data(), data->size());
729 inflator->setTypeface(index, tf.get());
730 }
731}
732
733static void defineFactory_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
734 SkASSERT(SkPipeVerb::kDefineFactory == unpack_verb(packedVerb));
735 SkPipeInflator* inflator = (SkPipeInflator*)reader.getInflator();
736 uint32_t extra = unpack_verb_extra(packedVerb);
737 int index = extra >> kNameLength_DefineFactoryExtraBits;
738 size_t len = extra & kNameLength_DefineFactoryExtraMask;
739 // +1 for the trailing null char
740 const char* name = (const char*)reader.skip(SkAlign4(len + 1));
741 SkFlattenable::Factory factory = reader.findFactory(name);
742 if (factory) {
743 inflator->setFactory(index, factory);
744 }
745}
746
747static void definePicture_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
748 SkASSERT(SkPipeVerb::kDefinePicture == unpack_verb(packedVerb));
749 int deleteIndex = unpack_verb_extra(packedVerb);
750
751 SkPipeInflator* inflator = (SkPipeInflator*)reader.getInflator();
752
753 if (deleteIndex) {
754 inflator->setPicture(deleteIndex - 1, nullptr);
755 } else {
756 SkPictureRecorder recorder;
757 int pictureIndex = -1; // invalid
758 const SkRect* cull = skip<SkRect>(reader);
759 do_playback(reader, recorder.beginRecording(*cull), &pictureIndex);
760 SkASSERT(pictureIndex > 0);
761 sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
762 inflator->setPicture(pictureIndex, picture.get());
763 }
764}
765
766static void endPicture_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
767 sk_throw(); // never call me
768}
769
770///////////////////////////////////////////////////////////////////////////////////////////////////
771
772struct HandlerRec {
773 SkPipeHandler fProc;
774 const char* fName;
775};
776
777#define HANDLER(name) { name##_handler, #name }
778const HandlerRec gPipeHandlers[] = {
779 HANDLER(save),
780 HANDLER(saveLayer),
781 HANDLER(restore),
782 HANDLER(concat),
783
784 HANDLER(clipRect),
785 HANDLER(clipRRect),
786 HANDLER(clipPath),
787 HANDLER(clipRegion),
788
789 HANDLER(drawArc),
790 HANDLER(drawAtlas),
791 HANDLER(drawDRRect),
792 HANDLER(drawText),
793 HANDLER(drawPosText),
794 HANDLER(drawPosTextH),
795 HANDLER(drawRegion),
796 HANDLER(drawTextOnPath),
797 HANDLER(drawTextBlob),
798 HANDLER(drawTextRSXform),
799 HANDLER(drawPatch),
800 HANDLER(drawPaint),
801 HANDLER(drawPoints),
802 HANDLER(drawRect),
803 HANDLER(drawPath),
804 HANDLER(drawOval),
805 HANDLER(drawRRect),
806
807 HANDLER(drawImage),
808 HANDLER(drawImageRect),
809 HANDLER(drawImageNine),
810 HANDLER(drawImageLattice),
811
812 HANDLER(drawVertices),
813
814 HANDLER(drawPicture),
815 HANDLER(drawAnnotation),
816
817 HANDLER(defineImage),
818 HANDLER(defineTypeface),
819 HANDLER(defineFactory),
820 HANDLER(definePicture),
821 HANDLER(endPicture), // handled special -- should never be called
822};
823#undef HANDLER
824
825///////////////////////////////////////////////////////////////////////////////////////////////////
826
827class SkPipeDeserializer::Impl {
828public:
829 SkRefSet<SkImage> fImages;
830 SkRefSet<SkPicture> fPictures;
831 SkRefSet<SkTypeface> fTypefaces;
832 SkTDArray<SkFlattenable::Factory> fFactories;
833
834 SkTypefaceDeserializer* fTFDeserializer = nullptr;
Mike Reed3ac64b42016-10-18 19:34:08 -0400835 SkImageDeserializer* fIMDeserializer = nullptr;
reed54dc4872016-09-13 08:09:45 -0700836};
837
838SkPipeDeserializer::SkPipeDeserializer() : fImpl(new Impl) {}
839SkPipeDeserializer::~SkPipeDeserializer() {}
840
841void SkPipeDeserializer::setTypefaceDeserializer(SkTypefaceDeserializer* tfd) {
842 fImpl->fTFDeserializer = tfd;
843}
844
Mike Reed3ac64b42016-10-18 19:34:08 -0400845void SkPipeDeserializer::setImageDeserializer(SkImageDeserializer* imd) {
846 fImpl->fIMDeserializer = imd;
847}
848
reed54dc4872016-09-13 08:09:45 -0700849sk_sp<SkImage> SkPipeDeserializer::readImage(const void* data, size_t size) {
850 if (size < sizeof(uint32_t)) {
reed7e3ba9f2016-09-13 17:25:19 -0700851 SkDebugf("-------- data length too short for readImage %d\n", size);
reed54dc4872016-09-13 08:09:45 -0700852 return nullptr;
853 }
854
reed7e3ba9f2016-09-13 17:25:19 -0700855 const uint32_t* ptr = (const uint32_t*)data;
856 uint32_t packedVerb = *ptr++;
857 size -= 4;
858
859 if (SkPipeVerb::kDefineImage == unpack_verb(packedVerb)) {
860 SkPipeInflator inflator(&fImpl->fImages, &fImpl->fPictures,
861 &fImpl->fTypefaces, &fImpl->fFactories,
Mike Reed3ac64b42016-10-18 19:34:08 -0400862 fImpl->fTFDeserializer, fImpl->fIMDeserializer);
reed7e3ba9f2016-09-13 17:25:19 -0700863 SkPipeReader reader(this, ptr, size);
864 reader.setInflator(&inflator);
865 defineImage_handler(reader, packedVerb, nullptr);
866 packedVerb = reader.read32(); // read the next verb
867 }
868 if (SkPipeVerb::kWriteImage != unpack_verb(packedVerb)) {
869 SkDebugf("-------- unexpected verb for readImage %d\n", unpack_verb(packedVerb));
reed54dc4872016-09-13 08:09:45 -0700870 return nullptr;
871 }
reed7e3ba9f2016-09-13 17:25:19 -0700872 int index = unpack_verb_extra(packedVerb);
873 if (0 == index) {
874 return nullptr; // writer failed
875 }
876 return sk_ref_sp(fImpl->fImages.get(index - 1));
reed54dc4872016-09-13 08:09:45 -0700877}
878
reed262052c2016-09-15 14:24:53 -0700879sk_sp<SkPicture> SkPipeDeserializer::readPicture(const void* data, size_t size) {
880 if (size < sizeof(uint32_t)) {
881 SkDebugf("-------- data length too short for readPicture %d\n", size);
882 return nullptr;
883 }
884
885 const uint32_t* ptr = (const uint32_t*)data;
886 uint32_t packedVerb = *ptr++;
887 size -= 4;
888
889 if (SkPipeVerb::kDefinePicture == unpack_verb(packedVerb)) {
890 SkPipeInflator inflator(&fImpl->fImages, &fImpl->fPictures,
891 &fImpl->fTypefaces, &fImpl->fFactories,
Mike Reed3ac64b42016-10-18 19:34:08 -0400892 fImpl->fTFDeserializer, fImpl->fIMDeserializer);
reed262052c2016-09-15 14:24:53 -0700893 SkPipeReader reader(this, ptr, size);
894 reader.setInflator(&inflator);
895 definePicture_handler(reader, packedVerb, nullptr);
896 packedVerb = reader.read32(); // read the next verb
897 }
898 if (SkPipeVerb::kWritePicture != unpack_verb(packedVerb)) {
899 SkDebugf("-------- unexpected verb for readPicture %d\n", unpack_verb(packedVerb));
900 return nullptr;
901 }
902 int index = unpack_verb_extra(packedVerb);
903 if (0 == index) {
904 return nullptr; // writer failed
905 }
906 return sk_ref_sp(fImpl->fPictures.get(index - 1));
907}
908
reed54dc4872016-09-13 08:09:45 -0700909static bool do_playback(SkPipeReader& reader, SkCanvas* canvas, int* endPictureIndex) {
910 int indent = 0;
911
912 const bool showEachVerb = false;
913 int counter = 0;
914 while (!reader.eof()) {
915 uint32_t prevOffset = reader.offset();
916 uint32_t packedVerb = reader.read32();
917 SkPipeVerb verb = unpack_verb(packedVerb);
918 if ((unsigned)verb >= SK_ARRAY_COUNT(gPipeHandlers)) {
919 SkDebugf("------- bad verb %d\n", verb);
920 return false;
921 }
922 if (SkPipeVerb::kRestore == verb) {
923 indent -= 1;
924 SkASSERT(indent >= 0);
925 }
926
927 if (SkPipeVerb::kEndPicture == verb) {
928 if (endPictureIndex) {
929 *endPictureIndex = unpack_verb_extra(packedVerb);
930 }
931 return true;
932 }
933 HandlerRec rec = gPipeHandlers[(unsigned)verb];
934 rec.fProc(reader, packedVerb, canvas);
935 if (showEachVerb) {
936 for (int i = 0; i < indent; ++i) {
937 SkDebugf(" ");
938 }
939 SkDebugf("%d [%d] %s %d\n", prevOffset, counter++, rec.fName, reader.offset() - prevOffset);
940 }
941 if (!reader.isValid()) {
942 SkDebugf("-------- bad reader\n");
943 return false;
944 }
945
946 switch (verb) {
947 case SkPipeVerb::kSave:
948 case SkPipeVerb::kSaveLayer:
949 indent += 1;
950 break;
951 default:
952 break;
953 }
954 }
955 return true;
956}
957
958bool SkPipeDeserializer::playback(const void* data, size_t size, SkCanvas* canvas) {
959 SkPipeInflator inflator(&fImpl->fImages, &fImpl->fPictures,
960 &fImpl->fTypefaces, &fImpl->fFactories,
Mike Reed3ac64b42016-10-18 19:34:08 -0400961 fImpl->fTFDeserializer, fImpl->fIMDeserializer);
reed54dc4872016-09-13 08:09:45 -0700962 SkPipeReader reader(this, data, size);
963 reader.setInflator(&inflator);
964 return do_playback(reader, canvas);
965}
966