Home | History | Annotate | Download | only in debugger
      1 
      2 /*
      3  * Copyright 2012 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 
      9 #include "SkDebugger.h"
     10 #include "SkPictureRecorder.h"
     11 #include "SkString.h"
     12 
     13 
     14 SkDebugger::SkDebugger() {
     15     // Create this some other dynamic way?
     16     fDebugCanvas = new SkDebugCanvas(0, 0);
     17     fPicture = NULL;
     18     fIndex = 0;
     19 }
     20 
     21 SkDebugger::~SkDebugger() {
     22     // Need to inherit from SkRef object in order for following to work
     23     SkSafeUnref(fDebugCanvas);
     24     SkSafeUnref(fPicture);
     25 }
     26 
     27 void SkDebugger::loadPicture(SkPicture* picture) {
     28     SkRefCnt_SafeAssign(fPicture, picture);
     29 
     30     delete fDebugCanvas;
     31     fDebugCanvas = new SkDebugCanvas(SkScalarCeilToInt(this->pictureCull().width()),
     32                                      SkScalarCeilToInt(this->pictureCull().height()));
     33     fDebugCanvas->setPicture(picture);
     34     picture->playback(fDebugCanvas);
     35     fDebugCanvas->setPicture(NULL);
     36     fIndex = fDebugCanvas->getSize() - 1;
     37 }
     38 
     39 SkPicture* SkDebugger::copyPicture() {
     40     // We can't just call clone here since we want to removed the "deleted"
     41     // commands. Playing back will strip those out.
     42     SkPictureRecorder recorder;
     43     SkCanvas* canvas = recorder.beginRecording(this->pictureCull().width(),
     44                                                this->pictureCull().height());
     45 
     46     bool vizMode = fDebugCanvas->getMegaVizMode();
     47     fDebugCanvas->setMegaVizMode(false);
     48     bool overDraw = fDebugCanvas->getOverdrawViz();
     49     fDebugCanvas->setOverdrawViz(false);
     50     bool pathOps = fDebugCanvas->getAllowSimplifyClip();
     51     fDebugCanvas->setAllowSimplifyClip(false);
     52     int saveCount = fDebugCanvas->getOutstandingSaveCount();
     53     fDebugCanvas->setOutstandingSaveCount(0);
     54 
     55     fDebugCanvas->draw(canvas);
     56 
     57     int temp = fDebugCanvas->getOutstandingSaveCount();
     58     for (int i = 0; i < temp; ++i) {
     59         canvas->restore();
     60     }
     61 
     62     fDebugCanvas->setMegaVizMode(vizMode);
     63     fDebugCanvas->setOverdrawViz(overDraw);
     64     fDebugCanvas->setOutstandingSaveCount(saveCount);
     65     fDebugCanvas->setAllowSimplifyClip(pathOps);
     66 
     67     return recorder.endRecording();
     68 }
     69 
     70 void SkDebugger::getOverviewText(const SkTDArray<double>* typeTimes,
     71                                  double totTime,
     72                                  SkString* overview,
     73                                  int numRuns) {
     74     const SkTDArray<SkDrawCommand*>& commands = this->getDrawCommands();
     75 
     76     SkTDArray<int> counts;
     77     counts.setCount(LAST_DRAWTYPE_ENUM+1);
     78     for (int i = 0; i < LAST_DRAWTYPE_ENUM+1; ++i) {
     79         counts[i] = 0;
     80     }
     81 
     82     for (int i = 0; i < commands.count(); i++) {
     83         counts[commands[i]->getType()]++;
     84     }
     85 
     86     overview->reset();
     87     int total = 0;
     88 #ifdef SK_DEBUG
     89     double totPercent = 0, tempSum = 0;
     90 #endif
     91     for (int i = 0; i < LAST_DRAWTYPE_ENUM+1; ++i) {
     92         if (0 == counts[i]) {
     93             // if there were no commands of this type then they should've consumed no time
     94             SkASSERT(NULL == typeTimes || 0.0 == (*typeTimes)[i]);
     95             continue;
     96         }
     97 
     98         overview->append(SkDrawCommand::GetCommandString((DrawType) i));
     99         overview->append(": ");
    100         overview->appendS32(counts[i]);
    101         if (typeTimes && totTime >= 0.0) {
    102             overview->append(" - ");
    103             overview->appendf("%.2f", (*typeTimes)[i]/(float)numRuns);
    104             overview->append("ms");
    105             overview->append(" - ");
    106             double percent = 100.0*(*typeTimes)[i]/totTime;
    107             overview->appendf("%.2f", percent);
    108             overview->append("%");
    109 #ifdef SK_DEBUG
    110             totPercent += percent;
    111             tempSum += (*typeTimes)[i];
    112 #endif
    113         }
    114         overview->append("<br/>");
    115         total += counts[i];
    116     }
    117 #ifdef SK_DEBUG
    118     if (typeTimes) {
    119         SkASSERT(SkScalarNearlyEqual(SkDoubleToScalar(totPercent),
    120                                      SkDoubleToScalar(100.0)));
    121         SkASSERT(SkScalarNearlyEqual(SkDoubleToScalar(tempSum),
    122                                      SkDoubleToScalar(totTime)));
    123     }
    124 #endif
    125 
    126     if (totTime > 0.0) {
    127         overview->append("Total Time: ");
    128         overview->appendf("%.2f", totTime/(float)numRuns);
    129         overview->append("ms");
    130 #ifdef SK_DEBUG
    131         overview->append(" ");
    132         overview->appendScalar(SkDoubleToScalar(totPercent));
    133         overview->append("% ");
    134 #endif
    135         overview->append("<br/>");
    136     }
    137 
    138     SkString totalStr;
    139     totalStr.append("Total Draw Commands: ");
    140     totalStr.appendScalar(SkDoubleToScalar(total));
    141     totalStr.append("<br/>");
    142     overview->insert(0, totalStr);
    143 
    144     overview->append("<br/>SkPicture L: ");
    145     overview->appendScalar(this->pictureCull().fLeft);
    146     overview->append(" T: ");
    147     overview->appendScalar(this->pictureCull().fTop);
    148     overview->append(" R: ");
    149     overview->appendScalar(this->pictureCull().fRight);
    150     overview->append(" B: ");
    151     overview->appendScalar(this->pictureCull().fBottom);
    152     overview->append("<br/>");
    153 }
    154 
    155 void SkDebugger::getClipStackText(SkString* clipStack) {
    156     clipStack->set(fDebugCanvas->clipStackData());
    157 }
    158