OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkDebuggerGUI.h" | 8 #include "SkDebuggerGUI.h" |
9 #include "SkForceLinking.h" | 9 #include "SkForceLinking.h" |
10 #include "SkGraphics.h" | 10 #include "SkGraphics.h" |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 } | 230 } |
231 #endif | 231 #endif |
232 | 232 |
233 private: | 233 private: |
234 typedef SkPicturePlayback INHERITED; | 234 typedef SkPicturePlayback INHERITED; |
235 }; | 235 }; |
236 | 236 |
237 // Wrap SkPicture to allow installation of an SkTimedPicturePlayback object | 237 // Wrap SkPicture to allow installation of an SkTimedPicturePlayback object |
238 class SkTimedPicture : public SkPicture { | 238 class SkTimedPicture : public SkPicture { |
239 public: | 239 public: |
240 explicit SkTimedPicture(SkStream* stream, bool* success, SkPicture::InstallP
ixelRefProc proc, | 240 static SkTimedPicture* CreateTimedPicture(SkStream* stream, |
241 const SkTDArray<bool>& deletedCommands) { | 241 SkPicture::InstallPixelRefProc pro
c, |
242 if (success) { | 242 const SkTDArray<bool>& deletedComm
ands) { |
243 *success = false; | |
244 } | |
245 fRecord = NULL; | |
246 fPlayback = NULL; | |
247 fWidth = fHeight = 0; | |
248 | |
249 SkPictInfo info; | 243 SkPictInfo info; |
250 | 244 if (!StreamIsSKP(stream, &info)) { |
251 if (!stream->read(&info, sizeof(info))) { | 245 return NULL; |
252 return; | |
253 } | |
254 if (SkPicture::PICTURE_VERSION != info.fVersion) { | |
255 return; | |
256 } | 246 } |
257 | 247 |
| 248 SkTimedPicturePlayback* playback; |
| 249 // Check to see if there is a playback to recreate. |
258 if (stream->readBool()) { | 250 if (stream->readBool()) { |
259 fPlayback = SkNEW_ARGS(SkTimedPicturePlayback, | 251 playback = SkNEW_ARGS(SkTimedPicturePlayback, |
260 (stream, info, proc, deletedCommands)); | 252 (stream, info, proc, deletedCommands)); |
| 253 } else { |
| 254 playback = NULL; |
261 } | 255 } |
262 | 256 |
263 // do this at the end, so that they will be zero if we hit an error. | 257 return SkNEW_ARGS(SkTimedPicture, (playback, info.fWidth, info.fHeight))
; |
264 fWidth = info.fWidth; | |
265 fHeight = info.fHeight; | |
266 if (success) { | |
267 *success = true; | |
268 } | |
269 } | 258 } |
270 | 259 |
271 void resetTimes() { ((SkTimedPicturePlayback*) fPlayback)->resetTimes(); } | 260 void resetTimes() { ((SkTimedPicturePlayback*) fPlayback)->resetTimes(); } |
272 | 261 |
273 int count() const { return ((SkTimedPicturePlayback*) fPlayback)->count(); } | 262 int count() const { return ((SkTimedPicturePlayback*) fPlayback)->count(); } |
274 | 263 |
275 // return the fraction of the total time this command consumed | 264 // return the fraction of the total time this command consumed |
276 double time(int index) const { return ((SkTimedPicturePlayback*) fPlayback)-
>time(index); } | 265 double time(int index) const { return ((SkTimedPicturePlayback*) fPlayback)-
>time(index); } |
277 | 266 |
278 const SkTDArray<double>* typeTimes() const { return ((SkTimedPicturePlayback
*) fPlayback)->typeTimes(); } | 267 const SkTDArray<double>* typeTimes() const { return ((SkTimedPicturePlayback
*) fPlayback)->typeTimes(); } |
279 | 268 |
280 double totTime() const { return ((SkTimedPicturePlayback*) fPlayback)->totTi
me(); } | 269 double totTime() const { return ((SkTimedPicturePlayback*) fPlayback)->totTi
me(); } |
281 | 270 |
282 private: | 271 private: |
283 // disallow default ctor b.c. we don't have a good way to setup the fPlaybac
k ptr | 272 // disallow default ctor b.c. we don't have a good way to setup the fPlaybac
k ptr |
284 SkTimedPicture(); | 273 SkTimedPicture(); |
| 274 // Private ctor only used by CreateTimedPicture, which has created the playb
ack. |
| 275 SkTimedPicture(SkTimedPicturePlayback* playback, int width, int height) |
| 276 : INHERITED(playback, width, height) {} |
285 // disallow the copy ctor - enabling would require copying code from SkPictu
re | 277 // disallow the copy ctor - enabling would require copying code from SkPictu
re |
286 SkTimedPicture(const SkTimedPicture& src); | 278 SkTimedPicture(const SkTimedPicture& src); |
287 | 279 |
288 typedef SkPicture INHERITED; | 280 typedef SkPicture INHERITED; |
289 }; | 281 }; |
290 | 282 |
291 // This is a simplification of PictureBenchmark's run with the addition of | 283 // This is a simplification of PictureBenchmark's run with the addition of |
292 // clearing of the times after the first pass (in resetTimes) | 284 // clearing of the times after the first pass (in resetTimes) |
293 void SkDebuggerGUI::run(SkTimedPicture* pict, | 285 void SkDebuggerGUI::run(SkTimedPicture* pict, |
294 sk_tools::PictureRenderer* renderer, | 286 sk_tools::PictureRenderer* renderer, |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
331 return; | 323 return; |
332 } | 324 } |
333 | 325 |
334 SkFILEStream inputStream; | 326 SkFILEStream inputStream; |
335 | 327 |
336 inputStream.setPath(fFileName.c_str()); | 328 inputStream.setPath(fFileName.c_str()); |
337 if (!inputStream.isValid()) { | 329 if (!inputStream.isValid()) { |
338 return; | 330 return; |
339 } | 331 } |
340 | 332 |
341 bool success = false; | 333 SkAutoTUnref<SkTimedPicture> picture(SkTimedPicture::CreateTimedPicture(&inp
utStream, |
342 SkTimedPicture picture(&inputStream, &success, &SkImageDecoder::DecodeMemory
, | 334 &SkImageDecoder::DecodeMemory, fSkipCom
mands)); |
343 fSkipCommands); | 335 if (NULL == picture.get()) { |
344 if (!success) { | |
345 return; | 336 return; |
346 } | 337 } |
347 | 338 |
348 // For now this #if allows switching between tiled and simple rendering | 339 // For now this #if allows switching between tiled and simple rendering |
349 // modes. Eventually this will be accomplished via the GUI | 340 // modes. Eventually this will be accomplished via the GUI |
350 #if 0 | 341 #if 0 |
351 // With the current batch of SysTimers, profiling in tiled mode | 342 // With the current batch of SysTimers, profiling in tiled mode |
352 // gets swamped by the timing overhead: | 343 // gets swamped by the timing overhead: |
353 // | 344 // |
354 // tile mode simple mode | 345 // tile mode simple mode |
(...skipping 15 matching lines...) Expand all Loading... |
370 #if SK_SUPPORT_GPU | 361 #if SK_SUPPORT_GPU |
371 if (Qt::Checked == fSettingsWidget.getGLCheckBox()->checkState()) { | 362 if (Qt::Checked == fSettingsWidget.getGLCheckBox()->checkState()) { |
372 renderer->setDeviceType(sk_tools::PictureRenderer::kGPU_DeviceType); | 363 renderer->setDeviceType(sk_tools::PictureRenderer::kGPU_DeviceType); |
373 } | 364 } |
374 #endif | 365 #endif |
375 | 366 |
376 #endif | 367 #endif |
377 | 368 |
378 static const int kNumRepeats = 10; | 369 static const int kNumRepeats = 10; |
379 | 370 |
380 run(&picture, renderer, kNumRepeats); | 371 run(picture.get(), renderer, kNumRepeats); |
381 | 372 |
382 SkASSERT(picture.count() == fListWidget.count()); | 373 SkASSERT(picture->count() == fListWidget.count()); |
383 | 374 |
384 // extract the individual command times from the SkTimedPlaybackPicture | 375 // extract the individual command times from the SkTimedPlaybackPicture |
385 for (int i = 0; i < picture.count(); ++i) { | 376 for (int i = 0; i < picture->count(); ++i) { |
386 double temp = picture.time(i); | 377 double temp = picture->time(i); |
387 | 378 |
388 QListWidgetItem* item = fListWidget.item(i); | 379 QListWidgetItem* item = fListWidget.item(i); |
389 | 380 |
390 item->setData(Qt::UserRole + 4, 100.0*temp); | 381 item->setData(Qt::UserRole + 4, 100.0*temp); |
391 } | 382 } |
392 | 383 |
393 setupOverviewText(picture.typeTimes(), picture.totTime(), kNumRepeats); | 384 setupOverviewText(picture->typeTimes(), picture->totTime(), kNumRepeats); |
394 } | 385 } |
395 | 386 |
396 void SkDebuggerGUI::actionCancel() { | 387 void SkDebuggerGUI::actionCancel() { |
397 for (int row = 0; row < fListWidget.count(); row++) { | 388 for (int row = 0; row < fListWidget.count(); row++) { |
398 fListWidget.item(row)->setHidden(false); | 389 fListWidget.item(row)->setHidden(false); |
399 } | 390 } |
400 } | 391 } |
401 | 392 |
402 void SkDebuggerGUI::actionClearBreakpoints() { | 393 void SkDebuggerGUI::actionClearBreakpoints() { |
403 for (int row = 0; row < fListWidget.count(); row++) { | 394 for (int row = 0; row < fListWidget.count(); row++) { |
(...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
898 if (f.contains(r)) | 889 if (f.contains(r)) |
899 fDirectoryWidget.addItem(f); | 890 fDirectoryWidget.addItem(f); |
900 } | 891 } |
901 } | 892 } |
902 | 893 |
903 void SkDebuggerGUI::loadPicture(const SkString& fileName) { | 894 void SkDebuggerGUI::loadPicture(const SkString& fileName) { |
904 fFileName = fileName; | 895 fFileName = fileName; |
905 fLoading = true; | 896 fLoading = true; |
906 SkStream* stream = SkNEW_ARGS(SkFILEStream, (fileName.c_str())); | 897 SkStream* stream = SkNEW_ARGS(SkFILEStream, (fileName.c_str())); |
907 | 898 |
908 bool success = false; | 899 SkPicture* picture = SkPicture::CreateFromStream(stream); |
909 | 900 |
910 SkPicture* picture = SkNEW_ARGS(SkPicture, | 901 if (NULL == picture) { |
911 (stream, &success, &SkImageDecoder::DecodeMe
mory)); | |
912 | |
913 if (!success) { | |
914 QMessageBox::critical(this, "Error loading file", "Couldn't read file, s
orry."); | 902 QMessageBox::critical(this, "Error loading file", "Couldn't read file, s
orry."); |
915 SkSafeUnref(stream); | 903 SkSafeUnref(stream); |
916 return; | 904 return; |
917 } | 905 } |
918 | 906 |
919 fCanvasWidget.resetWidgetTransform(); | 907 fCanvasWidget.resetWidgetTransform(); |
920 fDebugger.loadPicture(picture); | 908 fDebugger.loadPicture(picture); |
921 | 909 |
922 fSkipCommands.setCount(fDebugger.getSize()); | 910 fSkipCommands.setCount(fDebugger.getSize()); |
923 for (int i = 0; i < fSkipCommands.count(); ++i) { | 911 for (int i = 0; i < fSkipCommands.count(); ++i) { |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1004 } | 992 } |
1005 | 993 |
1006 // NOTE(chudy): Makes first item unselectable. | 994 // NOTE(chudy): Makes first item unselectable. |
1007 QStandardItemModel* model = qobject_cast<QStandardItemModel*>( | 995 QStandardItemModel* model = qobject_cast<QStandardItemModel*>( |
1008 fFilter.model()); | 996 fFilter.model()); |
1009 QModelIndex firstIndex = model->index(0, fFilter.modelColumn(), | 997 QModelIndex firstIndex = model->index(0, fFilter.modelColumn(), |
1010 fFilter.rootModelIndex()); | 998 fFilter.rootModelIndex()); |
1011 QStandardItem* firstItem = model->itemFromIndex(firstIndex); | 999 QStandardItem* firstItem = model->itemFromIndex(firstIndex); |
1012 firstItem->setSelectable(false); | 1000 firstItem->setSelectable(false); |
1013 } | 1001 } |
OLD | NEW |