SkDebugCanvas.h revision 521a46750d87d3d206617d05d917ad6aad242ca4
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
10#ifndef SKDEBUGCANVAS_H_
11#define SKDEBUGCANVAS_H_
12
13#include "SkCanvas.h"
14#include "SkDrawCommand.h"
15#include "SkPicture.h"
16#include "SkTArray.h"
17#include "SkString.h"
18
19class SK_API SkDebugCanvas : public SkCanvas {
20public:
21    SkDebugCanvas(int width, int height);
22    virtual ~SkDebugCanvas();
23
24    void toggleFilter(bool toggle);
25
26    /**
27     * Enable or disable overdraw visualization
28     */
29    void setOverdrawViz(bool overdrawViz) { fOverdrawViz = overdrawViz; }
30
31    /**
32        Executes all draw calls to the canvas.
33        @param canvas  The canvas being drawn to
34     */
35    void draw(SkCanvas* canvas);
36
37    /**
38        Executes the draw calls in the specified range.
39        @param canvas  The canvas being drawn to
40        @param i  The beginning of the range
41        @param j  The end of the range
42        TODO(chudy): Implement
43     */
44    void drawRange(SkCanvas* canvas, int i, int j);
45
46    /**
47        Executes the draw calls up to the specified index.
48        @param canvas  The canvas being drawn to
49        @param index  The index of the final command being executed
50     */
51    void drawTo(SkCanvas* canvas, int index);
52
53    /**
54        Returns the most recently calculated transformation matrix
55     */
56    const SkMatrix& getCurrentMatrix() {
57        return fMatrix;
58    }
59
60    /**
61        Returns the most recently calculated clip
62     */
63    const SkIRect& getCurrentClip() {
64        return fClip;
65    }
66
67    /**
68        Returns the index of the last draw command to write to the pixel at (x,y)
69     */
70    int getCommandAtPoint(int x, int y, int index);
71
72    /**
73        Removes the command at the specified index
74        @param index  The index of the command to delete
75     */
76    void deleteDrawCommandAt(int index);
77
78    /**
79        Returns the draw command at the given index.
80        @param index  The index of the command
81     */
82    SkDrawCommand* getDrawCommandAt(int index);
83
84    /**
85        Sets the draw command for a given index.
86        @param index  The index to overwrite
87        @param command The new command
88     */
89    void setDrawCommandAt(int index, SkDrawCommand* command);
90
91    /**
92        Returns information about the command at the given index.
93        @param index  The index of the command
94     */
95    SkTDArray<SkString*>* getCommandInfo(int index);
96
97    /**
98        Returns the visibility of the command at the given index.
99        @param index  The index of the command
100     */
101    bool getDrawCommandVisibilityAt(int index);
102
103    /**
104        Returns the vector of draw commands
105        DEPRECATED: please use getDrawCommandAt and getSize instead
106     */
107    const SkTDArray<SkDrawCommand*>& getDrawCommands() const;
108
109    /**
110        Returns the vector of draw commands. Do not use this entry
111        point - it is going away!
112     */
113    SkTDArray<SkDrawCommand*>& getDrawCommands();
114
115    /**
116     * Returns the string vector of draw commands
117     */
118    SkTArray<SkString>* getDrawCommandsAsStrings() const;
119
120    /**
121        Returns length of draw command vector.
122     */
123    int getSize() const {
124        return fCommandVector.count();
125    }
126
127    /**
128        Toggles the visibility / execution of the draw command at index i with
129        the value of toggle.
130     */
131    void toggleCommand(int index, bool toggle);
132
133    void setBounds(int width, int height) {
134        fWidth = width;
135        fHeight = height;
136    }
137
138    void setUserMatrix(SkMatrix matrix) {
139        fUserMatrix = matrix;
140    }
141
142////////////////////////////////////////////////////////////////////////////////
143// Inherited from SkCanvas
144////////////////////////////////////////////////////////////////////////////////
145
146    virtual void clear(SkColor) SK_OVERRIDE;
147
148    virtual bool clipPath(const SkPath&, SkRegion::Op, bool) SK_OVERRIDE;
149
150    virtual bool clipRect(const SkRect&, SkRegion::Op, bool) SK_OVERRIDE;
151
152    virtual bool clipRRect(const SkRRect& rrect,
153                           SkRegion::Op op = SkRegion::kIntersect_Op,
154                           bool doAntiAlias = false) SK_OVERRIDE;
155
156    virtual bool clipRegion(const SkRegion& region, SkRegion::Op op) SK_OVERRIDE;
157
158    virtual bool concat(const SkMatrix& matrix) SK_OVERRIDE;
159
160    virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top,
161                            const SkPaint*) SK_OVERRIDE;
162
163    virtual void drawBitmapRectToRect(const SkBitmap&, const SkRect* src,
164                                      const SkRect& dst, const SkPaint* paint,
165                                      DrawBitmapRectFlags flags) SK_OVERRIDE;
166
167    virtual void drawBitmapMatrix(const SkBitmap&, const SkMatrix&,
168                                  const SkPaint*) SK_OVERRIDE;
169
170    virtual void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
171                                const SkRect& dst, const SkPaint*) SK_OVERRIDE;
172
173    virtual void drawData(const void*, size_t) SK_OVERRIDE;
174
175    virtual void beginCommentGroup(const char* description) SK_OVERRIDE;
176
177    virtual void addComment(const char* kywd, const char* value) SK_OVERRIDE;
178
179    virtual void endCommentGroup() SK_OVERRIDE;
180
181    virtual void drawOval(const SkRect& oval, const SkPaint&) SK_OVERRIDE;
182
183    virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE;
184
185    virtual void drawPicture(SkPicture& picture) SK_OVERRIDE;
186
187    virtual void drawPoints(PointMode, size_t count, const SkPoint pts[],
188                            const SkPaint&) SK_OVERRIDE;
189
190    virtual void drawPosText(const void* text, size_t byteLength,
191                             const SkPoint pos[], const SkPaint&) SK_OVERRIDE;
192
193    virtual void drawPosTextH(const void* text, size_t byteLength,
194                              const SkScalar xpos[], SkScalar constY,
195                              const SkPaint&) SK_OVERRIDE;
196
197    virtual void drawRRect(const SkRRect& rrect, const SkPaint& paint) SK_OVERRIDE;
198
199    virtual void drawSprite(const SkBitmap&, int left, int top,
200                            const SkPaint*) SK_OVERRIDE;
201
202    virtual void drawText(const void* text, size_t byteLength, SkScalar x,
203                          SkScalar y, const SkPaint&) SK_OVERRIDE;
204
205    virtual void drawTextOnPath(const void* text, size_t byteLength,
206                                const SkPath& path, const SkMatrix* matrix,
207                                const SkPaint&) SK_OVERRIDE;
208
209    virtual void drawVertices(VertexMode, int vertexCount,
210                              const SkPoint vertices[], const SkPoint texs[],
211                              const SkColor colors[], SkXfermode*,
212                              const uint16_t indices[], int indexCount,
213                              const SkPaint&) SK_OVERRIDE;
214
215    virtual void restore() SK_OVERRIDE;
216
217    virtual bool rotate(SkScalar degrees) SK_OVERRIDE;
218
219    virtual int save(SaveFlags) SK_OVERRIDE;
220
221    virtual int saveLayer(const SkRect* bounds, const SkPaint*, SaveFlags) SK_OVERRIDE;
222
223    virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE;
224
225    virtual void setMatrix(const SkMatrix& matrix) SK_OVERRIDE;
226
227    virtual bool skew(SkScalar sx, SkScalar sy) SK_OVERRIDE;
228
229    virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE;
230
231    static const int kVizImageHeight = 256;
232    static const int kVizImageWidth = 256;
233
234protected:
235    virtual void onDrawRect(const SkRect& rect, const SkPaint&) SK_OVERRIDE;
236
237    virtual void onDrawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE;
238
239private:
240    SkTDArray<SkDrawCommand*> fCommandVector;
241    int fHeight;
242    int fWidth;
243    SkBitmap fBm;
244    bool fFilter;
245    int fIndex;
246    SkMatrix fUserMatrix;
247    SkMatrix fMatrix;
248    SkIRect fClip;
249    bool fOverdrawViz;
250    SkDrawFilter* fOverdrawFilter;
251
252    /**
253        Number of unmatched save() calls at any point during a draw.
254        If there are any saveLayer() calls outstanding, we need to resolve
255        all of them, which in practice means resolving all save() calls,
256        to avoid corruption of our canvas.
257    */
258    int fOutstandingSaveCount;
259
260    /**
261        Adds the command to the classes vector of commands.
262        @param command  The draw command for execution
263     */
264    void addDrawCommand(SkDrawCommand* command);
265
266    /**
267        Applies any panning and zooming the user has specified before
268        drawing anything else into the canvas.
269     */
270    void applyUserTransform(SkCanvas* canvas);
271
272    typedef SkCanvas INHERITED;
273};
274
275#endif
276