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