Adds functionality to the matrix and clip widget.

Review URL: https://codereview.appspot.com/6348058

git-svn-id: http://skia.googlecode.com/svn/trunk@4453 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
chudy@google.com 2012-07-03 16:05:59 +00:00
parent 0fcf474921
commit 2f89179395
5 changed files with 269 additions and 129 deletions

View File

@ -10,28 +10,69 @@
#include "SkPicture.h"
#include "SkStream.h"
#include "SkCanvasWidget.h"
#include "SkColor.h"
#include <iostream>
SkCanvasWidget::SkCanvasWidget(QWidget *parent) :
QWidget(parent) {
fBitmap = new SkBitmap();
fBitmap->setConfig(SkBitmap::kARGB_8888_Config, 800, 800);
fBitmap->allocPixels();
fBitmap->eraseColor(0);
fDevice = new SkDevice(*fBitmap);
/* TODO(chudy): The 800x800 is a default number. Change it to be
* set dynamically. Also need to pass size into debugCanvas for current
* command filter. */
fBitmap.setConfig(SkBitmap::kARGB_8888_Config, 800, 800);
fBitmap.allocPixels();
fBitmap.eraseColor(0);
/* TODO(chudy): Add fCanvas, fDevice to the stack. The bitmap being
* cleared does get rid of fDevices link to it. See if there's someway around
* it so that we don't have to delete both canvas and device to clear out
* the bitmap. */
fDevice = new SkDevice(fBitmap);
fCanvas = new SkCanvas(fDevice);
fDebugCanvas = new SkDebugCanvas();
fScaleFactor = 1;
fIndex = 0;
fPreviousPoint.set(0,0);
fTransform.set(0,0);
this->setStyleSheet("QWidget {background-color: white; border: 1px solid #cccccc;}");
}
SkCanvasWidget::~SkCanvasWidget() {}
SkCanvasWidget::~SkCanvasWidget() {
delete fCanvas;
delete fDevice;
delete fDebugCanvas;
}
void SkCanvasWidget::drawTo(int index) {
void SkCanvasWidget::resizeEvent(QResizeEvent* event) {
fBitmap.setConfig(SkBitmap::kARGB_8888_Config, event->size().width(), event->size().height());
fBitmap.allocPixels();
fBitmap.eraseColor(0);
delete fCanvas;
delete fDevice;
fDevice = new SkDevice(fBitmap);
fCanvas = new SkCanvas(fDevice);
fDebugCanvas->drawTo(fCanvas, fIndex);
this->update();
}
void SkCanvasWidget::drawTo(int fIndex) {
delete fCanvas;
fCanvas = new SkCanvas(fDevice);
fDebugCanvas->drawTo(fCanvas, index+1);
fCanvas->translate(fTransform.fX, fTransform.fY);
if(fScaleFactor < 0) {
fCanvas->scale((1.0 / -fScaleFactor),(1.0 / -fScaleFactor));
} else if (fScaleFactor > 0) {
fCanvas->scale(fScaleFactor, fScaleFactor);
}
fDebugCanvas->drawTo(fCanvas, fIndex+1);
this->update();
this->fIndex = fIndex;
}
void SkCanvasWidget::loadPicture(QString filename) {
@ -44,6 +85,14 @@ void SkCanvasWidget::loadPicture(QString filename) {
picture->draw(fDebugCanvas);
fDebugCanvas->draw(fCanvas);
fIndex = fDebugCanvas->getSize();
SkColor color = fBitmap.getColor(fBitmap.width()-1,fBitmap.height()-1);
int r = SkColorGetR(color);
int g = SkColorGetG(color);
int b = SkColorGetB(color);
/* NOTE(chudy): This was a test to determine if the canvas size is accurately
* saved in the bounds of the recorded picture. It is not. Everyone of the
* sample GM images is 1000x1000. Even the one that claims it is
@ -51,9 +100,37 @@ void SkCanvasWidget::loadPicture(QString filename) {
std::cout << "Width: " << picture->width();
std::cout << " Height: " << picture->height() << std::endl; */
/* NOTE(chudy): Updated style sheet without a background specified to
* draw over our SkCanvas. */
this->setStyleSheet("QWidget {border: 1px solid #cccccc;}");
/* Updated style sheet without a background specified. If not removed
* QPainter paints the specified background color on top of our canvas. */
QString style("QWidget {border: 1px solid #cccccc; background-color: #");
style.append(QString::number(r, 16));
style.append(QString::number(g, 16));
style.append(QString::number(b, 16));
style.append(";}");
this->setStyleSheet(style);
this->update();
}
void SkCanvasWidget::mouseMoveEvent(QMouseEvent* event) {
SkIPoint eventPoint = SkIPoint::Make(event->globalX(), event->globalY());
fTransform += eventPoint - fPreviousPoint;
fPreviousPoint = eventPoint;
// TODO(chudy): Fix and remove +1 from drawTo calls.
drawTo(fIndex+1);
this->update();
}
void SkCanvasWidget::mousePressEvent(QMouseEvent* event) {
fPreviousPoint.set(event->globalX(), event->globalY());
}
void SkCanvasWidget::mouseDoubleClickEvent(QMouseEvent* event) {
fTransform.set(0,0);
fScaleFactor = 0;
drawTo(fIndex+1);
this->update();
}
@ -62,12 +139,28 @@ void SkCanvasWidget::paintEvent(QPaintEvent *event) {
QStyleOption opt;
opt.init(this);
if (fBitmap) {
const QPoint origin(0,0);
QImage image((uchar *)fBitmap->getPixels(), fBitmap->width(), fBitmap->height(), QImage::Format_ARGB32_Premultiplied);
painter.drawImage(origin,image);
}
style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
QPoint origin(0,0);
QImage image((uchar *)fBitmap.getPixels(), fBitmap.width(),
fBitmap.height(), QImage::Format_ARGB32_Premultiplied);
painter.drawImage(origin, image);
painter.end();
}
void SkCanvasWidget::wheelEvent(QWheelEvent* event) {
fScaleFactor += event->delta()/120;
/* The range of the fScaleFactor crosses over the range -1,0,1 frequently.
* Based on the code below, -1 and 1 both scale the image to it's original
* size we do the following to never have a registered wheel scroll
* not effect the fScaleFactor. */
if (fScaleFactor == 0) {
fScaleFactor += (event->delta()/120) * 2;
}
// TODO(chudy): Fix and remove +1 from drawTo calls.
drawTo(fIndex+1);
this->update();
}

View File

@ -18,6 +18,7 @@
#include <QApplication>
#include <QtGui>
#include <QWidget>
#include <QWheelEvent>
/** \class SkCanvasWidget
@ -47,13 +48,27 @@ public:
/**
Returns the height of the bitmap.
*/
int getBitmapHeight() { return fBitmap->height(); }
int getBitmapHeight() { return fBitmap.height(); }
/*
Returns the width of the bitmap.
*/
int getBitmapWidth() { return fBitmap->width(); }
int getBitmapWidth() { return fBitmap.width(); }
/**
Returns an array of values of the current matrix.
*/
const SkMatrix& getCurrentMatrix() {
return fCanvas->getTotalMatrix();
}
/**
Returns an array of values of the current bounding clip.
*/
const SkIRect& getCurrentClip() {
return fCanvas->getTotalClip().getBounds();
}
/**
TODO(chudy): Refactor into a struct of char**
@ -100,6 +115,19 @@ public:
fDebugCanvas->toggleFilter(toggle);
}
/**
Captures mouse clicks
@param event The event intercepted by Qt
*/
void mouseMoveEvent(QMouseEvent* event);
void mousePressEvent(QMouseEvent* event);
void mouseDoubleClickEvent(QMouseEvent* event);
void resizeEvent(QResizeEvent* event);
void wheelEvent(QWheelEvent* event);
protected:
/**
@ -109,10 +137,16 @@ protected:
void paintEvent(QPaintEvent *event);
private:
SkBitmap* fBitmap;
SkBitmap fBitmap;
SkCanvas* fCanvas;
SkDebugCanvas* fDebugCanvas;
SkDevice* fDevice;
SkIPoint fPreviousPoint;
SkIPoint fTransform;
int fIndex;
int fScaleFactor;
};
#endif

View File

@ -190,7 +190,6 @@ void SkDebuggerGUI::openFile() {
tr("Files (*.*)"));
fDirectoryWidgetActive = false;
if (!fileName.isNull()) {
QFileInfo pathInfo(fileName);
fPath = pathInfo.path();
loadPicture(fileName);
@ -225,6 +224,9 @@ void SkDebuggerGUI::registerListClick(QListWidgetItem *item) {
info.append("<br/>");
}
fInspectorWidget->setDetailText(info);
fInspectorWidget->setDisabled(false);
fInspectorWidget->setMatrix(fCanvasWidget->getCurrentMatrix());
fInspectorWidget->setClip(fCanvasWidget->getCurrentClip());
}
}
}

View File

@ -10,35 +10,38 @@
#include "SkInspectorWidget.h"
#include <iostream>
SkInspectorWidget::SkInspectorWidget(QWidget *parent) : QWidget(parent) {
// NOTE(chudy): Keeps the inspector widget fully expanded.
fHorizontalLayout = new QHBoxLayout(this);
fHorizontalLayout->setSpacing(6);
fHorizontalLayout->setContentsMargins(11, 11, 11, 11);
SkInspectorWidget::SkInspectorWidget(QWidget *parent)
: QWidget(parent)
, fHorizontalLayout(this)
, fOverviewTab()
, fOverviewLayout(&fOverviewTab)
, fDetailTab()
, fDetailLayout(&fDetailTab)
, fMatrixAndClipWidget(this)
, fVerticalLayout(&fMatrixAndClipWidget)
, fMatrixLabel(this)
, fClipLabel(this) {
fTabWidget = new QTabWidget();
fHorizontalLayout.setSpacing(6);
fHorizontalLayout.setContentsMargins(11, 11, 11, 11);
fOverviewTab = new QWidget();
fOverviewLayout = new QHBoxLayout(fOverviewTab);
fOverviewLayout->setSpacing(6);
fOverviewLayout->setContentsMargins(11, 11, 11, 11);
fOverviewText = new QTextEdit();
fOverviewText->setReadOnly(true);
fOverviewLayout->addWidget(fOverviewText);
fOverviewLayout.setSpacing(6);
fOverviewLayout.setContentsMargins(11, 11, 11, 11);
fDetailTab = new QWidget();
fDetailLayout = new QHBoxLayout(fDetailTab);
fDetailLayout->setSpacing(6);
fDetailLayout->setContentsMargins(11,11,11,11);
fDetailText = new QTextEdit();
fDetailText->setReadOnly(true);
fDetailLayout->addWidget(fDetailText);
fOverviewText.setReadOnly(true);
fOverviewLayout.addWidget(&fOverviewText);
fTabWidget->addTab(fOverviewTab, QString("Overview"));
fTabWidget->addTab(fDetailTab, QString("Details"));
fDetailLayout.setSpacing(6);
fDetailLayout.setContentsMargins(11,11,11,11);
fHorizontalLayout->setAlignment(Qt::AlignTop);
fHorizontalLayout->addWidget(fTabWidget);
fDetailText.setReadOnly(true);
fDetailLayout.addWidget(&fDetailText);
fTabWidget.addTab(&fOverviewTab, QString("Overview"));
fTabWidget.addTab(&fDetailTab, QString("Details"));
fHorizontalLayout.setAlignment(Qt::AlignTop);
fHorizontalLayout.addWidget(&fTabWidget);
/* NOTE(chudy): We add all the line edits to (this). Then we lay them out
* by adding them to horizontal layouts.
@ -47,81 +50,80 @@ SkInspectorWidget::SkInspectorWidget(QWidget *parent) : QWidget(parent) {
* line edits in each horizontal layout.
*/
fMatrixAndClipWidget = new QWidget(this);
fMatrixAndClipWidget->setFixedSize(200,300);
fMatrixAndClipWidget->setDisabled(true);
fVerticalLayout = new QVBoxLayout(fMatrixAndClipWidget);
fVerticalLayout->setAlignment(Qt::AlignVCenter);
fVerticalLayout->addLayout(currentMatrix());
fVerticalLayout->addLayout(currentClip());
fHorizontalLayout->addWidget(fMatrixAndClipWidget);
fMatrixAndClipWidget.setFixedSize(260,300);
fMatrixAndClipWidget.setDisabled(true);
fVerticalLayout.setAlignment(Qt::AlignVCenter);
fVerticalLayout.addLayout(setupMatrix());
fVerticalLayout.addLayout(setupClip());
fHorizontalLayout.addWidget(&fMatrixAndClipWidget);
}
SkInspectorWidget::~SkInspectorWidget() {}
QString SkInspectorWidget::getDetailText() {
return fDetailText->toHtml();
}
QString SkInspectorWidget::getOverviewText() {
return fOverviewText->toHtml();
}
void SkInspectorWidget::setDetailText(QString text) {
fDetailText->setHtml(text);
fDetailText.setHtml(text);
}
void SkInspectorWidget::setOverviewText(QString text) {
fOverviewText->setHtml(text);
fOverviewText.setHtml(text);
}
QVBoxLayout* SkInspectorWidget::currentMatrix() {
fMatrixLabel = new QLabel(this);
fMatrixLabel->setText("Current Matrix");
fMatrixLabel->setAlignment(Qt::AlignHCenter);
fMatrixLayout = new QVBoxLayout();
fMatrixLayout->setSpacing(6);
fMatrixLayout->setContentsMargins(11,11,11,0);
fMatrixLayout->setAlignment(Qt::AlignTop | Qt::AlignHCenter);
fMatrixLayout->addWidget(fMatrixLabel);
void SkInspectorWidget::setMatrix(const SkMatrix& matrix) {
for(int i=0; i<9; i++) {
fMatrixEntry[i].setText(QString::number(matrix.get(i)));
}
}
void SkInspectorWidget::setClip(const SkIRect& clip) {
fClipEntry[0].setText(QString::number(clip.left()));
fClipEntry[1].setText(QString::number(clip.top()));
fClipEntry[2].setText(QString::number(clip.right()));
fClipEntry[3].setText(QString::number(clip.bottom()));
}
QVBoxLayout* SkInspectorWidget::setupMatrix() {
fMatrixLabel.setText("Current Matrix");
fMatrixLabel.setAlignment(Qt::AlignHCenter);
fMatrixLayout.setSpacing(6);
fMatrixLayout.setContentsMargins(11,11,11,0);
fMatrixLayout.setAlignment(Qt::AlignTop | Qt::AlignHCenter);
fMatrixLayout.addWidget(&fMatrixLabel);
for(int i =0; i<9; i++) {
fMatrixEntry[i] = new QLineEdit();
fMatrixEntry[i]->setMinimumSize(QSize(50,25));
fMatrixEntry[i]->setMaximumSize(QSize(50,16777215));
fMatrixEntry[i]->setReadOnly(true);
fMatrixEntry[i].setMinimumSize(QSize(70,25));
fMatrixEntry[i].setMaximumSize(QSize(70,16777215));
fMatrixEntry[i].setReadOnly(true);
if(!(i%3)) fMatrixRow[i/3] = new QHBoxLayout();
fMatrixRow[i/3]->addWidget(fMatrixEntry[i]);
if(i%3 == 2) fMatrixLayout->addLayout(fMatrixRow[i/3]);
fMatrixRow[i/3].addWidget(&fMatrixEntry[i]);
if(i%3 == 2) {
fMatrixLayout.addLayout(&fMatrixRow[i/3]);
}
}
return fMatrixLayout;
return &fMatrixLayout;
}
QVBoxLayout* SkInspectorWidget::currentClip() {
fClipLabel = new QLabel(this);
fClipLabel->setText("Current Clip");
fClipLabel->setAlignment(Qt::AlignHCenter);
fClipLayout = new QVBoxLayout();
fClipLayout->setSpacing(6);
fClipLayout->setContentsMargins(11,11,11,0);
fClipLayout->setAlignment(Qt::AlignTop | Qt::AlignHCenter);
fClipLayout->addWidget(fClipLabel);
QVBoxLayout* SkInspectorWidget::setupClip() {
fClipLabel.setText("Current Clip");
fClipLabel.setAlignment(Qt::AlignHCenter);
fClipLayout.setSpacing(6);
fClipLayout.setContentsMargins(11,11,11,0);
fClipLayout.setAlignment(Qt::AlignTop | Qt::AlignHCenter);
fClipLayout.addWidget(&fClipLabel);
for(int i =0; i<4; i++) {
fClipEntry[i] = new QLineEdit();
fClipEntry[i]->setMinimumSize(QSize(50,25));
fClipEntry[i]->setMaximumSize(QSize(50,16777215));
fClipEntry[i]->setReadOnly(true);
fClipEntry[i].setMinimumSize(QSize(70,25));
fClipEntry[i].setMaximumSize(QSize(70,16777215));
fClipEntry[i].setReadOnly(true);
if(!(i%2)) fClipRow[i/2] = new QHBoxLayout();
fClipRow[i/2]->addWidget(fClipEntry[i]);
if(i%2 == 1) fClipLayout->addLayout(fClipRow[i/2]);
fClipRow[i/2].addWidget(&fClipEntry[i]);
if(i%2 == 1) {
fClipLayout.addLayout(&fClipRow[i/2]);
}
}
return fClipLayout;
return &fClipLayout;
}

View File

@ -10,6 +10,8 @@
#ifndef SKINSPECTORWIDGET_H_
#define SKINSPECTORWIDGET_H_
#include "SkMatrix.h"
#include <QWidget>
#include <QTabWidget>
#include <QTextEdit>
@ -34,16 +36,9 @@ public:
~SkInspectorWidget();
/**
Returns a QString representation of the text currently in the detail tab.
*/
QString getDetailText();
/**
Returns a QString representation of the text currently in the overview tab.
*/
QString getOverviewText();
void setDisabled(bool isDisabled) {
fMatrixAndClipWidget.setDisabled(isDisabled);
}
/**
Sets the text in the detail tab.
@param text
@ -56,31 +51,45 @@ public:
*/
void setOverviewText(QString text);
/**
Sets the text in the current matrix.
@param matrixValues
*/
void setMatrix(const SkMatrix& matrix);
/**
Sets the text in the current clip.
@param clipValues
*/
void setClip(const SkIRect& clip);
private:
QWidget* fDetailTab;
QTextEdit* fDetailText;
QHBoxLayout* fDetailLayout;
QHBoxLayout* fHorizontalLayout;
QWidget* fOverviewTab;
QTextEdit* fOverviewText;
QHBoxLayout* fOverviewLayout;
QTabWidget* fTabWidget;
QHBoxLayout fHorizontalLayout;
QTabWidget fTabWidget;
QWidget* fMatrixAndClipWidget;
QVBoxLayout* fVerticalLayout;
QWidget fOverviewTab;
QHBoxLayout fOverviewLayout;
QTextEdit fOverviewText;
QVBoxLayout* fMatrixLayout;
QLabel* fMatrixLabel;
QHBoxLayout* fMatrixRow[3];
QLineEdit* fMatrixEntry[9];
QWidget fDetailTab;
QHBoxLayout fDetailLayout;
QTextEdit fDetailText;
QVBoxLayout* fClipLayout;
QLabel* fClipLabel;
QHBoxLayout* fClipRow[2];
QLineEdit* fClipEntry[4];
QWidget fMatrixAndClipWidget;
QVBoxLayout fVerticalLayout;
QVBoxLayout* currentMatrix();
QVBoxLayout* currentClip();
QLabel fMatrixLabel;
QVBoxLayout fMatrixLayout;
QHBoxLayout fMatrixRow[3];
QLineEdit fMatrixEntry[9];
QLabel fClipLabel;
QVBoxLayout fClipLayout;
QHBoxLayout fClipRow[2];
QLineEdit fClipEntry[4];
QVBoxLayout* setupMatrix();
QVBoxLayout* setupClip();
};
#endif