blob: 2ff21b0763a278ca736c958ba7695177cf453aec [file] [log] [blame]
chudy@google.com902ebe52012-06-29 14:21:22 +00001
2/*
3 * Copyright 2012 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9
chudy@google.com902ebe52012-06-29 14:21:22 +000010#include "SkCanvasWidget.h"
chudy@google.com902ebe52012-06-29 14:21:22 +000011
chudy@google.com2d537a12012-07-31 12:49:52 +000012SkCanvasWidget::SkCanvasWidget() : QWidget()
chudy@google.comea5488b2012-07-26 19:38:22 +000013 , fHorizontalLayout(this)
chudy@google.comea5488b2012-07-26 19:38:22 +000014{
15 fHorizontalLayout.setSpacing(6);
16 fHorizontalLayout.setContentsMargins(0,0,0,0);
17 fRasterWidget.setSizePolicy(QSizePolicy::Expanding,
18 QSizePolicy::Expanding);
19 fGLWidget.setSizePolicy(QSizePolicy::Expanding,
20 QSizePolicy::Expanding);
chudy@google.com902ebe52012-06-29 14:21:22 +000021
chudy@google.comea5488b2012-07-26 19:38:22 +000022 fHorizontalLayout.addWidget(&fRasterWidget);
23 fHorizontalLayout.addWidget(&fGLWidget);
chudy@google.com80a4a602012-07-30 18:54:07 +000024 fDebugCanvas = NULL;
chudy@google.com2f891792012-07-03 16:05:59 +000025
chudy@google.com2f891792012-07-03 16:05:59 +000026 fIndex = 0;
27 fPreviousPoint.set(0,0);
chudy@google.com830b8792012-08-01 15:57:52 +000028 fUserOffset.set(0,0);
29 fUserScaleFactor = 1.0;
chudy@google.com2f891792012-07-03 16:05:59 +000030
chudy@google.comea5488b2012-07-26 19:38:22 +000031 setWidgetVisibility(kGPU_WidgetType, true);
chudy@google.com80a4a602012-07-30 18:54:07 +000032 this->setDisabled(true);
chudy@google.com902ebe52012-06-29 14:21:22 +000033}
34
chudy@google.com2d537a12012-07-31 12:49:52 +000035SkCanvasWidget::~SkCanvasWidget() {
chudy@google.com0b5bbb02012-07-31 19:55:32 +000036 delete fDebugCanvas;
chudy@google.com2d537a12012-07-31 12:49:52 +000037}
38
chudy@google.comea5488b2012-07-26 19:38:22 +000039void SkCanvasWidget::drawTo(int index) {
40 fIndex = index;
41 if (!fRasterWidget.isHidden()) {
42 fRasterWidget.drawTo(index);
chudy@google.com2f891792012-07-03 16:05:59 +000043 }
chudy@google.comea5488b2012-07-26 19:38:22 +000044 if (!fGLWidget.isHidden()) {
45 fGLWidget.drawTo(index);
46 }
chudy@google.com7dcae672012-07-09 20:26:53 +000047 emit commandChanged(fIndex);
chudy@google.com902ebe52012-06-29 14:21:22 +000048}
49
50void SkCanvasWidget::loadPicture(QString filename) {
chudy@google.com80a4a602012-07-30 18:54:07 +000051 this->setDisabled(false);
chudy@google.comea5488b2012-07-26 19:38:22 +000052 SkStream* stream = new SkFILEStream(filename.toAscii());
53 SkPicture* picture = new SkPicture(stream);
chudy@google.com902ebe52012-06-29 14:21:22 +000054
chudy@google.comea5488b2012-07-26 19:38:22 +000055 /* TODO(chudy): Implement function that doesn't require new
56 * instantiation of debug canvas. */
chudy@google.com902ebe52012-06-29 14:21:22 +000057 delete fDebugCanvas;
chudy@google.com80a4a602012-07-30 18:54:07 +000058 fDebugCanvas = new SkDebugCanvas(picture->width(), picture->height());
59
chudy@google.com902ebe52012-06-29 14:21:22 +000060 picture->draw(fDebugCanvas);
chudy@google.com830b8792012-08-01 15:57:52 +000061 fIndex = fDebugCanvas->getSize() - 1;
chudy@google.comea5488b2012-07-26 19:38:22 +000062 fRasterWidget.setDebugCanvas(fDebugCanvas);
63 fGLWidget.setDebugCanvas(fDebugCanvas);
chudy@google.com80a4a602012-07-30 18:54:07 +000064 fDebugCanvas->setBounds(this->width(), this->height());
chudy@google.com2f891792012-07-03 16:05:59 +000065}
66
67void SkCanvasWidget::mouseMoveEvent(QMouseEvent* event) {
chudy@google.com2f891792012-07-03 16:05:59 +000068 SkIPoint eventPoint = SkIPoint::Make(event->globalX(), event->globalY());
chudy@google.com830b8792012-08-01 15:57:52 +000069 fUserOffset += eventPoint - fPreviousPoint;
chudy@google.com2f891792012-07-03 16:05:59 +000070 fPreviousPoint = eventPoint;
chudy@google.com830b8792012-08-01 15:57:52 +000071 fDebugCanvas->setUserOffset(fUserOffset);
chudy@google.com7dcae672012-07-09 20:26:53 +000072 drawTo(fIndex);
chudy@google.com2f891792012-07-03 16:05:59 +000073}
74
75void SkCanvasWidget::mousePressEvent(QMouseEvent* event) {
76 fPreviousPoint.set(event->globalX(), event->globalY());
chudy@google.com751961d2012-07-31 20:07:42 +000077 emit hitChanged(fDebugCanvas->getCommandAtPoint(event->x(), event->y(),
chudy@google.com830b8792012-08-01 15:57:52 +000078 fIndex));
chudy@google.com2f891792012-07-03 16:05:59 +000079}
80
81void SkCanvasWidget::mouseDoubleClickEvent(QMouseEvent* event) {
chudy@google.comea5488b2012-07-26 19:38:22 +000082 resetWidgetTransform();
chudy@google.com902ebe52012-06-29 14:21:22 +000083}
84
chudy@google.comea5488b2012-07-26 19:38:22 +000085void SkCanvasWidget::resetWidgetTransform() {
chudy@google.com830b8792012-08-01 15:57:52 +000086 fUserOffset.set(0,0);
87 fUserScaleFactor = 1.0;
88 fDebugCanvas->setUserOffset(fUserOffset);
89 fDebugCanvas->setUserScale(fUserScaleFactor);
90 emit scaleFactorChanged(fUserScaleFactor);
91 drawTo(fIndex);
chudy@google.comea5488b2012-07-26 19:38:22 +000092}
chudy@google.com902ebe52012-06-29 14:21:22 +000093
chudy@google.comea5488b2012-07-26 19:38:22 +000094void SkCanvasWidget::setWidgetVisibility(WidgetType type, bool isHidden) {
95 if (type == kRaster_8888_WidgetType) {
96 fRasterWidget.setHidden(isHidden);
97 } else if (type == kGPU_WidgetType) {
98 fGLWidget.setHidden(isHidden);
99 }
100}
chudy@google.com2f891792012-07-03 16:05:59 +0000101
chudy@google.coma1226312012-07-26 20:26:44 +0000102void SkCanvasWidget::zoom(float zoomIncrement) {
chudy@google.com830b8792012-08-01 15:57:52 +0000103 fUserScaleFactor += zoomIncrement;
chudy@google.com2f891792012-07-03 16:05:59 +0000104
chudy@google.com830b8792012-08-01 15:57:52 +0000105 /* The range of the fUserScaleFactor crosses over the range -1,0,1 frequently.
chudy@google.coma1226312012-07-26 20:26:44 +0000106 * Based on the code below, -1 and 1 both scale the image to it's original
107 * size we do the following to never have a registered wheel scroll
chudy@google.com830b8792012-08-01 15:57:52 +0000108 * not effect the fUserScaleFactor. */
109 if (fUserScaleFactor == 0) {
110 fUserScaleFactor = 2 * zoomIncrement;
chudy@google.com902ebe52012-06-29 14:21:22 +0000111 }
chudy@google.com830b8792012-08-01 15:57:52 +0000112 emit scaleFactorChanged(fUserScaleFactor);
113 fDebugCanvas->setUserScale(fUserScaleFactor);
chudy@google.com7dcae672012-07-09 20:26:53 +0000114 drawTo(fIndex);
chudy@google.com902ebe52012-06-29 14:21:22 +0000115}