aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/utils/debugger/SkDebugCanvas.cpp
diff options
context:
space:
mode:
authorGravatar kkinnunen <kkinnunen@nvidia.com>2015-01-13 23:09:19 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-01-13 23:09:19 -0800
commit26a00de4f303fe74527f00b777a871843ae4437e (patch)
tree8b9d745e38d2002d9bca2f81bad191002311d8ba /src/utils/debugger/SkDebugCanvas.cpp
parentcfdc0e3fee69694e0f6b083d8455665b2a810589 (diff)
Remove incremental draw optimization from SkDebugCanvas
The SkDebugCanvas can be (or is currently) being used to draw to multiple different canvases. If this use-case is intended, then storing draw -related state in the canvas causes bugs. Remove incremental draw from SkDebugCanvas. It can only optimize the case where draw command index is advanced, no other changes are done and no visualization is used. This case is not that critical, as it happens only once per new frame at most. It causes bugs, because one SkDebugCanvas is used to draw to multiple canvases. Leave the draw to canvas in same state as it was passed in. This fixes the debugger bugs where: * Old, stale image would stay on the raster canvas when a new image is loaded. Also happened with resizes. * Proper image for overdraw filter would be visible only for the first frame Review URL: https://codereview.chromium.org/844493003
Diffstat (limited to 'src/utils/debugger/SkDebugCanvas.cpp')
-rw-r--r--src/utils/debugger/SkDebugCanvas.cpp42
1 files changed, 12 insertions, 30 deletions
diff --git a/src/utils/debugger/SkDebugCanvas.cpp b/src/utils/debugger/SkDebugCanvas.cpp
index 6a04006264..9d809559dc 100644
--- a/src/utils/debugger/SkDebugCanvas.cpp
+++ b/src/utils/debugger/SkDebugCanvas.cpp
@@ -19,14 +19,11 @@ SkDebugCanvas::SkDebugCanvas(int width, int height)
, fPicture(NULL)
, fFilter(false)
, fMegaVizMode(false)
- , fIndex(0)
, fOverdrawViz(false)
, fOverdrawFilter(NULL)
, fOverrideTexFiltering(false)
- , fTexOverrideFilter(NULL)
- , fOutstandingSaveCount(0) {
+ , fTexOverrideFilter(NULL) {
fUserMatrix.reset();
- fDrawNeedsReset = false;
// SkPicturePlayback uses the base-class' quickReject calls to cull clipped
// operations. This can lead to problems in the debugger which expects all
@@ -59,8 +56,6 @@ void SkDebugCanvas::addDrawCommand(SkDrawCommand* command) {
}
void SkDebugCanvas::draw(SkCanvas* canvas) {
- fDrawNeedsReset = true;
-
if (!fCommandVector.isEmpty()) {
this->drawTo(canvas, fCommandVector.count() - 1);
}
@@ -231,32 +226,20 @@ void SkDebugCanvas::markActiveCommands(int index) {
void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) {
SkASSERT(!fCommandVector.isEmpty());
SkASSERT(index < fCommandVector.count());
- int i = 0;
+
+ int saveCount = canvas->save();
+
SkRect windowRect = SkRect::MakeWH(SkIntToScalar(canvas->getBaseLayerSize().width()),
SkIntToScalar(canvas->getBaseLayerSize().height()));
bool pathOpsMode = getAllowSimplifyClip();
canvas->setAllowSimplifyClip(pathOpsMode);
- // 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.
- // The visibility filter also requires a full re-draw - otherwise we can
- // end up drawing the filter repeatedly.
- if (fIndex < index && !fFilter && !fMegaVizMode && !pathOpsMode && !fDrawNeedsReset) {
- i = fIndex + 1;
- } else {
- for (int j = 0; j < fOutstandingSaveCount; j++) {
- canvas->restore();
- }
- canvas->clear(SK_ColorTRANSPARENT);
- canvas->resetMatrix();
- if (!windowRect.isEmpty()) {
- canvas->clipRect(windowRect, SkRegion::kReplace_Op);
- }
- this->applyUserTransform(canvas);
- fDrawNeedsReset = false;
- fOutstandingSaveCount = 0;
+ canvas->clear(SK_ColorTRANSPARENT);
+ canvas->resetMatrix();
+ if (!windowRect.isEmpty()) {
+ canvas->clipRect(windowRect, SkRegion::kReplace_Op);
}
+ this->applyUserTransform(canvas);
// The setting of the draw filter has to go here (rather than in
// SkRasterWidget) due to the canvas restores this class performs.
@@ -286,7 +269,7 @@ void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) {
this->markActiveCommands(index);
}
- for (; i <= index; i++) {
+ for (int i = 0; i <= index; i++) {
if (i == index && fFilter) {
canvas->clear(0xAAFFFFFF);
}
@@ -302,8 +285,6 @@ void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) {
fCommandVector[i]->setUserMatrix(fUserMatrix);
fCommandVector[i]->execute(canvas);
}
-
- fCommandVector[i]->trackSaveState(&fOutstandingSaveCount);
}
}
@@ -350,7 +331,8 @@ void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) {
if (!canvas->getClipDeviceBounds(&fClip)) {
fClip.setEmpty();
}
- fIndex = index;
+
+ canvas->restoreToCount(saveCount);
}
void SkDebugCanvas::deleteDrawCommandAt(int index) {