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