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