| |
| /* |
| * Copyright 2012 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| |
| #include "SkCanvasWidget.h" |
| #include <QtGui> |
| |
| SkCanvasWidget::SkCanvasWidget(QWidget* parent, |
| SkDebugger* debugger) : QWidget(parent) |
| , fHorizontalLayout(this) |
| , fRasterWidget(debugger) |
| #if SK_SUPPORT_GPU |
| , fGLWidget(debugger) |
| #endif |
| { |
| |
| fDebugger = debugger; |
| |
| fHorizontalLayout.setSpacing(6); |
| fHorizontalLayout.setContentsMargins(0,0,0,0); |
| fRasterWidget.setSizePolicy(QSizePolicy::Expanding, |
| QSizePolicy::Expanding); |
| #if SK_SUPPORT_GPU |
| fGLWidget.setSizePolicy(QSizePolicy::Expanding, |
| QSizePolicy::Expanding); |
| #endif |
| |
| fHorizontalLayout.addWidget(&fRasterWidget); |
| #if SK_SUPPORT_GPU |
| fHorizontalLayout.addWidget(&fGLWidget); |
| #endif |
| |
| fPreviousPoint.set(0,0); |
| fUserMatrix.reset(); |
| |
| #if SK_SUPPORT_GPU |
| setWidgetVisibility(kGPU_WidgetType, true); |
| #endif |
| connect(&fRasterWidget, SIGNAL(drawComplete()), this->parentWidget(), SLOT(drawComplete())); |
| #if SK_SUPPORT_GPU |
| connect(&fGLWidget, SIGNAL(drawComplete()), this->parentWidget(), SLOT(drawComplete())); |
| #endif |
| } |
| |
| SkCanvasWidget::~SkCanvasWidget() {} |
| |
| void SkCanvasWidget::drawTo(int index) { |
| fDebugger->setIndex(index); |
| fRasterWidget.updateImage(); |
| #if SK_SUPPORT_GPU |
| fGLWidget.updateImage(); |
| #endif |
| emit commandChanged(fDebugger->index()); |
| } |
| |
| void SkCanvasWidget::mouseMoveEvent(QMouseEvent* event) { |
| SkIPoint eventPoint = SkIPoint::Make(event->globalX(), event->globalY()); |
| SkIPoint eventOffset = eventPoint - fPreviousPoint; |
| fPreviousPoint = eventPoint; |
| fUserMatrix.postTranslate(eventOffset.fX, eventOffset.fY); |
| fDebugger->setUserMatrix(fUserMatrix); |
| drawTo(fDebugger->index()); |
| } |
| |
| void SkCanvasWidget::mousePressEvent(QMouseEvent* event) { |
| fPreviousPoint.set(event->globalX(), event->globalY()); |
| emit hitChanged(fDebugger->getCommandAtPoint(event->x(), event->y(), |
| fDebugger->index())); |
| } |
| |
| void SkCanvasWidget::mouseDoubleClickEvent(QMouseEvent* event) { |
| Qt::KeyboardModifiers modifiers = event->modifiers(); |
| if (modifiers.testFlag(Qt::ControlModifier)) { |
| snapWidgetTransform(); |
| } else { |
| resetWidgetTransform(); |
| } |
| } |
| |
| #define ZOOM_FACTOR (1.25f) |
| |
| void SkCanvasWidget::wheelEvent(QWheelEvent* event) { |
| Qt::KeyboardModifiers modifiers = event->modifiers(); |
| if (modifiers.testFlag(Qt::ControlModifier)) { |
| zoom(event->delta() > 0 ? ZOOM_FACTOR : (1.0f / ZOOM_FACTOR), event->x(), event->y()); |
| } else { |
| if (Qt::Horizontal == event->orientation()) { |
| fUserMatrix.postTranslate(event->delta(), 0.0f); |
| } else { |
| fUserMatrix.postTranslate(0.0f, event->delta()); |
| } |
| fDebugger->setUserMatrix(fUserMatrix); |
| drawTo(fDebugger->index()); |
| } |
| } |
| |
| void SkCanvasWidget::zoom(int zoomCommand) { |
| zoom(kIn_ZoomCommand == zoomCommand ? ZOOM_FACTOR : (1.0f / ZOOM_FACTOR), |
| this->size().width() / 2, this->size().height() / 2); |
| } |
| |
| void SkCanvasWidget::snapWidgetTransform() { |
| double x, y; |
| modf(fUserMatrix.getTranslateX(), &x); |
| modf(fUserMatrix.getTranslateY(), &y); |
| fUserMatrix[SkMatrix::kMTransX] = x; |
| fUserMatrix[SkMatrix::kMTransY] = y; |
| fDebugger->setUserMatrix(fUserMatrix); |
| drawTo(fDebugger->index()); |
| } |
| |
| void SkCanvasWidget::resetWidgetTransform() { |
| fUserMatrix.reset(); |
| fDebugger->setUserMatrix(fUserMatrix); |
| emit scaleFactorChanged(fUserMatrix.getScaleX()); |
| drawTo(fDebugger->index()); |
| } |
| |
| void SkCanvasWidget::setWidgetVisibility(WidgetType type, bool isHidden) { |
| if (type == kRaster_8888_WidgetType) { |
| fRasterWidget.setHidden(isHidden); |
| } |
| #if SK_SUPPORT_GPU |
| else if (type == kGPU_WidgetType) { |
| fGLWidget.setHidden(isHidden); |
| } |
| #endif |
| } |
| |
| #if SK_SUPPORT_GPU |
| void SkCanvasWidget::setGLSampleCount(int sampleCount) |
| { |
| fGLWidget.setSampleCount(sampleCount); |
| } |
| #endif |
| |
| void SkCanvasWidget::zoom(float scale, int px, int py) { |
| fUserMatrix.postScale(scale, scale, px, py); |
| emit scaleFactorChanged(fUserMatrix.getScaleX()); |
| fDebugger->setUserMatrix(fUserMatrix); |
| drawTo(fDebugger->index()); |
| } |