Fix incremental visibility filter handling.

When drawing incrementally, SkDebugCanvas can end up applying the
visibility overlay multiple times (resulting in a fade-to-white effect).

The CL also includes a minor/unrelated SkDebugCanvas cleanup.

R=robertphillips@google.com

Author: fmalita@chromium.org

Review URL: https://codereview.chromium.org/103083004

git-svn-id: http://skia.googlecode.com/svn/trunk@12478 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
commit-bot@chromium.org 2013-12-04 13:42:46 +00:00
parent 6e515d67d2
commit 1735d6696e
2 changed files with 12 additions and 28 deletions

View File

@ -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),

View File

@ -41,15 +41,6 @@ public:
*/
void draw(SkCanvas* canvas);
/**
Executes the draw calls in the specified range.
@param canvas The canvas being drawn to
@param i The beginning of the range
@param j The end of the range
TODO(chudy): Implement
*/
void drawRange(SkCanvas* canvas, int i, int j);
/**
Executes the draw calls up to the specified index.
@param canvas The canvas being drawn to
@ -244,9 +235,8 @@ public:
private:
SkTDArray<SkDrawCommand*> fCommandVector;
int fHeight;
int fWidth;
SkBitmap fBm;
int fHeight;
bool fFilter;
int fIndex;
SkMatrix fUserMatrix;