blob: 1c3e26e6437248ea1e7673c822b99858e033289d [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;
reed@google.com9ebcac52014-01-24 18:53:42 +000077 bitmap.allocPixels(SkImageInfo::MakeN32Premul(1, 1));
chudy@google.com902ebe52012-06-29 14:21:22 +000078
chudy@google.com0b5bbb02012-07-31 19:55:32 +000079 SkCanvas canvas(bitmap);
robertphillips@google.com94acc702012-09-06 18:43:21 +000080 canvas.translate(SkIntToScalar(-x), SkIntToScalar(-y));
chudy@google.com830b8792012-08-01 15:57:52 +000081 applyUserTransform(&canvas);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000082
83 int layer = 0;
chudy@google.com751961d2012-07-31 20:07:42 +000084 SkColor prev = bitmap.getColor(0,0);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000085 for (int i = 0; i < index; i++) {
robertphillips@google.com67baba42013-01-02 20:20:31 +000086 if (fCommandVector[i]->isVisible()) {
87 fCommandVector[i]->execute(&canvas);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000088 }
89 if (prev != bitmap.getColor(0,0)) {
90 layer = i;
91 }
92 prev = bitmap.getColor(0,0);
93 }
94 return layer;
95}
96
bsalomon@google.com383e2342013-02-06 21:44:21 +000097static SkPMColor OverdrawXferModeProc(SkPMColor src, SkPMColor dst) {
robertphillips@google.comf4741c12013-02-06 20:13:54 +000098 // This table encodes the color progression of the overdraw visualization
99 static const SkPMColor gTable[] = {
100 SkPackARGB32(0x00, 0x00, 0x00, 0x00),
101 SkPackARGB32(0xFF, 128, 158, 255),
102 SkPackARGB32(0xFF, 170, 185, 212),
103 SkPackARGB32(0xFF, 213, 195, 170),
104 SkPackARGB32(0xFF, 255, 192, 127),
105 SkPackARGB32(0xFF, 255, 185, 85),
106 SkPackARGB32(0xFF, 255, 165, 42),
107 SkPackARGB32(0xFF, 255, 135, 0),
108 SkPackARGB32(0xFF, 255, 95, 0),
109 SkPackARGB32(0xFF, 255, 50, 0),
110 SkPackARGB32(0xFF, 255, 0, 0)
111 };
112
robertphillips@google.com0b256e12013-02-06 20:42:14 +0000113 for (size_t i = 0; i < SK_ARRAY_COUNT(gTable)-1; ++i) {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000114 if (gTable[i] == dst) {
115 return gTable[i+1];
116 }
117 }
118
119 return gTable[SK_ARRAY_COUNT(gTable)-1];
120}
121
122// The OverdrawFilter modifies every paint to use an SkProcXfermode which
123// in turn invokes OverdrawXferModeProc
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000124class SkOverdrawFilter : public SkDrawFilter {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000125public:
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000126 SkOverdrawFilter() {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000127 fXferMode = new SkProcXfermode(OverdrawXferModeProc);
128 }
129
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000130 virtual ~SkOverdrawFilter() {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000131 delete fXferMode;
132 }
133
134 virtual bool filter(SkPaint* p, Type) SK_OVERRIDE {
135 p->setXfermode(fXferMode);
136 return true;
137 }
138
139protected:
140 SkXfermode* fXferMode;
141
142private:
143 typedef SkDrawFilter INHERITED;
144};
145
skia.committer@gmail.comf84ad8f2013-10-18 07:01:59 +0000146// SkTexOverrideFilter modifies every paint to use the specified
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000147// texture filtering mode
148class SkTexOverrideFilter : public SkDrawFilter {
149public:
150 SkTexOverrideFilter() : fFilterLevel(SkPaint::kNone_FilterLevel) {
151 }
152
153 void setFilterLevel(SkPaint::FilterLevel filterLevel) {
154 fFilterLevel = filterLevel;
155 }
156
157 virtual bool filter(SkPaint* p, Type) SK_OVERRIDE {
158 p->setFilterLevel(fFilterLevel);
159 return true;
160 }
161
162protected:
163 SkPaint::FilterLevel fFilterLevel;
164
165private:
166 typedef SkDrawFilter INHERITED;
167};
168
chudy@google.com0b5bbb02012-07-31 19:55:32 +0000169void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000170 SkASSERT(!fCommandVector.isEmpty());
171 SkASSERT(index < fCommandVector.count());
commit-bot@chromium.org1735d662013-12-04 13:42:46 +0000172 int i = 0;
chudy@google.com830b8792012-08-01 15:57:52 +0000173
174 // This only works assuming the canvas and device are the same ones that
175 // were previously drawn into because they need to preserve all saves
176 // and restores.
commit-bot@chromium.org1735d662013-12-04 13:42:46 +0000177 // The visibility filter also requires a full re-draw - otherwise we can
178 // end up drawing the filter repeatedly.
179 if (fIndex < index && !fFilter) {
chudy@google.com830b8792012-08-01 15:57:52 +0000180 i = fIndex + 1;
181 } else {
tomhudson@google.com0699e022012-11-27 16:09:42 +0000182 for (int j = 0; j < fOutstandingSaveCount; j++) {
183 canvas->restore();
184 }
junov@google.comdbfac8a2012-12-06 21:47:40 +0000185 canvas->clear(SK_ColorTRANSPARENT);
chudy@google.com830b8792012-08-01 15:57:52 +0000186 canvas->resetMatrix();
skia.committer@gmail.com04ba4482012-09-07 02:01:30 +0000187 SkRect rect = SkRect::MakeWH(SkIntToScalar(fWidth),
robertphillips@google.com94acc702012-09-06 18:43:21 +0000188 SkIntToScalar(fHeight));
chudy@google.com4c7962e2012-08-14 19:38:31 +0000189 canvas->clipRect(rect, SkRegion::kReplace_Op );
chudy@google.com830b8792012-08-01 15:57:52 +0000190 applyUserTransform(canvas);
tomhudson@google.com0699e022012-11-27 16:09:42 +0000191 fOutstandingSaveCount = 0;
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000192 }
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000193
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000194 // The setting of the draw filter has to go here (rather than in
195 // SkRasterWidget) due to the canvas restores this class performs.
196 // Since the draw filter is stored in the layer stack if we
197 // call setDrawFilter on anything but the root layer odd things happen.
198 if (fOverdrawViz) {
199 if (NULL == fOverdrawFilter) {
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000200 fOverdrawFilter = new SkOverdrawFilter;
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000201 }
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000202
203 if (fOverdrawFilter != canvas->getDrawFilter()) {
204 canvas->setDrawFilter(fOverdrawFilter);
205 }
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000206 } else if (fOverrideTexFiltering) {
207 if (NULL == fTexOverrideFilter) {
208 fTexOverrideFilter = new SkTexOverrideFilter;
209 }
210
211 if (fTexOverrideFilter != canvas->getDrawFilter()) {
212 canvas->setDrawFilter(fTexOverrideFilter);
213 }
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000214 } else {
215 canvas->setDrawFilter(NULL);
chudy@google.com830b8792012-08-01 15:57:52 +0000216 }
217
218 for (; i <= index; i++) {
chudy@google.com0b5bbb02012-07-31 19:55:32 +0000219 if (i == index && fFilter) {
220 SkPaint p;
221 p.setColor(0xAAFFFFFF);
222 canvas->save();
223 canvas->resetMatrix();
224 SkRect mask;
225 mask.set(SkIntToScalar(0), SkIntToScalar(0),
226 SkIntToScalar(fWidth), SkIntToScalar(fHeight));
227 canvas->clipRect(mask, SkRegion::kReplace_Op, false);
228 canvas->drawRectCoords(SkIntToScalar(0), SkIntToScalar(0),
229 SkIntToScalar(fWidth), SkIntToScalar(fHeight), p);
230 canvas->restore();
231 }
232
robertphillips@google.com67baba42013-01-02 20:20:31 +0000233 if (fCommandVector[i]->isVisible()) {
234 fCommandVector[i]->execute(canvas);
235 fCommandVector[i]->trackSaveState(&fOutstandingSaveCount);
chudy@google.com902ebe52012-06-29 14:21:22 +0000236 }
237 }
chudy@google.coma9e937c2012-08-03 17:32:05 +0000238 fMatrix = canvas->getTotalMatrix();
239 fClip = canvas->getTotalClip().getBounds();
chudy@google.com830b8792012-08-01 15:57:52 +0000240 fIndex = index;
chudy@google.com902ebe52012-06-29 14:21:22 +0000241}
242
robertphillips@google.com50c84da2013-04-01 18:18:49 +0000243void SkDebugCanvas::deleteDrawCommandAt(int index) {
244 SkASSERT(index < fCommandVector.count());
245 delete fCommandVector[index];
246 fCommandVector.remove(index);
247}
248
chudy@google.com902ebe52012-06-29 14:21:22 +0000249SkDrawCommand* SkDebugCanvas::getDrawCommandAt(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000250 SkASSERT(index < fCommandVector.count());
251 return fCommandVector[index];
chudy@google.com902ebe52012-06-29 14:21:22 +0000252}
253
robertphillips@google.com50c84da2013-04-01 18:18:49 +0000254void SkDebugCanvas::setDrawCommandAt(int index, SkDrawCommand* command) {
255 SkASSERT(index < fCommandVector.count());
256 delete fCommandVector[index];
257 fCommandVector[index] = command;
258}
259
chudy@google.com97cee972012-08-07 20:41:37 +0000260SkTDArray<SkString*>* SkDebugCanvas::getCommandInfo(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000261 SkASSERT(index < fCommandVector.count());
262 return fCommandVector[index]->Info();
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000263}
chudy@google.com902ebe52012-06-29 14:21:22 +0000264
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000265bool SkDebugCanvas::getDrawCommandVisibilityAt(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000266 SkASSERT(index < fCommandVector.count());
267 return fCommandVector[index]->isVisible();
chudy@google.com902ebe52012-06-29 14:21:22 +0000268}
269
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000270const SkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() const {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000271 return fCommandVector;
chudy@google.com902ebe52012-06-29 14:21:22 +0000272}
273
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000274SkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() {
275 return fCommandVector;
276}
277
chudy@google.com902ebe52012-06-29 14:21:22 +0000278// TODO(chudy): Free command string memory.
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000279SkTArray<SkString>* SkDebugCanvas::getDrawCommandsAsStrings() const {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000280 SkTArray<SkString>* commandString = new SkTArray<SkString>(fCommandVector.count());
281 if (!fCommandVector.isEmpty()) {
282 for (int i = 0; i < fCommandVector.count(); i ++) {
283 commandString->push_back() = fCommandVector[i]->toString();
chudy@google.com902ebe52012-06-29 14:21:22 +0000284 }
285 }
286 return commandString;
287}
288
289void SkDebugCanvas::toggleFilter(bool toggle) {
290 fFilter = toggle;
291}
292
skia.committer@gmail.comf84ad8f2013-10-18 07:01:59 +0000293void SkDebugCanvas::overrideTexFiltering(bool overrideTexFiltering, SkPaint::FilterLevel level) {
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000294 if (NULL == fTexOverrideFilter) {
295 fTexOverrideFilter = new SkTexOverrideFilter;
296 }
297
skia.committer@gmail.comf84ad8f2013-10-18 07:01:59 +0000298 fOverrideTexFiltering = overrideTexFiltering;
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000299 fTexOverrideFilter->setFilterLevel(level);
300}
301
chudy@google.com902ebe52012-06-29 14:21:22 +0000302void SkDebugCanvas::clear(SkColor color) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000303 addDrawCommand(new SkClearCommand(color));
chudy@google.com902ebe52012-06-29 14:21:22 +0000304}
305
306bool SkDebugCanvas::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000307 addDrawCommand(new SkClipPathCommand(path, op, doAA));
chudy@google.com902ebe52012-06-29 14:21:22 +0000308 return true;
309}
310
311bool SkDebugCanvas::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000312 addDrawCommand(new SkClipRectCommand(rect, op, doAA));
chudy@google.com902ebe52012-06-29 14:21:22 +0000313 return true;
314}
315
robertphillips@google.com67baba42013-01-02 20:20:31 +0000316bool SkDebugCanvas::clipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000317 addDrawCommand(new SkClipRRectCommand(rrect, op, doAA));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000318 return true;
319}
320
chudy@google.com902ebe52012-06-29 14:21:22 +0000321bool SkDebugCanvas::clipRegion(const SkRegion& region, SkRegion::Op op) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000322 addDrawCommand(new SkClipRegionCommand(region, op));
chudy@google.com902ebe52012-06-29 14:21:22 +0000323 return true;
324}
325
326bool SkDebugCanvas::concat(const SkMatrix& matrix) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000327 addDrawCommand(new SkConcatCommand(matrix));
chudy@google.com902ebe52012-06-29 14:21:22 +0000328 return true;
329}
330
331void SkDebugCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar left,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000332 SkScalar top, const SkPaint* paint = NULL) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000333 addDrawCommand(new SkDrawBitmapCommand(bitmap, left, top, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000334}
335
reed@google.com71121732012-09-18 15:14:33 +0000336void SkDebugCanvas::drawBitmapRectToRect(const SkBitmap& bitmap,
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000337 const SkRect* src, const SkRect& dst,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000338 const SkPaint* paint,
339 SkCanvas::DrawBitmapRectFlags flags) {
340 addDrawCommand(new SkDrawBitmapRectCommand(bitmap, src, dst, paint, flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000341}
342
343void SkDebugCanvas::drawBitmapMatrix(const SkBitmap& bitmap,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000344 const SkMatrix& matrix, const SkPaint* paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000345 addDrawCommand(new SkDrawBitmapMatrixCommand(bitmap, matrix, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000346}
347
348void SkDebugCanvas::drawBitmapNine(const SkBitmap& bitmap,
349 const SkIRect& center, const SkRect& dst, const SkPaint* paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000350 addDrawCommand(new SkDrawBitmapNineCommand(bitmap, center, dst, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000351}
352
353void SkDebugCanvas::drawData(const void* data, size_t length) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000354 addDrawCommand(new SkDrawDataCommand(data, length));
chudy@google.com902ebe52012-06-29 14:21:22 +0000355}
356
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000357void SkDebugCanvas::beginCommentGroup(const char* description) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000358 addDrawCommand(new SkBeginCommentGroupCommand(description));
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000359}
360
361void SkDebugCanvas::addComment(const char* kywd, const char* value) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000362 addDrawCommand(new SkCommentCommand(kywd, value));
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000363}
364
365void SkDebugCanvas::endCommentGroup() {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000366 addDrawCommand(new SkEndCommentGroupCommand());
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000367}
368
robertphillips@google.com67baba42013-01-02 20:20:31 +0000369void SkDebugCanvas::drawOval(const SkRect& oval, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000370 addDrawCommand(new SkDrawOvalCommand(oval, paint));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000371}
372
chudy@google.com902ebe52012-06-29 14:21:22 +0000373void SkDebugCanvas::drawPaint(const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000374 addDrawCommand(new SkDrawPaintCommand(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000375}
376
bsalomon@google.com7ce564c2013-10-22 16:54:15 +0000377void SkDebugCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000378 addDrawCommand(new SkDrawPathCommand(path, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000379}
380
381void SkDebugCanvas::drawPicture(SkPicture& picture) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000382 addDrawCommand(new SkDrawPictureCommand(picture));
chudy@google.com902ebe52012-06-29 14:21:22 +0000383}
384
385void SkDebugCanvas::drawPoints(PointMode mode, size_t count,
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000386 const SkPoint pts[], const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000387 addDrawCommand(new SkDrawPointsCommand(mode, count, pts, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000388}
389
390void SkDebugCanvas::drawPosText(const void* text, size_t byteLength,
391 const SkPoint pos[], const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000392 addDrawCommand(new SkDrawPosTextCommand(text, byteLength, pos, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000393}
394
395void SkDebugCanvas::drawPosTextH(const void* text, size_t byteLength,
396 const SkScalar xpos[], SkScalar constY, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000397 addDrawCommand(
398 new SkDrawPosTextHCommand(text, byteLength, xpos, constY, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000399}
400
bsalomon@google.com7ce564c2013-10-22 16:54:15 +0000401void SkDebugCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000402 // NOTE(chudy): Messing up when renamed to DrawRect... Why?
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000403 addDrawCommand(new SkDrawRectCommand(rect, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000404}
405
robertphillips@google.com67baba42013-01-02 20:20:31 +0000406void SkDebugCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000407 addDrawCommand(new SkDrawRRectCommand(rrect, paint));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000408}
409
chudy@google.com902ebe52012-06-29 14:21:22 +0000410void SkDebugCanvas::drawSprite(const SkBitmap& bitmap, int left, int top,
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000411 const SkPaint* paint = NULL) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000412 addDrawCommand(new SkDrawSpriteCommand(bitmap, left, top, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000413}
414
415void SkDebugCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
416 SkScalar y, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000417 addDrawCommand(new SkDrawTextCommand(text, byteLength, x, y, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000418}
419
420void SkDebugCanvas::drawTextOnPath(const void* text, size_t byteLength,
421 const SkPath& path, const SkMatrix* matrix, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000422 addDrawCommand(
423 new SkDrawTextOnPathCommand(text, byteLength, path, matrix, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000424}
425
426void SkDebugCanvas::drawVertices(VertexMode vmode, int vertexCount,
427 const SkPoint vertices[], const SkPoint texs[], const SkColor colors[],
428 SkXfermode*, const uint16_t indices[], int indexCount,
429 const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000430 addDrawCommand(new SkDrawVerticesCommand(vmode, vertexCount, vertices,
431 texs, colors, NULL, indices, indexCount, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000432}
433
434void SkDebugCanvas::restore() {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000435 addDrawCommand(new SkRestoreCommand());
chudy@google.com902ebe52012-06-29 14:21:22 +0000436}
437
438bool SkDebugCanvas::rotate(SkScalar degrees) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000439 addDrawCommand(new SkRotateCommand(degrees));
chudy@google.com902ebe52012-06-29 14:21:22 +0000440 return true;
441}
442
443int SkDebugCanvas::save(SaveFlags flags) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000444 addDrawCommand(new SkSaveCommand(flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000445 return true;
446}
447
448int SkDebugCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
449 SaveFlags flags) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000450 addDrawCommand(new SkSaveLayerCommand(bounds, paint, flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000451 return true;
452}
453
454bool SkDebugCanvas::scale(SkScalar sx, SkScalar sy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000455 addDrawCommand(new SkScaleCommand(sx, sy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000456 return true;
457}
458
459void SkDebugCanvas::setMatrix(const SkMatrix& matrix) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000460 addDrawCommand(new SkSetMatrixCommand(matrix));
chudy@google.com902ebe52012-06-29 14:21:22 +0000461}
462
463bool SkDebugCanvas::skew(SkScalar sx, SkScalar sy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000464 addDrawCommand(new SkSkewCommand(sx, sy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000465 return true;
466}
467
468bool SkDebugCanvas::translate(SkScalar dx, SkScalar dy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000469 addDrawCommand(new SkTranslateCommand(dx, dy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000470 return true;
471}
472
chudy@google.com902ebe52012-06-29 14:21:22 +0000473void SkDebugCanvas::toggleCommand(int index, bool toggle) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000474 SkASSERT(index < fCommandVector.count());
475 fCommandVector[index]->setVisible(toggle);
chudy@google.com902ebe52012-06-29 14:21:22 +0000476}