blob: 91ebf2b5bd724e87af8a7c159341ef8f53fa89f0 [file] [log] [blame]
robertphillips@google.com76f9e932013-01-15 20:17:47 +00001
2#ifdef SK_DEVELOPER
3
yangsu@google.comef7bdfa2011-08-12 14:27:47 +00004#include "SampleCode.h"
yangsu@google.comef7bdfa2011-08-12 14:27:47 +00005#include "SkOSMenu.h"
6
7#include "DebuggerViews.h"
8static const char gIsDebuggerQuery[] = "is-debugger";
9class DebuggerView : public SampleView {
10public:
robertphillips@google.com6853e802012-04-16 15:50:18 +000011 DebuggerView(const char* data, size_t size) {
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000012 fData.append(size, data);
13 fCommandsVisible = true;
14 fCommandsResizing = false;
15 fStateVisible = true;
16 fStateResizing = false;
rmistry@google.comd6176b02012-08-23 18:14:13 +000017
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000018 fCommands = new DebuggerCommandsView;
19 fCommands->setVisibleP(fCommandsVisible);
20 this->attachChildToFront(fCommands)->unref();
rmistry@google.comd6176b02012-08-23 18:14:13 +000021
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000022
23 fState = new DebuggerStateView;
24 fState->setVisibleP(fStateVisible);
25 this->attachChildToFront(fState)->unref();
rmistry@google.comd6176b02012-08-23 18:14:13 +000026
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000027 fAtomsToRead = 0;
28 fDisplayClip = false;
rmistry@google.comd6176b02012-08-23 18:14:13 +000029
30 fDumper = new SkDebugDumper(this->getSinkID(), fCommands->getSinkID(),
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000031 fState->getSinkID());
rmistry@google.comd6176b02012-08-23 18:14:13 +000032
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000033 fDumper->unload();
34 fAtomBounds.reset();
35 fFrameBounds.reset();
rmistry@google.comd6176b02012-08-23 18:14:13 +000036
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000037 SkDumpCanvas* dumpCanvas = new SkDumpCanvas(fDumper);
38 SkGPipeReader* dumpReader = new SkGPipeReader(dumpCanvas);
rmistry@google.comd6176b02012-08-23 18:14:13 +000039
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000040
41 if (size > 0) {
42 int offset = 0;
43 int frameBound = 0;
44 size_t bytesRead;
epoger@google.com17b78942011-08-26 14:40:38 +000045 while (static_cast<unsigned>(offset) < size) {
junov@chromium.orgfb103892012-09-20 19:35:43 +000046 SkGPipeReader::Status s =
47 dumpReader->playback(data + offset, size - offset,
48 SkGPipeReader::kReadAtom_PlaybackFlag, &bytesRead);
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000049 SkASSERT(SkGPipeReader::kError_Status != s);
50 offset += bytesRead;
rmistry@google.comd6176b02012-08-23 18:14:13 +000051
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000052 if (SkGPipeReader::kDone_Status == s) {
rmistry@google.comd6176b02012-08-23 18:14:13 +000053 fDumper->dump(dumpCanvas, SkDumpCanvas::kNULL_Verb,
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000054 "End of Frame", NULL);
55 delete dumpReader;
56 delete dumpCanvas;
57 dumpCanvas = new SkDumpCanvas(fDumper);
58 dumpReader = new SkGPipeReader(dumpCanvas);
59 frameBound = offset;
60 }
61 fAtomBounds.append(1, &offset);
62 fFrameBounds.append(1, &frameBound);
63 }
64 }
rmistry@google.comd6176b02012-08-23 18:14:13 +000065
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000066 delete dumpReader;
67 delete dumpCanvas;
rmistry@google.comd6176b02012-08-23 18:14:13 +000068
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000069 fDumper->load();
70 }
rmistry@google.comd6176b02012-08-23 18:14:13 +000071
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000072 ~DebuggerView() {
73 fAtomBounds.reset();
74 fFrameBounds.reset();
75 delete fDumper;
76 }
rmistry@google.comd6176b02012-08-23 18:14:13 +000077
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000078 virtual void requestMenu(SkOSMenu* menu) {
79 menu->setTitle("Debugger");
80 menu->appendSwitch("Show Commands", "Commands", this->getSinkID(), fCommandsVisible);
81 menu->appendSwitch("Show State", "State", this->getSinkID(), fStateVisible);
82 menu->appendSwitch("Display Clip", "Clip", this->getSinkID(), fDisplayClip);
83 }
rmistry@google.comd6176b02012-08-23 18:14:13 +000084
85
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000086 void goToAtom(int atom) {
87 if (atom != fAtomsToRead) {
88 fAtomsToRead = atom;
89 this->inval(NULL);
90 }
91 }
rmistry@google.comd6176b02012-08-23 18:14:13 +000092
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000093protected:
94 virtual bool onQuery(SkEvent* evt) {
95 if (SampleCode::TitleQ(*evt)) {
96 SampleCode::TitleR(evt, "Debugger");
97 return true;
98 }
99 if (evt->isType(gIsDebuggerQuery)) {
100 return true;
101 }
102 return this->INHERITED::onQuery(evt);
103 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000104
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000105 virtual bool onEvent(const SkEvent& evt) {
106 if (SkOSMenu::FindSwitchState(evt, "Commands", &fCommandsVisible) ||
107 SkOSMenu::FindSwitchState(evt, "State", &fStateVisible)) {
108 fCommands->setVisibleP(fCommandsVisible);
109 fState->setVisibleP(fStateVisible);
110 fStateOffset = (fCommandsVisible) ? fCommands->width() : 0;
111 fState->setSize(this->width() - fStateOffset, fState->height());
112 fState->setLoc(fStateOffset, this->height() - fState->height());
113 this->inval(NULL);
114 return true;
115 }
116 if (SkOSMenu::FindSwitchState(evt, "Clip", &fDisplayClip)) {
117 this->inval(NULL);
118 return true;
119 }
120 return this->INHERITED::onEvent(evt);
121 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000122
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000123 virtual void onDrawContent(SkCanvas* canvas) {
124 if (fData.count() <= 0)
125 return;
126 SkAutoCanvasRestore acr(canvas, true);
127 canvas->translate(fStateOffset, 0);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000128
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000129 int lastFrameBound = fFrameBounds[fAtomsToRead];
130 int toBeRead = fAtomBounds[fAtomsToRead] - lastFrameBound;
131 int firstChunk = (fAtomsToRead > 0) ? fAtomBounds[fAtomsToRead - 1] - lastFrameBound: 0;
132 if (toBeRead > 0) {
133 SkDumpCanvas* dumpCanvas = new SkDumpCanvas(fDumper);
134 SkGPipeReader* dumpReader = new SkGPipeReader(dumpCanvas);
135 SkGPipeReader* reader = new SkGPipeReader(canvas);
136 fDumper->disable();
rmistry@google.comd6176b02012-08-23 18:14:13 +0000137
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000138 int offset = 0;
139 size_t bytesRead;
140 SkGPipeReader::Status s;
141 //Read the first chunk
142 if (offset < firstChunk && firstChunk < toBeRead) {
junov@chromium.orgfb103892012-09-20 19:35:43 +0000143 s = dumpReader->playback(fData.begin() + offset, firstChunk - offset);
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000144 SkASSERT(SkGPipeReader::kError_Status != s);
junov@chromium.orgfb103892012-09-20 19:35:43 +0000145 s = reader->playback(fData.begin() + offset, firstChunk - offset, 0, &bytesRead);
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000146 SkASSERT(SkGPipeReader::kError_Status != s);
147 if (SkGPipeReader::kDone_Status == s){
148 delete dumpReader;
149 delete dumpCanvas;
150 dumpCanvas = new SkDumpCanvas(fDumper);
151 dumpReader = new SkGPipeReader(dumpCanvas);
152 delete reader;
153 reader = new SkGPipeReader(canvas);
154 }
155 offset += bytesRead;
156 }
157 SkASSERT(offset == firstChunk);
158 //Then read the current atom
159 fDumper->enable();
junov@chromium.orgfb103892012-09-20 19:35:43 +0000160 s = dumpReader->playback(fData.begin() + offset, toBeRead - offset,
161 SkGPipeReader::kReadAtom_PlaybackFlag);
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000162 SkASSERT(SkGPipeReader::kError_Status != s);
junov@chromium.orgfb103892012-09-20 19:35:43 +0000163 s = reader->playback(fData.begin() + offset, toBeRead - offset,
164 SkGPipeReader::kReadAtom_PlaybackFlag, &bytesRead);
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000165 SkASSERT(SkGPipeReader::kError_Status != s);
166
167 delete reader;
168 delete dumpReader;
169 delete dumpCanvas;
rmistry@google.comd6176b02012-08-23 18:14:13 +0000170
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000171 if (fDisplayClip) {
172 SkPaint p;
173 p.setColor(0x440000AA);
174 SkPath path;
175 canvas->getTotalClip().getBoundaryPath(&path);
176 canvas->drawPath(path, p);
177 }
178 }
179 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000180
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000181 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
182 return new Click(this);
183 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000184
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000185 virtual bool onClick(SkView::Click* click) {
186 SkPoint prev = click->fPrev;
187 SkPoint curr = click->fCurr;
188 bool handled = true;
189 switch (click->fState) {
190 case SkView::Click::kDown_State:
191 if (SkScalarAbs(curr.fX - fCommands->width()) <= SKDEBUGGER_RESIZEBARSIZE) {
192 fCommandsResizing = true;
193 }
194 else if (SkScalarAbs(curr.fY - (this->height() - fState->height())) <= SKDEBUGGER_RESIZEBARSIZE &&
195 curr.fX > fCommands->width()) {
196 fStateResizing = true;
197 }
198 else if (curr.fX < fCommands->width()) {
robertphillips@google.com6853e802012-04-16 15:50:18 +0000199 fAtomsToRead = fCommands->selectHighlight(
200 SkScalarFloorToInt(curr.fY));
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000201 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000202 else
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000203 handled = false;
204 break;
205 case SkView::Click::kMoved_State:
206 if (fCommandsResizing)
207 fCommands->setSize(curr.fX, this->height());
208 else if (fStateResizing)
209 fState->setSize(this->width(), this->height() - curr.fY);
210 else if (curr.fX < fCommands->width()) {
211 if (curr.fY - prev.fY < 0) {
212 fCommands->scrollDown();
213 }
214 if (curr.fY - prev.fY > 0) {
215 fCommands->scrollUp();
216 }
217 }
218 else
219 handled = false;
220 break;
221 case SkView::Click::kUp_State:
222 fStateResizing = fCommandsResizing = false;
223 break;
224 default:
225 break;
226 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000227
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000228 fStateOffset = fCommands->width();
229 fState->setSize(this->width() - fStateOffset, fState->height());
230 fState->setLoc(fStateOffset, this->height() - fState->height());
231 if (handled)
232 this->inval(NULL);
233 return handled;
234 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000235
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000236 virtual void onSizeChange() {
237 this->INHERITED::onSizeChange();
238 fCommands->setSize(CMD_WIDTH, this->height());
239 fCommands->setLoc(0, 0);
robertphillips@google.com6853e802012-04-16 15:50:18 +0000240 fState->setSize(this->width() - CMD_WIDTH, SkFloatToScalar(INFO_HEIGHT));
241 fState->setLoc(CMD_WIDTH, this->height() - SkFloatToScalar(INFO_HEIGHT));
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000242 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000243
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000244private:
245 DebuggerCommandsView* fCommands;
246 DebuggerStateView* fState;
247 bool fCommandsResizing;
248 bool fCommandsVisible;
249 bool fStateResizing;
250 bool fStateVisible;
251 float fStateOffset;
252 bool fDisplayClip;
253 int fAtomsToRead;
254 SkTDArray<int> fAtomBounds;
255 SkTDArray<int> fFrameBounds;
256 SkTDArray<char> fData;
257 SkDebugDumper* fDumper;
rmistry@google.comd6176b02012-08-23 18:14:13 +0000258
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000259 typedef SampleView INHERITED;
260};
261
262
263///////////////////////////////////////////////////////////////////////////////
264
bsalomon@google.com100abf42012-09-05 17:40:04 +0000265SkView* create_debugger(const char* data, size_t size);
266
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000267SkView* create_debugger(const char* data, size_t size) {
268 return SkNEW_ARGS(DebuggerView, (data, size));
269};
270
bsalomon@google.com100abf42012-09-05 17:40:04 +0000271bool is_debugger(SkView* view);
272
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000273bool is_debugger(SkView* view) {
274 SkEvent isDebugger(gIsDebuggerQuery);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000275 return view->doQuery(&isDebugger);
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000276}
robertphillips@google.com76f9e932013-01-15 20:17:47 +0000277
reed@google.com92228382013-01-15 20:34:54 +0000278#endif