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