1902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
2902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com/*
3902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com * Copyright 2012 Google Inc.
4902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com *
5902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com * Use of this source code is governed by a BSD-style license that can be
6902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com * found in the LICENSE file.
7902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com */
8902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
9902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
10902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "SkCanvasWidget.h"
11cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen#include <QtGui>
12ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com
13607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.comSkCanvasWidget::SkCanvasWidget(QWidget* parent,
14607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com        SkDebugger* debugger) : QWidget(parent)
15ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    , fHorizontalLayout(this)
16607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com    , fRasterWidget(debugger)
17e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com#if SK_SUPPORT_GPU
18607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com    , fGLWidget(debugger)
19e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com#endif
20ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com{
21607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com
22607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com    fDebugger = debugger;
23607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com
24ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    fHorizontalLayout.setSpacing(6);
25ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    fHorizontalLayout.setContentsMargins(0,0,0,0);
26ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    fRasterWidget.setSizePolicy(QSizePolicy::Expanding,
27ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com            QSizePolicy::Expanding);
28e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com#if SK_SUPPORT_GPU
29ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    fGLWidget.setSizePolicy(QSizePolicy::Expanding,
30ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com            QSizePolicy::Expanding);
31e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com#endif
32ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com
33ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    fHorizontalLayout.addWidget(&fRasterWidget);
34e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com#if SK_SUPPORT_GPU
35ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    fHorizontalLayout.addWidget(&fGLWidget);
36e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com#endif
372f891793957252b0262276c957c67798c905be80chudy@google.com
382f891793957252b0262276c957c67798c905be80chudy@google.com    fPreviousPoint.set(0,0);
39e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    fUserMatrix.reset();
402f891793957252b0262276c957c67798c905be80chudy@google.com
41e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com#if SK_SUPPORT_GPU
42ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    setWidgetVisibility(kGPU_WidgetType, true);
43e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com#endif
44cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    connect(&fRasterWidget, SIGNAL(drawComplete()), this->parentWidget(), SLOT(drawComplete()));
45cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    connect(&fGLWidget, SIGNAL(drawComplete()), this->parentWidget(), SLOT(drawComplete()));
462f891793957252b0262276c957c67798c905be80chudy@google.com}
47902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
48607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.comSkCanvasWidget::~SkCanvasWidget() {}
492d537a18f49cb492358c2b051f4786075dd9406cchudy@google.com
50ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.comvoid SkCanvasWidget::drawTo(int index) {
51607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com    fDebugger->setIndex(index);
52cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    fRasterWidget.updateImage();
53e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com#if SK_SUPPORT_GPU
54cfdc0e3fee69694e0f6b083d8455665b2a810589kkinnunen    fGLWidget.updateImage();
55e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com#endif
56607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com    emit commandChanged(fDebugger->index());
572f891793957252b0262276c957c67798c905be80chudy@google.com}
582f891793957252b0262276c957c67798c905be80chudy@google.com
592f891793957252b0262276c957c67798c905be80chudy@google.comvoid SkCanvasWidget::mouseMoveEvent(QMouseEvent* event) {
602f891793957252b0262276c957c67798c905be80chudy@google.com    SkIPoint eventPoint = SkIPoint::Make(event->globalX(), event->globalY());
61e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    SkIPoint eventOffset = eventPoint - fPreviousPoint;
622f891793957252b0262276c957c67798c905be80chudy@google.com    fPreviousPoint = eventPoint;
63e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    fUserMatrix.postTranslate(eventOffset.fX, eventOffset.fY);
64e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    fDebugger->setUserMatrix(fUserMatrix);
65607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com    drawTo(fDebugger->index());
662f891793957252b0262276c957c67798c905be80chudy@google.com}
672f891793957252b0262276c957c67798c905be80chudy@google.com
682f891793957252b0262276c957c67798c905be80chudy@google.comvoid SkCanvasWidget::mousePressEvent(QMouseEvent* event) {
692f891793957252b0262276c957c67798c905be80chudy@google.com    fPreviousPoint.set(event->globalX(), event->globalY());
70607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com    emit hitChanged(fDebugger->getCommandAtPoint(event->x(), event->y(),
71607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com            fDebugger->index()));
722f891793957252b0262276c957c67798c905be80chudy@google.com}
732f891793957252b0262276c957c67798c905be80chudy@google.com
742f891793957252b0262276c957c67798c905be80chudy@google.comvoid SkCanvasWidget::mouseDoubleClickEvent(QMouseEvent* event) {
75e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    Qt::KeyboardModifiers modifiers = event->modifiers();
76e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    if (modifiers.testFlag(Qt::ControlModifier)) {
77e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com        snapWidgetTransform();
78e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    } else {
79e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com        resetWidgetTransform();
80e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    }
81e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com}
82e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com
83e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com#define ZOOM_FACTOR (1.25f)
84e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com
85e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.comvoid SkCanvasWidget::wheelEvent(QWheelEvent* event) {
86e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    Qt::KeyboardModifiers modifiers = event->modifiers();
87e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    if (modifiers.testFlag(Qt::ControlModifier)) {
88e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com        zoom(event->delta() > 0 ? ZOOM_FACTOR : (1.0f / ZOOM_FACTOR), event->x(), event->y());
89e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    } else {
90e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com        if (Qt::Horizontal == event->orientation()) {
91e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com            fUserMatrix.postTranslate(event->delta(), 0.0f);
92e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com        } else {
93e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com            fUserMatrix.postTranslate(0.0f, event->delta());
94e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com        }
95e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com        fDebugger->setUserMatrix(fUserMatrix);
96e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com        drawTo(fDebugger->index());
97e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    }
98e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com}
99e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com
100e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.comvoid SkCanvasWidget::zoom(int zoomCommand) {
101e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    zoom(kIn_ZoomCommand == zoomCommand ? ZOOM_FACTOR : (1.0f / ZOOM_FACTOR),
102e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com         this->size().width() / 2, this->size().height() / 2);
103e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com}
104e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com
105e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.comvoid SkCanvasWidget::snapWidgetTransform() {
106e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    double x, y;
107e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    modf(fUserMatrix.getTranslateX(), &x);
108e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    modf(fUserMatrix.getTranslateY(), &y);
109e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    fUserMatrix[SkMatrix::kMTransX] = x;
110e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    fUserMatrix[SkMatrix::kMTransY] = y;
111e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    fDebugger->setUserMatrix(fUserMatrix);
112e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    drawTo(fDebugger->index());
113902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
114902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
115ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.comvoid SkCanvasWidget::resetWidgetTransform() {
116e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    fUserMatrix.reset();
117e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    fDebugger->setUserMatrix(fUserMatrix);
118e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    emit scaleFactorChanged(fUserMatrix.getScaleX());
119607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com    drawTo(fDebugger->index());
120ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com}
1212f891793957252b0262276c957c67798c905be80chudy@google.com
122ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.comvoid SkCanvasWidget::setWidgetVisibility(WidgetType type, bool isHidden) {
123ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    if (type == kRaster_8888_WidgetType) {
124ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com        fRasterWidget.setHidden(isHidden);
1253d18d063f0c6b97b25b88707cfbc1c8cb584caa0skia.committer@gmail.com    }
126e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com#if SK_SUPPORT_GPU
127e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com    else if (type == kGPU_WidgetType) {
128ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com        fGLWidget.setHidden(isHidden);
129ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com    }
130e8fe4bc3efa8f18f5651c5d005fba1935a741be0robertphillips@google.com#endif
131ea5488b9655fc7d71345c3a823de85f8b74e3279chudy@google.com}
1322f891793957252b0262276c957c67798c905be80chudy@google.com
133fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.org#if SK_SUPPORT_GPU
134fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.orgvoid SkCanvasWidget::setGLSampleCount(int sampleCount)
135fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.org{
136fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.org    fGLWidget.setSampleCount(sampleCount);
137fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.org}
138fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.org#endif
139fde1e7ccb4524aa2e0c42872e529ee25d09e7f34commit-bot@chromium.org
140e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.comvoid SkCanvasWidget::zoom(float scale, int px, int py) {
141e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    fUserMatrix.postScale(scale, scale, px, py);
142e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    emit scaleFactorChanged(fUserMatrix.getScaleX());
143e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    fDebugger->setUserMatrix(fUserMatrix);
144607357fde8a9c4c70549d4223e0bd1181b012e0echudy@google.com    drawTo(fDebugger->index());
1452f891793957252b0262276c957c67798c905be80chudy@google.com}
146