| // This file is part of Eigen, a lightweight C++ template library |
| // for linear algebra. Eigen itself is part of the KDE project. |
| // |
| // Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com> |
| // |
| // Eigen is free software; you can redistribute it and/or |
| // modify it under the terms of the GNU Lesser General Public |
| // License as published by the Free Software Foundation; either |
| // version 3 of the License, or (at your option) any later version. |
| // |
| // Alternatively, you can redistribute it and/or |
| // modify it under the terms of the GNU General Public License as |
| // published by the Free Software Foundation; either version 2 of |
| // the License, or (at your option) any later version. |
| // |
| // Eigen is distributed in the hope that it will be useful, but WITHOUT ANY |
| // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
| // FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the |
| // GNU General Public License for more details. |
| // |
| // You should have received a copy of the GNU Lesser General Public |
| // License and a copy of the GNU General Public License along with |
| // Eigen. If not, see <http://www.gnu.org/licenses/>. |
| |
| #ifndef MANDELBROT_H |
| #define MANDELBROT_H |
| |
| #include <Eigen/Array> |
| #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 |