blob: fedef697aa7b272199f88aad0a408df3aaec37c1 [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
robertphillips@google.com392c9be2014-02-28 14:35:45 +000046 // call the base class' version to avoid adding a draw command
47 this->INHERITED::onClipRect(large, SkRegion::kReplace_Op, kHard_ClipEdgeStyle);
chudy@google.com902ebe52012-06-29 14:21:22 +000048}
49
chudy@google.com9cda6f72012-08-07 15:08:33 +000050SkDebugCanvas::~SkDebugCanvas() {
robertphillips@google.com67baba42013-01-02 20:20:31 +000051 fCommandVector.deleteAll();
robertphillips@google.comf4741c12013-02-06 20:13:54 +000052 SkSafeUnref(fOverdrawFilter);
commit-bot@chromium.org1735d662013-12-04 13:42:46 +000053 SkSafeUnref(fTexOverrideFilter);
chudy@google.com9cda6f72012-08-07 15:08:33 +000054}
chudy@google.com902ebe52012-06-29 14:21:22 +000055
56void SkDebugCanvas::addDrawCommand(SkDrawCommand* command) {
robertphillips@google.com67baba42013-01-02 20:20:31 +000057 fCommandVector.push(command);
chudy@google.com902ebe52012-06-29 14:21:22 +000058}
59
60void SkDebugCanvas::draw(SkCanvas* canvas) {
commit-bot@chromium.org1735d662013-12-04 13:42:46 +000061 if (!fCommandVector.isEmpty()) {
62 drawTo(canvas, fCommandVector.count() - 1);
chudy@google.com902ebe52012-06-29 14:21:22 +000063 }
64}
65
chudy@google.com830b8792012-08-01 15:57:52 +000066void SkDebugCanvas::applyUserTransform(SkCanvas* canvas) {
bungeman@google.come8cc6e82013-01-17 16:30:56 +000067 canvas->concat(fUserMatrix);
chudy@google.com830b8792012-08-01 15:57:52 +000068}
69
70int SkDebugCanvas::getCommandAtPoint(int x, int y, int index) {
chudy@google.com0b5bbb02012-07-31 19:55:32 +000071 SkBitmap bitmap;
reed@google.com9ebcac52014-01-24 18:53:42 +000072 bitmap.allocPixels(SkImageInfo::MakeN32Premul(1, 1));
chudy@google.com902ebe52012-06-29 14:21:22 +000073
chudy@google.com0b5bbb02012-07-31 19:55:32 +000074 SkCanvas canvas(bitmap);
robertphillips@google.com94acc702012-09-06 18:43:21 +000075 canvas.translate(SkIntToScalar(-x), SkIntToScalar(-y));
chudy@google.com830b8792012-08-01 15:57:52 +000076 applyUserTransform(&canvas);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000077
78 int layer = 0;
chudy@google.com751961d2012-07-31 20:07:42 +000079 SkColor prev = bitmap.getColor(0,0);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000080 for (int i = 0; i < index; i++) {
robertphillips@google.com67baba42013-01-02 20:20:31 +000081 if (fCommandVector[i]->isVisible()) {
82 fCommandVector[i]->execute(&canvas);
chudy@google.com0b5bbb02012-07-31 19:55:32 +000083 }
84 if (prev != bitmap.getColor(0,0)) {
85 layer = i;
86 }
87 prev = bitmap.getColor(0,0);
88 }
89 return layer;
90}
91
bsalomon@google.com383e2342013-02-06 21:44:21 +000092static SkPMColor OverdrawXferModeProc(SkPMColor src, SkPMColor dst) {
robertphillips@google.comf4741c12013-02-06 20:13:54 +000093 // This table encodes the color progression of the overdraw visualization
94 static const SkPMColor gTable[] = {
95 SkPackARGB32(0x00, 0x00, 0x00, 0x00),
96 SkPackARGB32(0xFF, 128, 158, 255),
97 SkPackARGB32(0xFF, 170, 185, 212),
98 SkPackARGB32(0xFF, 213, 195, 170),
99 SkPackARGB32(0xFF, 255, 192, 127),
100 SkPackARGB32(0xFF, 255, 185, 85),
101 SkPackARGB32(0xFF, 255, 165, 42),
102 SkPackARGB32(0xFF, 255, 135, 0),
103 SkPackARGB32(0xFF, 255, 95, 0),
104 SkPackARGB32(0xFF, 255, 50, 0),
105 SkPackARGB32(0xFF, 255, 0, 0)
106 };
107
robertphillips@google.com0b256e12013-02-06 20:42:14 +0000108 for (size_t i = 0; i < SK_ARRAY_COUNT(gTable)-1; ++i) {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000109 if (gTable[i] == dst) {
110 return gTable[i+1];
111 }
112 }
113
114 return gTable[SK_ARRAY_COUNT(gTable)-1];
115}
116
117// The OverdrawFilter modifies every paint to use an SkProcXfermode which
118// in turn invokes OverdrawXferModeProc
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000119class SkOverdrawFilter : public SkDrawFilter {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000120public:
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000121 SkOverdrawFilter() {
commit-bot@chromium.org0a2bf902014-02-20 20:40:19 +0000122 fXferMode = SkProcXfermode::Create(OverdrawXferModeProc);
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000123 }
124
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000125 virtual ~SkOverdrawFilter() {
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000126 delete fXferMode;
127 }
128
129 virtual bool filter(SkPaint* p, Type) SK_OVERRIDE {
130 p->setXfermode(fXferMode);
131 return true;
132 }
133
134protected:
135 SkXfermode* fXferMode;
136
137private:
138 typedef SkDrawFilter INHERITED;
139};
140
skia.committer@gmail.comf84ad8f2013-10-18 07:01:59 +0000141// SkTexOverrideFilter modifies every paint to use the specified
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000142// texture filtering mode
143class SkTexOverrideFilter : public SkDrawFilter {
144public:
145 SkTexOverrideFilter() : fFilterLevel(SkPaint::kNone_FilterLevel) {
146 }
147
148 void setFilterLevel(SkPaint::FilterLevel filterLevel) {
149 fFilterLevel = filterLevel;
150 }
151
152 virtual bool filter(SkPaint* p, Type) SK_OVERRIDE {
153 p->setFilterLevel(fFilterLevel);
154 return true;
155 }
156
157protected:
158 SkPaint::FilterLevel fFilterLevel;
159
160private:
161 typedef SkDrawFilter INHERITED;
162};
163
chudy@google.com0b5bbb02012-07-31 19:55:32 +0000164void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000165 SkASSERT(!fCommandVector.isEmpty());
166 SkASSERT(index < fCommandVector.count());
commit-bot@chromium.org1735d662013-12-04 13:42:46 +0000167 int i = 0;
chudy@google.com830b8792012-08-01 15:57:52 +0000168
169 // This only works assuming the canvas and device are the same ones that
170 // were previously drawn into because they need to preserve all saves
171 // and restores.
commit-bot@chromium.org1735d662013-12-04 13:42:46 +0000172 // The visibility filter also requires a full re-draw - otherwise we can
173 // end up drawing the filter repeatedly.
174 if (fIndex < index && !fFilter) {
chudy@google.com830b8792012-08-01 15:57:52 +0000175 i = fIndex + 1;
176 } else {
tomhudson@google.com0699e022012-11-27 16:09:42 +0000177 for (int j = 0; j < fOutstandingSaveCount; j++) {
178 canvas->restore();
179 }
junov@google.comdbfac8a2012-12-06 21:47:40 +0000180 canvas->clear(SK_ColorTRANSPARENT);
chudy@google.com830b8792012-08-01 15:57:52 +0000181 canvas->resetMatrix();
skia.committer@gmail.com04ba4482012-09-07 02:01:30 +0000182 SkRect rect = SkRect::MakeWH(SkIntToScalar(fWidth),
robertphillips@google.com94acc702012-09-06 18:43:21 +0000183 SkIntToScalar(fHeight));
chudy@google.com4c7962e2012-08-14 19:38:31 +0000184 canvas->clipRect(rect, SkRegion::kReplace_Op );
chudy@google.com830b8792012-08-01 15:57:52 +0000185 applyUserTransform(canvas);
tomhudson@google.com0699e022012-11-27 16:09:42 +0000186 fOutstandingSaveCount = 0;
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000187 }
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000188
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000189 // The setting of the draw filter has to go here (rather than in
190 // SkRasterWidget) due to the canvas restores this class performs.
191 // Since the draw filter is stored in the layer stack if we
192 // call setDrawFilter on anything but the root layer odd things happen.
193 if (fOverdrawViz) {
194 if (NULL == fOverdrawFilter) {
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000195 fOverdrawFilter = new SkOverdrawFilter;
robertphillips@google.comf4741c12013-02-06 20:13:54 +0000196 }
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000197
198 if (fOverdrawFilter != canvas->getDrawFilter()) {
199 canvas->setDrawFilter(fOverdrawFilter);
200 }
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000201 } else if (fOverrideTexFiltering) {
202 if (NULL == fTexOverrideFilter) {
203 fTexOverrideFilter = new SkTexOverrideFilter;
204 }
205
206 if (fTexOverrideFilter != canvas->getDrawFilter()) {
207 canvas->setDrawFilter(fTexOverrideFilter);
208 }
commit-bot@chromium.orga27622c2013-08-05 16:31:27 +0000209 } else {
210 canvas->setDrawFilter(NULL);
chudy@google.com830b8792012-08-01 15:57:52 +0000211 }
212
213 for (; i <= index; i++) {
chudy@google.com0b5bbb02012-07-31 19:55:32 +0000214 if (i == index && fFilter) {
215 SkPaint p;
216 p.setColor(0xAAFFFFFF);
217 canvas->save();
218 canvas->resetMatrix();
219 SkRect mask;
220 mask.set(SkIntToScalar(0), SkIntToScalar(0),
221 SkIntToScalar(fWidth), SkIntToScalar(fHeight));
222 canvas->clipRect(mask, SkRegion::kReplace_Op, false);
223 canvas->drawRectCoords(SkIntToScalar(0), SkIntToScalar(0),
224 SkIntToScalar(fWidth), SkIntToScalar(fHeight), p);
225 canvas->restore();
226 }
227
robertphillips@google.com67baba42013-01-02 20:20:31 +0000228 if (fCommandVector[i]->isVisible()) {
229 fCommandVector[i]->execute(canvas);
230 fCommandVector[i]->trackSaveState(&fOutstandingSaveCount);
chudy@google.com902ebe52012-06-29 14:21:22 +0000231 }
232 }
chudy@google.coma9e937c2012-08-03 17:32:05 +0000233 fMatrix = canvas->getTotalMatrix();
234 fClip = canvas->getTotalClip().getBounds();
chudy@google.com830b8792012-08-01 15:57:52 +0000235 fIndex = index;
chudy@google.com902ebe52012-06-29 14:21:22 +0000236}
237
robertphillips@google.com50c84da2013-04-01 18:18:49 +0000238void SkDebugCanvas::deleteDrawCommandAt(int index) {
239 SkASSERT(index < fCommandVector.count());
240 delete fCommandVector[index];
241 fCommandVector.remove(index);
242}
243
chudy@google.com902ebe52012-06-29 14:21:22 +0000244SkDrawCommand* SkDebugCanvas::getDrawCommandAt(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000245 SkASSERT(index < fCommandVector.count());
246 return fCommandVector[index];
chudy@google.com902ebe52012-06-29 14:21:22 +0000247}
248
robertphillips@google.com50c84da2013-04-01 18:18:49 +0000249void SkDebugCanvas::setDrawCommandAt(int index, SkDrawCommand* command) {
250 SkASSERT(index < fCommandVector.count());
251 delete fCommandVector[index];
252 fCommandVector[index] = command;
253}
254
chudy@google.com97cee972012-08-07 20:41:37 +0000255SkTDArray<SkString*>* SkDebugCanvas::getCommandInfo(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000256 SkASSERT(index < fCommandVector.count());
257 return fCommandVector[index]->Info();
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000258}
chudy@google.com902ebe52012-06-29 14:21:22 +0000259
chudy@google.com7e4cfbf2012-07-17 15:40:51 +0000260bool SkDebugCanvas::getDrawCommandVisibilityAt(int index) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000261 SkASSERT(index < fCommandVector.count());
262 return fCommandVector[index]->isVisible();
chudy@google.com902ebe52012-06-29 14:21:22 +0000263}
264
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000265const SkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() const {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000266 return fCommandVector;
chudy@google.com902ebe52012-06-29 14:21:22 +0000267}
268
robertphillips@google.comfebc0ec2013-03-11 22:53:11 +0000269SkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() {
270 return fCommandVector;
271}
272
chudy@google.com902ebe52012-06-29 14:21:22 +0000273// TODO(chudy): Free command string memory.
robertphillips@google.com8a1cdae2012-11-19 20:44:29 +0000274SkTArray<SkString>* SkDebugCanvas::getDrawCommandsAsStrings() const {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000275 SkTArray<SkString>* commandString = new SkTArray<SkString>(fCommandVector.count());
276 if (!fCommandVector.isEmpty()) {
277 for (int i = 0; i < fCommandVector.count(); i ++) {
278 commandString->push_back() = fCommandVector[i]->toString();
chudy@google.com902ebe52012-06-29 14:21:22 +0000279 }
280 }
281 return commandString;
282}
283
284void SkDebugCanvas::toggleFilter(bool toggle) {
285 fFilter = toggle;
286}
287
skia.committer@gmail.comf84ad8f2013-10-18 07:01:59 +0000288void SkDebugCanvas::overrideTexFiltering(bool overrideTexFiltering, SkPaint::FilterLevel level) {
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000289 if (NULL == fTexOverrideFilter) {
290 fTexOverrideFilter = new SkTexOverrideFilter;
291 }
292
skia.committer@gmail.comf84ad8f2013-10-18 07:01:59 +0000293 fOverrideTexFiltering = overrideTexFiltering;
robertphillips@google.com32bbcf82013-10-17 17:56:10 +0000294 fTexOverrideFilter->setFilterLevel(level);
295}
296
chudy@google.com902ebe52012-06-29 14:21:22 +0000297void SkDebugCanvas::clear(SkColor color) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000298 addDrawCommand(new SkClearCommand(color));
chudy@google.com902ebe52012-06-29 14:21:22 +0000299}
300
robertphillips@google.com392c9be2014-02-28 14:35:45 +0000301void SkDebugCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
302 this->addDrawCommand(new SkClipPathCommand(path, op, kSoft_ClipEdgeStyle == edgeStyle));
chudy@google.com902ebe52012-06-29 14:21:22 +0000303}
304
robertphillips@google.com392c9be2014-02-28 14:35:45 +0000305void SkDebugCanvas::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
306 this->addDrawCommand(new SkClipRectCommand(rect, op, kSoft_ClipEdgeStyle == edgeStyle));
chudy@google.com902ebe52012-06-29 14:21:22 +0000307}
308
robertphillips@google.com392c9be2014-02-28 14:35:45 +0000309void SkDebugCanvas::onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
310 this->addDrawCommand(new SkClipRRectCommand(rrect, op, kSoft_ClipEdgeStyle == edgeStyle));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000311}
312
robertphillips@google.com392c9be2014-02-28 14:35:45 +0000313void SkDebugCanvas::onClipRegion(const SkRegion& region, SkRegion::Op op) {
314 this->addDrawCommand(new SkClipRegionCommand(region, op));
chudy@google.com902ebe52012-06-29 14:21:22 +0000315}
316
317bool SkDebugCanvas::concat(const SkMatrix& matrix) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000318 addDrawCommand(new SkConcatCommand(matrix));
chudy@google.com902ebe52012-06-29 14:21:22 +0000319 return true;
320}
321
322void SkDebugCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar left,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000323 SkScalar top, const SkPaint* paint = NULL) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000324 addDrawCommand(new SkDrawBitmapCommand(bitmap, left, top, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000325}
326
reed@google.com71121732012-09-18 15:14:33 +0000327void SkDebugCanvas::drawBitmapRectToRect(const SkBitmap& bitmap,
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000328 const SkRect* src, const SkRect& dst,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000329 const SkPaint* paint,
330 SkCanvas::DrawBitmapRectFlags flags) {
331 addDrawCommand(new SkDrawBitmapRectCommand(bitmap, src, dst, paint, flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000332}
333
334void SkDebugCanvas::drawBitmapMatrix(const SkBitmap& bitmap,
commit-bot@chromium.orgeed779d2013-08-16 10:24:37 +0000335 const SkMatrix& matrix, const SkPaint* paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000336 addDrawCommand(new SkDrawBitmapMatrixCommand(bitmap, matrix, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000337}
338
339void SkDebugCanvas::drawBitmapNine(const SkBitmap& bitmap,
340 const SkIRect& center, const SkRect& dst, const SkPaint* paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000341 addDrawCommand(new SkDrawBitmapNineCommand(bitmap, center, dst, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000342}
343
344void SkDebugCanvas::drawData(const void* data, size_t length) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000345 addDrawCommand(new SkDrawDataCommand(data, length));
chudy@google.com902ebe52012-06-29 14:21:22 +0000346}
347
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000348void SkDebugCanvas::beginCommentGroup(const char* description) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000349 addDrawCommand(new SkBeginCommentGroupCommand(description));
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000350}
351
352void SkDebugCanvas::addComment(const char* kywd, const char* value) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000353 addDrawCommand(new SkCommentCommand(kywd, value));
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000354}
355
356void SkDebugCanvas::endCommentGroup() {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000357 addDrawCommand(new SkEndCommentGroupCommand());
robertphillips@google.com0a4805e2013-05-29 13:24:23 +0000358}
359
robertphillips@google.com67baba42013-01-02 20:20:31 +0000360void SkDebugCanvas::drawOval(const SkRect& oval, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000361 addDrawCommand(new SkDrawOvalCommand(oval, paint));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000362}
363
chudy@google.com902ebe52012-06-29 14:21:22 +0000364void SkDebugCanvas::drawPaint(const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000365 addDrawCommand(new SkDrawPaintCommand(paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000366}
367
bsalomon@google.com7ce564c2013-10-22 16:54:15 +0000368void SkDebugCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000369 addDrawCommand(new SkDrawPathCommand(path, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000370}
371
372void SkDebugCanvas::drawPicture(SkPicture& picture) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000373 addDrawCommand(new SkDrawPictureCommand(picture));
chudy@google.com902ebe52012-06-29 14:21:22 +0000374}
375
376void SkDebugCanvas::drawPoints(PointMode mode, size_t count,
robertphillips@google.coma3a09ab2013-03-22 12:25:30 +0000377 const SkPoint pts[], const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000378 addDrawCommand(new SkDrawPointsCommand(mode, count, pts, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000379}
380
381void SkDebugCanvas::drawPosText(const void* text, size_t byteLength,
382 const SkPoint pos[], const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000383 addDrawCommand(new SkDrawPosTextCommand(text, byteLength, pos, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000384}
385
386void SkDebugCanvas::drawPosTextH(const void* text, size_t byteLength,
387 const SkScalar xpos[], SkScalar constY, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000388 addDrawCommand(
389 new SkDrawPosTextHCommand(text, byteLength, xpos, constY, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000390}
391
bsalomon@google.com7ce564c2013-10-22 16:54:15 +0000392void SkDebugCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
chudy@google.com902ebe52012-06-29 14:21:22 +0000393 // NOTE(chudy): Messing up when renamed to DrawRect... Why?
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000394 addDrawCommand(new SkDrawRectCommand(rect, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000395}
396
robertphillips@google.com67baba42013-01-02 20:20:31 +0000397void SkDebugCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000398 addDrawCommand(new SkDrawRRectCommand(rrect, paint));
robertphillips@google.com67baba42013-01-02 20:20:31 +0000399}
400
commit-bot@chromium.orgab582732014-02-21 12:20:45 +0000401void SkDebugCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner,
402 const SkPaint& paint) {
commit-bot@chromium.org3d305202014-02-24 17:28:55 +0000403 this->addDrawCommand(new SkDrawDRRectCommand(outer, inner, paint));
commit-bot@chromium.orgab582732014-02-21 12:20:45 +0000404}
405
chudy@google.com902ebe52012-06-29 14:21:22 +0000406void SkDebugCanvas::drawSprite(const SkBitmap& bitmap, int left, int top,
robertphillips@google.com6ede1fe2013-06-06 23:59:28 +0000407 const SkPaint* paint = NULL) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000408 addDrawCommand(new SkDrawSpriteCommand(bitmap, left, top, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000409}
410
411void SkDebugCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
412 SkScalar y, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000413 addDrawCommand(new SkDrawTextCommand(text, byteLength, x, y, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000414}
415
416void SkDebugCanvas::drawTextOnPath(const void* text, size_t byteLength,
417 const SkPath& path, const SkMatrix* matrix, const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000418 addDrawCommand(
419 new SkDrawTextOnPathCommand(text, byteLength, path, matrix, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000420}
421
422void SkDebugCanvas::drawVertices(VertexMode vmode, int vertexCount,
423 const SkPoint vertices[], const SkPoint texs[], const SkColor colors[],
424 SkXfermode*, const uint16_t indices[], int indexCount,
425 const SkPaint& paint) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000426 addDrawCommand(new SkDrawVerticesCommand(vmode, vertexCount, vertices,
427 texs, colors, NULL, indices, indexCount, paint));
chudy@google.com902ebe52012-06-29 14:21:22 +0000428}
429
commit-bot@chromium.org210ae2a2014-02-27 17:40:13 +0000430void SkDebugCanvas::onPushCull(const SkRect& cullRect) {
431 this->addDrawCommand(new SkPushCullCommand(cullRect));
432}
433
434void SkDebugCanvas::onPopCull() {
435 this->addDrawCommand(new SkPopCullCommand());
436}
437
chudy@google.com902ebe52012-06-29 14:21:22 +0000438void SkDebugCanvas::restore() {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000439 addDrawCommand(new SkRestoreCommand());
chudy@google.com902ebe52012-06-29 14:21:22 +0000440}
441
442bool SkDebugCanvas::rotate(SkScalar degrees) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000443 addDrawCommand(new SkRotateCommand(degrees));
chudy@google.com902ebe52012-06-29 14:21:22 +0000444 return true;
445}
446
447int SkDebugCanvas::save(SaveFlags flags) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000448 addDrawCommand(new SkSaveCommand(flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000449 return true;
450}
451
452int SkDebugCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
453 SaveFlags flags) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000454 addDrawCommand(new SkSaveLayerCommand(bounds, paint, flags));
chudy@google.com902ebe52012-06-29 14:21:22 +0000455 return true;
456}
457
458bool SkDebugCanvas::scale(SkScalar sx, SkScalar sy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000459 addDrawCommand(new SkScaleCommand(sx, sy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000460 return true;
461}
462
463void SkDebugCanvas::setMatrix(const SkMatrix& matrix) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000464 addDrawCommand(new SkSetMatrixCommand(matrix));
chudy@google.com902ebe52012-06-29 14:21:22 +0000465}
466
467bool SkDebugCanvas::skew(SkScalar sx, SkScalar sy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000468 addDrawCommand(new SkSkewCommand(sx, sy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000469 return true;
470}
471
472bool SkDebugCanvas::translate(SkScalar dx, SkScalar dy) {
commit-bot@chromium.org7a115912013-06-18 20:20:55 +0000473 addDrawCommand(new SkTranslateCommand(dx, dy));
chudy@google.com902ebe52012-06-29 14:21:22 +0000474 return true;
475}
476
chudy@google.com902ebe52012-06-29 14:21:22 +0000477void SkDebugCanvas::toggleCommand(int index, bool toggle) {
robertphillips@google.com67baba42013-01-02 20:20:31 +0000478 SkASSERT(index < fCommandVector.count());
479 fCommandVector[index]->setVisible(toggle);
chudy@google.com902ebe52012-06-29 14:21:22 +0000480}