Fixed up SkTimedPicturePlayback

This was more motivated to remove the preDraw and postDraw virtuals from SkPicturePlayback.

R=mtklein@google.com, reed@google.com

Author: robertphillips@google.com

Review URL: https://codereview.chromium.org/375943002
This commit is contained in:
robertphillips 2014-07-08 13:07:57 -07:00 committed by Commit bot
parent f7a180b10f
commit 92432c7f7c
4 changed files with 49 additions and 28 deletions

View File

@ -156,9 +156,9 @@ void SkDebuggerGUI::showDeletes() {
}
}
// The timed picture playback uses the SkPictureData's profiling stubs
// to time individual commands. The offsets are needed to map SkPicture
// offsets to individual commands.
// The timed picture playback just steps through every operation timing
// each one individually. Note that each picture should be replayed multiple
// times (via calls to 'draw') before each command's time is accessed via 'time'.
class SkTimedPicturePlayback : public SkPicturePlayback {
public:
@ -172,6 +172,47 @@ public:
this->resetTimes();
}
virtual void draw(SkCanvas* canvas, SkDrawPictureCallback* callback) SK_OVERRIDE {
AutoResetOpID aroi(this);
SkASSERT(0 == fCurOffset);
SkReader32 reader(fPictureData->opData()->bytes(), fPictureData->opData()->size());
// Record this, so we can concat w/ it if we encounter a setMatrix()
SkMatrix initialMatrix = canvas->getTotalMatrix();
SkAutoCanvasRestore acr(canvas, false);
int opIndex = -1;
while (!reader.eof()) {
if (NULL != callback && callback->abortDrawing()) {
return;
}
fCurOffset = reader.offset();
uint32_t size;
DrawType op = ReadOpAndSize(&reader, &size);
if (NOOP == op) {
// NOOPs are to be ignored - do not propagate them any further
reader.setOffset(fCurOffset + size);
continue;
}
opIndex++;
if (this->preDraw(opIndex, op)) {
// This operation is disabled in the debugger's GUI
reader.setOffset(fCurOffset + size);
continue;
}
this->handleOp(&reader, op, size, canvas, initialMatrix);
this->postDraw(opIndex);
}
}
void resetTimes() {
for (int i = 0; i < fTimes.count(); ++i) {
fTimes[i] = 0.0;
@ -184,6 +225,7 @@ public:
int count() const { return fTimes.count(); }
// Return the fraction of the total time consumed by the index-th operation
double time(int index) const { return fTimes[index] / fTot; }
const SkTDArray<double>* typeTimes() const { return &fTypeTimes; }
@ -196,11 +238,11 @@ protected:
SkTDArray<double> fTimes; // sum of time consumed for each command
SkTDArray<double> fTypeTimes; // sum of time consumed for each type of command (e.g., drawPath)
double fTot; // total of all times in 'fTimes'
int fCurType;
int fCurCommand; // the current command being executed/timed
#ifdef SK_DEVELOPER
virtual bool preDraw(int opIndex, int type) SK_OVERRIDE {
bool preDraw(int opIndex, int type) {
fCurCommand = opIndex;
if (fSkipCommands[fCurCommand]) {
@ -227,7 +269,7 @@ protected:
return false;
}
virtual void postDraw(int opIndex) SK_OVERRIDE {
void postDraw(int opIndex) {
#if defined(SK_BUILD_FOR_WIN32)
// CPU timer doesn't work well on Windows
double time = fTimer.endWall();
@ -242,7 +284,6 @@ protected:
fTypeTimes[fCurType] += time;
fTot += time;
}
#endif
private:
typedef SkPicturePlayback INHERITED;

View File

@ -152,10 +152,6 @@ void SkPicturePlayback::draw(SkCanvas* canvas, SkDrawPictureCallback* callback)
SkAutoCanvasRestore acr(canvas, false);
#ifdef SK_DEVELOPER
int opIndex = -1;
#endif
while (!reader.eof()) {
if (callback && callback->abortDrawing()) {
return;
@ -232,13 +228,6 @@ void SkPicturePlayback::draw(SkCanvas* canvas, SkDrawPictureCallback* callback)
if (NOOP == op) {
// NOOPs are to be ignored - do not propagate them any further
skipTo = fCurOffset + size;
#ifdef SK_DEVELOPER
} else {
opIndex++;
if (this->preDraw(opIndex, op)) {
skipTo = fCurOffset + size;
}
#endif
}
if (0 != skipTo) {
@ -260,10 +249,6 @@ void SkPicturePlayback::draw(SkCanvas* canvas, SkDrawPictureCallback* callback)
this->handleOp(&reader, op, size, canvas, initialMatrix);
#ifdef SK_DEVELOPER
this->postDraw(opIndex);
#endif
if (it.isValid()) {
uint32_t skipTo = it.nextDraw();
if (kDrawComplete == skipTo) {

View File

@ -96,11 +96,6 @@ protected:
SkCanvas* canvas,
const SkMatrix& initialMatrix);
#ifdef SK_DEVELOPER
virtual bool preDraw(int opIndex, int type) { return false; }
virtual void postDraw(int opIndex) { }
#endif
static DrawType ReadOpAndSize(SkReader32* reader, uint32_t* size);
class AutoResetOpID {

View File

@ -29,7 +29,7 @@ void SkPictureRangePlayback::draw(SkCanvas* canvas, SkDrawPictureCallback* callb
SkAutoCanvasRestore acr(canvas, false);
while (!reader.eof()) {
if (callback && callback->abortDrawing()) {
if (NULL != callback && callback->abortDrawing()) {
return;
}