00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00032 #include "CFilter.hpp"
00033
00034 using namespace Millie;
00035
00036 CFilter::CFilter(const CMaskFactory & factory)
00037 : _factory(0)
00038 {
00039 _factory = factory.clone();
00040 }
00041
00042
00043 CFilter::~CFilter()
00044 {
00045 delete _factory;
00046 }
00047
00048
00049 CFilter::CFilter(const CFilter & origine)
00050 : _factory(0)
00051 {
00052 _factory = origine._factory->clone();
00053 }
00054
00055
00056 void CFilter::complexCompute(ImageComplex& out, const ImageComplex& in)
00057 {
00058 if(out.getNumComponents() != in.getNumComponents())
00059 throw IllegalArgument("cfilterOperator");
00060
00061 ImageComplex tempo(in.getNumComponents());
00062 _factory->compute(tempo, in.getWidth(), in.getHeight());
00063
00064 if(tempo.getWidth() != in.getWidth() || tempo.getHeight() != in.getHeight())
00065 {
00066 throw RuntimeException("CFilter::complexCompute : Illness Factory");
00067 }
00068
00069 out.resize(in.getWidth(), in.getHeight());
00070
00071 for(int canal = 0; canal< in.getNumComponents(); canal++)
00072 {
00073 for(int j = 0; j< in.getHeight(); j++)
00074 for(int i = 0; i < in.getWidth(); i++)
00075 {
00076 std::complex<float> cout = tempo.getPixel(i,j, canal) * in.getPixel(i,j, canal);
00077
00078 out.setPixel(i,j, canal, cout);
00079 }
00080 }
00081
00082
00083 }
00084
00085 CFilter * CFilter::clone() const
00086 {
00087 return new CFilter(*this);
00088 }
00089
00090 void Millie::cfilterOperator(ImageComplex & out, const ImageComplex & in, const CMaskFactory & mask)
00091 {
00092 CFilter filter(mask);
00093 filter.complexCompute(out, in);
00094 }