blob: 5d6795313b88c4d1d5f4d21202ee2cb4a5814b0c [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
robertphillips@google.com50c84da2013-04-01 18:18:49 +0000210void SkDebugCanvas::deleteDrawCommandAt(int index) {
211 SkASSERT(index < fCommandVector.count());
212 delete fCommandVector[index];
213 fCommandVector.remove(index);
214}
215
chudy@google.com902ebe52012-06-29 14:21:22 +0000216SkDrawCommand* SkDebugCanvas::getDrawCommandAt(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000217 SkASSERT(index < fCommandVector.count());
218 return fCommandVector[index];
chudy@google.com902ebe52012-06-29 14:21:22 +0000219}
220
robertphillips@google.com50c84da2013-04-01 18:18:49 +0000221void SkDebugCanvas::setDrawCommandAt(int index, SkDrawCommand* command) {
222 SkASSERT(index < fCommandVector.count());
223 delete fCommandVector[index];
224 fCommandVector[index] = command;
225}
226
chudy@google.com97cee972012-08-07 20:41:37 +0000227SkTDArray<SkString*>* SkDebugCanvas::getCommandInfo(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000228 SkASSERT(index < fCommandVector.count());
229 return fCommandVector[index]->Info();
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000230}
chudy@google.com902ebe52012-06-29 14:21:22 +0000231
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000232bool SkDebugCanvas::getDrawCommandVisibilityAt(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000233 SkASSERT(index < fCommandVector.count());
234 return fCommandVector[index]->isVisible();
chudy@google.com902ebe52012-06-29 14:21:22 +0000235}
236
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000237const SkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() const {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000238 return fCommandVector;
chudy@google.com902ebe52012-06-29 14:21:22 +0000239}
240
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000241SkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() {
242 return fCommandVector;
243}
244
chudy@google.com902ebe52012-06-29 14:21:22 +0000245// TODO(chudy): Free command string memory.
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000246SkTArray<SkString>* SkDebugCanvas::getDrawCommandsAsStrings() const {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000247 SkTArray<SkString>* commandString = new SkTArray<SkString>(fCommandVector.count());
248 if (!fCommandVector.isEmpty()) {
249 for (int i = 0; i < fCommandVector.count(); i ++) {
250 commandString->push_back() = fCommandVector[i]->toString();
chudy@google.com902ebe52012-06-29 14:21:22 +0000251 }
252 }
253 return commandString;
254}
255
256void SkDebugCanvas::toggleFilter(bool toggle) {
257 fFilter = toggle;
258}
259
260void SkDebugCanvas::clear(SkColor color) {
261 addDrawCommand(new Clear(color));
262}
263
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +0000264static SkBitmap createBitmap(const SkPath& path) {
265 SkBitmap bitmap;
skia.committer@gmail.com1c9c0d32012-11-22 02:02:41 +0000266 bitmap.setConfig(SkBitmap::kARGB_8888_Config,
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000267 SkDebugCanvas::kVizImageWidth,
268 SkDebugCanvas::kVizImageHeight);
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +0000269 bitmap.allocPixels();
270 bitmap.eraseColor(SK_ColorWHITE);
271 SkDevice* device = new SkDevice(bitmap);
272
273 SkCanvas canvas(device);
274 device->unref();
275
276 const SkRect& bounds = path.getBounds();
277
278 if (bounds.width() > bounds.height()) {
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000279 canvas.scale(SkDoubleToScalar((0.9*SkDebugCanvas::kVizImageWidth)/bounds.width()),
280 SkDoubleToScalar((0.9*SkDebugCanvas::kVizImageHeight)/bounds.width()));
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +0000281 } else {
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000282 canvas.scale(SkDoubleToScalar((0.9*SkDebugCanvas::kVizImageWidth)/bounds.height()),
283 SkDoubleToScalar((0.9*SkDebugCanvas::kVizImageHeight)/bounds.height()));
robertphillips@google.com6dec8fc2012-11-21 17:11:02 +0000284 }
285 canvas.translate(-bounds.fLeft+2, -bounds.fTop+2);
286
287 SkPaint p;
288 p.setColor(SK_ColorBLACK);
289 p.setStyle(SkPaint::kStroke_Style);
290
291 canvas.drawPath(path, p);
292
293 return bitmap;
294}
295
robertphillips@google.com53ec73d2012-11-26 13:09:17 +0000296static SkBitmap createBitmap(const SkBitmap& input, const SkRect* srcRect) {
297 SkBitmap bitmap;
skia.committer@gmail.com8ccf5902012-11-27 02:01:19 +0000298 bitmap.setConfig(SkBitmap::kARGB_8888_Config,
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000299 SkDebugCanvas::kVizImageWidth,
300 SkDebugCanvas::kVizImageHeight);
robertphillips@google.com53ec73d2012-11-26 13:09:17 +0000301 bitmap.allocPixels();
302 bitmap.eraseColor(SK_ColorLTGRAY);
303 SkDevice* device = new SkDevice(bitmap);
304
305 SkCanvas canvas(device);
306 device->unref();
307
robertphillips@google.com3b0a9fe2013-01-31 15:56:22 +0000308 SkScalar xScale = SkIntToScalar(SkDebugCanvas::kVizImageWidth-2) / input.width();
309 SkScalar yScale = SkIntToScalar(SkDebugCanvas::kVizImageHeight-2) / input.height();
robertphillips@google.com53ec73d2012-11-26 13:09:17 +0000310
311 if (input.width() > input.height()) {
312 yScale *= input.height() / (float) input.width();
313 } else {
314 xScale *= input.width() / (float) input.height();
315 }
316
skia.committer@gmail.com8ccf5902012-11-27 02:01:19 +0000317 SkRect dst = SkRect::MakeXYWH(SK_Scalar1, SK_Scalar1,
robertphillips@google.com53ec73d2012-11-26 13:09:17 +0000318 xScale * input.width(),
319 yScale * input.height());
320
321 canvas.drawBitmapRect(input, NULL, dst);
322
323 if (NULL != srcRect) {
324 SkRect r = SkRect::MakeLTRB(srcRect->fLeft * xScale + SK_Scalar1,
325 srcRect->fTop * yScale + SK_Scalar1,
326 srcRect->fRight * xScale + SK_Scalar1,
327 srcRect->fBottom * yScale + SK_Scalar1);
328 SkPaint p;
329 p.setColor(SK_ColorRED);
330 p.setStyle(SkPaint::kStroke_Style);
331
332 canvas.drawRect(r, p);
333 }
334
335 return bitmap;
336}
337
chudy@google.com902ebe52012-06-29 14:21:22 +0000338bool SkDebugCanvas::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) {
rmistry@google.com44737652012-11-21 18:37:58 +0000339 SkBitmap bitmap = createBitmap(path);
340 addDrawCommand(new ClipPath(path, op, doAA, bitmap));
chudy@google.com902ebe52012-06-29 14:21:22 +0000341 return true;
342}
343
344bool SkDebugCanvas::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) {
345 addDrawCommand(new ClipRect(rect, op, doAA));
346 return true;
347}
348
robertphillips@google.com67baba42013-01-02 20:20:31 +0000349bool SkDebugCanvas::clipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA) {
350 addDrawCommand(new ClipRRect(rrect, op, doAA));
351 return true;
352}
353
chudy@google.com902ebe52012-06-29 14:21:22 +0000354bool SkDebugCanvas::clipRegion(const SkRegion& region, SkRegion::Op op) {
355 addDrawCommand(new ClipRegion(region, op));
356 return true;
357}
358
359bool SkDebugCanvas::concat(const SkMatrix& matrix) {
360 addDrawCommand(new Concat(matrix));
361 return true;
362}
363
364void SkDebugCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar left,
365 SkScalar top, const SkPaint* paint = NULL) {
robertphillips@google.com53ec73d2012-11-26 13:09:17 +0000366 SkBitmap resizedBitmap = createBitmap(bitmap, NULL);
367 addDrawCommand(new DrawBitmap(bitmap, left, top, paint, resizedBitmap));
chudy@google.com902ebe52012-06-29 14:21:22 +0000368}
369
reed@google.com71121732012-09-18 15:14:33 +0000370void SkDebugCanvas::drawBitmapRectToRect(const SkBitmap& bitmap,
371 const SkRect* src, const SkRect& dst, const SkPaint* paint) {
robertphillips@google.com53ec73d2012-11-26 13:09:17 +0000372 SkBitmap resizedBitmap = createBitmap(bitmap, src);
373 addDrawCommand(new DrawBitmapRect(bitmap, src, dst, paint, resizedBitmap));
chudy@google.com902ebe52012-06-29 14:21:22 +0000374}
375
376void SkDebugCanvas::drawBitmapMatrix(const SkBitmap& bitmap,
377 const SkMatrix& matrix, const SkPaint* paint) {
robertphillips@google.com53ec73d2012-11-26 13:09:17 +0000378 SkBitmap resizedBitmap = createBitmap(bitmap, NULL);
379 addDrawCommand(new DrawBitmapMatrix(bitmap, matrix, paint, resizedBitmap));
chudy@google.com902ebe52012-06-29 14:21:22 +0000380}
381
382void SkDebugCanvas::drawBitmapNine(const SkBitmap& bitmap,
383 const SkIRect& center, const SkRect& dst, const SkPaint* paint) {
robertphillips@google.com53ec73d2012-11-26 13:09:17 +0000384 SkBitmap resizedBitmap = createBitmap(bitmap, NULL);
385 addDrawCommand(new DrawBitmapNine(bitmap, center, dst, paint, resizedBitmap));
chudy@google.com902ebe52012-06-29 14:21:22 +0000386}
387
388void SkDebugCanvas::drawData(const void* data, size_t length) {
389 addDrawCommand(new DrawData(data, length));
390}
391
robertphillips@google.com67baba42013-01-02 20:20:31 +0000392void SkDebugCanvas::drawOval(const SkRect& oval, const SkPaint& paint) {
393 addDrawCommand(new DrawOval(oval, paint));
394}
395
chudy@google.com902ebe52012-06-29 14:21:22 +0000396void SkDebugCanvas::drawPaint(const SkPaint& paint) {
397 addDrawCommand(new DrawPaint(paint));
398}
399
400void SkDebugCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
rmistry@google.com44737652012-11-21 18:37:58 +0000401 SkBitmap bitmap = createBitmap(path);
402 addDrawCommand(new DrawPath(path, paint, bitmap));
chudy@google.com902ebe52012-06-29 14:21:22 +0000403}
404
405void SkDebugCanvas::drawPicture(SkPicture& picture) {
406 addDrawCommand(new DrawPicture(picture));
407}
408
409void SkDebugCanvas::drawPoints(PointMode mode, size_t count,
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000410 const SkPoint pts[], const SkPaint& paint) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000411 addDrawCommand(new DrawPoints(mode, count, pts, paint));
412}
413
414void SkDebugCanvas::drawPosText(const void* text, size_t byteLength,
415 const SkPoint pos[], const SkPaint& paint) {
416 addDrawCommand(new DrawPosText(text, byteLength, pos, paint));
417}
418
419void SkDebugCanvas::drawPosTextH(const void* text, size_t byteLength,
420 const SkScalar xpos[], SkScalar constY, const SkPaint& paint) {
421 addDrawCommand(new DrawPosTextH(text, byteLength, xpos, constY, paint));
422}
423
424void SkDebugCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
425 // NOTE(chudy): Messing up when renamed to DrawRect... Why?
426 addDrawCommand(new DrawRectC(rect, paint));
427}
428
robertphillips@google.com67baba42013-01-02 20:20:31 +0000429void SkDebugCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
430 addDrawCommand(new DrawRRect(rrect, paint));
431}
432
chudy@google.com902ebe52012-06-29 14:21:22 +0000433void SkDebugCanvas::drawSprite(const SkBitmap& bitmap, int left, int top,
434 const SkPaint* paint = NULL) {
robertphillips@google.com53ec73d2012-11-26 13:09:17 +0000435 SkBitmap resizedBitmap = createBitmap(bitmap, NULL);
436 addDrawCommand(new DrawSprite(bitmap, left, top, paint, resizedBitmap));
chudy@google.com902ebe52012-06-29 14:21:22 +0000437}
438
439void SkDebugCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
440 SkScalar y, const SkPaint& paint) {
441 addDrawCommand(new DrawTextC(text, byteLength, x, y, paint));
442}
443
444void SkDebugCanvas::drawTextOnPath(const void* text, size_t byteLength,
445 const SkPath& path, const SkMatrix* matrix, const SkPaint& paint) {
446 addDrawCommand(new DrawTextOnPath(text, byteLength, path, matrix, paint));
447}
448
449void SkDebugCanvas::drawVertices(VertexMode vmode, int vertexCount,
450 const SkPoint vertices[], const SkPoint texs[], const SkColor colors[],
451 SkXfermode*, const uint16_t indices[], int indexCount,
452 const SkPaint& paint) {
453 addDrawCommand(new DrawVertices(vmode, vertexCount, vertices, texs, colors,
454 NULL, indices, indexCount, paint));
455}
456
457void SkDebugCanvas::restore() {
458 addDrawCommand(new Restore());
459}
460
461bool SkDebugCanvas::rotate(SkScalar degrees) {
462 addDrawCommand(new Rotate(degrees));
463 return true;
464}
465
466int SkDebugCanvas::save(SaveFlags flags) {
467 addDrawCommand(new Save(flags));
468 return true;
469}
470
471int SkDebugCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
472 SaveFlags flags) {
473 addDrawCommand(new SaveLayer(bounds, paint, flags));
474 return true;
475}
476
477bool SkDebugCanvas::scale(SkScalar sx, SkScalar sy) {
478 addDrawCommand(new Scale(sx, sy));
479 return true;
480}
481
482void SkDebugCanvas::setMatrix(const SkMatrix& matrix) {
483 addDrawCommand(new SetMatrix(matrix));
484}
485
486bool SkDebugCanvas::skew(SkScalar sx, SkScalar sy) {
487 addDrawCommand(new Skew(sx, sy));
488 return true;
489}
490
491bool SkDebugCanvas::translate(SkScalar dx, SkScalar dy) {
492 addDrawCommand(new Translate(dx, dy));
493 return true;
494}
495
chudy@google.com902ebe52012-06-29 14:21:22 +0000496void SkDebugCanvas::toggleCommand(int index, bool toggle) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000497 SkASSERT(index < fCommandVector.count());
498 fCommandVector[index]->setVisible(toggle);
chudy@google.com902ebe52012-06-29 14:21:22 +0000499}