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 13 SkCanvasWidget::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 50 SkCanvasWidget::~SkCanvasWidget() {} 51 52 void 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 61 void 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 70 void 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 76 void 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 87 void 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 102 void 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 107 void 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 117 void SkCanvasWidget::resetWidgetTransform() { 118 fUserMatrix.reset(); 119 fDebugger->setUserMatrix(fUserMatrix); 120 Q_EMIT scaleFactorChanged(fUserMatrix.getScaleX()); 121 drawTo(fDebugger->index()); 122 } 123 124 void 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 136 void SkCanvasWidget::setGLSampleCount(int sampleCount) 137 { 138 fGLWidget.setSampleCount(sampleCount); 139 } 140 #endif 141 142 void 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