blob: 5553e14e5254574ac121d1d214696b536bb9d7e9 [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();
chudy@google.com902ebe52012-06-29 14:21:22 +000038}
39
chudy@google.com9cda6f72012-08-07 15:08:33 +000040SkDebugCanvas::~SkDebugCanvas() {
robertphillips@google.com67baba42013-01-02 20:20:31 +000041 fCommandVector.deleteAll();
robertphillips@google.comf4741c12013-02-06 20:13:54 +000042 SkSafeUnref(fOverdrawFilter);
chudy@google.com9cda6f72012-08-07 15:08:33 +000043}
chudy@google.com902ebe52012-06-29 14:21:22 +000044
45void SkDebugCanvas::addDrawCommand(SkDrawCommand* command) {
robertphillips@google.com67baba42013-01-02 20:20:31 +000046 fCommandVector.push(command);
chudy@google.com902ebe52012-06-29 14:21:22 +000047}
48
49void SkDebugCanvas::draw(SkCanvas* canvas) {
robertphillips@google.com67baba42013-01-02 20:20:31 +000050 if(!fCommandVector.isEmpty()) {
51 for (int i = 0; i < fCommandVector.count(); i++) {
52 if (fCommandVector[i]->isVisible()) {
53 fCommandVector[i]->execute(canvas);
chudy@google.com0ab03392012-07-28 20:16:11 +000054 }
chudy@google.com902ebe52012-06-29 14:21:22 +000055 }
56 }
robertphillips@google.com67baba42013-01-02 20:20:31 +000057 fIndex = fCommandVector.count() - 1;
chudy@google.com902ebe52012-06-29 14:21:22 +000058}
59
chudy@google.com830b8792012-08-01 15:57:52 +000060void SkDebugCanvas::applyUserTransform(SkCanvas* canvas) {
bungeman@google.come8cc6e82013-01-17 16:30:56 +000061 canvas->concat(fUserMatrix);
chudy@google.com830b8792012-08-01 15:57:52 +000062}
63
64int SkDebugCanvas::getCommandAtPoint(int x, int y, int index) {
chudy@google.com0b5bbb02012-07-31 19:55:32 +000065 SkBitmap bitmap;
66 bitmap.setConfig(SkBitmap::kARGB_8888_Config, 1, 1);
67 bitmap.allocPixels();
chudy@google.com902ebe52012-06-29 14:21:22 +000068
chudy@google.com0b5bbb02012-07-31 19:55:32 +000069 SkCanvas canvas(bitmap);
robertphillips@google.com94acc702012-09-06 18:43:21 +000070 canvas.translate(SkIntToScalar(-x), SkIntToScalar(-y));
chudy@google.com830b8792012-08-01 15:57:52 +000071 applyUserTransform(&canvas);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000072
73 int layer = 0;
chudy@google.com751961d2012-07-31 20:07:42 +000074 SkColor prev = bitmap.getColor(0,0);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000075 for (int i = 0; i < index; i++) {
robertphillips@google.com67baba42013-01-02 20:20:31 +000076 if (fCommandVector[i]->isVisible()) {
77 fCommandVector[i]->execute(&canvas);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000078 }
79 if (prev != bitmap.getColor(0,0)) {
80 layer = i;
81 }
82 prev = bitmap.getColor(0,0);
83 }
84 return layer;
85}
86
bsalomon@google.com383e2342013-02-06 21:44:21 +000087static SkPMColor OverdrawXferModeProc(SkPMColor src, SkPMColor dst) {
robertphillips@google.comf4741c12013-02-06 20:13:54 +000088 // This table encodes the color progression of the overdraw visualization
89 static const SkPMColor gTable[] = {
90 SkPackARGB32(0x00, 0x00, 0x00, 0x00),
91 SkPackARGB32(0xFF, 128, 158, 255),
92 SkPackARGB32(0xFF, 170, 185, 212),
93 SkPackARGB32(0xFF, 213, 195, 170),
94 SkPackARGB32(0xFF, 255, 192, 127),
95 SkPackARGB32(0xFF, 255, 185, 85),
96 SkPackARGB32(0xFF, 255, 165, 42),
97 SkPackARGB32(0xFF, 255, 135, 0),
98 SkPackARGB32(0xFF, 255, 95, 0),
99 SkPackARGB32(0xFF, 255, 50, 0),
100 SkPackARGB32(0xFF, 255, 0, 0)
101 };
102
robertphillips@google.com0b256e12013-02-06 20:42:14 +0000103 for (size_t i = 0; i < SK_ARRAY_COUNT(gTable)-1; ++i) {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000104 if (gTable[i] == dst) {
105 return gTable[i+1];
106 }
107 }
108
109 return gTable[SK_ARRAY_COUNT(gTable)-1];
110}
111
112// The OverdrawFilter modifies every paint to use an SkProcXfermode which
113// in turn invokes OverdrawXferModeProc
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000114class SkOverdrawFilter : public SkDrawFilter {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000115public:
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000116 SkOverdrawFilter() {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000117 fXferMode = new SkProcXfermode(OverdrawXferModeProc);
118 }
119
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000120 virtual ~SkOverdrawFilter() {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000121 delete fXferMode;
122 }
123
124 virtual bool filter(SkPaint* p, Type) SK_OVERRIDE {
125 p->setXfermode(fXferMode);
126 return true;
127 }
128
129protected:
130 SkXfermode* fXferMode;
131
132private:
133 typedef SkDrawFilter INHERITED;
134};
135
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000136// SkTexOverrideFilter modifies every paint to use the specified
137// texture filtering mode
138class SkTexOverrideFilter : public SkDrawFilter {
139public:
140 SkTexOverrideFilter() : fFilterLevel(SkPaint::kNone_FilterLevel) {
141 }
142
143 void setFilterLevel(SkPaint::FilterLevel filterLevel) {
144 fFilterLevel = filterLevel;
145 }
146
147 virtual bool filter(SkPaint* p, Type) SK_OVERRIDE {
148 p->setFilterLevel(fFilterLevel);
149 return true;
150 }
151
152protected:
153 SkPaint::FilterLevel fFilterLevel;
154
155private:
156 typedef SkDrawFilter INHERITED;
157};
158
chudy@google.com0b5bbb02012-07-31 19:55:32 +0000159void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000160 SkASSERT(!fCommandVector.isEmpty());
161 SkASSERT(index < fCommandVector.count());
chudy@google.com830b8792012-08-01 15:57:52 +0000162 int i;
163
164 // This only works assuming the canvas and device are the same ones that
165 // were previously drawn into because they need to preserve all saves
166 // and restores.
167 if (fIndex < index) {
168 i = fIndex + 1;
169 } else {
tomhudson@google.com0699e022012-11-27 16:09:42 +0000170 for (int j = 0; j < fOutstandingSaveCount; j++) {
171 canvas->restore();
172 }
chudy@google.com830b8792012-08-01 15:57:52 +0000173 i = 0;
junov@google.comdbfac8a2012-12-06 21:47:40 +0000174 canvas->clear(SK_ColorTRANSPARENT);
chudy@google.com830b8792012-08-01 15:57:52 +0000175 canvas->resetMatrix();
skia.committer@gmail.com04ba4482012-09-07 02:01:30 +0000176 SkRect rect = SkRect::MakeWH(SkIntToScalar(fWidth),
robertphillips@google.com94acc702012-09-06 18:43:21 +0000177 SkIntToScalar(fHeight));
chudy@google.com4c7962e2012-08-14 19:38:31 +0000178 canvas->clipRect(rect, SkRegion::kReplace_Op );
chudy@google.com830b8792012-08-01 15:57:52 +0000179 applyUserTransform(canvas);
tomhudson@google.com0699e022012-11-27 16:09:42 +0000180 fOutstandingSaveCount = 0;
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000181 }
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000182
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000183 // The setting of the draw filter has to go here (rather than in
184 // SkRasterWidget) due to the canvas restores this class performs.
185 // Since the draw filter is stored in the layer stack if we
186 // call setDrawFilter on anything but the root layer odd things happen.
187 if (fOverdrawViz) {
188 if (NULL == fOverdrawFilter) {
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000189 fOverdrawFilter = new SkOverdrawFilter;
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000190 }
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000191
192 if (fOverdrawFilter != canvas->getDrawFilter()) {
193 canvas->setDrawFilter(fOverdrawFilter);
194 }
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000195 } else if (fOverrideTexFiltering) {
196 if (NULL == fTexOverrideFilter) {
197 fTexOverrideFilter = new SkTexOverrideFilter;
198 }
199
200 if (fTexOverrideFilter != canvas->getDrawFilter()) {
201 canvas->setDrawFilter(fTexOverrideFilter);
202 }
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000203 } else {
204 canvas->setDrawFilter(NULL);
chudy@google.com830b8792012-08-01 15:57:52 +0000205 }
206
207 for (; i <= index; i++) {
chudy@google.com0b5bbb02012-07-31 19:55:32 +0000208 if (i == index && fFilter) {
209 SkPaint p;
210 p.setColor(0xAAFFFFFF);
211 canvas->save();
212 canvas->resetMatrix();
213 SkRect mask;
214 mask.set(SkIntToScalar(0), SkIntToScalar(0),
215 SkIntToScalar(fWidth), SkIntToScalar(fHeight));
216 canvas->clipRect(mask, SkRegion::kReplace_Op, false);
217 canvas->drawRectCoords(SkIntToScalar(0), SkIntToScalar(0),
218 SkIntToScalar(fWidth), SkIntToScalar(fHeight), p);
219 canvas->restore();
220 }
221
robertphillips@google.com67baba42013-01-02 20:20:31 +0000222 if (fCommandVector[i]->isVisible()) {
223 fCommandVector[i]->execute(canvas);
224 fCommandVector[i]->trackSaveState(&fOutstandingSaveCount);
chudy@google.com902ebe52012-06-29 14:21:22 +0000225 }
226 }
chudy@google.coma9e937c2012-08-03 17:32:05 +0000227 fMatrix = canvas->getTotalMatrix();
228 fClip = canvas->getTotalClip().getBounds();
chudy@google.com830b8792012-08-01 15:57:52 +0000229 fIndex = index;
chudy@google.com902ebe52012-06-29 14:21:22 +0000230}
231
robertphillips@google.com50c84da2013-04-01 18:18:49 +0000232void SkDebugCanvas::deleteDrawCommandAt(int index) {
233 SkASSERT(index < fCommandVector.count());
234 delete fCommandVector[index];
235 fCommandVector.remove(index);
236}
237
chudy@google.com902ebe52012-06-29 14:21:22 +0000238SkDrawCommand* SkDebugCanvas::getDrawCommandAt(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000239 SkASSERT(index < fCommandVector.count());
240 return fCommandVector[index];
chudy@google.com902ebe52012-06-29 14:21:22 +0000241}
242
robertphillips@google.com50c84da2013-04-01 18:18:49 +0000243void SkDebugCanvas::setDrawCommandAt(int index, SkDrawCommand* command) {
244 SkASSERT(index < fCommandVector.count());
245 delete fCommandVector[index];
246 fCommandVector[index] = command;
247}
248
chudy@google.com97cee972012-08-07 20:41:37 +0000249SkTDArray<SkString*>* SkDebugCanvas::getCommandInfo(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000250 SkASSERT(index < fCommandVector.count());
251 return fCommandVector[index]->Info();
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000252}
chudy@google.com902ebe52012-06-29 14:21:22 +0000253
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000254bool SkDebugCanvas::getDrawCommandVisibilityAt(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000255 SkASSERT(index < fCommandVector.count());
256 return fCommandVector[index]->isVisible();
chudy@google.com902ebe52012-06-29 14:21:22 +0000257}
258
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000259const SkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() const {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000260 return fCommandVector;
chudy@google.com902ebe52012-06-29 14:21:22 +0000261}
262
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000263SkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() {
264 return fCommandVector;
265}
266
chudy@google.com902ebe52012-06-29 14:21:22 +0000267// TODO(chudy): Free command string memory.
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000268SkTArray<SkString>* SkDebugCanvas::getDrawCommandsAsStrings() const {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000269 SkTArray<SkString>* commandString = new SkTArray<SkString>(fCommandVector.count());
270 if (!fCommandVector.isEmpty()) {
271 for (int i = 0; i < fCommandVector.count(); i ++) {
272 commandString->push_back() = fCommandVector[i]->toString();
chudy@google.com902ebe52012-06-29 14:21:22 +0000273 }
274 }
275 return commandString;
276}
277
278void SkDebugCanvas::toggleFilter(bool toggle) {
279 fFilter = toggle;
280}
281
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000282void SkDebugCanvas::overrideTexFiltering(bool overrideTexFiltering, SkPaint::FilterLevel level) {
283 if (NULL == fTexOverrideFilter) {
284 fTexOverrideFilter = new SkTexOverrideFilter;
285 }
286
287 fOverrideTexFiltering = overrideTexFiltering;
288 fTexOverrideFilter->setFilterLevel(level);
289}
290
chudy@google.com902ebe52012-06-29 14:21:22 +0000291void SkDebugCanvas::clear(SkColor color) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000292 addDrawCommand(new SkClearCommand(color));
chudy@google.com902ebe52012-06-29 14:21:22 +0000293}
294
295bool SkDebugCanvas::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000296 addDrawCommand(new SkClipPathCommand(path, op, doAA));
chudy@google.com902ebe52012-06-29 14:21:22 +0000297 return true;
298}
299
300bool SkDebugCanvas::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000301 addDrawCommand(new SkClipRectCommand(rect, op, doAA));
chudy@google.com902ebe52012-06-29 14:21:22 +0000302 return true;
303}
304
robertphillips@google.com67baba42013-01-02 20:20:31 +0000305bool SkDebugCanvas::clipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000306 addDrawCommand(new SkClipRRectCommand(rrect, op, doAA));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000307 return true;
308}
309
chudy@google.com902ebe52012-06-29 14:21:22 +0000310bool SkDebugCanvas::clipRegion(const SkRegion& region, SkRegion::Op op) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000311 addDrawCommand(new SkClipRegionCommand(region, op));
chudy@google.com902ebe52012-06-29 14:21:22 +0000312 return true;
313}
314
315bool SkDebugCanvas::concat(const SkMatrix& matrix) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000316 addDrawCommand(new SkConcatCommand(matrix));
chudy@google.com902ebe52012-06-29 14:21:22 +0000317 return true;
318}
319
320void SkDebugCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar left,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000321 SkScalar top, const SkPaint* paint = NULL) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000322 addDrawCommand(new SkDrawBitmapCommand(bitmap, left, top, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000323}
324
reed@google.com71121732012-09-18 15:14:33 +0000325void SkDebugCanvas::drawBitmapRectToRect(const SkBitmap& bitmap,
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000326 const SkRect* src, const SkRect& dst,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000327 const SkPaint* paint,
328 SkCanvas::DrawBitmapRectFlags flags) {
329 addDrawCommand(new SkDrawBitmapRectCommand(bitmap, src, dst, paint, flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000330}
331
332void SkDebugCanvas::drawBitmapMatrix(const SkBitmap& bitmap,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000333 const SkMatrix& matrix, const SkPaint* paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000334 addDrawCommand(new SkDrawBitmapMatrixCommand(bitmap, matrix, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000335}
336
337void SkDebugCanvas::drawBitmapNine(const SkBitmap& bitmap,
338 const SkIRect& center, const SkRect& dst, const SkPaint* paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000339 addDrawCommand(new SkDrawBitmapNineCommand(bitmap, center, dst, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000340}
341
342void SkDebugCanvas::drawData(const void* data, size_t length) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000343 addDrawCommand(new SkDrawDataCommand(data, length));
chudy@google.com902ebe52012-06-29 14:21:22 +0000344}
345
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000346void SkDebugCanvas::beginCommentGroup(const char* description) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000347 addDrawCommand(new SkBeginCommentGroupCommand(description));
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000348}
349
350void SkDebugCanvas::addComment(const char* kywd, const char* value) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000351 addDrawCommand(new SkCommentCommand(kywd, value));
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000352}
353
354void SkDebugCanvas::endCommentGroup() {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000355 addDrawCommand(new SkEndCommentGroupCommand());
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000356}
357
robertphillips@google.com67baba42013-01-02 20:20:31 +0000358void SkDebugCanvas::drawOval(const SkRect& oval, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000359 addDrawCommand(new SkDrawOvalCommand(oval, paint));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000360}
361
chudy@google.com902ebe52012-06-29 14:21:22 +0000362void SkDebugCanvas::drawPaint(const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000363 addDrawCommand(new SkDrawPaintCommand(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000364}
365
robertphillips@google.comc2cc1db2013-10-17 17:34:20 +0000366void SkDebugCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000367 addDrawCommand(new SkDrawPathCommand(path, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000368}
369
370void SkDebugCanvas::drawPicture(SkPicture& picture) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000371 addDrawCommand(new SkDrawPictureCommand(picture));
chudy@google.com902ebe52012-06-29 14:21:22 +0000372}
373
374void SkDebugCanvas::drawPoints(PointMode mode, size_t count,
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000375 const SkPoint pts[], const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000376 addDrawCommand(new SkDrawPointsCommand(mode, count, pts, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000377}
378
379void SkDebugCanvas::drawPosText(const void* text, size_t byteLength,
380 const SkPoint pos[], const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000381 addDrawCommand(new SkDrawPosTextCommand(text, byteLength, pos, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000382}
383
384void SkDebugCanvas::drawPosTextH(const void* text, size_t byteLength,
385 const SkScalar xpos[], SkScalar constY, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000386 addDrawCommand(
387 new SkDrawPosTextHCommand(text, byteLength, xpos, constY, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000388}
389
robertphillips@google.comc2cc1db2013-10-17 17:34:20 +0000390void SkDebugCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000391 // NOTE(chudy): Messing up when renamed to DrawRect... Why?
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000392 addDrawCommand(new SkDrawRectCommand(rect, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000393}
394
robertphillips@google.com67baba42013-01-02 20:20:31 +0000395void SkDebugCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000396 addDrawCommand(new SkDrawRRectCommand(rrect, paint));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000397}
398
chudy@google.com902ebe52012-06-29 14:21:22 +0000399void SkDebugCanvas::drawSprite(const SkBitmap& bitmap, int left, int top,
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000400 const SkPaint* paint = NULL) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000401 addDrawCommand(new SkDrawSpriteCommand(bitmap, left, top, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000402}
403
404void SkDebugCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
405 SkScalar y, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000406 addDrawCommand(new SkDrawTextCommand(text, byteLength, x, y, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000407}
408
409void SkDebugCanvas::drawTextOnPath(const void* text, size_t byteLength,
410 const SkPath& path, const SkMatrix* matrix, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000411 addDrawCommand(
412 new SkDrawTextOnPathCommand(text, byteLength, path, matrix, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000413}
414
415void SkDebugCanvas::drawVertices(VertexMode vmode, int vertexCount,
416 const SkPoint vertices[], const SkPoint texs[], const SkColor colors[],
417 SkXfermode*, const uint16_t indices[], int indexCount,
418 const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000419 addDrawCommand(new SkDrawVerticesCommand(vmode, vertexCount, vertices,
420 texs, colors, NULL, indices, indexCount, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000421}
422
423void SkDebugCanvas::restore() {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000424 addDrawCommand(new SkRestoreCommand());
chudy@google.com902ebe52012-06-29 14:21:22 +0000425}
426
427bool SkDebugCanvas::rotate(SkScalar degrees) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000428 addDrawCommand(new SkRotateCommand(degrees));
chudy@google.com902ebe52012-06-29 14:21:22 +0000429 return true;
430}
431
432int SkDebugCanvas::save(SaveFlags flags) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000433 addDrawCommand(new SkSaveCommand(flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000434 return true;
435}
436
437int SkDebugCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
438 SaveFlags flags) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000439 addDrawCommand(new SkSaveLayerCommand(bounds, paint, flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000440 return true;
441}
442
443bool SkDebugCanvas::scale(SkScalar sx, SkScalar sy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000444 addDrawCommand(new SkScaleCommand(sx, sy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000445 return true;
446}
447
448void SkDebugCanvas::setMatrix(const SkMatrix& matrix) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000449 addDrawCommand(new SkSetMatrixCommand(matrix));
chudy@google.com902ebe52012-06-29 14:21:22 +0000450}
451
452bool SkDebugCanvas::skew(SkScalar sx, SkScalar sy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000453 addDrawCommand(new SkSkewCommand(sx, sy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000454 return true;
455}
456
457bool SkDebugCanvas::translate(SkScalar dx, SkScalar dy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000458 addDrawCommand(new SkTranslateCommand(dx, dy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000459 return true;
460}
461
chudy@google.com902ebe52012-06-29 14:21:22 +0000462void SkDebugCanvas::toggleCommand(int index, bool toggle) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000463 SkASSERT(index < fCommandVector.count());
464 fCommandVector[index]->setVisible(toggle);
chudy@google.com902ebe52012-06-29 14:21:22 +0000465}