00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00029 #ifndef _ImageProcessor_hpp
00030 #define _ImageProcessor_hpp
00031 
00032 #include<ImLib3D/Image3D.hpp>
00033 
00034 
00035 
00038 enum ImageArgFlag   
00039 {
00040     IMARG_NOTDEFINED,           
00041     IMARG_INPLACE,              
00042     IMARG_NOTINPLACE            
00043 };
00044 
00045 
00046 template<class ImageType> class ImageProcessorArgs;
00047 
00049 
00052 template <class ImageType,class ImageTypeCst=ImageType>
00053 class ImageArg
00054 {
00055     friend class ImageProcessorArgs<ImageType>;
00056     ImageTypeCst *image;
00057     bool srcIsConst;
00058     ImageType *duplicate;
00059     Size3D newSize;
00060 public:
00061     void SetConst(bool v=true){srcIsConst=v;}
00062     ImageArg(ImageTypeCst &_image,ImageArgFlag f0=IMARG_NOTDEFINED):
00063         image(&_image),srcIsConst(true),duplicate(NULL)
00064     {
00065         if(f0==IMARG_INPLACE){srcIsConst=false;}
00066         if(f0==IMARG_NOTINPLACE){srcIsConst=true;}
00067     }
00068 };
00069 
00070 
00071 #define TMPDEF ImageArg<Im,const Im>
00072 
00073 template <class Im> inline vector<TMPDEF > ImArgs(const Im &a1,const Im &a2,const Im &a3,const Im &a4)
00074 {TMPDEF s[]={TMPDEF(a1),TMPDEF(a2),TMPDEF(a3),TMPDEF(a4)};vector<TMPDEF > v;v.insert(v.end(),s,s+4);return v;}
00075 template <class Im> inline vector<TMPDEF > ImArgs(const Im &a1,const Im &a2,const Im &a3)
00076 {TMPDEF s[]={TMPDEF(a1),TMPDEF(a2),TMPDEF(a3)};vector<TMPDEF > v;v.insert(v.end(),s,s+3);return v;}
00077 template <class Im> inline vector<TMPDEF > ImArgs(const Im &a1,const Im &a2)
00078 {TMPDEF s[]={TMPDEF(a1),TMPDEF(a2)};vector<TMPDEF > v;v.insert(v.end(),s,s+2);return v;}
00079 template <class Im> inline vector<TMPDEF > ImArgs(const Im &a1)
00080 {TMPDEF s[]={TMPDEF(a1)};vector<TMPDEF > v;v.insert(v.end(),s,s+1);return v;}
00081 
00082 #undef TMPDEF
00083 
00084 
00090 template <class ImageType>
00091 class ImageProcessorArgs
00092 {
00093 private:
00094     typedef ImageArg<ImageType,      ImageType> ImArg;
00095     typedef ImageArg<ImageType,const ImageType> ImArgCst;
00096     bool useLargerSrcBounds;
00097     Size3D bounds;
00098 
00099     vector<ImArgCst>  srcArgs;
00100     vector<ImArg   > destArgs;
00101 public:
00102     ImageProcessorArgs(const vector<ImageArg<ImageType,const ImageType> > &srcs,ImageArg<ImageType> dest):
00103         useLargerSrcBounds(false)
00104     {
00105         for(uint i=0;i<srcs.size();i++)
00106         {
00107             AddSrc (ImageArg<ImageType,const ImageType>(srcs[i]));
00108         }
00109         AddDest(dest);
00110     }
00111     ImageProcessorArgs():
00112         useLargerSrcBounds(false)
00113     {
00114     }
00115     ~ImageProcessorArgs()
00116     {
00117         Finished();
00118     }
00120     void AddSrc (ImArgCst arg){ srcArgs.push_back(arg);}
00122     void AddDest(ImArg    arg){destArgs.push_back(arg);}
00123 
00124 
00125     void SameSize();
00126     void SetDestSize(Size3D size);
00127     void InPlace();
00128 
00130     void AllSameSizeAssert();
00131 
00132     void NoMasksAssert(){;}
00133 
00134     void UseLargerSrcBounds();
00135 
00137     ImageType &GetDest(int argn=0);
00139     const ImageType &GetSrc(int argn=0);
00140 
00142 
00146     void Finished();
00147 
00148 };
00149 
00150 #include<ImLib3D/ImageProcessor.hxx>
00151 
00152 #endif  //_ImageProcessor_hpp