blob: 0e07084e43ad77e6088f2816e35e99c64261138b [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)
27 , fOutstandingSaveCount(0) {
chudy@google.com902ebe52012-06-29 14:21:22 +000028 // TODO(chudy): Free up memory from all draw commands in destructor.
chudy@google.com80a4a602012-07-30 18:54:07 +000029 fWidth = width;
30 fHeight = height;
reed@google.com6ae24e02012-09-26 13:44:13 +000031 // do we need fBm anywhere?
chudy@google.comb9ddd4e2012-07-10 14:14:50 +000032 fBm.setConfig(SkBitmap::kNo_Config, fWidth, fHeight);
chudy@google.com902ebe52012-06-29 14:21:22 +000033 fFilter = false;
chudy@google.com830b8792012-08-01 15:57:52 +000034 fIndex = 0;
bungeman@google.come8cc6e82013-01-17 16:30:56 +000035 fUserMatrix.reset();
chudy@google.com902ebe52012-06-29 14:21:22 +000036}
37
chudy@google.com9cda6f72012-08-07 15:08:33 +000038SkDebugCanvas::~SkDebugCanvas() {
robertphillips@google.com67baba42013-01-02 20:20:31 +000039 fCommandVector.deleteAll();
robertphillips@google.comf4741c12013-02-06 20:13:54 +000040 SkSafeUnref(fOverdrawFilter);
chudy@google.com9cda6f72012-08-07 15:08:33 +000041}
chudy@google.com902ebe52012-06-29 14:21:22 +000042
43void SkDebugCanvas::addDrawCommand(SkDrawCommand* command) {
robertphillips@google.com67baba42013-01-02 20:20:31 +000044 fCommandVector.push(command);
chudy@google.com902ebe52012-06-29 14:21:22 +000045}
46
47void SkDebugCanvas::draw(SkCanvas* canvas) {
robertphillips@google.com67baba42013-01-02 20:20:31 +000048 if(!fCommandVector.isEmpty()) {
49 for (int i = 0; i < fCommandVector.count(); i++) {
50 if (fCommandVector[i]->isVisible()) {
51 fCommandVector[i]->execute(canvas);
chudy@google.com0ab03392012-07-28 20:16:11 +000052 }
chudy@google.com902ebe52012-06-29 14:21:22 +000053 }
54 }
robertphillips@google.com67baba42013-01-02 20:20:31 +000055 fIndex = fCommandVector.count() - 1;
chudy@google.com902ebe52012-06-29 14:21:22 +000056}
57
chudy@google.com830b8792012-08-01 15:57:52 +000058void SkDebugCanvas::applyUserTransform(SkCanvas* canvas) {
bungeman@google.come8cc6e82013-01-17 16:30:56 +000059 canvas->concat(fUserMatrix);
chudy@google.com830b8792012-08-01 15:57:52 +000060}
61
62int SkDebugCanvas::getCommandAtPoint(int x, int y, int index) {
chudy@google.com0b5bbb02012-07-31 19:55:32 +000063 SkBitmap bitmap;
64 bitmap.setConfig(SkBitmap::kARGB_8888_Config, 1, 1);
65 bitmap.allocPixels();
chudy@google.com902ebe52012-06-29 14:21:22 +000066
chudy@google.com0b5bbb02012-07-31 19:55:32 +000067 SkCanvas canvas(bitmap);
robertphillips@google.com94acc702012-09-06 18:43:21 +000068 canvas.translate(SkIntToScalar(-x), SkIntToScalar(-y));
chudy@google.com830b8792012-08-01 15:57:52 +000069 applyUserTransform(&canvas);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000070
71 int layer = 0;
chudy@google.com751961d2012-07-31 20:07:42 +000072 SkColor prev = bitmap.getColor(0,0);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000073 for (int i = 0; i < index; i++) {
robertphillips@google.com67baba42013-01-02 20:20:31 +000074 if (fCommandVector[i]->isVisible()) {
75 fCommandVector[i]->execute(&canvas);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000076 }
77 if (prev != bitmap.getColor(0,0)) {
78 layer = i;
79 }
80 prev = bitmap.getColor(0,0);
81 }
82 return layer;
83}
84
bsalomon@google.com383e2342013-02-06 21:44:21 +000085static SkPMColor OverdrawXferModeProc(SkPMColor src, SkPMColor dst) {
robertphillips@google.comf4741c12013-02-06 20:13:54 +000086 // This table encodes the color progression of the overdraw visualization
87 static const SkPMColor gTable[] = {
88 SkPackARGB32(0x00, 0x00, 0x00, 0x00),
89 SkPackARGB32(0xFF, 128, 158, 255),
90 SkPackARGB32(0xFF, 170, 185, 212),
91 SkPackARGB32(0xFF, 213, 195, 170),
92 SkPackARGB32(0xFF, 255, 192, 127),
93 SkPackARGB32(0xFF, 255, 185, 85),
94 SkPackARGB32(0xFF, 255, 165, 42),
95 SkPackARGB32(0xFF, 255, 135, 0),
96 SkPackARGB32(0xFF, 255, 95, 0),
97 SkPackARGB32(0xFF, 255, 50, 0),
98 SkPackARGB32(0xFF, 255, 0, 0)
99 };
100
robertphillips@google.com0b256e12013-02-06 20:42:14 +0000101 for (size_t i = 0; i < SK_ARRAY_COUNT(gTable)-1; ++i) {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000102 if (gTable[i] == dst) {
103 return gTable[i+1];
104 }
105 }
106
107 return gTable[SK_ARRAY_COUNT(gTable)-1];
108}
109
110// The OverdrawFilter modifies every paint to use an SkProcXfermode which
111// in turn invokes OverdrawXferModeProc
112class OverdrawFilter : public SkDrawFilter {
113public:
114 OverdrawFilter() {
115 fXferMode = new SkProcXfermode(OverdrawXferModeProc);
116 }
117
118 virtual ~OverdrawFilter() {
119 delete fXferMode;
120 }
121
122 virtual bool filter(SkPaint* p, Type) SK_OVERRIDE {
123 p->setXfermode(fXferMode);
124 return true;
125 }
126
127protected:
128 SkXfermode* fXferMode;
129
130private:
131 typedef SkDrawFilter INHERITED;
132};
133
chudy@google.com0b5bbb02012-07-31 19:55:32 +0000134void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000135 SkASSERT(!fCommandVector.isEmpty());
136 SkASSERT(index < fCommandVector.count());
chudy@google.com830b8792012-08-01 15:57:52 +0000137 int i;
138
139 // This only works assuming the canvas and device are the same ones that
140 // were previously drawn into because they need to preserve all saves
141 // and restores.
142 if (fIndex < index) {
143 i = fIndex + 1;
144 } else {
tomhudson@google.com0699e022012-11-27 16:09:42 +0000145 for (int j = 0; j < fOutstandingSaveCount; j++) {
146 canvas->restore();
147 }
chudy@google.com830b8792012-08-01 15:57:52 +0000148 i = 0;
junov@google.comdbfac8a2012-12-06 21:47:40 +0000149 canvas->clear(SK_ColorTRANSPARENT);
chudy@google.com830b8792012-08-01 15:57:52 +0000150 canvas->resetMatrix();
skia.committer@gmail.com04ba4482012-09-07 02:01:30 +0000151 SkRect rect = SkRect::MakeWH(SkIntToScalar(fWidth),
robertphillips@google.com94acc702012-09-06 18:43:21 +0000152 SkIntToScalar(fHeight));
chudy@google.com4c7962e2012-08-14 19:38:31 +0000153 canvas->clipRect(rect, SkRegion::kReplace_Op );
chudy@google.com830b8792012-08-01 15:57:52 +0000154 applyUserTransform(canvas);
tomhudson@google.com0699e022012-11-27 16:09:42 +0000155 fOutstandingSaveCount = 0;
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000156 }
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000157
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000158 // The setting of the draw filter has to go here (rather than in
159 // SkRasterWidget) due to the canvas restores this class performs.
160 // Since the draw filter is stored in the layer stack if we
161 // call setDrawFilter on anything but the root layer odd things happen.
162 if (fOverdrawViz) {
163 if (NULL == fOverdrawFilter) {
164 fOverdrawFilter = new OverdrawFilter;
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000165 }
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000166
167 if (fOverdrawFilter != canvas->getDrawFilter()) {
168 canvas->setDrawFilter(fOverdrawFilter);
169 }
170 } else {
171 canvas->setDrawFilter(NULL);
chudy@google.com830b8792012-08-01 15:57:52 +0000172 }
173
174 for (; i <= index; i++) {
chudy@google.com0b5bbb02012-07-31 19:55:32 +0000175 if (i == index && fFilter) {
176 SkPaint p;
177 p.setColor(0xAAFFFFFF);
178 canvas->save();
179 canvas->resetMatrix();
180 SkRect mask;
181 mask.set(SkIntToScalar(0), SkIntToScalar(0),
182 SkIntToScalar(fWidth), SkIntToScalar(fHeight));
183 canvas->clipRect(mask, SkRegion::kReplace_Op, false);
184 canvas->drawRectCoords(SkIntToScalar(0), SkIntToScalar(0),
185 SkIntToScalar(fWidth), SkIntToScalar(fHeight), p);
186 canvas->restore();
187 }
188
robertphillips@google.com67baba42013-01-02 20:20:31 +0000189 if (fCommandVector[i]->isVisible()) {
190 fCommandVector[i]->execute(canvas);
191 fCommandVector[i]->trackSaveState(&fOutstandingSaveCount);
chudy@google.com902ebe52012-06-29 14:21:22 +0000192 }
193 }
chudy@google.coma9e937c2012-08-03 17:32:05 +0000194 fMatrix = canvas->getTotalMatrix();
195 fClip = canvas->getTotalClip().getBounds();
chudy@google.com830b8792012-08-01 15:57:52 +0000196 fIndex = index;
chudy@google.com902ebe52012-06-29 14:21:22 +0000197}
198
robertphillips@google.com50c84da2013-04-01 18:18:49 +0000199void SkDebugCanvas::deleteDrawCommandAt(int index) {
200 SkASSERT(index < fCommandVector.count());
201 delete fCommandVector[index];
202 fCommandVector.remove(index);
203}
204
chudy@google.com902ebe52012-06-29 14:21:22 +0000205SkDrawCommand* SkDebugCanvas::getDrawCommandAt(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000206 SkASSERT(index < fCommandVector.count());
207 return fCommandVector[index];
chudy@google.com902ebe52012-06-29 14:21:22 +0000208}
209
robertphillips@google.com50c84da2013-04-01 18:18:49 +0000210void SkDebugCanvas::setDrawCommandAt(int index, SkDrawCommand* command) {
211 SkASSERT(index < fCommandVector.count());
212 delete fCommandVector[index];
213 fCommandVector[index] = command;
214}
215
chudy@google.com97cee972012-08-07 20:41:37 +0000216SkTDArray<SkString*>* SkDebugCanvas::getCommandInfo(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000217 SkASSERT(index < fCommandVector.count());
218 return fCommandVector[index]->Info();
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000219}
chudy@google.com902ebe52012-06-29 14:21:22 +0000220
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000221bool SkDebugCanvas::getDrawCommandVisibilityAt(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000222 SkASSERT(index < fCommandVector.count());
223 return fCommandVector[index]->isVisible();
chudy@google.com902ebe52012-06-29 14:21:22 +0000224}
225
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000226const SkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() const {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000227 return fCommandVector;
chudy@google.com902ebe52012-06-29 14:21:22 +0000228}
229
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000230SkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() {
231 return fCommandVector;
232}
233
chudy@google.com902ebe52012-06-29 14:21:22 +0000234// TODO(chudy): Free command string memory.
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000235SkTArray<SkString>* SkDebugCanvas::getDrawCommandsAsStrings() const {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000236 SkTArray<SkString>* commandString = new SkTArray<SkString>(fCommandVector.count());
237 if (!fCommandVector.isEmpty()) {
238 for (int i = 0; i < fCommandVector.count(); i ++) {
239 commandString->push_back() = fCommandVector[i]->toString();
chudy@google.com902ebe52012-06-29 14:21:22 +0000240 }
241 }
242 return commandString;
243}
244
245void SkDebugCanvas::toggleFilter(bool toggle) {
246 fFilter = toggle;
247}
248
249void SkDebugCanvas::clear(SkColor color) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000250 addDrawCommand(new SkClearCommand(color));
chudy@google.com902ebe52012-06-29 14:21:22 +0000251}
252
253bool SkDebugCanvas::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000254 addDrawCommand(new SkClipPathCommand(path, op, doAA));
chudy@google.com902ebe52012-06-29 14:21:22 +0000255 return true;
256}
257
258bool SkDebugCanvas::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000259 addDrawCommand(new SkClipRectCommand(rect, op, doAA));
chudy@google.com902ebe52012-06-29 14:21:22 +0000260 return true;
261}
262
robertphillips@google.com67baba42013-01-02 20:20:31 +0000263bool SkDebugCanvas::clipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000264 addDrawCommand(new SkClipRRectCommand(rrect, op, doAA));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000265 return true;
266}
267
chudy@google.com902ebe52012-06-29 14:21:22 +0000268bool SkDebugCanvas::clipRegion(const SkRegion& region, SkRegion::Op op) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000269 addDrawCommand(new SkClipRegionCommand(region, op));
chudy@google.com902ebe52012-06-29 14:21:22 +0000270 return true;
271}
272
273bool SkDebugCanvas::concat(const SkMatrix& matrix) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000274 addDrawCommand(new SkConcatCommand(matrix));
chudy@google.com902ebe52012-06-29 14:21:22 +0000275 return true;
276}
277
278void SkDebugCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar left,
279 SkScalar top, const SkPaint* paint = NULL) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000280 addDrawCommand(new SkDrawBitmapCommand(bitmap, left, top, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000281}
282
reed@google.com71121732012-09-18 15:14:33 +0000283void SkDebugCanvas::drawBitmapRectToRect(const SkBitmap& bitmap,
284 const SkRect* src, const SkRect& dst, const SkPaint* paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000285 addDrawCommand(new SkDrawBitmapRectCommand(bitmap, src, dst, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000286}
287
288void SkDebugCanvas::drawBitmapMatrix(const SkBitmap& bitmap,
289 const SkMatrix& matrix, const SkPaint* paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000290 addDrawCommand(new SkDrawBitmapMatrixCommand(bitmap, matrix, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000291}
292
293void SkDebugCanvas::drawBitmapNine(const SkBitmap& bitmap,
294 const SkIRect& center, const SkRect& dst, const SkPaint* paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000295 addDrawCommand(new SkDrawBitmapNineCommand(bitmap, center, dst, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000296}
297
298void SkDebugCanvas::drawData(const void* data, size_t length) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000299 addDrawCommand(new SkDrawDataCommand(data, length));
chudy@google.com902ebe52012-06-29 14:21:22 +0000300}
301
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000302void SkDebugCanvas::beginCommentGroup(const char* description) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000303 addDrawCommand(new SkBeginCommentGroupCommand(description));
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000304}
305
306void SkDebugCanvas::addComment(const char* kywd, const char* value) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000307 addDrawCommand(new SkCommentCommand(kywd, value));
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000308}
309
310void SkDebugCanvas::endCommentGroup() {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000311 addDrawCommand(new SkEndCommentGroupCommand());
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000312}
313
robertphillips@google.com67baba42013-01-02 20:20:31 +0000314void SkDebugCanvas::drawOval(const SkRect& oval, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000315 addDrawCommand(new SkDrawOvalCommand(oval, paint));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000316}
317
chudy@google.com902ebe52012-06-29 14:21:22 +0000318void SkDebugCanvas::drawPaint(const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000319 addDrawCommand(new SkDrawPaintCommand(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000320}
321
322void SkDebugCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000323 addDrawCommand(new SkDrawPathCommand(path, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000324}
325
326void SkDebugCanvas::drawPicture(SkPicture& picture) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000327 addDrawCommand(new SkDrawPictureCommand(picture));
chudy@google.com902ebe52012-06-29 14:21:22 +0000328}
329
330void SkDebugCanvas::drawPoints(PointMode mode, size_t count,
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000331 const SkPoint pts[], const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000332 addDrawCommand(new SkDrawPointsCommand(mode, count, pts, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000333}
334
335void SkDebugCanvas::drawPosText(const void* text, size_t byteLength,
336 const SkPoint pos[], const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000337 addDrawCommand(new SkDrawPosTextCommand(text, byteLength, pos, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000338}
339
340void SkDebugCanvas::drawPosTextH(const void* text, size_t byteLength,
341 const SkScalar xpos[], SkScalar constY, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000342 addDrawCommand(
343 new SkDrawPosTextHCommand(text, byteLength, xpos, constY, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000344}
345
346void SkDebugCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
347 // NOTE(chudy): Messing up when renamed to DrawRect... Why?
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000348 addDrawCommand(new SkDrawRectCommand(rect, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000349}
350
robertphillips@google.com67baba42013-01-02 20:20:31 +0000351void SkDebugCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000352 addDrawCommand(new SkDrawRRectCommand(rrect, paint));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000353}
354
chudy@google.com902ebe52012-06-29 14:21:22 +0000355void SkDebugCanvas::drawSprite(const SkBitmap& bitmap, int left, int top,
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000356 const SkPaint* paint = NULL) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000357 addDrawCommand(new SkDrawSpriteCommand(bitmap, left, top, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000358}
359
360void SkDebugCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
361 SkScalar y, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000362 addDrawCommand(new SkDrawTextCommand(text, byteLength, x, y, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000363}
364
365void SkDebugCanvas::drawTextOnPath(const void* text, size_t byteLength,
366 const SkPath& path, const SkMatrix* matrix, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000367 addDrawCommand(
368 new SkDrawTextOnPathCommand(text, byteLength, path, matrix, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000369}
370
371void SkDebugCanvas::drawVertices(VertexMode vmode, int vertexCount,
372 const SkPoint vertices[], const SkPoint texs[], const SkColor colors[],
373 SkXfermode*, const uint16_t indices[], int indexCount,
374 const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000375 addDrawCommand(new SkDrawVerticesCommand(vmode, vertexCount, vertices,
376 texs, colors, NULL, indices, indexCount, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000377}
378
379void SkDebugCanvas::restore() {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000380 addDrawCommand(new SkRestoreCommand());
chudy@google.com902ebe52012-06-29 14:21:22 +0000381}
382
383bool SkDebugCanvas::rotate(SkScalar degrees) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000384 addDrawCommand(new SkRotateCommand(degrees));
chudy@google.com902ebe52012-06-29 14:21:22 +0000385 return true;
386}
387
388int SkDebugCanvas::save(SaveFlags flags) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000389 addDrawCommand(new SkSaveCommand(flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000390 return true;
391}
392
393int SkDebugCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
394 SaveFlags flags) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000395 addDrawCommand(new SkSaveLayerCommand(bounds, paint, flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000396 return true;
397}
398
399bool SkDebugCanvas::scale(SkScalar sx, SkScalar sy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000400 addDrawCommand(new SkScaleCommand(sx, sy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000401 return true;
402}
403
404void SkDebugCanvas::setMatrix(const SkMatrix& matrix) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000405 addDrawCommand(new SkSetMatrixCommand(matrix));
chudy@google.com902ebe52012-06-29 14:21:22 +0000406}
407
408bool SkDebugCanvas::skew(SkScalar sx, SkScalar sy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000409 addDrawCommand(new SkSkewCommand(sx, sy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000410 return true;
411}
412
413bool SkDebugCanvas::translate(SkScalar dx, SkScalar dy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000414 addDrawCommand(new SkTranslateCommand(dx, dy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000415 return true;
416}
417
chudy@google.com902ebe52012-06-29 14:21:22 +0000418void SkDebugCanvas::toggleCommand(int index, bool toggle) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000419 SkASSERT(index < fCommandVector.count());
420 fCommandVector[index]->setVisible(toggle);
chudy@google.com902ebe52012-06-29 14:21:22 +0000421}