blob: 40eb21f1ffbbc2589feb5038e8aebcf3b7d94660 [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
10#include <iostream>
11#include "SkDebugCanvas.h"
12#include "SkDrawCommand.h"
13
14SkDebugCanvas::SkDebugCanvas() {
15 // TODO(chudy): Free up memory from all draw commands in destructor.
16 int width = 100;
17 int height = 100;
18 fBm.setConfig(SkBitmap::kNo_Config, width, height);
19 this->setBitmapDevice(fBm);
20 fFilter = false;
21}
22
23SkDebugCanvas::~SkDebugCanvas() {}
24
25void SkDebugCanvas::addDrawCommand(SkDrawCommand* command) {
26 commandVector.push_back(command);
27}
28
29void SkDebugCanvas::draw(SkCanvas* canvas) {
30 if(!commandVector.empty()) {
31 for(it = commandVector.begin(); it != commandVector.end(); ++it) {
32 (*it)->execute(canvas);
33 }
34 }
35}
36
37void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) {
38 int counter = 0;
39 if(!commandVector.empty()) {
40 for(it = commandVector.begin(); it != commandVector.end(); ++it) {
41 if (counter != (index-1)) {
42 if ((*it)->getVisibility()) {
43 (*it)->execute(canvas);
44 }
45 } else {
46 if (fFilter) {
47 SkPaint* p = new SkPaint();
48 p->setColor(0xAAFFFFFF);
49 canvas->save();
50 canvas->resetMatrix();
51 SkRect dump;
52 // TODO(chudy): Replace with a call to QtWidget to get dimensions.
53 dump.set(SkIntToScalar(0), SkIntToScalar(0), SkIntToScalar(800), SkIntToScalar(800));
54 canvas->clipRect(dump, SkRegion::kReplace_Op, false );
55 canvas->drawRectCoords(SkIntToScalar(0),SkIntToScalar(0),SkIntToScalar(800),SkIntToScalar(800), *p);
56 canvas->restore();
57 }
58
59 if ((*it)->getVisibility()) {
60 (*it)->execute(canvas);
61 }
62 }
63
64 /* TODO(chudy): Implement a bitmap wide function that will take
65 * ~50 out of each R,G,B. This will make everything but the last
66 * command brighter.
67 */
68 if (++counter == index) return;
69 }
70 }
71}
72
73SkDrawCommand* SkDebugCanvas::getDrawCommandAt(int index) {
74 int counter = 0;
75 if(!commandVector.empty()) {
76 for(it = commandVector.begin(); it != commandVector.end(); ++it) {
77 if (counter==index) {
78 return (*it);
79 }
80 ++counter;
81 }
82 }
83 return NULL;
84}
85
86std::vector<std::string>* SkDebugCanvas::getCommandInfoAt(int index) {
87 std::string info;
88
89 int counter = 0;
90 if(!commandVector.empty()) {
91 for(it = commandVector.begin(); it != commandVector.end(); ++it) {
92 if (counter==index) {
93 return (*it)->Info();
94 }
95 ++counter;
96 }
97 }
98
99 return NULL;
100}
101
102std::vector<SkDrawCommand*> SkDebugCanvas::getDrawCommands() {
103 return commandVector;
104}
105
106// TODO(chudy): Free command string memory.
107std::vector<std::string>* SkDebugCanvas::getDrawCommandsAsStrings() {
108 std::vector<std::string>* commandString = new std::vector<std::string>();
109 if (!commandVector.empty()) {
110 for(it = commandVector.begin(); it != commandVector.end(); ++it) {
111 commandString->push_back((*it)->toString());
112 }
113 }
114 return commandString;
115}
116
117void SkDebugCanvas::toggleFilter(bool toggle) {
118 fFilter = toggle;
119}
120
121void SkDebugCanvas::clear(SkColor color) {
122 addDrawCommand(new Clear(color));
123}
124
125bool SkDebugCanvas::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) {
126 addDrawCommand(new ClipPath(path, op, doAA));
127 return true;
128}
129
130bool SkDebugCanvas::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) {
131 addDrawCommand(new ClipRect(rect, op, doAA));
132 return true;
133}
134
135bool SkDebugCanvas::clipRegion(const SkRegion& region, SkRegion::Op op) {
136 addDrawCommand(new ClipRegion(region, op));
137 return true;
138}
139
140bool SkDebugCanvas::concat(const SkMatrix& matrix) {
141 addDrawCommand(new Concat(matrix));
142 return true;
143}
144
145void SkDebugCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar left,
146 SkScalar top, const SkPaint* paint = NULL) {
147 addDrawCommand(new DrawBitmap(bitmap, left, top, paint));
148}
149
150void SkDebugCanvas::drawBitmapRect(const SkBitmap& bitmap,
151 const SkIRect* src, const SkRect& dst, const SkPaint* paint) {
152 addDrawCommand(new DrawBitmapRect(bitmap, src, dst, paint));
153}
154
155void SkDebugCanvas::drawBitmapMatrix(const SkBitmap& bitmap,
156 const SkMatrix& matrix, const SkPaint* paint) {
157 addDrawCommand(new DrawBitmapMatrix(bitmap, matrix, paint));
158}
159
160void SkDebugCanvas::drawBitmapNine(const SkBitmap& bitmap,
161 const SkIRect& center, const SkRect& dst, const SkPaint* paint) {
162 addDrawCommand(new DrawBitmapNine(bitmap, center, dst, paint));
163}
164
165void SkDebugCanvas::drawData(const void* data, size_t length) {
166 addDrawCommand(new DrawData(data, length));
167}
168
169void SkDebugCanvas::drawPaint(const SkPaint& paint) {
170 addDrawCommand(new DrawPaint(paint));
171}
172
173void SkDebugCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
174 addDrawCommand(new DrawPath(path, paint));
175}
176
177void SkDebugCanvas::drawPicture(SkPicture& picture) {
178 addDrawCommand(new DrawPicture(picture));
179}
180
181void SkDebugCanvas::drawPoints(PointMode mode, size_t count,
182 const SkPoint pts[], const SkPaint& paint) {
183 addDrawCommand(new DrawPoints(mode, count, pts, paint));
184}
185
186void SkDebugCanvas::drawPosText(const void* text, size_t byteLength,
187 const SkPoint pos[], const SkPaint& paint) {
188 addDrawCommand(new DrawPosText(text, byteLength, pos, paint));
189}
190
191void SkDebugCanvas::drawPosTextH(const void* text, size_t byteLength,
192 const SkScalar xpos[], SkScalar constY, const SkPaint& paint) {
193 addDrawCommand(new DrawPosTextH(text, byteLength, xpos, constY, paint));
194}
195
196void SkDebugCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
197 // NOTE(chudy): Messing up when renamed to DrawRect... Why?
198 addDrawCommand(new DrawRectC(rect, paint));
199}
200
201void SkDebugCanvas::drawSprite(const SkBitmap& bitmap, int left, int top,
202 const SkPaint* paint = NULL) {
203 addDrawCommand(new DrawSprite(bitmap, left, top, paint));
204}
205
206void SkDebugCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
207 SkScalar y, const SkPaint& paint) {
208 addDrawCommand(new DrawTextC(text, byteLength, x, y, paint));
209}
210
211void SkDebugCanvas::drawTextOnPath(const void* text, size_t byteLength,
212 const SkPath& path, const SkMatrix* matrix, const SkPaint& paint) {
213 addDrawCommand(new DrawTextOnPath(text, byteLength, path, matrix, paint));
214}
215
216void SkDebugCanvas::drawVertices(VertexMode vmode, int vertexCount,
217 const SkPoint vertices[], const SkPoint texs[], const SkColor colors[],
218 SkXfermode*, const uint16_t indices[], int indexCount,
219 const SkPaint& paint) {
220 addDrawCommand(new DrawVertices(vmode, vertexCount, vertices, texs, colors,
221 NULL, indices, indexCount, paint));
222}
223
224void SkDebugCanvas::restore() {
225 addDrawCommand(new Restore());
226}
227
228bool SkDebugCanvas::rotate(SkScalar degrees) {
229 addDrawCommand(new Rotate(degrees));
230 return true;
231}
232
233int SkDebugCanvas::save(SaveFlags flags) {
234 addDrawCommand(new Save(flags));
235 return true;
236}
237
238int SkDebugCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
239 SaveFlags flags) {
240 addDrawCommand(new SaveLayer(bounds, paint, flags));
241 return true;
242}
243
244bool SkDebugCanvas::scale(SkScalar sx, SkScalar sy) {
245 addDrawCommand(new Scale(sx, sy));
246 return true;
247}
248
249void SkDebugCanvas::setMatrix(const SkMatrix& matrix) {
250 addDrawCommand(new SetMatrix(matrix));
251}
252
253bool SkDebugCanvas::skew(SkScalar sx, SkScalar sy) {
254 addDrawCommand(new Skew(sx, sy));
255 return true;
256}
257
258bool SkDebugCanvas::translate(SkScalar dx, SkScalar dy) {
259 addDrawCommand(new Translate(dx, dy));
260 return true;
261}
262
263void SkDebugCanvas::toggleCommand(int index) {
264 int counter = 0;
265 if(!commandVector.empty()) {
266 for(it = commandVector.begin(); it != commandVector.end(); ++it) {
267 if (counter == index) {
268 if ((*it)->getVisibility()) {
269 (*it)->setVisibility(false);
270 } else {
271 (*it)->setVisibility(true);
272 }
273 }
274 counter++;
275 }
276 }
277}
278
279void SkDebugCanvas::toggleCommand(int index, bool toggle) {
280 int counter = 0;
281 if(!commandVector.empty()) {
282 for(it = commandVector.begin(); it != commandVector.end(); ++it) {
283 if (counter == index) {
284 (*it)->setVisibility(toggle);
285 }
286 counter++;
287 }
288 }
289}