MeVisLabToolboxReference
|
00001 // **InsertLicense** code 00002 //------------------------------------------------------------------------- 00006 00016 //------------------------------------------------------------------------- 00017 // Prevent multiple including of this file. 00018 #ifndef __mlKernelMacros_H 00019 #define __mlKernelMacros_H 00020 00021 // TODO !!! investigate !!!: (Guenter Ott - 05.04.2004) OK: 00022 // Quite difficult to understand this file. 00023 // Maybe a code-examble as comment without macros would be helpful to understand this file 00024 00025 00026 //---------------------------------------------------------------------------------------------------- 00033 //---------------------------------------------------------------------------------------------------- 00034 #define CALC_ROW_H() \ 00035 protected: \ 00036 virtual void _calcKernelPage(SubImage *outSubImg, \ 00037 int outIndex, \ 00038 SubImage *inSubImgs, \ 00039 int numInSubImgs, \ 00040 MLsoffset *indexTab, \ 00041 size_t indexTabSize, \ 00042 MLsoffset srcVoxelOffset, \ 00043 size_t loopIdx, \ 00044 size_t iteration, \ 00045 const ImageVector &ov1, \ 00046 const ImageVector &ov2, \ 00047 const ImageVector &pOf, \ 00048 size_t numVox); \ 00049 00050 00051 //---------------------------------------------------------------------------------------------------- 00055 //---------------------------------------------------------------------------------------------------- 00056 #define CALC_ROW_CPP(CLASS_NAME, SUPER_CLASS) \ 00057 _CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, ML_IMPLEMENT_SCALAR_CASES, _KERNEL_CASE_CODE) 00058 00059 //---------------------------------------------------------------------------------------------------- 00063 //---------------------------------------------------------------------------------------------------- 00064 #define CALC_ROW_DEFAULT_TYPES_CPP(CLASS_NAME, SUPER_CLASS) \ 00065 _CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, ML_IMPLEMENT_DEFAULT_CASES, _KERNEL_CASE_CODE) 00066 00067 //---------------------------------------------------------------------------------------------------- 00073 //---------------------------------------------------------------------------------------------------- 00074 #define CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, SWITCH_SELECTION) \ 00075 _CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, SWITCH_SELECTION, _KERNEL_CASE_CODE) 00076 00077 //---------------------------------------------------------------------------------------------------- 00081 //---------------------------------------------------------------------------------------------------- 00082 #define CALC_ROW_CPP_EXT(CLASS_NAME, SUPER_CLASS) \ 00083 _CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, ML_IMPLEMENT_SCALAR_CASES, _KERNEL_CASE_CODE_EXT) 00084 00085 //---------------------------------------------------------------------------------------------------- 00089 //---------------------------------------------------------------------------------------------------- 00090 #define CALC_ROW_CPP_EXT_DD(CLASS_NAME, SUPER_CLASS) \ 00091 _CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, ML_IMPLEMENT_SCALAR_CASES, _KERNEL_CASE_CODE_EXT_DD) 00092 00093 //---------------------------------------------------------------------------------------------------- 00100 //---------------------------------------------------------------------------------------------------- 00101 #define CALC_ROW_CPP_ANY_EXT(CLASS_NAME, SUPER_CLASS, SWITCH_SELECTION) \ 00102 _CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, SWITCH_SELECTION, _KERNEL_CASE_CODE_EXT) 00103 00104 00105 00106 //---------------------------------------------------------------------------------------------------- 00110 //---------------------------------------------------------------------------------------------------- 00111 #define CALC_ROW_CPP_SUBIMG(CLASS_NAME, SUPER_CLASS) \ 00112 _CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, ML_IMPLEMENT_SCALAR_CASES, _KERNEL_CASE_CODE_SUBIMG) 00113 00114 //---------------------------------------------------------------------------------------------------- 00120 //---------------------------------------------------------------------------------------------------- 00121 #define CALC_ROW_CPP_ANY_SUBIMG(CLASS_NAME, SUPER_CLASS, SWITCH_SELECTION) \ 00122 _CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, SWITCH_SELECTION, _KERNEL_CASE_CODE_SUBIMG) 00123 00124 //---------------------------------------------------------------------------------------------------- 00128 //---------------------------------------------------------------------------------------------------- 00129 #define CALC_ROW_CPP_SUBIMG_EXT(CLASS_NAME, SUPER_CLASS) \ 00130 _CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, ML_IMPLEMENT_SCALAR_CASES, _KERNEL_CASE_CODE_SUBIMG_EXT) 00131 00132 //---------------------------------------------------------------------------------------------------- 00137 //---------------------------------------------------------------------------------------------------- 00138 #define CALC_ROW_CPP_SUBIMG_EXT_DD(CLASS_NAME, SUPER_CLASS) \ 00139 _CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, ML_IMPLEMENT_SCALAR_CASES, _KERNEL_CASE_CODE_SUBIMG_EXT_DD) 00140 00141 //---------------------------------------------------------------------------------------------------- 00147 //---------------------------------------------------------------------------------------------------- 00148 #define CALC_ROW_CPP_ANY_SUBIMG_EXT(CLASS_NAME, SUPER_CLASS, SWITCH_SELECTION) \ 00149 _CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, SWITCH_SELECTION, _KERNEL_CASE_CODE_SUBIMG_EXT) 00150 00151 00152 00153 00154 00155 00156 00157 00158 //---------------------------------------------------------------------------------------------------- 00159 // 00160 // 00161 // 00162 // 00163 // Now follows PRIVATE Stuff: Do not use! It is subject to change! 00164 // 00165 // 00166 // 00167 // 00168 //---------------------------------------------------------------------------------------------------- 00169 00170 00171 //---------------------------------------------------------------------------------------------------- 00173 //---------------------------------------------------------------------------------------------------- 00174 #define _KERNEL_STD_PARAMS indexTab, indexTabSize, srcVoxelOffset, numVox, \ 00175 rowTab[0], outRowStartPointer, rowStart 00176 00177 //---------------------------------------------------------------------------------------------------- 00179 //---------------------------------------------------------------------------------------------------- 00180 #define _KERNEL_STD_PARAMS_SUBIMG indexTab, indexTabSize, srcVoxelOffset, numVox, \ 00181 typedInTSubImgs[0], typedOutSubImg, rowStart 00182 00183 //---------------------------------------------------------------------------------------------------- 00185 //---------------------------------------------------------------------------------------------------- 00186 #define _KERNEL_EXT_PARAMS indexTab, indexTabSize, srcVoxelOffset, numVox, \ 00187 rowTab, outRowStartPointer, rowStart, \ 00188 outIndex, numInSubImgs, loopIdx, iteration 00189 00190 //---------------------------------------------------------------------------------------------------- 00192 //---------------------------------------------------------------------------------------------------- 00193 #define _KERNEL_EXT_PARAMS_SUBIMG indexTab, indexTabSize, srcVoxelOffset, numVox, \ 00194 typedInTSubImgs, typedOutSubImg, rowStart, \ 00195 outIndex, numInSubImgs, loopIdx, iteration 00196 00197 00198 //---------------------------------------------------------------------------------------------------- 00211 //------------------------------------------------------------------------------------------------------ 00212 #define _CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, TYPE_IMPLEMENTER, CASE_CODE) \ 00213 \ 00214 void CLASS_NAME::_calcKernelPage(SubImage *outSubImg, \ 00215 int outIndex, \ 00216 SubImage *inSubImgs, \ 00217 int numInSubImgs, \ 00218 MLsoffset *indexTab, \ 00219 size_t indexTabSize, \ 00220 MLsoffset srcVoxelOffset, \ 00221 size_t loopIdx, \ 00222 size_t iteration, \ 00223 const ImageVector &ov1, \ 00224 const ImageVector &ov2, \ 00225 const ImageVector &pOf, \ 00226 size_t numVox) \ 00227 { \ 00228 /* Loop and position variables used in inner macros. */ \ 00229 ImageVector p, rowStart; \ 00230 \ 00231 /* Only to avoid warnings if not used by macro. */ \ 00232 loopIdx += 0; \ 00233 iteration += 0; \ 00234 outIndex += 0; \ 00235 \ 00236 switch(outSubImg->getDataType()){ \ 00237 TYPE_IMPLEMENTER(CLASS_NAME, CASE_CODE, OUT_SWITCH_TYPE, \ 00238 "_CALC_ROW_CPP_ANY", INTYPE_DUMMY) \ 00239 ML_IMPLEMENT_DEFAULT_HANDLING("_CALC_ROW_CPP_ANY") \ 00240 } \ 00241 } \ 00242 00243 00244 00245 //---------------------------------------------------------------------------------------------------- 00249 //---------------------------------------------------------------------------------------------------- 00250 template <typename INDTYPE> 00251 void __ML_KERNEL_CASE_CODE_clearAndHandleError(ML_NAMESPACE::TSubImageWithCursor<INDTYPE> *&typedInTSubImgs, 00252 INDTYPE **&rowTab, 00253 bool err, 00254 const char *className) 00255 { 00256 if (err){ 00257 // Print error only if requested. 00258 ML_PRINT_ERROR(className ? className : "__KERNEL_CASE_CODE_SUBIMG", 00259 ML_UNKNOWN_EXCEPTION, 00260 "Unknown exception or out of memory. Returning " 00261 "without calculating output page."); 00262 } 00263 /* Clean up. */ 00264 MLFree(rowTab); 00265 rowTab = NULL; 00266 ML_DELETE_ARRAY(typedInTSubImgs); 00267 } 00268 00269 //---------------------------------------------------------------------------------------------------- 00284 //---------------------------------------------------------------------------------------------------- 00285 #define __KERNEL_CASE_CODE(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME, ADD_PARAMS) \ 00286 { \ 00287 /* Pointer table to row starts in all input subimages. */ \ 00288 IN_DATA_TYPE** rowTab = NULL; \ 00289 \ 00290 /* Create typed versions of the subimages. */ \ 00291 TSubImageWithCursor<OUT_DATA_TYPE > typedOutSubImg(*outSubImg); \ 00292 TSubImageWithCursor<IN_DATA_TYPE > *typedInTSubImgs = NULL; \ 00293 ML_TRY \ 00294 { \ 00295 /* Create a table of typed input subimages. */ \ 00296 ML_CHECK_NEW_TH(typedInTSubImgs, TSubImageWithCursor<IN_DATA_TYPE >[numInSubImgs]); \ 00297 \ 00298 /* Define contents of typed input subimages. */ \ 00299 for (int inIdx=0; inIdx < numInSubImgs; ++inIdx){ \ 00300 typedInTSubImgs[inIdx].setData(inSubImgs[inIdx].getData()); \ 00301 typedInTSubImgs[inIdx].setBox (inSubImgs[inIdx].getBox()); \ 00302 } \ 00303 \ 00304 /* Create a table of input pointers to rows. */ \ 00305 rowTab = static_cast<IN_DATA_TYPE**> \ 00306 (MLAlloc(numInSubImgs*sizeof(IN_DATA_TYPE*), ML_THROW_NO_MEMORY)); \ 00307 \ 00308 /* Loop over all rows of the subimages. */ \ 00309 for (p.u=ov1.u; p.u<=ov2.u; p.u++){ \ 00310 for (p.t=ov1.t; p.t<=ov2.t; p.t++){ \ 00311 for (p.c=ov1.c; p.c<=ov2.c; p.c++){ \ 00312 for (p.z=ov1.z; p.z<=ov2.z; p.z++){ \ 00313 for (p.y=ov1.y; p.y<=ov2.y; p.y++){ \ 00314 /* Set cursors to begin of rows in input and output subimage. */ \ 00315 rowStart.set(ov1.x, p.y, p.z, p.c, p.t, p.u); \ 00316 \ 00317 /* Call the calcRow() method of the module and pass all important information, */ \ 00318 /* especially the pointers to the rows starts in input and output subimages. */ \ 00319 for (int inIdx=0; inIdx < numInSubImgs; ++inIdx){ \ 00320 /* Set subimage cursor to row start and store it in rowStart. */ \ 00321 /* Note that pOf is the position offset passed to _calcKernelPage as argument. */ \ 00322 typedInTSubImgs[inIdx].setCursorImagePosition(rowStart-pOf); \ 00323 rowTab[inIdx] = typedInTSubImgs[inIdx].getCursorPointer(); \ 00324 } \ 00325 \ 00326 /* Set subimage cursor to row start and also set outRowStartPointer to it. */ \ 00327 typedOutSubImg.setCursorImagePosition(rowStart); \ 00328 OUT_DATA_TYPE *outRowStartPointer = typedOutSubImg.getCursorPointer(); \ 00329 \ 00330 /* Pointer table to row starts in all input subimages. */ \ 00331 outRowStartPointer += 0; /* To avoid compiler warnings. */ \ 00332 \ 00333 /* Call the user implemented calcRow function with the specified parameter set. */ \ 00334 calcRow(ADD_PARAMS); \ 00335 } /* y */ \ 00336 } \ 00337 } \ 00338 } \ 00339 } /* u */ \ 00340 \ 00341 /* Clean up without error. */ \ 00342 __ML_KERNEL_CASE_CODE_clearAndHandleError(typedInTSubImgs, rowTab, false, #CLASS_NAME); \ 00343 } \ 00344 ML_CATCH_BLOCK(...){ \ 00345 /* Clean up with error. */ \ 00346 __ML_KERNEL_CASE_CODE_clearAndHandleError(typedInTSubImgs, rowTab, true, #CLASS_NAME); \ 00347 \ 00348 /* Propagate the error to the next exception handler to clean up higher level allocations. */ \ 00349 throw; \ 00350 } \ 00351 } 00352 00353 00354 //---------------------------------------------------------------------------------------------------- 00356 //---------------------------------------------------------------------------------------------------- 00357 #define __KERNEL_CASE_CODE_EXT_DD_HELPER(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME) \ 00358 __KERNEL_CASE_CODE(OUT_DATA_TYPE, IN_DATA_TYPE, OPNAME, _KERNEL_EXT_PARAMS) \ 00359 00360 //---------------------------------------------------------------------------------------------------- 00363 //---------------------------------------------------------------------------------------------------- 00364 #define __KERNEL_CASE_CODE_EXT_DD(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME, ADD_PARAMS) \ 00365 { \ 00366 ML_IMPLEMENT_DIFFERENT_INOUT_DATATYPES_CASES("", \ 00367 __KERNEL_CASE_CODE_EXT_DD_HELPER, \ 00368 inSubImgs->getDataType(), \ 00369 "__KERNEL_CASE_CODE_DD", \ 00370 OUT_DATA_TYPE); \ 00371 \ 00372 } \ 00373 00374 //---------------------------------------------------------------------------------------------------- 00377 //---------------------------------------------------------------------------------------------------- 00378 #define __KERNEL_CASE_CODE_SUBIMG_EXT_DD_HELPER(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME) \ 00379 __KERNEL_CASE_CODE(OUT_DATA_TYPE, IN_DATA_TYPE, OPNAME, _KERNEL_EXT_PARAMS_SUBIMG) \ 00380 00381 //---------------------------------------------------------------------------------------------------- 00385 //---------------------------------------------------------------------------------------------------- 00386 #define __KERNEL_CASE_CODE_SUBIMG_EXT_DD(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME, ADD_PARAMS) \ 00387 { \ 00388 ML_IMPLEMENT_DIFFERENT_SCALAR_INOUT_DATATYPES_CASES("", \ 00389 __KERNEL_CASE_CODE_SUBIMG_EXT_DD_HELPER, \ 00390 inSubImgs->getDataType(), \ 00391 "__KERNEL_CASE_SUBIMG_CODE_DD", \ 00392 OUT_DATA_TYPE); \ 00393 } \ 00394 00395 00396 00397 00398 //---------------------------------------------------------------------------------------------------- 00400 //---------------------------------------------------------------------------------------------------- 00401 #define _KERNEL_CASE_CODE(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME) \ 00402 __KERNEL_CASE_CODE(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME, _KERNEL_STD_PARAMS) 00403 00404 //---------------------------------------------------------------------------------------------------- 00406 //---------------------------------------------------------------------------------------------------- 00407 #define _KERNEL_CASE_CODE_EXT(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME) \ 00408 __KERNEL_CASE_CODE(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME, _KERNEL_EXT_PARAMS) 00409 00410 //---------------------------------------------------------------------------------------------------- 00413 //---------------------------------------------------------------------------------------------------- 00414 #define _KERNEL_CASE_CODE_EXT_DD(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME) \ 00415 __KERNEL_CASE_CODE_EXT_DD(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME, _KERNEL_EXT_PARAMS) 00416 00417 00418 00419 //---------------------------------------------------------------------------------------------------- 00421 //---------------------------------------------------------------------------------------------------- 00422 #define _KERNEL_CASE_CODE_SUBIMG(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME) \ 00423 __KERNEL_CASE_CODE(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME, _KERNEL_STD_PARAMS_SUBIMG) 00424 00425 //---------------------------------------------------------------------------------------------------- 00427 //---------------------------------------------------------------------------------------------------- 00428 #define _KERNEL_CASE_CODE_SUBIMG_EXT(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME) \ 00429 __KERNEL_CASE_CODE(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME, _KERNEL_EXT_PARAMS_SUBIMG) 00430 00431 //---------------------------------------------------------------------------------------------------- 00434 //---------------------------------------------------------------------------------------------------- 00435 #define _KERNEL_CASE_CODE_SUBIMG_EXT_DD(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME) \ 00436 __KERNEL_CASE_CODE_SUBIMG_EXT_DD(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME, _KERNEL_EXT_PARAMS_SUBIMG) 00437 00438 00439 00440 #endif // __mlKernelMacros_H 00441 00442 00443 00444