• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
SkDebugger()14 SkDebugger::SkDebugger() {
15     // Create this some other dynamic way?
16     fDebugCanvas = new SkDebugCanvas(0, 0);
17     fPicture = NULL;
18     fIndex = 0;
19 }
20 
~SkDebugger()21 SkDebugger::~SkDebugger() {
22     // Need to inherit from SkRef object in order for following to work
23     SkSafeUnref(fDebugCanvas);
24     SkSafeUnref(fPicture);
25 }
26 
loadPicture(SkPicture * picture)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 
copyPicture()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 
getOverviewText(const SkTDArray<double> * typeTimes,double totTime,SkString * overview,int numRuns)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 
getClipStackText(SkString * clipStack)155 void SkDebugger::getClipStackText(SkString* clipStack) {
156     clipStack->set(fDebugCanvas->clipStackData());
157 }
158