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

template<class ArrayT, class KerArrayT, class ArithT, class PixOpT, class RedOpT>
static void Impala::Core::Array::Pattern::FuncRecGenConv2dSep_Line_YdirSim ( ArrayT *  a,
KerArrayT *  ker,
ArithT *  ngbBuf,
PixOpT &  pixOp,
RedOpT &  redOp,
ArithT  bottomNorm,
int  x 
) [static]

Line : Y direction, simple.

Definition at line 130 of file FuncRecGenConv2dSep.h.

References ArrayCH(), ArrayCPB(), ArrayCW(), ArrayInc(), PtrRead(), and PtrWrite().

Referenced by FuncRecGenConv2dSep_YdirSim().

00133 {
00134     typedef typename ArrayT::StorType StorT;
00135     typedef typename KerArrayT::StorType KerStorT;
00136 
00137     int height = ArrayCH(a);
00138     int kerWidth = ArrayCW(ker);
00139     int kerBW = ArrayCW(ker) / 2;
00140     StorT* aPtr = ArrayCPB(a, x, -kerBW);
00141     int incY = ArrayInc(a, 0, 1);
00142     ArithT result;
00143     ArithT* ngbPtr = ngbBuf;
00144     int y, n;
00145     int scanSize = height+kerBW;
00146     //int scanSize = height;
00147 
00148     // scan order
00149 
00150     for (n=0 ; n<kerBW ; n++)
00151     {
00152         ngbBuf[n] =  PtrRead(aPtr, ArithT());
00153         aPtr += incY;
00154     }
00155 
00156     for (y=0 ; y<scanSize ; y++)
00157     {
00158         ngbPtr[kerBW] =  PtrRead(aPtr, ArithT());
00159         aPtr += incY;
00160         KerStorT* kPtr = ArrayCPB(ker, 0, 0);
00161         result = pixOp.DoIt(ngbPtr[0], PtrRead(kPtr, ArithT()));
00162         kPtr += KerArrayT::ElemSize();
00163         for (n=1 ; n<=kerBW ; n++)
00164         {
00165             redOp.DoIt(result, pixOp.DoIt(ngbPtr[n], PtrRead(kPtr, ArithT())));
00166             kPtr += KerArrayT::ElemSize();
00167         }
00168         ngbPtr[kerBW] = result;
00169         ngbPtr++;
00170     }
00171 
00172     // Propagate last pixel value into border
00173 
00174     ngbPtr += kerBW-1; // now at last pixel
00175     ArithT borderVal = ngbPtr[0];
00176     borderVal = borderVal * bottomNorm;
00177     ngbPtr++;
00178     for (y=0 ; y<kerBW ; y++)
00179         ngbPtr[y] = borderVal;
00180     aPtr += incY * kerBW;
00181 
00182     // anti scan order
00183 
00184     aPtr -= incY * (kerBW+1);
00185     ngbPtr -= 1;
00186 
00187     for (y=0 ; y<scanSize ; y++)
00188     {
00189         KerStorT* kPtr = ArrayCPB(ker, kerBW, 0);
00190         result = pixOp.DoIt(ngbPtr[0], PtrRead(kPtr, ArithT()));
00191         kPtr += KerArrayT::ElemSize();
00192         for (n=1 ; n<=kerBW ; n++)
00193         {
00194             redOp.DoIt(result, pixOp.DoIt(ngbPtr[n], PtrRead(kPtr, ArithT())));
00195             kPtr += KerArrayT::ElemSize();
00196         }
00197         *ngbPtr-- = result;
00198         PtrWrite(aPtr, result);
00199         aPtr -= incY;
00200     }
00201 }

Here is the call graph for this function:


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