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
13SkCanvasWidget::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
48SkCanvasWidget::~SkCanvasWidget() {}
49
50void 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
59void 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
68void 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
74void 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
85void 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
100void 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
105void 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
115void SkCanvasWidget::resetWidgetTransform() {
116    fUserMatrix.reset();
117    fDebugger->setUserMatrix(fUserMatrix);
118    emit scaleFactorChanged(fUserMatrix.getScaleX());
119    drawTo(fDebugger->index());
120}
121
122void 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
134void SkCanvasWidget::setGLSampleCount(int sampleCount)
135{
136    fGLWidget.setSampleCount(sampleCount);
137}
138#endif
139
140void 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