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