Index: src/utils/debugger/SkDebugCanvas.cpp |
diff --git a/src/utils/debugger/SkDebugCanvas.cpp b/src/utils/debugger/SkDebugCanvas.cpp |
index d1a9f0c9250bde9b5bc6ee94d62f91a6bd2b6c88..e491f3b8a79b9def06099794f8bd3582d3af4579 100644 |
--- a/src/utils/debugger/SkDebugCanvas.cpp |
+++ b/src/utils/debugger/SkDebugCanvas.cpp |
@@ -22,18 +22,15 @@ static SkBitmap make_noconfig_bm(int width, int height) { |
SkDebugCanvas::SkDebugCanvas(int width, int height) |
: INHERITED(make_noconfig_bm(width, height)) |
+ , fWidth(width) |
+ , fHeight(height) |
+ , fFilter(false) |
+ , fIndex(0) |
, fOverdrawViz(false) |
, fOverdrawFilter(NULL) |
, fOverrideTexFiltering(false) |
, fTexOverrideFilter(NULL) |
, fOutstandingSaveCount(0) { |
- // TODO(chudy): Free up memory from all draw commands in destructor. |
- fWidth = width; |
- fHeight = height; |
- // do we need fBm anywhere? |
- fBm.setConfig(SkBitmap::kNo_Config, fWidth, fHeight); |
- fFilter = false; |
- fIndex = 0; |
fUserMatrix.reset(); |
// SkPicturePlayback uses the base-class' quickReject calls to cull clipped |
@@ -58,6 +55,7 @@ SkDebugCanvas::SkDebugCanvas(int width, int height) |
SkDebugCanvas::~SkDebugCanvas() { |
fCommandVector.deleteAll(); |
SkSafeUnref(fOverdrawFilter); |
+ SkSafeUnref(fTexOverrideFilter); |
} |
void SkDebugCanvas::addDrawCommand(SkDrawCommand* command) { |
@@ -65,14 +63,9 @@ void SkDebugCanvas::addDrawCommand(SkDrawCommand* command) { |
} |
void SkDebugCanvas::draw(SkCanvas* canvas) { |
- if(!fCommandVector.isEmpty()) { |
- for (int i = 0; i < fCommandVector.count(); i++) { |
- if (fCommandVector[i]->isVisible()) { |
- fCommandVector[i]->execute(canvas); |
- } |
- } |
+ if (!fCommandVector.isEmpty()) { |
+ drawTo(canvas, fCommandVector.count() - 1); |
} |
- fIndex = fCommandVector.count() - 1; |
} |
void SkDebugCanvas::applyUserTransform(SkCanvas* canvas) { |
@@ -177,18 +170,19 @@ private: |
void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) { |
SkASSERT(!fCommandVector.isEmpty()); |
SkASSERT(index < fCommandVector.count()); |
- int i; |
+ int i = 0; |
// This only works assuming the canvas and device are the same ones that |
// were previously drawn into because they need to preserve all saves |
// and restores. |
- if (fIndex < index) { |
+ // The visibility filter also requires a full re-draw - otherwise we can |
+ // end up drawing the filter repeatedly. |
+ if (fIndex < index && !fFilter) { |
i = fIndex + 1; |
} else { |
for (int j = 0; j < fOutstandingSaveCount; j++) { |
canvas->restore(); |
} |
- i = 0; |
canvas->clear(SK_ColorTRANSPARENT); |
canvas->resetMatrix(); |
SkRect rect = SkRect::MakeWH(SkIntToScalar(fWidth), |