#include "HxFuncRecGenConv2dK1d.h"
#include "HxEnvironment.h"
Line_variations | |
| template<class DataPtrT, class ArithT, class PixOpT, class RedOpT> void | HxFuncRecGenConv2dK1d_Line_XdirSim (DataPtrT imgPtr, int imgWidth, ArithT *kernel, int kerSize, PixOpT &pixOp, RedOpT &redOp) |
| Line : X direction, simple. More... | |
| template<class DataPtrT, class ArithT, class PixOpT, class RedOpT> void | HxFuncRecGenConv2dK1d_Line_YdirSim (DataPtrT imgPtr, int imgHeight, ArithT *kernel, int kerSize, ArithT *ngbBuf, PixOpT &pixOp, RedOpT &redOp) |
| Line : Y direction, simple. More... | |
| template<class DataPtrT, class ArithT, class PixOpT, class RedOpT> void | HxFuncRecGenConv2dK1d_Line_YdirBuf (DataPtrT imgPtr, int imgWidth, ArithT *kernel, int kerSize, PixOpT &pixOp, RedOpT &redOp) |
| Line : Y direction, buffered. More... | |
| template<class DataPtrT, class ArithT, class PixOpT, class RedOpT> void | HxFuncRecGenConv2dK1d_Line_YdirBufAnti (DataPtrT imgPtr, int imgWidth, ArithT *kernel, int kerSize, PixOpT &pixOp, RedOpT &redOp) |
RecGenConv2dK1d_variations | |
| template<class DataPtrType, class KerDataPtrType, class ArithType, class PixOpT, class RedOpT> void | HxFuncRecGenConv2dK1d_XdirSim (DataPtrType imgPtr, KerDataPtrType kerPtr, ArithType dummy, HxSizes imgSize, HxSizes borderSize, HxSizes kerSize, PixOpT &pixOp, RedOpT &redOp) |
| RecGenConv2dK1d : X direction, simple. More... | |
| template<class DataPtrType, class KerDataPtrType, class ArithType, class PixOpT, class RedOpT> void | HxFuncRecGenConv2dK1d_YdirSim (DataPtrType imgPtr, KerDataPtrType kerPtr, ArithType dummy, HxSizes imgSize, HxSizes borderSize, HxSizes kerSize, PixOpT &pixOp, RedOpT &redOp) |
| RecGenConv2dK1d : Y direction, simple. More... | |
| template<class DataPtrType, class KerDataPtrType, class ArithType, class PixOpT, class RedOpT> void | HxFuncRecGenConv2dK1d_YdirBuf (DataPtrType imgPtr, KerDataPtrType kerPtr, ArithType dummy, HxSizes imgSize, HxSizes borderSize, HxSizes kerSize, PixOpT &pixOp, RedOpT &redOp) |
| RecGenConv2dK1d : Y direction, buffered. More... | |
Functions | |
| template<class DataPtrType, class KerDataPtrType, class ArithType, class PixOpT, class RedOpT> void | HxFuncRecGenConv2dK1dDispatch (DataPtrType imgPtr, KerDataPtrType kerPtr, ArithType dummy, HxSizes imgSize, HxSizes borderSize, HxSizes kerSize, PixOpT &pixOp, RedOpT &redOp, int dimension, bool buffered) |
| Dispatch function for RecGenConv2dK1d (see Global functions for RecGenConv2dK1d) Dispatch is based on dimension and inplace parameters. More... | |
|
||||||||||||||||||||||||||||||||
|
Line : X direction, simple.
00052 {
00053 int x, n, ngbSize = kerSize/2, scanSize = imgWidth+ngbSize;
00054 ArithT result;
00055
00056 // scan order
00057
00058 for (x=0; x<scanSize; x++)
00059 {
00060 result = pixOp.doIt(imgPtr.readIncX(), kernel[0]);
00061 for (n=1; n<=ngbSize; n++)
00062 redOp.doIt(result, pixOp.doIt(imgPtr.readIncX(), kernel[n]));
00063 imgPtr.decX();
00064 imgPtr.write(result);
00065 imgPtr.decX(ngbSize-1);
00066 }
00067
00068 // anti scan order
00069
00070 imgPtr.decX();
00071 kernel += kerSize/2;
00072
00073 for (x=0; x<imgWidth; x++)
00074 {
00075 result = pixOp.doIt(imgPtr.readIncX(), kernel[0]);
00076 for (n=1; n<=ngbSize; n++)
00077 redOp.doIt(result, pixOp.doIt(imgPtr.readIncX(), kernel[n]));
00078 imgPtr.decX(ngbSize+1);
00079 imgPtr.write(result);
00080 imgPtr.decX();
00081 }
00082
00083 }
|
|
||||||||||||||||||||||||||||||||||||
|
Line : Y direction, simple.
00092 {
00093 int y, n, ngbSize = kerSize/2, scanSize = imgHeight+ngbSize;
00094 ArithT result;
00095 ArithT* ngbPtr = ngbBuf;
00096
00097 // scan order
00098
00099 for (n=0; n<ngbSize; n++)
00100 {
00101 ngbBuf[n] = imgPtr.read();
00102 imgPtr.incY();
00103 }
00104
00105
00106 for (y=0; y<scanSize; y++)
00107 {
00108 ngbPtr[ngbSize] = imgPtr.read();
00109 imgPtr.incY();
00110 result = pixOp.doIt(ngbPtr[0], kernel[0]);
00111 for (n=1; n<=ngbSize; n++)
00112 redOp.doIt(result, pixOp.doIt(ngbPtr[n], kernel[n]));
00113 ngbPtr[ngbSize] = result;
00114 ngbPtr++;
00115 }
00116
00117 // anti scan order
00118
00119 imgPtr.decY(ngbSize+1);
00120 ngbPtr -= 1;
00121 kernel += ngbSize;
00122
00123 for (y=0; y<imgHeight; y++)
00124 {
00125 result = pixOp.doIt(ngbPtr[0], kernel[0]);
00126 for (n=1; n<=ngbSize; n++)
00127 redOp.doIt(result, pixOp.doIt(ngbPtr[n], kernel[n]));
00128 imgPtr.write(*ngbPtr-- = result);
00129 imgPtr.decY();
00130 }
00131 }
|
|
||||||||||||||||||||||||||||||||
|
Line : Y direction, buffered.
00139 {
00140 const int ngbSize = kerSize/2;
00141 int x, n;
00142 ArithT result;
00143 DataPtrT linePtr(imgPtr);
00144
00145 // scan order
00146
00147 for (x=0; x<imgWidth; x++)
00148 imgPtr.writeIncX(pixOp.doIt(imgPtr.read(), kernel[ngbSize]));
00149
00150 imgPtr.decX(imgWidth);
00151
00152 // previous lines
00153 for (n=ngbSize-1; n>=0; n--)
00154 {
00155 linePtr.decY();
00156 for (x=0; x<imgWidth; x++) {
00157 result = imgPtr.read();
00158 redOp.doIt(result, pixOp.doIt(linePtr.readIncX(), kernel[n]));
00159 imgPtr.writeIncX(result);
00160 }
00161 imgPtr.decX(imgWidth);
00162 linePtr.decX(imgWidth);
00163 }
00164 }
|
|
||||||||||||||||||||||||||||||||||||||||
|
RecGenConv2dK1d : X direction, simple.
00216 {
00217 int borderWidth = borderSize.x() > 0 ? borderSize.x() : kerSize.x()/2;
00218 int borderHeight = borderSize.y();
00219 imgSize = imgSize - HxSizes(2*borderWidth, 2*borderHeight, 0);
00220 int imgWidth = imgSize.x();
00221 int imgHeight = imgSize.y();
00222 int y, i;
00223
00224 HxPixelAllocator<ArithType> allocator;
00225
00226 ArithType* kernel = allocator.allocate(kerSize.x());
00227
00228 for (i=0; i<kerSize.x(); i++)
00229 kernel[i] = kerPtr.readIncX();
00230
00231 imgPtr.incXYZ(borderWidth-kerSize.x()/2, borderHeight, 0);
00232
00233 for (y=0; y<imgHeight; y++)
00234 {
00235 HxFuncRecGenConv2dK1d_Line_XdirSim(
00236 imgPtr, imgWidth, kernel, kerSize.x(), pixOp, redOp);
00237 imgPtr.incY();
00238 }
00239
00240 allocator.deallocate(kernel);
00241 }
|
|
||||||||||||||||||||||||||||||||||||||||
|
RecGenConv2dK1d : Y direction, simple.
00251 {
00252 int borderWidth = borderSize.x();
00253 int borderHeight = borderSize.y() > 0 ? borderSize.y() : kerSize.x()/2;
00254 imgSize = imgSize - HxSizes(2*borderWidth, 2*borderHeight, 0);
00255 int imgWidth = imgSize.x();
00256 int imgHeight = imgSize.y();
00257 int x, i;
00258
00259 HxPixelAllocator<ArithType> allocator;
00260
00261 ArithType* kernel = allocator.allocate(kerSize.x());
00262
00263 for (i=0; i<kerSize.x(); i++)
00264 kernel[i] = kerPtr.readIncX();
00265
00266 ArithType* ngbBuf = allocator.allocate(imgHeight+kerSize.x());
00267
00268 imgPtr.incXYZ(borderWidth, borderHeight-kerSize.x()/2, 0);
00269
00270 for (x=0; x<imgWidth; x++)
00271 {
00272 HxFuncRecGenConv2dK1d_Line_YdirSim(
00273 imgPtr, imgHeight, kernel, kerSize.x(), ngbBuf, pixOp, redOp);
00274 imgPtr.incX();
00275 }
00276
00277 allocator.deallocate(ngbBuf);
00278 allocator.deallocate(kernel);
00279 }
|
|
||||||||||||||||||||||||||||||||||||||||
|
RecGenConv2dK1d : Y direction, buffered.
00290 {
00291 HxEnvironment::instance()->outputStream() << "Buffered" << STD_ENDL;
00292 int borderWidth = borderSize.x();
00293 int borderHeight = borderSize.y() > 0 ? borderSize.y() : kerSize.x()/2;
00294 imgSize = imgSize - HxSizes(2*borderWidth, 2*borderHeight, 0);
00295 int imgWidth = imgSize.x();
00296 int imgHeight = imgSize.y();
00297 int y, i;
00298
00299 HxPixelAllocator<ArithType> allocator;
00300
00301 ArithType* kernel = allocator.allocate(kerSize.x());
00302
00303 for (i=0; i<kerSize.x(); i++)
00304 kernel[i] = kerPtr.readIncX();
00305
00306 imgPtr.incXYZ(borderWidth, borderHeight, 0);
00307
00308 for (y=0; y<imgHeight+kerSize.x()/2; y++)
00309 {
00310 HxFuncRecGenConv2dK1d_Line_YdirBuf(
00311 imgPtr, imgWidth, kernel, kerSize.x(), pixOp, redOp);
00312 imgPtr.incY();
00313 }
00314 imgPtr.decY(kerSize.x()/2);
00315
00316 for (y=imgHeight-1; y>=0; y--)
00317 {
00318 imgPtr.decY();
00319 HxFuncRecGenConv2dK1d_Line_YdirBufAnti(
00320 imgPtr, imgWidth, kernel, kerSize.x(), pixOp, redOp);
00321 }
00322
00323 allocator.deallocate(kernel);
00324 }
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
Dispatch function for RecGenConv2dK1d (see Global functions for RecGenConv2dK1d) Dispatch is based on dimension and inplace parameters. Assertions:
00345 {
00346 switch (dimension) {
00347 case 1 :
00348 HxFuncRecGenConv2dK1d_XdirSim(imgPtr, kerPtr, dummy, imgSize, borderSize,
00349 kerSize, pixOp, redOp);
00350 break;
00351 case 2 :
00352 if (buffered)
00353 HxFuncRecGenConv2dK1d_YdirBuf(imgPtr, kerPtr, dummy, imgSize, borderSize,
00354 kerSize, pixOp, redOp);
00355 else
00356 HxFuncRecGenConv2dK1d_YdirSim(imgPtr, kerPtr, dummy, imgSize, borderSize,
00357 kerSize, pixOp, redOp);
00358 break;
00359 default :
00360 HxEnvironment::instance()->errorStream()
00361 << "HxFuncRecGenConv2dK1dDispatch: "
00362 << "cannot execute convolution in dimension " << dimension
00363 << STD_ENDL;
00364 HxEnvironment::instance()->flush();
00365 }
00366 }
|
1.2.12 written by Dimitri van Heesch,
© 1997-2001