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:
parent
6e515d67d2
commit
1735d6696e
@ -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),
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user