SkDebugger.cpp revision 57f74e0aa931e7784d47cba3ecc83020aa8e72b2
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 "SkString.h" 11 12 13SkDebugger::SkDebugger() { 14 // Create this some other dynamic way? 15 fDebugCanvas = new SkDebugCanvas(100, 100); 16 fPicture = NULL; 17 fPictureWidth = 0; 18 fPictureHeight = 0; 19 fIndex = 0; 20} 21 22SkDebugger::~SkDebugger() { 23 // Need to inherit from SkRef object in order for following to work 24 SkSafeUnref(fDebugCanvas); 25 SkSafeUnref(fPicture); 26} 27 28void SkDebugger::loadPicture(SkPicture* picture) { 29 fPictureWidth = picture->width(); 30 fPictureHeight = picture->height(); 31 delete fDebugCanvas; 32 fDebugCanvas = new SkDebugCanvas(fPictureWidth, fPictureHeight); 33 fDebugCanvas->setBounds(fPictureWidth, fPictureHeight); 34 fDebugCanvas->setPicture(picture); 35 picture->draw(fDebugCanvas); 36 fDebugCanvas->setPicture(NULL); 37 fIndex = fDebugCanvas->getSize() - 1; 38 SkRefCnt_SafeAssign(fPicture, picture); 39} 40 41SkPicture* SkDebugger::copyPicture() { 42 // We can't just call clone here since we want to removed the "deleted" 43 // commands. Playing back will strip those out. 44 SkPicture* newPicture = new SkPicture; 45 SkCanvas* canvas = newPicture->beginRecording(fPictureWidth, fPictureHeight); 46 47 bool vizMode = fDebugCanvas->getMegaVizMode(); 48 fDebugCanvas->setMegaVizMode(false); 49 bool overDraw = fDebugCanvas->getOverdrawViz(); 50 fDebugCanvas->setOverdrawViz(false); 51 int saveCount = fDebugCanvas->getOutstandingSaveCount(); 52 fDebugCanvas->setOutstandingSaveCount(0); 53 54 fDebugCanvas->draw(canvas); 55 56 int temp = fDebugCanvas->getOutstandingSaveCount(); 57 for (int i = 0; i < temp; ++i) { 58 canvas->restore(); 59 } 60 61 fDebugCanvas->setMegaVizMode(vizMode); 62 fDebugCanvas->setOverdrawViz(overDraw); 63 fDebugCanvas->setOutstandingSaveCount(saveCount); 64 65 newPicture->endRecording(); 66 return newPicture; 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