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