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 |
|
---|
18 | class MandelbrotWidget;
|
---|
19 |
|
---|
20 | class 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 |
|
---|
34 | class 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
|
---|