SkDrawCommand.h revision 1446a9a67ab30cd93e3e9c6210daec86b062e234
1
2/*
3 * Copyright 2012 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9#ifndef SKDRAWCOMMAND_H_
10#define SKDRAWCOMMAND_H_
11
12#include "SkCanvas.h"
13#include "SkTLazy.h"
14#include "SkPath.h"
15#include "SkRRect.h"
16#include "SkString.h"
17#include "SkTDArray.h"
18#include "SkJSONCPP.h"
19
20class SK_API SkDrawCommand {
21public:
22    enum OpType {
23        kBeginDrawPicture_OpType,
24        kClipPath_OpType,
25        kClipRegion_OpType,
26        kClipRect_OpType,
27        kClipRRect_OpType,
28        kConcat_OpType,
29        kDrawBitmap_OpType,
30        kDrawBitmapNine_OpType,
31        kDrawBitmapRect_OpType,
32        kDrawClear_OpType,
33        kDrawDRRect_OpType,
34        kDrawImage_OpType,
35        kDrawImageRect_OpType,
36        kDrawOval_OpType,
37        kDrawPaint_OpType,
38        kDrawPatch_OpType,
39        kDrawPath_OpType,
40        kDrawPoints_OpType,
41        kDrawPosText_OpType,
42        kDrawPosTextH_OpType,
43        kDrawRect_OpType,
44        kDrawRRect_OpType,
45        kDrawText_OpType,
46        kDrawTextBlob_OpType,
47        kDrawTextOnPath_OpType,
48        kDrawVertices_OpType,
49        kEndDrawPicture_OpType,
50        kRestore_OpType,
51        kSave_OpType,
52        kSaveLayer_OpType,
53        kSetMatrix_OpType,
54
55        kLast_OpType = kSetMatrix_OpType
56    };
57
58    static const int kOpTypeCount = kLast_OpType + 1;
59
60    SkDrawCommand(OpType opType);
61
62    virtual ~SkDrawCommand();
63
64    virtual SkString toString() const;
65
66    virtual const char* toCString() const {
67        return GetCommandString(fOpType);
68    }
69
70    bool isVisible() const {
71        return fVisible;
72    }
73
74    void setVisible(bool toggle) {
75        fVisible = toggle;
76    }
77
78    const SkTDArray<SkString*>* Info() const { return &fInfo; }
79    virtual void execute(SkCanvas*) const = 0;
80    virtual void vizExecute(SkCanvas*) const {}
81
82    virtual void setUserMatrix(const SkMatrix&) {}
83
84    // The next "active" system is only used by save, saveLayer, and restore.
85    // It is used to determine which saveLayers are currently active (at a
86    // given point in the rendering).
87    //      saves just return a kPushLayer action but don't track active state
88    //      restores just return a kPopLayer action
89    //      saveLayers return kPushLayer but also track the active state
90    enum Action {
91        kNone_Action,
92        kPopLayer_Action,
93        kPushLayer_Action,
94    };
95    virtual Action action() const { return kNone_Action; }
96    virtual void setActive(bool active) {}
97    virtual bool active() const { return false; }
98
99    OpType getType() const { return fOpType; }
100
101    virtual bool render(SkCanvas* canvas) const { return false; }
102
103    virtual Json::Value toJSON() const;
104
105    /* Converts a JSON representation of a command into a newly-allocated SkDrawCommand object. It
106     * is the caller's responsibility to delete this object. This method may return null if an error
107     * occurs.
108     */
109    static SkDrawCommand* fromJSON(Json::Value& command);
110
111    static const char* GetCommandString(OpType type);
112
113protected:
114    SkTDArray<SkString*> fInfo;
115
116private:
117    OpType fOpType;
118    bool   fVisible;
119};
120
121class SkRestoreCommand : public SkDrawCommand {
122public:
123    SkRestoreCommand();
124    void execute(SkCanvas* canvas) const override;
125    Action action() const override { return kPopLayer_Action; }
126    static SkRestoreCommand* fromJSON(Json::Value& command);
127
128private:
129    typedef SkDrawCommand INHERITED;
130};
131
132class SkClearCommand : public SkDrawCommand {
133public:
134    SkClearCommand(SkColor color);
135    void execute(SkCanvas* canvas) const override;
136    Json::Value toJSON() const override;
137    static SkClearCommand* fromJSON(Json::Value& command);
138
139private:
140    SkColor fColor;
141
142    typedef SkDrawCommand INHERITED;
143};
144
145class SkClipPathCommand : public SkDrawCommand {
146public:
147    SkClipPathCommand(const SkPath& path, SkRegion::Op op, bool doAA);
148    void execute(SkCanvas* canvas) const override;
149    bool render(SkCanvas* canvas) const override;
150    Json::Value toJSON() const override;
151    static SkClipPathCommand* fromJSON(Json::Value& command);
152
153private:
154    SkPath       fPath;
155    SkRegion::Op fOp;
156    bool         fDoAA;
157
158    typedef SkDrawCommand INHERITED;
159};
160
161class SkClipRegionCommand : public SkDrawCommand {
162public:
163    SkClipRegionCommand(const SkRegion& region, SkRegion::Op op);
164    void execute(SkCanvas* canvas) const override;
165    Json::Value toJSON() const override;
166    static SkClipRegionCommand* fromJSON(Json::Value& command);
167
168private:
169    SkRegion     fRegion;
170    SkRegion::Op fOp;
171
172    typedef SkDrawCommand INHERITED;
173};
174
175class SkClipRectCommand : public SkDrawCommand {
176public:
177    SkClipRectCommand(const SkRect& rect, SkRegion::Op op, bool doAA);
178    void execute(SkCanvas* canvas) const override;
179    Json::Value toJSON() const override;
180    static SkClipRectCommand* fromJSON(Json::Value& command);
181
182    const SkRect& rect() const { return fRect; }
183    SkRegion::Op op() const { return fOp; }
184    bool doAA() const { return fDoAA; }
185
186private:
187    SkRect       fRect;
188    SkRegion::Op fOp;
189    bool         fDoAA;
190
191    typedef SkDrawCommand INHERITED;
192};
193
194class SkClipRRectCommand : public SkDrawCommand {
195public:
196    SkClipRRectCommand(const SkRRect& rrect, SkRegion::Op op, bool doAA);
197    void execute(SkCanvas* canvas) const override;
198    bool render(SkCanvas* canvas) const override;
199    Json::Value toJSON() const override;
200    static SkClipRRectCommand* fromJSON(Json::Value& command);
201
202    const SkRRect& rrect() const { return fRRect; }
203    SkRegion::Op op() const { return fOp; }
204    bool doAA() const { return fDoAA; }
205
206private:
207    SkRRect      fRRect;
208    SkRegion::Op fOp;
209    bool         fDoAA;
210
211    typedef SkDrawCommand INHERITED;
212};
213
214class SkConcatCommand : public SkDrawCommand {
215public:
216    SkConcatCommand(const SkMatrix& matrix);
217    void execute(SkCanvas* canvas) const override;
218    Json::Value toJSON() const override;
219    static SkConcatCommand* fromJSON(Json::Value& command);
220
221private:
222    SkMatrix fMatrix;
223
224    typedef SkDrawCommand INHERITED;
225};
226
227class SkDrawBitmapCommand : public SkDrawCommand {
228public:
229    SkDrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top,
230                        const SkPaint* paint);
231    void execute(SkCanvas* canvas) const override;
232    bool render(SkCanvas* canvas) const override;
233    Json::Value toJSON() const override;
234    static SkDrawBitmapCommand* fromJSON(Json::Value& command);
235
236private:
237    SkBitmap fBitmap;
238    SkScalar fLeft;
239    SkScalar fTop;
240    SkPaint  fPaint;
241    SkPaint* fPaintPtr;
242
243    typedef SkDrawCommand INHERITED;
244};
245
246class SkDrawBitmapNineCommand : public SkDrawCommand {
247public:
248    SkDrawBitmapNineCommand(const SkBitmap& bitmap, const SkIRect& center,
249                            const SkRect& dst, const SkPaint* paint);
250    void execute(SkCanvas* canvas) const override;
251    bool render(SkCanvas* canvas) const override;
252    Json::Value toJSON() const override;
253    static SkDrawBitmapNineCommand* fromJSON(Json::Value& command);
254
255private:
256    SkBitmap fBitmap;
257    SkIRect  fCenter;
258    SkRect   fDst;
259    SkPaint  fPaint;
260    SkPaint* fPaintPtr;
261
262    typedef SkDrawCommand INHERITED;
263};
264
265class SkDrawBitmapRectCommand : public SkDrawCommand {
266public:
267    SkDrawBitmapRectCommand(const SkBitmap& bitmap, const SkRect* src,
268                            const SkRect& dst, const SkPaint* paint,
269                            SkCanvas::SrcRectConstraint);
270    void execute(SkCanvas* canvas) const override;
271    bool render(SkCanvas* canvas) const override;
272    Json::Value toJSON() const override;
273    static SkDrawBitmapRectCommand* fromJSON(Json::Value& command);
274
275    const SkBitmap& bitmap() const { return fBitmap; }
276
277    // The non-const 'paint' method allows modification of this object's
278    // SkPaint. For this reason the ctor and setPaint method make a local copy.
279    // The 'fPaintPtr' member acts a signal that the local SkPaint is valid
280    // (since only an SkPaint* is passed into the ctor).
281    const SkPaint* paint() const { return fPaintPtr; }
282    SkPaint* paint() { return fPaintPtr; }
283
284    void setPaint(const SkPaint& paint) { fPaint = paint; fPaintPtr = &fPaint; }
285
286    const SkRect* srcRect() const { return fSrc.isEmpty() ? nullptr : &fSrc; }
287    void setSrcRect(const SkRect& src) { fSrc = src; }
288
289    const SkRect& dstRect() const { return fDst; }
290    void setDstRect(const SkRect& dst) { fDst = dst; }
291
292    SkCanvas::SrcRectConstraint constraint() const { return fConstraint; }
293    void setConstraint(SkCanvas::SrcRectConstraint constraint) { fConstraint = constraint; }
294
295private:
296    SkBitmap                      fBitmap;
297    SkRect                        fSrc;
298    SkRect                        fDst;
299    SkPaint                       fPaint;
300    SkPaint*                      fPaintPtr;
301    SkCanvas::SrcRectConstraint   fConstraint;
302
303    typedef SkDrawCommand INHERITED;
304};
305
306class SkDrawImageCommand : public SkDrawCommand {
307public:
308    SkDrawImageCommand(const SkImage* image, SkScalar left, SkScalar top, const SkPaint* paint);
309    void execute(SkCanvas* canvas) const override;
310    bool render(SkCanvas* canvas) const override;
311    Json::Value toJSON() const override;
312    static SkDrawImageCommand* fromJSON(Json::Value& command);
313
314private:
315    SkAutoTUnref<const SkImage> fImage;
316    SkScalar                    fLeft;
317    SkScalar                    fTop;
318    SkTLazy<SkPaint>            fPaint;
319
320    typedef SkDrawCommand INHERITED;
321};
322
323class SkDrawImageRectCommand : public SkDrawCommand {
324public:
325    SkDrawImageRectCommand(const SkImage* image, const SkRect* src, const SkRect& dst,
326                           const SkPaint* paint, SkCanvas::SrcRectConstraint constraint);
327    void execute(SkCanvas* canvas) const override;
328    bool render(SkCanvas* canvas) const override;
329    Json::Value toJSON() const override;
330    static SkDrawImageRectCommand* fromJSON(Json::Value& command);
331
332private:
333    SkAutoTUnref<const SkImage> fImage;
334    SkTLazy<SkRect>             fSrc;
335    SkRect                      fDst;
336    SkTLazy<SkPaint>            fPaint;
337    SkCanvas::SrcRectConstraint fConstraint;
338
339    typedef SkDrawCommand INHERITED;
340};
341
342class SkDrawOvalCommand : public SkDrawCommand {
343public:
344    SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint);
345    void execute(SkCanvas* canvas) const override;
346    bool render(SkCanvas* canvas) const override;
347    Json::Value toJSON() const override;
348    static SkDrawOvalCommand* fromJSON(Json::Value& command);
349
350private:
351    SkRect  fOval;
352    SkPaint fPaint;
353
354    typedef SkDrawCommand INHERITED;
355};
356
357class SkDrawPaintCommand : public SkDrawCommand {
358public:
359    SkDrawPaintCommand(const SkPaint& paint);
360    void execute(SkCanvas* canvas) const override;
361    bool render(SkCanvas* canvas) const override;
362    Json::Value toJSON() const override;
363    static SkDrawPaintCommand* fromJSON(Json::Value& command);
364
365private:
366    SkPaint fPaint;
367
368    typedef SkDrawCommand INHERITED;
369};
370
371class SkDrawPathCommand : public SkDrawCommand {
372public:
373    SkDrawPathCommand(const SkPath& path, const SkPaint& paint);
374    void execute(SkCanvas* canvas) const override;
375    bool render(SkCanvas* canvas) const override;
376    Json::Value toJSON() const override;
377    static SkDrawPathCommand* fromJSON(Json::Value& command);
378
379private:
380    SkPath   fPath;
381    SkPaint  fPaint;
382
383    typedef SkDrawCommand INHERITED;
384};
385
386class SkBeginDrawPictureCommand : public SkDrawCommand {
387public:
388    SkBeginDrawPictureCommand(const SkPicture* picture,
389                              const SkMatrix* matrix,
390                              const SkPaint* paint);
391
392    void execute(SkCanvas* canvas) const override;
393    bool render(SkCanvas* canvas) const override;
394
395private:
396    SkAutoTUnref<const SkPicture> fPicture;
397    SkTLazy<SkMatrix>             fMatrix;
398    SkTLazy<SkPaint>              fPaint;
399
400    typedef SkDrawCommand INHERITED;
401};
402
403class SkEndDrawPictureCommand : public SkDrawCommand {
404public:
405    SkEndDrawPictureCommand(bool restore);
406
407    void execute(SkCanvas* canvas) const override;
408
409private:
410    bool fRestore;
411
412    typedef SkDrawCommand INHERITED;
413};
414
415class SkDrawPointsCommand : public SkDrawCommand {
416public:
417    SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count, const SkPoint pts[],
418                        const SkPaint& paint);
419    virtual ~SkDrawPointsCommand() { delete [] fPts; }
420    void execute(SkCanvas* canvas) const override;
421    bool render(SkCanvas* canvas) const override;
422    Json::Value toJSON() const override;
423    static SkDrawPointsCommand* fromJSON(Json::Value& command);
424
425private:
426    SkCanvas::PointMode fMode;
427    size_t              fCount;
428    SkPoint*            fPts;
429    SkPaint             fPaint;
430
431    typedef SkDrawCommand INHERITED;
432};
433
434class SkDrawTextCommand : public SkDrawCommand {
435public:
436    SkDrawTextCommand(const void* text, size_t byteLength, SkScalar x, SkScalar y,
437                      const SkPaint& paint);
438    virtual ~SkDrawTextCommand() { delete [] fText; }
439    void execute(SkCanvas* canvas) const override;
440    Json::Value toJSON() const override;
441    static SkDrawTextCommand* fromJSON(Json::Value& command);
442
443private:
444    char*    fText;
445    size_t   fByteLength;
446    SkScalar fX;
447    SkScalar fY;
448    SkPaint  fPaint;
449
450    typedef SkDrawCommand INHERITED;
451};
452
453class SkDrawPosTextCommand : public SkDrawCommand {
454public:
455    SkDrawPosTextCommand(const void* text, size_t byteLength, const SkPoint pos[],
456                         const SkPaint& paint);
457    virtual ~SkDrawPosTextCommand() { delete [] fPos; delete [] fText; }
458    void execute(SkCanvas* canvas) const override;
459    Json::Value toJSON() const override;
460    static SkDrawPosTextCommand* fromJSON(Json::Value& command);
461
462private:
463    char*    fText;
464    size_t   fByteLength;
465    SkPoint* fPos;
466    SkPaint  fPaint;
467
468    typedef SkDrawCommand INHERITED;
469};
470
471class SkDrawTextOnPathCommand : public SkDrawCommand {
472public:
473    SkDrawTextOnPathCommand(const void* text, size_t byteLength, const SkPath& path,
474                            const SkMatrix* matrix, const SkPaint& paint);
475    virtual ~SkDrawTextOnPathCommand() { delete [] fText; }
476    void execute(SkCanvas* canvas) const override;
477    Json::Value toJSON() const override;
478    static SkDrawTextOnPathCommand* fromJSON(Json::Value& command);
479
480private:
481    char*    fText;
482    size_t   fByteLength;
483    SkPath   fPath;
484    SkMatrix fMatrix;
485    SkPaint  fPaint;
486
487    typedef SkDrawCommand INHERITED;
488};
489
490class SkDrawPosTextHCommand : public SkDrawCommand {
491public:
492    SkDrawPosTextHCommand(const void* text, size_t byteLength, const SkScalar xpos[],
493                          SkScalar constY, const SkPaint& paint);
494    virtual ~SkDrawPosTextHCommand() { delete [] fXpos; delete [] fText; }
495    void execute(SkCanvas* canvas) const override;
496
497private:
498    SkScalar* fXpos;
499    char*     fText;
500    size_t    fByteLength;
501    SkScalar  fConstY;
502    SkPaint   fPaint;
503
504    typedef SkDrawCommand INHERITED;
505};
506
507class SkDrawTextBlobCommand : public SkDrawCommand {
508public:
509    SkDrawTextBlobCommand(const SkTextBlob* blob, SkScalar x, SkScalar y, const SkPaint& paint);
510
511    void execute(SkCanvas* canvas) const override;
512    bool render(SkCanvas* canvas) const override;
513    Json::Value toJSON() const override;
514    static SkDrawTextBlobCommand* fromJSON(Json::Value& command);
515
516private:
517    SkAutoTUnref<const SkTextBlob> fBlob;
518    SkScalar                       fXPos;
519    SkScalar                       fYPos;
520    SkPaint                        fPaint;
521
522    typedef SkDrawCommand INHERITED;
523};
524
525class SkDrawPatchCommand : public SkDrawCommand {
526public:
527    SkDrawPatchCommand(const SkPoint cubics[12], const SkColor colors[4],
528                       const SkPoint texCoords[4], SkXfermode* xmode,
529                       const SkPaint& paint);
530    void execute(SkCanvas* canvas) const override;
531    Json::Value toJSON() const override;
532    static SkDrawPatchCommand* fromJSON(Json::Value& command);
533
534private:
535    SkPoint fCubics[12];
536    SkColor* fColorsPtr;
537    SkColor  fColors[4];
538    SkPoint* fTexCoordsPtr;
539    SkPoint  fTexCoords[4];
540    SkAutoTUnref<SkXfermode> fXfermode;
541    SkPaint fPaint;
542
543    typedef SkDrawCommand INHERITED;
544};
545
546
547class SkDrawRectCommand : public SkDrawCommand {
548public:
549    SkDrawRectCommand(const SkRect& rect, const SkPaint& paint);
550    void execute(SkCanvas* canvas) const override;
551    Json::Value toJSON() const override;
552    static SkDrawRectCommand* fromJSON(Json::Value& command);
553
554    const SkRect& rect() const   { return fRect; }
555    const SkPaint& paint() const { return fPaint; }
556private:
557    SkRect  fRect;
558    SkPaint fPaint;
559
560    typedef SkDrawCommand INHERITED;
561};
562
563class SkDrawRRectCommand : public SkDrawCommand {
564public:
565    SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint);
566    void execute(SkCanvas* canvas) const override;
567    bool render(SkCanvas* canvas) const override;
568    Json::Value toJSON() const override;
569    static SkDrawRRectCommand* fromJSON(Json::Value& command);
570
571private:
572    SkRRect fRRect;
573    SkPaint fPaint;
574
575    typedef SkDrawCommand INHERITED;
576};
577
578class SkDrawDRRectCommand : public SkDrawCommand {
579public:
580    SkDrawDRRectCommand(const SkRRect& outer, const SkRRect& inner,
581                        const SkPaint& paint);
582    void execute(SkCanvas* canvas) const override;
583    bool render(SkCanvas* canvas) const override;
584    Json::Value toJSON() const override;
585    static SkDrawDRRectCommand* fromJSON(Json::Value& command);
586
587private:
588    SkRRect fOuter;
589    SkRRect fInner;
590    SkPaint fPaint;
591
592    typedef SkDrawCommand INHERITED;
593};
594
595class SkDrawVerticesCommand : public SkDrawCommand {
596public:
597    SkDrawVerticesCommand(SkCanvas::VertexMode vmode, int vertexCount,
598                          const SkPoint vertices[], const SkPoint texs[],
599                          const SkColor colors[], SkXfermode* xfermode,
600                          const uint16_t indices[], int indexCount,
601                          const SkPaint& paint);
602    virtual ~SkDrawVerticesCommand();
603    void execute(SkCanvas* canvas) const override;
604
605private:
606    SkCanvas::VertexMode fVmode;
607    int         fVertexCount;
608    SkPoint*    fVertices;
609    SkPoint*    fTexs;
610    SkColor*    fColors;
611    SkXfermode* fXfermode;
612    uint16_t*   fIndices;
613    int         fIndexCount;
614    SkPaint     fPaint;
615
616    typedef SkDrawCommand INHERITED;
617};
618
619class SkSaveCommand : public SkDrawCommand {
620public:
621    SkSaveCommand();
622    void execute(SkCanvas* canvas) const override;
623    Action action() const override { return kPushLayer_Action; }
624    static SkSaveCommand* fromJSON(Json::Value& command);
625
626private:
627    typedef SkDrawCommand INHERITED;
628};
629
630class SkSaveLayerCommand : public SkDrawCommand {
631public:
632    SkSaveLayerCommand(const SkCanvas::SaveLayerRec&);
633    virtual ~SkSaveLayerCommand();
634    void execute(SkCanvas* canvas) const override;
635    Json::Value toJSON() const override;
636    static SkSaveLayerCommand* fromJSON(Json::Value& command);
637    void vizExecute(SkCanvas* canvas) const override;
638    Action action() const override{ return kPushLayer_Action; }
639    void setActive(bool active) override { fActive = active; }
640    bool active() const override { return fActive; }
641
642    const SkPaint* paint() const { return fPaintPtr; }
643
644private:
645    SkRect               fBounds;
646    SkPaint              fPaint;
647    SkPaint*             fPaintPtr;
648    const SkImageFilter* fBackdrop;
649    uint32_t       fSaveLayerFlags;
650
651    bool        fActive;
652
653    typedef SkDrawCommand INHERITED;
654};
655
656class SkSetMatrixCommand : public SkDrawCommand {
657public:
658    SkSetMatrixCommand(const SkMatrix& matrix);
659    void setUserMatrix(const SkMatrix&) override;
660    void execute(SkCanvas* canvas) const override;
661    Json::Value toJSON() const override;
662    static SkSetMatrixCommand* fromJSON(Json::Value& command);
663
664private:
665    SkMatrix fUserMatrix;
666    SkMatrix fMatrix;
667
668    typedef SkDrawCommand INHERITED;
669};
670
671#endif
672