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