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

Unified 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, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/utils/debugger/SkDebugCanvas.h ('k') | src/utils/debugger/SkDrawCommand.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/utils/debugger/SkDebugCanvas.cpp
===================================================================
--- src/utils/debugger/SkDebugCanvas.cpp (revision 13635)
+++ src/utils/debugger/SkDebugCanvas.cpp (working copy)
@@ -19,6 +19,7 @@
, fWidth(width)
, fHeight(height)
, fFilter(false)
+ , fMegaVizMode(false)
, fIndex(0)
, fOverdrawViz(false)
, fOverdrawFilter(NULL)
@@ -161,6 +162,62 @@
typedef SkDrawFilter INHERITED;
};
+class SkDebugClipVisitor : public SkCanvas::ClipVisitor {
+public:
+ SkDebugClipVisitor(SkCanvas* canvas) : fCanvas(canvas) {}
+
+ virtual void clipRect(const SkRect& r, SkRegion::Op, bool doAA) SK_OVERRIDE {
+ SkPaint p;
+ p.setColor(SK_ColorRED);
+ p.setStyle(SkPaint::kStroke_Style);
+ p.setAntiAlias(doAA);
+ fCanvas->drawRect(r, p);
+ }
+ virtual void clipRRect(const SkRRect& rr, SkRegion::Op, bool doAA) SK_OVERRIDE {
+ SkPaint p;
+ p.setColor(SK_ColorGREEN);
+ p.setStyle(SkPaint::kStroke_Style);
+ p.setAntiAlias(doAA);
+ fCanvas->drawRRect(rr, p);
+ }
+ virtual void clipPath(const SkPath& path, SkRegion::Op, bool doAA) SK_OVERRIDE {
+ SkPaint p;
+ p.setColor(SK_ColorBLUE);
+ p.setStyle(SkPaint::kStroke_Style);
+ p.setAntiAlias(doAA);
+ fCanvas->drawPath(path, p);
+ }
+
+protected:
+ SkCanvas* fCanvas;
+
+private:
+ typedef SkCanvas::ClipVisitor INHERITED;
+};
+
+// set up the saveLayer commands so that the active ones
+// return true in their 'active' method
+void SkDebugCanvas::markActiveSaveLayers(int index) {
+ SkTDArray<SkDrawCommand*> activeLayers;
+
+ for (int i = 0; i < fCommandVector.count(); ++i) {
+ fCommandVector[i]->setActive(false);
+ }
+
+ for (int i = 0; i < index; ++i) {
+ SkDrawCommand::Action result = fCommandVector[i]->action();
+ if (SkDrawCommand::kPush_Action == result) {
+ activeLayers.push(fCommandVector[i]);
+ } else if (SkDrawCommand::kPop_Action == result) {
+ activeLayers.pop();
+ }
+ }
+
+ for (int i = 0; i < activeLayers.count(); ++i) {
+ activeLayers[i]->setActive(true);
+ }
+}
+
void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) {
SkASSERT(!fCommandVector.isEmpty());
SkASSERT(index < fCommandVector.count());
@@ -171,7 +228,7 @@
// and restores.
// The visibility filter also requires a full re-draw - otherwise we can
// end up drawing the filter repeatedly.
- if (fIndex < index && !fFilter) {
+ if (fIndex < index && !fFilter && !fMegaVizMode) {
i = fIndex + 1;
} else {
for (int j = 0; j < fOutstandingSaveCount; j++) {
@@ -210,6 +267,10 @@
canvas->setDrawFilter(NULL);
}
+ if (fMegaVizMode) {
+ this->markActiveSaveLayers(index);
+ }
+
for (; i <= index; i++) {
if (i == index && fFilter) {
SkPaint p;
@@ -226,10 +287,35 @@
}
if (fCommandVector[i]->isVisible()) {
- fCommandVector[i]->execute(canvas);
- fCommandVector[i]->trackSaveState(&fOutstandingSaveCount);
+ if (fMegaVizMode && fCommandVector[i]->active()) {
+ // All active saveLayers get replaced with saves so all draws go to the
+ // visible canvas
+ canvas->save();
+ ++fOutstandingSaveCount;
+ } else {
+ fCommandVector[i]->execute(canvas);
+ fCommandVector[i]->trackSaveState(&fOutstandingSaveCount);
+ }
}
}
+
+ if (fMegaVizMode) {
+ SkRect r = SkRect::MakeWH(SkIntToScalar(fWidth), SkIntToScalar(fHeight));
+ r.outset(SK_Scalar1, SK_Scalar1);
+
+ canvas->save();
+ // nuke the CTM
+ canvas->setMatrix(SkMatrix::I());
+ // turn off clipping
+ canvas->clipRect(r, SkRegion::kReplace_Op);
+
+ // visualize existing clips
+ SkDebugClipVisitor visitor(canvas);
+
+ canvas->replayClips(&visitor);
+
+ canvas->restore();
+ }
fMatrix = canvas->getTotalMatrix();
fClip = canvas->getTotalClip().getBounds();
fIndex = index;
@@ -281,10 +367,6 @@
return commandString;
}
-void SkDebugCanvas::toggleFilter(bool toggle) {
- fFilter = toggle;
-}
-
void SkDebugCanvas::overrideTexFiltering(bool overrideTexFiltering, SkPaint::FilterLevel level) {
if (NULL == fTexOverrideFilter) {
fTexOverrideFilter = new SkTexOverrideFilter;
« 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