SkCanvasWidget.h revision 2f891793957252b0262276c957c67798c905be80
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2012 Google Inc. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * found in the LICENSE file. 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */ 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SKCANVASWIDGET_H 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SKCANVASWIDGET_H 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkBitmap.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkCanvas.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkDebugCanvas.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkDevice.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkPicture.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <QApplication> 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <QtGui> 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <QWidget> 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <QWheelEvent> 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** \class SkCanvasWidget 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) The QtWidget encompasses all skia screen drawing elements. It initializes 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) an SkBitmap in memory that our SkCanvas draws to directly in memory. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Then using QImage and QPainter we draw those pixels on the screen in 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this widget. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkCanvasWidget : public QWidget { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Q_OBJECT 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) /** 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Constructs a widget with the specified parent for layout purposes. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @param parent The parent container of this widget 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkCanvasWidget(QWidget *parent); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~SkCanvasWidget(); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Executes all saved draw commands up to the specified index. 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @param index The position of the command we draw up to. 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void drawTo(int index); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Returns the height of the bitmap. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int getBitmapHeight() { return fBitmap.height(); } 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Returns the width of the bitmap. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int getBitmapWidth() { return fBitmap.width(); } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Returns an array of values of the current matrix. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SkMatrix& getCurrentMatrix() { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return fCanvas->getTotalMatrix(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Returns an array of values of the current bounding clip. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SkIRect& getCurrentClip() { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return fCanvas->getTotalClip().getBounds(); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TODO(chudy): Refactor into a struct of char** 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Returns parameter information about the ith draw command. 76d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) @param: i The index of the draw command we are accessing 77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) */ 78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::vector<std::string>* getCurrentCommandInfo(int i) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return fDebugCanvas->getCommandInfoAt(i); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Returns a vector of strings with all the current canvas draw 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) commands. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string>* getDrawCommands() { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return fDebugCanvas->getDrawCommandsAsStrings(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Loads a skia picture located at filename. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @param filename The name of the file we are loading. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void loadPicture(QString filename); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Toggles the visibility / execution of the draw command at index i. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void toggleCommand(int index) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fDebugCanvas->toggleCommand(index); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Toggles the visibility / execution of the draw command at index i with 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) the value of toggle. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void toggleCommand(int index, bool toggle) { 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fDebugCanvas->toggleCommand(index, toggle); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Toggles drawing filter on all drawing commands previous to current. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void toggleCurrentCommandFilter(bool toggle) { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fDebugCanvas->toggleFilter(toggle); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Captures mouse clicks 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @param event The event intercepted by Qt 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void mouseMoveEvent(QMouseEvent* event); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 124 void mousePressEvent(QMouseEvent* event); 125 126 void mouseDoubleClickEvent(QMouseEvent* event); 127 128 void resizeEvent(QResizeEvent* event); 129 130 void wheelEvent(QWheelEvent* event); 131 132protected: 133 /** 134 Draws the current state of the widget. 135 @param event The event intercepted by Qt 136 */ 137 void paintEvent(QPaintEvent *event); 138 139private: 140 SkBitmap fBitmap; 141 SkCanvas* fCanvas; 142 SkDebugCanvas* fDebugCanvas; 143 SkDevice* fDevice; 144 145 SkIPoint fPreviousPoint; 146 SkIPoint fTransform; 147 148 int fIndex; 149 int fScaleFactor; 150}; 151 152#endif 153