aboutsummaryrefslogtreecommitdiffhomepage
path: root/debugger/QT/SkCanvasWidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'debugger/QT/SkCanvasWidget.cpp')
-rw-r--r--debugger/QT/SkCanvasWidget.cpp127
1 files changed, 110 insertions, 17 deletions
diff --git a/debugger/QT/SkCanvasWidget.cpp b/debugger/QT/SkCanvasWidget.cpp
index 6e8265627b..c38fdbb810 100644
--- a/debugger/QT/SkCanvasWidget.cpp
+++ b/debugger/QT/SkCanvasWidget.cpp
@@ -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::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 index) {
+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();
+}