| Index: debugger/QT/SkDebuggerGUI.cpp
|
| diff --git a/debugger/QT/SkDebuggerGUI.cpp b/debugger/QT/SkDebuggerGUI.cpp
|
| index b6920a7b3eb46e32e4be10be6dcefad4b9a44284..1a324fd08b87c64dc154c64184f958991705914e 100644
|
| --- a/debugger/QT/SkDebuggerGUI.cpp
|
| +++ b/debugger/QT/SkDebuggerGUI.cpp
|
| @@ -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;
|
|
|