blob: 2512702f4f47f637a3866db29874d3dc0fc03183 [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);
chudy@google.com902ebe52012-06-29 14:21:22 +000022 ~SkDebugCanvas();
23
24 void toggleFilter(bool toggle);
25
26 /**
27 Executes all draw calls to the canvas.
28 @param canvas The canvas being drawn to
29 */
30 void draw(SkCanvas* canvas);
31
32 /**
33 Executes the draw calls in the specified range.
34 @param canvas The canvas being drawn to
35 @param i The beginning of the range
36 @param j The end of the range
37 TODO(chudy): Implement
38 */
39 void drawRange(SkCanvas* canvas, int i, int j);
40
41 /**
42 Executes the draw calls up to the specified index.
43 @param canvas The canvas being drawn to
44 @param index The index of the final command being executed
45 */
chudy@google.com0b5bbb02012-07-31 19:55:32 +000046 void drawTo(SkCanvas* canvas, int index);
47
48 /**
chudy@google.coma9e937c2012-08-03 17:32:05 +000049 Returns the most recently calculated transformation matrix
50 */
51 const SkMatrix& getCurrentMatrix() {
52 return fMatrix;
53 }
54
55 /**
56 Returns the most recently calculated clip
57 */
58 const SkIRect& getCurrentClip() {
59 return fClip;
60 }
61
62 /**
chudy@google.com0b5bbb02012-07-31 19:55:32 +000063 Returns the index of the last draw command to write to the pixel at (x,y)
64 */
chudy@google.com830b8792012-08-01 15:57:52 +000065 int getCommandAtPoint(int x, int y, int index);
chudy@google.com902ebe52012-06-29 14:21:22 +000066
67 /**
68 Returns the draw command at the given index.
69 @param index The index of the command
70 */
71 SkDrawCommand* getDrawCommandAt(int index);
72
73 /**
74 Returns information about the command at the given index.
75 @param index The index of the command
76 */
chudy@google.com97cee972012-08-07 20:41:37 +000077 SkTDArray<SkString*>* getCommandInfo(int index);
chudy@google.com902ebe52012-06-29 14:21:22 +000078
79 /**
chudy@google.com7e4cfbf2012-07-17 15:40:51 +000080 Returns the visibility of the command at the given index.
81 @param index The index of the command
82 */
83 bool getDrawCommandVisibilityAt(int index);
84
85 /**
chudy@google.com902ebe52012-06-29 14:21:22 +000086 Returns the vector of draw commands
87 */
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +000088 const SkTDArray<SkDrawCommand*>& getDrawCommands() const;
chudy@google.com902ebe52012-06-29 14:21:22 +000089
90 /**
91 * Returns the string vector of draw commands
92 */
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +000093 SkTArray<SkString>* getDrawCommandsAsStrings() const;
chudy@google.com902ebe52012-06-29 14:21:22 +000094
95 /**
chudy@google.comf1414322012-07-03 20:28:14 +000096 Returns length of draw command vector.
97 */
98 int getSize() {
chudy@google.com97cee972012-08-07 20:41:37 +000099 return commandVector.count();
chudy@google.comf1414322012-07-03 20:28:14 +0000100 }
101
chudy@google.com902ebe52012-06-29 14:21:22 +0000102 /**
103 Toggles the visibility / execution of the draw command at index i with
104 the value of toggle.
105 */
106 void toggleCommand(int index, bool toggle);
107
chudy@google.comb9ddd4e2012-07-10 14:14:50 +0000108 void setBounds(int width, int height) {
109 fWidth = width;
110 fHeight = height;
111 }
112
chudy@google.com830b8792012-08-01 15:57:52 +0000113 void setUserOffset(SkIPoint offset) {
114 fUserOffset = offset;
115 }
116
117 void setUserScale(float scale) {
118 fUserScale = scale;
119 }
120
chudy@google.com902ebe52012-06-29 14:21:22 +0000121////////////////////////////////////////////////////////////////////////////////
122// Inherited from SkCanvas
123////////////////////////////////////////////////////////////////////////////////
124
125 virtual void clear(SkColor) SK_OVERRIDE;
126
127 virtual bool clipPath(const SkPath&, SkRegion::Op, bool) SK_OVERRIDE;
128
129 virtual bool clipRect(const SkRect&, SkRegion::Op, bool) SK_OVERRIDE;
130
131 virtual bool clipRegion(const SkRegion& region, SkRegion::Op op) SK_OVERRIDE;
132
133 virtual bool concat(const SkMatrix& matrix) SK_OVERRIDE;
134
135 virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top,
136 const SkPaint*) SK_OVERRIDE;
137
reed@google.com71121732012-09-18 15:14:33 +0000138 virtual void drawBitmapRectToRect(const SkBitmap&, const SkRect* src,
139 const SkRect& dst, const SkPaint*) SK_OVERRIDE;
chudy@google.com902ebe52012-06-29 14:21:22 +0000140
141 virtual void drawBitmapMatrix(const SkBitmap&, const SkMatrix&,
142 const SkPaint*) SK_OVERRIDE;
143
144 virtual void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
145 const SkRect& dst, const SkPaint*) SK_OVERRIDE;
146
147 virtual void drawData(const void*, size_t) SK_OVERRIDE;
148
149 virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE;
150
151 virtual void drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE;
152
153 virtual void drawPicture(SkPicture& picture) SK_OVERRIDE;
154
155 virtual void drawPoints(PointMode, size_t count, const SkPoint pts[],
156 const SkPaint&) SK_OVERRIDE;
157
158 virtual void drawPosText(const void* text, size_t byteLength,
159 const SkPoint pos[], const SkPaint&) SK_OVERRIDE;
160
161 virtual void drawPosTextH(const void* text, size_t byteLength,
162 const SkScalar xpos[], SkScalar constY, const SkPaint&) SK_OVERRIDE;
163
164 virtual void drawRect(const SkRect& rect, const SkPaint&) SK_OVERRIDE;
165
166 virtual void drawSprite(const SkBitmap&, int left, int top,
167 const SkPaint*) SK_OVERRIDE;
168
169 virtual void drawText(const void* text, size_t byteLength, SkScalar x,
170 SkScalar y, const SkPaint&) SK_OVERRIDE;
171
172 virtual void drawTextOnPath(const void* text, size_t byteLength,
173 const SkPath& path, const SkMatrix* matrix,
174 const SkPaint&) SK_OVERRIDE;
175
176 virtual void drawVertices(VertexMode, int vertexCount,
177 const SkPoint vertices[], const SkPoint texs[],
178 const SkColor colors[], SkXfermode*,
179 const uint16_t indices[], int indexCount,
180 const SkPaint&) SK_OVERRIDE;
181
182 virtual void restore() SK_OVERRIDE;
183
184 virtual bool rotate(SkScalar degrees) SK_OVERRIDE;
185
186 virtual int save(SaveFlags) SK_OVERRIDE;
187
188 virtual int saveLayer(const SkRect* bounds, const SkPaint*, SaveFlags) SK_OVERRIDE;
189
190 virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE;
191
192 virtual void setMatrix(const SkMatrix& matrix) SK_OVERRIDE;
193
194 virtual bool skew(SkScalar sx, SkScalar sy) SK_OVERRIDE;
195
196 virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE;
197
198private:
199 typedef SkCanvas INHERITED;
chudy@google.com97cee972012-08-07 20:41:37 +0000200 SkTDArray<SkDrawCommand*> commandVector;
chudy@google.comb9ddd4e2012-07-10 14:14:50 +0000201 int fHeight;
202 int fWidth;
chudy@google.com902ebe52012-06-29 14:21:22 +0000203 SkBitmap fBm;
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000204 bool fFilter;
chudy@google.com830b8792012-08-01 15:57:52 +0000205 int fIndex;
206 SkIPoint fUserOffset;
207 float fUserScale;
chudy@google.coma9e937c2012-08-03 17:32:05 +0000208 SkMatrix fMatrix;
209 SkIRect fClip;
chudy@google.com902ebe52012-06-29 14:21:22 +0000210
211 /**
tomhudson@google.com0699e022012-11-27 16:09:42 +0000212 Number of unmatched save() calls at any point during a draw.
213 If there are any saveLayer() calls outstanding, we need to resolve
214 all of them, which in practice means resolving all save() calls,
215 to avoid corruption of our canvas.
216 */
217 int fOutstandingSaveCount;
218
219 /**
chudy@google.com902ebe52012-06-29 14:21:22 +0000220 Adds the command to the classes vector of commands.
221 @param command The draw command for execution
222 */
223 void addDrawCommand(SkDrawCommand* command);
chudy@google.com830b8792012-08-01 15:57:52 +0000224
225 /**
226 Applies any panning and zooming the user has specified before
227 drawing anything else into the canvas.
228 */
229 void applyUserTransform(SkCanvas* canvas);
chudy@google.com902ebe52012-06-29 14:21:22 +0000230};
231
232#endif