blob: 3df31513b46b2f56742d26fb1f6316f7629665ab [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
robertphillips@google.com32bbcf82013-10-17 17:56:10 +000019class SkTexOverrideFilter;
20
fmalita@google.com86681b32013-06-13 20:59:14 +000021class SK_API SkDebugCanvas : public SkCanvas {
chudy@google.com902ebe52012-06-29 14:21:22 +000022public:
chudy@google.com80a4a602012-07-30 18:54:07 +000023 SkDebugCanvas(int width, int height);
robertphillips@google.comf4741c12013-02-06 20:13:54 +000024 virtual ~SkDebugCanvas();
chudy@google.com902ebe52012-06-29 14:21:22 +000025
26 void toggleFilter(bool toggle);
27
28 /**
robertphillips@google.comf4741c12013-02-06 20:13:54 +000029 * Enable or disable overdraw visualization
30 */
31 void setOverdrawViz(bool overdrawViz) { fOverdrawViz = overdrawViz; }
32
33 /**
robertphillips@google.com32bbcf82013-10-17 17:56:10 +000034 * Enable or disable texure filtering override
35 */
skia.committer@gmail.comf84ad8f2013-10-18 07:01:59 +000036 void overrideTexFiltering(bool overrideTexFiltering, SkPaint::FilterLevel level);
robertphillips@google.com32bbcf82013-10-17 17:56:10 +000037
38 /**
chudy@google.com902ebe52012-06-29 14:21:22 +000039 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 in the specified range.
46 @param canvas The canvas being drawn to
47 @param i The beginning of the range
48 @param j The end of the range
49 TODO(chudy): Implement
50 */
51 void drawRange(SkCanvas* canvas, int i, int j);
52
53 /**
54 Executes the draw calls up to the specified index.
55 @param canvas The canvas being drawn to
56 @param index The index of the final command being executed
57 */
chudy@google.com0b5bbb02012-07-31 19:55:32 +000058 void drawTo(SkCanvas* canvas, int index);
59
60 /**
chudy@google.coma9e937c2012-08-03 17:32:05 +000061 Returns the most recently calculated transformation matrix
62 */
63 const SkMatrix& getCurrentMatrix() {
64 return fMatrix;
65 }
66
67 /**
68 Returns the most recently calculated clip
69 */
70 const SkIRect& getCurrentClip() {
71 return fClip;
72 }
73
74 /**
chudy@google.com0b5bbb02012-07-31 19:55:32 +000075 Returns the index of the last draw command to write to the pixel at (x,y)
76 */
chudy@google.com830b8792012-08-01 15:57:52 +000077 int getCommandAtPoint(int x, int y, int index);
chudy@google.com902ebe52012-06-29 14:21:22 +000078
79 /**
robertphillips@google.com50c84da2013-04-01 18:18:49 +000080 Removes the command at the specified index
81 @param index The index of the command to delete
82 */
83 void deleteDrawCommandAt(int index);
84
85 /**
chudy@google.com902ebe52012-06-29 14:21:22 +000086 Returns the draw command at the given index.
87 @param index The index of the command
88 */
89 SkDrawCommand* getDrawCommandAt(int index);
90
91 /**
robertphillips@google.com50c84da2013-04-01 18:18:49 +000092 Sets the draw command for a given index.
93 @param index The index to overwrite
94 @param command The new command
95 */
96 void setDrawCommandAt(int index, SkDrawCommand* command);
97
98 /**
chudy@google.com902ebe52012-06-29 14:21:22 +000099 Returns information about the command at the given index.
100 @param index The index of the command
101 */
chudy@google.com97cee972012-08-07 20:41:37 +0000102 SkTDArray<SkString*>* getCommandInfo(int index);
chudy@google.com902ebe52012-06-29 14:21:22 +0000103
104 /**
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000105 Returns the visibility of the command at the given index.
106 @param index The index of the command
107 */
108 bool getDrawCommandVisibilityAt(int index);
109
110 /**
chudy@google.com902ebe52012-06-29 14:21:22 +0000111 Returns the vector of draw commands
112 */
reed@google.com44699382013-10-31 17:28:30 +0000113 SK_ATTR_DEPRECATED("please use getDrawCommandAt and getSize instead")
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000114 const SkTDArray<SkDrawCommand*>& getDrawCommands() const;
skia.committer@gmail.com2e71f162013-03-12 07:12:32 +0000115
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000116 /**
117 Returns the vector of draw commands. Do not use this entry
118 point - it is going away!
119 */
120 SkTDArray<SkDrawCommand*>& getDrawCommands();
chudy@google.com902ebe52012-06-29 14:21:22 +0000121
122 /**
123 * Returns the string vector of draw commands
124 */
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000125 SkTArray<SkString>* getDrawCommandsAsStrings() const;
chudy@google.com902ebe52012-06-29 14:21:22 +0000126
127 /**
chudy@google.comf1414322012-07-03 20:28:14 +0000128 Returns length of draw command vector.
129 */
commit-bot@chromium.org0d4fe142013-07-15 22:47:14 +0000130 int getSize() const {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000131 return fCommandVector.count();
chudy@google.comf1414322012-07-03 20:28:14 +0000132 }
133
chudy@google.com902ebe52012-06-29 14:21:22 +0000134 /**
135 Toggles the visibility / execution of the draw command at index i with
136 the value of toggle.
137 */
138 void toggleCommand(int index, bool toggle);
139
chudy@google.comb9ddd4e2012-07-10 14:14:50 +0000140 void setBounds(int width, int height) {
141 fWidth = width;
142 fHeight = height;
143 }
144
bungeman@google.come8cc6e82013-01-17 16:30:56 +0000145 void setUserMatrix(SkMatrix matrix) {
146 fUserMatrix = matrix;
chudy@google.com830b8792012-08-01 15:57:52 +0000147 }
148
chudy@google.com902ebe52012-06-29 14:21:22 +0000149////////////////////////////////////////////////////////////////////////////////
150// Inherited from SkCanvas
151////////////////////////////////////////////////////////////////////////////////
152
153 virtual void clear(SkColor) SK_OVERRIDE;
154
155 virtual bool clipPath(const SkPath&, SkRegion::Op, bool) SK_OVERRIDE;
156
157 virtual bool clipRect(const SkRect&, SkRegion::Op, bool) SK_OVERRIDE;
158
robertphillips@google.com67baba42013-01-02 20:20:31 +0000159 virtual bool clipRRect(const SkRRect& rrect,
160 SkRegion::Op op = SkRegion::kIntersect_Op,
161 bool doAntiAlias = false) SK_OVERRIDE;
162
chudy@google.com902ebe52012-06-29 14:21:22 +0000163 virtual bool clipRegion(const SkRegion& region, SkRegion::Op op) SK_OVERRIDE;
164
165 virtual bool concat(const SkMatrix& matrix) SK_OVERRIDE;
166
167 virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top,
168 const SkPaint*) SK_OVERRIDE;
169
reed@google.com71121732012-09-18 15:14:33 +0000170 virtual void drawBitmapRectToRect(const SkBitmap&, const SkRect* src,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000171 const SkRect& dst, const SkPaint* paint,
172 DrawBitmapRectFlags flags) SK_OVERRIDE;
chudy@google.com902ebe52012-06-29 14:21:22 +0000173
174 virtual void drawBitmapMatrix(const SkBitmap&, const SkMatrix&,
175 const SkPaint*) SK_OVERRIDE;
176
177 virtual void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
178 const SkRect& dst, const SkPaint*) SK_OVERRIDE;
179
180 virtual void drawData(const void*, size_t) SK_OVERRIDE;
181
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000182 virtual void beginCommentGroup(const char* description) SK_OVERRIDE;
183
184 virtual void addComment(const char* kywd, const char* value) SK_OVERRIDE;
185
186 virtual void endCommentGroup() SK_OVERRIDE;
187
robertphillips@google.com67baba42013-01-02 20:20:31 +0000188 virtual void drawOval(const SkRect& oval, const SkPaint&) SK_OVERRIDE;
189
chudy@google.com902ebe52012-06-29 14:21:22 +0000190 virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE;
191
bsalomon@google.com7ce564c2013-10-22 16:54:15 +0000192 virtual void drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE;
193
chudy@google.com902ebe52012-06-29 14:21:22 +0000194 virtual void drawPicture(SkPicture& picture) SK_OVERRIDE;
195
196 virtual void drawPoints(PointMode, size_t count, const SkPoint pts[],
197 const SkPaint&) SK_OVERRIDE;
198
199 virtual void drawPosText(const void* text, size_t byteLength,
200 const SkPoint pos[], const SkPaint&) SK_OVERRIDE;
201
202 virtual void drawPosTextH(const void* text, size_t byteLength,
skia.committer@gmail.com422188f2013-01-03 02:01:32 +0000203 const SkScalar xpos[], SkScalar constY,
robertphillips@google.com67baba42013-01-02 20:20:31 +0000204 const SkPaint&) SK_OVERRIDE;
chudy@google.com902ebe52012-06-29 14:21:22 +0000205
bsalomon@google.com7ce564c2013-10-22 16:54:15 +0000206 virtual void drawRect(const SkRect& rect, const SkPaint&) SK_OVERRIDE;
207
robertphillips@google.com67baba42013-01-02 20:20:31 +0000208 virtual void drawRRect(const SkRRect& rrect, const SkPaint& paint) SK_OVERRIDE;
209
chudy@google.com902ebe52012-06-29 14:21:22 +0000210 virtual void drawSprite(const SkBitmap&, int left, int top,
211 const SkPaint*) SK_OVERRIDE;
212
213 virtual void drawText(const void* text, size_t byteLength, SkScalar x,
214 SkScalar y, const SkPaint&) SK_OVERRIDE;
215
216 virtual void drawTextOnPath(const void* text, size_t byteLength,
robertphillips@google.com67baba42013-01-02 20:20:31 +0000217 const SkPath& path, const SkMatrix* matrix,
chudy@google.com902ebe52012-06-29 14:21:22 +0000218 const SkPaint&) SK_OVERRIDE;
219
220 virtual void drawVertices(VertexMode, int vertexCount,
robertphillips@google.com67baba42013-01-02 20:20:31 +0000221 const SkPoint vertices[], const SkPoint texs[],
222 const SkColor colors[], SkXfermode*,
223 const uint16_t indices[], int indexCount,
chudy@google.com902ebe52012-06-29 14:21:22 +0000224 const SkPaint&) SK_OVERRIDE;
225
226 virtual void restore() SK_OVERRIDE;
227
228 virtual bool rotate(SkScalar degrees) SK_OVERRIDE;
229
230 virtual int save(SaveFlags) SK_OVERRIDE;
231
232 virtual int saveLayer(const SkRect* bounds, const SkPaint*, SaveFlags) SK_OVERRIDE;
233
234 virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE;
235
236 virtual void setMatrix(const SkMatrix& matrix) SK_OVERRIDE;
237
238 virtual bool skew(SkScalar sx, SkScalar sy) SK_OVERRIDE;
239
240 virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE;
241
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000242 static const int kVizImageHeight = 256;
243 static const int kVizImageWidth = 256;
244
chudy@google.com902ebe52012-06-29 14:21:22 +0000245private:
robertphillips@google.com67baba42013-01-02 20:20:31 +0000246 SkTDArray<SkDrawCommand*> fCommandVector;
chudy@google.comb9ddd4e2012-07-10 14:14:50 +0000247 int fHeight;
248 int fWidth;
chudy@google.com902ebe52012-06-29 14:21:22 +0000249 SkBitmap fBm;
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000250 bool fFilter;
chudy@google.com830b8792012-08-01 15:57:52 +0000251 int fIndex;
bungeman@google.come8cc6e82013-01-17 16:30:56 +0000252 SkMatrix fUserMatrix;
chudy@google.coma9e937c2012-08-03 17:32:05 +0000253 SkMatrix fMatrix;
254 SkIRect fClip;
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000255
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000256 bool fOverdrawViz;
257 SkDrawFilter* fOverdrawFilter;
chudy@google.com902ebe52012-06-29 14:21:22 +0000258
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000259 bool fOverrideTexFiltering;
260 SkTexOverrideFilter* fTexOverrideFilter;
261
chudy@google.com902ebe52012-06-29 14:21:22 +0000262 /**
tomhudson@google.com0699e022012-11-27 16:09:42 +0000263 Number of unmatched save() calls at any point during a draw.
264 If there are any saveLayer() calls outstanding, we need to resolve
265 all of them, which in practice means resolving all save() calls,
266 to avoid corruption of our canvas.
267 */
268 int fOutstandingSaveCount;
269
270 /**
chudy@google.com902ebe52012-06-29 14:21:22 +0000271 Adds the command to the classes vector of commands.
272 @param command The draw command for execution
273 */
274 void addDrawCommand(SkDrawCommand* command);
chudy@google.com830b8792012-08-01 15:57:52 +0000275
276 /**
277 Applies any panning and zooming the user has specified before
278 drawing anything else into the canvas.
279 */
280 void applyUserTransform(SkCanvas* canvas);
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000281
282 typedef SkCanvas INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000283};
284
285#endif