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