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