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