blob: bdd04aa2db5cc904860541f3a631c2cfaad1b6fb [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 */
fmalita8c89c522014-11-08 16:18:56 -0800105 const SkTDArray<SkString*>* getCommandInfo(int index) const;
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
robertphillipsa8d7f0b2014-08-29 08:03:56 -0700148 void setWindowSize(int width, int height) { fWindowSize.set(width, height); }
chudy@google.comb9ddd4e2012-07-10 14:14:50 +0000149
bungeman@google.come8cc6e82013-01-17 16:30:56 +0000150 void setUserMatrix(SkMatrix matrix) {
151 fUserMatrix = matrix;
robertphillips70171682014-10-16 14:28:28 -0700152 fDrawNeedsReset = true;
chudy@google.com830b8792012-08-01 15:57:52 +0000153 }
154
commit-bot@chromium.org2a67e122014-05-19 13:53:10 +0000155 SkString clipStackData() const { return fClipStackData; }
156
chudy@google.com902ebe52012-06-29 14:21:22 +0000157////////////////////////////////////////////////////////////////////////////////
158// Inherited from SkCanvas
159////////////////////////////////////////////////////////////////////////////////
160
161 virtual void clear(SkColor) SK_OVERRIDE;
162
chudy@google.com902ebe52012-06-29 14:21:22 +0000163 virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top,
164 const SkPaint*) SK_OVERRIDE;
165
reed@google.com71121732012-09-18 15:14:33 +0000166 virtual void drawBitmapRectToRect(const SkBitmap&, const SkRect* src,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000167 const SkRect& dst, const SkPaint* paint,
168 DrawBitmapRectFlags flags) SK_OVERRIDE;
chudy@google.com902ebe52012-06-29 14:21:22 +0000169
170 virtual void drawBitmapMatrix(const SkBitmap&, const SkMatrix&,
171 const SkPaint*) SK_OVERRIDE;
172
173 virtual void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
174 const SkRect& dst, const SkPaint*) SK_OVERRIDE;
175
176 virtual void drawData(const void*, size_t) SK_OVERRIDE;
177
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000178 virtual void beginCommentGroup(const char* description) SK_OVERRIDE;
179
180 virtual void addComment(const char* kywd, const char* value) SK_OVERRIDE;
181
182 virtual void endCommentGroup() SK_OVERRIDE;
183
robertphillips@google.com67baba42013-01-02 20:20:31 +0000184 virtual void drawOval(const SkRect& oval, const SkPaint&) SK_OVERRIDE;
185
chudy@google.com902ebe52012-06-29 14:21:22 +0000186 virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE;
187
bsalomon@google.com7ce564c2013-10-22 16:54:15 +0000188 virtual void drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE;
189
chudy@google.com902ebe52012-06-29 14:21:22 +0000190 virtual void drawPoints(PointMode, size_t count, const SkPoint pts[],
191 const SkPaint&) SK_OVERRIDE;
192
bsalomon@google.com7ce564c2013-10-22 16:54:15 +0000193 virtual void drawRect(const SkRect& rect, const SkPaint&) SK_OVERRIDE;
194
robertphillips@google.com67baba42013-01-02 20:20:31 +0000195 virtual void drawRRect(const SkRRect& rrect, const SkPaint& paint) SK_OVERRIDE;
196
chudy@google.com902ebe52012-06-29 14:21:22 +0000197 virtual void drawSprite(const SkBitmap&, int left, int top,
198 const SkPaint*) SK_OVERRIDE;
199
chudy@google.com902ebe52012-06-29 14:21:22 +0000200 virtual void drawVertices(VertexMode, int vertexCount,
robertphillips@google.com67baba42013-01-02 20:20:31 +0000201 const SkPoint vertices[], const SkPoint texs[],
202 const SkColor colors[], SkXfermode*,
203 const uint16_t indices[], int indexCount,
chudy@google.com902ebe52012-06-29 14:21:22 +0000204 const SkPaint&) SK_OVERRIDE;
205
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000206 static const int kVizImageHeight = 256;
207 static const int kVizImageWidth = 256;
208
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000209 virtual bool isClipEmpty() const SK_OVERRIDE { return false; }
commit-bot@chromium.org5c70cdc2014-03-08 03:57:19 +0000210 virtual bool isClipRect() const SK_OVERRIDE { return true; }
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000211 virtual bool getClipBounds(SkRect* bounds) const SK_OVERRIDE {
bsalomon49f085d2014-09-05 13:34:00 -0700212 if (bounds) {
skia.committer@gmail.com370a8992014-03-01 03:02:09 +0000213 bounds->setXYWH(0, 0,
reede5ea5002014-09-03 11:54:58 -0700214 SkIntToScalar(this->imageInfo().width()),
215 SkIntToScalar(this->imageInfo().height()));
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000216 }
217 return true;
218 }
219 virtual bool getClipDeviceBounds(SkIRect* bounds) const SK_OVERRIDE {
bsalomon49f085d2014-09-05 13:34:00 -0700220 if (bounds) {
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000221 bounds->setLargest();
222 }
223 return true;
224 }
225
commit-bot@chromium.orgab582732014-02-21 12:20:45 +0000226protected:
Florin Malita5f6102d2014-06-30 10:13:28 -0400227 virtual void willSave() SK_OVERRIDE;
commit-bot@chromium.orge54a23f2014-03-12 20:21:48 +0000228 virtual SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SaveFlags) SK_OVERRIDE;
229 virtual void willRestore() SK_OVERRIDE;
230
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +0000231 virtual void didConcat(const SkMatrix&) SK_OVERRIDE;
232 virtual void didSetMatrix(const SkMatrix&) SK_OVERRIDE;
233
commit-bot@chromium.orgab582732014-02-21 12:20:45 +0000234 virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) SK_OVERRIDE;
reed@google.come0d9ce82014-04-23 04:00:17 +0000235 virtual void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
236 const SkPaint&) SK_OVERRIDE;
237 virtual void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
238 const SkPaint&) SK_OVERRIDE;
239 virtual void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
240 SkScalar constY, const SkPaint&) SK_OVERRIDE;
241 virtual void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
242 const SkMatrix* matrix, const SkPaint&) SK_OVERRIDE;
fmalitab7425172014-08-26 07:56:44 -0700243 virtual void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
244 const SkPaint& paint) SK_OVERRIDE;
commit-bot@chromium.org210ae2a2014-02-27 17:40:13 +0000245 virtual void onPushCull(const SkRect& cullRect) SK_OVERRIDE;
246 virtual void onPopCull() SK_OVERRIDE;
commit-bot@chromium.orgab582732014-02-21 12:20:45 +0000247
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000248 virtual void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
249 virtual void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
250 virtual void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
251 virtual void onClipRegion(const SkRegion& region, SkRegion::Op) SK_OVERRIDE;
252
reedd5fa1a42014-08-09 11:08:05 -0700253 virtual void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) SK_OVERRIDE;
robertphillips9b14f262014-06-04 05:40:44 -0700254
commit-bot@chromium.org1643b2c2014-03-03 23:25:41 +0000255 void markActiveCommands(int index);
commit-bot@chromium.org768ac852014-03-03 16:32:17 +0000256
chudy@google.com902ebe52012-06-29 14:21:22 +0000257private:
robertphillips@google.com67baba42013-01-02 20:20:31 +0000258 SkTDArray<SkDrawCommand*> fCommandVector;
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000259 SkPicture* fPicture;
robertphillipsa8d7f0b2014-08-29 08:03:56 -0700260 SkISize fWindowSize;
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000261 bool fFilter;
commit-bot@chromium.org768ac852014-03-03 16:32:17 +0000262 bool fMegaVizMode;
chudy@google.com830b8792012-08-01 15:57:52 +0000263 int fIndex;
bungeman@google.come8cc6e82013-01-17 16:30:56 +0000264 SkMatrix fUserMatrix;
robertphillips70171682014-10-16 14:28:28 -0700265 bool fDrawNeedsReset; // fUserMatrix has changed so the incremental draw won't work
chudy@google.coma9e937c2012-08-03 17:32:05 +0000266 SkMatrix fMatrix;
267 SkIRect fClip;
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000268
commit-bot@chromium.org2a67e122014-05-19 13:53:10 +0000269 SkString fClipStackData;
270 bool fCalledAddStackData;
271 SkPath fSaveDevPath;
272
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000273 bool fOverdrawViz;
274 SkDrawFilter* fOverdrawFilter;
chudy@google.com902ebe52012-06-29 14:21:22 +0000275
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000276 bool fOverrideTexFiltering;
277 SkTexOverrideFilter* fTexOverrideFilter;
278
chudy@google.com902ebe52012-06-29 14:21:22 +0000279 /**
tomhudson@google.com0699e022012-11-27 16:09:42 +0000280 Number of unmatched save() calls at any point during a draw.
281 If there are any saveLayer() calls outstanding, we need to resolve
282 all of them, which in practice means resolving all save() calls,
283 to avoid corruption of our canvas.
284 */
285 int fOutstandingSaveCount;
286
skia.committer@gmail.comade9a342014-03-04 03:02:32 +0000287 /**
commit-bot@chromium.org1643b2c2014-03-03 23:25:41 +0000288 The active saveLayer commands at a given point in the renderering.
289 Only used when "mega" visualization is enabled.
290 */
291 SkTDArray<SkDrawCommand*> fActiveLayers;
292
skia.committer@gmail.comade9a342014-03-04 03:02:32 +0000293 /**
commit-bot@chromium.org1643b2c2014-03-03 23:25:41 +0000294 The active cull commands at a given point in the rendering.
295 Only used when "mega" visualization is enabled.
296 */
297 SkTDArray<SkDrawCommand*> fActiveCulls;
298
tomhudson@google.com0699e022012-11-27 16:09:42 +0000299 /**
chudy@google.com902ebe52012-06-29 14:21:22 +0000300 Adds the command to the classes vector of commands.
301 @param command The draw command for execution
302 */
303 void addDrawCommand(SkDrawCommand* command);
chudy@google.com830b8792012-08-01 15:57:52 +0000304
305 /**
306 Applies any panning and zooming the user has specified before
307 drawing anything else into the canvas.
308 */
309 void applyUserTransform(SkCanvas* canvas);
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000310
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000311 size_t getOpID() const {
robertphillipsce4dd3d2014-07-07 13:46:35 -0700312#if 0
bsalomon49f085d2014-09-05 13:34:00 -0700313 if (fPicture) {
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000314 return fPicture->EXPERIMENTAL_curOpID();
315 }
robertphillipsce4dd3d2014-07-07 13:46:35 -0700316#endif
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000317 return 0;
318 }
319
commit-bot@chromium.org2a67e122014-05-19 13:53:10 +0000320 void resetClipStackData() { fClipStackData.reset(); fCalledAddStackData = false; }
321
322 void addClipStackData(const SkPath& devPath, const SkPath& operand, SkRegion::Op elementOp);
323 void addPathData(const SkPath& path, const char* pathName);
324 bool lastClipStackData(const SkPath& devPath);
325 void outputConicPoints(const SkPoint* pts, SkScalar weight);
326 void outputPoints(const SkPoint* pts, int count);
327 void outputPointsCommon(const SkPoint* pts, int count);
328 void outputScalar(SkScalar num);
skia.committer@gmail.com3b9e8be2014-05-20 03:05:34 +0000329
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000330 typedef SkCanvas INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000331};
332
333#endif