Home || Architecture || Video Search || Visual Search || Scripts || Applications || Important Messages || OGL || Src

template<class ArrayT, class KerArrayT, class ValT, class PixOpT, class RedOpT>
static void Impala::Core::Array::Pattern::FuncRecGenConv2dSep_Line_XdirSim ( ArrayT *  a,
KerArrayT *  ker,
PixOpT &  pixOp,
RedOpT &  redOp,
ValT  rightNorm,
int  y 
) [static]

Line : X direction, simple.

Definition at line 49 of file FuncRecGenConv2dSep.h.

References ArrayCPB(), ArrayCW(), Impala::Core::Array::Element::E1Cast(), PtrRead(), and PtrWrite().

Referenced by FuncRecGenConv2dSep_XirSim().

00051 {
00052     typedef typename ArrayT::StorType StorT;
00053     typedef typename ArrayT::ArithType ArithT;
00054     typedef typename KerArrayT::StorType KerStorT;
00055     typedef typename KerArrayT::ArithType KerArithT;
00056 
00057     int width = ArrayCW(a);
00058     int kerWidth = ArrayCW(ker);
00059     int kerBW = ArrayCW(ker) / 2;
00060     StorT* aPtr = ArrayCPB(a, -kerBW, y);
00061     KerArithT rNorm = Element::E1Cast(rightNorm, KerArithT());
00062     KerArithT result;
00063     int x;
00064     int scanSize = width + kerBW;
00065     //int scanSize = width;
00066 
00067     // scan order
00068 
00069     for (x=0 ; x<scanSize ; x++)
00070     {
00071         KerStorT* kPtr = ArrayCPB(ker, 0, 0);
00072         result = pixOp.DoIt(PtrRead(aPtr, KerArithT()),
00073                             PtrRead(kPtr, KerArithT()));
00074         aPtr += ArrayT::ElemSize();
00075         kPtr += KerArrayT::ElemSize();
00076         for (int n=1 ; n<=kerBW ; n++)
00077         {
00078             redOp.DoIt(result, pixOp.DoIt(PtrRead(aPtr, KerArithT()),
00079                                           PtrRead(kPtr, KerArithT())));
00080             aPtr += ArrayT::ElemSize();
00081             kPtr += KerArrayT::ElemSize();
00082         }
00083         aPtr -= ArrayT::ElemSize();
00084         PtrWrite(aPtr, result);
00085         aPtr -= (kerBW-1) * ArrayT::ElemSize();
00086     }
00087 
00088     // Propagate last pixel value into border
00089 
00090     aPtr += (kerBW-1) * ArrayT::ElemSize();  // now at last pixel on the line
00091     KerArithT borderVal = PtrRead(aPtr, KerArithT());
00092     aPtr += ArrayT::ElemSize();
00093     borderVal = borderVal * rNorm;
00094     for (x=0 ; x<kerBW ; x++)
00095     {
00096         PtrWrite(aPtr, borderVal);
00097         aPtr += ArrayT::ElemSize();
00098     }
00099     aPtr -= kerBW * ArrayT::ElemSize();
00100 
00101     // anti scan order
00102 
00103     aPtr -= ArrayT::ElemSize();
00104 
00105     for (x=0 ; x<scanSize ; x++)
00106     {
00107         KerStorT* kPtr = ArrayCPB(ker, kerBW, 0);
00108         result = pixOp.DoIt(PtrRead(aPtr, KerArithT()),
00109                             PtrRead(kPtr, KerArithT()));
00110         aPtr += ArrayT::ElemSize();
00111         kPtr += KerArrayT::ElemSize();
00112         for (int n=1 ; n<=kerBW ; n++)
00113         {
00114             redOp.DoIt(result, pixOp.DoIt(PtrRead(aPtr, KerArithT()),
00115                                           PtrRead(kPtr, KerArithT())));
00116             aPtr += ArrayT::ElemSize();
00117             kPtr += KerArrayT::ElemSize();
00118         }
00119         aPtr -= (kerBW+1) * ArrayT::ElemSize();
00120         PtrWrite(aPtr, result);
00121         aPtr -= ArrayT::ElemSize();
00122     }
00123 }

Here is the call graph for this function:


Generated on Fri Mar 19 11:01:42 2010 for ImpalaSrc by  doxygen 1.5.1