blob: a94663dcb29bcd20f7646807ee1c70c085827e47 [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() {
robertphillips@google.com67baba42013-01-02 20:20:31 +000099 return fCommandVector.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
robertphillips@google.com67baba42013-01-02 20:20:31 +0000131 virtual bool clipRRect(const SkRRect& rrect,
132 SkRegion::Op op = SkRegion::kIntersect_Op,
133 bool doAntiAlias = false) SK_OVERRIDE;
134
chudy@google.com902ebe52012-06-29 14:21:22 +0000135 virtual bool clipRegion(const SkRegion& region, SkRegion::Op op) SK_OVERRIDE;
136
137 virtual bool concat(const SkMatrix& matrix) SK_OVERRIDE;
138
139 virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top,
140 const SkPaint*) SK_OVERRIDE;
141
reed@google.com71121732012-09-18 15:14:33 +0000142 virtual void drawBitmapRectToRect(const SkBitmap&, const SkRect* src,
143 const SkRect& dst, const SkPaint*) SK_OVERRIDE;
chudy@google.com902ebe52012-06-29 14:21:22 +0000144
145 virtual void drawBitmapMatrix(const SkBitmap&, const SkMatrix&,
146 const SkPaint*) SK_OVERRIDE;
147
148 virtual void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
149 const SkRect& dst, const SkPaint*) SK_OVERRIDE;
150
151 virtual void drawData(const void*, size_t) SK_OVERRIDE;
152
robertphillips@google.com67baba42013-01-02 20:20:31 +0000153 virtual void drawOval(const SkRect& oval, const SkPaint&) SK_OVERRIDE;
154
chudy@google.com902ebe52012-06-29 14:21:22 +0000155 virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE;
156
157 virtual void drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE;
158
159 virtual void drawPicture(SkPicture& picture) SK_OVERRIDE;
160
161 virtual void drawPoints(PointMode, size_t count, const SkPoint pts[],
162 const SkPaint&) SK_OVERRIDE;
163
164 virtual void drawPosText(const void* text, size_t byteLength,
165 const SkPoint pos[], const SkPaint&) SK_OVERRIDE;
166
167 virtual void drawPosTextH(const void* text, size_t byteLength,
skia.committer@gmail.com422188f2013-01-03 02:01:32 +0000168 const SkScalar xpos[], SkScalar constY,
robertphillips@google.com67baba42013-01-02 20:20:31 +0000169 const SkPaint&) SK_OVERRIDE;
chudy@google.com902ebe52012-06-29 14:21:22 +0000170
171 virtual void drawRect(const SkRect& rect, const SkPaint&) SK_OVERRIDE;
172
robertphillips@google.com67baba42013-01-02 20:20:31 +0000173 virtual void drawRRect(const SkRRect& rrect, const SkPaint& paint) SK_OVERRIDE;
174
chudy@google.com902ebe52012-06-29 14:21:22 +0000175 virtual void drawSprite(const SkBitmap&, int left, int top,
176 const SkPaint*) SK_OVERRIDE;
177
178 virtual void drawText(const void* text, size_t byteLength, SkScalar x,
179 SkScalar y, const SkPaint&) SK_OVERRIDE;
180
181 virtual void drawTextOnPath(const void* text, size_t byteLength,
robertphillips@google.com67baba42013-01-02 20:20:31 +0000182 const SkPath& path, const SkMatrix* matrix,
chudy@google.com902ebe52012-06-29 14:21:22 +0000183 const SkPaint&) SK_OVERRIDE;
184
185 virtual void drawVertices(VertexMode, int vertexCount,
robertphillips@google.com67baba42013-01-02 20:20:31 +0000186 const SkPoint vertices[], const SkPoint texs[],
187 const SkColor colors[], SkXfermode*,
188 const uint16_t indices[], int indexCount,
chudy@google.com902ebe52012-06-29 14:21:22 +0000189 const SkPaint&) SK_OVERRIDE;
190
191 virtual void restore() SK_OVERRIDE;
192
193 virtual bool rotate(SkScalar degrees) SK_OVERRIDE;
194
195 virtual int save(SaveFlags) SK_OVERRIDE;
196
197 virtual int saveLayer(const SkRect* bounds, const SkPaint*, SaveFlags) SK_OVERRIDE;
198
199 virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE;
200
201 virtual void setMatrix(const SkMatrix& matrix) SK_OVERRIDE;
202
203 virtual bool skew(SkScalar sx, SkScalar sy) SK_OVERRIDE;
204
205 virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE;
206
207private:
208 typedef SkCanvas INHERITED;
robertphillips@google.com67baba42013-01-02 20:20:31 +0000209 SkTDArray<SkDrawCommand*> fCommandVector;
chudy@google.comb9ddd4e2012-07-10 14:14:50 +0000210 int fHeight;
211 int fWidth;
chudy@google.com902ebe52012-06-29 14:21:22 +0000212 SkBitmap fBm;
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000213 bool fFilter;
chudy@google.com830b8792012-08-01 15:57:52 +0000214 int fIndex;
215 SkIPoint fUserOffset;
216 float fUserScale;
chudy@google.coma9e937c2012-08-03 17:32:05 +0000217 SkMatrix fMatrix;
218 SkIRect fClip;
chudy@google.com902ebe52012-06-29 14:21:22 +0000219
220 /**
tomhudson@google.com0699e022012-11-27 16:09:42 +0000221 Number of unmatched save() calls at any point during a draw.
222 If there are any saveLayer() calls outstanding, we need to resolve
223 all of them, which in practice means resolving all save() calls,
224 to avoid corruption of our canvas.
225 */
226 int fOutstandingSaveCount;
227
228 /**
chudy@google.com902ebe52012-06-29 14:21:22 +0000229 Adds the command to the classes vector of commands.
230 @param command The draw command for execution
231 */
232 void addDrawCommand(SkDrawCommand* command);
chudy@google.com830b8792012-08-01 15:57:52 +0000233
234 /**
235 Applies any panning and zooming the user has specified before
236 drawing anything else into the canvas.
237 */
238 void applyUserTransform(SkCanvas* canvas);
chudy@google.com902ebe52012-06-29 14:21:22 +0000239};
240
241#endif