blob: 99df00e3fb79e6ada7bdb5f286b8a62214d79dff [file] [log] [blame]
chudy@google.com902ebe52012-06-29 14:21:22 +00001
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
chudy@google.com902ebe52012-06-29 14:21:22 +000013#include "SkCanvas.h"
14#include "SkDrawCommand.h"
15#include "SkPicture.h"
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +000016#include "SkTArray.h"
chudy@google.com97cee972012-08-07 20:41:37 +000017#include "SkString.h"
chudy@google.com902ebe52012-06-29 14:21:22 +000018
fmalita@google.com86681b32013-06-13 20:59:14 +000019class SK_API SkDebugCanvas : public SkCanvas {
chudy@google.com902ebe52012-06-29 14:21:22 +000020public:
chudy@google.com80a4a602012-07-30 18:54:07 +000021 SkDebugCanvas(int width, int height);
robertphillips@google.comf4741c12013-02-06 20:13:54 +000022 virtual ~SkDebugCanvas();
chudy@google.com902ebe52012-06-29 14:21:22 +000023
24 void toggleFilter(bool toggle);
25
26 /**
robertphillips@google.comf4741c12013-02-06 20:13:54 +000027 * Enable or disable overdraw visualization
28 */
29 void setOverdrawViz(bool overdrawViz) { fOverdrawViz = overdrawViz; }
30
31 /**
chudy@google.com902ebe52012-06-29 14:21:22 +000032 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 */
chudy@google.com0b5bbb02012-07-31 19:55:32 +000051 void drawTo(SkCanvas* canvas, int index);
52
53 /**
chudy@google.coma9e937c2012-08-03 17:32:05 +000054 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 /**
chudy@google.com0b5bbb02012-07-31 19:55:32 +000068 Returns the index of the last draw command to write to the pixel at (x,y)
69 */
chudy@google.com830b8792012-08-01 15:57:52 +000070 int getCommandAtPoint(int x, int y, int index);
chudy@google.com902ebe52012-06-29 14:21:22 +000071
72 /**
robertphillips@google.com50c84da2013-04-01 18:18:49 +000073 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 /**
chudy@google.com902ebe52012-06-29 14:21:22 +000079 Returns the draw command at the given index.
80 @param index The index of the command
81 */
82 SkDrawCommand* getDrawCommandAt(int index);
83
84 /**
robertphillips@google.com50c84da2013-04-01 18:18:49 +000085 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 /**
chudy@google.com902ebe52012-06-29 14:21:22 +000092 Returns information about the command at the given index.
93 @param index The index of the command
94 */
chudy@google.com97cee972012-08-07 20:41:37 +000095 SkTDArray<SkString*>* getCommandInfo(int index);
chudy@google.com902ebe52012-06-29 14:21:22 +000096
97 /**
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000098 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 /**
chudy@google.com902ebe52012-06-29 14:21:22 +0000104 Returns the vector of draw commands
robertphillips@google.com50c84da2013-04-01 18:18:49 +0000105 DEPRECATED: please use getDrawCommandAt and getSize instead
chudy@google.com902ebe52012-06-29 14:21:22 +0000106 */
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000107 const SkTDArray<SkDrawCommand*>& getDrawCommands() const;
skia.committer@gmail.com2e71f162013-03-12 07:12:32 +0000108
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000109 /**
110 Returns the vector of draw commands. Do not use this entry
111 point - it is going away!
112 */
113 SkTDArray<SkDrawCommand*>& getDrawCommands();
chudy@google.com902ebe52012-06-29 14:21:22 +0000114
115 /**
116 * Returns the string vector of draw commands
117 */
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000118 SkTArray<SkString>* getDrawCommandsAsStrings() const;
chudy@google.com902ebe52012-06-29 14:21:22 +0000119
120 /**
chudy@google.comf1414322012-07-03 20:28:14 +0000121 Returns length of draw command vector.
122 */
123 int getSize() {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000124 return fCommandVector.count();
chudy@google.comf1414322012-07-03 20:28:14 +0000125 }
126
chudy@google.com902ebe52012-06-29 14:21:22 +0000127 /**
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
chudy@google.comb9ddd4e2012-07-10 14:14:50 +0000133 void setBounds(int width, int height) {
134 fWidth = width;
135 fHeight = height;
136 }
137
bungeman@google.come8cc6e82013-01-17 16:30:56 +0000138 void setUserMatrix(SkMatrix matrix) {
139 fUserMatrix = matrix;
chudy@google.com830b8792012-08-01 15:57:52 +0000140 }
141
chudy@google.com902ebe52012-06-29 14:21:22 +0000142////////////////////////////////////////////////////////////////////////////////
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
robertphillips@google.com67baba42013-01-02 20:20:31 +0000152 virtual bool clipRRect(const SkRRect& rrect,
153 SkRegion::Op op = SkRegion::kIntersect_Op,
154 bool doAntiAlias = false) SK_OVERRIDE;
155
chudy@google.com902ebe52012-06-29 14:21:22 +0000156 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
reed@google.com71121732012-09-18 15:14:33 +0000163 virtual void drawBitmapRectToRect(const SkBitmap&, const SkRect* src,
164 const SkRect& dst, const SkPaint*) SK_OVERRIDE;
chudy@google.com902ebe52012-06-29 14:21:22 +0000165
166 virtual void drawBitmapMatrix(const SkBitmap&, const SkMatrix&,
167 const SkPaint*) SK_OVERRIDE;
168
169 virtual void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
170 const SkRect& dst, const SkPaint*) SK_OVERRIDE;
171
172 virtual void drawData(const void*, size_t) SK_OVERRIDE;
173
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000174 virtual void beginCommentGroup(const char* description) SK_OVERRIDE;
175
176 virtual void addComment(const char* kywd, const char* value) SK_OVERRIDE;
177
178 virtual void endCommentGroup() SK_OVERRIDE;
179
robertphillips@google.com67baba42013-01-02 20:20:31 +0000180 virtual void drawOval(const SkRect& oval, const SkPaint&) SK_OVERRIDE;
181
chudy@google.com902ebe52012-06-29 14:21:22 +0000182 virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE;
183
184 virtual void drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE;
185
186 virtual void drawPicture(SkPicture& picture) SK_OVERRIDE;
187
188 virtual void drawPoints(PointMode, size_t count, const SkPoint pts[],
189 const SkPaint&) SK_OVERRIDE;
190
191 virtual void drawPosText(const void* text, size_t byteLength,
192 const SkPoint pos[], const SkPaint&) SK_OVERRIDE;
193
194 virtual void drawPosTextH(const void* text, size_t byteLength,
skia.committer@gmail.com422188f2013-01-03 02:01:32 +0000195 const SkScalar xpos[], SkScalar constY,
robertphillips@google.com67baba42013-01-02 20:20:31 +0000196 const SkPaint&) SK_OVERRIDE;
chudy@google.com902ebe52012-06-29 14:21:22 +0000197
198 virtual void drawRect(const SkRect& rect, const SkPaint&) SK_OVERRIDE;
199
robertphillips@google.com67baba42013-01-02 20:20:31 +0000200 virtual void drawRRect(const SkRRect& rrect, const SkPaint& paint) SK_OVERRIDE;
201
chudy@google.com902ebe52012-06-29 14:21:22 +0000202 virtual void drawSprite(const SkBitmap&, int left, int top,
203 const SkPaint*) SK_OVERRIDE;
204
205 virtual void drawText(const void* text, size_t byteLength, SkScalar x,
206 SkScalar y, const SkPaint&) SK_OVERRIDE;
207
208 virtual void drawTextOnPath(const void* text, size_t byteLength,
robertphillips@google.com67baba42013-01-02 20:20:31 +0000209 const SkPath& path, const SkMatrix* matrix,
chudy@google.com902ebe52012-06-29 14:21:22 +0000210 const SkPaint&) SK_OVERRIDE;
211
212 virtual void drawVertices(VertexMode, int vertexCount,
robertphillips@google.com67baba42013-01-02 20:20:31 +0000213 const SkPoint vertices[], const SkPoint texs[],
214 const SkColor colors[], SkXfermode*,
215 const uint16_t indices[], int indexCount,
chudy@google.com902ebe52012-06-29 14:21:22 +0000216 const SkPaint&) SK_OVERRIDE;
217
218 virtual void restore() SK_OVERRIDE;
219
220 virtual bool rotate(SkScalar degrees) SK_OVERRIDE;
221
222 virtual int save(SaveFlags) SK_OVERRIDE;
223
224 virtual int saveLayer(const SkRect* bounds, const SkPaint*, SaveFlags) SK_OVERRIDE;
225
226 virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE;
227
228 virtual void setMatrix(const SkMatrix& matrix) SK_OVERRIDE;
229
230 virtual bool skew(SkScalar sx, SkScalar sy) SK_OVERRIDE;
231
232 virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE;
233
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000234 static const int kVizImageHeight = 256;
235 static const int kVizImageWidth = 256;
236
chudy@google.com902ebe52012-06-29 14:21:22 +0000237private:
robertphillips@google.com67baba42013-01-02 20:20:31 +0000238 SkTDArray<SkDrawCommand*> fCommandVector;
chudy@google.comb9ddd4e2012-07-10 14:14:50 +0000239 int fHeight;
240 int fWidth;
chudy@google.com902ebe52012-06-29 14:21:22 +0000241 SkBitmap fBm;
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000242 bool fFilter;
chudy@google.com830b8792012-08-01 15:57:52 +0000243 int fIndex;
bungeman@google.come8cc6e82013-01-17 16:30:56 +0000244 SkMatrix fUserMatrix;
chudy@google.coma9e937c2012-08-03 17:32:05 +0000245 SkMatrix fMatrix;
246 SkIRect fClip;
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000247 bool fOverdrawViz;
248 SkDrawFilter* fOverdrawFilter;
chudy@google.com902ebe52012-06-29 14:21:22 +0000249
250 /**
tomhudson@google.com0699e022012-11-27 16:09:42 +0000251 Number of unmatched save() calls at any point during a draw.
252 If there are any saveLayer() calls outstanding, we need to resolve
253 all of them, which in practice means resolving all save() calls,
254 to avoid corruption of our canvas.
255 */
256 int fOutstandingSaveCount;
257
258 /**
chudy@google.com902ebe52012-06-29 14:21:22 +0000259 Adds the command to the classes vector of commands.
260 @param command The draw command for execution
261 */
262 void addDrawCommand(SkDrawCommand* command);
chudy@google.com830b8792012-08-01 15:57:52 +0000263
264 /**
265 Applies any panning and zooming the user has specified before
266 drawing anything else into the canvas.
267 */
268 void applyUserTransform(SkCanvas* canvas);
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000269
270 typedef SkCanvas INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000271};
272
273#endif