SkDebugger.cpp revision 770963f23f4fc313db0fa3bac18b1b8aafb55f17
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 14SkDebugger::SkDebugger() { 15 // Create this some other dynamic way? 16 fDebugCanvas = new SkDebugCanvas(100, 100); 17 fPicture = NULL; 18 fPictureWidth = 0; 19 fPictureHeight = 0; 20 fIndex = 0; 21} 22 23SkDebugger::~SkDebugger() { 24 // Need to inherit from SkRef object in order for following to work 25 SkSafeUnref(fDebugCanvas); 26 SkSafeUnref(fPicture); 27} 28 29void SkDebugger::loadPicture(SkPicture* picture) { 30 fPictureWidth = picture->width(); 31 fPictureHeight = picture->height(); 32 delete fDebugCanvas; 33 fDebugCanvas = new SkDebugCanvas(fPictureWidth, fPictureHeight); 34 fDebugCanvas->setBounds(fPictureWidth, fPictureHeight); 35 fDebugCanvas->setPicture(picture); 36 picture->draw(fDebugCanvas); 37 fDebugCanvas->setPicture(NULL); 38 fIndex = fDebugCanvas->getSize() - 1; 39 SkRefCnt_SafeAssign(fPicture, picture); 40} 41 42SkPicture* SkDebugger::copyPicture() { 43 // We can't just call clone here since we want to removed the "deleted" 44 // commands. Playing back will strip those out. 45 SkPictureRecorder recorder; 46 SkCanvas* canvas = recorder.beginRecording(fPictureWidth, fPictureHeight, NULL, 0); 47 48 bool vizMode = fDebugCanvas->getMegaVizMode(); 49 fDebugCanvas->setMegaVizMode(false); 50 bool overDraw = fDebugCanvas->getOverdrawViz(); 51 fDebugCanvas->setOverdrawViz(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 66 return recorder.endRecording(); 67} 68 69void SkDebugger::getOverviewText(const SkTDArray<double>* typeTimes, 70 double totTime, 71 SkString* overview, 72 int numRuns) { 73 const SkTDArray<SkDrawCommand*>& commands = this->getDrawCommands(); 74 75 SkTDArray<int> counts; 76 counts.setCount(LAST_DRAWTYPE_ENUM+1); 77 for (int i = 0; i < LAST_DRAWTYPE_ENUM+1; ++i) { 78 counts[i] = 0; 79 } 80 81 for (int i = 0; i < commands.count(); i++) { 82 counts[commands[i]->getType()]++; 83 } 84 85 overview->reset(); 86 int total = 0; 87#ifdef SK_DEBUG 88 double totPercent = 0, tempSum = 0; 89#endif 90 for (int i = 0; i < LAST_DRAWTYPE_ENUM+1; ++i) { 91 if (0 == counts[i]) { 92 // if there were no commands of this type then they should've consumed no time 93 SkASSERT(NULL == typeTimes || 0.0 == (*typeTimes)[i]); 94 continue; 95 } 96 97 overview->append(SkDrawCommand::GetCommandString((DrawType) i)); 98 overview->append(": "); 99 overview->appendS32(counts[i]); 100 if (NULL != typeTimes && totTime >= 0.0) { 101 overview->append(" - "); 102 overview->appendf("%.2f", (*typeTimes)[i]/(float)numRuns); 103 overview->append("ms"); 104 overview->append(" - "); 105 double percent = 100.0*(*typeTimes)[i]/totTime; 106 overview->appendf("%.2f", percent); 107 overview->append("%"); 108#ifdef SK_DEBUG 109 totPercent += percent; 110 tempSum += (*typeTimes)[i]; 111#endif 112 } 113 overview->append("<br/>"); 114 total += counts[i]; 115 } 116#ifdef SK_DEBUG 117 if (NULL != typeTimes) { 118 SkASSERT(SkScalarNearlyEqual(SkDoubleToScalar(totPercent), 119 SkDoubleToScalar(100.0))); 120 SkASSERT(SkScalarNearlyEqual(SkDoubleToScalar(tempSum), 121 SkDoubleToScalar(totTime))); 122 } 123#endif 124 125 if (totTime > 0.0) { 126 overview->append("Total Time: "); 127 overview->appendf("%.2f", totTime/(float)numRuns); 128 overview->append("ms"); 129#ifdef SK_DEBUG 130 overview->append(" "); 131 overview->appendScalar(SkDoubleToScalar(totPercent)); 132 overview->append("% "); 133#endif 134 overview->append("<br/>"); 135 } 136 137 SkString totalStr; 138 totalStr.append("Total Draw Commands: "); 139 totalStr.appendScalar(SkDoubleToScalar(total)); 140 totalStr.append("<br/>"); 141 overview->insert(0, totalStr); 142 143 overview->append("<br/>"); 144 overview->append("SkPicture Width: "); 145 overview->appendS32(pictureWidth()); 146 overview->append("px<br/>"); 147 overview->append("SkPicture Height: "); 148 overview->appendS32(pictureHeight()); 149 overview->append("px"); 150} 151