blob: 841d3c9b779cb3573bbb720b5359edf72e450da2 [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
19class SkDebugCanvas : public SkCanvas {
20public:
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.com67baba42013-01-02 20:20:31 +0000174 virtual void drawOval(const SkRect& oval, const SkPaint&) SK_OVERRIDE;
175
chudy@google.com902ebe52012-06-29 14:21:22 +0000176 virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE;
177
178 virtual void drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE;
179
180 virtual void drawPicture(SkPicture& picture) SK_OVERRIDE;
181
182 virtual void drawPoints(PointMode, size_t count, const SkPoint pts[],
183 const SkPaint&) SK_OVERRIDE;
184
185 virtual void drawPosText(const void* text, size_t byteLength,
186 const SkPoint pos[], const SkPaint&) SK_OVERRIDE;
187
188 virtual void drawPosTextH(const void* text, size_t byteLength,
skia.committer@gmail.com422188f2013-01-03 02:01:32 +0000189 const SkScalar xpos[], SkScalar constY,
robertphillips@google.com67baba42013-01-02 20:20:31 +0000190 const SkPaint&) SK_OVERRIDE;
chudy@google.com902ebe52012-06-29 14:21:22 +0000191
192 virtual void drawRect(const SkRect& rect, const SkPaint&) SK_OVERRIDE;
193
robertphillips@google.com67baba42013-01-02 20:20:31 +0000194 virtual void drawRRect(const SkRRect& rrect, const SkPaint& paint) SK_OVERRIDE;
195
chudy@google.com902ebe52012-06-29 14:21:22 +0000196 virtual void drawSprite(const SkBitmap&, int left, int top,
197 const SkPaint*) SK_OVERRIDE;
198
199 virtual void drawText(const void* text, size_t byteLength, SkScalar x,
200 SkScalar y, const SkPaint&) SK_OVERRIDE;
201
202 virtual void drawTextOnPath(const void* text, size_t byteLength,
robertphillips@google.com67baba42013-01-02 20:20:31 +0000203 const SkPath& path, const SkMatrix* matrix,
chudy@google.com902ebe52012-06-29 14:21:22 +0000204 const SkPaint&) SK_OVERRIDE;
205
206 virtual void drawVertices(VertexMode, int vertexCount,
robertphillips@google.com67baba42013-01-02 20:20:31 +0000207 const SkPoint vertices[], const SkPoint texs[],
208 const SkColor colors[], SkXfermode*,
209 const uint16_t indices[], int indexCount,
chudy@google.com902ebe52012-06-29 14:21:22 +0000210 const SkPaint&) SK_OVERRIDE;
211
212 virtual void restore() SK_OVERRIDE;
213
214 virtual bool rotate(SkScalar degrees) SK_OVERRIDE;
215
216 virtual int save(SaveFlags) SK_OVERRIDE;
217
218 virtual int saveLayer(const SkRect* bounds, const SkPaint*, SaveFlags) SK_OVERRIDE;
219
220 virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE;
221
222 virtual void setMatrix(const SkMatrix& matrix) SK_OVERRIDE;
223
224 virtual bool skew(SkScalar sx, SkScalar sy) SK_OVERRIDE;
225
226 virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE;
227
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000228 static const int kVizImageHeight = 256;
229 static const int kVizImageWidth = 256;
230
chudy@google.com902ebe52012-06-29 14:21:22 +0000231private:
robertphillips@google.com67baba42013-01-02 20:20:31 +0000232 SkTDArray<SkDrawCommand*> fCommandVector;
chudy@google.comb9ddd4e2012-07-10 14:14:50 +0000233 int fHeight;
234 int fWidth;
chudy@google.com902ebe52012-06-29 14:21:22 +0000235 SkBitmap fBm;
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000236 bool fFilter;
chudy@google.com830b8792012-08-01 15:57:52 +0000237 int fIndex;
bungeman@google.come8cc6e82013-01-17 16:30:56 +0000238 SkMatrix fUserMatrix;
chudy@google.coma9e937c2012-08-03 17:32:05 +0000239 SkMatrix fMatrix;
240 SkIRect fClip;
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000241 bool fOverdrawViz;
242 SkDrawFilter* fOverdrawFilter;
chudy@google.com902ebe52012-06-29 14:21:22 +0000243
244 /**
tomhudson@google.com0699e022012-11-27 16:09:42 +0000245 Number of unmatched save() calls at any point during a draw.
246 If there are any saveLayer() calls outstanding, we need to resolve
247 all of them, which in practice means resolving all save() calls,
248 to avoid corruption of our canvas.
249 */
250 int fOutstandingSaveCount;
251
252 /**
chudy@google.com902ebe52012-06-29 14:21:22 +0000253 Adds the command to the classes vector of commands.
254 @param command The draw command for execution
255 */
256 void addDrawCommand(SkDrawCommand* command);
chudy@google.com830b8792012-08-01 15:57:52 +0000257
258 /**
259 Applies any panning and zooming the user has specified before
260 drawing anything else into the canvas.
261 */
262 void applyUserTransform(SkCanvas* canvas);
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000263
264 typedef SkCanvas INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000265};
266
267#endif