Home | History | Annotate | Download | only in QT
      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