1*bf2c3715SXin Li // This file is part of Eigen, a lightweight C++ template library 2*bf2c3715SXin Li // for linear algebra. 3*bf2c3715SXin Li // 4*bf2c3715SXin Li // Copyright (C) 2008 Benoit Jacob <[email protected]> 5*bf2c3715SXin Li // 6*bf2c3715SXin Li // This Source Code Form is subject to the terms of the Mozilla 7*bf2c3715SXin Li // Public License v. 2.0. If a copy of the MPL was not distributed 8*bf2c3715SXin Li // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9*bf2c3715SXin Li 10*bf2c3715SXin Li #ifndef MANDELBROT_H 11*bf2c3715SXin Li #define MANDELBROT_H 12*bf2c3715SXin Li 13*bf2c3715SXin Li #include <Eigen/Core> 14*bf2c3715SXin Li #include <QtGui/QApplication> 15*bf2c3715SXin Li #include <QtGui/QWidget> 16*bf2c3715SXin Li #include <QtCore/QThread> 17*bf2c3715SXin Li 18*bf2c3715SXin Li class MandelbrotWidget; 19*bf2c3715SXin Li 20*bf2c3715SXin Li class MandelbrotThread : public QThread 21*bf2c3715SXin Li { 22*bf2c3715SXin Li friend class MandelbrotWidget; 23*bf2c3715SXin Li MandelbrotWidget *widget; 24*bf2c3715SXin Li long long total_iter; 25*bf2c3715SXin Li int id, max_iter; 26*bf2c3715SXin Li bool single_precision; 27*bf2c3715SXin Li 28*bf2c3715SXin Li public: MandelbrotThread(MandelbrotWidget * w,int i)29*bf2c3715SXin Li MandelbrotThread(MandelbrotWidget *w, int i) : widget(w), id(i) {} 30*bf2c3715SXin Li void run(); 31*bf2c3715SXin Li template<typename Real> void render(int img_width, int img_height); 32*bf2c3715SXin Li }; 33*bf2c3715SXin Li 34*bf2c3715SXin Li class MandelbrotWidget : public QWidget 35*bf2c3715SXin Li { 36*bf2c3715SXin Li Q_OBJECT 37*bf2c3715SXin Li 38*bf2c3715SXin Li friend class MandelbrotThread; 39*bf2c3715SXin Li Eigen::Vector2d center; 40*bf2c3715SXin Li double xradius; 41*bf2c3715SXin Li int size; 42*bf2c3715SXin Li unsigned char *buffer; 43*bf2c3715SXin Li QPoint lastpos; 44*bf2c3715SXin Li int draft; 45*bf2c3715SXin Li MandelbrotThread **threads; 46*bf2c3715SXin Li int threadcount; 47*bf2c3715SXin Li 48*bf2c3715SXin Li protected: 49*bf2c3715SXin Li void resizeEvent(QResizeEvent *); 50*bf2c3715SXin Li void paintEvent(QPaintEvent *); 51*bf2c3715SXin Li void mousePressEvent(QMouseEvent *event); 52*bf2c3715SXin Li void mouseMoveEvent(QMouseEvent *event); 53*bf2c3715SXin Li 54*bf2c3715SXin Li public: MandelbrotWidget()55*bf2c3715SXin Li MandelbrotWidget() : QWidget(), center(0,0), xradius(2), 56*bf2c3715SXin Li size(0), buffer(0), draft(16) 57*bf2c3715SXin Li { 58*bf2c3715SXin Li setAutoFillBackground(false); 59*bf2c3715SXin Li threadcount = QThread::idealThreadCount(); 60*bf2c3715SXin Li threads = new MandelbrotThread*[threadcount]; 61*bf2c3715SXin Li for(int th = 0; th < threadcount; th++) threads[th] = new MandelbrotThread(this, th); 62*bf2c3715SXin Li } ~MandelbrotWidget()63*bf2c3715SXin Li ~MandelbrotWidget() 64*bf2c3715SXin Li { 65*bf2c3715SXin Li if(buffer) delete[]buffer; 66*bf2c3715SXin Li for(int th = 0; th < threadcount; th++) delete threads[th]; 67*bf2c3715SXin Li delete[] threads; 68*bf2c3715SXin Li } 69*bf2c3715SXin Li }; 70*bf2c3715SXin Li 71*bf2c3715SXin Li #endif // MANDELBROT_H 72