00001 #ifndef __MLFILTER_H__
00002 #define __MLFILTER_H__
00003
00004 #include <vector>
00005
00006 #include <stdint.h>
00007
00008 #include "utils.h"
00009 #include "image.h"
00010 #include "processor.h"
00011 #include "thread.h"
00012
00013 namespace multilevel
00014 {
00015
00016 class MlFilter;
00018
00019 class HPassJob : public thread::Job
00020 {
00021 public:
00022 HPassJob(const spectral::Image *sourceImage,
00023 const std::vector<float> &kernel,
00024 uint32_t first,
00025 uint32_t last,
00026 bool wrap,
00027 spectral::Image *destImage);
00028
00029 virtual void Process(void);
00030
00031 private:
00032 const spectral::Image *m_sourceImage;
00033 spectral::Image *m_destImage;
00034 const std::vector<float> &m_kernel;
00035 const uint32_t m_first, m_last;
00036 const bool m_wrap;
00037 };
00038
00040
00041 class VPassJob : public thread::Job
00042 {
00043 public:
00044 VPassJob(const spectral::Image *sourceImage,
00045 const std::vector<float> &kernel,
00046 uint32_t first,
00047 uint32_t last,
00048 bool wrap,
00049 spectral::Image *destImage);
00050
00051 virtual void Process(void);
00052
00053 private:
00054 const spectral::Image *m_sourceImage;
00055 spectral::Image *m_destImage;
00056 const std::vector<float> &m_kernel;
00057 const uint32_t m_first, m_last;
00058 const bool m_wrap;
00059 };
00060
00062
00063 class MlFilterFarmer : public thread::Farmer
00064 {
00065 public:
00066 MlFilterFarmer(MlFilter*,
00067 float initialProgress,
00068 float jobWeight);
00069 virtual void ProcessCompletedJob(thread::Job *);
00070 private:
00071 MlFilter *m_owner;
00072 float m_initialProgress, m_jobWeight;
00073 };
00074
00075
00077
00080 class MlFilter : public spectral::Processor
00081 {
00082 public:
00083 MlFilter();
00084 ~MlFilter();
00085
00086
00087
00088 virtual uint32_t GetInterface(
00089 std::list<std::pair<uint32_t, uint32_t> > &mandatory,
00090 std::list<std::pair<uint32_t, uint32_t> > &optional) const;
00091
00092
00093 virtual bool SetImage(uint32_t slot, const spectral::Image *img);
00094
00095
00096 virtual void SetParameters(const spectral::Parameters *);
00097
00098
00099 virtual spectral::Image *Process(void);
00100
00101
00102 virtual void ClearImage(uint32_t slot);
00103
00104 protected:
00105
00106
00107 virtual void GetParameters(spectral::Parameters *) const;
00108
00109 private:
00110 void ClearLayers(void);
00111 spectral::Image *CreateLayer(const spectral::Image *input, uint32_t layer, float start, float weight);
00112
00113 const spectral::Image *m_lumImage;
00114 std::vector<spectral::Image *>m_layers;
00115 float m_tolerance;
00116 int32_t m_num_layers;
00117 bool m_wrap_horizontal, m_wrap_vertical;
00118 bool m_density;
00119 };
00120
00121 }
00122
00123 #endif