template<class ArrayT, class KerArrayT, class ValT, class PixOpT, class RedOpT>
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:
|