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