blob: 73de8c21ca72d5a69272dfaa27f0410ba9ccc373 [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.com607357f2012-08-07 16:12:23 +000012SkCanvasWidget::SkCanvasWidget(QWidget* parent,
13 SkDebugger* debugger) : QWidget(parent)
chudy@google.comea5488b2012-07-26 19:38:22 +000014 , fHorizontalLayout(this)
chudy@google.com607357f2012-08-07 16:12:23 +000015 , fRasterWidget(debugger)
robertphillips@google.come8fe4bc2013-02-13 13:26:13 +000016#if SK_SUPPORT_GPU
chudy@google.com607357f2012-08-07 16:12:23 +000017 , fGLWidget(debugger)
robertphillips@google.come8fe4bc2013-02-13 13:26:13 +000018#endif
chudy@google.comea5488b2012-07-26 19:38:22 +000019{
chudy@google.com607357f2012-08-07 16:12:23 +000020
21 fDebugger = debugger;
22
chudy@google.comea5488b2012-07-26 19:38:22 +000023 fHorizontalLayout.setSpacing(6);
24 fHorizontalLayout.setContentsMargins(0,0,0,0);
25 fRasterWidget.setSizePolicy(QSizePolicy::Expanding,
26 QSizePolicy::Expanding);
robertphillips@google.come8fe4bc2013-02-13 13:26:13 +000027#if SK_SUPPORT_GPU
chudy@google.comea5488b2012-07-26 19:38:22 +000028 fGLWidget.setSizePolicy(QSizePolicy::Expanding,
29 QSizePolicy::Expanding);
robertphillips@google.come8fe4bc2013-02-13 13:26:13 +000030#endif
chudy@google.com902ebe52012-06-29 14:21:22 +000031
chudy@google.comea5488b2012-07-26 19:38:22 +000032 fHorizontalLayout.addWidget(&fRasterWidget);
robertphillips@google.come8fe4bc2013-02-13 13:26:13 +000033#if SK_SUPPORT_GPU
chudy@google.comea5488b2012-07-26 19:38:22 +000034 fHorizontalLayout.addWidget(&fGLWidget);
robertphillips@google.come8fe4bc2013-02-13 13:26:13 +000035#endif
chudy@google.com2f891792012-07-03 16:05:59 +000036
chudy@google.com2f891792012-07-03 16:05:59 +000037 fPreviousPoint.set(0,0);
bungeman@google.come8cc6e82013-01-17 16:30:56 +000038 fUserMatrix.reset();
chudy@google.com2f891792012-07-03 16:05:59 +000039
robertphillips@google.come8fe4bc2013-02-13 13:26:13 +000040#if SK_SUPPORT_GPU
chudy@google.comea5488b2012-07-26 19:38:22 +000041 setWidgetVisibility(kGPU_WidgetType, true);
robertphillips@google.come8fe4bc2013-02-13 13:26:13 +000042#endif
chudy@google.coma9e937c2012-08-03 17:32:05 +000043 connect(&fRasterWidget, SIGNAL(drawComplete()),
44 this->parentWidget(), SLOT(drawComplete()));
chudy@google.com902ebe52012-06-29 14:21:22 +000045}
46
chudy@google.com607357f2012-08-07 16:12:23 +000047SkCanvasWidget::~SkCanvasWidget() {}
chudy@google.com2d537a12012-07-31 12:49:52 +000048
chudy@google.comea5488b2012-07-26 19:38:22 +000049void SkCanvasWidget::drawTo(int index) {
chudy@google.com607357f2012-08-07 16:12:23 +000050 fDebugger->setIndex(index);
51 fRasterWidget.draw();
robertphillips@google.come8fe4bc2013-02-13 13:26:13 +000052#if SK_SUPPORT_GPU
chudy@google.com607357f2012-08-07 16:12:23 +000053 fGLWidget.draw();
robertphillips@google.come8fe4bc2013-02-13 13:26:13 +000054#endif
chudy@google.com607357f2012-08-07 16:12:23 +000055 emit commandChanged(fDebugger->index());
chudy@google.com2f891792012-07-03 16:05:59 +000056}
57
58void SkCanvasWidget::mouseMoveEvent(QMouseEvent* event) {
chudy@google.com2f891792012-07-03 16:05:59 +000059 SkIPoint eventPoint = SkIPoint::Make(event->globalX(), event->globalY());
bungeman@google.come8cc6e82013-01-17 16:30:56 +000060 SkIPoint eventOffset = eventPoint - fPreviousPoint;
chudy@google.com2f891792012-07-03 16:05:59 +000061 fPreviousPoint = eventPoint;
bungeman@google.come8cc6e82013-01-17 16:30:56 +000062 fUserMatrix.postTranslate(eventOffset.fX, eventOffset.fY);
63 fDebugger->setUserMatrix(fUserMatrix);
chudy@google.com607357f2012-08-07 16:12:23 +000064 drawTo(fDebugger->index());
chudy@google.com2f891792012-07-03 16:05:59 +000065}
66
67void SkCanvasWidget::mousePressEvent(QMouseEvent* event) {
68 fPreviousPoint.set(event->globalX(), event->globalY());
chudy@google.com607357f2012-08-07 16:12:23 +000069 emit hitChanged(fDebugger->getCommandAtPoint(event->x(), event->y(),
70 fDebugger->index()));
chudy@google.com2f891792012-07-03 16:05:59 +000071}
72
73void SkCanvasWidget::mouseDoubleClickEvent(QMouseEvent* event) {
bungeman@google.come8cc6e82013-01-17 16:30:56 +000074 Qt::KeyboardModifiers modifiers = event->modifiers();
75 if (modifiers.testFlag(Qt::ControlModifier)) {
76 snapWidgetTransform();
77 } else {
78 resetWidgetTransform();
79 }
80}
81
82#define ZOOM_FACTOR (1.25f)
83
84void SkCanvasWidget::wheelEvent(QWheelEvent* event) {
85 Qt::KeyboardModifiers modifiers = event->modifiers();
86 if (modifiers.testFlag(Qt::ControlModifier)) {
87 zoom(event->delta() > 0 ? ZOOM_FACTOR : (1.0f / ZOOM_FACTOR), event->x(), event->y());
88 } else {
89 if (Qt::Horizontal == event->orientation()) {
90 fUserMatrix.postTranslate(event->delta(), 0.0f);
91 } else {
92 fUserMatrix.postTranslate(0.0f, event->delta());
93 }
94 fDebugger->setUserMatrix(fUserMatrix);
95 drawTo(fDebugger->index());
96 }
97}
98
99void SkCanvasWidget::zoom(int zoomCommand) {
100 zoom(kIn_ZoomCommand == zoomCommand ? ZOOM_FACTOR : (1.0f / ZOOM_FACTOR),
101 this->size().width() / 2, this->size().height() / 2);
102}
103
104void SkCanvasWidget::snapWidgetTransform() {
105 double x, y;
106 modf(fUserMatrix.getTranslateX(), &x);
107 modf(fUserMatrix.getTranslateY(), &y);
108 fUserMatrix[SkMatrix::kMTransX] = x;
109 fUserMatrix[SkMatrix::kMTransY] = y;
110 fDebugger->setUserMatrix(fUserMatrix);
111 drawTo(fDebugger->index());
chudy@google.com902ebe52012-06-29 14:21:22 +0000112}
113
chudy@google.comea5488b2012-07-26 19:38:22 +0000114void SkCanvasWidget::resetWidgetTransform() {
bungeman@google.come8cc6e82013-01-17 16:30:56 +0000115 fUserMatrix.reset();
116 fDebugger->setUserMatrix(fUserMatrix);
117 emit scaleFactorChanged(fUserMatrix.getScaleX());
chudy@google.com607357f2012-08-07 16:12:23 +0000118 drawTo(fDebugger->index());
chudy@google.comea5488b2012-07-26 19:38:22 +0000119}
chudy@google.com902ebe52012-06-29 14:21:22 +0000120
chudy@google.comea5488b2012-07-26 19:38:22 +0000121void SkCanvasWidget::setWidgetVisibility(WidgetType type, bool isHidden) {
122 if (type == kRaster_8888_WidgetType) {
123 fRasterWidget.setHidden(isHidden);
skia.committer@gmail.com3d18d062013-02-14 07:01:34 +0000124 }
robertphillips@google.come8fe4bc2013-02-13 13:26:13 +0000125#if SK_SUPPORT_GPU
126 else if (type == kGPU_WidgetType) {
chudy@google.comea5488b2012-07-26 19:38:22 +0000127 fGLWidget.setHidden(isHidden);
128 }
robertphillips@google.come8fe4bc2013-02-13 13:26:13 +0000129#endif
chudy@google.comea5488b2012-07-26 19:38:22 +0000130}
chudy@google.com2f891792012-07-03 16:05:59 +0000131
commit-bot@chromium.orgfde1e7c2013-08-02 13:59:50 +0000132#if SK_SUPPORT_GPU
133void SkCanvasWidget::setGLSampleCount(int sampleCount)
134{
135 fGLWidget.setSampleCount(sampleCount);
136}
137#endif
138
bungeman@google.come8cc6e82013-01-17 16:30:56 +0000139void SkCanvasWidget::zoom(float scale, int px, int py) {
140 fUserMatrix.postScale(scale, scale, px, py);
141 emit scaleFactorChanged(fUserMatrix.getScaleX());
142 fDebugger->setUserMatrix(fUserMatrix);
chudy@google.com607357f2012-08-07 16:12:23 +0000143 drawTo(fDebugger->index());
chudy@google.com902ebe52012-06-29 14:21:22 +0000144}