|  | // 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 |