1
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
10 #include "SkCanvasWidget.h"
11 #include <QtGui>
12
SkCanvasWidget(QWidget * parent,SkDebugger * debugger)13 SkCanvasWidget::SkCanvasWidget(QWidget* parent,
14 SkDebugger* debugger) : QWidget(parent)
15 , fHorizontalLayout(this)
16 , fRasterWidget(debugger)
17 #if SK_SUPPORT_GPU
18 , fGLWidget(debugger)
19 #endif
20 {
21
22 fDebugger = debugger;
23
24 fHorizontalLayout.setSpacing(6);
25 fHorizontalLayout.setContentsMargins(0,0,0,0);
26 fRasterWidget.setSizePolicy(QSizePolicy::Expanding,
27 QSizePolicy::Expanding);
28 #if SK_SUPPORT_GPU
29 fGLWidget.setSizePolicy(QSizePolicy::Expanding,
30 QSizePolicy::Expanding);
31 #endif
32
33 fHorizontalLayout.addWidget(&fRasterWidget);
34 #if SK_SUPPORT_GPU
35 fHorizontalLayout.addWidget(&fGLWidget);
36 #endif
37
38 fPreviousPoint.set(0,0);
39 fUserMatrix.reset();
40
41 #if SK_SUPPORT_GPU
42 setWidgetVisibility(kGPU_WidgetType, true);
43 #endif
44 connect(&fRasterWidget, SIGNAL(drawComplete()), this->parentWidget(), SLOT(drawComplete()));
45 #if SK_SUPPORT_GPU
46 connect(&fGLWidget, SIGNAL(drawComplete()), this->parentWidget(), SLOT(drawComplete()));
47 #endif
48 }
49
~SkCanvasWidget()50 SkCanvasWidget::~SkCanvasWidget() {}
51
drawTo(int index)52 void SkCanvasWidget::drawTo(int index) {
53 fDebugger->setIndex(index);
54 fRasterWidget.updateImage();
55 #if SK_SUPPORT_GPU
56 fGLWidget.updateImage();
57 #endif
58 Q_EMIT commandChanged(fDebugger->index());
59 }
60
mouseMoveEvent(QMouseEvent * event)61 void SkCanvasWidget::mouseMoveEvent(QMouseEvent* event) {
62 SkIPoint eventPoint = SkIPoint::Make(event->globalX(), event->globalY());
63 SkIPoint eventOffset = eventPoint - fPreviousPoint;
64 fPreviousPoint = eventPoint;
65 fUserMatrix.postTranslate(eventOffset.fX, eventOffset.fY);
66 fDebugger->setUserMatrix(fUserMatrix);
67 drawTo(fDebugger->index());
68 }
69
mousePressEvent(QMouseEvent * event)70 void SkCanvasWidget::mousePressEvent(QMouseEvent* event) {
71 fPreviousPoint.set(event->globalX(), event->globalY());
72 Q_EMIT hitChanged(fDebugger->getCommandAtPoint(event->x(), event->y(),
73 fDebugger->index()));
74 }
75
mouseDoubleClickEvent(QMouseEvent * event)76 void SkCanvasWidget::mouseDoubleClickEvent(QMouseEvent* event) {
77 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
wheelEvent(QWheelEvent * event)87 void 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
zoom(int zoomCommand)102 void 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
snapWidgetTransform()107 void 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());
115 }
116
resetWidgetTransform()117 void SkCanvasWidget::resetWidgetTransform() {
118 fUserMatrix.reset();
119 fDebugger->setUserMatrix(fUserMatrix);
120 Q_EMIT scaleFactorChanged(fUserMatrix.getScaleX());
121 drawTo(fDebugger->index());
122 }
123
setWidgetVisibility(WidgetType type,bool isHidden)124 void SkCanvasWidget::setWidgetVisibility(WidgetType type, bool isHidden) {
125 if (type == kRaster_8888_WidgetType) {
126 fRasterWidget.setHidden(isHidden);
127 }
128 #if SK_SUPPORT_GPU
129 else if (type == kGPU_WidgetType) {
130 fGLWidget.setHidden(isHidden);
131 }
132 #endif
133 }
134
135 #if SK_SUPPORT_GPU
setGLSampleCount(int sampleCount)136 void SkCanvasWidget::setGLSampleCount(int sampleCount)
137 {
138 fGLWidget.setSampleCount(sampleCount);
139 }
140 #endif
141
zoom(float scale,int px,int py)142 void SkCanvasWidget::zoom(float scale, int px, int py) {
143 fUserMatrix.postScale(scale, scale, px, py);
144 Q_EMIT scaleFactorChanged(fUserMatrix.getScaleX());
145 fDebugger->setUserMatrix(fUserMatrix);
146 drawTo(fDebugger->index());
147 }
148