00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _FRACTAL_THREAD_H_
00022 #define _FRACTAL_THREAD_H_
00023
00024 #include "../fractal.h"
00025
00029 template< typename TSequence, typename TPointsGenerator, typename TAccumulator >
00030 class Fractal_Thread : public Fractal
00031 {
00032 private:
00033 TSequence m_sequence;
00034 TPointsGenerator m_points_generator;
00035 TAccumulator m_accumulator;
00036
00037 public:
00038 Fractal_Thread( const FractalParameters& _fractal_parameters )
00039 : Fractal( _fractal_parameters )
00040 , m_sequence( &m_fractal_parameters )
00041 , m_points_generator( &m_fractal_parameters )
00042 , m_accumulator( &m_fractal_parameters )
00043 {
00044 }
00045
00046 void accumulate( const Fractal_Thread& _fractal )
00047 {
00048 ((Accumulator*)&m_accumulator)->accumulate( _fractal.m_accumulator );
00049 }
00050 void accumulateAt( const unsigned int _position, const Fractal_Thread& _fractal )
00051 {
00052 ((Accumulator*)&m_accumulator)->accumulateAt( _position, _fractal.m_accumulator );
00053 }
00054
00055
00056 virtual qreal progress() const
00057 {
00058 return m_points_generator.progress();
00059 }
00060
00061 virtual QImage toImage( const Palette& _palette ) const
00062 {
00063 return m_accumulator.toImage( _palette );
00064 }
00065
00066 virtual int load( QFile& _file )
00067 {
00068 return m_accumulator.load( _file );
00069 }
00070 virtual int save( QFile& _file ) const
00071 {
00072 return m_accumulator.save( _file );
00073 }
00074
00075 protected:
00076 virtual void run()
00077 {
00078 m_points_generator.init();
00079 while( ! m_stop && ! m_points_generator.end() )
00080 {
00081 const Point point = m_points_generator.next();
00082 const PointsSequence& points_sequence = m_sequence.compute( point );
00083
00084 m_accumulator.accumulate( point, points_sequence );
00085 }
00086
00087 quit();
00088 }
00089 };
00090
00091 #endif //_FRACTAL_THREAD_H_