SkDebuggerGUI.cpp revision 2d40ec4e9a3fb3540756fa45a6cffd541ada2c78
1902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com/* 2902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com * Copyright 2012 Google Inc. 3902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com * 4902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com * Use of this source code is governed by a BSD-style license that can be 5902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com * found in the LICENSE file. 6902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com */ 7902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 8902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "SkDebuggerGUI.h" 9bbad34de3b117347bedea619feaf1685586d4202chudy@google.com#include "SkGraphics.h" 10b4467e642e1c0772940cb266cae46f5fda399952scroggo@google.com#include "SkImageDecoder.h" 11902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include <QListWidgetItem> 122bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com#include "PictureRenderer.h" 132bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com#include "SkPictureRecord.h" 142bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com#include "SkPicturePlayback.h" 15e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com 16e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com#if defined(SK_BUILD_FOR_WIN32) 17e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com #include "BenchSysTimer_windows.h" 18e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com#elif defined(SK_BUILD_FOR_MAC) 19e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com #include "BenchSysTimer_mach.h" 20e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com#elif defined(SK_BUILD_FOR_UNIX) || defined(SK_BUILD_FOR_ANDROID) 21e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com #include "BenchSysTimer_posix.h" 22e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com#else 23e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com #include "BenchSysTimer_c.h" 24e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com#endif 25e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com 26902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 27902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comSkDebuggerGUI::SkDebuggerGUI(QWidget *parent) : 28c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QMainWindow(parent) 292d537a18f49cb492358c2b051f4786075dd9406cchudy@google.com , fCentralWidget(this) 302d537a18f49cb492358c2b051f4786075dd9406cchudy@google.com , fStatusBar(this) 312d537a18f49cb492358c2b051f4786075dd9406cchudy@google.com , fToolBar(this) 32c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fActionOpen(this) 33c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fActionBreakpoint(this) 34d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com , fActionProfile(this) 35c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fActionCancel(this) 367e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com , fActionClearBreakpoints(this) 37e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com , fActionClearDeletes(this) 38c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fActionClose(this) 39e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com , fActionCreateBreakpoint(this) 40c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fActionDelete(this) 41c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fActionDirectory(this) 42c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fActionGoToLine(this) 43c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fActionInspector(this) 44c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fActionPlay(this) 45e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com , fActionPause(this) 46c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fActionRewind(this) 470ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com , fActionSave(this) 480ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com , fActionSaveAs(this) 497e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com , fActionShowDeletes(this) 50c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fActionStepBack(this) 51c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fActionStepForward(this) 52a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com , fActionZoomIn(this) 53a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com , fActionZoomOut(this) 54a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com , fMapper(this) 55c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fListWidget(&fCentralWidget) 56c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fDirectoryWidget(&fCentralWidget) 57607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com , fCanvasWidget(this, &fDebugger) 586dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com , fImageWidget(&fDebugger) 59c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fMenuBar(this) 60c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fMenuFile(this) 61c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fMenuNavigate(this) 62c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com , fMenuView(this) 637e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com , fBreakpointsActivated(false) 647e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com , fDeletesActivated(false) 657e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com , fPause(false) 66d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com , fLoading(false) 67c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com{ 68902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com setupUi(this); 69dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com fListWidget.setSelectionMode(QAbstractItemView::ExtendedSelection); 70ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(&fListWidget, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(registerListClick(QListWidgetItem *))); 71c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com connect(&fActionOpen, SIGNAL(triggered()), this, SLOT(openFile())); 72ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(&fActionDirectory, SIGNAL(triggered()), this, SLOT(toggleDirectory())); 73ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(&fDirectoryWidget, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(loadFile(QListWidgetItem *))); 74c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com connect(&fActionDelete, SIGNAL(triggered()), this, SLOT(actionDelete())); 75ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(&fListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(toggleBreakpoint())); 76c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com connect(&fActionRewind, SIGNAL(triggered()), this, SLOT(actionRewind())); 77c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com connect(&fActionPlay, SIGNAL(triggered()), this, SLOT(actionPlay())); 78c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com connect(&fActionStepBack, SIGNAL(triggered()), this, SLOT(actionStepBack())); 79ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(&fActionStepForward, SIGNAL(triggered()), this, SLOT(actionStepForward())); 80ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(&fActionBreakpoint, SIGNAL(triggered()), this, SLOT(actionBreakpoints())); 81ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(&fActionInspector, SIGNAL(triggered()), this, SLOT(actionInspector())); 82ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(&fActionInspector, SIGNAL(triggered()), this, SLOT(actionSettings())); 83ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(&fFilter, SIGNAL(activated(QString)), this, SLOT(toggleFilter(QString))); 84d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com connect(&fActionProfile, SIGNAL(triggered()), this, SLOT(actionProfile())); 85c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com connect(&fActionCancel, SIGNAL(triggered()), this, SLOT(actionCancel())); 867e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com connect(&fActionClearBreakpoints, SIGNAL(triggered()), this, SLOT(actionClearBreakpoints())); 877e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com connect(&fActionClearDeletes, SIGNAL(triggered()), this, SLOT(actionClearDeletes())); 88c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com connect(&fActionClose, SIGNAL(triggered()), this, SLOT(actionClose())); 89ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(fSettingsWidget.getVisibilityButton(), SIGNAL(toggled(bool)), this, SLOT(actionCommandFilter())); 90ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(fSettingsWidget.getGLCheckBox(), SIGNAL(toggled(bool)), this, SLOT(actionGLWidget(bool))); 91ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(fSettingsWidget.getRasterCheckBox(), SIGNAL(toggled(bool)), this, SLOT(actionRasterWidget(bool))); 92f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com connect(fSettingsWidget.getOverdrawVizCheckBox(), SIGNAL(toggled(bool)), this, SLOT(actionOverdrawVizWidget(bool))); 93ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(&fActionPause, SIGNAL(toggled(bool)), this, SLOT(pauseDrawing(bool))); 94e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com connect(&fActionCreateBreakpoint, SIGNAL(activated()), this, SLOT(toggleBreakpoint())); 957e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com connect(&fActionShowDeletes, SIGNAL(triggered()), this, SLOT(showDeletes())); 96ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(&fCanvasWidget, SIGNAL(hitChanged(int)), this, SLOT(selectCommand(int))); 97ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(&fCanvasWidget, SIGNAL(hitChanged(int)), &fSettingsWidget, SLOT(updateHit(int))); 98ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(&fCanvasWidget, SIGNAL(scaleFactorChanged(float)), this, SLOT(actionScale(float))); 99ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com connect(&fCanvasWidget, SIGNAL(commandChanged(int)), &fSettingsWidget, SLOT(updateCommand(int))); 1000ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com connect(&fActionSaveAs, SIGNAL(triggered()), this, SLOT(actionSaveAs())); 1010ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com connect(&fActionSave, SIGNAL(triggered()), this, SLOT(actionSave())); 1027e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com 103e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com fMapper.setMapping(&fActionZoomIn, SkCanvasWidget::kIn_ZoomCommand); 104e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com fMapper.setMapping(&fActionZoomOut, SkCanvasWidget::kOut_ZoomCommand); 105a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com 106a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com connect(&fActionZoomIn, SIGNAL(triggered()), &fMapper, SLOT(map())); 107a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com connect(&fActionZoomOut, SIGNAL(triggered()), &fMapper, SLOT(map())); 108e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com connect(&fMapper, SIGNAL(mapped(int)), &fCanvasWidget, SLOT(zoom(int))); 109a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com 1107e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fInspectorWidget.setDisabled(true); 111d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com fMenuEdit.setDisabled(true); 112d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com fMenuNavigate.setDisabled(true); 113d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com fMenuView.setDisabled(true); 114bbad34de3b117347bedea619feaf1685586d4202chudy@google.com 115bbad34de3b117347bedea619feaf1685586d4202chudy@google.com SkGraphics::Init(); 116902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 117902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 118bbad34de3b117347bedea619feaf1685586d4202chudy@google.comSkDebuggerGUI::~SkDebuggerGUI() { 119bbad34de3b117347bedea619feaf1685586d4202chudy@google.com SkGraphics::Term(); 120bbad34de3b117347bedea619feaf1685586d4202chudy@google.com} 121902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 122902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionBreakpoints() { 1237e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fBreakpointsActivated = !fBreakpointsActivated; 1247e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com for (int row = 0; row < fListWidget.count(); row++) { 1257e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com QListWidgetItem *item = fListWidget.item(row); 1267e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com item->setHidden(item->checkState() == Qt::Unchecked && fBreakpointsActivated); 127902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 1287e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com} 129902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 1307e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.comvoid SkDebuggerGUI::showDeletes() { 1317e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fDeletesActivated = !fDeletesActivated; 132c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com for (int row = 0; row < fListWidget.count(); row++) { 133c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QListWidgetItem *item = fListWidget.item(row); 134607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com item->setHidden(fDebugger.isCommandVisible(row) 135607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com && fDeletesActivated); 136902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 137902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 138902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 1392bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com// The timed picture playback uses the SkPicturePlayback's profiling stubs 1402bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com// to time individual commands. The offsets are needed to map SkPicture 1412bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com// offsets to individual commands. 1422bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.comclass SkTimedPicturePlayback : public SkPicturePlayback { 1432bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.compublic: 1442bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com SkTimedPicturePlayback(SkStream* stream, const SkPictInfo& info, bool* isValid, 1452bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com SkSerializationHelpers::DecodeBitmap decoder, 1465f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com const SkTDArray<size_t>& offsets, 1475f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com const SkTDArray<bool>& deletedCommands) 1482bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com : INHERITED(stream, info, isValid, decoder) 1495f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com , fOffsets(offsets) 150e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com , fSkipCommands(deletedCommands) 151e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com , fTot(0.0) 152e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com , fCurCommand(0) { 1532bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com fTimes.setCount(fOffsets.count()); 1548a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com fTypeTimes.setCount(LAST_DRAWTYPE_ENUM+1); 1558a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com this->resetTimes(); 1568a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com } 1578a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 1588a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com void resetTimes() { 1592bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com for (int i = 0; i < fOffsets.count(); ++i) { 1608a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com fTimes[i] = 0.0; 1612bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 1628a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com for (int i = 0; i < fTypeTimes.count(); ++i) { 1638a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com fTypeTimes[i] = 0.0f; 1648a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com } 1658a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com fTot = 0.0; 1662bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 1672bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 1682bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com int count() const { return fTimes.count(); } 1692bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 1702bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com double time(int index) const { return fTimes[index] / fTot; } 1712bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 1728a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com const SkTDArray<double>* typeTimes() const { return &fTypeTimes; } 1738a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 1748a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com double totTime() const { return fTot; } 1758a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 1762bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.comprotected: 177e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com BenchSysTimer fTimer; 1782bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com SkTDArray<size_t> fOffsets; // offset in the SkPicture for each command 1795f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com SkTDArray<bool> fSkipCommands; // has the command been deleted in the GUI? 1802bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com SkTDArray<double> fTimes; // sum of time consumed for each command 1818a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com SkTDArray<double> fTypeTimes; // sum of time consumed for each type of command (e.g., drawPath) 1822bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com double fTot; // total of all times in 'fTimes' 1832bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com size_t fCurOffset; 1848a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com int fCurType; 1852bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com int fCurCommand; // the current command being executed/timed 1862bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 187ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com virtual size_t preDraw(size_t offset, int type) { 188884e60be30e20f38b3466a4697081187d2f1f814skia.committer@gmail.com // This search isn't as bad as it seems. In normal playback mode, the 1892bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com // base class steps through the commands in order and can only skip ahead 190884e60be30e20f38b3466a4697081187d2f1f814skia.committer@gmail.com // a bit on a clip. This class is only used during profiling so we 1912bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com // don't have to worry about forward/backward scrubbing through commands. 1922bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com for (int i = 0; offset != fOffsets[fCurCommand]; ++i) { 1932bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com fCurCommand = (fCurCommand+1) % fOffsets.count(); 1942bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com SkASSERT(i <= fOffsets.count()); // should always find the offset in the list 1952bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 1962bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 1975f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com if (fSkipCommands[fCurCommand]) { 1985f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com while (fCurCommand < fSkipCommands.count() && fSkipCommands[fCurCommand]) { 1995f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com ++fCurCommand; 2005f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com } 2015f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com if (fCurCommand == fSkipCommands.count()) { 2025f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com // Signal SkPicturePlayback to stop playing back 2035f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com return SK_MaxU32; 2045f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com } 2055f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com return fOffsets[fCurCommand]; 2065f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com } 2075f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com 2082bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com fCurOffset = offset; 2098a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com fCurType = type; 2108a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com // The SkDebugCanvas doesn't recognize these types. This class needs to 2118a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com // convert or else we'll wind up with a mismatch between the type counts 2128a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com // the debugger displays and the profile times. 2138a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com if (DRAW_POS_TEXT_TOP_BOTTOM == type) { 2148a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com fCurType = DRAW_POS_TEXT; 2158a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com } else if (DRAW_POS_TEXT_H_TOP_BOTTOM == type) { 2168a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com fCurType = DRAW_POS_TEXT_H; 2178a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com } 2182bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 219e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com#if defined(SK_BUILD_FOR_WIN32) 220e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com // CPU timer doesn't work well on Windows 221e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com fTimer.startWall(); 222e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com#else 223e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com fTimer.startCpu(); 224e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com#endif 2255f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com 2265f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com return 0; 2272bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 2282bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 229ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com virtual void postDraw(size_t offset) { 230e099bc403ca85be61cf23e67661e6a795fbcc40arobertphillips@google.com#if defined(SK_BUILD_FOR_WIN32) 231e099bc403ca85be61cf23e67661e6a795fbcc40arobertphillips@google.com // CPU timer doesn't work well on Windows 232e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com double time = fTimer.endWall(); 233e099bc403ca85be61cf23e67661e6a795fbcc40arobertphillips@google.com#else 234e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com double time = fTimer.endCpu(); 235e099bc403ca85be61cf23e67661e6a795fbcc40arobertphillips@google.com#endif 236e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com 237e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com SkASSERT(offset == fCurOffset); 238e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com SkASSERT(fCurType <= LAST_DRAWTYPE_ENUM); 239e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com 240e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com fTimes[fCurCommand] += time; 241e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com fTypeTimes[fCurType] += time; 242e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com fTot += time; 2432bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 2442bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 2452bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.comprivate: 2462bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com typedef SkPicturePlayback INHERITED; 2472bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com}; 2482bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 2492bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com// Wrap SkPicture to allow installation of an SkTimedPicturePlayback object 2502bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.comclass SkTimedPicture : public SkPicture { 2512bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.compublic: 2522bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com explicit SkTimedPicture(SkStream* stream, 2532bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com bool* success, 2542bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com SkSerializationHelpers::DecodeBitmap decoder, 2555f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com const SkTDArray<size_t>& offsets, 2565f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com const SkTDArray<bool>& deletedCommands) { 2572bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com if (success) { 2582bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com *success = false; 2592bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 2602bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com fRecord = NULL; 2612bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com fPlayback = NULL; 2622bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com fWidth = fHeight = 0; 2632bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 2642bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com SkPictInfo info; 2652bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 2662bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com if (!stream->read(&info, sizeof(info))) { 2672bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com return; 2682bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 2692bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com if (SkPicture::PICTURE_VERSION != info.fVersion) { 2702bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com return; 2712bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 2722bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 2732bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com if (stream->readBool()) { 2742bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com bool isValid = false; 275884e60be30e20f38b3466a4697081187d2f1f814skia.committer@gmail.com fPlayback = SkNEW_ARGS(SkTimedPicturePlayback, 2765f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com (stream, info, &isValid, decoder, offsets, deletedCommands)); 2772bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com if (!isValid) { 2782bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com SkDELETE(fPlayback); 2792bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com fPlayback = NULL; 2802bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com return; 2812bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 2822bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 2832bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 2842bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com // do this at the end, so that they will be zero if we hit an error. 2852bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com fWidth = info.fWidth; 2862bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com fHeight = info.fHeight; 2872bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com if (success) { 2882bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com *success = true; 2892bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 2902bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 2912bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 2928a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com void resetTimes() { ((SkTimedPicturePlayback*) fPlayback)->resetTimes(); } 2938a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 2942bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com int count() const { return ((SkTimedPicturePlayback*) fPlayback)->count(); } 2952bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 2962bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com // return the fraction of the total time this command consumed 2972bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com double time(int index) const { return ((SkTimedPicturePlayback*) fPlayback)->time(index); } 2982bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 2998a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com const SkTDArray<double>* typeTimes() const { return ((SkTimedPicturePlayback*) fPlayback)->typeTimes(); } 3008a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 3018a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com double totTime() const { return ((SkTimedPicturePlayback*) fPlayback)->totTime(); } 3028a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 3032bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.comprivate: 3048a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com // disallow default ctor b.c. we don't have a good way to setup the fPlayback ptr 3058a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com SkTimedPicture(); 3068a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com // disallow the copy ctor - enabling would require copying code from SkPicture 3078a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com SkTimedPicture(const SkTimedPicture& src); 3088a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 3092bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com typedef SkPicture INHERITED; 3102bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com}; 3112bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 3128a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com// This is a simplification of PictureBenchmark's run with the addition of 3138a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com// clearing of the times after the first pass (in resetTimes) 3143458716b52aa25dcd1b270141c7628c380696e35skia.committer@gmail.comvoid SkDebuggerGUI::run(SkTimedPicture* pict, 3153458716b52aa25dcd1b270141c7628c380696e35skia.committer@gmail.com sk_tools::PictureRenderer* renderer, 3168a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com int repeats) { 3178a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com SkASSERT(pict); 3188a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com if (NULL == pict) { 3198a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com return; 3208a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com } 3218a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 3228a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com SkASSERT(renderer != NULL); 3238a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com if (NULL == renderer) { 3248a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com return; 3258a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com } 3268a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 3278a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com renderer->init(pict); 3288a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 3298a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com renderer->setup(); 3308a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com renderer->render(NULL); 331ade32668eb641dde914f9199b3209d9818828035jvanverth@google.com renderer->resetState(true); 3328a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 3338a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com // We throw this away the first batch of times to remove first time effects (such as paging in this program) 3348a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com pict->resetTimes(); 3358a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 3368a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com for (int i = 0; i < repeats; ++i) { 3378a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com renderer->setup(); 3388a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com renderer->render(NULL); 339ade32668eb641dde914f9199b3209d9818828035jvanverth@google.com renderer->resetState(true); 3408a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com } 3418a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 3428a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com renderer->end(); 3438a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com} 3448a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 345d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.comvoid SkDebuggerGUI::actionProfile() { 3462bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com // In order to profile we pass the command offsets (that were read-in 3472bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com // in loadPicture by the SkOffsetPicture) to an SkTimedPlaybackPicture. 348884e60be30e20f38b3466a4697081187d2f1f814skia.committer@gmail.com // The SkTimedPlaybackPicture in turn passes the offsets to an 3492bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com // SkTimedPicturePlayback object which uses them to track the performance 3502bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com // of individual commands. 3512bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com if (fFileName.isEmpty()) { 3522bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com return; 3532bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 3542bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 3552bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com SkFILEStream inputStream; 3562bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 3572bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com inputStream.setPath(fFileName.c_str()); 3582bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com if (!inputStream.isValid()) { 3592bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com return; 3602bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 3612bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 3622bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com bool success = false; 363c1f224ac07b1310211e0219a4d6bda41e49abe90skia.committer@gmail.com SkTimedPicture picture(&inputStream, &success, &SkImageDecoder::DecodeStream, 3645f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com fOffsets, fSkipCommands); 3652bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com if (!success) { 3662bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com return; 3672bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 3682bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 3698a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com // For now this #if allows switching between tiled and simple rendering 3708a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com // modes. Eventually this will be accomplished via the GUI 371e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com#if 0 372e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com // With the current batch of SysTimers, profiling in tiled mode 373e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com // gets swamped by the timing overhead: 374e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com // 375e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com // tile mode simple mode 376e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com // debugger 64.2ms 12.8ms 377e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com // bench_pictures 16.9ms 12.4ms 378e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com // 379e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com // This is b.c. in tiled mode each command is called many more times 380e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com // but typically does less work on each invocation (due to clipping) 3812bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com sk_tools::TiledPictureRenderer* renderer = NULL; 3822bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 3832bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com renderer = SkNEW(sk_tools::TiledPictureRenderer); 3842bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com renderer->setTileWidth(256); 3852bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com renderer->setTileHeight(256); 3868a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com#else 3878a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com sk_tools::SimplePictureRenderer* renderer = NULL; 3882bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 3898a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com renderer = SkNEW(sk_tools::SimplePictureRenderer); 3901447aa3f3b9a4c23ac1fbc70c476828966980c9drobertphillips@google.com 3911447aa3f3b9a4c23ac1fbc70c476828966980c9drobertphillips@google.com#if SK_SUPPORT_GPU 3921447aa3f3b9a4c23ac1fbc70c476828966980c9drobertphillips@google.com if (Qt::Checked == fSettingsWidget.getGLCheckBox()->checkState()) { 3931447aa3f3b9a4c23ac1fbc70c476828966980c9drobertphillips@google.com renderer->setDeviceType(sk_tools::PictureRenderer::kGPU_DeviceType); 3941447aa3f3b9a4c23ac1fbc70c476828966980c9drobertphillips@google.com } 3951447aa3f3b9a4c23ac1fbc70c476828966980c9drobertphillips@google.com#endif 3961447aa3f3b9a4c23ac1fbc70c476828966980c9drobertphillips@google.com 3978a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com#endif 3982bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 399e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com static const int kNumRepeats = 10; 400e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com 401e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com run(&picture, renderer, kNumRepeats); 4022bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 4032bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com SkASSERT(picture.count() == fListWidget.count()); 4042bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 4052bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com // extract the individual command times from the SkTimedPlaybackPicture 4062bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com for (int i = 0; i < picture.count(); ++i) { 4072bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com double temp = picture.time(i); 4082bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 4092bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com QListWidgetItem* item = fListWidget.item(i); 4102bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 4112bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com item->setData(Qt::UserRole + 4, 100.0*temp); 4122bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 4138a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 4148a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com setupOverviewText(picture.typeTimes(), picture.totTime()); 415d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com} 416d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com 417902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionCancel() { 418c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com for (int row = 0; row < fListWidget.count(); row++) { 419c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fListWidget.item(row)->setHidden(false); 420902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 421902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 422902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 4237e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.comvoid SkDebuggerGUI::actionClearBreakpoints() { 4247e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com for (int row = 0; row < fListWidget.count(); row++) { 4257e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com QListWidgetItem* item = fListWidget.item(row); 4267e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com item->setCheckState(Qt::Unchecked); 4277e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com item->setData(Qt::DecorationRole, 4288e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com QPixmap(":/blank.png")); 4297e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com } 4307e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com} 4317e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com 4327e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.comvoid SkDebuggerGUI::actionClearDeletes() { 4337e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com for (int row = 0; row < fListWidget.count(); row++) { 4347e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com QListWidgetItem* item = fListWidget.item(row); 4358e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com item->setData(Qt::UserRole + 2, QPixmap(":/blank.png")); 436607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com fDebugger.setCommandVisible(row, true); 4375f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com fSkipCommands[row] = false; 4387e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com } 4397e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com if (fPause) { 4407e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fCanvasWidget.drawTo(fPausedRow); 4416dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com fImageWidget.draw(); 4427e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com } else { 4437e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fCanvasWidget.drawTo(fListWidget.currentRow()); 4446dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com fImageWidget.draw(); 4457e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com } 4467e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com} 4477e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com 448902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionCommandFilter() { 449607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com fDebugger.highlightCurrentCommand( 450c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fSettingsWidget.getVisibilityButton()->isChecked()); 451c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fCanvasWidget.drawTo(fListWidget.currentRow()); 4526dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com fImageWidget.draw(); 453902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 454902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 455902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionClose() { 456902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com this->close(); 457902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 458902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 459902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionDelete() { 4607e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com 461dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com for (int row = 0; row < fListWidget.count(); ++row) { 462dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com QListWidgetItem* item = fListWidget.item(row); 463dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com 464dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com if (!item->isSelected()) { 465dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com continue; 466dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com } 467dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com 468dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com if (fDebugger.isCommandVisible(row)) { 469dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com item->setData(Qt::UserRole + 2, QPixmap(":/delete.png")); 470dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com fDebugger.setCommandVisible(row, false); 471dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com fSkipCommands[row] = true; 472dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com } else { 473dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com item->setData(Qt::UserRole + 2, QPixmap(":/blank.png")); 474dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com fDebugger.setCommandVisible(row, true); 475dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com fSkipCommands[row] = false; 476dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com } 477902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 4787e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com 479dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com int currentRow = fListWidget.currentRow(); 480dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com 481e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com if (fPause) { 482e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fCanvasWidget.drawTo(fPausedRow); 4836dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com fImageWidget.draw(); 484e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com } else { 485e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fCanvasWidget.drawTo(currentRow); 4866dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com fImageWidget.draw(); 487e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com } 488902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 489902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 490ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.comvoid SkDebuggerGUI::actionGLWidget(bool isToggled) { 491ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com fCanvasWidget.setWidgetVisibility(SkCanvasWidget::kGPU_WidgetType, !isToggled); 492ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com} 493ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com 494902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionInspector() { 495c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com if (fInspectorWidget.isHidden()) { 496c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fInspectorWidget.setHidden(false); 4976dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com fImageWidget.setHidden(false); 498902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } else { 499c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fInspectorWidget.setHidden(true); 5006dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com fImageWidget.setHidden(true); 501902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 502902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 503902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 504902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionPlay() { 505c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com for (int row = fListWidget.currentRow() + 1; row < fListWidget.count(); 5067dcae67cae277549accdd38d0496b72d00151239chudy@google.com row++) { 507c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QListWidgetItem *item = fListWidget.item(row); 508902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com if (item->checkState() == Qt::Checked) { 509c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fListWidget.setCurrentItem(item); 510902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com return; 511902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 512902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 513c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fListWidget.setCurrentRow(fListWidget.count() - 1); 514902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 515902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 516ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.comvoid SkDebuggerGUI::actionRasterWidget(bool isToggled) { 517ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com fCanvasWidget.setWidgetVisibility(SkCanvasWidget::kRaster_8888_WidgetType, !isToggled); 518ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com} 519ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com 520f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.comvoid SkDebuggerGUI::actionOverdrawVizWidget(bool isToggled) { 521f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com fDebugger.setOverdrawViz(isToggled); 522f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com fCanvasWidget.update(); 523f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com} 524f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com 525902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionRewind() { 526e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fListWidget.setCurrentRow(0); 527902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 528902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 5290ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.comvoid SkDebuggerGUI::actionSave() { 530e219baf74742ee5cda3c99fabe6acaa8f878fe00robertphillips@google.com fFileName = fPath.toAscii().data(); 531d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com fFileName.append("/"); 532e219baf74742ee5cda3c99fabe6acaa8f878fe00robertphillips@google.com fFileName.append(fDirectoryWidget.currentItem()->text().toAscii().data()); 533d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com saveToFile(fFileName); 5340ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com} 5350ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com 5360ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.comvoid SkDebuggerGUI::actionSaveAs() { 5370ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com QString filename = QFileDialog::getSaveFileName(this, "Save File", "", 5380ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com "Skia Picture (*skp)"); 53938b08ce020f451a66263110b32e70f5022df4f83chudy@google.com if (!filename.endsWith(".skp", Qt::CaseInsensitive)) { 5400ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com filename.append(".skp"); 5410ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com } 542c3c8216949146641222f7d2f7a464340627ae43adjsollen@google.com saveToFile(SkString(filename.toAscii().data())); 5430ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com} 5440ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com 5457dcae67cae277549accdd38d0496b72d00151239chudy@google.comvoid SkDebuggerGUI::actionScale(float scaleFactor) { 546c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fSettingsWidget.setZoomText(scaleFactor); 5477dcae67cae277549accdd38d0496b72d00151239chudy@google.com} 5487dcae67cae277549accdd38d0496b72d00151239chudy@google.com 549902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionSettings() { 550c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com if (fSettingsWidget.isHidden()) { 551c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fSettingsWidget.setHidden(false); 552902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } else { 553c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fSettingsWidget.setHidden(true); 554902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 555902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 556902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 557902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionStepBack() { 558c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com int currentRow = fListWidget.currentRow(); 559902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com if (currentRow != 0) { 560c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fListWidget.setCurrentRow(currentRow - 1); 561902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 562902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 563902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 564902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionStepForward() { 565c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com int currentRow = fListWidget.currentRow(); 566902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com QString curRow = QString::number(currentRow); 567c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QString curCount = QString::number(fListWidget.count()); 568c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com if (currentRow < fListWidget.count() - 1) { 569c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fListWidget.setCurrentRow(currentRow + 1); 570902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 571902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 572902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 573a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.comvoid SkDebuggerGUI::drawComplete() { 574607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com fInspectorWidget.setMatrix(fDebugger.getCurrentMatrix()); 575607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com fInspectorWidget.setClip(fDebugger.getCurrentClip()); 576a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com} 577a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com 578d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.comvoid SkDebuggerGUI::saveToFile(const SkString& filename) { 579d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com SkFILEWStream file(filename.c_str()); 58025bc2f86c2b94ee1f0921d90e6629d8cb22f69b7robertphillips@google.com SkAutoTUnref<SkPicture> copy(fDebugger.copyPicture()); 58125bc2f86c2b94ee1f0921d90e6629d8cb22f69b7robertphillips@google.com 58225bc2f86c2b94ee1f0921d90e6629d8cb22f69b7robertphillips@google.com copy->serialize(&file); 5830ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com} 5840ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com 585902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::loadFile(QListWidgetItem *item) { 586902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com if (fDirectoryWidgetActive) { 587e219baf74742ee5cda3c99fabe6acaa8f878fe00robertphillips@google.com fFileName = fPath.toAscii().data(); 5880ac6f168f15393a3213c1c95f8adc4434132dcb2jvanverth@google.com // don't add a '/' to files in the local directory 5890ac6f168f15393a3213c1c95f8adc4434132dcb2jvanverth@google.com if (fFileName.size() > 0) { 5900ac6f168f15393a3213c1c95f8adc4434132dcb2jvanverth@google.com fFileName.append("/"); 5910ac6f168f15393a3213c1c95f8adc4434132dcb2jvanverth@google.com } 592e219baf74742ee5cda3c99fabe6acaa8f878fe00robertphillips@google.com fFileName.append(item->text().toAscii().data()); 593d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com loadPicture(fFileName); 594902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 595902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 596902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 597902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::openFile() { 598d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com QString temp = QFileDialog::getOpenFileName(this, tr("Open File"), "", 5997dcae67cae277549accdd38d0496b72d00151239chudy@google.com tr("Files (*.*)")); 600ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com openFile(temp); 601ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com} 602ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com 603ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.comvoid SkDebuggerGUI::openFile(const QString &filename) { 604902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com fDirectoryWidgetActive = false; 605ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com if (!filename.isEmpty()) { 606ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com QFileInfo pathInfo(filename); 607ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com loadPicture(SkString(filename.toAscii().data())); 608ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com setupDirectoryWidget(pathInfo.path()); 609902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 610902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com fDirectoryWidgetActive = true; 611902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 612902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 613c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.comvoid SkDebuggerGUI::pauseDrawing(bool isPaused) { 614607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com fPause = isPaused; 615607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com fPausedRow = fListWidget.currentRow(); 616607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com fCanvasWidget.drawTo(fPausedRow); 6176dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com fImageWidget.draw(); 6187dcae67cae277549accdd38d0496b72d00151239chudy@google.com} 6197dcae67cae277549accdd38d0496b72d00151239chudy@google.com 620902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::registerListClick(QListWidgetItem *item) { 621d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com if(!fLoading) { 622d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com int currentRow = fListWidget.currentRow(); 623ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com 624ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com if (currentRow != -1) { 625ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com if (!fPause) { 626ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com fCanvasWidget.drawTo(currentRow); 6276dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com fImageWidget.draw(); 628ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com } 62997cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com SkTDArray<SkString*> *currInfo = fDebugger.getCommandInfo( 630ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com currentRow); 631ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com 632ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com /* TODO(chudy): Add command type before parameters. Rename v 633ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com * to something more informative. */ 63497cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com if (currInfo) { 635ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com QString info; 636ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com info.append("<b>Parameters: </b><br/>"); 63797cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com for (int i = 0; i < currInfo->count(); i++) { 63897cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com 63997cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com info.append(QString((*currInfo)[i]->c_str())); 640ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com info.append("<br/>"); 641ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com } 6426bd109a39370d21bfd4b48f5a28df8bcfc7f5ba2chudy@google.com fInspectorWidget.setText(info, SkInspectorWidget::kDetail_TabType); 643ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com fInspectorWidget.setDisabled(false); 644d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com } 645902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 646ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com 647902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 648902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 649902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 6509ca9bfe9f6eaae41841446386e40be1013907e99chudy@google.comvoid SkDebuggerGUI::selectCommand(int command) { 6519ca9bfe9f6eaae41841446386e40be1013907e99chudy@google.com if (fPause) { 6529ca9bfe9f6eaae41841446386e40be1013907e99chudy@google.com fListWidget.setCurrentRow(command); 6539ca9bfe9f6eaae41841446386e40be1013907e99chudy@google.com } 6549ca9bfe9f6eaae41841446386e40be1013907e99chudy@google.com} 6559ca9bfe9f6eaae41841446386e40be1013907e99chudy@google.com 656902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::toggleBreakpoint() { 657c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QListWidgetItem* item = fListWidget.currentItem(); 658902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com if (item->checkState() == Qt::Unchecked) { 659902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com item->setCheckState(Qt::Checked); 660e565de4fad5598890124daadf385930043269415chudy@google.com item->setData(Qt::DecorationRole, 6618e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com QPixmap(":/breakpoint_16x16.png")); 662902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } else { 663902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com item->setCheckState(Qt::Unchecked); 664e565de4fad5598890124daadf385930043269415chudy@google.com item->setData(Qt::DecorationRole, 6658e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com QPixmap(":/blank.png")); 666902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 667902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 668902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 669902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::toggleDirectory() { 670607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com fDirectoryWidget.setHidden(!fDirectoryWidget.isHidden()); 671902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 672902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 673902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::toggleFilter(QString string) { 674c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com for (int row = 0; row < fListWidget.count(); row++) { 675c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QListWidgetItem *item = fListWidget.item(row); 676607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com item->setHidden(item->text() != string); 677902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 678902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 679902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 680902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::setupUi(QMainWindow *SkDebuggerGUI) { 681902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com QIcon windowIcon; 6828e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com windowIcon.addFile(QString::fromUtf8(":/skia.png"), QSize(), 6837dcae67cae277549accdd38d0496b72d00151239chudy@google.com QIcon::Normal, QIcon::Off); 684902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com SkDebuggerGUI->setObjectName(QString::fromUtf8("SkDebuggerGUI")); 685902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com SkDebuggerGUI->resize(1200, 1000); 686902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com SkDebuggerGUI->setWindowIcon(windowIcon); 687c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com SkDebuggerGUI->setWindowTitle("Skia Debugger"); 688902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 689e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionOpen.setShortcuts(QKeySequence::Open); 690c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionOpen.setText("Open"); 691902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 692c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QIcon breakpoint; 6938e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com breakpoint.addFile(QString::fromUtf8(":/breakpoint.png"), 6947dcae67cae277549accdd38d0496b72d00151239chudy@google.com QSize(), QIcon::Normal, QIcon::Off); 695e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionBreakpoint.setShortcut(QKeySequence(tr("Ctrl+B"))); 696c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionBreakpoint.setIcon(breakpoint); 6977e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fActionBreakpoint.setText("Breakpoints"); 698902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 699c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QIcon cancel; 7008e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com cancel.addFile(QString::fromUtf8(":/reload.png"), QSize(), 7017dcae67cae277549accdd38d0496b72d00151239chudy@google.com QIcon::Normal, QIcon::Off); 702c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionCancel.setIcon(cancel); 703c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionCancel.setText("Clear Filter"); 704902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 7057e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fActionClearBreakpoints.setShortcut(QKeySequence(tr("Alt+B"))); 7067e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fActionClearBreakpoints.setText("Clear Breakpoints"); 7077e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com 7087e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fActionClearDeletes.setShortcut(QKeySequence(tr("Alt+X"))); 7097e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fActionClearDeletes.setText("Clear Deletes"); 7107e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com 711e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionClose.setShortcuts(QKeySequence::Quit); 712c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionClose.setText("Exit"); 713902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 714e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionCreateBreakpoint.setShortcut(QKeySequence(tr("B"))); 715e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionCreateBreakpoint.setText("Set Breakpoint"); 716e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com 717e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionDelete.setShortcut(QKeySequence(tr("X"))); 718c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionDelete.setText("Delete Command"); 719902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 720e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionDirectory.setShortcut(QKeySequence(tr("Ctrl+D"))); 721e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionDirectory.setText("Directory"); 722902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 723d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com QIcon profile; 724d163636ec6914a95c7a8333dc94bc0cae68b226arobertphillips@google.com profile.addFile(QString::fromUtf8(":/profile.png"), QSize(), 725d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com QIcon::Normal, QIcon::Off); 726d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com fActionProfile.setIcon(profile); 727d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com fActionProfile.setText("Profile"); 728e099bc403ca85be61cf23e67661e6a795fbcc40arobertphillips@google.com fActionProfile.setDisabled(true); 729d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com 730902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com QIcon inspector; 731d163636ec6914a95c7a8333dc94bc0cae68b226arobertphillips@google.com inspector.addFile(QString::fromUtf8(":/inspector.png"), 7327dcae67cae277549accdd38d0496b72d00151239chudy@google.com QSize(), QIcon::Normal, QIcon::Off); 733e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionInspector.setShortcut(QKeySequence(tr("Ctrl+I"))); 734c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionInspector.setIcon(inspector); 735e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionInspector.setText("Inspector"); 736902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 737c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QIcon play; 738d163636ec6914a95c7a8333dc94bc0cae68b226arobertphillips@google.com play.addFile(QString::fromUtf8(":/play.png"), QSize(), 7397dcae67cae277549accdd38d0496b72d00151239chudy@google.com QIcon::Normal, QIcon::Off); 740e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionPlay.setShortcut(QKeySequence(tr("Ctrl+P"))); 741c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionPlay.setIcon(play); 742c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionPlay.setText("Play"); 743902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 744e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com QIcon pause; 745d163636ec6914a95c7a8333dc94bc0cae68b226arobertphillips@google.com pause.addFile(QString::fromUtf8(":/pause.png"), QSize(), 7467dcae67cae277549accdd38d0496b72d00151239chudy@google.com QIcon::Normal, QIcon::Off); 747e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionPause.setShortcut(QKeySequence(tr("Space"))); 748e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionPause.setCheckable(true); 749e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionPause.setIcon(pause); 750e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionPause.setText("Pause"); 751e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com 752c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QIcon rewind; 7538e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com rewind.addFile(QString::fromUtf8(":/rewind.png"), QSize(), 754c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QIcon::Normal, QIcon::Off); 755e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionRewind.setShortcut(QKeySequence(tr("Ctrl+R"))); 756c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionRewind.setIcon(rewind); 757c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionRewind.setText("Rewind"); 758902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 7590ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com fActionSave.setShortcut(QKeySequence::Save); 7600ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com fActionSave.setText("Save"); 7610ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com fActionSave.setDisabled(true); 7620ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com fActionSaveAs.setShortcut(QKeySequence::SaveAs); 7630ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com fActionSaveAs.setText("Save As"); 7640ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com fActionSaveAs.setDisabled(true); 7650ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com 7667e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fActionShowDeletes.setShortcut(QKeySequence(tr("Ctrl+X"))); 7677e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fActionShowDeletes.setText("Deleted Commands"); 7687e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com 769c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QIcon stepBack; 7708e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com stepBack.addFile(QString::fromUtf8(":/previous.png"), QSize(), 7717dcae67cae277549accdd38d0496b72d00151239chudy@google.com QIcon::Normal, QIcon::Off); 772e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionStepBack.setShortcut(QKeySequence(tr("["))); 773c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionStepBack.setIcon(stepBack); 774c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionStepBack.setText("Step Back"); 775902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 776c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QIcon stepForward; 7778e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com stepForward.addFile(QString::fromUtf8(":/next.png"), 778c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QSize(), QIcon::Normal, QIcon::Off); 779e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fActionStepForward.setShortcut(QKeySequence(tr("]"))); 780c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionStepForward.setIcon(stepForward); 781c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionStepForward.setText("Step Forward"); 782c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com 783a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com fActionZoomIn.setShortcut(QKeySequence(tr("Ctrl+="))); 784a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com fActionZoomIn.setText("Zoom In"); 785a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com fActionZoomOut.setShortcut(QKeySequence(tr("Ctrl+-"))); 786a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com fActionZoomOut.setText("Zoom Out"); 787a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com 788c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fListWidget.setItemDelegate(new SkListWidget(&fListWidget)); 789c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fListWidget.setObjectName(QString::fromUtf8("listWidget")); 790c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fListWidget.setMaximumWidth(250); 791902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 792c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fFilter.addItem("--Filter By Available Commands--"); 793902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 794c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fDirectoryWidget.setMaximumWidth(250); 795c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fDirectoryWidget.setStyleSheet("QListWidget::Item {padding: 5px;}"); 796902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 797c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fCanvasWidget.setSizePolicy(QSizePolicy::Expanding, 7987dcae67cae277549accdd38d0496b72d00151239chudy@google.com QSizePolicy::Expanding); 799902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 8001c9c0d37111e6ff7a74a2908bf62a0d3954f2bb5skia.committer@gmail.com fImageWidget.setFixedSize(SkImageWidget::kImageWidgetWidth, 8016dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com SkImageWidget::kImageWidgetHeight); 8026dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com 803c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fInspectorWidget.setSizePolicy(QSizePolicy::Expanding, 8047dcae67cae277549accdd38d0496b72d00151239chudy@google.com QSizePolicy::Expanding); 805c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fInspectorWidget.setMaximumHeight(300); 806c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com 8076dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com fSettingsAndImageLayout.setSpacing(6); 8086dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com fSettingsAndImageLayout.addWidget(&fSettingsWidget); 8096dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com fSettingsAndImageLayout.addWidget(&fImageWidget); 8106dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com 811c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fSettingsWidget.setSizePolicy(QSizePolicy::Expanding, 812c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QSizePolicy::Expanding); 813c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fSettingsWidget.setMaximumWidth(250); 814c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com 815c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fLeftColumnLayout.setSpacing(6); 816c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fLeftColumnLayout.addWidget(&fListWidget); 817c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fLeftColumnLayout.addWidget(&fDirectoryWidget); 818902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 8196dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com fCanvasSettingsAndImageLayout.setSpacing(6); 8206dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com fCanvasSettingsAndImageLayout.addWidget(&fCanvasWidget); 8216dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com fCanvasSettingsAndImageLayout.addLayout(&fSettingsAndImageLayout); 8226dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com 823902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 824c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fMainAndRightColumnLayout.setSpacing(6); 8256dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com fMainAndRightColumnLayout.addLayout(&fCanvasSettingsAndImageLayout); 826c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fMainAndRightColumnLayout.addWidget(&fInspectorWidget); 827902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 8282d537a18f49cb492358c2b051f4786075dd9406cchudy@google.com fCentralWidget.setLayout(&fContainerLayout); 829c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fContainerLayout.setSpacing(6); 830c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fContainerLayout.setContentsMargins(11, 11, 11, 11); 831c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fContainerLayout.addLayout(&fLeftColumnLayout); 832c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fContainerLayout.addLayout(&fMainAndRightColumnLayout); 833902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 834c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com SkDebuggerGUI->setCentralWidget(&fCentralWidget); 835c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com SkDebuggerGUI->setStatusBar(&fStatusBar); 836902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 837e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fToolBar.setIconSize(QSize(32, 32)); 838c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fToolBar.setToolButtonStyle(Qt::ToolButtonTextUnderIcon); 839c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com SkDebuggerGUI->addToolBar(Qt::TopToolBarArea, &fToolBar); 840902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 8410ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com fSpacer.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); 842902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 843c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fToolBar.addAction(&fActionRewind); 844c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fToolBar.addAction(&fActionStepBack); 845e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fToolBar.addAction(&fActionPause); 846c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fToolBar.addAction(&fActionStepForward); 847c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fToolBar.addAction(&fActionPlay); 848c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fToolBar.addSeparator(); 849e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fToolBar.addAction(&fActionInspector); 850c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fToolBar.addSeparator(); 851d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com fToolBar.addAction(&fActionProfile); 852d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com 853d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com fToolBar.addSeparator(); 8540ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com fToolBar.addWidget(&fSpacer); 855c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fToolBar.addWidget(&fFilter); 856c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fToolBar.addAction(&fActionCancel); 857902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 858902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // TODO(chudy): Remove static call. 859902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com fDirectoryWidgetActive = false; 860d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com fFileName = ""; 861ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com setupDirectoryWidget(""); 862902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com fDirectoryWidgetActive = true; 863902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 864902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // Menu Bar 865c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fMenuFile.setTitle("File"); 866c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fMenuFile.addAction(&fActionOpen); 8670ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com fMenuFile.addAction(&fActionSave); 8680ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com fMenuFile.addAction(&fActionSaveAs); 869c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fMenuFile.addAction(&fActionClose); 870e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com 871e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuEdit.setTitle("Edit"); 872e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuEdit.addAction(&fActionDelete); 8737e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fMenuEdit.addAction(&fActionClearDeletes); 8747e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fMenuEdit.addSeparator(); 875e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuEdit.addAction(&fActionCreateBreakpoint); 8767e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fMenuEdit.addAction(&fActionClearBreakpoints); 877e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com 878c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fMenuNavigate.setTitle("Navigate"); 879e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuNavigate.addAction(&fActionRewind); 880e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuNavigate.addAction(&fActionStepBack); 881e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuNavigate.addAction(&fActionStepForward); 882e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuNavigate.addAction(&fActionPlay); 883e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuNavigate.addAction(&fActionPause); 884c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fMenuNavigate.addAction(&fActionGoToLine); 885e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com 886c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fMenuView.setTitle("View"); 887e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuView.addAction(&fActionBreakpoint); 8887e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fMenuView.addAction(&fActionShowDeletes); 889a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com fMenuView.addAction(&fActionZoomIn); 890a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com fMenuView.addAction(&fActionZoomOut); 891e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com 892e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuWindows.setTitle("Window"); 893e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuWindows.addAction(&fActionInspector); 894e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuWindows.addAction(&fActionDirectory); 895c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com 896c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionGoToLine.setText("Go to Line..."); 897c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fActionGoToLine.setDisabled(true); 898c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fMenuBar.addAction(fMenuFile.menuAction()); 899e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuBar.addAction(fMenuEdit.menuAction()); 900c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fMenuBar.addAction(fMenuView.menuAction()); 901c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fMenuBar.addAction(fMenuNavigate.menuAction()); 902e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com fMenuBar.addAction(fMenuWindows.menuAction()); 903902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 9047dcae67cae277549accdd38d0496b72d00151239chudy@google.com fPause = false; 9057dcae67cae277549accdd38d0496b72d00151239chudy@google.com 906c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com SkDebuggerGUI->setMenuBar(&fMenuBar); 907902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com QMetaObject::connectSlotsByName(SkDebuggerGUI); 908902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 909902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 910ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.comvoid SkDebuggerGUI::setupDirectoryWidget(const QString& path) { 911ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com fPath = path; 912ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com QDir dir(path); 913902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com QRegExp r(".skp"); 914c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fDirectoryWidget.clear(); 915c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com const QStringList files = dir.entryList(); 916902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com foreach (QString f, files) { 9177dcae67cae277549accdd38d0496b72d00151239chudy@google.com if (f.contains(r)) 918c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fDirectoryWidget.addItem(f); 919902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 920902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 921902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 9222bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com// SkOffsetPicturePlayback records the offset of each command in the picture. 9232bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com// These are needed by the profiling system. 9242bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.comclass SkOffsetPicturePlayback : public SkPicturePlayback { 9252bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.compublic: 9262bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com SkOffsetPicturePlayback(SkStream* stream, const SkPictInfo& info, bool* isValid, 9272bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com SkSerializationHelpers::DecodeBitmap decoder) 9282bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com : INHERITED(stream, info, isValid, decoder) { 9292bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 9302bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 9312bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com const SkTDArray<size_t>& offsets() const { return fOffsets; } 9322bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 9332bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.comprotected: 9342bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com SkTDArray<size_t> fOffsets; 9352bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 936ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com virtual size_t preDraw(size_t offset, int type) { 9372bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com *fOffsets.append() = offset; 9385f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com return 0; 9392bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 9402bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 9412bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.comprivate: 9422bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com typedef SkPicturePlayback INHERITED; 9432bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com}; 9442bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 9452bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com// Picture to wrap an SkOffsetPicturePlayback. 9462bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.comclass SkOffsetPicture : public SkPicture { 9472bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.compublic: 948884e60be30e20f38b3466a4697081187d2f1f814skia.committer@gmail.com SkOffsetPicture(SkStream* stream, 949884e60be30e20f38b3466a4697081187d2f1f814skia.committer@gmail.com bool* success, 9502bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com SkSerializationHelpers::DecodeBitmap decoder) { 9512bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com if (success) { 9522bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com *success = false; 9532bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 9542bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com fRecord = NULL; 9552bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com fPlayback = NULL; 9562bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com fWidth = fHeight = 0; 9572bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 9582bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com SkPictInfo info; 9592bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 9602bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com if (!stream->read(&info, sizeof(info))) { 9612bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com return; 9622bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 9632bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com if (PICTURE_VERSION != info.fVersion) { 9642bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com return; 9652bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 9662bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 9672bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com if (stream->readBool()) { 9682bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com bool isValid = false; 9692bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com fPlayback = SkNEW_ARGS(SkOffsetPicturePlayback, (stream, info, &isValid, decoder)); 9702bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com if (!isValid) { 9712bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com SkDELETE(fPlayback); 9722bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com fPlayback = NULL; 9732bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com return; 9742bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 9752bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 9762bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 9772bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com // do this at the end, so that they will be zero if we hit an error. 9782bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com fWidth = info.fWidth; 9792bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com fHeight = info.fHeight; 9802bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com if (success) { 9812bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com *success = true; 9822bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 9832bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 9842bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 985884e60be30e20f38b3466a4697081187d2f1f814skia.committer@gmail.com const SkTDArray<size_t>& offsets() const { 986884e60be30e20f38b3466a4697081187d2f1f814skia.committer@gmail.com return ((SkOffsetPicturePlayback*) fPlayback)->offsets(); 9872bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com } 9882bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 9892bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.comprivate: 9908a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com // disallow default ctor b.c. we don't have a good way to setup the fPlayback ptr 9918a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com SkOffsetPicture(); 9928a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com // disallow the copy ctor - enabling would require copying code from SkPicture 9938a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com SkOffsetPicture(const SkOffsetPicture& src); 9948a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 9952bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com typedef SkPicture INHERITED; 9962bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com}; 9972bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 9982bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 9992bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 1000d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.comvoid SkDebuggerGUI::loadPicture(const SkString& fileName) { 1001d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com fFileName = fileName; 1002d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com fLoading = true; 1003d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com SkStream* stream = SkNEW_ARGS(SkFILEStream, (fileName.c_str())); 10042d40ec4e9a3fb3540756fa45a6cffd541ada2c78robertphillips@google.com 10052d40ec4e9a3fb3540756fa45a6cffd541ada2c78robertphillips@google.com bool success = false; 10062d40ec4e9a3fb3540756fa45a6cffd541ada2c78robertphillips@google.com 10072d40ec4e9a3fb3540756fa45a6cffd541ada2c78robertphillips@google.com SkOffsetPicture* picture = SkNEW_ARGS(SkOffsetPicture, (stream, &success, &SkImageDecoder::DecodeStream)); 10082d40ec4e9a3fb3540756fa45a6cffd541ada2c78robertphillips@google.com 10092d40ec4e9a3fb3540756fa45a6cffd541ada2c78robertphillips@google.com if (!success) { 10102d40ec4e9a3fb3540756fa45a6cffd541ada2c78robertphillips@google.com QMessageBox::critical(this, "Error loading file", "Couldn't read file, sorry."); 10112d40ec4e9a3fb3540756fa45a6cffd541ada2c78robertphillips@google.com SkSafeUnref(stream); 10122d40ec4e9a3fb3540756fa45a6cffd541ada2c78robertphillips@google.com return; 10132d40ec4e9a3fb3540756fa45a6cffd541ada2c78robertphillips@google.com } 10142bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 1015686e68019374dca3692cac6d5f8d94515e53d6c8chudy@google.com fCanvasWidget.resetWidgetTransform(); 1016607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com fDebugger.loadPicture(picture); 10174c7962e0a866b8416fa7046791c129eb5430b677chudy@google.com 10182bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com fOffsets = picture->offsets(); 10192bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 10205f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com fSkipCommands.setCount(fOffsets.count()); 10215f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com for (int i = 0; i < fOffsets.count(); ++i) { 10225f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com fSkipCommands[i] = false; 10235f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com } 10245f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com 1025607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com SkSafeUnref(stream); 1026607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com SkSafeUnref(picture); 1027607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com 102897cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com // Will this automatically clear out due to nature of refcnt? 10298a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com SkTArray<SkString>* commands = fDebugger.getDrawCommandsAsStrings(); 1030607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com 1031fe830a46411a4f0fe6e3e81ce1817cefab788730robertphillips@google.com // If SkPicturePlayback is compiled w/o SK_PICTURE_PROFILING_STUBS 1032fe830a46411a4f0fe6e3e81ce1817cefab788730robertphillips@google.com // the offset count will always be zero 1033fe830a46411a4f0fe6e3e81ce1817cefab788730robertphillips@google.com SkASSERT(0 == fOffsets.count() || commands->count() == fOffsets.count()); 1034e099bc403ca85be61cf23e67661e6a795fbcc40arobertphillips@google.com if (commands->count() == fOffsets.count()) { 1035e099bc403ca85be61cf23e67661e6a795fbcc40arobertphillips@google.com fActionProfile.setDisabled(false); 1036fe830a46411a4f0fe6e3e81ce1817cefab788730robertphillips@google.com } 10372bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com 10387dcae67cae277549accdd38d0496b72d00151239chudy@google.com /* fDebugCanvas is reinitialized every load picture. Need it to retain value 1039607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com * of the visibility filter. 1040607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com * TODO(chudy): This should be deprecated since fDebugger is not 1041607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com * recreated. 1042607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com * */ 1043607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com fDebugger.highlightCurrentCommand(fSettingsWidget.getVisibilityButton()->isChecked()); 1044607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com 104597cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com setupListWidget(commands); 104697cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com setupComboBox(commands); 10478a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com setupOverviewText(NULL, 0.0); 10487e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com fInspectorWidget.setDisabled(false); 1049e606d6e210b17dd9dd582d4d3ec70acb4f3213d5chudy@google.com fSettingsWidget.setDisabled(false); 1050d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com fMenuEdit.setDisabled(false); 1051d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com fMenuNavigate.setDisabled(false); 1052d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com fMenuView.setDisabled(false); 10530ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com fActionSave.setDisabled(false); 10540ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com fActionSaveAs.setDisabled(false); 1055d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com fLoading = false; 1056d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com actionPlay(); 1057902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 1058902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 10598a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.comvoid SkDebuggerGUI::setupListWidget(SkTArray<SkString>* command) { 1060c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fListWidget.clear(); 1061902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com int counter = 0; 106230d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com int indent = 0; 106397cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com for (int i = 0; i < command->count(); i++) { 1064902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com QListWidgetItem *item = new QListWidgetItem(); 10658a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com item->setData(Qt::DisplayRole, (*command)[i].c_str()); 1066902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com item->setData(Qt::UserRole + 1, counter++); 106730d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com 10688a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com if (0 == strcmp("Restore", (*command)[i].c_str())) { 106930d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com indent -= 10; 107030d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com } 107130d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com 107230d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com item->setData(Qt::UserRole + 3, indent); 107330d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com 10748a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com if (0 == strcmp("Save", (*command)[i].c_str()) || 10758a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 0 == strcmp("Save Layer", (*command)[i].c_str())) { 107630d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com indent += 10; 107730d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com } 107830d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com 1079d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com item->setData(Qt::UserRole + 4, -1.0); 1080d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com 1081c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fListWidget.addItem(item); 1082902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 1083902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 1084902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 10858a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.comvoid SkDebuggerGUI::setupOverviewText(const SkTDArray<double>* typeTimes, double totTime) { 1086902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 10878a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com const SkTDArray<SkDrawCommand*>& commands = fDebugger.getDrawCommands(); 10888a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 10898a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com SkTDArray<int> counts; 10908a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com counts.setCount(LAST_DRAWTYPE_ENUM+1); 10918a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com for (int i = 0; i < LAST_DRAWTYPE_ENUM+1; ++i) { 10928a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com counts[i] = 0; 10938a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com } 10948a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 10958a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com for (int i = 0; i < commands.count(); i++) { 10968a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com counts[commands[i]->getType()]++; 1097902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 1098902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 1099902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com QString overview; 11008a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com int total = 0; 11018a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com#ifdef SK_DEBUG 11028a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com double totPercent = 0, tempSum = 0; 11038a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com#endif 11048a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com for (int i = 0; i < LAST_DRAWTYPE_ENUM+1; ++i) { 11058a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com if (0 == counts[i]) { 11068a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com // if there were no commands of this type then they should've consumed no time 11078a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com SkASSERT(NULL == typeTimes || 0.0 == (*typeTimes)[i]); 11088a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com continue; 11098a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com } 11108a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 11118a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com overview.append(SkDrawCommand::GetCommandString((DrawType) i)); 1112902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com overview.append(": "); 11138a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com overview.append(QString::number(counts[i])); 11148a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com if (NULL != typeTimes) { 11158a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com overview.append(" - "); 11168a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com overview.append(QString::number((*typeTimes)[i], 'f', 1)); 11178a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com overview.append("ms"); 11188a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com overview.append(" - "); 11198a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com double percent = 100.0*(*typeTimes)[i]/totTime; 11208a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com overview.append(QString::number(percent, 'f', 1)); 11218a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com overview.append("%"); 11228a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com#ifdef SK_DEBUG 11238a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com totPercent += percent; 11248a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com tempSum += (*typeTimes)[i]; 11258a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com#endif 11268a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com } 1127902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com overview.append("<br/>"); 11288a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com total += counts[i]; 11298a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com } 11308a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com#ifdef SK_DEBUG 11318a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com if (NULL != typeTimes) { 11328a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com SkASSERT(SkScalarNearlyEqual(totPercent, 100.0)); 11338a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com SkASSERT(SkScalarNearlyEqual(tempSum, totTime)); 1134902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com } 11358a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com#endif 11368a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 11378a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com if (totTime > 0.0) { 11388a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com overview.append("Total Time: "); 11398a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com overview.append(QString::number(totTime, 'f', 2)); 11408a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com overview.append("ms"); 11418a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com#ifdef SK_DEBUG 11428a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com overview.append(" "); 11438a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com overview.append(QString::number(totPercent)); 11448a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com overview.append("% "); 11458a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com#endif 11468a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com overview.append("<br/>"); 11478a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com } 11488a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 11498a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com QString totalStr; 11508a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com totalStr.append("Total Draw Commands: "); 11518a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com totalStr.append(QString::number(total)); 11528a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com totalStr.append("<br/>"); 11538a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com overview.insert(0, totalStr); 1154902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 1155902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com overview.append("<br/>"); 1156607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com overview.append("SkPicture Width: "); 1157902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // NOTE(chudy): This is where we can pull out the SkPictures width. 1158607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com overview.append(QString::number(fDebugger.pictureWidth())); 1159902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com overview.append("px<br/>"); 1160607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com overview.append("SkPicture Height: "); 1161607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com overview.append(QString::number(fDebugger.pictureHeight())); 1162902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com overview.append("px"); 11636bd109a39370d21bfd4b48f5a28df8bcfc7f5ba2chudy@google.com fInspectorWidget.setText(overview, SkInspectorWidget::kOverview_TabType); 11648a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com} 11658a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 11668a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.comvoid SkDebuggerGUI::setupComboBox(SkTArray<SkString>* command) { 11678a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com fFilter.clear(); 11688a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com fFilter.addItem("--Filter By Available Commands--"); 11698a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 11708a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com std::map<std::string, int> map; 11718a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com for (int i = 0; i < command->count(); i++) { 11728a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com map[(*command)[i].c_str()]++; 11738a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com } 11748a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com 11753458716b52aa25dcd1b270141c7628c380696e35skia.committer@gmail.com for (std::map<std::string, int>::iterator it = map.begin(); it != map.end(); 11768a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com ++it) { 11778a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com fFilter.addItem((it->first).c_str()); 11788a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com } 1179902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 1180902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // NOTE(chudy): Makes first item unselectable. 11817dcae67cae277549accdd38d0496b72d00151239chudy@google.com QStandardItemModel* model = qobject_cast<QStandardItemModel*>( 1182c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fFilter.model()); 1183c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com QModelIndex firstIndex = model->index(0, fFilter.modelColumn(), 1184c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com fFilter.rootModelIndex()); 1185902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com QStandardItem* firstItem = model->itemFromIndex(firstIndex); 1186902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com firstItem->setSelectable(false); 1187902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 1188