00001 #ifndef FRACTALPIXMAP_H
00002 #define FRACTALPIXMAP_H
00003
00004 #include <complex>
00005 #include <QFutureWatcher>
00006 #include <QGraphicsPixmapItem>
00007 #include <QMutex>
00008 #include <QObject>
00009 #include <QPixmap>
00010 #include <QTime>
00011 #include <QTimer>
00012 #include <QVector>
00013 #include "QtConcurrentRun"
00014 #include "colors.h"
00015 #include "settingsDialog.h"
00016
00017 typedef std::complex<double> point;
00018 typedef QFutureWatcher<void> VoidWatcher;
00019
00020 enum EStatus{
00021 NOTSTARTED,
00022 RUNNING,
00023 PAUSED,
00024 CALCULATED,
00025 RENDERED,
00026 ERROR
00027 };
00028
00029 struct SubDefinition
00030 {
00031 int offsetX;
00032 int offsetY;
00033 int width;
00034 int height;
00035 double startX;
00036 double startY;
00037 double stepX;
00038 double stepY;
00039 FractalSettings globale;
00040 EStatus status;
00041 QVector<int> *pDensityMap;
00042 };
00043
00044 struct SubResult
00045 {
00046 SubDefinition subDefinition;
00047 QVector<int> iVector;
00048 };
00049
00050 class CFractalPixmap : public QObject, public QGraphicsPixmapItem
00051 {
00052 Q_OBJECT
00053 Q_PROPERTY(QPointF pos READ pos WRITE setPos)
00054 public:
00055 CFractalPixmap(const FractalSettings fractalSettings);
00056 ~CFractalPixmap();
00057
00058
00059 int getSize() {return dataSize;}
00060 int getIndex() {return fractalIndex;}
00061 QSize size() {return pixmap.size();}
00062 QSize imSize() {return imageSize;}
00063 QStringList fractalTypeNames;
00064 QAbstractTransition *trans;
00065 FractalSettings settings;
00066
00067 public slots:
00068 void renderProgress();
00069 void renderFull();
00070 void showPreview(int width=PREVIEW_SIZE, int height=PREVIEW_SIZE);
00071 void showFull(int width=0, int height=0);
00072 void updateProgressValue(const int value);
00073 void updateProgressRange(const int minimum, const int maximum);
00074 void updateAllFinished();
00075 void start();
00076 void stop();
00077 void pause();
00078 void resume();
00079 void cancel();
00080
00081 signals:
00082 void allFinished();
00083 void finishedAt(int index);
00084 void progressValueChanged ( int progressValue);
00085 void progressRangeChanged (int minimum, int maximum);
00086 void clicked(int fractIndex);
00087
00088 private:
00089 void mousePressEvent(QGraphicsSceneMouseEvent *event);
00090
00091 static SubResult doCalculate (const SubDefinition &sub);
00092 static SubResult calculateMandelbrot (const SubDefinition &sub);
00093 static SubResult calculateBuddhabrot (const SubDefinition &sub);
00094 static SubResult calculateJulia (const SubDefinition &sub);
00095
00096
00097 static void doPostProcess (QVector<int> &result, const SubResult &sub);
00098 void doPostProcessNonStatic (QVector<int> &result, const SubResult &sub);
00099
00100 static int fractalCounter;
00101
00102 void initialize();
00103 void generateColorMap();
00104 QImage scale(const QString &imageFileName, int size=PREVIEW_SIZE);
00105 QImage scale(const QImage *image, int size=PREVIEW_SIZE);
00106
00107 uint colorMap[COLORMAP_SIZE];
00108 QVector<SubDefinition> subFractals;
00109 QVector<int> densityMap;
00110
00111 QString fractalName;
00112 int fractalIndex;
00113 bool hasVerticalSymmetry;
00114 bool isPreviewMode;
00115 int dataSize;
00116 EFractalType fractalType;
00117 int progressValue;
00118 int progressMin;
00119 int progressMax;
00120 bool progressRefreshIsNeeded;
00121
00122 VoidWatcher watcher;
00123 QFuture< QVector<int> > future;
00124 QPixmap pixmap;
00125
00126 QImage *fullImage;
00127 QSize imageSize;
00128 uint *previewPixels;
00129 QTimer timer;
00130 QMutex mutex;
00131 QTime timeStart, timeStop;
00132 int densityMax;
00133 };
00134
00135 #endif // FRACTALPIXMAP_H