| // This file is part of Eigen, a lightweight C++ template library | 
 | // for linear algebra. | 
 | // | 
 | // Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com> | 
 | // | 
 | // This Source Code Form is subject to the terms of the Mozilla | 
 | // Public License v. 2.0. If a copy of the MPL was not distributed | 
 | // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. | 
 |  | 
 | #ifndef MANDELBROT_H | 
 | #define MANDELBROT_H | 
 |  | 
 | #include <Eigen/Core> | 
 | #include <QtGui/QApplication> | 
 | #include <QtGui/QWidget> | 
 | #include <QtCore/QThread> | 
 |  | 
 | class MandelbrotWidget; | 
 |  | 
 | class MandelbrotThread : public QThread | 
 | { | 
 |     friend class MandelbrotWidget; | 
 |     MandelbrotWidget *widget; | 
 |     long long total_iter; | 
 |     int id, max_iter; | 
 |     bool single_precision; | 
 |  | 
 |   public: | 
 |     MandelbrotThread(MandelbrotWidget *w, int i) : widget(w), id(i) {} | 
 |     void run(); | 
 |     template<typename Real> void render(int img_width, int img_height); | 
 | }; | 
 |  | 
 | class MandelbrotWidget : public QWidget | 
 | { | 
 |     Q_OBJECT | 
 |  | 
 |     friend class MandelbrotThread; | 
 |     Eigen::Vector2d center; | 
 |     double xradius; | 
 |     int size; | 
 |     unsigned char *buffer; | 
 |     QPoint lastpos; | 
 |     int draft; | 
 |     MandelbrotThread **threads; | 
 |     int threadcount; | 
 |  | 
 |   protected: | 
 |     void resizeEvent(QResizeEvent *); | 
 |     void paintEvent(QPaintEvent *); | 
 |     void mousePressEvent(QMouseEvent *event); | 
 |     void mouseMoveEvent(QMouseEvent *event); | 
 |  | 
 |   public: | 
 |     MandelbrotWidget() : QWidget(), center(0,0), xradius(2), | 
 |                          size(0), buffer(0), draft(16) | 
 |     { | 
 |       setAutoFillBackground(false); | 
 |       threadcount = QThread::idealThreadCount(); | 
 |       threads = new MandelbrotThread*[threadcount]; | 
 |       for(int th = 0; th < threadcount; th++) threads[th] = new MandelbrotThread(this, th); | 
 |     } | 
 |     ~MandelbrotWidget() | 
 |     { | 
 |       if(buffer) delete[]buffer; | 
 |       for(int th = 0; th < threadcount; th++) delete threads[th]; | 
 |       delete[] threads; | 
 |     } | 
 | }; | 
 |  | 
 | #endif // MANDELBROT_H |