• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
19 class SkTexOverrideFilter;
20 
21 class SK_API SkDebugCanvas : public SkCanvas {
22 public:
23     SkDebugCanvas(int width, int height);
24     virtual ~SkDebugCanvas();
25 
26     void toggleFilter(bool toggle);
27 
28     /**
29      * Enable or disable overdraw visualization
30      */
setOverdrawViz(bool overdrawViz)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      */
getCurrentMatrix()54     const SkMatrix& getCurrentMatrix() {
55         return fMatrix;
56     }
57 
58     /**
59         Returns the most recently calculated clip
60      */
getCurrentClip()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      */
getSize()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 
setBounds(int width,int height)131     void setBounds(int width, int height) {
132         fWidth = width;
133         fHeight = height;
134     }
135 
setUserMatrix(SkMatrix matrix)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 
236 private:
237     SkTDArray<SkDrawCommand*> fCommandVector;
238     int fWidth;
239     int fHeight;
240     bool fFilter;
241     int fIndex;
242     SkMatrix fUserMatrix;
243     SkMatrix fMatrix;
244     SkIRect fClip;
245 
246     bool fOverdrawViz;
247     SkDrawFilter* fOverdrawFilter;
248 
249     bool fOverrideTexFiltering;
250     SkTexOverrideFilter* fTexOverrideFilter;
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