blob: e491f3b8a79b9def06099794f8bd3582d3af4579 [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))
commit-bot@chromium.org1735d662013-12-04 13:42:46 +000025 , fWidth(width)
26 , fHeight(height)
27 , fFilter(false)
28 , fIndex(0)
robertphillips@google.comf4741c12013-02-06 20:13:54 +000029 , fOverdrawViz(false)
scroggo@google.com06d6ac62013-02-08 21:16:19 +000030 , fOverdrawFilter(NULL)
robertphillips@google.com32bbcf82013-10-17 17:56:10 +000031 , fOverrideTexFiltering(false)
32 , fTexOverrideFilter(NULL)
scroggo@google.com06d6ac62013-02-08 21:16:19 +000033 , fOutstandingSaveCount(0) {
bungeman@google.come8cc6e82013-01-17 16:30:56 +000034 fUserMatrix.reset();
robertphillips@google.com8b157172013-11-07 22:20:31 +000035
36 // SkPicturePlayback uses the base-class' quickReject calls to cull clipped
37 // operations. This can lead to problems in the debugger which expects all
38 // the operations in the captured skp to appear in the debug canvas. To
39 // circumvent this we create a wide open clip here (an empty clip rect
40 // is not sufficient).
41 // Internally, the SkRect passed to clipRect is converted to an SkIRect and
42 // rounded out. The following code creates a nearly maximal rect that will
43 // not get collapsed by the coming conversions (Due to precision loss the
44 // inset has to be surprisingly large).
45 SkIRect largeIRect = SkIRect::MakeLargest();
46 largeIRect.inset(1024, 1024);
robertphillips@google.com6c1e49a2013-11-10 15:08:45 +000047 SkRect large = SkRect::Make(largeIRect);
robertphillips@google.com8b157172013-11-07 22:20:31 +000048#ifdef SK_DEBUG
49 large.roundOut(&largeIRect);
50 SkASSERT(!largeIRect.isEmpty());
51#endif
52 INHERITED::clipRect(large, SkRegion::kReplace_Op, false);
chudy@google.com902ebe52012-06-29 14:21:22 +000053}
54
chudy@google.com9cda6f72012-08-07 15:08:33 +000055SkDebugCanvas::~SkDebugCanvas() {
robertphillips@google.com67baba42013-01-02 20:20:31 +000056 fCommandVector.deleteAll();
robertphillips@google.comf4741c12013-02-06 20:13:54 +000057 SkSafeUnref(fOverdrawFilter);
commit-bot@chromium.org1735d662013-12-04 13:42:46 +000058 SkSafeUnref(fTexOverrideFilter);
chudy@google.com9cda6f72012-08-07 15:08:33 +000059}
chudy@google.com902ebe52012-06-29 14:21:22 +000060
61void SkDebugCanvas::addDrawCommand(SkDrawCommand* command) {
robertphillips@google.com67baba42013-01-02 20:20:31 +000062 fCommandVector.push(command);
chudy@google.com902ebe52012-06-29 14:21:22 +000063}
64
65void SkDebugCanvas::draw(SkCanvas* canvas) {
commit-bot@chromium.org1735d662013-12-04 13:42:46 +000066 if (!fCommandVector.isEmpty()) {
67 drawTo(canvas, fCommandVector.count() - 1);
chudy@google.com902ebe52012-06-29 14:21:22 +000068 }
69}
70
chudy@google.com830b8792012-08-01 15:57:52 +000071void SkDebugCanvas::applyUserTransform(SkCanvas* canvas) {
bungeman@google.come8cc6e82013-01-17 16:30:56 +000072 canvas->concat(fUserMatrix);
chudy@google.com830b8792012-08-01 15:57:52 +000073}
74
75int SkDebugCanvas::getCommandAtPoint(int x, int y, int index) {
chudy@google.com0b5bbb02012-07-31 19:55:32 +000076 SkBitmap bitmap;
77 bitmap.setConfig(SkBitmap::kARGB_8888_Config, 1, 1);
78 bitmap.allocPixels();
chudy@google.com902ebe52012-06-29 14:21:22 +000079
chudy@google.com0b5bbb02012-07-31 19:55:32 +000080 SkCanvas canvas(bitmap);
robertphillips@google.com94acc702012-09-06 18:43:21 +000081 canvas.translate(SkIntToScalar(-x), SkIntToScalar(-y));
chudy@google.com830b8792012-08-01 15:57:52 +000082 applyUserTransform(&canvas);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000083
84 int layer = 0;
chudy@google.com751961d2012-07-31 20:07:42 +000085 SkColor prev = bitmap.getColor(0,0);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000086 for (int i = 0; i < index; i++) {
robertphillips@google.com67baba42013-01-02 20:20:31 +000087 if (fCommandVector[i]->isVisible()) {
88 fCommandVector[i]->execute(&canvas);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000089 }
90 if (prev != bitmap.getColor(0,0)) {
91 layer = i;
92 }
93 prev = bitmap.getColor(0,0);
94 }
95 return layer;
96}
97
bsalomon@google.com383e2342013-02-06 21:44:21 +000098static SkPMColor OverdrawXferModeProc(SkPMColor src, SkPMColor dst) {
robertphillips@google.comf4741c12013-02-06 20:13:54 +000099 // This table encodes the color progression of the overdraw visualization
100 static const SkPMColor gTable[] = {
101 SkPackARGB32(0x00, 0x00, 0x00, 0x00),
102 SkPackARGB32(0xFF, 128, 158, 255),
103 SkPackARGB32(0xFF, 170, 185, 212),
104 SkPackARGB32(0xFF, 213, 195, 170),
105 SkPackARGB32(0xFF, 255, 192, 127),
106 SkPackARGB32(0xFF, 255, 185, 85),
107 SkPackARGB32(0xFF, 255, 165, 42),
108 SkPackARGB32(0xFF, 255, 135, 0),
109 SkPackARGB32(0xFF, 255, 95, 0),
110 SkPackARGB32(0xFF, 255, 50, 0),
111 SkPackARGB32(0xFF, 255, 0, 0)
112 };
113
robertphillips@google.com0b256e12013-02-06 20:42:14 +0000114 for (size_t i = 0; i < SK_ARRAY_COUNT(gTable)-1; ++i) {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000115 if (gTable[i] == dst) {
116 return gTable[i+1];
117 }
118 }
119
120 return gTable[SK_ARRAY_COUNT(gTable)-1];
121}
122
123// The OverdrawFilter modifies every paint to use an SkProcXfermode which
124// in turn invokes OverdrawXferModeProc
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000125class SkOverdrawFilter : public SkDrawFilter {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000126public:
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000127 SkOverdrawFilter() {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000128 fXferMode = new SkProcXfermode(OverdrawXferModeProc);
129 }
130
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000131 virtual ~SkOverdrawFilter() {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000132 delete fXferMode;
133 }
134
135 virtual bool filter(SkPaint* p, Type) SK_OVERRIDE {
136 p->setXfermode(fXferMode);
137 return true;
138 }
139
140protected:
141 SkXfermode* fXferMode;
142
143private:
144 typedef SkDrawFilter INHERITED;
145};
146
skia.committer@gmail.comf84ad8f2013-10-18 07:01:59 +0000147// SkTexOverrideFilter modifies every paint to use the specified
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000148// texture filtering mode
149class SkTexOverrideFilter : public SkDrawFilter {
150public:
151 SkTexOverrideFilter() : fFilterLevel(SkPaint::kNone_FilterLevel) {
152 }
153
154 void setFilterLevel(SkPaint::FilterLevel filterLevel) {
155 fFilterLevel = filterLevel;
156 }
157
158 virtual bool filter(SkPaint* p, Type) SK_OVERRIDE {
159 p->setFilterLevel(fFilterLevel);
160 return true;
161 }
162
163protected:
164 SkPaint::FilterLevel fFilterLevel;
165
166private:
167 typedef SkDrawFilter INHERITED;
168};
169
chudy@google.com0b5bbb02012-07-31 19:55:32 +0000170void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000171 SkASSERT(!fCommandVector.isEmpty());
172 SkASSERT(index < fCommandVector.count());
commit-bot@chromium.org1735d662013-12-04 13:42:46 +0000173 int i = 0;
chudy@google.com830b8792012-08-01 15:57:52 +0000174
175 // This only works assuming the canvas and device are the same ones that
176 // were previously drawn into because they need to preserve all saves
177 // and restores.
commit-bot@chromium.org1735d662013-12-04 13:42:46 +0000178 // The visibility filter also requires a full re-draw - otherwise we can
179 // end up drawing the filter repeatedly.
180 if (fIndex < index && !fFilter) {
chudy@google.com830b8792012-08-01 15:57:52 +0000181 i = fIndex + 1;
182 } else {
tomhudson@google.com0699e022012-11-27 16:09:42 +0000183 for (int j = 0; j < fOutstandingSaveCount; j++) {
184 canvas->restore();
185 }
junov@google.comdbfac8a2012-12-06 21:47:40 +0000186 canvas->clear(SK_ColorTRANSPARENT);
chudy@google.com830b8792012-08-01 15:57:52 +0000187 canvas->resetMatrix();
skia.committer@gmail.com04ba4482012-09-07 02:01:30 +0000188 SkRect rect = SkRect::MakeWH(SkIntToScalar(fWidth),
robertphillips@google.com94acc702012-09-06 18:43:21 +0000189 SkIntToScalar(fHeight));
chudy@google.com4c7962e2012-08-14 19:38:31 +0000190 canvas->clipRect(rect, SkRegion::kReplace_Op );
chudy@google.com830b8792012-08-01 15:57:52 +0000191 applyUserTransform(canvas);
tomhudson@google.com0699e022012-11-27 16:09:42 +0000192 fOutstandingSaveCount = 0;
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000193 }
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000194
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000195 // The setting of the draw filter has to go here (rather than in
196 // SkRasterWidget) due to the canvas restores this class performs.
197 // Since the draw filter is stored in the layer stack if we
198 // call setDrawFilter on anything but the root layer odd things happen.
199 if (fOverdrawViz) {
200 if (NULL == fOverdrawFilter) {
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000201 fOverdrawFilter = new SkOverdrawFilter;
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000202 }
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000203
204 if (fOverdrawFilter != canvas->getDrawFilter()) {
205 canvas->setDrawFilter(fOverdrawFilter);
206 }
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000207 } else if (fOverrideTexFiltering) {
208 if (NULL == fTexOverrideFilter) {
209 fTexOverrideFilter = new SkTexOverrideFilter;
210 }
211
212 if (fTexOverrideFilter != canvas->getDrawFilter()) {
213 canvas->setDrawFilter(fTexOverrideFilter);
214 }
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000215 } else {
216 canvas->setDrawFilter(NULL);
chudy@google.com830b8792012-08-01 15:57:52 +0000217 }
218
219 for (; i <= index; i++) {
chudy@google.com0b5bbb02012-07-31 19:55:32 +0000220 if (i == index && fFilter) {
221 SkPaint p;
222 p.setColor(0xAAFFFFFF);
223 canvas->save();
224 canvas->resetMatrix();
225 SkRect mask;
226 mask.set(SkIntToScalar(0), SkIntToScalar(0),
227 SkIntToScalar(fWidth), SkIntToScalar(fHeight));
228 canvas->clipRect(mask, SkRegion::kReplace_Op, false);
229 canvas->drawRectCoords(SkIntToScalar(0), SkIntToScalar(0),
230 SkIntToScalar(fWidth), SkIntToScalar(fHeight), p);
231 canvas->restore();
232 }
233
robertphillips@google.com67baba42013-01-02 20:20:31 +0000234 if (fCommandVector[i]->isVisible()) {
235 fCommandVector[i]->execute(canvas);
236 fCommandVector[i]->trackSaveState(&fOutstandingSaveCount);
chudy@google.com902ebe52012-06-29 14:21:22 +0000237 }
238 }
chudy@google.coma9e937c2012-08-03 17:32:05 +0000239 fMatrix = canvas->getTotalMatrix();
240 fClip = canvas->getTotalClip().getBounds();
chudy@google.com830b8792012-08-01 15:57:52 +0000241 fIndex = index;
chudy@google.com902ebe52012-06-29 14:21:22 +0000242}
243
robertphillips@google.com50c84da2013-04-01 18:18:49 +0000244void SkDebugCanvas::deleteDrawCommandAt(int index) {
245 SkASSERT(index < fCommandVector.count());
246 delete fCommandVector[index];
247 fCommandVector.remove(index);
248}
249
chudy@google.com902ebe52012-06-29 14:21:22 +0000250SkDrawCommand* SkDebugCanvas::getDrawCommandAt(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000251 SkASSERT(index < fCommandVector.count());
252 return fCommandVector[index];
chudy@google.com902ebe52012-06-29 14:21:22 +0000253}
254
robertphillips@google.com50c84da2013-04-01 18:18:49 +0000255void SkDebugCanvas::setDrawCommandAt(int index, SkDrawCommand* command) {
256 SkASSERT(index < fCommandVector.count());
257 delete fCommandVector[index];
258 fCommandVector[index] = command;
259}
260
chudy@google.com97cee972012-08-07 20:41:37 +0000261SkTDArray<SkString*>* SkDebugCanvas::getCommandInfo(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000262 SkASSERT(index < fCommandVector.count());
263 return fCommandVector[index]->Info();
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000264}
chudy@google.com902ebe52012-06-29 14:21:22 +0000265
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000266bool SkDebugCanvas::getDrawCommandVisibilityAt(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000267 SkASSERT(index < fCommandVector.count());
268 return fCommandVector[index]->isVisible();
chudy@google.com902ebe52012-06-29 14:21:22 +0000269}
270
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000271const SkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() const {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000272 return fCommandVector;
chudy@google.com902ebe52012-06-29 14:21:22 +0000273}
274
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000275SkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() {
276 return fCommandVector;
277}
278
chudy@google.com902ebe52012-06-29 14:21:22 +0000279// TODO(chudy): Free command string memory.
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000280SkTArray<SkString>* SkDebugCanvas::getDrawCommandsAsStrings() const {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000281 SkTArray<SkString>* commandString = new SkTArray<SkString>(fCommandVector.count());
282 if (!fCommandVector.isEmpty()) {
283 for (int i = 0; i < fCommandVector.count(); i ++) {
284 commandString->push_back() = fCommandVector[i]->toString();
chudy@google.com902ebe52012-06-29 14:21:22 +0000285 }
286 }
287 return commandString;
288}
289
290void SkDebugCanvas::toggleFilter(bool toggle) {
291 fFilter = toggle;
292}
293
skia.committer@gmail.comf84ad8f2013-10-18 07:01:59 +0000294void SkDebugCanvas::overrideTexFiltering(bool overrideTexFiltering, SkPaint::FilterLevel level) {
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000295 if (NULL == fTexOverrideFilter) {
296 fTexOverrideFilter = new SkTexOverrideFilter;
297 }
298
skia.committer@gmail.comf84ad8f2013-10-18 07:01:59 +0000299 fOverrideTexFiltering = overrideTexFiltering;
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000300 fTexOverrideFilter->setFilterLevel(level);
301}
302
chudy@google.com902ebe52012-06-29 14:21:22 +0000303void SkDebugCanvas::clear(SkColor color) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000304 addDrawCommand(new SkClearCommand(color));
chudy@google.com902ebe52012-06-29 14:21:22 +0000305}
306
307bool SkDebugCanvas::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000308 addDrawCommand(new SkClipPathCommand(path, op, doAA));
chudy@google.com902ebe52012-06-29 14:21:22 +0000309 return true;
310}
311
312bool SkDebugCanvas::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000313 addDrawCommand(new SkClipRectCommand(rect, op, doAA));
chudy@google.com902ebe52012-06-29 14:21:22 +0000314 return true;
315}
316
robertphillips@google.com67baba42013-01-02 20:20:31 +0000317bool SkDebugCanvas::clipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000318 addDrawCommand(new SkClipRRectCommand(rrect, op, doAA));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000319 return true;
320}
321
chudy@google.com902ebe52012-06-29 14:21:22 +0000322bool SkDebugCanvas::clipRegion(const SkRegion& region, SkRegion::Op op) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000323 addDrawCommand(new SkClipRegionCommand(region, op));
chudy@google.com902ebe52012-06-29 14:21:22 +0000324 return true;
325}
326
327bool SkDebugCanvas::concat(const SkMatrix& matrix) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000328 addDrawCommand(new SkConcatCommand(matrix));
chudy@google.com902ebe52012-06-29 14:21:22 +0000329 return true;
330}
331
332void SkDebugCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar left,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000333 SkScalar top, const SkPaint* paint = NULL) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000334 addDrawCommand(new SkDrawBitmapCommand(bitmap, left, top, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000335}
336
reed@google.com71121732012-09-18 15:14:33 +0000337void SkDebugCanvas::drawBitmapRectToRect(const SkBitmap& bitmap,
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000338 const SkRect* src, const SkRect& dst,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000339 const SkPaint* paint,
340 SkCanvas::DrawBitmapRectFlags flags) {
341 addDrawCommand(new SkDrawBitmapRectCommand(bitmap, src, dst, paint, flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000342}
343
344void SkDebugCanvas::drawBitmapMatrix(const SkBitmap& bitmap,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000345 const SkMatrix& matrix, const SkPaint* paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000346 addDrawCommand(new SkDrawBitmapMatrixCommand(bitmap, matrix, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000347}
348
349void SkDebugCanvas::drawBitmapNine(const SkBitmap& bitmap,
350 const SkIRect& center, const SkRect& dst, const SkPaint* paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000351 addDrawCommand(new SkDrawBitmapNineCommand(bitmap, center, dst, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000352}
353
354void SkDebugCanvas::drawData(const void* data, size_t length) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000355 addDrawCommand(new SkDrawDataCommand(data, length));
chudy@google.com902ebe52012-06-29 14:21:22 +0000356}
357
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000358void SkDebugCanvas::beginCommentGroup(const char* description) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000359 addDrawCommand(new SkBeginCommentGroupCommand(description));
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000360}
361
362void SkDebugCanvas::addComment(const char* kywd, const char* value) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000363 addDrawCommand(new SkCommentCommand(kywd, value));
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000364}
365
366void SkDebugCanvas::endCommentGroup() {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000367 addDrawCommand(new SkEndCommentGroupCommand());
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000368}
369
robertphillips@google.com67baba42013-01-02 20:20:31 +0000370void SkDebugCanvas::drawOval(const SkRect& oval, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000371 addDrawCommand(new SkDrawOvalCommand(oval, paint));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000372}
373
chudy@google.com902ebe52012-06-29 14:21:22 +0000374void SkDebugCanvas::drawPaint(const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000375 addDrawCommand(new SkDrawPaintCommand(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000376}
377
bsalomon@google.com7ce564c2013-10-22 16:54:15 +0000378void SkDebugCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000379 addDrawCommand(new SkDrawPathCommand(path, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000380}
381
382void SkDebugCanvas::drawPicture(SkPicture& picture) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000383 addDrawCommand(new SkDrawPictureCommand(picture));
chudy@google.com902ebe52012-06-29 14:21:22 +0000384}
385
386void SkDebugCanvas::drawPoints(PointMode mode, size_t count,
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000387 const SkPoint pts[], const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000388 addDrawCommand(new SkDrawPointsCommand(mode, count, pts, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000389}
390
391void SkDebugCanvas::drawPosText(const void* text, size_t byteLength,
392 const SkPoint pos[], const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000393 addDrawCommand(new SkDrawPosTextCommand(text, byteLength, pos, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000394}
395
396void SkDebugCanvas::drawPosTextH(const void* text, size_t byteLength,
397 const SkScalar xpos[], SkScalar constY, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000398 addDrawCommand(
399 new SkDrawPosTextHCommand(text, byteLength, xpos, constY, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000400}
401
bsalomon@google.com7ce564c2013-10-22 16:54:15 +0000402void SkDebugCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000403 // NOTE(chudy): Messing up when renamed to DrawRect... Why?
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000404 addDrawCommand(new SkDrawRectCommand(rect, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000405}
406
robertphillips@google.com67baba42013-01-02 20:20:31 +0000407void SkDebugCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000408 addDrawCommand(new SkDrawRRectCommand(rrect, paint));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000409}
410
chudy@google.com902ebe52012-06-29 14:21:22 +0000411void SkDebugCanvas::drawSprite(const SkBitmap& bitmap, int left, int top,
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000412 const SkPaint* paint = NULL) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000413 addDrawCommand(new SkDrawSpriteCommand(bitmap, left, top, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000414}
415
416void SkDebugCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
417 SkScalar y, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000418 addDrawCommand(new SkDrawTextCommand(text, byteLength, x, y, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000419}
420
421void SkDebugCanvas::drawTextOnPath(const void* text, size_t byteLength,
422 const SkPath& path, const SkMatrix* matrix, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000423 addDrawCommand(
424 new SkDrawTextOnPathCommand(text, byteLength, path, matrix, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000425}
426
427void SkDebugCanvas::drawVertices(VertexMode vmode, int vertexCount,
428 const SkPoint vertices[], const SkPoint texs[], const SkColor colors[],
429 SkXfermode*, const uint16_t indices[], int indexCount,
430 const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000431 addDrawCommand(new SkDrawVerticesCommand(vmode, vertexCount, vertices,
432 texs, colors, NULL, indices, indexCount, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000433}
434
435void SkDebugCanvas::restore() {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000436 addDrawCommand(new SkRestoreCommand());
chudy@google.com902ebe52012-06-29 14:21:22 +0000437}
438
439bool SkDebugCanvas::rotate(SkScalar degrees) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000440 addDrawCommand(new SkRotateCommand(degrees));
chudy@google.com902ebe52012-06-29 14:21:22 +0000441 return true;
442}
443
444int SkDebugCanvas::save(SaveFlags flags) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000445 addDrawCommand(new SkSaveCommand(flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000446 return true;
447}
448
449int SkDebugCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
450 SaveFlags flags) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000451 addDrawCommand(new SkSaveLayerCommand(bounds, paint, flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000452 return true;
453}
454
455bool SkDebugCanvas::scale(SkScalar sx, SkScalar sy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000456 addDrawCommand(new SkScaleCommand(sx, sy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000457 return true;
458}
459
460void SkDebugCanvas::setMatrix(const SkMatrix& matrix) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000461 addDrawCommand(new SkSetMatrixCommand(matrix));
chudy@google.com902ebe52012-06-29 14:21:22 +0000462}
463
464bool SkDebugCanvas::skew(SkScalar sx, SkScalar sy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000465 addDrawCommand(new SkSkewCommand(sx, sy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000466 return true;
467}
468
469bool SkDebugCanvas::translate(SkScalar dx, SkScalar dy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000470 addDrawCommand(new SkTranslateCommand(dx, dy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000471 return true;
472}
473
chudy@google.com902ebe52012-06-29 14:21:22 +0000474void SkDebugCanvas::toggleCommand(int index, bool toggle) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000475 SkASSERT(index < fCommandVector.count());
476 fCommandVector[index]->setVisible(toggle);
chudy@google.com902ebe52012-06-29 14:21:22 +0000477}