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