diff options
Diffstat (limited to 'chromium/third_party/skia/debugger/QT/SkCanvasWidget.cpp')
-rw-r--r-- | chromium/third_party/skia/debugger/QT/SkCanvasWidget.cpp | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/chromium/third_party/skia/debugger/QT/SkCanvasWidget.cpp b/chromium/third_party/skia/debugger/QT/SkCanvasWidget.cpp new file mode 100644 index 00000000000..73de8c21ca7 --- /dev/null +++ b/chromium/third_party/skia/debugger/QT/SkCanvasWidget.cpp @@ -0,0 +1,144 @@ + +/* + * 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" + +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())); +} + +SkCanvasWidget::~SkCanvasWidget() {} + +void SkCanvasWidget::drawTo(int index) { + fDebugger->setIndex(index); + fRasterWidget.draw(); +#if SK_SUPPORT_GPU + fGLWidget.draw(); +#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()); +} |