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