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