diff options
author | 2012-07-12 14:31:25 +0000 | |
---|---|---|
committer | 2012-07-12 14:31:25 +0000 | |
commit | e606d6e210b17dd9dd582d4d3ec70acb4f3213d5 (patch) | |
tree | 0435ebc517896f6958ef4e1ab99372197c1d2d6e /debugger | |
parent | e565de4fad5598890124daadf385930043269415 (diff) |
SkHitBox added.
SkHitBox is a class that determines which draw command is associated with the pixel located at x,y. By calculating a single point instead of the entire bitmap at once there is no visible performance slowdown.
Review URL: https://codereview.appspot.com/6350098
git-svn-id: http://skia.googlecode.com/svn/trunk@4565 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'debugger')
-rw-r--r-- | debugger/QT/SkCanvasWidget.cpp | 10 | ||||
-rw-r--r-- | debugger/QT/SkCanvasWidget.h | 1 | ||||
-rw-r--r-- | debugger/QT/SkDebuggerGUI.cpp | 5 | ||||
-rw-r--r-- | debugger/QT/SkSettingsWidget.cpp | 21 | ||||
-rw-r--r-- | debugger/QT/SkSettingsWidget.h | 7 | ||||
-rw-r--r-- | debugger/QT/moc_SkCanvasWidget.cpp | 19 | ||||
-rw-r--r-- | debugger/QT/moc_SkSettingsWidget.cpp | 10 | ||||
-rw-r--r-- | debugger/SkDebugCanvas.cpp | 9 | ||||
-rw-r--r-- | debugger/SkDebugCanvas.h | 23 | ||||
-rw-r--r-- | debugger/SkHitBox.cpp | 66 | ||||
-rw-r--r-- | debugger/SkHitBox.h | 81 |
11 files changed, 232 insertions, 20 deletions
diff --git a/debugger/QT/SkCanvasWidget.cpp b/debugger/QT/SkCanvasWidget.cpp index 39fb1f5aad..8c660a4a23 100644 --- a/debugger/QT/SkCanvasWidget.cpp +++ b/debugger/QT/SkCanvasWidget.cpp @@ -11,7 +11,6 @@ #include "SkStream.h" #include "SkCanvasWidget.h" #include "SkColor.h" -#include <iostream> SkCanvasWidget::SkCanvasWidget(QWidget *parent) : QWidget(parent) { @@ -56,7 +55,7 @@ void SkCanvasWidget::resizeEvent(QResizeEvent* event) { fDevice = new SkDevice(fBitmap); fCanvas = new SkCanvas(fDevice); fDebugCanvas->setBounds(event->size().width(), event->size().height()); - fDebugCanvas->drawTo(fCanvas, fIndex); + fDebugCanvas->drawTo(fCanvas, fIndex+1, &fBitmap); this->update(); } @@ -72,7 +71,7 @@ void SkCanvasWidget::drawTo(int fIndex) { } emit commandChanged(fIndex); - fDebugCanvas->drawTo(fCanvas, fIndex+1); + fDebugCanvas->drawTo(fCanvas, fIndex+1, &fBitmap); this->update(); this->fIndex = fIndex; } @@ -128,6 +127,11 @@ void SkCanvasWidget::mouseMoveEvent(QMouseEvent* event) { void SkCanvasWidget::mousePressEvent(QMouseEvent* event) { fPreviousPoint.set(event->globalX(), event->globalY()); + fDebugCanvas->getBoxClass()->setHitPoint(event->x(), event->y()); + fDebugCanvas->isCalculatingHits(true); + drawTo(fIndex); + emit hitChanged(fDebugCanvas->getHitBoxPoint()); + fDebugCanvas->isCalculatingHits(false); } void SkCanvasWidget::mouseDoubleClickEvent(QMouseEvent* event) { diff --git a/debugger/QT/SkCanvasWidget.h b/debugger/QT/SkCanvasWidget.h index 3f18749786..65fa2baf09 100644 --- a/debugger/QT/SkCanvasWidget.h +++ b/debugger/QT/SkCanvasWidget.h @@ -132,6 +132,7 @@ public: signals: void scaleFactorChanged(float newScaleFactor); void commandChanged(int newCommand); + void hitChanged(int hit); protected: /** diff --git a/debugger/QT/SkDebuggerGUI.cpp b/debugger/QT/SkDebuggerGUI.cpp index 96e155167e..12c3bdc9c3 100644 --- a/debugger/QT/SkDebuggerGUI.cpp +++ b/debugger/QT/SkDebuggerGUI.cpp @@ -71,10 +71,12 @@ SkDebuggerGUI::SkDebuggerGUI(QWidget *parent) : SLOT(actionCommandFilter())); connect(&fCanvasWidget, SIGNAL(scaleFactorChanged(float)), this, SLOT(actionScale(float))); - connect(fSettingsWidget.getCommandCheckBox(), SIGNAL(stateChanged(int)), + connect(fSettingsWidget.getCommandCheckBox(), SIGNAL(toggled(bool)), this, SLOT(pauseDrawing(bool))); connect(&fCanvasWidget, SIGNAL(commandChanged(int)), &fSettingsWidget, SLOT(updateCommand(int))); + connect(&fCanvasWidget, SIGNAL(hitChanged(int)), &fSettingsWidget, + SLOT(updateHit(int))); } SkDebuggerGUI::~SkDebuggerGUI() { @@ -478,6 +480,7 @@ void SkDebuggerGUI::loadPicture(QString fileName) { fSettingsWidget.getVisibilityButton()->isChecked()); setupListWidget(cv); setupComboBox(cv); + fSettingsWidget.setDisabled(false); } void SkDebuggerGUI::setupListWidget(std::vector<std::string>* cv) { diff --git a/debugger/QT/SkSettingsWidget.cpp b/debugger/QT/SkSettingsWidget.cpp index 117e7bf71e..5b5236a322 100644 --- a/debugger/QT/SkSettingsWidget.cpp +++ b/debugger/QT/SkSettingsWidget.cpp @@ -19,6 +19,7 @@ SkSettingsWidget::SkSettingsWidget(QWidget *parent) : QWidget(parent) , fVisibleOff(&fVisibleFrame) , fCommandLayout(&fCommandFrame) , fCurrentCommandBox(&fCommandFrame) + , fCommandHitBox(&fCommandFrame) , fCommandCheckBox(&fCommandFrame) , fZoomBox(&fZoomFrame) , fZoomLayout(&fZoomFrame) @@ -65,10 +66,24 @@ SkSettingsWidget::SkSettingsWidget(QWidget *parent) : QWidget(parent) fCurrentCommandLayout.addWidget(&fCurrentCommandLabel); fCurrentCommandLayout.addWidget(&fCurrentCommandBox); + fCommandHitLabel.setText("Command HitBox: "); + fCommandHitLabel.setMinimumWidth(178); + fCommandHitLabel.setMaximumWidth(178); + fCommandHitBox.setText("0"); + fCommandHitBox.setMinimumSize(QSize(50,25)); + fCommandHitBox.setMaximumSize(QSize(50,25)); + fCommandHitBox.setAlignment(Qt::AlignRight); + fCommandHitLayout.setSpacing(0); + fCommandHitLayout.setContentsMargins(0,0,0,0); + fCommandHitLayout.setAlignment(Qt::AlignLeft); + fCommandHitLayout.addWidget(&fCommandHitLabel); + fCommandHitLayout.addWidget(&fCommandHitBox); + fCommandCheckBox.setText("Pause"); fCommandLayout.setSpacing(6); fCommandLayout.setContentsMargins(11,11,11,11); fCommandLayout.addLayout(&fCurrentCommandLayout); + fCommandLayout.addLayout(&fCommandHitLayout); fCommandLayout.addWidget(&fCommandCheckBox); // Zoom Info @@ -93,7 +108,7 @@ SkSettingsWidget::SkSettingsWidget(QWidget *parent) : QWidget(parent) fVerticalLayout.addWidget(&fCommandFrame); fVerticalLayout.addWidget(&fZoomFrame); - //this->setDisabled(true); + this->setDisabled(true); } SkSettingsWidget::~SkSettingsWidget() {} @@ -103,6 +118,10 @@ void SkSettingsWidget::updateCommand(int newCommand) { fCurrentCommandBox.setText(QString::number(newCommand)); } +void SkSettingsWidget::updateHit(int newHit) { + fCommandHitBox.setText(QString::number(newHit)); +} + QCheckBox* SkSettingsWidget::getCommandCheckBox() { return &fCommandCheckBox; } diff --git a/debugger/QT/SkSettingsWidget.h b/debugger/QT/SkSettingsWidget.h index da7326b68e..839a331ae3 100644 --- a/debugger/QT/SkSettingsWidget.h +++ b/debugger/QT/SkSettingsWidget.h @@ -43,6 +43,7 @@ public: private slots: void updateCommand(int newCommand); + void updateHit(int newHit); signals: void scrollingPreferences(bool isStickyActivate); @@ -64,10 +65,14 @@ private: QFrame fCommandFrame; QVBoxLayout fCommandLayout; - QLineEdit fCurrentCommandBox; QLabel fCurrentCommandLabel; + QLineEdit fCurrentCommandBox; QHBoxLayout fCurrentCommandLayout; + QLabel fCommandHitLabel; + QLineEdit fCommandHitBox; + QHBoxLayout fCommandHitLayout; + QCheckBox fCommandCheckBox; QLabel fZoomSetting; diff --git a/debugger/QT/moc_SkCanvasWidget.cpp b/debugger/QT/moc_SkCanvasWidget.cpp index 0187620abb..098b3bb745 100644 --- a/debugger/QT/moc_SkCanvasWidget.cpp +++ b/debugger/QT/moc_SkCanvasWidget.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** Meta object code from reading C++ file 'SkCanvasWidget.h' ** -** Created: Mon Jul 9 13:45:07 2012 +** Created: Wed Jul 11 15:15:07 2012 ** by: The Qt Meta Object Compiler version 62 (Qt 4.6.2) ** ** WARNING! All changes made in this file will be lost! @@ -23,16 +23,17 @@ static const uint qt_meta_data_SkCanvasWidget[] = { 4, // revision 0, // classname 0, 0, // classinfo - 2, 14, // methods + 3, 14, // methods 0, 0, // properties 0, 0, // enums/sets 0, 0, // constructors 0, // flags - 2, // signalCount + 3, // signalCount // signals: signature, parameters, type, tag, flags 31, 16, 15, 15, 0x05, 68, 57, 15, 15, 0x05, + 92, 88, 15, 15, 0x05, 0 // eod }; @@ -40,7 +41,7 @@ static const uint qt_meta_data_SkCanvasWidget[] = { static const char qt_meta_stringdata_SkCanvasWidget[] = { "SkCanvasWidget\0\0newScaleFactor\0" "scaleFactorChanged(float)\0newCommand\0" - "commandChanged(int)\0" + "commandChanged(int)\0hit\0hitChanged(int)\0" }; const QMetaObject SkCanvasWidget::staticMetaObject = { @@ -74,9 +75,10 @@ int SkCanvasWidget::qt_metacall(QMetaObject::Call _c, int _id, void **_a) switch (_id) { case 0: scaleFactorChanged((*reinterpret_cast< float(*)>(_a[1]))); break; case 1: commandChanged((*reinterpret_cast< int(*)>(_a[1]))); break; + case 2: hitChanged((*reinterpret_cast< int(*)>(_a[1]))); break; default: ; } - _id -= 2; + _id -= 3; } return _id; } @@ -94,4 +96,11 @@ void SkCanvasWidget::commandChanged(int _t1) void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; QMetaObject::activate(this, &staticMetaObject, 1, _a); } + +// SIGNAL 2 +void SkCanvasWidget::hitChanged(int _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 2, _a); +} QT_END_MOC_NAMESPACE diff --git a/debugger/QT/moc_SkSettingsWidget.cpp b/debugger/QT/moc_SkSettingsWidget.cpp index 336b1ef2f9..d2822ce334 100644 --- a/debugger/QT/moc_SkSettingsWidget.cpp +++ b/debugger/QT/moc_SkSettingsWidget.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** Meta object code from reading C++ file 'SkSettingsWidget.h' ** -** Created: Mon Jul 9 13:45:07 2012 +** Created: Wed Jul 11 15:20:23 2012 ** by: The Qt Meta Object Compiler version 62 (Qt 4.6.2) ** ** WARNING! All changes made in this file will be lost! @@ -23,7 +23,7 @@ static const uint qt_meta_data_SkSettingsWidget[] = { 4, // revision 0, // classname 0, 0, // classinfo - 4, 14, // methods + 5, 14, // methods 0, 0, // properties 0, 0, // enums/sets 0, 0, // constructors @@ -37,6 +37,7 @@ static const uint qt_meta_data_SkSettingsWidget[] = { // slots: signature, parameters, type, tag, flags 138, 127, 17, 17, 0x08, + 164, 157, 17, 17, 0x08, 0 // eod }; @@ -46,7 +47,7 @@ static const char qt_meta_stringdata_SkSettingsWidget[] = { "scrollingPreferences(bool)\0isSingleCommand\0" "showStyle(bool)\0isEnabled\0" "visibilityFilter(bool)\0newCommand\0" - "updateCommand(int)\0" + "updateCommand(int)\0newHit\0updateHit(int)\0" }; const QMetaObject SkSettingsWidget::staticMetaObject = { @@ -82,9 +83,10 @@ int SkSettingsWidget::qt_metacall(QMetaObject::Call _c, int _id, void **_a) case 1: showStyle((*reinterpret_cast< bool(*)>(_a[1]))); break; case 2: visibilityFilter((*reinterpret_cast< bool(*)>(_a[1]))); break; case 3: updateCommand((*reinterpret_cast< int(*)>(_a[1]))); break; + case 4: updateHit((*reinterpret_cast< int(*)>(_a[1]))); break; default: ; } - _id -= 4; + _id -= 5; } return _id; } diff --git a/debugger/SkDebugCanvas.cpp b/debugger/SkDebugCanvas.cpp index c1039f15ab..8586878485 100644 --- a/debugger/SkDebugCanvas.cpp +++ b/debugger/SkDebugCanvas.cpp @@ -34,12 +34,11 @@ void SkDebugCanvas::draw(SkCanvas* canvas) { } } - -void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) { +void SkDebugCanvas::drawTo(SkCanvas* canvas, int index, SkBitmap* bitmap) { int counter = 0; if(!commandVector.empty()) { for(it = commandVector.begin(); it != commandVector.end(); ++it) { - if (counter != (index-1)) { + if (counter != (index-1)) { if ((*it)->getVisibility()) { (*it)->execute(canvas); } @@ -56,11 +55,13 @@ void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) { canvas->drawRectCoords(SkIntToScalar(0),SkIntToScalar(0),SkIntToScalar(fWidth),SkIntToScalar(fHeight), *p); canvas->restore(); } - if ((*it)->getVisibility()) { (*it)->execute(canvas); } } + if (fCalculateHits == true) { + fHitBox.updateHitPoint(bitmap, counter); + } /* TODO(chudy): Implement a bitmap wide function that will take * ~50 out of each R,G,B. This will make everything but the last diff --git a/debugger/SkDebugCanvas.h b/debugger/SkDebugCanvas.h index 6375681cfc..e6dd56a961 100644 --- a/debugger/SkDebugCanvas.h +++ b/debugger/SkDebugCanvas.h @@ -14,6 +14,7 @@ #include "SkCanvas.h" #include "SkDrawCommand.h" #include "SkPicture.h" +#include "SkHitBox.h" #include <vector> class SkDebugCanvas : public SkCanvas { @@ -45,7 +46,7 @@ public: @param canvas The canvas being drawn to @param index The index of the final command being executed */ - void drawTo(SkCanvas* canvas, int index); + void drawTo(SkCanvas* canvas, int index, SkBitmap* bitmap); /** Returns the draw command at the given index. @@ -70,12 +71,30 @@ public: std::vector<std::string>* getDrawCommandsAsStrings(); /** + Returns the mapping of all pixels to a layer value. + */ + int* getHitBox() { + return fHitBox.getHitBox(); + } + + SkHitBox* getBoxClass() { + return &fHitBox; + } + + int getHitBoxPoint() { + return fHitBox.getPoint(); + } + + /** Returns length of draw command vector. */ int getSize() { return commandVector.size(); } + void isCalculatingHits(bool isEnabled) { + fCalculateHits = isEnabled; + } /** Toggles the execution of the draw command at index i. */ @@ -176,6 +195,8 @@ private: int fHeight; int fWidth; SkBitmap fBm; + SkHitBox fHitBox; + bool fCalculateHits; /** Adds the command to the classes vector of commands. diff --git a/debugger/SkHitBox.cpp b/debugger/SkHitBox.cpp new file mode 100644 index 0000000000..a65fcc416d --- /dev/null +++ b/debugger/SkHitBox.cpp @@ -0,0 +1,66 @@ + +/* + * Copyright 2012 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + + +#include "SkHitBox.h" + +SkHitBox::SkHitBox() { + fHitBox = NULL; + fX = -1; + fY = -1; + fLayer = -1; +} + +SkHitBox::~SkHitBox() {} + +void SkHitBox::alloc(int width, int height) { + free(fHitBox); + int length = width * height; + fHitBox = (int*) malloc(length * sizeof(int)); + for (int i = 0; i < length; i++) { + fHitBox[i] = 0; + } +} + +void SkHitBox::updateHitBox(SkBitmap* newBitmap, int layer) { + int length = fPrev.width() * fPrev.height(); + int* prevBase = (int*)fPrev.getPixels(); + int* currBase = (int*)newBitmap->getPixels(); + + for (int i = 0; i < length; i++) { + if (SkUnPreMultiply::PMColorToColor(prevBase[i]) != + SkUnPreMultiply::PMColorToColor(currBase[i])) { + fHitBox[i] = layer; + } + } + if (fPrev.empty()) { + alloc(newBitmap->width(), newBitmap->height()); + fPrev.setConfig(SkBitmap::kARGB_8888_Config, newBitmap->width(), newBitmap->height()); + fPrev.allocPixels(); + } + newBitmap->deepCopyTo(&fPrev, SkBitmap::kARGB_8888_Config); +} + +void SkHitBox::updateHitPoint(SkBitmap* newBitmap, int layer) { + int* prevBase = (int*)fPrev.getPixels(); + int* currBase = (int*)newBitmap->getPixels(); + int pixel = fY * fPrev.width() + fX; + + if (pointIsSet() && !fPrev.empty()) { + if (SkUnPreMultiply::PMColorToColor(prevBase[pixel]) != + SkUnPreMultiply::PMColorToColor(currBase[pixel])) { + fLayer = layer; + } + } + if (fPrev.empty()) { + alloc(newBitmap->width(), newBitmap->height()); + fPrev.setConfig(SkBitmap::kARGB_8888_Config, newBitmap->width(), newBitmap->height()); + fPrev.allocPixels(); + } + newBitmap->deepCopyTo(&fPrev, SkBitmap::kARGB_8888_Config); +} diff --git a/debugger/SkHitBox.h b/debugger/SkHitBox.h new file mode 100644 index 0000000000..19a65fd5dd --- /dev/null +++ b/debugger/SkHitBox.h @@ -0,0 +1,81 @@ + +/* + * Copyright 2012 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + + +#ifndef SKHITBOX_H_ +#define SKHITBOX_H_ + +#include "SkBitmap.h" +#include "SkUnPreMultiply.h" + +/* NOTE(chudy): It's possible that this class can be entirely static similar to + * SkObjectParser. We will have to pass in the fHitBox void * every call. + */ +class SkHitBox { +public: + SkHitBox(); + ~SkHitBox(); + + /** + Allocates enough space in memory for our hitbox pointer to contain + a layer value for every pixel. Initializes every value to 0. + */ + void alloc(int width, int height); + + /** + Compares the new SkBitmap compared to the SkBitmap from the last + call. Updates our hitbox with the draw command number if different. + */ + void updateHitBox(SkBitmap* newBitmap, int layer); + + /** + Compares point x,y in the new bitmap compared to the saved previous + one. Updates hitpoint with the draw command number if different. + */ + void updateHitPoint(SkBitmap* newBitmap, int layer); + + /** + Sets the target hitpoint we are attempting to find the layer of. + */ + void setHitPoint(int x, int y) { + fX = x; + fY = y; + fLayer = 0; + } + + /** + Returns a pointer to the start of the hitbox. + */ + int* getHitBox() { + return fHitBox; + } + + /** + Returns the layer numbr corresponding to the point (fX, fY) in this class. + */ + int getPoint() { + return fLayer; + } + + /** + Checks to see if a mouse click has been passed in. + */ + bool pointIsSet() { + return !(fX == -1 && fY == -1); + } + +private: + SkBitmap fPrev; + int* fHitBox; + int fX; + int fY; + int fLayer; +}; + + +#endif /* SKHITBOX_H_ */ |