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