SkDebugger.cpp revision 5fb2ce38b3dcb8e60e9e112df23c9d42456d7069
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 SkPictureRecorder recorder; 45 SkCanvas* canvas = recorder.beginRecording(fPictureWidth, fPictureHeight, NULL, 0); 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 return recorder.endRecording(); 66} 67 68void SkDebugger::getOverviewText(const SkTDArray<double>* typeTimes, 69 double totTime, 70 SkString* overview, 71 int numRuns) { 72 const SkTDArray<SkDrawCommand*>& commands = this->getDrawCommands(); 73 74 SkTDArray<int> counts; 75 counts.setCount(LAST_DRAWTYPE_ENUM+1); 76 for (int i = 0; i < LAST_DRAWTYPE_ENUM+1; ++i) { 77 counts[i] = 0; 78 } 79 80 for (int i = 0; i < commands.count(); i++) { 81 counts[commands[i]->getType()]++; 82 } 83 84 overview->reset(); 85 int total = 0; 86#ifdef SK_DEBUG 87 double totPercent = 0, tempSum = 0; 88#endif 89 for (int i = 0; i < LAST_DRAWTYPE_ENUM+1; ++i) { 90 if (0 == counts[i]) { 91 // if there were no commands of this type then they should've consumed no time 92 SkASSERT(NULL == typeTimes || 0.0 == (*typeTimes)[i]); 93 continue; 94 } 95 96 overview->append(SkDrawCommand::GetCommandString((DrawType) i)); 97 overview->append(": "); 98 overview->appendS32(counts[i]); 99 if (NULL != typeTimes && totTime >= 0.0) { 100 overview->append(" - "); 101 overview->appendf("%.2f", (*typeTimes)[i]/(float)numRuns); 102 overview->append("ms"); 103 overview->append(" - "); 104 double percent = 100.0*(*typeTimes)[i]/totTime; 105 overview->appendf("%.2f", percent); 106 overview->append("%"); 107#ifdef SK_DEBUG 108 totPercent += percent; 109 tempSum += (*typeTimes)[i]; 110#endif 111 } 112 overview->append("<br/>"); 113 total += counts[i]; 114 } 115#ifdef SK_DEBUG 116 if (NULL != typeTimes) { 117 SkASSERT(SkScalarNearlyEqual(SkDoubleToScalar(totPercent), 118 SkDoubleToScalar(100.0))); 119 SkASSERT(SkScalarNearlyEqual(SkDoubleToScalar(tempSum), 120 SkDoubleToScalar(totTime))); 121 } 122#endif 123 124 if (totTime > 0.0) { 125 overview->append("Total Time: "); 126 overview->appendf("%.2f", totTime/(float)numRuns); 127 overview->append("ms"); 128#ifdef SK_DEBUG 129 overview->append(" "); 130 overview->appendScalar(SkDoubleToScalar(totPercent)); 131 overview->append("% "); 132#endif 133 overview->append("<br/>"); 134 } 135 136 SkString totalStr; 137 totalStr.append("Total Draw Commands: "); 138 totalStr.appendScalar(SkDoubleToScalar(total)); 139 totalStr.append("<br/>"); 140 overview->insert(0, totalStr); 141 142 overview->append("<br/>"); 143 overview->append("SkPicture Width: "); 144 overview->appendS32(pictureWidth()); 145 overview->append("px<br/>"); 146 overview->append("SkPicture Height: "); 147 overview->appendS32(pictureHeight()); 148 overview->append("px"); 149} 150