blob: db2b7dc0db150311b3e730f6c9c60949e91aeb0c [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
200void SkDebugCanvas::markActiveSaveLayers(int index) {
201 SkTDArray<SkDrawCommand*> activeLayers;
202
203 for (int i = 0; i < fCommandVector.count(); ++i) {
204 fCommandVector[i]->setActive(false);
205 }
206
207 for (int i = 0; i < index; ++i) {
208 SkDrawCommand::Action result = fCommandVector[i]->action();
209 if (SkDrawCommand::kPush_Action == result) {
210 activeLayers.push(fCommandVector[i]);
211 } else if (SkDrawCommand::kPop_Action == result) {
212 activeLayers.pop();
213 }
214 }
215
216 for (int i = 0; i < activeLayers.count(); ++i) {
217 activeLayers[i]->setActive(true);
218 }
219}
220
chudy@google.com0b5bbb02012-07-31 19:55:32 +0000221void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000222 SkASSERT(!fCommandVector.isEmpty());
223 SkASSERT(index < fCommandVector.count());
commit-bot@chromium.org1735d662013-12-04 13:42:46 +0000224 int i = 0;
chudy@google.com830b8792012-08-01 15:57:52 +0000225
226 // This only works assuming the canvas and device are the same ones that
227 // were previously drawn into because they need to preserve all saves
228 // and restores.
commit-bot@chromium.org1735d662013-12-04 13:42:46 +0000229 // The visibility filter also requires a full re-draw - otherwise we can
230 // end up drawing the filter repeatedly.
commit-bot@chromium.org768ac852014-03-03 16:32:17 +0000231 if (fIndex < index && !fFilter && !fMegaVizMode) {
chudy@google.com830b8792012-08-01 15:57:52 +0000232 i = fIndex + 1;
233 } else {
tomhudson@google.com0699e022012-11-27 16:09:42 +0000234 for (int j = 0; j < fOutstandingSaveCount; j++) {
235 canvas->restore();
236 }
junov@google.comdbfac8a2012-12-06 21:47:40 +0000237 canvas->clear(SK_ColorTRANSPARENT);
chudy@google.com830b8792012-08-01 15:57:52 +0000238 canvas->resetMatrix();
skia.committer@gmail.com04ba4482012-09-07 02:01:30 +0000239 SkRect rect = SkRect::MakeWH(SkIntToScalar(fWidth),
robertphillips@google.com94acc702012-09-06 18:43:21 +0000240 SkIntToScalar(fHeight));
chudy@google.com4c7962e2012-08-14 19:38:31 +0000241 canvas->clipRect(rect, SkRegion::kReplace_Op );
chudy@google.com830b8792012-08-01 15:57:52 +0000242 applyUserTransform(canvas);
tomhudson@google.com0699e022012-11-27 16:09:42 +0000243 fOutstandingSaveCount = 0;
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000244 }
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000245
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000246 // The setting of the draw filter has to go here (rather than in
247 // SkRasterWidget) due to the canvas restores this class performs.
248 // Since the draw filter is stored in the layer stack if we
249 // call setDrawFilter on anything but the root layer odd things happen.
250 if (fOverdrawViz) {
251 if (NULL == fOverdrawFilter) {
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000252 fOverdrawFilter = new SkOverdrawFilter;
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000253 }
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000254
255 if (fOverdrawFilter != canvas->getDrawFilter()) {
256 canvas->setDrawFilter(fOverdrawFilter);
257 }
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000258 } else if (fOverrideTexFiltering) {
259 if (NULL == fTexOverrideFilter) {
260 fTexOverrideFilter = new SkTexOverrideFilter;
261 }
262
263 if (fTexOverrideFilter != canvas->getDrawFilter()) {
264 canvas->setDrawFilter(fTexOverrideFilter);
265 }
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000266 } else {
267 canvas->setDrawFilter(NULL);
chudy@google.com830b8792012-08-01 15:57:52 +0000268 }
269
commit-bot@chromium.org768ac852014-03-03 16:32:17 +0000270 if (fMegaVizMode) {
271 this->markActiveSaveLayers(index);
272 }
273
chudy@google.com830b8792012-08-01 15:57:52 +0000274 for (; i <= index; i++) {
chudy@google.com0b5bbb02012-07-31 19:55:32 +0000275 if (i == index && fFilter) {
276 SkPaint p;
277 p.setColor(0xAAFFFFFF);
278 canvas->save();
279 canvas->resetMatrix();
280 SkRect mask;
281 mask.set(SkIntToScalar(0), SkIntToScalar(0),
282 SkIntToScalar(fWidth), SkIntToScalar(fHeight));
283 canvas->clipRect(mask, SkRegion::kReplace_Op, false);
284 canvas->drawRectCoords(SkIntToScalar(0), SkIntToScalar(0),
285 SkIntToScalar(fWidth), SkIntToScalar(fHeight), p);
286 canvas->restore();
287 }
288
robertphillips@google.com67baba42013-01-02 20:20:31 +0000289 if (fCommandVector[i]->isVisible()) {
commit-bot@chromium.org768ac852014-03-03 16:32:17 +0000290 if (fMegaVizMode && fCommandVector[i]->active()) {
291 // All active saveLayers get replaced with saves so all draws go to the
292 // visible canvas
293 canvas->save();
294 ++fOutstandingSaveCount;
295 } else {
296 fCommandVector[i]->execute(canvas);
297 fCommandVector[i]->trackSaveState(&fOutstandingSaveCount);
298 }
chudy@google.com902ebe52012-06-29 14:21:22 +0000299 }
300 }
commit-bot@chromium.org768ac852014-03-03 16:32:17 +0000301
302 if (fMegaVizMode) {
303 SkRect r = SkRect::MakeWH(SkIntToScalar(fWidth), SkIntToScalar(fHeight));
304 r.outset(SK_Scalar1, SK_Scalar1);
305
306 canvas->save();
307 // nuke the CTM
308 canvas->setMatrix(SkMatrix::I());
309 // turn off clipping
310 canvas->clipRect(r, SkRegion::kReplace_Op);
311
312 // visualize existing clips
313 SkDebugClipVisitor visitor(canvas);
314
315 canvas->replayClips(&visitor);
316
317 canvas->restore();
318 }
chudy@google.coma9e937c2012-08-03 17:32:05 +0000319 fMatrix = canvas->getTotalMatrix();
320 fClip = canvas->getTotalClip().getBounds();
chudy@google.com830b8792012-08-01 15:57:52 +0000321 fIndex = index;
chudy@google.com902ebe52012-06-29 14:21:22 +0000322}
323
robertphillips@google.com50c84da2013-04-01 18:18:49 +0000324void SkDebugCanvas::deleteDrawCommandAt(int index) {
325 SkASSERT(index < fCommandVector.count());
326 delete fCommandVector[index];
327 fCommandVector.remove(index);
328}
329
chudy@google.com902ebe52012-06-29 14:21:22 +0000330SkDrawCommand* SkDebugCanvas::getDrawCommandAt(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000331 SkASSERT(index < fCommandVector.count());
332 return fCommandVector[index];
chudy@google.com902ebe52012-06-29 14:21:22 +0000333}
334
robertphillips@google.com50c84da2013-04-01 18:18:49 +0000335void SkDebugCanvas::setDrawCommandAt(int index, SkDrawCommand* command) {
336 SkASSERT(index < fCommandVector.count());
337 delete fCommandVector[index];
338 fCommandVector[index] = command;
339}
340
chudy@google.com97cee972012-08-07 20:41:37 +0000341SkTDArray<SkString*>* SkDebugCanvas::getCommandInfo(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000342 SkASSERT(index < fCommandVector.count());
343 return fCommandVector[index]->Info();
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000344}
chudy@google.com902ebe52012-06-29 14:21:22 +0000345
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000346bool SkDebugCanvas::getDrawCommandVisibilityAt(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000347 SkASSERT(index < fCommandVector.count());
348 return fCommandVector[index]->isVisible();
chudy@google.com902ebe52012-06-29 14:21:22 +0000349}
350
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000351const SkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() const {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000352 return fCommandVector;
chudy@google.com902ebe52012-06-29 14:21:22 +0000353}
354
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000355SkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() {
356 return fCommandVector;
357}
358
chudy@google.com902ebe52012-06-29 14:21:22 +0000359// TODO(chudy): Free command string memory.
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000360SkTArray<SkString>* SkDebugCanvas::getDrawCommandsAsStrings() const {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000361 SkTArray<SkString>* commandString = new SkTArray<SkString>(fCommandVector.count());
362 if (!fCommandVector.isEmpty()) {
363 for (int i = 0; i < fCommandVector.count(); i ++) {
364 commandString->push_back() = fCommandVector[i]->toString();
chudy@google.com902ebe52012-06-29 14:21:22 +0000365 }
366 }
367 return commandString;
368}
369
skia.committer@gmail.comf84ad8f2013-10-18 07:01:59 +0000370void SkDebugCanvas::overrideTexFiltering(bool overrideTexFiltering, SkPaint::FilterLevel level) {
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000371 if (NULL == fTexOverrideFilter) {
372 fTexOverrideFilter = new SkTexOverrideFilter;
373 }
374
skia.committer@gmail.comf84ad8f2013-10-18 07:01:59 +0000375 fOverrideTexFiltering = overrideTexFiltering;
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000376 fTexOverrideFilter->setFilterLevel(level);
377}
378
chudy@google.com902ebe52012-06-29 14:21:22 +0000379void SkDebugCanvas::clear(SkColor color) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000380 addDrawCommand(new SkClearCommand(color));
chudy@google.com902ebe52012-06-29 14:21:22 +0000381}
382
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000383void SkDebugCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
384 this->addDrawCommand(new SkClipPathCommand(path, op, kSoft_ClipEdgeStyle == edgeStyle));
chudy@google.com902ebe52012-06-29 14:21:22 +0000385}
386
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000387void SkDebugCanvas::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
388 this->addDrawCommand(new SkClipRectCommand(rect, op, kSoft_ClipEdgeStyle == edgeStyle));
chudy@google.com902ebe52012-06-29 14:21:22 +0000389}
390
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000391void SkDebugCanvas::onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
392 this->addDrawCommand(new SkClipRRectCommand(rrect, op, kSoft_ClipEdgeStyle == edgeStyle));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000393}
394
robertphillips@google.com8f90a892014-02-28 18:19:39 +0000395void SkDebugCanvas::onClipRegion(const SkRegion& region, SkRegion::Op op) {
396 this->addDrawCommand(new SkClipRegionCommand(region, op));
chudy@google.com902ebe52012-06-29 14:21:22 +0000397}
398
399bool SkDebugCanvas::concat(const SkMatrix& matrix) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000400 addDrawCommand(new SkConcatCommand(matrix));
chudy@google.com902ebe52012-06-29 14:21:22 +0000401 return true;
402}
403
404void SkDebugCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar left,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000405 SkScalar top, const SkPaint* paint = NULL) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000406 addDrawCommand(new SkDrawBitmapCommand(bitmap, left, top, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000407}
408
reed@google.com71121732012-09-18 15:14:33 +0000409void SkDebugCanvas::drawBitmapRectToRect(const SkBitmap& bitmap,
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000410 const SkRect* src, const SkRect& dst,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000411 const SkPaint* paint,
412 SkCanvas::DrawBitmapRectFlags flags) {
413 addDrawCommand(new SkDrawBitmapRectCommand(bitmap, src, dst, paint, flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000414}
415
416void SkDebugCanvas::drawBitmapMatrix(const SkBitmap& bitmap,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000417 const SkMatrix& matrix, const SkPaint* paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000418 addDrawCommand(new SkDrawBitmapMatrixCommand(bitmap, matrix, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000419}
420
421void SkDebugCanvas::drawBitmapNine(const SkBitmap& bitmap,
422 const SkIRect& center, const SkRect& dst, const SkPaint* paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000423 addDrawCommand(new SkDrawBitmapNineCommand(bitmap, center, dst, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000424}
425
426void SkDebugCanvas::drawData(const void* data, size_t length) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000427 addDrawCommand(new SkDrawDataCommand(data, length));
chudy@google.com902ebe52012-06-29 14:21:22 +0000428}
429
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000430void SkDebugCanvas::beginCommentGroup(const char* description) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000431 addDrawCommand(new SkBeginCommentGroupCommand(description));
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000432}
433
434void SkDebugCanvas::addComment(const char* kywd, const char* value) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000435 addDrawCommand(new SkCommentCommand(kywd, value));
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000436}
437
438void SkDebugCanvas::endCommentGroup() {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000439 addDrawCommand(new SkEndCommentGroupCommand());
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000440}
441
robertphillips@google.com67baba42013-01-02 20:20:31 +0000442void SkDebugCanvas::drawOval(const SkRect& oval, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000443 addDrawCommand(new SkDrawOvalCommand(oval, paint));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000444}
445
chudy@google.com902ebe52012-06-29 14:21:22 +0000446void SkDebugCanvas::drawPaint(const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000447 addDrawCommand(new SkDrawPaintCommand(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000448}
449
bsalomon@google.com7ce564c2013-10-22 16:54:15 +0000450void SkDebugCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000451 addDrawCommand(new SkDrawPathCommand(path, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000452}
453
454void SkDebugCanvas::drawPicture(SkPicture& picture) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000455 addDrawCommand(new SkDrawPictureCommand(picture));
chudy@google.com902ebe52012-06-29 14:21:22 +0000456}
457
458void SkDebugCanvas::drawPoints(PointMode mode, size_t count,
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000459 const SkPoint pts[], const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000460 addDrawCommand(new SkDrawPointsCommand(mode, count, pts, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000461}
462
463void SkDebugCanvas::drawPosText(const void* text, size_t byteLength,
464 const SkPoint pos[], const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000465 addDrawCommand(new SkDrawPosTextCommand(text, byteLength, pos, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000466}
467
468void SkDebugCanvas::drawPosTextH(const void* text, size_t byteLength,
469 const SkScalar xpos[], SkScalar constY, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000470 addDrawCommand(
471 new SkDrawPosTextHCommand(text, byteLength, xpos, constY, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000472}
473
bsalomon@google.com7ce564c2013-10-22 16:54:15 +0000474void SkDebugCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000475 // NOTE(chudy): Messing up when renamed to DrawRect... Why?
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000476 addDrawCommand(new SkDrawRectCommand(rect, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000477}
478
robertphillips@google.com67baba42013-01-02 20:20:31 +0000479void SkDebugCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000480 addDrawCommand(new SkDrawRRectCommand(rrect, paint));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000481}
482
commit-bot@chromium.orgab582732014-02-21 12:20:45 +0000483void SkDebugCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner,
484 const SkPaint& paint) {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000485 this->addDrawCommand(new SkDrawDRRectCommand(outer, inner, paint));
commit-bot@chromium.orgab582732014-02-21 12:20:45 +0000486}
487
chudy@google.com902ebe52012-06-29 14:21:22 +0000488void SkDebugCanvas::drawSprite(const SkBitmap& bitmap, int left, int top,
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000489 const SkPaint* paint = NULL) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000490 addDrawCommand(new SkDrawSpriteCommand(bitmap, left, top, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000491}
492
493void SkDebugCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
494 SkScalar y, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000495 addDrawCommand(new SkDrawTextCommand(text, byteLength, x, y, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000496}
497
498void SkDebugCanvas::drawTextOnPath(const void* text, size_t byteLength,
499 const SkPath& path, const SkMatrix* matrix, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000500 addDrawCommand(
501 new SkDrawTextOnPathCommand(text, byteLength, path, matrix, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000502}
503
504void SkDebugCanvas::drawVertices(VertexMode vmode, int vertexCount,
505 const SkPoint vertices[], const SkPoint texs[], const SkColor colors[],
506 SkXfermode*, const uint16_t indices[], int indexCount,
507 const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000508 addDrawCommand(new SkDrawVerticesCommand(vmode, vertexCount, vertices,
509 texs, colors, NULL, indices, indexCount, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000510}
511
commit-bot@chromium.org210ae2a2014-02-27 17:40:13 +0000512void SkDebugCanvas::onPushCull(const SkRect& cullRect) {
513 this->addDrawCommand(new SkPushCullCommand(cullRect));
514}
515
516void SkDebugCanvas::onPopCull() {
517 this->addDrawCommand(new SkPopCullCommand());
518}
519
chudy@google.com902ebe52012-06-29 14:21:22 +0000520void SkDebugCanvas::restore() {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000521 addDrawCommand(new SkRestoreCommand());
chudy@google.com902ebe52012-06-29 14:21:22 +0000522}
523
524bool SkDebugCanvas::rotate(SkScalar degrees) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000525 addDrawCommand(new SkRotateCommand(degrees));
chudy@google.com902ebe52012-06-29 14:21:22 +0000526 return true;
527}
528
529int SkDebugCanvas::save(SaveFlags flags) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000530 addDrawCommand(new SkSaveCommand(flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000531 return true;
532}
533
534int SkDebugCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
535 SaveFlags flags) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000536 addDrawCommand(new SkSaveLayerCommand(bounds, paint, flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000537 return true;
538}
539
540bool SkDebugCanvas::scale(SkScalar sx, SkScalar sy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000541 addDrawCommand(new SkScaleCommand(sx, sy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000542 return true;
543}
544
545void SkDebugCanvas::setMatrix(const SkMatrix& matrix) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000546 addDrawCommand(new SkSetMatrixCommand(matrix));
chudy@google.com902ebe52012-06-29 14:21:22 +0000547}
548
549bool SkDebugCanvas::skew(SkScalar sx, SkScalar sy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000550 addDrawCommand(new SkSkewCommand(sx, sy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000551 return true;
552}
553
554bool SkDebugCanvas::translate(SkScalar dx, SkScalar dy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000555 addDrawCommand(new SkTranslateCommand(dx, dy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000556 return true;
557}
558
chudy@google.com902ebe52012-06-29 14:21:22 +0000559void SkDebugCanvas::toggleCommand(int index, bool toggle) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000560 SkASSERT(index < fCommandVector.count());
561 fCommandVector[index]->setVisible(toggle);
chudy@google.com902ebe52012-06-29 14:21:22 +0000562}