00001 #ifndef Impala_Core_Array_Pattern_PatGenConv2d_h
00002 #define Impala_Core_Array_Pattern_PatGenConv2d_h
00003
00004 #include "Core/Array/CheckBorderSize.h"
00005 #include "Core/Array/Pattern/PatSetBorder.h"
00006 #include "Core/Array/Pattern/FuncGenConv2d.h"
00007
00008 #ifdef PX_HORUS_USED
00009 #include "Core/Array/Pattern/PxArrayFunc.h"
00010 #include "Core/Array/Pattern/PxStateTrans.h"
00011 #endif
00012
00013 namespace Impala
00014 {
00015 namespace Core
00016 {
00017 namespace Array
00018 {
00019 namespace Pattern
00020 {
00021
00022
00023 template<class DstArrayT, class SrcArrayT, class KerArrayT,
00024 class PixOpT, class RedOpT>
00025 inline void
00026 PatGenConv2d(DstArrayT*& dst, SrcArrayT* src, KerArrayT* ker,
00027 PixOpT& pixOp, RedOpT& redOp, BorderType borderType = BORDERMIRROR)
00028 {
00029 int numX = ArrayCW(ker) / 2;
00030 int numY = ArrayCH(ker) / 2;
00031 SrcArrayT* checkedSrc = CheckBorderSize(src, numX, numY);
00032
00033 if ((dst == 0) || (dst == checkedSrc))
00034 dst = ArrayClone<DstArrayT>(checkedSrc);
00035
00036 #ifdef PX_HORUS_USED
00037 if (!PxRunParallel()) {
00038 #endif
00039
00040
00041
00042
00043
00044
00045
00046
00047 PatSetBorder(checkedSrc, numX, numY);
00048 FuncGenConv2dDispatch(dst, checkedSrc, ker, pixOp, redOp);
00049
00050 #ifdef PX_HORUS_USED
00051 } else {
00052 PxArrayPreStateTrans(checkedSrc, PAR_PART, STRONG);
00053 PxArrayPreStateTrans(dst, PAR_PART, WEAK);
00054 PatSetBorder(PxArrayPD(checkedSrc), numX, numY);
00055 FuncGenConv2dDispatch(PxArrayPD(dst),
00056 PxArrayPD(checkedSrc), ker, pixOp, redOp);
00057 if (PxArrayPD(checkedSrc) != PxArrayPD(src))
00058 PxArrayDeletePD(checkedSrc);
00059 PxArrayPostStateTrans(dst);
00060
00061 if (!PxRunLazyParallel()) {
00062 PxArrayForceNonDistributed(src);
00063 PxArrayForceNonDistributed(dst);
00064 }
00065 }
00066 #endif
00067
00068 if (checkedSrc != src)
00069 delete checkedSrc;
00070 }
00071
00072 }
00073 }
00074 }
00075 }
00076
00077 #endif