blob: d1a9f0c9250bde9b5bc6ee94d62f91a6bd2b6c88 [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 +000017static SkBitmap make_noconfig_bm(int width, int height) {
18 SkBitmap bm;
19 bm.setConfig(SkBitmap::kNo_Config, width, height);
20 return bm;
21}
22
23SkDebugCanvas::SkDebugCanvas(int width, int height)
tomhudson@google.com0699e022012-11-27 16:09:42 +000024 : INHERITED(make_noconfig_bm(width, height))
robertphillips@google.comf4741c12013-02-06 20:13:54 +000025 , fOverdrawViz(false)
scroggo@google.com06d6ac62013-02-08 21:16:19 +000026 , fOverdrawFilter(NULL)
robertphillips@google.com32bbcf82013-10-17 17:56:10 +000027 , fOverrideTexFiltering(false)
28 , fTexOverrideFilter(NULL)
scroggo@google.com06d6ac62013-02-08 21:16:19 +000029 , fOutstandingSaveCount(0) {
chudy@google.com902ebe52012-06-29 14:21:22 +000030 // TODO(chudy): Free up memory from all draw commands in destructor.
chudy@google.com80a4a602012-07-30 18:54:07 +000031 fWidth = width;
32 fHeight = height;
reed@google.com6ae24e02012-09-26 13:44:13 +000033 // do we need fBm anywhere?
chudy@google.comb9ddd4e2012-07-10 14:14:50 +000034 fBm.setConfig(SkBitmap::kNo_Config, fWidth, fHeight);
chudy@google.com902ebe52012-06-29 14:21:22 +000035 fFilter = false;
chudy@google.com830b8792012-08-01 15:57:52 +000036 fIndex = 0;
bungeman@google.come8cc6e82013-01-17 16:30:56 +000037 fUserMatrix.reset();
robertphillips@google.com8b157172013-11-07 22:20:31 +000038
39 // SkPicturePlayback uses the base-class' quickReject calls to cull clipped
40 // operations. This can lead to problems in the debugger which expects all
41 // the operations in the captured skp to appear in the debug canvas. To
42 // circumvent this we create a wide open clip here (an empty clip rect
43 // is not sufficient).
44 // Internally, the SkRect passed to clipRect is converted to an SkIRect and
45 // rounded out. The following code creates a nearly maximal rect that will
46 // not get collapsed by the coming conversions (Due to precision loss the
47 // inset has to be surprisingly large).
48 SkIRect largeIRect = SkIRect::MakeLargest();
49 largeIRect.inset(1024, 1024);
robertphillips@google.com6c1e49a2013-11-10 15:08:45 +000050 SkRect large = SkRect::Make(largeIRect);
robertphillips@google.com8b157172013-11-07 22:20:31 +000051#ifdef SK_DEBUG
52 large.roundOut(&largeIRect);
53 SkASSERT(!largeIRect.isEmpty());
54#endif
55 INHERITED::clipRect(large, SkRegion::kReplace_Op, false);
chudy@google.com902ebe52012-06-29 14:21:22 +000056}
57
chudy@google.com9cda6f72012-08-07 15:08:33 +000058SkDebugCanvas::~SkDebugCanvas() {
robertphillips@google.com67baba42013-01-02 20:20:31 +000059 fCommandVector.deleteAll();
robertphillips@google.comf4741c12013-02-06 20:13:54 +000060 SkSafeUnref(fOverdrawFilter);
chudy@google.com9cda6f72012-08-07 15:08:33 +000061}
chudy@google.com902ebe52012-06-29 14:21:22 +000062
63void SkDebugCanvas::addDrawCommand(SkDrawCommand* command) {
robertphillips@google.com67baba42013-01-02 20:20:31 +000064 fCommandVector.push(command);
chudy@google.com902ebe52012-06-29 14:21:22 +000065}
66
67void SkDebugCanvas::draw(SkCanvas* canvas) {
robertphillips@google.com67baba42013-01-02 20:20:31 +000068 if(!fCommandVector.isEmpty()) {
69 for (int i = 0; i < fCommandVector.count(); i++) {
70 if (fCommandVector[i]->isVisible()) {
71 fCommandVector[i]->execute(canvas);
chudy@google.com0ab03392012-07-28 20:16:11 +000072 }
chudy@google.com902ebe52012-06-29 14:21:22 +000073 }
74 }
robertphillips@google.com67baba42013-01-02 20:20:31 +000075 fIndex = fCommandVector.count() - 1;
chudy@google.com902ebe52012-06-29 14:21:22 +000076}
77
chudy@google.com830b8792012-08-01 15:57:52 +000078void SkDebugCanvas::applyUserTransform(SkCanvas* canvas) {
bungeman@google.come8cc6e82013-01-17 16:30:56 +000079 canvas->concat(fUserMatrix);
chudy@google.com830b8792012-08-01 15:57:52 +000080}
81
82int SkDebugCanvas::getCommandAtPoint(int x, int y, int index) {
chudy@google.com0b5bbb02012-07-31 19:55:32 +000083 SkBitmap bitmap;
84 bitmap.setConfig(SkBitmap::kARGB_8888_Config, 1, 1);
85 bitmap.allocPixels();
chudy@google.com902ebe52012-06-29 14:21:22 +000086
chudy@google.com0b5bbb02012-07-31 19:55:32 +000087 SkCanvas canvas(bitmap);
robertphillips@google.com94acc702012-09-06 18:43:21 +000088 canvas.translate(SkIntToScalar(-x), SkIntToScalar(-y));
chudy@google.com830b8792012-08-01 15:57:52 +000089 applyUserTransform(&canvas);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000090
91 int layer = 0;
chudy@google.com751961d2012-07-31 20:07:42 +000092 SkColor prev = bitmap.getColor(0,0);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000093 for (int i = 0; i < index; i++) {
robertphillips@google.com67baba42013-01-02 20:20:31 +000094 if (fCommandVector[i]->isVisible()) {
95 fCommandVector[i]->execute(&canvas);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000096 }
97 if (prev != bitmap.getColor(0,0)) {
98 layer = i;
99 }
100 prev = bitmap.getColor(0,0);
101 }
102 return layer;
103}
104
bsalomon@google.com383e2342013-02-06 21:44:21 +0000105static SkPMColor OverdrawXferModeProc(SkPMColor src, SkPMColor dst) {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000106 // This table encodes the color progression of the overdraw visualization
107 static const SkPMColor gTable[] = {
108 SkPackARGB32(0x00, 0x00, 0x00, 0x00),
109 SkPackARGB32(0xFF, 128, 158, 255),
110 SkPackARGB32(0xFF, 170, 185, 212),
111 SkPackARGB32(0xFF, 213, 195, 170),
112 SkPackARGB32(0xFF, 255, 192, 127),
113 SkPackARGB32(0xFF, 255, 185, 85),
114 SkPackARGB32(0xFF, 255, 165, 42),
115 SkPackARGB32(0xFF, 255, 135, 0),
116 SkPackARGB32(0xFF, 255, 95, 0),
117 SkPackARGB32(0xFF, 255, 50, 0),
118 SkPackARGB32(0xFF, 255, 0, 0)
119 };
120
robertphillips@google.com0b256e12013-02-06 20:42:14 +0000121 for (size_t i = 0; i < SK_ARRAY_COUNT(gTable)-1; ++i) {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000122 if (gTable[i] == dst) {
123 return gTable[i+1];
124 }
125 }
126
127 return gTable[SK_ARRAY_COUNT(gTable)-1];
128}
129
130// The OverdrawFilter modifies every paint to use an SkProcXfermode which
131// in turn invokes OverdrawXferModeProc
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000132class SkOverdrawFilter : public SkDrawFilter {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000133public:
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000134 SkOverdrawFilter() {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000135 fXferMode = new SkProcXfermode(OverdrawXferModeProc);
136 }
137
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000138 virtual ~SkOverdrawFilter() {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000139 delete fXferMode;
140 }
141
142 virtual bool filter(SkPaint* p, Type) SK_OVERRIDE {
143 p->setXfermode(fXferMode);
144 return true;
145 }
146
147protected:
148 SkXfermode* fXferMode;
149
150private:
151 typedef SkDrawFilter INHERITED;
152};
153
skia.committer@gmail.comf84ad8f2013-10-18 07:01:59 +0000154// SkTexOverrideFilter modifies every paint to use the specified
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000155// texture filtering mode
156class SkTexOverrideFilter : public SkDrawFilter {
157public:
158 SkTexOverrideFilter() : fFilterLevel(SkPaint::kNone_FilterLevel) {
159 }
160
161 void setFilterLevel(SkPaint::FilterLevel filterLevel) {
162 fFilterLevel = filterLevel;
163 }
164
165 virtual bool filter(SkPaint* p, Type) SK_OVERRIDE {
166 p->setFilterLevel(fFilterLevel);
167 return true;
168 }
169
170protected:
171 SkPaint::FilterLevel fFilterLevel;
172
173private:
174 typedef SkDrawFilter INHERITED;
175};
176
chudy@google.com0b5bbb02012-07-31 19:55:32 +0000177void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000178 SkASSERT(!fCommandVector.isEmpty());
179 SkASSERT(index < fCommandVector.count());
chudy@google.com830b8792012-08-01 15:57:52 +0000180 int i;
181
182 // This only works assuming the canvas and device are the same ones that
183 // were previously drawn into because they need to preserve all saves
184 // and restores.
185 if (fIndex < index) {
186 i = fIndex + 1;
187 } else {
tomhudson@google.com0699e022012-11-27 16:09:42 +0000188 for (int j = 0; j < fOutstandingSaveCount; j++) {
189 canvas->restore();
190 }
chudy@google.com830b8792012-08-01 15:57:52 +0000191 i = 0;
junov@google.comdbfac8a2012-12-06 21:47:40 +0000192 canvas->clear(SK_ColorTRANSPARENT);
chudy@google.com830b8792012-08-01 15:57:52 +0000193 canvas->resetMatrix();
skia.committer@gmail.com04ba4482012-09-07 02:01:30 +0000194 SkRect rect = SkRect::MakeWH(SkIntToScalar(fWidth),
robertphillips@google.com94acc702012-09-06 18:43:21 +0000195 SkIntToScalar(fHeight));
chudy@google.com4c7962e2012-08-14 19:38:31 +0000196 canvas->clipRect(rect, SkRegion::kReplace_Op );
chudy@google.com830b8792012-08-01 15:57:52 +0000197 applyUserTransform(canvas);
tomhudson@google.com0699e022012-11-27 16:09:42 +0000198 fOutstandingSaveCount = 0;
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000199 }
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000200
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000201 // The setting of the draw filter has to go here (rather than in
202 // SkRasterWidget) due to the canvas restores this class performs.
203 // Since the draw filter is stored in the layer stack if we
204 // call setDrawFilter on anything but the root layer odd things happen.
205 if (fOverdrawViz) {
206 if (NULL == fOverdrawFilter) {
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000207 fOverdrawFilter = new SkOverdrawFilter;
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000208 }
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000209
210 if (fOverdrawFilter != canvas->getDrawFilter()) {
211 canvas->setDrawFilter(fOverdrawFilter);
212 }
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000213 } else if (fOverrideTexFiltering) {
214 if (NULL == fTexOverrideFilter) {
215 fTexOverrideFilter = new SkTexOverrideFilter;
216 }
217
218 if (fTexOverrideFilter != canvas->getDrawFilter()) {
219 canvas->setDrawFilter(fTexOverrideFilter);
220 }
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000221 } else {
222 canvas->setDrawFilter(NULL);
chudy@google.com830b8792012-08-01 15:57:52 +0000223 }
224
225 for (; i <= index; i++) {
chudy@google.com0b5bbb02012-07-31 19:55:32 +0000226 if (i == index && fFilter) {
227 SkPaint p;
228 p.setColor(0xAAFFFFFF);
229 canvas->save();
230 canvas->resetMatrix();
231 SkRect mask;
232 mask.set(SkIntToScalar(0), SkIntToScalar(0),
233 SkIntToScalar(fWidth), SkIntToScalar(fHeight));
234 canvas->clipRect(mask, SkRegion::kReplace_Op, false);
235 canvas->drawRectCoords(SkIntToScalar(0), SkIntToScalar(0),
236 SkIntToScalar(fWidth), SkIntToScalar(fHeight), p);
237 canvas->restore();
238 }
239
robertphillips@google.com67baba42013-01-02 20:20:31 +0000240 if (fCommandVector[i]->isVisible()) {
241 fCommandVector[i]->execute(canvas);
242 fCommandVector[i]->trackSaveState(&fOutstandingSaveCount);
chudy@google.com902ebe52012-06-29 14:21:22 +0000243 }
244 }
chudy@google.coma9e937c2012-08-03 17:32:05 +0000245 fMatrix = canvas->getTotalMatrix();
246 fClip = canvas->getTotalClip().getBounds();
chudy@google.com830b8792012-08-01 15:57:52 +0000247 fIndex = index;
chudy@google.com902ebe52012-06-29 14:21:22 +0000248}
249
robertphillips@google.com50c84da2013-04-01 18:18:49 +0000250void SkDebugCanvas::deleteDrawCommandAt(int index) {
251 SkASSERT(index < fCommandVector.count());
252 delete fCommandVector[index];
253 fCommandVector.remove(index);
254}
255
chudy@google.com902ebe52012-06-29 14:21:22 +0000256SkDrawCommand* SkDebugCanvas::getDrawCommandAt(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000257 SkASSERT(index < fCommandVector.count());
258 return fCommandVector[index];
chudy@google.com902ebe52012-06-29 14:21:22 +0000259}
260
robertphillips@google.com50c84da2013-04-01 18:18:49 +0000261void SkDebugCanvas::setDrawCommandAt(int index, SkDrawCommand* command) {
262 SkASSERT(index < fCommandVector.count());
263 delete fCommandVector[index];
264 fCommandVector[index] = command;
265}
266
chudy@google.com97cee972012-08-07 20:41:37 +0000267SkTDArray<SkString*>* SkDebugCanvas::getCommandInfo(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000268 SkASSERT(index < fCommandVector.count());
269 return fCommandVector[index]->Info();
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000270}
chudy@google.com902ebe52012-06-29 14:21:22 +0000271
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000272bool SkDebugCanvas::getDrawCommandVisibilityAt(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000273 SkASSERT(index < fCommandVector.count());
274 return fCommandVector[index]->isVisible();
chudy@google.com902ebe52012-06-29 14:21:22 +0000275}
276
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000277const SkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() const {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000278 return fCommandVector;
chudy@google.com902ebe52012-06-29 14:21:22 +0000279}
280
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000281SkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() {
282 return fCommandVector;
283}
284
chudy@google.com902ebe52012-06-29 14:21:22 +0000285// TODO(chudy): Free command string memory.
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000286SkTArray<SkString>* SkDebugCanvas::getDrawCommandsAsStrings() const {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000287 SkTArray<SkString>* commandString = new SkTArray<SkString>(fCommandVector.count());
288 if (!fCommandVector.isEmpty()) {
289 for (int i = 0; i < fCommandVector.count(); i ++) {
290 commandString->push_back() = fCommandVector[i]->toString();
chudy@google.com902ebe52012-06-29 14:21:22 +0000291 }
292 }
293 return commandString;
294}
295
296void SkDebugCanvas::toggleFilter(bool toggle) {
297 fFilter = toggle;
298}
299
skia.committer@gmail.comf84ad8f2013-10-18 07:01:59 +0000300void SkDebugCanvas::overrideTexFiltering(bool overrideTexFiltering, SkPaint::FilterLevel level) {
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000301 if (NULL == fTexOverrideFilter) {
302 fTexOverrideFilter = new SkTexOverrideFilter;
303 }
304
skia.committer@gmail.comf84ad8f2013-10-18 07:01:59 +0000305 fOverrideTexFiltering = overrideTexFiltering;
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000306 fTexOverrideFilter->setFilterLevel(level);
307}
308
chudy@google.com902ebe52012-06-29 14:21:22 +0000309void SkDebugCanvas::clear(SkColor color) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000310 addDrawCommand(new SkClearCommand(color));
chudy@google.com902ebe52012-06-29 14:21:22 +0000311}
312
313bool SkDebugCanvas::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000314 addDrawCommand(new SkClipPathCommand(path, op, doAA));
chudy@google.com902ebe52012-06-29 14:21:22 +0000315 return true;
316}
317
318bool SkDebugCanvas::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000319 addDrawCommand(new SkClipRectCommand(rect, op, doAA));
chudy@google.com902ebe52012-06-29 14:21:22 +0000320 return true;
321}
322
robertphillips@google.com67baba42013-01-02 20:20:31 +0000323bool SkDebugCanvas::clipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000324 addDrawCommand(new SkClipRRectCommand(rrect, op, doAA));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000325 return true;
326}
327
chudy@google.com902ebe52012-06-29 14:21:22 +0000328bool SkDebugCanvas::clipRegion(const SkRegion& region, SkRegion::Op op) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000329 addDrawCommand(new SkClipRegionCommand(region, op));
chudy@google.com902ebe52012-06-29 14:21:22 +0000330 return true;
331}
332
333bool SkDebugCanvas::concat(const SkMatrix& matrix) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000334 addDrawCommand(new SkConcatCommand(matrix));
chudy@google.com902ebe52012-06-29 14:21:22 +0000335 return true;
336}
337
338void SkDebugCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar left,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000339 SkScalar top, const SkPaint* paint = NULL) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000340 addDrawCommand(new SkDrawBitmapCommand(bitmap, left, top, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000341}
342
reed@google.com71121732012-09-18 15:14:33 +0000343void SkDebugCanvas::drawBitmapRectToRect(const SkBitmap& bitmap,
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000344 const SkRect* src, const SkRect& dst,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000345 const SkPaint* paint,
346 SkCanvas::DrawBitmapRectFlags flags) {
347 addDrawCommand(new SkDrawBitmapRectCommand(bitmap, src, dst, paint, flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000348}
349
350void SkDebugCanvas::drawBitmapMatrix(const SkBitmap& bitmap,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000351 const SkMatrix& matrix, const SkPaint* paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000352 addDrawCommand(new SkDrawBitmapMatrixCommand(bitmap, matrix, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000353}
354
355void SkDebugCanvas::drawBitmapNine(const SkBitmap& bitmap,
356 const SkIRect& center, const SkRect& dst, const SkPaint* paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000357 addDrawCommand(new SkDrawBitmapNineCommand(bitmap, center, dst, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000358}
359
360void SkDebugCanvas::drawData(const void* data, size_t length) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000361 addDrawCommand(new SkDrawDataCommand(data, length));
chudy@google.com902ebe52012-06-29 14:21:22 +0000362}
363
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000364void SkDebugCanvas::beginCommentGroup(const char* description) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000365 addDrawCommand(new SkBeginCommentGroupCommand(description));
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000366}
367
368void SkDebugCanvas::addComment(const char* kywd, const char* value) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000369 addDrawCommand(new SkCommentCommand(kywd, value));
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000370}
371
372void SkDebugCanvas::endCommentGroup() {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000373 addDrawCommand(new SkEndCommentGroupCommand());
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000374}
375
robertphillips@google.com67baba42013-01-02 20:20:31 +0000376void SkDebugCanvas::drawOval(const SkRect& oval, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000377 addDrawCommand(new SkDrawOvalCommand(oval, paint));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000378}
379
chudy@google.com902ebe52012-06-29 14:21:22 +0000380void SkDebugCanvas::drawPaint(const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000381 addDrawCommand(new SkDrawPaintCommand(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000382}
383
bsalomon@google.com7ce564c2013-10-22 16:54:15 +0000384void SkDebugCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000385 addDrawCommand(new SkDrawPathCommand(path, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000386}
387
388void SkDebugCanvas::drawPicture(SkPicture& picture) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000389 addDrawCommand(new SkDrawPictureCommand(picture));
chudy@google.com902ebe52012-06-29 14:21:22 +0000390}
391
392void SkDebugCanvas::drawPoints(PointMode mode, size_t count,
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000393 const SkPoint pts[], const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000394 addDrawCommand(new SkDrawPointsCommand(mode, count, pts, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000395}
396
397void SkDebugCanvas::drawPosText(const void* text, size_t byteLength,
398 const SkPoint pos[], const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000399 addDrawCommand(new SkDrawPosTextCommand(text, byteLength, pos, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000400}
401
402void SkDebugCanvas::drawPosTextH(const void* text, size_t byteLength,
403 const SkScalar xpos[], SkScalar constY, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000404 addDrawCommand(
405 new SkDrawPosTextHCommand(text, byteLength, xpos, constY, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000406}
407
bsalomon@google.com7ce564c2013-10-22 16:54:15 +0000408void SkDebugCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000409 // NOTE(chudy): Messing up when renamed to DrawRect... Why?
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000410 addDrawCommand(new SkDrawRectCommand(rect, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000411}
412
robertphillips@google.com67baba42013-01-02 20:20:31 +0000413void SkDebugCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000414 addDrawCommand(new SkDrawRRectCommand(rrect, paint));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000415}
416
chudy@google.com902ebe52012-06-29 14:21:22 +0000417void SkDebugCanvas::drawSprite(const SkBitmap& bitmap, int left, int top,
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000418 const SkPaint* paint = NULL) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000419 addDrawCommand(new SkDrawSpriteCommand(bitmap, left, top, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000420}
421
422void SkDebugCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
423 SkScalar y, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000424 addDrawCommand(new SkDrawTextCommand(text, byteLength, x, y, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000425}
426
427void SkDebugCanvas::drawTextOnPath(const void* text, size_t byteLength,
428 const SkPath& path, const SkMatrix* matrix, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000429 addDrawCommand(
430 new SkDrawTextOnPathCommand(text, byteLength, path, matrix, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000431}
432
433void SkDebugCanvas::drawVertices(VertexMode vmode, int vertexCount,
434 const SkPoint vertices[], const SkPoint texs[], const SkColor colors[],
435 SkXfermode*, const uint16_t indices[], int indexCount,
436 const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000437 addDrawCommand(new SkDrawVerticesCommand(vmode, vertexCount, vertices,
438 texs, colors, NULL, indices, indexCount, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000439}
440
441void SkDebugCanvas::restore() {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000442 addDrawCommand(new SkRestoreCommand());
chudy@google.com902ebe52012-06-29 14:21:22 +0000443}
444
445bool SkDebugCanvas::rotate(SkScalar degrees) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000446 addDrawCommand(new SkRotateCommand(degrees));
chudy@google.com902ebe52012-06-29 14:21:22 +0000447 return true;
448}
449
450int SkDebugCanvas::save(SaveFlags flags) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000451 addDrawCommand(new SkSaveCommand(flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000452 return true;
453}
454
455int SkDebugCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
456 SaveFlags flags) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000457 addDrawCommand(new SkSaveLayerCommand(bounds, paint, flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000458 return true;
459}
460
461bool SkDebugCanvas::scale(SkScalar sx, SkScalar sy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000462 addDrawCommand(new SkScaleCommand(sx, sy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000463 return true;
464}
465
466void SkDebugCanvas::setMatrix(const SkMatrix& matrix) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000467 addDrawCommand(new SkSetMatrixCommand(matrix));
chudy@google.com902ebe52012-06-29 14:21:22 +0000468}
469
470bool SkDebugCanvas::skew(SkScalar sx, SkScalar sy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000471 addDrawCommand(new SkSkewCommand(sx, sy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000472 return true;
473}
474
475bool SkDebugCanvas::translate(SkScalar dx, SkScalar dy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000476 addDrawCommand(new SkTranslateCommand(dx, dy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000477 return true;
478}
479
chudy@google.com902ebe52012-06-29 14:21:22 +0000480void SkDebugCanvas::toggleCommand(int index, bool toggle) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000481 SkASSERT(index < fCommandVector.count());
482 fCommandVector[index]->setVisible(toggle);
chudy@google.com902ebe52012-06-29 14:21:22 +0000483}