blob: 066d7a601ab662765d201759ecd47d2c8b14cee3 [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
robertphillips@google.comf4741c12013-02-06 20:13:54 +000010#include "SkColorPriv.h"
chudy@google.com902ebe52012-06-29 14:21:22 +000011#include "SkDebugCanvas.h"
12#include "SkDrawCommand.h"
robertphillips@google.comf4741c12013-02-06 20:13:54 +000013#include "SkDrawFilter.h"
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +000014#include "SkDevice.h"
robertphillips@google.comf4741c12013-02-06 20:13:54 +000015#include "SkXfermode.h"
chudy@google.com902ebe52012-06-29 14:21:22 +000016
reed@google.com6ae24e02012-09-26 13:44:13 +000017SkDebugCanvas::SkDebugCanvas(int width, int height)
commit-bot@chromium.orge2543102014-01-31 19:42:58 +000018 : INHERITED(width, height)
commit-bot@chromium.org1735d662013-12-04 13:42:46 +000019 , fWidth(width)
20 , fHeight(height)
21 , fFilter(false)
commit-bot@chromium.org768ac852014-03-03 16:32:17 +000022 , fMegaVizMode(false)
commit-bot@chromium.org1735d662013-12-04 13:42:46 +000023 , fIndex(0)
robertphillips@google.comf4741c12013-02-06 20:13:54 +000024 , fOverdrawViz(false)
scroggo@google.com06d6ac62013-02-08 21:16:19 +000025 , fOverdrawFilter(NULL)
robertphillips@google.com32bbcf82013-10-17 17:56:10 +000026 , fOverrideTexFiltering(false)
27 , fTexOverrideFilter(NULL)
scroggo@google.com06d6ac62013-02-08 21:16:19 +000028 , fOutstandingSaveCount(0) {
bungeman@google.come8cc6e82013-01-17 16:30:56 +000029 fUserMatrix.reset();
robertphillips@google.com8b157172013-11-07 22:20:31 +000030
31 // SkPicturePlayback uses the base-class' quickReject calls to cull clipped
32 // operations. This can lead to problems in the debugger which expects all
33 // the operations in the captured skp to appear in the debug canvas. To
34 // circumvent this we create a wide open clip here (an empty clip rect
35 // is not sufficient).
36 // Internally, the SkRect passed to clipRect is converted to an SkIRect and
37 // rounded out. The following code creates a nearly maximal rect that will
38 // not get collapsed by the coming conversions (Due to precision loss the
39 // inset has to be surprisingly large).
40 SkIRect largeIRect = SkIRect::MakeLargest();
41 largeIRect.inset(1024, 1024);
robertphillips@google.com6c1e49a2013-11-10 15:08:45 +000042 SkRect large = SkRect::Make(largeIRect);
robertphillips@google.com8b157172013-11-07 22:20:31 +000043#ifdef SK_DEBUG
44 large.roundOut(&largeIRect);
45 SkASSERT(!largeIRect.isEmpty());
46#endif
robertphillips@google.com8f90a892014-02-28 18:19:39 +000047 // call the base class' version to avoid adding a draw command
48 this->INHERITED::onClipRect(large, SkRegion::kReplace_Op, kHard_ClipEdgeStyle);
chudy@google.com902ebe52012-06-29 14:21:22 +000049}
50
chudy@google.com9cda6f72012-08-07 15:08:33 +000051SkDebugCanvas::~SkDebugCanvas() {
robertphillips@google.com67baba42013-01-02 20:20:31 +000052 fCommandVector.deleteAll();
robertphillips@google.comf4741c12013-02-06 20:13:54 +000053 SkSafeUnref(fOverdrawFilter);
commit-bot@chromium.org1735d662013-12-04 13:42:46 +000054 SkSafeUnref(fTexOverrideFilter);
chudy@google.com9cda6f72012-08-07 15:08:33 +000055}
chudy@google.com902ebe52012-06-29 14:21:22 +000056
57void SkDebugCanvas::addDrawCommand(SkDrawCommand* command) {
robertphillips@google.com67baba42013-01-02 20:20:31 +000058 fCommandVector.push(command);
chudy@google.com902ebe52012-06-29 14:21:22 +000059}
60
61void SkDebugCanvas::draw(SkCanvas* canvas) {
commit-bot@chromium.org1735d662013-12-04 13:42:46 +000062 if (!fCommandVector.isEmpty()) {
63 drawTo(canvas, fCommandVector.count() - 1);
chudy@google.com902ebe52012-06-29 14:21:22 +000064 }
65}
66
chudy@google.com830b8792012-08-01 15:57:52 +000067void SkDebugCanvas::applyUserTransform(SkCanvas* canvas) {
bungeman@google.come8cc6e82013-01-17 16:30:56 +000068 canvas->concat(fUserMatrix);
chudy@google.com830b8792012-08-01 15:57:52 +000069}
70
71int SkDebugCanvas::getCommandAtPoint(int x, int y, int index) {
chudy@google.com0b5bbb02012-07-31 19:55:32 +000072 SkBitmap bitmap;
reed@google.com9ebcac52014-01-24 18:53:42 +000073 bitmap.allocPixels(SkImageInfo::MakeN32Premul(1, 1));
chudy@google.com902ebe52012-06-29 14:21:22 +000074
chudy@google.com0b5bbb02012-07-31 19:55:32 +000075 SkCanvas canvas(bitmap);
robertphillips@google.com94acc702012-09-06 18:43:21 +000076 canvas.translate(SkIntToScalar(-x), SkIntToScalar(-y));
chudy@google.com830b8792012-08-01 15:57:52 +000077 applyUserTransform(&canvas);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000078
79 int layer = 0;
chudy@google.com751961d2012-07-31 20:07:42 +000080 SkColor prev = bitmap.getColor(0,0);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000081 for (int i = 0; i < index; i++) {
robertphillips@google.com67baba42013-01-02 20:20:31 +000082 if (fCommandVector[i]->isVisible()) {
83 fCommandVector[i]->execute(&canvas);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000084 }
85 if (prev != bitmap.getColor(0,0)) {
86 layer = i;
87 }
88 prev = bitmap.getColor(0,0);
89 }
90 return layer;
91}
92
bsalomon@google.com383e2342013-02-06 21:44:21 +000093static SkPMColor OverdrawXferModeProc(SkPMColor src, SkPMColor dst) {
robertphillips@google.comf4741c12013-02-06 20:13:54 +000094 // This table encodes the color progression of the overdraw visualization
95 static const SkPMColor gTable[] = {
96 SkPackARGB32(0x00, 0x00, 0x00, 0x00),
97 SkPackARGB32(0xFF, 128, 158, 255),
98 SkPackARGB32(0xFF, 170, 185, 212),
99 SkPackARGB32(0xFF, 213, 195, 170),
100 SkPackARGB32(0xFF, 255, 192, 127),
101 SkPackARGB32(0xFF, 255, 185, 85),
102 SkPackARGB32(0xFF, 255, 165, 42),
103 SkPackARGB32(0xFF, 255, 135, 0),
104 SkPackARGB32(0xFF, 255, 95, 0),
105 SkPackARGB32(0xFF, 255, 50, 0),
106 SkPackARGB32(0xFF, 255, 0, 0)
107 };
108
robertphillips@google.com0b256e12013-02-06 20:42:14 +0000109 for (size_t i = 0; i < SK_ARRAY_COUNT(gTable)-1; ++i) {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000110 if (gTable[i] == dst) {
111 return gTable[i+1];
112 }
113 }
114
115 return gTable[SK_ARRAY_COUNT(gTable)-1];
116}
117
118// The OverdrawFilter modifies every paint to use an SkProcXfermode which
119// in turn invokes OverdrawXferModeProc
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000120class SkOverdrawFilter : public SkDrawFilter {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000121public:
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000122 SkOverdrawFilter() {
commit-bot@chromium.org0a2bf902014-02-20 20:40:19 +0000123 fXferMode = SkProcXfermode::Create(OverdrawXferModeProc);
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000124 }
125
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000126 virtual ~SkOverdrawFilter() {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000127 delete fXferMode;
128 }
129
130 virtual bool filter(SkPaint* p, Type) SK_OVERRIDE {
131 p->setXfermode(fXferMode);
132 return true;
133 }
134
135protected:
136 SkXfermode* fXferMode;
137
138private:
139 typedef SkDrawFilter INHERITED;
140};
141
skia.committer@gmail.comf84ad8f2013-10-18 07:01:59 +0000142// SkTexOverrideFilter modifies every paint to use the specified
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000143// texture filtering mode
144class SkTexOverrideFilter : public SkDrawFilter {
145public:
146 SkTexOverrideFilter() : fFilterLevel(SkPaint::kNone_FilterLevel) {
147 }
148
149 void setFilterLevel(SkPaint::FilterLevel filterLevel) {
150 fFilterLevel = filterLevel;
151 }
152
153 virtual bool filter(SkPaint* p, Type) SK_OVERRIDE {
154 p->setFilterLevel(fFilterLevel);
155 return true;
156 }
157
158protected:
159 SkPaint::FilterLevel fFilterLevel;
160
161private:
162 typedef SkDrawFilter INHERITED;
163};
164
commit-bot@chromium.org768ac852014-03-03 16:32:17 +0000165class SkDebugClipVisitor : public SkCanvas::ClipVisitor {
166public:
167 SkDebugClipVisitor(SkCanvas* canvas) : fCanvas(canvas) {}
168
169 virtual void clipRect(const SkRect& r, SkRegion::Op, bool doAA) SK_OVERRIDE {
170 SkPaint p;
171 p.setColor(SK_ColorRED);
172 p.setStyle(SkPaint::kStroke_Style);
173 p.setAntiAlias(doAA);
174 fCanvas->drawRect(r, p);
175 }
176 virtual void clipRRect(const SkRRect& rr, SkRegion::Op, bool doAA) SK_OVERRIDE {
177 SkPaint p;
178 p.setColor(SK_ColorGREEN);
179 p.setStyle(SkPaint::kStroke_Style);
180 p.setAntiAlias(doAA);
181 fCanvas->drawRRect(rr, p);
182 }
183 virtual void clipPath(const SkPath& path, SkRegion::Op, bool doAA) SK_OVERRIDE {
184 SkPaint p;
185 p.setColor(SK_ColorBLUE);
186 p.setStyle(SkPaint::kStroke_Style);
187 p.setAntiAlias(doAA);
188 fCanvas->drawPath(path, p);
189 }
190
191protected:
192 SkCanvas* fCanvas;
193
194private:
195 typedef SkCanvas::ClipVisitor INHERITED;
196};
197
198// set up the saveLayer commands so that the active ones
199// return true in their 'active' method
commit-bot@chromium.org1643b2c2014-03-03 23:25:41 +0000200void SkDebugCanvas::markActiveCommands(int index) {
201 fActiveLayers.rewind();
202 fActiveCulls.rewind();
commit-bot@chromium.org768ac852014-03-03 16:32:17 +0000203
204 for (int i = 0; i < fCommandVector.count(); ++i) {
205 fCommandVector[i]->setActive(false);
206 }
207
208 for (int i = 0; i < index; ++i) {
209 SkDrawCommand::Action result = fCommandVector[i]->action();
commit-bot@chromium.org1643b2c2014-03-03 23:25:41 +0000210 if (SkDrawCommand::kPushLayer_Action == result) {
211 fActiveLayers.push(fCommandVector[i]);
212 } else if (SkDrawCommand::kPopLayer_Action == result) {
213 fActiveLayers.pop();
214 } else if (SkDrawCommand::kPushCull_Action == result) {
215 fActiveCulls.push(fCommandVector[i]);
216 } else if (SkDrawCommand::kPopCull_Action == result) {
217 fActiveCulls.pop();
commit-bot@chromium.org768ac852014-03-03 16:32:17 +0000218 }
219 }
220
commit-bot@chromium.org1643b2c2014-03-03 23:25:41 +0000221 for (int i = 0; i < fActiveLayers.count(); ++i) {
222 fActiveLayers[i]->setActive(true);
223 }
224
225 for (int i = 0; i < fActiveCulls.count(); ++i) {
226 fActiveCulls[i]->setActive(true);
commit-bot@chromium.org768ac852014-03-03 16:32:17 +0000227 }
228}
229
chudy@google.com0b5bbb02012-07-31 19:55:32 +0000230void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000231 SkASSERT(!fCommandVector.isEmpty());
232 SkASSERT(index < fCommandVector.count());
commit-bot@chromium.org1735d662013-12-04 13:42:46 +0000233 int i = 0;
chudy@google.com830b8792012-08-01 15:57:52 +0000234
235 // This only works assuming the canvas and device are the same ones that
236 // were previously drawn into because they need to preserve all saves
237 // and restores.
commit-bot@chromium.org1735d662013-12-04 13:42:46 +0000238 // The visibility filter also requires a full re-draw - otherwise we can
239 // end up drawing the filter repeatedly.
commit-bot@chromium.org768ac852014-03-03 16:32:17 +0000240 if (fIndex < index && !fFilter && !fMegaVizMode) {
chudy@google.com830b8792012-08-01 15:57:52 +0000241 i = fIndex + 1;
242 } else {
tomhudson@google.com0699e022012-11-27 16:09:42 +0000243 for (int j = 0; j < fOutstandingSaveCount; j++) {
244 canvas->restore();
245 }
junov@google.comdbfac8a2012-12-06 21:47:40 +0000246 canvas->clear(SK_ColorTRANSPARENT);
chudy@google.com830b8792012-08-01 15:57:52 +0000247 canvas->resetMatrix();
skia.committer@gmail.com04ba4482012-09-07 02:01:30 +0000248 SkRect rect = SkRect::MakeWH(SkIntToScalar(fWidth),
robertphillips@google.com94acc702012-09-06 18:43:21 +0000249 SkIntToScalar(fHeight));
chudy@google.com4c7962e2012-08-14 19:38:31 +0000250 canvas->clipRect(rect, SkRegion::kReplace_Op );
chudy@google.com830b8792012-08-01 15:57:52 +0000251 applyUserTransform(canvas);
tomhudson@google.com0699e022012-11-27 16:09:42 +0000252 fOutstandingSaveCount = 0;
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000253 }
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000254
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000255 // The setting of the draw filter has to go here (rather than in
256 // SkRasterWidget) due to the canvas restores this class performs.
257 // Since the draw filter is stored in the layer stack if we
258 // call setDrawFilter on anything but the root layer odd things happen.
259 if (fOverdrawViz) {
260 if (NULL == fOverdrawFilter) {
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000261 fOverdrawFilter = new SkOverdrawFilter;
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000262 }
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000263
264 if (fOverdrawFilter != canvas->getDrawFilter()) {
265 canvas->setDrawFilter(fOverdrawFilter);
266 }
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000267 } else if (fOverrideTexFiltering) {
268 if (NULL == fTexOverrideFilter) {
269 fTexOverrideFilter = new SkTexOverrideFilter;
270 }
271
272 if (fTexOverrideFilter != canvas->getDrawFilter()) {
273 canvas->setDrawFilter(fTexOverrideFilter);
274 }
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000275 } else {
276 canvas->setDrawFilter(NULL);
chudy@google.com830b8792012-08-01 15:57:52 +0000277 }
278
commit-bot@chromium.org768ac852014-03-03 16:32:17 +0000279 if (fMegaVizMode) {
commit-bot@chromium.org1643b2c2014-03-03 23:25:41 +0000280 this->markActiveCommands(index);
commit-bot@chromium.org768ac852014-03-03 16:32:17 +0000281 }
282
chudy@google.com830b8792012-08-01 15:57:52 +0000283 for (; i <= index; i++) {
chudy@google.com0b5bbb02012-07-31 19:55:32 +0000284 if (i == index && fFilter) {
285 SkPaint p;
286 p.setColor(0xAAFFFFFF);
287 canvas->save();
288 canvas->resetMatrix();
289 SkRect mask;
290 mask.set(SkIntToScalar(0), SkIntToScalar(0),
291 SkIntToScalar(fWidth), SkIntToScalar(fHeight));
292 canvas->clipRect(mask, SkRegion::kReplace_Op, false);
293 canvas->drawRectCoords(SkIntToScalar(0), SkIntToScalar(0),
294 SkIntToScalar(fWidth), SkIntToScalar(fHeight), p);
295 canvas->restore();
296 }
297
robertphillips@google.com67baba42013-01-02 20:20:31 +0000298 if (fCommandVector[i]->isVisible()) {
commit-bot@chromium.org768ac852014-03-03 16:32:17 +0000299 if (fMegaVizMode && fCommandVector[i]->active()) {
commit-bot@chromium.org1643b2c2014-03-03 23:25:41 +0000300 // "active" commands execute their visualization behaviors:
301 // All active saveLayers get replaced with saves so all draws go to the
302 // visible canvas.
303 // All active culls draw their cull box
304 fCommandVector[i]->vizExecute(canvas);
commit-bot@chromium.org768ac852014-03-03 16:32:17 +0000305 } else {
306 fCommandVector[i]->execute(canvas);
commit-bot@chromium.org768ac852014-03-03 16:32:17 +0000307 }
commit-bot@chromium.org1643b2c2014-03-03 23:25:41 +0000308
309 fCommandVector[i]->trackSaveState(&fOutstandingSaveCount);
chudy@google.com902ebe52012-06-29 14:21:22 +0000310 }
311 }
commit-bot@chromium.org768ac852014-03-03 16:32:17 +0000312
313 if (fMegaVizMode) {
314 SkRect r = SkRect::MakeWH(SkIntToScalar(fWidth), SkIntToScalar(fHeight));
315 r.outset(SK_Scalar1, SK_Scalar1);
316
317 canvas->save();
318 // nuke the CTM
319 canvas->setMatrix(SkMatrix::I());
320 // turn off clipping
321 canvas->clipRect(r, SkRegion::kReplace_Op);
322
323 // visualize existing clips
324 SkDebugClipVisitor visitor(canvas);
325
326 canvas->replayClips(&visitor);
327
328 canvas->restore();
329 }
chudy@google.coma9e937c2012-08-03 17:32:05 +0000330 fMatrix = canvas->getTotalMatrix();
331 fClip = canvas->getTotalClip().getBounds();
chudy@google.com830b8792012-08-01 15:57:52 +0000332 fIndex = index;
chudy@google.com902ebe52012-06-29 14:21:22 +0000333}
334
robertphillips@google.com50c84da2013-04-01 18:18:49 +0000335void SkDebugCanvas::deleteDrawCommandAt(int index) {
336 SkASSERT(index < fCommandVector.count());
337 delete fCommandVector[index];
338 fCommandVector.remove(index);
339}
340
chudy@google.com902ebe52012-06-29 14:21:22 +0000341SkDrawCommand* SkDebugCanvas::getDrawCommandAt(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000342 SkASSERT(index < fCommandVector.count());
343 return fCommandVector[index];
chudy@google.com902ebe52012-06-29 14:21:22 +0000344}
345
robertphillips@google.com50c84da2013-04-01 18:18:49 +0000346void SkDebugCanvas::setDrawCommandAt(int index, SkDrawCommand* command) {
347 SkASSERT(index < fCommandVector.count());
348 delete fCommandVector[index];
349 fCommandVector[index] = command;
350}
351
chudy@google.com97cee972012-08-07 20:41:37 +0000352SkTDArray<SkString*>* SkDebugCanvas::getCommandInfo(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000353 SkASSERT(index < fCommandVector.count());
354 return fCommandVector[index]->Info();
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000355}
chudy@google.com902ebe52012-06-29 14:21:22 +0000356
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000357bool SkDebugCanvas::getDrawCommandVisibilityAt(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000358 SkASSERT(index < fCommandVector.count());
359 return fCommandVector[index]->isVisible();
chudy@google.com902ebe52012-06-29 14:21:22 +0000360}
361
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000362const SkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() const {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000363 return fCommandVector;
chudy@google.com902ebe52012-06-29 14:21:22 +0000364}
365
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000366SkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() {
367 return fCommandVector;
368}
369
chudy@google.com902ebe52012-06-29 14:21:22 +0000370// TODO(chudy): Free command string memory.
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000371SkTArray<SkString>* SkDebugCanvas::getDrawCommandsAsStrings() const {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000372 SkTArray<SkString>* commandString = new SkTArray<SkString>(fCommandVector.count());
373 if (!fCommandVector.isEmpty()) {
374 for (int i = 0; i < fCommandVector.count(); i ++) {
375 commandString->push_back() = fCommandVector[i]->toString();
chudy@google.com902ebe52012-06-29 14:21:22 +0000376 }
377 }
378 return commandString;
379}
380
skia.committer@gmail.comf84ad8f2013-10-18 07:01:59 +0000381void SkDebugCanvas::overrideTexFiltering(bool overrideTexFiltering, SkPaint::FilterLevel level) {
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000382 if (NULL == fTexOverrideFilter) {
383 fTexOverrideFilter = new SkTexOverrideFilter;
384 }
385
skia.committer@gmail.comf84ad8f2013-10-18 07:01:59 +0000386 fOverrideTexFiltering = overrideTexFiltering;
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000387 fTexOverrideFilter->setFilterLevel(level);
388}
389
chudy@google.com902ebe52012-06-29 14:21:22 +0000390void SkDebugCanvas::clear(SkColor color) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000391 addDrawCommand(new SkClearCommand(color));
chudy@google.com902ebe52012-06-29 14:21:22 +0000392}
393
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000394void SkDebugCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
395 this->addDrawCommand(new SkClipPathCommand(path, op, kSoft_ClipEdgeStyle == edgeStyle));
chudy@google.com902ebe52012-06-29 14:21:22 +0000396}
397
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000398void SkDebugCanvas::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
399 this->addDrawCommand(new SkClipRectCommand(rect, op, kSoft_ClipEdgeStyle == edgeStyle));
chudy@google.com902ebe52012-06-29 14:21:22 +0000400}
401
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000402void SkDebugCanvas::onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
403 this->addDrawCommand(new SkClipRRectCommand(rrect, op, kSoft_ClipEdgeStyle == edgeStyle));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000404}
405
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000406void SkDebugCanvas::onClipRegion(const SkRegion& region, SkRegion::Op op) {
407 this->addDrawCommand(new SkClipRegionCommand(region, op));
chudy@google.com902ebe52012-06-29 14:21:22 +0000408}
409
410bool SkDebugCanvas::concat(const SkMatrix& matrix) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000411 addDrawCommand(new SkConcatCommand(matrix));
chudy@google.com902ebe52012-06-29 14:21:22 +0000412 return true;
413}
414
415void SkDebugCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar left,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000416 SkScalar top, const SkPaint* paint = NULL) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000417 addDrawCommand(new SkDrawBitmapCommand(bitmap, left, top, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000418}
419
reed@google.com71121732012-09-18 15:14:33 +0000420void SkDebugCanvas::drawBitmapRectToRect(const SkBitmap& bitmap,
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000421 const SkRect* src, const SkRect& dst,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000422 const SkPaint* paint,
423 SkCanvas::DrawBitmapRectFlags flags) {
424 addDrawCommand(new SkDrawBitmapRectCommand(bitmap, src, dst, paint, flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000425}
426
427void SkDebugCanvas::drawBitmapMatrix(const SkBitmap& bitmap,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000428 const SkMatrix& matrix, const SkPaint* paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000429 addDrawCommand(new SkDrawBitmapMatrixCommand(bitmap, matrix, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000430}
431
432void SkDebugCanvas::drawBitmapNine(const SkBitmap& bitmap,
433 const SkIRect& center, const SkRect& dst, const SkPaint* paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000434 addDrawCommand(new SkDrawBitmapNineCommand(bitmap, center, dst, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000435}
436
437void SkDebugCanvas::drawData(const void* data, size_t length) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000438 addDrawCommand(new SkDrawDataCommand(data, length));
chudy@google.com902ebe52012-06-29 14:21:22 +0000439}
440
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000441void SkDebugCanvas::beginCommentGroup(const char* description) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000442 addDrawCommand(new SkBeginCommentGroupCommand(description));
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000443}
444
445void SkDebugCanvas::addComment(const char* kywd, const char* value) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000446 addDrawCommand(new SkCommentCommand(kywd, value));
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000447}
448
449void SkDebugCanvas::endCommentGroup() {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000450 addDrawCommand(new SkEndCommentGroupCommand());
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000451}
452
robertphillips@google.com67baba42013-01-02 20:20:31 +0000453void SkDebugCanvas::drawOval(const SkRect& oval, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000454 addDrawCommand(new SkDrawOvalCommand(oval, paint));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000455}
456
chudy@google.com902ebe52012-06-29 14:21:22 +0000457void SkDebugCanvas::drawPaint(const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000458 addDrawCommand(new SkDrawPaintCommand(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000459}
460
bsalomon@google.com7ce564c2013-10-22 16:54:15 +0000461void SkDebugCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000462 addDrawCommand(new SkDrawPathCommand(path, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000463}
464
465void SkDebugCanvas::drawPicture(SkPicture& picture) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000466 addDrawCommand(new SkDrawPictureCommand(picture));
chudy@google.com902ebe52012-06-29 14:21:22 +0000467}
468
469void SkDebugCanvas::drawPoints(PointMode mode, size_t count,
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000470 const SkPoint pts[], const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000471 addDrawCommand(new SkDrawPointsCommand(mode, count, pts, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000472}
473
474void SkDebugCanvas::drawPosText(const void* text, size_t byteLength,
475 const SkPoint pos[], const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000476 addDrawCommand(new SkDrawPosTextCommand(text, byteLength, pos, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000477}
478
479void SkDebugCanvas::drawPosTextH(const void* text, size_t byteLength,
480 const SkScalar xpos[], SkScalar constY, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000481 addDrawCommand(
482 new SkDrawPosTextHCommand(text, byteLength, xpos, constY, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000483}
484
bsalomon@google.com7ce564c2013-10-22 16:54:15 +0000485void SkDebugCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000486 // NOTE(chudy): Messing up when renamed to DrawRect... Why?
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000487 addDrawCommand(new SkDrawRectCommand(rect, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000488}
489
robertphillips@google.com67baba42013-01-02 20:20:31 +0000490void SkDebugCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000491 addDrawCommand(new SkDrawRRectCommand(rrect, paint));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000492}
493
commit-bot@chromium.orgab582732014-02-21 12:20:45 +0000494void SkDebugCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner,
495 const SkPaint& paint) {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000496 this->addDrawCommand(new SkDrawDRRectCommand(outer, inner, paint));
commit-bot@chromium.orgab582732014-02-21 12:20:45 +0000497}
498
chudy@google.com902ebe52012-06-29 14:21:22 +0000499void SkDebugCanvas::drawSprite(const SkBitmap& bitmap, int left, int top,
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000500 const SkPaint* paint = NULL) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000501 addDrawCommand(new SkDrawSpriteCommand(bitmap, left, top, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000502}
503
504void SkDebugCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
505 SkScalar y, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000506 addDrawCommand(new SkDrawTextCommand(text, byteLength, x, y, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000507}
508
509void SkDebugCanvas::drawTextOnPath(const void* text, size_t byteLength,
510 const SkPath& path, const SkMatrix* matrix, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000511 addDrawCommand(
512 new SkDrawTextOnPathCommand(text, byteLength, path, matrix, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000513}
514
515void SkDebugCanvas::drawVertices(VertexMode vmode, int vertexCount,
516 const SkPoint vertices[], const SkPoint texs[], const SkColor colors[],
517 SkXfermode*, const uint16_t indices[], int indexCount,
518 const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000519 addDrawCommand(new SkDrawVerticesCommand(vmode, vertexCount, vertices,
520 texs, colors, NULL, indices, indexCount, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000521}
522
commit-bot@chromium.org210ae2a2014-02-27 17:40:13 +0000523void SkDebugCanvas::onPushCull(const SkRect& cullRect) {
524 this->addDrawCommand(new SkPushCullCommand(cullRect));
525}
526
527void SkDebugCanvas::onPopCull() {
528 this->addDrawCommand(new SkPopCullCommand());
529}
530
chudy@google.com902ebe52012-06-29 14:21:22 +0000531void SkDebugCanvas::restore() {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000532 addDrawCommand(new SkRestoreCommand());
chudy@google.com902ebe52012-06-29 14:21:22 +0000533}
534
535bool SkDebugCanvas::rotate(SkScalar degrees) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000536 addDrawCommand(new SkRotateCommand(degrees));
chudy@google.com902ebe52012-06-29 14:21:22 +0000537 return true;
538}
539
540int SkDebugCanvas::save(SaveFlags flags) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000541 addDrawCommand(new SkSaveCommand(flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000542 return true;
543}
544
545int SkDebugCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
546 SaveFlags flags) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000547 addDrawCommand(new SkSaveLayerCommand(bounds, paint, flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000548 return true;
549}
550
551bool SkDebugCanvas::scale(SkScalar sx, SkScalar sy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000552 addDrawCommand(new SkScaleCommand(sx, sy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000553 return true;
554}
555
556void SkDebugCanvas::setMatrix(const SkMatrix& matrix) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000557 addDrawCommand(new SkSetMatrixCommand(matrix));
chudy@google.com902ebe52012-06-29 14:21:22 +0000558}
559
560bool SkDebugCanvas::skew(SkScalar sx, SkScalar sy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000561 addDrawCommand(new SkSkewCommand(sx, sy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000562 return true;
563}
564
565bool SkDebugCanvas::translate(SkScalar dx, SkScalar dy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000566 addDrawCommand(new SkTranslateCommand(dx, dy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000567 return true;
568}
569
chudy@google.com902ebe52012-06-29 14:21:22 +0000570void SkDebugCanvas::toggleCommand(int index, bool toggle) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000571 SkASSERT(index < fCommandVector.count());
572 fCommandVector[index]->setVisible(toggle);
chudy@google.com902ebe52012-06-29 14:21:22 +0000573}