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#if SK_SUPPORT_GPU
46    connect(&fGLWidget, SIGNAL(drawComplete()), this->parentWidget(), SLOT(drawComplete()));
47#endif
48}
49
50SkCanvasWidget::~SkCanvasWidget() {}
51
52void 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
61void 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
70void 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
76void 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
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());
115}
116
117void SkCanvasWidget::resetWidgetTransform() {
118    fUserMatrix.reset();
119    fDebugger->setUserMatrix(fUserMatrix);
120    Q_EMIT scaleFactorChanged(fUserMatrix.getScaleX());
121    drawTo(fDebugger->index());
122}
123
124void 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
136void SkCanvasWidget::setGLSampleCount(int sampleCount)
137{
138    fGLWidget.setSampleCount(sampleCount);
139}
140#endif
141
142void 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