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