• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2012 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 #ifndef SKDRAWCOMMAND_H_
9 #define SKDRAWCOMMAND_H_
10 
11 #include "include/core/SkBitmap.h"
12 #include "include/core/SkCanvas.h"
13 #include "include/core/SkFlattenable.h"
14 #include "include/core/SkPath.h"
15 #include "include/core/SkRRect.h"
16 #include "include/core/SkRSXform.h"
17 #include "include/core/SkRegion.h"
18 #include "include/core/SkString.h"
19 #include "include/core/SkVertices.h"
20 #include "include/private/SkTDArray.h"
21 #include "src/core/SkDrawShadowInfo.h"
22 #include "src/core/SkTLazy.h"
23 #include "src/utils/SkJSONWriter.h"
24 #include "tools/UrlDataManager.h"
25 
26 class DebugLayerManager;
27 
28 class DrawCommand {
29 public:
30     enum OpType {
31         kBeginDrawPicture_OpType,
32         kClear_OpType,
33         kClipPath_OpType,
34         kClipRegion_OpType,
35         kClipRect_OpType,
36         kClipRRect_OpType,
37         kConcat_OpType,
38         kDrawAnnotation_OpType,
39         kDrawBitmap_OpType,
40         kDrawBitmapLattice_OpType,
41         kDrawBitmapNine_OpType,
42         kDrawBitmapRect_OpType,
43         kDrawDRRect_OpType,
44         kDrawImage_OpType,
45         kDrawImageLattice_OpType,
46         kDrawImageNine_OpType,
47         kDrawImageRect_OpType,
48         kDrawImageRectLayer_OpType, // unique to DebugCanvas
49         kDrawOval_OpType,
50         kDrawArc_OpType,
51         kDrawPaint_OpType,
52         kDrawPatch_OpType,
53         kDrawPath_OpType,
54         kDrawPoints_OpType,
55         kDrawRect_OpType,
56         kDrawRRect_OpType,
57         kDrawRegion_OpType,
58         kDrawShadow_OpType,
59         kDrawTextBlob_OpType,
60         kDrawVertices_OpType,
61         kDrawAtlas_OpType,
62         kDrawDrawable_OpType,
63         kDrawEdgeAAQuad_OpType,
64         kDrawEdgeAAImageSet_OpType,
65         kEndDrawPicture_OpType,
66         kRestore_OpType,
67         kSave_OpType,
68         kSaveLayer_OpType,
69         kSetMatrix_OpType,
70 
71         kLast_OpType = kSetMatrix_OpType
72     };
73 
74     static const int kOpTypeCount = kLast_OpType + 1;
75 
76     static void WritePNG(SkBitmap bitmap, SkWStream& out);
77 
78     DrawCommand(OpType opType);
79 
~DrawCommand()80     virtual ~DrawCommand() {}
81 
isVisible()82     bool isVisible() const { return fVisible; }
83 
setVisible(bool toggle)84     void setVisible(bool toggle) { fVisible = toggle; }
85 
86     virtual void execute(SkCanvas*) const = 0;
87 
render(SkCanvas * canvas)88     virtual bool render(SkCanvas* canvas) const { return false; }
89 
90     virtual void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const;
91 
92     static const char* GetCommandString(OpType type);
93 
94     // Helper methods for converting things to JSON
95     static void MakeJsonColor(SkJSONWriter&, const SkColor color);
96     static void MakeJsonColor4f(SkJSONWriter&, const SkColor4f& color);
97     static void MakeJsonPoint(SkJSONWriter&, const SkPoint& point);
98     static void MakeJsonPoint(SkJSONWriter&, SkScalar x, SkScalar y);
99     static void MakeJsonPoint3(SkJSONWriter&, const SkPoint3& point);
100     static void MakeJsonRect(SkJSONWriter&, const SkRect& rect);
101     static void MakeJsonIRect(SkJSONWriter&, const SkIRect&);
102     static void MakeJsonMatrix(SkJSONWriter&, const SkMatrix&);
103     static void MakeJsonPath(SkJSONWriter&, const SkPath& path);
104     static void MakeJsonRegion(SkJSONWriter&, const SkRegion& region);
105     static void MakeJsonPaint(SkJSONWriter&, const SkPaint& paint, UrlDataManager& urlDataManager);
106     static void MakeJsonLattice(SkJSONWriter&, const SkCanvas::Lattice& lattice);
107 
108     static void flatten(const SkFlattenable* flattenable,
109                         SkJSONWriter&        writer,
110                         UrlDataManager&      urlDataManager);
111     static bool flatten(const SkImage& image, SkJSONWriter& writer, UrlDataManager& urlDataManager);
112     static bool flatten(const SkBitmap& bitmap,
113                         SkJSONWriter&   writer,
114                         UrlDataManager& urlDataManager);
115 
116 private:
117     OpType fOpType;
118     bool   fVisible;
119 };
120 
121 class RestoreCommand : public DrawCommand {
122 public:
123     RestoreCommand();
124     void execute(SkCanvas* canvas) const override;
125 
126 private:
127     typedef DrawCommand INHERITED;
128 };
129 
130 class ClearCommand : public DrawCommand {
131 public:
132     ClearCommand(SkColor color);
133     void execute(SkCanvas* canvas) const override;
134     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
135 
136 private:
137     SkColor fColor;
138 
139     typedef DrawCommand INHERITED;
140 };
141 
142 class ClipPathCommand : public DrawCommand {
143 public:
144     ClipPathCommand(const SkPath& path, SkClipOp op, bool doAA);
145     void execute(SkCanvas* canvas) const override;
146     bool render(SkCanvas* canvas) const override;
147     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
148 
149 private:
150     SkPath   fPath;
151     SkClipOp fOp;
152     bool     fDoAA;
153 
154     typedef DrawCommand INHERITED;
155 };
156 
157 class ClipRegionCommand : public DrawCommand {
158 public:
159     ClipRegionCommand(const SkRegion& region, SkClipOp op);
160     void execute(SkCanvas* canvas) const override;
161     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
162 
163 private:
164     SkRegion fRegion;
165     SkClipOp fOp;
166 
167     typedef DrawCommand INHERITED;
168 };
169 
170 class ClipRectCommand : public DrawCommand {
171 public:
172     ClipRectCommand(const SkRect& rect, SkClipOp op, bool doAA);
173     void execute(SkCanvas* canvas) const override;
174     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
175 
176 private:
177     SkRect   fRect;
178     SkClipOp fOp;
179     bool     fDoAA;
180 
181     typedef DrawCommand INHERITED;
182 };
183 
184 class ClipRRectCommand : public DrawCommand {
185 public:
186     ClipRRectCommand(const SkRRect& rrect, SkClipOp op, bool doAA);
187     void execute(SkCanvas* canvas) const override;
188     bool render(SkCanvas* canvas) const override;
189     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
190 
191 private:
192     SkRRect  fRRect;
193     SkClipOp fOp;
194     bool     fDoAA;
195 
196     typedef DrawCommand INHERITED;
197 };
198 
199 class ConcatCommand : public DrawCommand {
200 public:
201     ConcatCommand(const SkMatrix& matrix);
202     void execute(SkCanvas* canvas) const override;
203     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
204 
205 private:
206     SkMatrix fMatrix;
207 
208     typedef DrawCommand INHERITED;
209 };
210 
211 class DrawAnnotationCommand : public DrawCommand {
212 public:
213     DrawAnnotationCommand(const SkRect&, const char key[], sk_sp<SkData> value);
214     void execute(SkCanvas* canvas) const override;
215     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
216 
217 private:
218     SkRect        fRect;
219     SkString      fKey;
220     sk_sp<SkData> fValue;
221 
222     typedef DrawCommand INHERITED;
223 };
224 
225 class DrawBitmapCommand : public DrawCommand {
226 public:
227     DrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top, const SkPaint* paint);
228     void execute(SkCanvas* canvas) const override;
229     bool render(SkCanvas* canvas) const override;
230     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
231 
232 private:
233     SkBitmap         fBitmap;
234     SkScalar         fLeft;
235     SkScalar         fTop;
236     SkTLazy<SkPaint> fPaint;
237 
238     typedef DrawCommand INHERITED;
239 };
240 
241 class DrawBitmapLatticeCommand : public DrawCommand {
242 public:
243     DrawBitmapLatticeCommand(const SkBitmap&          bitmap,
244                              const SkCanvas::Lattice& lattice,
245                              const SkRect&            dst,
246                              const SkPaint*           paint);
247     void execute(SkCanvas* canvas) const override;
248     bool render(SkCanvas* canvas) const override;
249     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
250 
251 private:
252     SkBitmap          fBitmap;
253     SkCanvas::Lattice fLattice;
254     SkRect            fDst;
255     SkTLazy<SkPaint>  fPaint;
256 
257     typedef DrawCommand INHERITED;
258 };
259 
260 class DrawBitmapNineCommand : public DrawCommand {
261 public:
262     DrawBitmapNineCommand(const SkBitmap& bitmap,
263                           const SkIRect&  center,
264                           const SkRect&   dst,
265                           const SkPaint*  paint);
266     void execute(SkCanvas* canvas) const override;
267     bool render(SkCanvas* canvas) const override;
268     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
269 
270 private:
271     SkBitmap         fBitmap;
272     SkIRect          fCenter;
273     SkRect           fDst;
274     SkTLazy<SkPaint> fPaint;
275 
276     typedef DrawCommand INHERITED;
277 };
278 
279 class DrawBitmapRectCommand : public DrawCommand {
280 public:
281     DrawBitmapRectCommand(const SkBitmap& bitmap,
282                           const SkRect*   src,
283                           const SkRect&   dst,
284                           const SkPaint*  paint,
285                           SkCanvas::SrcRectConstraint);
286     void execute(SkCanvas* canvas) const override;
287     bool render(SkCanvas* canvas) const override;
288     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
289 
290 private:
291     SkBitmap                    fBitmap;
292     SkTLazy<SkRect>             fSrc;
293     SkRect                      fDst;
294     SkTLazy<SkPaint>            fPaint;
295     SkCanvas::SrcRectConstraint fConstraint;
296 
297     typedef DrawCommand INHERITED;
298 };
299 
300 class DrawImageCommand : public DrawCommand {
301 public:
302     DrawImageCommand(const SkImage* image, SkScalar left, SkScalar top, const SkPaint* paint);
303     void execute(SkCanvas* canvas) const override;
304     bool render(SkCanvas* canvas) const override;
305     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
306 
307 private:
308     sk_sp<const SkImage> fImage;
309     SkScalar             fLeft;
310     SkScalar             fTop;
311     SkTLazy<SkPaint>     fPaint;
312 
313     typedef DrawCommand INHERITED;
314 };
315 
316 class DrawImageLatticeCommand : public DrawCommand {
317 public:
318     DrawImageLatticeCommand(const SkImage*           image,
319                             const SkCanvas::Lattice& lattice,
320                             const SkRect&            dst,
321                             const SkPaint*           paint);
322     void execute(SkCanvas* canvas) const override;
323     bool render(SkCanvas* canvas) const override;
324     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
325 
326 private:
327     sk_sp<const SkImage> fImage;
328     SkCanvas::Lattice    fLattice;
329     SkRect               fDst;
330     SkTLazy<SkPaint>     fPaint;
331 
332     typedef DrawCommand INHERITED;
333 };
334 
335 class DrawImageNineCommand : public DrawCommand {
336 public:
337     DrawImageNineCommand(const SkImage* image,
338                          const SkIRect& center,
339                          const SkRect&  dst,
340                          const SkPaint* paint);
341     void execute(SkCanvas* canvas) const override;
342     bool render(SkCanvas* canvas) const override;
343     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
344 
345 private:
346     sk_sp<const SkImage> fImage;
347     SkIRect              fCenter;
348     SkRect               fDst;
349     SkTLazy<SkPaint>     fPaint;
350 
351     typedef DrawCommand INHERITED;
352 };
353 
354 class DrawImageRectCommand : public DrawCommand {
355 public:
356     DrawImageRectCommand(const SkImage*              image,
357                          const SkRect*               src,
358                          const SkRect&               dst,
359                          const SkPaint*              paint,
360                          SkCanvas::SrcRectConstraint constraint);
361     void execute(SkCanvas* canvas) const override;
362     bool render(SkCanvas* canvas) const override;
363     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
364 
365 private:
366     sk_sp<const SkImage>        fImage;
367     SkTLazy<SkRect>             fSrc;
368     SkRect                      fDst;
369     SkTLazy<SkPaint>            fPaint;
370     SkCanvas::SrcRectConstraint fConstraint;
371 
372     typedef DrawCommand INHERITED;
373 };
374 
375 // Command for resolving the deferred SkImage representing an android layer
376 // Functions like DrawImageRect except it uses the saved UrlDataManager to resolve the image
377 // at the time execute() is called.
378 class DrawImageRectLayerCommand : public DrawCommand {
379 public:
380     DrawImageRectLayerCommand(DebugLayerManager*          layerManager,
381                               const int                   nodeId,
382                               const int                   frame,
383                               const SkRect*               src,
384                               const SkRect&               dst,
385                               const SkPaint*              paint,
386                               SkCanvas::SrcRectConstraint constraint);
387     void execute(SkCanvas* canvas) const override;
388     bool render(SkCanvas* canvas) const override;
389     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
390 
391 private:
392     DebugLayerManager*          fLayerManager;
393     int                         fNodeId;
394     int                         fFrame;
395     SkTLazy<SkRect>             fSrc;
396     SkRect                      fDst;
397     SkTLazy<SkPaint>            fPaint;
398     SkCanvas::SrcRectConstraint fConstraint;
399 
400     typedef DrawCommand INHERITED;
401 };
402 
403 class DrawOvalCommand : public DrawCommand {
404 public:
405     DrawOvalCommand(const SkRect& oval, const SkPaint& paint);
406     void execute(SkCanvas* canvas) const override;
407     bool render(SkCanvas* canvas) const override;
408     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
409 
410 private:
411     SkRect  fOval;
412     SkPaint fPaint;
413 
414     typedef DrawCommand INHERITED;
415 };
416 
417 class DrawArcCommand : public DrawCommand {
418 public:
419     DrawArcCommand(const SkRect&  oval,
420                    SkScalar       startAngle,
421                    SkScalar       sweepAngle,
422                    bool           useCenter,
423                    const SkPaint& paint);
424     void execute(SkCanvas* canvas) const override;
425     bool render(SkCanvas* canvas) const override;
426     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
427 
428 private:
429     SkRect   fOval;
430     SkScalar fStartAngle;
431     SkScalar fSweepAngle;
432     bool     fUseCenter;
433     SkPaint  fPaint;
434 
435     typedef DrawCommand INHERITED;
436 };
437 
438 class DrawPaintCommand : public DrawCommand {
439 public:
440     DrawPaintCommand(const SkPaint& paint);
441     void execute(SkCanvas* canvas) const override;
442     bool render(SkCanvas* canvas) const override;
443     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
444 
445 private:
446     SkPaint fPaint;
447 
448     typedef DrawCommand INHERITED;
449 };
450 
451 class DrawBehindCommand : public DrawCommand {
452 public:
453     DrawBehindCommand(const SkPaint& paint);
454     void execute(SkCanvas* canvas) const override;
455     bool render(SkCanvas* canvas) const override;
456     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
457 
458 private:
459     SkPaint fPaint;
460 
461     typedef DrawCommand INHERITED;
462 };
463 
464 class DrawPathCommand : public DrawCommand {
465 public:
466     DrawPathCommand(const SkPath& path, const SkPaint& paint);
467     void execute(SkCanvas* canvas) const override;
468     bool render(SkCanvas* canvas) const override;
469     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
470 
471 private:
472     SkPath  fPath;
473     SkPaint fPaint;
474 
475     typedef DrawCommand INHERITED;
476 };
477 
478 class BeginDrawPictureCommand : public DrawCommand {
479 public:
480     BeginDrawPictureCommand(const SkPicture* picture, const SkMatrix* matrix, const SkPaint* paint);
481 
482     void execute(SkCanvas* canvas) const override;
483     bool render(SkCanvas* canvas) const override;
484 
485 private:
486     sk_sp<const SkPicture> fPicture;
487     SkTLazy<SkMatrix>      fMatrix;
488     SkTLazy<SkPaint>       fPaint;
489 
490     typedef DrawCommand INHERITED;
491 };
492 
493 class EndDrawPictureCommand : public DrawCommand {
494 public:
495     EndDrawPictureCommand(bool restore);
496 
497     void execute(SkCanvas* canvas) const override;
498 
499 private:
500     bool fRestore;
501 
502     typedef DrawCommand INHERITED;
503 };
504 
505 class DrawPointsCommand : public DrawCommand {
506 public:
507     DrawPointsCommand(SkCanvas::PointMode mode,
508                       size_t              count,
509                       const SkPoint       pts[],
510                       const SkPaint&      paint);
511     void execute(SkCanvas* canvas) const override;
512     bool render(SkCanvas* canvas) const override;
513     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
514 
515 private:
516     SkCanvas::PointMode fMode;
517     SkTDArray<SkPoint>  fPts;
518     SkPaint             fPaint;
519 
520     typedef DrawCommand INHERITED;
521 };
522 
523 class DrawRegionCommand : public DrawCommand {
524 public:
525     DrawRegionCommand(const SkRegion& region, const SkPaint& paint);
526     void execute(SkCanvas* canvas) const override;
527     bool render(SkCanvas* canvas) const override;
528     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
529 
530 private:
531     SkRegion fRegion;
532     SkPaint  fPaint;
533 
534     typedef DrawCommand INHERITED;
535 };
536 
537 class DrawTextBlobCommand : public DrawCommand {
538 public:
539     DrawTextBlobCommand(sk_sp<SkTextBlob> blob, SkScalar x, SkScalar y, const SkPaint& paint);
540 
541     void execute(SkCanvas* canvas) const override;
542     bool render(SkCanvas* canvas) const override;
543     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
544 
545 private:
546     sk_sp<SkTextBlob> fBlob;
547     SkScalar          fXPos;
548     SkScalar          fYPos;
549     SkPaint           fPaint;
550 
551     typedef DrawCommand INHERITED;
552 };
553 
554 class DrawPatchCommand : public DrawCommand {
555 public:
556     DrawPatchCommand(const SkPoint  cubics[12],
557                      const SkColor  colors[4],
558                      const SkPoint  texCoords[4],
559                      SkBlendMode    bmode,
560                      const SkPaint& paint);
561     void execute(SkCanvas* canvas) const override;
562     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
563 
564 private:
565     SkPoint     fCubics[12];
566     SkColor*    fColorsPtr;
567     SkColor     fColors[4];
568     SkPoint*    fTexCoordsPtr;
569     SkPoint     fTexCoords[4];
570     SkBlendMode fBlendMode;
571     SkPaint     fPaint;
572 
573     typedef DrawCommand INHERITED;
574 };
575 
576 class DrawRectCommand : public DrawCommand {
577 public:
578     DrawRectCommand(const SkRect& rect, const SkPaint& paint);
579     void execute(SkCanvas* canvas) const override;
580     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
581 
582 private:
583     SkRect  fRect;
584     SkPaint fPaint;
585 
586     typedef DrawCommand INHERITED;
587 };
588 
589 class DrawRRectCommand : public DrawCommand {
590 public:
591     DrawRRectCommand(const SkRRect& rrect, const SkPaint& paint);
592     void execute(SkCanvas* canvas) const override;
593     bool render(SkCanvas* canvas) const override;
594     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
595 
596 private:
597     SkRRect fRRect;
598     SkPaint fPaint;
599 
600     typedef DrawCommand INHERITED;
601 };
602 
603 class DrawDRRectCommand : public DrawCommand {
604 public:
605     DrawDRRectCommand(const SkRRect& outer, const SkRRect& inner, const SkPaint& paint);
606     void execute(SkCanvas* canvas) const override;
607     bool render(SkCanvas* canvas) const override;
608     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
609 
610 private:
611     SkRRect fOuter;
612     SkRRect fInner;
613     SkPaint fPaint;
614 
615     typedef DrawCommand INHERITED;
616 };
617 
618 class DrawVerticesCommand : public DrawCommand {
619 public:
620     DrawVerticesCommand(sk_sp<SkVertices>, SkBlendMode, const SkPaint&);
621 
622     void execute(SkCanvas* canvas) const override;
623 
624 private:
625     sk_sp<SkVertices> fVertices;
626     SkBlendMode       fBlendMode;
627     SkPaint           fPaint;
628 
629     typedef DrawCommand INHERITED;
630 };
631 
632 class DrawAtlasCommand : public DrawCommand {
633 public:
634     DrawAtlasCommand(const SkImage*,
635                      const SkRSXform[],
636                      const SkRect[],
637                      const SkColor[],
638                      int,
639                      SkBlendMode,
640                      const SkRect*,
641                      const SkPaint*);
642 
643     void execute(SkCanvas* canvas) const override;
644 
645 private:
646     sk_sp<const SkImage> fImage;
647     SkTDArray<SkRSXform> fXform;
648     SkTDArray<SkRect>    fTex;
649     SkTDArray<SkColor>   fColors;
650     SkBlendMode          fBlendMode;
651     SkTLazy<SkRect>      fCull;
652     SkTLazy<SkPaint>     fPaint;
653 
654     typedef DrawCommand INHERITED;
655 };
656 
657 class SaveCommand : public DrawCommand {
658 public:
659     SaveCommand();
660     void execute(SkCanvas* canvas) const override;
661 
662 private:
663     typedef DrawCommand INHERITED;
664 };
665 
666 class SaveLayerCommand : public DrawCommand {
667 public:
668     SaveLayerCommand(const SkCanvas::SaveLayerRec&);
669     void execute(SkCanvas* canvas) const override;
670     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
671 
672 private:
673     SkTLazy<SkRect>            fBounds;
674     SkTLazy<SkPaint>           fPaint;
675     sk_sp<const SkImageFilter> fBackdrop;
676     uint32_t                   fSaveLayerFlags;
677 
678     typedef DrawCommand INHERITED;
679 };
680 
681 class SetMatrixCommand : public DrawCommand {
682 public:
683     SetMatrixCommand(const SkMatrix& matrix);
684     void execute(SkCanvas* canvas) const override;
685     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
686 
687 private:
688     SkMatrix fMatrix;
689 
690     typedef DrawCommand INHERITED;
691 };
692 
693 class DrawShadowCommand : public DrawCommand {
694 public:
695     DrawShadowCommand(const SkPath& path, const SkDrawShadowRec& rec);
696     void execute(SkCanvas* canvas) const override;
697     bool render(SkCanvas* canvas) const override;
698     void toJSON(SkJSONWriter& writer, UrlDataManager& urlDataManager) const override;
699 
700 private:
701     SkPath          fPath;
702     SkDrawShadowRec fShadowRec;
703 
704     typedef DrawCommand INHERITED;
705 };
706 
707 class DrawDrawableCommand : public DrawCommand {
708 public:
709     DrawDrawableCommand(SkDrawable*, const SkMatrix*);
710     void execute(SkCanvas* canvas) const override;
711 
712 private:
713     sk_sp<SkDrawable> fDrawable;
714     SkTLazy<SkMatrix> fMatrix;
715 
716     typedef DrawCommand INHERITED;
717 };
718 
719 class DrawEdgeAAQuadCommand : public DrawCommand {
720 public:
721     DrawEdgeAAQuadCommand(const SkRect&         rect,
722                           const SkPoint         clip[4],
723                           SkCanvas::QuadAAFlags aa,
724                           const SkColor4f&      color,
725                           SkBlendMode           mode);
726     void execute(SkCanvas* canvas) const override;
727 
728 private:
729     SkRect                fRect;
730     SkPoint               fClip[4];
731     int                   fHasClip;
732     SkCanvas::QuadAAFlags fAA;
733     SkColor4f             fColor;
734     SkBlendMode           fMode;
735 
736     typedef DrawCommand INHERITED;
737 };
738 
739 class DrawEdgeAAImageSetCommand : public DrawCommand {
740 public:
741     DrawEdgeAAImageSetCommand(const SkCanvas::ImageSetEntry[],
742                               int count,
743                               const SkPoint[],
744                               const SkMatrix[],
745                               const SkPaint*,
746                               SkCanvas::SrcRectConstraint);
747     void execute(SkCanvas* canvas) const override;
748 
749 private:
750     SkAutoTArray<SkCanvas::ImageSetEntry> fSet;
751     int                                   fCount;
752     SkAutoTArray<SkPoint>                 fDstClips;
753     SkAutoTArray<SkMatrix>                fPreViewMatrices;
754     SkTLazy<SkPaint>                      fPaint;
755     SkCanvas::SrcRectConstraint           fConstraint;
756 
757     typedef DrawCommand INHERITED;
758 };
759 #endif
760