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