blob: e8589f3b540009b30949ffcee21c2d810d357420 [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
bsalomon@google.com50c79d82013-01-08 20:31:53 +000017#ifdef SK_BUILD_FOR_WIN
18 // iostream includes xlocale which generates warning 4530 because we're compiling without
19 // exceptions
20 #pragma warning(push)
21 #pragma warning(disable : 4530)
22#endif
23#include <iostream>
24#ifdef SK_BUILD_FOR_WIN
25 #pragma warning(pop)
26#endif
27
reed@google.com6ae24e02012-09-26 13:44:13 +000028static SkBitmap make_noconfig_bm(int width, int height) {
29 SkBitmap bm;
30 bm.setConfig(SkBitmap::kNo_Config, width, height);
31 return bm;
32}
33
34SkDebugCanvas::SkDebugCanvas(int width, int height)
tomhudson@google.com0699e022012-11-27 16:09:42 +000035 : INHERITED(make_noconfig_bm(width, height))
robertphillips@google.comf4741c12013-02-06 20:13:54 +000036 , fOverdrawViz(false)
scroggo@google.com06d6ac62013-02-08 21:16:19 +000037 , fOverdrawFilter(NULL)
38 , fOutstandingSaveCount(0) {
chudy@google.com902ebe52012-06-29 14:21:22 +000039 // TODO(chudy): Free up memory from all draw commands in destructor.
chudy@google.com80a4a602012-07-30 18:54:07 +000040 fWidth = width;
41 fHeight = height;
reed@google.com6ae24e02012-09-26 13:44:13 +000042 // do we need fBm anywhere?
chudy@google.comb9ddd4e2012-07-10 14:14:50 +000043 fBm.setConfig(SkBitmap::kNo_Config, fWidth, fHeight);
chudy@google.com902ebe52012-06-29 14:21:22 +000044 fFilter = false;
chudy@google.com830b8792012-08-01 15:57:52 +000045 fIndex = 0;
bungeman@google.come8cc6e82013-01-17 16:30:56 +000046 fUserMatrix.reset();
chudy@google.com902ebe52012-06-29 14:21:22 +000047}
48
chudy@google.com9cda6f72012-08-07 15:08:33 +000049SkDebugCanvas::~SkDebugCanvas() {
robertphillips@google.com67baba42013-01-02 20:20:31 +000050 fCommandVector.deleteAll();
robertphillips@google.comf4741c12013-02-06 20:13:54 +000051 SkSafeUnref(fOverdrawFilter);
chudy@google.com9cda6f72012-08-07 15:08:33 +000052}
chudy@google.com902ebe52012-06-29 14:21:22 +000053
54void SkDebugCanvas::addDrawCommand(SkDrawCommand* command) {
robertphillips@google.com67baba42013-01-02 20:20:31 +000055 fCommandVector.push(command);
chudy@google.com902ebe52012-06-29 14:21:22 +000056}
57
58void SkDebugCanvas::draw(SkCanvas* canvas) {
robertphillips@google.com67baba42013-01-02 20:20:31 +000059 if(!fCommandVector.isEmpty()) {
60 for (int i = 0; i < fCommandVector.count(); i++) {
61 if (fCommandVector[i]->isVisible()) {
62 fCommandVector[i]->execute(canvas);
chudy@google.com0ab03392012-07-28 20:16:11 +000063 }
chudy@google.com902ebe52012-06-29 14:21:22 +000064 }
65 }
robertphillips@google.com67baba42013-01-02 20:20:31 +000066 fIndex = fCommandVector.count() - 1;
chudy@google.com902ebe52012-06-29 14:21:22 +000067}
68
chudy@google.com830b8792012-08-01 15:57:52 +000069void SkDebugCanvas::applyUserTransform(SkCanvas* canvas) {
bungeman@google.come8cc6e82013-01-17 16:30:56 +000070 canvas->concat(fUserMatrix);
chudy@google.com830b8792012-08-01 15:57:52 +000071}
72
73int SkDebugCanvas::getCommandAtPoint(int x, int y, int index) {
chudy@google.com0b5bbb02012-07-31 19:55:32 +000074 SkBitmap bitmap;
75 bitmap.setConfig(SkBitmap::kARGB_8888_Config, 1, 1);
76 bitmap.allocPixels();
chudy@google.com902ebe52012-06-29 14:21:22 +000077
chudy@google.com0b5bbb02012-07-31 19:55:32 +000078 SkCanvas canvas(bitmap);
robertphillips@google.com94acc702012-09-06 18:43:21 +000079 canvas.translate(SkIntToScalar(-x), SkIntToScalar(-y));
chudy@google.com830b8792012-08-01 15:57:52 +000080 applyUserTransform(&canvas);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000081
82 int layer = 0;
chudy@google.com751961d2012-07-31 20:07:42 +000083 SkColor prev = bitmap.getColor(0,0);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000084 for (int i = 0; i < index; i++) {
robertphillips@google.com67baba42013-01-02 20:20:31 +000085 if (fCommandVector[i]->isVisible()) {
86 fCommandVector[i]->execute(&canvas);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000087 }
88 if (prev != bitmap.getColor(0,0)) {
89 layer = i;
90 }
91 prev = bitmap.getColor(0,0);
92 }
93 return layer;
94}
95
bsalomon@google.com383e2342013-02-06 21:44:21 +000096static SkPMColor OverdrawXferModeProc(SkPMColor src, SkPMColor dst) {
robertphillips@google.comf4741c12013-02-06 20:13:54 +000097 // This table encodes the color progression of the overdraw visualization
98 static const SkPMColor gTable[] = {
99 SkPackARGB32(0x00, 0x00, 0x00, 0x00),
100 SkPackARGB32(0xFF, 128, 158, 255),
101 SkPackARGB32(0xFF, 170, 185, 212),
102 SkPackARGB32(0xFF, 213, 195, 170),
103 SkPackARGB32(0xFF, 255, 192, 127),
104 SkPackARGB32(0xFF, 255, 185, 85),
105 SkPackARGB32(0xFF, 255, 165, 42),
106 SkPackARGB32(0xFF, 255, 135, 0),
107 SkPackARGB32(0xFF, 255, 95, 0),
108 SkPackARGB32(0xFF, 255, 50, 0),
109 SkPackARGB32(0xFF, 255, 0, 0)
110 };
111
robertphillips@google.com0b256e12013-02-06 20:42:14 +0000112 for (size_t i = 0; i < SK_ARRAY_COUNT(gTable)-1; ++i) {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000113 if (gTable[i] == dst) {
114 return gTable[i+1];
115 }
116 }
117
118 return gTable[SK_ARRAY_COUNT(gTable)-1];
119}
120
121// The OverdrawFilter modifies every paint to use an SkProcXfermode which
122// in turn invokes OverdrawXferModeProc
123class OverdrawFilter : public SkDrawFilter {
124public:
125 OverdrawFilter() {
126 fXferMode = new SkProcXfermode(OverdrawXferModeProc);
127 }
128
129 virtual ~OverdrawFilter() {
130 delete fXferMode;
131 }
132
133 virtual bool filter(SkPaint* p, Type) SK_OVERRIDE {
134 p->setXfermode(fXferMode);
135 return true;
136 }
137
138protected:
139 SkXfermode* fXferMode;
140
141private:
142 typedef SkDrawFilter INHERITED;
143};
144
chudy@google.com0b5bbb02012-07-31 19:55:32 +0000145void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000146 SkASSERT(!fCommandVector.isEmpty());
147 SkASSERT(index < fCommandVector.count());
chudy@google.com830b8792012-08-01 15:57:52 +0000148 int i;
149
150 // This only works assuming the canvas and device are the same ones that
151 // were previously drawn into because they need to preserve all saves
152 // and restores.
153 if (fIndex < index) {
154 i = fIndex + 1;
155 } else {
tomhudson@google.com0699e022012-11-27 16:09:42 +0000156 for (int j = 0; j < fOutstandingSaveCount; j++) {
157 canvas->restore();
158 }
chudy@google.com830b8792012-08-01 15:57:52 +0000159 i = 0;
junov@google.comdbfac8a2012-12-06 21:47:40 +0000160 canvas->clear(SK_ColorTRANSPARENT);
chudy@google.com830b8792012-08-01 15:57:52 +0000161 canvas->resetMatrix();
skia.committer@gmail.com04ba4482012-09-07 02:01:30 +0000162 SkRect rect = SkRect::MakeWH(SkIntToScalar(fWidth),
robertphillips@google.com94acc702012-09-06 18:43:21 +0000163 SkIntToScalar(fHeight));
chudy@google.com4c7962e2012-08-14 19:38:31 +0000164 canvas->clipRect(rect, SkRegion::kReplace_Op );
chudy@google.com830b8792012-08-01 15:57:52 +0000165 applyUserTransform(canvas);
tomhudson@google.com0699e022012-11-27 16:09:42 +0000166 fOutstandingSaveCount = 0;
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000167
168 // The setting of the draw filter has to go here (rather than in
169 // SkRasterWidget) due to the canvas restores this class performs.
170 // Since the draw filter is stored in the layer stack if we
171 // call setDrawFilter on anything but the root layer odd things happen
172 if (fOverdrawViz) {
173 if (NULL == fOverdrawFilter) {
174 fOverdrawFilter = new OverdrawFilter;
175 }
176
177 if (fOverdrawFilter != canvas->getDrawFilter()) {
178 canvas->setDrawFilter(fOverdrawFilter);
179 }
180 } else {
181 canvas->setDrawFilter(NULL);
182 }
chudy@google.com830b8792012-08-01 15:57:52 +0000183 }
184
185 for (; i <= index; i++) {
chudy@google.com0b5bbb02012-07-31 19:55:32 +0000186 if (i == index && fFilter) {
187 SkPaint p;
188 p.setColor(0xAAFFFFFF);
189 canvas->save();
190 canvas->resetMatrix();
191 SkRect mask;
192 mask.set(SkIntToScalar(0), SkIntToScalar(0),
193 SkIntToScalar(fWidth), SkIntToScalar(fHeight));
194 canvas->clipRect(mask, SkRegion::kReplace_Op, false);
195 canvas->drawRectCoords(SkIntToScalar(0), SkIntToScalar(0),
196 SkIntToScalar(fWidth), SkIntToScalar(fHeight), p);
197 canvas->restore();
198 }
199
robertphillips@google.com67baba42013-01-02 20:20:31 +0000200 if (fCommandVector[i]->isVisible()) {
201 fCommandVector[i]->execute(canvas);
202 fCommandVector[i]->trackSaveState(&fOutstandingSaveCount);
chudy@google.com902ebe52012-06-29 14:21:22 +0000203 }
204 }
chudy@google.coma9e937c2012-08-03 17:32:05 +0000205 fMatrix = canvas->getTotalMatrix();
206 fClip = canvas->getTotalClip().getBounds();
chudy@google.com830b8792012-08-01 15:57:52 +0000207 fIndex = index;
chudy@google.com902ebe52012-06-29 14:21:22 +0000208}
209
210SkDrawCommand* SkDebugCanvas::getDrawCommandAt(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000211 SkASSERT(index < fCommandVector.count());
212 return fCommandVector[index];
chudy@google.com902ebe52012-06-29 14:21:22 +0000213}
214
chudy@google.com97cee972012-08-07 20:41:37 +0000215SkTDArray<SkString*>* SkDebugCanvas::getCommandInfo(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000216 SkASSERT(index < fCommandVector.count());
217 return fCommandVector[index]->Info();
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000218}
chudy@google.com902ebe52012-06-29 14:21:22 +0000219
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000220bool SkDebugCanvas::getDrawCommandVisibilityAt(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000221 SkASSERT(index < fCommandVector.count());
222 return fCommandVector[index]->isVisible();
chudy@google.com902ebe52012-06-29 14:21:22 +0000223}
224
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000225const SkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() const {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000226 return fCommandVector;
chudy@google.com902ebe52012-06-29 14:21:22 +0000227}
228
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000229SkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() {
230 return fCommandVector;
231}
232
chudy@google.com902ebe52012-06-29 14:21:22 +0000233// TODO(chudy): Free command string memory.
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000234SkTArray<SkString>* SkDebugCanvas::getDrawCommandsAsStrings() const {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000235 SkTArray<SkString>* commandString = new SkTArray<SkString>(fCommandVector.count());
236 if (!fCommandVector.isEmpty()) {
237 for (int i = 0; i < fCommandVector.count(); i ++) {
238 commandString->push_back() = fCommandVector[i]->toString();
chudy@google.com902ebe52012-06-29 14:21:22 +0000239 }
240 }
241 return commandString;
242}
243
244void SkDebugCanvas::toggleFilter(bool toggle) {
245 fFilter = toggle;
246}
247
248void SkDebugCanvas::clear(SkColor color) {
249 addDrawCommand(new Clear(color));
250}
251
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +0000252static SkBitmap createBitmap(const SkPath& path) {
253 SkBitmap bitmap;
skia.committer@gmail.com1c9c0d32012-11-22 02:02:41 +0000254 bitmap.setConfig(SkBitmap::kARGB_8888_Config,
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000255 SkDebugCanvas::kVizImageWidth,
256 SkDebugCanvas::kVizImageHeight);
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +0000257 bitmap.allocPixels();
258 bitmap.eraseColor(SK_ColorWHITE);
259 SkDevice* device = new SkDevice(bitmap);
260
261 SkCanvas canvas(device);
262 device->unref();
263
264 const SkRect& bounds = path.getBounds();
265
266 if (bounds.width() > bounds.height()) {
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000267 canvas.scale(SkDoubleToScalar((0.9*SkDebugCanvas::kVizImageWidth)/bounds.width()),
268 SkDoubleToScalar((0.9*SkDebugCanvas::kVizImageHeight)/bounds.width()));
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +0000269 } else {
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000270 canvas.scale(SkDoubleToScalar((0.9*SkDebugCanvas::kVizImageWidth)/bounds.height()),
271 SkDoubleToScalar((0.9*SkDebugCanvas::kVizImageHeight)/bounds.height()));
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +0000272 }
273 canvas.translate(-bounds.fLeft+2, -bounds.fTop+2);
274
275 SkPaint p;
276 p.setColor(SK_ColorBLACK);
277 p.setStyle(SkPaint::kStroke_Style);
278
279 canvas.drawPath(path, p);
280
281 return bitmap;
282}
283
robertphillips@google.com53ec73d2012-11-26 13:09:17 +0000284static SkBitmap createBitmap(const SkBitmap& input, const SkRect* srcRect) {
285 SkBitmap bitmap;
skia.committer@gmail.com8ccf5902012-11-27 02:01:19 +0000286 bitmap.setConfig(SkBitmap::kARGB_8888_Config,
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000287 SkDebugCanvas::kVizImageWidth,
288 SkDebugCanvas::kVizImageHeight);
robertphillips@google.com53ec73d2012-11-26 13:09:17 +0000289 bitmap.allocPixels();
290 bitmap.eraseColor(SK_ColorLTGRAY);
291 SkDevice* device = new SkDevice(bitmap);
292
293 SkCanvas canvas(device);
294 device->unref();
295
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000296 SkScalar xScale = SkIntToScalar(SkDebugCanvas::kVizImageWidth-2) / input.width();
297 SkScalar yScale = SkIntToScalar(SkDebugCanvas::kVizImageHeight-2) / input.height();
robertphillips@google.com53ec73d2012-11-26 13:09:17 +0000298
299 if (input.width() > input.height()) {
300 yScale *= input.height() / (float) input.width();
301 } else {
302 xScale *= input.width() / (float) input.height();
303 }
304
skia.committer@gmail.com8ccf5902012-11-27 02:01:19 +0000305 SkRect dst = SkRect::MakeXYWH(SK_Scalar1, SK_Scalar1,
robertphillips@google.com53ec73d2012-11-26 13:09:17 +0000306 xScale * input.width(),
307 yScale * input.height());
308
309 canvas.drawBitmapRect(input, NULL, dst);
310
311 if (NULL != srcRect) {
312 SkRect r = SkRect::MakeLTRB(srcRect->fLeft * xScale + SK_Scalar1,
313 srcRect->fTop * yScale + SK_Scalar1,
314 srcRect->fRight * xScale + SK_Scalar1,
315 srcRect->fBottom * yScale + SK_Scalar1);
316 SkPaint p;
317 p.setColor(SK_ColorRED);
318 p.setStyle(SkPaint::kStroke_Style);
319
320 canvas.drawRect(r, p);
321 }
322
323 return bitmap;
324}
325
chudy@google.com902ebe52012-06-29 14:21:22 +0000326bool SkDebugCanvas::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) {
rmistry@google.com44737652012-11-21 18:37:58 +0000327 SkBitmap bitmap = createBitmap(path);
328 addDrawCommand(new ClipPath(path, op, doAA, bitmap));
chudy@google.com902ebe52012-06-29 14:21:22 +0000329 return true;
330}
331
332bool SkDebugCanvas::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) {
333 addDrawCommand(new ClipRect(rect, op, doAA));
334 return true;
335}
336
robertphillips@google.com67baba42013-01-02 20:20:31 +0000337bool SkDebugCanvas::clipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA) {
338 addDrawCommand(new ClipRRect(rrect, op, doAA));
339 return true;
340}
341
chudy@google.com902ebe52012-06-29 14:21:22 +0000342bool SkDebugCanvas::clipRegion(const SkRegion& region, SkRegion::Op op) {
343 addDrawCommand(new ClipRegion(region, op));
344 return true;
345}
346
347bool SkDebugCanvas::concat(const SkMatrix& matrix) {
348 addDrawCommand(new Concat(matrix));
349 return true;
350}
351
352void SkDebugCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar left,
353 SkScalar top, const SkPaint* paint = NULL) {
robertphillips@google.com53ec73d2012-11-26 13:09:17 +0000354 SkBitmap resizedBitmap = createBitmap(bitmap, NULL);
355 addDrawCommand(new DrawBitmap(bitmap, left, top, paint, resizedBitmap));
chudy@google.com902ebe52012-06-29 14:21:22 +0000356}
357
reed@google.com71121732012-09-18 15:14:33 +0000358void SkDebugCanvas::drawBitmapRectToRect(const SkBitmap& bitmap,
359 const SkRect* src, const SkRect& dst, const SkPaint* paint) {
robertphillips@google.com53ec73d2012-11-26 13:09:17 +0000360 SkBitmap resizedBitmap = createBitmap(bitmap, src);
361 addDrawCommand(new DrawBitmapRect(bitmap, src, dst, paint, resizedBitmap));
chudy@google.com902ebe52012-06-29 14:21:22 +0000362}
363
364void SkDebugCanvas::drawBitmapMatrix(const SkBitmap& bitmap,
365 const SkMatrix& matrix, const SkPaint* paint) {
robertphillips@google.com53ec73d2012-11-26 13:09:17 +0000366 SkBitmap resizedBitmap = createBitmap(bitmap, NULL);
367 addDrawCommand(new DrawBitmapMatrix(bitmap, matrix, paint, resizedBitmap));
chudy@google.com902ebe52012-06-29 14:21:22 +0000368}
369
370void SkDebugCanvas::drawBitmapNine(const SkBitmap& bitmap,
371 const SkIRect& center, const SkRect& dst, const SkPaint* paint) {
robertphillips@google.com53ec73d2012-11-26 13:09:17 +0000372 SkBitmap resizedBitmap = createBitmap(bitmap, NULL);
373 addDrawCommand(new DrawBitmapNine(bitmap, center, dst, paint, resizedBitmap));
chudy@google.com902ebe52012-06-29 14:21:22 +0000374}
375
376void SkDebugCanvas::drawData(const void* data, size_t length) {
377 addDrawCommand(new DrawData(data, length));
378}
379
robertphillips@google.com67baba42013-01-02 20:20:31 +0000380void SkDebugCanvas::drawOval(const SkRect& oval, const SkPaint& paint) {
381 addDrawCommand(new DrawOval(oval, paint));
382}
383
chudy@google.com902ebe52012-06-29 14:21:22 +0000384void SkDebugCanvas::drawPaint(const SkPaint& paint) {
385 addDrawCommand(new DrawPaint(paint));
386}
387
388void SkDebugCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
rmistry@google.com44737652012-11-21 18:37:58 +0000389 SkBitmap bitmap = createBitmap(path);
390 addDrawCommand(new DrawPath(path, paint, bitmap));
chudy@google.com902ebe52012-06-29 14:21:22 +0000391}
392
393void SkDebugCanvas::drawPicture(SkPicture& picture) {
394 addDrawCommand(new DrawPicture(picture));
395}
396
397void SkDebugCanvas::drawPoints(PointMode mode, size_t count,
398 const SkPoint pts[], const SkPaint& paint) {
399 addDrawCommand(new DrawPoints(mode, count, pts, paint));
400}
401
402void SkDebugCanvas::drawPosText(const void* text, size_t byteLength,
403 const SkPoint pos[], const SkPaint& paint) {
404 addDrawCommand(new DrawPosText(text, byteLength, pos, paint));
405}
406
407void SkDebugCanvas::drawPosTextH(const void* text, size_t byteLength,
408 const SkScalar xpos[], SkScalar constY, const SkPaint& paint) {
409 addDrawCommand(new DrawPosTextH(text, byteLength, xpos, constY, paint));
410}
411
412void SkDebugCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
413 // NOTE(chudy): Messing up when renamed to DrawRect... Why?
414 addDrawCommand(new DrawRectC(rect, paint));
415}
416
robertphillips@google.com67baba42013-01-02 20:20:31 +0000417void SkDebugCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
418 addDrawCommand(new DrawRRect(rrect, paint));
419}
420
chudy@google.com902ebe52012-06-29 14:21:22 +0000421void SkDebugCanvas::drawSprite(const SkBitmap& bitmap, int left, int top,
422 const SkPaint* paint = NULL) {
robertphillips@google.com53ec73d2012-11-26 13:09:17 +0000423 SkBitmap resizedBitmap = createBitmap(bitmap, NULL);
424 addDrawCommand(new DrawSprite(bitmap, left, top, paint, resizedBitmap));
chudy@google.com902ebe52012-06-29 14:21:22 +0000425}
426
427void SkDebugCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
428 SkScalar y, const SkPaint& paint) {
429 addDrawCommand(new DrawTextC(text, byteLength, x, y, paint));
430}
431
432void SkDebugCanvas::drawTextOnPath(const void* text, size_t byteLength,
433 const SkPath& path, const SkMatrix* matrix, const SkPaint& paint) {
434 addDrawCommand(new DrawTextOnPath(text, byteLength, path, matrix, paint));
435}
436
437void SkDebugCanvas::drawVertices(VertexMode vmode, int vertexCount,
438 const SkPoint vertices[], const SkPoint texs[], const SkColor colors[],
439 SkXfermode*, const uint16_t indices[], int indexCount,
440 const SkPaint& paint) {
441 addDrawCommand(new DrawVertices(vmode, vertexCount, vertices, texs, colors,
442 NULL, indices, indexCount, paint));
443}
444
445void SkDebugCanvas::restore() {
446 addDrawCommand(new Restore());
447}
448
449bool SkDebugCanvas::rotate(SkScalar degrees) {
450 addDrawCommand(new Rotate(degrees));
451 return true;
452}
453
454int SkDebugCanvas::save(SaveFlags flags) {
455 addDrawCommand(new Save(flags));
456 return true;
457}
458
459int SkDebugCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
460 SaveFlags flags) {
461 addDrawCommand(new SaveLayer(bounds, paint, flags));
462 return true;
463}
464
465bool SkDebugCanvas::scale(SkScalar sx, SkScalar sy) {
466 addDrawCommand(new Scale(sx, sy));
467 return true;
468}
469
470void SkDebugCanvas::setMatrix(const SkMatrix& matrix) {
471 addDrawCommand(new SetMatrix(matrix));
472}
473
474bool SkDebugCanvas::skew(SkScalar sx, SkScalar sy) {
475 addDrawCommand(new Skew(sx, sy));
476 return true;
477}
478
479bool SkDebugCanvas::translate(SkScalar dx, SkScalar dy) {
480 addDrawCommand(new Translate(dx, dy));
481 return true;
482}
483
chudy@google.com902ebe52012-06-29 14:21:22 +0000484void SkDebugCanvas::toggleCommand(int index, bool toggle) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000485 SkASSERT(index < fCommandVector.count());
486 fCommandVector[index]->setVisible(toggle);
chudy@google.com902ebe52012-06-29 14:21:22 +0000487}