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 12 SkCanvasWidget::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 47 SkCanvasWidget::~SkCanvasWidget() {} 48 49 void 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 58 void 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 67 void 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 73 void 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 84 void 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 99 void 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 104 void 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 114 void SkCanvasWidget::resetWidgetTransform() { 115 fUserMatrix.reset(); 116 fDebugger->setUserMatrix(fUserMatrix); 117 emit scaleFactorChanged(fUserMatrix.getScaleX()); 118 drawTo(fDebugger->index()); 119 } 120 121 void 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 133 void SkCanvasWidget::setGLSampleCount(int sampleCount) 134 { 135 fGLWidget.setSampleCount(sampleCount); 136 } 137 #endif 138 139 void 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