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