HMacro.h 74 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501
  1. /*****************************************************************************
  2. * HMacro.h
  3. *****************************************************************************
  4. *
  5. * Project: HALCON/libhalcon
  6. * Description: Definition of macros
  7. *
  8. * (c) 1996-2020 by MVTec Software GmbH
  9. * www.mvtec.com
  10. *
  11. *****************************************************************************/
  12. #ifndef HMACRO_H
  13. #define HMACRO_H
  14. /*
  15. * HALCON traditionally used 'FAST' instead of 'HC_FAST', but that clashes
  16. * with VxWorks.
  17. */
  18. #if !defined(__vxworks) && defined(FAST) && !defined(HC_FAST)
  19. # define HC_FAST
  20. #endif
  21. /*
  22. * If SMALL is defined, file names and line number information should not be
  23. * included in the binary.
  24. */
  25. #ifndef SMALL
  26. # define H__FILE__ __FILE__
  27. # define H__LINE__ __LINE__
  28. #else
  29. # define H__FILE__ ""
  30. # define H__LINE__ -1
  31. #endif
  32. #define HDFImage(VAR,IMAGE_IN,KOOR) { VAR = 0.0; \
  33. switch ((IMAGE_IN)->kind) {\
  34. case BYTE_IMAGE: VAR = (double)(IMAGE_IN)->pixel.b[KOOR]; break;\
  35. case INT1_IMAGE: VAR = (double)(IMAGE_IN)->pixel.i[KOOR]; break;\
  36. case INT2_IMAGE: VAR = (double)(IMAGE_IN)->pixel.s.p[KOOR]; break;\
  37. case UINT2_IMAGE: VAR = (double)(IMAGE_IN)->pixel.u.p[KOOR]; break;\
  38. case DIR_IMAGE: VAR = (double)(IMAGE_IN)->pixel.d[KOOR]; break;\
  39. case CYCLIC_IMAGE: VAR = (double)(IMAGE_IN)->pixel.z[KOOR]; break;\
  40. case INT4_IMAGE: VAR = (double)(IMAGE_IN)->pixel.l[KOOR]; break;\
  41. case INT8_IMAGE: VAR = (double)(IMAGE_IN)->pixel.i8[KOOR]; break;\
  42. case FLOAT_IMAGE: VAR = (double)(IMAGE_IN)->pixel.f[KOOR]; break;\
  43. case COMPLEX_IMAGE: return(H_ERR_WITFO); /* wrong image type */ \
  44. case VF_IMAGE: return(H_ERR_WITFO); /* wrong image type */ \
  45. default: return(H_ERR_NIIT); /* not implemented image type */\
  46. }}
  47. #define HAbsImage(VAR,IMAGE_IN,KOOR) \
  48. switch ((IMAGE_IN)->kind) { \
  49. case BYTE_IMAGE: VAR = ABS((double)(IMAGE_IN)->pixel.b[KOOR]); break; \
  50. default: ; \
  51. }
  52. #define HImageFD(IMAGE_OUT,VAR,KOOR) \
  53. switch ((IMAGE_OUT)->kind) { \
  54. case BYTE_IMAGE: { \
  55. HINT HHH; \
  56. HHH = HIRound(VAR); \
  57. if (HHH > 255) HHH = 255; else if (HHH < 0) HHH = 0; \
  58. (IMAGE_OUT)->pixel.b[KOOR] = (HBYTE)HHH; \
  59. break; } \
  60. case CYCLIC_IMAGE: \
  61. (IMAGE_OUT)->pixel.z[KOOR] = HMOD(HLRound(VAR),(HINT)(UCHAR_MAX+1)); \
  62. break; \
  63. case INT1_IMAGE: { \
  64. HINT HHH; \
  65. HHH = HIRound(VAR); \
  66. if (HHH > INT1_MAX) HHH = INT1_MAX; \
  67. else if (HHH < INT1_MIN) HHH = INT1_MIN; \
  68. (IMAGE_OUT)->pixel.i[KOOR] = (INT1)HHH; \
  69. break; } \
  70. case INT2_IMAGE: { \
  71. double DDD = (VAR); \
  72. if (DDD > (double)INT2_MAX) DDD = INT2_MAX; \
  73. else if (DDD < INT2_MIN) DDD = INT2_MIN; \
  74. (IMAGE_OUT)->pixel.s.p[KOOR] = (INT2)HLRound(DDD); \
  75. break; } \
  76. case UINT2_IMAGE: { \
  77. double DDD = (VAR); \
  78. if (DDD > (double)UINT2_MAX) DDD = UINT2_MAX; \
  79. else if (DDD < 0) DDD = 0; \
  80. (IMAGE_OUT)->pixel.s.p[KOOR] = (UINT2)HLRound(DDD); \
  81. break; } \
  82. case LONG_IMAGE: { \
  83. double DDD = (VAR); \
  84. if (DDD > (double)INT4_MAX) DDD = INT4_MAX; \
  85. else if (DDD < INT4_MIN) DDD = INT4_MIN; \
  86. (IMAGE_OUT)->pixel.l[KOOR] = (INT4)HLRound(DDD); \
  87. break; } \
  88. case INT8_IMAGE: { \
  89. double DDD = (VAR); \
  90. if (DDD > (double)HINT8_MAX) DDD = HINT8_MAX; \
  91. else if (DDD < HINT8_MIN) DDD = HINT8_MIN; \
  92. (IMAGE_OUT)->pixel.i8[KOOR] = (HINT8)HI8Round(DDD); \
  93. break; } \
  94. case FLOAT_IMAGE: { \
  95. double DDD = (VAR); \
  96. if (DDD > (double)FLT_MAX) DDD = FLT_MAX; \
  97. else if (DDD < -(double)FLT_MAX) DDD = -(double)FLT_MAX; \
  98. (IMAGE_OUT)->pixel.f[KOOR] = (float)DDD; \
  99. break; } \
  100. case COMPLEX_IMAGE: { \
  101. double DDD = (VAR); \
  102. if (DDD > (double)FLT_MAX) DDD = FLT_MAX; \
  103. else if (DDD < -(double)FLT_MAX) DDD = -(double)FLT_MAX; \
  104. (IMAGE_OUT)->pixel.c[KOOR].re = (float)DDD; \
  105. (IMAGE_OUT)->pixel.c[KOOR].im = (float)0.0; \
  106. break; } \
  107. case DIR_IMAGE: return(H_ERR_WITFO); \
  108. case VF_IMAGE: return(H_ERR_WITFO); /* wrong image type */ \
  109. default: return(H_ERR_NIIT); /* not implemented image type */ \
  110. }
  111. #define HCkFilterSize(IMAGE_WIDTH,IMAGE_HEIGHT,FILTER_WIDTH,FILTER_HEIGHT) \
  112. if(((IMAGE_WIDTH) < ((FILTER_WIDTH)>>1)+1) || \
  113. ((IMAGE_HEIGHT) < ((FILTER_HEIGHT)>>1)+1)) \
  114. return(H_ERR_FSEIS);
  115. #define HCkFilterSize_2(IMAGE_WIDTH,IMAGE_HEIGHT, \
  116. FILTER_WIDTH_2, FILTER_HEIGHT_2) \
  117. if(((IMAGE_WIDTH) < (FILTER_WIDTH_2)+1) || \
  118. ((IMAGE_HEIGHT) < (FILTER_HEIGHT_2)+1)) \
  119. return(H_ERR_FSEIS);
  120. #define DIST(PIX,PIX2,ABSDIF,IMAGE_IN_KIND) \
  121. switch (IMAGE_IN_KIND) { \
  122. case BYTE_IMAGE: \
  123. case LONG_IMAGE: \
  124. case INT8_IMAGE: \
  125. case INT1_IMAGE: \
  126. case INT2_IMAGE: \
  127. case UINT2_IMAGE: \
  128. case FLOAT_IMAGE: \
  129. ABSDIF = ABS((PIX)-(PIX2)); \
  130. break; \
  131. case CYCLIC_IMAGE: \
  132. { double dmax,dmaxh; \
  133. dmax = (double)UCHAR_MAX + 1.; \
  134. dmaxh = (double)(int)(dmax/2.); \
  135. ABSDIF = ABS((PIX)-(PIX2)); \
  136. if ((ABSDIF) > dmaxh) ABSDIF = dmax - (ABSDIF); \
  137. } \
  138. break; \
  139. case DIR_IMAGE: \
  140. if ((PIX) > 200. || (PIX2) > 200.) ABSDIF = (double)UCHAR_MAX; \
  141. else \
  142. { ABSDIF = ABS((PIX)-(PIX2)); \
  143. if ((ABSDIF) > 90.) ABSDIF = 181. - (ABSDIF); \
  144. } \
  145. break; \
  146. default: return(H_ERR_NIIT); \
  147. }
  148. #define HiType2iIDX(iTYPE,iIDX) \
  149. switch (iTYPE) \
  150. { \
  151. case UNDEF_IMAGE: \
  152. iIDX = iUNDEF; \
  153. break; \
  154. case BYTE_IMAGE: \
  155. iIDX = iBYTE; \
  156. break; \
  157. case INT4_IMAGE: \
  158. iIDX = iINT4; \
  159. break; \
  160. case FLOAT_IMAGE: \
  161. iIDX = iFLOAT; \
  162. break; \
  163. case DIR_IMAGE: \
  164. iIDX = iDIR; \
  165. break; \
  166. case CYCLIC_IMAGE: \
  167. iIDX = iCYCLIC; \
  168. break; \
  169. case INT1_IMAGE: \
  170. iIDX = iINT1; \
  171. break; \
  172. case COMPLEX_IMAGE: \
  173. iIDX = iCOMPLEX; \
  174. break; \
  175. case INT2_IMAGE: \
  176. iIDX = iINT2; \
  177. break; \
  178. case UINT2_IMAGE: \
  179. iIDX = iUINT2; \
  180. break; \
  181. case VF_IMAGE: \
  182. iIDX = iVF; \
  183. break; \
  184. default: \
  185. iIDX = UNDEF_IMAGE; \
  186. break; \
  187. }
  188. #define HMOD(VAL,VALMAX) (((VAL) < 0) ? \
  189. ((unsigned char)(((VALMAX) - (-(VAL) % (VALMAX))) % (VALMAX))) :\
  190. ((unsigned char)((VAL) % (VALMAX))))
  191. /* Grauwertkomponente eines Graubildes */
  192. #define IMAGE_INDEX 1
  193. #define HBitImageSize(WIDTH,HEIGHT) (size_t)((HIMGCNT)WIDTH*HEIGHT/8+1)
  194. #define WarningCompl(Proc) \
  195. (void)printf("warning: is_compl not yet full implemented (%s)\n",Proc)
  196. /*****************************************************************************
  197. * Routines for freeing and reallocating "permanent","local", or "temporary"
  198. * memory.
  199. *****************************************************************************/
  200. #ifndef _LIntStatic
  201. # define HFreeGeneral(PROC_HANDLE,VOID_PTR) \
  202. (HTraceMemory ? \
  203. HXFreeGeneralMemCheck(PROC_HANDLE, (void*)VOID_PTR, \
  204. H__FILE__,(INT4_8)H__LINE__): \
  205. HXFreeGeneral(PROC_HANDLE,(void*)VOID_PTR) )
  206. #else
  207. /* in case of static language interfaces, do not use HTraceMemory to allow
  208. * delayed loading */
  209. # define HFreeGeneral(PROC_HANDLE,VOID_PTR) \
  210. HXFreeGeneral(PROC_HANDLE,(void*)VOID_PTR)
  211. #endif
  212. #define HReallocGeneral(PROC_HANDLE,VOID_PTR,SIZE,NEW_PTR) \
  213. HXReallocGeneral(PROC_HANDLE,(void*)(VOID_PTR),SIZE,(void*)(NEW_PTR), \
  214. H__FILE__, (INT4_8)H__LINE__)
  215. #define HFreeRLGeneral(PROC_HANDLE,REGION) \
  216. HXFreeRLGeneral(PROC_HANDLE,REGION,H__FILE__,(INT4_8)H__LINE__)
  217. #define HReallocRLNumGeneral(PROC_HANDLE,REGION,SIZE,NEW_REGION) \
  218. HXReallocRLNumGeneral(PROC_HANDLE,REGION,SIZE,NEW_REGION, \
  219. H__FILE__,(INT4_8)H__LINE__)
  220. /*****************************************************************************
  221. * Routines for allocating "permanent" memory from the heap. This memory is
  222. * _not_ freed automatically after each call to a HALCON operator.
  223. *****************************************************************************/
  224. #ifndef _LIntStatic
  225. # define HAlloc(PROC_HANDLE,SIZE,VOID_PTR) \
  226. (HTraceMemory ? \
  227. HXAllocMemCheck(PROC_HANDLE,SIZE,H__FILE__,(INT4_8)H__LINE__, \
  228. H_GLOBAL_ALLOC,(void*)(VOID_PTR)): \
  229. HXAlloc(PROC_HANDLE,SIZE,(void*)(VOID_PTR)))
  230. #else
  231. /* in case of static language interfaces, do not use HTraceMemory to allow
  232. * delayed loading */
  233. # define HAlloc(PROC_HANDLE,SIZE,VOID_PTR) \
  234. HXAlloc(PROC_HANDLE,SIZE,(void*)(VOID_PTR))
  235. #endif
  236. #define HIsAligned(VOID_PTR,ALIGNMENT) (((UINT4_8)ptr & (ALIGNMENT-1)) == 0)
  237. #ifndef _LIntStatic
  238. # define HAllocAlign(PROC_HANDLE,SIZE,ALIGNMENT,VOID_PTR) \
  239. (HTraceMemory ? \
  240. HXAllocAlignMemCheck(PROC_HANDLE,SIZE,ALIGNMENT,H__FILE__, \
  241. (INT4_8)H__LINE__,H_GLOBAL_ALLOC, \
  242. (void*)(VOID_PTR)): \
  243. HXAllocAlign(PROC_HANDLE,SIZE,ALIGNMENT,(void*)(VOID_PTR)))
  244. #else
  245. /* in case of static language interfaces, do not use HTraceMemory to allow
  246. * delayed loading */
  247. # define HAllocAlign(PROC_HANDLE,SIZE,ALIGNMENT,VOID_PTR) \
  248. HXAllocAlign(PROC_HANDLE,SIZE,ALIGNMENT,(void*)(VOID_PTR))
  249. #endif
  250. #define HRealloc(PROC_HANDLE,VOID_PTR,SIZE,NEW_PTR) \
  251. HXRealloc(PROC_HANDLE,(void*)(VOID_PTR),SIZE,(void*)(NEW_PTR), \
  252. H__FILE__,(INT4_8)H__LINE__)
  253. #define HReallocToGlobal(PROC_HANDLE,VOID_PTR,SIZE,NEW_PTR) \
  254. HXReallocToGlobal(PROC_HANDLE,(void*)(VOID_PTR),SIZE,(void*)(NEW_PTR),\
  255. H__FILE__, (INT4_8)H__LINE__)
  256. #ifndef _LIntStatic
  257. # define HFree(PROC_HANDLE,VOID_PTR) \
  258. (HTraceMemory ? \
  259. HXFreeMemCheck(PROC_HANDLE,(void*)(VOID_PTR), \
  260. H__FILE__,(INT4_8)H__LINE__): \
  261. HXFree(PROC_HANDLE,(void*)(VOID_PTR)))
  262. #else
  263. /* in case of static language interfaces, do not use HTraceMemory to allow
  264. * delayed loading */
  265. # define HFree(PROC_HANDLE,VOID_PTR) \
  266. HXFree(PROC_HANDLE,(void*)(VOID_PTR))
  267. #endif
  268. #define HAllocRLNum(PROC_HANDLE,REGION,SIZE) \
  269. HXAllocRLNum(PROC_HANDLE,REGION,SIZE,H__FILE__,(INT4_8)H__LINE__)
  270. #define HReallocRLNum(PROC_HANDLE,REGION,SIZE,NEW_REGION) \
  271. HXReallocRLNum(PROC_HANDLE,REGION,SIZE,NEW_REGION,H__FILE__, \
  272. (INT4_8)H__LINE__)
  273. #define HReallocRLNumToGlobal(PROC_HANDLE,REGION,SIZE,NEW_REGION) \
  274. HXReallocRLNumToGlobal(PROC_HANDLE,REGION,SIZE,NEW_REGION, \
  275. H__FILE__,(INT4_8)H__LINE__)
  276. #define HAllocRL(PROC_HANDLE,REGION) \
  277. HXAllocRL(PROC_HANDLE,REGION,H__FILE__,(INT4_8)H__LINE__)
  278. #define HFreeRL(PROC_HANDLE,REGION) \
  279. HXFreeRL(PROC_HANDLE,REGION,H__FILE__,(INT4_8)H__LINE__)
  280. /*****************************************************************************
  281. * Routines for allocating temporary memory from a "stack" of memory. This
  282. * memory is freed automatically after each call to a HALCON operator.
  283. *****************************************************************************/
  284. #define HAllocTmp(PROC_HANDLE,PTR,SIZE) \
  285. HXAllocTmp(PROC_HANDLE,(void*)(PTR),SIZE,H__FILE__,(INT4_8)H__LINE__)
  286. #define HAllocTmpAlign(PROC_HANDLE,PTR,SIZE,ALIGNMENT) \
  287. HXAllocTmpAlign(PROC_HANDLE,(void*)(PTR),SIZE,ALIGNMENT, \
  288. H__FILE__,(INT4_8)H__LINE__)
  289. #define HAllocDomainImageTmp(PROC_HANDLE,MEM_PTR,IMAGE_PTR,REGION, \
  290. WIDTH,HEIGHT,BYTE_PER_PIXEL, \
  291. BORDER_ROWS,BORDER_BYTES) \
  292. HXAllocDomainImageTmp(PROC_HANDLE,(void*)(MEM_PTR),(void*)(IMAGE_PTR),\
  293. REGION, \
  294. WIDTH,HEIGHT,BYTE_PER_PIXEL, \
  295. BORDER_ROWS,BORDER_BYTES, \
  296. H__FILE__,(INT4_8)H__LINE__)
  297. #define HFreeTmp(PROC_HANDLE,VOID_PTR) \
  298. HXFreeTmp(PROC_HANDLE,(void*)(VOID_PTR),H__FILE__,(INT4_8)H__LINE__)
  299. #define HFreeNTmp(PROC_HANDLE,NUM) \
  300. HXFreeNTmp(PROC_HANDLE,NUM,H__FILE__,(INT4_8)H__LINE__)
  301. #define HFreeAllTmp(PROC_HANDLE) \
  302. HXFreeAllTmp(PROC_HANDLE,H__FILE__,(INT4_8)H__LINE__)
  303. #define HFreeUpToTmp(PROC_HANDLE,VOID_PTR) \
  304. HXFreeUpToTmp(PROC_HANDLE,(void*)(VOID_PTR),H__FILE__,(INT4_8)H__LINE__)
  305. #define HFreeUpToTmpExcl(PROC_HANDLE,VOID_PTR) \
  306. HXFreeUpToTmpExcl(PROC_HANDLE,(void*)(VOID_PTR),H__FILE__,(INT4_8)H__LINE__)
  307. #define HAllocRLNumTmp(PROC_HANDLE,REGION,SIZE) \
  308. HXAllocRLNumTmp(PROC_HANDLE,REGION,SIZE,H__FILE__,(INT4_8)H__LINE__)
  309. #define HAllocRLTmp(PROC_HANDLE,REGION) \
  310. HXAllocRLTmp(PROC_HANDLE,REGION,H__FILE__,(INT4_8)H__LINE__)
  311. #define HFreeRLTmp(PROC_HANDLE,REGION) \
  312. HXFreeRLTmp(PROC_HANDLE,REGION,H__FILE__,(INT4_8)H__LINE__)
  313. #define HTestTmp(PROC_HANDLE,VOID_PTR) \
  314. HXTestTmp(PROC_HANDLE,VOID_PTR,H__FILE__,(INT4_8)H__LINE__,TRUE)
  315. #define HTestPtr(VOID_PTR) \
  316. HXTestPtr(VOID_PTR,H__FILE__,(INT4_8)H__LINE__)
  317. #define HTestAllTmp(VOID_PTR) \
  318. HXTestAllTmp(VOID_PTR,H__FILE__,(INT4_8)H__LINE__)
  319. /*****************************************************************************
  320. * Routines for allocating temporary memory from the heap. This memory is
  321. * freed automatically after each call to a HALCON operator.
  322. *****************************************************************************/
  323. #define HAllocLocal(PROC_HANDLE,SIZE,VOID_PTR) \
  324. HXAllocLocal(PROC_HANDLE,SIZE,H__FILE__,(INT4_8)H__LINE__,(void*)(VOID_PTR))
  325. /*
  326. * HAllocLocalGC: Operator local, garbage collecting mermory allocation. In
  327. * comparison to HAllocLocal, HAllocLocalGC does not prompt low error messages
  328. * when freeing memory if HDoLowErrors and HTraceMemory are turned on.
  329. */
  330. #define HAllocLocalGC(PROC_HANDLE, SIZE, VOID_PTR) \
  331. HXAllocLocalGC(PROC_HANDLE,SIZE,H__FILE__,(INT4_8)H__LINE__,(void*)(VOID_PTR))
  332. #define HAllocLocalAlign(PROC_HANDLE,SIZE,ALIGNMENT,VOID_PTR) \
  333. HXAllocLocalAlign(PROC_HANDLE,SIZE,ALIGNMENT,H__FILE__,(INT4_8)H__LINE__, \
  334. (void*)(VOID_PTR))
  335. #define HReallocLocal(PROC_HANDLE,VOID_PTR,SIZE,NEW_PTR) \
  336. HXReallocLocal(PROC_HANDLE,(void*)(VOID_PTR),SIZE,(void*)(NEW_PTR), \
  337. H__FILE__,(INT4_8)H__LINE__)
  338. #define HFreeLocal(PROC_HANDLE,VOID_PTR) \
  339. HXFreeLocal(PROC_HANDLE,(void*)(VOID_PTR),H__FILE__,(INT4_8)H__LINE__)
  340. #define HAllocRLNumLocal(PROC_HANDLE,REGION,SIZE) \
  341. HXAllocRLNumLocal(PROC_HANDLE,REGION,SIZE,H__FILE__,(INT4_8)H__LINE__)
  342. #define HReallocRLNumLocal(PROC_HANDLE,REGION,SIZE,NEW_REGION) \
  343. HXReallocRLNumLocal(PROC_HANDLE,REGION,SIZE,NEW_REGION, \
  344. H__FILE__,(INT4_8)H__LINE__)
  345. #define HAllocRLLocal(PROC_HANDLE,REGION) \
  346. HXAllocRLLocal(PROC_HANDLE,REGION,H__FILE__,(INT4_8)H__LINE__)
  347. #define HFreeRLLocal(PROC_HANDLE,REGION) \
  348. HXFreeRLLocal(PROC_HANDLE,REGION,H__FILE__,(INT4_8)H__LINE__)
  349. #ifndef ABS
  350. # define ABS(A) (((A) >= 0) ? (A) : (-(A)))
  351. #endif
  352. /* Umwandlung Bogenmass in Grad und zurueck */
  353. #define RadToDeg(x) (double)(x) * 57.295779513082
  354. #define DegToRad(x) (double)(x) / 57.295779513082
  355. #define HIRound(Val) (((Val) < 0.0) ? ((HINT)((Val)-0.5)):((HINT)((Val)+0.5)))
  356. #define HI4Round(Val) (((Val) < 0.0) ? ((INT4)((Val)-0.5)):((INT4)((Val)+0.5)))
  357. #define HLRound(Val) (((Val) < 0.0) ? ((INT4_8)((Val)-0.5)): \
  358. ((INT4_8)((Val)+0.5)))
  359. #define HI8Round(Val) (((Val) < 0.0) ? ((HINT8)((Val)-0.5)): \
  360. ((HINT8)((Val)+0.5)))
  361. #define HIMGCOORRound(Val) (((Val) < 0.0) ? ((HIMGCOOR)((Val)-0.5)): \
  362. ((HIMGCOOR)((Val)+0.5)))
  363. #define HFIRound(Val) (((Val)<0.0f)?((HINT)((Val)-0.5f)):((HINT)((Val)+0.5f)))
  364. /*
  365. * Edge handling for images by mirroring.
  366. *
  367. * IMPORTANT: 'width' and 'height' are assumed to be defined for any code
  368. * using these macros
  369. */
  370. #define BR(ROW) (((ROW) < 0) ? (-(ROW)) : \
  371. (((ROW) >= height) ? (height-(ROW)+height-2) : \
  372. (ROW)))
  373. #define BC(COL) (((COL) < 0) ? (-(COL)) : \
  374. (((COL) >= width) ? (width - (COL) + width - 2) : \
  375. (COL)))
  376. /*
  377. * Optimized variants of the BR and BC macros above when the bound to check
  378. * against (upper or lower) is known by the caller.
  379. */
  380. #define BRL(ROW) (((ROW) < 0) ? -(ROW) : (ROW))
  381. #define BRU(ROW) (((ROW) >= height) ? (height-(ROW)+height-2) : (ROW))
  382. #define BCL(COL) (((COL) < 0) ? -(COL) : (COL))
  383. #define BCU(COL) (((COL) >= width) ? (width-(COL)+width-2) : (COL))
  384. /* Hrlregion */
  385. #define HRLReset(RL) \
  386. { \
  387. (RL)->feature.def.all = 0; \
  388. (RL)->feature.shape = 0; \
  389. (RL)->is_compl = FALSE; \
  390. (RL)->num = 0; \
  391. (RL)->rl = (Hrun*)(((HBYTE*)(void*)&(RL)->rl)+sizeof((RL)->rl)); \
  392. }
  393. #define HRLSize(NumRuns) ((size_t)((NumRuns) * sizeof(Hrun) + \
  394. (sizeof(Hrlregion))))
  395. /* Binaerbild */
  396. #define HTestBit(D,P) ((D)[(P)>>3] & (1<<(7-((P)&7))))
  397. #define HDelBit(D,P) (D)[(P)>>3] &= (UINT1)(~(1<<(7-((P)&7))))
  398. #define HSetBit(D,P) (D)[(P)>>3] |= (UINT1)(1<<(7-((P)&7)))
  399. /* Koordinaten */
  400. #define HLinCoor(L,C,W) (((INT4_8)(L)*(INT4_8)(W))+(INT4_8)(C))
  401. #define HXLinCoor(L,C,W) HLinCoor(L,C,W)
  402. #define HCol(K,W) (HIMGCOOR)(((K) % (W)))
  403. #define HRow(K,W) (HIMGCOOR)(((K) / (W)))
  404. #define CB(RL,I,W) HLinCoor((RL)[I].l,(RL)[I].cb,W)
  405. #define CE(RL,I,W) HLinCoor((RL)[I].l,(RL)[I].ce,W)
  406. #define FLinCoor(R,C,H) ((C)*(H)+(R))
  407. /* misc */
  408. #ifndef SGN
  409. #define SGN(X) (((X)==0)?0:(((X)>0)?1:(-1)))
  410. #endif
  411. #ifndef ODD
  412. #define ODD(X) ((X) % 2)
  413. #endif
  414. #ifndef EVEN
  415. #define EVEN(X) (!((X)%2))
  416. #endif
  417. #ifndef MIN
  418. #define MIN(X,Y) (((X)>(Y))?(Y):(X))
  419. #endif
  420. #ifndef MAX
  421. #define MAX(X,Y) (((X)>(Y))?(X):(Y))
  422. #endif
  423. #define DToINT4_8(Val) ((Val)<(double)INT4_8_MIN?INT4_8_MIN: \
  424. ((Val)<INT_4_8_MAXDOUBLE?(INT4_8)(Val): \
  425. (((INT4_8_MIN==(INT4_8)(Val))&&((Val)>0))?INT4_8_MAX: \
  426. ((INT4_8)(Val)))))
  427. #define DToINT4(Val) ((INT4)MIN((double)INT4_MAX,MAX((double)INT4_MIN,(Val))))
  428. #define DToINT2(Val) ((INT2)MIN((double)INT2_MAX,MAX((double)INT2_MIN,(Val))))
  429. #define DToINT(Val) ((HINT)MIN((double)INT_MAX,MAX((double)INT_MIN,(Val))))
  430. #define HInsideImage(R,C,WIDTH,HEIGHT) \
  431. ((((R)>=0) && ((C)>=0) && ((R)<(HEIGHT)) && ((C)<(WIDTH)))?TRUE:FALSE)
  432. #if !defined HCkP
  433. # if !defined(NO_SPY) && !defined(HC_FAST)
  434. # define HCkP(Proc) \
  435. XHCkP(Proc)
  436. # define XHCkP(Proc) \
  437. do{ \
  438. Herror _H_ERR; \
  439. Herror _H_ERR_P; \
  440. if (IOGetSpyProcCallSwitch()) \
  441. IOSpyProcCall(#Proc,__LINE__,__FILE__); \
  442. if ( HIsError(_H_ERR = (Proc))) \
  443. { \
  444. if( HIsError(_H_ERR_P = HProcessErr(#Proc,_H_ERR,__LINE__,__FILE__))) \
  445. return(_H_ERR_P); \
  446. return(_H_ERR); \
  447. } \
  448. } while(0)
  449. # else
  450. # define HCkP(Proc) \
  451. XHCkP(Proc)
  452. # define XHCkP(Proc) \
  453. do { \
  454. Herror _H_ERR; \
  455. if (HIsError(_H_ERR = (Proc))) \
  456. { \
  457. return(_H_ERR); \
  458. } \
  459. } while(0)
  460. # endif
  461. #endif /* if not defined HCkP */
  462. #if !defined(NO_SPY) && !defined(HC_FAST)
  463. # define HCkPCloseFile(Proc,File) \
  464. XHCkPCloseFile(Proc,File)
  465. # define XHCkPCloseFile(Proc,File) \
  466. do { \
  467. Herror ERR; \
  468. Herror H_ERR_P; \
  469. if (IOGetSpyProcCallSwitch()) \
  470. IOSpyProcCall(#Proc,__LINE__,__FILE__); \
  471. if ((ERR = (Proc)) != H_MSG_OK) \
  472. { \
  473. fclose(File); \
  474. if( (H_ERR_P = HProcessErr(#Proc,ERR,__LINE__,__FILE__)) != H_MSG_OK) \
  475. return(H_ERR_P); \
  476. return(ERR); \
  477. } \
  478. } while(0)
  479. #else
  480. # define HCkPCloseFile(Proc,File) \
  481. XHCkPCloseFile(Proc,File)
  482. # define XHCkPCloseFile(Proc,File) \
  483. do { \
  484. Herror ERR; \
  485. if ((ERR = (Proc)) != H_MSG_OK) \
  486. { \
  487. fclose(File); \
  488. return(ERR); \
  489. } \
  490. } while(0)
  491. #endif
  492. #if !defined(NO_SPY) && !defined(HC_FAST)
  493. #define HCkPasync(Proc,GapingFlag,ComplFlag,ErrFlag) \
  494. do { \
  495. Herror ERR,H_ERR_P; \
  496. if(IOGetSpyProcCallSwitch()) \
  497. IOSpyProcCall(#Proc,__LINE__,__FILE__); \
  498. if( (ERR = Proc) != H_MSG_OK) \
  499. { \
  500. if( (H_ERR_P = HProcessErr(#Proc,ERR,__LINE__,__FILE__)) != H_MSG_OK) \
  501. { \
  502. if(GapingFlag == FALSE) \
  503. { \
  504. *ErrFlag = H_ERR_P; \
  505. *ComplFlag = TRUE; \
  506. } \
  507. return(H_ERR_P); \
  508. } \
  509. if(GapingFlag == FALSE) \
  510. { \
  511. *ErrFlag = ERR; \
  512. *ComplFlag = TRUE; \
  513. } \
  514. return(ERR); \
  515. } \
  516. } while(0)
  517. #else
  518. #define HCkPasync(Proc,GapingFlag,ComplFlag,ErrFlag) \
  519. do { \
  520. Herror ERR; \
  521. if( (ERR = Proc) != H_MSG_OK) \
  522. { \
  523. if(GapingFlag == FALSE) \
  524. { \
  525. *ErrFlag = ERR; \
  526. *ComplFlag = TRUE; \
  527. } \
  528. return(ERR); \
  529. } \
  530. } while(0)
  531. #endif
  532. #define HCkE(ERR) XHCkE(ERR)
  533. #if defined(HC_FAST) || defined (NO_SPY)
  534. #define XHCkE(ERR) {if (ERR != H_MSG_OK) return(ERR);}
  535. #else
  536. #define XHCkE(ERR) \
  537. do { \
  538. if (ERR != H_MSG_OK) \
  539. { \
  540. if (IOGetSpyProcCallSwitch()) \
  541. (void)HProcessErr("-",ERR,__LINE__,__FILE__); \
  542. return(ERR); \
  543. } \
  544. } while(0)
  545. #endif
  546. #define HCkPME(ERR,PROC) XHCkPME(ERR,PROC)
  547. #if defined(HC_FAST) || defined (NO_SPY)
  548. #define XHCkPME(ERR,PROC) \
  549. do { \
  550. Herror _terr; \
  551. if (H_MSG_OK!=(_terr=(PROC))) (ERR)=_terr; \
  552. } while(0)
  553. #else
  554. #define XHCkPME(ERR,PROC) \
  555. { Herror _terr; \
  556. if (H_MSG_OK!=(_terr=(PROC))) \
  557. { \
  558. if (IOGetSpyProcCallSwitch()) \
  559. (void)HProcessErr("-",ERR,__LINE__,__FILE__); \
  560. (ERR)=_terr; \
  561. } \
  562. }
  563. #endif
  564. #define HCkNoObj(PROC_HANDLE) \
  565. do { \
  566. HBOOL BOOL_PTR; \
  567. if ((HNoInpObj(PROC_HANDLE, &BOOL_PTR) != H_MSG_OK) || \
  568. (BOOL_PTR == TRUE)) \
  569. { \
  570. Herror N_OBJ_RESULT; \
  571. HReadGV(PROC_HANDLE,HGNoObjResult,&N_OBJ_RESULT); \
  572. return(N_OBJ_RESULT); \
  573. } \
  574. } while(0)
  575. #define HCkSingleInputObj(PROC_HANDLE, OBJ_NUM) \
  576. HCkP(HPCheckSingleInputObject(PROC_HANDLE, OBJ_NUM))
  577. #define HCkOnlySqr(width,height) \
  578. if (!HIs2Pot(width) || (!HIs2Pot(height))) return(H_ERR_NPOT)
  579. #define HIsError(ERR) ((ERR) != H_MSG_OK)
  580. #define HIsMessage(ERR) ((ERR) == H_MSG_OK)
  581. #ifdef HC_FAST
  582. #define HCkRL(PROC_HANDLE,RL,PROC,IN_OUT)
  583. #else
  584. #define HCkRL(PROC_HANDLE,RL,PROC,IN_OUT) \
  585. do { \
  586. Herror H_ERR_RL; \
  587. INT4 CHECK_F; \
  588. HReadGV(PROC_HANDLE,HGcheck,&CHECK_F); \
  589. if (CHECK_F & CHECK_CHORD) \
  590. { \
  591. H_ERR_RL = HRLTest(PROC_HANDLE,RL,FALSE); \
  592. if (H_ERR_RL != H_MSG_OK) \
  593. { \
  594. (void)fprintf(stderr,"runlength error (%s) %s: #%u\n", \
  595. IN_OUT,PROC,H_ERR_RL); \
  596. (void)fprintf(stderr,"runlength data dump in file: <<%s>>\n",RL_DUMP); \
  597. HCkP(HRLDump(PROC_HANDLE,RL,RL_DUMP)); \
  598. return(H_ERR_RL); \
  599. } \
  600. } \
  601. } while(0)
  602. #endif
  603. #define LongToNet(L,N) \
  604. { \
  605. unsigned char *HH; HH = (unsigned char*)&(N); \
  606. HH[0] = ((L) >> 24) & 255; \
  607. HH[1] = ((L) >> 16) & 255; \
  608. HH[2] = ((L) >> 8) & 255; \
  609. HH[3] = (L) & 255; \
  610. }
  611. #define NetToLong(N,L) \
  612. { \
  613. unsigned char *HH; \
  614. HH = (unsigned char*)&(N); \
  615. L = ((INT4)(HH[0]) << 24) | \
  616. ((INT4)(HH[1]) << 16) | \
  617. ((INT4)(HH[2]) << 8) | \
  618. ((INT4)(HH[3])); \
  619. }
  620. #define ShortToNet(S,N) \
  621. { \
  622. unsigned char *HH; HH = (unsigned char*)&(N); \
  623. HH[0] = ((S) >> 8) & 255; \
  624. HH[1] = (S) & 255; \
  625. }
  626. #define NetToShort(N,S) \
  627. { \
  628. unsigned char *HH; HH = (unsigned char*)&(N); \
  629. S = ((short)(HH[0]) << 8) | \
  630. ((short)(HH[1])); \
  631. }
  632. #define HAllocStringMem(PROC_HANDLE,SIZE) \
  633. HCkP(HPAllocStringMem(PROC_HANDLE,(size_t)SIZE))
  634. /* macros for accessing input ctrl parameters
  635. * - without copying
  636. * - with type and/or number check
  637. *===========================================================================*/
  638. #define HGetCParNum(PROC_HANDLE,Par,Num) {Herror ERR; \
  639. ERR = HPGetCParNum(PROC_HANDLE,Par,Num); \
  640. if (ERR != H_MSG_OK) return(ERR); }
  641. #if !defined(NO_SPY) && !defined(SMALL)
  642. # define HGetPElemL(PROC_HANDLE,PAR,CONVERT,ELEM,N) \
  643. do{ \
  644. Herror _ERR; \
  645. _ERR = HPGetPElemL(PROC_HANDLE,PAR,CONVERT,ELEM,N); \
  646. if (_ERR != H_MSG_OK) return(_ERR); \
  647. _ERR = IOSpyElem(PROC_HANDLE,PAR,*(INT4_8**)(ELEM),*(INT4_8*)(N), \
  648. LONG_PAR,TRUE); \
  649. if (_ERR != H_MSG_OK) return(_ERR); \
  650. }while(0)
  651. #else
  652. # define HGetPElemL(PROC_HANDLE,PAR,CONVERT,ELEM,N) \
  653. HCkP( HPGetPElemL(PROC_HANDLE,PAR,CONVERT,ELEM,N) )
  654. #endif
  655. #if !defined(NO_SPY) && !defined(SMALL)
  656. # define HGetPElemD(PROC_HANDLE,PAR,CONVERT,ELEM,N) \
  657. do{ \
  658. Herror _ERR; \
  659. _ERR = HPGetPElemD(PROC_HANDLE,PAR,CONVERT,ELEM,N); \
  660. if (_ERR != H_MSG_OK) return(_ERR); \
  661. _ERR = IOSpyElem(PROC_HANDLE,PAR,*(double**)(ELEM),*(INT4_8*)(N), \
  662. DOUBLE_PAR,TRUE); \
  663. if (_ERR != H_MSG_OK) return(_ERR); \
  664. }while(0)
  665. #else
  666. # define HGetPElemD(PROC_HANDLE,PAR,CONVERT,ELEM,N) \
  667. HCkP( HPGetPElemD(PROC_HANDLE,PAR,CONVERT,ELEM,N) )
  668. #endif
  669. #if !defined(NO_SPY) && !defined(SMALL)
  670. # define HGetPElemS(PROC_HANDLE,PAR,CONVERT,ELEM,N) \
  671. do{ \
  672. Herror _ERR; \
  673. _ERR = HPGetPElemS(PROC_HANDLE,PAR,CONVERT,ELEM,N); \
  674. if (_ERR != H_MSG_OK) return(_ERR); \
  675. _ERR = IOSpyElem(PROC_HANDLE,PAR,*(char***)(ELEM),*(INT4_8*)(N), \
  676. STRING_PAR,TRUE); \
  677. if (_ERR != H_MSG_OK) return(_ERR); \
  678. }while(0)
  679. #else
  680. # define HGetPElemS(PROC_HANDLE,PAR,CONVERT,ELEM,N) \
  681. HCkP( HPGetPElemS(PROC_HANDLE,PAR,CONVERT,ELEM,N) )
  682. #endif
  683. /* Retrives a single handle from an input parameter */
  684. #define HGetCElemH1(PROC_HANDLE, PAR, HTYPE, ELEM) \
  685. HCkP(HPGetPElemH(PROC_HANDLE, PAR, HTYPE, 1, (void **)ELEM, NULL, FALSE))
  686. /* Retrives all handles from an input parameter. The returned array contains
  687. * pointers to the data stored in the handles. It is freed automatically
  688. * when the operator finishes. */
  689. #define HGetCElemH(PROC_HANDLE, PAR, HTYPE, ELEM, N) \
  690. HCkP(HPGetPElemH(PROC_HANDLE, PAR, HTYPE, -1, (void **)ELEM, N, TRUE))
  691. /* Retrives given number of handles from an input parameter. The returned array
  692. * contains pointers to the data stored in the handles. It is freed
  693. * automatically when the operator finishes. */
  694. #define HGetCElemHN(PROC_HANDLE, PAR, HTYPE, N, ELEM) \
  695. HCkP(HPGetPElemH(PROC_HANDLE, PAR, HTYPE, N, ELEM, TRUE))
  696. #if !defined(NO_SPY) && !defined(SMALL)
  697. # define HGetPElem(PROC_HANDLE,PAR,ELEM,N,TYPE) \
  698. do{ \
  699. Herror _ERR; \
  700. HPGetPElem(PROC_HANDLE,PAR,ELEM,N,TYPE); \
  701. _ERR = IOSpyElem(PROC_HANDLE,PAR,*(void**)(ELEM),*(INT4_8*)(N), \
  702. *(HINT*)(TYPE),TRUE); \
  703. if (_ERR != H_MSG_OK) return(_ERR); \
  704. }while(0)
  705. #else
  706. # define HGetPElem(PROC_HANDLE,PAR,ELEM,N,TYPE) \
  707. HPGetPElem(PROC_HANDLE,PAR,ELEM,N,TYPE)
  708. #endif
  709. #if !defined(NO_SPY) && !defined(SMALL)
  710. # define HGetElemL(PROC_HANDLE,PAR,CONVERT,MEM_TYPE,ELEM,N) \
  711. do{ \
  712. Herror _ERR; \
  713. _ERR = HPGetElemL(PROC_HANDLE,PAR,CONVERT,MEM_TYPE,ELEM,N); \
  714. if (_ERR != H_MSG_OK) return(_ERR); \
  715. _ERR = IOSpyElem(PROC_HANDLE,PAR,*(INT4_8**)(ELEM),*(INT4_8*)(N), \
  716. LONG_PAR,TRUE); \
  717. if (_ERR != H_MSG_OK) return(_ERR); \
  718. }while(0)
  719. #else
  720. # define HGetElemL(PROC_HANDLE,PAR,CONVERT,MEM_TYPE,ELEM,N) \
  721. HCkP( HPGetElemL(PROC_HANDLE,PAR,CONVERT,MEM_TYPE,ELEM,N) )
  722. #endif
  723. #if !defined(NO_SPY) && !defined(SMALL)
  724. # define HGetElemD(PROC_HANDLE,PAR,CONVERT,MEM_TYPE,ELEM,N) \
  725. do{ \
  726. Herror _ERR; \
  727. _ERR = HPGetElemD(PROC_HANDLE,PAR,CONVERT,MEM_TYPE,ELEM,N); \
  728. if (_ERR != H_MSG_OK) return(_ERR); \
  729. _ERR = IOSpyElem(PROC_HANDLE,PAR,*(double**)(ELEM),*(INT4_8*)(N), \
  730. DOUBLE_PAR,TRUE); \
  731. if (_ERR != H_MSG_OK) return(_ERR); \
  732. }while(0)
  733. #else
  734. # define HGetElemD(PROC_HANDLE,PAR,CONVERT,MEM_TYPE,ELEM,N) \
  735. HCkP( HPGetElemD(PROC_HANDLE,PAR,CONVERT,MEM_TYPE,ELEM,N) )
  736. #endif
  737. #if !defined(NO_SPY) && !defined(SMALL)
  738. # define HGetElemS(PROC_HANDLE,PAR,CONVERT,MEM_TYPE,ELEM,N) \
  739. do{ \
  740. Herror _ERR; \
  741. _ERR = HPGetElemS(PROC_HANDLE,PAR,CONVERT,MEM_TYPE,ELEM,N); \
  742. if (_ERR != H_MSG_OK) return(_ERR); \
  743. _ERR = IOSpyElem(PROC_HANDLE,PAR,*(char***)(ELEM),*(INT4_8*)(N), \
  744. STRING_PAR,TRUE); \
  745. if (_ERR != H_MSG_OK) return(_ERR); \
  746. }while(0)
  747. #else
  748. # define HGetElemS(PROC_HANDLE,PAR,CONVERT,MEM_TYPE,ELEM,N) \
  749. HCkP( HPGetElemS(PROC_HANDLE,PAR,CONVERT,MEM_TYPE,ELEM,N) )
  750. #endif
  751. #if !defined(NO_SPY) && !defined(SMALL)
  752. # define HCopyElemL(PROC_HANDLE,PAR,CONVERT,ELEM,N) \
  753. do{ \
  754. Herror _ERR; \
  755. _ERR = HPCopyElemL(PROC_HANDLE,PAR,CONVERT,ELEM,N); \
  756. if (_ERR != H_MSG_OK) return(_ERR); \
  757. _ERR = IOSpyElem(PROC_HANDLE,PAR,ELEM,*(INT4_8*)(N),LONG_PAR,TRUE); \
  758. if (_ERR != H_MSG_OK) return(_ERR); \
  759. }while(0)
  760. #else
  761. # define HCopyElemL(PROC_HANDLE,PAR,CONVERT,ELEM,N) \
  762. HCkP( HPCopyElemL(PROC_HANDLE,PAR,CONVERT,ELEM,N) )
  763. #endif
  764. #if !defined(NO_SPY) && !defined(SMALL)
  765. # define HCopyElemD(PROC_HANDLE,PAR,CONVERT,ELEM,N) \
  766. do{ \
  767. Herror _ERR; \
  768. _ERR = HPCopyElemD(PROC_HANDLE,PAR,CONVERT,ELEM,N); \
  769. if (_ERR != H_MSG_OK) return(_ERR); \
  770. _ERR = IOSpyElem(PROC_HANDLE,PAR,ELEM,*(INT4_8*)(N),DOUBLE_PAR, \
  771. TRUE); \
  772. if (_ERR != H_MSG_OK) return(_ERR); \
  773. }while(0)
  774. #else
  775. # define HCopyElemD(PROC_HANDLE,PAR,CONVERT,ELEM,N) \
  776. HCkP( HPCopyElemD(PROC_HANDLE,PAR,CONVERT,ELEM,N) )
  777. #endif
  778. /*
  779. * Note: since there is no easy way to implement the SPY functionality
  780. * for HCopyElemF, we don't bother.
  781. */
  782. # define HCopyElemF(PROC_HANDLE,PAR,CONVERT,ELEM,N) \
  783. HCkP( HPCopyElemF(PROC_HANDLE,PAR,CONVERT,ELEM,N) )
  784. /* HGetPParN:
  785. * specify the exact number of the read parameter (any type)
  786. *---------------------------------------------------------------------------*/
  787. #if !defined(NO_SPY) && !defined(SMALL)
  788. # define HGetPParN(PROC_HANDLE,PAR,NUM,VAL) { \
  789. INT4_8 _NUM; \
  790. Herror ERR = HPGetPPar(PROC_HANDLE,PAR,VAL,&_NUM); \
  791. if (ERR != H_MSG_OK) return ERR; \
  792. if (NUM != _NUM) return (H_ERR_WIPN1-1)+(PAR); \
  793. ERR = IOSpyCPar(PROC_HANDLE,PAR,*VAL,_NUM,TRUE); \
  794. if (ERR != H_MSG_OK) return ERR; }
  795. #else
  796. # define HGetPParN(PROC_HANDLE,PAR,NUM,VAL) { \
  797. INT4_8 _NUM; \
  798. Herror ERR = HPGetPPar(PROC_HANDLE,PAR,VAL,&_NUM); \
  799. if (ERR != H_MSG_OK) return ERR; \
  800. if (NUM != _NUM) return (H_ERR_WIPN1-1)+(PAR); }
  801. #endif
  802. /* HGetPParMM:
  803. * the value number of the read parameter is expected to be within a
  804. * certain range
  805. *---------------------------------------------------------------------------*/
  806. #if !defined(NO_SPY) && !defined(SMALL)
  807. # define HGetPParMM(PROC_HANDLE,PAR,MIN,MAX,VAL,NUM) { \
  808. Herror ERR = HPGetPPar(PROC_HANDLE,PAR,VAL,NUM); \
  809. if (ERR != H_MSG_OK) return ERR; \
  810. if (*NUM < MIN || *NUM > MAX) return (H_ERR_WIPN1-1)+(PAR); \
  811. ERR = IOSpyCPar(PROC_HANDLE,PAR,*VAL,*(NUM),TRUE); \
  812. if (ERR != H_MSG_OK) return ERR; }
  813. #else
  814. # define HGetPParMM(PROC_HANDLE,PAR,MIN,MAX,VAL,NUM) { \
  815. Herror ERR = HPGetPPar(PROC_HANDLE,PAR,VAL,NUM); \
  816. if (ERR != H_MSG_OK) return ERR; \
  817. if (*NUM < MIN || *NUM > MAX) return (H_ERR_WIPN1-1)+(PAR); }
  818. #endif
  819. /* HGetPParT:
  820. * specify the expected type(s) of the read parameter
  821. *---------------------------------------------------------------------------*/
  822. #if !defined(NO_SPY) && !defined(SMALL)
  823. # define HGetPParT(PROC_HANDLE,PAR,TYPE,VAL,NUM) { \
  824. INT4_8 _IDX; \
  825. Herror ERR = HPGetPPar(PROC_HANDLE,PAR,VAL,NUM); \
  826. if (ERR != H_MSG_OK) return ERR; \
  827. for (_IDX=0; _IDX<*(NUM); _IDX++) \
  828. if (((TYPE) & (*(VAL))[_IDX].type) == 0) return (H_ERR_WIPT1-1)+(PAR); \
  829. ERR = IOSpyCPar(PROC_HANDLE,PAR,*(VAL),*(NUM),TRUE); \
  830. if (ERR != H_MSG_OK) return ERR; }
  831. #else
  832. # define HGetPParT(PROC_HANDLE,PAR,TYPE,VAL,NUM) { \
  833. INT4_8 _IDX; \
  834. Herror ERR = HPGetPPar(PROC_HANDLE,PAR,VAL,NUM); \
  835. if (ERR != H_MSG_OK) return ERR; \
  836. for (_IDX=0; _IDX<*(NUM); _IDX++) \
  837. if (((TYPE) & (*(VAL))[_IDX].type) == 0) return (H_ERR_WIPT1-1)+(PAR); }
  838. #endif
  839. /* HGetPParTN:
  840. * specify the exact number and the expected type(s) of the read parameter
  841. *---------------------------------------------------------------------------*/
  842. #if !defined(NO_SPY) && !defined(SMALL)
  843. # define HGetPParTN(PROC_HANDLE,PAR,TYPE,NUM,VAL) { \
  844. INT4_8 _IDX, _NUM; \
  845. Herror ERR = HPGetPPar(PROC_HANDLE,PAR,VAL,&_NUM); \
  846. if (ERR != H_MSG_OK) return ERR; \
  847. if ((NUM) != _NUM) return (H_ERR_WIPN1-1)+(PAR); \
  848. for (_IDX=0; _IDX<_NUM; _IDX++) \
  849. if (((TYPE) & (*(VAL))[_IDX].type) == 0) return (H_ERR_WIPT1-1)+(PAR); \
  850. ERR = IOSpyCPar(PROC_HANDLE,PAR,*(VAL),_NUM,TRUE); \
  851. if (ERR != H_MSG_OK) return ERR; }
  852. #else
  853. # define HGetPParTN(PROC_HANDLE,PAR,TYPE,NUM,VAL) { \
  854. INT4_8 _IDX, _NUM; \
  855. Herror ERR = HPGetPPar(PROC_HANDLE,PAR,VAL,&_NUM); \
  856. if (ERR != H_MSG_OK) return ERR; \
  857. if ((NUM) != _NUM) return (H_ERR_WIPN1-1)+(PAR); \
  858. for (_IDX=0; _IDX<_NUM; _IDX++) \
  859. if (((TYPE) & (*(VAL))[_IDX].type) == 0) return (H_ERR_WIPT1-1)+(PAR); }
  860. #endif
  861. /* HGetPParTMM:
  862. * specify a range for the number of the read parameters as well as
  863. * the expected type(s)
  864. *---------------------------------------------------------------------------*/
  865. #if !defined(NO_SPY) && !defined(SMALL)
  866. # define HGetPParTMM(PROC_HANDLE,PAR,TYPE,MIN,MAX,VAL,NUM) { \
  867. INT4_8 _IDX; \
  868. Herror ERR = HPGetPPar(PROC_HANDLE,PAR,VAL,NUM); \
  869. if (ERR != H_MSG_OK) return ERR; \
  870. if (*(NUM) < MIN || *(NUM) > MAX) return (H_ERR_WIPN1-1)+(PAR); \
  871. for (_IDX=0; _IDX<*(NUM); _IDX++) \
  872. if (((TYPE) & (*(VAL))[_IDX].type) == 0) return (H_ERR_WIPT1-1)+(PAR); \
  873. ERR = IOSpyCPar(PROC_HANDLE,PAR,*(VAL),*(NUM),TRUE); \
  874. if (ERR != H_MSG_OK) return ERR; }
  875. #else
  876. # define HGetPParTMM(PROC_HANDLE,PAR,TYPE,MIN,MAX,VAL,NUM) { \
  877. INT4_8 _IDX; \
  878. Herror ERR = HPGetPPar(PROC_HANDLE,PAR,VAL,NUM); \
  879. if (ERR != H_MSG_OK) return ERR; \
  880. if (*(NUM) < MIN || *(NUM) > MAX) return (H_ERR_WIPN1-1)+(PAR); \
  881. for (_IDX=0; _IDX<*(NUM); _IDX++) \
  882. if (((TYPE) & (*(VAL))[_IDX].type) == 0) return (H_ERR_WIPT1-1)+(PAR); }
  883. #endif
  884. #if !defined(NO_SPY) && !defined(SMALL)
  885. # define HGetPPar(PROC_HANDLE,P,V,N) {Herror ERR; \
  886. ERR = HPGetPPar(PROC_HANDLE,P,V,N); \
  887. if (ERR != H_MSG_OK) return(ERR); \
  888. ERR = IOSpyCPar(PROC_HANDLE,P,*V,*N,TRUE); \
  889. if (ERR != H_MSG_OK) return(ERR); }
  890. #else
  891. # define HGetPPar(PROC_HANDLE,P,V,N) {Herror ERR; \
  892. ERR = HPGetPPar(PROC_HANDLE,P,V,N); \
  893. if (ERR != H_MSG_OK) return(ERR); }
  894. #endif
  895. #if !defined(NO_SPY) && !defined(SMALL)
  896. # define HGetPar(PROC_HANDLE,Par,Kind,Val,Num) {Herror ERR; \
  897. ERR = HPGetPar(PROC_HANDLE,Par,ANY_ELEM,Kind,Val,(INT4_8)0, \
  898. (INT4_8)10000000,Num); \
  899. if (ERR != H_MSG_OK) return(ERR); \
  900. ERR = IOSpyCPar(PROC_HANDLE,Index,Val,*(Num),TRUE); \
  901. if (ERR != H_MSG_OK) return(ERR); }
  902. #else
  903. # define HGetPar(Par,Kind,Val,Num) {Herror ERR; \
  904. ERR = HPGetPar(Par,ANY_ELEM,Kind,Val,(INT4_8)0, \
  905. (INT4_8)10000000,Num); \
  906. if (ERR != H_MSG_OK) return(ERR); }
  907. #endif
  908. #if !defined(NO_SPY) && !defined(SMALL)
  909. # define HGetSPar(PROC_HANDLE,Index,Type,Val,N) {INT4_8 _HN; Herror ERR; \
  910. ERR = HPGetCPar(PROC_HANDLE,Index,Type,Val,(INT4_8)(N),(INT4_8)(N),&_HN); \
  911. if (ERR != H_MSG_OK) return(ERR); \
  912. ERR = IOSpyCPar(PROC_HANDLE,Index,Val,_HN,TRUE); \
  913. if (ERR != H_MSG_OK) return(ERR); }
  914. #else
  915. # define HGetSPar(PROC_HANDLE,Index,Type,Val,N) {INT4_8 _HN; Herror ERR; \
  916. ERR = HPGetCPar(PROC_HANDLE,Index,Type,Val,(INT4_8)(N),(INT4_8)(N),&_HN); \
  917. if (ERR != H_MSG_OK) return(ERR); }
  918. #endif
  919. #if !defined(NO_SPY) && !defined(SMALL)
  920. # define HGetCPar(PROC_HANDLE,Index,InpType,Val,Min,Max,ResNum) {Herror ERR; \
  921. ERR = HPGetCPar(PROC_HANDLE,Index,InpType,Val,(INT4_8)(Min), \
  922. (INT4_8)(Max),ResNum); \
  923. if (ERR != H_MSG_OK) return(ERR); \
  924. ERR = IOSpyCPar(PROC_HANDLE,Index,Val,(INT4_8)*ResNum,TRUE); \
  925. if (ERR != H_MSG_OK) return(ERR); }
  926. #else
  927. # define HGetCPar(PROC_HANDLE,Index,InpType,Val,Min,Max,ResNum) {Herror ERR; \
  928. ERR = HPGetCPar(PROC_HANDLE,Index,InpType,Val,(INT4_8)(Min), \
  929. (INT4_8)(Max),ResNum); \
  930. if (ERR != H_MSG_OK) return(ERR); }
  931. #endif
  932. #if !defined(NO_SPY) && !defined(SMALL)
  933. # define HGetFPar(PROC_HANDLE,Index,Type,Val,Num) \
  934. { \
  935. int _HT; INT4_8 _HN; Herror ERR; \
  936. ERR = HPGetPar(PROC_HANDLE,Index,Type,&_HT,Val,(INT4_8)(Num), \
  937. (INT4_8)(Num),&_HN); \
  938. if (ERR != H_MSG_OK) return(ERR); \
  939. ERR = IOSpyPar(PROC_HANDLE,Index,_HT,Val,_HN,TRUE); \
  940. if (ERR != H_MSG_OK) return(ERR); \
  941. }
  942. #else
  943. # define HGetFPar(PROC_HANDLE,Index,Type,Val,Num) \
  944. { \
  945. int _HT; INT4_8 _HN; Herror ERR; \
  946. ERR = HPGetPar(PROC_HANDLE,Index,Type,&_HT,Val,(INT4_8)(Num), \
  947. (INT4_8)(Num),&_HN); \
  948. if (ERR != H_MSG_OK) return(ERR); \
  949. }
  950. #endif
  951. #if !defined(NO_SPY) && !defined(SMALL)
  952. # define HGetEPar(PROC_HANDLE,Index,InpType,ResType,Val,Min,Max,Num) \
  953. { \
  954. Herror ERR; \
  955. ERR = HPGetPar(PROC_HANDLE,Index,InpType,ResType,Val,(INT4_8)(Min), \
  956. (INT4_8)(Max),Num); \
  957. if (ERR != H_MSG_OK) return(ERR); \
  958. ERR = IOSpyPar(PROC_HANDLE,Index,*ResType,Val,(INT4_8)*Num,TRUE); \
  959. if (ERR != H_MSG_OK) return(ERR); \
  960. }
  961. #else
  962. # define HGetEPar(PROC_HANDLE,Index,InpType,ResType,Val,Min,Max,Num) \
  963. { \
  964. Herror ERR; \
  965. ERR = HPGetPar(PROC_HANDLE,Index,InpType,ResType,Val,(INT4_8)(Min), \
  966. (INT4_8)(Max),Num); \
  967. if (ERR != H_MSG_OK) return(ERR); \
  968. }
  969. #endif
  970. /* macros for accessing ctrl output parameters
  971. *===========================================================================*/
  972. #define HPutPElem(PROC_HANDLE,PAR,ELEM,NUM,TYPE) \
  973. do{ \
  974. HCkP( HPPutPElem(PROC_HANDLE,PAR,ELEM,NUM,TYPE)); \
  975. } while(0)
  976. #define HPutElem(PROC_HANDLE,PAR,ELEM,NUM,TYPE) \
  977. do{ \
  978. HCkP( HPPutElem(PROC_HANDLE,PAR,ELEM,NUM,TYPE)); \
  979. } while(0)
  980. #if !defined(NO_SPY) && !defined(SMALL)
  981. # define HPutPar(PROC_HANDLE,P,K,V,N) {Herror ERR; \
  982. ERR = IOSpyPar(PROC_HANDLE,P,K,V,(INT4_8)(N),FALSE); \
  983. if (ERR != H_MSG_OK) return(ERR); \
  984. ERR = HPPutPar(PROC_HANDLE,P,K,V,(INT4_8)(N)); \
  985. if (ERR != H_MSG_OK) return(ERR); }
  986. #else
  987. # define HPutPar(PROC_HANDLE,P,K,V,N) {Herror ERR; \
  988. ERR = HPPutPar(PROC_HANDLE,P,K,V,(INT4_8)(N)); \
  989. if (ERR != H_MSG_OK) return(ERR); }
  990. #endif
  991. #if !defined(NO_SPY) && !defined(SMALL)
  992. # define HPutCPar(PROC_HANDLE,P,V,N) {Herror ERR; \
  993. ERR = IOSpyCPar(PROC_HANDLE,P,V,(INT4_8)N,FALSE); \
  994. if (ERR != H_MSG_OK) return(ERR); \
  995. ERR = HPPutCPar(PROC_HANDLE,P,V,(INT4_8)(N)); \
  996. if (ERR != H_MSG_OK) return(ERR); }
  997. #else
  998. # define HPutCPar(PROC_HANDLE,P,V,N) {Herror ERR; \
  999. ERR = HPPutCPar(PROC_HANDLE,P,V,(INT4_8)(N)); \
  1000. if (ERR != H_MSG_OK) return(ERR); }
  1001. #endif
  1002. #if !defined(NO_SPY) && !defined(SMALL)
  1003. # define HPutPPar(PROC_HANDLE,P,V,N) {Herror ERR; \
  1004. ERR = IOSpyCPar(PROC_HANDLE,P,V,(INT4_8)N,FALSE); \
  1005. if (ERR != H_MSG_OK) return(ERR); \
  1006. ERR = HPPutPPar(PROC_HANDLE,P,V,N); \
  1007. if (ERR != H_MSG_OK) return(ERR); }
  1008. #else
  1009. # define HPutPPar(PROC_HANDLE,P,V,N) {Herror ERR; \
  1010. ERR = HPPutPPar(PROC_HANDLE,P,V,N); \
  1011. if (ERR != H_MSG_OK) return(ERR); }
  1012. #endif
  1013. /* Write NUM handle references in the output control PAR.
  1014. * HANDLETYPE is the type of the corresponding handles (const HhandleInfo*).
  1015. * ELEM points to an array that holds NUM elements.
  1016. *
  1017. * IMPORTANT: The output control variable gains ownership of all pointers that
  1018. * are in ELEM. When aborting an operator with an error,
  1019. * those values MUST NOT be cleared inside the operator's code,
  1020. * but will be cleared automatically when cleaning the output
  1021. * control variable.
  1022. */
  1023. #define HPutElemH(PROC_HANDLE, PAR, ELEM, NUM, HANDLETYPE) \
  1024. do \
  1025. { \
  1026. HCkP(HPPutElemH(PROC_HANDLE, PAR, ELEM, NUM, HANDLETYPE)); \
  1027. } while (0)
  1028. /* Allocates one handle in the output control parameter PAR.
  1029. * HANDLETYPE is the type of the corresponding handles (const HhandleInfo*).
  1030. * ELEM is modified to point to where the new tool can be allocated.
  1031. *
  1032. * IMPORTANT: The output control variable gains ownership of the pointer in
  1033. * ELEM. When aborting an operator with an error,
  1034. * the value MUST NOT be cleared inside the operator's code,
  1035. * but will be cleared automatically when cleaning the output
  1036. * control variable.
  1037. */
  1038. #define HAllocOutputHandle(PROC_HANDLE, PAR, ELEM, HANDLETYPE) \
  1039. HXAllocOutputHandle(PROC_HANDLE, PAR, (void ***)ELEM, HANDLETYPE)
  1040. /* macros for accessing iconic object parameters
  1041. *===========================================================================*/
  1042. #define HNumOfChannels(PROC_HANDLE,OBJ,NUM) \
  1043. HCkP(HPNumOfChannels(PROC_HANDLE,(HINT)1, \
  1044. (INT4_8)OBJ,NUM))
  1045. #define HAllObj(PROC_HANDLE,VAR,Hkey,I) \
  1046. I=0; \
  1047. while ((HCheckInpObjNum(PROC_HANDLE,VAR,I+1) == TRUE) && \
  1048. (HPGetObj(PROC_HANDLE,VAR,(INT4_8)++I, &Hkey) == H_MSG_OK) && \
  1049. (Hkey != H_UNDEFINED))
  1050. #define HAllOutpObj(PROC_HANDLE,VAR,Hkey,I) \
  1051. I=0; \
  1052. while ((HCheckOutpObjNum(PROC_HANDLE,VAR,I+1) == TRUE) && \
  1053. (HPGetOutpObj(PROC_HANDLE,VAR,(INT4_8)++I, &Hkey) == H_MSG_OK) && \
  1054. (Hkey != H_UNDEFINED))
  1055. #define HAllSegm(PROC_HANDLE,RL,IMAGES,MAX_CHANNELS,I) \
  1056. I=0; \
  1057. while ((HCheckInpObjNum(PROC_HANDLE,1,I+1) == TRUE) && \
  1058. (HPAllSegm(PROC_HANDLE,(INT4_8)++I,RL,IMAGES,MAX_CHANNELS) == H_MSG_OK))
  1059. #define HAllReg(PROC_HANDLE,RL,I) \
  1060. I=0; \
  1061. while ((HCheckInpObjNum(PROC_HANDLE,1,I+1) == TRUE) && \
  1062. (HPAllReg(PROC_HANDLE,(INT4_8)++I,RL) == H_MSG_OK))
  1063. #define HAllFilter(PROC_HANDLE,RL,IMA_IN,IMA_OUT,MAX_CHANNELS,I) \
  1064. I=0; \
  1065. while ((HCheckInpObjNum(PROC_HANDLE,1,I+1) == TRUE) && \
  1066. (HPAllFilter(PROC_HANDLE,(INT4_8)++I,RL,IMA_IN,IMA_OUT,MAX_CHANNELS) == H_MSG_OK))
  1067. #define HAllComp(PROC_HANDLE,OBJ_IN,IM_IN_KEY,IM_IN,INDEX) \
  1068. HPGetComp(PROC_HANDLE,OBJ_IN,IMAGE_INDEX,&IM_IN_KEY); \
  1069. if (IM_IN_KEY == H_UNDEFINED) return(H_ERR_AUDI); \
  1070. for(INDEX = IMAGE_INDEX; \
  1071. (HPGetComp(PROC_HANDLE,OBJ_IN,INDEX,&IM_IN_KEY) == H_MSG_OK) && \
  1072. (IM_IN_KEY != H_UNDEFINED) && \
  1073. HPGetImage(PROC_HANDLE,IM_IN_KEY,&IM_IN) == H_MSG_OK; \
  1074. INDEX++)
  1075. #define HIfFirstComp(INDEX) if(INDEX == IMAGE_INDEX)
  1076. #define HAllFilter2(PROC_HANDLE,RL,IMA_IN1,IMA_IN2,IMA_OUT,MAX_CHANNELS,I) \
  1077. I=0; \
  1078. while ((HCheckInpObjNum(PROC_HANDLE,1,I+1) == TRUE) && \
  1079. (HPAllFilter2(PROC_HANDLE,(INT4_8)++I,RL,IMA_IN1,IMA_IN2,IMA_OUT,MAX_CHANNELS) == H_MSG_OK))
  1080. #define HGetFRL(PROC_HANDLE,Key,region) \
  1081. HCkP(HPGetFRL(PROC_HANDLE,Key,region))
  1082. #define HGetRL(PROC_HANDLE,Key,region) \
  1083. HCkP(HPGetRL(PROC_HANDLE,Key,region))
  1084. #define HGetFDRL(PROC_HANDLE,Key,region) \
  1085. HCkP(HPGetFDRL(PROC_HANDLE,Key,region))
  1086. #define HGetDRL(PROC_HANDLE,Key,region) \
  1087. HCkP(HPGetDRL(PROC_HANDLE,Key,region))
  1088. #define HGetURL(PROC_HANDLE,Par,region) \
  1089. HCkP(HPGetURL(PROC_HANDLE,Par,region))
  1090. #define HGetImage(PROC_HANDLE,Key,Image) \
  1091. HCkP(HPGetImage(PROC_HANDLE,Key,Image))
  1092. #define HGetImageInfo(PROC_HANDLE,Key,Image) \
  1093. HCkP(HP0GetCDImage(PROC_HANDLE,Key,Image))
  1094. #define HGetDImage(PROC_HANDLE,Key,Comp,Image) \
  1095. HCkP(HPGetDImage(PROC_HANDLE,Key,Comp,Image))
  1096. #define HDelObj(PROC_HANDLE,Key) HCkP(HPDelObj(PROC_HANDLE,Key))
  1097. #define HNewRegion(PROC_HANDLE,RL) HCkP(HPNewRegion(PROC_HANDLE,RL))
  1098. #define HPushRegion(PROC_HANDLE,RL) HCkP(HPPushRegion(PROC_HANDLE,RL))
  1099. #define HPushGlobalRegion(PROC_HANDLE,RL) \
  1100. HCkP(HPPushGlobalRegion(PROC_HANDLE,RL))
  1101. #define HDupObj(PROC_HANDLE,INDEX) HCkP(HPDupObj(PROC_HANDLE,INDEX))
  1102. #define HPutDRL(PROC_HANDLE,Key,RL,KEY_PTR) \
  1103. HCkP(HPPutDRL(PROC_HANDLE,Key,RL,KEY_PTR));
  1104. #define HPutPRLComp(PROC_HANDLE,ObjKey,RL,KEY_PTR) \
  1105. HCkP(HPPutPRLComp(PROC_HANDLE,ObjKey,RL,KEY_PTR));
  1106. #define HPutRect(PROC_HANDLE,Key,W,H) HCkP(HPPutRect(PROC_HANDLE,Key,W,H));
  1107. #define HPutImage(PROC_HANDLE,Image,Copy,KEY_PTR) \
  1108. HCkP(HPPutImage(PROC_HANDLE,Image,Copy,KEY_PTR));
  1109. #define HPutDImage(PROC_HANDLE,Key,Comp,Image,Copy,KEY_PTR) \
  1110. HCkP(HPPutDImage(PROC_HANDLE,Key,Comp,Image,Copy,KEY_PTR));
  1111. #define HDefObj(PROC_HANDLE,Obj,Key,Comp) \
  1112. HCkP(HPDefObj(PROC_HANDLE,Obj,Key,Comp));
  1113. #define HCrObj(PROC_HANDLE,Par,KEY_PTR) HCkP(HPCrObj(PROC_HANDLE,Par,KEY_PTR));
  1114. #define HCopyObj(PROC_HANDLE,Key,Par,KEY_PTR) \
  1115. HCkP(HPCopyObj(PROC_HANDLE,Key,Par,KEY_PTR));
  1116. #define HGetObj(PROC_HANDLE,Par,Num,KEY_PTR) \
  1117. HCkP(HPGetObj(PROC_HANDLE,Par,(INT4_8)Num,KEY_PTR));
  1118. #define HGetObjNum(PROC_HANDLE,Par,Num) \
  1119. HCkP(HPGetObjNum(PROC_HANDLE,Par,Num));
  1120. #define HGetComp(PROC_HANDLE,Obj,CompId,Id) \
  1121. HCkP(HPGetComp(PROC_HANDLE,Obj,CompId,Id));
  1122. #define HGetXLD(PROC_HANDLE,DBKEY,TYPE,XLD) \
  1123. { \
  1124. HINT TMP_TYPE; HINT NUM_USES; Hkey *USES; \
  1125. HCkP(HPGetXLD(PROC_HANDLE,DBKEY,&TMP_TYPE,XLD,&USES,&NUM_USES)); \
  1126. if (TYPE != TMP_TYPE) return(H_ERR_XLDWT); \
  1127. }
  1128. #define HGetSXLD(PROC_HANDLE,DBKEY,TYPE,XLD) \
  1129. { \
  1130. HINT NUM_USES; Hkey *USES; \
  1131. HCkP(HPGetXLD(PROC_HANDLE,DBKEY,TYPE,XLD,&USES,&NUM_USES)); \
  1132. }
  1133. #define HCrXLD(PROC_HANDLE,PAR,XLD,TYPE,USES,NUM_USES,FREE,KEY_PTR) \
  1134. HCkP(HPCrXLD(PROC_HANDLE,PAR,XLD,TYPE,USES,NUM_USES,FREE,KEY_PTR));
  1135. /* -------- Makros for accessing HALCON operator context information ------- */
  1136. /* write a global context Variable ('normal' variable) */
  1137. #define HWriteGV(ProcHandle,Element,Value) \
  1138. HCkP(HAccessGlVar(ProcHandle,Element,GV_WRITE_INFO,NULL,(double)Value,(char *)NULL,(Hkey)NULL,0))
  1139. /* write a global context Variable ('normal' variable) with index */
  1140. #define HWriteGVI(ProcHandle,Element,Value,Index) \
  1141. HCkP(HAccessGlVar(ProcHandle,Element,GV_WRITE_INFO,NULL,(double)Value,(char *)NULL,(Hkey)NULL,Index))
  1142. /* write a global context Variable (String) */
  1143. #define HWriteGVS(ProcHandle,Element,String) \
  1144. HCkP(HAccessGlVar(ProcHandle,Element,GV_WRITE_INFO,NULL,(double)0,String,(Hkey)NULL,0))
  1145. /* write a global context variable (String in element of Array) */
  1146. #define HWriteGVSA(ProcHandle,Element,String,Index) \
  1147. HCkP(HAccessGlVar(ProcHandle,Element,GV_WRITE_INFO,NULL,(double)0,String,(Hkey)NULL,Index))
  1148. /* write a global context variable (HALCON object Key in element of Array) */
  1149. #define HWriteGVKA(ProcHandle,Element,Key,Index) \
  1150. HCkP(HAccessGlVar(ProcHandle,Element,GV_WRITE_INFO,NULL,(double)0,(char *)NULL,Key,Index))
  1151. /* write a global context variable (Pointer in element of Array) */
  1152. #define HWriteGVPA(ProcHandle,Element,Pointer,Index) \
  1153. HCkP(HAccessGlVar(ProcHandle,Element,GV_WRITE_INFO,Pointer,(double)0,(char *)NULL,NULL,Index))
  1154. /* write a global context variable (element of Array) */
  1155. #define HWriteGVA(ProcHandle,Element,Value,Index) \
  1156. HCkP(HAccessGlVar(ProcHandle,Element,GV_WRITE_INFO,NULL,(double)Value,(char *)NULL,(Hkey)NULL,Index))
  1157. /* write a global context Variable ('normal' variable); force changement of */
  1158. /* the corresponding reference version */
  1159. #define HWriteGVR(ProcHandle,Element,Value) \
  1160. HCkP(HAccessGlVar(ProcHandle,Element,GV_WRITE_REF,NULL,(double)Value,(char *)NULL,(Hkey)NULL,0))
  1161. /* write a global context Variable ('normal' variable) with index; */
  1162. /* force changement of the corresponding reference version */
  1163. #define HWriteGVRI(ProcHandle,Element,Value,Index) \
  1164. HCkP(HAccessGlVar(ProcHandle,Element,GV_WRITE_REF,NULL,(double)Value,(char *)NULL,(Hkey)NULL,Index))
  1165. /* read a global context Variable ('normal' variable) */
  1166. #define HReadGV(ProcHandle,Element,Buffer) \
  1167. HCkP(HAccessGlVar(ProcHandle,Element,GV_READ_INFO,Buffer,(double)0,(char *)NULL,(Hkey)NULL,0))
  1168. /* read a global context Variable (element of Array) */
  1169. #define HReadGVA(ProcHandle,Element,Buffer,Index) \
  1170. HCkP(HAccessGlVar(ProcHandle,Element,GV_READ_INFO,Buffer,(double)0,(char *)NULL,(Hkey)NULL,Index))
  1171. /* read a global context Variable from reference */
  1172. #define HReadGVR(ProcHandle,Element,Buffer) \
  1173. HCkP(HAccessGlVar(ProcHandle,Element,GV_READ_REF,Buffer,(double)0,(char *)NULL,(Hkey)NULL,0))
  1174. /* read a global context Variable from reference with index */
  1175. #define HReadGVRI(ProcHandle,Element,Buffer,Index) \
  1176. HCkP(HAccessGlVar(ProcHandle,Element,GV_READ_REF,Buffer,(double)0,(char *)NULL,(Hkey)NULL,Index))
  1177. /* initialize a global context Variable (Array) */
  1178. #define HInitGVA(ProcHandle,Element,Address) \
  1179. HCkP(HAccessGlVar(ProcHandle,Element,GV_INIT_INFO,Address,(double)0,(char *)NULL,(Hkey)NULL,0))
  1180. /* get the address of a global context Variable (Array) */
  1181. #define HGetAddrGVA(ProcHandle,Element,Buffer) \
  1182. HCkP(HAccessGlVar(ProcHandle,Element,GV_GET_ADRESS,Buffer,(double)0,(char *)NULL,(Hkey)NULL,0))
  1183. /* realloc the memory of a global context Variable (Array) */
  1184. #define HReallocGVA(ProcHandle,Element,NewSize) \
  1185. HCkP(HAccessGlVar(ProcHandle,Element,GV_REALLOC_A,NULL,(double)0,(char *)NULL,(Hkey)NULL,NewSize))
  1186. /* lock a global context mutex variable */
  1187. #if defined H_PARALLEL
  1188. # define HLockGVM(ProcHandle,Element) \
  1189. HCkP(HAccessGlVar(ProcHandle,Element,GV_LOCK,NULL,(double)0,(char *)NULL, \
  1190. (Hkey)NULL,0))
  1191. /* lock a global context mutex variable and directly return Herror result */
  1192. # define HLockGVMdirect(ProcHandle,Element) \
  1193. HAccessGlVar(ProcHandle,Element,GV_LOCK,NULL,(double)0,(char *)NULL, \
  1194. (Hkey)NULL,0)
  1195. /* unlock a global context mutex variable */
  1196. # define HUnlockGVM(ProcHandle,Element) \
  1197. HCkP(HAccessGlVar(ProcHandle,Element,GV_UNLOCK,NULL,(double)0, \
  1198. (char *)NULL,(Hkey)NULL,0))
  1199. /* unlock a global context mutex variable and directly return Herror result */
  1200. # define HUnlockGVMdirect(ProcHandle,Element) \
  1201. HAccessGlVar(ProcHandle,Element,GV_UNLOCK,NULL,(double)0,(char *)NULL, \
  1202. (Hkey)NULL,0)
  1203. #else
  1204. # define HLockGVM(ProcHandle,Element)
  1205. # define HLockGVMdirect(ProcHandle,Element) H_MSG_OK
  1206. # define HUnlockGVM(ProcHandle,Element)
  1207. # define HUnlockGVMdirect(ProcHandle,Element) H_MSG_OK
  1208. #endif
  1209. /* calculate 'bitwise OR' with the content of a global context variable */
  1210. #define HBOrGV(ProcHandle,Element,Value) \
  1211. HCkP(HAccessGlVar(ProcHandle,Element,GV_BOR_INFO,NULL,(double)Value, \
  1212. (char *)NULL,(Hkey)NULL,0))
  1213. /* calculate 'bitwise AND' with the content of a global context variable */
  1214. #define HBAndGV(ProcHandle,Element,Value) \
  1215. HCkP(HAccessGlVar(ProcHandle,Element,GV_BAND_INFO,NULL,(double)Value, \
  1216. (char *)NULL,(Hkey)NULL,0))
  1217. /* - - - - old Makros for accessing HALCON operator context information - - */
  1218. /* (all accesses using the old makros should be replaced by the new ones in */
  1219. /* the long term */
  1220. /* write an element of the global structure HInterInfo */
  1221. #define HWriteInterInfo(ProcHandle,Element,Value) \
  1222. HCkP(HAccessGlVar(ProcHandle,Element,GV_WRITE_INFO,NULL,(double)Value,(char *)NULL,(Hkey)NULL,0))
  1223. /* write an element of the global structure HInterInfo (String) */
  1224. #define HWriteInterInfoS(ProcHandle,Element,Value) \
  1225. HCkP(HAccessGlVar(ProcHandle,Element,GV_WRITE_INFO,NULL,(double)0,Value,(Hkey)NULL,0))
  1226. /* write an element of the global structure HInterInfo (String into Array) */
  1227. #define HWriteInterInfoSA(ProcHandle,Element,Value,Index) \
  1228. HCkP(HAccessGlVar(ProcHandle,Element,GV_WRITE_INFO,NULL,(double)0,Value,(Hkey)NULL,Index))
  1229. /* write an element of the global structure HInterInfo (Array element) */
  1230. #define HWriteInterInfoA(ProcHandle,Element,Value,Index) \
  1231. HCkP(HAccessGlVar(ProcHandle,Element,GV_WRITE_INFO,NULL,(double)Value,(char *)NULL,(Hkey)NULL,Index))
  1232. /* read an element of the global structure HInterInfo */
  1233. #define HReadInterInfo(ProcHandle,Element,Value) \
  1234. HCkP(HAccessGlVar(ProcHandle,Element,GV_READ_INFO,Value,(double)0,(char *)NULL,(Hkey)NULL,0))
  1235. /* read an element of the global structure HInterInfo (Array element) */
  1236. #define HReadInterInfoA(ProcHandle,Element,Value,Index) \
  1237. HCkP(HAccessGlVar(ProcHandle,Element,GV_READ_INFO,Value,(double)0,(char *)NULL,(Hkey)NULL,Index))
  1238. /* initialize an element of the global structure HInterInfo (Array element) */
  1239. #define HInitInterInfoA(ProcHandle,Element,Value) \
  1240. HCkP(HAccessGlVar(ProcHandle,Element,GV_INIT_INFO,Value,(double)0,(char *)NULL,(Hkey)NULL,0))
  1241. /* write an element of the global structure HSysComInfo */
  1242. #define HWriteSysComInfo(ProcHandle,Element,Value) \
  1243. HCkP(HAccessGlVar(ProcHandle,Element,GV_WRITE_INFO,NULL,(double)Value,(char *)NULL,(Hkey)NULL,0))
  1244. /* write an element of the global structure HSysComInfo (String) */
  1245. #define HWriteSysComInfoS(ProcHandle,Element,Value) \
  1246. HCkP(HAccessGlVar(ProcHandle,Element,GV_WRITE_INFO,NULL,(double)0,Value,(Hkey)NULL,0))
  1247. /* write an element of the global structure HSysComInfo (String into Array) */
  1248. #define HWriteSysComInfoSA(ProcHandle,Element,Value,Index) \
  1249. HCkP(HAccessGlVar(ProcHandle,Element,GV_WRITE_INFO,NULL,(double)0,Value,(Hkey)NULL,Index))
  1250. /* write an element of the global structure HSysComInfo (Array element) */
  1251. #define HWriteSysComInfoA(ProcHandle,Element,Value,Index) \
  1252. HCkP(HAccessGlVar(ProcHandle,Element,GV_WRITE_INFO,NULL,(double)Value,(char *)NULL,(Hkey)NULL,Index))
  1253. /* write an element of the global structure HSysInfoShared */
  1254. #define HWriteSysInfoShared(ProcHandle,Element,Value) \
  1255. HAccessGlVar(ProcHandle,Element,GV_WRITE_INFO,NULL,(double)Value,(char *)NULL,(Hkey)NULL,0)
  1256. /* write an element of the global structure HSysInfoShared (String) */
  1257. #define HWriteSysInfoSharedS(ProcHandle,Element,Value) \
  1258. HAccessGlVar(ProcHandle,Element,GV_WRITE_INFO,NULL,(double)0,Value,(Hkey)NULL,0)
  1259. /* write an element of the global structure HSysInfoShared(String into Array)*/
  1260. #define HWriteSysInfoSharedSA(ProcHandle,Element,Value,Index) \
  1261. HAccessGlVar(ProcHandle,Element,GV_WRITE_INFO,NULL,(double)0,Value,(Hkey)NULL,Index)
  1262. /* write an element of the global structure HSysComInfo (Array element) */
  1263. #define HWriteSysInfoSharedA(ProcHandle,Element,Value,Index) \
  1264. HAccessGlVar(ProcHandle,Element,GV_WRITE_INFO,NULL,(double)Value,(char *)NULL,(Hkey)NULL,Index)
  1265. /* read an element of the global structure HSysComInfo */
  1266. #define HReadSysComInfo(ProcHandle,Element,Value) \
  1267. HCkP(HAccessGlVar(ProcHandle,Element,GV_READ_INFO,Value,(double)0,(char *)NULL,(Hkey)NULL,0))
  1268. /* read an element of the global structure HSysComInfo (Array element) */
  1269. #define HReadSysComInfoA(ProcHandle,Element,Value,Index) \
  1270. HCkP(HAccessGlVar(ProcHandle,Element,GV_READ_INFO,Value,(double)0,(char *)NULL,(Hkey)NULL,Index))
  1271. /* initialize an element of the global structure HSysComInfo (Array element) */
  1272. #define HInitSysComInfoA(ProcHandle,Element,Value) \
  1273. HCkP(HAccessGlVar(ProcHandle,Element,GV_INIT_INFO,Value,(double)0,(char *)NULL,(Hkey)NULL,0))
  1274. /* write an element of the global structure HProcCallInfo */
  1275. #define HWriteProcCallInfo(ProcHandle,Element,Value) \
  1276. HCkP(HAccessGlVar(ProcHandle,Element,GV_WRITE_INFO,NULL,(double)Value,(char *)NULL,(Hkey)NULL,0))
  1277. /* write an element of the global structure HProcCallInfo (String) */
  1278. #define HWriteProcCallInfoS(ProcHandle,Element,Value) \
  1279. HCkP(HAccessGlVar(ProcHandle,Element,GV_WRITE_INFO,NULL,(double)0,Value,(Hkey)NULL,0))
  1280. /* write an element of the global structure HProcCallInfo (String into Array)*/
  1281. #define HWriteProcCallInfoSA(ProcHandle,Element,Value,Index) \
  1282. HCkP(HAccessGlVar(ProcHandle,Element,GV_WRITE_INFO,NULL,(double)0,Value,(Hkey)NULL,Index))
  1283. /* write an element of the global structure HProcCallInfo (Key into Array) */
  1284. #define HWriteProcCallInfoKA(ProcHandle,Element,Value,Index) \
  1285. HCkP(HAccessGlVar(ProcHandle,Element,GV_WRITE_INFO,NULL,(double)0,(char *)NULL,Value,Index))
  1286. /* write an element of the global structure HProcCallInfo (Array element) */
  1287. #define HWriteProcCallInfoA(ProcHandle,Element,Value,Index) \
  1288. HCkP(HAccessGlVar(ProcHandle,Element,GV_WRITE_INFO,NULL,(double)Value,(char *)NULL,(Hkey)NULL,Index))
  1289. /* Lesen eines Elements der globalen Struktur HProcCallInfo */
  1290. #define HReadProcCallInfo(ProcHandle,Element,Value) \
  1291. HCkP(HAccessGlVar(ProcHandle,Element,GV_READ_INFO,Value,(double)0,(char *)NULL,(Hkey)NULL,0))
  1292. /* read an element of the global structure HProcCallInfo */
  1293. #define HReadProcCallInfoA(ProcHandle,Element,Value,Index) \
  1294. HCkP(HAccessGlVar(ProcHandle,Element,GV_READ_INFO,Value,(double)0,(char *)NULL,(Hkey)NULL,Index))
  1295. /* initialize an element of the global structure HProcCallInfo (Array) */
  1296. #define HInitProcCallInfoA(ProcHandle,Element,Value) \
  1297. HCkP(HAccessGlVar(ProcHandle,Element,GV_INIT_INFO,Value,(double)0,(char *)NULL,(Hkey)NULL,0))
  1298. /* get the address of an array element of the global structure HProcCallInfo */
  1299. #define HGetAdrProcCallInfoA(ProcHandle,Element,Value) \
  1300. HCkP(HAccessGlVar(ProcHandle,Element,GV_GET_ADRESS,Value,(double)0,(char *)NULL,(Hkey)NULL,0))
  1301. #endif /* HMACRO_H */