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     connect(&fGLWidget, SIGNAL(drawComplete()), this->parentWidget(), SLOT(drawComplete()));
46 }
47 
~SkCanvasWidget()48 SkCanvasWidget::~SkCanvasWidget() {}
49 
drawTo(int index)50 void SkCanvasWidget::drawTo(int index) {
51     fDebugger->setIndex(index);
52     fRasterWidget.updateImage();
53 #if SK_SUPPORT_GPU
54     fGLWidget.updateImage();
55 #endif
56     emit commandChanged(fDebugger->index());
57 }
58 
mouseMoveEvent(QMouseEvent * event)59 void SkCanvasWidget::mouseMoveEvent(QMouseEvent* event) {
60     SkIPoint eventPoint = SkIPoint::Make(event->globalX(), event->globalY());
61     SkIPoint eventOffset = eventPoint - fPreviousPoint;
62     fPreviousPoint = eventPoint;
63     fUserMatrix.postTranslate(eventOffset.fX, eventOffset.fY);
64     fDebugger->setUserMatrix(fUserMatrix);
65     drawTo(fDebugger->index());
66 }
67 
mousePressEvent(QMouseEvent * event)68 void SkCanvasWidget::mousePressEvent(QMouseEvent* event) {
69     fPreviousPoint.set(event->globalX(), event->globalY());
70     emit hitChanged(fDebugger->getCommandAtPoint(event->x(), event->y(),
71             fDebugger->index()));
72 }
73 
mouseDoubleClickEvent(QMouseEvent * event)74 void SkCanvasWidget::mouseDoubleClickEvent(QMouseEvent* event) {
75     Qt::KeyboardModifiers modifiers = event->modifiers();
76     if (modifiers.testFlag(Qt::ControlModifier)) {
77         snapWidgetTransform();
78     } else {
79         resetWidgetTransform();
80     }
81 }
82 
83 #define ZOOM_FACTOR (1.25f)
84 
wheelEvent(QWheelEvent * event)85 void SkCanvasWidget::wheelEvent(QWheelEvent* event) {
86     Qt::KeyboardModifiers modifiers = event->modifiers();
87     if (modifiers.testFlag(Qt::ControlModifier)) {
88         zoom(event->delta() > 0 ? ZOOM_FACTOR : (1.0f / ZOOM_FACTOR), event->x(), event->y());
89     } else {
90         if (Qt::Horizontal == event->orientation()) {
91             fUserMatrix.postTranslate(event->delta(), 0.0f);
92         } else {
93             fUserMatrix.postTranslate(0.0f, event->delta());
94         }
95         fDebugger->setUserMatrix(fUserMatrix);
96         drawTo(fDebugger->index());
97     }
98 }
99 
zoom(int zoomCommand)100 void SkCanvasWidget::zoom(int zoomCommand) {
101     zoom(kIn_ZoomCommand == zoomCommand ? ZOOM_FACTOR : (1.0f / ZOOM_FACTOR),
102          this->size().width() / 2, this->size().height() / 2);
103 }
104 
snapWidgetTransform()105 void SkCanvasWidget::snapWidgetTransform() {
106     double x, y;
107     modf(fUserMatrix.getTranslateX(), &x);
108     modf(fUserMatrix.getTranslateY(), &y);
109     fUserMatrix[SkMatrix::kMTransX] = x;
110     fUserMatrix[SkMatrix::kMTransY] = y;
111     fDebugger->setUserMatrix(fUserMatrix);
112     drawTo(fDebugger->index());
113 }
114 
resetWidgetTransform()115 void SkCanvasWidget::resetWidgetTransform() {
116     fUserMatrix.reset();
117     fDebugger->setUserMatrix(fUserMatrix);
118     emit scaleFactorChanged(fUserMatrix.getScaleX());
119     drawTo(fDebugger->index());
120 }
121 
setWidgetVisibility(WidgetType type,bool isHidden)122 void SkCanvasWidget::setWidgetVisibility(WidgetType type, bool isHidden) {
123     if (type == kRaster_8888_WidgetType) {
124         fRasterWidget.setHidden(isHidden);
125     }
126 #if SK_SUPPORT_GPU
127     else if (type == kGPU_WidgetType) {
128         fGLWidget.setHidden(isHidden);
129     }
130 #endif
131 }
132 
133 #if SK_SUPPORT_GPU
setGLSampleCount(int sampleCount)134 void SkCanvasWidget::setGLSampleCount(int sampleCount)
135 {
136     fGLWidget.setSampleCount(sampleCount);
137 }
138 #endif
139 
zoom(float scale,int px,int py)140 void SkCanvasWidget::zoom(float scale, int px, int py) {
141     fUserMatrix.postScale(scale, scale, px, py);
142     emit scaleFactorChanged(fUserMatrix.getScaleX());
143     fDebugger->setUserMatrix(fUserMatrix);
144     drawTo(fDebugger->index());
145 }
146