1#ifndef SkDumpCanvas_DEFINED
2#define SkDumpCanvas_DEFINED
3
4#include "SkCanvas.h"
5
6/** This class overrides all the draw methods on SkCanvas, and formats them
7    as text, and then sends that to a Dumper helper object.
8
9    Typical use might be to dump a display list to a log file to see what is
10    being drawn.
11 */
12class SkDumpCanvas : public SkCanvas {
13public:
14    class Dumper;
15
16    explicit SkDumpCanvas(Dumper* = 0);
17    virtual ~SkDumpCanvas();
18
19    enum Verb {
20        kNULL_Verb,
21
22        kSave_Verb,
23        kRestore_Verb,
24
25        kMatrix_Verb,
26
27        kClip_Verb,
28
29        kDrawPaint_Verb,
30        kDrawPoints_Verb,
31        kDrawRect_Verb,
32        kDrawPath_Verb,
33        kDrawBitmap_Verb,
34        kDrawText_Verb,
35        kDrawPicture_Verb,
36        kDrawShape_Verb,
37        kDrawVertices_Verb,
38        kDrawData_Verb
39    };
40
41    /** Subclasses of this are installed on the DumpCanvas, and then called for
42        each drawing command.
43     */
44    class Dumper : public SkRefCnt {
45    public:
46        virtual void dump(SkDumpCanvas*, SkDumpCanvas::Verb, const char str[],
47                          const SkPaint*) = 0;
48    };
49
50    Dumper* getDumper() const { return fDumper; }
51    void    setDumper(Dumper*);
52
53    int getNestLevel() const { return fNestLevel; }
54
55    // overrides from SkCanvas
56
57    virtual int save(SaveFlags flags = kMatrixClip_SaveFlag);
58    virtual int saveLayer(const SkRect* bounds, const SkPaint* paint,
59                          SaveFlags flags = kARGB_ClipLayer_SaveFlag);
60    virtual void restore();
61
62    virtual bool translate(SkScalar dx, SkScalar dy);
63    virtual bool scale(SkScalar sx, SkScalar sy);
64    virtual bool rotate(SkScalar degrees);
65    virtual bool skew(SkScalar sx, SkScalar sy);
66    virtual bool concat(const SkMatrix& matrix);
67    virtual void setMatrix(const SkMatrix& matrix);
68
69    virtual bool clipRect(const SkRect& rect,
70                          SkRegion::Op op = SkRegion::kIntersect_Op);
71    virtual bool clipPath(const SkPath& path,
72                          SkRegion::Op op = SkRegion::kIntersect_Op);
73    virtual bool clipRegion(const SkRegion& deviceRgn,
74                            SkRegion::Op op = SkRegion::kIntersect_Op);
75
76    virtual void drawPaint(const SkPaint& paint);
77    virtual void drawPoints(PointMode mode, size_t count, const SkPoint pts[],
78                            const SkPaint& paint);
79    virtual void drawRect(const SkRect& rect, const SkPaint& paint);
80    virtual void drawPath(const SkPath& path, const SkPaint& paint);
81    virtual void drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top,
82                            const SkPaint* paint = NULL);
83    virtual void drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src,
84                                const SkRect& dst, const SkPaint* paint = NULL);
85    virtual void drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
86                                  const SkPaint* paint = NULL);
87    virtual void drawSprite(const SkBitmap& bitmap, int left, int top,
88                            const SkPaint* paint = NULL);
89    virtual void drawText(const void* text, size_t byteLength, SkScalar x,
90                          SkScalar y, const SkPaint& paint);
91    virtual void drawPosText(const void* text, size_t byteLength,
92                             const SkPoint pos[], const SkPaint& paint);
93    virtual void drawPosTextH(const void* text, size_t byteLength,
94                              const SkScalar xpos[], SkScalar constY,
95                              const SkPaint& paint);
96    virtual void drawTextOnPath(const void* text, size_t byteLength,
97                                const SkPath& path, const SkMatrix* matrix,
98                                const SkPaint& paint);
99    virtual void drawPicture(SkPicture&);
100    virtual void drawShape(SkShape*);
101    virtual void drawVertices(VertexMode vmode, int vertexCount,
102                              const SkPoint vertices[], const SkPoint texs[],
103                              const SkColor colors[], SkXfermode* xmode,
104                              const uint16_t indices[], int indexCount,
105                              const SkPaint& paint);
106    virtual void drawData(const void*, size_t);
107
108private:
109    Dumper* fDumper;
110    int     fNestLevel; // for nesting recursive elements like pictures
111
112    void dump(Verb, const SkPaint*, const char format[], ...);
113
114    typedef SkCanvas INHERITED;
115};
116
117/** Formats the draw commands, and send them to a function-pointer provided
118    by the caller.
119 */
120class SkFormatDumper : public SkDumpCanvas::Dumper {
121public:
122    SkFormatDumper(void (*)(const char text[], void* refcon), void* refcon);
123
124    // override from baseclass that does the formatting, and in turn calls
125    // the function pointer that was passed to the constructor
126    virtual void dump(SkDumpCanvas*, SkDumpCanvas::Verb, const char str[],
127                      const SkPaint*);
128
129private:
130    void (*fProc)(const char*, void*);
131    void* fRefcon;
132
133    typedef SkDumpCanvas::Dumper INHERITED;
134};
135
136/** Subclass of Dumper that dumps the drawing command to SkDebugf
137 */
138class SkDebugfDumper : public SkFormatDumper {
139public:
140    SkDebugfDumper();
141
142private:
143    typedef SkFormatDumper INHERITED;
144};
145
146#endif
147