blob: 705f49af838f4ad9d94a949f799b4bc7faa00297 [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 */
commit-bot@chromium.org0d4fe142013-07-15 22:47:14 +0000123 int getSize() const {
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,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000164 const SkRect& dst, const SkPaint* paint,
165 DrawBitmapRectFlags flags) SK_OVERRIDE;
chudy@google.com902ebe52012-06-29 14:21:22 +0000166
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
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000175 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
robertphillips@google.com67baba42013-01-02 20:20:31 +0000181 virtual void drawOval(const SkRect& oval, const SkPaint&) SK_OVERRIDE;
182
chudy@google.com902ebe52012-06-29 14:21:22 +0000183 virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE;
184
robertphillips@google.comc2cc1db2013-10-17 17:34:20 +0000185 virtual void drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE;
186
chudy@google.com902ebe52012-06-29 14:21:22 +0000187 virtual void drawPicture(SkPicture& picture) SK_OVERRIDE;
188
189 virtual void drawPoints(PointMode, size_t count, const SkPoint pts[],
190 const SkPaint&) SK_OVERRIDE;
191
192 virtual void drawPosText(const void* text, size_t byteLength,
193 const SkPoint pos[], const SkPaint&) SK_OVERRIDE;
194
195 virtual void drawPosTextH(const void* text, size_t byteLength,
skia.committer@gmail.com422188f2013-01-03 02:01:32 +0000196 const SkScalar xpos[], SkScalar constY,
robertphillips@google.com67baba42013-01-02 20:20:31 +0000197 const SkPaint&) SK_OVERRIDE;
chudy@google.com902ebe52012-06-29 14:21:22 +0000198
robertphillips@google.comc2cc1db2013-10-17 17:34:20 +0000199 virtual void drawRect(const SkRect& rect, const SkPaint&) SK_OVERRIDE;
200
robertphillips@google.com67baba42013-01-02 20:20:31 +0000201 virtual void drawRRect(const SkRRect& rrect, const SkPaint& paint) SK_OVERRIDE;
202
chudy@google.com902ebe52012-06-29 14:21:22 +0000203 virtual void drawSprite(const SkBitmap&, int left, int top,
204 const SkPaint*) SK_OVERRIDE;
205
206 virtual void drawText(const void* text, size_t byteLength, SkScalar x,
207 SkScalar y, const SkPaint&) SK_OVERRIDE;
208
209 virtual void drawTextOnPath(const void* text, size_t byteLength,
robertphillips@google.com67baba42013-01-02 20:20:31 +0000210 const SkPath& path, const SkMatrix* matrix,
chudy@google.com902ebe52012-06-29 14:21:22 +0000211 const SkPaint&) SK_OVERRIDE;
212
213 virtual void drawVertices(VertexMode, int vertexCount,
robertphillips@google.com67baba42013-01-02 20:20:31 +0000214 const SkPoint vertices[], const SkPoint texs[],
215 const SkColor colors[], SkXfermode*,
216 const uint16_t indices[], int indexCount,
chudy@google.com902ebe52012-06-29 14:21:22 +0000217 const SkPaint&) SK_OVERRIDE;
218
219 virtual void restore() SK_OVERRIDE;
220
221 virtual bool rotate(SkScalar degrees) SK_OVERRIDE;
222
223 virtual int save(SaveFlags) SK_OVERRIDE;
224
225 virtual int saveLayer(const SkRect* bounds, const SkPaint*, SaveFlags) SK_OVERRIDE;
226
227 virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE;
228
229 virtual void setMatrix(const SkMatrix& matrix) SK_OVERRIDE;
230
231 virtual bool skew(SkScalar sx, SkScalar sy) SK_OVERRIDE;
232
233 virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE;
234
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000235 static const int kVizImageHeight = 256;
236 static const int kVizImageWidth = 256;
237
chudy@google.com902ebe52012-06-29 14:21:22 +0000238private:
robertphillips@google.com67baba42013-01-02 20:20:31 +0000239 SkTDArray<SkDrawCommand*> fCommandVector;
chudy@google.comb9ddd4e2012-07-10 14:14:50 +0000240 int fHeight;
241 int fWidth;
chudy@google.com902ebe52012-06-29 14:21:22 +0000242 SkBitmap fBm;
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000243 bool fFilter;
chudy@google.com830b8792012-08-01 15:57:52 +0000244 int fIndex;
bungeman@google.come8cc6e82013-01-17 16:30:56 +0000245 SkMatrix fUserMatrix;
chudy@google.coma9e937c2012-08-03 17:32:05 +0000246 SkMatrix fMatrix;
247 SkIRect fClip;
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000248 bool fOverdrawViz;
249 SkDrawFilter* fOverdrawFilter;
chudy@google.com902ebe52012-06-29 14:21:22 +0000250
251 /**
tomhudson@google.com0699e022012-11-27 16:09:42 +0000252 Number of unmatched save() calls at any point during a draw.
253 If there are any saveLayer() calls outstanding, we need to resolve
254 all of them, which in practice means resolving all save() calls,
255 to avoid corruption of our canvas.
256 */
257 int fOutstandingSaveCount;
258
259 /**
chudy@google.com902ebe52012-06-29 14:21:22 +0000260 Adds the command to the classes vector of commands.
261 @param command The draw command for execution
262 */
263 void addDrawCommand(SkDrawCommand* command);
chudy@google.com830b8792012-08-01 15:57:52 +0000264
265 /**
266 Applies any panning and zooming the user has specified before
267 drawing anything else into the canvas.
268 */
269 void applyUserTransform(SkCanvas* canvas);
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000270
271 typedef SkCanvas INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000272};
273
274#endif