Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(235)

Side by Side Diff: src/utils/debugger/SkDebugCanvas.cpp

Issue 185293007: Add visualization of clips to debugger (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/utils/debugger/SkDebugCanvas.h ('k') | src/utils/debugger/SkDrawCommand.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2012 Google Inc. 3 * Copyright 2012 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #include "SkColorPriv.h" 10 #include "SkColorPriv.h"
11 #include "SkDebugCanvas.h" 11 #include "SkDebugCanvas.h"
12 #include "SkDrawCommand.h" 12 #include "SkDrawCommand.h"
13 #include "SkDrawFilter.h" 13 #include "SkDrawFilter.h"
14 #include "SkDevice.h" 14 #include "SkDevice.h"
15 #include "SkXfermode.h" 15 #include "SkXfermode.h"
16 16
17 SkDebugCanvas::SkDebugCanvas(int width, int height) 17 SkDebugCanvas::SkDebugCanvas(int width, int height)
18 : INHERITED(width, height) 18 : INHERITED(width, height)
19 , fWidth(width) 19 , fWidth(width)
20 , fHeight(height) 20 , fHeight(height)
21 , fFilter(false) 21 , fFilter(false)
22 , fMegaVizMode(false)
22 , fIndex(0) 23 , fIndex(0)
23 , fOverdrawViz(false) 24 , fOverdrawViz(false)
24 , fOverdrawFilter(NULL) 25 , fOverdrawFilter(NULL)
25 , fOverrideTexFiltering(false) 26 , fOverrideTexFiltering(false)
26 , fTexOverrideFilter(NULL) 27 , fTexOverrideFilter(NULL)
27 , fOutstandingSaveCount(0) { 28 , fOutstandingSaveCount(0) {
28 fUserMatrix.reset(); 29 fUserMatrix.reset();
29 30
30 // SkPicturePlayback uses the base-class' quickReject calls to cull clipped 31 // SkPicturePlayback uses the base-class' quickReject calls to cull clipped
31 // operations. This can lead to problems in the debugger which expects all 32 // operations. This can lead to problems in the debugger which expects all
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 return true; 155 return true;
155 } 156 }
156 157
157 protected: 158 protected:
158 SkPaint::FilterLevel fFilterLevel; 159 SkPaint::FilterLevel fFilterLevel;
159 160
160 private: 161 private:
161 typedef SkDrawFilter INHERITED; 162 typedef SkDrawFilter INHERITED;
162 }; 163 };
163 164
165 class SkDebugClipVisitor : public SkCanvas::ClipVisitor {
166 public:
167 SkDebugClipVisitor(SkCanvas* canvas) : fCanvas(canvas) {}
168
169 virtual void clipRect(const SkRect& r, SkRegion::Op, bool doAA) SK_OVERRIDE {
170 SkPaint p;
171 p.setColor(SK_ColorRED);
172 p.setStyle(SkPaint::kStroke_Style);
173 p.setAntiAlias(doAA);
174 fCanvas->drawRect(r, p);
175 }
176 virtual void clipRRect(const SkRRect& rr, SkRegion::Op, bool doAA) SK_OVERRI DE {
177 SkPaint p;
178 p.setColor(SK_ColorGREEN);
179 p.setStyle(SkPaint::kStroke_Style);
180 p.setAntiAlias(doAA);
181 fCanvas->drawRRect(rr, p);
182 }
183 virtual void clipPath(const SkPath& path, SkRegion::Op, bool doAA) SK_OVERRI DE {
184 SkPaint p;
185 p.setColor(SK_ColorBLUE);
186 p.setStyle(SkPaint::kStroke_Style);
187 p.setAntiAlias(doAA);
188 fCanvas->drawPath(path, p);
189 }
190
191 protected:
192 SkCanvas* fCanvas;
193
194 private:
195 typedef SkCanvas::ClipVisitor INHERITED;
196 };
197
198 // set up the saveLayer commands so that the active ones
199 // return true in their 'active' method
200 void SkDebugCanvas::markActiveSaveLayers(int index) {
201 SkTDArray<SkDrawCommand*> activeLayers;
202
203 for (int i = 0; i < fCommandVector.count(); ++i) {
204 fCommandVector[i]->setActive(false);
205 }
206
207 for (int i = 0; i < index; ++i) {
208 SkDrawCommand::Action result = fCommandVector[i]->action();
209 if (SkDrawCommand::kPush_Action == result) {
210 activeLayers.push(fCommandVector[i]);
211 } else if (SkDrawCommand::kPop_Action == result) {
212 activeLayers.pop();
213 }
214 }
215
216 for (int i = 0; i < activeLayers.count(); ++i) {
217 activeLayers[i]->setActive(true);
218 }
219 }
220
164 void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) { 221 void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) {
165 SkASSERT(!fCommandVector.isEmpty()); 222 SkASSERT(!fCommandVector.isEmpty());
166 SkASSERT(index < fCommandVector.count()); 223 SkASSERT(index < fCommandVector.count());
167 int i = 0; 224 int i = 0;
168 225
169 // This only works assuming the canvas and device are the same ones that 226 // 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 227 // were previously drawn into because they need to preserve all saves
171 // and restores. 228 // and restores.
172 // The visibility filter also requires a full re-draw - otherwise we can 229 // The visibility filter also requires a full re-draw - otherwise we can
173 // end up drawing the filter repeatedly. 230 // end up drawing the filter repeatedly.
174 if (fIndex < index && !fFilter) { 231 if (fIndex < index && !fFilter && !fMegaVizMode) {
175 i = fIndex + 1; 232 i = fIndex + 1;
176 } else { 233 } else {
177 for (int j = 0; j < fOutstandingSaveCount; j++) { 234 for (int j = 0; j < fOutstandingSaveCount; j++) {
178 canvas->restore(); 235 canvas->restore();
179 } 236 }
180 canvas->clear(SK_ColorTRANSPARENT); 237 canvas->clear(SK_ColorTRANSPARENT);
181 canvas->resetMatrix(); 238 canvas->resetMatrix();
182 SkRect rect = SkRect::MakeWH(SkIntToScalar(fWidth), 239 SkRect rect = SkRect::MakeWH(SkIntToScalar(fWidth),
183 SkIntToScalar(fHeight)); 240 SkIntToScalar(fHeight));
184 canvas->clipRect(rect, SkRegion::kReplace_Op ); 241 canvas->clipRect(rect, SkRegion::kReplace_Op );
(...skipping 18 matching lines...) Expand all
203 fTexOverrideFilter = new SkTexOverrideFilter; 260 fTexOverrideFilter = new SkTexOverrideFilter;
204 } 261 }
205 262
206 if (fTexOverrideFilter != canvas->getDrawFilter()) { 263 if (fTexOverrideFilter != canvas->getDrawFilter()) {
207 canvas->setDrawFilter(fTexOverrideFilter); 264 canvas->setDrawFilter(fTexOverrideFilter);
208 } 265 }
209 } else { 266 } else {
210 canvas->setDrawFilter(NULL); 267 canvas->setDrawFilter(NULL);
211 } 268 }
212 269
270 if (fMegaVizMode) {
271 this->markActiveSaveLayers(index);
272 }
273
213 for (; i <= index; i++) { 274 for (; i <= index; i++) {
214 if (i == index && fFilter) { 275 if (i == index && fFilter) {
215 SkPaint p; 276 SkPaint p;
216 p.setColor(0xAAFFFFFF); 277 p.setColor(0xAAFFFFFF);
217 canvas->save(); 278 canvas->save();
218 canvas->resetMatrix(); 279 canvas->resetMatrix();
219 SkRect mask; 280 SkRect mask;
220 mask.set(SkIntToScalar(0), SkIntToScalar(0), 281 mask.set(SkIntToScalar(0), SkIntToScalar(0),
221 SkIntToScalar(fWidth), SkIntToScalar(fHeight)); 282 SkIntToScalar(fWidth), SkIntToScalar(fHeight));
222 canvas->clipRect(mask, SkRegion::kReplace_Op, false); 283 canvas->clipRect(mask, SkRegion::kReplace_Op, false);
223 canvas->drawRectCoords(SkIntToScalar(0), SkIntToScalar(0), 284 canvas->drawRectCoords(SkIntToScalar(0), SkIntToScalar(0),
224 SkIntToScalar(fWidth), SkIntToScalar(fHeight), p); 285 SkIntToScalar(fWidth), SkIntToScalar(fHeight), p);
225 canvas->restore(); 286 canvas->restore();
226 } 287 }
227 288
228 if (fCommandVector[i]->isVisible()) { 289 if (fCommandVector[i]->isVisible()) {
229 fCommandVector[i]->execute(canvas); 290 if (fMegaVizMode && fCommandVector[i]->active()) {
230 fCommandVector[i]->trackSaveState(&fOutstandingSaveCount); 291 // All active saveLayers get replaced with saves so all draws go to the
292 // visible canvas
293 canvas->save();
294 ++fOutstandingSaveCount;
295 } else {
296 fCommandVector[i]->execute(canvas);
297 fCommandVector[i]->trackSaveState(&fOutstandingSaveCount);
298 }
231 } 299 }
232 } 300 }
301
302 if (fMegaVizMode) {
303 SkRect r = SkRect::MakeWH(SkIntToScalar(fWidth), SkIntToScalar(fHeight)) ;
304 r.outset(SK_Scalar1, SK_Scalar1);
305
306 canvas->save();
307 // nuke the CTM
308 canvas->setMatrix(SkMatrix::I());
309 // turn off clipping
310 canvas->clipRect(r, SkRegion::kReplace_Op);
311
312 // visualize existing clips
313 SkDebugClipVisitor visitor(canvas);
314
315 canvas->replayClips(&visitor);
316
317 canvas->restore();
318 }
233 fMatrix = canvas->getTotalMatrix(); 319 fMatrix = canvas->getTotalMatrix();
234 fClip = canvas->getTotalClip().getBounds(); 320 fClip = canvas->getTotalClip().getBounds();
235 fIndex = index; 321 fIndex = index;
236 } 322 }
237 323
238 void SkDebugCanvas::deleteDrawCommandAt(int index) { 324 void SkDebugCanvas::deleteDrawCommandAt(int index) {
239 SkASSERT(index < fCommandVector.count()); 325 SkASSERT(index < fCommandVector.count());
240 delete fCommandVector[index]; 326 delete fCommandVector[index];
241 fCommandVector.remove(index); 327 fCommandVector.remove(index);
242 } 328 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 SkTArray<SkString>* SkDebugCanvas::getDrawCommandsAsStrings() const { 360 SkTArray<SkString>* SkDebugCanvas::getDrawCommandsAsStrings() const {
275 SkTArray<SkString>* commandString = new SkTArray<SkString>(fCommandVector.co unt()); 361 SkTArray<SkString>* commandString = new SkTArray<SkString>(fCommandVector.co unt());
276 if (!fCommandVector.isEmpty()) { 362 if (!fCommandVector.isEmpty()) {
277 for (int i = 0; i < fCommandVector.count(); i ++) { 363 for (int i = 0; i < fCommandVector.count(); i ++) {
278 commandString->push_back() = fCommandVector[i]->toString(); 364 commandString->push_back() = fCommandVector[i]->toString();
279 } 365 }
280 } 366 }
281 return commandString; 367 return commandString;
282 } 368 }
283 369
284 void SkDebugCanvas::toggleFilter(bool toggle) {
285 fFilter = toggle;
286 }
287
288 void SkDebugCanvas::overrideTexFiltering(bool overrideTexFiltering, SkPaint::Fil terLevel level) { 370 void SkDebugCanvas::overrideTexFiltering(bool overrideTexFiltering, SkPaint::Fil terLevel level) {
289 if (NULL == fTexOverrideFilter) { 371 if (NULL == fTexOverrideFilter) {
290 fTexOverrideFilter = new SkTexOverrideFilter; 372 fTexOverrideFilter = new SkTexOverrideFilter;
291 } 373 }
292 374
293 fOverrideTexFiltering = overrideTexFiltering; 375 fOverrideTexFiltering = overrideTexFiltering;
294 fTexOverrideFilter->setFilterLevel(level); 376 fTexOverrideFilter->setFilterLevel(level);
295 } 377 }
296 378
297 void SkDebugCanvas::clear(SkColor color) { 379 void SkDebugCanvas::clear(SkColor color) {
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
471 553
472 bool SkDebugCanvas::translate(SkScalar dx, SkScalar dy) { 554 bool SkDebugCanvas::translate(SkScalar dx, SkScalar dy) {
473 addDrawCommand(new SkTranslateCommand(dx, dy)); 555 addDrawCommand(new SkTranslateCommand(dx, dy));
474 return true; 556 return true;
475 } 557 }
476 558
477 void SkDebugCanvas::toggleCommand(int index, bool toggle) { 559 void SkDebugCanvas::toggleCommand(int index, bool toggle) {
478 SkASSERT(index < fCommandVector.count()); 560 SkASSERT(index < fCommandVector.count());
479 fCommandVector[index]->setVisible(toggle); 561 fCommandVector[index]->setVisible(toggle);
480 } 562 }
OLDNEW
« no previous file with comments | « src/utils/debugger/SkDebugCanvas.h ('k') | src/utils/debugger/SkDrawCommand.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698