blob: a3902d2a4e8a83948854cd8d363c5238e54c108c [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"
commit-bot@chromium.org2a67e122014-05-19 13:53:10 +000015#include "SkPathOps.h"
chudy@google.com902ebe52012-06-29 14:21:22 +000016#include "SkPicture.h"
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +000017#include "SkTArray.h"
chudy@google.com97cee972012-08-07 20:41:37 +000018#include "SkString.h"
chudy@google.com902ebe52012-06-29 14:21:22 +000019
robertphillips@google.com32bbcf82013-10-17 17:56:10 +000020class SkTexOverrideFilter;
21
fmalita@google.com86681b32013-06-13 20:59:14 +000022class SK_API SkDebugCanvas : public SkCanvas {
chudy@google.com902ebe52012-06-29 14:21:22 +000023public:
chudy@google.com80a4a602012-07-30 18:54:07 +000024 SkDebugCanvas(int width, int height);
robertphillips@google.comf4741c12013-02-06 20:13:54 +000025 virtual ~SkDebugCanvas();
chudy@google.com902ebe52012-06-29 14:21:22 +000026
commit-bot@chromium.org768ac852014-03-03 16:32:17 +000027 void toggleFilter(bool toggle) { fFilter = toggle; }
28
29 void setMegaVizMode(bool megaVizMode) { fMegaVizMode = megaVizMode; }
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +000030 bool getMegaVizMode() const { return fMegaVizMode; }
chudy@google.com902ebe52012-06-29 14:21:22 +000031
32 /**
robertphillips@google.comf4741c12013-02-06 20:13:54 +000033 * Enable or disable overdraw visualization
34 */
35 void setOverdrawViz(bool overdrawViz) { fOverdrawViz = overdrawViz; }
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +000036 bool getOverdrawViz() const { return fOverdrawViz; }
37
38 void setOutstandingSaveCount(int saveCount) { fOutstandingSaveCount = saveCount; }
39 int getOutstandingSaveCount() const { return fOutstandingSaveCount; }
40
commit-bot@chromium.org2a67e122014-05-19 13:53:10 +000041 bool getAllowSimplifyClip() const { return fAllowSimplifyClip; }
42
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +000043 void setPicture(SkPicture* picture) { fPicture = picture; }
robertphillips@google.comf4741c12013-02-06 20:13:54 +000044
45 /**
robertphillips@google.com32bbcf82013-10-17 17:56:10 +000046 * Enable or disable texure filtering override
47 */
skia.committer@gmail.comf84ad8f2013-10-18 07:01:59 +000048 void overrideTexFiltering(bool overrideTexFiltering, SkPaint::FilterLevel level);
robertphillips@google.com32bbcf82013-10-17 17:56:10 +000049
50 /**
chudy@google.com902ebe52012-06-29 14:21:22 +000051 Executes all draw calls to the canvas.
52 @param canvas The canvas being drawn to
53 */
54 void draw(SkCanvas* canvas);
55
56 /**
chudy@google.com902ebe52012-06-29 14:21:22 +000057 Executes the draw calls up to the specified index.
58 @param canvas The canvas being drawn to
59 @param index The index of the final command being executed
60 */
chudy@google.com0b5bbb02012-07-31 19:55:32 +000061 void drawTo(SkCanvas* canvas, int index);
62
63 /**
chudy@google.coma9e937c2012-08-03 17:32:05 +000064 Returns the most recently calculated transformation matrix
65 */
66 const SkMatrix& getCurrentMatrix() {
67 return fMatrix;
68 }
69
70 /**
71 Returns the most recently calculated clip
72 */
73 const SkIRect& getCurrentClip() {
74 return fClip;
75 }
76
77 /**
chudy@google.com0b5bbb02012-07-31 19:55:32 +000078 Returns the index of the last draw command to write to the pixel at (x,y)
79 */
chudy@google.com830b8792012-08-01 15:57:52 +000080 int getCommandAtPoint(int x, int y, int index);
chudy@google.com902ebe52012-06-29 14:21:22 +000081
82 /**
robertphillips@google.com50c84da2013-04-01 18:18:49 +000083 Removes the command at the specified index
84 @param index The index of the command to delete
85 */
86 void deleteDrawCommandAt(int index);
87
88 /**
chudy@google.com902ebe52012-06-29 14:21:22 +000089 Returns the draw command at the given index.
90 @param index The index of the command
91 */
92 SkDrawCommand* getDrawCommandAt(int index);
93
94 /**
robertphillips@google.com50c84da2013-04-01 18:18:49 +000095 Sets the draw command for a given index.
96 @param index The index to overwrite
97 @param command The new command
98 */
99 void setDrawCommandAt(int index, SkDrawCommand* command);
100
101 /**
chudy@google.com902ebe52012-06-29 14:21:22 +0000102 Returns information about the command at the given index.
103 @param index The index of the command
104 */
chudy@google.com97cee972012-08-07 20:41:37 +0000105 SkTDArray<SkString*>* getCommandInfo(int index);
chudy@google.com902ebe52012-06-29 14:21:22 +0000106
107 /**
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000108 Returns the visibility of the command at the given index.
109 @param index The index of the command
110 */
111 bool getDrawCommandVisibilityAt(int index);
112
113 /**
chudy@google.com902ebe52012-06-29 14:21:22 +0000114 Returns the vector of draw commands
115 */
reed@google.com44699382013-10-31 17:28:30 +0000116 SK_ATTR_DEPRECATED("please use getDrawCommandAt and getSize instead")
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000117 const SkTDArray<SkDrawCommand*>& getDrawCommands() const;
skia.committer@gmail.com2e71f162013-03-12 07:12:32 +0000118
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000119 /**
120 Returns the vector of draw commands. Do not use this entry
121 point - it is going away!
122 */
123 SkTDArray<SkDrawCommand*>& getDrawCommands();
chudy@google.com902ebe52012-06-29 14:21:22 +0000124
125 /**
126 * Returns the string vector of draw commands
127 */
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000128 SkTArray<SkString>* getDrawCommandsAsStrings() const;
chudy@google.com902ebe52012-06-29 14:21:22 +0000129
130 /**
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000131 * Returns an array containing an offset (in the SkPicture) for each command
132 */
133 SkTDArray<size_t>* getDrawCommandOffsets() const;
134
135 /**
chudy@google.comf1414322012-07-03 20:28:14 +0000136 Returns length of draw command vector.
137 */
commit-bot@chromium.org0d4fe142013-07-15 22:47:14 +0000138 int getSize() const {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000139 return fCommandVector.count();
chudy@google.comf1414322012-07-03 20:28:14 +0000140 }
141
chudy@google.com902ebe52012-06-29 14:21:22 +0000142 /**
143 Toggles the visibility / execution of the draw command at index i with
144 the value of toggle.
145 */
146 void toggleCommand(int index, bool toggle);
147
chudy@google.comb9ddd4e2012-07-10 14:14:50 +0000148 void setBounds(int width, int height) {
149 fWidth = width;
150 fHeight = height;
151 }
152
bungeman@google.come8cc6e82013-01-17 16:30:56 +0000153 void setUserMatrix(SkMatrix matrix) {
154 fUserMatrix = matrix;
chudy@google.com830b8792012-08-01 15:57:52 +0000155 }
156
commit-bot@chromium.org2a67e122014-05-19 13:53:10 +0000157 SkString clipStackData() const { return fClipStackData; }
158
chudy@google.com902ebe52012-06-29 14:21:22 +0000159////////////////////////////////////////////////////////////////////////////////
160// Inherited from SkCanvas
161////////////////////////////////////////////////////////////////////////////////
162
163 virtual void clear(SkColor) SK_OVERRIDE;
164
chudy@google.com902ebe52012-06-29 14:21:22 +0000165 virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top,
166 const SkPaint*) SK_OVERRIDE;
167
reed@google.com71121732012-09-18 15:14:33 +0000168 virtual void drawBitmapRectToRect(const SkBitmap&, const SkRect* src,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000169 const SkRect& dst, const SkPaint* paint,
170 DrawBitmapRectFlags flags) SK_OVERRIDE;
chudy@google.com902ebe52012-06-29 14:21:22 +0000171
172 virtual void drawBitmapMatrix(const SkBitmap&, const SkMatrix&,
173 const SkPaint*) SK_OVERRIDE;
174
175 virtual void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
176 const SkRect& dst, const SkPaint*) SK_OVERRIDE;
177
178 virtual void drawData(const void*, size_t) SK_OVERRIDE;
179
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000180 virtual void beginCommentGroup(const char* description) SK_OVERRIDE;
181
182 virtual void addComment(const char* kywd, const char* value) SK_OVERRIDE;
183
184 virtual void endCommentGroup() SK_OVERRIDE;
185
robertphillips@google.com67baba42013-01-02 20:20:31 +0000186 virtual void drawOval(const SkRect& oval, const SkPaint&) SK_OVERRIDE;
187
chudy@google.com902ebe52012-06-29 14:21:22 +0000188 virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE;
189
bsalomon@google.com7ce564c2013-10-22 16:54:15 +0000190 virtual void drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE;
191
chudy@google.com902ebe52012-06-29 14:21:22 +0000192 virtual void drawPoints(PointMode, size_t count, const SkPoint pts[],
193 const SkPaint&) SK_OVERRIDE;
194
bsalomon@google.com7ce564c2013-10-22 16:54:15 +0000195 virtual void drawRect(const SkRect& rect, const SkPaint&) SK_OVERRIDE;
196
robertphillips@google.com67baba42013-01-02 20:20:31 +0000197 virtual void drawRRect(const SkRRect& rrect, const SkPaint& paint) SK_OVERRIDE;
198
chudy@google.com902ebe52012-06-29 14:21:22 +0000199 virtual void drawSprite(const SkBitmap&, int left, int top,
200 const SkPaint*) SK_OVERRIDE;
201
chudy@google.com902ebe52012-06-29 14:21:22 +0000202 virtual void drawVertices(VertexMode, int vertexCount,
robertphillips@google.com67baba42013-01-02 20:20:31 +0000203 const SkPoint vertices[], const SkPoint texs[],
204 const SkColor colors[], SkXfermode*,
205 const uint16_t indices[], int indexCount,
chudy@google.com902ebe52012-06-29 14:21:22 +0000206 const SkPaint&) SK_OVERRIDE;
207
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000208 static const int kVizImageHeight = 256;
209 static const int kVizImageWidth = 256;
210
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000211 virtual bool isClipEmpty() const SK_OVERRIDE { return false; }
commit-bot@chromium.org5c70cdc2014-03-08 03:57:19 +0000212 virtual bool isClipRect() const SK_OVERRIDE { return true; }
213#ifdef SK_SUPPORT_LEGACY_GETCLIPTYPE
skia.committer@gmail.com370a8992014-03-01 03:02:09 +0000214 virtual ClipType getClipType() const SK_OVERRIDE {
215 return kRect_ClipType;
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000216 }
commit-bot@chromium.org5c70cdc2014-03-08 03:57:19 +0000217#endif
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000218 virtual bool getClipBounds(SkRect* bounds) const SK_OVERRIDE {
219 if (NULL != bounds) {
skia.committer@gmail.com370a8992014-03-01 03:02:09 +0000220 bounds->setXYWH(0, 0,
221 SkIntToScalar(this->imageInfo().fWidth),
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000222 SkIntToScalar(this->imageInfo().fHeight));
223 }
224 return true;
225 }
226 virtual bool getClipDeviceBounds(SkIRect* bounds) const SK_OVERRIDE {
227 if (NULL != bounds) {
228 bounds->setLargest();
229 }
230 return true;
231 }
232
commit-bot@chromium.orgab582732014-02-21 12:20:45 +0000233protected:
Florin Malita5f6102d2014-06-30 10:13:28 -0400234 virtual void willSave() SK_OVERRIDE;
commit-bot@chromium.orge54a23f2014-03-12 20:21:48 +0000235 virtual SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SaveFlags) SK_OVERRIDE;
236 virtual void willRestore() SK_OVERRIDE;
237
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +0000238 virtual void didConcat(const SkMatrix&) SK_OVERRIDE;
239 virtual void didSetMatrix(const SkMatrix&) SK_OVERRIDE;
240
commit-bot@chromium.orgab582732014-02-21 12:20:45 +0000241 virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) SK_OVERRIDE;
reed@google.come0d9ce82014-04-23 04:00:17 +0000242 virtual void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
243 const SkPaint&) SK_OVERRIDE;
244 virtual void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
245 const SkPaint&) SK_OVERRIDE;
246 virtual void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
247 SkScalar constY, const SkPaint&) SK_OVERRIDE;
248 virtual void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
249 const SkMatrix* matrix, const SkPaint&) SK_OVERRIDE;
commit-bot@chromium.org210ae2a2014-02-27 17:40:13 +0000250 virtual void onPushCull(const SkRect& cullRect) SK_OVERRIDE;
251 virtual void onPopCull() SK_OVERRIDE;
commit-bot@chromium.orgab582732014-02-21 12:20:45 +0000252
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000253 virtual void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
254 virtual void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
255 virtual void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
256 virtual void onClipRegion(const SkRegion& region, SkRegion::Op) SK_OVERRIDE;
257
robertphillips9b14f262014-06-04 05:40:44 -0700258 virtual void onDrawPicture(const SkPicture* picture) SK_OVERRIDE;
259
commit-bot@chromium.org1643b2c2014-03-03 23:25:41 +0000260 void markActiveCommands(int index);
commit-bot@chromium.org768ac852014-03-03 16:32:17 +0000261
chudy@google.com902ebe52012-06-29 14:21:22 +0000262private:
robertphillips@google.com67baba42013-01-02 20:20:31 +0000263 SkTDArray<SkDrawCommand*> fCommandVector;
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000264 SkPicture* fPicture;
chudy@google.comb9ddd4e2012-07-10 14:14:50 +0000265 int fWidth;
commit-bot@chromium.org1735d662013-12-04 13:42:46 +0000266 int fHeight;
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000267 bool fFilter;
commit-bot@chromium.org768ac852014-03-03 16:32:17 +0000268 bool fMegaVizMode;
chudy@google.com830b8792012-08-01 15:57:52 +0000269 int fIndex;
bungeman@google.come8cc6e82013-01-17 16:30:56 +0000270 SkMatrix fUserMatrix;
chudy@google.coma9e937c2012-08-03 17:32:05 +0000271 SkMatrix fMatrix;
272 SkIRect fClip;
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000273
commit-bot@chromium.org2a67e122014-05-19 13:53:10 +0000274 SkString fClipStackData;
275 bool fCalledAddStackData;
276 SkPath fSaveDevPath;
277
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000278 bool fOverdrawViz;
279 SkDrawFilter* fOverdrawFilter;
chudy@google.com902ebe52012-06-29 14:21:22 +0000280
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000281 bool fOverrideTexFiltering;
282 SkTexOverrideFilter* fTexOverrideFilter;
283
chudy@google.com902ebe52012-06-29 14:21:22 +0000284 /**
tomhudson@google.com0699e022012-11-27 16:09:42 +0000285 Number of unmatched save() calls at any point during a draw.
286 If there are any saveLayer() calls outstanding, we need to resolve
287 all of them, which in practice means resolving all save() calls,
288 to avoid corruption of our canvas.
289 */
290 int fOutstandingSaveCount;
291
skia.committer@gmail.comade9a342014-03-04 03:02:32 +0000292 /**
commit-bot@chromium.org1643b2c2014-03-03 23:25:41 +0000293 The active saveLayer commands at a given point in the renderering.
294 Only used when "mega" visualization is enabled.
295 */
296 SkTDArray<SkDrawCommand*> fActiveLayers;
297
skia.committer@gmail.comade9a342014-03-04 03:02:32 +0000298 /**
commit-bot@chromium.org1643b2c2014-03-03 23:25:41 +0000299 The active cull commands at a given point in the rendering.
300 Only used when "mega" visualization is enabled.
301 */
302 SkTDArray<SkDrawCommand*> fActiveCulls;
303
tomhudson@google.com0699e022012-11-27 16:09:42 +0000304 /**
chudy@google.com902ebe52012-06-29 14:21:22 +0000305 Adds the command to the classes vector of commands.
306 @param command The draw command for execution
307 */
308 void addDrawCommand(SkDrawCommand* command);
chudy@google.com830b8792012-08-01 15:57:52 +0000309
310 /**
311 Applies any panning and zooming the user has specified before
312 drawing anything else into the canvas.
313 */
314 void applyUserTransform(SkCanvas* canvas);
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000315
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000316 size_t getOpID() const {
317 if (NULL != fPicture) {
318 return fPicture->EXPERIMENTAL_curOpID();
319 }
320 return 0;
321 }
322
commit-bot@chromium.org2a67e122014-05-19 13:53:10 +0000323 void resetClipStackData() { fClipStackData.reset(); fCalledAddStackData = false; }
324
325 void addClipStackData(const SkPath& devPath, const SkPath& operand, SkRegion::Op elementOp);
326 void addPathData(const SkPath& path, const char* pathName);
327 bool lastClipStackData(const SkPath& devPath);
328 void outputConicPoints(const SkPoint* pts, SkScalar weight);
329 void outputPoints(const SkPoint* pts, int count);
330 void outputPointsCommon(const SkPoint* pts, int count);
331 void outputScalar(SkScalar num);
skia.committer@gmail.com3b9e8be2014-05-20 03:05:34 +0000332
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000333 typedef SkCanvas INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000334};
335
336#endif