SkDrawCommand.h revision 3d305207bd40f4e5ae10010492420a2fdfa1153c
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 "SkPictureFlat.h"
13#include "SkCanvas.h"
14#include "SkString.h"
15
16class SK_API SkDrawCommand {
17public:
18    /* TODO(chudy): Remove subclasses. */
19    SkDrawCommand(DrawType drawType);
20    SkDrawCommand();
21
22    virtual ~SkDrawCommand();
23
24    virtual SkString toString();
25
26    virtual const char* toCString() {
27        return GetCommandString(fDrawType);
28    }
29
30    bool isVisible() const {
31        return fVisible;
32    }
33
34    void setVisible(bool toggle) {
35        fVisible = toggle;
36    }
37
38    SkTDArray<SkString*>* Info() {return &fInfo; };
39    virtual void execute(SkCanvas* canvas)=0;
40    /** Does nothing by default, but used by save() and restore()-type
41        subclassse to track unresolved save() calls. */
42    virtual void trackSaveState(int* state) { };
43    DrawType getType() { return fDrawType; };
44
45    virtual bool render(SkCanvas* canvas) const { return false; }
46
47    static const char* GetCommandString(DrawType type);
48
49protected:
50    DrawType fDrawType;
51    SkTDArray<SkString*> fInfo;
52
53private:
54    bool fVisible;
55};
56
57class SkRestoreCommand : public SkDrawCommand {
58public:
59    SkRestoreCommand();
60    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
61    virtual void trackSaveState(int* state) SK_OVERRIDE;
62
63private:
64    typedef SkDrawCommand INHERITED;
65};
66
67class SkClearCommand : public SkDrawCommand {
68public:
69    SkClearCommand(SkColor color);
70    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
71private:
72    SkColor fColor;
73
74    typedef SkDrawCommand INHERITED;
75};
76
77class SkClipPathCommand : public SkDrawCommand {
78public:
79    SkClipPathCommand(const SkPath& path, SkRegion::Op op, bool doAA);
80    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
81    virtual bool render(SkCanvas* canvas) const SK_OVERRIDE;
82private:
83    SkPath       fPath;
84    SkRegion::Op fOp;
85    bool         fDoAA;
86
87    typedef SkDrawCommand INHERITED;
88};
89
90class SkClipRegionCommand : public SkDrawCommand {
91public:
92    SkClipRegionCommand(const SkRegion& region, SkRegion::Op op);
93    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
94private:
95    SkRegion     fRegion;
96    SkRegion::Op fOp;
97
98    typedef SkDrawCommand INHERITED;
99};
100
101class SkClipRectCommand : public SkDrawCommand {
102public:
103    SkClipRectCommand(const SkRect& rect, SkRegion::Op op, bool doAA);
104    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
105
106    const SkRect& rect() const { return fRect; }
107    SkRegion::Op op() const { return fOp; }
108    bool doAA() const { return fDoAA; }
109
110private:
111    SkRect       fRect;
112    SkRegion::Op fOp;
113    bool         fDoAA;
114
115    typedef SkDrawCommand INHERITED;
116};
117
118class SkClipRRectCommand : public SkDrawCommand {
119public:
120    SkClipRRectCommand(const SkRRect& rrect, SkRegion::Op op, bool doAA);
121    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
122    virtual bool render(SkCanvas* canvas) const SK_OVERRIDE;
123
124    const SkRRect& rrect() const { return fRRect; }
125    SkRegion::Op op() const { return fOp; }
126    bool doAA() const { return fDoAA; }
127
128private:
129    SkRRect      fRRect;
130    SkRegion::Op fOp;
131    bool         fDoAA;
132
133    typedef SkDrawCommand INHERITED;
134};
135
136class SkConcatCommand : public SkDrawCommand {
137public:
138    SkConcatCommand(const SkMatrix& matrix);
139    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
140private:
141    SkMatrix fMatrix;
142
143    typedef SkDrawCommand INHERITED;
144};
145
146class SkDrawBitmapCommand : public SkDrawCommand {
147public:
148    SkDrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top,
149               const SkPaint* paint);
150    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
151    virtual bool render(SkCanvas* canvas) const SK_OVERRIDE;
152private:
153    SkBitmap fBitmap;
154    SkScalar fLeft;
155    SkScalar fTop;
156    SkPaint  fPaint;
157    SkPaint* fPaintPtr;
158
159    typedef SkDrawCommand INHERITED;
160};
161
162class SkDrawBitmapMatrixCommand : public SkDrawCommand {
163public:
164    SkDrawBitmapMatrixCommand(const SkBitmap& bitmap, const SkMatrix& matrix,
165                     const SkPaint* paint);
166    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
167    virtual bool render(SkCanvas* canvas) const SK_OVERRIDE;
168private:
169    SkBitmap fBitmap;
170    SkMatrix fMatrix;
171    SkPaint  fPaint;
172    SkPaint* fPaintPtr;
173
174    typedef SkDrawCommand INHERITED;
175};
176
177class SkDrawBitmapNineCommand : public SkDrawCommand {
178public:
179    SkDrawBitmapNineCommand(const SkBitmap& bitmap, const SkIRect& center,
180                   const SkRect& dst, const SkPaint* paint);
181    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
182    virtual bool render(SkCanvas* canvas) const SK_OVERRIDE;
183private:
184    SkBitmap fBitmap;
185    SkIRect  fCenter;
186    SkRect   fDst;
187    SkPaint  fPaint;
188    SkPaint* fPaintPtr;
189
190    typedef SkDrawCommand INHERITED;
191};
192
193class SkDrawBitmapRectCommand : public SkDrawCommand {
194public:
195    SkDrawBitmapRectCommand(const SkBitmap& bitmap, const SkRect* src,
196                            const SkRect& dst, const SkPaint* paint,
197                            SkCanvas::DrawBitmapRectFlags flags);
198    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
199    virtual bool render(SkCanvas* canvas) const SK_OVERRIDE;
200
201    const SkBitmap& bitmap() const { return fBitmap; }
202
203    // The non-const 'paint' method allows modification of this object's
204    // SkPaint. For this reason the ctor and setPaint method make a local copy.
205    // The 'fPaintPtr' member acts a signal that the local SkPaint is valid
206    // (since only an SkPaint* is passed into the ctor).
207    const SkPaint* paint() const { return fPaintPtr; }
208    SkPaint* paint() { return fPaintPtr; }
209
210    void setPaint(const SkPaint& paint) { fPaint = paint; fPaintPtr = &fPaint; }
211
212    const SkRect* srcRect() const { return fSrc.isEmpty() ? NULL : &fSrc; }
213    void setSrcRect(const SkRect& src) { fSrc = src; }
214
215    const SkRect& dstRect() const { return fDst; }
216    void setDstRect(const SkRect& dst) { fDst = dst; }
217
218    SkCanvas::DrawBitmapRectFlags flags() const { return fFlags; }
219    void setFlags(SkCanvas::DrawBitmapRectFlags flags) { fFlags = flags; }
220
221private:
222    SkBitmap                      fBitmap;
223    SkRect                        fSrc;
224    SkRect                        fDst;
225    SkPaint                       fPaint;
226    SkPaint*                      fPaintPtr;
227    SkCanvas::DrawBitmapRectFlags fFlags;
228
229    typedef SkDrawCommand INHERITED;
230};
231
232class SkDrawDataCommand : public SkDrawCommand {
233public:
234    SkDrawDataCommand(const void* data, size_t length);
235    virtual ~SkDrawDataCommand() { delete [] fData; }
236    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
237private:
238    char*  fData;
239    size_t fLength;
240
241    typedef SkDrawCommand INHERITED;
242};
243
244class SkBeginCommentGroupCommand : public SkDrawCommand {
245public:
246    SkBeginCommentGroupCommand(const char* description);
247    virtual void execute(SkCanvas* canvas) SK_OVERRIDE {
248        canvas->beginCommentGroup(fDescription.c_str());
249    };
250private:
251    SkString fDescription;
252
253    typedef SkDrawCommand INHERITED;
254};
255
256class SkCommentCommand : public SkDrawCommand {
257public:
258    SkCommentCommand(const char* kywd, const char* value);
259    virtual void execute(SkCanvas* canvas) SK_OVERRIDE {
260        canvas->addComment(fKywd.c_str(), fValue.c_str());
261    };
262private:
263    SkString fKywd;
264    SkString fValue;
265
266    typedef SkDrawCommand INHERITED;
267};
268
269class SkEndCommentGroupCommand : public SkDrawCommand {
270public:
271    SkEndCommentGroupCommand();
272    virtual void execute(SkCanvas* canvas) SK_OVERRIDE {
273        canvas->endCommentGroup();
274    };
275private:
276    typedef SkDrawCommand INHERITED;
277};
278
279class SkDrawOvalCommand : public SkDrawCommand {
280public:
281    SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint);
282    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
283    virtual bool render(SkCanvas* canvas) const SK_OVERRIDE;
284private:
285    SkRect  fOval;
286    SkPaint fPaint;
287
288    typedef SkDrawCommand INHERITED;
289};
290
291class SkDrawPaintCommand : public SkDrawCommand {
292public:
293    SkDrawPaintCommand(const SkPaint& paint);
294    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
295    virtual bool render(SkCanvas* canvas) const SK_OVERRIDE;
296private:
297    SkPaint fPaint;
298
299    typedef SkDrawCommand INHERITED;
300};
301
302class SkDrawPathCommand : public SkDrawCommand {
303public:
304    SkDrawPathCommand(const SkPath& path, const SkPaint& paint);
305    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
306    virtual bool render(SkCanvas* canvas) const SK_OVERRIDE;
307
308private:
309    SkPath   fPath;
310    SkPaint  fPaint;
311
312    typedef SkDrawCommand INHERITED;
313};
314
315class SkDrawPictureCommand : public SkDrawCommand {
316public:
317    SkDrawPictureCommand(SkPicture& picture);
318    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
319    virtual bool render(SkCanvas* canvas) const SK_OVERRIDE;
320
321private:
322    SkPicture fPicture;
323
324    typedef SkDrawCommand INHERITED;
325};
326
327class SkDrawPointsCommand : public SkDrawCommand {
328public:
329    SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count, const SkPoint pts[],
330               const SkPaint& paint);
331    virtual ~SkDrawPointsCommand() { delete [] fPts; }
332    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
333    virtual bool render(SkCanvas* canvas) const SK_OVERRIDE;
334private:
335    SkCanvas::PointMode fMode;
336    size_t              fCount;
337    SkPoint*            fPts;
338    SkPaint             fPaint;
339
340    typedef SkDrawCommand INHERITED;
341};
342
343class SkDrawTextCommand : public SkDrawCommand {
344public:
345    SkDrawTextCommand(const void* text, size_t byteLength, SkScalar x, SkScalar y,
346              const SkPaint& paint);
347    virtual ~SkDrawTextCommand() { delete [] fText; }
348    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
349private:
350    char*    fText;
351    size_t   fByteLength;
352    SkScalar fX;
353    SkScalar fY;
354    SkPaint  fPaint;
355
356    typedef SkDrawCommand INHERITED;
357};
358
359class SkDrawPosTextCommand : public SkDrawCommand {
360public:
361    SkDrawPosTextCommand(const void* text, size_t byteLength, const SkPoint pos[],
362                         const SkPaint& paint);
363    virtual ~SkDrawPosTextCommand() { delete [] fPos; delete [] fText; }
364    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
365private:
366    char*    fText;
367    size_t   fByteLength;
368    SkPoint* fPos;
369    SkPaint  fPaint;
370
371    typedef SkDrawCommand INHERITED;
372};
373
374class SkDrawTextOnPathCommand : public SkDrawCommand {
375public:
376    SkDrawTextOnPathCommand(const void* text, size_t byteLength, const SkPath& path,
377                            const SkMatrix* matrix, const SkPaint& paint);
378    virtual ~SkDrawTextOnPathCommand() { delete [] fText; }
379    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
380private:
381    char*    fText;
382    size_t   fByteLength;
383    SkPath   fPath;
384    SkMatrix fMatrix;
385    SkPaint  fPaint;
386
387    typedef SkDrawCommand INHERITED;
388};
389
390class SkDrawPosTextHCommand : public SkDrawCommand {
391public:
392    SkDrawPosTextHCommand(const void* text, size_t byteLength, const SkScalar xpos[],
393                          SkScalar constY, const SkPaint& paint);
394    virtual ~SkDrawPosTextHCommand() { delete [] fXpos; delete [] fText; }
395    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
396private:
397    SkScalar* fXpos;
398    char*     fText;
399    size_t    fByteLength;
400    SkScalar  fConstY;
401    SkPaint   fPaint;
402
403    typedef SkDrawCommand INHERITED;
404};
405
406class SkDrawRectCommand : public SkDrawCommand {
407public:
408    SkDrawRectCommand(const SkRect& rect, const SkPaint& paint);
409    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
410
411    const SkRect& rect() const   { return fRect; }
412    const SkPaint& paint() const { return fPaint; }
413private:
414    SkRect  fRect;
415    SkPaint fPaint;
416
417    typedef SkDrawCommand INHERITED;
418};
419
420class SkDrawRRectCommand : public SkDrawCommand {
421public:
422    SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint);
423    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
424    virtual bool render(SkCanvas* canvas) const SK_OVERRIDE;
425private:
426    SkRRect fRRect;
427    SkPaint fPaint;
428
429    typedef SkDrawCommand INHERITED;
430};
431
432class SkDrawDRRectCommand : public SkDrawCommand {
433public:
434    SkDrawDRRectCommand(const SkRRect& outer, const SkRRect& inner,
435                        const SkPaint& paint);
436    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
437    virtual bool render(SkCanvas* canvas) const SK_OVERRIDE;
438private:
439    SkRRect fOuter;
440    SkRRect fInner;
441    SkPaint fPaint;
442
443    typedef SkDrawCommand INHERITED;
444};
445
446class SkDrawSpriteCommand : public SkDrawCommand {
447public:
448    SkDrawSpriteCommand(const SkBitmap& bitmap, int left, int top, const SkPaint* paint);
449    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
450    virtual bool render(SkCanvas* canvas) const SK_OVERRIDE;
451private:
452    SkBitmap fBitmap;
453    int      fLeft;
454    int      fTop;
455    SkPaint  fPaint;
456    SkPaint* fPaintPtr;
457
458    typedef SkDrawCommand INHERITED;
459};
460
461class SkDrawVerticesCommand : public SkDrawCommand {
462public:
463    SkDrawVerticesCommand(SkCanvas::VertexMode vmode, int vertexCount,
464                          const SkPoint vertices[], const SkPoint texs[],
465                          const SkColor colors[], SkXfermode* xfermode,
466                          const uint16_t indices[], int indexCount,
467                          const SkPaint& paint);
468    virtual ~SkDrawVerticesCommand();
469    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
470private:
471    SkCanvas::VertexMode fVmode;
472    int         fVertexCount;
473    SkPoint*    fVertices;
474    SkPoint*    fTexs;
475    SkColor*    fColors;
476    SkXfermode* fXfermode;
477    uint16_t*   fIndices;
478    int         fIndexCount;
479    SkPaint     fPaint;
480
481    typedef SkDrawCommand INHERITED;
482};
483
484class SkRotateCommand : public SkDrawCommand {
485public:
486    SkRotateCommand(SkScalar degrees);
487    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
488private:
489    SkScalar fDegrees;
490
491    typedef SkDrawCommand INHERITED;
492};
493
494class SkSaveCommand : public SkDrawCommand {
495public:
496    SkSaveCommand(SkCanvas::SaveFlags flags);
497    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
498    virtual void trackSaveState(int* state) SK_OVERRIDE;
499private:
500    SkCanvas::SaveFlags fFlags;
501
502    typedef SkDrawCommand INHERITED;
503};
504
505class SkSaveLayerCommand : public SkDrawCommand {
506public:
507    SkSaveLayerCommand(const SkRect* bounds, const SkPaint* paint,
508                       SkCanvas::SaveFlags flags);
509    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
510    virtual void trackSaveState(int* state) SK_OVERRIDE;
511
512    const SkPaint* paint() const { return fPaintPtr; }
513
514private:
515    SkRect              fBounds;
516    SkPaint             fPaint;
517    SkPaint*            fPaintPtr;
518    SkCanvas::SaveFlags fFlags;
519
520    typedef SkDrawCommand INHERITED;
521};
522
523class SkScaleCommand : public SkDrawCommand {
524public:
525    SkScaleCommand(SkScalar sx, SkScalar sy);
526    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
527
528    SkScalar x() const { return fSx; }
529    SkScalar y() const { return fSy; }
530
531private:
532    SkScalar fSx;
533    SkScalar fSy;
534
535    typedef SkDrawCommand INHERITED;
536};
537
538class SkSetMatrixCommand : public SkDrawCommand {
539public:
540    SkSetMatrixCommand(const SkMatrix& matrix);
541    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
542private:
543    SkMatrix fMatrix;
544
545    typedef SkDrawCommand INHERITED;
546};
547
548class SkSkewCommand : public SkDrawCommand {
549public:
550    SkSkewCommand(SkScalar sx, SkScalar sy);
551    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
552private:
553    SkScalar fSx;
554    SkScalar fSy;
555
556    typedef SkDrawCommand INHERITED;
557};
558
559class SkTranslateCommand : public SkDrawCommand {
560public:
561    SkTranslateCommand(SkScalar dx, SkScalar dy);
562    virtual void execute(SkCanvas* canvas) SK_OVERRIDE;
563
564    SkScalar x() const { return fDx; }
565    SkScalar y() const { return fDy; }
566
567private:
568    SkScalar fDx;
569    SkScalar fDy;
570
571    typedef SkDrawCommand INHERITED;
572};
573
574#endif
575