blob: 97eb73449c807f17fa0aa26594c937eeeaaab46e [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
commit-bot@chromium.org2a67e122014-05-19 13:53:10 +000038 bool getAllowSimplifyClip() const { return fAllowSimplifyClip; }
39
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +000040 void setPicture(SkPicture* picture) { fPicture = picture; }
robertphillips@google.comf4741c12013-02-06 20:13:54 +000041
42 /**
robertphillips@google.com32bbcf82013-10-17 17:56:10 +000043 * Enable or disable texure filtering override
44 */
skia.committer@gmail.comf84ad8f2013-10-18 07:01:59 +000045 void overrideTexFiltering(bool overrideTexFiltering, SkPaint::FilterLevel level);
robertphillips@google.com32bbcf82013-10-17 17:56:10 +000046
47 /**
chudy@google.com902ebe52012-06-29 14:21:22 +000048 Executes all draw calls to the canvas.
49 @param canvas The canvas being drawn to
50 */
51 void draw(SkCanvas* canvas);
52
53 /**
chudy@google.com902ebe52012-06-29 14:21:22 +000054 Executes the draw calls up to the specified index.
55 @param canvas The canvas being drawn to
56 @param index The index of the final command being executed
57 */
chudy@google.com0b5bbb02012-07-31 19:55:32 +000058 void drawTo(SkCanvas* canvas, int index);
59
60 /**
chudy@google.coma9e937c2012-08-03 17:32:05 +000061 Returns the most recently calculated transformation matrix
62 */
63 const SkMatrix& getCurrentMatrix() {
64 return fMatrix;
65 }
66
67 /**
68 Returns the most recently calculated clip
69 */
70 const SkIRect& getCurrentClip() {
71 return fClip;
72 }
73
74 /**
chudy@google.com0b5bbb02012-07-31 19:55:32 +000075 Returns the index of the last draw command to write to the pixel at (x,y)
76 */
chudy@google.com830b8792012-08-01 15:57:52 +000077 int getCommandAtPoint(int x, int y, int index);
chudy@google.com902ebe52012-06-29 14:21:22 +000078
79 /**
robertphillips@google.com50c84da2013-04-01 18:18:49 +000080 Removes the command at the specified index
81 @param index The index of the command to delete
82 */
83 void deleteDrawCommandAt(int index);
84
85 /**
chudy@google.com902ebe52012-06-29 14:21:22 +000086 Returns the draw command at the given index.
87 @param index The index of the command
88 */
89 SkDrawCommand* getDrawCommandAt(int index);
90
91 /**
robertphillips@google.com50c84da2013-04-01 18:18:49 +000092 Sets the draw command for a given index.
93 @param index The index to overwrite
94 @param command The new command
95 */
96 void setDrawCommandAt(int index, SkDrawCommand* command);
97
98 /**
chudy@google.com902ebe52012-06-29 14:21:22 +000099 Returns information about the command at the given index.
100 @param index The index of the command
101 */
fmalita8c89c522014-11-08 16:18:56 -0800102 const SkTDArray<SkString*>* getCommandInfo(int index) const;
chudy@google.com902ebe52012-06-29 14:21:22 +0000103
104 /**
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000105 Returns the visibility of the command at the given index.
106 @param index The index of the command
107 */
108 bool getDrawCommandVisibilityAt(int index);
109
110 /**
chudy@google.com902ebe52012-06-29 14:21:22 +0000111 Returns the vector of draw commands
112 */
reed@google.com44699382013-10-31 17:28:30 +0000113 SK_ATTR_DEPRECATED("please use getDrawCommandAt and getSize instead")
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000114 const SkTDArray<SkDrawCommand*>& getDrawCommands() const;
skia.committer@gmail.com2e71f162013-03-12 07:12:32 +0000115
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000116 /**
117 Returns the vector of draw commands. Do not use this entry
118 point - it is going away!
119 */
120 SkTDArray<SkDrawCommand*>& getDrawCommands();
chudy@google.com902ebe52012-06-29 14:21:22 +0000121
122 /**
chudy@google.comf1414322012-07-03 20:28:14 +0000123 Returns length of draw command vector.
124 */
commit-bot@chromium.org0d4fe142013-07-15 22:47:14 +0000125 int getSize() const {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000126 return fCommandVector.count();
chudy@google.comf1414322012-07-03 20:28:14 +0000127 }
128
chudy@google.com902ebe52012-06-29 14:21:22 +0000129 /**
130 Toggles the visibility / execution of the draw command at index i with
131 the value of toggle.
132 */
133 void toggleCommand(int index, bool toggle);
134
bungeman@google.come8cc6e82013-01-17 16:30:56 +0000135 void setUserMatrix(SkMatrix matrix) {
136 fUserMatrix = matrix;
chudy@google.com830b8792012-08-01 15:57:52 +0000137 }
138
commit-bot@chromium.org2a67e122014-05-19 13:53:10 +0000139 SkString clipStackData() const { return fClipStackData; }
140
chudy@google.com902ebe52012-06-29 14:21:22 +0000141////////////////////////////////////////////////////////////////////////////////
142// Inherited from SkCanvas
143////////////////////////////////////////////////////////////////////////////////
144
mtklein72c9faa2015-01-09 10:06:39 -0800145 void beginCommentGroup(const char* description) SK_OVERRIDE;
146 void addComment(const char* kywd, const char* value) SK_OVERRIDE;
147 void endCommentGroup() SK_OVERRIDE;
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000148
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000149 static const int kVizImageHeight = 256;
150 static const int kVizImageWidth = 256;
151
mtklein72c9faa2015-01-09 10:06:39 -0800152 bool isClipEmpty() const SK_OVERRIDE { return false; }
153 bool isClipRect() const SK_OVERRIDE { return true; }
154 bool getClipBounds(SkRect* bounds) const SK_OVERRIDE {
bsalomon49f085d2014-09-05 13:34:00 -0700155 if (bounds) {
skia.committer@gmail.com370a8992014-03-01 03:02:09 +0000156 bounds->setXYWH(0, 0,
reede5ea5002014-09-03 11:54:58 -0700157 SkIntToScalar(this->imageInfo().width()),
158 SkIntToScalar(this->imageInfo().height()));
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000159 }
160 return true;
161 }
mtklein72c9faa2015-01-09 10:06:39 -0800162 bool getClipDeviceBounds(SkIRect* bounds) const SK_OVERRIDE {
bsalomon49f085d2014-09-05 13:34:00 -0700163 if (bounds) {
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000164 bounds->setLargest();
165 }
166 return true;
167 }
168
commit-bot@chromium.orgab582732014-02-21 12:20:45 +0000169protected:
mtklein72c9faa2015-01-09 10:06:39 -0800170 void willSave() SK_OVERRIDE;
171 SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SaveFlags) SK_OVERRIDE;
172 void willRestore() SK_OVERRIDE;
commit-bot@chromium.orge54a23f2014-03-12 20:21:48 +0000173
mtklein72c9faa2015-01-09 10:06:39 -0800174 void didConcat(const SkMatrix&) SK_OVERRIDE;
175 void didSetMatrix(const SkMatrix&) SK_OVERRIDE;
commit-bot@chromium.org44c48d02014-03-13 20:03:58 +0000176
mtklein72c9faa2015-01-09 10:06:39 -0800177 void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) SK_OVERRIDE;
robertphillipsfa3a83d2015-02-12 12:30:42 -0800178 void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
179 const SkPaint&) SK_OVERRIDE;
180 void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
181 const SkPaint&) SK_OVERRIDE;
182 void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
183 SkScalar constY, const SkPaint&) SK_OVERRIDE;
184 void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
185 const SkMatrix* matrix, const SkPaint&) SK_OVERRIDE;
186 void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
187 const SkPaint& paint) SK_OVERRIDE;
commit-bot@chromium.orgab582732014-02-21 12:20:45 +0000188
robertphillipsfa3a83d2015-02-12 12:30:42 -0800189 void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
190 const SkPoint texCoords[4], SkXfermode* xmode, const SkPaint& paint);
reed41af9662015-01-05 07:49:08 -0800191 void onDrawPaint(const SkPaint&) SK_OVERRIDE;
robertphillipsfa3a83d2015-02-12 12:30:42 -0800192
reed41af9662015-01-05 07:49:08 -0800193 void onDrawRect(const SkRect&, const SkPaint&) SK_OVERRIDE;
194 void onDrawOval(const SkRect&, const SkPaint&) SK_OVERRIDE;
195 void onDrawRRect(const SkRRect&, const SkPaint&) SK_OVERRIDE;
robertphillipsfa3a83d2015-02-12 12:30:42 -0800196 void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&) SK_OVERRIDE;
197 void onDrawVertices(VertexMode vmode, int vertexCount,
198 const SkPoint vertices[], const SkPoint texs[],
199 const SkColor colors[], SkXfermode* xmode,
200 const uint16_t indices[], int indexCount,
201 const SkPaint&) SK_OVERRIDE;
reed41af9662015-01-05 07:49:08 -0800202 void onDrawPath(const SkPath&, const SkPaint&) SK_OVERRIDE;
203 void onDrawBitmap(const SkBitmap&, SkScalar left, SkScalar top, const SkPaint*) SK_OVERRIDE;
204 void onDrawBitmapRect(const SkBitmap&, const SkRect* src, const SkRect& dst, const SkPaint*,
205 DrawBitmapRectFlags flags) SK_OVERRIDE;
206 void onDrawImage(const SkImage*, SkScalar left, SkScalar top, const SkPaint*) SK_OVERRIDE;
207 void onDrawImageRect(const SkImage*, const SkRect* src, const SkRect& dst,
208 const SkPaint*) SK_OVERRIDE;
209 void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect& dst,
210 const SkPaint*) SK_OVERRIDE;
211 void onDrawSprite(const SkBitmap&, int left, int top, const SkPaint*) SK_OVERRIDE;
mtklein72c9faa2015-01-09 10:06:39 -0800212 void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
213 void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
214 void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
215 void onClipRegion(const SkRegion& region, SkRegion::Op) SK_OVERRIDE;
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000216
mtklein72c9faa2015-01-09 10:06:39 -0800217 void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) SK_OVERRIDE;
robertphillips9b14f262014-06-04 05:40:44 -0700218
commit-bot@chromium.org1643b2c2014-03-03 23:25:41 +0000219 void markActiveCommands(int index);
commit-bot@chromium.org768ac852014-03-03 16:32:17 +0000220
chudy@google.com902ebe52012-06-29 14:21:22 +0000221private:
robertphillips@google.com67baba42013-01-02 20:20:31 +0000222 SkTDArray<SkDrawCommand*> fCommandVector;
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000223 SkPicture* fPicture;
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000224 bool fFilter;
commit-bot@chromium.org768ac852014-03-03 16:32:17 +0000225 bool fMegaVizMode;
bungeman@google.come8cc6e82013-01-17 16:30:56 +0000226 SkMatrix fUserMatrix;
chudy@google.coma9e937c2012-08-03 17:32:05 +0000227 SkMatrix fMatrix;
228 SkIRect fClip;
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000229
commit-bot@chromium.org2a67e122014-05-19 13:53:10 +0000230 SkString fClipStackData;
231 bool fCalledAddStackData;
232 SkPath fSaveDevPath;
233
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000234 bool fOverdrawViz;
235 SkDrawFilter* fOverdrawFilter;
chudy@google.com902ebe52012-06-29 14:21:22 +0000236
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000237 bool fOverrideTexFiltering;
238 SkTexOverrideFilter* fTexOverrideFilter;
239
chudy@google.com902ebe52012-06-29 14:21:22 +0000240 /**
commit-bot@chromium.org1643b2c2014-03-03 23:25:41 +0000241 The active saveLayer commands at a given point in the renderering.
242 Only used when "mega" visualization is enabled.
243 */
244 SkTDArray<SkDrawCommand*> fActiveLayers;
245
skia.committer@gmail.comade9a342014-03-04 03:02:32 +0000246 /**
chudy@google.com902ebe52012-06-29 14:21:22 +0000247 Adds the command to the classes vector of commands.
248 @param command The draw command for execution
249 */
250 void addDrawCommand(SkDrawCommand* command);
chudy@google.com830b8792012-08-01 15:57:52 +0000251
252 /**
253 Applies any panning and zooming the user has specified before
254 drawing anything else into the canvas.
255 */
256 void applyUserTransform(SkCanvas* canvas);
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000257
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000258 size_t getOpID() const {
robertphillipsce4dd3d2014-07-07 13:46:35 -0700259#if 0
bsalomon49f085d2014-09-05 13:34:00 -0700260 if (fPicture) {
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000261 return fPicture->EXPERIMENTAL_curOpID();
262 }
robertphillipsce4dd3d2014-07-07 13:46:35 -0700263#endif
commit-bot@chromium.org57f74e02014-03-25 23:31:33 +0000264 return 0;
265 }
266
commit-bot@chromium.org2a67e122014-05-19 13:53:10 +0000267 void resetClipStackData() { fClipStackData.reset(); fCalledAddStackData = false; }
268
269 void addClipStackData(const SkPath& devPath, const SkPath& operand, SkRegion::Op elementOp);
270 void addPathData(const SkPath& path, const char* pathName);
271 bool lastClipStackData(const SkPath& devPath);
272 void outputConicPoints(const SkPoint* pts, SkScalar weight);
273 void outputPoints(const SkPoint* pts, int count);
274 void outputPointsCommon(const SkPoint* pts, int count);
275 void outputScalar(SkScalar num);
skia.committer@gmail.com3b9e8be2014-05-20 03:05:34 +0000276
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000277 typedef SkCanvas INHERITED;
chudy@google.com902ebe52012-06-29 14:21:22 +0000278};
279
280#endif