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