blob: 94ad4263e59c2a5bc89e0dda9363531dbe9a81d2 [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; }
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000213 virtual bool getClipBounds(SkRect* bounds) const SK_OVERRIDE {
214 if (NULL != bounds) {
skia.committer@gmail.com370a8992014-03-01 03:02:09 +0000215 bounds->setXYWH(0, 0,
216 SkIntToScalar(this->imageInfo().fWidth),
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000217 SkIntToScalar(this->imageInfo().fHeight));
218 }
219 return true;
220 }
221 virtual bool getClipDeviceBounds(SkIRect* bounds) const SK_OVERRIDE {
222 if (NULL != bounds) {
223 bounds->setLargest();
224 }
225 return true;
226 }
227
commit-bot@chromium.orgab582732014-02-21 12:20:45 +0000228protected:
Florin Malita5f6102d2014-06-30 10:13:28 -0400229 virtual void willSave() SK_OVERRIDE;
commit-bot@chromium.orge54a23f2014-03-12 20:21:48 +0000230 virtual SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SaveFlags) SK_OVERRIDE;
231 virtual void willRestore() SK_OVERRIDE;
232
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +0000233 virtual void didConcat(const SkMatrix&) SK_OVERRIDE;
234 virtual void didSetMatrix(const SkMatrix&) SK_OVERRIDE;
235
commit-bot@chromium.orgab582732014-02-21 12:20:45 +0000236 virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) SK_OVERRIDE;
reed@google.come0d9ce82014-04-23 04:00:17 +0000237 virtual void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
238 const SkPaint&) SK_OVERRIDE;
239 virtual void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
240 const SkPaint&) SK_OVERRIDE;
241 virtual void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
242 SkScalar constY, const SkPaint&) SK_OVERRIDE;
243 virtual void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
244 const SkMatrix* matrix, const SkPaint&) SK_OVERRIDE;
fmalitab7425172014-08-26 07:56:44 -0700245 virtual void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
246 const SkPaint& paint) SK_OVERRIDE;
commit-bot@chromium.org210ae2a2014-02-27 17:40:13 +0000247 virtual void onPushCull(const SkRect& cullRect) SK_OVERRIDE;
248 virtual void onPopCull() SK_OVERRIDE;
commit-bot@chromium.orgab582732014-02-21 12:20:45 +0000249
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000250 virtual void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
251 virtual void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
252 virtual void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
253 virtual void onClipRegion(const SkRegion& region, SkRegion::Op) SK_OVERRIDE;
254
reedd5fa1a42014-08-09 11:08:05 -0700255 virtual void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) SK_OVERRIDE;
robertphillips9b14f262014-06-04 05:40:44 -0700256
commit-bot@chromium.org1643b2c2014-03-03 23:25:41 +0000257 void markActiveCommands(int index);
commit-bot@chromium.org768ac852014-03-03 16:32:17 +0000258
chudy@google.com902ebe52012-06-29 14:21:22 +0000259private:
robertphillips@google.com67baba42013-01-02 20:20:31 +0000260 SkTDArray<SkDrawCommand*> fCommandVector;
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000261 SkPicture* fPicture;
chudy@google.comb9ddd4e2012-07-10 14:14:50 +0000262 int fWidth;
commit-bot@chromium.org1735d662013-12-04 13:42:46 +0000263 int fHeight;
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000264 bool fFilter;
commit-bot@chromium.org768ac852014-03-03 16:32:17 +0000265 bool fMegaVizMode;
chudy@google.com830b8792012-08-01 15:57:52 +0000266 int fIndex;
bungeman@google.come8cc6e82013-01-17 16:30:56 +0000267 SkMatrix fUserMatrix;
chudy@google.coma9e937c2012-08-03 17:32:05 +0000268 SkMatrix fMatrix;
269 SkIRect fClip;
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000270
commit-bot@chromium.org2a67e122014-05-19 13:53:10 +0000271 SkString fClipStackData;
272 bool fCalledAddStackData;
273 SkPath fSaveDevPath;
274
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000275 bool fOverdrawViz;
276 SkDrawFilter* fOverdrawFilter;
chudy@google.com902ebe52012-06-29 14:21:22 +0000277
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000278 bool fOverrideTexFiltering;
279 SkTexOverrideFilter* fTexOverrideFilter;
280
chudy@google.com902ebe52012-06-29 14:21:22 +0000281 /**
tomhudson@google.com0699e022012-11-27 16:09:42 +0000282 Number of unmatched save() calls at any point during a draw.
283 If there are any saveLayer() calls outstanding, we need to resolve
284 all of them, which in practice means resolving all save() calls,
285 to avoid corruption of our canvas.
286 */
287 int fOutstandingSaveCount;
288
skia.committer@gmail.comade9a342014-03-04 03:02:32 +0000289 /**
commit-bot@chromium.org1643b2c2014-03-03 23:25:41 +0000290 The active saveLayer commands at a given point in the renderering.
291 Only used when "mega" visualization is enabled.
292 */
293 SkTDArray<SkDrawCommand*> fActiveLayers;
294
skia.committer@gmail.comade9a342014-03-04 03:02:32 +0000295 /**
commit-bot@chromium.org1643b2c2014-03-03 23:25:41 +0000296 The active cull commands at a given point in the rendering.
297 Only used when "mega" visualization is enabled.
298 */
299 SkTDArray<SkDrawCommand*> fActiveCulls;
300
tomhudson@google.com0699e022012-11-27 16:09:42 +0000301 /**
chudy@google.com902ebe52012-06-29 14:21:22 +0000302 Adds the command to the classes vector of commands.
303 @param command The draw command for execution
304 */
305 void addDrawCommand(SkDrawCommand* command);
chudy@google.com830b8792012-08-01 15:57:52 +0000306
307 /**
308 Applies any panning and zooming the user has specified before
309 drawing anything else into the canvas.
310 */
311 void applyUserTransform(SkCanvas* canvas);
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000312
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000313 size_t getOpID() const {
robertphillipsce4dd3d2014-07-07 13:46:35 -0700314#if 0
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000315 if (NULL != fPicture) {
316 return fPicture->EXPERIMENTAL_curOpID();
317 }
robertphillipsce4dd3d2014-07-07 13:46:35 -0700318#endif
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000319 return 0;
320 }
321
commit-bot@chromium.org2a67e122014-05-19 13:53:10 +0000322 void resetClipStackData() { fClipStackData.reset(); fCalledAddStackData = false; }
323
324 void addClipStackData(const SkPath& devPath, const SkPath& operand, SkRegion::Op elementOp);
325 void addPathData(const SkPath& path, const char* pathName);
326 bool lastClipStackData(const SkPath& devPath);
327 void outputConicPoints(const SkPoint* pts, SkScalar weight);
328 void outputPoints(const SkPoint* pts, int count);
329 void outputPointsCommon(const SkPoint* pts, int count);
330 void outputScalar(SkScalar num);
skia.committer@gmail.com3b9e8be2014-05-20 03:05:34 +0000331
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000332 typedef SkCanvas INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000333};
334
335#endif