blob: 03ba33ac5f5aabab5ea4f6811634f21c3efe5f7a [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"
kkinnunencfdc0e32015-01-13 22:49:02 -080011#include <QtGui>
chudy@google.com902ebe52012-06-29 14:21:22 +000012
chudy@google.com607357f2012-08-07 16:12:23 +000013SkCanvasWidget::SkCanvasWidget(QWidget* parent,
14 SkDebugger* debugger) : QWidget(parent)
chudy@google.comea5488b2012-07-26 19:38:22 +000015 , fHorizontalLayout(this)
chudy@google.com607357f2012-08-07 16:12:23 +000016 , fRasterWidget(debugger)
robertphillips@google.come8fe4bc2013-02-13 13:26:13 +000017#if SK_SUPPORT_GPU
chudy@google.com607357f2012-08-07 16:12:23 +000018 , fGLWidget(debugger)
robertphillips@google.come8fe4bc2013-02-13 13:26:13 +000019#endif
chudy@google.comea5488b2012-07-26 19:38:22 +000020{
chudy@google.com607357f2012-08-07 16:12:23 +000021
22 fDebugger = debugger;
23
chudy@google.comea5488b2012-07-26 19:38:22 +000024 fHorizontalLayout.setSpacing(6);
25 fHorizontalLayout.setContentsMargins(0,0,0,0);
26 fRasterWidget.setSizePolicy(QSizePolicy::Expanding,
27 QSizePolicy::Expanding);
robertphillips@google.come8fe4bc2013-02-13 13:26:13 +000028#if SK_SUPPORT_GPU
chudy@google.comea5488b2012-07-26 19:38:22 +000029 fGLWidget.setSizePolicy(QSizePolicy::Expanding,
30 QSizePolicy::Expanding);
robertphillips@google.come8fe4bc2013-02-13 13:26:13 +000031#endif
chudy@google.com902ebe52012-06-29 14:21:22 +000032
chudy@google.comea5488b2012-07-26 19:38:22 +000033 fHorizontalLayout.addWidget(&fRasterWidget);
robertphillips@google.come8fe4bc2013-02-13 13:26:13 +000034#if SK_SUPPORT_GPU
chudy@google.comea5488b2012-07-26 19:38:22 +000035 fHorizontalLayout.addWidget(&fGLWidget);
robertphillips@google.come8fe4bc2013-02-13 13:26:13 +000036#endif
chudy@google.com2f891792012-07-03 16:05:59 +000037
chudy@google.com2f891792012-07-03 16:05:59 +000038 fPreviousPoint.set(0,0);
bungeman@google.come8cc6e82013-01-17 16:30:56 +000039 fUserMatrix.reset();
chudy@google.com2f891792012-07-03 16:05:59 +000040
robertphillips@google.come8fe4bc2013-02-13 13:26:13 +000041#if SK_SUPPORT_GPU
chudy@google.comea5488b2012-07-26 19:38:22 +000042 setWidgetVisibility(kGPU_WidgetType, true);
robertphillips@google.come8fe4bc2013-02-13 13:26:13 +000043#endif
kkinnunencfdc0e32015-01-13 22:49:02 -080044 connect(&fRasterWidget, SIGNAL(drawComplete()), this->parentWidget(), SLOT(drawComplete()));
bungeman76bb2282015-07-31 15:46:03 -070045#if SK_SUPPORT_GPU
kkinnunencfdc0e32015-01-13 22:49:02 -080046 connect(&fGLWidget, SIGNAL(drawComplete()), this->parentWidget(), SLOT(drawComplete()));
bungeman76bb2282015-07-31 15:46:03 -070047#endif
chudy@google.com902ebe52012-06-29 14:21:22 +000048}
49
chudy@google.com607357f2012-08-07 16:12:23 +000050SkCanvasWidget::~SkCanvasWidget() {}
chudy@google.com2d537a12012-07-31 12:49:52 +000051
chudy@google.comea5488b2012-07-26 19:38:22 +000052void SkCanvasWidget::drawTo(int index) {
chudy@google.com607357f2012-08-07 16:12:23 +000053 fDebugger->setIndex(index);
kkinnunencfdc0e32015-01-13 22:49:02 -080054 fRasterWidget.updateImage();
robertphillips@google.come8fe4bc2013-02-13 13:26:13 +000055#if SK_SUPPORT_GPU
kkinnunencfdc0e32015-01-13 22:49:02 -080056 fGLWidget.updateImage();
robertphillips@google.come8fe4bc2013-02-13 13:26:13 +000057#endif
robertphillips9ea8acd2016-03-01 09:34:38 -080058 Q_EMIT commandChanged(fDebugger->index());
chudy@google.com2f891792012-07-03 16:05:59 +000059}
60
61void SkCanvasWidget::mouseMoveEvent(QMouseEvent* event) {
chudy@google.com2f891792012-07-03 16:05:59 +000062 SkIPoint eventPoint = SkIPoint::Make(event->globalX(), event->globalY());
bungeman@google.come8cc6e82013-01-17 16:30:56 +000063 SkIPoint eventOffset = eventPoint - fPreviousPoint;
chudy@google.com2f891792012-07-03 16:05:59 +000064 fPreviousPoint = eventPoint;
bungeman@google.come8cc6e82013-01-17 16:30:56 +000065 fUserMatrix.postTranslate(eventOffset.fX, eventOffset.fY);
66 fDebugger->setUserMatrix(fUserMatrix);
chudy@google.com607357f2012-08-07 16:12:23 +000067 drawTo(fDebugger->index());
chudy@google.com2f891792012-07-03 16:05:59 +000068}
69
70void SkCanvasWidget::mousePressEvent(QMouseEvent* event) {
71 fPreviousPoint.set(event->globalX(), event->globalY());
robertphillips9ea8acd2016-03-01 09:34:38 -080072 Q_EMIT hitChanged(fDebugger->getCommandAtPoint(event->x(), event->y(),
chudy@google.com607357f2012-08-07 16:12:23 +000073 fDebugger->index()));
chudy@google.com2f891792012-07-03 16:05:59 +000074}
75
76void SkCanvasWidget::mouseDoubleClickEvent(QMouseEvent* event) {
bungeman@google.come8cc6e82013-01-17 16:30:56 +000077 Qt::KeyboardModifiers modifiers = event->modifiers();
78 if (modifiers.testFlag(Qt::ControlModifier)) {
79 snapWidgetTransform();
80 } else {
81 resetWidgetTransform();
82 }
83}
84
85#define ZOOM_FACTOR (1.25f)
86
87void SkCanvasWidget::wheelEvent(QWheelEvent* event) {
88 Qt::KeyboardModifiers modifiers = event->modifiers();
89 if (modifiers.testFlag(Qt::ControlModifier)) {
90 zoom(event->delta() > 0 ? ZOOM_FACTOR : (1.0f / ZOOM_FACTOR), event->x(), event->y());
91 } else {
92 if (Qt::Horizontal == event->orientation()) {
93 fUserMatrix.postTranslate(event->delta(), 0.0f);
94 } else {
95 fUserMatrix.postTranslate(0.0f, event->delta());
96 }
97 fDebugger->setUserMatrix(fUserMatrix);
98 drawTo(fDebugger->index());
99 }
100}
101
102void SkCanvasWidget::zoom(int zoomCommand) {
103 zoom(kIn_ZoomCommand == zoomCommand ? ZOOM_FACTOR : (1.0f / ZOOM_FACTOR),
104 this->size().width() / 2, this->size().height() / 2);
105}
106
107void SkCanvasWidget::snapWidgetTransform() {
108 double x, y;
109 modf(fUserMatrix.getTranslateX(), &x);
110 modf(fUserMatrix.getTranslateY(), &y);
111 fUserMatrix[SkMatrix::kMTransX] = x;
112 fUserMatrix[SkMatrix::kMTransY] = y;
113 fDebugger->setUserMatrix(fUserMatrix);
114 drawTo(fDebugger->index());
chudy@google.com902ebe52012-06-29 14:21:22 +0000115}
116
chudy@google.comea5488b2012-07-26 19:38:22 +0000117void SkCanvasWidget::resetWidgetTransform() {
bungeman@google.come8cc6e82013-01-17 16:30:56 +0000118 fUserMatrix.reset();
119 fDebugger->setUserMatrix(fUserMatrix);
robertphillips9ea8acd2016-03-01 09:34:38 -0800120 Q_EMIT scaleFactorChanged(fUserMatrix.getScaleX());
chudy@google.com607357f2012-08-07 16:12:23 +0000121 drawTo(fDebugger->index());
chudy@google.comea5488b2012-07-26 19:38:22 +0000122}
chudy@google.com902ebe52012-06-29 14:21:22 +0000123
chudy@google.comea5488b2012-07-26 19:38:22 +0000124void SkCanvasWidget::setWidgetVisibility(WidgetType type, bool isHidden) {
125 if (type == kRaster_8888_WidgetType) {
126 fRasterWidget.setHidden(isHidden);
skia.committer@gmail.com3d18d062013-02-14 07:01:34 +0000127 }
robertphillips@google.come8fe4bc2013-02-13 13:26:13 +0000128#if SK_SUPPORT_GPU
129 else if (type == kGPU_WidgetType) {
chudy@google.comea5488b2012-07-26 19:38:22 +0000130 fGLWidget.setHidden(isHidden);
131 }
robertphillips@google.come8fe4bc2013-02-13 13:26:13 +0000132#endif
chudy@google.comea5488b2012-07-26 19:38:22 +0000133}
chudy@google.com2f891792012-07-03 16:05:59 +0000134
commit-bot@chromium.orgfde1e7c2013-08-02 13:59:50 +0000135#if SK_SUPPORT_GPU
136void SkCanvasWidget::setGLSampleCount(int sampleCount)
137{
138 fGLWidget.setSampleCount(sampleCount);
139}
140#endif
141
bungeman@google.come8cc6e82013-01-17 16:30:56 +0000142void SkCanvasWidget::zoom(float scale, int px, int py) {
143 fUserMatrix.postScale(scale, scale, px, py);
robertphillips9ea8acd2016-03-01 09:34:38 -0800144 Q_EMIT scaleFactorChanged(fUserMatrix.getScaleX());
bungeman@google.come8cc6e82013-01-17 16:30:56 +0000145 fDebugger->setUserMatrix(fUserMatrix);
chudy@google.com607357f2012-08-07 16:12:23 +0000146 drawTo(fDebugger->index());
chudy@google.com902ebe52012-06-29 14:21:22 +0000147}