blob: 07cb09f381252b96c7ad229af03ef52995df814c [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 +000017SkDebugCanvas::SkDebugCanvas(int width, int height)
commit-bot@chromium.orge2543102014-01-31 19:42:58 +000018 : INHERITED(width, height)
commit-bot@chromium.org1735d662013-12-04 13:42:46 +000019 , fWidth(width)
20 , fHeight(height)
21 , fFilter(false)
22 , fIndex(0)
robertphillips@google.comf4741c12013-02-06 20:13:54 +000023 , fOverdrawViz(false)
scroggo@google.com06d6ac62013-02-08 21:16:19 +000024 , fOverdrawFilter(NULL)
robertphillips@google.com32bbcf82013-10-17 17:56:10 +000025 , fOverrideTexFiltering(false)
26 , fTexOverrideFilter(NULL)
scroggo@google.com06d6ac62013-02-08 21:16:19 +000027 , fOutstandingSaveCount(0) {
bungeman@google.come8cc6e82013-01-17 16:30:56 +000028 fUserMatrix.reset();
robertphillips@google.com8b157172013-11-07 22:20:31 +000029
30 // SkPicturePlayback uses the base-class' quickReject calls to cull clipped
31 // operations. This can lead to problems in the debugger which expects all
32 // the operations in the captured skp to appear in the debug canvas. To
33 // circumvent this we create a wide open clip here (an empty clip rect
34 // is not sufficient).
35 // Internally, the SkRect passed to clipRect is converted to an SkIRect and
36 // rounded out. The following code creates a nearly maximal rect that will
37 // not get collapsed by the coming conversions (Due to precision loss the
38 // inset has to be surprisingly large).
39 SkIRect largeIRect = SkIRect::MakeLargest();
40 largeIRect.inset(1024, 1024);
robertphillips@google.com6c1e49a2013-11-10 15:08:45 +000041 SkRect large = SkRect::Make(largeIRect);
robertphillips@google.com8b157172013-11-07 22:20:31 +000042#ifdef SK_DEBUG
43 large.roundOut(&largeIRect);
44 SkASSERT(!largeIRect.isEmpty());
45#endif
46 INHERITED::clipRect(large, SkRegion::kReplace_Op, false);
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);
commit-bot@chromium.org1735d662013-12-04 13:42:46 +000052 SkSafeUnref(fTexOverrideFilter);
chudy@google.com9cda6f72012-08-07 15:08:33 +000053}
chudy@google.com902ebe52012-06-29 14:21:22 +000054
55void SkDebugCanvas::addDrawCommand(SkDrawCommand* command) {
robertphillips@google.com67baba42013-01-02 20:20:31 +000056 fCommandVector.push(command);
chudy@google.com902ebe52012-06-29 14:21:22 +000057}
58
59void SkDebugCanvas::draw(SkCanvas* canvas) {
commit-bot@chromium.org1735d662013-12-04 13:42:46 +000060 if (!fCommandVector.isEmpty()) {
61 drawTo(canvas, fCommandVector.count() - 1);
chudy@google.com902ebe52012-06-29 14:21:22 +000062 }
63}
64
chudy@google.com830b8792012-08-01 15:57:52 +000065void SkDebugCanvas::applyUserTransform(SkCanvas* canvas) {
bungeman@google.come8cc6e82013-01-17 16:30:56 +000066 canvas->concat(fUserMatrix);
chudy@google.com830b8792012-08-01 15:57:52 +000067}
68
69int SkDebugCanvas::getCommandAtPoint(int x, int y, int index) {
chudy@google.com0b5bbb02012-07-31 19:55:32 +000070 SkBitmap bitmap;
reed@google.com9ebcac52014-01-24 18:53:42 +000071 bitmap.allocPixels(SkImageInfo::MakeN32Premul(1, 1));
chudy@google.com902ebe52012-06-29 14:21:22 +000072
chudy@google.com0b5bbb02012-07-31 19:55:32 +000073 SkCanvas canvas(bitmap);
robertphillips@google.com94acc702012-09-06 18:43:21 +000074 canvas.translate(SkIntToScalar(-x), SkIntToScalar(-y));
chudy@google.com830b8792012-08-01 15:57:52 +000075 applyUserTransform(&canvas);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000076
77 int layer = 0;
chudy@google.com751961d2012-07-31 20:07:42 +000078 SkColor prev = bitmap.getColor(0,0);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000079 for (int i = 0; i < index; i++) {
robertphillips@google.com67baba42013-01-02 20:20:31 +000080 if (fCommandVector[i]->isVisible()) {
81 fCommandVector[i]->execute(&canvas);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000082 }
83 if (prev != bitmap.getColor(0,0)) {
84 layer = i;
85 }
86 prev = bitmap.getColor(0,0);
87 }
88 return layer;
89}
90
bsalomon@google.com383e2342013-02-06 21:44:21 +000091static SkPMColor OverdrawXferModeProc(SkPMColor src, SkPMColor dst) {
robertphillips@google.comf4741c12013-02-06 20:13:54 +000092 // This table encodes the color progression of the overdraw visualization
93 static const SkPMColor gTable[] = {
94 SkPackARGB32(0x00, 0x00, 0x00, 0x00),
95 SkPackARGB32(0xFF, 128, 158, 255),
96 SkPackARGB32(0xFF, 170, 185, 212),
97 SkPackARGB32(0xFF, 213, 195, 170),
98 SkPackARGB32(0xFF, 255, 192, 127),
99 SkPackARGB32(0xFF, 255, 185, 85),
100 SkPackARGB32(0xFF, 255, 165, 42),
101 SkPackARGB32(0xFF, 255, 135, 0),
102 SkPackARGB32(0xFF, 255, 95, 0),
103 SkPackARGB32(0xFF, 255, 50, 0),
104 SkPackARGB32(0xFF, 255, 0, 0)
105 };
106
robertphillips@google.com0b256e12013-02-06 20:42:14 +0000107 for (size_t i = 0; i < SK_ARRAY_COUNT(gTable)-1; ++i) {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000108 if (gTable[i] == dst) {
109 return gTable[i+1];
110 }
111 }
112
113 return gTable[SK_ARRAY_COUNT(gTable)-1];
114}
115
116// The OverdrawFilter modifies every paint to use an SkProcXfermode which
117// in turn invokes OverdrawXferModeProc
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000118class SkOverdrawFilter : public SkDrawFilter {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000119public:
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000120 SkOverdrawFilter() {
commit-bot@chromium.org0a2bf902014-02-20 20:40:19 +0000121 fXferMode = SkProcXfermode::Create(OverdrawXferModeProc);
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000122 }
123
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000124 virtual ~SkOverdrawFilter() {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000125 delete fXferMode;
126 }
127
128 virtual bool filter(SkPaint* p, Type) SK_OVERRIDE {
129 p->setXfermode(fXferMode);
130 return true;
131 }
132
133protected:
134 SkXfermode* fXferMode;
135
136private:
137 typedef SkDrawFilter INHERITED;
138};
139
skia.committer@gmail.comf84ad8f2013-10-18 07:01:59 +0000140// SkTexOverrideFilter modifies every paint to use the specified
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000141// texture filtering mode
142class SkTexOverrideFilter : public SkDrawFilter {
143public:
144 SkTexOverrideFilter() : fFilterLevel(SkPaint::kNone_FilterLevel) {
145 }
146
147 void setFilterLevel(SkPaint::FilterLevel filterLevel) {
148 fFilterLevel = filterLevel;
149 }
150
151 virtual bool filter(SkPaint* p, Type) SK_OVERRIDE {
152 p->setFilterLevel(fFilterLevel);
153 return true;
154 }
155
156protected:
157 SkPaint::FilterLevel fFilterLevel;
158
159private:
160 typedef SkDrawFilter INHERITED;
161};
162
chudy@google.com0b5bbb02012-07-31 19:55:32 +0000163void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000164 SkASSERT(!fCommandVector.isEmpty());
165 SkASSERT(index < fCommandVector.count());
commit-bot@chromium.org1735d662013-12-04 13:42:46 +0000166 int i = 0;
chudy@google.com830b8792012-08-01 15:57:52 +0000167
168 // This only works assuming the canvas and device are the same ones that
169 // were previously drawn into because they need to preserve all saves
170 // and restores.
commit-bot@chromium.org1735d662013-12-04 13:42:46 +0000171 // The visibility filter also requires a full re-draw - otherwise we can
172 // end up drawing the filter repeatedly.
173 if (fIndex < index && !fFilter) {
chudy@google.com830b8792012-08-01 15:57:52 +0000174 i = fIndex + 1;
175 } else {
tomhudson@google.com0699e022012-11-27 16:09:42 +0000176 for (int j = 0; j < fOutstandingSaveCount; j++) {
177 canvas->restore();
178 }
junov@google.comdbfac8a2012-12-06 21:47:40 +0000179 canvas->clear(SK_ColorTRANSPARENT);
chudy@google.com830b8792012-08-01 15:57:52 +0000180 canvas->resetMatrix();
skia.committer@gmail.com04ba4482012-09-07 02:01:30 +0000181 SkRect rect = SkRect::MakeWH(SkIntToScalar(fWidth),
robertphillips@google.com94acc702012-09-06 18:43:21 +0000182 SkIntToScalar(fHeight));
chudy@google.com4c7962e2012-08-14 19:38:31 +0000183 canvas->clipRect(rect, SkRegion::kReplace_Op );
chudy@google.com830b8792012-08-01 15:57:52 +0000184 applyUserTransform(canvas);
tomhudson@google.com0699e022012-11-27 16:09:42 +0000185 fOutstandingSaveCount = 0;
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000186 }
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000187
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000188 // The setting of the draw filter has to go here (rather than in
189 // SkRasterWidget) due to the canvas restores this class performs.
190 // Since the draw filter is stored in the layer stack if we
191 // call setDrawFilter on anything but the root layer odd things happen.
192 if (fOverdrawViz) {
193 if (NULL == fOverdrawFilter) {
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000194 fOverdrawFilter = new SkOverdrawFilter;
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000195 }
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000196
197 if (fOverdrawFilter != canvas->getDrawFilter()) {
198 canvas->setDrawFilter(fOverdrawFilter);
199 }
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000200 } else if (fOverrideTexFiltering) {
201 if (NULL == fTexOverrideFilter) {
202 fTexOverrideFilter = new SkTexOverrideFilter;
203 }
204
205 if (fTexOverrideFilter != canvas->getDrawFilter()) {
206 canvas->setDrawFilter(fTexOverrideFilter);
207 }
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000208 } else {
209 canvas->setDrawFilter(NULL);
chudy@google.com830b8792012-08-01 15:57:52 +0000210 }
211
212 for (; i <= index; i++) {
chudy@google.com0b5bbb02012-07-31 19:55:32 +0000213 if (i == index && fFilter) {
214 SkPaint p;
215 p.setColor(0xAAFFFFFF);
216 canvas->save();
217 canvas->resetMatrix();
218 SkRect mask;
219 mask.set(SkIntToScalar(0), SkIntToScalar(0),
220 SkIntToScalar(fWidth), SkIntToScalar(fHeight));
221 canvas->clipRect(mask, SkRegion::kReplace_Op, false);
222 canvas->drawRectCoords(SkIntToScalar(0), SkIntToScalar(0),
223 SkIntToScalar(fWidth), SkIntToScalar(fHeight), p);
224 canvas->restore();
225 }
226
robertphillips@google.com67baba42013-01-02 20:20:31 +0000227 if (fCommandVector[i]->isVisible()) {
228 fCommandVector[i]->execute(canvas);
229 fCommandVector[i]->trackSaveState(&fOutstandingSaveCount);
chudy@google.com902ebe52012-06-29 14:21:22 +0000230 }
231 }
chudy@google.coma9e937c2012-08-03 17:32:05 +0000232 fMatrix = canvas->getTotalMatrix();
233 fClip = canvas->getTotalClip().getBounds();
chudy@google.com830b8792012-08-01 15:57:52 +0000234 fIndex = index;
chudy@google.com902ebe52012-06-29 14:21:22 +0000235}
236
robertphillips@google.com50c84da2013-04-01 18:18:49 +0000237void SkDebugCanvas::deleteDrawCommandAt(int index) {
238 SkASSERT(index < fCommandVector.count());
239 delete fCommandVector[index];
240 fCommandVector.remove(index);
241}
242
chudy@google.com902ebe52012-06-29 14:21:22 +0000243SkDrawCommand* SkDebugCanvas::getDrawCommandAt(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000244 SkASSERT(index < fCommandVector.count());
245 return fCommandVector[index];
chudy@google.com902ebe52012-06-29 14:21:22 +0000246}
247
robertphillips@google.com50c84da2013-04-01 18:18:49 +0000248void SkDebugCanvas::setDrawCommandAt(int index, SkDrawCommand* command) {
249 SkASSERT(index < fCommandVector.count());
250 delete fCommandVector[index];
251 fCommandVector[index] = command;
252}
253
chudy@google.com97cee972012-08-07 20:41:37 +0000254SkTDArray<SkString*>* SkDebugCanvas::getCommandInfo(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000255 SkASSERT(index < fCommandVector.count());
256 return fCommandVector[index]->Info();
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000257}
chudy@google.com902ebe52012-06-29 14:21:22 +0000258
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000259bool SkDebugCanvas::getDrawCommandVisibilityAt(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000260 SkASSERT(index < fCommandVector.count());
261 return fCommandVector[index]->isVisible();
chudy@google.com902ebe52012-06-29 14:21:22 +0000262}
263
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000264const SkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() const {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000265 return fCommandVector;
chudy@google.com902ebe52012-06-29 14:21:22 +0000266}
267
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000268SkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() {
269 return fCommandVector;
270}
271
chudy@google.com902ebe52012-06-29 14:21:22 +0000272// TODO(chudy): Free command string memory.
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000273SkTArray<SkString>* SkDebugCanvas::getDrawCommandsAsStrings() const {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000274 SkTArray<SkString>* commandString = new SkTArray<SkString>(fCommandVector.count());
275 if (!fCommandVector.isEmpty()) {
276 for (int i = 0; i < fCommandVector.count(); i ++) {
277 commandString->push_back() = fCommandVector[i]->toString();
chudy@google.com902ebe52012-06-29 14:21:22 +0000278 }
279 }
280 return commandString;
281}
282
283void SkDebugCanvas::toggleFilter(bool toggle) {
284 fFilter = toggle;
285}
286
skia.committer@gmail.comf84ad8f2013-10-18 07:01:59 +0000287void SkDebugCanvas::overrideTexFiltering(bool overrideTexFiltering, SkPaint::FilterLevel level) {
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000288 if (NULL == fTexOverrideFilter) {
289 fTexOverrideFilter = new SkTexOverrideFilter;
290 }
291
skia.committer@gmail.comf84ad8f2013-10-18 07:01:59 +0000292 fOverrideTexFiltering = overrideTexFiltering;
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000293 fTexOverrideFilter->setFilterLevel(level);
294}
295
chudy@google.com902ebe52012-06-29 14:21:22 +0000296void SkDebugCanvas::clear(SkColor color) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000297 addDrawCommand(new SkClearCommand(color));
chudy@google.com902ebe52012-06-29 14:21:22 +0000298}
299
300bool SkDebugCanvas::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000301 addDrawCommand(new SkClipPathCommand(path, op, doAA));
chudy@google.com902ebe52012-06-29 14:21:22 +0000302 return true;
303}
304
305bool SkDebugCanvas::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000306 addDrawCommand(new SkClipRectCommand(rect, op, doAA));
chudy@google.com902ebe52012-06-29 14:21:22 +0000307 return true;
308}
309
robertphillips@google.com67baba42013-01-02 20:20:31 +0000310bool SkDebugCanvas::clipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000311 addDrawCommand(new SkClipRRectCommand(rrect, op, doAA));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000312 return true;
313}
314
chudy@google.com902ebe52012-06-29 14:21:22 +0000315bool SkDebugCanvas::clipRegion(const SkRegion& region, SkRegion::Op op) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000316 addDrawCommand(new SkClipRegionCommand(region, op));
chudy@google.com902ebe52012-06-29 14:21:22 +0000317 return true;
318}
319
320bool SkDebugCanvas::concat(const SkMatrix& matrix) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000321 addDrawCommand(new SkConcatCommand(matrix));
chudy@google.com902ebe52012-06-29 14:21:22 +0000322 return true;
323}
324
325void SkDebugCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar left,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000326 SkScalar top, const SkPaint* paint = NULL) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000327 addDrawCommand(new SkDrawBitmapCommand(bitmap, left, top, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000328}
329
reed@google.com71121732012-09-18 15:14:33 +0000330void SkDebugCanvas::drawBitmapRectToRect(const SkBitmap& bitmap,
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000331 const SkRect* src, const SkRect& dst,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000332 const SkPaint* paint,
333 SkCanvas::DrawBitmapRectFlags flags) {
334 addDrawCommand(new SkDrawBitmapRectCommand(bitmap, src, dst, paint, flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000335}
336
337void SkDebugCanvas::drawBitmapMatrix(const SkBitmap& bitmap,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000338 const SkMatrix& matrix, const SkPaint* paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000339 addDrawCommand(new SkDrawBitmapMatrixCommand(bitmap, matrix, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000340}
341
342void SkDebugCanvas::drawBitmapNine(const SkBitmap& bitmap,
343 const SkIRect& center, const SkRect& dst, const SkPaint* paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000344 addDrawCommand(new SkDrawBitmapNineCommand(bitmap, center, dst, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000345}
346
347void SkDebugCanvas::drawData(const void* data, size_t length) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000348 addDrawCommand(new SkDrawDataCommand(data, length));
chudy@google.com902ebe52012-06-29 14:21:22 +0000349}
350
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000351void SkDebugCanvas::beginCommentGroup(const char* description) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000352 addDrawCommand(new SkBeginCommentGroupCommand(description));
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000353}
354
355void SkDebugCanvas::addComment(const char* kywd, const char* value) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000356 addDrawCommand(new SkCommentCommand(kywd, value));
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000357}
358
359void SkDebugCanvas::endCommentGroup() {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000360 addDrawCommand(new SkEndCommentGroupCommand());
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000361}
362
robertphillips@google.com67baba42013-01-02 20:20:31 +0000363void SkDebugCanvas::drawOval(const SkRect& oval, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000364 addDrawCommand(new SkDrawOvalCommand(oval, paint));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000365}
366
chudy@google.com902ebe52012-06-29 14:21:22 +0000367void SkDebugCanvas::drawPaint(const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000368 addDrawCommand(new SkDrawPaintCommand(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000369}
370
bsalomon@google.com7ce564c2013-10-22 16:54:15 +0000371void SkDebugCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000372 addDrawCommand(new SkDrawPathCommand(path, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000373}
374
375void SkDebugCanvas::drawPicture(SkPicture& picture) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000376 addDrawCommand(new SkDrawPictureCommand(picture));
chudy@google.com902ebe52012-06-29 14:21:22 +0000377}
378
379void SkDebugCanvas::drawPoints(PointMode mode, size_t count,
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000380 const SkPoint pts[], const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000381 addDrawCommand(new SkDrawPointsCommand(mode, count, pts, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000382}
383
384void SkDebugCanvas::drawPosText(const void* text, size_t byteLength,
385 const SkPoint pos[], const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000386 addDrawCommand(new SkDrawPosTextCommand(text, byteLength, pos, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000387}
388
389void SkDebugCanvas::drawPosTextH(const void* text, size_t byteLength,
390 const SkScalar xpos[], SkScalar constY, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000391 addDrawCommand(
392 new SkDrawPosTextHCommand(text, byteLength, xpos, constY, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000393}
394
bsalomon@google.com7ce564c2013-10-22 16:54:15 +0000395void SkDebugCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000396 // NOTE(chudy): Messing up when renamed to DrawRect... Why?
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000397 addDrawCommand(new SkDrawRectCommand(rect, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000398}
399
robertphillips@google.com67baba42013-01-02 20:20:31 +0000400void SkDebugCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000401 addDrawCommand(new SkDrawRRectCommand(rrect, paint));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000402}
403
chudy@google.com902ebe52012-06-29 14:21:22 +0000404void SkDebugCanvas::drawSprite(const SkBitmap& bitmap, int left, int top,
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000405 const SkPaint* paint = NULL) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000406 addDrawCommand(new SkDrawSpriteCommand(bitmap, left, top, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000407}
408
409void SkDebugCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
410 SkScalar y, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000411 addDrawCommand(new SkDrawTextCommand(text, byteLength, x, y, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000412}
413
414void SkDebugCanvas::drawTextOnPath(const void* text, size_t byteLength,
415 const SkPath& path, const SkMatrix* matrix, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000416 addDrawCommand(
417 new SkDrawTextOnPathCommand(text, byteLength, path, matrix, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000418}
419
420void SkDebugCanvas::drawVertices(VertexMode vmode, int vertexCount,
421 const SkPoint vertices[], const SkPoint texs[], const SkColor colors[],
422 SkXfermode*, const uint16_t indices[], int indexCount,
423 const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000424 addDrawCommand(new SkDrawVerticesCommand(vmode, vertexCount, vertices,
425 texs, colors, NULL, indices, indexCount, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000426}
427
428void SkDebugCanvas::restore() {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000429 addDrawCommand(new SkRestoreCommand());
chudy@google.com902ebe52012-06-29 14:21:22 +0000430}
431
432bool SkDebugCanvas::rotate(SkScalar degrees) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000433 addDrawCommand(new SkRotateCommand(degrees));
chudy@google.com902ebe52012-06-29 14:21:22 +0000434 return true;
435}
436
437int SkDebugCanvas::save(SaveFlags flags) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000438 addDrawCommand(new SkSaveCommand(flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000439 return true;
440}
441
442int SkDebugCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
443 SaveFlags flags) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000444 addDrawCommand(new SkSaveLayerCommand(bounds, paint, flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000445 return true;
446}
447
448bool SkDebugCanvas::scale(SkScalar sx, SkScalar sy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000449 addDrawCommand(new SkScaleCommand(sx, sy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000450 return true;
451}
452
453void SkDebugCanvas::setMatrix(const SkMatrix& matrix) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000454 addDrawCommand(new SkSetMatrixCommand(matrix));
chudy@google.com902ebe52012-06-29 14:21:22 +0000455}
456
457bool SkDebugCanvas::skew(SkScalar sx, SkScalar sy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000458 addDrawCommand(new SkSkewCommand(sx, sy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000459 return true;
460}
461
462bool SkDebugCanvas::translate(SkScalar dx, SkScalar dy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000463 addDrawCommand(new SkTranslateCommand(dx, dy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000464 return true;
465}
466
chudy@google.com902ebe52012-06-29 14:21:22 +0000467void SkDebugCanvas::toggleCommand(int index, bool toggle) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000468 SkASSERT(index < fCommandVector.count());
469 fCommandVector[index]->setVisible(toggle);
chudy@google.com902ebe52012-06-29 14:21:22 +0000470}