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"
97def5e1630d47cdbfa4b58a9c86bc060693c4d79scroggo@google.com#include "SkForceLinking.h"
10bbad34de3b117347bedea619feaf1685586d4202chudy@google.com#include "SkGraphics.h"
11b4467e642e1c0772940cb266cae46f5fda399952scroggo@google.com#include "SkImageDecoder.h"
12902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include <QListWidgetItem>
132bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com#include "PictureRenderer.h"
142bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com#include "SkPictureRecord.h"
152bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com#include "SkPicturePlayback.h"
16e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com
177def5e1630d47cdbfa4b58a9c86bc060693c4d79scroggo@google.com__SK_FORCE_IMAGE_DECODER_LINKING;
187def5e1630d47cdbfa4b58a9c86bc060693c4d79scroggo@google.com
19e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com#if defined(SK_BUILD_FOR_WIN32)
209ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein    #include "SysTimer_windows.h"
21e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com#elif defined(SK_BUILD_FOR_MAC)
229ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein    #include "SysTimer_mach.h"
23e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com#elif defined(SK_BUILD_FOR_UNIX) || defined(SK_BUILD_FOR_ANDROID)
249ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein    #include "SysTimer_posix.h"
25e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com#else
269ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein    #include "SysTimer_c.h"
27e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com#endif
28e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com
29902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
30902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comSkDebuggerGUI::SkDebuggerGUI(QWidget *parent) :
31c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com        QMainWindow(parent)
32bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org    , fCentralSplitter(this)
332d537a18f49cb492358c2b051f4786075dd9406cchudy@google.com    , fStatusBar(this)
342d537a18f49cb492358c2b051f4786075dd9406cchudy@google.com    , fToolBar(this)
35c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    , fActionOpen(this)
36c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    , fActionBreakpoint(this)
3757f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    , fActionToggleIndexStyle(this)
38d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com    , fActionProfile(this)
39c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    , fActionCancel(this)
407e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    , fActionClearBreakpoints(this)
41e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    , fActionClearDeletes(this)
42c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    , fActionClose(this)
43e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    , fActionCreateBreakpoint(this)
44c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    , fActionDelete(this)
45c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    , fActionDirectory(this)
46c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    , fActionGoToLine(this)
47c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    , fActionInspector(this)
482ff6d1d1dc2c4668b0c587c55fd37407fb8d68abbungeman@google.com    , fActionSettings(this)
49c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    , fActionPlay(this)
50e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    , fActionPause(this)
51c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    , fActionRewind(this)
520ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com    , fActionSave(this)
530ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com    , fActionSaveAs(this)
547e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    , fActionShowDeletes(this)
55c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    , fActionStepBack(this)
56c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    , fActionStepForward(this)
57a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com    , fActionZoomIn(this)
58a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com    , fActionZoomOut(this)
59a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com    , fMapper(this)
60bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org    , fListWidget(&fCentralSplitter)
61bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org    , fDirectoryWidget(&fCentralSplitter)
62607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com    , fCanvasWidget(this, &fDebugger)
636dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com    , fImageWidget(&fDebugger)
64c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    , fMenuBar(this)
65c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    , fMenuFile(this)
66c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    , fMenuNavigate(this)
67c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    , fMenuView(this)
687e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    , fBreakpointsActivated(false)
6957f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    , fIndexStyleToggle(false)
707e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    , fDeletesActivated(false)
717e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    , fPause(false)
72d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com    , fLoading(false)
73c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com{
74902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    setupUi(this);
75dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com    fListWidget.setSelectionMode(QAbstractItemView::ExtendedSelection);
76ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    connect(&fListWidget, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(registerListClick(QListWidgetItem *)));
77c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    connect(&fActionOpen, SIGNAL(triggered()), this, SLOT(openFile()));
78ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    connect(&fActionDirectory, SIGNAL(triggered()), this, SLOT(toggleDirectory()));
79ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    connect(&fDirectoryWidget, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(loadFile(QListWidgetItem *)));
80c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    connect(&fActionDelete, SIGNAL(triggered()), this, SLOT(actionDelete()));
81ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    connect(&fListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(toggleBreakpoint()));
82c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    connect(&fActionRewind, SIGNAL(triggered()), this, SLOT(actionRewind()));
83c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    connect(&fActionPlay, SIGNAL(triggered()), this, SLOT(actionPlay()));
84c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    connect(&fActionStepBack, SIGNAL(triggered()), this, SLOT(actionStepBack()));
85ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    connect(&fActionStepForward, SIGNAL(triggered()), this, SLOT(actionStepForward()));
86ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    connect(&fActionBreakpoint, SIGNAL(triggered()), this, SLOT(actionBreakpoints()));
8757f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    connect(&fActionToggleIndexStyle, SIGNAL(triggered()), this, SLOT(actionToggleIndexStyle()));
88ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    connect(&fActionInspector, SIGNAL(triggered()), this, SLOT(actionInspector()));
892ff6d1d1dc2c4668b0c587c55fd37407fb8d68abbungeman@google.com    connect(&fActionSettings, SIGNAL(triggered()), this, SLOT(actionSettings()));
90ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    connect(&fFilter, SIGNAL(activated(QString)), this, SLOT(toggleFilter(QString)));
91d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com    connect(&fActionProfile, SIGNAL(triggered()), this, SLOT(actionProfile()));
92c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    connect(&fActionCancel, SIGNAL(triggered()), this, SLOT(actionCancel()));
937e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    connect(&fActionClearBreakpoints, SIGNAL(triggered()), this, SLOT(actionClearBreakpoints()));
947e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    connect(&fActionClearDeletes, SIGNAL(triggered()), this, SLOT(actionClearDeletes()));
95c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    connect(&fActionClose, SIGNAL(triggered()), this, SLOT(actionClose()));
9622d39332bdba4e2e36aa050220392dcd33d81c19commit-bot@chromium.org    connect(&fSettingsWidget, SIGNAL(visibilityFilterChanged()), this, SLOT(actionCommandFilter()));
97e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com#if SK_SUPPORT_GPU
98fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.org    connect(&fSettingsWidget, SIGNAL(glSettingsChanged()), this, SLOT(actionGLWidget()));
99e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com#endif
10032bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com    connect(&fSettingsWidget, SIGNAL(texFilterSettingsChanged()), this, SLOT(actionTextureFilter()));
101ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    connect(fSettingsWidget.getRasterCheckBox(), SIGNAL(toggled(bool)), this, SLOT(actionRasterWidget(bool)));
102f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com    connect(fSettingsWidget.getOverdrawVizCheckBox(), SIGNAL(toggled(bool)), this, SLOT(actionOverdrawVizWidget(bool)));
103768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org    connect(fSettingsWidget.getMegaVizCheckBox(), SIGNAL(toggled(bool)), this, SLOT(actionMegaVizWidget(bool)));
1042a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    connect(fSettingsWidget.getPathOpsCheckBox(), SIGNAL(toggled(bool)), this, SLOT(actionPathOpsWidget(bool)));
105ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    connect(&fActionPause, SIGNAL(toggled(bool)), this, SLOT(pauseDrawing(bool)));
106e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    connect(&fActionCreateBreakpoint, SIGNAL(activated()), this, SLOT(toggleBreakpoint()));
1077e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    connect(&fActionShowDeletes, SIGNAL(triggered()), this, SLOT(showDeletes()));
108ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    connect(&fCanvasWidget, SIGNAL(hitChanged(int)), this, SLOT(selectCommand(int)));
109ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    connect(&fCanvasWidget, SIGNAL(hitChanged(int)), &fSettingsWidget, SLOT(updateHit(int)));
110ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    connect(&fCanvasWidget, SIGNAL(scaleFactorChanged(float)), this, SLOT(actionScale(float)));
111ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    connect(&fCanvasWidget, SIGNAL(commandChanged(int)), &fSettingsWidget, SLOT(updateCommand(int)));
1120ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com    connect(&fActionSaveAs, SIGNAL(triggered()), this, SLOT(actionSaveAs()));
1130ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com    connect(&fActionSave, SIGNAL(triggered()), this, SLOT(actionSave()));
1147e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com
115e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    fMapper.setMapping(&fActionZoomIn, SkCanvasWidget::kIn_ZoomCommand);
116e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    fMapper.setMapping(&fActionZoomOut, SkCanvasWidget::kOut_ZoomCommand);
117a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com
118a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com    connect(&fActionZoomIn, SIGNAL(triggered()), &fMapper, SLOT(map()));
119a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com    connect(&fActionZoomOut, SIGNAL(triggered()), &fMapper, SLOT(map()));
120e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    connect(&fMapper, SIGNAL(mapped(int)), &fCanvasWidget, SLOT(zoom(int)));
121a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com
1227e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    fInspectorWidget.setDisabled(true);
123d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com    fMenuEdit.setDisabled(true);
124d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com    fMenuNavigate.setDisabled(true);
125d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com    fMenuView.setDisabled(true);
126bbad34de3b117347bedea619feaf1685586d4202chudy@google.com
127bbad34de3b117347bedea619feaf1685586d4202chudy@google.com    SkGraphics::Init();
128902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
129902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
130bbad34de3b117347bedea619feaf1685586d4202chudy@google.comSkDebuggerGUI::~SkDebuggerGUI() {
131bbad34de3b117347bedea619feaf1685586d4202chudy@google.com    SkGraphics::Term();
132bbad34de3b117347bedea619feaf1685586d4202chudy@google.com}
133902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
134902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionBreakpoints() {
1357e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    fBreakpointsActivated = !fBreakpointsActivated;
1367e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    for (int row = 0; row < fListWidget.count(); row++) {
1377e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com        QListWidgetItem *item = fListWidget.item(row);
1387e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com        item->setHidden(item->checkState() == Qt::Unchecked && fBreakpointsActivated);
139902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
1407e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com}
141902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
14257f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.orgvoid SkDebuggerGUI::actionToggleIndexStyle() {
14357f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    fIndexStyleToggle = !fIndexStyleToggle;
14457f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    SkListWidget* list = (SkListWidget*) fListWidget.itemDelegate();
145db35dab49e0e6bf16ccad5052bf6e6826daad27dskia.committer@gmail.com    list->setIndexStyle(fIndexStyleToggle ? SkListWidget::kIndex_IndexStyle :
14657f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org                                            SkListWidget::kOffset_IndexStyle);
14757f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    fListWidget.update();
14857f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org}
14957f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org
1507e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.comvoid SkDebuggerGUI::showDeletes() {
1517e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    fDeletesActivated = !fDeletesActivated;
152c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    for (int row = 0; row < fListWidget.count(); row++) {
153c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com        QListWidgetItem *item = fListWidget.item(row);
15457f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org        item->setHidden(fDebugger.isCommandVisible(row) && fDeletesActivated);
155902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
156902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
157902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
1582bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com// The timed picture playback uses the SkPicturePlayback's profiling stubs
1592bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com// to time individual commands. The offsets are needed to map SkPicture
1602bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com// offsets to individual commands.
1612bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.comclass SkTimedPicturePlayback : public SkPicturePlayback {
1622bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.compublic:
163e26e65e8f831f7a5626c92d11bbb8c2cec1f70derobertphillips    static SkTimedPicturePlayback* CreateFromStream(SkStream* stream, const SkPictInfo& info,
16412705329d0807863d4d80cac0f02e543c26f24a1scroggo@google.com                                                    SkPicture::InstallPixelRefProc proc,
16512705329d0807863d4d80cac0f02e543c26f24a1scroggo@google.com                                                    const SkTDArray<bool>& deletedCommands) {
16612705329d0807863d4d80cac0f02e543c26f24a1scroggo@google.com        // Mimics SkPicturePlayback::CreateFromStream
16712705329d0807863d4d80cac0f02e543c26f24a1scroggo@google.com        SkAutoTDelete<SkTimedPicturePlayback> playback(SkNEW_ARGS(SkTimedPicturePlayback,
168e26e65e8f831f7a5626c92d11bbb8c2cec1f70derobertphillips                                                               (deletedCommands, info)));
169e26e65e8f831f7a5626c92d11bbb8c2cec1f70derobertphillips        if (!playback->parseStream(stream, proc)) {
17012705329d0807863d4d80cac0f02e543c26f24a1scroggo@google.com            return NULL; // we're invalid
17112705329d0807863d4d80cac0f02e543c26f24a1scroggo@google.com        }
17212705329d0807863d4d80cac0f02e543c26f24a1scroggo@google.com        return playback.detach();
17312705329d0807863d4d80cac0f02e543c26f24a1scroggo@google.com    }
17412705329d0807863d4d80cac0f02e543c26f24a1scroggo@google.com
175e26e65e8f831f7a5626c92d11bbb8c2cec1f70derobertphillips    SkTimedPicturePlayback(const SkTDArray<bool>& deletedCommands,
1768f831f262f5e57665587cb3033860eea39fe1621commit-bot@chromium.org                           const SkPictInfo& info)
177e26e65e8f831f7a5626c92d11bbb8c2cec1f70derobertphillips        : INHERITED(info)
178e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com        , fSkipCommands(deletedCommands)
179e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com        , fTot(0.0)
180e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com        , fCurCommand(0) {
1816d9c92b2f6e5be64dd5dd98e44d672877e4c9fbcrobertphillips@google.com        fTimes.setCount(deletedCommands.count());
1828a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com        fTypeTimes.setCount(LAST_DRAWTYPE_ENUM+1);
1838a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com        this->resetTimes();
1848a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com    }
1858a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com
1868a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com    void resetTimes() {
1876d9c92b2f6e5be64dd5dd98e44d672877e4c9fbcrobertphillips@google.com        for (int i = 0; i < fTimes.count(); ++i) {
1888a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com            fTimes[i] = 0.0;
1892bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com        }
1908a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com        for (int i = 0; i < fTypeTimes.count(); ++i) {
1918a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com            fTypeTimes[i] = 0.0f;
1928a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com        }
1938a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com        fTot = 0.0;
1942bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com    }
1952bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com
1962bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com    int count() const { return fTimes.count(); }
1972bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com
1982bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com    double time(int index) const { return fTimes[index] / fTot; }
1992bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com
2008a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com    const SkTDArray<double>* typeTimes() const { return &fTypeTimes; }
2018a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com
2028a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com    double totTime() const { return fTot; }
2038a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com
2042bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.comprotected:
2059ac68ee2594f28dfc1bd16a4bf004b1a4f6f228dmtklein    SysTimer fTimer;
2065f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com    SkTDArray<bool> fSkipCommands; // has the command been deleted in the GUI?
2072bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com    SkTDArray<double> fTimes;   // sum of time consumed for each command
2088a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com    SkTDArray<double> fTypeTimes; // sum of time consumed for each type of command (e.g., drawPath)
2092bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com    double fTot;                // total of all times in 'fTimes'
2108a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com    int fCurType;
2112bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com    int fCurCommand;            // the current command being executed/timed
2122bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com
2136d9c92b2f6e5be64dd5dd98e44d672877e4c9fbcrobertphillips@google.com#ifdef SK_DEVELOPER
2146d9c92b2f6e5be64dd5dd98e44d672877e4c9fbcrobertphillips@google.com    virtual bool preDraw(int opIndex, int type) SK_OVERRIDE {
2156d9c92b2f6e5be64dd5dd98e44d672877e4c9fbcrobertphillips@google.com        fCurCommand = opIndex;
2162bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com
2175f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com        if (fSkipCommands[fCurCommand]) {
2186d9c92b2f6e5be64dd5dd98e44d672877e4c9fbcrobertphillips@google.com            return true;
2195f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com        }
2205f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com
2218a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com        fCurType = type;
2228a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com        // The SkDebugCanvas doesn't recognize these types. This class needs to
2238a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com        // convert or else we'll wind up with a mismatch between the type counts
2248a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com        // the debugger displays and the profile times.
2258a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com        if (DRAW_POS_TEXT_TOP_BOTTOM == type) {
2268a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com            fCurType = DRAW_POS_TEXT;
2278a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com        } else if (DRAW_POS_TEXT_H_TOP_BOTTOM == type) {
2288a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com            fCurType = DRAW_POS_TEXT_H;
2298a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com        }
2302bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com
231e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com#if defined(SK_BUILD_FOR_WIN32)
232e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com        // CPU timer doesn't work well on Windows
233e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com        fTimer.startWall();
234e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com#else
235e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com        fTimer.startCpu();
236e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com#endif
2375f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com
2386d9c92b2f6e5be64dd5dd98e44d672877e4c9fbcrobertphillips@google.com        return false;
2392bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com    }
2402bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com
2416d9c92b2f6e5be64dd5dd98e44d672877e4c9fbcrobertphillips@google.com    virtual void postDraw(int opIndex) SK_OVERRIDE {
242e099bc403ca85be61cf23e67661e6a795fbcc40arobertphillips@google.com#if defined(SK_BUILD_FOR_WIN32)
243e099bc403ca85be61cf23e67661e6a795fbcc40arobertphillips@google.com        // CPU timer doesn't work well on Windows
244e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com        double time = fTimer.endWall();
245e099bc403ca85be61cf23e67661e6a795fbcc40arobertphillips@google.com#else
246e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com        double time = fTimer.endCpu();
247e099bc403ca85be61cf23e67661e6a795fbcc40arobertphillips@google.com#endif
248e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com
2496d9c92b2f6e5be64dd5dd98e44d672877e4c9fbcrobertphillips@google.com        SkASSERT(opIndex == fCurCommand);
250e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com        SkASSERT(fCurType <= LAST_DRAWTYPE_ENUM);
251e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com
252e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com        fTimes[fCurCommand] += time;
253e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com        fTypeTimes[fCurType] += time;
254e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com        fTot += time;
2552bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com    }
2566d9c92b2f6e5be64dd5dd98e44d672877e4c9fbcrobertphillips@google.com#endif
2572bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com
2582bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.comprivate:
2592bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com    typedef SkPicturePlayback INHERITED;
2602bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com};
2612bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com
2622bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com// Wrap SkPicture to allow installation of an SkTimedPicturePlayback object
2632bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.comclass SkTimedPicture : public SkPicture {
2642bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.compublic:
265f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com    static SkTimedPicture* CreateTimedPicture(SkStream* stream,
266f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com                                              SkPicture::InstallPixelRefProc proc,
267f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com                                              const SkTDArray<bool>& deletedCommands) {
2682bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com        SkPictInfo info;
2696f4fb0f1296422a44d5d0dac155d82595dc5ebeccommit-bot@chromium.org        if (!InternalOnly_StreamIsSKP(stream, &info)) {
270f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com            return NULL;
2712bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com        }
2722bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com
273f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com        // Check to see if there is a playback to recreate.
2742bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com        if (stream->readBool()) {
2758f831f262f5e57665587cb3033860eea39fe1621commit-bot@chromium.org            SkTimedPicturePlayback* playback = SkTimedPicturePlayback::CreateFromStream(
276e26e65e8f831f7a5626c92d11bbb8c2cec1f70derobertphillips                                                                stream,
2778f831f262f5e57665587cb3033860eea39fe1621commit-bot@chromium.org                                                                info, proc,
27812705329d0807863d4d80cac0f02e543c26f24a1scroggo@google.com                                                                deletedCommands);
27912705329d0807863d4d80cac0f02e543c26f24a1scroggo@google.com            if (NULL == playback) {
28012705329d0807863d4d80cac0f02e543c26f24a1scroggo@google.com                return NULL;
28112705329d0807863d4d80cac0f02e543c26f24a1scroggo@google.com            }
282e26e65e8f831f7a5626c92d11bbb8c2cec1f70derobertphillips
283e26e65e8f831f7a5626c92d11bbb8c2cec1f70derobertphillips            return SkNEW_ARGS(SkTimedPicture, (playback, info.fWidth, info.fHeight));
2842bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com        }
2852bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com
286e26e65e8f831f7a5626c92d11bbb8c2cec1f70derobertphillips        return NULL;
2872bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com    }
2882bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com
2898a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com    void resetTimes() { ((SkTimedPicturePlayback*) fPlayback)->resetTimes(); }
2908a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com
2912bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com    int count() const { return ((SkTimedPicturePlayback*) fPlayback)->count(); }
2922bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com
2932bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com    // return the fraction of the total time this command consumed
2942bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com    double time(int index) const { return ((SkTimedPicturePlayback*) fPlayback)->time(index); }
2952bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com
2968a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com    const SkTDArray<double>* typeTimes() const { return ((SkTimedPicturePlayback*) fPlayback)->typeTimes(); }
2978a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com
2988a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com    double totTime() const { return ((SkTimedPicturePlayback*) fPlayback)->totTime(); }
2998a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com
3002bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.comprivate:
3018a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com    // disallow default ctor b.c. we don't have a good way to setup the fPlayback ptr
3028a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com    SkTimedPicture();
303f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com    // Private ctor only used by CreateTimedPicture, which has created the playback.
304f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com    SkTimedPicture(SkTimedPicturePlayback* playback, int width, int height)
305f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com        : INHERITED(playback, width, height) {}
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
3273f0451772109959fcb79bacf2c9a03e0eb39ff27commit-bot@chromium.org    renderer->init(pict, NULL, NULL, NULL, false);
3288a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com
3298a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com    renderer->setup();
330f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org    renderer->render();
33151c040ed1e8c50bec4297bbe25242f644b40b0b7commit-bot@chromium.org    renderer->resetState(true);    // flush, swapBuffers and Finish
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();
338f5e315ccf1ae2941f7cf53fa53e5c8c4bb665fe1commit-bot@chromium.org        renderer->render();
33951c040ed1e8c50bec4297bbe25242f644b40b0b7commit-bot@chromium.org        renderer->resetState(false);  // flush & swapBuffers, but don't Finish
3408a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com    }
34151c040ed1e8c50bec4297bbe25242f644b40b0b7commit-bot@chromium.org    renderer->resetState(true);    // flush, swapBuffers and Finish
3428a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com
3438a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com    renderer->end();
3448a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com}
3458a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com
346d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.comvoid SkDebuggerGUI::actionProfile() {
3472bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com    // In order to profile we pass the command offsets (that were read-in
3482bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com    // in loadPicture by the SkOffsetPicture) to an SkTimedPlaybackPicture.
349884e60be30e20f38b3466a4697081187d2f1f814skia.committer@gmail.com    // The SkTimedPlaybackPicture in turn passes the offsets to an
3502bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com    // SkTimedPicturePlayback object which uses them to track the performance
3512bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com    // of individual commands.
3522bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com    if (fFileName.isEmpty()) {
3532bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com        return;
3542bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com    }
3552bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com
3562bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com    SkFILEStream inputStream;
3572bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com
3582bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com    inputStream.setPath(fFileName.c_str());
3592bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com    if (!inputStream.isValid()) {
3602bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com        return;
3612bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com    }
3622bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com
363f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com    SkAutoTUnref<SkTimedPicture> picture(SkTimedPicture::CreateTimedPicture(&inputStream,
364f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com                                         &SkImageDecoder::DecodeMemory, fSkipCommands));
365f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com    if (NULL == picture.get()) {
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
392fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.org    if (fSettingsWidget.isGLActive()) {
3931447aa3f3b9a4c23ac1fbc70c476828966980c9drobertphillips@google.com        renderer->setDeviceType(sk_tools::PictureRenderer::kGPU_DeviceType);
394fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.org        renderer->setSampleCount(fSettingsWidget.getGLSampleCount());
3951447aa3f3b9a4c23ac1fbc70c476828966980c9drobertphillips@google.com    }
3961447aa3f3b9a4c23ac1fbc70c476828966980c9drobertphillips@google.com#endif
3971447aa3f3b9a4c23ac1fbc70c476828966980c9drobertphillips@google.com
3988a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com#endif
3992bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com
400e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com    static const int kNumRepeats = 10;
401e174a8bd74f35fafec1f740d9265efae092cea90robertphillips@google.com
402f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com    run(picture.get(), renderer, kNumRepeats);
4032bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com
404f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com    SkASSERT(picture->count() == fListWidget.count());
4052bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com
4062bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com    // extract the individual command times from the SkTimedPlaybackPicture
407f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com    for (int i = 0; i < picture->count(); ++i) {
408f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com        double temp = picture->time(i);
4092bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com
4102bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com        QListWidgetItem* item = fListWidget.item(i);
4112bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com
4122bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com        item->setData(Qt::UserRole + 4, 100.0*temp);
4132bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com    }
4148a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com
415f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com    setupOverviewText(picture->typeTimes(), picture->totTime(), kNumRepeats);
4162a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    setupClipStackText();
417d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com}
418d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com
419902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionCancel() {
420c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    for (int row = 0; row < fListWidget.count(); row++) {
421c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com        fListWidget.item(row)->setHidden(false);
422902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
423902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
424902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
4257e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.comvoid SkDebuggerGUI::actionClearBreakpoints() {
4267e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    for (int row = 0; row < fListWidget.count(); row++) {
4277e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com        QListWidgetItem* item = fListWidget.item(row);
4287e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com        item->setCheckState(Qt::Unchecked);
4297e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com        item->setData(Qt::DecorationRole,
4308e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com                QPixmap(":/blank.png"));
4317e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    }
4327e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com}
4337e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com
4347e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.comvoid SkDebuggerGUI::actionClearDeletes() {
4357e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    for (int row = 0; row < fListWidget.count(); row++) {
4367e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com        QListWidgetItem* item = fListWidget.item(row);
4378e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com        item->setData(Qt::UserRole + 2, QPixmap(":/blank.png"));
438607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com        fDebugger.setCommandVisible(row, true);
4395f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com        fSkipCommands[row] = false;
4407e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    }
4417e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    if (fPause) {
4427e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com        fCanvasWidget.drawTo(fPausedRow);
4436dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com        fImageWidget.draw();
4447e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    } else {
4457e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com        fCanvasWidget.drawTo(fListWidget.currentRow());
4466dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com        fImageWidget.draw();
4477e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    }
4487e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com}
4497e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com
450902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionCommandFilter() {
45122d39332bdba4e2e36aa050220392dcd33d81c19commit-bot@chromium.org    fDebugger.highlightCurrentCommand(fSettingsWidget.getVisibilityFilter());
452c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fCanvasWidget.drawTo(fListWidget.currentRow());
4536dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com    fImageWidget.draw();
454902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
455902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
456902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionClose() {
457902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    this->close();
458902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
459902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
460902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionDelete() {
4617e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com
462dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com    for (int row = 0; row < fListWidget.count(); ++row) {
463dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com        QListWidgetItem* item = fListWidget.item(row);
464dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com
465dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com        if (!item->isSelected()) {
466dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com            continue;
467dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com        }
468dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com
469dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com        if (fDebugger.isCommandVisible(row)) {
470dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com            item->setData(Qt::UserRole + 2, QPixmap(":/delete.png"));
471dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com            fDebugger.setCommandVisible(row, false);
472dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com            fSkipCommands[row] = true;
473dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com        } else {
474dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com            item->setData(Qt::UserRole + 2, QPixmap(":/blank.png"));
475dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com            fDebugger.setCommandVisible(row, true);
476dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com            fSkipCommands[row] = false;
477dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com        }
478902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
4797e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com
480dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com    int currentRow = fListWidget.currentRow();
481dd4b74548accfbf42b8e6b8d7eefbfb8c8f17e00robertphillips@google.com
482e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    if (fPause) {
483e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com        fCanvasWidget.drawTo(fPausedRow);
4846dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com        fImageWidget.draw();
485e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    } else {
486e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com        fCanvasWidget.drawTo(currentRow);
4876dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com        fImageWidget.draw();
488e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    }
489902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
490902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
491e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com#if SK_SUPPORT_GPU
492fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.orgvoid SkDebuggerGUI::actionGLWidget() {
493fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.org    bool isToggled = fSettingsWidget.isGLActive();
494fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.org    if (isToggled) {
495fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.org        fCanvasWidget.setGLSampleCount(fSettingsWidget.getGLSampleCount());
496fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.org    }
497ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    fCanvasWidget.setWidgetVisibility(SkCanvasWidget::kGPU_WidgetType, !isToggled);
498ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com}
499e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com#endif
500ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com
501902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionInspector() {
502c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    if (fInspectorWidget.isHidden()) {
503c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com        fInspectorWidget.setHidden(false);
5046dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com        fImageWidget.setHidden(false);
505902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    } else {
506c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com        fInspectorWidget.setHidden(true);
5076dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com        fImageWidget.setHidden(true);
508902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
509902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
510902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
511902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionPlay() {
512c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    for (int row = fListWidget.currentRow() + 1; row < fListWidget.count();
5137dcae67cae277549accdd38d0496b72d00151239chudy@google.com            row++) {
514c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com        QListWidgetItem *item = fListWidget.item(row);
515902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        if (item->checkState() == Qt::Checked) {
516c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com            fListWidget.setCurrentItem(item);
517902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com            return;
518902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        }
519902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
520c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fListWidget.setCurrentRow(fListWidget.count() - 1);
521902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
522902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
523ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.comvoid SkDebuggerGUI::actionRasterWidget(bool isToggled) {
524ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    fCanvasWidget.setWidgetVisibility(SkCanvasWidget::kRaster_8888_WidgetType, !isToggled);
525ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com}
526ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com
527f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.comvoid SkDebuggerGUI::actionOverdrawVizWidget(bool isToggled) {
528f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com    fDebugger.setOverdrawViz(isToggled);
529f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com    fCanvasWidget.update();
530f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com}
531f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com
532768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.orgvoid SkDebuggerGUI::actionMegaVizWidget(bool isToggled) {
533768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org    fDebugger.setMegaViz(isToggled);
534768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org    fCanvasWidget.update();
535768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org}
536768ac85655017d4106444bf3ad044680a575ccaacommit-bot@chromium.org
5372a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.orgvoid SkDebuggerGUI::actionPathOpsWidget(bool isToggled) {
5382a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    fDebugger.setPathOps(isToggled);
5392a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    fCanvasWidget.update();
5402a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org}
5412a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org
54232bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.comvoid SkDebuggerGUI::actionTextureFilter() {
54332bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com    SkPaint::FilterLevel level;
54432bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com    bool enabled = fSettingsWidget.getFilterOverride(&level);
54532bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com    fDebugger.setTexFilterOverride(enabled, level);
54632bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com    fCanvasWidget.update();
54732bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com}
54832bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com
549902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionRewind() {
550e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fListWidget.setCurrentRow(0);
551902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
552902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
5530ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.comvoid SkDebuggerGUI::actionSave() {
554e219baf74742ee5cda3c99fabe6acaa8f878fe00robertphillips@google.com    fFileName = fPath.toAscii().data();
555d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com    fFileName.append("/");
556e219baf74742ee5cda3c99fabe6acaa8f878fe00robertphillips@google.com    fFileName.append(fDirectoryWidget.currentItem()->text().toAscii().data());
557d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com    saveToFile(fFileName);
5580ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com}
5590ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com
5600ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.comvoid SkDebuggerGUI::actionSaveAs() {
5610ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com    QString filename = QFileDialog::getSaveFileName(this, "Save File", "",
5620ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com            "Skia Picture (*skp)");
56338b08ce020f451a66263110b32e70f5022df4f83chudy@google.com    if (!filename.endsWith(".skp", Qt::CaseInsensitive)) {
5640ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com        filename.append(".skp");
5650ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com    }
566c3c8216949146641222f7d2f7a464340627ae43adjsollen@google.com    saveToFile(SkString(filename.toAscii().data()));
5670ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com}
5680ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com
5697dcae67cae277549accdd38d0496b72d00151239chudy@google.comvoid SkDebuggerGUI::actionScale(float scaleFactor) {
570c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fSettingsWidget.setZoomText(scaleFactor);
5717dcae67cae277549accdd38d0496b72d00151239chudy@google.com}
5727dcae67cae277549accdd38d0496b72d00151239chudy@google.com
573902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionSettings() {
574c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    if (fSettingsWidget.isHidden()) {
575c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com        fSettingsWidget.setHidden(false);
576902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    } else {
577c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com        fSettingsWidget.setHidden(true);
578902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
579902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
580902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
581902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionStepBack() {
582c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    int currentRow = fListWidget.currentRow();
583902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    if (currentRow != 0) {
584c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com        fListWidget.setCurrentRow(currentRow - 1);
585902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
586902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
587902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
588902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::actionStepForward() {
589c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    int currentRow = fListWidget.currentRow();
590902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    QString curRow = QString::number(currentRow);
591c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    QString curCount = QString::number(fListWidget.count());
592c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    if (currentRow < fListWidget.count() - 1) {
593c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com        fListWidget.setCurrentRow(currentRow + 1);
594902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
595902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
596902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
597a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.comvoid SkDebuggerGUI::drawComplete() {
598607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com    fInspectorWidget.setMatrix(fDebugger.getCurrentMatrix());
599607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com    fInspectorWidget.setClip(fDebugger.getCurrentClip());
600a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com}
601a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com
602d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.comvoid SkDebuggerGUI::saveToFile(const SkString& filename) {
603d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com    SkFILEWStream file(filename.c_str());
60425bc2f86c2b94ee1f0921d90e6629d8cb22f69b7robertphillips@google.com    SkAutoTUnref<SkPicture> copy(fDebugger.copyPicture());
60525bc2f86c2b94ee1f0921d90e6629d8cb22f69b7robertphillips@google.com
60625bc2f86c2b94ee1f0921d90e6629d8cb22f69b7robertphillips@google.com    copy->serialize(&file);
6070ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com}
6080ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com
609902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::loadFile(QListWidgetItem *item) {
610902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    if (fDirectoryWidgetActive) {
611e219baf74742ee5cda3c99fabe6acaa8f878fe00robertphillips@google.com        fFileName = fPath.toAscii().data();
6120ac6f168f15393a3213c1c95f8adc4434132dcb2jvanverth@google.com        // don't add a '/' to files in the local directory
6130ac6f168f15393a3213c1c95f8adc4434132dcb2jvanverth@google.com        if (fFileName.size() > 0) {
6140ac6f168f15393a3213c1c95f8adc4434132dcb2jvanverth@google.com            fFileName.append("/");
6150ac6f168f15393a3213c1c95f8adc4434132dcb2jvanverth@google.com        }
616e219baf74742ee5cda3c99fabe6acaa8f878fe00robertphillips@google.com        fFileName.append(item->text().toAscii().data());
617d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com        loadPicture(fFileName);
618902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
619902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
620902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
621902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::openFile() {
622d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com    QString temp = QFileDialog::getOpenFileName(this, tr("Open File"), "",
6237dcae67cae277549accdd38d0496b72d00151239chudy@google.com            tr("Files (*.*)"));
624ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com    openFile(temp);
625ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com}
626ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com
627ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.comvoid SkDebuggerGUI::openFile(const QString &filename) {
628902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    fDirectoryWidgetActive = false;
629ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com    if (!filename.isEmpty()) {
630ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com        QFileInfo pathInfo(filename);
631ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com        loadPicture(SkString(filename.toAscii().data()));
632ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com        setupDirectoryWidget(pathInfo.path());
633902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
634902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    fDirectoryWidgetActive = true;
635902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
636902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
637c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.comvoid SkDebuggerGUI::pauseDrawing(bool isPaused) {
638607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com    fPause = isPaused;
639607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com    fPausedRow = fListWidget.currentRow();
640607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com    fCanvasWidget.drawTo(fPausedRow);
6416dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com    fImageWidget.draw();
6427dcae67cae277549accdd38d0496b72d00151239chudy@google.com}
6437dcae67cae277549accdd38d0496b72d00151239chudy@google.com
644902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::registerListClick(QListWidgetItem *item) {
645d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com    if(!fLoading) {
646d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com        int currentRow = fListWidget.currentRow();
647ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com
648ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com        if (currentRow != -1) {
649ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com            if (!fPause) {
650ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com                fCanvasWidget.drawTo(currentRow);
6516dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com                fImageWidget.draw();
652ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com            }
65397cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com            SkTDArray<SkString*> *currInfo = fDebugger.getCommandInfo(
654ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com                    currentRow);
655ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com
656ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com            /* TODO(chudy): Add command type before parameters. Rename v
657ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com             * to something more informative. */
65897cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com            if (currInfo) {
659ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com                QString info;
660ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com                info.append("<b>Parameters: </b><br/>");
66197cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com                for (int i = 0; i < currInfo->count(); i++) {
66297cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com
66397cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com                    info.append(QString((*currInfo)[i]->c_str()));
664ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com                    info.append("<br/>");
665ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com                }
6666bd109a39370d21bfd4b48f5a28df8bcfc7f5ba2chudy@google.com                fInspectorWidget.setText(info, SkInspectorWidget::kDetail_TabType);
667ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com                fInspectorWidget.setDisabled(false);
668d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com            }
6692a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org            setupClipStackText();
670902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        }
671ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com
672902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
673902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
674902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
6759ca9bfe9f6eaae41841446386e40be1013907e99chudy@google.comvoid SkDebuggerGUI::selectCommand(int command) {
6769ca9bfe9f6eaae41841446386e40be1013907e99chudy@google.com    if (fPause) {
6779ca9bfe9f6eaae41841446386e40be1013907e99chudy@google.com        fListWidget.setCurrentRow(command);
6789ca9bfe9f6eaae41841446386e40be1013907e99chudy@google.com    }
6799ca9bfe9f6eaae41841446386e40be1013907e99chudy@google.com}
6809ca9bfe9f6eaae41841446386e40be1013907e99chudy@google.com
681902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::toggleBreakpoint() {
682c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    QListWidgetItem* item = fListWidget.currentItem();
683902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    if (item->checkState() == Qt::Unchecked) {
684902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        item->setCheckState(Qt::Checked);
685e565de4fad5598890124daadf385930043269415chudy@google.com        item->setData(Qt::DecorationRole,
6868e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com                QPixmap(":/breakpoint_16x16.png"));
687902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    } else {
688902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        item->setCheckState(Qt::Unchecked);
689e565de4fad5598890124daadf385930043269415chudy@google.com        item->setData(Qt::DecorationRole,
6908e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com                QPixmap(":/blank.png"));
691902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
692902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
693902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
694902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::toggleDirectory() {
695607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com    fDirectoryWidget.setHidden(!fDirectoryWidget.isHidden());
696902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
697902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
698902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::toggleFilter(QString string) {
699c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    for (int row = 0; row < fListWidget.count(); row++) {
700c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com        QListWidgetItem *item = fListWidget.item(row);
701607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com        item->setHidden(item->text() != string);
702902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
703902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
704902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
705902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SkDebuggerGUI::setupUi(QMainWindow *SkDebuggerGUI) {
706902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    QIcon windowIcon;
7078e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com    windowIcon.addFile(QString::fromUtf8(":/skia.png"), QSize(),
7087dcae67cae277549accdd38d0496b72d00151239chudy@google.com            QIcon::Normal, QIcon::Off);
709902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    SkDebuggerGUI->setObjectName(QString::fromUtf8("SkDebuggerGUI"));
710902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    SkDebuggerGUI->resize(1200, 1000);
711902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    SkDebuggerGUI->setWindowIcon(windowIcon);
712c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    SkDebuggerGUI->setWindowTitle("Skia Debugger");
713902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
714e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fActionOpen.setShortcuts(QKeySequence::Open);
715c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fActionOpen.setText("Open");
716902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
717c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    QIcon breakpoint;
7188e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com    breakpoint.addFile(QString::fromUtf8(":/breakpoint.png"),
7197dcae67cae277549accdd38d0496b72d00151239chudy@google.com            QSize(), QIcon::Normal, QIcon::Off);
720e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fActionBreakpoint.setShortcut(QKeySequence(tr("Ctrl+B")));
721c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fActionBreakpoint.setIcon(breakpoint);
7227e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    fActionBreakpoint.setText("Breakpoints");
723902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
72457f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    fActionToggleIndexStyle.setShortcut(QKeySequence(tr("Ctrl+T")));
72557f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    fActionToggleIndexStyle.setText("Toggle Index Style");
72657f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org
727c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    QIcon cancel;
7288e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com    cancel.addFile(QString::fromUtf8(":/reload.png"), QSize(),
7297dcae67cae277549accdd38d0496b72d00151239chudy@google.com            QIcon::Normal, QIcon::Off);
730c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fActionCancel.setIcon(cancel);
731c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fActionCancel.setText("Clear Filter");
732902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
7337e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    fActionClearBreakpoints.setShortcut(QKeySequence(tr("Alt+B")));
7347e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    fActionClearBreakpoints.setText("Clear Breakpoints");
7357e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com
7367e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    fActionClearDeletes.setShortcut(QKeySequence(tr("Alt+X")));
7377e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    fActionClearDeletes.setText("Clear Deletes");
7387e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com
739e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fActionClose.setShortcuts(QKeySequence::Quit);
740c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fActionClose.setText("Exit");
741902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
742e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fActionCreateBreakpoint.setShortcut(QKeySequence(tr("B")));
743e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fActionCreateBreakpoint.setText("Set Breakpoint");
744e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com
745e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fActionDelete.setShortcut(QKeySequence(tr("X")));
746c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fActionDelete.setText("Delete Command");
747902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
748e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fActionDirectory.setShortcut(QKeySequence(tr("Ctrl+D")));
749e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fActionDirectory.setText("Directory");
750902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
751d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com    QIcon profile;
752d163636ec6914a95c7a8333dc94bc0cae68b226arobertphillips@google.com    profile.addFile(QString::fromUtf8(":/profile.png"), QSize(),
753d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com                    QIcon::Normal, QIcon::Off);
754d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com    fActionProfile.setIcon(profile);
755d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com    fActionProfile.setText("Profile");
756e099bc403ca85be61cf23e67661e6a795fbcc40arobertphillips@google.com    fActionProfile.setDisabled(true);
757d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com
758902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    QIcon inspector;
759d163636ec6914a95c7a8333dc94bc0cae68b226arobertphillips@google.com    inspector.addFile(QString::fromUtf8(":/inspector.png"),
7607dcae67cae277549accdd38d0496b72d00151239chudy@google.com            QSize(), QIcon::Normal, QIcon::Off);
761e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fActionInspector.setShortcut(QKeySequence(tr("Ctrl+I")));
762c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fActionInspector.setIcon(inspector);
763e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fActionInspector.setText("Inspector");
764902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
7652ff6d1d1dc2c4668b0c587c55fd37407fb8d68abbungeman@google.com    QIcon settings;
7662ff6d1d1dc2c4668b0c587c55fd37407fb8d68abbungeman@google.com    settings.addFile(QString::fromUtf8(":/inspector.png"),
7672ff6d1d1dc2c4668b0c587c55fd37407fb8d68abbungeman@google.com            QSize(), QIcon::Normal, QIcon::Off);
7682ff6d1d1dc2c4668b0c587c55fd37407fb8d68abbungeman@google.com    fActionSettings.setShortcut(QKeySequence(tr("Ctrl+G")));
7692ff6d1d1dc2c4668b0c587c55fd37407fb8d68abbungeman@google.com    fActionSettings.setIcon(settings);
7702ff6d1d1dc2c4668b0c587c55fd37407fb8d68abbungeman@google.com    fActionSettings.setText("Settings");
7710d55dd7d2c07a77b22478bed9b30ff44ceecad68skia.committer@gmail.com
772c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    QIcon play;
773d163636ec6914a95c7a8333dc94bc0cae68b226arobertphillips@google.com    play.addFile(QString::fromUtf8(":/play.png"), QSize(),
7747dcae67cae277549accdd38d0496b72d00151239chudy@google.com            QIcon::Normal, QIcon::Off);
775e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fActionPlay.setShortcut(QKeySequence(tr("Ctrl+P")));
776c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fActionPlay.setIcon(play);
777c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fActionPlay.setText("Play");
778902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
779e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    QIcon pause;
780d163636ec6914a95c7a8333dc94bc0cae68b226arobertphillips@google.com    pause.addFile(QString::fromUtf8(":/pause.png"), QSize(),
7817dcae67cae277549accdd38d0496b72d00151239chudy@google.com            QIcon::Normal, QIcon::Off);
782e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fActionPause.setShortcut(QKeySequence(tr("Space")));
783e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fActionPause.setCheckable(true);
784e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fActionPause.setIcon(pause);
785e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fActionPause.setText("Pause");
786e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com
787c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    QIcon rewind;
7888e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com    rewind.addFile(QString::fromUtf8(":/rewind.png"), QSize(),
789c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com            QIcon::Normal, QIcon::Off);
790e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fActionRewind.setShortcut(QKeySequence(tr("Ctrl+R")));
791c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fActionRewind.setIcon(rewind);
792c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fActionRewind.setText("Rewind");
793902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
7940ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com    fActionSave.setShortcut(QKeySequence::Save);
7950ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com    fActionSave.setText("Save");
7960ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com    fActionSave.setDisabled(true);
7970ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com    fActionSaveAs.setShortcut(QKeySequence::SaveAs);
7980ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com    fActionSaveAs.setText("Save As");
7990ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com    fActionSaveAs.setDisabled(true);
8000ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com
8017e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    fActionShowDeletes.setShortcut(QKeySequence(tr("Ctrl+X")));
8027e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    fActionShowDeletes.setText("Deleted Commands");
8037e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com
804c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    QIcon stepBack;
8058e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com    stepBack.addFile(QString::fromUtf8(":/previous.png"), QSize(),
8067dcae67cae277549accdd38d0496b72d00151239chudy@google.com            QIcon::Normal, QIcon::Off);
807e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fActionStepBack.setShortcut(QKeySequence(tr("[")));
808c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fActionStepBack.setIcon(stepBack);
809c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fActionStepBack.setText("Step Back");
810902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
811c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    QIcon stepForward;
8128e41a168b0c4eedfcfb05d46f6a19895cc9459ecrobertphillips@google.com    stepForward.addFile(QString::fromUtf8(":/next.png"),
813c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com            QSize(), QIcon::Normal, QIcon::Off);
814e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fActionStepForward.setShortcut(QKeySequence(tr("]")));
815c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fActionStepForward.setIcon(stepForward);
816c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fActionStepForward.setText("Step Forward");
817c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com
818a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com    fActionZoomIn.setShortcut(QKeySequence(tr("Ctrl+=")));
819a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com    fActionZoomIn.setText("Zoom In");
820a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com    fActionZoomOut.setShortcut(QKeySequence(tr("Ctrl+-")));
821a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com    fActionZoomOut.setText("Zoom Out");
822a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com
823c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fListWidget.setItemDelegate(new SkListWidget(&fListWidget));
824c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fListWidget.setObjectName(QString::fromUtf8("listWidget"));
825bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org    fListWidget.setMinimumWidth(250);
826902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
827c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fFilter.addItem("--Filter By Available Commands--");
828902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
829bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org    fDirectoryWidget.setMinimumWidth(250);
830c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fDirectoryWidget.setStyleSheet("QListWidget::Item {padding: 5px;}");
831902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
832c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fCanvasWidget.setSizePolicy(QSizePolicy::Expanding,
8337dcae67cae277549accdd38d0496b72d00151239chudy@google.com            QSizePolicy::Expanding);
834902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
8351c9c0d37111e6ff7a74a2908bf62a0d3954f2bb5skia.committer@gmail.com    fImageWidget.setFixedSize(SkImageWidget::kImageWidgetWidth,
8366dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com                              SkImageWidget::kImageWidgetHeight);
8376dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com
838c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fInspectorWidget.setSizePolicy(QSizePolicy::Expanding,
8397dcae67cae277549accdd38d0496b72d00151239chudy@google.com            QSizePolicy::Expanding);
840c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fInspectorWidget.setMaximumHeight(300);
841c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com
8426dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com    fSettingsAndImageLayout.setSpacing(6);
8436dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com    fSettingsAndImageLayout.addWidget(&fSettingsWidget);
8446dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com    fSettingsAndImageLayout.addWidget(&fImageWidget);
8456dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com
846c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fSettingsWidget.setSizePolicy(QSizePolicy::Expanding,
847c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com            QSizePolicy::Expanding);
848c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fSettingsWidget.setMaximumWidth(250);
849c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com
850bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org    fLeftColumnSplitter.addWidget(&fListWidget);
851bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org    fLeftColumnSplitter.addWidget(&fDirectoryWidget);
852bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org    fLeftColumnSplitter.setOrientation(Qt::Vertical);
853902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
8546dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com    fCanvasSettingsAndImageLayout.setSpacing(6);
8556dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com    fCanvasSettingsAndImageLayout.addWidget(&fCanvasWidget);
8566dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com    fCanvasSettingsAndImageLayout.addLayout(&fSettingsAndImageLayout);
8576dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com
858c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fMainAndRightColumnLayout.setSpacing(6);
8596dec8fcb4427c68649aede96864cff7c71df6393robertphillips@google.com    fMainAndRightColumnLayout.addLayout(&fCanvasSettingsAndImageLayout);
860c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fMainAndRightColumnLayout.addWidget(&fInspectorWidget);
861bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org    fMainAndRightColumnWidget.setLayout(&fMainAndRightColumnLayout);
862902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
863bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org    fCentralSplitter.addWidget(&fLeftColumnSplitter);
864bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org    fCentralSplitter.addWidget(&fMainAndRightColumnWidget);
865bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org    fCentralSplitter.setStretchFactor(0, 0);
866bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org    fCentralSplitter.setStretchFactor(1, 1);
867902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
868bcd431e1778001990c4d877929b14959dc96a0d3commit-bot@chromium.org    SkDebuggerGUI->setCentralWidget(&fCentralSplitter);
869c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    SkDebuggerGUI->setStatusBar(&fStatusBar);
870902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
871e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fToolBar.setIconSize(QSize(32, 32));
872c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fToolBar.setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
873c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    SkDebuggerGUI->addToolBar(Qt::TopToolBarArea, &fToolBar);
874902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
8750ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com    fSpacer.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
876902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
877c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fToolBar.addAction(&fActionRewind);
878c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fToolBar.addAction(&fActionStepBack);
879e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fToolBar.addAction(&fActionPause);
880c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fToolBar.addAction(&fActionStepForward);
881c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fToolBar.addAction(&fActionPlay);
882c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fToolBar.addSeparator();
883e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fToolBar.addAction(&fActionInspector);
8842ff6d1d1dc2c4668b0c587c55fd37407fb8d68abbungeman@google.com    fToolBar.addAction(&fActionSettings);
885c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fToolBar.addSeparator();
886d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com    fToolBar.addAction(&fActionProfile);
887d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com
888d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com    fToolBar.addSeparator();
8890ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com    fToolBar.addWidget(&fSpacer);
890c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fToolBar.addWidget(&fFilter);
891c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fToolBar.addAction(&fActionCancel);
892902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
893902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    // TODO(chudy): Remove static call.
894902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    fDirectoryWidgetActive = false;
895d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com    fFileName = "";
896ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com    setupDirectoryWidget("");
897902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    fDirectoryWidgetActive = true;
898902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
899902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    // Menu Bar
900c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fMenuFile.setTitle("File");
901c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fMenuFile.addAction(&fActionOpen);
9020ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com    fMenuFile.addAction(&fActionSave);
9030ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com    fMenuFile.addAction(&fActionSaveAs);
904c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fMenuFile.addAction(&fActionClose);
905e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com
906e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fMenuEdit.setTitle("Edit");
907e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fMenuEdit.addAction(&fActionDelete);
9087e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    fMenuEdit.addAction(&fActionClearDeletes);
9097e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    fMenuEdit.addSeparator();
910e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fMenuEdit.addAction(&fActionCreateBreakpoint);
9117e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    fMenuEdit.addAction(&fActionClearBreakpoints);
912e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com
913c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fMenuNavigate.setTitle("Navigate");
914e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fMenuNavigate.addAction(&fActionRewind);
915e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fMenuNavigate.addAction(&fActionStepBack);
916e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fMenuNavigate.addAction(&fActionStepForward);
917e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fMenuNavigate.addAction(&fActionPlay);
918e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fMenuNavigate.addAction(&fActionPause);
919c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fMenuNavigate.addAction(&fActionGoToLine);
920e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com
921c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fMenuView.setTitle("View");
922e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fMenuView.addAction(&fActionBreakpoint);
9237e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    fMenuView.addAction(&fActionShowDeletes);
92457f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    fMenuView.addAction(&fActionToggleIndexStyle);
925a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com    fMenuView.addAction(&fActionZoomIn);
926a1226319b72df0fb4c8a9a6aae5e493a4e3527cbchudy@google.com    fMenuView.addAction(&fActionZoomOut);
927e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com
928e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fMenuWindows.setTitle("Window");
929e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fMenuWindows.addAction(&fActionInspector);
9302ff6d1d1dc2c4668b0c587c55fd37407fb8d68abbungeman@google.com    fMenuWindows.addAction(&fActionSettings);
931e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fMenuWindows.addAction(&fActionDirectory);
932c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com
933c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fActionGoToLine.setText("Go to Line...");
934c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fActionGoToLine.setDisabled(true);
935c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fMenuBar.addAction(fMenuFile.menuAction());
936e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fMenuBar.addAction(fMenuEdit.menuAction());
937c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fMenuBar.addAction(fMenuView.menuAction());
938c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fMenuBar.addAction(fMenuNavigate.menuAction());
939e504de0a50f268189399567f58183c8c6a27b2afchudy@google.com    fMenuBar.addAction(fMenuWindows.menuAction());
940902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
9417dcae67cae277549accdd38d0496b72d00151239chudy@google.com    fPause = false;
9427dcae67cae277549accdd38d0496b72d00151239chudy@google.com
943c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    SkDebuggerGUI->setMenuBar(&fMenuBar);
944902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    QMetaObject::connectSlotsByName(SkDebuggerGUI);
945902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
946902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
947ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.comvoid SkDebuggerGUI::setupDirectoryWidget(const QString& path) {
948ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com    fPath = path;
949ff6e6bade36c34a4c4fce4c14b480b9d2435bcd5robertphillips@google.com    QDir dir(path);
950902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    QRegExp r(".skp");
951c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fDirectoryWidget.clear();
952c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    const QStringList files = dir.entryList();
953902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    foreach (QString f, files) {
9547dcae67cae277549accdd38d0496b72d00151239chudy@google.com        if (f.contains(r))
955c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com            fDirectoryWidget.addItem(f);
956902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
957902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
958902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
959d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.comvoid SkDebuggerGUI::loadPicture(const SkString& fileName) {
960d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com    fFileName = fileName;
961d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com    fLoading = true;
962d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com    SkStream* stream = SkNEW_ARGS(SkFILEStream, (fileName.c_str()));
9632d40ec4e9a3fb3540756fa45a6cffd541ada2c78robertphillips@google.com
964f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com    SkPicture* picture = SkPicture::CreateFromStream(stream);
9652d40ec4e9a3fb3540756fa45a6cffd541ada2c78robertphillips@google.com
966f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com    if (NULL == picture) {
9672d40ec4e9a3fb3540756fa45a6cffd541ada2c78robertphillips@google.com        QMessageBox::critical(this, "Error loading file", "Couldn't read file, sorry.");
9682d40ec4e9a3fb3540756fa45a6cffd541ada2c78robertphillips@google.com        SkSafeUnref(stream);
9692d40ec4e9a3fb3540756fa45a6cffd541ada2c78robertphillips@google.com        return;
9702d40ec4e9a3fb3540756fa45a6cffd541ada2c78robertphillips@google.com    }
9712bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com
972686e68019374dca3692cac6d5f8d94515e53d6c8chudy@google.com    fCanvasWidget.resetWidgetTransform();
973607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com    fDebugger.loadPicture(picture);
9744c7962e0a866b8416fa7046791c129eb5430b677chudy@google.com
9756d9c92b2f6e5be64dd5dd98e44d672877e4c9fbcrobertphillips@google.com    fSkipCommands.setCount(fDebugger.getSize());
9766d9c92b2f6e5be64dd5dd98e44d672877e4c9fbcrobertphillips@google.com    for (int i = 0; i < fSkipCommands.count(); ++i) {
9775f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com        fSkipCommands[i] = false;
9785f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com    }
9795f97114fd28e03e8c4c1c22c924d383b45cdced1robertphillips@google.com
980607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com    SkSafeUnref(stream);
981607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com    SkSafeUnref(picture);
982607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com
98397cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    // Will this automatically clear out due to nature of refcnt?
9848a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com    SkTArray<SkString>* commands = fDebugger.getDrawCommandsAsStrings();
98557f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    SkTDArray<size_t>* offsets = fDebugger.getDrawCommandOffsets();
98657f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    SkASSERT(commands->count() == offsets->count());
987607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com
9886d9c92b2f6e5be64dd5dd98e44d672877e4c9fbcrobertphillips@google.com    fActionProfile.setDisabled(false);
9892bde91dcb6f2840e01216054897fe98a930e9104robertphillips@google.com
9907dcae67cae277549accdd38d0496b72d00151239chudy@google.com    /* fDebugCanvas is reinitialized every load picture. Need it to retain value
991607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com     * of the visibility filter.
992607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com     * TODO(chudy): This should be deprecated since fDebugger is not
993607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com     * recreated.
994607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com     * */
99522d39332bdba4e2e36aa050220392dcd33d81c19commit-bot@chromium.org    fDebugger.highlightCurrentCommand(fSettingsWidget.getVisibilityFilter());
996607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com
99757f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    this->setupListWidget(commands, offsets);
99857f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    this->setupComboBox(commands);
99957f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    this->setupOverviewText(NULL, 0.0, 1);
10007e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    fInspectorWidget.setDisabled(false);
1001e606d6e210b17dd9dd582d4d3ec70acb4f3213d5chudy@google.com    fSettingsWidget.setDisabled(false);
1002d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com    fMenuEdit.setDisabled(false);
1003d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com    fMenuNavigate.setDisabled(false);
1004d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com    fMenuView.setDisabled(false);
10050ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com    fActionSave.setDisabled(false);
10060ab03397afd3420ea8fd9323d78ddd562a7b7bdfchudy@google.com    fActionSaveAs.setDisabled(false);
1007d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com    fLoading = false;
1008d3058f5fd8bb786c5b70a0dd222bde646502258achudy@google.com    actionPlay();
1009902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
1010902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
101157f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.orgvoid SkDebuggerGUI::setupListWidget(SkTArray<SkString>* commands, SkTDArray<size_t>* offsets) {
101257f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    SkASSERT(commands->count() == offsets->count());
1013c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    fListWidget.clear();
1014902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    int counter = 0;
101530d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com    int indent = 0;
101657f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org    for (int i = 0; i < commands->count(); i++) {
1017902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        QListWidgetItem *item = new QListWidgetItem();
101857f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org        item->setData(Qt::DisplayRole, (*commands)[i].c_str());
1019902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        item->setData(Qt::UserRole + 1, counter++);
102030d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com
102157f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org        if (0 == strcmp("Restore", (*commands)[i].c_str()) ||
102257f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org            0 == strcmp("EndCommentGroup", (*commands)[i].c_str()) ||
102357f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org            0 == strcmp("PopCull", (*commands)[i].c_str())) {
102430d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com            indent -= 10;
102530d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com        }
102630d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com
102730d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com        item->setData(Qt::UserRole + 3, indent);
102830d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com
102957f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org        if (0 == strcmp("Save", (*commands)[i].c_str()) ||
103057f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org            0 == strcmp("Save Layer", (*commands)[i].c_str()) ||
103157f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org            0 == strcmp("BeginCommentGroup", (*commands)[i].c_str()) ||
103257f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org            0 == strcmp("PushCull", (*commands)[i].c_str())) {
103330d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com            indent += 10;
103430d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com        }
103530d35f23ae390043462e2aa5fc6863a4621aa74drobertphillips@google.com
103657f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org        item->setData(Qt::UserRole + 4, -1);
103757f74e0aa931e7784d47cba3ecc83020aa8e72b2commit-bot@chromium.org        item->setData(Qt::UserRole + 5, (int)(*offsets)[i]);
1038d26c70688fda9dd33369f5ea9da78f26c8666d63robertphillips@google.com
1039c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com        fListWidget.addItem(item);
1040902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
1041902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
1042902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
104391274b99722d9be62e077ab979c630c23cdd04b1skia.committer@gmail.comvoid SkDebuggerGUI::setupOverviewText(const SkTDArray<double>* typeTimes,
1044e428f9b1132c12299c204a333192495d7e748511robertphillips@google.com                                      double totTime,
1045e428f9b1132c12299c204a333192495d7e748511robertphillips@google.com                                      int numRuns) {
10462d9dbd4f78314b4b36f67d6ebbf3e0f2d9a163e3borenet@google.com    SkString overview;
1047e428f9b1132c12299c204a333192495d7e748511robertphillips@google.com    fDebugger.getOverviewText(typeTimes, totTime, &overview, numRuns);
10482d9dbd4f78314b4b36f67d6ebbf3e0f2d9a163e3borenet@google.com    fInspectorWidget.setText(overview.c_str(), SkInspectorWidget::kOverview_TabType);
10498a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com}
10508a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com
10512a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.orgvoid SkDebuggerGUI::setupClipStackText() {
10522a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    SkString clipStack;
10532a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    fDebugger.getClipStackText(&clipStack);
10542a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org    fInspectorWidget.setText(clipStack.c_str(), SkInspectorWidget::kClipStack_TabType);
10552a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org}
10562a67e123a3e559774a16a58cbe5106bc0fb86740commit-bot@chromium.org
10578a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.comvoid SkDebuggerGUI::setupComboBox(SkTArray<SkString>* command) {
10588a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com    fFilter.clear();
10598a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com    fFilter.addItem("--Filter By Available Commands--");
10608a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com
10618a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com    std::map<std::string, int> map;
10628a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com    for (int i = 0; i < command->count(); i++) {
10638a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com        map[(*command)[i].c_str()]++;
10648a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com    }
10658a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com
10663458716b52aa25dcd1b270141c7628c380696e35skia.committer@gmail.com    for (std::map<std::string, int>::iterator it = map.begin(); it != map.end();
10678a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com         ++it) {
10688a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com        fFilter.addItem((it->first).c_str());
10698a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com    }
1070902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
1071902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    // NOTE(chudy): Makes first item unselectable.
10727dcae67cae277549accdd38d0496b72d00151239chudy@google.com    QStandardItemModel* model = qobject_cast<QStandardItemModel*>(
1073c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com            fFilter.model());
1074c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com    QModelIndex firstIndex = model->index(0, fFilter.modelColumn(),
1075c432f00a84e2b3d759b3f24ec687af7320121eeachudy@google.com            fFilter.rootModelIndex());
1076902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    QStandardItem* firstItem = model->itemFromIndex(firstIndex);
1077902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    firstItem->setSelectable(false);
1078902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
1079