/lib/cximage-6.0/mng/libmng_pixels.c

http://github.com/xbmc/xbmc · C · 24610 lines · 20136 code · 3217 blank · 1257 comment · 2732 complexity · bb712b345ae5b5ba9c95d4b8afc68903 MD5 · raw file

  1. /* ************************************************************************** */
  2. /* * For conditions of distribution and use, * */
  3. /* * see copyright notice in libmng.h * */
  4. /* ************************************************************************** */
  5. /* * * */
  6. /* * project : libmng * */
  7. /* * file : libmng_pixels.c copyright (c) 2000-2005 G.Juyn * */
  8. /* * version : 1.0.10 * */
  9. /* * * */
  10. /* * purpose : Pixel-row management routines (implementation) * */
  11. /* * * */
  12. /* * author : G.Juyn * */
  13. /* * * */
  14. /* * comment : implementation of the pixel-row management routines * */
  15. /* * * */
  16. /* * the dual alpha-composing for RGBA/BGRA/etc output-canvas' * */
  17. /* * is based on the Note on Compositing chapter of the * */
  18. /* * DOH-3 draft, noted to me by Adam M. Costello * */
  19. /* * * */
  20. /* * changes : 0.5.1 - 05/08/2000 - G.Juyn * */
  21. /* * - changed strict-ANSI stuff * */
  22. /* * 0.5.1 - 05/11/2000 - G.Juyn * */
  23. /* * - added callback error-reporting support * */
  24. /* * 0.5.1 - 05/12/2000 - G.Juyn * */
  25. /* * - changed trace to macro for callback error-reporting * */
  26. /* * * */
  27. /* * 0.5.2 - 05/22/2000 - G.Juyn * */
  28. /* * - added JNG support * */
  29. /* * 0.5.2 - 05/30/2000 - G.Juyn * */
  30. /* * - fixed minor bugs 16-bit pixel-handling * */
  31. /* * - added delta-image row-processing routines * */
  32. /* * 0.5.2 - 06/02/2000 - G.Juyn * */
  33. /* * - fixed endian support (hopefully) * */
  34. /* * 0.5.2 - 06/03/2000 - G.Juyn * */
  35. /* * - fixed makeup for Linux gcc compile * */
  36. /* * 0.5.2 - 06/05/2000 - G.Juyn * */
  37. /* * - implemented app bkgd restore routines * */
  38. /* * - implemented RGBA8, ARGB8, BGRA8 & ABGR8 display routines * */
  39. /* * - added support for RGB8_A8 canvasstyle * */
  40. /* * 0.5.2 - 06/09/2000 - G.Juyn * */
  41. /* * - fixed alpha-handling for alpha canvasstyles * */
  42. /* * * */
  43. /* * 0.5.3 - 06/16/2000 - G.Juyn * */
  44. /* * - changed progressive-display processing * */
  45. /* * 0.5.3 - 06/17/2000 - G.Juyn * */
  46. /* * - changed to support delta-images * */
  47. /* * - optimized some store_xxx routines * */
  48. /* * 0.5.3 - 06/20/2000 - G.Juyn * */
  49. /* * - fixed nasty bug with embedded PNG after delta-image * */
  50. /* * 0.5.3 - 06/24/2000 - G.Juyn * */
  51. /* * - fixed problem with 16-bit GA format * */
  52. /* * 0.5.3 - 06/25/2000 - G.Juyn * */
  53. /* * - fixed problem with cheap transparency for 4-bit gray * */
  54. /* * - fixed display_xxxx routines for interlaced images * */
  55. /* * 0.5.3 - 06/28/2000 - G.Juyn * */
  56. /* * - fixed compiler-warning for non-initialized iB variable * */
  57. /* * * */
  58. /* * 0.9.1 - 07/05/2000 - G.Juyn * */
  59. /* * - fixed mandatory BACK color to be opaque * */
  60. /* * * */
  61. /* * 0.9.2 - 07/31/2000 - G.Juyn * */
  62. /* * - B110547 - fixed bug in interlace code * */
  63. /* * 0.9.2 - 08/05/2000 - G.Juyn * */
  64. /* * - changed file-prefixes * */
  65. /* * * */
  66. /* * 0.9.3 - 08/20/2000 - G.Juyn * */
  67. /* * - fixed app-supplied background restore * */
  68. /* * 0.9.3 - 08/26/2000 - G.Juyn * */
  69. /* * - added MAGN chunk * */
  70. /* * 0.9.3 - 09/07/2000 - G.Juyn * */
  71. /* * - added support for new filter_types * */
  72. /* * 0.9.3 - 09/30/2000 - G.Juyn * */
  73. /* * - fixed MAGN rounding errors (thanks Matthias!) * */
  74. /* * 0.9.3 - 10/10/2000 - G.Juyn * */
  75. /* * - fixed alpha-blending for RGBA canvasstyle * */
  76. /* * 0.9.3 - 10/11/2000 - G.Juyn * */
  77. /* * - fixed alpha-blending for other alpha-canvasstyles * */
  78. /* * 0.9.3 - 10/16/2000 - G.Juyn * */
  79. /* * - added optional support for bKGD for PNG images * */
  80. /* * - added support for JDAA * */
  81. /* * 0.9.3 - 10/17/2000 - G.Juyn * */
  82. /* * - fixed support for bKGD * */
  83. /* * 0.9.3 - 10/19/2000 - G.Juyn * */
  84. /* * - implemented delayed delta-processing * */
  85. /* * 0.9.3 - 10/28/2000 - G.Juyn * */
  86. /* * - fixed tRNS processing for gray-image < 8-bits * */
  87. /* * * */
  88. /* * 0.9.4 - 12/16/2000 - G.Juyn * */
  89. /* * - fixed mixup of data- & function-pointers (thanks Dimitri)* */
  90. /* * 0.9.4 - 1/18/2001 - G.Juyn * */
  91. /* * - removed "old" MAGN methods 3 & 4 * */
  92. /* * - added "new" MAGN methods 3, 4 & 5 * */
  93. /* * - removed test filter-methods 1 & 65 * */
  94. /* * * */
  95. /* * 1.0.1 - 04/21/2001 - G.Juyn (code by G.Kelly) * */
  96. /* * - added BGRA8 canvas with premultiplied alpha * */
  97. /* * 1.0.1 - 04/25/2001 - G.Juyn * */
  98. /* * - moved mng_clear_cms to libmng_cms * */
  99. /* * * */
  100. /* * 1.0.2 - 06/25/2001 - G.Juyn * */
  101. /* * - added option to turn off progressive refresh * */
  102. /* * * */
  103. /* * 1.0.4 - 11/04/2001 - G.Juyn * */
  104. /* * - fixed possible compile-problem in cleanup_rowproc * */
  105. /* * 1.0.4 - 06/22/2002 - G.Juyn * */
  106. /* * - B558212 - off by one error * */
  107. /* * - MNG subimage alpha composite wrong for rgba8 images * */
  108. /* * * */
  109. /* * 1.0.5 - 08/07/2002 - G.Juyn * */
  110. /* * - added test-option for PNG filter method 193 (=no filter) * */
  111. /* * 1.0.5 - 08/15/2002 - G.Juyn * */
  112. /* * - completed PROM support * */
  113. /* * - completed delta-image support * */
  114. /* * 1.0.5 - 08/16/2002 - G.Juyn * */
  115. /* * - completed MAGN support (16-bit functions) * */
  116. /* * 1.0.5 - 08/19/2002 - G.Juyn * */
  117. /* * - B597134 - libmng pollutes the linker namespace * */
  118. /* * 1.0.5 - 09/19/2002 - G.Juyn * */
  119. /* * - optimized restore-background for bKGD cases * */
  120. /* * 1.0.5 - 09/20/2002 - G.Juyn * */
  121. /* * - finished support for BACK image & tiling * */
  122. /* * 1.0.5 - 09/22/2002 - G.Juyn * */
  123. /* * - added bgrx8 canvas (filler byte) * */
  124. /* * 1.0.5 - 09/23/2002 - G.Juyn * */
  125. /* * - added compose over/under routines for PAST processing * */
  126. /* * - added flip & tile routines for PAST processing * */
  127. /* * * */
  128. /* * 1.0.6 - 03/09/2003 - G.Juyn * */
  129. /* * - hiding 12-bit JPEG stuff * */
  130. /* * 1.0.6 - 05/11/2003 - Glenn RP * */
  131. /* * - added size-optimization COMPOSE routine usage * */
  132. /* * 1.0.6 - 05/11/2003 - G. Juyn * */
  133. /* * - added conditionals around canvas update routines * */
  134. /* * 1.0.6 - 05/25/2003 - Glenn RP * */
  135. /* * - added size-optimization DIV255B8 routine usage * */
  136. /* * 1.0.6 - 06/09/2003 - G. R-P * */
  137. /* * - added conditionals around 8-bit magn routines * */
  138. /* * 1.0.6 - 07/07/2003 - G. R-P * */
  139. /* * - removed conditionals around 8-bit magn routines * */
  140. /* * - added MNG_NO_16BIT_SUPPORT and MNG_NO_DELTA_PNG * */
  141. /* * conditionals * */
  142. /* * - reversed many loops to use decrementing counter * */
  143. /* * - combined init functions * */
  144. /* * - converted some switches to array references * */
  145. /* * 1.0.6 - 07/29/2003 - G.Juyn * */
  146. /* * - fixed duplicate for-loop * */
  147. /* * 1.0.6 - 07/29/2003 - G.R-P * */
  148. /* * - added SKIPCHUNK conditionals around PAST chunk support * */
  149. /* * - fixed "FOOTPRINT_COMPOSEIV" typo (now "FOOTPRINT_DIV") * */
  150. /* * 1.0.6 - 08/17/2003 - G.R-P * */
  151. /* * - added more conditionals around "promote" functions * */
  152. /* * * */
  153. /* * 1.0.7 - 11/27/2003 - R.A * */
  154. /* * - added CANVAS_RGB565 and CANVAS_BGR565 * */
  155. /* * 1.0.7 - 12/06/2003 - R.A * */
  156. /* * - added CANVAS_RGBA565 and CANVAS_BGRA565 * */
  157. /* * 1.0.7 - 01/25/2004 - J.S * */
  158. /* * - added premultiplied alpha canvas' for RGBA, ARGB, ABGR * */
  159. /* * 1.0.7 - 03/08/2004 - G.R-P * */
  160. /* * - added more conditionals around 16-bit-supporting code * */
  161. /* * 1.0.7 - 03/09/2004 - G.Juyn * */
  162. /* * - fixed bug in promote_g8_g8 with 16bit support off * */
  163. /* * 1.0.7 - 03/09/2004 - G.R-P * */
  164. /* * - more optimizations with 16bit support off * */
  165. /* * 1.0.7 - 03/10/2004 - G.Juyn * */
  166. /* * - fixed some warnings for 16bit optimizations * */
  167. /* * 1.0.7 - 03/21/2004 - G.Juyn * */
  168. /* * - fixed some 64-bit platform compiler warnings * */
  169. /* * * */
  170. /* * 1.0.8 - 06/20/2004 - G.Juyn * */
  171. /* * - some speed optimizations (thanks to John Stiles) * */
  172. /* * 1.0.8 - 08/01/2004 - G.Juyn * */
  173. /* * - added support for 3+byte pixelsize for JPEG's * */
  174. /* * * */
  175. /* * 1.0.9 - 10/10/2004 - G.R-P. * */
  176. /* * - added MNG_NO_1_2_4BIT_SUPPORT * */
  177. /* * 1.0.9 - 10/14/2004 - G.Juyn * */
  178. /* * - added bgr565_a8 canvas-style (thanks to J. Elvander) * */
  179. /* * 1.0.9 - 12/05/2004 - G.Juyn * */
  180. /* * - added LITTLEENDIAN/BIGENDIAN fixtures (thanks J.Stiles) * */
  181. /* * - fixed MNG_NO_1_2_4BIT_SUPPORT for TBBN1G04.PNG * */
  182. /* * 1.0.9 - 12/31/2004 - G.R-P. * */
  183. /* * - fixed warnings about C++ style (//) comments * */
  184. /* * * */
  185. /* * 1.0.10 - 07/06/2005 - G.R-P. * */
  186. /* * - added MORE MNG_NO_1_2_4BIT_SUPPORT * */
  187. /* * 1.0.10 - 10/06/2005 - G.R-P. * */
  188. /* * - alloc more memory for MNG_NO_1_2_4BIT_SUPPORT * */
  189. /* * 1.0.10 - 12/07/2005 - G.R-P. * */
  190. /* * - optimized footprint of 16bit support * */
  191. /* * 1.0.10 - 03/07/2006 - (thanks to W. Manthey) * */
  192. /* * - added CANVAS_RGB555 and CANVAS_BGR555 * */
  193. /* * * */
  194. /* ************************************************************************** */
  195. #include "libmng.h"
  196. #include "libmng_data.h"
  197. #include "libmng_error.h"
  198. #include "libmng_trace.h"
  199. #ifdef __BORLANDC__
  200. #pragma hdrstop
  201. #endif
  202. #include "libmng_objects.h"
  203. #include "libmng_object_prc.h"
  204. #include "libmng_memory.h"
  205. #include "libmng_cms.h"
  206. #include "libmng_filter.h"
  207. #include "libmng_pixels.h"
  208. #if defined(__BORLANDC__) && defined(MNG_STRICT_ANSI)
  209. #pragma option -A /* force ANSI-C */
  210. #endif
  211. /* ************************************************************************** */
  212. #ifdef MNG_INCLUDE_DISPLAY_PROCS
  213. /* TODO: magnification & canvas-positioning/-clipping */
  214. /* TODO: major optimization of pixel-loops by using assembler (?) */
  215. /* ************************************************************************** */
  216. /* * * */
  217. /* * Interlace tables * */
  218. /* * * */
  219. /* ************************************************************************** */
  220. MNG_LOCAL mng_uint32 const interlace_row [7] = { 0, 0, 4, 0, 2, 0, 1 };
  221. MNG_LOCAL mng_uint32 const interlace_rowskip [7] = { 8, 8, 8, 4, 4, 2, 2 };
  222. MNG_LOCAL mng_uint32 const interlace_col [7] = { 0, 4, 0, 2, 0, 1, 0 };
  223. MNG_LOCAL mng_uint32 const interlace_colskip [7] = { 8, 8, 4, 4, 2, 2, 1 };
  224. MNG_LOCAL mng_uint32 const interlace_roundoff [7] = { 7, 7, 3, 3, 1, 1, 0 };
  225. MNG_LOCAL mng_uint32 const interlace_divider [7] = { 3, 3, 2, 2, 1, 1, 0 };
  226. /* ************************************************************************** */
  227. /* * * */
  228. /* * Alpha composing macros * */
  229. /* * the code below is slightly modified from the libpng package * */
  230. /* * the original was last optimized by Greg Roelofs & Mark Adler * */
  231. /* * * */
  232. /* ************************************************************************** */
  233. #define MNG_COMPOSE8(RET,FG,ALPHA,BG) { \
  234. mng_uint16 iH = (mng_uint16)((mng_uint16)(FG) * (mng_uint16)(ALPHA) \
  235. + (mng_uint16)(BG)*(mng_uint16)(255 - \
  236. (mng_uint16)(ALPHA)) + (mng_uint16)128); \
  237. (RET) = (mng_uint8)((iH + (iH >> 8)) >> 8); }
  238. #define MNG_COMPOSE16(RET,FG,ALPHA,BG) { \
  239. mng_uint32 iH = (mng_uint32)((mng_uint32)(FG) * (mng_uint32)(ALPHA) \
  240. + (mng_uint32)(BG)*(mng_uint32)(65535L - \
  241. (mng_uint32)(ALPHA)) + (mng_uint32)32768L); \
  242. (RET) = (mng_uint16)((iH + (iH >> 16)) >> 16); }
  243. /* ************************************************************************** */
  244. /* * * */
  245. /* * Alpha blending macros * */
  246. /* * this code is based on Adam Costello's "Note on Compositing" from the * */
  247. /* * mng-list which gives the following formula: * */
  248. /* * * */
  249. /* * top pixel = (Rt, Gt, Bt, At) * */
  250. /* * bottom pixel = (Rb, Gb, Bb, Ab) * */
  251. /* * composite pixel = (Rc, Gc, Bc, Ac) * */
  252. /* * * */
  253. /* * all values in the range 0..1 * */
  254. /* * * */
  255. /* * Ac = 1 - (1 - At)(1 - Ab) * */
  256. /* * s = At / Ac * */
  257. /* * t = (1 - At) Ab / Ac * */
  258. /* * Rc = s Rt + t Rb * */
  259. /* * Gc = s Gt + t Gb * */
  260. /* * Bc = s Bt + t Bb * */
  261. /* * * */
  262. /* * (I just hope I coded it correctly in integer arithmetic...) * */
  263. /* * * */
  264. /* ************************************************************************** */
  265. #define MNG_BLEND8(RT, GT, BT, AT, RB, GB, BB, AB, RC, GC, BC, AC) { \
  266. mng_uint32 S, T; \
  267. (AC) = (mng_uint8)((mng_uint32)255 - \
  268. ((((mng_uint32)255 - (mng_uint32)(AT)) * \
  269. ((mng_uint32)255 - (mng_uint32)(AB)) ) >> 8)); \
  270. S = (mng_uint32)(((mng_uint32)(AT) << 8) / \
  271. (mng_uint32)(AC)); \
  272. T = (mng_uint32)(((mng_uint32)255 - (mng_uint32)(AT)) * \
  273. (mng_uint32)(AB) / (mng_uint32)(AC)); \
  274. (RC) = (mng_uint8)((S * (mng_uint32)(RT) + \
  275. T * (mng_uint32)(RB) + (mng_uint32)127) >> 8); \
  276. (GC) = (mng_uint8)((S * (mng_uint32)(GT) + \
  277. T * (mng_uint32)(GB) + (mng_uint32)127) >> 8); \
  278. (BC) = (mng_uint8)((S * (mng_uint32)(BT) + \
  279. T * (mng_uint32)(BB) + (mng_uint32)127) >> 8); }
  280. #define MNG_BLEND16(RT, GT, BT, AT, RB, GB, BB, AB, RC, GC, BC, AC) { \
  281. mng_uint32 S, T; \
  282. (AC) = (mng_uint16)((mng_uint32)65535 - \
  283. ((((mng_uint32)65535 - (mng_uint32)(AT)) * \
  284. ((mng_uint32)65535 - (mng_uint32)(AB)) ) >> 16)); \
  285. S = (mng_uint32)(((mng_uint32)(AT) << 16) / \
  286. (mng_uint32)(AC)); \
  287. T = (mng_uint32)(((mng_uint32)65535 - (mng_uint32)(AT)) * \
  288. (mng_uint32)(AB) / (mng_uint32)(AC)); \
  289. (RC) = (mng_uint16)((S * (mng_uint32)(RT) + \
  290. T * (mng_uint32)(RB) + (mng_uint32)32767) >> 16); \
  291. (GC) = (mng_uint16)((S * (mng_uint32)(GT) + \
  292. T * (mng_uint32)(GB) + (mng_uint32)32767) >> 16); \
  293. (BC) = (mng_uint16)((S * (mng_uint32)(BT) + \
  294. T * (mng_uint32)(BB) + (mng_uint32)32767) >> 16); }
  295. /* ************************************************************************** */
  296. /* note a good optimizing compiler will optimize this */
  297. #define DIV255B8(x) (mng_uint8)(((x) + 127) / 255)
  298. #define DIV255B16(x) (mng_uint16)(((x) + 32767) / 65535)
  299. /* ************************************************************************** */
  300. /* * * */
  301. /* * Progressive display check - checks to see if progressive display is * */
  302. /* * in order & indicates so * */
  303. /* * * */
  304. /* * The routine is called after a call to one of the display_xxx routines * */
  305. /* * if appropriate * */
  306. /* * * */
  307. /* * The refresh is warrented in the read_chunk routine (mng_read.c) * */
  308. /* * and only during read&display processing, since there's not much point * */
  309. /* * doing it from memory! * */
  310. /* * * */
  311. /* ************************************************************************** */
  312. mng_retcode mng_display_progressive_check (mng_datap pData)
  313. {
  314. if ((pData->bDoProgressive) && /* need progressive display? */
  315. ((pData->eImagetype != mng_it_mng) || (pData->iDataheight > 300)) &&
  316. (pData->iDestb - pData->iDestt > 50) && (!pData->pCurraniobj))
  317. {
  318. mng_int32 iC = pData->iRow + pData->iDestt - pData->iSourcet;
  319. if (iC % 20 == 0) /* every 20th line */
  320. pData->bNeedrefresh = MNG_TRUE;
  321. }
  322. return MNG_NOERROR;
  323. }
  324. /* ************************************************************************** */
  325. /* * * */
  326. /* * Display routines - convert rowdata (which is already color-corrected) * */
  327. /* * to the output canvas, respecting the opacity information * */
  328. /* * * */
  329. /* ************************************************************************** */
  330. MNG_LOCAL void check_update_region (mng_datap pData)
  331. { /* determine actual canvas row */
  332. mng_int32 iRow = pData->iRow + pData->iDestt - pData->iSourcet;
  333. /* check for change in update-region */
  334. if ((pData->iDestl < (mng_int32)pData->iUpdateleft) || (pData->iUpdateright == 0))
  335. pData->iUpdateleft = pData->iDestl;
  336. if (pData->iDestr > (mng_int32)pData->iUpdateright)
  337. pData->iUpdateright = pData->iDestr;
  338. if ((iRow < (mng_int32)pData->iUpdatetop) || (pData->iUpdatebottom == 0))
  339. pData->iUpdatetop = iRow;
  340. if (iRow+1 > (mng_int32)pData->iUpdatebottom)
  341. pData->iUpdatebottom = iRow+1;
  342. return;
  343. }
  344. /* ************************************************************************** */
  345. #ifndef MNG_SKIPCANVAS_RGB8
  346. #ifndef MNG_NO_16BIT_SUPPORT
  347. #ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  348. mng_retcode mng_display_rgb8 (mng_datap pData)
  349. {
  350. mng_uint8p pScanline;
  351. mng_uint8p pDataline;
  352. mng_int32 iX;
  353. mng_uint16 iA16;
  354. mng_uint16 iFGr16, iFGg16, iFGb16;
  355. mng_uint16 iBGr16, iBGg16, iBGb16;
  356. mng_uint8 iA8;
  357. #ifdef MNG_SUPPORT_TRACE
  358. MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8, MNG_LC_START);
  359. #endif
  360. /* viewable row ? */
  361. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  362. { /* address destination row */
  363. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  364. pData->iRow + pData->iDestt -
  365. pData->iSourcet);
  366. /* adjust destination row starting-point */
  367. pScanline = pScanline + (pData->iCol * 3) + (pData->iDestl * 3);
  368. pDataline = pData->pRGBArow; /* address source row */
  369. if (pData->bIsRGBA16) /* adjust source row starting-point */
  370. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3);
  371. else
  372. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  373. if (pData->bIsOpaque) /* forget about transparency ? */
  374. {
  375. if (pData->bIsRGBA16) /* 16-bit input row ? */
  376. {
  377. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  378. iX += pData->iColinc)
  379. { /* scale down by dropping the LSB */
  380. *pScanline = *pDataline;
  381. *(pScanline+1) = *(pDataline+2);
  382. *(pScanline+2) = *(pDataline+4);
  383. pScanline += (pData->iColinc * 3);
  384. pDataline += 8;
  385. }
  386. }
  387. else
  388. {
  389. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  390. iX += pData->iColinc)
  391. { /* copy the values */
  392. *pScanline = *pDataline;
  393. *(pScanline+1) = *(pDataline+1);
  394. *(pScanline+2) = *(pDataline+2);
  395. pScanline += (pData->iColinc * 3);
  396. pDataline += 4;
  397. }
  398. }
  399. }
  400. else
  401. {
  402. if (pData->bIsRGBA16) /* 16-bit input row ? */
  403. {
  404. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  405. iX += pData->iColinc)
  406. {
  407. iA16 = mng_get_uint16 (pDataline+6);
  408. if (iA16) /* any opacity at all ? */
  409. {
  410. if (iA16 == 0xFFFF) /* fully opaque ? */
  411. { /* scale down by dropping the LSB */
  412. *pScanline = *pDataline;
  413. *(pScanline+1) = *(pDataline+2);
  414. *(pScanline+2) = *(pDataline+4);
  415. }
  416. else
  417. { /* get the proper values */
  418. iFGr16 = mng_get_uint16 (pDataline );
  419. iFGg16 = mng_get_uint16 (pDataline+2);
  420. iFGb16 = mng_get_uint16 (pDataline+4);
  421. /* scale background up */
  422. iBGr16 = (mng_uint16)(*pScanline );
  423. iBGg16 = (mng_uint16)(*(pScanline+1));
  424. iBGb16 = (mng_uint16)(*(pScanline+2));
  425. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  426. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  427. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  428. /* now compose */
  429. MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16);
  430. MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16);
  431. MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16);
  432. /* and return the composed values */
  433. *pScanline = (mng_uint8)(iFGr16 >> 8);
  434. *(pScanline+1) = (mng_uint8)(iFGg16 >> 8);
  435. *(pScanline+2) = (mng_uint8)(iFGb16 >> 8);
  436. }
  437. }
  438. pScanline += (pData->iColinc * 3);
  439. pDataline += 8;
  440. }
  441. }
  442. else
  443. {
  444. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  445. iX += pData->iColinc)
  446. {
  447. iA8 = *(pDataline+3); /* get alpha value */
  448. if (iA8) /* any opacity at all ? */
  449. {
  450. if (iA8 == 0xFF) /* fully opaque ? */
  451. { /* then simply copy the values */
  452. *pScanline = *pDataline;
  453. *(pScanline+1) = *(pDataline+1);
  454. *(pScanline+2) = *(pDataline+2);
  455. }
  456. else
  457. { /* do alpha composing */
  458. MNG_COMPOSE8 (*pScanline, *pDataline, iA8, *pScanline );
  459. MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iA8, *(pScanline+1));
  460. MNG_COMPOSE8 (*(pScanline+2), *(pDataline+2), iA8, *(pScanline+2));
  461. }
  462. }
  463. pScanline += (pData->iColinc * 3);
  464. pDataline += 4;
  465. }
  466. }
  467. }
  468. }
  469. check_update_region (pData);
  470. #ifdef MNG_SUPPORT_TRACE
  471. MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8, MNG_LC_END);
  472. #endif
  473. return MNG_NOERROR;
  474. }
  475. #else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  476. mng_retcode mng_display_rgb8 (mng_datap pData)
  477. {
  478. mng_uint8p pScanline;
  479. mng_uint8p pDataline;
  480. mng_int32 iX;
  481. mng_uint16 iA16;
  482. mng_uint16 iFGg16;
  483. mng_uint16 iBGg16;
  484. mng_uint8 iA8;
  485. mng_uint8 iBps;
  486. #ifdef MNG_SUPPORT_TRACE
  487. MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8, MNG_LC_START);
  488. #endif
  489. iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1);
  490. /* viewable row ? */
  491. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  492. { /* address destination row */
  493. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  494. pData->iRow + pData->iDestt -
  495. pData->iSourcet);
  496. /* adjust destination row starting-point */
  497. pScanline = pScanline + (pData->iCol * 3) + (pData->iDestl * 3);
  498. pDataline = pData->pRGBArow; /* address source row */
  499. /* adjust source row starting-point */
  500. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1));
  501. if (pData->bIsOpaque) /* forget about transparency ? */
  502. {
  503. {
  504. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  505. iX += pData->iColinc)
  506. { /* scale down by dropping the LSB */
  507. *pScanline = *pDataline;
  508. *(pScanline+1) = *(pDataline+iBps);
  509. *(pScanline+2) = *(pDataline+2*iBps);
  510. pScanline += (pData->iColinc * 3);
  511. pDataline += 4*iBps;
  512. }
  513. }
  514. }
  515. else
  516. {
  517. if (pData->bIsRGBA16) /* 16-bit input row ? */
  518. {
  519. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  520. iX += pData->iColinc)
  521. {
  522. iA16 = mng_get_uint16 (pDataline+6);
  523. if (iA16) /* any opacity at all ? */
  524. {
  525. if (iA16 == 0xFFFF) /* fully opaque ? */
  526. { /* scale down by dropping the LSB */
  527. *pScanline = *pDataline;
  528. *(pScanline+1) = *(pDataline+2);
  529. *(pScanline+2) = *(pDataline+4);
  530. }
  531. else
  532. { /* get the proper values */
  533. int i;
  534. for (i=2; i >= 0; i--)
  535. {
  536. iFGg16 = mng_get_uint16 (pDataline+i+i);
  537. /* scale background up */
  538. iBGg16 = (mng_uint16)(*(pScanline+i));
  539. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  540. /* now compose */
  541. MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16);
  542. /* and return the composed values */
  543. *(pScanline+i) = (mng_uint8)(iFGg16 >> 8);
  544. }
  545. }
  546. }
  547. pScanline += (pData->iColinc * 3);
  548. pDataline += 8;
  549. }
  550. }
  551. else
  552. {
  553. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  554. iX += pData->iColinc)
  555. {
  556. iA8 = *(pDataline+3); /* get alpha value */
  557. if (iA8) /* any opacity at all ? */
  558. {
  559. if (iA8 == 0xFF) /* fully opaque ? */
  560. { /* then simply copy the values */
  561. *pScanline = *pDataline;
  562. *(pScanline+1) = *(pDataline+1);
  563. *(pScanline+2) = *(pDataline+2);
  564. }
  565. else
  566. { /* do alpha composing */
  567. int i;
  568. for (i=2; i >= 0; i--)
  569. {
  570. MNG_COMPOSE8 (*(pScanline+i), *(pDataline+i), iA8, *(pScanline+i));
  571. }
  572. }
  573. }
  574. pScanline += (pData->iColinc * 3);
  575. pDataline += 4;
  576. }
  577. }
  578. }
  579. }
  580. check_update_region (pData);
  581. #ifdef MNG_SUPPORT_TRACE
  582. MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8, MNG_LC_END);
  583. #endif
  584. return MNG_NOERROR;
  585. }
  586. #endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  587. #else /* MNG_NO_16BIT_SUPPORT */
  588. mng_retcode mng_display_rgb8 (mng_datap pData)
  589. {
  590. mng_uint8p pScanline;
  591. mng_uint8p pDataline;
  592. mng_int32 iX;
  593. mng_uint8 iA8;
  594. #ifdef MNG_SUPPORT_TRACE
  595. MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8, MNG_LC_START);
  596. #endif
  597. /* viewable row ? */
  598. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  599. { /* address destination row */
  600. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  601. pData->iRow + pData->iDestt -
  602. pData->iSourcet);
  603. /* adjust destination row starting-point */
  604. pScanline = pScanline + (pData->iCol * 3) + (pData->iDestl * 3);
  605. pDataline = pData->pRGBArow; /* address source row */
  606. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  607. if (pData->bIsOpaque) /* forget about transparency ? */
  608. {
  609. {
  610. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  611. iX += pData->iColinc)
  612. { /* copy the values */
  613. *pScanline = *pDataline;
  614. *(pScanline+1) = *(pDataline+1);
  615. *(pScanline+2) = *(pDataline+2);
  616. pScanline += (pData->iColinc * 3);
  617. pDataline += 4;
  618. }
  619. }
  620. }
  621. else
  622. {
  623. {
  624. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  625. iX += pData->iColinc)
  626. {
  627. iA8 = *(pDataline+3); /* get alpha value */
  628. if (iA8) /* any opacity at all ? */
  629. {
  630. if (iA8 == 0xFF) /* fully opaque ? */
  631. { /* then simply copy the values */
  632. *pScanline = *pDataline;
  633. *(pScanline+1) = *(pDataline+1);
  634. *(pScanline+2) = *(pDataline+2);
  635. }
  636. else
  637. { /* do alpha composing */
  638. #ifdef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  639. int i;
  640. for (i=2; i >= 0; i--)
  641. {
  642. MNG_COMPOSE8 (*(pScanline+i), *(pDataline+i), iA8, *(pScanline+i));
  643. }
  644. #else
  645. MNG_COMPOSE8 (*pScanline, *pDataline, iA8, *pScanline );
  646. MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iA8, *(pScanline+1));
  647. MNG_COMPOSE8 (*(pScanline+2), *(pDataline+2), iA8, *(pScanline+2));
  648. #endif
  649. }
  650. }
  651. pScanline += (pData->iColinc * 3);
  652. pDataline += 4;
  653. }
  654. }
  655. }
  656. }
  657. check_update_region (pData);
  658. #ifdef MNG_SUPPORT_TRACE
  659. MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8, MNG_LC_END);
  660. #endif
  661. return MNG_NOERROR;
  662. }
  663. #endif /* MNG_NO_16BIT_SUPPORT */
  664. #endif /* MNG_SKIPCANVAS_RGB8 */
  665. /* ************************************************************************** */
  666. #ifndef MNG_SKIPCANVAS_RGBA8
  667. #ifndef MNG_NO_16BIT_SUPPORT
  668. #ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  669. mng_retcode mng_display_rgba8 (mng_datap pData)
  670. {
  671. mng_uint8p pScanline;
  672. mng_uint8p pDataline;
  673. mng_int32 iX;
  674. mng_uint8 iFGa8, iBGa8, iCa8;
  675. mng_uint16 iFGa16, iBGa16, iCa16;
  676. mng_uint16 iFGr16, iFGg16, iFGb16;
  677. mng_uint16 iBGr16, iBGg16, iBGb16;
  678. mng_uint16 iCr16, iCg16, iCb16;
  679. mng_uint8 iCr8, iCg8, iCb8;
  680. #ifdef MNG_SUPPORT_TRACE
  681. MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA8, MNG_LC_START);
  682. #endif
  683. /* viewable row ? */
  684. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  685. { /* address destination row */
  686. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  687. pData->iRow + pData->iDestt -
  688. pData->iSourcet);
  689. /* adjust destination row starting-point */
  690. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  691. pDataline = pData->pRGBArow; /* address source row */
  692. if (pData->bIsRGBA16) /* adjust source row starting-point */
  693. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3);
  694. else
  695. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  696. if (pData->bIsOpaque) /* forget about transparency ? */
  697. {
  698. if (pData->bIsRGBA16) /* 16-bit input row ? */
  699. {
  700. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  701. iX += pData->iColinc)
  702. { /* scale down by dropping the LSB */
  703. *pScanline = *pDataline;
  704. *(pScanline+1) = *(pDataline+2);
  705. *(pScanline+2) = *(pDataline+4);
  706. *(pScanline+3) = *(pDataline+6);
  707. pScanline += (pData->iColinc << 2);
  708. pDataline += 8;
  709. }
  710. }
  711. else
  712. {
  713. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  714. iX += pData->iColinc)
  715. { /* copy the values */
  716. *pScanline = *pDataline;
  717. *(pScanline+1) = *(pDataline+1);
  718. *(pScanline+2) = *(pDataline+2);
  719. *(pScanline+3) = *(pDataline+3);
  720. pScanline += (pData->iColinc << 2);
  721. pDataline += 4;
  722. }
  723. }
  724. }
  725. else
  726. {
  727. if (pData->bIsRGBA16) /* 16-bit input row ? */
  728. {
  729. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  730. iX += pData->iColinc)
  731. { /* get alpha values */
  732. iFGa16 = mng_get_uint16 (pDataline+6);
  733. iBGa16 = (mng_uint16)(*(pScanline+3));
  734. iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16;
  735. if (iFGa16) /* any opacity at all ? */
  736. { /* fully opaque or background fully transparent ? */
  737. if ((iFGa16 == 0xFFFF) || (iBGa16 == 0))
  738. { /* plain copy it */
  739. *pScanline = *pDataline;
  740. *(pScanline+1) = *(pDataline+2);
  741. *(pScanline+2) = *(pDataline+4);
  742. *(pScanline+3) = *(pDataline+6);
  743. }
  744. else
  745. {
  746. if (iBGa16 == 0xFFFF) /* background fully opaque ? */
  747. { /* get the proper values */
  748. iFGr16 = mng_get_uint16 (pDataline );
  749. iFGg16 = mng_get_uint16 (pDataline+2);
  750. iFGb16 = mng_get_uint16 (pDataline+4);
  751. /* scale background up */
  752. iBGr16 = (mng_uint16)(*pScanline );
  753. iBGg16 = (mng_uint16)(*(pScanline+1));
  754. iBGb16 = (mng_uint16)(*(pScanline+2));
  755. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  756. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  757. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  758. /* now compose */
  759. MNG_COMPOSE16(iFGr16, iFGr16, iFGa16, iBGr16);
  760. MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16);
  761. MNG_COMPOSE16(iFGb16, iFGb16, iFGa16, iBGb16);
  762. /* and return the composed values */
  763. *pScanline = (mng_uint8)(iFGr16 >> 8);
  764. *(pScanline+1) = (mng_uint8)(iFGg16 >> 8);
  765. *(pScanline+2) = (mng_uint8)(iFGb16 >> 8);
  766. /* alpha remains fully opaque !!! */
  767. }
  768. else
  769. { /* scale background up */
  770. iBGr16 = (mng_uint16)(*pScanline );
  771. iBGg16 = (mng_uint16)(*(pScanline+1));
  772. iBGb16 = (mng_uint16)(*(pScanline+2));
  773. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  774. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  775. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  776. /* let's blend */
  777. MNG_BLEND16 (mng_get_uint16 (pDataline ),
  778. mng_get_uint16 (pDataline+2),
  779. mng_get_uint16 (pDataline+4), iFGa16,
  780. iBGr16, iBGg16, iBGb16, iBGa16,
  781. iCr16, iCg16, iCb16, iCa16);
  782. /* and return the composed values */
  783. *pScanline = (mng_uint8)(iCr16 >> 8);
  784. *(pScanline+1) = (mng_uint8)(iCg16 >> 8);
  785. *(pScanline+2) = (mng_uint8)(iCb16 >> 8);
  786. *(pScanline+3) = (mng_uint8)(iCa16 >> 8);
  787. }
  788. }
  789. }
  790. pScanline += (pData->iColinc << 2);
  791. pDataline += 8;
  792. }
  793. }
  794. else
  795. {
  796. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  797. iX += pData->iColinc)
  798. {
  799. iFGa8 = *(pDataline+3); /* get alpha values */
  800. iBGa8 = *(pScanline+3);
  801. if (iFGa8) /* any opacity at all ? */
  802. { /* fully opaque or background fully transparent ? */
  803. if ((iFGa8 == 0xFF) || (iBGa8 == 0))
  804. { /* then simply copy the values */
  805. *pScanline = *pDataline;
  806. *(pScanline+1) = *(pDataline+1);
  807. *(pScanline+2) = *(pDataline+2);
  808. *(pScanline+3) = *(pDataline+3);
  809. }
  810. else
  811. {
  812. if (iBGa8 == 0xFF) /* background fully opaque ? */
  813. { /* do alpha composing */
  814. MNG_COMPOSE8 (*pScanline, *pDataline, iFGa8, *pScanline );
  815. MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iFGa8, *(pScanline+1));
  816. MNG_COMPOSE8 (*(pScanline+2), *(pDataline+2), iFGa8, *(pScanline+2));
  817. /* alpha remains fully opaque !!! */
  818. }
  819. else
  820. { /* now blend */
  821. MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8,
  822. *pScanline, *(pScanline+1), *(pScanline+2), iBGa8,
  823. iCr8, iCg8, iCb8, iCa8);
  824. /* and return the composed values */
  825. *pScanline = iCr8;
  826. *(pScanline+1) = iCg8;
  827. *(pScanline+2) = iCb8;
  828. *(pScanline+3) = iCa8;
  829. }
  830. }
  831. }
  832. pScanline += (pData->iColinc << 2);
  833. pDataline += 4;
  834. }
  835. }
  836. }
  837. }
  838. check_update_region (pData);
  839. #ifdef MNG_SUPPORT_TRACE
  840. MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA8, MNG_LC_END);
  841. #endif
  842. return MNG_NOERROR;
  843. }
  844. #else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  845. mng_retcode mng_display_rgba8 (mng_datap pData)
  846. {
  847. mng_uint8p pScanline;
  848. mng_uint8p pDataline;
  849. mng_int32 iX;
  850. mng_uint8 iFGa8, iBGa8, iCa8;
  851. mng_uint16 iFGa16, iBGa16, iCa16;
  852. mng_uint16 iFGg16;
  853. mng_uint16 iBGr16, iBGg16, iBGb16;
  854. mng_uint16 iCr16, iCg16, iCb16;
  855. mng_uint8 iCr8, iCg8, iCb8;
  856. mng_uint8 iBps;
  857. #ifdef MNG_SUPPORT_TRACE
  858. MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA8, MNG_LC_START);
  859. #endif
  860. iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1);
  861. /* viewable row ? */
  862. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  863. { /* address destination row */
  864. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  865. pData->iRow + pData->iDestt -
  866. pData->iSourcet);
  867. /* adjust destination row starting-point */
  868. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  869. pDataline = pData->pRGBArow; /* address source row */
  870. /* adjust source row starting-point */
  871. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1));
  872. if (pData->bIsOpaque) /* forget about transparency ? */
  873. {
  874. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  875. iX += pData->iColinc)
  876. { /* scale down by dropping the LSB */
  877. *pScanline = *pDataline;
  878. *(pScanline+1) = *(pDataline+iBps);
  879. *(pScanline+2) = *(pDataline+2*iBps);
  880. *(pScanline+3) = *(pDataline+3*iBps);
  881. pScanline += (pData->iColinc << 2);
  882. pDataline += 4*iBps;
  883. }
  884. }
  885. else
  886. {
  887. if (pData->bIsRGBA16) /* 16-bit input row ? */
  888. {
  889. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  890. iX += pData->iColinc)
  891. { /* get alpha values */
  892. iFGa16 = mng_get_uint16 (pDataline+6);
  893. iBGa16 = (mng_uint16)(*(pScanline+3));
  894. iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16;
  895. if (iFGa16) /* any opacity at all ? */
  896. { /* fully opaque or background fully transparent ? */
  897. if ((iFGa16 == 0xFFFF) || (iBGa16 == 0))
  898. { /* plain copy it */
  899. *pScanline = *pDataline;
  900. *(pScanline+1) = *(pDataline+2);
  901. *(pScanline+2) = *(pDataline+4);
  902. *(pScanline+3) = *(pDataline+6);
  903. }
  904. else
  905. {
  906. if (iBGa16 == 0xFFFF) /* background fully opaque ? */
  907. { /* get the proper values */
  908. int i;
  909. for (i=2; i >= 0; i--)
  910. {
  911. iFGg16 = mng_get_uint16 (pDataline+i+i);
  912. /* scale background up */
  913. iBGg16 = (mng_uint16)(*(pScanline+i));
  914. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  915. /* now compose */
  916. MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16);
  917. /* and return the composed values */
  918. *(pScanline+i) = (mng_uint8)(iFGg16 >> 8);
  919. /* alpha remains fully opaque !!! */
  920. }
  921. }
  922. else
  923. { /* scale background up */
  924. iBGr16 = (mng_uint16)(*pScanline );
  925. iBGg16 = (mng_uint16)(*(pScanline+1));
  926. iBGb16 = (mng_uint16)(*(pScanline+2));
  927. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  928. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  929. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  930. /* let's blend */
  931. MNG_BLEND16 (mng_get_uint16 (pDataline ),
  932. mng_get_uint16 (pDataline+2),
  933. mng_get_uint16 (pDataline+4), iFGa16,
  934. iBGr16, iBGg16, iBGb16, iBGa16,
  935. iCr16, iCg16, iCb16, iCa16);
  936. /* and return the composed values */
  937. *pScanline = (mng_uint8)(iCr16 >> 8);
  938. *(pScanline+1) = (mng_uint8)(iCg16 >> 8);
  939. *(pScanline+2) = (mng_uint8)(iCb16 >> 8);
  940. *(pScanline+3) = (mng_uint8)(iCa16 >> 8);
  941. }
  942. }
  943. }
  944. pScanline += (pData->iColinc << 2);
  945. pDataline += 8;
  946. }
  947. }
  948. else
  949. {
  950. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  951. iX += pData->iColinc)
  952. {
  953. iFGa8 = *(pDataline+3); /* get alpha values */
  954. iBGa8 = *(pScanline+3);
  955. if (iFGa8) /* any opacity at all ? */
  956. { /* fully opaque or background fully transparent ? */
  957. if ((iFGa8 == 0xFF) || (iBGa8 == 0))
  958. { /* then simply copy the values */
  959. *pScanline = *pDataline;
  960. *(pScanline+1) = *(pDataline+1);
  961. *(pScanline+2) = *(pDataline+2);
  962. *(pScanline+3) = *(pDataline+3);
  963. }
  964. else
  965. {
  966. if (iBGa8 == 0xFF) /* background fully opaque ? */
  967. { /* do alpha composing */
  968. int i;
  969. for (i=2; i >= 0; i--)
  970. {
  971. MNG_COMPOSE8 (*(pScanline+i), *(pDataline+i), iFGa8, *(pScanline+i));
  972. }
  973. /* alpha remains fully opaque !!! */
  974. }
  975. else
  976. { /* now blend */
  977. MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8,
  978. *pScanline, *(pScanline+1), *(pScanline+2), iBGa8,
  979. iCr8, iCg8, iCb8, iCa8);
  980. /* and return the composed values */
  981. *pScanline = iCr8;
  982. *(pScanline+1) = iCg8;
  983. *(pScanline+2) = iCb8;
  984. *(pScanline+3) = iCa8;
  985. }
  986. }
  987. }
  988. pScanline += (pData->iColinc << 2);
  989. pDataline += 4;
  990. }
  991. }
  992. }
  993. }
  994. check_update_region (pData);
  995. #ifdef MNG_SUPPORT_TRACE
  996. MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA8, MNG_LC_END);
  997. #endif
  998. return MNG_NOERROR;
  999. }
  1000. #endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  1001. #else /* MNG_NO_16BIT_SUPPORT */
  1002. mng_retcode mng_display_rgba8 (mng_datap pData)
  1003. {
  1004. mng_uint8p pScanline;
  1005. mng_uint8p pDataline;
  1006. mng_int32 iX;
  1007. mng_uint8 iFGa8, iBGa8, iCa8;
  1008. mng_uint8 iCr8, iCg8, iCb8;
  1009. #ifdef MNG_SUPPORT_TRACE
  1010. MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA8, MNG_LC_START);
  1011. #endif
  1012. /* viewable row ? */
  1013. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  1014. { /* address destination row */
  1015. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  1016. pData->iRow + pData->iDestt -
  1017. pData->iSourcet);
  1018. /* adjust destination row starting-point */
  1019. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  1020. pDataline = pData->pRGBArow; /* address source row */
  1021. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  1022. if (pData->bIsOpaque) /* forget about transparency ? */
  1023. {
  1024. {
  1025. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  1026. iX += pData->iColinc)
  1027. { /* copy the values */
  1028. *pScanline = *pDataline;
  1029. *(pScanline+1) = *(pDataline+1);
  1030. *(pScanline+2) = *(pDataline+2);
  1031. *(pScanline+3) = *(pDataline+3);
  1032. pScanline += (pData->iColinc << 2);
  1033. pDataline += 4;
  1034. }
  1035. }
  1036. }
  1037. else
  1038. {
  1039. {
  1040. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  1041. iX += pData->iColinc)
  1042. {
  1043. iFGa8 = *(pDataline+3); /* get alpha values */
  1044. iBGa8 = *(pScanline+3);
  1045. if (iFGa8) /* any opacity at all ? */
  1046. { /* fully opaque or background fully transparent ? */
  1047. if ((iFGa8 == 0xFF) || (iBGa8 == 0))
  1048. { /* then simply copy the values */
  1049. *pScanline = *pDataline;
  1050. *(pScanline+1) = *(pDataline+1);
  1051. *(pScanline+2) = *(pDataline+2);
  1052. *(pScanline+3) = *(pDataline+3);
  1053. }
  1054. else
  1055. {
  1056. if (iBGa8 == 0xFF) /* background fully opaque ? */
  1057. { /* do alpha composing */
  1058. #ifdef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  1059. int i;
  1060. for (i=2; i >= 0; i--)
  1061. {
  1062. MNG_COMPOSE8 (*(pScanline+i), *(pDataline+i), iFGa8, *(pScanline+i));
  1063. }
  1064. #else
  1065. MNG_COMPOSE8 (*pScanline, *pDataline, iFGa8, *pScanline );
  1066. MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iFGa8, *(pScanline+1));
  1067. MNG_COMPOSE8 (*(pScanline+2), *(pDataline+2), iFGa8, *(pScanline+2));
  1068. #endif
  1069. /* alpha remains fully opaque !!! */
  1070. }
  1071. else
  1072. { /* now blend */
  1073. MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8,
  1074. *pScanline, *(pScanline+1), *(pScanline+2), iBGa8,
  1075. iCr8, iCg8, iCb8, iCa8);
  1076. /* and return the composed values */
  1077. *pScanline = iCr8;
  1078. *(pScanline+1) = iCg8;
  1079. *(pScanline+2) = iCb8;
  1080. *(pScanline+3) = iCa8;
  1081. }
  1082. }
  1083. }
  1084. pScanline += (pData->iColinc << 2);
  1085. pDataline += 4;
  1086. }
  1087. }
  1088. }
  1089. }
  1090. check_update_region (pData);
  1091. #ifdef MNG_SUPPORT_TRACE
  1092. MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA8, MNG_LC_END);
  1093. #endif
  1094. return MNG_NOERROR;
  1095. }
  1096. #endif /* MNG_NO_16BIT_SUPPORT */
  1097. #endif /* MNG_SKIPCANVAS_RGBA8 */
  1098. /* ************************************************************************** */
  1099. #ifndef MNG_SKIPCANVAS_RGBA8_PM
  1100. #ifndef MNG_NO_16BIT_SUPPORT
  1101. #ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  1102. mng_retcode mng_display_rgba8_pm (mng_datap pData)
  1103. {
  1104. mng_uint8p pScanline;
  1105. mng_uint8p pDataline;
  1106. mng_int32 iX;
  1107. mng_uint32 s, t;
  1108. #ifdef MNG_SUPPORT_TRACE
  1109. MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA8_PM, MNG_LC_START);
  1110. #endif
  1111. /* viewable row ? */
  1112. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  1113. { /* address destination row */
  1114. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  1115. pData->iRow + pData->iDestt -
  1116. pData->iSourcet);
  1117. /* adjust destination row starting-point */
  1118. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  1119. pDataline = pData->pRGBArow; /* address source row */
  1120. if (pData->bIsRGBA16) /* adjust source row starting-point */
  1121. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3);
  1122. else
  1123. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  1124. if (pData->bIsOpaque) /* forget about transparency ? */
  1125. {
  1126. if (pData->bIsRGBA16) /* 16-bit input row ? */
  1127. {
  1128. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  1129. iX += pData->iColinc)
  1130. { /* scale down by dropping the LSB */
  1131. if ((s = pDataline[6]) == 0)
  1132. *(mng_uint32*) pScanline = 0; /* set all components = 0 */
  1133. else
  1134. {
  1135. if (s == 255)
  1136. {
  1137. pScanline[0] = pDataline[0];
  1138. pScanline[1] = pDataline[2];
  1139. pScanline[2] = pDataline[4];
  1140. pScanline[3] = 255;
  1141. }
  1142. else
  1143. {
  1144. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  1145. int i;
  1146. for (i=2; i >= 0; i--)
  1147. {
  1148. pScanline[2-i] = DIV255B8(s * pDataline[4-i-i]);
  1149. }
  1150. #else
  1151. pScanline[0] = DIV255B8(s * pDataline[0]);
  1152. pScanline[1] = DIV255B8(s * pDataline[2]);
  1153. pScanline[2] = DIV255B8(s * pDataline[4]);
  1154. #endif
  1155. pScanline[3] = (mng_uint8)s;
  1156. }
  1157. }
  1158. pScanline += (pData->iColinc << 2);
  1159. pDataline += 8;
  1160. }
  1161. }
  1162. else
  1163. {
  1164. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  1165. iX += pData->iColinc)
  1166. { /* copy the values and premultiply */
  1167. if ((s = pDataline[3]) == 0)
  1168. *(mng_uint32*) pScanline = 0; /* set all components = 0 */
  1169. else
  1170. {
  1171. if (s == 255)
  1172. {
  1173. #ifdef MNG_BIGENDIAN_SUPPORTED
  1174. *(mng_uint32*)pScanline = (*(mng_uint32*)pDataline) | 0x000000FF;
  1175. #else
  1176. pScanline[0] = pDataline[0];
  1177. pScanline[1] = pDataline[1];
  1178. pScanline[2] = pDataline[2];
  1179. pScanline[3] = 255;
  1180. #endif
  1181. }
  1182. else
  1183. {
  1184. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  1185. int i;
  1186. for (i=2; i >= 0; i--)
  1187. {
  1188. pScanline[2-i] = DIV255B8(s * pDataline[2-i]);
  1189. }
  1190. #else
  1191. pScanline[0] = DIV255B8(s * pDataline[0]);
  1192. pScanline[1] = DIV255B8(s * pDataline[1]);
  1193. pScanline[2] = DIV255B8(s * pDataline[2]);
  1194. #endif
  1195. pScanline[3] = (mng_uint8)s;
  1196. }
  1197. }
  1198. pScanline += (pData->iColinc << 2);
  1199. pDataline += 4;
  1200. }
  1201. }
  1202. }
  1203. else
  1204. {
  1205. if (pData->bIsRGBA16) /* 16-bit input row ? */
  1206. {
  1207. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  1208. iX += pData->iColinc)
  1209. { /* get alpha values */
  1210. if ((s = pDataline[6]) != 0) /* any opacity at all ? */
  1211. { /* fully opaque or background fully transparent ? */
  1212. if (s == 255)
  1213. { /* plain copy it */
  1214. pScanline[0] = pDataline[0];
  1215. pScanline[1] = pDataline[2];
  1216. pScanline[2] = pDataline[4];
  1217. pScanline[3] = 255;
  1218. }
  1219. else
  1220. { /* now blend (premultiplied) */
  1221. t = 255 - s;
  1222. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  1223. {
  1224. int i;
  1225. for (i=2; i >= 0; i--)
  1226. {
  1227. pScanline[2-i] = DIV255B8(s * pDataline[4-i-i] + t *
  1228. pScanline[2-i]);
  1229. }
  1230. }
  1231. #else
  1232. pScanline[0] = DIV255B8(s * pDataline[0] + t * pScanline[0]);
  1233. pScanline[1] = DIV255B8(s * pDataline[2] + t * pScanline[1]);
  1234. pScanline[2] = DIV255B8(s * pDataline[4] + t * pScanline[2]);
  1235. #endif
  1236. pScanline[3] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[3])));
  1237. }
  1238. }
  1239. pScanline += (pData->iColinc << 2);
  1240. pDataline += 8;
  1241. }
  1242. }
  1243. else
  1244. {
  1245. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  1246. iX += pData->iColinc)
  1247. {
  1248. if ((s = pDataline[3]) != 0) /* any opacity at all ? */
  1249. { /* fully opaque ? */
  1250. if (s == 255)
  1251. { /* then simply copy the values */
  1252. #ifdef MNG_BIGENDIAN_SUPPORTED
  1253. *(mng_uint32*)pScanline = (*(mng_uint32*)pDataline) | 0x000000FF;
  1254. #else
  1255. pScanline[0] = pDataline[0];
  1256. pScanline[1] = pDataline[1];
  1257. pScanline[2] = pDataline[2];
  1258. pScanline[3] = 255;
  1259. #endif
  1260. }
  1261. else
  1262. { /* now blend (premultiplied) */
  1263. t = 255 - s;
  1264. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  1265. {
  1266. int i;
  1267. for (i=2; i >= 0; i--)
  1268. {
  1269. pScanline[2-i] = DIV255B8(s * pDataline[2-i] + t *
  1270. pScanline[2-i]);
  1271. }
  1272. }
  1273. #else
  1274. pScanline[0] = DIV255B8(s * pDataline[0] + t * pScanline[0]);
  1275. pScanline[1] = DIV255B8(s * pDataline[1] + t * pScanline[1]);
  1276. pScanline[2] = DIV255B8(s * pDataline[2] + t * pScanline[2]);
  1277. #endif
  1278. pScanline[3] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[3])));
  1279. }
  1280. }
  1281. pScanline += (pData->iColinc << 2);
  1282. pDataline += 4;
  1283. }
  1284. }
  1285. }
  1286. }
  1287. check_update_region (pData);
  1288. #ifdef MNG_SUPPORT_TRACE
  1289. MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA8_PM, MNG_LC_END);
  1290. #endif
  1291. return MNG_NOERROR;
  1292. }
  1293. #else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  1294. mng_retcode mng_display_rgba8_pm (mng_datap pData)
  1295. {
  1296. mng_uint8p pScanline;
  1297. mng_uint8p pDataline;
  1298. mng_int32 iX;
  1299. mng_uint32 s, t;
  1300. mng_uint8 iBps;
  1301. #ifdef MNG_SUPPORT_TRACE
  1302. MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA8_PM, MNG_LC_START);
  1303. #endif
  1304. iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1);
  1305. /* viewable row ? */
  1306. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  1307. { /* address destination row */
  1308. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  1309. pData->iRow + pData->iDestt -
  1310. pData->iSourcet);
  1311. /* adjust destination row starting-point */
  1312. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  1313. pDataline = pData->pRGBArow; /* address source row */
  1314. /* adjust source row starting-point */
  1315. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1));
  1316. if (pData->bIsOpaque) /* forget about transparency ? */
  1317. {
  1318. if (pData->bIsRGBA16) /* 16-bit input row ? */
  1319. {
  1320. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  1321. iX += pData->iColinc)
  1322. { /* scale down by dropping the LSB */
  1323. if ((s = pDataline[6]) == 0)
  1324. *(mng_uint32*) pScanline = 0; /* set all components = 0 */
  1325. else
  1326. {
  1327. if (s == 255)
  1328. {
  1329. pScanline[0] = pDataline[0];
  1330. pScanline[1] = pDataline[2];
  1331. pScanline[2] = pDataline[4];
  1332. pScanline[3] = 255;
  1333. }
  1334. else
  1335. {
  1336. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  1337. int i;
  1338. for (i=2; i >= 0; i--)
  1339. {
  1340. pScanline[2-i] = DIV255B8(s * pDataline[4-i-i]);
  1341. }
  1342. #else
  1343. pScanline[0] = DIV255B8(s * pDataline[0]);
  1344. pScanline[1] = DIV255B8(s * pDataline[2]);
  1345. pScanline[2] = DIV255B8(s * pDataline[4]);
  1346. #endif
  1347. pScanline[3] = (mng_uint8)s;
  1348. }
  1349. }
  1350. pScanline += (pData->iColinc << 2);
  1351. pDataline += 8;
  1352. }
  1353. }
  1354. else
  1355. {
  1356. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  1357. iX += pData->iColinc)
  1358. { /* copy the values and premultiply */
  1359. if ((s = pDataline[3]) == 0)
  1360. *(mng_uint32*) pScanline = 0; /* set all components = 0 */
  1361. else
  1362. {
  1363. if (s == 255)
  1364. {
  1365. #ifdef MNG_BIGENDIAN_SUPPORTED
  1366. *(mng_uint32*)pScanline = (*(mng_uint32*)pDataline) | 0x000000FF;
  1367. #else
  1368. pScanline[0] = pDataline[0];
  1369. pScanline[1] = pDataline[1];
  1370. pScanline[2] = pDataline[2];
  1371. pScanline[3] = 255;
  1372. #endif
  1373. }
  1374. else
  1375. {
  1376. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  1377. int i;
  1378. for (i=2; i >= 0; i--)
  1379. {
  1380. pScanline[2-i] = DIV255B8(s * pDataline[2-i]);
  1381. }
  1382. #else
  1383. pScanline[0] = DIV255B8(s * pDataline[0]);
  1384. pScanline[1] = DIV255B8(s * pDataline[1]);
  1385. pScanline[2] = DIV255B8(s * pDataline[2]);
  1386. #endif
  1387. pScanline[3] = (mng_uint8)s;
  1388. }
  1389. }
  1390. pScanline += (pData->iColinc << 2);
  1391. pDataline += 4;
  1392. }
  1393. }
  1394. }
  1395. else
  1396. {
  1397. if (pData->bIsRGBA16) /* 16-bit input row ? */
  1398. {
  1399. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  1400. iX += pData->iColinc)
  1401. { /* get alpha values */
  1402. if ((s = pDataline[6]) != 0) /* any opacity at all ? */
  1403. { /* fully opaque or background fully transparent ? */
  1404. if (s == 255)
  1405. { /* plain copy it */
  1406. pScanline[0] = pDataline[0];
  1407. pScanline[1] = pDataline[2];
  1408. pScanline[2] = pDataline[4];
  1409. pScanline[3] = 255;
  1410. }
  1411. else
  1412. { /* now blend (premultiplied) */
  1413. t = 255 - s;
  1414. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  1415. {
  1416. int i;
  1417. for (i=2; i >= 0; i--)
  1418. {
  1419. pScanline[2-i] = DIV255B8(s * pDataline[4-i-i] + t *
  1420. pScanline[2-i]);
  1421. }
  1422. }
  1423. #else
  1424. pScanline[0] = DIV255B8(s * pDataline[0] + t * pScanline[0]);
  1425. pScanline[1] = DIV255B8(s * pDataline[2] + t * pScanline[1]);
  1426. pScanline[2] = DIV255B8(s * pDataline[4] + t * pScanline[2]);
  1427. #endif
  1428. pScanline[3] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[3])));
  1429. }
  1430. }
  1431. pScanline += (pData->iColinc << 2);
  1432. pDataline += 8;
  1433. }
  1434. }
  1435. else
  1436. {
  1437. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  1438. iX += pData->iColinc)
  1439. {
  1440. if ((s = pDataline[3]) != 0) /* any opacity at all ? */
  1441. { /* fully opaque ? */
  1442. if (s == 255)
  1443. { /* then simply copy the values */
  1444. #ifdef MNG_BIGENDIAN_SUPPORTED
  1445. *(mng_uint32*)pScanline = (*(mng_uint32*)pDataline) | 0x000000FF;
  1446. #else
  1447. pScanline[0] = pDataline[0];
  1448. pScanline[1] = pDataline[1];
  1449. pScanline[2] = pDataline[2];
  1450. pScanline[3] = 255;
  1451. #endif
  1452. }
  1453. else
  1454. { /* now blend (premultiplied) */
  1455. t = 255 - s;
  1456. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  1457. {
  1458. int i;
  1459. for (i=2; i >= 0; i--)
  1460. {
  1461. pScanline[2-i] = DIV255B8(s * pDataline[2-i] + t *
  1462. pScanline[2-i]);
  1463. }
  1464. }
  1465. #else
  1466. pScanline[0] = DIV255B8(s * pDataline[0] + t * pScanline[0]);
  1467. pScanline[1] = DIV255B8(s * pDataline[1] + t * pScanline[1]);
  1468. pScanline[2] = DIV255B8(s * pDataline[2] + t * pScanline[2]);
  1469. #endif
  1470. pScanline[3] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[3])));
  1471. }
  1472. }
  1473. pScanline += (pData->iColinc << 2);
  1474. pDataline += 4;
  1475. }
  1476. }
  1477. }
  1478. }
  1479. check_update_region (pData);
  1480. #ifdef MNG_SUPPORT_TRACE
  1481. MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA8_PM, MNG_LC_END);
  1482. #endif
  1483. return MNG_NOERROR;
  1484. }
  1485. #endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  1486. #else /* MNG_NO_16BIT_SUPPORT */
  1487. mng_retcode mng_display_rgba8_pm (mng_datap pData)
  1488. {
  1489. mng_uint8p pScanline;
  1490. mng_uint8p pDataline;
  1491. mng_int32 iX;
  1492. mng_uint32 s, t;
  1493. #ifdef MNG_SUPPORT_TRACE
  1494. MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA8_PM, MNG_LC_START);
  1495. #endif
  1496. /* viewable row ? */
  1497. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  1498. { /* address destination row */
  1499. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  1500. pData->iRow + pData->iDestt -
  1501. pData->iSourcet);
  1502. /* adjust destination row starting-point */
  1503. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  1504. pDataline = pData->pRGBArow; /* address source row */
  1505. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  1506. if (pData->bIsOpaque) /* forget about transparency ? */
  1507. {
  1508. {
  1509. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  1510. iX += pData->iColinc)
  1511. { /* copy the values and premultiply */
  1512. if ((s = pDataline[3]) == 0)
  1513. *(mng_uint32*) pScanline = 0; /* set all components = 0 */
  1514. else
  1515. {
  1516. if (s == 255)
  1517. {
  1518. #ifdef MNG_BIGENDIAN_SUPPORTED
  1519. *(mng_uint32*)pScanline = (*(mng_uint32*)pDataline) | 0x000000FF;
  1520. #else
  1521. pScanline[0] = pDataline[0];
  1522. pScanline[1] = pDataline[1];
  1523. pScanline[2] = pDataline[2];
  1524. pScanline[3] = 255;
  1525. #endif
  1526. }
  1527. else
  1528. {
  1529. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  1530. int i;
  1531. for (i=2; i >= 0; i--)
  1532. {
  1533. pScanline[2-i] = DIV255B8(s * pDataline[2-i]);
  1534. }
  1535. #else
  1536. pScanline[0] = DIV255B8(s * pDataline[0]);
  1537. pScanline[1] = DIV255B8(s * pDataline[1]);
  1538. pScanline[2] = DIV255B8(s * pDataline[2]);
  1539. #endif
  1540. pScanline[3] = (mng_uint8)s;
  1541. }
  1542. }
  1543. pScanline += (pData->iColinc << 2);
  1544. pDataline += 4;
  1545. }
  1546. }
  1547. }
  1548. else
  1549. {
  1550. {
  1551. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  1552. iX += pData->iColinc)
  1553. {
  1554. if ((s = pDataline[3]) != 0) /* any opacity at all ? */
  1555. { /* fully opaque ? */
  1556. if (s == 255)
  1557. { /* then simply copy the values */
  1558. #ifdef MNG_BIGENDIAN_SUPPORTED
  1559. *(mng_uint32*)pScanline = (*(mng_uint32*)pDataline) | 0x000000FF;
  1560. #else
  1561. pScanline[0] = pDataline[0];
  1562. pScanline[1] = pDataline[1];
  1563. pScanline[2] = pDataline[2];
  1564. pScanline[3] = 255;
  1565. #endif
  1566. }
  1567. else
  1568. { /* now blend (premultiplied) */
  1569. t = 255 - s;
  1570. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  1571. {
  1572. int i;
  1573. for (i=2; i >= 0; i--)
  1574. {
  1575. pScanline[2-i] = DIV255B8(s * pDataline[2-i] + t *
  1576. pScanline[2-i]);
  1577. }
  1578. }
  1579. #else
  1580. pScanline[0] = DIV255B8(s * pDataline[0] + t * pScanline[0]);
  1581. pScanline[1] = DIV255B8(s * pDataline[1] + t * pScanline[1]);
  1582. pScanline[2] = DIV255B8(s * pDataline[2] + t * pScanline[2]);
  1583. #endif
  1584. pScanline[3] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[3])));
  1585. }
  1586. }
  1587. pScanline += (pData->iColinc << 2);
  1588. pDataline += 4;
  1589. }
  1590. }
  1591. }
  1592. }
  1593. check_update_region (pData);
  1594. #ifdef MNG_SUPPORT_TRACE
  1595. MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA8_PM, MNG_LC_END);
  1596. #endif
  1597. return MNG_NOERROR;
  1598. }
  1599. #endif /* MNG_NO_16BIT_SUPPORT */
  1600. #endif /* MNG_SKIPCANVAS_RGBA8_PM */
  1601. /* ************************************************************************** */
  1602. #ifndef MNG_SKIPCANVAS_ARGB8
  1603. #ifndef MNG_NO_16BIT_SUPPORT
  1604. #ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  1605. mng_retcode mng_display_argb8 (mng_datap pData)
  1606. {
  1607. mng_uint8p pScanline;
  1608. mng_uint8p pDataline;
  1609. mng_int32 iX;
  1610. mng_uint8 iFGa8, iBGa8, iCa8;
  1611. mng_uint16 iFGa16, iBGa16, iCa16;
  1612. mng_uint16 iFGr16, iFGg16, iFGb16;
  1613. mng_uint16 iBGr16, iBGg16, iBGb16;
  1614. mng_uint16 iCr16, iCg16, iCb16;
  1615. mng_uint8 iCr8, iCg8, iCb8;
  1616. #ifdef MNG_SUPPORT_TRACE
  1617. MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8, MNG_LC_START);
  1618. #endif
  1619. /* viewable row ? */
  1620. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  1621. { /* address destination row */
  1622. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  1623. pData->iRow + pData->iDestt -
  1624. pData->iSourcet);
  1625. /* adjust destination row starting-point */
  1626. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  1627. pDataline = pData->pRGBArow; /* address source row */
  1628. if (pData->bIsRGBA16) /* adjust source row starting-point */
  1629. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3);
  1630. else
  1631. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  1632. if (pData->bIsOpaque) /* forget about transparency ? */
  1633. {
  1634. if (pData->bIsRGBA16) /* 16-bit input row ? */
  1635. {
  1636. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  1637. iX += pData->iColinc)
  1638. { /* scale down by dropping the LSB */
  1639. *pScanline = *(pDataline+6);
  1640. *(pScanline+1) = *pDataline;
  1641. *(pScanline+2) = *(pDataline+2);
  1642. *(pScanline+3) = *(pDataline+4);
  1643. pScanline += (pData->iColinc << 2);
  1644. pDataline += 8;
  1645. }
  1646. }
  1647. else
  1648. {
  1649. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  1650. iX += pData->iColinc)
  1651. { /* copy the values */
  1652. *pScanline = *(pDataline+3);
  1653. *(pScanline+1) = *pDataline;
  1654. *(pScanline+2) = *(pDataline+1);
  1655. *(pScanline+3) = *(pDataline+2);
  1656. pScanline += (pData->iColinc << 2);
  1657. pDataline += 4;
  1658. }
  1659. }
  1660. }
  1661. else
  1662. {
  1663. if (pData->bIsRGBA16) /* 16-bit input row ? */
  1664. {
  1665. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  1666. iX += pData->iColinc)
  1667. { /* get alpha values */
  1668. iFGa16 = mng_get_uint16 (pDataline+6);
  1669. iBGa16 = (mng_uint16)(*pScanline);
  1670. iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16;
  1671. if (iFGa16) /* any opacity at all ? */
  1672. { /* fully opaque or background fully transparent ? */
  1673. if ((iFGa16 == 0xFFFF) || (iBGa16 == 0))
  1674. { /* plain copy it */
  1675. *pScanline = *(pDataline+6);
  1676. *(pScanline+1) = *pDataline;
  1677. *(pScanline+2) = *(pDataline+2);
  1678. *(pScanline+3) = *(pDataline+4);
  1679. }
  1680. else
  1681. {
  1682. if (iBGa16 == 0xFFFF) /* background fully opaque ? */
  1683. { /* get the proper values */
  1684. iFGr16 = mng_get_uint16 (pDataline );
  1685. iFGg16 = mng_get_uint16 (pDataline+2);
  1686. iFGb16 = mng_get_uint16 (pDataline+4);
  1687. /* scale background up */
  1688. iBGr16 = (mng_uint16)(*(pScanline+1));
  1689. iBGg16 = (mng_uint16)(*(pScanline+2));
  1690. iBGb16 = (mng_uint16)(*(pScanline+3));
  1691. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  1692. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  1693. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  1694. /* now compose */
  1695. MNG_COMPOSE16(iFGr16, iFGr16, iFGa16, iBGr16);
  1696. MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16);
  1697. MNG_COMPOSE16(iFGb16, iFGb16, iFGa16, iBGb16);
  1698. /* and return the composed values */
  1699. /* alpha remains fully opaque !!! */
  1700. *(pScanline+1) = (mng_uint8)(iFGr16 >> 8);
  1701. *(pScanline+2) = (mng_uint8)(iFGg16 >> 8);
  1702. *(pScanline+3) = (mng_uint8)(iFGb16 >> 8);
  1703. }
  1704. else
  1705. { /* scale background up */
  1706. iBGr16 = (mng_uint16)(*(pScanline+1));
  1707. iBGg16 = (mng_uint16)(*(pScanline+2));
  1708. iBGb16 = (mng_uint16)(*(pScanline+3));
  1709. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  1710. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  1711. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  1712. /* let's blend */
  1713. MNG_BLEND16 (mng_get_uint16 (pDataline ),
  1714. mng_get_uint16 (pDataline+2),
  1715. mng_get_uint16 (pDataline+4), iFGa16,
  1716. iBGr16, iBGg16, iBGb16, iBGa16,
  1717. iCr16, iCg16, iCb16, iCa16);
  1718. /* and return the composed values */
  1719. *pScanline = (mng_uint8)(iCa16 >> 8);
  1720. *(pScanline+1) = (mng_uint8)(iCr16 >> 8);
  1721. *(pScanline+2) = (mng_uint8)(iCg16 >> 8);
  1722. *(pScanline+3) = (mng_uint8)(iCb16 >> 8);
  1723. }
  1724. }
  1725. }
  1726. pScanline += (pData->iColinc << 2);
  1727. pDataline += 8;
  1728. }
  1729. }
  1730. else
  1731. {
  1732. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  1733. iX += pData->iColinc)
  1734. {
  1735. iFGa8 = *(pDataline+3); /* get alpha values */
  1736. iBGa8 = *pScanline;
  1737. if (iFGa8) /* any opacity at all ? */
  1738. { /* fully opaque or background fully transparent ? */
  1739. if ((iFGa8 == 0xFF) || (iBGa8 == 0))
  1740. { /* then simply copy the values */
  1741. *pScanline = *(pDataline+3);
  1742. *(pScanline+1) = *pDataline;
  1743. *(pScanline+2) = *(pDataline+1);
  1744. *(pScanline+3) = *(pDataline+2);
  1745. }
  1746. else
  1747. {
  1748. if (iBGa8 == 0xFF) /* background fully opaque ? */
  1749. { /* do simple alpha composing */
  1750. /* alpha itself remains fully opaque !!! */
  1751. }
  1752. else
  1753. { /* now blend */
  1754. MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8,
  1755. *(pScanline+1), *(pScanline+2), *(pScanline+3), iBGa8,
  1756. iCr8, iCg8, iCb8, iCa8);
  1757. /* and return the composed values */
  1758. *pScanline = iCa8;
  1759. *(pScanline+1) = iCr8;
  1760. *(pScanline+2) = iCg8;
  1761. *(pScanline+3) = iCb8;
  1762. }
  1763. }
  1764. }
  1765. pScanline += (pData->iColinc << 2);
  1766. pDataline += 4;
  1767. }
  1768. }
  1769. }
  1770. }
  1771. check_update_region (pData);
  1772. #ifdef MNG_SUPPORT_TRACE
  1773. MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8, MNG_LC_END);
  1774. #endif
  1775. return MNG_NOERROR;
  1776. }
  1777. #else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  1778. mng_retcode mng_display_argb8 (mng_datap pData)
  1779. {
  1780. mng_uint8p pScanline;
  1781. mng_uint8p pDataline;
  1782. mng_int32 iX;
  1783. mng_uint8 iFGa8, iBGa8, iCa8;
  1784. mng_uint16 iFGa16, iBGa16, iCa16;
  1785. mng_uint16 iFGg16;
  1786. mng_uint16 iBGr16, iBGg16, iBGb16;
  1787. mng_uint16 iCr16, iCg16, iCb16;
  1788. mng_uint8 iCr8, iCg8, iCb8;
  1789. mng_uint8 iBps;
  1790. #ifdef MNG_SUPPORT_TRACE
  1791. MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8, MNG_LC_START);
  1792. #endif
  1793. iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1);
  1794. /* viewable row ? */
  1795. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  1796. { /* address destination row */
  1797. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  1798. pData->iRow + pData->iDestt -
  1799. pData->iSourcet);
  1800. /* adjust destination row starting-point */
  1801. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  1802. pDataline = pData->pRGBArow; /* address source row */
  1803. /* adjust source row starting-point */
  1804. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1));
  1805. if (pData->bIsOpaque) /* forget about transparency ? */
  1806. {
  1807. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  1808. iX += pData->iColinc)
  1809. { /* scale down by dropping the LSB */
  1810. *pScanline = *(pDataline+3*iBps);
  1811. *(pScanline+1) = *pDataline;
  1812. *(pScanline+2) = *(pDataline+iBps);
  1813. *(pScanline+3) = *(pDataline+2*iBps);
  1814. pScanline += (pData->iColinc << 2);
  1815. pDataline += 4*iBps;
  1816. }
  1817. }
  1818. else
  1819. {
  1820. if (pData->bIsRGBA16) /* 16-bit input row ? */
  1821. {
  1822. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  1823. iX += pData->iColinc)
  1824. { /* get alpha values */
  1825. iFGa16 = mng_get_uint16 (pDataline+6);
  1826. iBGa16 = (mng_uint16)(*pScanline);
  1827. iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16;
  1828. if (iFGa16) /* any opacity at all ? */
  1829. { /* fully opaque or background fully transparent ? */
  1830. if ((iFGa16 == 0xFFFF) || (iBGa16 == 0))
  1831. { /* plain copy it */
  1832. *pScanline = *(pDataline+6);
  1833. *(pScanline+1) = *pDataline;
  1834. *(pScanline+2) = *(pDataline+2);
  1835. *(pScanline+3) = *(pDataline+4);
  1836. }
  1837. else
  1838. {
  1839. if (iBGa16 == 0xFFFF) /* background fully opaque ? */
  1840. { /* get the proper values */
  1841. int i;
  1842. for (i=2; i >= 0; i--)
  1843. {
  1844. iFGg16 = mng_get_uint16 (pDataline+i+i);
  1845. /* scale background up */
  1846. iBGg16 = (mng_uint16)(*(pScanline+i+1));
  1847. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  1848. /* now compose */
  1849. MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16);
  1850. /* and return the composed values */
  1851. /* alpha remains fully opaque !!! */
  1852. *(pScanline+i+1) = (mng_uint8)(iFGg16 >> 8);
  1853. }
  1854. }
  1855. else
  1856. { /* scale background up */
  1857. iBGr16 = (mng_uint16)(*(pScanline+1));
  1858. iBGg16 = (mng_uint16)(*(pScanline+2));
  1859. iBGb16 = (mng_uint16)(*(pScanline+3));
  1860. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  1861. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  1862. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  1863. /* let's blend */
  1864. MNG_BLEND16 (mng_get_uint16 (pDataline ),
  1865. mng_get_uint16 (pDataline+2),
  1866. mng_get_uint16 (pDataline+4), iFGa16,
  1867. iBGr16, iBGg16, iBGb16, iBGa16,
  1868. iCr16, iCg16, iCb16, iCa16);
  1869. /* and return the composed values */
  1870. *pScanline = (mng_uint8)(iCa16 >> 8);
  1871. *(pScanline+1) = (mng_uint8)(iCr16 >> 8);
  1872. *(pScanline+2) = (mng_uint8)(iCg16 >> 8);
  1873. *(pScanline+3) = (mng_uint8)(iCb16 >> 8);
  1874. }
  1875. }
  1876. }
  1877. pScanline += (pData->iColinc << 2);
  1878. pDataline += 8;
  1879. }
  1880. }
  1881. else
  1882. {
  1883. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  1884. iX += pData->iColinc)
  1885. {
  1886. iFGa8 = *(pDataline+3); /* get alpha values */
  1887. iBGa8 = *pScanline;
  1888. if (iFGa8) /* any opacity at all ? */
  1889. { /* fully opaque or background fully transparent ? */
  1890. if ((iFGa8 == 0xFF) || (iBGa8 == 0))
  1891. { /* then simply copy the values */
  1892. *pScanline = *(pDataline+3);
  1893. *(pScanline+1) = *pDataline;
  1894. *(pScanline+2) = *(pDataline+1);
  1895. *(pScanline+3) = *(pDataline+2);
  1896. }
  1897. else
  1898. {
  1899. if (iBGa8 == 0xFF) /* background fully opaque ? */
  1900. { /* do simple alpha composing */
  1901. /* alpha itself remains fully opaque !!! */
  1902. int i;
  1903. for (i=2; i >= 0; i--)
  1904. {
  1905. MNG_COMPOSE8 (*(pScanline+i+1), *(pDataline+i), iFGa8, *(pScanline+i+1));
  1906. }
  1907. }
  1908. else
  1909. { /* now blend */
  1910. MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8,
  1911. *(pScanline+1), *(pScanline+2), *(pScanline+3), iBGa8,
  1912. iCr8, iCg8, iCb8, iCa8);
  1913. /* and return the composed values */
  1914. *pScanline = iCa8;
  1915. *(pScanline+1) = iCr8;
  1916. *(pScanline+2) = iCg8;
  1917. *(pScanline+3) = iCb8;
  1918. }
  1919. }
  1920. }
  1921. pScanline += (pData->iColinc << 2);
  1922. pDataline += 4;
  1923. }
  1924. }
  1925. }
  1926. }
  1927. check_update_region (pData);
  1928. #ifdef MNG_SUPPORT_TRACE
  1929. MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8, MNG_LC_END);
  1930. #endif
  1931. return MNG_NOERROR;
  1932. }
  1933. #endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  1934. #else /* MNG_NO_16BIT_SUPPORT */
  1935. mng_retcode mng_display_argb8 (mng_datap pData)
  1936. {
  1937. mng_uint8p pScanline;
  1938. mng_uint8p pDataline;
  1939. mng_int32 iX;
  1940. mng_uint8 iFGa8, iBGa8, iCa8;
  1941. mng_uint8 iCr8, iCg8, iCb8;
  1942. #ifdef MNG_SUPPORT_TRACE
  1943. MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8, MNG_LC_START);
  1944. #endif
  1945. /* viewable row ? */
  1946. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  1947. { /* address destination row */
  1948. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  1949. pData->iRow + pData->iDestt -
  1950. pData->iSourcet);
  1951. /* adjust destination row starting-point */
  1952. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  1953. pDataline = pData->pRGBArow; /* address source row */
  1954. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  1955. if (pData->bIsOpaque) /* forget about transparency ? */
  1956. {
  1957. {
  1958. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  1959. iX += pData->iColinc)
  1960. { /* copy the values */
  1961. *pScanline = *(pDataline+3);
  1962. *(pScanline+1) = *pDataline;
  1963. *(pScanline+2) = *(pDataline+1);
  1964. *(pScanline+3) = *(pDataline+2);
  1965. pScanline += (pData->iColinc << 2);
  1966. pDataline += 4;
  1967. }
  1968. }
  1969. }
  1970. else
  1971. {
  1972. {
  1973. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  1974. iX += pData->iColinc)
  1975. {
  1976. iFGa8 = *(pDataline+3); /* get alpha values */
  1977. iBGa8 = *pScanline;
  1978. if (iFGa8) /* any opacity at all ? */
  1979. { /* fully opaque or background fully transparent ? */
  1980. if ((iFGa8 == 0xFF) || (iBGa8 == 0))
  1981. { /* then simply copy the values */
  1982. *pScanline = *(pDataline+3);
  1983. *(pScanline+1) = *pDataline;
  1984. *(pScanline+2) = *(pDataline+1);
  1985. *(pScanline+3) = *(pDataline+2);
  1986. }
  1987. else
  1988. {
  1989. if (iBGa8 == 0xFF) /* background fully opaque ? */
  1990. { /* do simple alpha composing */
  1991. /* alpha itself remains fully opaque !!! */
  1992. #ifdef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  1993. int i;
  1994. for (i=2; i >= 0; i--)
  1995. {
  1996. MNG_COMPOSE8 (*(pScanline+i+1), *(pDataline+i), iFGa8, *(pScanline+i+1));
  1997. }
  1998. #else
  1999. MNG_COMPOSE8 (*(pScanline+1), *pDataline, iFGa8, *(pScanline+1));
  2000. MNG_COMPOSE8 (*(pScanline+2), *(pDataline+1), iFGa8, *(pScanline+2));
  2001. MNG_COMPOSE8 (*(pScanline+3), *(pDataline+2), iFGa8, *(pScanline+3));
  2002. #endif
  2003. }
  2004. else
  2005. { /* now blend */
  2006. MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8,
  2007. *(pScanline+1), *(pScanline+2), *(pScanline+3), iBGa8,
  2008. iCr8, iCg8, iCb8, iCa8);
  2009. /* and return the composed values */
  2010. *pScanline = iCa8;
  2011. *(pScanline+1) = iCr8;
  2012. *(pScanline+2) = iCg8;
  2013. *(pScanline+3) = iCb8;
  2014. }
  2015. }
  2016. }
  2017. pScanline += (pData->iColinc << 2);
  2018. pDataline += 4;
  2019. }
  2020. }
  2021. }
  2022. }
  2023. check_update_region (pData);
  2024. #ifdef MNG_SUPPORT_TRACE
  2025. MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8, MNG_LC_END);
  2026. #endif
  2027. return MNG_NOERROR;
  2028. }
  2029. #endif /* MNG_NO_16BIT_SUPPORT */
  2030. #endif /* MNG_SKIPCANVAS_ARGB8 */
  2031. /* ************************************************************************** */
  2032. #ifndef MNG_SKIPCANVAS_ARGB8_PM
  2033. #ifndef MNG_NO_16BIT_SUPPORT
  2034. #ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  2035. mng_retcode mng_display_argb8_pm (mng_datap pData)
  2036. {
  2037. mng_uint8p pScanline;
  2038. mng_uint8p pDataline;
  2039. mng_int32 iX;
  2040. mng_uint32 s, t;
  2041. #ifdef MNG_SUPPORT_TRACE
  2042. MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8_PM, MNG_LC_START);
  2043. #endif
  2044. /* viewable row ? */
  2045. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  2046. { /* address destination row */
  2047. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  2048. pData->iRow + pData->iDestt -
  2049. pData->iSourcet);
  2050. /* adjust destination row starting-point */
  2051. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  2052. pDataline = pData->pRGBArow; /* address source row */
  2053. if (pData->bIsRGBA16) /* adjust source row starting-point */
  2054. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3);
  2055. else
  2056. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  2057. if (pData->bIsOpaque) /* forget about transparency ? */
  2058. {
  2059. if (pData->bIsRGBA16) /* 16-bit input row ? */
  2060. {
  2061. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  2062. iX += pData->iColinc)
  2063. { /* scale down by dropping the LSB */
  2064. if ((s = pDataline[6]) == 0)
  2065. *(mng_uint32*) pScanline = 0; /* set all components = 0 */
  2066. else
  2067. {
  2068. if (s == 255)
  2069. {
  2070. pScanline[0] = 255;
  2071. pScanline[1] = pDataline[0];
  2072. pScanline[2] = pDataline[2];
  2073. pScanline[3] = pDataline[4];
  2074. }
  2075. else
  2076. {
  2077. pScanline[0] = (mng_uint8)s;
  2078. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  2079. {
  2080. int i;
  2081. for (i=2; i >= 0; i--)
  2082. {
  2083. pScanline[3-i] = DIV255B8(s * pDataline[4-i-i]);
  2084. }
  2085. }
  2086. #else
  2087. pScanline[1] = DIV255B8(s * pDataline[0]);
  2088. pScanline[2] = DIV255B8(s * pDataline[2]);
  2089. pScanline[3] = DIV255B8(s * pDataline[4]);
  2090. #endif
  2091. }
  2092. }
  2093. pScanline += (pData->iColinc << 2);
  2094. pDataline += 8;
  2095. }
  2096. }
  2097. else
  2098. {
  2099. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  2100. iX += pData->iColinc)
  2101. { /* copy the values and premultiply */
  2102. if ((s = pDataline[3]) == 0)
  2103. *(mng_uint32*) pScanline = 0; /* set all components = 0 */
  2104. else
  2105. {
  2106. if (s == 255)
  2107. {
  2108. pScanline[0] = 255;
  2109. pScanline[1] = pDataline[0];
  2110. pScanline[2] = pDataline[1];
  2111. pScanline[3] = pDataline[2];
  2112. }
  2113. else
  2114. {
  2115. pScanline[0] = (mng_uint8)s;
  2116. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  2117. {
  2118. int i;
  2119. for (i=2; i >= 0; i--)
  2120. {
  2121. pScanline[3-i] = DIV255B8(s * pDataline[2-i]);
  2122. }
  2123. }
  2124. #else
  2125. pScanline[1] = DIV255B8(s * pDataline[0]);
  2126. pScanline[2] = DIV255B8(s * pDataline[1]);
  2127. pScanline[3] = DIV255B8(s * pDataline[2]);
  2128. #endif
  2129. }
  2130. }
  2131. pScanline += (pData->iColinc << 2);
  2132. pDataline += 4;
  2133. }
  2134. }
  2135. }
  2136. else
  2137. {
  2138. if (pData->bIsRGBA16) /* 16-bit input row ? */
  2139. {
  2140. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  2141. iX += pData->iColinc)
  2142. { /* get alpha values */
  2143. if ((s = pDataline[6]) != 0) /* any opacity at all ? */
  2144. { /* fully opaque or background fully transparent ? */
  2145. if (s == 255)
  2146. { /* plain copy it */
  2147. pScanline[0] = 255;
  2148. pScanline[1] = pDataline[0];
  2149. pScanline[2] = pDataline[2];
  2150. pScanline[3] = pDataline[4];
  2151. }
  2152. else
  2153. { /* now blend (premultiplied) */
  2154. t = 255 - s;
  2155. pScanline[0] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[0])));
  2156. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  2157. {
  2158. int i;
  2159. for (i=2; i >= 0; i--)
  2160. {
  2161. pScanline[3-i] = DIV255B8(s * pDataline[4-i-i] + t *
  2162. pScanline[3-i]);
  2163. }
  2164. }
  2165. #else
  2166. pScanline[1] = DIV255B8(s * pDataline[0] + t * pScanline[1]);
  2167. pScanline[2] = DIV255B8(s * pDataline[2] + t * pScanline[2]);
  2168. pScanline[3] = DIV255B8(s * pDataline[4] + t * pScanline[3]);
  2169. #endif
  2170. }
  2171. }
  2172. pScanline += (pData->iColinc << 2);
  2173. pDataline += 8;
  2174. }
  2175. }
  2176. else
  2177. {
  2178. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  2179. iX += pData->iColinc)
  2180. {
  2181. if ((s = pDataline[3]) != 0) /* any opacity at all ? */
  2182. { /* fully opaque ? */
  2183. if (s == 255)
  2184. { /* then simply copy the values */
  2185. pScanline[0] = 255;
  2186. pScanline[1] = pDataline[0];
  2187. pScanline[2] = pDataline[1];
  2188. pScanline[3] = pDataline[2];
  2189. }
  2190. else
  2191. { /* now blend (premultiplied) */
  2192. t = 255 - s;
  2193. pScanline[0] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[0])));
  2194. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  2195. {
  2196. int i;
  2197. for (i=2; i >= 0; i--)
  2198. {
  2199. pScanline[3-i] = DIV255B8(s * pDataline[2-i] + t *
  2200. pScanline[3-i]);
  2201. }
  2202. }
  2203. #else
  2204. pScanline[1] = DIV255B8(s * pDataline[0] + t * pScanline[1]);
  2205. pScanline[2] = DIV255B8(s * pDataline[1] + t * pScanline[2]);
  2206. pScanline[3] = DIV255B8(s * pDataline[2] + t * pScanline[3]);
  2207. #endif
  2208. }
  2209. }
  2210. pScanline += (pData->iColinc << 2);
  2211. pDataline += 4;
  2212. }
  2213. }
  2214. }
  2215. }
  2216. check_update_region (pData);
  2217. #ifdef MNG_SUPPORT_TRACE
  2218. MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8_PM, MNG_LC_END);
  2219. #endif
  2220. return MNG_NOERROR;
  2221. }
  2222. #else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  2223. mng_retcode mng_display_argb8_pm (mng_datap pData)
  2224. {
  2225. mng_uint8p pScanline;
  2226. mng_uint8p pDataline;
  2227. mng_int32 iX;
  2228. mng_uint32 s, t;
  2229. mng_uint8 iBps;
  2230. #ifdef MNG_SUPPORT_TRACE
  2231. MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8_PM, MNG_LC_START);
  2232. #endif
  2233. iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1);
  2234. /* viewable row ? */
  2235. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  2236. { /* address destination row */
  2237. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  2238. pData->iRow + pData->iDestt -
  2239. pData->iSourcet);
  2240. /* adjust destination row starting-point */
  2241. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  2242. pDataline = pData->pRGBArow; /* address source row */
  2243. /* adjust source row starting-point */
  2244. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1));
  2245. if (pData->bIsOpaque) /* forget about transparency ? */
  2246. {
  2247. if (pData->bIsRGBA16) /* 16-bit input row ? */
  2248. {
  2249. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  2250. iX += pData->iColinc)
  2251. { /* scale down by dropping the LSB */
  2252. if ((s = pDataline[6]) == 0)
  2253. *(mng_uint32*) pScanline = 0; /* set all components = 0 */
  2254. else
  2255. {
  2256. if (s == 255)
  2257. {
  2258. pScanline[0] = 255;
  2259. pScanline[1] = pDataline[0];
  2260. pScanline[2] = pDataline[2];
  2261. pScanline[3] = pDataline[4];
  2262. }
  2263. else
  2264. {
  2265. pScanline[0] = (mng_uint8)s;
  2266. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  2267. {
  2268. int i;
  2269. for (i=2; i >= 0; i--)
  2270. {
  2271. pScanline[3-i] = DIV255B8(s * pDataline[4-i-i]);
  2272. }
  2273. }
  2274. #else
  2275. pScanline[1] = DIV255B8(s * pDataline[0]);
  2276. pScanline[2] = DIV255B8(s * pDataline[2]);
  2277. pScanline[3] = DIV255B8(s * pDataline[4]);
  2278. #endif
  2279. }
  2280. }
  2281. pScanline += (pData->iColinc << 2);
  2282. pDataline += 8;
  2283. }
  2284. }
  2285. else
  2286. {
  2287. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  2288. iX += pData->iColinc)
  2289. { /* copy the values and premultiply */
  2290. if ((s = pDataline[3]) == 0)
  2291. *(mng_uint32*) pScanline = 0; /* set all components = 0 */
  2292. else
  2293. {
  2294. if (s == 255)
  2295. {
  2296. pScanline[0] = 255;
  2297. pScanline[1] = pDataline[0];
  2298. pScanline[2] = pDataline[1];
  2299. pScanline[3] = pDataline[2];
  2300. }
  2301. else
  2302. {
  2303. pScanline[0] = (mng_uint8)s;
  2304. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  2305. {
  2306. int i;
  2307. for (i=2; i >= 0; i--)
  2308. {
  2309. pScanline[3-i] = DIV255B8(s * pDataline[2-i]);
  2310. }
  2311. }
  2312. #else
  2313. pScanline[1] = DIV255B8(s * pDataline[0]);
  2314. pScanline[2] = DIV255B8(s * pDataline[1]);
  2315. pScanline[3] = DIV255B8(s * pDataline[2]);
  2316. #endif
  2317. }
  2318. }
  2319. pScanline += (pData->iColinc << 2);
  2320. pDataline += 4;
  2321. }
  2322. }
  2323. }
  2324. else
  2325. {
  2326. if (pData->bIsRGBA16) /* 16-bit input row ? */
  2327. {
  2328. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  2329. iX += pData->iColinc)
  2330. { /* get alpha values */
  2331. if ((s = pDataline[6]) != 0) /* any opacity at all ? */
  2332. { /* fully opaque or background fully transparent ? */
  2333. if (s == 255)
  2334. { /* plain copy it */
  2335. pScanline[0] = 255;
  2336. pScanline[1] = pDataline[0];
  2337. pScanline[2] = pDataline[2];
  2338. pScanline[3] = pDataline[4];
  2339. }
  2340. else
  2341. { /* now blend (premultiplied) */
  2342. t = 255 - s;
  2343. pScanline[0] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[0])));
  2344. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  2345. {
  2346. int i;
  2347. for (i=2; i >= 0; i--)
  2348. {
  2349. pScanline[3-i] = DIV255B8(s * pDataline[4-i-i] + t *
  2350. pScanline[3-i]);
  2351. }
  2352. }
  2353. #else
  2354. pScanline[1] = DIV255B8(s * pDataline[0] + t * pScanline[1]);
  2355. pScanline[2] = DIV255B8(s * pDataline[2] + t * pScanline[2]);
  2356. pScanline[3] = DIV255B8(s * pDataline[4] + t * pScanline[3]);
  2357. #endif
  2358. }
  2359. }
  2360. pScanline += (pData->iColinc << 2);
  2361. pDataline += 8;
  2362. }
  2363. }
  2364. else
  2365. {
  2366. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  2367. iX += pData->iColinc)
  2368. {
  2369. if ((s = pDataline[3]) != 0) /* any opacity at all ? */
  2370. { /* fully opaque ? */
  2371. if (s == 255)
  2372. { /* then simply copy the values */
  2373. pScanline[0] = 255;
  2374. pScanline[1] = pDataline[0];
  2375. pScanline[2] = pDataline[1];
  2376. pScanline[3] = pDataline[2];
  2377. }
  2378. else
  2379. { /* now blend (premultiplied) */
  2380. t = 255 - s;
  2381. pScanline[0] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[0])));
  2382. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  2383. {
  2384. int i;
  2385. for (i=2; i >= 0; i--)
  2386. {
  2387. pScanline[3-i] = DIV255B8(s * pDataline[2-i] + t *
  2388. pScanline[3-i]);
  2389. }
  2390. }
  2391. #else
  2392. pScanline[1] = DIV255B8(s * pDataline[0] + t * pScanline[1]);
  2393. pScanline[2] = DIV255B8(s * pDataline[1] + t * pScanline[2]);
  2394. pScanline[3] = DIV255B8(s * pDataline[2] + t * pScanline[3]);
  2395. #endif
  2396. }
  2397. }
  2398. pScanline += (pData->iColinc << 2);
  2399. pDataline += 4;
  2400. }
  2401. }
  2402. }
  2403. }
  2404. check_update_region (pData);
  2405. #ifdef MNG_SUPPORT_TRACE
  2406. MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8_PM, MNG_LC_END);
  2407. #endif
  2408. return MNG_NOERROR;
  2409. }
  2410. #endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  2411. #else /* MNG_NO_16BIT_SUPPORT */
  2412. mng_retcode mng_display_argb8_pm (mng_datap pData)
  2413. {
  2414. mng_uint8p pScanline;
  2415. mng_uint8p pDataline;
  2416. mng_int32 iX;
  2417. mng_uint32 s, t;
  2418. #ifdef MNG_SUPPORT_TRACE
  2419. MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8_PM, MNG_LC_START);
  2420. #endif
  2421. /* viewable row ? */
  2422. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  2423. { /* address destination row */
  2424. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  2425. pData->iRow + pData->iDestt -
  2426. pData->iSourcet);
  2427. /* adjust destination row starting-point */
  2428. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  2429. pDataline = pData->pRGBArow; /* address source row */
  2430. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  2431. if (pData->bIsOpaque) /* forget about transparency ? */
  2432. {
  2433. {
  2434. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  2435. iX += pData->iColinc)
  2436. { /* copy the values and premultiply */
  2437. if ((s = pDataline[3]) == 0)
  2438. *(mng_uint32*) pScanline = 0; /* set all components = 0 */
  2439. else
  2440. {
  2441. if (s == 255)
  2442. {
  2443. pScanline[0] = 255;
  2444. pScanline[1] = pDataline[0];
  2445. pScanline[2] = pDataline[1];
  2446. pScanline[3] = pDataline[2];
  2447. }
  2448. else
  2449. {
  2450. pScanline[0] = (mng_uint8)s;
  2451. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  2452. {
  2453. int i;
  2454. for (i=2; i >= 0; i--)
  2455. {
  2456. pScanline[3-i] = DIV255B8(s * pDataline[2-i]);
  2457. }
  2458. }
  2459. #else
  2460. pScanline[1] = DIV255B8(s * pDataline[0]);
  2461. pScanline[2] = DIV255B8(s * pDataline[1]);
  2462. pScanline[3] = DIV255B8(s * pDataline[2]);
  2463. #endif
  2464. }
  2465. }
  2466. pScanline += (pData->iColinc << 2);
  2467. pDataline += 4;
  2468. }
  2469. }
  2470. }
  2471. else
  2472. {
  2473. {
  2474. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  2475. iX += pData->iColinc)
  2476. {
  2477. if ((s = pDataline[3]) != 0) /* any opacity at all ? */
  2478. { /* fully opaque ? */
  2479. if (s == 255)
  2480. { /* then simply copy the values */
  2481. pScanline[0] = 255;
  2482. pScanline[1] = pDataline[0];
  2483. pScanline[2] = pDataline[1];
  2484. pScanline[3] = pDataline[2];
  2485. }
  2486. else
  2487. { /* now blend (premultiplied) */
  2488. t = 255 - s;
  2489. pScanline[0] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[0])));
  2490. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  2491. {
  2492. int i;
  2493. for (i=2; i >= 0; i--)
  2494. {
  2495. pScanline[3-i] = DIV255B8(s * pDataline[2-i] + t *
  2496. pScanline[3-i]);
  2497. }
  2498. }
  2499. #else
  2500. pScanline[1] = DIV255B8(s * pDataline[0] + t * pScanline[1]);
  2501. pScanline[2] = DIV255B8(s * pDataline[1] + t * pScanline[2]);
  2502. pScanline[3] = DIV255B8(s * pDataline[2] + t * pScanline[3]);
  2503. #endif
  2504. }
  2505. }
  2506. pScanline += (pData->iColinc << 2);
  2507. pDataline += 4;
  2508. }
  2509. }
  2510. }
  2511. }
  2512. check_update_region (pData);
  2513. #ifdef MNG_SUPPORT_TRACE
  2514. MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8_PM, MNG_LC_END);
  2515. #endif
  2516. return MNG_NOERROR;
  2517. }
  2518. #endif /* MNG_NO_16BIT_SUPPORT */
  2519. #endif /* MNG_SKIPCANVAS_ARGB8_PM */
  2520. /* ************************************************************************** */
  2521. #ifndef MNG_SKIPCANVAS_RGB8_A8
  2522. #ifndef MNG_NO_16BIT_SUPPORT
  2523. #ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  2524. mng_retcode mng_display_rgb8_a8 (mng_datap pData)
  2525. {
  2526. mng_uint8p pScanline;
  2527. mng_uint8p pAlphaline;
  2528. mng_uint8p pDataline;
  2529. mng_int32 iX;
  2530. mng_uint8 iFGa8, iBGa8, iCa8;
  2531. mng_uint16 iFGa16, iBGa16, iCa16;
  2532. mng_uint16 iFGr16, iFGg16, iFGb16;
  2533. mng_uint16 iBGr16, iBGg16, iBGb16;
  2534. mng_uint16 iCr16, iCg16, iCb16;
  2535. mng_uint8 iCr8, iCg8, iCb8;
  2536. #ifdef MNG_SUPPORT_TRACE
  2537. MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8_A8, MNG_LC_START);
  2538. #endif
  2539. /* viewable row ? */
  2540. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  2541. { /* address destination rows */
  2542. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  2543. pData->iRow + pData->iDestt -
  2544. pData->iSourcet);
  2545. pAlphaline = (mng_uint8p)pData->fGetalphaline (((mng_handle)pData),
  2546. pData->iRow + pData->iDestt -
  2547. pData->iSourcet);
  2548. /* adjust destination rows starting-point */
  2549. pScanline = pScanline + (pData->iCol * 3) + (pData->iDestl * 3);
  2550. pAlphaline = pAlphaline + pData->iCol + pData->iDestl;
  2551. pDataline = pData->pRGBArow; /* address source row */
  2552. if (pData->bIsRGBA16) /* adjust source row starting-point */
  2553. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3);
  2554. else
  2555. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  2556. if (pData->bIsOpaque) /* forget about transparency ? */
  2557. {
  2558. if (pData->bIsRGBA16) /* 16-bit input row ? */
  2559. {
  2560. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  2561. iX += pData->iColinc)
  2562. { /* scale down by dropping the LSB */
  2563. *pScanline = *pDataline;
  2564. *(pScanline+1) = *(pDataline+2);
  2565. *(pScanline+2) = *(pDataline+4);
  2566. *pAlphaline = *(pDataline+6);
  2567. pScanline += (pData->iColinc * 3);
  2568. pAlphaline += pData->iColinc;
  2569. pDataline += 8;
  2570. }
  2571. }
  2572. else
  2573. {
  2574. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  2575. iX += pData->iColinc)
  2576. { /* copy the values */
  2577. *pScanline = *pDataline;
  2578. *(pScanline+1) = *(pDataline+1);
  2579. *(pScanline+2) = *(pDataline+2);
  2580. *pAlphaline = *(pDataline+3);
  2581. pScanline += (pData->iColinc * 3);
  2582. pAlphaline += pData->iColinc;
  2583. pDataline += 4;
  2584. }
  2585. }
  2586. }
  2587. else
  2588. {
  2589. if (pData->bIsRGBA16) /* 16-bit input row ? */
  2590. {
  2591. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  2592. iX += pData->iColinc)
  2593. { /* get alpha values */
  2594. iFGa16 = mng_get_uint16 (pDataline+6);
  2595. iBGa16 = (mng_uint16)(*pAlphaline);
  2596. iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16;
  2597. if (iFGa16) /* any opacity at all ? */
  2598. { /* fully opaque or background fully transparent ? */
  2599. if ((iFGa16 == 0xFFFF) || (iBGa16 == 0))
  2600. { /* plain copy it */
  2601. *pScanline = *pDataline;
  2602. *(pScanline+1) = *(pDataline+2);
  2603. *(pScanline+2) = *(pDataline+4);
  2604. *pAlphaline = *(pDataline+6);
  2605. }
  2606. else
  2607. {
  2608. if (iBGa16 == 0xFFFF) /* background fully opaque ? */
  2609. { /* get the proper values */
  2610. iFGr16 = mng_get_uint16 (pDataline );
  2611. iFGg16 = mng_get_uint16 (pDataline+2);
  2612. iFGb16 = mng_get_uint16 (pDataline+4);
  2613. /* scale background up */
  2614. iBGr16 = (mng_uint16)(*pScanline );
  2615. iBGg16 = (mng_uint16)(*(pScanline+1));
  2616. iBGb16 = (mng_uint16)(*(pScanline+2));
  2617. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  2618. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  2619. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  2620. /* now compose */
  2621. MNG_COMPOSE16(iFGr16, iFGr16, iFGa16, iBGr16);
  2622. MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16);
  2623. MNG_COMPOSE16(iFGb16, iFGb16, iFGa16, iBGb16);
  2624. /* and return the composed values */
  2625. *pScanline = (mng_uint8)(iFGr16 >> 8);
  2626. *(pScanline+1) = (mng_uint8)(iFGg16 >> 8);
  2627. *(pScanline+2) = (mng_uint8)(iFGb16 >> 8);
  2628. /* alpha remains fully opaque !!! */
  2629. }
  2630. else
  2631. { /* scale background up */
  2632. iBGr16 = (mng_uint16)(*pScanline );
  2633. iBGg16 = (mng_uint16)(*(pScanline+1));
  2634. iBGb16 = (mng_uint16)(*(pScanline+2));
  2635. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  2636. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  2637. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  2638. /* let's blend */
  2639. MNG_BLEND16 (mng_get_uint16 (pDataline ),
  2640. mng_get_uint16 (pDataline+2),
  2641. mng_get_uint16 (pDataline+4), iFGa16,
  2642. iBGr16, iBGg16, iBGb16, iBGa16,
  2643. iCr16, iCg16, iCb16, iCa16);
  2644. /* and return the composed values */
  2645. *pScanline = (mng_uint8)(iCr16 >> 8);
  2646. *(pScanline+1) = (mng_uint8)(iCg16 >> 8);
  2647. *(pScanline+2) = (mng_uint8)(iCb16 >> 8);
  2648. *pAlphaline = (mng_uint8)(iCa16 >> 8);
  2649. }
  2650. }
  2651. }
  2652. pScanline += (pData->iColinc * 3);
  2653. pAlphaline += pData->iColinc;
  2654. pDataline += 8;
  2655. }
  2656. }
  2657. else
  2658. {
  2659. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  2660. iX += pData->iColinc)
  2661. {
  2662. iFGa8 = *(pDataline+3); /* get alpha values */
  2663. iBGa8 = *pAlphaline;
  2664. if (iFGa8) /* any opacity at all ? */
  2665. { /* fully opaque or background fully transparent ? */
  2666. if ((iFGa8 == 0xFF) || (iBGa8 == 0))
  2667. { /* then simply copy the values */
  2668. *pScanline = *pDataline;
  2669. *(pScanline+1) = *(pDataline+1);
  2670. *(pScanline+2) = *(pDataline+2);
  2671. *pAlphaline = *(pDataline+3);
  2672. }
  2673. else
  2674. {
  2675. if (iBGa8 == 0xFF) /* background fully opaque ? */
  2676. { /* do alpha composing */
  2677. MNG_COMPOSE8 (*pScanline, *pDataline, iFGa8, *pScanline );
  2678. MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iFGa8, *(pScanline+1));
  2679. MNG_COMPOSE8 (*(pScanline+2), *(pDataline+2), iFGa8, *(pScanline+2));
  2680. /* alpha remains fully opaque !!! */
  2681. }
  2682. else
  2683. { /* now blend */
  2684. MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8,
  2685. *pScanline, *(pScanline+1), *(pScanline+2), iBGa8,
  2686. iCr8, iCg8, iCb8, iCa8);
  2687. /* and return the composed values */
  2688. *pScanline = iCr8;
  2689. *(pScanline+1) = iCg8;
  2690. *(pScanline+2) = iCb8;
  2691. *pAlphaline = iCa8;
  2692. }
  2693. }
  2694. }
  2695. pScanline += (pData->iColinc * 3);
  2696. pAlphaline += pData->iColinc;
  2697. pDataline += 4;
  2698. }
  2699. }
  2700. }
  2701. }
  2702. check_update_region (pData);
  2703. #ifdef MNG_SUPPORT_TRACE
  2704. MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8_A8, MNG_LC_END);
  2705. #endif
  2706. return MNG_NOERROR;
  2707. }
  2708. #else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  2709. mng_retcode mng_display_rgb8_a8 (mng_datap pData)
  2710. {
  2711. mng_uint8p pScanline;
  2712. mng_uint8p pAlphaline;
  2713. mng_uint8p pDataline;
  2714. mng_int32 iX;
  2715. mng_uint8 iFGa8, iBGa8, iCa8;
  2716. mng_uint16 iFGa16, iBGa16, iCa16;
  2717. mng_uint16 iFGg16;
  2718. mng_uint16 iBGr16, iBGg16, iBGb16;
  2719. mng_uint16 iCr16, iCg16, iCb16;
  2720. mng_uint8 iCr8, iCg8, iCb8;
  2721. mng_uint8 iBps;
  2722. #ifdef MNG_SUPPORT_TRACE
  2723. MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8_A8, MNG_LC_START);
  2724. #endif
  2725. iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1);
  2726. /* viewable row ? */
  2727. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  2728. { /* address destination rows */
  2729. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  2730. pData->iRow + pData->iDestt -
  2731. pData->iSourcet);
  2732. pAlphaline = (mng_uint8p)pData->fGetalphaline (((mng_handle)pData),
  2733. pData->iRow + pData->iDestt -
  2734. pData->iSourcet);
  2735. /* adjust destination rows starting-point */
  2736. pScanline = pScanline + (pData->iCol * 3) + (pData->iDestl * 3);
  2737. pAlphaline = pAlphaline + pData->iCol + pData->iDestl;
  2738. pDataline = pData->pRGBArow; /* address source row */
  2739. /* adjust source row starting-point */
  2740. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1));
  2741. if (pData->bIsOpaque) /* forget about transparency ? */
  2742. {
  2743. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  2744. iX += pData->iColinc)
  2745. { /* scale down by dropping the LSB */
  2746. *pScanline = *pDataline;
  2747. *(pScanline+1) = *(pDataline+iBps);
  2748. *(pScanline+2) = *(pDataline+2*iBps);
  2749. *pAlphaline = *(pDataline+3*iBps);
  2750. pScanline += (pData->iColinc * 3);
  2751. pAlphaline += pData->iColinc;
  2752. pDataline += 4*iBps;
  2753. }
  2754. }
  2755. else
  2756. {
  2757. if (pData->bIsRGBA16) /* 16-bit input row ? */
  2758. {
  2759. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  2760. iX += pData->iColinc)
  2761. { /* get alpha values */
  2762. iFGa16 = mng_get_uint16 (pDataline+6);
  2763. iBGa16 = (mng_uint16)(*pAlphaline);
  2764. iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16;
  2765. if (iFGa16) /* any opacity at all ? */
  2766. { /* fully opaque or background fully transparent ? */
  2767. if ((iFGa16 == 0xFFFF) || (iBGa16 == 0))
  2768. { /* plain copy it */
  2769. *pScanline = *pDataline;
  2770. *(pScanline+1) = *(pDataline+2);
  2771. *(pScanline+2) = *(pDataline+4);
  2772. *pAlphaline = *(pDataline+6);
  2773. }
  2774. else
  2775. {
  2776. if (iBGa16 == 0xFFFF) /* background fully opaque ? */
  2777. { /* get the proper values */
  2778. int i;
  2779. for (i=2; i >= 0; i--)
  2780. {
  2781. iFGg16 = mng_get_uint16 (pDataline+i+i);
  2782. /* scale background up */
  2783. iBGg16 = (mng_uint16)(*(pScanline+i));
  2784. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  2785. /* now compose */
  2786. MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16);
  2787. /* and return the composed values */
  2788. *(pScanline+i) = (mng_uint8)(iFGg16 >> 8);
  2789. /* alpha remains fully opaque !!! */
  2790. }
  2791. }
  2792. else
  2793. { /* scale background up */
  2794. iBGr16 = (mng_uint16)(*pScanline );
  2795. iBGg16 = (mng_uint16)(*(pScanline+1));
  2796. iBGb16 = (mng_uint16)(*(pScanline+2));
  2797. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  2798. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  2799. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  2800. /* let's blend */
  2801. MNG_BLEND16 (mng_get_uint16 (pDataline ),
  2802. mng_get_uint16 (pDataline+2),
  2803. mng_get_uint16 (pDataline+4), iFGa16,
  2804. iBGr16, iBGg16, iBGb16, iBGa16,
  2805. iCr16, iCg16, iCb16, iCa16);
  2806. /* and return the composed values */
  2807. *pScanline = (mng_uint8)(iCr16 >> 8);
  2808. *(pScanline+1) = (mng_uint8)(iCg16 >> 8);
  2809. *(pScanline+2) = (mng_uint8)(iCb16 >> 8);
  2810. *pAlphaline = (mng_uint8)(iCa16 >> 8);
  2811. }
  2812. }
  2813. }
  2814. pScanline += (pData->iColinc * 3);
  2815. pAlphaline += pData->iColinc;
  2816. pDataline += 8;
  2817. }
  2818. }
  2819. else
  2820. {
  2821. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  2822. iX += pData->iColinc)
  2823. {
  2824. iFGa8 = *(pDataline+3); /* get alpha values */
  2825. iBGa8 = *pAlphaline;
  2826. if (iFGa8) /* any opacity at all ? */
  2827. { /* fully opaque or background fully transparent ? */
  2828. if ((iFGa8 == 0xFF) || (iBGa8 == 0))
  2829. { /* then simply copy the values */
  2830. *pScanline = *pDataline;
  2831. *(pScanline+1) = *(pDataline+1);
  2832. *(pScanline+2) = *(pDataline+2);
  2833. *pAlphaline = *(pDataline+3);
  2834. }
  2835. else
  2836. {
  2837. if (iBGa8 == 0xFF) /* background fully opaque ? */
  2838. { /* do alpha composing */
  2839. int i;
  2840. for (i=2; i >= 0; i--)
  2841. {
  2842. MNG_COMPOSE8 (*(pScanline+i), *(pDataline+i), iFGa8, *(pScanline+i));
  2843. }
  2844. /* alpha remains fully opaque !!! */
  2845. }
  2846. else
  2847. { /* now blend */
  2848. MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8,
  2849. *pScanline, *(pScanline+1), *(pScanline+2), iBGa8,
  2850. iCr8, iCg8, iCb8, iCa8);
  2851. /* and return the composed values */
  2852. *pScanline = iCr8;
  2853. *(pScanline+1) = iCg8;
  2854. *(pScanline+2) = iCb8;
  2855. *pAlphaline = iCa8;
  2856. }
  2857. }
  2858. }
  2859. pScanline += (pData->iColinc * 3);
  2860. pAlphaline += pData->iColinc;
  2861. pDataline += 4;
  2862. }
  2863. }
  2864. }
  2865. }
  2866. check_update_region (pData);
  2867. #ifdef MNG_SUPPORT_TRACE
  2868. MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8_A8, MNG_LC_END);
  2869. #endif
  2870. return MNG_NOERROR;
  2871. }
  2872. #endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  2873. #else /* MNG_NO_16BIT_SUPPORT */
  2874. mng_retcode mng_display_rgb8_a8 (mng_datap pData)
  2875. {
  2876. mng_uint8p pScanline;
  2877. mng_uint8p pAlphaline;
  2878. mng_uint8p pDataline;
  2879. mng_int32 iX;
  2880. mng_uint8 iFGa8, iBGa8, iCa8;
  2881. mng_uint8 iCr8, iCg8, iCb8;
  2882. #ifdef MNG_SUPPORT_TRACE
  2883. MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8_A8, MNG_LC_START);
  2884. #endif
  2885. /* viewable row ? */
  2886. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  2887. { /* address destination rows */
  2888. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  2889. pData->iRow + pData->iDestt -
  2890. pData->iSourcet);
  2891. pAlphaline = (mng_uint8p)pData->fGetalphaline (((mng_handle)pData),
  2892. pData->iRow + pData->iDestt -
  2893. pData->iSourcet);
  2894. /* adjust destination rows starting-point */
  2895. pScanline = pScanline + (pData->iCol * 3) + (pData->iDestl * 3);
  2896. pAlphaline = pAlphaline + pData->iCol + pData->iDestl;
  2897. pDataline = pData->pRGBArow; /* address source row */
  2898. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  2899. if (pData->bIsOpaque) /* forget about transparency ? */
  2900. {
  2901. {
  2902. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  2903. iX += pData->iColinc)
  2904. { /* copy the values */
  2905. *pScanline = *pDataline;
  2906. *(pScanline+1) = *(pDataline+1);
  2907. *(pScanline+2) = *(pDataline+2);
  2908. *pAlphaline = *(pDataline+3);
  2909. pScanline += (pData->iColinc * 3);
  2910. pAlphaline += pData->iColinc;
  2911. pDataline += 4;
  2912. }
  2913. }
  2914. }
  2915. else
  2916. {
  2917. {
  2918. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  2919. iX += pData->iColinc)
  2920. {
  2921. iFGa8 = *(pDataline+3); /* get alpha values */
  2922. iBGa8 = *pAlphaline;
  2923. if (iFGa8) /* any opacity at all ? */
  2924. { /* fully opaque or background fully transparent ? */
  2925. if ((iFGa8 == 0xFF) || (iBGa8 == 0))
  2926. { /* then simply copy the values */
  2927. *pScanline = *pDataline;
  2928. *(pScanline+1) = *(pDataline+1);
  2929. *(pScanline+2) = *(pDataline+2);
  2930. *pAlphaline = *(pDataline+3);
  2931. }
  2932. else
  2933. {
  2934. if (iBGa8 == 0xFF) /* background fully opaque ? */
  2935. { /* do alpha composing */
  2936. #ifdef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  2937. int i;
  2938. for (i=2; i >= 0; i--)
  2939. {
  2940. MNG_COMPOSE8 (*(pScanline+i), *(pDataline+i), iFGa8, *(pScanline+i));
  2941. }
  2942. #else
  2943. MNG_COMPOSE8 (*pScanline, *pDataline, iFGa8, *pScanline );
  2944. MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iFGa8, *(pScanline+1));
  2945. MNG_COMPOSE8 (*(pScanline+2), *(pDataline+2), iFGa8, *(pScanline+2));
  2946. #endif
  2947. /* alpha remains fully opaque !!! */
  2948. }
  2949. else
  2950. { /* now blend */
  2951. MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8,
  2952. *pScanline, *(pScanline+1), *(pScanline+2), iBGa8,
  2953. iCr8, iCg8, iCb8, iCa8);
  2954. /* and return the composed values */
  2955. *pScanline = iCr8;
  2956. *(pScanline+1) = iCg8;
  2957. *(pScanline+2) = iCb8;
  2958. *pAlphaline = iCa8;
  2959. }
  2960. }
  2961. }
  2962. pScanline += (pData->iColinc * 3);
  2963. pAlphaline += pData->iColinc;
  2964. pDataline += 4;
  2965. }
  2966. }
  2967. }
  2968. }
  2969. check_update_region (pData);
  2970. #ifdef MNG_SUPPORT_TRACE
  2971. MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8_A8, MNG_LC_END);
  2972. #endif
  2973. return MNG_NOERROR;
  2974. }
  2975. #endif /* MNG_NO_16BIT_SUPPORT */
  2976. #endif /* MNG_SKIPCANVAS_RGB8_A8 */
  2977. /* ************************************************************************** */
  2978. #ifndef MNG_SKIPCANVAS_BGR8
  2979. #ifndef MNG_NO_16BIT_SUPPORT
  2980. #ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  2981. mng_retcode mng_display_bgr8 (mng_datap pData)
  2982. {
  2983. mng_uint8p pScanline;
  2984. mng_uint8p pDataline;
  2985. mng_int32 iX;
  2986. mng_uint16 iA16;
  2987. mng_uint16 iFGr16, iFGg16, iFGb16;
  2988. mng_uint16 iBGr16, iBGg16, iBGb16;
  2989. mng_uint8 iA8;
  2990. #ifdef MNG_SUPPORT_TRACE
  2991. MNG_TRACE (pData, MNG_FN_DISPLAY_BGR8, MNG_LC_START);
  2992. #endif
  2993. /* viewable row ? */
  2994. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  2995. { /* address destination row */
  2996. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  2997. pData->iRow + pData->iDestt -
  2998. pData->iSourcet);
  2999. /* adjust destination row starting-point */
  3000. pScanline = pScanline + (pData->iCol * 3) + (pData->iDestl * 3);
  3001. pDataline = pData->pRGBArow; /* address source row */
  3002. if (pData->bIsRGBA16) /* adjust source row starting-point */
  3003. pDataline = pDataline + (pData->iSourcel / pData->iColinc) * 8;
  3004. else
  3005. pDataline = pDataline + (pData->iSourcel / pData->iColinc) * 4;
  3006. if (pData->bIsOpaque) /* forget about transparency ? */
  3007. {
  3008. if (pData->bIsRGBA16) /* 16-bit input row ? */
  3009. {
  3010. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3011. iX += pData->iColinc)
  3012. { /* scale down by dropping the LSB */
  3013. *pScanline = *(pDataline+4);
  3014. *(pScanline+1) = *(pDataline+2);
  3015. *(pScanline+2) = *pDataline;
  3016. pScanline += (pData->iColinc * 3);
  3017. pDataline += 8;
  3018. }
  3019. }
  3020. else
  3021. {
  3022. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3023. iX += pData->iColinc)
  3024. { /* copy the values */
  3025. *pScanline = *(pDataline+2);
  3026. *(pScanline+1) = *(pDataline+1);
  3027. *(pScanline+2) = *pDataline;
  3028. pScanline += (pData->iColinc * 3);
  3029. pDataline += 4;
  3030. }
  3031. }
  3032. }
  3033. else
  3034. {
  3035. if (pData->bIsRGBA16) /* 16-bit input row ? */
  3036. {
  3037. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3038. iX += pData->iColinc)
  3039. { /* get alpha value */
  3040. iA16 = mng_get_uint16 (pDataline+6);
  3041. if (iA16) /* any opacity at all ? */
  3042. {
  3043. if (iA16 == 0xFFFF) /* fully opaque ? */
  3044. { /* scale down by dropping the LSB */
  3045. *pScanline = *(pDataline+4);
  3046. *(pScanline+1) = *(pDataline+2);
  3047. *(pScanline+2) = *pDataline;
  3048. }
  3049. else
  3050. { /* get the proper values */
  3051. iFGr16 = mng_get_uint16 (pDataline );
  3052. iFGg16 = mng_get_uint16 (pDataline+2);
  3053. iFGb16 = mng_get_uint16 (pDataline+4);
  3054. /* scale background up */
  3055. iBGr16 = (mng_uint16)(*(pScanline+2));
  3056. iBGg16 = (mng_uint16)(*(pScanline+1));
  3057. iBGb16 = (mng_uint16)(*pScanline );
  3058. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  3059. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  3060. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  3061. /* now compose */
  3062. MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16);
  3063. MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16);
  3064. MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16);
  3065. /* and return the composed values */
  3066. *pScanline = (mng_uint8)(iFGb16 >> 8);
  3067. *(pScanline+1) = (mng_uint8)(iFGg16 >> 8);
  3068. *(pScanline+2) = (mng_uint8)(iFGr16 >> 8);
  3069. }
  3070. }
  3071. pScanline += (pData->iColinc * 3);
  3072. pDataline += 8;
  3073. }
  3074. }
  3075. else
  3076. {
  3077. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3078. iX += pData->iColinc)
  3079. {
  3080. iA8 = *(pDataline+3); /* get alpha value */
  3081. if (iA8) /* any opacity at all ? */
  3082. {
  3083. if (iA8 == 0xFF) /* fully opaque ? */
  3084. { /* then simply copy the values */
  3085. *pScanline = *(pDataline+2);
  3086. *(pScanline+1) = *(pDataline+1);
  3087. *(pScanline+2) = *pDataline;
  3088. }
  3089. else
  3090. { /* do alpha composing */
  3091. MNG_COMPOSE8 (*pScanline, *(pDataline+2), iA8, *pScanline );
  3092. MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iA8, *(pScanline+1));
  3093. MNG_COMPOSE8 (*(pScanline+2), *pDataline, iA8, *(pScanline+2));
  3094. }
  3095. }
  3096. pScanline += (pData->iColinc * 3);
  3097. pDataline += 4;
  3098. }
  3099. }
  3100. }
  3101. }
  3102. check_update_region (pData);
  3103. #ifdef MNG_SUPPORT_TRACE
  3104. MNG_TRACE (pData, MNG_FN_DISPLAY_BGR8, MNG_LC_END);
  3105. #endif
  3106. return MNG_NOERROR;
  3107. }
  3108. #else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  3109. mng_retcode mng_display_bgr8 (mng_datap pData)
  3110. {
  3111. mng_uint8p pScanline;
  3112. mng_uint8p pDataline;
  3113. mng_int32 iX;
  3114. mng_uint16 iA16;
  3115. mng_uint16 iFGg16;
  3116. mng_uint16 iBGg16;
  3117. mng_uint8 iA8;
  3118. mng_uint8 iBps;
  3119. #ifdef MNG_SUPPORT_TRACE
  3120. MNG_TRACE (pData, MNG_FN_DISPLAY_BGR8, MNG_LC_START);
  3121. #endif
  3122. iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1);
  3123. /* viewable row ? */
  3124. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  3125. { /* address destination row */
  3126. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  3127. pData->iRow + pData->iDestt -
  3128. pData->iSourcet);
  3129. /* adjust destination row starting-point */
  3130. pScanline = pScanline + (pData->iCol * 3) + (pData->iDestl * 3);
  3131. pDataline = pData->pRGBArow; /* address source row */
  3132. /* adjust source row starting-point */
  3133. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1));
  3134. if (pData->bIsOpaque) /* forget about transparency ? */
  3135. {
  3136. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3137. iX += pData->iColinc)
  3138. { /* scale down by dropping the LSB */
  3139. *pScanline = *(pDataline+2*iBps);
  3140. *(pScanline+1) = *(pDataline+iBps);
  3141. *(pScanline+2) = *pDataline;
  3142. pScanline += (pData->iColinc * 3);
  3143. pDataline += 4*iBps;
  3144. }
  3145. }
  3146. else
  3147. {
  3148. if (pData->bIsRGBA16) /* 16-bit input row ? */
  3149. {
  3150. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3151. iX += pData->iColinc)
  3152. { /* get alpha value */
  3153. iA16 = mng_get_uint16 (pDataline+6);
  3154. if (iA16) /* any opacity at all ? */
  3155. {
  3156. if (iA16 == 0xFFFF) /* fully opaque ? */
  3157. { /* scale down by dropping the LSB */
  3158. *pScanline = *(pDataline+4);
  3159. *(pScanline+1) = *(pDataline+2);
  3160. *(pScanline+2) = *pDataline;
  3161. }
  3162. else
  3163. { /* get the proper values */
  3164. int i;
  3165. for (i=2; i >= 0; i--)
  3166. {
  3167. iFGg16 = mng_get_uint16 (pDataline+i+i);
  3168. /* scale background up */
  3169. iBGg16 = (mng_uint16)(*(pScanline+2-i));
  3170. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  3171. /* now compose */
  3172. MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16);
  3173. /* and return the composed values */
  3174. *(pScanline+2-i) = (mng_uint8)(iFGg16 >> 8);
  3175. }
  3176. }
  3177. }
  3178. pScanline += (pData->iColinc * 3);
  3179. pDataline += 8;
  3180. }
  3181. }
  3182. else
  3183. {
  3184. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3185. iX += pData->iColinc)
  3186. {
  3187. iA8 = *(pDataline+3); /* get alpha value */
  3188. if (iA8) /* any opacity at all ? */
  3189. {
  3190. if (iA8 == 0xFF) /* fully opaque ? */
  3191. { /* then simply copy the values */
  3192. *pScanline = *(pDataline+2);
  3193. *(pScanline+1) = *(pDataline+1);
  3194. *(pScanline+2) = *pDataline;
  3195. }
  3196. else
  3197. { /* do alpha composing */
  3198. int i;
  3199. for (i=2; i >= 0; i--)
  3200. {
  3201. MNG_COMPOSE8 (*(pScanline+i), *(pDataline+2-i), iA8, *(pScanline+i));
  3202. }
  3203. }
  3204. }
  3205. pScanline += (pData->iColinc * 3);
  3206. pDataline += 4;
  3207. }
  3208. }
  3209. }
  3210. }
  3211. check_update_region (pData);
  3212. #ifdef MNG_SUPPORT_TRACE
  3213. MNG_TRACE (pData, MNG_FN_DISPLAY_BGR8, MNG_LC_END);
  3214. #endif
  3215. return MNG_NOERROR;
  3216. }
  3217. #endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  3218. #else /* MNG_NO_16BIT_SUPPORT */
  3219. mng_retcode mng_display_bgr8 (mng_datap pData)
  3220. {
  3221. mng_uint8p pScanline;
  3222. mng_uint8p pDataline;
  3223. mng_int32 iX;
  3224. mng_uint8 iA8;
  3225. #ifdef MNG_SUPPORT_TRACE
  3226. MNG_TRACE (pData, MNG_FN_DISPLAY_BGR8, MNG_LC_START);
  3227. #endif
  3228. /* viewable row ? */
  3229. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  3230. { /* address destination row */
  3231. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  3232. pData->iRow + pData->iDestt -
  3233. pData->iSourcet);
  3234. /* adjust destination row starting-point */
  3235. pScanline = pScanline + (pData->iCol * 3) + (pData->iDestl * 3);
  3236. pDataline = pData->pRGBArow; /* address source row */
  3237. pDataline = pDataline + (pData->iSourcel / pData->iColinc) * 4;
  3238. if (pData->bIsOpaque) /* forget about transparency ? */
  3239. {
  3240. {
  3241. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3242. iX += pData->iColinc)
  3243. { /* copy the values */
  3244. *pScanline = *(pDataline+2);
  3245. *(pScanline+1) = *(pDataline+1);
  3246. *(pScanline+2) = *pDataline;
  3247. pScanline += (pData->iColinc * 3);
  3248. pDataline += 4;
  3249. }
  3250. }
  3251. }
  3252. else
  3253. {
  3254. {
  3255. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3256. iX += pData->iColinc)
  3257. {
  3258. iA8 = *(pDataline+3); /* get alpha value */
  3259. if (iA8) /* any opacity at all ? */
  3260. {
  3261. if (iA8 == 0xFF) /* fully opaque ? */
  3262. { /* then simply copy the values */
  3263. *pScanline = *(pDataline+2);
  3264. *(pScanline+1) = *(pDataline+1);
  3265. *(pScanline+2) = *pDataline;
  3266. }
  3267. else
  3268. { /* do alpha composing */
  3269. #ifdef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  3270. int i;
  3271. for (i=2; i >= 0; i--)
  3272. {
  3273. MNG_COMPOSE8 (*(pScanline+i), *(pDataline+2-i), iA8, *(pScanline+i));
  3274. }
  3275. #else
  3276. MNG_COMPOSE8 (*pScanline, *(pDataline+2), iA8, *pScanline );
  3277. MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iA8, *(pScanline+1));
  3278. MNG_COMPOSE8 (*(pScanline+2), *pDataline, iA8, *(pScanline+2));
  3279. #endif
  3280. }
  3281. }
  3282. pScanline += (pData->iColinc * 3);
  3283. pDataline += 4;
  3284. }
  3285. }
  3286. }
  3287. }
  3288. check_update_region (pData);
  3289. #ifdef MNG_SUPPORT_TRACE
  3290. MNG_TRACE (pData, MNG_FN_DISPLAY_BGR8, MNG_LC_END);
  3291. #endif
  3292. return MNG_NOERROR;
  3293. }
  3294. #endif /* MNG_NO_16BIT_SUPPORT */
  3295. #endif /* MNG_SKIPCANVAS_BGR8 */
  3296. /* ************************************************************************** */
  3297. #ifndef MNG_SKIPCANVAS_BGRX8
  3298. #ifndef MNG_NO_16BIT_SUPPORT
  3299. #ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  3300. mng_retcode mng_display_bgrx8 (mng_datap pData)
  3301. {
  3302. mng_uint8p pScanline;
  3303. mng_uint8p pDataline;
  3304. mng_int32 iX;
  3305. mng_uint16 iA16;
  3306. mng_uint16 iFGr16, iFGg16, iFGb16;
  3307. mng_uint16 iBGr16, iBGg16, iBGb16;
  3308. mng_uint8 iA8;
  3309. #ifdef MNG_SUPPORT_TRACE
  3310. MNG_TRACE (pData, MNG_FN_DISPLAY_BGRX8, MNG_LC_START);
  3311. #endif
  3312. /* viewable row ? */
  3313. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  3314. { /* address destination row */
  3315. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  3316. pData->iRow + pData->iDestt -
  3317. pData->iSourcet);
  3318. /* adjust destination row starting-point */
  3319. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  3320. pDataline = pData->pRGBArow; /* address source row */
  3321. if (pData->bIsRGBA16) /* adjust source row starting-point */
  3322. pDataline = pDataline + (pData->iSourcel / pData->iColinc) * 8;
  3323. else
  3324. pDataline = pDataline + (pData->iSourcel / pData->iColinc) * 4;
  3325. if (pData->bIsOpaque) /* forget about transparency ? */
  3326. {
  3327. if (pData->bIsRGBA16) /* 16-bit input row ? */
  3328. {
  3329. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3330. iX += pData->iColinc)
  3331. { /* scale down by dropping the LSB */
  3332. *pScanline = *(pDataline+4);
  3333. *(pScanline+1) = *(pDataline+2);
  3334. *(pScanline+2) = *pDataline;
  3335. *(pScanline+3) = 0xFF; /* filler byte */
  3336. pScanline += (pData->iColinc << 2);
  3337. pDataline += 8;
  3338. }
  3339. }
  3340. else
  3341. {
  3342. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3343. iX += pData->iColinc)
  3344. { /* copy the values */
  3345. *pScanline = *(pDataline+2);
  3346. *(pScanline+1) = *(pDataline+1);
  3347. *(pScanline+2) = *pDataline;
  3348. *(pScanline+3) = 0xFF; /* filler byte */
  3349. pScanline += (pData->iColinc << 2);
  3350. pDataline += 4;
  3351. }
  3352. }
  3353. }
  3354. else
  3355. {
  3356. if (pData->bIsRGBA16) /* 16-bit input row ? */
  3357. {
  3358. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3359. iX += pData->iColinc)
  3360. { /* get alpha value */
  3361. iA16 = mng_get_uint16 (pDataline+6);
  3362. if (iA16) /* any opacity at all ? */
  3363. {
  3364. if (iA16 == 0xFFFF) /* fully opaque ? */
  3365. { /* scale down by dropping the LSB */
  3366. *pScanline = *(pDataline+4);
  3367. *(pScanline+1) = *(pDataline+2);
  3368. *(pScanline+2) = *pDataline;
  3369. *(pScanline+3) = 0xFF; /* filler byte */
  3370. }
  3371. else
  3372. { /* get the proper values */
  3373. iFGr16 = mng_get_uint16 (pDataline );
  3374. iFGg16 = mng_get_uint16 (pDataline+2);
  3375. iFGb16 = mng_get_uint16 (pDataline+4);
  3376. /* scale background up */
  3377. iBGr16 = (mng_uint16)(*(pScanline+2));
  3378. iBGg16 = (mng_uint16)(*(pScanline+1));
  3379. iBGb16 = (mng_uint16)(*pScanline );
  3380. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  3381. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  3382. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  3383. /* now compose */
  3384. MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16);
  3385. MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16);
  3386. MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16);
  3387. /* and return the composed values */
  3388. *pScanline = (mng_uint8)(iFGb16 >> 8);
  3389. *(pScanline+1) = (mng_uint8)(iFGg16 >> 8);
  3390. *(pScanline+2) = (mng_uint8)(iFGr16 >> 8);
  3391. *(pScanline+3) = 0xFF; /* filler byte */
  3392. }
  3393. }
  3394. pScanline += (pData->iColinc << 2);
  3395. pDataline += 8;
  3396. }
  3397. }
  3398. else
  3399. {
  3400. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3401. iX += pData->iColinc)
  3402. {
  3403. iA8 = *(pDataline+3); /* get alpha value */
  3404. if (iA8) /* any opacity at all ? */
  3405. {
  3406. if (iA8 == 0xFF) /* fully opaque ? */
  3407. { /* then simply copy the values */
  3408. *pScanline = *(pDataline+2);
  3409. *(pScanline+1) = *(pDataline+1);
  3410. *(pScanline+2) = *pDataline;
  3411. *(pScanline+3) = 0xFF; /* filler byte */
  3412. }
  3413. else
  3414. { /* do alpha composing */
  3415. MNG_COMPOSE8 (*pScanline, *(pDataline+2), iA8, *pScanline );
  3416. MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iA8, *(pScanline+1));
  3417. MNG_COMPOSE8 (*(pScanline+2), *pDataline, iA8, *(pScanline+2));
  3418. *(pScanline+3) = 0xFF; /* filler byte */
  3419. }
  3420. }
  3421. pScanline += (pData->iColinc << 2);
  3422. pDataline += 4;
  3423. }
  3424. }
  3425. }
  3426. }
  3427. check_update_region (pData);
  3428. #ifdef MNG_SUPPORT_TRACE
  3429. MNG_TRACE (pData, MNG_FN_DISPLAY_BGRX8, MNG_LC_END);
  3430. #endif
  3431. return MNG_NOERROR;
  3432. }
  3433. #else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  3434. mng_retcode mng_display_bgrx8 (mng_datap pData)
  3435. {
  3436. mng_uint8p pScanline;
  3437. mng_uint8p pDataline;
  3438. mng_int32 iX;
  3439. mng_uint16 iA16;
  3440. mng_uint16 iFGg16;
  3441. mng_uint16 iBGg16;
  3442. mng_uint8 iA8;
  3443. mng_uint8 iBps;
  3444. #ifdef MNG_SUPPORT_TRACE
  3445. MNG_TRACE (pData, MNG_FN_DISPLAY_BGRX8, MNG_LC_START);
  3446. #endif
  3447. iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1);
  3448. /* viewable row ? */
  3449. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  3450. { /* address destination row */
  3451. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  3452. pData->iRow + pData->iDestt -
  3453. pData->iSourcet);
  3454. /* adjust destination row starting-point */
  3455. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  3456. pDataline = pData->pRGBArow; /* address source row */
  3457. /* adjust source row starting-point */
  3458. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1));
  3459. if (pData->bIsOpaque) /* forget about transparency ? */
  3460. {
  3461. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3462. iX += pData->iColinc)
  3463. { /* scale down by dropping the LSB */
  3464. *pScanline = *(pDataline+2*iBps);
  3465. *(pScanline+1) = *(pDataline+iBps);
  3466. *(pScanline+2) = *pDataline;
  3467. *(pScanline+3) = 0xFF; /* filler byte */
  3468. pScanline += (pData->iColinc << 2);
  3469. pDataline += 4*iBps;
  3470. }
  3471. }
  3472. else
  3473. {
  3474. if (pData->bIsRGBA16) /* 16-bit input row ? */
  3475. {
  3476. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3477. iX += pData->iColinc)
  3478. { /* get alpha value */
  3479. iA16 = mng_get_uint16 (pDataline+6);
  3480. if (iA16) /* any opacity at all ? */
  3481. {
  3482. if (iA16 == 0xFFFF) /* fully opaque ? */
  3483. { /* scale down by dropping the LSB */
  3484. *pScanline = *(pDataline+4);
  3485. *(pScanline+1) = *(pDataline+2);
  3486. *(pScanline+2) = *pDataline;
  3487. *(pScanline+3) = 0xFF; /* filler byte */
  3488. }
  3489. else
  3490. { /* get the proper values */
  3491. int i;
  3492. for (i=2; i >= 0; i--)
  3493. {
  3494. iFGg16 = mng_get_uint16 (pDataline+i+i);
  3495. /* scale background up */
  3496. iBGg16 = (mng_uint16)(*(pScanline+2-i));
  3497. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  3498. /* now compose */
  3499. MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16);
  3500. /* and return the composed values */
  3501. *(pScanline+2-i) = (mng_uint8)(iFGg16 >> 8);
  3502. }
  3503. *(pScanline+3) = 0xFF; /* filler byte */
  3504. }
  3505. }
  3506. pScanline += (pData->iColinc << 2);
  3507. pDataline += 8;
  3508. }
  3509. }
  3510. else
  3511. {
  3512. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3513. iX += pData->iColinc)
  3514. {
  3515. iA8 = *(pDataline+3); /* get alpha value */
  3516. if (iA8) /* any opacity at all ? */
  3517. {
  3518. if (iA8 == 0xFF) /* fully opaque ? */
  3519. { /* then simply copy the values */
  3520. *pScanline = *(pDataline+2);
  3521. *(pScanline+1) = *(pDataline+1);
  3522. *(pScanline+2) = *pDataline;
  3523. *(pScanline+3) = 0xFF; /* filler byte */
  3524. }
  3525. else
  3526. { /* do alpha composing */
  3527. int i;
  3528. for (i=2; i >= 0; i--)
  3529. {
  3530. MNG_COMPOSE8 (*(pScanline+i), *(pDataline+2-i), iA8, *(pScanline+i));
  3531. }
  3532. *(pScanline+3) = 0xFF; /* filler byte */
  3533. }
  3534. }
  3535. pScanline += (pData->iColinc << 2);
  3536. pDataline += 4;
  3537. }
  3538. }
  3539. }
  3540. }
  3541. check_update_region (pData);
  3542. #ifdef MNG_SUPPORT_TRACE
  3543. MNG_TRACE (pData, MNG_FN_DISPLAY_BGRX8, MNG_LC_END);
  3544. #endif
  3545. return MNG_NOERROR;
  3546. }
  3547. #endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  3548. #else /* MNG_NO_16BIT_SUPPORT */
  3549. mng_retcode mng_display_bgrx8 (mng_datap pData)
  3550. {
  3551. mng_uint8p pScanline;
  3552. mng_uint8p pDataline;
  3553. mng_int32 iX;
  3554. mng_uint8 iA8;
  3555. #ifdef MNG_SUPPORT_TRACE
  3556. MNG_TRACE (pData, MNG_FN_DISPLAY_BGRX8, MNG_LC_START);
  3557. #endif
  3558. /* viewable row ? */
  3559. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  3560. { /* address destination row */
  3561. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  3562. pData->iRow + pData->iDestt -
  3563. pData->iSourcet);
  3564. /* adjust destination row starting-point */
  3565. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  3566. pDataline = pData->pRGBArow; /* address source row */
  3567. pDataline = pDataline + (pData->iSourcel / pData->iColinc) * 4;
  3568. if (pData->bIsOpaque) /* forget about transparency ? */
  3569. {
  3570. {
  3571. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3572. iX += pData->iColinc)
  3573. { /* copy the values */
  3574. *pScanline = *(pDataline+2);
  3575. *(pScanline+1) = *(pDataline+1);
  3576. *(pScanline+2) = *pDataline;
  3577. *(pScanline+3) = 0xFF; /* filler byte */
  3578. pScanline += (pData->iColinc << 2);
  3579. pDataline += 4;
  3580. }
  3581. }
  3582. }
  3583. else
  3584. {
  3585. {
  3586. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3587. iX += pData->iColinc)
  3588. {
  3589. iA8 = *(pDataline+3); /* get alpha value */
  3590. if (iA8) /* any opacity at all ? */
  3591. {
  3592. if (iA8 == 0xFF) /* fully opaque ? */
  3593. { /* then simply copy the values */
  3594. *pScanline = *(pDataline+2);
  3595. *(pScanline+1) = *(pDataline+1);
  3596. *(pScanline+2) = *pDataline;
  3597. *(pScanline+3) = 0xFF; /* filler byte */
  3598. }
  3599. else
  3600. { /* do alpha composing */
  3601. #ifdef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  3602. int i;
  3603. for (i=2; i >= 0; i--)
  3604. {
  3605. MNG_COMPOSE8 (*(pScanline+i), *(pDataline+2-i), iA8, *(pScanline+i));
  3606. }
  3607. #else
  3608. MNG_COMPOSE8 (*pScanline, *(pDataline+2), iA8, *pScanline );
  3609. MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iA8, *(pScanline+1));
  3610. MNG_COMPOSE8 (*(pScanline+2), *pDataline, iA8, *(pScanline+2));
  3611. #endif
  3612. *(pScanline+3) = 0xFF; /* filler byte */
  3613. }
  3614. }
  3615. pScanline += (pData->iColinc << 2);
  3616. pDataline += 4;
  3617. }
  3618. }
  3619. }
  3620. }
  3621. check_update_region (pData);
  3622. #ifdef MNG_SUPPORT_TRACE
  3623. MNG_TRACE (pData, MNG_FN_DISPLAY_BGRX8, MNG_LC_END);
  3624. #endif
  3625. return MNG_NOERROR;
  3626. }
  3627. #endif /* MNG_NO_16BIT_SUPPORT */
  3628. #endif /* MNG_SKIPCANVAS_BGRX8 */
  3629. /* ************************************************************************** */
  3630. #ifndef MNG_SKIPCANVAS_BGRA8
  3631. #ifndef MNG_NO_16BIT_SUPPORT
  3632. #ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  3633. mng_retcode mng_display_bgra8 (mng_datap pData)
  3634. {
  3635. mng_uint8p pScanline;
  3636. mng_uint8p pDataline;
  3637. mng_int32 iX;
  3638. mng_uint8 iFGa8, iBGa8, iCa8;
  3639. mng_uint16 iFGa16, iBGa16, iCa16;
  3640. mng_uint16 iFGr16, iFGg16, iFGb16;
  3641. mng_uint16 iBGr16, iBGg16, iBGb16;
  3642. mng_uint16 iCr16, iCg16, iCb16;
  3643. mng_uint8 iCr8, iCg8, iCb8;
  3644. #ifdef MNG_SUPPORT_TRACE
  3645. MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA8, MNG_LC_START);
  3646. #endif
  3647. /* viewable row ? */
  3648. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  3649. { /* address destination row */
  3650. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  3651. pData->iRow + pData->iDestt -
  3652. pData->iSourcet);
  3653. /* adjust destination row starting-point */
  3654. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  3655. pDataline = pData->pRGBArow; /* address source row */
  3656. if (pData->bIsRGBA16) /* adjust source row starting-point */
  3657. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3);
  3658. else
  3659. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  3660. if (pData->bIsOpaque) /* forget about transparency ? */
  3661. {
  3662. if (pData->bIsRGBA16) /* 16-bit input row ? */
  3663. {
  3664. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3665. iX += pData->iColinc)
  3666. { /* scale down by dropping the LSB */
  3667. *pScanline = *(pDataline+4);
  3668. *(pScanline+1) = *(pDataline+2);
  3669. *(pScanline+2) = *pDataline;
  3670. *(pScanline+3) = *(pDataline+6);
  3671. pScanline += (pData->iColinc << 2);
  3672. pDataline += 8;
  3673. }
  3674. }
  3675. else
  3676. {
  3677. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3678. iX += pData->iColinc)
  3679. { /* copy the values */
  3680. *pScanline = *(pDataline+2);
  3681. *(pScanline+1) = *(pDataline+1);
  3682. *(pScanline+2) = *pDataline;
  3683. *(pScanline+3) = *(pDataline+3);
  3684. pScanline += (pData->iColinc << 2);
  3685. pDataline += 4;
  3686. }
  3687. }
  3688. }
  3689. else
  3690. {
  3691. if (pData->bIsRGBA16) /* 16-bit input row ? */
  3692. {
  3693. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3694. iX += pData->iColinc)
  3695. { /* get alpha values */
  3696. iFGa16 = mng_get_uint16 (pDataline+6);
  3697. iBGa16 = (mng_uint16)(*(pScanline+3));
  3698. iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16;
  3699. if (iFGa16) /* any opacity at all ? */
  3700. { /* fully opaque or background fully transparent ? */
  3701. if ((iFGa16 == 0xFFFF) || (iBGa16 == 0))
  3702. { /* plain copy it */
  3703. *pScanline = *(pDataline+4);
  3704. *(pScanline+1) = *(pDataline+2);
  3705. *(pScanline+2) = *pDataline;
  3706. *(pScanline+3) = *(pDataline+6);
  3707. }
  3708. else
  3709. {
  3710. if (iBGa16 == 0xFFFF) /* background fully opaque ? */
  3711. { /* get the proper values */
  3712. iFGr16 = mng_get_uint16 (pDataline );
  3713. iFGg16 = mng_get_uint16 (pDataline+2);
  3714. iFGb16 = mng_get_uint16 (pDataline+4);
  3715. /* scale background up */
  3716. iBGr16 = (mng_uint16)(*(pScanline+2));
  3717. iBGg16 = (mng_uint16)(*(pScanline+1));
  3718. iBGb16 = (mng_uint16)(*pScanline );
  3719. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  3720. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  3721. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  3722. /* now compose */
  3723. MNG_COMPOSE16(iFGr16, iFGr16, iFGa16, iBGr16);
  3724. MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16);
  3725. MNG_COMPOSE16(iFGb16, iFGb16, iFGa16, iBGb16);
  3726. /* and return the composed values */
  3727. *pScanline = (mng_uint8)(iFGb16 >> 8);
  3728. *(pScanline+1) = (mng_uint8)(iFGg16 >> 8);
  3729. *(pScanline+2) = (mng_uint8)(iFGr16 >> 8);
  3730. /* alpha remains fully opaque !!! */
  3731. }
  3732. else
  3733. { /* scale background up */
  3734. iBGr16 = (mng_uint16)(*(pScanline+2));
  3735. iBGg16 = (mng_uint16)(*(pScanline+1));
  3736. iBGb16 = (mng_uint16)(*pScanline );
  3737. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  3738. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  3739. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  3740. /* let's blend */
  3741. MNG_BLEND16 (mng_get_uint16 (pDataline ),
  3742. mng_get_uint16 (pDataline+2),
  3743. mng_get_uint16 (pDataline+4), iFGa16,
  3744. iBGr16, iBGg16, iBGb16, iBGa16,
  3745. iCr16, iCg16, iCb16, iCa16);
  3746. /* and return the composed values */
  3747. *pScanline = (mng_uint8)(iCb16 >> 8);
  3748. *(pScanline+1) = (mng_uint8)(iCg16 >> 8);
  3749. *(pScanline+2) = (mng_uint8)(iCr16 >> 8);
  3750. *(pScanline+3) = (mng_uint8)(iCa16 >> 8);
  3751. }
  3752. }
  3753. }
  3754. pScanline += (pData->iColinc << 2);
  3755. pDataline += 8;
  3756. }
  3757. }
  3758. else
  3759. {
  3760. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3761. iX += pData->iColinc)
  3762. {
  3763. iFGa8 = *(pDataline+3); /* get alpha values */
  3764. iBGa8 = *(pScanline+3);
  3765. if (iFGa8) /* any opacity at all ? */
  3766. { /* fully opaque or background fully transparent ? */
  3767. if ((iFGa8 == 0xFF) || (iBGa8 == 0))
  3768. { /* then simply copy the values */
  3769. *pScanline = *(pDataline+2);
  3770. *(pScanline+1) = *(pDataline+1);
  3771. *(pScanline+2) = *pDataline;
  3772. *(pScanline+3) = *(pDataline+3);
  3773. }
  3774. else
  3775. {
  3776. if (iBGa8 == 0xFF) /* background fully opaque ? */
  3777. { /* do alpha composing */
  3778. MNG_COMPOSE8 (*pScanline, *(pDataline+2), iFGa8, *pScanline );
  3779. MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iFGa8, *(pScanline+1));
  3780. MNG_COMPOSE8 (*(pScanline+2), *pDataline, iFGa8, *(pScanline+2));
  3781. /* alpha remains fully opaque !!! */
  3782. }
  3783. else
  3784. { /* now blend */
  3785. MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8,
  3786. *(pScanline+2), *(pScanline+1), *pScanline, iBGa8,
  3787. iCr8, iCg8, iCb8, iCa8);
  3788. /* and return the composed values */
  3789. *pScanline = iCb8;
  3790. *(pScanline+1) = iCg8;
  3791. *(pScanline+2) = iCr8;
  3792. *(pScanline+3) = iCa8;
  3793. }
  3794. }
  3795. }
  3796. pScanline += (pData->iColinc << 2);
  3797. pDataline += 4;
  3798. }
  3799. }
  3800. }
  3801. }
  3802. check_update_region (pData);
  3803. #ifdef MNG_SUPPORT_TRACE
  3804. MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA8, MNG_LC_END);
  3805. #endif
  3806. return MNG_NOERROR;
  3807. }
  3808. #else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  3809. mng_retcode mng_display_bgra8 (mng_datap pData)
  3810. {
  3811. mng_uint8p pScanline;
  3812. mng_uint8p pDataline;
  3813. mng_int32 iX;
  3814. mng_uint8 iFGa8, iBGa8, iCa8;
  3815. mng_uint16 iFGa16, iBGa16, iCa16;
  3816. mng_uint16 iFGg16;
  3817. mng_uint16 iBGr16, iBGg16, iBGb16;
  3818. mng_uint16 iCr16, iCg16, iCb16;
  3819. mng_uint8 iCr8, iCg8, iCb8;
  3820. mng_uint8 iBps;
  3821. #ifdef MNG_SUPPORT_TRACE
  3822. MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA8, MNG_LC_START);
  3823. #endif
  3824. iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1);
  3825. /* viewable row ? */
  3826. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  3827. { /* address destination row */
  3828. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  3829. pData->iRow + pData->iDestt -
  3830. pData->iSourcet);
  3831. /* adjust destination row starting-point */
  3832. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  3833. pDataline = pData->pRGBArow; /* address source row */
  3834. /* adjust source row starting-point */
  3835. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1));
  3836. if (pData->bIsOpaque) /* forget about transparency ? */
  3837. {
  3838. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3839. iX += pData->iColinc)
  3840. { /* scale down by dropping the LSB */
  3841. *pScanline = *(pDataline+2*iBps);
  3842. *(pScanline+1) = *(pDataline+iBps);
  3843. *(pScanline+2) = *pDataline;
  3844. *(pScanline+3) = *(pDataline+3*iBps);
  3845. pScanline += (pData->iColinc << 2);
  3846. pDataline += 4*iBps;
  3847. }
  3848. }
  3849. else
  3850. {
  3851. if (pData->bIsRGBA16) /* 16-bit input row ? */
  3852. {
  3853. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3854. iX += pData->iColinc)
  3855. { /* get alpha values */
  3856. iFGa16 = mng_get_uint16 (pDataline+6);
  3857. iBGa16 = (mng_uint16)(*(pScanline+3));
  3858. iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16;
  3859. if (iFGa16) /* any opacity at all ? */
  3860. { /* fully opaque or background fully transparent ? */
  3861. if ((iFGa16 == 0xFFFF) || (iBGa16 == 0))
  3862. { /* plain copy it */
  3863. *pScanline = *(pDataline+4);
  3864. *(pScanline+1) = *(pDataline+2);
  3865. *(pScanline+2) = *pDataline;
  3866. *(pScanline+3) = *(pDataline+6);
  3867. }
  3868. else
  3869. {
  3870. if (iBGa16 == 0xFFFF) /* background fully opaque ? */
  3871. { /* get the proper values */
  3872. int i;
  3873. for (i=2; i >= 0; i--)
  3874. {
  3875. iFGg16 = mng_get_uint16 (pDataline+i+i);
  3876. /* scale background up */
  3877. iBGg16 = (mng_uint16)(*(pScanline+2-i));
  3878. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  3879. /* now compose */
  3880. MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16);
  3881. /* and return the composed values */
  3882. *(pScanline+2-i) = (mng_uint8)(iFGg16 >> 8);
  3883. /* alpha remains fully opaque !!! */
  3884. }
  3885. }
  3886. else
  3887. { /* scale background up */
  3888. iBGr16 = (mng_uint16)(*(pScanline+2));
  3889. iBGg16 = (mng_uint16)(*(pScanline+1));
  3890. iBGb16 = (mng_uint16)(*pScanline );
  3891. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  3892. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  3893. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  3894. /* let's blend */
  3895. MNG_BLEND16 (mng_get_uint16 (pDataline ),
  3896. mng_get_uint16 (pDataline+2),
  3897. mng_get_uint16 (pDataline+4), iFGa16,
  3898. iBGr16, iBGg16, iBGb16, iBGa16,
  3899. iCr16, iCg16, iCb16, iCa16);
  3900. /* and return the composed values */
  3901. *pScanline = (mng_uint8)(iCb16 >> 8);
  3902. *(pScanline+1) = (mng_uint8)(iCg16 >> 8);
  3903. *(pScanline+2) = (mng_uint8)(iCr16 >> 8);
  3904. *(pScanline+3) = (mng_uint8)(iCa16 >> 8);
  3905. }
  3906. }
  3907. }
  3908. pScanline += (pData->iColinc << 2);
  3909. pDataline += 8;
  3910. }
  3911. }
  3912. else
  3913. {
  3914. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3915. iX += pData->iColinc)
  3916. {
  3917. iFGa8 = *(pDataline+3); /* get alpha values */
  3918. iBGa8 = *(pScanline+3);
  3919. if (iFGa8) /* any opacity at all ? */
  3920. { /* fully opaque or background fully transparent ? */
  3921. if ((iFGa8 == 0xFF) || (iBGa8 == 0))
  3922. { /* then simply copy the values */
  3923. *pScanline = *(pDataline+2);
  3924. *(pScanline+1) = *(pDataline+1);
  3925. *(pScanline+2) = *pDataline;
  3926. *(pScanline+3) = *(pDataline+3);
  3927. }
  3928. else
  3929. {
  3930. if (iBGa8 == 0xFF) /* background fully opaque ? */
  3931. { /* do alpha composing */
  3932. int i;
  3933. for (i=2; i >= 0; i--)
  3934. {
  3935. MNG_COMPOSE8 (*(pScanline+i), *(pDataline+2-i), iFGa8, *(pScanline+i));
  3936. }
  3937. /* alpha remains fully opaque !!! */
  3938. }
  3939. else
  3940. { /* now blend */
  3941. MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8,
  3942. *(pScanline+2), *(pScanline+1), *pScanline, iBGa8,
  3943. iCr8, iCg8, iCb8, iCa8);
  3944. /* and return the composed values */
  3945. *pScanline = iCb8;
  3946. *(pScanline+1) = iCg8;
  3947. *(pScanline+2) = iCr8;
  3948. *(pScanline+3) = iCa8;
  3949. }
  3950. }
  3951. }
  3952. pScanline += (pData->iColinc << 2);
  3953. pDataline += 4;
  3954. }
  3955. }
  3956. }
  3957. }
  3958. check_update_region (pData);
  3959. #ifdef MNG_SUPPORT_TRACE
  3960. MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA8, MNG_LC_END);
  3961. #endif
  3962. return MNG_NOERROR;
  3963. }
  3964. #endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  3965. #else /* MNG_NO_16BIT_SUPPORT */
  3966. mng_retcode mng_display_bgra8 (mng_datap pData)
  3967. {
  3968. mng_uint8p pScanline;
  3969. mng_uint8p pDataline;
  3970. mng_int32 iX;
  3971. mng_uint8 iFGa8, iBGa8, iCa8;
  3972. mng_uint8 iCr8, iCg8, iCb8;
  3973. #ifdef MNG_SUPPORT_TRACE
  3974. MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA8, MNG_LC_START);
  3975. #endif
  3976. /* viewable row ? */
  3977. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  3978. { /* address destination row */
  3979. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  3980. pData->iRow + pData->iDestt -
  3981. pData->iSourcet);
  3982. /* adjust destination row starting-point */
  3983. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  3984. pDataline = pData->pRGBArow; /* address source row */
  3985. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  3986. if (pData->bIsOpaque) /* forget about transparency ? */
  3987. {
  3988. {
  3989. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  3990. iX += pData->iColinc)
  3991. { /* copy the values */
  3992. *pScanline = *(pDataline+2);
  3993. *(pScanline+1) = *(pDataline+1);
  3994. *(pScanline+2) = *pDataline;
  3995. *(pScanline+3) = *(pDataline+3);
  3996. pScanline += (pData->iColinc << 2);
  3997. pDataline += 4;
  3998. }
  3999. }
  4000. }
  4001. else
  4002. {
  4003. {
  4004. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  4005. iX += pData->iColinc)
  4006. {
  4007. iFGa8 = *(pDataline+3); /* get alpha values */
  4008. iBGa8 = *(pScanline+3);
  4009. if (iFGa8) /* any opacity at all ? */
  4010. { /* fully opaque or background fully transparent ? */
  4011. if ((iFGa8 == 0xFF) || (iBGa8 == 0))
  4012. { /* then simply copy the values */
  4013. *pScanline = *(pDataline+2);
  4014. *(pScanline+1) = *(pDataline+1);
  4015. *(pScanline+2) = *pDataline;
  4016. *(pScanline+3) = *(pDataline+3);
  4017. }
  4018. else
  4019. {
  4020. if (iBGa8 == 0xFF) /* background fully opaque ? */
  4021. { /* do alpha composing */
  4022. #ifdef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  4023. int i;
  4024. for (i=2; i >= 0; i--)
  4025. {
  4026. MNG_COMPOSE8 (*(pScanline+i), *(pDataline+2-i), iFGa8, *(pScanline+i));
  4027. }
  4028. #else
  4029. MNG_COMPOSE8 (*pScanline, *(pDataline+2), iFGa8, *pScanline );
  4030. MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iFGa8, *(pScanline+1));
  4031. MNG_COMPOSE8 (*(pScanline+2), *pDataline, iFGa8, *(pScanline+2));
  4032. #endif
  4033. /* alpha remains fully opaque !!! */
  4034. }
  4035. else
  4036. { /* now blend */
  4037. MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8,
  4038. *(pScanline+2), *(pScanline+1), *pScanline, iBGa8,
  4039. iCr8, iCg8, iCb8, iCa8);
  4040. /* and return the composed values */
  4041. *pScanline = iCb8;
  4042. *(pScanline+1) = iCg8;
  4043. *(pScanline+2) = iCr8;
  4044. *(pScanline+3) = iCa8;
  4045. }
  4046. }
  4047. }
  4048. pScanline += (pData->iColinc << 2);
  4049. pDataline += 4;
  4050. }
  4051. }
  4052. }
  4053. }
  4054. check_update_region (pData);
  4055. #ifdef MNG_SUPPORT_TRACE
  4056. MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA8, MNG_LC_END);
  4057. #endif
  4058. return MNG_NOERROR;
  4059. }
  4060. #endif /* MNG_NO_16BIT_SUPPORT */
  4061. #endif /* MNG_SKIPCANVAS_BGRA8 */
  4062. /* ************************************************************************** */
  4063. #ifndef MNG_SKIPCANVAS_BGRA8_PM
  4064. #ifndef MNG_NO_16BIT_SUPPORT
  4065. #ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  4066. mng_retcode mng_display_bgra8_pm (mng_datap pData)
  4067. {
  4068. mng_uint8p pScanline;
  4069. mng_uint8p pDataline;
  4070. mng_int32 iX;
  4071. mng_uint32 s, t;
  4072. #ifdef MNG_SUPPORT_TRACE
  4073. MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA8PM, MNG_LC_START);
  4074. #endif
  4075. /* viewable row ? */
  4076. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  4077. { /* address destination row */
  4078. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  4079. pData->iRow + pData->iDestt -
  4080. pData->iSourcet);
  4081. /* adjust destination row starting-point */
  4082. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  4083. pDataline = pData->pRGBArow; /* address source row */
  4084. if (pData->bIsRGBA16) /* adjust source row starting-point */
  4085. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3);
  4086. else
  4087. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  4088. if (pData->bIsOpaque) /* forget about transparency ? */
  4089. {
  4090. if (pData->bIsRGBA16) /* 16-bit input row ? */
  4091. {
  4092. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  4093. iX += pData->iColinc)
  4094. { /* scale down by dropping the LSB */
  4095. if ((s = pDataline[6]) == 0)
  4096. *(mng_uint32*) pScanline = 0; /* set all components = 0 */
  4097. else
  4098. {
  4099. if (s == 255)
  4100. {
  4101. pScanline[0] = pDataline[4];
  4102. pScanline[1] = pDataline[2];
  4103. pScanline[2] = pDataline[0];
  4104. pScanline[3] = 255;
  4105. }
  4106. else
  4107. {
  4108. pScanline[0] = DIV255B8(s * pDataline[4]);
  4109. pScanline[1] = DIV255B8(s * pDataline[2]);
  4110. pScanline[2] = DIV255B8(s * pDataline[0]);
  4111. pScanline[3] = (mng_uint8)s;
  4112. }
  4113. }
  4114. pScanline += (pData->iColinc << 2);
  4115. pDataline += 8;
  4116. }
  4117. }
  4118. else
  4119. {
  4120. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  4121. iX += pData->iColinc)
  4122. { /* copy the values and premultiply */
  4123. if ((s = pDataline[3]) == 0)
  4124. *(mng_uint32*) pScanline = 0; /* set all components = 0 */
  4125. else
  4126. {
  4127. if (s == 255)
  4128. {
  4129. pScanline[0] = pDataline[2];
  4130. pScanline[1] = pDataline[1];
  4131. pScanline[2] = pDataline[0];
  4132. pScanline[3] = 255;
  4133. }
  4134. else
  4135. {
  4136. pScanline[0] = DIV255B8(s * pDataline[2]);
  4137. pScanline[1] = DIV255B8(s * pDataline[1]);
  4138. pScanline[2] = DIV255B8(s * pDataline[0]);
  4139. pScanline[3] = (mng_uint8)s;
  4140. }
  4141. }
  4142. pScanline += (pData->iColinc << 2);
  4143. pDataline += 4;
  4144. }
  4145. }
  4146. }
  4147. else
  4148. {
  4149. if (pData->bIsRGBA16) /* 16-bit input row ? */
  4150. {
  4151. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  4152. iX += pData->iColinc)
  4153. { /* get alpha values */
  4154. if ((s = pDataline[6]) != 0) /* any opacity at all ? */
  4155. { /* fully opaque or background fully transparent ? */
  4156. if (s == 255)
  4157. { /* plain copy it */
  4158. pScanline[0] = pDataline[4];
  4159. pScanline[1] = pDataline[2];
  4160. pScanline[2] = pDataline[0];
  4161. pScanline[3] = 255;
  4162. }
  4163. else
  4164. { /* now blend (premultiplied) */
  4165. t = 255 - s;
  4166. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  4167. {
  4168. int i;
  4169. for (i=2; i >= 0; i--)
  4170. {
  4171. pScanline[i] = DIV255B8(s * pDataline[4-i-i] + t *
  4172. pScanline[i]);
  4173. }
  4174. }
  4175. #else
  4176. pScanline[0] = DIV255B8(s * pDataline[4] + t * pScanline[0]);
  4177. pScanline[1] = DIV255B8(s * pDataline[2] + t * pScanline[1]);
  4178. pScanline[2] = DIV255B8(s * pDataline[0] + t * pScanline[2]);
  4179. #endif
  4180. pScanline[3] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[3])));
  4181. }
  4182. }
  4183. pScanline += (pData->iColinc << 2);
  4184. pDataline += 8;
  4185. }
  4186. }
  4187. else
  4188. {
  4189. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  4190. iX += pData->iColinc)
  4191. {
  4192. if ((s = pDataline[3]) != 0) /* any opacity at all ? */
  4193. { /* fully opaque ? */
  4194. if (s == 255)
  4195. { /* then simply copy the values */
  4196. pScanline[0] = pDataline[2];
  4197. pScanline[1] = pDataline[1];
  4198. pScanline[2] = pDataline[0];
  4199. pScanline[3] = 255;
  4200. }
  4201. else
  4202. { /* now blend (premultiplied) */
  4203. t = 255 - s;
  4204. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  4205. {
  4206. int i;
  4207. for (i=2; i >= 0; i--)
  4208. {
  4209. pScanline[i] = DIV255B8(s * pDataline[2-i] + t *
  4210. pScanline[i]);
  4211. }
  4212. }
  4213. #else
  4214. pScanline[0] = DIV255B8(s * pDataline[2] + t * pScanline[0]);
  4215. pScanline[1] = DIV255B8(s * pDataline[1] + t * pScanline[1]);
  4216. pScanline[2] = DIV255B8(s * pDataline[0] + t * pScanline[2]);
  4217. #endif
  4218. pScanline[3] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[3])));
  4219. }
  4220. }
  4221. pScanline += (pData->iColinc << 2);
  4222. pDataline += 4;
  4223. }
  4224. }
  4225. }
  4226. }
  4227. check_update_region (pData);
  4228. #ifdef MNG_SUPPORT_TRACE
  4229. MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA8PM, MNG_LC_END);
  4230. #endif
  4231. return MNG_NOERROR;
  4232. }
  4233. #else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  4234. mng_retcode mng_display_bgra8_pm (mng_datap pData)
  4235. {
  4236. mng_uint8p pScanline;
  4237. mng_uint8p pDataline;
  4238. mng_int32 iX;
  4239. mng_uint32 s, t;
  4240. mng_uint8 iBps;
  4241. #ifdef MNG_SUPPORT_TRACE
  4242. MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA8PM, MNG_LC_START);
  4243. #endif
  4244. iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1);
  4245. /* viewable row ? */
  4246. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  4247. { /* address destination row */
  4248. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  4249. pData->iRow + pData->iDestt -
  4250. pData->iSourcet);
  4251. /* adjust destination row starting-point */
  4252. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  4253. pDataline = pData->pRGBArow; /* address source row */
  4254. /* adjust source row starting-point */
  4255. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1));
  4256. if (pData->bIsOpaque) /* forget about transparency ? */
  4257. {
  4258. if (pData->bIsRGBA16) /* 16-bit input row ? */
  4259. {
  4260. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  4261. iX += pData->iColinc)
  4262. { /* scale down by dropping the LSB */
  4263. if ((s = pDataline[6]) == 0)
  4264. *(mng_uint32*) pScanline = 0; /* set all components = 0 */
  4265. else
  4266. {
  4267. if (s == 255)
  4268. {
  4269. pScanline[0] = pDataline[4];
  4270. pScanline[1] = pDataline[2];
  4271. pScanline[2] = pDataline[0];
  4272. pScanline[3] = 255;
  4273. }
  4274. else
  4275. {
  4276. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  4277. int i;
  4278. for (i=2; i >= 0; i--)
  4279. {
  4280. pScanline[i] = DIV255B8(s * pDataline[4-i-i]);
  4281. }
  4282. #else
  4283. pScanline[0] = DIV255B8(s * pDataline[4]);
  4284. pScanline[1] = DIV255B8(s * pDataline[2]);
  4285. pScanline[2] = DIV255B8(s * pDataline[0]);
  4286. #endif
  4287. pScanline[3] = (mng_uint8)s;
  4288. }
  4289. }
  4290. pScanline += (pData->iColinc << 2);
  4291. pDataline += 8;
  4292. }
  4293. }
  4294. else
  4295. {
  4296. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  4297. iX += pData->iColinc)
  4298. { /* copy the values and premultiply */
  4299. if ((s = pDataline[3]) == 0)
  4300. *(mng_uint32*) pScanline = 0; /* set all components = 0 */
  4301. else
  4302. {
  4303. if (s == 255)
  4304. {
  4305. pScanline[0] = pDataline[2];
  4306. pScanline[1] = pDataline[1];
  4307. pScanline[2] = pDataline[0];
  4308. pScanline[3] = 255;
  4309. }
  4310. else
  4311. {
  4312. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  4313. int i;
  4314. for (i=2; i >= 0; i--)
  4315. {
  4316. pScanline[i] = DIV255B8(s * pDataline[2-i]);
  4317. }
  4318. #else
  4319. pScanline[0] = DIV255B8(s * pDataline[2]);
  4320. pScanline[1] = DIV255B8(s * pDataline[1]);
  4321. pScanline[2] = DIV255B8(s * pDataline[0]);
  4322. #endif
  4323. pScanline[3] = (mng_uint8)s;
  4324. }
  4325. }
  4326. pScanline += (pData->iColinc << 2);
  4327. pDataline += 4;
  4328. }
  4329. }
  4330. }
  4331. else
  4332. {
  4333. if (pData->bIsRGBA16) /* 16-bit input row ? */
  4334. {
  4335. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  4336. iX += pData->iColinc)
  4337. { /* get alpha values */
  4338. if ((s = pDataline[6]) != 0) /* any opacity at all ? */
  4339. { /* fully opaque or background fully transparent ? */
  4340. if (s == 255)
  4341. { /* plain copy it */
  4342. pScanline[0] = pDataline[4];
  4343. pScanline[1] = pDataline[2];
  4344. pScanline[2] = pDataline[0];
  4345. pScanline[3] = 255;
  4346. }
  4347. else
  4348. { /* now blend (premultiplied) */
  4349. t = 255 - s;
  4350. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  4351. {
  4352. int i;
  4353. for (i=2; i >= 0; i--)
  4354. {
  4355. pScanline[i] = DIV255B8(s * pDataline[4-i-i] + t *
  4356. pScanline[i]);
  4357. }
  4358. }
  4359. #else
  4360. pScanline[0] = DIV255B8(s * pDataline[4] + t * pScanline[0]);
  4361. pScanline[1] = DIV255B8(s * pDataline[2] + t * pScanline[1]);
  4362. pScanline[2] = DIV255B8(s * pDataline[0] + t * pScanline[2]);
  4363. #endif
  4364. pScanline[3] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[3])));
  4365. }
  4366. }
  4367. pScanline += (pData->iColinc << 2);
  4368. pDataline += 8;
  4369. }
  4370. }
  4371. else
  4372. {
  4373. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  4374. iX += pData->iColinc)
  4375. {
  4376. if ((s = pDataline[3]) != 0) /* any opacity at all ? */
  4377. { /* fully opaque ? */
  4378. if (s == 255)
  4379. { /* then simply copy the values */
  4380. pScanline[0] = pDataline[2];
  4381. pScanline[1] = pDataline[1];
  4382. pScanline[2] = pDataline[0];
  4383. pScanline[3] = 255;
  4384. }
  4385. else
  4386. { /* now blend (premultiplied) */
  4387. t = 255 - s;
  4388. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  4389. {
  4390. int i;
  4391. for (i=2; i >= 0; i--)
  4392. {
  4393. pScanline[i] = DIV255B8(s * pDataline[2-i] + t *
  4394. pScanline[i]);
  4395. }
  4396. }
  4397. #else
  4398. pScanline[0] = DIV255B8(s * pDataline[2] + t * pScanline[0]);
  4399. pScanline[1] = DIV255B8(s * pDataline[1] + t * pScanline[1]);
  4400. pScanline[2] = DIV255B8(s * pDataline[0] + t * pScanline[2]);
  4401. #endif
  4402. pScanline[3] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[3])));
  4403. }
  4404. }
  4405. pScanline += (pData->iColinc << 2);
  4406. pDataline += 4;
  4407. }
  4408. }
  4409. }
  4410. }
  4411. check_update_region (pData);
  4412. #ifdef MNG_SUPPORT_TRACE
  4413. MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA8PM, MNG_LC_END);
  4414. #endif
  4415. return MNG_NOERROR;
  4416. }
  4417. #endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  4418. #else /* MNG_NO_16BIT_SUPPORT */
  4419. mng_retcode mng_display_bgra8_pm (mng_datap pData)
  4420. {
  4421. mng_uint8p pScanline;
  4422. mng_uint8p pDataline;
  4423. mng_int32 iX;
  4424. mng_uint32 s, t;
  4425. #ifdef MNG_SUPPORT_TRACE
  4426. MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA8PM, MNG_LC_START);
  4427. #endif
  4428. /* viewable row ? */
  4429. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  4430. { /* address destination row */
  4431. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  4432. pData->iRow + pData->iDestt -
  4433. pData->iSourcet);
  4434. /* adjust destination row starting-point */
  4435. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  4436. pDataline = pData->pRGBArow; /* address source row */
  4437. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  4438. if (pData->bIsOpaque) /* forget about transparency ? */
  4439. {
  4440. {
  4441. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  4442. iX += pData->iColinc)
  4443. { /* copy the values and premultiply */
  4444. if ((s = pDataline[3]) == 0)
  4445. *(mng_uint32*) pScanline = 0; /* set all components = 0 */
  4446. else
  4447. {
  4448. if (s == 255)
  4449. {
  4450. pScanline[0] = pDataline[2];
  4451. pScanline[1] = pDataline[1];
  4452. pScanline[2] = pDataline[0];
  4453. pScanline[3] = 255;
  4454. }
  4455. else
  4456. {
  4457. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  4458. int i;
  4459. for (i=2; i >= 0; i--)
  4460. {
  4461. pScanline[i] = DIV255B8(s * pDataline[2-i]);
  4462. }
  4463. #else
  4464. pScanline[0] = DIV255B8(s * pDataline[2]);
  4465. pScanline[1] = DIV255B8(s * pDataline[1]);
  4466. pScanline[2] = DIV255B8(s * pDataline[0]);
  4467. #endif
  4468. pScanline[3] = (mng_uint8)s;
  4469. }
  4470. }
  4471. pScanline += (pData->iColinc << 2);
  4472. pDataline += 4;
  4473. }
  4474. }
  4475. }
  4476. else
  4477. {
  4478. {
  4479. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  4480. iX += pData->iColinc)
  4481. {
  4482. if ((s = pDataline[3]) != 0) /* any opacity at all ? */
  4483. { /* fully opaque ? */
  4484. if (s == 255)
  4485. { /* then simply copy the values */
  4486. pScanline[0] = pDataline[2];
  4487. pScanline[1] = pDataline[1];
  4488. pScanline[2] = pDataline[0];
  4489. pScanline[3] = 255;
  4490. }
  4491. else
  4492. { /* now blend (premultiplied) */
  4493. t = 255 - s;
  4494. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  4495. {
  4496. int i;
  4497. for (i=2; i >= 0; i--)
  4498. {
  4499. pScanline[i] = DIV255B8(s * pDataline[2-i] + t *
  4500. pScanline[i]);
  4501. }
  4502. }
  4503. #else
  4504. pScanline[0] = DIV255B8(s * pDataline[2] + t * pScanline[0]);
  4505. pScanline[1] = DIV255B8(s * pDataline[1] + t * pScanline[1]);
  4506. pScanline[2] = DIV255B8(s * pDataline[0] + t * pScanline[2]);
  4507. #endif
  4508. pScanline[3] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[3])));
  4509. }
  4510. }
  4511. pScanline += (pData->iColinc << 2);
  4512. pDataline += 4;
  4513. }
  4514. }
  4515. }
  4516. }
  4517. check_update_region (pData);
  4518. #ifdef MNG_SUPPORT_TRACE
  4519. MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA8PM, MNG_LC_END);
  4520. #endif
  4521. return MNG_NOERROR;
  4522. }
  4523. #endif /* MNG_NO_16BIT_SUPPORT */
  4524. #endif /* MNG_SKIPCANVAS_BGRA8_PM */
  4525. /* ************************************************************************** */
  4526. #ifndef MNG_SKIPCANVAS_ABGR8
  4527. #ifndef MNG_NO_16BIT_SUPPORT
  4528. #ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  4529. mng_retcode mng_display_abgr8 (mng_datap pData)
  4530. {
  4531. mng_uint8p pScanline;
  4532. mng_uint8p pDataline;
  4533. mng_int32 iX;
  4534. mng_uint8 iFGa8, iBGa8, iCa8;
  4535. mng_uint16 iFGa16, iBGa16, iCa16;
  4536. mng_uint16 iFGr16, iFGg16, iFGb16;
  4537. mng_uint16 iBGr16, iBGg16, iBGb16;
  4538. mng_uint16 iCr16, iCg16, iCb16;
  4539. mng_uint8 iCr8, iCg8, iCb8;
  4540. #ifdef MNG_SUPPORT_TRACE
  4541. MNG_TRACE (pData, MNG_FN_DISPLAY_ABGR8, MNG_LC_START);
  4542. #endif
  4543. /* viewable row ? */
  4544. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  4545. { /* address destination row */
  4546. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  4547. pData->iRow + pData->iDestt -
  4548. pData->iSourcet);
  4549. /* adjust destination row starting-point */
  4550. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  4551. pDataline = pData->pRGBArow; /* address source row */
  4552. if (pData->bIsRGBA16) /* adjust source row starting-point */
  4553. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3);
  4554. else
  4555. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  4556. if (pData->bIsOpaque) /* forget about transparency ? */
  4557. {
  4558. if (pData->bIsRGBA16) /* 16-bit input row ? */
  4559. {
  4560. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  4561. iX += pData->iColinc)
  4562. { /* scale down by dropping the LSB */
  4563. *pScanline = *(pDataline+6);
  4564. *(pScanline+1) = *(pDataline+4);
  4565. *(pScanline+2) = *(pDataline+2);
  4566. *(pScanline+3) = *pDataline;
  4567. pScanline += (pData->iColinc << 2);
  4568. pDataline += 8;
  4569. }
  4570. }
  4571. else
  4572. {
  4573. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  4574. iX += pData->iColinc)
  4575. { /* copy the values */
  4576. *pScanline = *(pDataline+3);
  4577. *(pScanline+1) = *(pDataline+2);
  4578. *(pScanline+2) = *(pDataline+1);
  4579. *(pScanline+3) = *pDataline;
  4580. pScanline += (pData->iColinc << 2);
  4581. pDataline += 4;
  4582. }
  4583. }
  4584. }
  4585. else
  4586. {
  4587. if (pData->bIsRGBA16) /* 16-bit input row ? */
  4588. {
  4589. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  4590. iX += pData->iColinc)
  4591. { /* get alpha values */
  4592. iFGa16 = mng_get_uint16 (pDataline+6);
  4593. iBGa16 = (mng_uint16)(*pScanline);
  4594. iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16;
  4595. if (iFGa16) /* any opacity at all ? */
  4596. { /* fully opaque or background fully transparent ? */
  4597. if ((iFGa16 == 0xFFFF) || (iBGa16 == 0))
  4598. { /* plain copy it */
  4599. *pScanline = *(pDataline+6);
  4600. *(pScanline+1) = *(pDataline+4);
  4601. *(pScanline+2) = *(pDataline+2);
  4602. *(pScanline+3) = *pDataline;
  4603. }
  4604. else
  4605. {
  4606. if (iBGa16 == 0xFFFF) /* background fully opaque ? */
  4607. { /* get the proper values */
  4608. iFGr16 = mng_get_uint16 (pDataline );
  4609. iFGg16 = mng_get_uint16 (pDataline+2);
  4610. iFGb16 = mng_get_uint16 (pDataline+4);
  4611. /* scale background up */
  4612. iBGr16 = (mng_uint16)(*(pScanline+3));
  4613. iBGg16 = (mng_uint16)(*(pScanline+2));
  4614. iBGb16 = (mng_uint16)(*(pScanline+1));
  4615. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  4616. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  4617. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  4618. /* now compose */
  4619. MNG_COMPOSE16(iFGr16, iFGr16, iFGa16, iBGr16);
  4620. MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16);
  4621. MNG_COMPOSE16(iFGb16, iFGb16, iFGa16, iBGb16);
  4622. /* and return the composed values */
  4623. /* alpha itself remains fully opaque !!! */
  4624. *(pScanline+1) = (mng_uint8)(iFGb16 >> 8);
  4625. *(pScanline+2) = (mng_uint8)(iFGg16 >> 8);
  4626. *(pScanline+3) = (mng_uint8)(iFGr16 >> 8);
  4627. }
  4628. else
  4629. { /* scale background up */
  4630. iBGr16 = (mng_uint16)(*(pScanline+3));
  4631. iBGg16 = (mng_uint16)(*(pScanline+2));
  4632. iBGb16 = (mng_uint16)(*(pScanline+1));
  4633. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  4634. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  4635. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  4636. /* let's blend */
  4637. MNG_BLEND16 (mng_get_uint16 (pDataline ),
  4638. mng_get_uint16 (pDataline+2),
  4639. mng_get_uint16 (pDataline+4), iFGa16,
  4640. iBGr16, iBGg16, iBGb16, iBGa16,
  4641. iCr16, iCg16, iCb16, iCa16);
  4642. /* and return the composed values */
  4643. *pScanline = (mng_uint8)(iCa16 >> 8);
  4644. *(pScanline+1) = (mng_uint8)(iCb16 >> 8);
  4645. *(pScanline+2) = (mng_uint8)(iCg16 >> 8);
  4646. *(pScanline+3) = (mng_uint8)(iCr16 >> 8);
  4647. }
  4648. }
  4649. }
  4650. pScanline += (pData->iColinc << 2);
  4651. pDataline += 8;
  4652. }
  4653. }
  4654. else
  4655. {
  4656. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  4657. iX += pData->iColinc)
  4658. {
  4659. iFGa8 = *(pDataline+3); /* get alpha values */
  4660. iBGa8 = *pScanline;
  4661. if (iFGa8) /* any opacity at all ? */
  4662. { /* fully opaque or background fully transparent ? */
  4663. if ((iFGa8 == 0xFF) || (iBGa8 == 0))
  4664. { /* then simply copy the values */
  4665. *pScanline = *(pDataline+3);
  4666. *(pScanline+1) = *(pDataline+2);
  4667. *(pScanline+2) = *(pDataline+1);
  4668. *(pScanline+3) = *pDataline;
  4669. }
  4670. else
  4671. {
  4672. if (iBGa8 == 0xFF) /* background fully opaque ? */
  4673. { /* do simple alpha composing */
  4674. /* alpha itself remains fully opaque !!! */
  4675. MNG_COMPOSE8 (*(pScanline+1), *(pDataline+2), iFGa8, *(pScanline+1));
  4676. MNG_COMPOSE8 (*(pScanline+2), *(pDataline+1), iFGa8, *(pScanline+2));
  4677. MNG_COMPOSE8 (*(pScanline+3), *pDataline, iFGa8, *(pScanline+3));
  4678. }
  4679. else
  4680. { /* now blend */
  4681. MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8,
  4682. *(pScanline+3), *(pScanline+2), *(pScanline+1), iBGa8,
  4683. iCr8, iCg8, iCb8, iCa8);
  4684. /* and return the composed values */
  4685. *pScanline = iCa8;
  4686. *(pScanline+1) = iCb8;
  4687. *(pScanline+2) = iCg8;
  4688. *(pScanline+3) = iCr8;
  4689. }
  4690. }
  4691. }
  4692. pScanline += (pData->iColinc << 2);
  4693. pDataline += 4;
  4694. }
  4695. }
  4696. }
  4697. }
  4698. check_update_region (pData);
  4699. #ifdef MNG_SUPPORT_TRACE
  4700. MNG_TRACE (pData, MNG_FN_DISPLAY_ABGR8, MNG_LC_END);
  4701. #endif
  4702. return MNG_NOERROR;
  4703. }
  4704. #else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  4705. mng_retcode mng_display_abgr8 (mng_datap pData)
  4706. {
  4707. mng_uint8p pScanline;
  4708. mng_uint8p pDataline;
  4709. mng_int32 iX;
  4710. mng_uint8 iFGa8, iBGa8, iCa8;
  4711. mng_uint16 iFGa16, iBGa16, iCa16;
  4712. mng_uint16 iFGg16;
  4713. mng_uint16 iBGr16, iBGg16, iBGb16;
  4714. mng_uint16 iCr16, iCg16, iCb16;
  4715. mng_uint8 iCr8, iCg8, iCb8;
  4716. mng_uint8 iBps;
  4717. #ifdef MNG_SUPPORT_TRACE
  4718. MNG_TRACE (pData, MNG_FN_DISPLAY_ABGR8, MNG_LC_START);
  4719. #endif
  4720. iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1);
  4721. /* viewable row ? */
  4722. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  4723. { /* address destination row */
  4724. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  4725. pData->iRow + pData->iDestt -
  4726. pData->iSourcet);
  4727. /* adjust destination row starting-point */
  4728. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  4729. pDataline = pData->pRGBArow; /* address source row */
  4730. /* adjust source row starting-point */
  4731. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1));
  4732. if (pData->bIsOpaque) /* forget about transparency ? */
  4733. {
  4734. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  4735. iX += pData->iColinc)
  4736. { /* scale down by dropping the LSB */
  4737. *pScanline = *(pDataline+3*iBps);
  4738. *(pScanline+1) = *(pDataline+2*iBps);
  4739. *(pScanline+2) = *(pDataline+iBps);
  4740. *(pScanline+3) = *pDataline;
  4741. pScanline += (pData->iColinc << 2);
  4742. pDataline += 4*iBps;
  4743. }
  4744. }
  4745. else
  4746. {
  4747. if (pData->bIsRGBA16) /* 16-bit input row ? */
  4748. {
  4749. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  4750. iX += pData->iColinc)
  4751. { /* get alpha values */
  4752. iFGa16 = mng_get_uint16 (pDataline+6);
  4753. iBGa16 = (mng_uint16)(*pScanline);
  4754. iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16;
  4755. if (iFGa16) /* any opacity at all ? */
  4756. { /* fully opaque or background fully transparent ? */
  4757. if ((iFGa16 == 0xFFFF) || (iBGa16 == 0))
  4758. { /* plain copy it */
  4759. *pScanline = *(pDataline+6);
  4760. *(pScanline+1) = *(pDataline+4);
  4761. *(pScanline+2) = *(pDataline+2);
  4762. *(pScanline+3) = *pDataline;
  4763. }
  4764. else
  4765. {
  4766. if (iBGa16 == 0xFFFF) /* background fully opaque ? */
  4767. { /* get the proper values */
  4768. int i;
  4769. for (i=2; i >= 0; i--)
  4770. {
  4771. iFGg16 = mng_get_uint16 (pDataline+i+i);
  4772. /* scale background up */
  4773. iBGg16 = (mng_uint16)(*(pScanline+3-i));
  4774. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  4775. /* now compose */
  4776. MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16);
  4777. /* and return the composed values */
  4778. /* alpha itself remains fully opaque !!! */
  4779. *(pScanline+3-i) = (mng_uint8)(iFGg16 >> 8);
  4780. }
  4781. }
  4782. else
  4783. { /* scale background up */
  4784. iBGr16 = (mng_uint16)(*(pScanline+3));
  4785. iBGg16 = (mng_uint16)(*(pScanline+2));
  4786. iBGb16 = (mng_uint16)(*(pScanline+1));
  4787. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  4788. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  4789. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  4790. /* let's blend */
  4791. MNG_BLEND16 (mng_get_uint16 (pDataline ),
  4792. mng_get_uint16 (pDataline+2),
  4793. mng_get_uint16 (pDataline+4), iFGa16,
  4794. iBGr16, iBGg16, iBGb16, iBGa16,
  4795. iCr16, iCg16, iCb16, iCa16);
  4796. /* and return the composed values */
  4797. *pScanline = (mng_uint8)(iCa16 >> 8);
  4798. *(pScanline+1) = (mng_uint8)(iCb16 >> 8);
  4799. *(pScanline+2) = (mng_uint8)(iCg16 >> 8);
  4800. *(pScanline+3) = (mng_uint8)(iCr16 >> 8);
  4801. }
  4802. }
  4803. }
  4804. pScanline += (pData->iColinc << 2);
  4805. pDataline += 8;
  4806. }
  4807. }
  4808. else
  4809. {
  4810. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  4811. iX += pData->iColinc)
  4812. {
  4813. iFGa8 = *(pDataline+3); /* get alpha values */
  4814. iBGa8 = *pScanline;
  4815. if (iFGa8) /* any opacity at all ? */
  4816. { /* fully opaque or background fully transparent ? */
  4817. if ((iFGa8 == 0xFF) || (iBGa8 == 0))
  4818. { /* then simply copy the values */
  4819. *pScanline = *(pDataline+3);
  4820. *(pScanline+1) = *(pDataline+2);
  4821. *(pScanline+2) = *(pDataline+1);
  4822. *(pScanline+3) = *pDataline;
  4823. }
  4824. else
  4825. {
  4826. if (iBGa8 == 0xFF) /* background fully opaque ? */
  4827. { /* do simple alpha composing */
  4828. /* alpha itself remains fully opaque !!! */
  4829. int i;
  4830. for (i=2; i >= 0; i--)
  4831. {
  4832. MNG_COMPOSE8 (*(pScanline+i+1), *(pDataline+2-i), iFGa8, *(pScanline+i+1));
  4833. }
  4834. }
  4835. else
  4836. { /* now blend */
  4837. MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8,
  4838. *(pScanline+3), *(pScanline+2), *(pScanline+1), iBGa8,
  4839. iCr8, iCg8, iCb8, iCa8);
  4840. /* and return the composed values */
  4841. *pScanline = iCa8;
  4842. *(pScanline+1) = iCb8;
  4843. *(pScanline+2) = iCg8;
  4844. *(pScanline+3) = iCr8;
  4845. }
  4846. }
  4847. }
  4848. pScanline += (pData->iColinc << 2);
  4849. pDataline += 4;
  4850. }
  4851. }
  4852. }
  4853. }
  4854. check_update_region (pData);
  4855. #ifdef MNG_SUPPORT_TRACE
  4856. MNG_TRACE (pData, MNG_FN_DISPLAY_ABGR8, MNG_LC_END);
  4857. #endif
  4858. return MNG_NOERROR;
  4859. }
  4860. #endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  4861. #else /* MNG_NO_16BIT_SUPPORT */
  4862. mng_retcode mng_display_abgr8 (mng_datap pData)
  4863. {
  4864. mng_uint8p pScanline;
  4865. mng_uint8p pDataline;
  4866. mng_int32 iX;
  4867. mng_uint8 iFGa8, iBGa8, iCa8;
  4868. mng_uint8 iCr8, iCg8, iCb8;
  4869. #ifdef MNG_SUPPORT_TRACE
  4870. MNG_TRACE (pData, MNG_FN_DISPLAY_ABGR8, MNG_LC_START);
  4871. #endif
  4872. /* viewable row ? */
  4873. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  4874. { /* address destination row */
  4875. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  4876. pData->iRow + pData->iDestt -
  4877. pData->iSourcet);
  4878. /* adjust destination row starting-point */
  4879. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  4880. pDataline = pData->pRGBArow; /* address source row */
  4881. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  4882. if (pData->bIsOpaque) /* forget about transparency ? */
  4883. {
  4884. {
  4885. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  4886. iX += pData->iColinc)
  4887. { /* copy the values */
  4888. *pScanline = *(pDataline+3);
  4889. *(pScanline+1) = *(pDataline+2);
  4890. *(pScanline+2) = *(pDataline+1);
  4891. *(pScanline+3) = *pDataline;
  4892. pScanline += (pData->iColinc << 2);
  4893. pDataline += 4;
  4894. }
  4895. }
  4896. }
  4897. else
  4898. {
  4899. {
  4900. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  4901. iX += pData->iColinc)
  4902. {
  4903. iFGa8 = *(pDataline+3); /* get alpha values */
  4904. iBGa8 = *pScanline;
  4905. if (iFGa8) /* any opacity at all ? */
  4906. { /* fully opaque or background fully transparent ? */
  4907. if ((iFGa8 == 0xFF) || (iBGa8 == 0))
  4908. { /* then simply copy the values */
  4909. *pScanline = *(pDataline+3);
  4910. *(pScanline+1) = *(pDataline+2);
  4911. *(pScanline+2) = *(pDataline+1);
  4912. *(pScanline+3) = *pDataline;
  4913. }
  4914. else
  4915. {
  4916. if (iBGa8 == 0xFF) /* background fully opaque ? */
  4917. { /* do simple alpha composing */
  4918. /* alpha itself remains fully opaque !!! */
  4919. #ifdef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  4920. int i;
  4921. for (i=2; i >= 0; i--)
  4922. {
  4923. MNG_COMPOSE8 (*(pScanline+i+1), *(pDataline+2-i), iFGa8, *(pScanline+i+1));
  4924. }
  4925. #else
  4926. MNG_COMPOSE8 (*(pScanline+1), *(pDataline+2), iFGa8, *(pScanline+1));
  4927. MNG_COMPOSE8 (*(pScanline+2), *(pDataline+1), iFGa8, *(pScanline+2));
  4928. MNG_COMPOSE8 (*(pScanline+3), *pDataline, iFGa8, *(pScanline+3));
  4929. #endif
  4930. }
  4931. else
  4932. { /* now blend */
  4933. MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8,
  4934. *(pScanline+3), *(pScanline+2), *(pScanline+1), iBGa8,
  4935. iCr8, iCg8, iCb8, iCa8);
  4936. /* and return the composed values */
  4937. *pScanline = iCa8;
  4938. *(pScanline+1) = iCb8;
  4939. *(pScanline+2) = iCg8;
  4940. *(pScanline+3) = iCr8;
  4941. }
  4942. }
  4943. }
  4944. pScanline += (pData->iColinc << 2);
  4945. pDataline += 4;
  4946. }
  4947. }
  4948. }
  4949. }
  4950. check_update_region (pData);
  4951. #ifdef MNG_SUPPORT_TRACE
  4952. MNG_TRACE (pData, MNG_FN_DISPLAY_ABGR8, MNG_LC_END);
  4953. #endif
  4954. return MNG_NOERROR;
  4955. }
  4956. #endif /* MNG_NO_16BIT_SUPPORT */
  4957. #endif /* MNG_SKIPCANVAS_ABGR8 */
  4958. /* ************************************************************************** */
  4959. #ifndef MNG_SKIPCANVAS_ABGR8_PM
  4960. #ifndef MNG_NO_16BIT_SUPPORT
  4961. #ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  4962. mng_retcode mng_display_abgr8_pm (mng_datap pData)
  4963. {
  4964. mng_uint8p pScanline;
  4965. mng_uint8p pDataline;
  4966. mng_int32 iX;
  4967. mng_uint32 s, t;
  4968. #ifdef MNG_SUPPORT_TRACE
  4969. MNG_TRACE (pData, MNG_FN_DISPLAY_ABGR8_PM, MNG_LC_START);
  4970. #endif
  4971. /* viewable row ? */
  4972. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  4973. { /* address destination row */
  4974. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  4975. pData->iRow + pData->iDestt -
  4976. pData->iSourcet);
  4977. /* adjust destination row starting-point */
  4978. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  4979. pDataline = pData->pRGBArow; /* address source row */
  4980. if (pData->bIsRGBA16) /* adjust source row starting-point */
  4981. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3);
  4982. else
  4983. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  4984. if (pData->bIsOpaque) /* forget about transparency ? */
  4985. {
  4986. if (pData->bIsRGBA16) /* 16-bit input row ? */
  4987. {
  4988. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  4989. iX += pData->iColinc)
  4990. { /* scale down by dropping the LSB */
  4991. if ((s = pDataline[6]) == 0)
  4992. *(mng_uint32*) pScanline = 0; /* set all components = 0 */
  4993. else
  4994. {
  4995. if (s == 255)
  4996. {
  4997. pScanline[0] = 255;
  4998. pScanline[1] = pDataline[4];
  4999. pScanline[2] = pDataline[2];
  5000. pScanline[3] = pDataline[0];
  5001. }
  5002. else
  5003. {
  5004. pScanline[0] = (mng_uint8)s;
  5005. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  5006. {
  5007. int i;
  5008. for (i=2; i >= 0; i--)
  5009. {
  5010. pScanline[i+1] = DIV255B8(s * pDataline[4-i-i]);
  5011. }
  5012. }
  5013. #else
  5014. pScanline[1] = DIV255B8(s * pDataline[4]);
  5015. pScanline[2] = DIV255B8(s * pDataline[2]);
  5016. pScanline[3] = DIV255B8(s * pDataline[0]);
  5017. #endif
  5018. }
  5019. }
  5020. pScanline += (pData->iColinc << 2);
  5021. pDataline += 8;
  5022. }
  5023. }
  5024. else
  5025. {
  5026. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  5027. iX += pData->iColinc)
  5028. { /* copy the values and premultiply */
  5029. if ((s = pDataline[3]) == 0)
  5030. *(mng_uint32*) pScanline = 0; /* set all components = 0 */
  5031. else
  5032. {
  5033. if (s == 255)
  5034. {
  5035. pScanline[0] = 255;
  5036. pScanline[1] = pDataline[2];
  5037. pScanline[2] = pDataline[1];
  5038. pScanline[3] = pDataline[0];
  5039. }
  5040. else
  5041. {
  5042. pScanline[0] = (mng_uint8)s;
  5043. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  5044. {
  5045. int i;
  5046. for (i=2; i >= 0; i--)
  5047. {
  5048. pScanline[i+1] = DIV255B8(s * pDataline[2-i]);
  5049. }
  5050. }
  5051. #else
  5052. pScanline[1] = DIV255B8(s * pDataline[2]);
  5053. pScanline[2] = DIV255B8(s * pDataline[1]);
  5054. pScanline[3] = DIV255B8(s * pDataline[0]);
  5055. #endif
  5056. }
  5057. }
  5058. pScanline += (pData->iColinc << 2);
  5059. pDataline += 4;
  5060. }
  5061. }
  5062. }
  5063. else
  5064. {
  5065. if (pData->bIsRGBA16) /* 16-bit input row ? */
  5066. {
  5067. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  5068. iX += pData->iColinc)
  5069. { /* get alpha values */
  5070. if ((s = pDataline[6]) != 0) /* any opacity at all ? */
  5071. { /* fully opaque or background fully transparent ? */
  5072. if (s == 255)
  5073. { /* plain copy it */
  5074. pScanline[0] = 255;
  5075. pScanline[1] = pDataline[4];
  5076. pScanline[2] = pDataline[2];
  5077. pScanline[3] = pDataline[0];
  5078. }
  5079. else
  5080. { /* now blend (premultiplied) */
  5081. t = 255 - s;
  5082. pScanline[0] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[0])));
  5083. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  5084. {
  5085. int i;
  5086. for (i=2; i >= 0; i--)
  5087. {
  5088. pScanline[i+1] = DIV255B8(s * pDataline[4-i-i] + t *
  5089. pScanline[i+1]);
  5090. }
  5091. }
  5092. #else
  5093. pScanline[1] = DIV255B8(s * pDataline[4] + t * pScanline[1]);
  5094. pScanline[2] = DIV255B8(s * pDataline[2] + t * pScanline[2]);
  5095. pScanline[3] = DIV255B8(s * pDataline[0] + t * pScanline[3]);
  5096. #endif
  5097. }
  5098. }
  5099. pScanline += (pData->iColinc << 2);
  5100. pDataline += 8;
  5101. }
  5102. }
  5103. else
  5104. {
  5105. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  5106. iX += pData->iColinc)
  5107. {
  5108. if ((s = pDataline[3]) != 0) /* any opacity at all ? */
  5109. { /* fully opaque ? */
  5110. if (s == 255)
  5111. { /* then simply copy the values */
  5112. pScanline[0] = 255;
  5113. pScanline[1] = pDataline[2];
  5114. pScanline[2] = pDataline[1];
  5115. pScanline[3] = pDataline[0];
  5116. }
  5117. else
  5118. { /* now blend (premultiplied) */
  5119. t = 255 - s;
  5120. pScanline[0] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[0])));
  5121. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  5122. {
  5123. int i;
  5124. for (i=2; i >= 0; i--)
  5125. {
  5126. pScanline[i+1] = DIV255B8(s * pDataline[2-i] + t *
  5127. pScanline[i+1]);
  5128. }
  5129. }
  5130. #else
  5131. pScanline[1] = DIV255B8(s * pDataline[2] + t * pScanline[1]);
  5132. pScanline[2] = DIV255B8(s * pDataline[1] + t * pScanline[2]);
  5133. pScanline[3] = DIV255B8(s * pDataline[0] + t * pScanline[3]);
  5134. #endif
  5135. }
  5136. }
  5137. pScanline += (pData->iColinc << 2);
  5138. pDataline += 4;
  5139. }
  5140. }
  5141. }
  5142. }
  5143. check_update_region (pData);
  5144. #ifdef MNG_SUPPORT_TRACE
  5145. MNG_TRACE (pData, MNG_FN_DISPLAY_ABGR8_PM, MNG_LC_END);
  5146. #endif
  5147. return MNG_NOERROR;
  5148. }
  5149. #else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  5150. mng_retcode mng_display_abgr8_pm (mng_datap pData)
  5151. {
  5152. mng_uint8p pScanline;
  5153. mng_uint8p pDataline;
  5154. mng_int32 iX;
  5155. mng_uint32 s, t;
  5156. mng_uint8 iBps;
  5157. #ifdef MNG_SUPPORT_TRACE
  5158. MNG_TRACE (pData, MNG_FN_DISPLAY_ABGR8_PM, MNG_LC_START);
  5159. #endif
  5160. iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1);
  5161. /* viewable row ? */
  5162. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  5163. { /* address destination row */
  5164. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  5165. pData->iRow + pData->iDestt -
  5166. pData->iSourcet);
  5167. /* adjust destination row starting-point */
  5168. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  5169. pDataline = pData->pRGBArow; /* address source row */
  5170. /* adjust source row starting-point */
  5171. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1));
  5172. if (pData->bIsOpaque) /* forget about transparency ? */
  5173. {
  5174. if (pData->bIsRGBA16) /* 16-bit input row ? */
  5175. {
  5176. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  5177. iX += pData->iColinc)
  5178. { /* scale down by dropping the LSB */
  5179. if ((s = pDataline[6]) == 0)
  5180. *(mng_uint32*) pScanline = 0; /* set all components = 0 */
  5181. else
  5182. {
  5183. if (s == 255)
  5184. {
  5185. pScanline[0] = 255;
  5186. pScanline[1] = pDataline[4];
  5187. pScanline[2] = pDataline[2];
  5188. pScanline[3] = pDataline[0];
  5189. }
  5190. else
  5191. {
  5192. pScanline[0] = (mng_uint8)s;
  5193. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  5194. {
  5195. int i;
  5196. for (i=2; i >= 0; i--)
  5197. {
  5198. pScanline[i+1] = DIV255B8(s * pDataline[4-i-i]);
  5199. }
  5200. }
  5201. #else
  5202. pScanline[1] = DIV255B8(s * pDataline[4]);
  5203. pScanline[2] = DIV255B8(s * pDataline[2]);
  5204. pScanline[3] = DIV255B8(s * pDataline[0]);
  5205. #endif
  5206. }
  5207. }
  5208. pScanline += (pData->iColinc << 2);
  5209. pDataline += 8;
  5210. }
  5211. }
  5212. else
  5213. {
  5214. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  5215. iX += pData->iColinc)
  5216. { /* copy the values and premultiply */
  5217. if ((s = pDataline[3]) == 0)
  5218. *(mng_uint32*) pScanline = 0; /* set all components = 0 */
  5219. else
  5220. {
  5221. if (s == 255)
  5222. {
  5223. pScanline[0] = 255;
  5224. pScanline[1] = pDataline[2];
  5225. pScanline[2] = pDataline[1];
  5226. pScanline[3] = pDataline[0];
  5227. }
  5228. else
  5229. {
  5230. pScanline[0] = (mng_uint8)s;
  5231. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  5232. {
  5233. int i;
  5234. for (i=2; i >= 0; i--)
  5235. {
  5236. pScanline[i+1] = DIV255B8(s * pDataline[2-i]);
  5237. }
  5238. }
  5239. #else
  5240. pScanline[1] = DIV255B8(s * pDataline[2]);
  5241. pScanline[2] = DIV255B8(s * pDataline[1]);
  5242. pScanline[3] = DIV255B8(s * pDataline[0]);
  5243. #endif
  5244. }
  5245. }
  5246. pScanline += (pData->iColinc << 2);
  5247. pDataline += 4;
  5248. }
  5249. }
  5250. }
  5251. else
  5252. {
  5253. if (pData->bIsRGBA16) /* 16-bit input row ? */
  5254. {
  5255. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  5256. iX += pData->iColinc)
  5257. { /* get alpha values */
  5258. if ((s = pDataline[6]) != 0) /* any opacity at all ? */
  5259. { /* fully opaque or background fully transparent ? */
  5260. if (s == 255)
  5261. { /* plain copy it */
  5262. pScanline[0] = 255;
  5263. pScanline[1] = pDataline[4];
  5264. pScanline[2] = pDataline[2];
  5265. pScanline[3] = pDataline[0];
  5266. }
  5267. else
  5268. { /* now blend (premultiplied) */
  5269. t = 255 - s;
  5270. pScanline[0] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[0])));
  5271. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  5272. {
  5273. int i;
  5274. for (i=2; i >= 0; i--)
  5275. {
  5276. pScanline[i+1] = DIV255B8(s * pDataline[4-i-i] + t *
  5277. pScanline[i+1]);
  5278. }
  5279. }
  5280. #else
  5281. pScanline[1] = DIV255B8(s * pDataline[4] + t * pScanline[1]);
  5282. pScanline[2] = DIV255B8(s * pDataline[2] + t * pScanline[2]);
  5283. pScanline[3] = DIV255B8(s * pDataline[0] + t * pScanline[3]);
  5284. #endif
  5285. }
  5286. }
  5287. pScanline += (pData->iColinc << 2);
  5288. pDataline += 8;
  5289. }
  5290. }
  5291. else
  5292. {
  5293. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  5294. iX += pData->iColinc)
  5295. {
  5296. if ((s = pDataline[3]) != 0) /* any opacity at all ? */
  5297. { /* fully opaque ? */
  5298. if (s == 255)
  5299. { /* then simply copy the values */
  5300. pScanline[0] = 255;
  5301. pScanline[1] = pDataline[2];
  5302. pScanline[2] = pDataline[1];
  5303. pScanline[3] = pDataline[0];
  5304. }
  5305. else
  5306. { /* now blend (premultiplied) */
  5307. t = 255 - s;
  5308. pScanline[0] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[0])));
  5309. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  5310. {
  5311. int i;
  5312. for (i=2; i >= 0; i--)
  5313. {
  5314. pScanline[i+1] = DIV255B8(s * pDataline[2-i] + t *
  5315. pScanline[i+1]);
  5316. }
  5317. }
  5318. #else
  5319. pScanline[1] = DIV255B8(s * pDataline[2] + t * pScanline[1]);
  5320. pScanline[2] = DIV255B8(s * pDataline[1] + t * pScanline[2]);
  5321. pScanline[3] = DIV255B8(s * pDataline[0] + t * pScanline[3]);
  5322. #endif
  5323. }
  5324. }
  5325. pScanline += (pData->iColinc << 2);
  5326. pDataline += 4;
  5327. }
  5328. }
  5329. }
  5330. }
  5331. check_update_region (pData);
  5332. #ifdef MNG_SUPPORT_TRACE
  5333. MNG_TRACE (pData, MNG_FN_DISPLAY_ABGR8_PM, MNG_LC_END);
  5334. #endif
  5335. return MNG_NOERROR;
  5336. }
  5337. #endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  5338. #else /* MNG_NO_16BIT_SUPPORT */
  5339. mng_retcode mng_display_abgr8_pm (mng_datap pData)
  5340. {
  5341. mng_uint8p pScanline;
  5342. mng_uint8p pDataline;
  5343. mng_int32 iX;
  5344. mng_uint32 s, t;
  5345. #ifdef MNG_SUPPORT_TRACE
  5346. MNG_TRACE (pData, MNG_FN_DISPLAY_ABGR8_PM, MNG_LC_START);
  5347. #endif
  5348. /* viewable row ? */
  5349. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  5350. { /* address destination row */
  5351. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  5352. pData->iRow + pData->iDestt -
  5353. pData->iSourcet);
  5354. /* adjust destination row starting-point */
  5355. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
  5356. pDataline = pData->pRGBArow; /* address source row */
  5357. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  5358. if (pData->bIsOpaque) /* forget about transparency ? */
  5359. {
  5360. {
  5361. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  5362. iX += pData->iColinc)
  5363. { /* copy the values and premultiply */
  5364. if ((s = pDataline[3]) == 0)
  5365. *(mng_uint32*) pScanline = 0; /* set all components = 0 */
  5366. else
  5367. {
  5368. if (s == 255)
  5369. {
  5370. pScanline[0] = 255;
  5371. pScanline[1] = pDataline[2];
  5372. pScanline[2] = pDataline[1];
  5373. pScanline[3] = pDataline[0];
  5374. }
  5375. else
  5376. {
  5377. pScanline[0] = (mng_uint8)s;
  5378. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  5379. {
  5380. int i;
  5381. for (i=2; i >= 0; i--)
  5382. {
  5383. pScanline[i+1] = DIV255B8(s * pDataline[2-i]);
  5384. }
  5385. }
  5386. #else
  5387. pScanline[1] = DIV255B8(s * pDataline[2]);
  5388. pScanline[2] = DIV255B8(s * pDataline[1]);
  5389. pScanline[3] = DIV255B8(s * pDataline[0]);
  5390. #endif
  5391. }
  5392. }
  5393. pScanline += (pData->iColinc << 2);
  5394. pDataline += 4;
  5395. }
  5396. }
  5397. }
  5398. else
  5399. {
  5400. {
  5401. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  5402. iX += pData->iColinc)
  5403. {
  5404. if ((s = pDataline[3]) != 0) /* any opacity at all ? */
  5405. { /* fully opaque ? */
  5406. if (s == 255)
  5407. { /* then simply copy the values */
  5408. pScanline[0] = 255;
  5409. pScanline[1] = pDataline[2];
  5410. pScanline[2] = pDataline[1];
  5411. pScanline[3] = pDataline[0];
  5412. }
  5413. else
  5414. { /* now blend (premultiplied) */
  5415. t = 255 - s;
  5416. pScanline[0] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[0])));
  5417. #ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
  5418. {
  5419. int i;
  5420. for (i=2; i >= 0; i--)
  5421. {
  5422. pScanline[i+1] = DIV255B8(s * pDataline[2-i] + t *
  5423. pScanline[i+1]);
  5424. }
  5425. }
  5426. #else
  5427. pScanline[1] = DIV255B8(s * pDataline[2] + t * pScanline[1]);
  5428. pScanline[2] = DIV255B8(s * pDataline[1] + t * pScanline[2]);
  5429. pScanline[3] = DIV255B8(s * pDataline[0] + t * pScanline[3]);
  5430. #endif
  5431. }
  5432. }
  5433. pScanline += (pData->iColinc << 2);
  5434. pDataline += 4;
  5435. }
  5436. }
  5437. }
  5438. }
  5439. check_update_region (pData);
  5440. #ifdef MNG_SUPPORT_TRACE
  5441. MNG_TRACE (pData, MNG_FN_DISPLAY_ABGR8_PM, MNG_LC_END);
  5442. #endif
  5443. return MNG_NOERROR;
  5444. }
  5445. #endif /* MNG_NO_16BIT_SUPPORT */
  5446. #endif /* MNG_SKIPCANVAS_ABGR8_PM */
  5447. /* ************************************************************************** */
  5448. #ifndef MNG_SKIPCANVAS_BGR565
  5449. #ifndef MNG_NO_16BIT_SUPPORT
  5450. #ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  5451. mng_retcode mng_display_bgr565 (mng_datap pData)
  5452. {
  5453. mng_uint8p pScanline;
  5454. mng_uint8p pDataline;
  5455. mng_int32 iX;
  5456. mng_uint16 iA16;
  5457. mng_uint16 iFGr16, iFGg16, iFGb16;
  5458. mng_uint16 iBGr16, iBGg16, iBGb16;
  5459. mng_uint8 iA8;
  5460. #ifdef MNG_SUPPORT_TRACE
  5461. MNG_TRACE (pData, MNG_FN_DISPLAY_BGR565, MNG_LC_START);
  5462. #endif
  5463. /* viewable row ? */
  5464. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  5465. { /* address destination row */
  5466. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  5467. pData->iRow + pData->iDestt -
  5468. pData->iSourcet);
  5469. /* adjust destination row starting-point */
  5470. pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2);
  5471. pDataline = pData->pRGBArow; /* address source row */
  5472. if (pData->bIsRGBA16) /* adjust source row starting-point */
  5473. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3);
  5474. else
  5475. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  5476. if (pData->bIsOpaque) /* forget about transparency ? */
  5477. {
  5478. if (pData->bIsRGBA16) /* 16-bit input row ? */
  5479. {
  5480. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  5481. iX += pData->iColinc)
  5482. { /* scale down by dropping the LSB */
  5483. *(pScanline+1) = (mng_uint8)( ( (*(pDataline))&0xF8 ) | ( (*(pDataline+2)>>5) ) );
  5484. *pScanline = (mng_uint8)( ( (*(pDataline+4)) >>3) | ( (*(pDataline+2)&0xFC) << 3) );
  5485. pScanline += (pData->iColinc * 2);
  5486. pDataline += 8;
  5487. }
  5488. }
  5489. else
  5490. {
  5491. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  5492. iX += pData->iColinc)
  5493. { /* copy the values */
  5494. *(pScanline+1) = (mng_uint8)( ( (*(pDataline))&0xF8 ) | ( (*(pDataline+1)>>5 ) ) );
  5495. *pScanline = (mng_uint8)( ( *(pDataline+2) >>3 ) | ( (*(pDataline+1)&0xFC ) << 3) );
  5496. pScanline += (pData->iColinc * 2);
  5497. pDataline += 4;
  5498. }
  5499. }
  5500. }
  5501. else
  5502. {
  5503. if (pData->bIsRGBA16) /* 16-bit input row ? */
  5504. {
  5505. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  5506. iX += pData->iColinc)
  5507. {
  5508. iA16 = mng_get_uint16 (pDataline+6);
  5509. if (iA16) /* any opacity at all ? */
  5510. {
  5511. if (iA16 == 0xFFFF) /* fully opaque ? */
  5512. { /* scale down by dropping the LSB */
  5513. *(pScanline+1) = (mng_uint8)( (*(pDataline))&0xF8 ) | (mng_uint8)( (*(pDataline+2)>>5 ) );
  5514. *pScanline = (mng_uint8)( (*(pDataline+4)) >>3) | (mng_uint8)( (*(pDataline+2)&0xFC) << 3);
  5515. }
  5516. else
  5517. { /* get the proper values */
  5518. iFGr16 = mng_get_uint16 (pDataline );
  5519. iFGg16 = mng_get_uint16 (pDataline+2);
  5520. iFGb16 = mng_get_uint16 (pDataline+4);
  5521. /* scale background up */
  5522. iBGb16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 );
  5523. iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) );
  5524. iBGr16 = (mng_uint16)( (*(pScanline )) << 3 );
  5525. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  5526. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  5527. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  5528. /* now compose */
  5529. MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16);
  5530. MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16);
  5531. MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16);
  5532. /* and return the composed values */
  5533. *(pScanline+1) = (mng_uint8) ( ( (iFGr16 >> 8)&0xF8 ) | ( (mng_uint8)(iFGg16>>8) >> 5) );
  5534. *pScanline = (mng_uint8) ( ( (iFGb16>>11) ) | (((mng_uint8)(iFGg16>>8)&0xFC) << 3) );
  5535. }
  5536. }
  5537. pScanline += (pData->iColinc * 2);
  5538. pDataline += 8;
  5539. }
  5540. }
  5541. else
  5542. {
  5543. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  5544. iX += pData->iColinc)
  5545. {
  5546. iA8 = *(pDataline+3); /* get alpha value */
  5547. if (iA8) /* any opacity at all ? */
  5548. {
  5549. if (iA8 == 0xFF) /* fully opaque ? */
  5550. { /* then simply copy the values */
  5551. *(pScanline+1) = (mng_uint8)( ( (*(pDataline)) &0xF8 ) | (*(pDataline+1) >>5 ) );
  5552. *pScanline = (mng_uint8)( ( ((*(pDataline+2))>>3) ) | ((*(pDataline+1)&0xFC) << 3) );
  5553. }
  5554. else
  5555. { /* do alpha composing */
  5556. mng_uint8 iRed, iGreen, iBlue;
  5557. iRed = (mng_uint8) ( *(pScanline+1) & 0xF8 );
  5558. iGreen = (mng_uint8) ( (*(pScanline+1) << 5) | ( ((*pScanline) & 0xE0)>>3 ) );
  5559. iBlue = (mng_uint8) ( (*pScanline << 3) );
  5560. MNG_COMPOSE8 (iRed, *pDataline, iA8, iRed );
  5561. MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen );
  5562. MNG_COMPOSE8 (iBlue, *(pDataline+2), iA8, iBlue );
  5563. *(pScanline+1) = (mng_uint8) ( ( iRed & 0xF8 ) | (iGreen>>5) );
  5564. *pScanline = (mng_uint8) ( ( iBlue >> 3 ) | ( (iGreen & 0xFC) << 3) );
  5565. }
  5566. }
  5567. pScanline += (pData->iColinc * 2);
  5568. pDataline += 4;
  5569. }
  5570. }
  5571. }
  5572. }
  5573. check_update_region (pData);
  5574. #ifdef MNG_SUPPORT_TRACE
  5575. MNG_TRACE (pData, MNG_FN_DISPLAY_BGR565, MNG_LC_END);
  5576. #endif
  5577. return MNG_NOERROR;
  5578. }
  5579. #else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  5580. mng_retcode mng_display_bgr565 (mng_datap pData)
  5581. {
  5582. mng_uint8p pScanline;
  5583. mng_uint8p pDataline;
  5584. mng_int32 iX;
  5585. mng_uint16 iA16;
  5586. mng_uint16 iFGr16, iFGg16, iFGb16;
  5587. mng_uint16 iBGr16, iBGg16, iBGb16;
  5588. mng_uint8 iA8;
  5589. mng_uint8 iBps;
  5590. #ifdef MNG_SUPPORT_TRACE
  5591. MNG_TRACE (pData, MNG_FN_DISPLAY_BGR565, MNG_LC_START);
  5592. #endif
  5593. iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1);
  5594. /* viewable row ? */
  5595. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  5596. { /* address destination row */
  5597. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  5598. pData->iRow + pData->iDestt -
  5599. pData->iSourcet);
  5600. /* adjust destination row starting-point */
  5601. pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2);
  5602. pDataline = pData->pRGBArow; /* address source row */
  5603. /* adjust source row starting-point */
  5604. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1));
  5605. if (pData->bIsOpaque) /* forget about transparency ? */
  5606. {
  5607. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  5608. iX += pData->iColinc)
  5609. { /* scale down by dropping the LSB */
  5610. *(pScanline+1) = (mng_uint8)( ( (*(pDataline))&0xF8 ) |
  5611. ( (*(pDataline+iBps)>>5) ) );
  5612. *pScanline = (mng_uint8)( ( (*(pDataline+2*iBps)) >>3) |
  5613. ( (*(pDataline+iBps)&0xFC) << 3) );
  5614. pScanline += (pData->iColinc * 2);
  5615. pDataline += 4*iBps;
  5616. }
  5617. }
  5618. else
  5619. {
  5620. if (pData->bIsRGBA16) /* 16-bit input row ? */
  5621. {
  5622. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  5623. iX += pData->iColinc)
  5624. {
  5625. iA16 = mng_get_uint16 (pDataline+6);
  5626. if (iA16) /* any opacity at all ? */
  5627. {
  5628. if (iA16 == 0xFFFF) /* fully opaque ? */
  5629. { /* scale down by dropping the LSB */
  5630. *(pScanline+1) = (mng_uint8)( (*(pDataline))&0xF8 ) | (mng_uint8)( (*(pDataline+2)>>5 ) );
  5631. *pScanline = (mng_uint8)( (*(pDataline+4)) >>3) | (mng_uint8)( (*(pDataline+2)&0xFC) << 3);
  5632. }
  5633. else
  5634. { /* get the proper values */
  5635. iFGr16 = mng_get_uint16 (pDataline );
  5636. iFGg16 = mng_get_uint16 (pDataline+2);
  5637. iFGb16 = mng_get_uint16 (pDataline+4);
  5638. /* scale background up */
  5639. iBGb16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 );
  5640. iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) );
  5641. iBGr16 = (mng_uint16)( (*(pScanline )) << 3 );
  5642. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  5643. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  5644. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  5645. /* now compose */
  5646. MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16);
  5647. MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16);
  5648. MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16);
  5649. /* and return the composed values */
  5650. *(pScanline+1) = (mng_uint8) ( ( (iFGr16 >> 8)&0xF8 ) | ( (mng_uint8)(iFGg16>>8) >> 5) );
  5651. *pScanline = (mng_uint8) ( ( (iFGb16>>11) ) | (((mng_uint8)(iFGg16>>8)&0xFC) << 3) );
  5652. }
  5653. }
  5654. pScanline += (pData->iColinc * 2);
  5655. pDataline += 8;
  5656. }
  5657. }
  5658. else
  5659. {
  5660. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  5661. iX += pData->iColinc)
  5662. {
  5663. iA8 = *(pDataline+3); /* get alpha value */
  5664. if (iA8) /* any opacity at all ? */
  5665. {
  5666. if (iA8 == 0xFF) /* fully opaque ? */
  5667. { /* then simply copy the values */
  5668. *(pScanline+1) = (mng_uint8)( ( (*(pDataline)) &0xF8 ) | (*(pDataline+1) >>5 ) );
  5669. *pScanline = (mng_uint8)( ( ((*(pDataline+2))>>3) ) | ((*(pDataline+1)&0xFC) << 3) );
  5670. }
  5671. else
  5672. { /* do alpha composing */
  5673. mng_uint8 iRed, iGreen, iBlue;
  5674. iRed = (mng_uint8) ( *(pScanline+1) & 0xF8 );
  5675. iGreen = (mng_uint8) ( (*(pScanline+1) << 5) | ( ((*pScanline) & 0xE0)>>3 ) );
  5676. iBlue = (mng_uint8) ( (*pScanline << 3) );
  5677. MNG_COMPOSE8 (iRed, *pDataline, iA8, iRed );
  5678. MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen );
  5679. MNG_COMPOSE8 (iBlue, *(pDataline+2), iA8, iBlue );
  5680. *(pScanline+1) = (mng_uint8) ( ( iRed & 0xF8 ) | (iGreen>>5) );
  5681. *pScanline = (mng_uint8) ( ( iBlue >> 3 ) | ( (iGreen & 0xFC) << 3) );
  5682. }
  5683. }
  5684. pScanline += (pData->iColinc * 2);
  5685. pDataline += 4;
  5686. }
  5687. }
  5688. }
  5689. }
  5690. check_update_region (pData);
  5691. #ifdef MNG_SUPPORT_TRACE
  5692. MNG_TRACE (pData, MNG_FN_DISPLAY_BGR565, MNG_LC_END);
  5693. #endif
  5694. return MNG_NOERROR;
  5695. }
  5696. #endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  5697. #else /* MNG_NO_16BIT_SUPPORT */
  5698. mng_retcode mng_display_bgr565 (mng_datap pData)
  5699. {
  5700. mng_uint8p pScanline;
  5701. mng_uint8p pDataline;
  5702. mng_int32 iX;
  5703. mng_uint8 iA8;
  5704. #ifdef MNG_SUPPORT_TRACE
  5705. MNG_TRACE (pData, MNG_FN_DISPLAY_BGR565, MNG_LC_START);
  5706. #endif
  5707. /* viewable row ? */
  5708. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  5709. { /* address destination row */
  5710. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  5711. pData->iRow + pData->iDestt -
  5712. pData->iSourcet);
  5713. /* adjust destination row starting-point */
  5714. pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2);
  5715. pDataline = pData->pRGBArow; /* address source row */
  5716. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  5717. if (pData->bIsOpaque) /* forget about transparency ? */
  5718. {
  5719. {
  5720. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  5721. iX += pData->iColinc)
  5722. { /* copy the values */
  5723. *(pScanline+1) = (mng_uint8)( ( (*(pDataline))&0xF8 ) | ( (*(pDataline+1)>>5 ) ) );
  5724. *pScanline = (mng_uint8)( ( *(pDataline+2) >>3 ) | ( (*(pDataline+1)&0xFC ) << 3) );
  5725. pScanline += (pData->iColinc * 2);
  5726. pDataline += 4;
  5727. }
  5728. }
  5729. }
  5730. else
  5731. {
  5732. {
  5733. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  5734. iX += pData->iColinc)
  5735. {
  5736. iA8 = *(pDataline+3); /* get alpha value */
  5737. if (iA8) /* any opacity at all ? */
  5738. {
  5739. if (iA8 == 0xFF) /* fully opaque ? */
  5740. { /* then simply copy the values */
  5741. *(pScanline+1) = (mng_uint8)( ( (*(pDataline)) &0xF8 ) | (*(pDataline+1) >>5 ) );
  5742. *pScanline = (mng_uint8)( ( ((*(pDataline+2))>>3) ) | ((*(pDataline+1)&0xFC) << 3) );
  5743. }
  5744. else
  5745. { /* do alpha composing */
  5746. mng_uint8 iRed, iGreen, iBlue;
  5747. iRed = (mng_uint8) ( *(pScanline+1) & 0xF8 );
  5748. iGreen = (mng_uint8) ( (*(pScanline+1) << 5) | ( ((*pScanline) & 0xE0)>>3 ) );
  5749. iBlue = (mng_uint8) ( (*pScanline << 3) );
  5750. MNG_COMPOSE8 (iRed, *pDataline, iA8, iRed );
  5751. MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen );
  5752. MNG_COMPOSE8 (iBlue, *(pDataline+2), iA8, iBlue );
  5753. *(pScanline+1) = (mng_uint8) ( ( iRed & 0xF8 ) | (iGreen>>5) );
  5754. *pScanline = (mng_uint8) ( ( iBlue >> 3 ) | ( (iGreen & 0xFC) << 3) );
  5755. }
  5756. }
  5757. pScanline += (pData->iColinc * 2);
  5758. pDataline += 4;
  5759. }
  5760. }
  5761. }
  5762. }
  5763. check_update_region (pData);
  5764. #ifdef MNG_SUPPORT_TRACE
  5765. MNG_TRACE (pData, MNG_FN_DISPLAY_BGR565, MNG_LC_END);
  5766. #endif
  5767. return MNG_NOERROR;
  5768. }
  5769. #endif /* MNG_NO_16BIT_SUPPORT */
  5770. #endif /* MNG_SKIPCANVAS_BGR565 */
  5771. /* ************************************************************************** */
  5772. #ifndef MNG_SKIPCANVAS_RGB565
  5773. #ifndef MNG_NO_16BIT_SUPPORT
  5774. #ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  5775. mng_retcode mng_display_rgb565 (mng_datap pData)
  5776. {
  5777. mng_uint8p pScanline;
  5778. mng_uint8p pDataline;
  5779. mng_int32 iX;
  5780. mng_uint16 iA16;
  5781. mng_uint16 iFGr16, iFGg16, iFGb16;
  5782. mng_uint16 iBGr16, iBGg16, iBGb16;
  5783. mng_uint8 iA8;
  5784. #ifdef MNG_SUPPORT_TRACE
  5785. MNG_TRACE (pData, MNG_FN_DISPLAY_RGB565, MNG_LC_START);
  5786. #endif
  5787. /* viewable row ? */
  5788. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  5789. { /* address destination row */
  5790. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  5791. pData->iRow + pData->iDestt -
  5792. pData->iSourcet);
  5793. /* adjust destination row starting-point */
  5794. pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2);
  5795. pDataline = pData->pRGBArow; /* address source row */
  5796. if (pData->bIsRGBA16) /* adjust source row starting-point */
  5797. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3);
  5798. else
  5799. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  5800. if (pData->bIsOpaque) /* forget about transparency ? */
  5801. {
  5802. if (pData->bIsRGBA16) /* 16-bit input row ? */
  5803. {
  5804. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  5805. iX += pData->iColinc)
  5806. { /* scale down by dropping the LSB */
  5807. *(pScanline+1) = (mng_uint8)( ( ( *(pDataline+4)) & 0xF8) | (*(pDataline+2) >> 5 ) );
  5808. *pScanline = (mng_uint8)( ( ( *(pDataline )) >> 3 ) | ((*(pDataline+2) & 0xFC) << 3) );
  5809. pScanline += (pData->iColinc * 2);
  5810. pDataline += 8;
  5811. }
  5812. }
  5813. else
  5814. {
  5815. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  5816. iX += pData->iColinc)
  5817. { /* copy the values */
  5818. *(pScanline+1) = (mng_uint8)( ( (*(pDataline+2)) & 0xF8) | (*(pDataline+1) >> 5 ) );
  5819. *pScanline = (mng_uint8)( ( *(pDataline ) >> 3 ) | ((*(pDataline+1) & 0xFC) << 3) );
  5820. pScanline += (pData->iColinc * 2);
  5821. pDataline += 4;
  5822. }
  5823. }
  5824. }
  5825. else
  5826. {
  5827. if (pData->bIsRGBA16) /* 16-bit input row ? */
  5828. {
  5829. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  5830. iX += pData->iColinc)
  5831. {
  5832. iA16 = mng_get_uint16 (pDataline+6);
  5833. if (iA16) /* any opacity at all ? */
  5834. {
  5835. if (iA16 == 0xFFFF) /* fully opaque ? */
  5836. { /* scale down by dropping the LSB */
  5837. *(pScanline+1) = (mng_uint8)( ( (*(pDataline+4)) & 0xF8) | (*(pDataline+2)>>5) );
  5838. *pScanline = (mng_uint8)( ( (*(pDataline )) >> 3 ) | ((*(pDataline+2)&0xFC) << 3) );
  5839. }
  5840. else
  5841. { /* get the proper values */
  5842. iFGr16 = mng_get_uint16 (pDataline );
  5843. iFGg16 = mng_get_uint16 (pDataline+2);
  5844. iFGb16 = mng_get_uint16 (pDataline+4);
  5845. /* scale background up */
  5846. iBGr16 = (mng_uint8)( *(pScanline+1) & 0xF8 );
  5847. iBGg16 = (mng_uint8)( (*(pScanline+1) << 5) | ( ((*pScanline) & 0xE0) >> 3 ) );
  5848. iBGb16 = (mng_uint8)( *(pScanline ) << 3 );
  5849. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  5850. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  5851. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  5852. /* now compose */
  5853. MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16);
  5854. MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16);
  5855. MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16);
  5856. /* and return the composed values */
  5857. *(pScanline+1) = (mng_uint8)( (mng_uint8)((iFGb16 >> 8) &0xF8) | ( (mng_uint8)(iFGg16 >> 8) >> 5 ) );
  5858. *pScanline = (mng_uint8)( (mng_uint8) (iFGr16 >>11) | ( ( (mng_uint8)(iFGg16 >> 8) & 0xFC) << 3) );
  5859. }
  5860. }
  5861. pScanline += (pData->iColinc * 2);
  5862. pDataline += 8;
  5863. }
  5864. }
  5865. else
  5866. {
  5867. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  5868. iX += pData->iColinc)
  5869. {
  5870. iA8 = *(pDataline+3); /* get alpha value */
  5871. if (iA8) /* any opacity at all ? */
  5872. {
  5873. if (iA8 == 0xFF) /* fully opaque ? */
  5874. { /* then simply copy the values */
  5875. *(pScanline+1) = (mng_uint8)( ( (*(pDataline+2)) & 0xF8) | ( *(pDataline+1) >> 5 ) );
  5876. *pScanline = (mng_uint8)( ( (*(pDataline )) >> 3 ) | ( (*(pDataline+1) & 0xFC) << 3 ) );
  5877. }
  5878. else
  5879. { /* do alpha composing */
  5880. mng_uint8 iRed, iGreen, iBlue;
  5881. iRed = (mng_uint8)( *(pScanline+1) & 0xF8);
  5882. iGreen = (mng_uint8)( ( *(pScanline+1) << 5 ) | ( ( (*pScanline)&0xE0)>>3 ) );
  5883. iBlue = (mng_uint8)( *(pScanline ) << 3 );
  5884. MNG_COMPOSE8 (iRed, *(pDataline+2), iA8, iRed );
  5885. MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen );
  5886. MNG_COMPOSE8 (iBlue, *(pDataline+0), iA8, iBlue );
  5887. *(pScanline+1) = (mng_uint8)( ( iRed & 0xF8) | ( iGreen >> 5 ) );
  5888. *pScanline = (mng_uint8)( (iBlue >> 3 ) | ( (iGreen & 0xFC) << 3) );
  5889. }
  5890. }
  5891. pScanline += (pData->iColinc * 2);
  5892. pDataline += 4;
  5893. }
  5894. }
  5895. }
  5896. }
  5897. check_update_region (pData);
  5898. #ifdef MNG_SUPPORT_TRACE
  5899. MNG_TRACE (pData, MNG_FN_DISPLAY_RGB565, MNG_LC_END);
  5900. #endif
  5901. return MNG_NOERROR;
  5902. }
  5903. #else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  5904. mng_retcode mng_display_rgb565 (mng_datap pData)
  5905. {
  5906. mng_uint8p pScanline;
  5907. mng_uint8p pDataline;
  5908. mng_int32 iX;
  5909. mng_uint16 iA16;
  5910. mng_uint16 iFGr16, iFGg16, iFGb16;
  5911. mng_uint16 iBGr16, iBGg16, iBGb16;
  5912. mng_uint8 iA8;
  5913. mng_uint8 iBps;
  5914. #ifdef MNG_SUPPORT_TRACE
  5915. MNG_TRACE (pData, MNG_FN_DISPLAY_RGB565, MNG_LC_START);
  5916. #endif
  5917. iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1);
  5918. /* viewable row ? */
  5919. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  5920. { /* address destination row */
  5921. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  5922. pData->iRow + pData->iDestt -
  5923. pData->iSourcet);
  5924. /* adjust destination row starting-point */
  5925. pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2);
  5926. pDataline = pData->pRGBArow; /* address source row */
  5927. /* adjust source row starting-point */
  5928. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1));
  5929. if (pData->bIsOpaque) /* forget about transparency ? */
  5930. {
  5931. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  5932. iX += pData->iColinc)
  5933. { /* scale down by dropping the LSB */
  5934. *(pScanline+1) = (mng_uint8)( ( ( *(pDataline+2*iBps)) & 0xF8) |
  5935. (*(pDataline+iBps) >> 5 ) );
  5936. *pScanline = (mng_uint8)( ( ( *(pDataline )) >> 3 ) |
  5937. ((*(pDataline+iBps) & 0xFC) << 3) );
  5938. pScanline += (pData->iColinc * 2);
  5939. pDataline += 4*iBps;
  5940. }
  5941. }
  5942. else
  5943. {
  5944. if (pData->bIsRGBA16) /* 16-bit input row ? */
  5945. {
  5946. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  5947. iX += pData->iColinc)
  5948. {
  5949. iA16 = mng_get_uint16 (pDataline+6);
  5950. if (iA16) /* any opacity at all ? */
  5951. {
  5952. if (iA16 == 0xFFFF) /* fully opaque ? */
  5953. { /* scale down by dropping the LSB */
  5954. *(pScanline+1) = (mng_uint8)( ( (*(pDataline+4)) & 0xF8) | (*(pDataline+2)>>5) );
  5955. *pScanline = (mng_uint8)( ( (*(pDataline )) >> 3 ) | ((*(pDataline+2)&0xFC) << 3) );
  5956. }
  5957. else
  5958. { /* get the proper values */
  5959. iFGr16 = mng_get_uint16 (pDataline );
  5960. iFGg16 = mng_get_uint16 (pDataline+2);
  5961. iFGb16 = mng_get_uint16 (pDataline+4);
  5962. /* scale background up */
  5963. iBGr16 = (mng_uint8)( *(pScanline+1) & 0xF8 );
  5964. iBGg16 = (mng_uint8)( (*(pScanline+1) << 5) | ( ((*pScanline) & 0xE0) >> 3 ) );
  5965. iBGb16 = (mng_uint8)( *(pScanline ) << 3 );
  5966. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  5967. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  5968. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  5969. /* now compose */
  5970. MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16);
  5971. MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16);
  5972. MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16);
  5973. /* and return the composed values */
  5974. *(pScanline+1) = (mng_uint8)( (mng_uint8)((iFGb16 >> 8) &0xF8) | ( (mng_uint8)(iFGg16 >> 8) >> 5 ) );
  5975. *pScanline = (mng_uint8)( (mng_uint8) (iFGr16 >>11) | ( ( (mng_uint8)(iFGg16 >> 8) & 0xFC) << 3) );
  5976. }
  5977. }
  5978. pScanline += (pData->iColinc * 2);
  5979. pDataline += 8;
  5980. }
  5981. }
  5982. else
  5983. {
  5984. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  5985. iX += pData->iColinc)
  5986. {
  5987. iA8 = *(pDataline+3); /* get alpha value */
  5988. if (iA8) /* any opacity at all ? */
  5989. {
  5990. if (iA8 == 0xFF) /* fully opaque ? */
  5991. { /* then simply copy the values */
  5992. *(pScanline+1) = (mng_uint8)( ( (*(pDataline+2)) & 0xF8) | ( *(pDataline+1) >> 5 ) );
  5993. *pScanline = (mng_uint8)( ( (*(pDataline )) >> 3 ) | ( (*(pDataline+1) & 0xFC) << 3 ) );
  5994. }
  5995. else
  5996. { /* do alpha composing */
  5997. mng_uint8 iRed, iGreen, iBlue;
  5998. iRed = (mng_uint8)( *(pScanline+1) & 0xF8);
  5999. iGreen = (mng_uint8)( ( *(pScanline+1) << 5 ) | ( ( (*pScanline)&0xE0)>>3 ) );
  6000. iBlue = (mng_uint8)( *(pScanline ) << 3 );
  6001. MNG_COMPOSE8 (iRed, *(pDataline+2), iA8, iRed );
  6002. MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen );
  6003. MNG_COMPOSE8 (iBlue, *(pDataline+0), iA8, iBlue );
  6004. *(pScanline+1) = (mng_uint8)( ( iRed & 0xF8) | ( iGreen >> 5 ) );
  6005. *pScanline = (mng_uint8)( (iBlue >> 3 ) | ( (iGreen & 0xFC) << 3) );
  6006. }
  6007. }
  6008. pScanline += (pData->iColinc * 2);
  6009. pDataline += 4;
  6010. }
  6011. }
  6012. }
  6013. }
  6014. check_update_region (pData);
  6015. #ifdef MNG_SUPPORT_TRACE
  6016. MNG_TRACE (pData, MNG_FN_DISPLAY_RGB565, MNG_LC_END);
  6017. #endif
  6018. return MNG_NOERROR;
  6019. }
  6020. #endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  6021. #else /* MNG_NO_16BIT_SUPPORT */
  6022. mng_retcode mng_display_rgb565 (mng_datap pData)
  6023. {
  6024. mng_uint8p pScanline;
  6025. mng_uint8p pDataline;
  6026. mng_int32 iX;
  6027. mng_uint8 iA8;
  6028. #ifdef MNG_SUPPORT_TRACE
  6029. MNG_TRACE (pData, MNG_FN_DISPLAY_RGB565, MNG_LC_START);
  6030. #endif
  6031. /* viewable row ? */
  6032. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  6033. { /* address destination row */
  6034. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  6035. pData->iRow + pData->iDestt -
  6036. pData->iSourcet);
  6037. /* adjust destination row starting-point */
  6038. pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2);
  6039. pDataline = pData->pRGBArow; /* address source row */
  6040. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  6041. if (pData->bIsOpaque) /* forget about transparency ? */
  6042. {
  6043. {
  6044. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  6045. iX += pData->iColinc)
  6046. { /* copy the values */
  6047. *(pScanline+1) = (mng_uint8)( ( (*(pDataline+2)) & 0xF8) | (*(pDataline+1) >> 5 ) );
  6048. *pScanline = (mng_uint8)( ( *(pDataline ) >> 3 ) | ((*(pDataline+1) & 0xFC) << 3) );
  6049. pScanline += (pData->iColinc * 2);
  6050. pDataline += 4;
  6051. }
  6052. }
  6053. }
  6054. else
  6055. {
  6056. {
  6057. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  6058. iX += pData->iColinc)
  6059. {
  6060. iA8 = *(pDataline+3); /* get alpha value */
  6061. if (iA8) /* any opacity at all ? */
  6062. {
  6063. if (iA8 == 0xFF) /* fully opaque ? */
  6064. { /* then simply copy the values */
  6065. *(pScanline+1) = (mng_uint8)( ( (*(pDataline+2)) & 0xF8) | ( *(pDataline+1) >> 5 ) );
  6066. *pScanline = (mng_uint8)( ( (*(pDataline )) >> 3 ) | ( (*(pDataline+1) & 0xFC) << 3 ) );
  6067. }
  6068. else
  6069. { /* do alpha composing */
  6070. mng_uint8 iRed, iGreen, iBlue;
  6071. iRed = (mng_uint8)( *(pScanline+1) & 0xF8);
  6072. iGreen = (mng_uint8)( ( *(pScanline+1) << 5 ) | ( ( (*pScanline)&0xE0)>>3 ) );
  6073. iBlue = (mng_uint8)( *(pScanline ) << 3 );
  6074. MNG_COMPOSE8 (iRed, *(pDataline+2), iA8, iRed );
  6075. MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen );
  6076. MNG_COMPOSE8 (iBlue, *(pDataline+0), iA8, iBlue );
  6077. *(pScanline+1) = (mng_uint8)( ( iRed & 0xF8) | ( iGreen >> 5 ) );
  6078. *pScanline = (mng_uint8)( (iBlue >> 3 ) | ( (iGreen & 0xFC) << 3) );
  6079. }
  6080. }
  6081. pScanline += (pData->iColinc * 2);
  6082. pDataline += 4;
  6083. }
  6084. }
  6085. }
  6086. }
  6087. check_update_region (pData);
  6088. #ifdef MNG_SUPPORT_TRACE
  6089. MNG_TRACE (pData, MNG_FN_DISPLAY_RGB565, MNG_LC_END);
  6090. #endif
  6091. return MNG_NOERROR;
  6092. }
  6093. #endif /* MNG_NO_16BIT_SUPPORT */
  6094. #endif /* MNG_SKIPCANVAS_RGB565 */
  6095. /* ************************************************************************** */
  6096. #ifndef MNG_SKIPCANVAS_BGRA565
  6097. #ifndef MNG_NO_16BIT_SUPPORT
  6098. #ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  6099. mng_retcode mng_display_bgra565 (mng_datap pData)
  6100. {
  6101. mng_uint8p pScanline;
  6102. mng_uint8p pDataline;
  6103. mng_int32 iX;
  6104. mng_uint8 iFGa8, iBGa8, iCa8;
  6105. mng_uint16 iFGa16, iBGa16, iCa16;
  6106. mng_uint16 iFGr16, iFGg16, iFGb16;
  6107. mng_uint16 iBGr16, iBGg16, iBGb16;
  6108. mng_uint16 iCr16, iCg16, iCb16;
  6109. mng_uint8 iCr8, iCg8, iCb8;
  6110. #ifdef MNG_SUPPORT_TRACE
  6111. MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA565, MNG_LC_START);
  6112. #endif
  6113. /* viewable row ? */
  6114. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  6115. { /* address destination row */
  6116. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  6117. pData->iRow + pData->iDestt -
  6118. pData->iSourcet);
  6119. /* adjust destination row starting-point */
  6120. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl * 3);
  6121. pDataline = pData->pRGBArow; /* address source row */
  6122. if (pData->bIsRGBA16) /* adjust source row starting-point */
  6123. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3);
  6124. else
  6125. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  6126. if (pData->bIsOpaque) /* forget about transparency ? */
  6127. {
  6128. if (pData->bIsRGBA16) /* 16-bit input row ? */
  6129. {
  6130. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  6131. iX += pData->iColinc)
  6132. { /* scale down by dropping the LSB */
  6133. *(pScanline+1) = (mng_uint8)( ( (*(pDataline))&0xF8 ) | ( (*(pDataline+2)>>5) ) );
  6134. *pScanline = (mng_uint8)( ( (*(pDataline+4)) >>3) | ( (*(pDataline+2)&0xFC) << 3) );
  6135. *(pScanline+2) = *(pDataline+6);
  6136. pScanline += (pData->iColinc * 3);
  6137. pDataline += 8;
  6138. }
  6139. }
  6140. else
  6141. {
  6142. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  6143. iX += pData->iColinc)
  6144. { /* copy the values */
  6145. *(pScanline+1) = (mng_uint8)( ( (*(pDataline))&0xF8 ) | ( (*(pDataline+1)>>5 ) ) );
  6146. *pScanline = (mng_uint8)( ( *(pDataline+2) >>3 ) | ( (*(pDataline+1)&0xFC ) << 3) );
  6147. *(pScanline+2) = *(pDataline+3);
  6148. pScanline += (pData->iColinc * 3);
  6149. pDataline += 4;
  6150. }
  6151. }
  6152. }
  6153. else
  6154. {
  6155. if (pData->bIsRGBA16) /* 16-bit input row ? */
  6156. {
  6157. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  6158. iX += pData->iColinc)
  6159. { /* get alpha values */
  6160. iFGa16 = mng_get_uint16 (pDataline+6);
  6161. iBGa16 = (mng_uint16)(*(pScanline+2));
  6162. iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16;
  6163. if (iFGa16) /* any opacity at all ? */
  6164. { /* fully opaque or background fully transparent ? */
  6165. if ((iFGa16 == 0xFFFF) || (iBGa16 == 0))
  6166. { /* plain copy it */
  6167. *(pScanline+1) = (mng_uint8)( (*(pDataline))&0xF8 ) | (mng_uint8)( (*(pDataline+2)>>5 ) );
  6168. *pScanline = (mng_uint8)( (*(pDataline+4)) >>3) | (mng_uint8)( (*(pDataline+2)&0xFC) << 3);
  6169. *(pScanline+2) = *(pDataline+6);
  6170. }
  6171. else
  6172. {
  6173. if (iBGa16 == 0xFFFF) /* background fully opaque ? */
  6174. { /* get the proper values */
  6175. iFGr16 = mng_get_uint16 (pDataline );
  6176. iFGg16 = mng_get_uint16 (pDataline+2);
  6177. iFGb16 = mng_get_uint16 (pDataline+4);
  6178. /* scale background up */
  6179. iBGb16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 );
  6180. iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) );
  6181. iBGr16 = (mng_uint16)( (*(pScanline )) << 3 );
  6182. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  6183. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  6184. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  6185. /* now compose */
  6186. MNG_COMPOSE16(iFGr16, iFGr16, iFGa16, iBGr16);
  6187. MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16);
  6188. MNG_COMPOSE16(iFGb16, iFGb16, iFGa16, iBGb16);
  6189. /* and return the composed values */
  6190. *(pScanline+1) = (mng_uint8) ( ( (iFGr16 >> 8)&0xF8 ) | ( (mng_uint8)(iFGg16>>8) >> 5) );
  6191. *pScanline = (mng_uint8) ( ( (iFGb16>>11) ) | (((mng_uint8)(iFGg16>>8)&0xFC) << 3) );
  6192. }
  6193. else
  6194. { /* scale background up */
  6195. iBGb16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 );
  6196. iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) );
  6197. iBGr16 = (mng_uint16)( (*(pScanline )) << 3 );
  6198. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  6199. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  6200. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  6201. /* let's blend */
  6202. MNG_BLEND16 (mng_get_uint16 (pDataline ),
  6203. mng_get_uint16 (pDataline+2),
  6204. mng_get_uint16 (pDataline+4), iFGa16,
  6205. iBGr16, iBGg16, iBGb16, iBGa16,
  6206. iCr16, iCg16, iCb16, iCa16);
  6207. /* and return the composed values */
  6208. *(pScanline+1) = (mng_uint8) ( ( (iCr16 >> 8) & 0xF8 ) | ( (mng_uint8)(iCg16 >> 8) >> 5 ) );
  6209. *pScanline = (mng_uint8) ( ( (iCb16 >> 11) ) | (((mng_uint8)(iCg16 >> 8) & 0xFC) << 3) );
  6210. *(pScanline+2) = (mng_uint8)(iCa16 >> 8);
  6211. }
  6212. }
  6213. }
  6214. pScanline += (pData->iColinc * 3);
  6215. pDataline += 8;
  6216. }
  6217. }
  6218. else
  6219. {
  6220. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  6221. iX += pData->iColinc)
  6222. {
  6223. iFGa8 = *(pDataline+3); /* get alpha values */
  6224. iBGa8 = *(pScanline+2);
  6225. if (iFGa8) /* any opacity at all ? */
  6226. { /* fully opaque or background fully transparent ? */
  6227. if ((iFGa8 == 0xFF) || (iBGa8 == 0))
  6228. { /* then simply copy the values */
  6229. *(pScanline+1) = (mng_uint8)( ( (*(pDataline)) &0xF8 ) | (*(pDataline+1) >>5 ) );
  6230. *pScanline = (mng_uint8)( ( ((*(pDataline+2))>>3) ) | ((*(pDataline+1)&0xFC) << 3) );
  6231. *(pScanline+2) = *(pDataline+3);
  6232. }
  6233. else
  6234. {
  6235. mng_uint8 iRed, iGreen, iBlue;
  6236. iRed = (mng_uint8) ( *(pScanline+1) & 0xF8 );
  6237. iGreen = (mng_uint8) ( (*(pScanline+1) << 5) | ( ((*pScanline) & 0xE0)>>3 ) );
  6238. iBlue = (mng_uint8) ( (*pScanline << 3) );
  6239. if (iBGa8 == 0xFF) /* background fully opaque ? */
  6240. { /* do alpha composing */
  6241. MNG_COMPOSE8 (iRed, *pDataline, iFGa8, iRed );
  6242. MNG_COMPOSE8 (iGreen, *(pDataline+1), iFGa8, iGreen );
  6243. MNG_COMPOSE8 (iBlue, *(pDataline+2), iFGa8, iBlue );
  6244. /* alpha remains fully opaque !!! */
  6245. *(pScanline+1) = (mng_uint8) ( ( iRed & 0xF8 ) | (iGreen>>5) );
  6246. *pScanline = (mng_uint8) ( ( iBlue >> 3 ) | ( (iGreen & 0xFC) << 3) );
  6247. }
  6248. else
  6249. { /* now blend */
  6250. MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8,
  6251. iRed , iGreen , iBlue , iBGa8,
  6252. iCr8, iCg8, iCb8, iCa8);
  6253. /* and return the composed values */
  6254. *pScanline = (mng_uint8) ( ( iCb8 >> 3 ) | ( (iCg8 & 0xFC) << 3) );
  6255. *(pScanline+1) = (mng_uint8) ( ( iCr8 & 0xF8 ) | (iCg8>>5) );
  6256. *(pScanline+2) = (mng_uint8) iCa8;
  6257. }
  6258. }
  6259. }
  6260. pScanline += (pData->iColinc *3);
  6261. pDataline += 4;
  6262. }
  6263. }
  6264. }
  6265. }
  6266. check_update_region (pData);
  6267. #ifdef MNG_SUPPORT_TRACE
  6268. MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA565, MNG_LC_END);
  6269. #endif
  6270. return MNG_NOERROR;
  6271. }
  6272. #else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  6273. mng_retcode mng_display_bgra565 (mng_datap pData)
  6274. {
  6275. mng_uint8p pScanline;
  6276. mng_uint8p pDataline;
  6277. mng_int32 iX;
  6278. mng_uint8 iFGa8, iBGa8, iCa8;
  6279. mng_uint16 iFGa16, iBGa16, iCa16;
  6280. mng_uint16 iFGr16, iFGg16, iFGb16;
  6281. mng_uint16 iBGr16, iBGg16, iBGb16;
  6282. mng_uint16 iCr16, iCg16, iCb16;
  6283. mng_uint8 iCr8, iCg8, iCb8;
  6284. mng_uint8 iBps;
  6285. #ifdef MNG_SUPPORT_TRACE
  6286. MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA565, MNG_LC_START);
  6287. #endif
  6288. iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1);
  6289. /* viewable row ? */
  6290. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  6291. { /* address destination row */
  6292. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  6293. pData->iRow + pData->iDestt -
  6294. pData->iSourcet);
  6295. /* adjust destination row starting-point */
  6296. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl * 3);
  6297. pDataline = pData->pRGBArow; /* address source row */
  6298. /* adjust source row starting-point */
  6299. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1));
  6300. if (pData->bIsOpaque) /* forget about transparency ? */
  6301. {
  6302. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  6303. iX += pData->iColinc)
  6304. { /* scale down by dropping the LSB */
  6305. *(pScanline+1) = (mng_uint8)( ( (*(pDataline))&0xF8 ) |
  6306. ( (*(pDataline+iBps)>>5) ) );
  6307. *pScanline = (mng_uint8)( ( (*(pDataline+2*iBps)) >>3) |
  6308. ( (*(pDataline+iBps)&0xFC) << 3) );
  6309. *(pScanline+2) = *(pDataline+3*iBps);
  6310. pScanline += (pData->iColinc * 3);
  6311. pDataline += 4*iBps;
  6312. }
  6313. }
  6314. else
  6315. {
  6316. if (pData->bIsRGBA16) /* 16-bit input row ? */
  6317. {
  6318. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  6319. iX += pData->iColinc)
  6320. { /* get alpha values */
  6321. iFGa16 = mng_get_uint16 (pDataline+6);
  6322. iBGa16 = (mng_uint16)(*(pScanline+2));
  6323. iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16;
  6324. if (iFGa16) /* any opacity at all ? */
  6325. { /* fully opaque or background fully transparent ? */
  6326. if ((iFGa16 == 0xFFFF) || (iBGa16 == 0))
  6327. { /* plain copy it */
  6328. *(pScanline+1) = (mng_uint8)( (*(pDataline))&0xF8 ) | (mng_uint8)( (*(pDataline+2)>>5 ) );
  6329. *pScanline = (mng_uint8)( (*(pDataline+4)) >>3) | (mng_uint8)( (*(pDataline+2)&0xFC) << 3);
  6330. *(pScanline+2) = *(pDataline+6);
  6331. }
  6332. else
  6333. {
  6334. if (iBGa16 == 0xFFFF) /* background fully opaque ? */
  6335. { /* get the proper values */
  6336. iFGr16 = mng_get_uint16 (pDataline );
  6337. iFGg16 = mng_get_uint16 (pDataline+2);
  6338. iFGb16 = mng_get_uint16 (pDataline+4);
  6339. /* scale background up */
  6340. iBGb16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 );
  6341. iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) );
  6342. iBGr16 = (mng_uint16)( (*(pScanline )) << 3 );
  6343. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  6344. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  6345. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  6346. /* now compose */
  6347. MNG_COMPOSE16(iFGr16, iFGr16, iFGa16, iBGr16);
  6348. MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16);
  6349. MNG_COMPOSE16(iFGb16, iFGb16, iFGa16, iBGb16);
  6350. /* and return the composed values */
  6351. *(pScanline+1) = (mng_uint8) ( ( (iFGr16 >> 8)&0xF8 ) | ( (mng_uint8)(iFGg16>>8) >> 5) );
  6352. *pScanline = (mng_uint8) ( ( (iFGb16>>11) ) | (((mng_uint8)(iFGg16>>8)&0xFC) << 3) );
  6353. }
  6354. else
  6355. { /* scale background up */
  6356. iBGb16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 );
  6357. iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) );
  6358. iBGr16 = (mng_uint16)( (*(pScanline )) << 3 );
  6359. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  6360. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  6361. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  6362. /* let's blend */
  6363. MNG_BLEND16 (mng_get_uint16 (pDataline ),
  6364. mng_get_uint16 (pDataline+2),
  6365. mng_get_uint16 (pDataline+4), iFGa16,
  6366. iBGr16, iBGg16, iBGb16, iBGa16,
  6367. iCr16, iCg16, iCb16, iCa16);
  6368. /* and return the composed values */
  6369. *(pScanline+1) = (mng_uint8) ( ( (iCr16 >> 8) & 0xF8 ) | ( (mng_uint8)(iCg16 >> 8) >> 5 ) );
  6370. *pScanline = (mng_uint8) ( ( (iCb16 >> 11) ) | (((mng_uint8)(iCg16 >> 8) & 0xFC) << 3) );
  6371. *(pScanline+2) = (mng_uint8)(iCa16 >> 8);
  6372. }
  6373. }
  6374. }
  6375. pScanline += (pData->iColinc * 3);
  6376. pDataline += 8;
  6377. }
  6378. }
  6379. else
  6380. {
  6381. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  6382. iX += pData->iColinc)
  6383. {
  6384. iFGa8 = *(pDataline+3); /* get alpha values */
  6385. iBGa8 = *(pScanline+2);
  6386. if (iFGa8) /* any opacity at all ? */
  6387. { /* fully opaque or background fully transparent ? */
  6388. if ((iFGa8 == 0xFF) || (iBGa8 == 0))
  6389. { /* then simply copy the values */
  6390. *(pScanline+1) = (mng_uint8)( ( (*(pDataline)) &0xF8 ) | (*(pDataline+1) >>5 ) );
  6391. *pScanline = (mng_uint8)( ( ((*(pDataline+2))>>3) ) | ((*(pDataline+1)&0xFC) << 3) );
  6392. *(pScanline+2) = *(pDataline+3);
  6393. }
  6394. else
  6395. {
  6396. mng_uint8 iRed, iGreen, iBlue;
  6397. iRed = (mng_uint8) ( *(pScanline+1) & 0xF8 );
  6398. iGreen = (mng_uint8) ( (*(pScanline+1) << 5) | ( ((*pScanline) & 0xE0)>>3 ) );
  6399. iBlue = (mng_uint8) ( (*pScanline << 3) );
  6400. if (iBGa8 == 0xFF) /* background fully opaque ? */
  6401. { /* do alpha composing */
  6402. MNG_COMPOSE8 (iRed, *pDataline, iFGa8, iRed );
  6403. MNG_COMPOSE8 (iGreen, *(pDataline+1), iFGa8, iGreen );
  6404. MNG_COMPOSE8 (iBlue, *(pDataline+2), iFGa8, iBlue );
  6405. /* alpha remains fully opaque !!! */
  6406. *(pScanline+1) = (mng_uint8) ( ( iRed & 0xF8 ) | (iGreen>>5) );
  6407. *pScanline = (mng_uint8) ( ( iBlue >> 3 ) | ( (iGreen & 0xFC) << 3) );
  6408. }
  6409. else
  6410. { /* now blend */
  6411. MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8,
  6412. iRed , iGreen , iBlue , iBGa8,
  6413. iCr8, iCg8, iCb8, iCa8);
  6414. /* and return the composed values */
  6415. *pScanline = (mng_uint8) ( ( iCb8 >> 3 ) | ( (iCg8 & 0xFC) << 3) );
  6416. *(pScanline+1) = (mng_uint8) ( ( iCr8 & 0xF8 ) | (iCg8>>5) );
  6417. *(pScanline+2) = (mng_uint8) iCa8;
  6418. }
  6419. }
  6420. }
  6421. pScanline += (pData->iColinc *3);
  6422. pDataline += 4;
  6423. }
  6424. }
  6425. }
  6426. }
  6427. check_update_region (pData);
  6428. #ifdef MNG_SUPPORT_TRACE
  6429. MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA565, MNG_LC_END);
  6430. #endif
  6431. return MNG_NOERROR;
  6432. }
  6433. #endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  6434. #else /* MNG_NO_16BIT_SUPPORT */
  6435. mng_retcode mng_display_bgra565 (mng_datap pData)
  6436. {
  6437. mng_uint8p pScanline;
  6438. mng_uint8p pDataline;
  6439. mng_int32 iX;
  6440. mng_uint8 iFGa8, iBGa8, iCa8;
  6441. mng_uint8 iCr8, iCg8, iCb8;
  6442. #ifdef MNG_SUPPORT_TRACE
  6443. MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA565, MNG_LC_START);
  6444. #endif
  6445. /* viewable row ? */
  6446. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  6447. { /* address destination row */
  6448. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  6449. pData->iRow + pData->iDestt -
  6450. pData->iSourcet);
  6451. /* adjust destination row starting-point */
  6452. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl * 3);
  6453. pDataline = pData->pRGBArow; /* address source row */
  6454. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  6455. if (pData->bIsOpaque) /* forget about transparency ? */
  6456. {
  6457. {
  6458. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  6459. iX += pData->iColinc)
  6460. { /* copy the values */
  6461. *(pScanline+1) = (mng_uint8)( ( (*(pDataline))&0xF8 ) | ( (*(pDataline+1)>>5 ) ) );
  6462. *pScanline = (mng_uint8)( ( *(pDataline+2) >>3 ) | ( (*(pDataline+1)&0xFC ) << 3) );
  6463. *(pScanline+2) = *(pDataline+3);
  6464. pScanline += (pData->iColinc * 3);
  6465. pDataline += 4;
  6466. }
  6467. }
  6468. }
  6469. else
  6470. {
  6471. {
  6472. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  6473. iX += pData->iColinc)
  6474. {
  6475. iFGa8 = *(pDataline+3); /* get alpha values */
  6476. iBGa8 = *(pScanline+2);
  6477. if (iFGa8) /* any opacity at all ? */
  6478. { /* fully opaque or background fully transparent ? */
  6479. if ((iFGa8 == 0xFF) || (iBGa8 == 0))
  6480. { /* then simply copy the values */
  6481. *(pScanline+1) = (mng_uint8)( ( (*(pDataline)) &0xF8 ) | (*(pDataline+1) >>5 ) );
  6482. *pScanline = (mng_uint8)( ( ((*(pDataline+2))>>3) ) | ((*(pDataline+1)&0xFC) << 3) );
  6483. *(pScanline+2) = *(pDataline+3);
  6484. }
  6485. else
  6486. {
  6487. mng_uint8 iRed, iGreen, iBlue;
  6488. iRed = (mng_uint8) ( *(pScanline+1) & 0xF8 );
  6489. iGreen = (mng_uint8) ( (*(pScanline+1) << 5) | ( ((*pScanline) & 0xE0)>>3 ) );
  6490. iBlue = (mng_uint8) ( (*pScanline << 3) );
  6491. if (iBGa8 == 0xFF) /* background fully opaque ? */
  6492. { /* do alpha composing */
  6493. MNG_COMPOSE8 (iRed, *pDataline, iFGa8, iRed );
  6494. MNG_COMPOSE8 (iGreen, *(pDataline+1), iFGa8, iGreen );
  6495. MNG_COMPOSE8 (iBlue, *(pDataline+2), iFGa8, iBlue );
  6496. /* alpha remains fully opaque !!! */
  6497. *(pScanline+1) = (mng_uint8) ( ( iRed & 0xF8 ) | (iGreen>>5) );
  6498. *pScanline = (mng_uint8) ( ( iBlue >> 3 ) | ( (iGreen & 0xFC) << 3) );
  6499. }
  6500. else
  6501. { /* now blend */
  6502. MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8,
  6503. iRed , iGreen , iBlue , iBGa8,
  6504. iCr8, iCg8, iCb8, iCa8);
  6505. /* and return the composed values */
  6506. *pScanline = (mng_uint8) ( ( iCb8 >> 3 ) | ( (iCg8 & 0xFC) << 3) );
  6507. *(pScanline+1) = (mng_uint8) ( ( iCr8 & 0xF8 ) | (iCg8>>5) );
  6508. *(pScanline+2) = (mng_uint8) iCa8;
  6509. }
  6510. }
  6511. }
  6512. pScanline += (pData->iColinc *3);
  6513. pDataline += 4;
  6514. }
  6515. }
  6516. }
  6517. }
  6518. check_update_region (pData);
  6519. #ifdef MNG_SUPPORT_TRACE
  6520. MNG_TRACE (pData, MNG_FN_DISPLAY_BGRA565, MNG_LC_END);
  6521. #endif
  6522. return MNG_NOERROR;
  6523. }
  6524. #endif /* MNG_NO_16BIT_SUPPORT */
  6525. #endif /* MNG_SKIPCANVAS_BGRA565 */
  6526. /* ************************************************************************** */
  6527. #ifndef MNG_SKIPCANVAS_RGBA565
  6528. #ifndef MNG_NO_16BIT_SUPPORT
  6529. #ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  6530. mng_retcode mng_display_rgba565 (mng_datap pData)
  6531. {
  6532. mng_uint8p pScanline;
  6533. mng_uint8p pDataline;
  6534. mng_int32 iX;
  6535. mng_uint8 iFGa8, iBGa8, iCa8;
  6536. mng_uint16 iFGa16, iBGa16, iCa16;
  6537. mng_uint16 iFGr16, iFGg16, iFGb16;
  6538. mng_uint16 iBGr16, iBGg16, iBGb16;
  6539. mng_uint16 iCr16, iCg16, iCb16;
  6540. mng_uint8 iCr8, iCg8, iCb8;
  6541. #ifdef MNG_SUPPORT_TRACE
  6542. MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA565, MNG_LC_START);
  6543. #endif
  6544. /* viewable row ? */
  6545. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  6546. { /* address destination row */
  6547. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  6548. pData->iRow + pData->iDestt -
  6549. pData->iSourcet);
  6550. /* adjust destination row starting-point */
  6551. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl * 3);
  6552. pDataline = pData->pRGBArow; /* address source row */
  6553. if (pData->bIsRGBA16) /* adjust source row starting-point */
  6554. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3);
  6555. else
  6556. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  6557. if (pData->bIsOpaque) /* forget about transparency ? */
  6558. {
  6559. if (pData->bIsRGBA16) /* 16-bit input row ? */
  6560. {
  6561. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  6562. iX += pData->iColinc)
  6563. { /* scale down by dropping the LSB */
  6564. *(pScanline+1) = (mng_uint8)( ( (*(pDataline+4))&0xF8 ) | ( (*(pDataline+2)>>5) ) );
  6565. *pScanline = (mng_uint8)( ( (*(pDataline)) >>3) | ( (*(pDataline+2)&0xFC) << 3) );
  6566. *(pScanline+2) = *(pDataline+6);
  6567. pScanline += (pData->iColinc * 3);
  6568. pDataline += 8;
  6569. }
  6570. }
  6571. else
  6572. {
  6573. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  6574. iX += pData->iColinc)
  6575. { /* copy the values */
  6576. *(pScanline+1) = (mng_uint8)( ( (*(pDataline+2))&0xF8 ) | ( (*(pDataline+1)>>5 ) ) );
  6577. *pScanline = (mng_uint8)( ( *(pDataline) >>3 ) | ( (*(pDataline+1)&0xFC ) << 3) );
  6578. *(pScanline+2) = *(pDataline+3);
  6579. pScanline += (pData->iColinc * 3);
  6580. pDataline += 4;
  6581. }
  6582. }
  6583. }
  6584. else
  6585. {
  6586. if (pData->bIsRGBA16) /* 16-bit input row ? */
  6587. {
  6588. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  6589. iX += pData->iColinc)
  6590. { /* get alpha values */
  6591. iFGa16 = mng_get_uint16 (pDataline+6);
  6592. iBGa16 = (mng_uint16)(*(pScanline+2));
  6593. iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16;
  6594. if (iFGa16) /* any opacity at all ? */
  6595. { /* fully opaque or background fully transparent ? */
  6596. if ((iFGa16 == 0xFFFF) || (iBGa16 == 0))
  6597. { /* plain copy it */
  6598. *(pScanline+1) = (mng_uint8)( (*(pDataline+4))&0xF8 ) | (mng_uint8)( (*(pDataline+2)>>5 ) );
  6599. *pScanline = (mng_uint8)( (*(pDataline)) >>3) | (mng_uint8)( (*(pDataline+2)&0xFC) << 3);
  6600. *(pScanline+2) = *(pDataline+6);
  6601. }
  6602. else
  6603. {
  6604. if (iBGa16 == 0xFFFF) /* background fully opaque ? */
  6605. { /* get the proper values */
  6606. iFGr16 = mng_get_uint16 (pDataline );
  6607. iFGg16 = mng_get_uint16 (pDataline+2);
  6608. iFGb16 = mng_get_uint16 (pDataline+4);
  6609. /* scale background up */
  6610. iBGr16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 );
  6611. iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) );
  6612. iBGb16 = (mng_uint16)( (*(pScanline )) << 3 );
  6613. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  6614. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  6615. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  6616. /* now compose */
  6617. MNG_COMPOSE16(iFGr16, iFGr16, iFGa16, iBGr16);
  6618. MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16);
  6619. MNG_COMPOSE16(iFGb16, iFGb16, iFGa16, iBGb16);
  6620. /* and return the composed values */
  6621. *(pScanline+1) = (mng_uint8) ( ( (iFGb16 >> 8)&0xF8 ) | ( (mng_uint8)(iFGg16>>8) >> 5) );
  6622. *pScanline = (mng_uint8) ( ( (iFGr16>>11) ) | (((mng_uint8)(iFGg16>>8)&0xFC) << 3) );
  6623. }
  6624. else
  6625. { /* scale background up */
  6626. iBGr16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 );
  6627. iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) );
  6628. iBGb16 = (mng_uint16)( (*(pScanline )) << 3 );
  6629. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  6630. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  6631. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  6632. /* let's blend */
  6633. MNG_BLEND16 (mng_get_uint16 (pDataline ),
  6634. mng_get_uint16 (pDataline+2),
  6635. mng_get_uint16 (pDataline+4), iFGa16,
  6636. iBGr16, iBGg16, iBGb16, iBGa16,
  6637. iCr16, iCg16, iCb16, iCa16);
  6638. /* and return the composed values */
  6639. *(pScanline+1) = (mng_uint8) ( ( (iCb16 >> 8) & 0xF8 ) | ( (mng_uint8)(iCg16 >> 8) >> 5 ) );
  6640. *pScanline = (mng_uint8) ( ( (iCr16 >> 11) ) | (((mng_uint8)(iCg16 >> 8) & 0xFC) << 3) );
  6641. *(pScanline+2) = (mng_uint8)(iCa16 >> 8);
  6642. }
  6643. }
  6644. }
  6645. pScanline += (pData->iColinc * 3);
  6646. pDataline += 8;
  6647. }
  6648. }
  6649. else
  6650. {
  6651. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  6652. iX += pData->iColinc)
  6653. {
  6654. iFGa8 = *(pDataline+3); /* get alpha values */
  6655. iBGa8 = *(pScanline+2);
  6656. if (iFGa8) /* any opacity at all ? */
  6657. { /* fully opaque or background fully transparent ? */
  6658. if ((iFGa8 == 0xFF) || (iBGa8 == 0))
  6659. { /* then simply copy the values */
  6660. *(pScanline+1) = (mng_uint8)( ( (*(pDataline+2)) &0xF8 ) | (*(pDataline+1) >>5 ) );
  6661. *pScanline = (mng_uint8)( ( ((*(pDataline))>>3) ) | ((*(pDataline+1)&0xFC) << 3) );
  6662. *(pScanline+2) = *(pDataline+3);
  6663. }
  6664. else
  6665. {
  6666. mng_uint8 iRed, iGreen, iBlue;
  6667. iBlue = (mng_uint8) ( *(pScanline+1) & 0xF8 );
  6668. iGreen = (mng_uint8) ( (*(pScanline+1) << 5) | ( ((*pScanline) & 0xE0)>>3 ) );
  6669. iRed = (mng_uint8) ( (*pScanline << 3) );
  6670. if (iBGa8 == 0xFF) /* background fully opaque ? */
  6671. { /* do alpha composing */
  6672. MNG_COMPOSE8 (iRed, *pDataline, iFGa8, iRed );
  6673. MNG_COMPOSE8 (iGreen, *(pDataline+1), iFGa8, iGreen );
  6674. MNG_COMPOSE8 (iBlue, *(pDataline+2), iFGa8, iBlue );
  6675. /* alpha remains fully opaque !!! */
  6676. *(pScanline+1) = (mng_uint8) ( ( iBlue & 0xF8 ) | (iGreen>>5) );
  6677. *pScanline = (mng_uint8) ( ( iRed >> 3 ) | ( (iGreen & 0xFC) << 3) );
  6678. }
  6679. else
  6680. { /* now blend */
  6681. MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8,
  6682. iRed , iGreen , iBlue , iBGa8,
  6683. iCr8, iCg8, iCb8, iCa8);
  6684. /* and return the composed values */
  6685. *pScanline = (mng_uint8) ( ( iCr8 >> 3 ) | ( (iCg8 & 0xFC) << 3) );
  6686. *(pScanline+1) = (mng_uint8) ( ( iCb8 & 0xF8 ) | (iCg8>>5) );
  6687. *(pScanline+2) = (mng_uint8) iCa8;
  6688. }
  6689. }
  6690. }
  6691. pScanline += (pData->iColinc *3);
  6692. pDataline += 4;
  6693. }
  6694. }
  6695. }
  6696. }
  6697. check_update_region (pData);
  6698. #ifdef MNG_SUPPORT_TRACE
  6699. MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA565, MNG_LC_END);
  6700. #endif
  6701. return MNG_NOERROR;
  6702. }
  6703. #else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  6704. mng_retcode mng_display_rgba565 (mng_datap pData)
  6705. {
  6706. mng_uint8p pScanline;
  6707. mng_uint8p pDataline;
  6708. mng_int32 iX;
  6709. mng_uint8 iFGa8, iBGa8, iCa8;
  6710. mng_uint16 iFGa16, iBGa16, iCa16;
  6711. mng_uint16 iFGr16, iFGg16, iFGb16;
  6712. mng_uint16 iBGr16, iBGg16, iBGb16;
  6713. mng_uint16 iCr16, iCg16, iCb16;
  6714. mng_uint8 iCr8, iCg8, iCb8;
  6715. mng_uint8 iBps;
  6716. #ifdef MNG_SUPPORT_TRACE
  6717. MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA565, MNG_LC_START);
  6718. #endif
  6719. iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1);
  6720. /* viewable row ? */
  6721. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  6722. { /* address destination row */
  6723. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  6724. pData->iRow + pData->iDestt -
  6725. pData->iSourcet);
  6726. /* adjust destination row starting-point */
  6727. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl * 3);
  6728. pDataline = pData->pRGBArow; /* address source row */
  6729. /* adjust source row starting-point */
  6730. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1));
  6731. if (pData->bIsOpaque) /* forget about transparency ? */
  6732. {
  6733. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  6734. iX += pData->iColinc)
  6735. { /* scale down by dropping the LSB */
  6736. *(pScanline+1) = (mng_uint8)( ( (*(pDataline+2*iBps))&0xF8 ) |
  6737. ( (*(pDataline+iBps)>>5) ) );
  6738. *pScanline = (mng_uint8)( ( (*(pDataline)) >>3) |
  6739. ( (*(pDataline+iBps)&0xFC) << 3) );
  6740. *(pScanline+2) = *(pDataline+3*iBps);
  6741. pScanline += (pData->iColinc * 3);
  6742. pDataline += 4*iBps;
  6743. }
  6744. }
  6745. else
  6746. {
  6747. if (pData->bIsRGBA16) /* 16-bit input row ? */
  6748. {
  6749. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  6750. iX += pData->iColinc)
  6751. { /* get alpha values */
  6752. iFGa16 = mng_get_uint16 (pDataline+6);
  6753. iBGa16 = (mng_uint16)(*(pScanline+2));
  6754. iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16;
  6755. if (iFGa16) /* any opacity at all ? */
  6756. { /* fully opaque or background fully transparent ? */
  6757. if ((iFGa16 == 0xFFFF) || (iBGa16 == 0))
  6758. { /* plain copy it */
  6759. *(pScanline+1) = (mng_uint8)( (*(pDataline+4))&0xF8 ) | (mng_uint8)( (*(pDataline+2)>>5 ) );
  6760. *pScanline = (mng_uint8)( (*(pDataline)) >>3) | (mng_uint8)( (*(pDataline+2)&0xFC) << 3);
  6761. *(pScanline+2) = *(pDataline+6);
  6762. }
  6763. else
  6764. {
  6765. if (iBGa16 == 0xFFFF) /* background fully opaque ? */
  6766. { /* get the proper values */
  6767. iFGr16 = mng_get_uint16 (pDataline );
  6768. iFGg16 = mng_get_uint16 (pDataline+2);
  6769. iFGb16 = mng_get_uint16 (pDataline+4);
  6770. /* scale background up */
  6771. iBGr16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 );
  6772. iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) );
  6773. iBGb16 = (mng_uint16)( (*(pScanline )) << 3 );
  6774. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  6775. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  6776. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  6777. /* now compose */
  6778. MNG_COMPOSE16(iFGr16, iFGr16, iFGa16, iBGr16);
  6779. MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16);
  6780. MNG_COMPOSE16(iFGb16, iFGb16, iFGa16, iBGb16);
  6781. /* and return the composed values */
  6782. *(pScanline+1) = (mng_uint8) ( ( (iFGb16 >> 8)&0xF8 ) | ( (mng_uint8)(iFGg16>>8) >> 5) );
  6783. *pScanline = (mng_uint8) ( ( (iFGr16>>11) ) | (((mng_uint8)(iFGg16>>8)&0xFC) << 3) );
  6784. }
  6785. else
  6786. { /* scale background up */
  6787. iBGr16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 );
  6788. iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) );
  6789. iBGb16 = (mng_uint16)( (*(pScanline )) << 3 );
  6790. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  6791. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  6792. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  6793. /* let's blend */
  6794. MNG_BLEND16 (mng_get_uint16 (pDataline ),
  6795. mng_get_uint16 (pDataline+2),
  6796. mng_get_uint16 (pDataline+4), iFGa16,
  6797. iBGr16, iBGg16, iBGb16, iBGa16,
  6798. iCr16, iCg16, iCb16, iCa16);
  6799. /* and return the composed values */
  6800. *(pScanline+1) = (mng_uint8) ( ( (iCb16 >> 8) & 0xF8 ) | ( (mng_uint8)(iCg16 >> 8) >> 5 ) );
  6801. *pScanline = (mng_uint8) ( ( (iCr16 >> 11) ) | (((mng_uint8)(iCg16 >> 8) & 0xFC) << 3) );
  6802. *(pScanline+2) = (mng_uint8)(iCa16 >> 8);
  6803. }
  6804. }
  6805. }
  6806. pScanline += (pData->iColinc * 3);
  6807. pDataline += 8;
  6808. }
  6809. }
  6810. else
  6811. {
  6812. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  6813. iX += pData->iColinc)
  6814. {
  6815. iFGa8 = *(pDataline+3); /* get alpha values */
  6816. iBGa8 = *(pScanline+2);
  6817. if (iFGa8) /* any opacity at all ? */
  6818. { /* fully opaque or background fully transparent ? */
  6819. if ((iFGa8 == 0xFF) || (iBGa8 == 0))
  6820. { /* then simply copy the values */
  6821. *(pScanline+1) = (mng_uint8)( ( (*(pDataline+2)) &0xF8 ) | (*(pDataline+1) >>5 ) );
  6822. *pScanline = (mng_uint8)( ( ((*(pDataline))>>3) ) | ((*(pDataline+1)&0xFC) << 3) );
  6823. *(pScanline+2) = *(pDataline+3);
  6824. }
  6825. else
  6826. {
  6827. mng_uint8 iRed, iGreen, iBlue;
  6828. iBlue = (mng_uint8) ( *(pScanline+1) & 0xF8 );
  6829. iGreen = (mng_uint8) ( (*(pScanline+1) << 5) | ( ((*pScanline) & 0xE0)>>3 ) );
  6830. iRed = (mng_uint8) ( (*pScanline << 3) );
  6831. if (iBGa8 == 0xFF) /* background fully opaque ? */
  6832. { /* do alpha composing */
  6833. MNG_COMPOSE8 (iRed, *pDataline, iFGa8, iRed );
  6834. MNG_COMPOSE8 (iGreen, *(pDataline+1), iFGa8, iGreen );
  6835. MNG_COMPOSE8 (iBlue, *(pDataline+2), iFGa8, iBlue );
  6836. /* alpha remains fully opaque !!! */
  6837. *(pScanline+1) = (mng_uint8) ( ( iBlue & 0xF8 ) | (iGreen>>5) );
  6838. *pScanline = (mng_uint8) ( ( iRed >> 3 ) | ( (iGreen & 0xFC) << 3) );
  6839. }
  6840. else
  6841. { /* now blend */
  6842. MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8,
  6843. iRed , iGreen , iBlue , iBGa8,
  6844. iCr8, iCg8, iCb8, iCa8);
  6845. /* and return the composed values */
  6846. *pScanline = (mng_uint8) ( ( iCr8 >> 3 ) | ( (iCg8 & 0xFC) << 3) );
  6847. *(pScanline+1) = (mng_uint8) ( ( iCb8 & 0xF8 ) | (iCg8>>5) );
  6848. *(pScanline+2) = (mng_uint8) iCa8;
  6849. }
  6850. }
  6851. }
  6852. pScanline += (pData->iColinc *3);
  6853. pDataline += 4;
  6854. }
  6855. }
  6856. }
  6857. }
  6858. check_update_region (pData);
  6859. #ifdef MNG_SUPPORT_TRACE
  6860. MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA565, MNG_LC_END);
  6861. #endif
  6862. return MNG_NOERROR;
  6863. }
  6864. #endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  6865. #else /* MNG_NO_16BIT_SUPPORT */
  6866. mng_retcode mng_display_rgba565 (mng_datap pData)
  6867. {
  6868. mng_uint8p pScanline;
  6869. mng_uint8p pDataline;
  6870. mng_int32 iX;
  6871. mng_uint8 iFGa8, iBGa8, iCa8;
  6872. mng_uint8 iCr8, iCg8, iCb8;
  6873. #ifdef MNG_SUPPORT_TRACE
  6874. MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA565, MNG_LC_START);
  6875. #endif
  6876. /* viewable row ? */
  6877. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  6878. { /* address destination row */
  6879. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  6880. pData->iRow + pData->iDestt -
  6881. pData->iSourcet);
  6882. /* adjust destination row starting-point */
  6883. pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl * 3);
  6884. pDataline = pData->pRGBArow; /* address source row */
  6885. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  6886. if (pData->bIsOpaque) /* forget about transparency ? */
  6887. {
  6888. {
  6889. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  6890. iX += pData->iColinc)
  6891. { /* copy the values */
  6892. *(pScanline+1) = (mng_uint8)( ( (*(pDataline+2))&0xF8 ) | ( (*(pDataline+1)>>5 ) ) );
  6893. *pScanline = (mng_uint8)( ( *(pDataline) >>3 ) | ( (*(pDataline+1)&0xFC ) << 3) );
  6894. *(pScanline+2) = *(pDataline+3);
  6895. pScanline += (pData->iColinc * 3);
  6896. pDataline += 4;
  6897. }
  6898. }
  6899. }
  6900. else
  6901. {
  6902. {
  6903. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  6904. iX += pData->iColinc)
  6905. {
  6906. iFGa8 = *(pDataline+3); /* get alpha values */
  6907. iBGa8 = *(pScanline+2);
  6908. if (iFGa8) /* any opacity at all ? */
  6909. { /* fully opaque or background fully transparent ? */
  6910. if ((iFGa8 == 0xFF) || (iBGa8 == 0))
  6911. { /* then simply copy the values */
  6912. *(pScanline+1) = (mng_uint8)( ( (*(pDataline+2)) &0xF8 ) | (*(pDataline+1) >>5 ) );
  6913. *pScanline = (mng_uint8)( ( ((*(pDataline))>>3) ) | ((*(pDataline+1)&0xFC) << 3) );
  6914. *(pScanline+2) = *(pDataline+3);
  6915. }
  6916. else
  6917. {
  6918. mng_uint8 iRed, iGreen, iBlue;
  6919. iBlue = (mng_uint8) ( *(pScanline+1) & 0xF8 );
  6920. iGreen = (mng_uint8) ( (*(pScanline+1) << 5) | ( ((*pScanline) & 0xE0)>>3 ) );
  6921. iRed = (mng_uint8) ( (*pScanline << 3) );
  6922. if (iBGa8 == 0xFF) /* background fully opaque ? */
  6923. { /* do alpha composing */
  6924. MNG_COMPOSE8 (iRed, *pDataline, iFGa8, iRed );
  6925. MNG_COMPOSE8 (iGreen, *(pDataline+1), iFGa8, iGreen );
  6926. MNG_COMPOSE8 (iBlue, *(pDataline+2), iFGa8, iBlue );
  6927. /* alpha remains fully opaque !!! */
  6928. *(pScanline+1) = (mng_uint8) ( ( iBlue & 0xF8 ) | (iGreen>>5) );
  6929. *pScanline = (mng_uint8) ( ( iRed >> 3 ) | ( (iGreen & 0xFC) << 3) );
  6930. }
  6931. else
  6932. { /* now blend */
  6933. MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8,
  6934. iRed , iGreen , iBlue , iBGa8,
  6935. iCr8, iCg8, iCb8, iCa8);
  6936. /* and return the composed values */
  6937. *pScanline = (mng_uint8) ( ( iCr8 >> 3 ) | ( (iCg8 & 0xFC) << 3) );
  6938. *(pScanline+1) = (mng_uint8) ( ( iCb8 & 0xF8 ) | (iCg8>>5) );
  6939. *(pScanline+2) = (mng_uint8) iCa8;
  6940. }
  6941. }
  6942. }
  6943. pScanline += (pData->iColinc *3);
  6944. pDataline += 4;
  6945. }
  6946. }
  6947. }
  6948. }
  6949. check_update_region (pData);
  6950. #ifdef MNG_SUPPORT_TRACE
  6951. MNG_TRACE (pData, MNG_FN_DISPLAY_RGBA565, MNG_LC_END);
  6952. #endif
  6953. return MNG_NOERROR;
  6954. }
  6955. #endif /* MNG_NO_16BIT_SUPPORT */
  6956. #endif /* MNG_SKIPCANVAS_RGBA565 */
  6957. /* ************************************************************************** */
  6958. #ifndef MNG_SKIPCANVAS_BGR565_A8
  6959. #ifndef MNG_NO_16BIT_SUPPORT
  6960. #ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  6961. mng_retcode mng_display_bgr565_a8 (mng_datap pData)
  6962. {
  6963. mng_uint8p pScanline;
  6964. mng_uint8p pAlphaline;
  6965. mng_uint8p pDataline;
  6966. mng_int32 iX;
  6967. mng_uint16 iA16;
  6968. mng_uint16 iFGr16, iFGg16, iFGb16;
  6969. mng_uint16 iBGr16, iBGg16, iBGb16, iBGa16;
  6970. mng_uint16 iCr16, iCg16, iCb16, iCa16;
  6971. mng_uint8 iA8, iBGa8, iCa8;
  6972. mng_uint8 iCr8, iCg8, iCb8;
  6973. #ifdef MNG_SUPPORT_TRACE
  6974. MNG_TRACE (pData, MNG_FN_DISPLAY_BGR565_A8, MNG_LC_START);
  6975. #endif
  6976. /* viewable row ? */
  6977. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  6978. { /* address destination row */
  6979. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  6980. pData->iRow + pData->iDestt -
  6981. pData->iSourcet);
  6982. pAlphaline = (mng_uint8p)pData->fGetalphaline (((mng_handle)pData),
  6983. pData->iRow + pData->iDestt -
  6984. pData->iSourcet);
  6985. /* adjust destination row
  6986. starting-point */
  6987. pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2);
  6988. pAlphaline = pAlphaline + pData->iCol + pData->iDestl;
  6989. pDataline = pData->pRGBArow; /* address source row */
  6990. if (pData->bIsRGBA16) /* adjust source row starting-point */
  6991. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3);
  6992. else
  6993. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  6994. if (pData->bIsOpaque) /* forget about transparency ? */
  6995. {
  6996. if (pData->bIsRGBA16) /* 16-bit input row ? */
  6997. {
  6998. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  6999. iX += pData->iColinc)
  7000. { /* scale down by dropping the LSB */
  7001. *(pScanline+1) = (mng_uint8)( ( (*(pDataline))&0xF8 ) | ((*(pDataline+2)>>5) ) );
  7002. *pScanline = (mng_uint8)( ( (*(pDataline+4)) >>3) | ((*(pDataline+2)&0xFC) << 3) );
  7003. *pAlphaline = (mng_uint8)(*(pDataline+6));
  7004. pScanline += (pData->iColinc * 2);
  7005. pAlphaline += pData->iColinc;
  7006. pDataline += 8;
  7007. }
  7008. }
  7009. else
  7010. {
  7011. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  7012. iX += pData->iColinc)
  7013. { /* copy the values */
  7014. *(pScanline+1) = (mng_uint8)( ( (*(pDataline))&0xF8 ) | ((*(pDataline+1)>>5 ) ) );
  7015. *pScanline = (mng_uint8)( ( *(pDataline+2) >>3 ) | ((*(pDataline+1)&0xFC ) << 3) );
  7016. *pAlphaline = (mng_uint8)(*(pDataline+3));
  7017. pScanline += (pData->iColinc * 2);
  7018. pAlphaline += pData->iColinc;
  7019. pDataline += 4;
  7020. }
  7021. }
  7022. }
  7023. else /* Not fully opaque */
  7024. {
  7025. if (pData->bIsRGBA16) /* 16-bit input row ? */
  7026. {
  7027. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  7028. iX += pData->iColinc)
  7029. {
  7030. iA16 = mng_get_uint16 (pDataline+6);
  7031. iBGa16 = (mng_uint16)(*pAlphaline);
  7032. iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16;
  7033. if (iA16) /* any opacity at all ? */
  7034. {
  7035. if ((iA16 == 0xFFFF) || (iBGa16 == 0)) /* fully opaque or background fully transparent ? */
  7036. { /* scale down by dropping the LSB */
  7037. *(pScanline+1) = (mng_uint8)( (*(pDataline))&0xF8 ) | (mng_uint8)( (*(pDataline+2)>>5 ) );
  7038. *pScanline = (mng_uint8)( (*(pDataline+4)) >>3) | (mng_uint8)( (*(pDataline+2)&0xFC) << 3);
  7039. *pAlphaline = *(pDataline+6);
  7040. }
  7041. else
  7042. {
  7043. if (iBGa16 == 0xFFFF) /* background fully opaque ? */
  7044. {
  7045. /* get the proper values */
  7046. iFGr16 = mng_get_uint16 (pDataline );
  7047. iFGg16 = mng_get_uint16 (pDataline+2);
  7048. iFGb16 = mng_get_uint16 (pDataline+4);
  7049. /* scale background up */
  7050. iBGb16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 );
  7051. iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) );
  7052. iBGr16 = (mng_uint16)( (*(pScanline )) << 3 );
  7053. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  7054. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  7055. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  7056. /* now compose */
  7057. MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16);
  7058. MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16);
  7059. MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16);
  7060. /* and return the composed values */
  7061. *(pScanline+1) = (mng_uint8) ( ( (iFGr16 >> 8)&0xF8 ) | ( (mng_uint8)(iFGg16>>8) >> 5) );
  7062. *pScanline = (mng_uint8) ( ( (iFGb16>>11) ) | (((mng_uint8)(iFGg16>>8)&0xFC) << 3) );
  7063. *pAlphaline = (mng_uint8)(iA16>>8);
  7064. }
  7065. else /* background is not fully opaque */
  7066. { /* scale background up */
  7067. iBGb16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 );
  7068. iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) );
  7069. iBGr16 = (mng_uint16)( (*(pScanline )) << 3 );
  7070. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  7071. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  7072. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  7073. /* let's blend */
  7074. MNG_BLEND16 (mng_get_uint16 (pDataline ),
  7075. mng_get_uint16 (pDataline+2),
  7076. mng_get_uint16 (pDataline+4), iA16,
  7077. iBGr16, iBGg16, iBGb16, iBGa16,
  7078. iCr16, iCg16, iCb16, iCa16);
  7079. /* and return the composed values */
  7080. *(pScanline+1) = (mng_uint8) ( ( (iCr16 >> 8)&0xF8 ) | ( (mng_uint8)(iCg16>>8) >> 5) );
  7081. *pScanline = (mng_uint8) ( ( (iCb16>>11) ) | (((mng_uint8)(iCg16>>8)&0xFC) << 3) );
  7082. *pAlphaline = (mng_uint8)(iCa16 >> 8);
  7083. }
  7084. }
  7085. }
  7086. pScanline += (pData->iColinc * 2);
  7087. pAlphaline += pData->iColinc;
  7088. pDataline += 8;
  7089. }
  7090. }
  7091. else
  7092. {
  7093. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  7094. iX += pData->iColinc)
  7095. {
  7096. iA8 = *(pDataline+3); /* get alpha value */
  7097. iBGa8 = *pAlphaline;
  7098. if (iA8) /* any opacity at all ? */
  7099. { /* fully opaque or background fully transparent ? */
  7100. if ((iA8 == 0xFF) || (iBGa8 == 0))
  7101. { /* then simply copy the values */
  7102. *(pScanline+1) = (mng_uint8)( ( (*(pDataline)) &0xF8 ) | (*(pDataline+1) >>5 ) );
  7103. *pScanline = (mng_uint8)( ( ((*(pDataline+2))>>3) ) | ((*(pDataline+1)&0xFC) << 3) );
  7104. *pAlphaline = *(pDataline+3);
  7105. }
  7106. else
  7107. {
  7108. if (iBGa8 == 0xFF) /* background fully opaque ? */
  7109. {
  7110. /* do alpha composing */
  7111. mng_uint8 iRed, iGreen, iBlue;
  7112. iRed = (mng_uint8) ( *(pScanline+1) & 0xF8 );
  7113. iGreen = (mng_uint8) ( (*(pScanline+1) << 5) | (((*pScanline) & 0xE0)>>3 ) );
  7114. iBlue = (mng_uint8) ( (*pScanline << 3) );
  7115. MNG_COMPOSE8 (iRed, *pDataline, iA8, iRed );
  7116. MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen );
  7117. MNG_COMPOSE8 (iBlue, *(pDataline+2), iA8, iBlue );
  7118. *(pScanline+1) = (mng_uint8) ( ( iRed & 0xF8 ) | (iGreen>>5) );
  7119. *pScanline = (mng_uint8) ( ( iBlue >> 3 ) | ((iGreen & 0xFC) << 3) );
  7120. *pAlphaline = iA8;
  7121. }
  7122. else /* background not fully opaque */
  7123. {
  7124. MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iA8,
  7125. *pScanline, *(pScanline+1), *(pScanline+2), iBGa8,
  7126. iCr8, iCg8, iCb8, iCa8);
  7127. /* and return the composed values */
  7128. *(pScanline+1) = (mng_uint8) ( ( iCr8 & 0xF8 ) | (iCg8>>5) );
  7129. *pScanline = (mng_uint8) ( ( iCb8 >> 3 ) | ((iCg8 & 0xFC) << 3) );
  7130. *pAlphaline = iCa8;
  7131. }
  7132. }
  7133. }
  7134. pScanline += (pData->iColinc * 2);
  7135. pAlphaline += pData->iColinc;
  7136. pDataline += 4;
  7137. }
  7138. }
  7139. }
  7140. }
  7141. check_update_region (pData);
  7142. #ifdef MNG_SUPPORT_TRACE
  7143. MNG_TRACE (pData, MNG_FN_DISPLAY_BGR565_A8, MNG_LC_END);
  7144. #endif
  7145. return MNG_NOERROR;
  7146. }
  7147. #else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  7148. mng_retcode mng_display_bgr565_a8 (mng_datap pData)
  7149. {
  7150. mng_uint8p pScanline;
  7151. mng_uint8p pAlphaline;
  7152. mng_uint8p pDataline;
  7153. mng_int32 iX;
  7154. mng_uint16 iA16;
  7155. mng_uint16 iFGr16, iFGg16, iFGb16;
  7156. mng_uint16 iBGr16, iBGg16, iBGb16, iBGa16;
  7157. mng_uint16 iCr16, iCg16, iCb16, iCa16;
  7158. mng_uint8 iA8, iBGa8, iCa8;
  7159. mng_uint8 iCr8, iCg8, iCb8;
  7160. mng_uint8 iBps;
  7161. #ifdef MNG_SUPPORT_TRACE
  7162. MNG_TRACE (pData, MNG_FN_DISPLAY_BGR565_A8, MNG_LC_START);
  7163. #endif
  7164. iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1);
  7165. /* viewable row ? */
  7166. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  7167. { /* address destination row */
  7168. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  7169. pData->iRow + pData->iDestt -
  7170. pData->iSourcet);
  7171. pAlphaline = (mng_uint8p)pData->fGetalphaline (((mng_handle)pData),
  7172. pData->iRow + pData->iDestt -
  7173. pData->iSourcet);
  7174. /* adjust destination row
  7175. starting-point */
  7176. pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2);
  7177. pAlphaline = pAlphaline + pData->iCol + pData->iDestl;
  7178. pDataline = pData->pRGBArow; /* address source row */
  7179. /* adjust source row starting-point */
  7180. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1));
  7181. if (pData->bIsOpaque) /* forget about transparency ? */
  7182. {
  7183. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  7184. iX += pData->iColinc)
  7185. { /* scale down by dropping the LSB */
  7186. *(pScanline+1) = (mng_uint8)( ( (*(pDataline))&0xF8 ) |
  7187. ((*(pDataline+iBps)>>5) ) );
  7188. *pScanline = (mng_uint8)( ( (*(pDataline+2*iBps)) >>3) |
  7189. ((*(pDataline+iBps)&0xFC) << 3) );
  7190. *pAlphaline = (mng_uint8)(*(pDataline+6));
  7191. pScanline += (pData->iColinc * 2);
  7192. pAlphaline += pData->iColinc;
  7193. pDataline += 8;
  7194. }
  7195. }
  7196. else /* Not fully opaque */
  7197. {
  7198. if (pData->bIsRGBA16) /* 16-bit input row ? */
  7199. {
  7200. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  7201. iX += pData->iColinc)
  7202. {
  7203. iA16 = mng_get_uint16 (pDataline+6);
  7204. iBGa16 = (mng_uint16)(*pAlphaline);
  7205. iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16;
  7206. if (iA16) /* any opacity at all ? */
  7207. {
  7208. if ((iA16 == 0xFFFF) || (iBGa16 == 0)) /* fully opaque or background fully transparent ? */
  7209. { /* scale down by dropping the LSB */
  7210. *(pScanline+1) = (mng_uint8)( (*(pDataline))&0xF8 ) | (mng_uint8)( (*(pDataline+2)>>5 ) );
  7211. *pScanline = (mng_uint8)( (*(pDataline+4)) >>3) | (mng_uint8)( (*(pDataline+2)&0xFC) << 3);
  7212. *pAlphaline = *(pDataline+6);
  7213. }
  7214. else
  7215. {
  7216. if (iBGa16 == 0xFFFF) /* background fully opaque ? */
  7217. {
  7218. /* get the proper values */
  7219. iFGr16 = mng_get_uint16 (pDataline );
  7220. iFGg16 = mng_get_uint16 (pDataline+2);
  7221. iFGb16 = mng_get_uint16 (pDataline+4);
  7222. /* scale background up */
  7223. iBGb16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 );
  7224. iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) );
  7225. iBGr16 = (mng_uint16)( (*(pScanline )) << 3 );
  7226. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  7227. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  7228. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  7229. /* now compose */
  7230. MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16);
  7231. MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16);
  7232. MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16);
  7233. /* and return the composed values */
  7234. *(pScanline+1) = (mng_uint8) ( ( (iFGr16 >> 8)&0xF8 ) | ( (mng_uint8)(iFGg16>>8) >> 5) );
  7235. *pScanline = (mng_uint8) ( ( (iFGb16>>11) ) | (((mng_uint8)(iFGg16>>8)&0xFC) << 3) );
  7236. *pAlphaline = (mng_uint8)(iA16>>8);
  7237. }
  7238. else /* background is not fully opaque */
  7239. { /* scale background up */
  7240. iBGb16 = (mng_uint16)( (*(pScanline+1)) & 0xF8 );
  7241. iBGg16 = (mng_uint16)( (*(pScanline+1) << 5) | (((*(pScanline )) & 0xE0) >>3 ) );
  7242. iBGr16 = (mng_uint16)( (*(pScanline )) << 3 );
  7243. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  7244. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  7245. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  7246. /* let's blend */
  7247. MNG_BLEND16 (mng_get_uint16 (pDataline ),
  7248. mng_get_uint16 (pDataline+2),
  7249. mng_get_uint16 (pDataline+4), iA16,
  7250. iBGr16, iBGg16, iBGb16, iBGa16,
  7251. iCr16, iCg16, iCb16, iCa16);
  7252. /* and return the composed values */
  7253. *(pScanline+1) = (mng_uint8) ( ( (iCr16 >> 8)&0xF8 ) | ( (mng_uint8)(iCg16>>8) >> 5) );
  7254. *pScanline = (mng_uint8) ( ( (iCb16>>11) ) | (((mng_uint8)(iCg16>>8)&0xFC) << 3) );
  7255. *pAlphaline = (mng_uint8)(iCa16 >> 8);
  7256. }
  7257. }
  7258. }
  7259. pScanline += (pData->iColinc * 2);
  7260. pAlphaline += pData->iColinc;
  7261. pDataline += 8;
  7262. }
  7263. }
  7264. else
  7265. {
  7266. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  7267. iX += pData->iColinc)
  7268. {
  7269. iA8 = *(pDataline+3); /* get alpha value */
  7270. iBGa8 = *pAlphaline;
  7271. if (iA8) /* any opacity at all ? */
  7272. { /* fully opaque or background fully transparent ? */
  7273. if ((iA8 == 0xFF) || (iBGa8 == 0))
  7274. { /* then simply copy the values */
  7275. *(pScanline+1) = (mng_uint8)( ( (*(pDataline)) &0xF8 ) | (*(pDataline+1) >>5 ) );
  7276. *pScanline = (mng_uint8)( ( ((*(pDataline+2))>>3) ) | ((*(pDataline+1)&0xFC) << 3) );
  7277. *pAlphaline = *(pDataline+3);
  7278. }
  7279. else
  7280. {
  7281. if (iBGa8 == 0xFF) /* background fully opaque ? */
  7282. {
  7283. /* do alpha composing */
  7284. mng_uint8 iRed, iGreen, iBlue;
  7285. iRed = (mng_uint8) ( *(pScanline+1) & 0xF8 );
  7286. iGreen = (mng_uint8) ( (*(pScanline+1) << 5) | (((*pScanline) & 0xE0)>>3 ) );
  7287. iBlue = (mng_uint8) ( (*pScanline << 3) );
  7288. MNG_COMPOSE8 (iRed, *pDataline, iA8, iRed );
  7289. MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen );
  7290. MNG_COMPOSE8 (iBlue, *(pDataline+2), iA8, iBlue );
  7291. *(pScanline+1) = (mng_uint8) ( ( iRed & 0xF8 ) | (iGreen>>5) );
  7292. *pScanline = (mng_uint8) ( ( iBlue >> 3 ) | ((iGreen & 0xFC) << 3) );
  7293. *pAlphaline = iA8;
  7294. }
  7295. else /* background not fully opaque */
  7296. {
  7297. MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iA8,
  7298. *pScanline, *(pScanline+1), *(pScanline+2), iBGa8,
  7299. iCr8, iCg8, iCb8, iCa8);
  7300. /* and return the composed values */
  7301. *(pScanline+1) = (mng_uint8) ( ( iCr8 & 0xF8 ) | (iCg8>>5) );
  7302. *pScanline = (mng_uint8) ( ( iCb8 >> 3 ) | ((iCg8 & 0xFC) << 3) );
  7303. *pAlphaline = iCa8;
  7304. }
  7305. }
  7306. }
  7307. pScanline += (pData->iColinc * 2);
  7308. pAlphaline += pData->iColinc;
  7309. pDataline += 4;
  7310. }
  7311. }
  7312. }
  7313. }
  7314. check_update_region (pData);
  7315. #ifdef MNG_SUPPORT_TRACE
  7316. MNG_TRACE (pData, MNG_FN_DISPLAY_BGR565_A8, MNG_LC_END);
  7317. #endif
  7318. return MNG_NOERROR;
  7319. }
  7320. #endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  7321. #else /* MNG_NO_16BIT_SUPPORT */
  7322. mng_retcode mng_display_bgr565_a8 (mng_datap pData)
  7323. {
  7324. mng_uint8p pScanline;
  7325. mng_uint8p pAlphaline;
  7326. mng_uint8p pDataline;
  7327. mng_int32 iX;
  7328. mng_uint8 iA8, iBGa8, iCa8;
  7329. mng_uint8 iCr8, iCg8, iCb8;
  7330. #ifdef MNG_SUPPORT_TRACE
  7331. MNG_TRACE (pData, MNG_FN_DISPLAY_BGR565_A8, MNG_LC_START);
  7332. #endif
  7333. /* viewable row ? */
  7334. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  7335. { /* address destination row */
  7336. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  7337. pData->iRow + pData->iDestt -
  7338. pData->iSourcet);
  7339. pAlphaline = (mng_uint8p)pData->fGetalphaline (((mng_handle)pData),
  7340. pData->iRow + pData->iDestt -
  7341. pData->iSourcet);
  7342. /* adjust destination row
  7343. starting-point */
  7344. pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2);
  7345. pAlphaline = pAlphaline + pData->iCol + pData->iDestl;
  7346. pDataline = pData->pRGBArow; /* address source row */
  7347. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  7348. if (pData->bIsOpaque) /* forget about transparency ? */
  7349. {
  7350. {
  7351. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  7352. iX += pData->iColinc)
  7353. { /* copy the values */
  7354. *(pScanline+1) = (mng_uint8)( ( (*(pDataline))&0xF8 ) | ((*(pDataline+1)>>5 ) ) );
  7355. *pScanline = (mng_uint8)( ( *(pDataline+2) >>3 ) | ((*(pDataline+1)&0xFC ) << 3) );
  7356. *pAlphaline = (mng_uint8)(*(pDataline+3));
  7357. pScanline += (pData->iColinc * 2);
  7358. pAlphaline += pData->iColinc;
  7359. pDataline += 4;
  7360. }
  7361. }
  7362. }
  7363. else /* Not fully opaque */
  7364. {
  7365. {
  7366. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  7367. iX += pData->iColinc)
  7368. {
  7369. iA8 = *(pDataline+3); /* get alpha value */
  7370. iBGa8 = *pAlphaline;
  7371. if (iA8) /* any opacity at all ? */
  7372. { /* fully opaque or background fully transparent ? */
  7373. if ((iA8 == 0xFF) || (iBGa8 == 0))
  7374. { /* then simply copy the values */
  7375. *(pScanline+1) = (mng_uint8)( ( (*(pDataline)) &0xF8 ) | (*(pDataline+1) >>5 ) );
  7376. *pScanline = (mng_uint8)( ( ((*(pDataline+2))>>3) ) | ((*(pDataline+1)&0xFC) << 3) );
  7377. *pAlphaline = *(pDataline+3);
  7378. }
  7379. else
  7380. {
  7381. if (iBGa8 == 0xFF) /* background fully opaque ? */
  7382. {
  7383. /* do alpha composing */
  7384. mng_uint8 iRed, iGreen, iBlue;
  7385. iRed = (mng_uint8) ( *(pScanline+1) & 0xF8 );
  7386. iGreen = (mng_uint8) ( (*(pScanline+1) << 5) | (((*pScanline) & 0xE0)>>3 ) );
  7387. iBlue = (mng_uint8) ( (*pScanline << 3) );
  7388. MNG_COMPOSE8 (iRed, *pDataline, iA8, iRed );
  7389. MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen );
  7390. MNG_COMPOSE8 (iBlue, *(pDataline+2), iA8, iBlue );
  7391. *(pScanline+1) = (mng_uint8) ( ( iRed & 0xF8 ) | (iGreen>>5) );
  7392. *pScanline = (mng_uint8) ( ( iBlue >> 3 ) | ((iGreen & 0xFC) << 3) );
  7393. *pAlphaline = iA8;
  7394. }
  7395. else /* background not fully opaque */
  7396. {
  7397. MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iA8,
  7398. *pScanline, *(pScanline+1), *(pScanline+2), iBGa8,
  7399. iCr8, iCg8, iCb8, iCa8);
  7400. /* and return the composed values */
  7401. *(pScanline+1) = (mng_uint8) ( ( iCr8 & 0xF8 ) | (iCg8>>5) );
  7402. *pScanline = (mng_uint8) ( ( iCb8 >> 3 ) | ((iCg8 & 0xFC) << 3) );
  7403. *pAlphaline = iCa8;
  7404. }
  7405. }
  7406. }
  7407. pScanline += (pData->iColinc * 2);
  7408. pAlphaline += pData->iColinc;
  7409. pDataline += 4;
  7410. }
  7411. }
  7412. }
  7413. }
  7414. check_update_region (pData);
  7415. #ifdef MNG_SUPPORT_TRACE
  7416. MNG_TRACE (pData, MNG_FN_DISPLAY_BGR565_A8, MNG_LC_END);
  7417. #endif
  7418. return MNG_NOERROR;
  7419. }
  7420. #endif /* MNG_NO_16BIT_SUPPORT */
  7421. #endif /* MNG_SKIPCANVAS_BGR565_A8 */
  7422. /* ************************************************************************** */
  7423. #ifndef MNG_SKIPCANVAS_RGB555
  7424. #ifndef MNG_NO_16BIT_SUPPORT
  7425. #ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  7426. mng_retcode mng_display_rgb555 (mng_datap pData)
  7427. {
  7428. mng_uint8p pScanline;
  7429. mng_uint8p pDataline;
  7430. mng_int32 iX;
  7431. mng_uint16 iA16;
  7432. mng_uint16 iFGr16, iFGg16, iFGb16;
  7433. mng_uint16 iBGr16, iBGg16, iBGb16;
  7434. mng_uint8 iA8;
  7435. #ifdef MNG_SUPPORT_TRACE
  7436. MNG_TRACE (pData, MNG_FN_DISPLAY_RGB555, MNG_LC_START);
  7437. #endif
  7438. /* viewable row ? */
  7439. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  7440. { /* address destination row */
  7441. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  7442. pData->iRow + pData->iDestt -
  7443. pData->iSourcet);
  7444. /* adjust destination row starting-point */
  7445. pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2);
  7446. pDataline = pData->pRGBArow; /* address source row */
  7447. if (pData->bIsRGBA16) /* adjust source row starting-point */
  7448. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3);
  7449. else
  7450. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  7451. if (pData->bIsOpaque) /* forget about transparency ? */
  7452. {
  7453. if (pData->bIsRGBA16) /* 16-bit input row ? */
  7454. {
  7455. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  7456. iX += pData->iColinc)
  7457. { /* scale down by dropping the LSB */
  7458. *(pScanline+1) = (mng_uint8)( ((*(pDataline+4) & 0xF8) >> 1 ) | (*(pDataline+2) >> 6 ) );
  7459. *pScanline = (mng_uint8)( ( *(pDataline ) >> 3 ) | ((*(pDataline+2) & 0xF8) << 2 ) );
  7460. pScanline += (pData->iColinc * 2);
  7461. pDataline += 8;
  7462. }
  7463. }
  7464. else
  7465. {
  7466. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  7467. iX += pData->iColinc)
  7468. { /* copy the values */
  7469. *(pScanline+1) = (mng_uint8)( ((*(pDataline+2) & 0xF8) >> 1 ) | (*(pDataline+1) >> 6 ) );
  7470. *pScanline = (mng_uint8)( ( *(pDataline ) >> 3 ) | ((*(pDataline+1) & 0xF8) << 2 ) );
  7471. pScanline += (pData->iColinc * 2);
  7472. pDataline += 4;
  7473. }
  7474. }
  7475. }
  7476. else
  7477. {
  7478. if (pData->bIsRGBA16) /* 16-bit input row ? */
  7479. {
  7480. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  7481. iX += pData->iColinc)
  7482. {
  7483. iA16 = mng_get_uint16 (pDataline+6);
  7484. if (iA16) /* any opacity at all ? */
  7485. {
  7486. if (iA16 == 0xFFFF) /* fully opaque ? */
  7487. { /* scale down by dropping the LSB */
  7488. *(pScanline+1) = (mng_uint8)( ((*(pDataline+4) & 0xF8) >> 1 ) | (*(pDataline+2) >> 6 ) );
  7489. *pScanline = (mng_uint8)( ( *(pDataline ) >> 3 ) | ((*(pDataline+2) & 0xF8) << 2 ) );
  7490. }
  7491. else
  7492. { /* get the proper values */
  7493. iFGr16 = mng_get_uint16 (pDataline );
  7494. iFGg16 = mng_get_uint16 (pDataline+2);
  7495. iFGb16 = mng_get_uint16 (pDataline+4);
  7496. /* scale background up */
  7497. iBGr16 = (mng_uint8)( (*(pScanline+1) & 0xF8) << 1 );
  7498. iBGg16 = (mng_uint8)( (*(pScanline+1) << 6 ) | ( ((*pScanline) & 0xE0) >> 2 ) );
  7499. iBGb16 = (mng_uint8)( *(pScanline ) << 3 );
  7500. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  7501. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  7502. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  7503. /* now compose */
  7504. MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16);
  7505. MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16);
  7506. MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16);
  7507. /* and return the composed values */
  7508. *(pScanline+1) = (mng_uint8)( (mng_uint8)(((iFGb16 >> 8) & 0xF8) >> 1 ) | ( (mng_uint8)(iFGg16 >> 8) >> 6 ) );
  7509. *pScanline = (mng_uint8)( (mng_uint8) ((iFGr16 >>11) >> 3 ) | ( ( (mng_uint8)(iFGg16 >> 8) & 0xF8) << 2 ) );
  7510. }
  7511. }
  7512. pScanline += (pData->iColinc * 2);
  7513. pDataline += 8;
  7514. }
  7515. }
  7516. else
  7517. {
  7518. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  7519. iX += pData->iColinc)
  7520. {
  7521. iA8 = *(pDataline+3); /* get alpha value */
  7522. if (iA8) /* any opacity at all ? */
  7523. {
  7524. if (iA8 == 0xFF) /* fully opaque ? */
  7525. { /* then simply copy the values */
  7526. *(pScanline+1) = (mng_uint8)( ((*(pDataline+2) & 0xF8) >> 1 ) | (*(pDataline+1) >> 6 ) );
  7527. *pScanline = (mng_uint8)( ( *(pDataline ) >> 3 ) | ((*(pDataline+1) & 0xF8) << 2 ) );
  7528. }
  7529. else
  7530. { /* do alpha composing */
  7531. mng_uint8 iRed, iGreen, iBlue;
  7532. iRed = (mng_uint8)( (*(pScanline+1) & 0xF8) << 1 );
  7533. iGreen = (mng_uint8)( (*(pScanline+1) << 6 ) | ( ((*pScanline) & 0xE0) >> 2 ) );
  7534. iBlue = (mng_uint8)( *(pScanline ) << 3 );
  7535. MNG_COMPOSE8 (iRed, *(pDataline+2), iA8, iRed );
  7536. MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen );
  7537. MNG_COMPOSE8 (iBlue, *(pDataline+0), iA8, iBlue );
  7538. *(pScanline+1) = (mng_uint8)( ( (iRed & 0xF8) >> 1 ) | ( iGreen >> 6 ) );
  7539. *pScanline = (mng_uint8)( (iBlue >> 3 ) | ( (iGreen & 0xF8) << 2 ) );
  7540. }
  7541. }
  7542. pScanline += (pData->iColinc * 2);
  7543. pDataline += 4;
  7544. }
  7545. }
  7546. }
  7547. }
  7548. check_update_region (pData);
  7549. #ifdef MNG_SUPPORT_TRACE
  7550. MNG_TRACE (pData, MNG_FN_DISPLAY_RGB555, MNG_LC_END);
  7551. #endif
  7552. return MNG_NOERROR;
  7553. }
  7554. #else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  7555. mng_retcode mng_display_rgb555 (mng_datap pData)
  7556. {
  7557. mng_uint8p pScanline;
  7558. mng_uint8p pDataline;
  7559. mng_int32 iX;
  7560. mng_uint16 iA16;
  7561. mng_uint16 iFGr16, iFGg16, iFGb16;
  7562. mng_uint16 iBGr16, iBGg16, iBGb16;
  7563. mng_uint8 iA8;
  7564. mng_uint8 iBps;
  7565. #ifdef MNG_SUPPORT_TRACE
  7566. MNG_TRACE (pData, MNG_FN_DISPLAY_RGB555, MNG_LC_START);
  7567. #endif
  7568. iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1);
  7569. /* viewable row ? */
  7570. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  7571. { /* address destination row */
  7572. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  7573. pData->iRow + pData->iDestt -
  7574. pData->iSourcet);
  7575. /* adjust destination row starting-point */
  7576. pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2);
  7577. pDataline = pData->pRGBArow; /* address source row */
  7578. /* adjust source row starting-point */
  7579. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1));
  7580. if (pData->bIsOpaque) /* forget about transparency ? */
  7581. {
  7582. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  7583. iX += pData->iColinc)
  7584. { /* scale down by dropping the LSB */
  7585. *(pScanline+1) = (mng_uint8)( ((*(pDataline+2*iBps) & 0xF8) >> 1 ) | (*(pDataline+iBps) >> 6 ) );
  7586. *pScanline = (mng_uint8)( ( *(pDataline ) >> 3 ) | ((*(pDataline+iBps) & 0xF8) << 2 ) );
  7587. pScanline += (pData->iColinc * 2);
  7588. pDataline += 4*iBps;
  7589. }
  7590. }
  7591. else
  7592. {
  7593. if (pData->bIsRGBA16) /* 16-bit input row ? */
  7594. {
  7595. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  7596. iX += pData->iColinc)
  7597. {
  7598. iA16 = mng_get_uint16 (pDataline+6);
  7599. if (iA16) /* any opacity at all ? */
  7600. {
  7601. if (iA16 == 0xFFFF) /* fully opaque ? */
  7602. { /* scale down by dropping the LSB */
  7603. *(pScanline+1) = (mng_uint8)( ((*(pDataline+4) & 0xF8) >> 1 ) | (*(pDataline+2) >> 6 ) );
  7604. *pScanline = (mng_uint8)( ( *(pDataline ) >> 3 ) | ((*(pDataline+2) & 0xF8) << 2 ) );
  7605. }
  7606. else
  7607. { /* get the proper values */
  7608. iFGr16 = mng_get_uint16 (pDataline );
  7609. iFGg16 = mng_get_uint16 (pDataline+2);
  7610. iFGb16 = mng_get_uint16 (pDataline+4);
  7611. /* scale background up */
  7612. iBGr16 = (mng_uint8)( (*(pScanline+1) & 0xF8) << 1 );
  7613. iBGg16 = (mng_uint8)( (*(pScanline+1) << 6 ) | ( ((*pScanline) & 0xE0) >> 2 ) );
  7614. iBGb16 = (mng_uint8)( *(pScanline ) << 3 );
  7615. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  7616. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  7617. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  7618. /* now compose */
  7619. MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16);
  7620. MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16);
  7621. MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16);
  7622. /* and return the composed values */
  7623. *(pScanline+1) = (mng_uint8)( (mng_uint8)(((iFGb16 >> 8) & 0xF8) >> 1 ) | ( (mng_uint8)(iFGg16 >> 8) >> 6 ) );
  7624. *pScanline = (mng_uint8)( (mng_uint8) ((iFGr16 >>11) >> 3 ) | ( ( (mng_uint8)(iFGg16 >> 8) & 0xF8) << 2 ) );
  7625. }
  7626. }
  7627. pScanline += (pData->iColinc * 2);
  7628. pDataline += 8;
  7629. }
  7630. }
  7631. else
  7632. {
  7633. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  7634. iX += pData->iColinc)
  7635. {
  7636. iA8 = *(pDataline+3); /* get alpha value */
  7637. if (iA8) /* any opacity at all ? */
  7638. {
  7639. if (iA8 == 0xFF) /* fully opaque ? */
  7640. { /* then simply copy the values */
  7641. *(pScanline+1) = (mng_uint8)( ((*(pDataline+2) & 0xF8) >> 1 ) | (*(pDataline+1) >> 6 ) );
  7642. *pScanline = (mng_uint8)( ( *(pDataline ) >> 3 ) | ((*(pDataline+1) & 0xF8) << 2 ) );
  7643. }
  7644. else
  7645. { /* do alpha composing */
  7646. mng_uint8 iRed, iGreen, iBlue;
  7647. iRed = (mng_uint8)( (*(pScanline+1) & 0xF8) << 1 );
  7648. iGreen = (mng_uint8)( (*(pScanline+1) << 6 ) | ( ((*pScanline) & 0xE0) >> 2 ) );
  7649. iBlue = (mng_uint8)( *(pScanline ) << 3 );
  7650. MNG_COMPOSE8 (iRed, *(pDataline+2), iA8, iRed );
  7651. MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen );
  7652. MNG_COMPOSE8 (iBlue, *(pDataline+0), iA8, iBlue );
  7653. *(pScanline+1) = (mng_uint8)( ( (iRed & 0xF8) >> 1 ) | ( iGreen >> 6 ) );
  7654. *pScanline = (mng_uint8)( (iBlue >> 3 ) | ( (iGreen & 0xF8) << 2 ) );
  7655. }
  7656. }
  7657. pScanline += (pData->iColinc * 2);
  7658. pDataline += 4;
  7659. }
  7660. }
  7661. }
  7662. }
  7663. check_update_region (pData);
  7664. #ifdef MNG_SUPPORT_TRACE
  7665. MNG_TRACE (pData, MNG_FN_DISPLAY_RGB555, MNG_LC_END);
  7666. #endif
  7667. return MNG_NOERROR;
  7668. }
  7669. #endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  7670. #else /* MNG_NO_16BIT_SUPPORT */
  7671. mng_retcode mng_display_rgb555 (mng_datap pData)
  7672. {
  7673. mng_uint8p pScanline;
  7674. mng_uint8p pDataline;
  7675. mng_int32 iX;
  7676. mng_uint8 iA8;
  7677. #ifdef MNG_SUPPORT_TRACE
  7678. MNG_TRACE (pData, MNG_FN_DISPLAY_RGB555, MNG_LC_START);
  7679. #endif
  7680. /* viewable row ? */
  7681. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  7682. { /* address destination row */
  7683. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  7684. pData->iRow + pData->iDestt -
  7685. pData->iSourcet);
  7686. /* adjust destination row starting-point */
  7687. pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2);
  7688. pDataline = pData->pRGBArow; /* address source row */
  7689. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  7690. if (pData->bIsOpaque) /* forget about transparency ? */
  7691. {
  7692. {
  7693. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  7694. iX += pData->iColinc)
  7695. { /* copy the values */
  7696. *(pScanline+1) = (mng_uint8)( ((*(pDataline+2) & 0xF8) >> 1 ) | (*(pDataline+1) >> 6 ) );
  7697. *pScanline = (mng_uint8)( ( *(pDataline ) >> 3 ) | ((*(pDataline+1) & 0xF8) << 2 ) );
  7698. pScanline += (pData->iColinc * 2);
  7699. pDataline += 4;
  7700. }
  7701. }
  7702. }
  7703. else
  7704. {
  7705. {
  7706. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  7707. iX += pData->iColinc)
  7708. {
  7709. iA8 = *(pDataline+3); /* get alpha value */
  7710. if (iA8) /* any opacity at all ? */
  7711. {
  7712. if (iA8 == 0xFF) /* fully opaque ? */
  7713. { /* then simply copy the values */
  7714. *(pScanline+1) = (mng_uint8)( ((*(pDataline+2) & 0xF8) >> 1 ) | (*(pDataline+1) >> 6 ) );
  7715. *pScanline = (mng_uint8)( ( *(pDataline ) >> 3 ) | ((*(pDataline+1) & 0xF8) << 2 ) );
  7716. }
  7717. else
  7718. { /* do alpha composing */
  7719. mng_uint8 iRed, iGreen, iBlue;
  7720. iRed = (mng_uint8)( (*(pScanline+1) & 0xF8) << 1 );
  7721. iGreen = (mng_uint8)( (*(pScanline+1) << 6 ) | ( ((*pScanline) & 0xE0) >> 2 ) );
  7722. iBlue = (mng_uint8)( *(pScanline ) << 3 );
  7723. MNG_COMPOSE8 (iRed, *(pDataline+2), iA8, iRed );
  7724. MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen );
  7725. MNG_COMPOSE8 (iBlue, *(pDataline+0), iA8, iBlue );
  7726. *(pScanline+1) = (mng_uint8)( ( (iRed & 0xF8) >> 1 ) | ( iGreen >> 6 ) );
  7727. *pScanline = (mng_uint8)( (iBlue >> 3 ) | ( (iGreen & 0xF8) << 2 ) );
  7728. }
  7729. }
  7730. pScanline += (pData->iColinc * 2);
  7731. pDataline += 4;
  7732. }
  7733. }
  7734. }
  7735. }
  7736. check_update_region (pData);
  7737. #ifdef MNG_SUPPORT_TRACE
  7738. MNG_TRACE (pData, MNG_FN_DISPLAY_RGB555, MNG_LC_END);
  7739. #endif
  7740. return MNG_NOERROR;
  7741. }
  7742. #endif /* MNG_NO_16BIT_SUPPORT */
  7743. #endif /* MNG_SKIPCANVAS_RGB555 */
  7744. /* ************************************************************************** */
  7745. #ifndef MNG_SKIPCANVAS_BGR555
  7746. #ifndef MNG_NO_16BIT_SUPPORT
  7747. #ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  7748. mng_retcode mng_display_bgr555 (mng_datap pData)
  7749. {
  7750. mng_uint8p pScanline;
  7751. mng_uint8p pDataline;
  7752. mng_int32 iX;
  7753. mng_uint16 iA16;
  7754. mng_uint16 iFGr16, iFGg16, iFGb16;
  7755. mng_uint16 iBGr16, iBGg16, iBGb16;
  7756. mng_uint8 iA8;
  7757. #ifdef MNG_SUPPORT_TRACE
  7758. MNG_TRACE (pData, MNG_FN_DISPLAY_BGR555, MNG_LC_START);
  7759. #endif
  7760. /* viewable row ? */
  7761. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  7762. { /* address destination row */
  7763. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  7764. pData->iRow + pData->iDestt -
  7765. pData->iSourcet);
  7766. /* adjust destination row starting-point */
  7767. pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2);
  7768. pDataline = pData->pRGBArow; /* address source row */
  7769. if (pData->bIsRGBA16) /* adjust source row starting-point */
  7770. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3);
  7771. else
  7772. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  7773. if (pData->bIsOpaque) /* forget about transparency ? */
  7774. {
  7775. if (pData->bIsRGBA16) /* 16-bit input row ? */
  7776. {
  7777. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  7778. iX += pData->iColinc)
  7779. { /* scale down by dropping the LSB */
  7780. *(pScanline+1) = (mng_uint8)( ((*(pDataline ) & 0xF8) >> 1 ) | (*(pDataline+2) >> 6 ) );
  7781. *pScanline = (mng_uint8)( ( *(pDataline+4) >> 3 ) | ((*(pDataline+2) & 0xF8) << 2 ) );
  7782. pScanline += (pData->iColinc * 2);
  7783. pDataline += 8;
  7784. }
  7785. }
  7786. else
  7787. {
  7788. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  7789. iX += pData->iColinc)
  7790. { /* copy the values */
  7791. *(pScanline+1) = (mng_uint8)( ((*(pDataline ) & 0xF8) >> 1 ) | (*(pDataline+1) >> 6 ) );
  7792. *pScanline = (mng_uint8)( ( *(pDataline+2) >> 3 ) | ((*(pDataline+1) & 0xF8) << 2 ) );
  7793. pScanline += (pData->iColinc * 2);
  7794. pDataline += 4;
  7795. }
  7796. }
  7797. }
  7798. else
  7799. {
  7800. if (pData->bIsRGBA16) /* 16-bit input row ? */
  7801. {
  7802. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  7803. iX += pData->iColinc)
  7804. {
  7805. iA16 = mng_get_uint16 (pDataline+6);
  7806. if (iA16) /* any opacity at all ? */
  7807. {
  7808. if (iA16 == 0xFFFF) /* fully opaque ? */
  7809. { /* scale down by dropping the LSB */
  7810. *(pScanline+1) = (mng_uint8)( ((*(pDataline ) & 0xF8) >> 1 ) | (*(pDataline+2) >> 6 ) );
  7811. *pScanline = (mng_uint8)( ( *(pDataline+4) >> 3 ) | ((*(pDataline+2) & 0xF8) << 2 ) );
  7812. }
  7813. else
  7814. { /* get the proper values */
  7815. iFGr16 = mng_get_uint16 (pDataline );
  7816. iFGg16 = mng_get_uint16 (pDataline+2);
  7817. iFGb16 = mng_get_uint16 (pDataline+4);
  7818. /* scale background up */
  7819. iBGb16 = (mng_uint8)( (*(pScanline+1) & 0xF8) << 1 );
  7820. iBGg16 = (mng_uint8)( (*(pScanline+1) << 6 ) | ( ((*pScanline) & 0xE0) >> 2 ) );
  7821. iBGr16 = (mng_uint8)( *(pScanline ) << 3 );
  7822. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  7823. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  7824. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  7825. /* now compose */
  7826. MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16);
  7827. MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16);
  7828. MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16);
  7829. /* and return the composed values */
  7830. *(pScanline+1) = (mng_uint8)( (mng_uint8)(((iFGr16 >> 8) & 0xF8) >> 1 ) | ( (mng_uint8)(iFGg16 >> 8) >> 6 ) );
  7831. *pScanline = (mng_uint8)( (mng_uint8) ((iFGb16 >>11) >> 3 ) | ( ( (mng_uint8)(iFGg16 >> 8) & 0xF8) << 2 ) );
  7832. }
  7833. }
  7834. pScanline += (pData->iColinc * 2);
  7835. pDataline += 8;
  7836. }
  7837. }
  7838. else
  7839. {
  7840. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  7841. iX += pData->iColinc)
  7842. {
  7843. iA8 = *(pDataline+3); /* get alpha value */
  7844. if (iA8) /* any opacity at all ? */
  7845. {
  7846. if (iA8 == 0xFF) /* fully opaque ? */
  7847. { /* then simply copy the values */
  7848. *(pScanline+1) = (mng_uint8)( ((*(pDataline ) & 0xF8) >> 1 ) | (*(pDataline+1) >> 6 ) );
  7849. *pScanline = (mng_uint8)( ( *(pDataline+2) >> 3 ) | ((*(pDataline+1) & 0xF8) << 2 ) );
  7850. }
  7851. else
  7852. { /* do alpha composing */
  7853. mng_uint8 iRed, iGreen, iBlue;
  7854. iRed = (mng_uint8)( (*(pScanline+1) & 0xF8) << 1 );
  7855. iGreen = (mng_uint8)( (*(pScanline+1) << 6 ) | ( ((*pScanline) & 0xE0) >> 2 ) );
  7856. iBlue = (mng_uint8)( *(pScanline ) << 3 );
  7857. MNG_COMPOSE8 (iRed, *(pDataline+0), iA8, iRed );
  7858. MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen );
  7859. MNG_COMPOSE8 (iBlue, *(pDataline+2), iA8, iBlue );
  7860. *(pScanline+1) = (mng_uint8)( ( (iRed & 0xF8) >> 1 ) | ( iGreen >> 6 ) );
  7861. *pScanline = (mng_uint8)( (iBlue >> 3 ) | ( (iGreen & 0xF8) << 2 ) );
  7862. }
  7863. }
  7864. pScanline += (pData->iColinc * 2);
  7865. pDataline += 4;
  7866. }
  7867. }
  7868. }
  7869. }
  7870. check_update_region (pData);
  7871. #ifdef MNG_SUPPORT_TRACE
  7872. MNG_TRACE (pData, MNG_FN_DISPLAY_BGR555, MNG_LC_END);
  7873. #endif
  7874. return MNG_NOERROR;
  7875. }
  7876. #else /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  7877. mng_retcode mng_display_bgr555 (mng_datap pData)
  7878. {
  7879. mng_uint8p pScanline;
  7880. mng_uint8p pDataline;
  7881. mng_int32 iX;
  7882. mng_uint16 iA16;
  7883. mng_uint16 iFGr16, iFGg16, iFGb16;
  7884. mng_uint16 iBGr16, iBGg16, iBGb16;
  7885. mng_uint8 iA8;
  7886. mng_uint8 iBps;
  7887. #ifdef MNG_SUPPORT_TRACE
  7888. MNG_TRACE (pData, MNG_FN_DISPLAY_BGR555, MNG_LC_START);
  7889. #endif
  7890. iBps=(mng_uint8)(pData->bIsRGBA16 ? 2:1);
  7891. /* viewable row ? */
  7892. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  7893. { /* address destination row */
  7894. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  7895. pData->iRow + pData->iDestt -
  7896. pData->iSourcet);
  7897. /* adjust destination row starting-point */
  7898. pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2);
  7899. pDataline = pData->pRGBArow; /* address source row */
  7900. /* adjust source row starting-point */
  7901. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << (iBps+1));
  7902. if (pData->bIsOpaque) /* forget about transparency ? */
  7903. {
  7904. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  7905. iX += pData->iColinc)
  7906. { /* scale down by dropping the LSB */
  7907. *(pScanline+1) = (mng_uint8)( ((*(pDataline ) & 0xF8) >> 1 ) | (*(pDataline+iBps) >> 6 ) );
  7908. *pScanline = (mng_uint8)( ( *(pDataline+2*iBps) >> 3 ) | ((*(pDataline+iBps) & 0xF8) << 2 ) );
  7909. pScanline += (pData->iColinc * 2);
  7910. pDataline += 4*iBps;
  7911. }
  7912. }
  7913. else
  7914. {
  7915. if (pData->bIsRGBA16) /* 16-bit input row ? */
  7916. {
  7917. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  7918. iX += pData->iColinc)
  7919. {
  7920. iA16 = mng_get_uint16 (pDataline+6);
  7921. if (iA16) /* any opacity at all ? */
  7922. {
  7923. if (iA16 == 0xFFFF) /* fully opaque ? */
  7924. { /* scale down by dropping the LSB */
  7925. *(pScanline+1) = (mng_uint8)( ((*(pDataline ) & 0xF8) >> 1 ) | (*(pDataline+2) >> 6 ) );
  7926. *pScanline = (mng_uint8)( ( *(pDataline+4) >> 3 ) | ((*(pDataline+2) & 0xF8) << 2 ) );
  7927. }
  7928. else
  7929. { /* get the proper values */
  7930. iFGr16 = mng_get_uint16 (pDataline );
  7931. iFGg16 = mng_get_uint16 (pDataline+2);
  7932. iFGb16 = mng_get_uint16 (pDataline+4);
  7933. /* scale background up */
  7934. iBGb16 = (mng_uint8)( (*(pScanline+1) & 0xF8) << 1 );
  7935. iBGg16 = (mng_uint8)( (*(pScanline+1) << 6 ) | ( ((*pScanline) & 0xE0) >> 2 ) );
  7936. iBGr16 = (mng_uint8)( *(pScanline ) << 3 );
  7937. iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16;
  7938. iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16;
  7939. iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16;
  7940. /* now compose */
  7941. MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16);
  7942. MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16);
  7943. MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16);
  7944. /* and return the composed values */
  7945. *(pScanline+1) = (mng_uint8)( (mng_uint8)(((iFGr16 >> 8) & 0xF8) >> 1 ) | ( (mng_uint8)(iFGg16 >> 8) >> 6 ) );
  7946. *pScanline = (mng_uint8)( (mng_uint8) ((iFGb16 >>11) >> 3 ) | ( ( (mng_uint8)(iFGg16 >> 8) & 0xF8) << 2 ) );
  7947. }
  7948. }
  7949. pScanline += (pData->iColinc * 2);
  7950. pDataline += 8;
  7951. }
  7952. }
  7953. else
  7954. {
  7955. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  7956. iX += pData->iColinc)
  7957. {
  7958. iA8 = *(pDataline+3); /* get alpha value */
  7959. if (iA8) /* any opacity at all ? */
  7960. {
  7961. if (iA8 == 0xFF) /* fully opaque ? */
  7962. { /* then simply copy the values */
  7963. *(pScanline+1) = (mng_uint8)( ((*(pDataline ) & 0xF8) >> 1 ) | (*(pDataline+1) >> 6 ) );
  7964. *pScanline = (mng_uint8)( ( *(pDataline+2) >> 3 ) | ((*(pDataline+1) & 0xF8) << 2 ) );
  7965. }
  7966. else
  7967. { /* do alpha composing */
  7968. mng_uint8 iRed, iGreen, iBlue;
  7969. iRed = (mng_uint8)( (*(pScanline+1) & 0xF8) << 1 );
  7970. iGreen = (mng_uint8)( (*(pScanline+1) << 6 ) | ( ((*pScanline) & 0xE0) >> 2 ) );
  7971. iBlue = (mng_uint8)( *(pScanline ) << 3 );
  7972. MNG_COMPOSE8 (iRed, *(pDataline+0), iA8, iRed );
  7973. MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen );
  7974. MNG_COMPOSE8 (iBlue, *(pDataline+2), iA8, iBlue );
  7975. *(pScanline+1) = (mng_uint8)( ( (iRed & 0xF8) >> 1 ) | ( iGreen >> 6 ) );
  7976. *pScanline = (mng_uint8)( (iBlue >> 3 ) | ( (iGreen & 0xF8) << 2 ) );
  7977. }
  7978. }
  7979. pScanline += (pData->iColinc * 2);
  7980. pDataline += 4;
  7981. }
  7982. }
  7983. }
  7984. }
  7985. check_update_region (pData);
  7986. #ifdef MNG_SUPPORT_TRACE
  7987. MNG_TRACE (pData, MNG_FN_DISPLAY_BGR555, MNG_LC_END);
  7988. #endif
  7989. return MNG_NOERROR;
  7990. }
  7991. #endif /* MNG_OPTIMIZE_FOOTPRINT_COMPOSE */
  7992. #else /* MNG_NO_16BIT_SUPPORT */
  7993. mng_retcode mng_display_bgr555 (mng_datap pData)
  7994. {
  7995. mng_uint8p pScanline;
  7996. mng_uint8p pDataline;
  7997. mng_int32 iX;
  7998. mng_uint8 iA8;
  7999. #ifdef MNG_SUPPORT_TRACE
  8000. MNG_TRACE (pData, MNG_FN_DISPLAY_BGR555, MNG_LC_START);
  8001. #endif
  8002. /* viewable row ? */
  8003. if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
  8004. { /* address destination row */
  8005. pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
  8006. pData->iRow + pData->iDestt -
  8007. pData->iSourcet);
  8008. /* adjust destination row starting-point */
  8009. pScanline = pScanline + (pData->iCol * 2) + (pData->iDestl * 2);
  8010. pDataline = pData->pRGBArow; /* address source row */
  8011. pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
  8012. if (pData->bIsOpaque) /* forget about transparency ? */
  8013. {
  8014. {
  8015. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  8016. iX += pData->iColinc)
  8017. { /* copy the values */
  8018. *(pScanline+1) = (mng_uint8)( ((*(pDataline ) & 0xF8) >> 1 ) | (*(pDataline+1) >> 6 ) );
  8019. *pScanline = (mng_uint8)( ( *(pDataline+2) >> 3 ) | ((*(pDataline+1) & 0xF8) << 2 ) );
  8020. pScanline += (pData->iColinc * 2);
  8021. pDataline += 4;
  8022. }
  8023. }
  8024. }
  8025. else
  8026. {
  8027. {
  8028. for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer;
  8029. iX += pData->iColinc)
  8030. {
  8031. iA8 = *(pDataline+3); /* get alpha value */
  8032. if (iA8) /* any opacity at all ? */
  8033. {
  8034. if (iA8 == 0xFF) /* fully opaque ? */
  8035. { /* then simply copy the values */
  8036. *(pScanline+1) = (mng_uint8)( ((*(pDataline ) & 0xF8) >> 1 ) | (*(pDataline+1) >> 6 ) );
  8037. *pScanline = (mng_uint8)( ( *(pDataline+2) >> 3 ) | ((*(pDataline+1) & 0xF8) << 2 ) );
  8038. }
  8039. else
  8040. { /* do alpha composing */
  8041. mng_uint8 iRed, iGreen, iBlue;
  8042. iRed = (mng_uint8)( (*(pScanline+1) & 0xF8) << 1 );
  8043. iGreen = (mng_uint8)( (*(pScanline+1) << 6 ) | ( ((*pScanline) & 0xE0) >> 2 ) );
  8044. iBlue = (mng_uint8)( *(pScanline ) << 3 );
  8045. MNG_COMPOSE8 (iRed, *(pDataline+0), iA8, iRed );
  8046. MNG_COMPOSE8 (iGreen, *(pDataline+1), iA8, iGreen );
  8047. MNG_COMPOSE8 (iBlue, *(pDataline+2), iA8, iBlue );
  8048. *(pScanline+1) = (mng_uint8)( ( (iRed & 0xF8) >> 1 ) | ( iGreen >> 6 ) );
  8049. *pScanline = (mng_uint8)( (iBlue >> 3 ) | ( (iGreen & 0xF8) << 2 ) );
  8050. }
  8051. }
  8052. pScanline += (pData->iColinc * 2);
  8053. pDataline += 4;
  8054. }
  8055. }
  8056. }
  8057. }
  8058. check_update_region (pData);
  8059. #ifdef MNG_SUPPORT_TRACE
  8060. MNG_TRACE (pData, MNG_FN_DISPLAY_BGR555, MNG_LC_END);
  8061. #endif
  8062. return MNG_NOERROR;
  8063. }
  8064. #endif /* MNG_NO_16BIT_SUPPORT */
  8065. #endif /* MNG_SKIPCANVAS_BGR555 */
  8066. #ifndef MNG_SKIPCHUNK_BACK
  8067. /* ************************************************************************** */
  8068. /* * * */
  8069. /* * Background restore routines - restore the background with info from * */
  8070. /* * the BACK and/or bKGD chunk or the app's background canvas * */
  8071. /* * * */
  8072. /* ************************************************************************** */
  8073. mng_retcode mng_restore_bkgd_backimage (mng_datap pData)
  8074. {
  8075. /* save some stuff */
  8076. mng_uint8p pRGBArow = pData->pRGBArow;
  8077. mng_int32 iRow = pData->iRow;
  8078. mng_int32 iRowsamples = pData->iRowsamples;
  8079. mng_retcode iRetcode; /* work variables */
  8080. mng_uint8p pTemp;
  8081. mng_uint8p pWork = pRGBArow;
  8082. mng_uint32 iX;
  8083. mng_int32 iZ;
  8084. #ifdef MNG_SUPPORT_TRACE
  8085. MNG_TRACE (pData, MNG_FN_RESTORE_BACKIMAGE, MNG_LC_START);
  8086. #endif
  8087. /* determine row to retrieve */
  8088. pData->iRow = pData->iDestt + iRow + pData->iBackimgoffsy;
  8089. while (pData->iRow >= (mng_int32)pData->iBackimgheight)
  8090. pData->iRow -= (mng_int32)pData->iBackimgheight;
  8091. /* set width to that of background image */
  8092. pData->iRowsamples = pData->iBackimgwidth;
  8093. /* retrieve into alternate buffer ! */
  8094. pData->pRGBArow = pData->pPrevrow;
  8095. /* get it then */
  8096. iRetcode = ((mng_retrieverow)pData->fRetrieverow) (pData);
  8097. if (iRetcode) /* on error; bail out */
  8098. return iRetcode;
  8099. /* we got the full row; but now need to
  8100. paste it into the proper location */
  8101. iX = pData->iDestl - pData->iBackimgoffsx;
  8102. while (iX >= pData->iBackimgwidth)
  8103. iX -= pData->iBackimgwidth;
  8104. #ifndef MNG_NO_16BIT_SUPPORT
  8105. if (pData->bIsRGBA16) /* 16-bit buffer ? */
  8106. {
  8107. pTemp = pData->pPrevrow + (iX << 3);
  8108. for (iZ = (pData->iDestr - pData->iDestl); iZ > 0; iZ--)
  8109. {
  8110. MNG_COPY (pWork, pTemp, 8);
  8111. pWork += 8;
  8112. pTemp += 8;
  8113. iX++;
  8114. /* reached end of bkgd-image line ? */
  8115. if (iX >= pData->iBackimgwidth)
  8116. {
  8117. iX = 0;
  8118. pTemp = pData->pPrevrow;
  8119. }
  8120. }
  8121. }
  8122. else
  8123. #endif
  8124. {
  8125. pTemp = pData->pPrevrow + (iX << 2);
  8126. for (iZ = (pData->iDestr - pData->iDestl); iZ > 0; iZ--)
  8127. {
  8128. MNG_COPY (pWork, pTemp, 4);
  8129. pWork += 4;
  8130. pTemp += 4;
  8131. iX++;
  8132. /* reached end of bkgd-image line ? */
  8133. if (iX >= pData->iBackimgwidth)
  8134. {
  8135. iX = 0;
  8136. pTemp = pData->pPrevrow;
  8137. }
  8138. }
  8139. }
  8140. pData->pRGBArow = pRGBArow; /* restore original values */
  8141. pData->iRow = iRow;
  8142. pData->iRowsamples = iRowsamples;
  8143. #ifdef MNG_SUPPORT_TRACE
  8144. MNG_TRACE (pData, MNG_FN_RESTORE_BACKIMAGE, MNG_LC_END);
  8145. #endif
  8146. return MNG_NOERROR;
  8147. }
  8148. #endif
  8149. /* ************************************************************************** */
  8150. mng_retcode mng_restore_bkgd_backcolor (mng_datap pData)
  8151. {
  8152. mng_int32 iX;
  8153. mng_uint32p pWork32 = (mng_uint32p)pData->pRGBArow;
  8154. mng_uint32 iWrite;
  8155. #ifdef MNG_SUPPORT_TRACE
  8156. MNG_TRACE (pData, MNG_FN_RESTORE_BACKCOLOR, MNG_LC_START);
  8157. #endif
  8158. #ifdef MNG_BIGENDIAN_SUPPORTED
  8159. /* fast way for big endian */
  8160. iWrite = (((mng_uint8)(pData->iBACKred >> 8)) << 24) |
  8161. (((mng_uint8)(pData->iBACKgreen >> 8)) << 16) |
  8162. (((mng_uint8)(pData->iBACKblue >> 8)) << 8) |
  8163. ( 0xFF );
  8164. #elif defined(MNG_LITTLEENDIAN_SUPPORTED)
  8165. /* fast way for little endian */
  8166. iWrite = ( 0xFF << 24) |
  8167. (((mng_uint8)(pData->iBACKblue >> 8)) << 16) |
  8168. (((mng_uint8)(pData->iBACKgreen >> 8)) << 8) |
  8169. (((mng_uint8)(pData->iBACKred >> 8)) );
  8170. #else
  8171. /* generic way, works on all platforms */
  8172. /* put the data in memory in the correct order */
  8173. {
  8174. mng_uint8 aBytes[4];
  8175. aBytes[0] = (mng_uint8)(pData->iBACKred >> 8);
  8176. aBytes[1] = (mng_uint8)(pData->iBACKgreen >> 8);
  8177. aBytes[2] = (mng_uint8)(pData->iBACKblue >> 8);
  8178. aBytes[3] = 0xFF;
  8179. /* load that data into a register */
  8180. iWrite = *(mng_uint32*) aBytes;
  8181. }
  8182. #endif
  8183. /* ok; drop the background-color in there */
  8184. for (iX = (pData->iSourcer - pData->iSourcel); iX > 0; iX--)
  8185. *pWork32++ = iWrite;
  8186. #ifdef MNG_SUPPORT_TRACE
  8187. MNG_TRACE (pData, MNG_FN_RESTORE_BACKCOLOR, MNG_LC_END);
  8188. #endif
  8189. return MNG_NOERROR;
  8190. }
  8191. /* ************************************************************************** */
  8192. #ifndef MNG_SKIPCHUNK_bKGD
  8193. mng_retcode mng_restore_bkgd_bkgd (mng_datap pData)
  8194. {
  8195. mng_int32 iX;
  8196. mng_uint8p pWork = pData->pRGBArow;
  8197. mng_imagep pImage = (mng_imagep)pData->pCurrentobj;
  8198. mng_imagedatap pBuf = pImage->pImgbuf;
  8199. mng_uint8 iRed = 0;
  8200. mng_uint8 iGreen = 0;
  8201. mng_uint8 iBlue = 0;
  8202. mng_uint32p pWork32 = (mng_uint32p)pWork;
  8203. mng_uint32 iWrite;
  8204. #ifdef MNG_SUPPORT_TRACE
  8205. MNG_TRACE (pData, MNG_FN_RESTORE_BKGD, MNG_LC_START);
  8206. #endif
  8207. switch (pBuf->iColortype)
  8208. {
  8209. case 0 : ; /* gray types */
  8210. case 4 : {
  8211. mng_uint8 iGray;
  8212. #ifndef MNG_NO_16BIT_SUPPORT
  8213. if (pBuf->iBitdepth > 8)
  8214. iGray = (mng_uint8)(pBuf->iBKGDgray >> 8);
  8215. else
  8216. #endif
  8217. {
  8218. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  8219. /* LBR scaling */
  8220. mng_uint8 multiplier[]={0,255,85,0,17,0,0,0,1};
  8221. iGray = (mng_uint8)(multiplier[pBuf->iBitdepth] * pBuf->iBKGDgray);
  8222. #else
  8223. iGray = (mng_uint8)pBuf->iBKGDgray;
  8224. #endif
  8225. }
  8226. iRed = iGray;
  8227. iGreen = iGray;
  8228. iBlue = iGray;
  8229. break;
  8230. }
  8231. case 3 : { /* indexed type */
  8232. iRed = pBuf->aPLTEentries [pBuf->iBKGDindex].iRed;
  8233. iGreen = pBuf->aPLTEentries [pBuf->iBKGDindex].iGreen;
  8234. iBlue = pBuf->aPLTEentries [pBuf->iBKGDindex].iBlue;
  8235. break;
  8236. }
  8237. case 2 : ; /* rgb types */
  8238. case 6 : {
  8239. #ifndef MNG_NO_16BIT_SUPPORT
  8240. if (pBuf->iBitdepth > 8)
  8241. {
  8242. iRed = (mng_uint8)(pBuf->iBKGDred >> 8);
  8243. iGreen = (mng_uint8)(pBuf->iBKGDgreen >> 8);
  8244. iBlue = (mng_uint8)(pBuf->iBKGDblue >> 8);
  8245. }
  8246. else
  8247. #endif
  8248. {
  8249. iRed = (mng_uint8)(pBuf->iBKGDred );
  8250. iGreen = (mng_uint8)(pBuf->iBKGDgreen);
  8251. iBlue = (mng_uint8)(pBuf->iBKGDblue );
  8252. }
  8253. break;
  8254. }
  8255. }
  8256. #ifdef MNG_BIGENDIAN_SUPPORTED
  8257. /* fast way for big endian */
  8258. iWrite = (iRed << 24) |
  8259. (iGreen << 16) |
  8260. (iBlue << 8);
  8261. #elif defined(MNG_LITTLEENDIAN_SUPPORTED)
  8262. /* fast way for little endian */
  8263. iWrite = (iBlue << 16) |
  8264. (iGreen << 8) |
  8265. (iRed );
  8266. #else
  8267. /* generic way, works on all platforms */
  8268. /* put the data in memory in the correct order */
  8269. {
  8270. mng_uint8 aBytes[4];
  8271. aBytes[0] = (mng_uint8)(iRed);
  8272. aBytes[1] = (mng_uint8)(iGreen);
  8273. aBytes[2] = (mng_uint8)(iBlue);
  8274. aBytes[3] = 0x00;
  8275. /* load that data into a register */
  8276. iWrite = *(mng_uint32*) aBytes;
  8277. }
  8278. #endif
  8279. /* ok; drop it in there */
  8280. for (iX = (pData->iSourcer - pData->iSourcel); iX > 0; iX--)
  8281. *pWork32++ = iWrite;
  8282. #ifdef MNG_SUPPORT_TRACE
  8283. MNG_TRACE (pData, MNG_FN_RESTORE_BKGD, MNG_LC_END);
  8284. #endif
  8285. return MNG_NOERROR;
  8286. }
  8287. #endif
  8288. /* ************************************************************************** */
  8289. mng_retcode mng_restore_bkgd_bgcolor (mng_datap pData)
  8290. {
  8291. mng_int32 iX;
  8292. mng_uint32p pWork32 = (mng_uint32p)pData->pRGBArow;
  8293. mng_uint32 iWrite;
  8294. #ifdef MNG_SUPPORT_TRACE
  8295. MNG_TRACE (pData, MNG_FN_RESTORE_BGCOLOR, MNG_LC_START);
  8296. #endif
  8297. #ifdef MNG_BIGENDIAN_SUPPORTED
  8298. /* fast way for big endian */
  8299. iWrite = (((mng_uint8)(pData->iBGred >> 8)) << 24) |
  8300. (((mng_uint8)(pData->iBGgreen >> 8)) << 16) |
  8301. (((mng_uint8)(pData->iBGblue >> 8)) << 8);
  8302. #elif defined(MNG_LITTLEENDIAN_SUPPORTED)
  8303. /* fast way for little endian */
  8304. iWrite = (((mng_uint8)(pData->iBGblue >> 8)) << 16) |
  8305. (((mng_uint8)(pData->iBGgreen >> 8)) << 8) |
  8306. (((mng_uint8)(pData->iBGred >> 8)) );
  8307. #else
  8308. /* generic way, works on all platforms */
  8309. /* put the data in memory in the correct order */
  8310. {
  8311. mng_uint8 aBytes[4];
  8312. aBytes[0] = (mng_uint8)(pData->iBGred >> 8);
  8313. aBytes[1] = (mng_uint8)(pData->iBGgreen >> 8);
  8314. aBytes[2] = (mng_uint8)(pData->iBGblue >> 8);
  8315. aBytes[3] = 0x00;
  8316. /* load that data into a register */
  8317. iWrite = *(mng_uint32*) aBytes;
  8318. }
  8319. #endif
  8320. /* ok; drop the background-color in there */
  8321. for (iX = (pData->iSourcer - pData->iSourcel); iX > 0; iX--)
  8322. *pWork32++ = iWrite;
  8323. #ifdef MNG_SUPPORT_TRACE
  8324. MNG_TRACE (pData, MNG_FN_RESTORE_BGCOLOR, MNG_LC_END);
  8325. #endif
  8326. return MNG_NOERROR;
  8327. }
  8328. /* ************************************************************************** */
  8329. #ifndef MNG_SKIPCANVAS_RGB8
  8330. mng_retcode mng_restore_bkgd_rgb8 (mng_datap pData)
  8331. {
  8332. mng_int32 iX;
  8333. mng_uint8p pBkgd;
  8334. mng_uint8p pWork = pData->pRGBArow;
  8335. #ifdef MNG_SUPPORT_TRACE
  8336. MNG_TRACE (pData, MNG_FN_RESTORE_RGB8, MNG_LC_START);
  8337. #endif
  8338. if (pData->fGetbkgdline) /* can we access the background ? */
  8339. { /* point to the right pixel then */
  8340. pBkgd = (mng_uint8p)pData->fGetbkgdline ((mng_handle)pData,
  8341. pData->iRow + pData->iDestt) +
  8342. (3 * pData->iDestl);
  8343. for (iX = (pData->iSourcer - pData->iSourcel); iX > 0; iX--)
  8344. {
  8345. *pWork = *pBkgd; /* ok; copy the pixel */
  8346. *(pWork+1) = *(pBkgd+1);
  8347. *(pWork+2) = *(pBkgd+2);
  8348. *(pWork+3) = 0x00; /* transparant for alpha-canvasses */
  8349. pWork += 4;
  8350. pBkgd += 3;
  8351. }
  8352. }
  8353. #ifdef MNG_SUPPORT_TRACE
  8354. MNG_TRACE (pData, MNG_FN_RESTORE_RGB8, MNG_LC_END);
  8355. #endif
  8356. return MNG_NOERROR;
  8357. }
  8358. #endif /* MNG_SKIPCANVAS_RGB8 */
  8359. /* ************************************************************************** */
  8360. #ifndef MNG_SKIPCANVAS_BGR8
  8361. mng_retcode mng_restore_bkgd_bgr8 (mng_datap pData)
  8362. {
  8363. mng_int32 iX;
  8364. mng_uint8p pBkgd;
  8365. mng_uint8p pWork = pData->pRGBArow;
  8366. #ifdef MNG_SUPPORT_TRACE
  8367. MNG_TRACE (pData, MNG_FN_RESTORE_BGR8, MNG_LC_START);
  8368. #endif
  8369. if (pData->fGetbkgdline) /* can we access the background ? */
  8370. { /* point to the right pixel then */
  8371. pBkgd = (mng_uint8p)pData->fGetbkgdline ((mng_handle)pData,
  8372. pData->iRow + pData->iDestt) +
  8373. (3 * pData->iDestl);
  8374. for (iX = (pData->iSourcer - pData->iSourcel); iX > 0; iX--)
  8375. {
  8376. *pWork = *(pBkgd+2); /* ok; copy the pixel */
  8377. *(pWork+1) = *(pBkgd+1);
  8378. *(pWork+2) = *pBkgd;
  8379. *(pWork+3) = 0x00; /* transparant for alpha-canvasses */
  8380. pWork += 4;
  8381. pBkgd += 3;
  8382. }
  8383. }
  8384. #ifdef MNG_SUPPORT_TRACE
  8385. MNG_TRACE (pData, MNG_FN_RESTORE_BGR8, MNG_LC_END);
  8386. #endif
  8387. return MNG_NOERROR;
  8388. }
  8389. #endif /* MNG_SKIPCANVAS_BGR8 */
  8390. /* ************************************************************************** */
  8391. #ifndef MNG_SKIPCANVAS_BGRX8
  8392. mng_retcode mng_restore_bkgd_bgrx8 (mng_datap pData)
  8393. {
  8394. mng_int32 iX;
  8395. mng_uint8p pBkgd;
  8396. mng_uint8p pWork = pData->pRGBArow;
  8397. #ifdef MNG_SUPPORT_TRACE
  8398. MNG_TRACE (pData, MNG_FN_RESTORE_BGRX8, MNG_LC_START);
  8399. #endif
  8400. if (pData->fGetbkgdline) /* can we access the background ? */
  8401. { /* point to the right pixel then */
  8402. pBkgd = (mng_uint8p)pData->fGetbkgdline ((mng_handle)pData,
  8403. pData->iRow + pData->iDestt) +
  8404. (3 * pData->iDestl);
  8405. for (iX = (pData->iSourcer - pData->iSourcel); iX > 0; iX--)
  8406. {
  8407. *pWork = *(pBkgd+2); /* ok; copy the pixel */
  8408. *(pWork+1) = *(pBkgd+1);
  8409. *(pWork+2) = *pBkgd;
  8410. *(pWork+3) = 0x00; /* transparant for alpha-canvasses */
  8411. pWork += 4;
  8412. pBkgd += 4;
  8413. }
  8414. }
  8415. #ifdef MNG_SUPPORT_TRACE
  8416. MNG_TRACE (pData, MNG_FN_RESTORE_BGRX8, MNG_LC_END);
  8417. #endif
  8418. return MNG_NOERROR;
  8419. }
  8420. #endif /* MNG_SKIPCANVAS_BGRX8 */
  8421. /* ************************************************************************** */
  8422. #ifndef MNG_SKIPCANVAS_BGR565
  8423. mng_retcode mng_restore_bkgd_bgr565 (mng_datap pData)
  8424. {
  8425. mng_int32 iX;
  8426. mng_uint8p pBkgd;
  8427. mng_uint8p pWork = pData->pRGBArow;
  8428. #ifdef MNG_SUPPORT_TRACE
  8429. MNG_TRACE (pData, MNG_FN_RESTORE_BGR565, MNG_LC_START);
  8430. #endif
  8431. if (pData->fGetbkgdline) /* can we access the background ? */
  8432. { /* point to the right pixel then */
  8433. pBkgd = (mng_uint8p)pData->fGetbkgdline ((mng_handle)pData,
  8434. pData->iRow + pData->iDestt) +
  8435. (3 * pData->iDestl);
  8436. for (iX = (pData->iSourcer - pData->iSourcel); iX > 0; iX--)
  8437. {
  8438. *pWork = (mng_uint8)( *(pBkgd+1) & 0xF8); /* ok; copy the pixel */
  8439. *(pWork+1) = (mng_uint8)( (*(pBkgd+1) << 5 ) | ( ((*pBkgd)&0xE0)>>3 ) );
  8440. *(pWork+2) = (mng_uint8)( *(pBkgd) << 3 );
  8441. *(pWork+3) = 0x00; /* transparant for alpha-canvasses */
  8442. pWork += 4;
  8443. pBkgd += 2;
  8444. }
  8445. }
  8446. #ifdef MNG_SUPPORT_TRACE
  8447. MNG_TRACE (pData, MNG_FN_RESTORE_BGR565, MNG_LC_END);
  8448. #endif
  8449. return MNG_NOERROR;
  8450. }
  8451. #endif /* MNG_SKIPCANVAS_BGR565 */
  8452. /* ************************************************************************** */
  8453. #ifndef MNG_SKIPCANVAS_RGB565
  8454. mng_retcode mng_restore_bkgd_rgb565 (mng_datap pData)
  8455. {
  8456. mng_int32 iX;
  8457. mng_uint8p pBkgd;
  8458. mng_uint8p pWork = pData->pRGBArow;
  8459. #ifdef MNG_SUPPORT_TRACE
  8460. MNG_TRACE (pData, MNG_FN_RESTORE_RGB565, MNG_LC_START);
  8461. #endif
  8462. if (pData->fGetbkgdline) /* can we access the background ? */
  8463. { /* point to the right pixel then */
  8464. pBkgd = (mng_uint8p)pData->fGetbkgdline ((mng_handle)pData,
  8465. pData->iRow + pData->iDestt) +
  8466. (3 * pData->iDestl);
  8467. for (iX = (pData->iSourcer - pData->iSourcel); iX > 0; iX--)
  8468. {
  8469. *pWork = (mng_uint8)( *(pBkgd)&0xF8); /* ok; copy the pixel */
  8470. *(pWork+1) = (mng_uint8)( (*(pBkgd+1) << 5) | ( ((*pBkgd)&0xE0)>>3 ) );
  8471. *(pWork+2) = (mng_uint8)( *(pBkgd+1) << 3);
  8472. *(pWork+3) = 0x00; /* transparant for alpha-canvasses */
  8473. pWork += 4;
  8474. pBkgd += 2;
  8475. }
  8476. }
  8477. #ifdef MNG_SUPPORT_TRACE
  8478. MNG_TRACE (pData, MNG_FN_RESTORE_RGB565, MNG_LC_END);
  8479. #endif
  8480. return MNG_NOERROR;
  8481. }
  8482. #endif /* MNG_SKIPCANVAS_RBB565 */
  8483. /* ************************************************************************** */
  8484. /* * * */
  8485. /* * Row retrieval routines - retrieve processed & uncompressed row-data * */
  8486. /* * from the current "object" * */
  8487. /* * * */
  8488. /* ************************************************************************** */
  8489. /* TODO: a serious optimization is to retrieve only those pixels that will
  8490. actually be displayed; this would require changes in
  8491. the "display_image" routine (in mng_display.c) &
  8492. all the "retrieve_xxx" routines below &
  8493. the "display_xxx" routines above !!!!!
  8494. NOTE that "correct_xxx" routines would not require modification */
  8495. mng_retcode mng_retrieve_g8 (mng_datap pData)
  8496. {
  8497. mng_imagedatap pBuf = ((mng_imagep)pData->pRetrieveobj)->pImgbuf;
  8498. mng_uint8p pWorkrow;
  8499. mng_uint8p pRGBArow;
  8500. mng_int32 iX;
  8501. mng_uint8 iG;
  8502. #ifdef MNG_SUPPORT_TRACE
  8503. MNG_TRACE (pData, MNG_FN_RETRIEVE_G8, MNG_LC_START);
  8504. #endif
  8505. pRGBArow = pData->pRGBArow; /* temporary work pointers */
  8506. pWorkrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize);
  8507. if (pBuf->bHasTRNS) /* tRNS in buffer ? */
  8508. {
  8509. #ifdef MNG_DECREMENT_LOOPS
  8510. for (iX = pData->iRowsamples; iX > 0; iX--)
  8511. #else
  8512. for (iX = 0; iX < pData->iRowsamples; iX++)
  8513. #endif
  8514. {
  8515. iG = *pWorkrow; /* get the gray-value */
  8516. /* is it transparent ? */
  8517. if ((mng_uint16)iG == pBuf->iTRNSgray)
  8518. {
  8519. *pRGBArow = 0x00; /* nuttin to display */
  8520. *(pRGBArow+1) = 0x00;
  8521. *(pRGBArow+2) = 0x00;
  8522. *(pRGBArow+3) = 0x00;
  8523. }
  8524. else
  8525. {
  8526. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  8527. mng_uint8 multiplier[]={0,255,85,0,17,0,0,0,1};
  8528. iG = (mng_uint8)(iG * multiplier[pBuf->iBitdepth]);
  8529. #endif
  8530. *pRGBArow = iG; /* put in intermediate row */
  8531. *(pRGBArow+1) = iG;
  8532. *(pRGBArow+2) = iG;
  8533. *(pRGBArow+3) = 0xFF;
  8534. }
  8535. pWorkrow++; /* next pixel */
  8536. pRGBArow += 4;
  8537. }
  8538. }
  8539. else
  8540. {
  8541. #ifdef MNG_DECREMENT_LOOPS
  8542. for (iX = pData->iRowsamples; iX > 0; iX--)
  8543. #else
  8544. for (iX = 0; iX < pData->iRowsamples; iX++)
  8545. #endif
  8546. {
  8547. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  8548. mng_uint8 multiplier[]={0,255,85,0,17,0,0,0,1}; /* LBR scaling */
  8549. iG = (mng_uint8)(multiplier[pBuf->iBitdepth] * *pWorkrow);
  8550. #else
  8551. iG = *pWorkrow; /* get the gray-value */
  8552. #endif
  8553. *pRGBArow = iG; /* put in intermediate row */
  8554. *(pRGBArow+1) = iG;
  8555. *(pRGBArow+2) = iG;
  8556. *(pRGBArow+3) = 0xFF;
  8557. pWorkrow++; /* next pixel */
  8558. pRGBArow += 4;
  8559. }
  8560. }
  8561. #ifdef MNG_SUPPORT_TRACE
  8562. MNG_TRACE (pData, MNG_FN_RETRIEVE_G8, MNG_LC_END);
  8563. #endif
  8564. return MNG_NOERROR;
  8565. }
  8566. /* ************************************************************************** */
  8567. #ifndef MNG_NO_16BIT_SUPPORT
  8568. mng_retcode mng_retrieve_g16 (mng_datap pData)
  8569. {
  8570. mng_imagedatap pBuf = ((mng_imagep)pData->pRetrieveobj)->pImgbuf;
  8571. mng_uint8p pWorkrow;
  8572. mng_uint8p pRGBArow;
  8573. mng_int32 iX;
  8574. mng_uint16 iG;
  8575. #ifdef MNG_SUPPORT_TRACE
  8576. MNG_TRACE (pData, MNG_FN_RETRIEVE_G16, MNG_LC_START);
  8577. #endif
  8578. /* temporary work pointers */
  8579. pRGBArow = pData->pRGBArow;
  8580. pWorkrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize);
  8581. if (pBuf->bHasTRNS) /* tRNS in buffer ? */
  8582. {
  8583. #ifdef MNG_DECREMENT_LOOPS
  8584. for (iX = pData->iRowsamples; iX > 0; iX--)
  8585. #else
  8586. for (iX = 0; iX < pData->iRowsamples; iX++)
  8587. #endif
  8588. {
  8589. iG = mng_get_uint16 (pWorkrow); /* get the gray-value */
  8590. /* is it transparent ? */
  8591. if (iG == pBuf->iTRNSgray)
  8592. { /* nuttin to display */
  8593. mng_put_uint16 (pRGBArow, 0x0000);
  8594. mng_put_uint16 (pRGBArow+2, 0x0000);
  8595. mng_put_uint16 (pRGBArow+4, 0x0000);
  8596. mng_put_uint16 (pRGBArow+6, 0x0000);
  8597. }
  8598. else
  8599. { /* put in intermediate row */
  8600. mng_put_uint16 (pRGBArow, iG);
  8601. mng_put_uint16 (pRGBArow+2, iG);
  8602. mng_put_uint16 (pRGBArow+4, iG);
  8603. mng_put_uint16 (pRGBArow+6, 0xFFFF);
  8604. }
  8605. pWorkrow += 2; /* next pixel */
  8606. pRGBArow += 8;
  8607. }
  8608. }
  8609. else
  8610. {
  8611. #ifdef MNG_DECREMENT_LOOPS
  8612. for (iX = pData->iRowsamples; iX > 0; iX--)
  8613. #else
  8614. for (iX = 0; iX < pData->iRowsamples; iX++)
  8615. #endif
  8616. {
  8617. iG = mng_get_uint16 (pWorkrow); /* get the gray-value */
  8618. mng_put_uint16 (pRGBArow, iG); /* and put in intermediate row */
  8619. mng_put_uint16 (pRGBArow+2, iG);
  8620. mng_put_uint16 (pRGBArow+4, iG);
  8621. mng_put_uint16 (pRGBArow+6, 0xFFFF);
  8622. pWorkrow += 2; /* next pixel */
  8623. pRGBArow += 8;
  8624. }
  8625. }
  8626. #ifdef MNG_SUPPORT_TRACE
  8627. MNG_TRACE (pData, MNG_FN_RETRIEVE_G16, MNG_LC_END);
  8628. #endif
  8629. return MNG_NOERROR;
  8630. }
  8631. #endif
  8632. /* ************************************************************************** */
  8633. mng_retcode mng_retrieve_rgb8 (mng_datap pData)
  8634. {
  8635. mng_imagedatap pBuf = ((mng_imagep)pData->pRetrieveobj)->pImgbuf;
  8636. mng_uint8p pWorkrow;
  8637. mng_uint8p pRGBArow;
  8638. mng_int32 iX;
  8639. mng_uint8 iR, iG, iB;
  8640. #ifdef MNG_SUPPORT_TRACE
  8641. MNG_TRACE (pData, MNG_FN_RETRIEVE_RGB8, MNG_LC_START);
  8642. #endif
  8643. pRGBArow = pData->pRGBArow; /* temporary work pointers */
  8644. pWorkrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize);
  8645. if (pBuf->bHasTRNS) /* tRNS in buffer ? */
  8646. {
  8647. #ifdef MNG_DECREMENT_LOOPS
  8648. for (iX = pData->iRowsamples; iX > 0; iX--)
  8649. #else
  8650. for (iX = 0; iX < pData->iRowsamples; iX++)
  8651. #endif
  8652. {
  8653. iR = *pWorkrow; /* get the rgb-values */
  8654. iG = *(pWorkrow+1);
  8655. iB = *(pWorkrow+2);
  8656. /* is it transparent ? */
  8657. if (((mng_uint16)iR == pBuf->iTRNSred ) &&
  8658. ((mng_uint16)iG == pBuf->iTRNSgreen) &&
  8659. ((mng_uint16)iB == pBuf->iTRNSblue ) )
  8660. {
  8661. *pRGBArow = 0x00; /* nothing to display */
  8662. *(pRGBArow+1) = 0x00;
  8663. *(pRGBArow+2) = 0x00;
  8664. *(pRGBArow+3) = 0x00;
  8665. }
  8666. else
  8667. {
  8668. *pRGBArow = iR; /* put in intermediate row */
  8669. *(pRGBArow+1) = iG;
  8670. *(pRGBArow+2) = iB;
  8671. *(pRGBArow+3) = 0xFF;
  8672. }
  8673. pWorkrow += 3; /* next pixel */
  8674. pRGBArow += 4;
  8675. }
  8676. }
  8677. else
  8678. {
  8679. #ifdef MNG_DECREMENT_LOOPS
  8680. for (iX = pData->iRowsamples; iX > 0; iX--)
  8681. #else
  8682. for (iX = 0; iX < pData->iRowsamples; iX++)
  8683. #endif
  8684. {
  8685. *pRGBArow = *pWorkrow; /* just copy the pixel */
  8686. *(pRGBArow+1) = *(pWorkrow+1);
  8687. *(pRGBArow+2) = *(pWorkrow+2);
  8688. *(pRGBArow+3) = 0xFF;
  8689. pWorkrow += 3; /* next pixel */
  8690. pRGBArow += 4;
  8691. }
  8692. }
  8693. #ifdef MNG_SUPPORT_TRACE
  8694. MNG_TRACE (pData, MNG_FN_RETRIEVE_RGB8, MNG_LC_END);
  8695. #endif
  8696. return MNG_NOERROR;
  8697. }
  8698. /* ************************************************************************** */
  8699. #ifndef MNG_NO_16BIT_SUPPORT
  8700. mng_retcode mng_retrieve_rgb16 (mng_datap pData)
  8701. {
  8702. mng_imagedatap pBuf = ((mng_imagep)pData->pRetrieveobj)->pImgbuf;
  8703. mng_uint8p pWorkrow;
  8704. mng_uint8p pRGBArow;
  8705. mng_int32 iX;
  8706. mng_uint16 iR, iG, iB;
  8707. #ifdef MNG_SUPPORT_TRACE
  8708. MNG_TRACE (pData, MNG_FN_RETRIEVE_RGB16, MNG_LC_START);
  8709. #endif
  8710. /* temporary work pointers */
  8711. pRGBArow = pData->pRGBArow;
  8712. pWorkrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize);
  8713. if (pBuf->bHasTRNS) /* tRNS in buffer ? */
  8714. {
  8715. #ifdef MNG_DECREMENT_LOOPS
  8716. for (iX = pData->iRowsamples; iX > 0; iX--)
  8717. #else
  8718. for (iX = 0; iX < pData->iRowsamples; iX++)
  8719. #endif
  8720. {
  8721. iR = mng_get_uint16 (pWorkrow); /* get the rgb-values */
  8722. iG = mng_get_uint16 (pWorkrow+2);
  8723. iB = mng_get_uint16 (pWorkrow+4);
  8724. /* is it transparent ? */
  8725. if ((iR == pBuf->iTRNSred ) &&
  8726. (iG == pBuf->iTRNSgreen) &&
  8727. (iB == pBuf->iTRNSblue ) )
  8728. { /* nothing to display */
  8729. mng_put_uint16 (pRGBArow, 0x0000);
  8730. mng_put_uint16 (pRGBArow+2, 0x0000);
  8731. mng_put_uint16 (pRGBArow+4, 0x0000);
  8732. mng_put_uint16 (pRGBArow+6, 0x0000);
  8733. }
  8734. else
  8735. { /* put in intermediate row */
  8736. mng_put_uint16 (pRGBArow, iR);
  8737. mng_put_uint16 (pRGBArow+2, iG);
  8738. mng_put_uint16 (pRGBArow+4, iB);
  8739. mng_put_uint16 (pRGBArow+6, 0xFFFF);
  8740. }
  8741. pWorkrow += 6; /* next pixel */
  8742. pRGBArow += 8;
  8743. }
  8744. }
  8745. else
  8746. {
  8747. #ifdef MNG_DECREMENT_LOOPS
  8748. for (iX = pData->iRowsamples; iX > 0; iX--)
  8749. #else
  8750. for (iX = 0; iX < pData->iRowsamples; iX++)
  8751. #endif
  8752. { /* just copy the pixel */
  8753. mng_put_uint16 (pRGBArow, mng_get_uint16 (pWorkrow ));
  8754. mng_put_uint16 (pRGBArow+2, mng_get_uint16 (pWorkrow+2));
  8755. mng_put_uint16 (pRGBArow+4, mng_get_uint16 (pWorkrow+4));
  8756. mng_put_uint16 (pRGBArow+6, 0xFFFF);
  8757. pWorkrow += 6; /* next pixel */
  8758. pRGBArow += 8;
  8759. }
  8760. }
  8761. #ifdef MNG_SUPPORT_TRACE
  8762. MNG_TRACE (pData, MNG_FN_RETRIEVE_RGB16, MNG_LC_END);
  8763. #endif
  8764. return MNG_NOERROR;
  8765. }
  8766. #endif
  8767. /* ************************************************************************** */
  8768. mng_retcode mng_retrieve_idx8 (mng_datap pData)
  8769. {
  8770. mng_imagedatap pBuf = ((mng_imagep)pData->pRetrieveobj)->pImgbuf;
  8771. mng_uint8p pWorkrow;
  8772. mng_uint8p pRGBArow;
  8773. mng_int32 iX;
  8774. mng_uint8 iQ;
  8775. #ifdef MNG_SUPPORT_TRACE
  8776. MNG_TRACE (pData, MNG_FN_RETRIEVE_IDX8, MNG_LC_START);
  8777. #endif
  8778. pRGBArow = pData->pRGBArow; /* temporary work pointers */
  8779. pWorkrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize);
  8780. if (pBuf->bHasTRNS) /* tRNS in buffer ? */
  8781. {
  8782. #ifdef MNG_DECREMENT_LOOPS
  8783. for (iX = pData->iRowsamples; iX > 0; iX--)
  8784. #else
  8785. for (iX = 0; iX < pData->iRowsamples; iX++)
  8786. #endif
  8787. {
  8788. iQ = *pWorkrow; /* get the index */
  8789. /* is it valid ? */
  8790. if ((mng_uint32)iQ < pBuf->iPLTEcount)
  8791. { /* put in intermediate row */
  8792. *pRGBArow = pBuf->aPLTEentries [iQ].iRed;
  8793. *(pRGBArow+1) = pBuf->aPLTEentries [iQ].iGreen;
  8794. *(pRGBArow+2) = pBuf->aPLTEentries [iQ].iBlue;
  8795. /* transparency for this index ? */
  8796. if ((mng_uint32)iQ < pBuf->iTRNScount)
  8797. *(pRGBArow+3) = pBuf->aTRNSentries [iQ];
  8798. else
  8799. *(pRGBArow+3) = 0xFF;
  8800. }
  8801. else
  8802. MNG_ERROR (pData, MNG_PLTEINDEXERROR);
  8803. pWorkrow++; /* next pixel */
  8804. pRGBArow += 4;
  8805. }
  8806. }
  8807. else
  8808. {
  8809. #ifdef MNG_DECREMENT_LOOPS
  8810. for (iX = pData->iRowsamples; iX > 0; iX--)
  8811. #else
  8812. for (iX = 0; iX < pData->iRowsamples; iX++)
  8813. #endif
  8814. {
  8815. iQ = *pWorkrow; /* get the index */
  8816. /* is it valid ? */
  8817. if ((mng_uint32)iQ < pBuf->iPLTEcount)
  8818. { /* put in intermediate row */
  8819. *pRGBArow = pBuf->aPLTEentries [iQ].iRed;
  8820. *(pRGBArow+1) = pBuf->aPLTEentries [iQ].iGreen;
  8821. *(pRGBArow+2) = pBuf->aPLTEentries [iQ].iBlue;
  8822. *(pRGBArow+3) = 0xFF;
  8823. }
  8824. else
  8825. MNG_ERROR (pData, MNG_PLTEINDEXERROR);
  8826. pWorkrow++; /* next pixel */
  8827. pRGBArow += 4;
  8828. }
  8829. }
  8830. #ifdef MNG_SUPPORT_TRACE
  8831. MNG_TRACE (pData, MNG_FN_RETRIEVE_IDX8, MNG_LC_END);
  8832. #endif
  8833. return MNG_NOERROR;
  8834. }
  8835. /* ************************************************************************** */
  8836. mng_retcode mng_retrieve_ga8 (mng_datap pData)
  8837. {
  8838. mng_imagedatap pBuf = ((mng_imagep)pData->pRetrieveobj)->pImgbuf;
  8839. mng_uint8p pWorkrow;
  8840. mng_uint8p pRGBArow;
  8841. mng_int32 iX;
  8842. mng_uint8 iG;
  8843. #ifdef MNG_SUPPORT_TRACE
  8844. MNG_TRACE (pData, MNG_FN_RETRIEVE_GA8, MNG_LC_START);
  8845. #endif
  8846. pRGBArow = pData->pRGBArow; /* temporary work pointers */
  8847. pWorkrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize);
  8848. #ifdef MNG_DECREMENT_LOOPS
  8849. for (iX = pData->iRowsamples; iX > 0; iX--)
  8850. #else
  8851. for (iX = 0; iX < pData->iRowsamples; iX++)
  8852. #endif
  8853. {
  8854. iG = *pWorkrow; /* get the gray-value */
  8855. *pRGBArow = iG; /* put in intermediate row */
  8856. *(pRGBArow+1) = iG;
  8857. *(pRGBArow+2) = iG;
  8858. *(pRGBArow+3) = *(pWorkrow+1);
  8859. pWorkrow += 2; /* next pixel */
  8860. pRGBArow += 4;
  8861. }
  8862. #ifdef MNG_SUPPORT_TRACE
  8863. MNG_TRACE (pData, MNG_FN_RETRIEVE_GA8, MNG_LC_END);
  8864. #endif
  8865. return MNG_NOERROR;
  8866. }
  8867. /* ************************************************************************** */
  8868. #ifndef MNG_NO_16BIT_SUPPORT
  8869. mng_retcode mng_retrieve_ga16 (mng_datap pData)
  8870. {
  8871. mng_imagedatap pBuf = ((mng_imagep)pData->pRetrieveobj)->pImgbuf;
  8872. mng_uint8p pWorkrow;
  8873. mng_uint8p pRGBArow;
  8874. mng_int32 iX;
  8875. mng_uint16 iG;
  8876. #ifdef MNG_SUPPORT_TRACE
  8877. MNG_TRACE (pData, MNG_FN_RETRIEVE_GA16, MNG_LC_START);
  8878. #endif
  8879. /* temporary work pointers */
  8880. pRGBArow = pData->pRGBArow;
  8881. pWorkrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize);
  8882. #ifdef MNG_DECREMENT_LOOPS
  8883. for (iX = pData->iRowsamples; iX > 0; iX--)
  8884. #else
  8885. for (iX = 0; iX < pData->iRowsamples; iX++)
  8886. #endif
  8887. {
  8888. iG = mng_get_uint16 (pWorkrow); /* get the gray-value */
  8889. mng_put_uint16 (pRGBArow, iG); /* and put in intermediate row */
  8890. mng_put_uint16 (pRGBArow+2, iG);
  8891. mng_put_uint16 (pRGBArow+4, iG);
  8892. mng_put_uint16 (pRGBArow+6, mng_get_uint16 (pWorkrow+2));
  8893. pWorkrow += 4; /* next pixel */
  8894. pRGBArow += 8;
  8895. }
  8896. #ifdef MNG_SUPPORT_TRACE
  8897. MNG_TRACE (pData, MNG_FN_RETRIEVE_GA16, MNG_LC_END);
  8898. #endif
  8899. return MNG_NOERROR;
  8900. }
  8901. #endif
  8902. /* ************************************************************************** */
  8903. mng_retcode mng_retrieve_rgba8 (mng_datap pData)
  8904. {
  8905. mng_imagedatap pBuf = ((mng_imagep)pData->pRetrieveobj)->pImgbuf;
  8906. mng_uint8p pWorkrow;
  8907. mng_uint8p pRGBArow;
  8908. #ifdef MNG_SUPPORT_TRACE
  8909. MNG_TRACE (pData, MNG_FN_RETRIEVE_RGBA8, MNG_LC_START);
  8910. #endif
  8911. pRGBArow = pData->pRGBArow; /* temporary work pointers */
  8912. pWorkrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize);
  8913. /* can't be easier than this ! */
  8914. MNG_COPY (pRGBArow, pWorkrow, pBuf->iRowsize);
  8915. #ifdef MNG_SUPPORT_TRACE
  8916. MNG_TRACE (pData, MNG_FN_RETRIEVE_RGBA8, MNG_LC_END);
  8917. #endif
  8918. return MNG_NOERROR;
  8919. }
  8920. /* ************************************************************************** */
  8921. #ifndef MNG_NO_16BIT_SUPPORT
  8922. mng_retcode mng_retrieve_rgba16 (mng_datap pData)
  8923. {
  8924. mng_imagedatap pBuf = ((mng_imagep)pData->pRetrieveobj)->pImgbuf;
  8925. mng_uint8p pWorkrow;
  8926. mng_uint8p pRGBArow;
  8927. #ifdef MNG_SUPPORT_TRACE
  8928. MNG_TRACE (pData, MNG_FN_RETRIEVE_RGBA16, MNG_LC_START);
  8929. #endif
  8930. /* temporary work pointers */
  8931. pRGBArow = pData->pRGBArow;
  8932. pWorkrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize);
  8933. /* can't be easier than this ! */
  8934. MNG_COPY (pRGBArow, pWorkrow, pBuf->iRowsize);
  8935. #ifdef MNG_SUPPORT_TRACE
  8936. MNG_TRACE (pData, MNG_FN_RETRIEVE_RGBA16, MNG_LC_END);
  8937. #endif
  8938. return MNG_NOERROR;
  8939. }
  8940. #endif
  8941. /* ************************************************************************** */
  8942. /* * * */
  8943. /* * Row storage routines - store processed & uncompressed row-data * */
  8944. /* * into the current "object" * */
  8945. /* * * */
  8946. /* ************************************************************************** */
  8947. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  8948. mng_retcode mng_store_g1 (mng_datap pData)
  8949. {
  8950. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  8951. mng_uint8p pWorkrow;
  8952. mng_uint8p pOutrow;
  8953. mng_int32 iX;
  8954. mng_uint8 iB;
  8955. mng_uint8 iM;
  8956. #ifdef MNG_SUPPORT_TRACE
  8957. MNG_TRACE (pData, MNG_FN_STORE_G1, MNG_LC_START);
  8958. #endif
  8959. /* temporary work pointers */
  8960. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  8961. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  8962. (pData->iCol * pBuf->iSamplesize);
  8963. iM = 0; /* start at pixel 0 */
  8964. iB = 0;
  8965. #ifdef MNG_DECREMENT_LOOPS
  8966. for (iX = pData->iRowsamples; iX > 0; iX--)
  8967. #else
  8968. for (iX = 0; iX < pData->iRowsamples; iX++)
  8969. #endif
  8970. {
  8971. if (!iM) /* mask underflow ? */
  8972. {
  8973. iB = *pWorkrow; /* get next input-byte */
  8974. pWorkrow++;
  8975. iM = 0x80;
  8976. }
  8977. if (iB & iM) /* is it white ? */
  8978. *pOutrow = 0x01; /* white */
  8979. else
  8980. *pOutrow = 0x00; /* black */
  8981. pOutrow += pData->iColinc; /* next pixel */
  8982. iM >>= 1;
  8983. }
  8984. #ifdef MNG_SUPPORT_TRACE
  8985. MNG_TRACE (pData, MNG_FN_STORE_G1, MNG_LC_END);
  8986. #endif
  8987. return MNG_NOERROR;
  8988. }
  8989. /* ************************************************************************** */
  8990. mng_retcode mng_store_g2 (mng_datap pData)
  8991. {
  8992. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  8993. mng_uint8p pWorkrow;
  8994. mng_uint8p pOutrow;
  8995. mng_int32 iX;
  8996. mng_uint8 iB;
  8997. mng_uint8 iM;
  8998. mng_uint32 iS;
  8999. mng_uint8 iQ;
  9000. #ifdef MNG_SUPPORT_TRACE
  9001. MNG_TRACE (pData, MNG_FN_STORE_G2, MNG_LC_START);
  9002. #endif
  9003. /* temporary work pointers */
  9004. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  9005. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  9006. (pData->iCol * pBuf->iSamplesize);
  9007. iM = 0; /* start at pixel 0 */
  9008. iB = 0;
  9009. iS = 0;
  9010. #ifdef MNG_DECREMENT_LOOPS
  9011. for (iX = pData->iRowsamples; iX > 0; iX--)
  9012. #else
  9013. for (iX = 0; iX < pData->iRowsamples; iX++)
  9014. #endif
  9015. {
  9016. if (!iM) /* mask underflow ? */
  9017. {
  9018. iB = *pWorkrow; /* get next input-byte */
  9019. pWorkrow++;
  9020. iM = 0xC0;
  9021. iS = 6;
  9022. }
  9023. iQ = (mng_uint8)((iB & iM) >> iS); /* get the gray level */
  9024. *pOutrow = iQ; /* put in object buffer */
  9025. pOutrow += pData->iColinc; /* next pixel */
  9026. iM >>= 2;
  9027. iS -= 2;
  9028. }
  9029. #ifdef MNG_SUPPORT_TRACE
  9030. MNG_TRACE (pData, MNG_FN_STORE_G2, MNG_LC_END);
  9031. #endif
  9032. return MNG_NOERROR;
  9033. }
  9034. /* ************************************************************************** */
  9035. mng_retcode mng_store_g4 (mng_datap pData)
  9036. {
  9037. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9038. mng_uint8p pWorkrow;
  9039. mng_uint8p pOutrow;
  9040. mng_int32 iX;
  9041. mng_uint8 iB;
  9042. mng_uint8 iM;
  9043. mng_uint32 iS;
  9044. mng_uint8 iQ;
  9045. #ifdef MNG_SUPPORT_TRACE
  9046. MNG_TRACE (pData, MNG_FN_STORE_G4, MNG_LC_START);
  9047. #endif
  9048. /* temporary work pointers */
  9049. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  9050. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  9051. (pData->iCol * pBuf->iSamplesize);
  9052. iM = 0; /* start at pixel 0 */
  9053. iB = 0;
  9054. iS = 0;
  9055. #ifdef MNG_DECREMENT_LOOPS
  9056. for (iX = pData->iRowsamples; iX > 0; iX--)
  9057. #else
  9058. for (iX = 0; iX < pData->iRowsamples; iX++)
  9059. #endif
  9060. {
  9061. if (!iM) /* mask underflow ? */
  9062. {
  9063. iB = *pWorkrow; /* get next input-byte */
  9064. pWorkrow++;
  9065. iM = 0xF0;
  9066. iS = 4;
  9067. }
  9068. iQ = (mng_uint8)((iB & iM) >> iS); /* get the gray level */
  9069. *pOutrow = iQ; /* put in object buffer */
  9070. pOutrow += pData->iColinc; /* next pixel */
  9071. iM >>= 4;
  9072. iS -= 4;
  9073. }
  9074. #ifdef MNG_SUPPORT_TRACE
  9075. MNG_TRACE (pData, MNG_FN_STORE_G4, MNG_LC_END);
  9076. #endif
  9077. return MNG_NOERROR;
  9078. }
  9079. #endif
  9080. /* ************************************************************************** */
  9081. mng_retcode mng_store_g8 (mng_datap pData)
  9082. {
  9083. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9084. mng_uint8p pWorkrow;
  9085. mng_uint8p pOutrow;
  9086. mng_int32 iX;
  9087. #ifdef MNG_SUPPORT_TRACE
  9088. MNG_TRACE (pData, MNG_FN_STORE_G8, MNG_LC_START);
  9089. #endif
  9090. /* temporary work pointers */
  9091. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  9092. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  9093. (pData->iCol * pBuf->iSamplesize);
  9094. #ifdef MNG_DECREMENT_LOOPS
  9095. for (iX = pData->iRowsamples; iX > 0; iX--)
  9096. #else
  9097. for (iX = 0; iX < pData->iRowsamples; iX++)
  9098. #endif
  9099. {
  9100. *pOutrow = *pWorkrow; /* put in object buffer */
  9101. pOutrow += pData->iColinc; /* next pixel */
  9102. pWorkrow++;
  9103. }
  9104. #ifdef MNG_SUPPORT_TRACE
  9105. MNG_TRACE (pData, MNG_FN_STORE_G8, MNG_LC_END);
  9106. #endif
  9107. return MNG_NOERROR;
  9108. }
  9109. /* ************************************************************************** */
  9110. #ifndef MNG_NO_16BIT_SUPPORT
  9111. mng_retcode mng_store_g16 (mng_datap pData)
  9112. {
  9113. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9114. mng_uint8p pWorkrow;
  9115. mng_uint8p pOutrow;
  9116. mng_int32 iX;
  9117. #ifdef MNG_SUPPORT_TRACE
  9118. MNG_TRACE (pData, MNG_FN_STORE_G16, MNG_LC_START);
  9119. #endif
  9120. /* temporary work pointers */
  9121. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  9122. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  9123. (pData->iCol * pBuf->iSamplesize);
  9124. #ifdef MNG_DECREMENT_LOOPS
  9125. for (iX = pData->iRowsamples; iX > 0; iX--)
  9126. #else
  9127. for (iX = 0; iX < pData->iRowsamples; iX++)
  9128. #endif
  9129. { /* copy into object buffer */
  9130. mng_put_uint16 (pOutrow, mng_get_uint16 (pWorkrow));
  9131. pOutrow += (pData->iColinc << 1); /* next pixel */
  9132. pWorkrow += 2;
  9133. }
  9134. #ifdef MNG_SUPPORT_TRACE
  9135. MNG_TRACE (pData, MNG_FN_STORE_G16, MNG_LC_END);
  9136. #endif
  9137. return MNG_NOERROR;
  9138. }
  9139. #endif
  9140. /* ************************************************************************** */
  9141. mng_retcode mng_store_rgb8 (mng_datap pData)
  9142. {
  9143. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9144. mng_uint8p pWorkrow;
  9145. mng_uint8p pOutrow;
  9146. mng_int32 iX;
  9147. #ifdef MNG_SUPPORT_TRACE
  9148. MNG_TRACE (pData, MNG_FN_STORE_RGB8, MNG_LC_START);
  9149. #endif
  9150. /* temporary work pointers */
  9151. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  9152. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  9153. (pData->iCol * pBuf->iSamplesize);
  9154. #ifdef MNG_DECREMENT_LOOPS
  9155. for (iX = pData->iRowsamples; iX > 0; iX--)
  9156. #else
  9157. for (iX = 0; iX < pData->iRowsamples; iX++)
  9158. #endif
  9159. {
  9160. *pOutrow = *pWorkrow; /* copy the RGB bytes */
  9161. *(pOutrow+1) = *(pWorkrow+1);
  9162. *(pOutrow+2) = *(pWorkrow+2);
  9163. pWorkrow += 3; /* next pixel */
  9164. pOutrow += (pData->iColinc * 3);
  9165. }
  9166. #ifdef MNG_SUPPORT_TRACE
  9167. MNG_TRACE (pData, MNG_FN_STORE_RGB8, MNG_LC_END);
  9168. #endif
  9169. return MNG_NOERROR;
  9170. }
  9171. /* ************************************************************************** */
  9172. #ifndef MNG_NO_16BIT_SUPPORT
  9173. mng_retcode mng_store_rgb16 (mng_datap pData)
  9174. {
  9175. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9176. mng_uint8p pWorkrow;
  9177. mng_uint8p pOutrow;
  9178. mng_int32 iX;
  9179. #ifdef MNG_SUPPORT_TRACE
  9180. MNG_TRACE (pData, MNG_FN_STORE_RGB16, MNG_LC_START);
  9181. #endif
  9182. /* temporary work pointers */
  9183. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  9184. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  9185. (pData->iCol * pBuf->iSamplesize);
  9186. #ifdef MNG_DECREMENT_LOOPS
  9187. for (iX = pData->iRowsamples; iX > 0; iX--)
  9188. #else
  9189. for (iX = 0; iX < pData->iRowsamples; iX++)
  9190. #endif
  9191. {
  9192. MNG_COPY (pOutrow, pWorkrow, 6); /* copy the RGB bytes */
  9193. pWorkrow += 6; /* next pixel */
  9194. pOutrow += (pData->iColinc * 6);
  9195. }
  9196. #ifdef MNG_SUPPORT_TRACE
  9197. MNG_TRACE (pData, MNG_FN_STORE_RGB16, MNG_LC_END);
  9198. #endif
  9199. return MNG_NOERROR;
  9200. }
  9201. #endif
  9202. /* ************************************************************************** */
  9203. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  9204. mng_retcode mng_store_idx1 (mng_datap pData)
  9205. {
  9206. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9207. mng_uint8p pWorkrow;
  9208. mng_uint8p pOutrow;
  9209. mng_int32 iX;
  9210. mng_uint8 iB;
  9211. mng_uint8 iM;
  9212. #ifdef MNG_SUPPORT_TRACE
  9213. MNG_TRACE (pData, MNG_FN_STORE_IDX1, MNG_LC_START);
  9214. #endif
  9215. /* temporary work pointers */
  9216. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  9217. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  9218. (pData->iCol * pBuf->iSamplesize);
  9219. iM = 0; /* start at pixel 0 */
  9220. iB = 0;
  9221. #ifdef MNG_DECREMENT_LOOPS
  9222. for (iX = pData->iRowsamples; iX > 0; iX--)
  9223. #else
  9224. for (iX = 0; iX < pData->iRowsamples; iX++)
  9225. #endif
  9226. {
  9227. if (!iM) /* mask underflow ? */
  9228. {
  9229. iB = *pWorkrow; /* get next input-byte */
  9230. pWorkrow++;
  9231. iM = 0x80;
  9232. }
  9233. if (iB & iM) /* store the index */
  9234. *pOutrow = 0x01;
  9235. else
  9236. *pOutrow = 0x00;
  9237. pOutrow += pData->iColinc; /* next pixel */
  9238. iM >>= 1;
  9239. }
  9240. #ifdef MNG_SUPPORT_TRACE
  9241. MNG_TRACE (pData, MNG_FN_STORE_IDX1, MNG_LC_END);
  9242. #endif
  9243. return MNG_NOERROR;
  9244. }
  9245. /* ************************************************************************** */
  9246. mng_retcode mng_store_idx2 (mng_datap pData)
  9247. {
  9248. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9249. mng_uint8p pWorkrow;
  9250. mng_uint8p pOutrow;
  9251. mng_int32 iX;
  9252. mng_uint8 iB;
  9253. mng_uint8 iM;
  9254. mng_uint32 iS;
  9255. #ifdef MNG_SUPPORT_TRACE
  9256. MNG_TRACE (pData, MNG_FN_STORE_IDX2, MNG_LC_START);
  9257. #endif
  9258. /* temporary work pointers */
  9259. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  9260. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  9261. (pData->iCol * pBuf->iSamplesize);
  9262. iM = 0; /* start at pixel 0 */
  9263. iB = 0;
  9264. iS = 0;
  9265. #ifdef MNG_DECREMENT_LOOPS
  9266. for (iX = pData->iRowsamples; iX > 0; iX--)
  9267. #else
  9268. for (iX = 0; iX < pData->iRowsamples; iX++)
  9269. #endif
  9270. {
  9271. if (!iM) /* mask underflow ? */
  9272. {
  9273. iB = *pWorkrow; /* get next input-byte */
  9274. pWorkrow++;
  9275. iM = 0xC0;
  9276. iS = 6;
  9277. }
  9278. /* store the index */
  9279. *pOutrow = (mng_uint8)((iB & iM) >> iS);
  9280. pOutrow += pData->iColinc; /* next pixel */
  9281. iM >>= 2;
  9282. iS -= 2;
  9283. }
  9284. #ifdef MNG_SUPPORT_TRACE
  9285. MNG_TRACE (pData, MNG_FN_STORE_IDX2, MNG_LC_END);
  9286. #endif
  9287. return MNG_NOERROR;
  9288. }
  9289. /* ************************************************************************** */
  9290. mng_retcode mng_store_idx4 (mng_datap pData)
  9291. {
  9292. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9293. mng_uint8p pWorkrow;
  9294. mng_uint8p pOutrow;
  9295. mng_int32 iX;
  9296. mng_uint8 iB;
  9297. mng_uint8 iM;
  9298. mng_uint32 iS;
  9299. #ifdef MNG_SUPPORT_TRACE
  9300. MNG_TRACE (pData, MNG_FN_STORE_IDX4, MNG_LC_START);
  9301. #endif
  9302. /* temporary work pointers */
  9303. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  9304. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  9305. (pData->iCol * pBuf->iSamplesize);
  9306. iM = 0; /* start at pixel 0 */
  9307. iB = 0;
  9308. iS = 0;
  9309. #ifdef MNG_DECREMENT_LOOPS
  9310. for (iX = pData->iRowsamples; iX > 0; iX--)
  9311. #else
  9312. for (iX = 0; iX < pData->iRowsamples; iX++)
  9313. #endif
  9314. {
  9315. if (!iM) /* mask underflow ? */
  9316. {
  9317. iB = *pWorkrow; /* get next input-byte */
  9318. pWorkrow++;
  9319. iM = 0xF0;
  9320. iS = 4;
  9321. }
  9322. /* store the index */
  9323. *pOutrow = (mng_uint8)((iB & iM) >> iS);
  9324. pOutrow += pData->iColinc; /* next pixel */
  9325. iM >>= 4;
  9326. iS -= 4;
  9327. }
  9328. #ifdef MNG_SUPPORT_TRACE
  9329. MNG_TRACE (pData, MNG_FN_STORE_IDX4, MNG_LC_END);
  9330. #endif
  9331. return MNG_NOERROR;
  9332. }
  9333. #endif
  9334. /* ************************************************************************** */
  9335. mng_retcode mng_store_idx8 (mng_datap pData)
  9336. {
  9337. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9338. mng_uint8p pWorkrow;
  9339. mng_uint8p pOutrow;
  9340. mng_int32 iX;
  9341. #ifdef MNG_SUPPORT_TRACE
  9342. MNG_TRACE (pData, MNG_FN_STORE_IDX8, MNG_LC_START);
  9343. #endif
  9344. /* temporary work pointers */
  9345. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  9346. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  9347. (pData->iCol * pBuf->iSamplesize);
  9348. #ifdef MNG_DECREMENT_LOOPS
  9349. for (iX = pData->iRowsamples; iX > 0; iX--)
  9350. #else
  9351. for (iX = 0; iX < pData->iRowsamples; iX++)
  9352. #endif
  9353. {
  9354. *pOutrow = *pWorkrow; /* put in object buffer */
  9355. pOutrow += pData->iColinc; /* next pixel */
  9356. pWorkrow++;
  9357. }
  9358. #ifdef MNG_SUPPORT_TRACE
  9359. MNG_TRACE (pData, MNG_FN_STORE_IDX8, MNG_LC_END);
  9360. #endif
  9361. return MNG_NOERROR;
  9362. }
  9363. /* ************************************************************************** */
  9364. mng_retcode mng_store_ga8 (mng_datap pData)
  9365. {
  9366. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9367. mng_uint8p pWorkrow;
  9368. mng_uint8p pOutrow;
  9369. mng_int32 iX;
  9370. #ifdef MNG_SUPPORT_TRACE
  9371. MNG_TRACE (pData, MNG_FN_STORE_GA8, MNG_LC_START);
  9372. #endif
  9373. /* temporary work pointers */
  9374. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  9375. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  9376. (pData->iCol * pBuf->iSamplesize);
  9377. #ifdef MNG_DECREMENT_LOOPS
  9378. for (iX = pData->iRowsamples; iX > 0; iX--)
  9379. #else
  9380. for (iX = 0; iX < pData->iRowsamples; iX++)
  9381. #endif
  9382. {
  9383. *pOutrow = *pWorkrow; /* copy the GA bytes */
  9384. *(pOutrow+1) = *(pWorkrow+1);
  9385. pWorkrow += 2; /* next pixel */
  9386. pOutrow += (pData->iColinc << 1);
  9387. }
  9388. #ifdef MNG_SUPPORT_TRACE
  9389. MNG_TRACE (pData, MNG_FN_STORE_GA8, MNG_LC_END);
  9390. #endif
  9391. return MNG_NOERROR;
  9392. }
  9393. /* ************************************************************************** */
  9394. #ifndef MNG_NO_16BIT_SUPPORT
  9395. mng_retcode mng_store_ga16 (mng_datap pData)
  9396. {
  9397. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9398. mng_uint8p pWorkrow;
  9399. mng_uint8p pOutrow;
  9400. mng_int32 iX;
  9401. #ifdef MNG_SUPPORT_TRACE
  9402. MNG_TRACE (pData, MNG_FN_STORE_GA16, MNG_LC_START);
  9403. #endif
  9404. /* temporary work pointers */
  9405. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  9406. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  9407. (pData->iCol * pBuf->iSamplesize);
  9408. #ifdef MNG_DECREMENT_LOOPS
  9409. for (iX = pData->iRowsamples; iX > 0; iX--)
  9410. #else
  9411. for (iX = 0; iX < pData->iRowsamples; iX++)
  9412. #endif
  9413. {
  9414. MNG_COPY (pOutrow, pWorkrow, 4); /* copy the GA bytes */
  9415. pWorkrow += 4; /* next pixel */
  9416. pOutrow += (pData->iColinc << 2);
  9417. }
  9418. #ifdef MNG_SUPPORT_TRACE
  9419. MNG_TRACE (pData, MNG_FN_STORE_GA16, MNG_LC_END);
  9420. #endif
  9421. return MNG_NOERROR;
  9422. }
  9423. #endif
  9424. /* ************************************************************************** */
  9425. mng_retcode mng_store_rgba8 (mng_datap pData)
  9426. {
  9427. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9428. mng_uint8p pWorkrow;
  9429. mng_uint8p pOutrow;
  9430. mng_int32 iX;
  9431. #ifdef MNG_SUPPORT_TRACE
  9432. MNG_TRACE (pData, MNG_FN_STORE_RGBA8, MNG_LC_START);
  9433. #endif
  9434. /* temporary work pointers */
  9435. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  9436. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  9437. (pData->iCol * pBuf->iSamplesize);
  9438. #ifdef MNG_DECREMENT_LOOPS
  9439. for (iX = pData->iRowsamples; iX > 0; iX--)
  9440. #else
  9441. for (iX = 0; iX < pData->iRowsamples; iX++)
  9442. #endif
  9443. {
  9444. *pOutrow = *pWorkrow; /* copy the RGBA bytes */
  9445. *(pOutrow+1) = *(pWorkrow+1);
  9446. *(pOutrow+2) = *(pWorkrow+2);
  9447. *(pOutrow+3) = *(pWorkrow+3);
  9448. pWorkrow += 4; /* next pixel */
  9449. pOutrow += (pData->iColinc << 2);
  9450. }
  9451. #ifdef MNG_SUPPORT_TRACE
  9452. MNG_TRACE (pData, MNG_FN_STORE_RGBA8, MNG_LC_END);
  9453. #endif
  9454. return MNG_NOERROR;
  9455. }
  9456. /* ************************************************************************** */
  9457. #ifndef MNG_NO_16BIT_SUPPORT
  9458. mng_retcode mng_store_rgba16 (mng_datap pData)
  9459. {
  9460. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9461. mng_uint8p pWorkrow;
  9462. mng_uint8p pOutrow;
  9463. mng_int32 iX;
  9464. #ifdef MNG_SUPPORT_TRACE
  9465. MNG_TRACE (pData, MNG_FN_STORE_RGBA16, MNG_LC_START);
  9466. #endif
  9467. /* temporary work pointers */
  9468. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  9469. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  9470. (pData->iCol * pBuf->iSamplesize);
  9471. #ifdef MNG_DECREMENT_LOOPS
  9472. for (iX = pData->iRowsamples; iX > 0; iX--)
  9473. #else
  9474. for (iX = 0; iX < pData->iRowsamples; iX++)
  9475. #endif
  9476. {
  9477. MNG_COPY (pOutrow, pWorkrow, 8); /* copy the RGBA bytes */
  9478. pWorkrow += 8; /* next pixel */
  9479. pOutrow += (pData->iColinc << 3);
  9480. }
  9481. #ifdef MNG_SUPPORT_TRACE
  9482. MNG_TRACE (pData, MNG_FN_STORE_RGBA16, MNG_LC_END);
  9483. #endif
  9484. return MNG_NOERROR;
  9485. }
  9486. #endif
  9487. /* ************************************************************************** */
  9488. /* * * */
  9489. /* * Row storage routines (JPEG) - store processed & uncompressed row-data * */
  9490. /* * into the current "object" * */
  9491. /* * * */
  9492. /* ************************************************************************** */
  9493. #ifdef MNG_INCLUDE_JNG
  9494. /* ************************************************************************** */
  9495. mng_retcode mng_store_jpeg_g8 (mng_datap pData)
  9496. {
  9497. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9498. mng_uint8p pWorkrow;
  9499. mng_uint8p pOutrow;
  9500. #ifdef MNG_SUPPORT_TRACE
  9501. MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8, MNG_LC_START);
  9502. #endif
  9503. pWorkrow = pData->pJPEGrow; /* temporary work pointers */
  9504. pOutrow = pBuf->pImgdata + (pData->iJPEGrow * pBuf->iRowsize);
  9505. /* easy as pie ... */
  9506. MNG_COPY (pOutrow, pWorkrow, pData->iRowsamples);
  9507. #ifdef MNG_SUPPORT_TRACE
  9508. MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8, MNG_LC_END);
  9509. #endif
  9510. return mng_next_jpeg_row (pData); /* we've got one more row of gray-samples */
  9511. }
  9512. /* ************************************************************************** */
  9513. mng_retcode mng_store_jpeg_rgb8 (mng_datap pData)
  9514. {
  9515. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9516. mng_uint8p pWorkrow;
  9517. mng_uint8p pOutrow;
  9518. #if RGB_PIXELSIZE != 3
  9519. mng_int32 iX;
  9520. #endif
  9521. #ifdef MNG_SUPPORT_TRACE
  9522. MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8, MNG_LC_START);
  9523. #endif
  9524. pWorkrow = pData->pJPEGrow; /* temporary work pointers */
  9525. pOutrow = pBuf->pImgdata + (pData->iJPEGrow * pBuf->iRowsize);
  9526. #if RGB_PIXELSIZE == 3
  9527. /* easy as pie ... */
  9528. MNG_COPY (pOutrow, pWorkrow, pData->iRowsamples * 3);
  9529. #else
  9530. #ifdef MNG_DECREMENT_LOOPS
  9531. for (iX = pData->iRowsamples; iX > 0; iX--)
  9532. #else
  9533. for (iX = 0; iX < pData->iRowsamples; iX++)
  9534. #endif
  9535. {
  9536. *pOutrow = *pWorkrow; /* copy pixel into object buffer */
  9537. *(pOutrow+1) = *(pWorkrow+1);
  9538. *(pOutrow+2) = *(pWorkrow+2);
  9539. pOutrow += 3; /* next pixel */
  9540. pWorkrow += RGB_PIXELSIZE;
  9541. }
  9542. #endif
  9543. #ifdef MNG_SUPPORT_TRACE
  9544. MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8, MNG_LC_END);
  9545. #endif
  9546. return mng_next_jpeg_row (pData); /* we've got one more row of rgb-samples */
  9547. }
  9548. /* ************************************************************************** */
  9549. mng_retcode mng_store_jpeg_ga8 (mng_datap pData)
  9550. {
  9551. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9552. mng_uint8p pWorkrow;
  9553. mng_uint8p pOutrow;
  9554. mng_int32 iX;
  9555. #ifdef MNG_SUPPORT_TRACE
  9556. MNG_TRACE (pData, MNG_FN_STORE_JPEG_GA8, MNG_LC_START);
  9557. #endif
  9558. pWorkrow = pData->pJPEGrow; /* temporary work pointers */
  9559. pOutrow = pBuf->pImgdata + (pData->iJPEGrow * pBuf->iRowsize);
  9560. #ifdef MNG_DECREMENT_LOOPS
  9561. for (iX = pData->iRowsamples; iX > 0; iX--)
  9562. #else
  9563. for (iX = 0; iX < pData->iRowsamples; iX++)
  9564. #endif
  9565. {
  9566. *pOutrow = *pWorkrow; /* copy into object buffer */
  9567. pOutrow += 2; /* next pixel */
  9568. pWorkrow++;
  9569. }
  9570. #ifdef MNG_SUPPORT_TRACE
  9571. MNG_TRACE (pData, MNG_FN_STORE_JPEG_GA8, MNG_LC_END);
  9572. #endif
  9573. return mng_next_jpeg_row (pData); /* we've got one more row of gray-samples */
  9574. }
  9575. /* ************************************************************************** */
  9576. mng_retcode mng_store_jpeg_rgba8 (mng_datap pData)
  9577. {
  9578. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9579. mng_uint8p pWorkrow;
  9580. mng_uint8p pOutrow;
  9581. mng_int32 iX;
  9582. #ifdef MNG_SUPPORT_TRACE
  9583. MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGBA8, MNG_LC_START);
  9584. #endif
  9585. pWorkrow = pData->pJPEGrow; /* temporary work pointers */
  9586. pOutrow = pBuf->pImgdata + (pData->iJPEGrow * pBuf->iRowsize);
  9587. #ifdef MNG_DECREMENT_LOOPS
  9588. for (iX = pData->iRowsamples; iX > 0; iX--)
  9589. #else
  9590. for (iX = 0; iX < pData->iRowsamples; iX++)
  9591. #endif
  9592. {
  9593. *pOutrow = *pWorkrow; /* copy pixel into object buffer */
  9594. *(pOutrow+1) = *(pWorkrow+1);
  9595. *(pOutrow+2) = *(pWorkrow+2);
  9596. pOutrow += 4; /* next pixel */
  9597. pWorkrow += RGB_PIXELSIZE;
  9598. }
  9599. #ifdef MNG_SUPPORT_TRACE
  9600. MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGBA8, MNG_LC_END);
  9601. #endif
  9602. return mng_next_jpeg_row (pData); /* we've got one more row of rgb-samples */
  9603. }
  9604. /* ************************************************************************** */
  9605. mng_retcode mng_store_jpeg_g8_alpha (mng_datap pData)
  9606. {
  9607. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9608. mng_uint8p pWorkrow;
  9609. mng_uint8p pOutrow;
  9610. mng_int32 iX;
  9611. #ifdef MNG_SUPPORT_TRACE
  9612. MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8_ALPHA, MNG_LC_START);
  9613. #endif
  9614. /* temporary work pointers */
  9615. pWorkrow = pData->pJPEGrow2;
  9616. pOutrow = pBuf->pImgdata + (pData->iJPEGalpharow * pBuf->iRowsize) + 1;
  9617. #ifdef MNG_DECREMENT_LOOPS
  9618. for (iX = pData->iRowsamples; iX > 0; iX--)
  9619. #else
  9620. for (iX = 0; iX < pData->iRowsamples; iX++)
  9621. #endif
  9622. {
  9623. *pOutrow = *pWorkrow; /* put in object buffer */
  9624. pOutrow += 2; /* next pixel */
  9625. pWorkrow++;
  9626. }
  9627. #ifdef MNG_SUPPORT_TRACE
  9628. MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8_ALPHA, MNG_LC_END);
  9629. #endif
  9630. /* we've got one more row of alpha-samples */
  9631. return mng_next_jpeg_alpharow (pData);
  9632. }
  9633. /* ************************************************************************** */
  9634. mng_retcode mng_store_jpeg_rgb8_alpha (mng_datap pData)
  9635. {
  9636. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9637. mng_uint8p pWorkrow;
  9638. mng_uint8p pOutrow;
  9639. mng_int32 iX;
  9640. #ifdef MNG_SUPPORT_TRACE
  9641. MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8_ALPHA, MNG_LC_START);
  9642. #endif
  9643. /* temporary work pointers */
  9644. pWorkrow = pData->pJPEGrow2;
  9645. pOutrow = pBuf->pImgdata + (pData->iJPEGalpharow * pBuf->iRowsize) + 3;
  9646. #ifdef MNG_DECREMENT_LOOPS
  9647. for (iX = pData->iRowsamples; iX > 0; iX--)
  9648. #else
  9649. for (iX = 0; iX < pData->iRowsamples; iX++)
  9650. #endif
  9651. {
  9652. *pOutrow = *pWorkrow; /* put in object buffer */
  9653. pOutrow += 4; /* next pixel */
  9654. pWorkrow++;
  9655. }
  9656. #ifdef MNG_SUPPORT_TRACE
  9657. MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8_ALPHA, MNG_LC_END);
  9658. #endif
  9659. /* we've got one more row of alpha-samples */
  9660. return mng_next_jpeg_alpharow (pData);
  9661. }
  9662. /* ************************************************************************** */
  9663. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  9664. mng_retcode mng_store_jpeg_g8_a1 (mng_datap pData)
  9665. {
  9666. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9667. mng_uint8p pWorkrow;
  9668. mng_uint8p pOutrow;
  9669. mng_int32 iX;
  9670. mng_uint8 iB;
  9671. mng_uint8 iM;
  9672. #ifdef MNG_SUPPORT_TRACE
  9673. MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8_A1, MNG_LC_START);
  9674. #endif
  9675. /* temporary work pointers */
  9676. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  9677. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  9678. (pData->iCol * pBuf->iSamplesize) + 1;
  9679. iM = 0; /* start at pixel 0 */
  9680. iB = 0;
  9681. #ifdef MNG_DECREMENT_LOOPS
  9682. for (iX = pData->iRowsamples; iX > 0; iX--)
  9683. #else
  9684. for (iX = 0; iX < pData->iRowsamples; iX++)
  9685. #endif
  9686. {
  9687. if (!iM) /* mask underflow ? */
  9688. {
  9689. iB = *pWorkrow; /* get next input-byte */
  9690. pWorkrow++;
  9691. iM = 0x80;
  9692. }
  9693. if (iB & iM) /* is it opaque ? */
  9694. *pOutrow = 0xFF; /* opaque */
  9695. else
  9696. *pOutrow = 0x00; /* transparent */
  9697. pOutrow += 2; /* next pixel */
  9698. iM >>= 1;
  9699. }
  9700. #ifdef MNG_SUPPORT_TRACE
  9701. MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8_A1, MNG_LC_END);
  9702. #endif
  9703. /* we've got one more row of alpha-samples */
  9704. return mng_next_jpeg_alpharow (pData);
  9705. }
  9706. /* ************************************************************************** */
  9707. mng_retcode mng_store_jpeg_g8_a2 (mng_datap pData)
  9708. {
  9709. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9710. mng_uint8p pWorkrow;
  9711. mng_uint8p pOutrow;
  9712. mng_int32 iX;
  9713. mng_uint8 iB;
  9714. mng_uint8 iM;
  9715. mng_uint32 iS;
  9716. #ifdef MNG_SUPPORT_TRACE
  9717. MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8_A2, MNG_LC_START);
  9718. #endif
  9719. /* temporary work pointers */
  9720. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  9721. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  9722. (pData->iCol * pBuf->iSamplesize) + 1;
  9723. iM = 0; /* start at pixel 0 */
  9724. iB = 0;
  9725. iS = 0;
  9726. #ifdef MNG_DECREMENT_LOOPS
  9727. for (iX = pData->iRowsamples; iX > 0; iX--)
  9728. #else
  9729. for (iX = 0; iX < pData->iRowsamples; iX++)
  9730. #endif
  9731. {
  9732. if (!iM) /* mask underflow ? */
  9733. {
  9734. iB = *pWorkrow; /* get next input-byte */
  9735. pWorkrow++;
  9736. iM = 0xC0;
  9737. iS = 6;
  9738. }
  9739. #ifdef MNG_OPTIMIZE_FOOTPRINT_SWITCH
  9740. {
  9741. const mng_uint8 alpha_level[4] = { 0x00, 0x55, 0xAA, 0xFF};
  9742. *pOutrow = alpha_level[((iB & iM) >> iS)] ;
  9743. }
  9744. #else
  9745. switch ((iB & iM) >> iS) /* determine the alpha level */
  9746. {
  9747. case 0x03 : { *pOutrow = 0xFF; break; }
  9748. case 0x02 : { *pOutrow = 0xAA; break; }
  9749. case 0x01 : { *pOutrow = 0x55; break; }
  9750. default : { *pOutrow = 0x00; }
  9751. }
  9752. #endif
  9753. pOutrow += 2; /* next pixel */
  9754. iM >>= 2;
  9755. iS -= 2;
  9756. }
  9757. #ifdef MNG_SUPPORT_TRACE
  9758. MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8_A2, MNG_LC_END);
  9759. #endif
  9760. /* we've got one more row of alpha-samples */
  9761. return mng_next_jpeg_alpharow (pData);
  9762. }
  9763. /* ************************************************************************** */
  9764. mng_retcode mng_store_jpeg_g8_a4 (mng_datap pData)
  9765. {
  9766. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9767. mng_uint8p pWorkrow;
  9768. mng_uint8p pOutrow;
  9769. mng_int32 iX;
  9770. mng_uint8 iB;
  9771. mng_uint8 iM;
  9772. mng_uint32 iS;
  9773. mng_uint8 iQ;
  9774. #ifdef MNG_SUPPORT_TRACE
  9775. MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8_A4, MNG_LC_START);
  9776. #endif
  9777. /* temporary work pointers */
  9778. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  9779. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  9780. (pData->iCol * pBuf->iSamplesize) + 1;
  9781. iM = 0; /* start at pixel 0 */
  9782. iB = 0;
  9783. iS = 0;
  9784. #ifdef MNG_DECREMENT_LOOPS
  9785. for (iX = pData->iRowsamples; iX > 0; iX--)
  9786. #else
  9787. for (iX = 0; iX < pData->iRowsamples; iX++)
  9788. #endif
  9789. {
  9790. if (!iM) /* mask underflow ? */
  9791. {
  9792. iB = *pWorkrow; /* get next input-byte */
  9793. pWorkrow++;
  9794. iM = 0xF0;
  9795. iS = 4;
  9796. }
  9797. /* get the alpha level */
  9798. iQ = (mng_uint8)((iB & iM) >> iS);
  9799. iQ = (mng_uint8)(iQ + (iQ << 4)); /* expand to 8-bit by replication */
  9800. *pOutrow = iQ; /* put in object buffer */
  9801. pOutrow += 2; /* next pixel */
  9802. iM >>= 4;
  9803. iS -= 4;
  9804. }
  9805. #ifdef MNG_SUPPORT_TRACE
  9806. MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8_A4, MNG_LC_END);
  9807. #endif
  9808. /* we've got one more row of alpha-samples */
  9809. return mng_next_jpeg_alpharow (pData);
  9810. }
  9811. #endif
  9812. /* ************************************************************************** */
  9813. mng_retcode mng_store_jpeg_g8_a8 (mng_datap pData)
  9814. {
  9815. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9816. mng_uint8p pWorkrow;
  9817. mng_uint8p pOutrow;
  9818. mng_int32 iX;
  9819. #ifdef MNG_SUPPORT_TRACE
  9820. MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8_A8, MNG_LC_START);
  9821. #endif
  9822. /* temporary work pointers */
  9823. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  9824. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  9825. (pData->iCol * pBuf->iSamplesize) + 1;
  9826. #ifdef MNG_DECREMENT_LOOPS
  9827. for (iX = pData->iRowsamples; iX > 0; iX--)
  9828. #else
  9829. for (iX = 0; iX < pData->iRowsamples; iX++)
  9830. #endif
  9831. {
  9832. *pOutrow = *pWorkrow; /* put in object buffer */
  9833. pOutrow += 2; /* next pixel */
  9834. pWorkrow++;
  9835. }
  9836. #ifdef MNG_SUPPORT_TRACE
  9837. MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8_A8, MNG_LC_END);
  9838. #endif
  9839. /* we've got one more row of alpha-samples */
  9840. return mng_next_jpeg_alpharow (pData);
  9841. }
  9842. /* ************************************************************************** */
  9843. #ifndef MNG_NO_16BIT_SUPPORT
  9844. mng_retcode mng_store_jpeg_g8_a16 (mng_datap pData)
  9845. {
  9846. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9847. mng_uint8p pWorkrow;
  9848. mng_uint8p pOutrow;
  9849. mng_int32 iX;
  9850. #ifdef MNG_SUPPORT_TRACE
  9851. MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8_A16, MNG_LC_START);
  9852. #endif
  9853. /* temporary work pointers */
  9854. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  9855. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  9856. (pData->iCol * pBuf->iSamplesize) + 1;
  9857. #ifdef MNG_DECREMENT_LOOPS
  9858. for (iX = pData->iRowsamples; iX > 0; iX--)
  9859. #else
  9860. for (iX = 0; iX < pData->iRowsamples; iX++)
  9861. #endif
  9862. {
  9863. *pOutrow = *pWorkrow; /* only high-order byte! */
  9864. pOutrow += 2; /* next pixel */
  9865. pWorkrow += 2;
  9866. }
  9867. #ifdef MNG_SUPPORT_TRACE
  9868. MNG_TRACE (pData, MNG_FN_STORE_JPEG_G8_A16, MNG_LC_END);
  9869. #endif
  9870. /* we've got one more row of alpha-samples */
  9871. return mng_next_jpeg_alpharow (pData);
  9872. }
  9873. #endif
  9874. /* ************************************************************************** */
  9875. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  9876. mng_retcode mng_store_jpeg_rgb8_a1 (mng_datap pData)
  9877. {
  9878. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9879. mng_uint8p pWorkrow;
  9880. mng_uint8p pOutrow;
  9881. mng_int32 iX;
  9882. mng_uint8 iB;
  9883. mng_uint8 iM;
  9884. #ifdef MNG_SUPPORT_TRACE
  9885. MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8_A1, MNG_LC_START);
  9886. #endif
  9887. /* temporary work pointers */
  9888. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  9889. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  9890. (pData->iCol * pBuf->iSamplesize) + 3;
  9891. iM = 0; /* start at pixel 0 */
  9892. iB = 0;
  9893. #ifdef MNG_DECREMENT_LOOPS
  9894. for (iX = pData->iRowsamples; iX > 0; iX--)
  9895. #else
  9896. for (iX = 0; iX < pData->iRowsamples; iX++)
  9897. #endif
  9898. {
  9899. if (!iM) /* mask underflow ? */
  9900. {
  9901. iB = *pWorkrow; /* get next input-byte */
  9902. pWorkrow++;
  9903. iM = 0x80;
  9904. }
  9905. if (iB & iM) /* is it opaque ? */
  9906. *pOutrow = 0xFF; /* opaque */
  9907. else
  9908. *pOutrow = 0x00; /* transparent */
  9909. pOutrow += 4; /* next pixel */
  9910. iM >>= 1;
  9911. }
  9912. #ifdef MNG_SUPPORT_TRACE
  9913. MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8_A1, MNG_LC_END);
  9914. #endif
  9915. /* we've got one more row of alpha-samples */
  9916. return mng_next_jpeg_alpharow (pData);
  9917. }
  9918. /* ************************************************************************** */
  9919. mng_retcode mng_store_jpeg_rgb8_a2 (mng_datap pData)
  9920. {
  9921. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9922. mng_uint8p pWorkrow;
  9923. mng_uint8p pOutrow;
  9924. mng_int32 iX;
  9925. mng_uint8 iB;
  9926. mng_uint8 iM;
  9927. mng_uint32 iS;
  9928. #ifdef MNG_SUPPORT_TRACE
  9929. MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8_A2, MNG_LC_START);
  9930. #endif
  9931. /* temporary work pointers */
  9932. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  9933. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  9934. (pData->iCol * pBuf->iSamplesize) + 3;
  9935. iM = 0; /* start at pixel 0 */
  9936. iB = 0;
  9937. iS = 0;
  9938. #ifdef MNG_DECREMENT_LOOPS
  9939. for (iX = pData->iRowsamples; iX > 0; iX--)
  9940. #else
  9941. for (iX = 0; iX < pData->iRowsamples; iX++)
  9942. #endif
  9943. {
  9944. if (!iM) /* mask underflow ? */
  9945. {
  9946. iB = *pWorkrow; /* get next input-byte */
  9947. pWorkrow++;
  9948. iM = 0xC0;
  9949. iS = 6;
  9950. }
  9951. #ifdef MNG_OPTIMIZE_FOOTPRINT_SWITCH
  9952. {
  9953. const mng_uint8 alpha_level[4] = { 0x00, 0x55, 0xAA, 0xFF};
  9954. *pOutrow = alpha_level[((iB & iM) >> iS)] ;
  9955. }
  9956. #else
  9957. switch ((iB & iM) >> iS) /* determine the alpha level */
  9958. {
  9959. case 0x03 : { *pOutrow = 0xFF; break; }
  9960. case 0x02 : { *pOutrow = 0xAA; break; }
  9961. case 0x01 : { *pOutrow = 0x55; break; }
  9962. default : { *pOutrow = 0x00; }
  9963. }
  9964. #endif
  9965. pOutrow += 4; /* next pixel */
  9966. iM >>= 2;
  9967. iS -= 2;
  9968. }
  9969. #ifdef MNG_SUPPORT_TRACE
  9970. MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8_A2, MNG_LC_END);
  9971. #endif
  9972. /* we've got one more row of alpha-samples */
  9973. return mng_next_jpeg_alpharow (pData);
  9974. }
  9975. /* ************************************************************************** */
  9976. mng_retcode mng_store_jpeg_rgb8_a4 (mng_datap pData)
  9977. {
  9978. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  9979. mng_uint8p pWorkrow;
  9980. mng_uint8p pOutrow;
  9981. mng_int32 iX;
  9982. mng_uint8 iB;
  9983. mng_uint8 iM;
  9984. mng_uint32 iS;
  9985. mng_uint8 iQ;
  9986. #ifdef MNG_SUPPORT_TRACE
  9987. MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8_A4, MNG_LC_START);
  9988. #endif
  9989. /* temporary work pointers */
  9990. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  9991. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  9992. (pData->iCol * pBuf->iSamplesize) + 3;
  9993. iM = 0; /* start at pixel 0 */
  9994. iB = 0;
  9995. iS = 0;
  9996. #ifdef MNG_DECREMENT_LOOPS
  9997. for (iX = pData->iRowsamples; iX > 0; iX--)
  9998. #else
  9999. for (iX = 0; iX < pData->iRowsamples; iX++)
  10000. #endif
  10001. {
  10002. if (!iM) /* mask underflow ? */
  10003. {
  10004. iB = *pWorkrow; /* get next input-byte */
  10005. pWorkrow++;
  10006. iM = 0xF0;
  10007. iS = 4;
  10008. }
  10009. /* get the alpha level */
  10010. iQ = (mng_uint8)((iB & iM) >> iS);
  10011. iQ = (mng_uint8)(iQ + (iQ << 4)); /* expand to 8-bit by replication */
  10012. *pOutrow = iQ; /* put in object buffer */
  10013. pOutrow += 4; /* next pixel */
  10014. iM >>= 4;
  10015. iS -= 4;
  10016. }
  10017. #ifdef MNG_SUPPORT_TRACE
  10018. MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8_A4, MNG_LC_END);
  10019. #endif
  10020. /* we've got one more row of alpha-samples */
  10021. return mng_next_jpeg_alpharow (pData);
  10022. }
  10023. #endif
  10024. /* ************************************************************************** */
  10025. mng_retcode mng_store_jpeg_rgb8_a8 (mng_datap pData)
  10026. {
  10027. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  10028. mng_uint8p pWorkrow;
  10029. mng_uint8p pOutrow;
  10030. mng_int32 iX;
  10031. #ifdef MNG_SUPPORT_TRACE
  10032. MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8_A8, MNG_LC_START);
  10033. #endif
  10034. /* temporary work pointers */
  10035. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  10036. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  10037. (pData->iCol * pBuf->iSamplesize) + 3;
  10038. #ifdef MNG_DECREMENT_LOOPS
  10039. for (iX = pData->iRowsamples; iX > 0; iX--)
  10040. #else
  10041. for (iX = 0; iX < pData->iRowsamples; iX++)
  10042. #endif
  10043. {
  10044. *pOutrow = *pWorkrow; /* put in buffer */
  10045. pOutrow += 4; /* next pixel */
  10046. pWorkrow++;
  10047. }
  10048. #ifdef MNG_SUPPORT_TRACE
  10049. MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8_A8, MNG_LC_END);
  10050. #endif
  10051. /* we've got one more row of alpha-samples */
  10052. return mng_next_jpeg_alpharow (pData);
  10053. }
  10054. /* ************************************************************************** */
  10055. #ifndef MNG_NO_16BIT_SUPPORT
  10056. mng_retcode mng_store_jpeg_rgb8_a16 (mng_datap pData)
  10057. {
  10058. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  10059. mng_uint8p pWorkrow;
  10060. mng_uint8p pOutrow;
  10061. mng_int32 iX;
  10062. #ifdef MNG_SUPPORT_TRACE
  10063. MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8_A16, MNG_LC_START);
  10064. #endif
  10065. /* temporary work pointers */
  10066. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  10067. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  10068. (pData->iCol * pBuf->iSamplesize) + 3;
  10069. #ifdef MNG_DECREMENT_LOOPS
  10070. for (iX = pData->iRowsamples; iX > 0; iX--)
  10071. #else
  10072. for (iX = 0; iX < pData->iRowsamples; iX++)
  10073. #endif
  10074. {
  10075. *pOutrow = *pWorkrow; /* only high-order byte */
  10076. pOutrow += 4; /* next pixel */
  10077. pWorkrow += 2;
  10078. }
  10079. #ifdef MNG_SUPPORT_TRACE
  10080. MNG_TRACE (pData, MNG_FN_STORE_JPEG_RGB8_A16, MNG_LC_END);
  10081. #endif
  10082. /* we've got one more row of alpha-samples */
  10083. return mng_next_jpeg_alpharow (pData);
  10084. }
  10085. #endif
  10086. /* ************************************************************************** */
  10087. #ifdef MNG_SUPPORT_JPEG12
  10088. mng_retcode mng_store_jpeg_g12_a1 (mng_datap pData)
  10089. {
  10090. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  10091. mng_uint8p pWorkrow;
  10092. mng_uint8p pOutrow;
  10093. mng_int32 iX;
  10094. mng_uint8 iB;
  10095. mng_uint8 iM;
  10096. #ifdef MNG_SUPPORT_TRACE
  10097. MNG_TRACE (pData, MNG_FN_STORE_JPEG_G12_A1, MNG_LC_START);
  10098. #endif
  10099. /* temporary work pointers */
  10100. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  10101. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  10102. (pData->iCol * pBuf->iSamplesize) + 2;
  10103. iM = 0; /* start at pixel 0 */
  10104. iB = 0;
  10105. #ifdef MNG_DECREMENT_LOOPS
  10106. for (iX = pData->iRowsamples; iX > 0; iX--)
  10107. #else
  10108. for (iX = 0; iX < pData->iRowsamples; iX++)
  10109. #endif
  10110. {
  10111. if (!iM) /* mask underflow ? */
  10112. {
  10113. iB = *pWorkrow; /* get next input-byte */
  10114. pWorkrow++;
  10115. iM = 0x80;
  10116. }
  10117. if (iB & iM) /* opaque ? */
  10118. mng_put_uint16 (pOutrow, 0xFFFF);/* opaque */
  10119. else
  10120. mng_put_uint16 (pOutrow, 0x0000);/* transparent */
  10121. pOutrow += 4; /* next pixel */
  10122. iM >>= 1;
  10123. }
  10124. #ifdef MNG_SUPPORT_TRACE
  10125. MNG_TRACE (pData, MNG_FN_STORE_JPEG_G12_A1, MNG_LC_END);
  10126. #endif
  10127. /* we've got one more row of alpha-samples */
  10128. return mng_next_jpeg_alpharow (pData);
  10129. }
  10130. #endif /* MNG_SUPPORT_JPEG12 */
  10131. /* ************************************************************************** */
  10132. #ifdef MNG_SUPPORT_JPEG12
  10133. mng_retcode mng_store_jpeg_g12_a2 (mng_datap pData)
  10134. {
  10135. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  10136. mng_uint8p pWorkrow;
  10137. mng_uint8p pOutrow;
  10138. mng_int32 iX;
  10139. mng_uint8 iB;
  10140. mng_uint8 iM;
  10141. mng_uint32 iS;
  10142. #ifdef MNG_SUPPORT_TRACE
  10143. MNG_TRACE (pData, MNG_FN_STORE_JPEG_G12_A2, MNG_LC_START);
  10144. #endif
  10145. /* temporary work pointers */
  10146. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  10147. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  10148. (pData->iCol * pBuf->iSamplesize) + 2;
  10149. iM = 0; /* start at pixel 0 */
  10150. iB = 0;
  10151. iS = 0;
  10152. #ifdef MNG_DECREMENT_LOOPS
  10153. for (iX = pData->iRowsamples; iX > 0; iX--)
  10154. #else
  10155. for (iX = 0; iX < pData->iRowsamples; iX++)
  10156. #endif
  10157. {
  10158. if (!iM) /* mask underflow ? */
  10159. {
  10160. iB = *pWorkrow; /* get next input-byte */
  10161. pWorkrow++;
  10162. iM = 0xC0;
  10163. iS = 6;
  10164. }
  10165. #ifdef MNG_OPTIMIZE_FOOTPRINT_SWITCH
  10166. {
  10167. const mng_uint16 gray_level[4] = { 0x0000, 0x5555, 0xAAAA, 0xFFFF};
  10168. mng_put_uint16 (pOutrow, gray_level[((iB & iM) >> iS)]) ;
  10169. }
  10170. #else
  10171. switch ((iB & iM) >> iS) /* determine the gray level */
  10172. {
  10173. case 0x03 : { mng_put_uint16 (pOutrow, 0xFFFF); break; }
  10174. case 0x02 : { mng_put_uint16 (pOutrow, 0xAAAA); break; }
  10175. case 0x01 : { mng_put_uint16 (pOutrow, 0x5555); break; }
  10176. default : { mng_put_uint16 (pOutrow, 0x0000); }
  10177. }
  10178. #endif
  10179. pOutrow += 4; /* next pixel */
  10180. iM >>= 2;
  10181. iS -= 2;
  10182. }
  10183. #ifdef MNG_SUPPORT_TRACE
  10184. MNG_TRACE (pData, MNG_FN_STORE_JPEG_G12_A2, MNG_LC_END);
  10185. #endif
  10186. /* we've got one more row of alpha-samples */
  10187. return mng_next_jpeg_alpharow (pData);
  10188. }
  10189. #endif /* MNG_SUPPORT_JPEG12 */
  10190. /* ************************************************************************** */
  10191. #ifdef MNG_SUPPORT_JPEG12
  10192. mng_retcode mng_store_jpeg_g12_a4 (mng_datap pData)
  10193. {
  10194. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  10195. mng_uint8p pWorkrow;
  10196. mng_uint8p pOutrow;
  10197. mng_int32 iX;
  10198. mng_uint8 iB;
  10199. mng_uint8 iM;
  10200. mng_uint32 iS;
  10201. mng_uint16 iQ;
  10202. #ifdef MNG_SUPPORT_TRACE
  10203. MNG_TRACE (pData, MNG_FN_STORE_JPEG_G12_A4, MNG_LC_START);
  10204. #endif
  10205. /* temporary work pointers */
  10206. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  10207. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  10208. (pData->iCol * pBuf->iSamplesize) + 2;
  10209. iM = 0; /* start at pixel 0 */
  10210. iB = 0;
  10211. iS = 0;
  10212. #ifdef MNG_DECREMENT_LOOPS
  10213. for (iX = pData->iRowsamples; iX > 0; iX--)
  10214. #else
  10215. for (iX = 0; iX < pData->iRowsamples; iX++)
  10216. #endif
  10217. {
  10218. if (!iM) /* mask underflow ? */
  10219. {
  10220. iB = *pWorkrow; /* get next input-byte */
  10221. pWorkrow++;
  10222. iM = 0xF0;
  10223. iS = 4;
  10224. }
  10225. /* get the gray level */
  10226. iQ = (mng_uint16)((iB & iM) >> iS);
  10227. iQ = (mng_uint16)(iQ + (iQ << 4)); /* expand to 16-bit by replication */
  10228. iQ = (mng_uint16)(iQ + (iQ << 8));
  10229. /* put in object buffer */
  10230. mng_put_uint16 (pOutrow, iQ);
  10231. pOutrow += 4; /* next pixel */
  10232. iM >>= 4;
  10233. iS -= 4;
  10234. }
  10235. #ifdef MNG_SUPPORT_TRACE
  10236. MNG_TRACE (pData, MNG_FN_STORE_JPEG_G12_A4, MNG_LC_END);
  10237. #endif
  10238. /* we've got one more row of alpha-samples */
  10239. return mng_next_jpeg_alpharow (pData);
  10240. }
  10241. #endif /* MNG_SUPPORT_JPEG12 */
  10242. /* ************************************************************************** */
  10243. #ifdef MNG_SUPPORT_JPEG12
  10244. mng_retcode mng_store_jpeg_g12_a8 (mng_datap pData)
  10245. {
  10246. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  10247. mng_uint8p pWorkrow;
  10248. mng_uint8p pOutrow;
  10249. mng_int32 iX;
  10250. mng_uint16 iW;
  10251. #ifdef MNG_SUPPORT_TRACE
  10252. MNG_TRACE (pData, MNG_FN_STORE_JPEG_G12_A8, MNG_LC_START);
  10253. #endif
  10254. /* temporary work pointers */
  10255. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  10256. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  10257. (pData->iCol * pBuf->iSamplesize) + 2;
  10258. #ifdef MNG_DECREMENT_LOOPS
  10259. for (iX = pData->iRowsamples; iX > 0; iX--)
  10260. #else
  10261. for (iX = 0; iX < pData->iRowsamples; iX++)
  10262. #endif
  10263. {
  10264. iW = (mng_uint16)(*pWorkrow); /* get input byte */
  10265. iW = (mng_uint16)(iW + (iW << 8)); /* expand to 16-bit by replication */
  10266. mng_put_uint16 (pOutrow, iW); /* put in object buffer */
  10267. pOutrow += 4; /* next pixel */
  10268. pWorkrow++;
  10269. }
  10270. #ifdef MNG_SUPPORT_TRACE
  10271. MNG_TRACE (pData, MNG_FN_STORE_JPEG_G12_A8, MNG_LC_END);
  10272. #endif
  10273. /* we've got one more row of alpha-samples */
  10274. return mng_next_jpeg_alpharow (pData);
  10275. }
  10276. #endif /* MNG_SUPPORT_JPEG12 */
  10277. /* ************************************************************************** */
  10278. #ifdef MNG_SUPPORT_JPEG12
  10279. #ifndef MNG_NO_16BIT_SUPPORT
  10280. mng_retcode mng_store_jpeg_g12_a16 (mng_datap pData)
  10281. {
  10282. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  10283. mng_uint8p pWorkrow;
  10284. mng_uint8p pOutrow;
  10285. mng_int32 iX;
  10286. #ifdef MNG_SUPPORT_TRACE
  10287. MNG_TRACE (pData, MNG_FN_STORE_JPEG_G12_A16, MNG_LC_START);
  10288. #endif
  10289. /* temporary work pointers */
  10290. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  10291. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  10292. (pData->iCol * pBuf->iSamplesize) + 2;
  10293. #ifdef MNG_DECREMENT_LOOPS
  10294. for (iX = pData->iRowsamples; iX > 0; iX--)
  10295. #else
  10296. for (iX = 0; iX < pData->iRowsamples; iX++)
  10297. #endif
  10298. { /* copy it */
  10299. mng_put_uint16 (pOutrow, mng_get_uint16 (pWorkrow));
  10300. pOutrow += 4; /* next pixel */
  10301. pWorkrow += 2;
  10302. }
  10303. #ifdef MNG_SUPPORT_TRACE
  10304. MNG_TRACE (pData, MNG_FN_STORE_JPEG_G12_A16, MNG_LC_END);
  10305. #endif
  10306. /* we've got one more row of alpha-samples */
  10307. return mng_next_jpeg_alpharow (pData);
  10308. }
  10309. #endif
  10310. #endif /* MNG_SUPPORT_JPEG12 */
  10311. /* ************************************************************************** */
  10312. #endif /* MNG_INCLUDE_JNG */
  10313. #ifndef MNG_NO_DELTA_PNG
  10314. /* ************************************************************************** */
  10315. /* * * */
  10316. /* * Delta-image row routines - apply the processed & uncompressed row-data * */
  10317. /* * onto the target "object" * */
  10318. /* * * */
  10319. /* ************************************************************************** */
  10320. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  10321. mng_retcode mng_delta_g1 (mng_datap pData)
  10322. {
  10323. mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf;
  10324. mng_uint8p pWorkrow;
  10325. mng_uint8p pOutrow;
  10326. mng_int32 iX;
  10327. mng_uint8 iB;
  10328. mng_uint8 iM;
  10329. #ifdef MNG_SUPPORT_TRACE
  10330. MNG_TRACE (pData, MNG_FN_DELTA_G1, MNG_LC_START);
  10331. #endif
  10332. /* temporary work pointers */
  10333. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  10334. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  10335. (pData->iDeltaBlocky * pBuf->iRowsize ) +
  10336. (pData->iCol * pBuf->iSamplesize) +
  10337. (pData->iDeltaBlockx * pBuf->iSamplesize);
  10338. iM = 0; /* start at pixel 0 */
  10339. iB = 0;
  10340. /* pixel replace ? */
  10341. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE)
  10342. {
  10343. #ifdef MNG_DECREMENT_LOOPS
  10344. for (iX = pData->iRowsamples; iX > 0; iX--)
  10345. #else
  10346. for (iX = 0; iX < pData->iRowsamples; iX++)
  10347. #endif
  10348. {
  10349. if (!iM) /* mask underflow ? */
  10350. {
  10351. iB = *pWorkrow; /* get next input-byte */
  10352. pWorkrow++;
  10353. iM = 0x80;
  10354. }
  10355. if (iB & iM) /* is it white ? */
  10356. *pOutrow = 0xFF; /* white */
  10357. else
  10358. *pOutrow = 0x00; /* black */
  10359. pOutrow += pData->iColinc; /* next pixel */
  10360. iM >>= 1;
  10361. }
  10362. }
  10363. else
  10364. { /* pixel add ! */
  10365. #ifdef MNG_DECREMENT_LOOPS
  10366. for (iX = pData->iRowsamples; iX > 0; iX--)
  10367. #else
  10368. for (iX = 0; iX < pData->iRowsamples; iX++)
  10369. #endif
  10370. {
  10371. if (!iM) /* mask underflow ? */
  10372. {
  10373. iB = *pWorkrow; /* get next input-byte */
  10374. pWorkrow++;
  10375. iM = 0x80;
  10376. }
  10377. if (iB & iM) /* invert if it is white ? */
  10378. *pOutrow = (mng_uint8)(*pOutrow ^ 0xFF);
  10379. pOutrow += pData->iColinc; /* next pixel */
  10380. iM >>= 1;
  10381. }
  10382. }
  10383. #ifdef MNG_SUPPORT_TRACE
  10384. MNG_TRACE (pData, MNG_FN_DELTA_G1, MNG_LC_END);
  10385. #endif
  10386. return mng_store_g1 (pData);
  10387. }
  10388. /* ************************************************************************** */
  10389. mng_retcode mng_delta_g2 (mng_datap pData)
  10390. {
  10391. mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf;
  10392. mng_uint8p pWorkrow;
  10393. mng_uint8p pOutrow;
  10394. mng_int32 iX;
  10395. mng_uint8 iB;
  10396. mng_uint8 iM;
  10397. mng_uint32 iS;
  10398. #ifdef MNG_OPTIMIZE_FOOTPRINT_SWITCH
  10399. const mng_uint8 level[4] = { 0x00, 0x55, 0xAA, 0xFF};
  10400. #endif
  10401. #ifdef MNG_SUPPORT_TRACE
  10402. MNG_TRACE (pData, MNG_FN_DELTA_G2, MNG_LC_START);
  10403. #endif
  10404. /* temporary work pointers */
  10405. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  10406. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  10407. (pData->iDeltaBlocky * pBuf->iRowsize ) +
  10408. (pData->iCol * pBuf->iSamplesize) +
  10409. (pData->iDeltaBlockx * pBuf->iSamplesize);
  10410. iM = 0; /* start at pixel 0 */
  10411. iB = 0;
  10412. iS = 0;
  10413. /* pixel replace ? */
  10414. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE)
  10415. {
  10416. #ifdef MNG_DECREMENT_LOOPS
  10417. for (iX = pData->iRowsamples; iX > 0; iX--)
  10418. #else
  10419. for (iX = 0; iX < pData->iRowsamples; iX++)
  10420. #endif
  10421. {
  10422. if (!iM) /* mask underflow ? */
  10423. {
  10424. iB = *pWorkrow; /* get next input-byte */
  10425. pWorkrow++;
  10426. iM = 0xC0;
  10427. iS = 6;
  10428. }
  10429. #ifdef MNG_OPTIMIZE_FOOTPRINT_SWITCH
  10430. *pOutrow = level[((iB & iM) >> iS)] ;
  10431. #else
  10432. switch ((iB & iM) >> iS) /* determine the alpha level */
  10433. {
  10434. case 0x03 : { *pOutrow = 0xFF; break; }
  10435. case 0x02 : { *pOutrow = 0xAA; break; }
  10436. case 0x01 : { *pOutrow = 0x55; break; }
  10437. default : { *pOutrow = 0x00; }
  10438. }
  10439. #endif
  10440. pOutrow += pData->iColinc; /* next pixel */
  10441. iM >>= 2;
  10442. iS -= 2;
  10443. }
  10444. }
  10445. else
  10446. { /* pixel add ! */
  10447. #ifdef MNG_DECREMENT_LOOPS
  10448. for (iX = pData->iRowsamples; iX > 0; iX--)
  10449. #else
  10450. for (iX = 0; iX < pData->iRowsamples; iX++)
  10451. #endif
  10452. {
  10453. if (!iM) /* mask underflow ? */
  10454. {
  10455. iB = *pWorkrow; /* get next input-byte */
  10456. pWorkrow++;
  10457. iM = 0xC0;
  10458. iS = 6;
  10459. }
  10460. #ifdef MNG_OPTIMIZE_FOOTPRINT_SWITCH
  10461. *pOutrow = level[((*pOutrow >> 6) + ((iB & iM) >> iS)) & 0x03] ;
  10462. #else
  10463. switch (((*pOutrow >> 6) + ((iB & iM) >> iS)) & 0x03)
  10464. {
  10465. case 0x03 : { *pOutrow = 0xFF; break; }
  10466. case 0x02 : { *pOutrow = 0xAA; break; }
  10467. case 0x01 : { *pOutrow = 0x55; break; }
  10468. default : { *pOutrow = 0x00; }
  10469. }
  10470. #endif
  10471. pOutrow += pData->iColinc; /* next pixel */
  10472. iM >>= 2;
  10473. iS -= 2;
  10474. }
  10475. }
  10476. #ifdef MNG_SUPPORT_TRACE
  10477. MNG_TRACE (pData, MNG_FN_DELTA_G2, MNG_LC_END);
  10478. #endif
  10479. return mng_store_g2 (pData);
  10480. }
  10481. /* ************************************************************************** */
  10482. mng_retcode mng_delta_g4 (mng_datap pData)
  10483. {
  10484. mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf;
  10485. mng_uint8p pWorkrow;
  10486. mng_uint8p pOutrow;
  10487. mng_int32 iX;
  10488. mng_uint8 iB;
  10489. mng_uint8 iM;
  10490. mng_uint32 iS;
  10491. mng_uint8 iQ;
  10492. #ifdef MNG_SUPPORT_TRACE
  10493. MNG_TRACE (pData, MNG_FN_DELTA_G4, MNG_LC_START);
  10494. #endif
  10495. /* temporary work pointers */
  10496. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  10497. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  10498. (pData->iDeltaBlocky * pBuf->iRowsize ) +
  10499. (pData->iCol * pBuf->iSamplesize) +
  10500. (pData->iDeltaBlockx * pBuf->iSamplesize);
  10501. iM = 0; /* start at pixel 0 */
  10502. iB = 0;
  10503. iS = 0;
  10504. /* pixel replace ? */
  10505. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE)
  10506. {
  10507. #ifdef MNG_DECREMENT_LOOPS
  10508. for (iX = pData->iRowsamples; iX > 0; iX--)
  10509. #else
  10510. for (iX = 0; iX < pData->iRowsamples; iX++)
  10511. #endif
  10512. {
  10513. if (!iM) /* mask underflow ? */
  10514. {
  10515. iB = *pWorkrow; /* get next input-byte */
  10516. pWorkrow++;
  10517. iM = 0xF0;
  10518. iS = 4;
  10519. }
  10520. /* get the gray level */
  10521. iQ = (mng_uint8)((iB & iM) >> iS);
  10522. /* expand to 8-bit by replication */
  10523. iQ = (mng_uint8)(iQ + (iQ << 4));
  10524. *pOutrow = iQ; /* put in object buffer */
  10525. pOutrow += pData->iColinc; /* next pixel */
  10526. iM >>= 4;
  10527. iS -= 4;
  10528. }
  10529. }
  10530. else
  10531. { /* pixel add ! */
  10532. #ifdef MNG_DECREMENT_LOOPS
  10533. for (iX = pData->iRowsamples; iX > 0; iX--)
  10534. #else
  10535. for (iX = 0; iX < pData->iRowsamples; iX++)
  10536. #endif
  10537. {
  10538. if (!iM) /* mask underflow ? */
  10539. {
  10540. iB = *pWorkrow; /* get next input-byte */
  10541. pWorkrow++;
  10542. iM = 0xF0;
  10543. iS = 4;
  10544. }
  10545. /* get the gray level */
  10546. iQ = (mng_uint8)(((*pOutrow >> 4) + ((iB & iM) >> iS)) & 0x0F);
  10547. /* expand to 8-bit by replication */
  10548. iQ = (mng_uint8)(iQ + (iQ << 4));
  10549. *pOutrow = iQ; /* put in object buffer */
  10550. pOutrow += pData->iColinc; /* next pixel */
  10551. iM >>= 4;
  10552. iS -= 4;
  10553. }
  10554. }
  10555. #ifdef MNG_SUPPORT_TRACE
  10556. MNG_TRACE (pData, MNG_FN_DELTA_G4, MNG_LC_END);
  10557. #endif
  10558. return mng_store_g4 (pData);
  10559. }
  10560. #endif /* MNG_NO_1_2_4BIT_SUPPORT */
  10561. /* ************************************************************************** */
  10562. mng_retcode mng_delta_g8 (mng_datap pData)
  10563. {
  10564. mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf;
  10565. mng_uint8p pWorkrow;
  10566. mng_uint8p pOutrow;
  10567. mng_int32 iX;
  10568. #ifdef MNG_SUPPORT_TRACE
  10569. MNG_TRACE (pData, MNG_FN_DELTA_G8, MNG_LC_START);
  10570. #endif
  10571. /* temporary work pointers */
  10572. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  10573. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  10574. (pData->iDeltaBlocky * pBuf->iRowsize ) +
  10575. (pData->iCol * pBuf->iSamplesize) +
  10576. (pData->iDeltaBlockx * pBuf->iSamplesize);
  10577. /* pixel replace ? */
  10578. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE)
  10579. {
  10580. #ifdef MNG_DECREMENT_LOOPS
  10581. for (iX = pData->iRowsamples; iX > 0; iX--)
  10582. #else
  10583. for (iX = 0; iX < pData->iRowsamples; iX++)
  10584. #endif
  10585. {
  10586. *pOutrow = *pWorkrow; /* put in object buffer */
  10587. pOutrow += pData->iColinc; /* next pixel */
  10588. pWorkrow++;
  10589. }
  10590. }
  10591. else
  10592. { /* pixel add ! */
  10593. #ifdef MNG_DECREMENT_LOOPS
  10594. for (iX = pData->iRowsamples; iX > 0; iX--)
  10595. #else
  10596. for (iX = 0; iX < pData->iRowsamples; iX++)
  10597. #endif
  10598. { /* add to object buffer */
  10599. *pOutrow = (mng_uint8)(*pOutrow + *pWorkrow);
  10600. pOutrow += pData->iColinc; /* next pixel */
  10601. pWorkrow++;
  10602. }
  10603. }
  10604. #ifdef MNG_SUPPORT_TRACE
  10605. MNG_TRACE (pData, MNG_FN_DELTA_G8, MNG_LC_END);
  10606. #endif
  10607. return mng_store_g8 (pData);
  10608. }
  10609. /* ************************************************************************** */
  10610. #ifndef MNG_NO_16BIT_SUPPORT
  10611. mng_retcode mng_delta_g16 (mng_datap pData)
  10612. {
  10613. mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf;
  10614. mng_uint8p pWorkrow;
  10615. mng_uint8p pOutrow;
  10616. mng_int32 iX;
  10617. #ifdef MNG_SUPPORT_TRACE
  10618. MNG_TRACE (pData, MNG_FN_DELTA_G16, MNG_LC_START);
  10619. #endif
  10620. /* temporary work pointers */
  10621. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  10622. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  10623. (pData->iDeltaBlocky * pBuf->iRowsize ) +
  10624. (pData->iCol * pBuf->iSamplesize) +
  10625. (pData->iDeltaBlockx * pBuf->iSamplesize);
  10626. /* pixel replace ? */
  10627. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE)
  10628. {
  10629. #ifdef MNG_DECREMENT_LOOPS
  10630. for (iX = pData->iRowsamples; iX > 0; iX--)
  10631. #else
  10632. for (iX = 0; iX < pData->iRowsamples; iX++)
  10633. #endif
  10634. {
  10635. *pOutrow = *pWorkrow; /* put in object buffer */
  10636. *(pOutrow+1) = *(pWorkrow+1);
  10637. /* next pixel */
  10638. pOutrow += (pData->iColinc << 1);
  10639. pWorkrow += 2;
  10640. }
  10641. }
  10642. else
  10643. { /* pixel add ! */
  10644. #ifdef MNG_DECREMENT_LOOPS
  10645. for (iX = pData->iRowsamples; iX > 0; iX--)
  10646. #else
  10647. for (iX = 0; iX < pData->iRowsamples; iX++)
  10648. #endif
  10649. { /* add to object buffer */
  10650. mng_put_uint16 (pOutrow, (mng_uint16)(mng_get_uint16 (pOutrow ) +
  10651. mng_get_uint16 (pWorkrow) ));
  10652. /* next pixel */
  10653. pOutrow += (pData->iColinc << 1);
  10654. pWorkrow += 2;
  10655. }
  10656. }
  10657. #ifdef MNG_SUPPORT_TRACE
  10658. MNG_TRACE (pData, MNG_FN_DELTA_G16, MNG_LC_END);
  10659. #endif
  10660. return mng_store_g16 (pData);
  10661. }
  10662. #endif
  10663. /* ************************************************************************** */
  10664. mng_retcode mng_delta_rgb8 (mng_datap pData)
  10665. {
  10666. mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf;
  10667. mng_uint8p pWorkrow;
  10668. mng_uint8p pOutrow;
  10669. mng_int32 iX;
  10670. #ifdef MNG_SUPPORT_TRACE
  10671. MNG_TRACE (pData, MNG_FN_DELTA_RGB8, MNG_LC_START);
  10672. #endif
  10673. /* temporary work pointers */
  10674. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  10675. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  10676. (pData->iDeltaBlocky * pBuf->iRowsize ) +
  10677. (pData->iCol * pBuf->iSamplesize) +
  10678. (pData->iDeltaBlockx * pBuf->iSamplesize);
  10679. /* pixel replace ? */
  10680. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE)
  10681. {
  10682. #ifdef MNG_DECREMENT_LOOPS
  10683. for (iX = pData->iRowsamples; iX > 0; iX--)
  10684. #else
  10685. for (iX = 0; iX < pData->iRowsamples; iX++)
  10686. #endif
  10687. {
  10688. *pOutrow = *pWorkrow; /* put in object buffer */
  10689. *(pOutrow+1) = *(pWorkrow+1);
  10690. *(pOutrow+2) = *(pWorkrow+2);
  10691. /* next pixel */
  10692. pOutrow += (pData->iColinc * 3);
  10693. pWorkrow += 3;
  10694. }
  10695. }
  10696. else
  10697. { /* pixel add ! */
  10698. #ifdef MNG_DECREMENT_LOOPS
  10699. for (iX = pData->iRowsamples; iX > 0; iX--)
  10700. #else
  10701. for (iX = 0; iX < pData->iRowsamples; iX++)
  10702. #endif
  10703. { /* add to object buffer */
  10704. *pOutrow = (mng_uint8)(*pOutrow + *pWorkrow );
  10705. *(pOutrow+1) = (mng_uint8)(*(pOutrow+1) + *(pWorkrow+1));
  10706. *(pOutrow+2) = (mng_uint8)(*(pOutrow+2) + *(pWorkrow+2));
  10707. /* next pixel */
  10708. pOutrow += (pData->iColinc * 3);
  10709. pWorkrow += 3;
  10710. }
  10711. }
  10712. #ifdef MNG_SUPPORT_TRACE
  10713. MNG_TRACE (pData, MNG_FN_DELTA_RGB8, MNG_LC_END);
  10714. #endif
  10715. return mng_store_rgb8 (pData);
  10716. }
  10717. /* ************************************************************************** */
  10718. #ifndef MNG_NO_16BIT_SUPPORT
  10719. mng_retcode mng_delta_rgb16 (mng_datap pData)
  10720. {
  10721. mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf;
  10722. mng_uint8p pWorkrow;
  10723. mng_uint8p pOutrow;
  10724. mng_int32 iX;
  10725. #ifdef MNG_SUPPORT_TRACE
  10726. MNG_TRACE (pData, MNG_FN_DELTA_RGB16, MNG_LC_START);
  10727. #endif
  10728. /* temporary work pointers */
  10729. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  10730. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  10731. (pData->iDeltaBlocky * pBuf->iRowsize ) +
  10732. (pData->iCol * pBuf->iSamplesize) +
  10733. (pData->iDeltaBlockx * pBuf->iSamplesize);
  10734. /* pixel replace ? */
  10735. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE)
  10736. {
  10737. #ifdef MNG_DECREMENT_LOOPS
  10738. for (iX = pData->iRowsamples; iX > 0; iX--)
  10739. #else
  10740. for (iX = 0; iX < pData->iRowsamples; iX++)
  10741. #endif
  10742. {
  10743. *pOutrow = *pWorkrow; /* put in object buffer */
  10744. *(pOutrow+1) = *(pWorkrow+1);
  10745. *(pOutrow+2) = *(pWorkrow+2);
  10746. *(pOutrow+3) = *(pWorkrow+3);
  10747. *(pOutrow+4) = *(pWorkrow+4);
  10748. *(pOutrow+5) = *(pWorkrow+5);
  10749. /* next pixel */
  10750. pOutrow += (pData->iColinc * 6);
  10751. pWorkrow += 6;
  10752. }
  10753. }
  10754. else
  10755. { /* pixel add ! */
  10756. #ifdef MNG_DECREMENT_LOOPS
  10757. for (iX = pData->iRowsamples; iX > 0; iX--)
  10758. #else
  10759. for (iX = 0; iX < pData->iRowsamples; iX++)
  10760. #endif
  10761. { /* add to object buffer */
  10762. mng_put_uint16 (pOutrow, (mng_uint16)(mng_get_uint16 (pOutrow ) +
  10763. mng_get_uint16 (pWorkrow ) ));
  10764. mng_put_uint16 (pOutrow+2, (mng_uint16)(mng_get_uint16 (pOutrow+2 ) +
  10765. mng_get_uint16 (pWorkrow+2) ));
  10766. mng_put_uint16 (pOutrow+4, (mng_uint16)(mng_get_uint16 (pOutrow+4 ) +
  10767. mng_get_uint16 (pWorkrow+4) ));
  10768. /* next pixel */
  10769. pOutrow += (pData->iColinc * 6);
  10770. pWorkrow += 6;
  10771. }
  10772. }
  10773. #ifdef MNG_SUPPORT_TRACE
  10774. MNG_TRACE (pData, MNG_FN_DELTA_RGB16, MNG_LC_END);
  10775. #endif
  10776. return mng_store_rgb16 (pData);
  10777. }
  10778. #endif
  10779. /* ************************************************************************** */
  10780. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  10781. mng_retcode mng_delta_idx1 (mng_datap pData)
  10782. {
  10783. mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf;
  10784. mng_uint8p pWorkrow;
  10785. mng_uint8p pOutrow;
  10786. mng_int32 iX;
  10787. mng_uint8 iB;
  10788. mng_uint8 iM;
  10789. #ifdef MNG_SUPPORT_TRACE
  10790. MNG_TRACE (pData, MNG_FN_DELTA_IDX1, MNG_LC_START);
  10791. #endif
  10792. /* temporary work pointers */
  10793. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  10794. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  10795. (pData->iDeltaBlocky * pBuf->iRowsize ) +
  10796. (pData->iCol * pBuf->iSamplesize) +
  10797. (pData->iDeltaBlockx * pBuf->iSamplesize);
  10798. iM = 0; /* start at pixel 0 */
  10799. iB = 0;
  10800. /* pixel replace ? */
  10801. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE)
  10802. {
  10803. #ifdef MNG_DECREMENT_LOOPS
  10804. for (iX = pData->iRowsamples; iX > 0; iX--)
  10805. #else
  10806. for (iX = 0; iX < pData->iRowsamples; iX++)
  10807. #endif
  10808. {
  10809. if (!iM) /* mask underflow ? */
  10810. {
  10811. iB = *pWorkrow; /* get next input-byte */
  10812. pWorkrow++;
  10813. iM = 0x80;
  10814. }
  10815. if (iB & iM) /* put the right index value */
  10816. *pOutrow = 1;
  10817. else
  10818. *pOutrow = 0;
  10819. pOutrow += pData->iColinc; /* next pixel */
  10820. iM >>= 1;
  10821. }
  10822. }
  10823. else
  10824. { /* pixel add ! */
  10825. #ifdef MNG_DECREMENT_LOOPS
  10826. for (iX = pData->iRowsamples; iX > 0; iX--)
  10827. #else
  10828. for (iX = 0; iX < pData->iRowsamples; iX++)
  10829. #endif
  10830. {
  10831. if (!iM) /* mask underflow ? */
  10832. {
  10833. iB = *pWorkrow; /* get next input-byte */
  10834. pWorkrow++;
  10835. iM = 0x80;
  10836. }
  10837. if (iB & iM) /* invert if it is non-zero index */
  10838. *pOutrow = (mng_uint8)(*pOutrow ^ 0x01);
  10839. pOutrow += pData->iColinc; /* next pixel */
  10840. iM >>= 1;
  10841. }
  10842. }
  10843. #ifdef MNG_SUPPORT_TRACE
  10844. MNG_TRACE (pData, MNG_FN_DELTA_IDX1, MNG_LC_END);
  10845. #endif
  10846. return mng_store_idx1 (pData);
  10847. }
  10848. /* ************************************************************************** */
  10849. mng_retcode mng_delta_idx2 (mng_datap pData)
  10850. {
  10851. mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf;
  10852. mng_uint8p pWorkrow;
  10853. mng_uint8p pOutrow;
  10854. mng_int32 iX;
  10855. mng_uint8 iB;
  10856. mng_uint8 iM;
  10857. mng_uint32 iS;
  10858. #ifdef MNG_SUPPORT_TRACE
  10859. MNG_TRACE (pData, MNG_FN_DELTA_IDX2, MNG_LC_START);
  10860. #endif
  10861. /* temporary work pointers */
  10862. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  10863. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  10864. (pData->iDeltaBlocky * pBuf->iRowsize ) +
  10865. (pData->iCol * pBuf->iSamplesize) +
  10866. (pData->iDeltaBlockx * pBuf->iSamplesize);
  10867. iM = 0; /* start at pixel 0 */
  10868. iB = 0;
  10869. iS = 0;
  10870. /* pixel replace ? */
  10871. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE)
  10872. {
  10873. #ifdef MNG_DECREMENT_LOOPS
  10874. for (iX = pData->iRowsamples; iX > 0; iX--)
  10875. #else
  10876. for (iX = 0; iX < pData->iRowsamples; iX++)
  10877. #endif
  10878. {
  10879. if (!iM) /* mask underflow ? */
  10880. {
  10881. iB = *pWorkrow; /* get next input-byte */
  10882. pWorkrow++;
  10883. iM = 0xC0;
  10884. iS = 6;
  10885. }
  10886. /* put the index */
  10887. *pOutrow = (mng_uint8)((iB & iM) >> iS);
  10888. pOutrow += pData->iColinc; /* next pixel */
  10889. iM >>= 2;
  10890. iS -= 2;
  10891. }
  10892. }
  10893. else
  10894. { /* pixel add ! */
  10895. #ifdef MNG_DECREMENT_LOOPS
  10896. for (iX = pData->iRowsamples; iX > 0; iX--)
  10897. #else
  10898. for (iX = 0; iX < pData->iRowsamples; iX++)
  10899. #endif
  10900. {
  10901. if (!iM) /* mask underflow ? */
  10902. {
  10903. iB = *pWorkrow; /* get next input-byte */
  10904. pWorkrow++;
  10905. iM = 0xC0;
  10906. iS = 6;
  10907. }
  10908. /* calculate the index */
  10909. *pOutrow = (mng_uint8)((*pOutrow + ((iB & iM) >> iS)) & 0x03);
  10910. pOutrow += pData->iColinc; /* next pixel */
  10911. iM >>= 2;
  10912. iS -= 2;
  10913. }
  10914. }
  10915. #ifdef MNG_SUPPORT_TRACE
  10916. MNG_TRACE (pData, MNG_FN_DELTA_IDX2, MNG_LC_END);
  10917. #endif
  10918. return mng_store_idx2 (pData);
  10919. }
  10920. /* ************************************************************************** */
  10921. mng_retcode mng_delta_idx4 (mng_datap pData)
  10922. {
  10923. mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf;
  10924. mng_uint8p pWorkrow;
  10925. mng_uint8p pOutrow;
  10926. mng_int32 iX;
  10927. mng_uint8 iB;
  10928. mng_uint8 iM;
  10929. mng_uint32 iS;
  10930. #ifdef MNG_SUPPORT_TRACE
  10931. MNG_TRACE (pData, MNG_FN_DELTA_IDX4, MNG_LC_START);
  10932. #endif
  10933. /* temporary work pointers */
  10934. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  10935. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  10936. (pData->iDeltaBlocky * pBuf->iRowsize ) +
  10937. (pData->iCol * pBuf->iSamplesize) +
  10938. (pData->iDeltaBlockx * pBuf->iSamplesize);
  10939. iM = 0; /* start at pixel 0 */
  10940. iB = 0;
  10941. iS = 0;
  10942. /* pixel replace ? */
  10943. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE)
  10944. {
  10945. #ifdef MNG_DECREMENT_LOOPS
  10946. for (iX = pData->iRowsamples; iX > 0; iX--)
  10947. #else
  10948. for (iX = 0; iX < pData->iRowsamples; iX++)
  10949. #endif
  10950. {
  10951. if (!iM) /* mask underflow ? */
  10952. {
  10953. iB = *pWorkrow; /* get next input-byte */
  10954. pWorkrow++;
  10955. iM = 0xF0;
  10956. iS = 4;
  10957. }
  10958. /* put the index */
  10959. *pOutrow = (mng_uint8)((iB & iM) >> iS);
  10960. pOutrow += pData->iColinc; /* next pixel */
  10961. iM >>= 4;
  10962. iS -= 4;
  10963. }
  10964. }
  10965. else
  10966. { /* pixel add ! */
  10967. #ifdef MNG_DECREMENT_LOOPS
  10968. for (iX = pData->iRowsamples; iX > 0; iX--)
  10969. #else
  10970. for (iX = 0; iX < pData->iRowsamples; iX++)
  10971. #endif
  10972. {
  10973. if (!iM) /* mask underflow ? */
  10974. {
  10975. iB = *pWorkrow; /* get next input-byte */
  10976. pWorkrow++;
  10977. iM = 0xF0;
  10978. iS = 4;
  10979. }
  10980. /* calculate the index */
  10981. *pOutrow = (mng_uint8)((*pOutrow + ((iB & iM) >> iS)) & 0x0F);
  10982. pOutrow += pData->iColinc; /* next pixel */
  10983. iM >>= 4;
  10984. iS -= 4;
  10985. }
  10986. }
  10987. #ifdef MNG_SUPPORT_TRACE
  10988. MNG_TRACE (pData, MNG_FN_DELTA_IDX4, MNG_LC_END);
  10989. #endif
  10990. return mng_store_idx4 (pData);
  10991. }
  10992. #endif
  10993. /* ************************************************************************** */
  10994. mng_retcode mng_delta_idx8 (mng_datap pData)
  10995. {
  10996. mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf;
  10997. mng_uint8p pWorkrow;
  10998. mng_uint8p pOutrow;
  10999. mng_int32 iX;
  11000. #ifdef MNG_SUPPORT_TRACE
  11001. MNG_TRACE (pData, MNG_FN_DELTA_IDX8, MNG_LC_START);
  11002. #endif
  11003. /* temporary work pointers */
  11004. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  11005. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  11006. (pData->iDeltaBlocky * pBuf->iRowsize ) +
  11007. (pData->iCol * pBuf->iSamplesize) +
  11008. (pData->iDeltaBlockx * pBuf->iSamplesize);
  11009. /* pixel replace ? */
  11010. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE)
  11011. {
  11012. #ifdef MNG_DECREMENT_LOOPS
  11013. for (iX = pData->iRowsamples; iX > 0; iX--)
  11014. #else
  11015. for (iX = 0; iX < pData->iRowsamples; iX++)
  11016. #endif
  11017. {
  11018. *pOutrow = *pWorkrow; /* put in object buffer */
  11019. pOutrow += pData->iColinc; /* next pixel */
  11020. pWorkrow++;
  11021. }
  11022. }
  11023. else
  11024. { /* pixel add ! */
  11025. #ifdef MNG_DECREMENT_LOOPS
  11026. for (iX = pData->iRowsamples; iX > 0; iX--)
  11027. #else
  11028. for (iX = 0; iX < pData->iRowsamples; iX++)
  11029. #endif
  11030. { /* add to object buffer */
  11031. *pOutrow = (mng_uint8)(*pOutrow + *pWorkrow);
  11032. pOutrow += pData->iColinc; /* next pixel */
  11033. pWorkrow++;
  11034. }
  11035. }
  11036. #ifdef MNG_SUPPORT_TRACE
  11037. MNG_TRACE (pData, MNG_FN_DELTA_IDX8, MNG_LC_END);
  11038. #endif
  11039. return mng_store_idx8 (pData);
  11040. }
  11041. /* ************************************************************************** */
  11042. mng_retcode mng_delta_ga8 (mng_datap pData)
  11043. {
  11044. mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf;
  11045. mng_uint8p pWorkrow;
  11046. mng_uint8p pOutrow;
  11047. mng_int32 iX;
  11048. #ifdef MNG_SUPPORT_TRACE
  11049. MNG_TRACE (pData, MNG_FN_DELTA_GA8, MNG_LC_START);
  11050. #endif
  11051. /* temporary work pointers */
  11052. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  11053. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  11054. (pData->iDeltaBlocky * pBuf->iRowsize ) +
  11055. (pData->iCol * pBuf->iSamplesize) +
  11056. (pData->iDeltaBlockx * pBuf->iSamplesize);
  11057. /* pixel replace ? */
  11058. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE)
  11059. {
  11060. #ifdef MNG_DECREMENT_LOOPS
  11061. for (iX = pData->iRowsamples; iX > 0; iX--)
  11062. #else
  11063. for (iX = 0; iX < pData->iRowsamples; iX++)
  11064. #endif
  11065. {
  11066. *pOutrow = *pWorkrow; /* put in object buffer */
  11067. *(pOutrow+1) = *(pWorkrow+1);
  11068. /* next pixel */
  11069. pOutrow += (pData->iColinc << 1);
  11070. pWorkrow += 2;
  11071. }
  11072. }
  11073. else
  11074. { /* pixel add ! */
  11075. #ifdef MNG_DECREMENT_LOOPS
  11076. for (iX = pData->iRowsamples; iX > 0; iX--)
  11077. #else
  11078. for (iX = 0; iX < pData->iRowsamples; iX++)
  11079. #endif
  11080. { /* add to object buffer */
  11081. *pOutrow = (mng_uint8)(*pOutrow + *pWorkrow );
  11082. *(pOutrow+1) = (mng_uint8)(*(pOutrow+1) + *(pWorkrow+1));
  11083. /* next pixel */
  11084. pOutrow += (pData->iColinc << 1);
  11085. pWorkrow += 2;
  11086. }
  11087. }
  11088. #ifdef MNG_SUPPORT_TRACE
  11089. MNG_TRACE (pData, MNG_FN_DELTA_GA8, MNG_LC_END);
  11090. #endif
  11091. return mng_store_ga8 (pData);
  11092. }
  11093. /* ************************************************************************** */
  11094. #ifndef MNG_NO_16BIT_SUPPORT
  11095. mng_retcode mng_delta_ga16 (mng_datap pData)
  11096. {
  11097. mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf;
  11098. mng_uint8p pWorkrow;
  11099. mng_uint8p pOutrow;
  11100. mng_int32 iX;
  11101. #ifdef MNG_SUPPORT_TRACE
  11102. MNG_TRACE (pData, MNG_FN_DELTA_GA16, MNG_LC_START);
  11103. #endif
  11104. /* temporary work pointers */
  11105. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  11106. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  11107. (pData->iDeltaBlocky * pBuf->iRowsize ) +
  11108. (pData->iCol * pBuf->iSamplesize) +
  11109. (pData->iDeltaBlockx * pBuf->iSamplesize);
  11110. /* pixel replace ? */
  11111. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE)
  11112. {
  11113. #ifdef MNG_DECREMENT_LOOPS
  11114. for (iX = pData->iRowsamples; iX > 0; iX--)
  11115. #else
  11116. for (iX = 0; iX < pData->iRowsamples; iX++)
  11117. #endif
  11118. {
  11119. *pOutrow = *pWorkrow; /* put in object buffer */
  11120. *(pOutrow+1) = *(pWorkrow+1);
  11121. *(pOutrow+2) = *(pWorkrow+2);
  11122. *(pOutrow+3) = *(pWorkrow+3);
  11123. /* next pixel */
  11124. pOutrow += (pData->iColinc << 2);
  11125. pWorkrow += 4;
  11126. }
  11127. }
  11128. else
  11129. { /* pixel add ! */
  11130. #ifdef MNG_DECREMENT_LOOPS
  11131. for (iX = pData->iRowsamples; iX > 0; iX--)
  11132. #else
  11133. for (iX = 0; iX < pData->iRowsamples; iX++)
  11134. #endif
  11135. { /* add to object buffer */
  11136. mng_put_uint16 (pOutrow, (mng_uint16)(mng_get_uint16 (pOutrow ) +
  11137. mng_get_uint16 (pWorkrow ) ));
  11138. mng_put_uint16 (pOutrow+2, (mng_uint16)(mng_get_uint16 (pOutrow+2 ) +
  11139. mng_get_uint16 (pWorkrow+2) ));
  11140. /* next pixel */
  11141. pOutrow += (pData->iColinc << 2);
  11142. pWorkrow += 4;
  11143. }
  11144. }
  11145. #ifdef MNG_SUPPORT_TRACE
  11146. MNG_TRACE (pData, MNG_FN_DELTA_GA16, MNG_LC_END);
  11147. #endif
  11148. return mng_store_ga16 (pData);
  11149. }
  11150. #endif
  11151. /* ************************************************************************** */
  11152. mng_retcode mng_delta_rgba8 (mng_datap pData)
  11153. {
  11154. mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf;
  11155. mng_uint8p pWorkrow;
  11156. mng_uint8p pOutrow;
  11157. mng_int32 iX;
  11158. #ifdef MNG_SUPPORT_TRACE
  11159. MNG_TRACE (pData, MNG_FN_DELTA_RGBA8, MNG_LC_START);
  11160. #endif
  11161. /* temporary work pointers */
  11162. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  11163. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  11164. (pData->iDeltaBlocky * pBuf->iRowsize ) +
  11165. (pData->iCol * pBuf->iSamplesize) +
  11166. (pData->iDeltaBlockx * pBuf->iSamplesize);
  11167. /* pixel replace ? */
  11168. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE)
  11169. {
  11170. #ifdef MNG_DECREMENT_LOOPS
  11171. for (iX = pData->iRowsamples; iX > 0; iX--)
  11172. #else
  11173. for (iX = 0; iX < pData->iRowsamples; iX++)
  11174. #endif
  11175. {
  11176. *pOutrow = *pWorkrow; /* put in object buffer */
  11177. *(pOutrow+1) = *(pWorkrow+1);
  11178. *(pOutrow+2) = *(pWorkrow+2);
  11179. *(pOutrow+3) = *(pWorkrow+3);
  11180. /* next pixel */
  11181. pOutrow += (pData->iColinc << 2);
  11182. pWorkrow += 4;
  11183. }
  11184. }
  11185. else
  11186. { /* pixel add ! */
  11187. #ifdef MNG_DECREMENT_LOOPS
  11188. for (iX = pData->iRowsamples; iX > 0; iX--)
  11189. #else
  11190. for (iX = 0; iX < pData->iRowsamples; iX++)
  11191. #endif
  11192. { /* add to object buffer */
  11193. *pOutrow = (mng_uint8)(*pOutrow + *pWorkrow );
  11194. *(pOutrow+1) = (mng_uint8)(*(pOutrow+1) + *(pWorkrow+1));
  11195. *(pOutrow+2) = (mng_uint8)(*(pOutrow+2) + *(pWorkrow+2));
  11196. *(pOutrow+3) = (mng_uint8)(*(pOutrow+3) + *(pWorkrow+3));
  11197. /* next pixel */
  11198. pOutrow += (pData->iColinc << 2);
  11199. pWorkrow += 4;
  11200. }
  11201. }
  11202. #ifdef MNG_SUPPORT_TRACE
  11203. MNG_TRACE (pData, MNG_FN_DELTA_RGBA8, MNG_LC_END);
  11204. #endif
  11205. return mng_store_rgba8 (pData);
  11206. }
  11207. /* ************************************************************************** */
  11208. #ifndef MNG_NO_16BIT_SUPPORT
  11209. mng_retcode mng_delta_rgba16 (mng_datap pData)
  11210. {
  11211. mng_imagedatap pBuf = ((mng_imagep)pData->pDeltaImage)->pImgbuf;
  11212. mng_uint8p pWorkrow;
  11213. mng_uint8p pOutrow;
  11214. mng_int32 iX;
  11215. #ifdef MNG_SUPPORT_TRACE
  11216. MNG_TRACE (pData, MNG_FN_DELTA_RGBA16, MNG_LC_START);
  11217. #endif
  11218. /* temporary work pointers */
  11219. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  11220. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  11221. (pData->iDeltaBlocky * pBuf->iRowsize ) +
  11222. (pData->iCol * pBuf->iSamplesize) +
  11223. (pData->iDeltaBlockx * pBuf->iSamplesize);
  11224. /* pixel replace ? */
  11225. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE)
  11226. {
  11227. #ifdef MNG_DECREMENT_LOOPS
  11228. for (iX = pData->iRowsamples; iX > 0; iX--)
  11229. #else
  11230. for (iX = 0; iX < pData->iRowsamples; iX++)
  11231. #endif
  11232. {
  11233. MNG_COPY (pOutrow, pWorkrow, 8); /* put in object buffer */
  11234. /* next pixel */
  11235. pOutrow += (pData->iColinc << 3);
  11236. pWorkrow += 8;
  11237. }
  11238. }
  11239. else
  11240. { /* pixel add ! */
  11241. #ifdef MNG_DECREMENT_LOOPS
  11242. for (iX = pData->iRowsamples; iX > 0; iX--)
  11243. #else
  11244. for (iX = 0; iX < pData->iRowsamples; iX++)
  11245. #endif
  11246. { /* add to object buffer */
  11247. mng_put_uint16 (pOutrow, (mng_uint16)(mng_get_uint16 (pOutrow ) +
  11248. mng_get_uint16 (pWorkrow ) ));
  11249. mng_put_uint16 (pOutrow+2, (mng_uint16)(mng_get_uint16 (pOutrow+2 ) +
  11250. mng_get_uint16 (pWorkrow+2) ));
  11251. mng_put_uint16 (pOutrow+4, (mng_uint16)(mng_get_uint16 (pOutrow+4 ) +
  11252. mng_get_uint16 (pWorkrow+4) ));
  11253. mng_put_uint16 (pOutrow+6, (mng_uint16)(mng_get_uint16 (pOutrow+6 ) +
  11254. mng_get_uint16 (pWorkrow+6) ));
  11255. /* next pixel */
  11256. pOutrow += (pData->iColinc << 3);
  11257. pWorkrow += 8;
  11258. }
  11259. }
  11260. #ifdef MNG_SUPPORT_TRACE
  11261. MNG_TRACE (pData, MNG_FN_DELTA_RGBA16, MNG_LC_END);
  11262. #endif
  11263. return mng_store_rgba16 (pData);
  11264. }
  11265. #endif
  11266. /* ************************************************************************** */
  11267. /* * * */
  11268. /* * Delta-image row routines - apply the source row onto the target * */
  11269. /* * * */
  11270. /* ************************************************************************** */
  11271. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  11272. mng_retcode mng_delta_g1_g1 (mng_datap pData)
  11273. {
  11274. mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf;
  11275. mng_uint8p pWorkrow;
  11276. mng_uint8p pOutrow;
  11277. mng_int32 iX;
  11278. #ifdef MNG_SUPPORT_TRACE
  11279. MNG_TRACE (pData, MNG_FN_DELTA_G1_G1, MNG_LC_START);
  11280. #endif
  11281. pWorkrow = pData->pRGBArow;
  11282. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  11283. (pData->iCol * pBuf->iSamplesize);
  11284. if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) ||
  11285. (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) )
  11286. {
  11287. MNG_COPY (pOutrow, pWorkrow, pData->iRowsamples);
  11288. }
  11289. else
  11290. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD)
  11291. {
  11292. #ifdef MNG_DECREMENT_LOOPS
  11293. for (iX = pData->iRowsamples; iX > 0; iX--)
  11294. #else
  11295. for (iX = 0; iX < pData->iRowsamples; iX++)
  11296. #endif
  11297. {
  11298. *pOutrow = (mng_uint8)(((mng_uint16)*pOutrow +
  11299. (mng_uint16)*pWorkrow) & 0x01);
  11300. pOutrow++;
  11301. pWorkrow++;
  11302. }
  11303. }
  11304. #ifdef MNG_SUPPORT_TRACE
  11305. MNG_TRACE (pData, MNG_FN_DELTA_G1_G1, MNG_LC_END);
  11306. #endif
  11307. return MNG_NOERROR;
  11308. }
  11309. /* ************************************************************************** */
  11310. mng_retcode mng_delta_g2_g2 (mng_datap pData)
  11311. {
  11312. mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf;
  11313. mng_uint8p pWorkrow;
  11314. mng_uint8p pOutrow;
  11315. mng_int32 iX;
  11316. #ifdef MNG_SUPPORT_TRACE
  11317. MNG_TRACE (pData, MNG_FN_DELTA_G2_G2, MNG_LC_START);
  11318. #endif
  11319. pWorkrow = pData->pRGBArow;
  11320. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  11321. (pData->iCol * pBuf->iSamplesize);
  11322. if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) ||
  11323. (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) )
  11324. {
  11325. MNG_COPY (pOutrow, pWorkrow, pData->iRowsamples);
  11326. }
  11327. else
  11328. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD)
  11329. {
  11330. #ifdef MNG_DECREMENT_LOOPS
  11331. for (iX = pData->iRowsamples; iX > 0; iX--)
  11332. #else
  11333. for (iX = 0; iX < pData->iRowsamples; iX++)
  11334. #endif
  11335. {
  11336. *pOutrow = (mng_uint8)(((mng_uint16)*pOutrow +
  11337. (mng_uint16)*pWorkrow) & 0x03);
  11338. pOutrow++;
  11339. pWorkrow++;
  11340. }
  11341. }
  11342. #ifdef MNG_SUPPORT_TRACE
  11343. MNG_TRACE (pData, MNG_FN_DELTA_G2_G2, MNG_LC_END);
  11344. #endif
  11345. return MNG_NOERROR;
  11346. }
  11347. /* ************************************************************************** */
  11348. mng_retcode mng_delta_g4_g4 (mng_datap pData)
  11349. {
  11350. mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf;
  11351. mng_uint8p pWorkrow;
  11352. mng_uint8p pOutrow;
  11353. mng_int32 iX;
  11354. #ifdef MNG_SUPPORT_TRACE
  11355. MNG_TRACE (pData, MNG_FN_DELTA_G4_G4, MNG_LC_START);
  11356. #endif
  11357. pWorkrow = pData->pRGBArow;
  11358. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  11359. (pData->iCol * pBuf->iSamplesize);
  11360. if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) ||
  11361. (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) )
  11362. {
  11363. MNG_COPY (pOutrow, pWorkrow, pData->iRowsamples);
  11364. }
  11365. else
  11366. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD)
  11367. {
  11368. #ifdef MNG_DECREMENT_LOOPS
  11369. for (iX = pData->iRowsamples; iX > 0; iX--)
  11370. #else
  11371. for (iX = 0; iX < pData->iRowsamples; iX++)
  11372. #endif
  11373. {
  11374. *pOutrow = (mng_uint8)(((mng_uint16)*pOutrow +
  11375. (mng_uint16)*pWorkrow) & 0x0F);
  11376. pOutrow++;
  11377. pWorkrow++;
  11378. }
  11379. }
  11380. #ifdef MNG_SUPPORT_TRACE
  11381. MNG_TRACE (pData, MNG_FN_DELTA_G4_G4, MNG_LC_END);
  11382. #endif
  11383. return MNG_NOERROR;
  11384. }
  11385. #endif
  11386. /* ************************************************************************** */
  11387. mng_retcode mng_delta_g8_g8 (mng_datap pData)
  11388. {
  11389. mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf;
  11390. mng_uint8p pWorkrow;
  11391. mng_uint8p pOutrow;
  11392. mng_int32 iX;
  11393. #ifdef MNG_SUPPORT_TRACE
  11394. MNG_TRACE (pData, MNG_FN_DELTA_G8_G8, MNG_LC_START);
  11395. #endif
  11396. pWorkrow = pData->pRGBArow;
  11397. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  11398. (pData->iCol * pBuf->iSamplesize);
  11399. if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) ||
  11400. (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) )
  11401. {
  11402. MNG_COPY (pOutrow, pWorkrow, pData->iRowsamples);
  11403. }
  11404. else
  11405. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD)
  11406. {
  11407. #ifdef MNG_DECREMENT_LOOPS
  11408. for (iX = pData->iRowsamples; iX > 0; iX--)
  11409. #else
  11410. for (iX = 0; iX < pData->iRowsamples; iX++)
  11411. #endif
  11412. {
  11413. *pOutrow = (mng_uint8)(((mng_uint16)*pOutrow +
  11414. (mng_uint16)*pWorkrow) & 0xFF);
  11415. pOutrow++;
  11416. pWorkrow++;
  11417. }
  11418. }
  11419. #ifdef MNG_SUPPORT_TRACE
  11420. MNG_TRACE (pData, MNG_FN_DELTA_G8_G8, MNG_LC_END);
  11421. #endif
  11422. return MNG_NOERROR;
  11423. }
  11424. /* ************************************************************************** */
  11425. #ifndef MNG_NO_16BIT_SUPPORT
  11426. mng_retcode mng_delta_g16_g16 (mng_datap pData)
  11427. {
  11428. mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf;
  11429. mng_uint8p pWorkrow;
  11430. mng_uint8p pOutrow;
  11431. mng_int32 iX;
  11432. #ifdef MNG_SUPPORT_TRACE
  11433. MNG_TRACE (pData, MNG_FN_DELTA_G16_G16, MNG_LC_START);
  11434. #endif
  11435. pWorkrow = pData->pRGBArow;
  11436. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  11437. (pData->iCol * pBuf->iSamplesize);
  11438. if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) ||
  11439. (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) )
  11440. {
  11441. MNG_COPY (pOutrow, pWorkrow, (pData->iRowsamples << 1));
  11442. }
  11443. else
  11444. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD)
  11445. {
  11446. #ifdef MNG_DECREMENT_LOOPS
  11447. for (iX = pData->iRowsamples; iX > 0; iX--)
  11448. #else
  11449. for (iX = 0; iX < pData->iRowsamples; iX++)
  11450. #endif
  11451. {
  11452. mng_put_uint16 (pOutrow, (mng_uint16)((mng_get_uint16 (pOutrow) +
  11453. mng_get_uint16 (pWorkrow)) & 0xFFFF));
  11454. pOutrow += 2;
  11455. pWorkrow += 2;
  11456. }
  11457. }
  11458. #ifdef MNG_SUPPORT_TRACE
  11459. MNG_TRACE (pData, MNG_FN_DELTA_G16_G16, MNG_LC_END);
  11460. #endif
  11461. return MNG_NOERROR;
  11462. }
  11463. #endif
  11464. #endif /* MNG_NO_DELTA_PNG */
  11465. /* ************************************************************************** */
  11466. mng_retcode mng_delta_rgb8_rgb8 (mng_datap pData)
  11467. {
  11468. mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf;
  11469. mng_uint8p pWorkrow;
  11470. mng_uint8p pOutrow;
  11471. mng_int32 iX;
  11472. #ifdef MNG_SUPPORT_TRACE
  11473. MNG_TRACE (pData, MNG_FN_DELTA_RGB8_RGB8, MNG_LC_START);
  11474. #endif
  11475. pWorkrow = pData->pRGBArow;
  11476. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  11477. (pData->iCol * pBuf->iSamplesize);
  11478. if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) ||
  11479. (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) )
  11480. {
  11481. MNG_COPY (pOutrow, pWorkrow, pData->iRowsamples * 3);
  11482. }
  11483. else
  11484. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD)
  11485. {
  11486. #ifdef MNG_DECREMENT_LOOPS
  11487. for (iX = pData->iRowsamples*3; iX > 0; iX--)
  11488. #else
  11489. for (iX = 0; iX < (pData->iRowsamples * 3); iX++)
  11490. #endif
  11491. {
  11492. *pOutrow = (mng_uint8)(((mng_uint16)*pOutrow +
  11493. (mng_uint16)*pWorkrow) & 0xFF);
  11494. pOutrow++;
  11495. pWorkrow++;
  11496. }
  11497. }
  11498. #ifdef MNG_SUPPORT_TRACE
  11499. MNG_TRACE (pData, MNG_FN_DELTA_RGB8_RGB8, MNG_LC_END);
  11500. #endif
  11501. return MNG_NOERROR;
  11502. }
  11503. /* ************************************************************************** */
  11504. #ifndef MNG_NO_16BIT_SUPPORT
  11505. mng_retcode mng_delta_rgb16_rgb16 (mng_datap pData)
  11506. {
  11507. mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf;
  11508. mng_uint8p pWorkrow;
  11509. mng_uint8p pOutrow;
  11510. mng_int32 iX;
  11511. #ifdef MNG_SUPPORT_TRACE
  11512. MNG_TRACE (pData, MNG_FN_DELTA_RGB16_RGB16, MNG_LC_START);
  11513. #endif
  11514. pWorkrow = pData->pRGBArow;
  11515. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  11516. (pData->iCol * pBuf->iSamplesize);
  11517. if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) ||
  11518. (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) )
  11519. {
  11520. MNG_COPY (pOutrow, pWorkrow, (pData->iRowsamples * 6));
  11521. }
  11522. else
  11523. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD)
  11524. {
  11525. #ifdef MNG_DECREMENT_LOOPS
  11526. for (iX = pData->iRowsamples; iX > 0; iX--)
  11527. #else
  11528. for (iX = 0; iX < pData->iRowsamples; iX++)
  11529. #endif
  11530. {
  11531. mng_put_uint16 (pOutrow, (mng_uint16)((mng_get_uint16 (pOutrow ) +
  11532. mng_get_uint16 (pWorkrow )) & 0xFFFF));
  11533. mng_put_uint16 (pOutrow+2, (mng_uint16)((mng_get_uint16 (pOutrow+2) +
  11534. mng_get_uint16 (pWorkrow+2)) & 0xFFFF));
  11535. mng_put_uint16 (pOutrow+4, (mng_uint16)((mng_get_uint16 (pOutrow+4) +
  11536. mng_get_uint16 (pWorkrow+4)) & 0xFFFF));
  11537. pOutrow += 6;
  11538. pWorkrow += 6;
  11539. }
  11540. }
  11541. #ifdef MNG_SUPPORT_TRACE
  11542. MNG_TRACE (pData, MNG_FN_DELTA_RGB16_RGB16, MNG_LC_END);
  11543. #endif
  11544. return MNG_NOERROR;
  11545. }
  11546. #endif
  11547. /* ************************************************************************** */
  11548. #ifndef MNG_NO_DELTA_PNG
  11549. mng_retcode mng_delta_ga8_ga8 (mng_datap pData)
  11550. {
  11551. mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf;
  11552. mng_uint8p pWorkrow;
  11553. mng_uint8p pOutrow;
  11554. mng_int32 iX;
  11555. #ifdef MNG_SUPPORT_TRACE
  11556. MNG_TRACE (pData, MNG_FN_DELTA_GA8_GA8, MNG_LC_START);
  11557. #endif
  11558. pWorkrow = pData->pRGBArow;
  11559. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  11560. (pData->iCol * pBuf->iSamplesize);
  11561. if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) ||
  11562. (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) )
  11563. {
  11564. MNG_COPY (pOutrow, pWorkrow, pData->iRowsamples << 1);
  11565. }
  11566. else
  11567. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD)
  11568. {
  11569. #ifdef MNG_DECREMENT_LOOPS
  11570. for (iX = (pData->iRowsamples<<1); iX > 0; iX--)
  11571. #else
  11572. for (iX = 0; iX < (pData->iRowsamples << 1); iX++)
  11573. #endif
  11574. {
  11575. *pOutrow = (mng_uint8)(((mng_uint16)*pOutrow +
  11576. (mng_uint16)*pWorkrow) & 0xFF);
  11577. pOutrow++;
  11578. pWorkrow++;
  11579. }
  11580. }
  11581. #ifdef MNG_SUPPORT_TRACE
  11582. MNG_TRACE (pData, MNG_FN_DELTA_GA8_GA8, MNG_LC_END);
  11583. #endif
  11584. return MNG_NOERROR;
  11585. }
  11586. /* ************************************************************************** */
  11587. mng_retcode mng_delta_ga8_g8 (mng_datap pData)
  11588. {
  11589. mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf;
  11590. mng_uint8p pWorkrow;
  11591. mng_uint8p pOutrow;
  11592. mng_int32 iX;
  11593. #ifdef MNG_SUPPORT_TRACE
  11594. MNG_TRACE (pData, MNG_FN_DELTA_GA8_G8, MNG_LC_START);
  11595. #endif
  11596. pWorkrow = pData->pRGBArow;
  11597. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  11598. (pData->iCol * pBuf->iSamplesize);
  11599. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKCOLORREPLACE)
  11600. {
  11601. #ifdef MNG_DECREMENT_LOOPS
  11602. for (iX = pData->iRowsamples; iX > 0; iX--)
  11603. #else
  11604. for (iX = 0; iX < pData->iRowsamples; iX++)
  11605. #endif
  11606. {
  11607. *pOutrow = *pWorkrow;
  11608. pOutrow += 2;
  11609. pWorkrow++;
  11610. }
  11611. }
  11612. else
  11613. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKCOLORADD)
  11614. {
  11615. #ifdef MNG_DECREMENT_LOOPS
  11616. for (iX = pData->iRowsamples; iX > 0; iX--)
  11617. #else
  11618. for (iX = 0; iX < pData->iRowsamples; iX++)
  11619. #endif
  11620. {
  11621. *pOutrow = (mng_uint8)(((mng_uint16)*pOutrow +
  11622. (mng_uint16)*pWorkrow) & 0xFF);
  11623. pOutrow += 2;
  11624. pWorkrow++;
  11625. }
  11626. }
  11627. #ifdef MNG_SUPPORT_TRACE
  11628. MNG_TRACE (pData, MNG_FN_DELTA_GA8_G8, MNG_LC_END);
  11629. #endif
  11630. return MNG_NOERROR;
  11631. }
  11632. /* ************************************************************************** */
  11633. mng_retcode mng_delta_ga8_a8 (mng_datap pData)
  11634. {
  11635. mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf;
  11636. mng_uint8p pWorkrow;
  11637. mng_uint8p pOutrow;
  11638. mng_int32 iX;
  11639. #ifdef MNG_SUPPORT_TRACE
  11640. MNG_TRACE (pData, MNG_FN_DELTA_GA8_A8, MNG_LC_START);
  11641. #endif
  11642. pWorkrow = pData->pRGBArow;
  11643. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  11644. (pData->iCol * pBuf->iSamplesize) + 1;
  11645. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKALPHAREPLACE)
  11646. {
  11647. #ifdef MNG_DECREMENT_LOOPS
  11648. for (iX = pData->iRowsamples; iX > 0; iX--)
  11649. #else
  11650. for (iX = 0; iX < pData->iRowsamples; iX++)
  11651. #endif
  11652. {
  11653. *pOutrow = *pWorkrow;
  11654. pOutrow += 2;
  11655. pWorkrow++;
  11656. }
  11657. }
  11658. else
  11659. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKALPHAADD)
  11660. {
  11661. #ifdef MNG_DECREMENT_LOOPS
  11662. for (iX = pData->iRowsamples; iX > 0; iX--)
  11663. #else
  11664. for (iX = 0; iX < pData->iRowsamples; iX++)
  11665. #endif
  11666. {
  11667. *pOutrow = (mng_uint8)(((mng_uint16)*pOutrow +
  11668. (mng_uint16)*pWorkrow) & 0xFF);
  11669. pOutrow += 2;
  11670. pWorkrow++;
  11671. }
  11672. }
  11673. #ifdef MNG_SUPPORT_TRACE
  11674. MNG_TRACE (pData, MNG_FN_DELTA_GA8_A8, MNG_LC_END);
  11675. #endif
  11676. return MNG_NOERROR;
  11677. }
  11678. /* ************************************************************************** */
  11679. #ifndef MNG_NO_16BIT_SUPPORT
  11680. mng_retcode mng_delta_ga16_ga16 (mng_datap pData)
  11681. {
  11682. mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf;
  11683. mng_uint8p pWorkrow;
  11684. mng_uint8p pOutrow;
  11685. mng_int32 iX;
  11686. #ifdef MNG_SUPPORT_TRACE
  11687. MNG_TRACE (pData, MNG_FN_DELTA_GA16_GA16, MNG_LC_START);
  11688. #endif
  11689. pWorkrow = pData->pRGBArow;
  11690. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  11691. (pData->iCol * pBuf->iSamplesize);
  11692. if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) ||
  11693. (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) )
  11694. {
  11695. MNG_COPY (pOutrow, pWorkrow, (pData->iRowsamples << 2));
  11696. }
  11697. else
  11698. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD)
  11699. {
  11700. #ifdef MNG_DECREMENT_LOOPS
  11701. for (iX = pData->iRowsamples; iX > 0; iX--)
  11702. #else
  11703. for (iX = 0; iX < pData->iRowsamples; iX++)
  11704. #endif
  11705. {
  11706. mng_put_uint16 (pOutrow, (mng_uint16)((mng_get_uint16 (pOutrow ) +
  11707. mng_get_uint16 (pWorkrow )) & 0xFFFF));
  11708. mng_put_uint16 (pOutrow+2, (mng_uint16)((mng_get_uint16 (pOutrow+2) +
  11709. mng_get_uint16 (pWorkrow+2)) & 0xFFFF));
  11710. pOutrow += 4;
  11711. pWorkrow += 4;
  11712. }
  11713. }
  11714. #ifdef MNG_SUPPORT_TRACE
  11715. MNG_TRACE (pData, MNG_FN_DELTA_GA16_GA16, MNG_LC_END);
  11716. #endif
  11717. return MNG_NOERROR;
  11718. }
  11719. #endif
  11720. /* ************************************************************************** */
  11721. #ifndef MNG_NO_16BIT_SUPPORT
  11722. mng_retcode mng_delta_ga16_g16 (mng_datap pData)
  11723. {
  11724. mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf;
  11725. mng_uint8p pWorkrow;
  11726. mng_uint8p pOutrow;
  11727. mng_int32 iX;
  11728. #ifdef MNG_SUPPORT_TRACE
  11729. MNG_TRACE (pData, MNG_FN_DELTA_GA16_G16, MNG_LC_START);
  11730. #endif
  11731. pWorkrow = pData->pRGBArow;
  11732. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  11733. (pData->iCol * pBuf->iSamplesize);
  11734. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKCOLORREPLACE)
  11735. {
  11736. #ifdef MNG_DECREMENT_LOOPS
  11737. for (iX = pData->iRowsamples; iX > 0; iX--)
  11738. #else
  11739. for (iX = 0; iX < pData->iRowsamples; iX++)
  11740. #endif
  11741. {
  11742. mng_put_uint16 (pOutrow, mng_get_uint16 (pWorkrow));
  11743. pOutrow += 4;
  11744. pWorkrow += 2;
  11745. }
  11746. }
  11747. else
  11748. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKCOLORADD)
  11749. {
  11750. #ifdef MNG_DECREMENT_LOOPS
  11751. for (iX = pData->iRowsamples; iX > 0; iX--)
  11752. #else
  11753. for (iX = 0; iX < pData->iRowsamples; iX++)
  11754. #endif
  11755. {
  11756. mng_put_uint16 (pOutrow, (mng_uint16)((mng_get_uint16 (pOutrow) +
  11757. mng_get_uint16 (pWorkrow)) & 0xFFFF));
  11758. pOutrow += 4;
  11759. pWorkrow += 2;
  11760. }
  11761. }
  11762. #ifdef MNG_SUPPORT_TRACE
  11763. MNG_TRACE (pData, MNG_FN_DELTA_GA16_G16, MNG_LC_END);
  11764. #endif
  11765. return MNG_NOERROR;
  11766. }
  11767. #endif
  11768. /* ************************************************************************** */
  11769. #ifndef MNG_NO_16BIT_SUPPORT
  11770. mng_retcode mng_delta_ga16_a16 (mng_datap pData)
  11771. {
  11772. mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf;
  11773. mng_uint8p pWorkrow;
  11774. mng_uint8p pOutrow;
  11775. mng_int32 iX;
  11776. #ifdef MNG_SUPPORT_TRACE
  11777. MNG_TRACE (pData, MNG_FN_DELTA_GA16_A16, MNG_LC_START);
  11778. #endif
  11779. pWorkrow = pData->pRGBArow;
  11780. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  11781. (pData->iCol * pBuf->iSamplesize);
  11782. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKALPHAREPLACE)
  11783. {
  11784. #ifdef MNG_DECREMENT_LOOPS
  11785. for (iX = pData->iRowsamples; iX > 0; iX--)
  11786. #else
  11787. for (iX = 0; iX < pData->iRowsamples; iX++)
  11788. #endif
  11789. {
  11790. mng_put_uint16 (pOutrow+2, mng_get_uint16 (pWorkrow));
  11791. pOutrow += 4;
  11792. pWorkrow += 2;
  11793. }
  11794. }
  11795. else
  11796. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKALPHAADD)
  11797. {
  11798. #ifdef MNG_DECREMENT_LOOPS
  11799. for (iX = pData->iRowsamples; iX > 0; iX--)
  11800. #else
  11801. for (iX = 0; iX < pData->iRowsamples; iX++)
  11802. #endif
  11803. {
  11804. mng_put_uint16 (pOutrow+2, (mng_uint16)((mng_get_uint16 (pOutrow+2) +
  11805. mng_get_uint16 (pWorkrow)) & 0xFFFF));
  11806. pOutrow += 4;
  11807. pWorkrow += 2;
  11808. }
  11809. }
  11810. #ifdef MNG_SUPPORT_TRACE
  11811. MNG_TRACE (pData, MNG_FN_DELTA_GA16_A16, MNG_LC_END);
  11812. #endif
  11813. return MNG_NOERROR;
  11814. }
  11815. #endif
  11816. #endif /* MNG_NO_DELTA_PNG */
  11817. /* ************************************************************************** */
  11818. mng_retcode mng_delta_rgba8_rgba8 (mng_datap pData)
  11819. {
  11820. mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf;
  11821. mng_uint8p pWorkrow;
  11822. mng_uint8p pOutrow;
  11823. mng_int32 iX;
  11824. #ifdef MNG_SUPPORT_TRACE
  11825. MNG_TRACE (pData, MNG_FN_DELTA_RGBA8_RGBA8, MNG_LC_START);
  11826. #endif
  11827. pWorkrow = pData->pRGBArow;
  11828. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  11829. (pData->iCol * pBuf->iSamplesize);
  11830. if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) ||
  11831. (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) )
  11832. {
  11833. MNG_COPY (pOutrow, pWorkrow, pData->iRowsamples << 2);
  11834. }
  11835. else
  11836. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD)
  11837. {
  11838. #ifdef MNG_DECREMENT_LOOPS
  11839. for (iX = (pData->iRowsamples << 2); iX > 0; iX--)
  11840. #else
  11841. for (iX = 0; iX < (pData->iRowsamples << 2); iX++)
  11842. #endif
  11843. {
  11844. *pOutrow = (mng_uint8)(((mng_uint16)*pOutrow +
  11845. (mng_uint16)*pWorkrow) & 0xFF);
  11846. pOutrow++;
  11847. pWorkrow++;
  11848. }
  11849. }
  11850. #ifdef MNG_SUPPORT_TRACE
  11851. MNG_TRACE (pData, MNG_FN_DELTA_RGBA8_RGBA8, MNG_LC_END);
  11852. #endif
  11853. return MNG_NOERROR;
  11854. }
  11855. /* ************************************************************************** */
  11856. #ifndef MNG_NO_DELTA_PNG
  11857. mng_retcode mng_delta_rgba8_rgb8 (mng_datap pData)
  11858. {
  11859. mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf;
  11860. mng_uint8p pWorkrow;
  11861. mng_uint8p pOutrow;
  11862. mng_int32 iX;
  11863. #ifdef MNG_SUPPORT_TRACE
  11864. MNG_TRACE (pData, MNG_FN_DELTA_RGBA8_RGB8, MNG_LC_START);
  11865. #endif
  11866. pWorkrow = pData->pRGBArow;
  11867. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  11868. (pData->iCol * pBuf->iSamplesize);
  11869. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKCOLORREPLACE)
  11870. {
  11871. #ifdef MNG_DECREMENT_LOOPS
  11872. for (iX = pData->iRowsamples; iX > 0; iX--)
  11873. #else
  11874. for (iX = 0; iX < pData->iRowsamples; iX++)
  11875. #endif
  11876. {
  11877. *pOutrow = *pWorkrow;
  11878. *(pOutrow+1) = *(pWorkrow+1);
  11879. *(pOutrow+2) = *(pWorkrow+2);
  11880. pOutrow += 4;
  11881. pWorkrow += 3;
  11882. }
  11883. }
  11884. else
  11885. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKCOLORADD)
  11886. {
  11887. #ifdef MNG_DECREMENT_LOOPS
  11888. for (iX = pData->iRowsamples; iX > 0; iX--)
  11889. #else
  11890. for (iX = 0; iX < pData->iRowsamples; iX++)
  11891. #endif
  11892. {
  11893. *pOutrow = (mng_uint8)(((mng_uint16)*pOutrow +
  11894. (mng_uint16)*pWorkrow ) & 0xFF);
  11895. *(pOutrow+1) = (mng_uint8)(((mng_uint16)*(pOutrow+1) +
  11896. (mng_uint16)*(pWorkrow+1)) & 0xFF);
  11897. *(pOutrow+2) = (mng_uint8)(((mng_uint16)*(pOutrow+2) +
  11898. (mng_uint16)*(pWorkrow+2)) & 0xFF);
  11899. pOutrow += 4;
  11900. pWorkrow += 3;
  11901. }
  11902. }
  11903. #ifdef MNG_SUPPORT_TRACE
  11904. MNG_TRACE (pData, MNG_FN_DELTA_RGBA8_RGB8, MNG_LC_END);
  11905. #endif
  11906. return MNG_NOERROR;
  11907. }
  11908. /* ************************************************************************** */
  11909. mng_retcode mng_delta_rgba8_a8 (mng_datap pData)
  11910. {
  11911. mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf;
  11912. mng_uint8p pWorkrow;
  11913. mng_uint8p pOutrow;
  11914. mng_int32 iX;
  11915. #ifdef MNG_SUPPORT_TRACE
  11916. MNG_TRACE (pData, MNG_FN_DELTA_RGBA8_A8, MNG_LC_START);
  11917. #endif
  11918. pWorkrow = pData->pRGBArow;
  11919. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  11920. (pData->iCol * pBuf->iSamplesize) + 3;
  11921. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKALPHAREPLACE)
  11922. {
  11923. #ifdef MNG_DECREMENT_LOOPS
  11924. for (iX = pData->iRowsamples; iX > 0; iX--)
  11925. #else
  11926. for (iX = 0; iX < pData->iRowsamples; iX++)
  11927. #endif
  11928. {
  11929. *pOutrow = *pWorkrow;
  11930. pOutrow += 4;
  11931. pWorkrow++;
  11932. }
  11933. }
  11934. else
  11935. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKALPHAADD)
  11936. {
  11937. #ifdef MNG_DECREMENT_LOOPS
  11938. for (iX = pData->iRowsamples; iX > 0; iX--)
  11939. #else
  11940. for (iX = 0; iX < pData->iRowsamples; iX++)
  11941. #endif
  11942. {
  11943. *pOutrow = (mng_uint8)(((mng_uint16)*pOutrow +
  11944. (mng_uint16)*pWorkrow) & 0xFF);
  11945. pOutrow += 4;
  11946. pWorkrow++;
  11947. }
  11948. }
  11949. #ifdef MNG_SUPPORT_TRACE
  11950. MNG_TRACE (pData, MNG_FN_DELTA_RGBA8_A8, MNG_LC_END);
  11951. #endif
  11952. return MNG_NOERROR;
  11953. }
  11954. #endif /* MNG_NO_DELTA_PNG */
  11955. /* ************************************************************************** */
  11956. #ifndef MNG_NO_16BIT_SUPPORT
  11957. mng_retcode mng_delta_rgba16_rgba16 (mng_datap pData)
  11958. {
  11959. mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf;
  11960. mng_uint8p pWorkrow;
  11961. mng_uint8p pOutrow;
  11962. mng_int32 iX;
  11963. #ifdef MNG_SUPPORT_TRACE
  11964. MNG_TRACE (pData, MNG_FN_DELTA_RGBA16_RGBA16, MNG_LC_START);
  11965. #endif
  11966. pWorkrow = pData->pRGBArow;
  11967. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  11968. (pData->iCol * pBuf->iSamplesize);
  11969. if ((pData->iDeltatype == MNG_DELTATYPE_REPLACE ) ||
  11970. (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELREPLACE) )
  11971. {
  11972. MNG_COPY (pOutrow, pWorkrow, (pData->iRowsamples << 3));
  11973. }
  11974. else
  11975. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKPIXELADD)
  11976. {
  11977. #ifdef MNG_DECREMENT_LOOPS
  11978. for (iX = pData->iRowsamples; iX > 0; iX--)
  11979. #else
  11980. for (iX = 0; iX < pData->iRowsamples; iX++)
  11981. #endif
  11982. {
  11983. mng_put_uint16 (pOutrow, (mng_uint16)((mng_get_uint16 (pOutrow ) +
  11984. mng_get_uint16 (pWorkrow )) & 0xFFFF));
  11985. mng_put_uint16 (pOutrow+2, (mng_uint16)((mng_get_uint16 (pOutrow+2) +
  11986. mng_get_uint16 (pWorkrow+2)) & 0xFFFF));
  11987. mng_put_uint16 (pOutrow+4, (mng_uint16)((mng_get_uint16 (pOutrow+4) +
  11988. mng_get_uint16 (pWorkrow+4)) & 0xFFFF));
  11989. mng_put_uint16 (pOutrow+6, (mng_uint16)((mng_get_uint16 (pOutrow+6) +
  11990. mng_get_uint16 (pWorkrow+6)) & 0xFFFF));
  11991. pOutrow += 8;
  11992. pWorkrow += 8;
  11993. }
  11994. }
  11995. #ifdef MNG_SUPPORT_TRACE
  11996. MNG_TRACE (pData, MNG_FN_DELTA_RGBA16_RGBA16, MNG_LC_END);
  11997. #endif
  11998. return MNG_NOERROR;
  11999. }
  12000. #endif
  12001. /* ************************************************************************** */
  12002. #ifndef MNG_NO_DELTA_PNG
  12003. #ifndef MNG_NO_16BIT_SUPPORT
  12004. mng_retcode mng_delta_rgba16_rgb16 (mng_datap pData)
  12005. {
  12006. mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf;
  12007. mng_uint8p pWorkrow;
  12008. mng_uint8p pOutrow;
  12009. mng_int32 iX;
  12010. #ifdef MNG_SUPPORT_TRACE
  12011. MNG_TRACE (pData, MNG_FN_DELTA_RGBA16_RGB16, MNG_LC_START);
  12012. #endif
  12013. pWorkrow = pData->pRGBArow;
  12014. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  12015. (pData->iCol * pBuf->iSamplesize);
  12016. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKCOLORREPLACE)
  12017. {
  12018. #ifdef MNG_DECREMENT_LOOPS
  12019. for (iX = pData->iRowsamples; iX > 0; iX--)
  12020. #else
  12021. for (iX = 0; iX < pData->iRowsamples; iX++)
  12022. #endif
  12023. {
  12024. mng_put_uint16 (pOutrow, mng_get_uint16 (pWorkrow ));
  12025. mng_put_uint16 (pOutrow+2, mng_get_uint16 (pWorkrow+2));
  12026. mng_put_uint16 (pOutrow+4, mng_get_uint16 (pWorkrow+4));
  12027. pOutrow += 8;
  12028. pWorkrow += 6;
  12029. }
  12030. }
  12031. else
  12032. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKCOLORADD)
  12033. {
  12034. #ifdef MNG_DECREMENT_LOOPS
  12035. for (iX = pData->iRowsamples; iX > 0; iX--)
  12036. #else
  12037. for (iX = 0; iX < pData->iRowsamples; iX++)
  12038. #endif
  12039. {
  12040. mng_put_uint16 (pOutrow, (mng_uint16)((mng_get_uint16 (pOutrow ) +
  12041. mng_get_uint16 (pWorkrow )) & 0xFFFF));
  12042. mng_put_uint16 (pOutrow+2, (mng_uint16)((mng_get_uint16 (pOutrow+2) +
  12043. mng_get_uint16 (pWorkrow+2)) & 0xFFFF));
  12044. mng_put_uint16 (pOutrow+4, (mng_uint16)((mng_get_uint16 (pOutrow+4) +
  12045. mng_get_uint16 (pWorkrow+4)) & 0xFFFF));
  12046. pOutrow += 8;
  12047. pWorkrow += 6;
  12048. }
  12049. }
  12050. #ifdef MNG_SUPPORT_TRACE
  12051. MNG_TRACE (pData, MNG_FN_DELTA_RGBA16_RGB16, MNG_LC_END);
  12052. #endif
  12053. return MNG_NOERROR;
  12054. }
  12055. #endif
  12056. /* ************************************************************************** */
  12057. #ifndef MNG_NO_16BIT_SUPPORT
  12058. mng_retcode mng_delta_rgba16_a16 (mng_datap pData)
  12059. {
  12060. mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf;
  12061. mng_uint8p pWorkrow;
  12062. mng_uint8p pOutrow;
  12063. mng_int32 iX;
  12064. #ifdef MNG_SUPPORT_TRACE
  12065. MNG_TRACE (pData, MNG_FN_DELTA_RGBA16_A16, MNG_LC_START);
  12066. #endif
  12067. pWorkrow = pData->pRGBArow;
  12068. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  12069. (pData->iCol * pBuf->iSamplesize);
  12070. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKALPHAREPLACE)
  12071. {
  12072. #ifdef MNG_DECREMENT_LOOPS
  12073. for (iX = pData->iRowsamples; iX > 0; iX--)
  12074. #else
  12075. for (iX = 0; iX < pData->iRowsamples; iX++)
  12076. #endif
  12077. {
  12078. mng_put_uint16 (pOutrow+6, mng_get_uint16 (pWorkrow));
  12079. pOutrow += 8;
  12080. pWorkrow += 2;
  12081. }
  12082. }
  12083. else
  12084. if (pData->iDeltatype == MNG_DELTATYPE_BLOCKALPHAADD)
  12085. {
  12086. #ifdef MNG_DECREMENT_LOOPS
  12087. for (iX = pData->iRowsamples; iX > 0; iX--)
  12088. #else
  12089. for (iX = 0; iX < pData->iRowsamples; iX++)
  12090. #endif
  12091. {
  12092. mng_put_uint16 (pOutrow+6, (mng_uint16)((mng_get_uint16 (pOutrow+6) +
  12093. mng_get_uint16 (pWorkrow)) & 0xFFFF));
  12094. pOutrow += 8;
  12095. pWorkrow += 2;
  12096. }
  12097. }
  12098. #ifdef MNG_SUPPORT_TRACE
  12099. MNG_TRACE (pData, MNG_FN_DELTA_RGBA16_A16, MNG_LC_END);
  12100. #endif
  12101. return MNG_NOERROR;
  12102. }
  12103. #endif
  12104. #endif /* MNG_NO_DELTA_PNG */
  12105. /* ************************************************************************** */
  12106. /* * * */
  12107. /* * Delta-image row routines - scale the delta to bitdepth of target * */
  12108. /* * * */
  12109. /* ************************************************************************** */
  12110. #ifndef MNG_NO_DELTA_PNG
  12111. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  12112. mng_retcode mng_scale_g1_g2 (mng_datap pData)
  12113. {
  12114. mng_uint8p pWorkrow = pData->pRGBArow;
  12115. mng_int32 iX;
  12116. #ifdef MNG_SUPPORT_TRACE
  12117. MNG_TRACE (pData, MNG_FN_SCALE_G1_G2, MNG_LC_START);
  12118. #endif
  12119. #ifdef MNG_DECREMENT_LOOPS
  12120. for (iX = pData->iRowsamples; iX > 0; iX--)
  12121. #else
  12122. for (iX = 0; iX < pData->iRowsamples; iX++)
  12123. #endif
  12124. {
  12125. *pWorkrow = (mng_uint8)(*pWorkrow << 1);
  12126. pWorkrow++;
  12127. }
  12128. #ifdef MNG_SUPPORT_TRACE
  12129. MNG_TRACE (pData, MNG_FN_SCALE_G1_G2, MNG_LC_END);
  12130. #endif
  12131. return MNG_NOERROR;
  12132. }
  12133. /* ************************************************************************** */
  12134. mng_retcode mng_scale_g1_g4 (mng_datap pData)
  12135. {
  12136. mng_uint8p pWorkrow = pData->pRGBArow;
  12137. mng_int32 iX;
  12138. #ifdef MNG_SUPPORT_TRACE
  12139. MNG_TRACE (pData, MNG_FN_SCALE_G1_G4, MNG_LC_START);
  12140. #endif
  12141. #ifdef MNG_DECREMENT_LOOPS
  12142. for (iX = pData->iRowsamples; iX > 0; iX--)
  12143. #else
  12144. for (iX = 0; iX < pData->iRowsamples; iX++)
  12145. #endif
  12146. {
  12147. *pWorkrow = (mng_uint8)(*pWorkrow << 3);
  12148. pWorkrow++;
  12149. }
  12150. #ifdef MNG_SUPPORT_TRACE
  12151. MNG_TRACE (pData, MNG_FN_SCALE_G1_G4, MNG_LC_END);
  12152. #endif
  12153. return MNG_NOERROR;
  12154. }
  12155. /* ************************************************************************** */
  12156. mng_retcode mng_scale_g1_g8 (mng_datap pData)
  12157. {
  12158. mng_uint8p pWorkrow = pData->pRGBArow;
  12159. mng_int32 iX;
  12160. #ifdef MNG_SUPPORT_TRACE
  12161. MNG_TRACE (pData, MNG_FN_SCALE_G1_G8, MNG_LC_START);
  12162. #endif
  12163. #ifdef MNG_DECREMENT_LOOPS
  12164. for (iX = pData->iRowsamples; iX > 0; iX--)
  12165. #else
  12166. for (iX = 0; iX < pData->iRowsamples; iX++)
  12167. #endif
  12168. {
  12169. *pWorkrow = (mng_uint8)(*pWorkrow << 7);
  12170. pWorkrow++;
  12171. }
  12172. #ifdef MNG_SUPPORT_TRACE
  12173. MNG_TRACE (pData, MNG_FN_SCALE_G1_G8, MNG_LC_END);
  12174. #endif
  12175. return MNG_NOERROR;
  12176. }
  12177. /* ************************************************************************** */
  12178. #ifndef MNG_NO_16BIT_SUPPORT
  12179. mng_retcode mng_scale_g1_g16 (mng_datap pData)
  12180. {
  12181. mng_uint8p pWorkrow = pData->pRGBArow;
  12182. mng_uint8p pOutrow = pData->pRGBArow;
  12183. mng_int32 iX;
  12184. #ifdef MNG_SUPPORT_TRACE
  12185. MNG_TRACE (pData, MNG_FN_SCALE_G1_G16, MNG_LC_START);
  12186. #endif
  12187. pWorkrow = pWorkrow + (pData->iRowsamples - 1);
  12188. pOutrow = pOutrow + ((pData->iRowsamples - 1) << 1);
  12189. /* pWorkrow = (mng_uint8p)((mng_uint32)pWorkrow + pData->iRowsamples - 1); */
  12190. /* pOutrow = (mng_uint8p)((mng_uint32)pOutrow + ((pData->iRowsamples - 1) << 1)); */
  12191. #ifdef MNG_DECREMENT_LOOPS
  12192. for (iX = pData->iRowsamples; iX > 0; iX--)
  12193. #else
  12194. for (iX = 0; iX < pData->iRowsamples; iX++)
  12195. #endif
  12196. {
  12197. *(pOutrow+1) = 0;
  12198. *pOutrow = (mng_uint8)(*pWorkrow << 7);
  12199. pWorkrow--;
  12200. pOutrow -= 2;
  12201. }
  12202. #ifdef MNG_SUPPORT_TRACE
  12203. MNG_TRACE (pData, MNG_FN_SCALE_G1_G16, MNG_LC_END);
  12204. #endif
  12205. return MNG_NOERROR;
  12206. }
  12207. #endif
  12208. /* ************************************************************************** */
  12209. mng_retcode mng_scale_g2_g4 (mng_datap pData)
  12210. {
  12211. mng_uint8p pWorkrow = pData->pRGBArow;
  12212. mng_int32 iX;
  12213. #ifdef MNG_SUPPORT_TRACE
  12214. MNG_TRACE (pData, MNG_FN_SCALE_G2_G4, MNG_LC_START);
  12215. #endif
  12216. #ifdef MNG_DECREMENT_LOOPS
  12217. for (iX = pData->iRowsamples; iX > 0; iX--)
  12218. #else
  12219. for (iX = 0; iX < pData->iRowsamples; iX++)
  12220. #endif
  12221. {
  12222. *pWorkrow = (mng_uint8)(*pWorkrow << 2);
  12223. pWorkrow++;
  12224. }
  12225. #ifdef MNG_SUPPORT_TRACE
  12226. MNG_TRACE (pData, MNG_FN_SCALE_G2_G4, MNG_LC_END);
  12227. #endif
  12228. return MNG_NOERROR;
  12229. }
  12230. /* ************************************************************************** */
  12231. mng_retcode mng_scale_g2_g8 (mng_datap pData)
  12232. {
  12233. mng_uint8p pWorkrow = pData->pRGBArow;
  12234. mng_int32 iX;
  12235. #ifdef MNG_SUPPORT_TRACE
  12236. MNG_TRACE (pData, MNG_FN_SCALE_G2_G8, MNG_LC_START);
  12237. #endif
  12238. #ifdef MNG_DECREMENT_LOOPS
  12239. for (iX = pData->iRowsamples; iX > 0; iX--)
  12240. #else
  12241. for (iX = 0; iX < pData->iRowsamples; iX++)
  12242. #endif
  12243. {
  12244. *pWorkrow = (mng_uint8)(*pWorkrow << 6);
  12245. pWorkrow++;
  12246. }
  12247. #ifdef MNG_SUPPORT_TRACE
  12248. MNG_TRACE (pData, MNG_FN_SCALE_G2_G8, MNG_LC_END);
  12249. #endif
  12250. return MNG_NOERROR;
  12251. }
  12252. /* ************************************************************************** */
  12253. #ifndef MNG_NO_16BIT_SUPPORT
  12254. mng_retcode mng_scale_g2_g16 (mng_datap pData)
  12255. {
  12256. mng_uint8p pWorkrow = pData->pRGBArow;
  12257. mng_uint8p pOutrow = pData->pRGBArow;
  12258. mng_int32 iX;
  12259. #ifdef MNG_SUPPORT_TRACE
  12260. MNG_TRACE (pData, MNG_FN_SCALE_G2_G16, MNG_LC_START);
  12261. #endif
  12262. pWorkrow = pWorkrow + (pData->iRowsamples - 1);
  12263. pOutrow = pOutrow + ((pData->iRowsamples - 1) << 1);
  12264. /* pWorkrow = (mng_uint8p)((mng_uint32)pWorkrow + pData->iRowsamples - 1); */
  12265. /* pOutrow = (mng_uint8p)((mng_uint32)pOutrow + ((pData->iRowsamples - 1) << 1)); */
  12266. #ifdef MNG_DECREMENT_LOOPS
  12267. for (iX = pData->iRowsamples; iX > 0; iX--)
  12268. #else
  12269. for (iX = 0; iX < pData->iRowsamples; iX++)
  12270. #endif
  12271. {
  12272. *(pOutrow+1) = 0;
  12273. *pOutrow = (mng_uint8)(*pWorkrow << 6);
  12274. pWorkrow--;
  12275. pOutrow -= 2;
  12276. }
  12277. #ifdef MNG_SUPPORT_TRACE
  12278. MNG_TRACE (pData, MNG_FN_SCALE_G2_G16, MNG_LC_END);
  12279. #endif
  12280. return MNG_NOERROR;
  12281. }
  12282. #endif
  12283. /* ************************************************************************** */
  12284. mng_retcode mng_scale_g4_g8 (mng_datap pData)
  12285. {
  12286. mng_uint8p pWorkrow = pData->pRGBArow;
  12287. mng_int32 iX;
  12288. #ifdef MNG_SUPPORT_TRACE
  12289. MNG_TRACE (pData, MNG_FN_SCALE_G4_G8, MNG_LC_START);
  12290. #endif
  12291. #ifdef MNG_DECREMENT_LOOPS
  12292. for (iX = pData->iRowsamples; iX > 0; iX--)
  12293. #else
  12294. for (iX = 0; iX < pData->iRowsamples; iX++)
  12295. #endif
  12296. {
  12297. *pWorkrow = (mng_uint8)(*pWorkrow << 4);
  12298. pWorkrow++;
  12299. }
  12300. #ifdef MNG_SUPPORT_TRACE
  12301. MNG_TRACE (pData, MNG_FN_SCALE_G4_G8, MNG_LC_END);
  12302. #endif
  12303. return MNG_NOERROR;
  12304. }
  12305. /* ************************************************************************** */
  12306. #ifndef MNG_NO_16BIT_SUPPORT
  12307. mng_retcode mng_scale_g4_g16 (mng_datap pData)
  12308. {
  12309. mng_uint8p pWorkrow = pData->pRGBArow;
  12310. mng_uint8p pOutrow = pData->pRGBArow;
  12311. mng_int32 iX;
  12312. #ifdef MNG_SUPPORT_TRACE
  12313. MNG_TRACE (pData, MNG_FN_SCALE_G4_G16, MNG_LC_START);
  12314. #endif
  12315. pWorkrow = pWorkrow + (pData->iRowsamples - 1);
  12316. pOutrow = pOutrow + ((pData->iRowsamples - 1) << 1);
  12317. /* pWorkrow = (mng_uint8p)((mng_uint32)pWorkrow + pData->iRowsamples - 1); */
  12318. /* pOutrow = (mng_uint8p)((mng_uint32)pOutrow + ((pData->iRowsamples - 1) << 1)); */
  12319. #ifdef MNG_DECREMENT_LOOPS
  12320. for (iX = pData->iRowsamples; iX > 0; iX--)
  12321. #else
  12322. for (iX = 0; iX < pData->iRowsamples; iX++)
  12323. #endif
  12324. {
  12325. *(pOutrow+1) = 0;
  12326. *pOutrow = (mng_uint8)(*pWorkrow << 4);
  12327. pWorkrow--;
  12328. pOutrow -= 2;
  12329. }
  12330. #ifdef MNG_SUPPORT_TRACE
  12331. MNG_TRACE (pData, MNG_FN_SCALE_G4_G16, MNG_LC_END);
  12332. #endif
  12333. return MNG_NOERROR;
  12334. }
  12335. #endif
  12336. #endif /* MNG_NO_1_2_4BIT_SUPPORT */
  12337. /* ************************************************************************** */
  12338. #ifndef MNG_NO_16BIT_SUPPORT
  12339. mng_retcode mng_scale_g8_g16 (mng_datap pData)
  12340. {
  12341. mng_uint8p pWorkrow = pData->pRGBArow;
  12342. mng_uint8p pOutrow = pData->pRGBArow;
  12343. mng_int32 iX;
  12344. #ifdef MNG_SUPPORT_TRACE
  12345. MNG_TRACE (pData, MNG_FN_SCALE_G8_G16, MNG_LC_START);
  12346. #endif
  12347. pWorkrow = pWorkrow + (pData->iRowsamples - 1);
  12348. pOutrow = pOutrow + ((pData->iRowsamples - 1) << 1);
  12349. /* pWorkrow = (mng_uint8p)((mng_uint32)pWorkrow + pData->iRowsamples - 1); */
  12350. /* pOutrow = (mng_uint8p)((mng_uint32)pOutrow + ((pData->iRowsamples - 1) << 1)); */
  12351. #ifdef MNG_DECREMENT_LOOPS
  12352. for (iX = pData->iRowsamples; iX > 0; iX--)
  12353. #else
  12354. for (iX = 0; iX < pData->iRowsamples; iX++)
  12355. #endif
  12356. {
  12357. *(pOutrow+1) = 0;
  12358. *pOutrow = *pWorkrow;
  12359. pWorkrow--;
  12360. pOutrow -= 2;
  12361. }
  12362. #ifdef MNG_SUPPORT_TRACE
  12363. MNG_TRACE (pData, MNG_FN_SCALE_G8_G16, MNG_LC_END);
  12364. #endif
  12365. return MNG_NOERROR;
  12366. }
  12367. #endif
  12368. /* ************************************************************************** */
  12369. #ifndef MNG_NO_16BIT_SUPPORT
  12370. mng_retcode mng_scale_ga8_ga16 (mng_datap pData)
  12371. {
  12372. mng_uint8p pWorkrow = pData->pRGBArow;
  12373. mng_uint8p pOutrow = pData->pRGBArow;
  12374. mng_int32 iX;
  12375. #ifdef MNG_SUPPORT_TRACE
  12376. MNG_TRACE (pData, MNG_FN_SCALE_GA8_GA16, MNG_LC_START);
  12377. #endif
  12378. pWorkrow = pWorkrow + ((pData->iRowsamples - 1) << 1);
  12379. pOutrow = pOutrow + ((pData->iRowsamples - 1) << 2);
  12380. /* pWorkrow = (mng_uint8p)((mng_uint32)pWorkrow + ((pData->iRowsamples - 1) << 1)); */
  12381. /* pOutrow = (mng_uint8p)((mng_uint32)pOutrow + ((pData->iRowsamples - 1) << 2)); */
  12382. #ifdef MNG_DECREMENT_LOOPS
  12383. for (iX = pData->iRowsamples; iX > 0; iX--)
  12384. #else
  12385. for (iX = 0; iX < pData->iRowsamples; iX++)
  12386. #endif
  12387. {
  12388. *(pOutrow+3) = 0;
  12389. *(pOutrow+2) = *(pWorkrow+1);
  12390. *(pOutrow+1) = 0;
  12391. *pOutrow = *pWorkrow;
  12392. pWorkrow -= 2;
  12393. pOutrow -= 4;
  12394. }
  12395. #ifdef MNG_SUPPORT_TRACE
  12396. MNG_TRACE (pData, MNG_FN_SCALE_GA8_GA16, MNG_LC_END);
  12397. #endif
  12398. return MNG_NOERROR;
  12399. }
  12400. #endif
  12401. /* ************************************************************************** */
  12402. #ifndef MNG_NO_16BIT_SUPPORT
  12403. mng_retcode mng_scale_rgb8_rgb16 (mng_datap pData)
  12404. {
  12405. mng_uint8p pWorkrow = pData->pRGBArow;
  12406. mng_uint8p pOutrow = pData->pRGBArow;
  12407. mng_int32 iX;
  12408. #ifdef MNG_SUPPORT_TRACE
  12409. MNG_TRACE (pData, MNG_FN_SCALE_RGB8_RGB16, MNG_LC_START);
  12410. #endif
  12411. pWorkrow = pWorkrow + (3 * (pData->iRowsamples - 1));
  12412. pOutrow = pOutrow + (6 * (pData->iRowsamples - 1));
  12413. /* pWorkrow = (mng_uint8p)((mng_uint32)pWorkrow + 3 * (pData->iRowsamples - 1)); */
  12414. /* pOutrow = (mng_uint8p)((mng_uint32)pOutrow + 6 * (pData->iRowsamples - 1)); */
  12415. #ifdef MNG_DECREMENT_LOOPS
  12416. for (iX = pData->iRowsamples; iX > 0; iX--)
  12417. #else
  12418. for (iX = 0; iX < pData->iRowsamples; iX++)
  12419. #endif
  12420. {
  12421. *(pOutrow+5) = 0;
  12422. *(pOutrow+4) = *(pWorkrow+2);
  12423. *(pOutrow+3) = 0;
  12424. *(pOutrow+2) = *(pWorkrow+1);
  12425. *(pOutrow+1) = 0;
  12426. *pOutrow = *pWorkrow;
  12427. pWorkrow -= 3;
  12428. pOutrow -= 6;
  12429. }
  12430. #ifdef MNG_SUPPORT_TRACE
  12431. MNG_TRACE (pData, MNG_FN_SCALE_RGB8_RGB16, MNG_LC_END);
  12432. #endif
  12433. return MNG_NOERROR;
  12434. }
  12435. #endif
  12436. /* ************************************************************************** */
  12437. #ifndef MNG_NO_16BIT_SUPPORT
  12438. mng_retcode mng_scale_rgba8_rgba16 (mng_datap pData)
  12439. {
  12440. mng_uint8p pWorkrow = pData->pRGBArow;
  12441. mng_uint8p pOutrow = pData->pRGBArow;
  12442. mng_int32 iX;
  12443. #ifdef MNG_SUPPORT_TRACE
  12444. MNG_TRACE (pData, MNG_FN_SCALE_RGBA8_RGBA16, MNG_LC_START);
  12445. #endif
  12446. pWorkrow = pWorkrow + ((pData->iRowsamples - 1) << 2);
  12447. pOutrow = pOutrow + ((pData->iRowsamples - 1) << 3);
  12448. /* pWorkrow = (mng_uint8p)((mng_uint32)pWorkrow + ((pData->iRowsamples - 1) << 2)); */
  12449. /* pOutrow = (mng_uint8p)((mng_uint32)pOutrow + ((pData->iRowsamples - 1) << 3)); */
  12450. #ifdef MNG_DECREMENT_LOOPS
  12451. for (iX = pData->iRowsamples; iX > 0; iX--)
  12452. #else
  12453. for (iX = 0; iX < pData->iRowsamples; iX++)
  12454. #endif
  12455. {
  12456. *(pOutrow+7) = 0;
  12457. *(pOutrow+6) = *(pWorkrow+3);
  12458. *(pOutrow+5) = 0;
  12459. *(pOutrow+4) = *(pWorkrow+2);
  12460. *(pOutrow+3) = 0;
  12461. *(pOutrow+2) = *(pWorkrow+1);
  12462. *(pOutrow+1) = 0;
  12463. *pOutrow = *pWorkrow;
  12464. pWorkrow -= 4;
  12465. pOutrow -= 8;
  12466. }
  12467. #ifdef MNG_SUPPORT_TRACE
  12468. MNG_TRACE (pData, MNG_FN_SCALE_RGBA8_RGBA16, MNG_LC_END);
  12469. #endif
  12470. return MNG_NOERROR;
  12471. }
  12472. #endif
  12473. /* ************************************************************************** */
  12474. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  12475. mng_retcode mng_scale_g2_g1 (mng_datap pData)
  12476. {
  12477. mng_uint8p pWorkrow = pData->pRGBArow;
  12478. mng_int32 iX;
  12479. #ifdef MNG_SUPPORT_TRACE
  12480. MNG_TRACE (pData, MNG_FN_SCALE_G2_G1, MNG_LC_START);
  12481. #endif
  12482. #ifdef MNG_DECREMENT_LOOPS
  12483. for (iX = pData->iRowsamples; iX > 0; iX--)
  12484. #else
  12485. for (iX = 0; iX < pData->iRowsamples; iX++)
  12486. #endif
  12487. {
  12488. *pWorkrow = (mng_uint8)(*pWorkrow >> 1);
  12489. pWorkrow++;
  12490. }
  12491. #ifdef MNG_SUPPORT_TRACE
  12492. MNG_TRACE (pData, MNG_FN_SCALE_G2_G1, MNG_LC_END);
  12493. #endif
  12494. return MNG_NOERROR;
  12495. }
  12496. /* ************************************************************************** */
  12497. mng_retcode mng_scale_g4_g1 (mng_datap pData)
  12498. {
  12499. mng_uint8p pWorkrow = pData->pRGBArow;
  12500. mng_int32 iX;
  12501. #ifdef MNG_SUPPORT_TRACE
  12502. MNG_TRACE (pData, MNG_FN_SCALE_G4_G1, MNG_LC_START);
  12503. #endif
  12504. #ifdef MNG_DECREMENT_LOOPS
  12505. for (iX = pData->iRowsamples; iX > 0; iX--)
  12506. #else
  12507. for (iX = 0; iX < pData->iRowsamples; iX++)
  12508. #endif
  12509. {
  12510. *pWorkrow = (mng_uint8)(*pWorkrow >> 3);
  12511. pWorkrow++;
  12512. }
  12513. #ifdef MNG_SUPPORT_TRACE
  12514. MNG_TRACE (pData, MNG_FN_SCALE_G4_G1, MNG_LC_END);
  12515. #endif
  12516. return MNG_NOERROR;
  12517. }
  12518. /* ************************************************************************** */
  12519. mng_retcode mng_scale_g8_g1 (mng_datap pData)
  12520. {
  12521. mng_uint8p pWorkrow = pData->pRGBArow;
  12522. mng_int32 iX;
  12523. #ifdef MNG_SUPPORT_TRACE
  12524. MNG_TRACE (pData, MNG_FN_SCALE_G8_G1, MNG_LC_START);
  12525. #endif
  12526. #ifdef MNG_DECREMENT_LOOPS
  12527. for (iX = pData->iRowsamples; iX > 0; iX--)
  12528. #else
  12529. for (iX = 0; iX < pData->iRowsamples; iX++)
  12530. #endif
  12531. {
  12532. *pWorkrow = (mng_uint8)(*pWorkrow >> 7);
  12533. pWorkrow++;
  12534. }
  12535. #ifdef MNG_SUPPORT_TRACE
  12536. MNG_TRACE (pData, MNG_FN_SCALE_G8_G1, MNG_LC_END);
  12537. #endif
  12538. return MNG_NOERROR;
  12539. }
  12540. /* ************************************************************************** */
  12541. #ifndef MNG_NO_16BIT_SUPPORT
  12542. mng_retcode mng_scale_g16_g1 (mng_datap pData)
  12543. {
  12544. mng_uint8p pWorkrow = pData->pRGBArow;
  12545. mng_uint8p pOutrow = pData->pRGBArow;
  12546. mng_int32 iX;
  12547. #ifdef MNG_SUPPORT_TRACE
  12548. MNG_TRACE (pData, MNG_FN_SCALE_G16_G1, MNG_LC_START);
  12549. #endif
  12550. #ifdef MNG_DECREMENT_LOOPS
  12551. for (iX = pData->iRowsamples; iX > 0; iX--)
  12552. #else
  12553. for (iX = 0; iX < pData->iRowsamples; iX++)
  12554. #endif
  12555. {
  12556. *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 15);
  12557. pOutrow++;
  12558. pWorkrow += 2;
  12559. }
  12560. #ifdef MNG_SUPPORT_TRACE
  12561. MNG_TRACE (pData, MNG_FN_SCALE_G16_G1, MNG_LC_END);
  12562. #endif
  12563. return MNG_NOERROR;
  12564. }
  12565. #endif
  12566. /* ************************************************************************** */
  12567. mng_retcode mng_scale_g4_g2 (mng_datap pData)
  12568. {
  12569. mng_uint8p pWorkrow = pData->pRGBArow;
  12570. mng_int32 iX;
  12571. #ifdef MNG_SUPPORT_TRACE
  12572. MNG_TRACE (pData, MNG_FN_SCALE_G4_G2, MNG_LC_START);
  12573. #endif
  12574. #ifdef MNG_DECREMENT_LOOPS
  12575. for (iX = pData->iRowsamples; iX > 0; iX--)
  12576. #else
  12577. for (iX = 0; iX < pData->iRowsamples; iX++)
  12578. #endif
  12579. {
  12580. *pWorkrow = (mng_uint8)(*pWorkrow >> 2);
  12581. pWorkrow++;
  12582. }
  12583. #ifdef MNG_SUPPORT_TRACE
  12584. MNG_TRACE (pData, MNG_FN_SCALE_G4_G2, MNG_LC_END);
  12585. #endif
  12586. return MNG_NOERROR;
  12587. }
  12588. /* ************************************************************************** */
  12589. mng_retcode mng_scale_g8_g2 (mng_datap pData)
  12590. {
  12591. mng_uint8p pWorkrow = pData->pRGBArow;
  12592. mng_int32 iX;
  12593. #ifdef MNG_SUPPORT_TRACE
  12594. MNG_TRACE (pData, MNG_FN_SCALE_G8_G2, MNG_LC_START);
  12595. #endif
  12596. #ifdef MNG_DECREMENT_LOOPS
  12597. for (iX = pData->iRowsamples; iX > 0; iX--)
  12598. #else
  12599. for (iX = 0; iX < pData->iRowsamples; iX++)
  12600. #endif
  12601. {
  12602. *pWorkrow = (mng_uint8)(*pWorkrow >> 6);
  12603. pWorkrow++;
  12604. }
  12605. #ifdef MNG_SUPPORT_TRACE
  12606. MNG_TRACE (pData, MNG_FN_SCALE_G8_G2, MNG_LC_END);
  12607. #endif
  12608. return MNG_NOERROR;
  12609. }
  12610. /* ************************************************************************** */
  12611. #ifndef MNG_NO_16BIT_SUPPORT
  12612. mng_retcode mng_scale_g16_g2 (mng_datap pData)
  12613. {
  12614. mng_uint8p pWorkrow = pData->pRGBArow;
  12615. mng_uint8p pOutrow = pData->pRGBArow;
  12616. mng_int32 iX;
  12617. #ifdef MNG_SUPPORT_TRACE
  12618. MNG_TRACE (pData, MNG_FN_SCALE_G16_G2, MNG_LC_START);
  12619. #endif
  12620. #ifdef MNG_DECREMENT_LOOPS
  12621. for (iX = pData->iRowsamples; iX > 0; iX--)
  12622. #else
  12623. for (iX = 0; iX < pData->iRowsamples; iX++)
  12624. #endif
  12625. {
  12626. *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 14);
  12627. pOutrow++;
  12628. pWorkrow += 2;
  12629. }
  12630. #ifdef MNG_SUPPORT_TRACE
  12631. MNG_TRACE (pData, MNG_FN_SCALE_G16_G2, MNG_LC_END);
  12632. #endif
  12633. return MNG_NOERROR;
  12634. }
  12635. #endif
  12636. /* ************************************************************************** */
  12637. mng_retcode mng_scale_g8_g4 (mng_datap pData)
  12638. {
  12639. mng_uint8p pWorkrow = pData->pRGBArow;
  12640. mng_int32 iX;
  12641. #ifdef MNG_SUPPORT_TRACE
  12642. MNG_TRACE (pData, MNG_FN_SCALE_G8_G4, MNG_LC_START);
  12643. #endif
  12644. #ifdef MNG_DECREMENT_LOOPS
  12645. for (iX = pData->iRowsamples; iX > 0; iX--)
  12646. #else
  12647. for (iX = 0; iX < pData->iRowsamples; iX++)
  12648. #endif
  12649. {
  12650. *pWorkrow = (mng_uint8)(*pWorkrow >> 4);
  12651. pWorkrow++;
  12652. }
  12653. #ifdef MNG_SUPPORT_TRACE
  12654. MNG_TRACE (pData, MNG_FN_SCALE_G8_G4, MNG_LC_END);
  12655. #endif
  12656. return MNG_NOERROR;
  12657. }
  12658. /* ************************************************************************** */
  12659. #ifndef MNG_NO_16BIT_SUPPORT
  12660. mng_retcode mng_scale_g16_g4 (mng_datap pData)
  12661. {
  12662. mng_uint8p pWorkrow = pData->pRGBArow;
  12663. mng_uint8p pOutrow = pData->pRGBArow;
  12664. mng_int32 iX;
  12665. #ifdef MNG_SUPPORT_TRACE
  12666. MNG_TRACE (pData, MNG_FN_SCALE_G16_G4, MNG_LC_START);
  12667. #endif
  12668. #ifdef MNG_DECREMENT_LOOPS
  12669. for (iX = pData->iRowsamples; iX > 0; iX--)
  12670. #else
  12671. for (iX = 0; iX < pData->iRowsamples; iX++)
  12672. #endif
  12673. {
  12674. *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 12);
  12675. pOutrow++;
  12676. pWorkrow += 2;
  12677. }
  12678. #ifdef MNG_SUPPORT_TRACE
  12679. MNG_TRACE (pData, MNG_FN_SCALE_G16_G4, MNG_LC_END);
  12680. #endif
  12681. return MNG_NOERROR;
  12682. }
  12683. #endif
  12684. #endif /* NO_1_2_4BIT_SUPPORT */
  12685. /* ************************************************************************** */
  12686. mng_retcode mng_scale_g16_g8 (mng_datap pData)
  12687. {
  12688. mng_uint8p pWorkrow = pData->pRGBArow;
  12689. mng_uint8p pOutrow = pData->pRGBArow;
  12690. mng_int32 iX;
  12691. #ifdef MNG_SUPPORT_TRACE
  12692. MNG_TRACE (pData, MNG_FN_SCALE_G16_G8, MNG_LC_START);
  12693. #endif
  12694. #ifdef MNG_DECREMENT_LOOPS
  12695. for (iX = pData->iRowsamples; iX > 0; iX--)
  12696. #else
  12697. for (iX = 0; iX < pData->iRowsamples; iX++)
  12698. #endif
  12699. {
  12700. *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 8);
  12701. pOutrow++;
  12702. pWorkrow += 2;
  12703. }
  12704. #ifdef MNG_SUPPORT_TRACE
  12705. MNG_TRACE (pData, MNG_FN_SCALE_G16_G8, MNG_LC_END);
  12706. #endif
  12707. return MNG_NOERROR;
  12708. }
  12709. /* ************************************************************************** */
  12710. mng_retcode mng_scale_ga16_ga8 (mng_datap pData)
  12711. {
  12712. mng_uint8p pWorkrow = pData->pRGBArow;
  12713. mng_uint8p pOutrow = pData->pRGBArow;
  12714. mng_int32 iX;
  12715. #ifdef MNG_SUPPORT_TRACE
  12716. MNG_TRACE (pData, MNG_FN_SCALE_GA16_GA8, MNG_LC_START);
  12717. #endif
  12718. #ifdef MNG_DECREMENT_LOOPS
  12719. for (iX = pData->iRowsamples; iX > 0; iX--)
  12720. #else
  12721. for (iX = 0; iX < pData->iRowsamples; iX++)
  12722. #endif
  12723. {
  12724. *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 8);
  12725. pOutrow++;
  12726. pWorkrow += 2;
  12727. *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 8);
  12728. pOutrow++;
  12729. pWorkrow += 2;
  12730. }
  12731. #ifdef MNG_SUPPORT_TRACE
  12732. MNG_TRACE (pData, MNG_FN_SCALE_GA16_GA8, MNG_LC_END);
  12733. #endif
  12734. return MNG_NOERROR;
  12735. }
  12736. /* ************************************************************************** */
  12737. mng_retcode mng_scale_rgb16_rgb8 (mng_datap pData)
  12738. {
  12739. mng_uint8p pWorkrow = pData->pRGBArow;
  12740. mng_uint8p pOutrow = pData->pRGBArow;
  12741. mng_int32 iX;
  12742. #ifdef MNG_SUPPORT_TRACE
  12743. MNG_TRACE (pData, MNG_FN_SCALE_RGB16_RGB8, MNG_LC_START);
  12744. #endif
  12745. #ifdef MNG_DECREMENT_LOOPS
  12746. for (iX = pData->iRowsamples; iX > 0; iX--)
  12747. #else
  12748. for (iX = 0; iX < pData->iRowsamples; iX++)
  12749. #endif
  12750. {
  12751. *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 8);
  12752. pOutrow++;
  12753. pWorkrow += 2;
  12754. *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 8);
  12755. pOutrow++;
  12756. pWorkrow += 2;
  12757. *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 8);
  12758. pOutrow++;
  12759. pWorkrow += 2;
  12760. }
  12761. #ifdef MNG_SUPPORT_TRACE
  12762. MNG_TRACE (pData, MNG_FN_SCALE_RGB16_RGB8, MNG_LC_END);
  12763. #endif
  12764. return MNG_NOERROR;
  12765. }
  12766. /* ************************************************************************** */
  12767. mng_retcode mng_scale_rgba16_rgba8 (mng_datap pData)
  12768. {
  12769. mng_uint8p pWorkrow = pData->pRGBArow;
  12770. mng_uint8p pOutrow = pData->pRGBArow;
  12771. mng_int32 iX;
  12772. #ifdef MNG_SUPPORT_TRACE
  12773. MNG_TRACE (pData, MNG_FN_SCALE_RGBA16_RGBA8, MNG_LC_START);
  12774. #endif
  12775. #ifdef MNG_DECREMENT_LOOPS
  12776. for (iX = pData->iRowsamples; iX > 0; iX--)
  12777. #else
  12778. for (iX = 0; iX < pData->iRowsamples; iX++)
  12779. #endif
  12780. {
  12781. *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 8);
  12782. pOutrow++;
  12783. pWorkrow += 2;
  12784. *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 8);
  12785. pOutrow++;
  12786. pWorkrow += 2;
  12787. *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 8);
  12788. pOutrow++;
  12789. pWorkrow += 2;
  12790. *pOutrow = (mng_uint8)(mng_get_uint16 (pWorkrow) >> 8);
  12791. pOutrow++;
  12792. pWorkrow += 2;
  12793. }
  12794. #ifdef MNG_SUPPORT_TRACE
  12795. MNG_TRACE (pData, MNG_FN_SCALE_RGBA16_RGBA8, MNG_LC_END);
  12796. #endif
  12797. return MNG_NOERROR;
  12798. }
  12799. #endif
  12800. /* ************************************************************************** */
  12801. /* * * */
  12802. /* * Delta-image bit routines - promote bit_depth * */
  12803. /* * * */
  12804. /* ************************************************************************** */
  12805. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  12806. mng_uint8 mng_promote_replicate_1_2 (mng_uint8 iB)
  12807. {
  12808. return (mng_uint8)((iB << 1) | iB);
  12809. }
  12810. /* ************************************************************************** */
  12811. mng_uint8 mng_promote_replicate_1_4 (mng_uint8 iB)
  12812. {
  12813. iB = (mng_uint8)((iB << 1) + iB);
  12814. return (mng_uint8)((iB << 2) + iB);
  12815. }
  12816. /* ************************************************************************** */
  12817. mng_uint8 mng_promote_replicate_1_8 (mng_uint8 iB)
  12818. {
  12819. iB = (mng_uint8)((iB << 1) + iB);
  12820. iB = (mng_uint8)((iB << 2) + iB);
  12821. return (mng_uint8)((iB << 4) + iB);
  12822. }
  12823. /* ************************************************************************** */
  12824. #ifndef MNG_NO_16BIT_SUPPORT
  12825. mng_uint16 mng_promote_replicate_1_16 (mng_uint8 iB)
  12826. {
  12827. iB = (mng_uint8)((iB << 1) + iB);
  12828. iB = (mng_uint8)((iB << 2) + iB);
  12829. iB = (mng_uint8)((iB << 4) + iB);
  12830. return (mng_uint16)(((mng_uint16)iB << 8) + (mng_uint16)iB);
  12831. }
  12832. #endif
  12833. /* ************************************************************************** */
  12834. mng_uint8 mng_promote_replicate_2_4 (mng_uint8 iB)
  12835. {
  12836. return (mng_uint8)((iB << 2) + iB);
  12837. }
  12838. /* ************************************************************************** */
  12839. mng_uint8 mng_promote_replicate_2_8 (mng_uint8 iB)
  12840. {
  12841. iB = (mng_uint8)((iB << 2) + iB);
  12842. return (mng_uint8)((iB << 4) + iB);
  12843. }
  12844. /* ************************************************************************** */
  12845. #ifndef MNG_NO_16BIT_SUPPORT
  12846. mng_uint16 mng_promote_replicate_2_16 (mng_uint8 iB)
  12847. {
  12848. iB = (mng_uint8)((iB << 2) + iB);
  12849. iB = (mng_uint8)((iB << 4) + iB);
  12850. return (mng_uint16)(((mng_uint16)iB << 8) + (mng_uint16)iB);
  12851. }
  12852. #endif
  12853. /* ************************************************************************** */
  12854. mng_uint8 mng_promote_replicate_4_8 (mng_uint8 iB)
  12855. {
  12856. return (mng_uint8)((iB << 4) + iB);
  12857. }
  12858. /* ************************************************************************** */
  12859. #ifndef MNG_NO_16BIT_SUPPORT
  12860. mng_uint16 mng_promote_replicate_4_16 (mng_uint8 iB)
  12861. {
  12862. iB = (mng_uint8)((iB << 4) + iB);
  12863. return (mng_uint16)(((mng_uint16)iB << 8) + (mng_uint16)iB);
  12864. }
  12865. #endif
  12866. #endif /* NO_1_2_4BIT_SUPPORT */
  12867. /* ************************************************************************** */
  12868. #ifndef MNG_NO_16BIT_SUPPORT
  12869. mng_uint16 mng_promote_replicate_8_16 (mng_uint8 iB)
  12870. {
  12871. return (mng_uint16)(((mng_uint16)iB << 8) + (mng_uint16)iB);
  12872. }
  12873. #endif
  12874. /* ************************************************************************** */
  12875. #if !defined(MNG_NO_DELTA_PNG)
  12876. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  12877. mng_uint8 mng_promote_zerofill_1_2 (mng_uint8 iB)
  12878. {
  12879. return (mng_uint8)(iB << 1);
  12880. }
  12881. /* ************************************************************************** */
  12882. mng_uint8 mng_promote_zerofill_1_4 (mng_uint8 iB)
  12883. {
  12884. return (mng_uint8)(iB << 3);
  12885. }
  12886. /* ************************************************************************** */
  12887. mng_uint8 mng_promote_zerofill_1_8 (mng_uint8 iB)
  12888. {
  12889. return (mng_uint8)(iB << 7);
  12890. }
  12891. /* ************************************************************************** */
  12892. #ifndef MNG_NO_16BIT_SUPPORT
  12893. mng_uint16 mng_promote_zerofill_1_16 (mng_uint8 iB)
  12894. {
  12895. return (mng_uint16)((mng_uint16)iB << 15);
  12896. }
  12897. #endif
  12898. /* ************************************************************************** */
  12899. mng_uint8 mng_promote_zerofill_2_4 (mng_uint8 iB)
  12900. {
  12901. return (mng_uint8)(iB << 2);
  12902. }
  12903. /* ************************************************************************** */
  12904. mng_uint8 mng_promote_zerofill_2_8 (mng_uint8 iB)
  12905. {
  12906. return (mng_uint8)(iB << 6);
  12907. }
  12908. /* ************************************************************************** */
  12909. #ifndef MNG_NO_16BIT_SUPPORT
  12910. mng_uint16 mng_promote_zerofill_2_16 (mng_uint8 iB)
  12911. {
  12912. return (mng_uint16)((mng_uint16)iB << 14);
  12913. }
  12914. #endif
  12915. /* ************************************************************************** */
  12916. mng_uint8 mng_promote_zerofill_4_8 (mng_uint8 iB)
  12917. {
  12918. return (mng_uint8)(iB << 4);
  12919. }
  12920. /* ************************************************************************** */
  12921. #ifndef MNG_NO_16BIT_SUPPORT
  12922. mng_uint16 mng_promote_zerofill_4_16 (mng_uint8 iB)
  12923. {
  12924. return (mng_uint16)((mng_uint16)iB << 12);
  12925. }
  12926. #endif
  12927. #endif /* MNG_NO_1_2_4BIT_SUPPORT */
  12928. /* ************************************************************************** */
  12929. #ifndef MNG_NO_16BIT_SUPPORT
  12930. mng_uint16 mng_promote_zerofill_8_16 (mng_uint8 iB)
  12931. {
  12932. return (mng_uint16)((mng_uint16)iB << 8);
  12933. }
  12934. #endif
  12935. #endif /* MNG_NO_DELTA_PNG */
  12936. /* ************************************************************************** */
  12937. /* * * */
  12938. /* * Delta-image row routines - promote color_type * */
  12939. /* * * */
  12940. /* ************************************************************************** */
  12941. #if !defined(MNG_NO_DELTA_PNG) || !defined(MNG_SKIPCHUNK_PAST) || !defined(MNG_SKIPCHUNK_MAGN)
  12942. mng_retcode mng_promote_g8_g8 (mng_datap pData)
  12943. {
  12944. mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc;
  12945. mng_uint8p pDstline = (mng_uint8p)pData->pPromDst;
  12946. mng_uint32 iX;
  12947. mng_uint8 iB;
  12948. #ifdef MNG_SUPPORT_TRACE
  12949. MNG_TRACE (pData, MNG_FN_PROMOTE_G8_G8, MNG_LC_START);
  12950. #endif
  12951. #ifdef MNG_DECREMENT_LOOPS
  12952. for (iX = pData->iPromWidth; iX > 0; iX--)
  12953. #else
  12954. for (iX = 0; iX < pData->iPromWidth; iX++)
  12955. #endif
  12956. {
  12957. iB = *pSrcline;
  12958. if (pData->fPromBitdepth) /* bitdepth promoted ? */
  12959. iB = ((mng_bitdepth_8)pData->fPromBitdepth) (iB);
  12960. *pDstline = iB;
  12961. pSrcline++;
  12962. pDstline++;
  12963. }
  12964. #ifdef MNG_SUPPORT_TRACE
  12965. MNG_TRACE (pData, MNG_FN_PROMOTE_G8_G8, MNG_LC_END);
  12966. #endif
  12967. return MNG_NOERROR;
  12968. }
  12969. /* ************************************************************************** */
  12970. #ifndef MNG_NO_16BIT_SUPPORT
  12971. mng_retcode mng_promote_g8_g16 (mng_datap pData)
  12972. {
  12973. mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc;
  12974. mng_uint8p pDstline = (mng_uint8p)pData->pPromDst;
  12975. mng_uint32 iX;
  12976. mng_uint16 iW;
  12977. #ifdef MNG_SUPPORT_TRACE
  12978. MNG_TRACE (pData, MNG_FN_PROMOTE_G8_G16, MNG_LC_START);
  12979. #endif
  12980. #ifdef MNG_DECREMENT_LOOPS
  12981. for (iX = pData->iPromWidth; iX > 0; iX--)
  12982. #else
  12983. for (iX = 0; iX < pData->iPromWidth; iX++)
  12984. #endif
  12985. {
  12986. iW = ((mng_bitdepth_16)pData->fPromBitdepth) (*pSrcline);
  12987. *pDstline = (mng_uint8)(iW >> 8);
  12988. *(pDstline+1) = (mng_uint8)(iW && 0xFF);
  12989. pSrcline++;
  12990. pDstline += 2;
  12991. }
  12992. #ifdef MNG_SUPPORT_TRACE
  12993. MNG_TRACE (pData, MNG_FN_PROMOTE_G8_G16, MNG_LC_END);
  12994. #endif
  12995. return MNG_NOERROR;
  12996. }
  12997. /* ************************************************************************** */
  12998. mng_retcode mng_promote_g16_g16 (mng_datap pData)
  12999. {
  13000. mng_uint16p pSrcline = (mng_uint16p)pData->pPromSrc;
  13001. mng_uint16p pDstline = (mng_uint16p)pData->pPromDst;
  13002. mng_uint32 iX;
  13003. #ifdef MNG_SUPPORT_TRACE
  13004. MNG_TRACE (pData, MNG_FN_PROMOTE_G16_G16, MNG_LC_START);
  13005. #endif
  13006. #ifdef MNG_DECREMENT_LOOPS
  13007. for (iX = pData->iPromWidth; iX > 0; iX--)
  13008. #else
  13009. for (iX = 0; iX < pData->iPromWidth; iX++)
  13010. #endif
  13011. {
  13012. *pDstline = *pSrcline;
  13013. pSrcline++;
  13014. pDstline++;
  13015. }
  13016. #ifdef MNG_SUPPORT_TRACE
  13017. MNG_TRACE (pData, MNG_FN_PROMOTE_G16_G16, MNG_LC_END);
  13018. #endif
  13019. return MNG_NOERROR;
  13020. }
  13021. #endif
  13022. /* ************************************************************************** */
  13023. mng_retcode mng_promote_g8_ga8 (mng_datap pData)
  13024. {
  13025. mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf;
  13026. mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc;
  13027. mng_uint8p pDstline = (mng_uint8p)pData->pPromDst;
  13028. mng_uint32 iX;
  13029. mng_uint8 iB;
  13030. #ifdef MNG_SUPPORT_TRACE
  13031. MNG_TRACE (pData, MNG_FN_PROMOTE_G8_GA8, MNG_LC_START);
  13032. #endif
  13033. #ifdef MNG_DECREMENT_LOOPS
  13034. for (iX = pData->iPromWidth; iX > 0; iX--)
  13035. #else
  13036. for (iX = 0; iX < pData->iPromWidth; iX++)
  13037. #endif
  13038. {
  13039. iB = *pSrcline;
  13040. /* no cheap transparency ? */
  13041. if ((!pBuf->bHasTRNS) || ((mng_uint16)iB != pBuf->iTRNSgray))
  13042. *(pDstline+1) = 0xFF;
  13043. if (pData->fPromBitdepth) /* bitdepth promoted ? */
  13044. iB = ((mng_bitdepth_8)pData->fPromBitdepth) (iB);
  13045. *pDstline = iB;
  13046. pSrcline++;
  13047. pDstline += 2;
  13048. }
  13049. #ifdef MNG_SUPPORT_TRACE
  13050. MNG_TRACE (pData, MNG_FN_PROMOTE_G8_GA8, MNG_LC_END);
  13051. #endif
  13052. return MNG_NOERROR;
  13053. }
  13054. /* ************************************************************************** */
  13055. #ifndef MNG_NO_16BIT_SUPPORT
  13056. mng_retcode mng_promote_g8_ga16 (mng_datap pData)
  13057. {
  13058. mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf;
  13059. mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc;
  13060. mng_uint8p pDstline = (mng_uint8p)pData->pPromDst;
  13061. mng_uint32 iX;
  13062. mng_uint8 iB;
  13063. mng_uint16 iW;
  13064. #ifdef MNG_SUPPORT_TRACE
  13065. MNG_TRACE (pData, MNG_FN_PROMOTE_G8_GA16, MNG_LC_START);
  13066. #endif
  13067. #ifdef MNG_DECREMENT_LOOPS
  13068. for (iX = pData->iPromWidth; iX > 0; iX--)
  13069. #else
  13070. for (iX = 0; iX < pData->iPromWidth; iX++)
  13071. #endif
  13072. {
  13073. iB = *pSrcline;
  13074. /* no cheap transparency ? */
  13075. if ((!pBuf->bHasTRNS) || ((mng_uint16)iB != pBuf->iTRNSgray))
  13076. {
  13077. *(pDstline+2) = 0xFF;
  13078. *(pDstline+3) = 0xFF;
  13079. }
  13080. iW = ((mng_bitdepth_16)pData->fPromBitdepth) (iB);
  13081. *pDstline = (mng_uint8)(iW >> 8);
  13082. *(pDstline+1) = (mng_uint8)(iW && 0xFF);
  13083. pSrcline++;
  13084. pDstline += 4;
  13085. }
  13086. #ifdef MNG_SUPPORT_TRACE
  13087. MNG_TRACE (pData, MNG_FN_PROMOTE_G8_GA16, MNG_LC_END);
  13088. #endif
  13089. return MNG_NOERROR;
  13090. }
  13091. #endif
  13092. /* ************************************************************************** */
  13093. #ifndef MNG_NO_16BIT_SUPPORT
  13094. mng_retcode mng_promote_g16_ga16 (mng_datap pData)
  13095. {
  13096. mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf;
  13097. mng_uint16p pSrcline = (mng_uint16p)pData->pPromSrc;
  13098. mng_uint16p pDstline = (mng_uint16p)pData->pPromDst;
  13099. mng_uint32 iX;
  13100. mng_uint16 iW;
  13101. #ifdef MNG_SUPPORT_TRACE
  13102. MNG_TRACE (pData, MNG_FN_PROMOTE_G16_GA16, MNG_LC_START);
  13103. #endif
  13104. #ifdef MNG_DECREMENT_LOOPS
  13105. for (iX = pData->iPromWidth; iX > 0; iX--)
  13106. #else
  13107. for (iX = 0; iX < pData->iPromWidth; iX++)
  13108. #endif
  13109. {
  13110. iW = *pSrcline;
  13111. /* no cheap transparency ? */
  13112. if ((!pBuf->bHasTRNS) || ((mng_uint16)iW != pBuf->iTRNSgray))
  13113. *(pDstline+1) = 0xFFFF;
  13114. *pDstline = iW;
  13115. pSrcline++;
  13116. pDstline += 2;
  13117. }
  13118. #ifdef MNG_SUPPORT_TRACE
  13119. MNG_TRACE (pData, MNG_FN_PROMOTE_G16_GA16, MNG_LC_END);
  13120. #endif
  13121. return MNG_NOERROR;
  13122. }
  13123. #endif
  13124. /* ************************************************************************** */
  13125. mng_retcode mng_promote_g8_rgb8 (mng_datap pData)
  13126. {
  13127. mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc;
  13128. mng_uint8p pDstline = (mng_uint8p)pData->pPromDst;
  13129. mng_uint32 iX;
  13130. mng_uint8 iB;
  13131. #ifdef MNG_SUPPORT_TRACE
  13132. MNG_TRACE (pData, MNG_FN_PROMOTE_G8_RGB8, MNG_LC_START);
  13133. #endif
  13134. #ifdef MNG_DECREMENT_LOOPS
  13135. for (iX = pData->iPromWidth; iX > 0; iX--)
  13136. #else
  13137. for (iX = 0; iX < pData->iPromWidth; iX++)
  13138. #endif
  13139. {
  13140. iB = *pSrcline;
  13141. if (pData->fPromBitdepth) /* bitdepth promoted ? */
  13142. iB = ((mng_bitdepth_8)pData->fPromBitdepth) (iB);
  13143. *pDstline = iB;
  13144. *(pDstline+1) = iB;
  13145. *(pDstline+2) = iB;
  13146. pSrcline++;
  13147. pDstline += 3;
  13148. }
  13149. #ifdef MNG_SUPPORT_TRACE
  13150. MNG_TRACE (pData, MNG_FN_PROMOTE_G8_RGB8, MNG_LC_END);
  13151. #endif
  13152. return MNG_NOERROR;
  13153. }
  13154. /* ************************************************************************** */
  13155. #ifndef MNG_NO_16BIT_SUPPORT
  13156. mng_retcode mng_promote_g8_rgb16 (mng_datap pData)
  13157. {
  13158. mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc;
  13159. mng_uint8p pDstline = (mng_uint8p)pData->pPromDst;
  13160. mng_uint32 iX;
  13161. mng_uint8 iB;
  13162. mng_uint16 iW;
  13163. #ifdef MNG_SUPPORT_TRACE
  13164. MNG_TRACE (pData, MNG_FN_PROMOTE_G8_RGB16, MNG_LC_START);
  13165. #endif
  13166. #ifdef MNG_DECREMENT_LOOPS
  13167. for (iX = pData->iPromWidth; iX > 0; iX--)
  13168. #else
  13169. for (iX = 0; iX < pData->iPromWidth; iX++)
  13170. #endif
  13171. {
  13172. iB = *pSrcline;
  13173. iW = ((mng_bitdepth_16)pData->fPromBitdepth) (iB);
  13174. iB = (mng_uint8)(iW >> 8);
  13175. *pDstline = iB;
  13176. *(pDstline+2) = iB;
  13177. *(pDstline+4) = iB;
  13178. iB = (mng_uint8)(iW && 0xFF);
  13179. *(pDstline+1) = iB;
  13180. *(pDstline+3) = iB;
  13181. *(pDstline+5) = iB;
  13182. pSrcline++;
  13183. pDstline += 6;
  13184. }
  13185. #ifdef MNG_SUPPORT_TRACE
  13186. MNG_TRACE (pData, MNG_FN_PROMOTE_G8_RGB16, MNG_LC_END);
  13187. #endif
  13188. return MNG_NOERROR;
  13189. }
  13190. #endif
  13191. /* ************************************************************************** */
  13192. #ifndef MNG_NO_16BIT_SUPPORT
  13193. mng_retcode mng_promote_g16_rgb16 (mng_datap pData)
  13194. {
  13195. mng_uint16p pSrcline = (mng_uint16p)pData->pPromSrc;
  13196. mng_uint16p pDstline = (mng_uint16p)pData->pPromDst;
  13197. mng_uint32 iX;
  13198. mng_uint16 iW;
  13199. #ifdef MNG_SUPPORT_TRACE
  13200. MNG_TRACE (pData, MNG_FN_PROMOTE_G16_RGB16, MNG_LC_START);
  13201. #endif
  13202. #ifdef MNG_DECREMENT_LOOPS
  13203. for (iX = pData->iPromWidth; iX > 0; iX--)
  13204. #else
  13205. for (iX = 0; iX < pData->iPromWidth; iX++)
  13206. #endif
  13207. {
  13208. iW = *pSrcline;
  13209. *pDstline = iW;
  13210. *(pDstline+1) = iW;
  13211. *(pDstline+2) = iW;
  13212. pSrcline++;
  13213. pDstline += 3;
  13214. }
  13215. #ifdef MNG_SUPPORT_TRACE
  13216. MNG_TRACE (pData, MNG_FN_PROMOTE_G16_RGB16, MNG_LC_END);
  13217. #endif
  13218. return MNG_NOERROR;
  13219. }
  13220. #endif
  13221. /* ************************************************************************** */
  13222. mng_retcode mng_promote_g8_rgba8 (mng_datap pData)
  13223. {
  13224. mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf;
  13225. mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc;
  13226. mng_uint8p pDstline = (mng_uint8p)pData->pPromDst;
  13227. mng_uint32 iX;
  13228. mng_uint8 iB;
  13229. #ifdef MNG_SUPPORT_TRACE
  13230. MNG_TRACE (pData, MNG_FN_PROMOTE_G8_RGBA8, MNG_LC_START);
  13231. #endif
  13232. #ifdef MNG_DECREMENT_LOOPS
  13233. for (iX = pData->iPromWidth; iX > 0; iX--)
  13234. #else
  13235. for (iX = 0; iX < pData->iPromWidth; iX++)
  13236. #endif
  13237. {
  13238. iB = *pSrcline;
  13239. /* no cheap transparency ? */
  13240. if ((!pBuf->bHasTRNS) || ((mng_uint16)iB != pBuf->iTRNSgray))
  13241. *(pDstline+3) = 0xFF;
  13242. if (pData->fPromBitdepth) /* bitdepth promoted ? */
  13243. iB = ((mng_bitdepth_8)pData->fPromBitdepth) (iB);
  13244. *pDstline = iB;
  13245. *(pDstline+1) = iB;
  13246. *(pDstline+2) = iB;
  13247. pSrcline++;
  13248. pDstline += 4;
  13249. }
  13250. #ifdef MNG_SUPPORT_TRACE
  13251. MNG_TRACE (pData, MNG_FN_PROMOTE_G8_RGBA8, MNG_LC_END);
  13252. #endif
  13253. return MNG_NOERROR;
  13254. }
  13255. /* ************************************************************************** */
  13256. #ifndef MNG_NO_16BIT_SUPPORT
  13257. mng_retcode mng_promote_g8_rgba16 (mng_datap pData)
  13258. {
  13259. mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf;
  13260. mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc;
  13261. mng_uint8p pDstline = (mng_uint8p)pData->pPromDst;
  13262. mng_uint32 iX;
  13263. mng_uint8 iB;
  13264. mng_uint16 iW;
  13265. #ifdef MNG_SUPPORT_TRACE
  13266. MNG_TRACE (pData, MNG_FN_PROMOTE_G8_RGBA16, MNG_LC_START);
  13267. #endif
  13268. #ifdef MNG_DECREMENT_LOOPS
  13269. for (iX = pData->iPromWidth; iX > 0; iX--)
  13270. #else
  13271. for (iX = 0; iX < pData->iPromWidth; iX++)
  13272. #endif
  13273. {
  13274. iB = *pSrcline;
  13275. /* no cheap transparency ? */
  13276. if ((!pBuf->bHasTRNS) || ((mng_uint16)iB != pBuf->iTRNSgray))
  13277. {
  13278. *(pDstline+6) = 0xFF;
  13279. *(pDstline+7) = 0xFF;
  13280. }
  13281. iW = ((mng_bitdepth_16)pData->fPromBitdepth) (iB);
  13282. iB = (mng_uint8)(iW >> 8);
  13283. *pDstline = iB;
  13284. *(pDstline+2) = iB;
  13285. *(pDstline+4) = iB;
  13286. iB = (mng_uint8)(iW && 0xFF);
  13287. *(pDstline+1) = iB;
  13288. *(pDstline+3) = iB;
  13289. *(pDstline+5) = iB;;
  13290. pSrcline++;
  13291. pDstline += 8;
  13292. }
  13293. #ifdef MNG_SUPPORT_TRACE
  13294. MNG_TRACE (pData, MNG_FN_PROMOTE_G8_RGBA16, MNG_LC_END);
  13295. #endif
  13296. return MNG_NOERROR;
  13297. }
  13298. #endif
  13299. /* ************************************************************************** */
  13300. #ifndef MNG_NO_16BIT_SUPPORT
  13301. mng_retcode mng_promote_g16_rgba16 (mng_datap pData)
  13302. {
  13303. mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf;
  13304. mng_uint16p pSrcline = (mng_uint16p)pData->pPromSrc;
  13305. mng_uint16p pDstline = (mng_uint16p)pData->pPromDst;
  13306. mng_uint32 iX;
  13307. mng_uint16 iW;
  13308. #ifdef MNG_SUPPORT_TRACE
  13309. MNG_TRACE (pData, MNG_FN_PROMOTE_G16_RGBA16, MNG_LC_START);
  13310. #endif
  13311. #ifdef MNG_DECREMENT_LOOPS
  13312. for (iX = pData->iPromWidth; iX > 0; iX--)
  13313. #else
  13314. for (iX = 0; iX < pData->iPromWidth; iX++)
  13315. #endif
  13316. {
  13317. iW = *pSrcline;
  13318. /* no cheap transparency ? */
  13319. if ((!pBuf->bHasTRNS) || (iW != pBuf->iTRNSgray))
  13320. *(pDstline+3) = 0xFFFF;
  13321. *pDstline = iW;
  13322. *(pDstline+1) = iW;
  13323. *(pDstline+2) = iW;
  13324. pSrcline++;
  13325. pDstline += 4;
  13326. }
  13327. #ifdef MNG_SUPPORT_TRACE
  13328. MNG_TRACE (pData, MNG_FN_PROMOTE_G16_RGBA16, MNG_LC_END);
  13329. #endif
  13330. return MNG_NOERROR;
  13331. }
  13332. #endif
  13333. /* ************************************************************************** */
  13334. #ifndef MNG_NO_16BIT_SUPPORT
  13335. mng_retcode mng_promote_ga8_ga16 (mng_datap pData)
  13336. {
  13337. mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc;
  13338. mng_uint8p pDstline = (mng_uint8p)pData->pPromDst;
  13339. mng_uint32 iX;
  13340. mng_uint16 iW;
  13341. mng_uint16 iA;
  13342. #ifdef MNG_SUPPORT_TRACE
  13343. MNG_TRACE (pData, MNG_FN_PROMOTE_GA8_GA16, MNG_LC_START);
  13344. #endif
  13345. #ifdef MNG_DECREMENT_LOOPS
  13346. for (iX = pData->iPromWidth; iX > 0; iX--)
  13347. #else
  13348. for (iX = 0; iX < pData->iPromWidth; iX++)
  13349. #endif
  13350. {
  13351. iW = ((mng_bitdepth_16)pData->fPromBitdepth) (*pSrcline);
  13352. iA = ((mng_bitdepth_16)pData->fPromBitdepth) (*(pSrcline+1));
  13353. *pDstline = (mng_uint8)(iW >> 8);
  13354. *(pDstline+1) = (mng_uint8)(iW && 0xFF);
  13355. *(pDstline+2) = (mng_uint8)(iA >> 8);
  13356. *(pDstline+3) = (mng_uint8)(iA && 0xFF);
  13357. pSrcline += 2;
  13358. pDstline += 4;
  13359. }
  13360. #ifdef MNG_SUPPORT_TRACE
  13361. MNG_TRACE (pData, MNG_FN_PROMOTE_GA8_GA16, MNG_LC_END);
  13362. #endif
  13363. return MNG_NOERROR;
  13364. }
  13365. #endif
  13366. /* ************************************************************************** */
  13367. mng_retcode mng_promote_ga8_rgba8 (mng_datap pData)
  13368. {
  13369. mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc;
  13370. mng_uint8p pDstline = (mng_uint8p)pData->pPromDst;
  13371. mng_uint32 iX;
  13372. mng_uint8 iB;
  13373. mng_uint8 iA;
  13374. #ifdef MNG_SUPPORT_TRACE
  13375. MNG_TRACE (pData, MNG_FN_PROMOTE_GA8_RGBA8, MNG_LC_START);
  13376. #endif
  13377. #ifdef MNG_DECREMENT_LOOPS
  13378. for (iX = pData->iPromWidth; iX > 0; iX--)
  13379. #else
  13380. for (iX = 0; iX < pData->iPromWidth; iX++)
  13381. #endif
  13382. {
  13383. iB = *pSrcline;
  13384. iA = *(pSrcline+1);
  13385. *pDstline = iB;
  13386. *(pDstline+1) = iB;
  13387. *(pDstline+2) = iB;
  13388. *(pDstline+3) = iA;
  13389. pSrcline += 2;
  13390. pDstline += 4;
  13391. }
  13392. #ifdef MNG_SUPPORT_TRACE
  13393. MNG_TRACE (pData, MNG_FN_PROMOTE_GA8_RGBA8, MNG_LC_END);
  13394. #endif
  13395. return MNG_NOERROR;
  13396. }
  13397. /* ************************************************************************** */
  13398. #ifndef MNG_NO_16BIT_SUPPORT
  13399. mng_retcode mng_promote_ga8_rgba16 (mng_datap pData)
  13400. {
  13401. mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc;
  13402. mng_uint8p pDstline = (mng_uint8p)pData->pPromDst;
  13403. mng_uint32 iX;
  13404. mng_uint8 iB;
  13405. mng_uint16 iW;
  13406. mng_uint16 iA;
  13407. #ifdef MNG_SUPPORT_TRACE
  13408. MNG_TRACE (pData, MNG_FN_PROMOTE_GA8_RGBA16, MNG_LC_START);
  13409. #endif
  13410. #ifdef MNG_DECREMENT_LOOPS
  13411. for (iX = pData->iPromWidth; iX > 0; iX--)
  13412. #else
  13413. for (iX = 0; iX < pData->iPromWidth; iX++)
  13414. #endif
  13415. {
  13416. iW = ((mng_bitdepth_16)pData->fPromBitdepth) (*pSrcline);
  13417. iA = ((mng_bitdepth_16)pData->fPromBitdepth) (*(pSrcline+1));
  13418. iB = (mng_uint8)(iW >> 8);
  13419. *pDstline = iB;
  13420. *(pDstline+2) = iB;
  13421. *(pDstline+4) = iB;
  13422. iB = (mng_uint8)(iW && 0xFF);
  13423. *(pDstline+1) = iB;
  13424. *(pDstline+3) = iB;
  13425. *(pDstline+5) = iB;
  13426. *(pDstline+6) = (mng_uint8)(iA >> 8);
  13427. *(pDstline+7) = (mng_uint8)(iA && 0xFF);
  13428. pSrcline += 2;
  13429. pDstline += 8;
  13430. }
  13431. #ifdef MNG_SUPPORT_TRACE
  13432. MNG_TRACE (pData, MNG_FN_PROMOTE_GA8_RGBA16, MNG_LC_END);
  13433. #endif
  13434. return MNG_NOERROR;
  13435. }
  13436. #endif
  13437. /* ************************************************************************** */
  13438. #ifndef MNG_NO_16BIT_SUPPORT
  13439. mng_retcode mng_promote_ga16_rgba16 (mng_datap pData)
  13440. {
  13441. mng_uint16p pSrcline = (mng_uint16p)pData->pPromSrc;
  13442. mng_uint16p pDstline = (mng_uint16p)pData->pPromDst;
  13443. mng_uint32 iX;
  13444. mng_uint16 iW;
  13445. mng_uint16 iA;
  13446. #ifdef MNG_SUPPORT_TRACE
  13447. MNG_TRACE (pData, MNG_FN_PROMOTE_GA16_RGBA16, MNG_LC_START);
  13448. #endif
  13449. #ifdef MNG_DECREMENT_LOOPS
  13450. for (iX = pData->iPromWidth; iX > 0; iX--)
  13451. #else
  13452. for (iX = 0; iX < pData->iPromWidth; iX++)
  13453. #endif
  13454. {
  13455. iW = *pSrcline;
  13456. iA = *(pSrcline+1);
  13457. *pDstline = iW;
  13458. *(pDstline+1) = iW;
  13459. *(pDstline+2) = iW;
  13460. *(pDstline+3) = iA;
  13461. pSrcline += 2;
  13462. pDstline += 4;
  13463. }
  13464. #ifdef MNG_SUPPORT_TRACE
  13465. MNG_TRACE (pData, MNG_FN_PROMOTE_GA16_RGBA16, MNG_LC_END);
  13466. #endif
  13467. return MNG_NOERROR;
  13468. }
  13469. #endif
  13470. /* ************************************************************************** */
  13471. #ifndef MNG_NO_16BIT_SUPPORT
  13472. mng_retcode mng_promote_rgb8_rgb16 (mng_datap pData)
  13473. {
  13474. mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc;
  13475. mng_uint8p pDstline = (mng_uint8p)pData->pPromDst;
  13476. mng_uint32 iX;
  13477. mng_uint16 iR;
  13478. mng_uint16 iG;
  13479. mng_uint16 iB;
  13480. #ifdef MNG_SUPPORT_TRACE
  13481. MNG_TRACE (pData, MNG_FN_PROMOTE_RGB8_RGB16, MNG_LC_START);
  13482. #endif
  13483. #ifdef MNG_DECREMENT_LOOPS
  13484. for (iX = pData->iPromWidth; iX > 0; iX--)
  13485. #else
  13486. for (iX = 0; iX < pData->iPromWidth; iX++)
  13487. #endif
  13488. {
  13489. iR = ((mng_bitdepth_16)pData->fPromBitdepth) (*pSrcline);
  13490. iG = ((mng_bitdepth_16)pData->fPromBitdepth) (*(pSrcline+1));
  13491. iB = ((mng_bitdepth_16)pData->fPromBitdepth) (*(pSrcline+2));
  13492. *pDstline = (mng_uint8)(iR >> 8);
  13493. *(pDstline+1) = (mng_uint8)(iR && 0xFF);
  13494. *(pDstline+2) = (mng_uint8)(iG >> 8);
  13495. *(pDstline+3) = (mng_uint8)(iG && 0xFF);
  13496. *(pDstline+4) = (mng_uint8)(iB >> 8);
  13497. *(pDstline+5) = (mng_uint8)(iB && 0xFF);
  13498. pSrcline += 3;
  13499. pDstline += 6;
  13500. }
  13501. #ifdef MNG_SUPPORT_TRACE
  13502. MNG_TRACE (pData, MNG_FN_PROMOTE_RGB8_RGB16, MNG_LC_END);
  13503. #endif
  13504. return MNG_NOERROR;
  13505. }
  13506. #endif
  13507. /* ************************************************************************** */
  13508. mng_retcode mng_promote_rgb8_rgba8 (mng_datap pData)
  13509. {
  13510. mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf;
  13511. mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc;
  13512. mng_uint8p pDstline = (mng_uint8p)pData->pPromDst;
  13513. mng_uint32 iX;
  13514. mng_uint8 iR;
  13515. mng_uint8 iG;
  13516. mng_uint8 iB;
  13517. #ifdef MNG_SUPPORT_TRACE
  13518. MNG_TRACE (pData, MNG_FN_PROMOTE_RGB8_RGBA8, MNG_LC_START);
  13519. #endif
  13520. #ifdef MNG_DECREMENT_LOOPS
  13521. for (iX = pData->iPromWidth; iX > 0; iX--)
  13522. #else
  13523. for (iX = 0; iX < pData->iPromWidth; iX++)
  13524. #endif
  13525. {
  13526. iR = *pSrcline;
  13527. iG = *(pSrcline+1);
  13528. iB = *(pSrcline+2);
  13529. /* no cheap transparency ? */
  13530. if ((!pBuf->bHasTRNS) || ((mng_uint16)iR != pBuf->iTRNSred) ||
  13531. ((mng_uint16)iG != pBuf->iTRNSgreen) || ((mng_uint16)iB != pBuf->iTRNSblue))
  13532. *(pDstline+3) = 0xFF;
  13533. *pDstline = iR;
  13534. *(pDstline+1) = iG;
  13535. *(pDstline+2) = iB;
  13536. pSrcline += 3;
  13537. pDstline += 4;
  13538. }
  13539. #ifdef MNG_SUPPORT_TRACE
  13540. MNG_TRACE (pData, MNG_FN_PROMOTE_RGB8_RGBA8, MNG_LC_END);
  13541. #endif
  13542. return MNG_NOERROR;
  13543. }
  13544. /* ************************************************************************** */
  13545. #ifndef MNG_NO_16BIT_SUPPORT
  13546. mng_retcode mng_promote_rgb8_rgba16 (mng_datap pData)
  13547. {
  13548. mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf;
  13549. mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc;
  13550. mng_uint8p pDstline = (mng_uint8p)pData->pPromDst;
  13551. mng_uint32 iX;
  13552. mng_uint8 iR;
  13553. mng_uint8 iG;
  13554. mng_uint8 iB;
  13555. mng_uint16 iRw;
  13556. mng_uint16 iGw;
  13557. mng_uint16 iBw;
  13558. #ifdef MNG_SUPPORT_TRACE
  13559. MNG_TRACE (pData, MNG_FN_PROMOTE_RGB8_RGBA16, MNG_LC_START);
  13560. #endif
  13561. #ifdef MNG_DECREMENT_LOOPS
  13562. for (iX = pData->iPromWidth; iX > 0; iX--)
  13563. #else
  13564. for (iX = 0; iX < pData->iPromWidth; iX++)
  13565. #endif
  13566. {
  13567. iR = *pSrcline;
  13568. iG = *(pSrcline+1);
  13569. iB = *(pSrcline+2);
  13570. /* no cheap transparency ? */
  13571. if ((!pBuf->bHasTRNS) || ((mng_uint16)iR != pBuf->iTRNSred) ||
  13572. ((mng_uint16)iG != pBuf->iTRNSgreen) || ((mng_uint16)iB != pBuf->iTRNSblue))
  13573. {
  13574. *(pDstline+6) = 0xFF;
  13575. *(pDstline+7) = 0xFF;
  13576. }
  13577. iRw = ((mng_bitdepth_16)pData->fPromBitdepth) (iR);
  13578. iGw = ((mng_bitdepth_16)pData->fPromBitdepth) (iG);
  13579. iBw = ((mng_bitdepth_16)pData->fPromBitdepth) (iB);
  13580. *pDstline = (mng_uint8)(iRw >> 8);
  13581. *(pDstline+1) = (mng_uint8)(iRw && 0xFF);
  13582. *(pDstline+2) = (mng_uint8)(iGw >> 8);
  13583. *(pDstline+3) = (mng_uint8)(iGw && 0xFF);
  13584. *(pDstline+4) = (mng_uint8)(iBw >> 8);
  13585. *(pDstline+5) = (mng_uint8)(iBw && 0xFF);
  13586. pSrcline += 3;
  13587. pDstline += 8;
  13588. }
  13589. #ifdef MNG_SUPPORT_TRACE
  13590. MNG_TRACE (pData, MNG_FN_PROMOTE_RGB8_RGBA16, MNG_LC_END);
  13591. #endif
  13592. return MNG_NOERROR;
  13593. }
  13594. #endif
  13595. /* ************************************************************************** */
  13596. #ifndef MNG_NO_16BIT_SUPPORT
  13597. mng_retcode mng_promote_rgb16_rgba16 (mng_datap pData)
  13598. {
  13599. mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf;
  13600. mng_uint16p pSrcline = (mng_uint16p)pData->pPromSrc;
  13601. mng_uint16p pDstline = (mng_uint16p)pData->pPromDst;
  13602. mng_uint32 iX;
  13603. mng_uint16 iR;
  13604. mng_uint16 iG;
  13605. mng_uint16 iB;
  13606. #ifdef MNG_SUPPORT_TRACE
  13607. MNG_TRACE (pData, MNG_FN_PROMOTE_RGB16_RGBA16, MNG_LC_START);
  13608. #endif
  13609. #ifdef MNG_DECREMENT_LOOPS
  13610. for (iX = pData->iPromWidth; iX > 0; iX--)
  13611. #else
  13612. for (iX = 0; iX < pData->iPromWidth; iX++)
  13613. #endif
  13614. {
  13615. iR = *pSrcline;
  13616. iG = *(pSrcline+1);
  13617. iB = *(pSrcline+2);
  13618. /* no cheap transparency ? */
  13619. if ((!pBuf->bHasTRNS) || (iR != pBuf->iTRNSred) ||
  13620. (iG != pBuf->iTRNSgreen) || (iB != pBuf->iTRNSblue))
  13621. *(pDstline+3) = 0xFFFF;
  13622. *pDstline = iR;
  13623. *(pDstline+1) = iG;
  13624. *(pDstline+2) = iB;
  13625. pSrcline += 3;
  13626. pDstline += 4;
  13627. }
  13628. #ifdef MNG_SUPPORT_TRACE
  13629. MNG_TRACE (pData, MNG_FN_PROMOTE_RGB16_RGBA16, MNG_LC_END);
  13630. #endif
  13631. return MNG_NOERROR;
  13632. }
  13633. #endif
  13634. /* ************************************************************************** */
  13635. mng_retcode mng_promote_idx8_rgb8 (mng_datap pData)
  13636. {
  13637. mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf;
  13638. mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc;
  13639. mng_uint8p pDstline = (mng_uint8p)pData->pPromDst;
  13640. mng_uint32 iX;
  13641. mng_uint8 iB;
  13642. #ifdef MNG_SUPPORT_TRACE
  13643. MNG_TRACE (pData, MNG_FN_PROMOTE_IDX8_RGB8, MNG_LC_START);
  13644. #endif
  13645. #ifdef MNG_DECREMENT_LOOPS
  13646. for (iX = pData->iPromWidth; iX > 0; iX--)
  13647. #else
  13648. for (iX = 0; iX < pData->iPromWidth; iX++)
  13649. #endif
  13650. {
  13651. iB = *pSrcline;
  13652. if ((mng_uint32)iB < pBuf->iPLTEcount)
  13653. {
  13654. *pDstline = pBuf->aPLTEentries [iB].iRed;
  13655. *(pDstline+1) = pBuf->aPLTEentries [iB].iGreen;
  13656. *(pDstline+2) = pBuf->aPLTEentries [iB].iBlue;
  13657. }
  13658. pSrcline++;
  13659. pDstline += 3;
  13660. }
  13661. #ifdef MNG_SUPPORT_TRACE
  13662. MNG_TRACE (pData, MNG_FN_PROMOTE_IDX8_RGB8, MNG_LC_END);
  13663. #endif
  13664. return MNG_NOERROR;
  13665. }
  13666. /* ************************************************************************** */
  13667. #ifndef MNG_NO_16BIT_SUPPORT
  13668. mng_retcode mng_promote_idx8_rgb16 (mng_datap pData)
  13669. {
  13670. mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf;
  13671. mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc;
  13672. mng_uint8p pDstline = (mng_uint8p)pData->pPromDst;
  13673. mng_uint32 iX;
  13674. mng_uint8 iN;
  13675. mng_uint16 iR;
  13676. mng_uint16 iG;
  13677. mng_uint16 iB;
  13678. #ifdef MNG_SUPPORT_TRACE
  13679. MNG_TRACE (pData, MNG_FN_PROMOTE_IDX8_RGB16, MNG_LC_START);
  13680. #endif
  13681. #ifdef MNG_DECREMENT_LOOPS
  13682. for (iX = pData->iPromWidth; iX > 0; iX--)
  13683. #else
  13684. for (iX = 0; iX < pData->iPromWidth; iX++)
  13685. #endif
  13686. {
  13687. iN = *pSrcline;
  13688. if ((mng_uint32)iN < pBuf->iPLTEcount)
  13689. {
  13690. iR = ((mng_bitdepth_16)pData->fPromBitdepth) (pBuf->aPLTEentries [iN].iRed);
  13691. iG = ((mng_bitdepth_16)pData->fPromBitdepth) (pBuf->aPLTEentries [iN].iGreen);
  13692. iB = ((mng_bitdepth_16)pData->fPromBitdepth) (pBuf->aPLTEentries [iN].iBlue);
  13693. *pDstline = (mng_uint8)(iR >> 8);
  13694. *(pDstline+1) = (mng_uint8)(iR && 0xFF);
  13695. *(pDstline+2) = (mng_uint8)(iG >> 8);
  13696. *(pDstline+3) = (mng_uint8)(iG && 0xFF);
  13697. *(pDstline+4) = (mng_uint8)(iB >> 8);
  13698. *(pDstline+5) = (mng_uint8)(iB && 0xFF);
  13699. }
  13700. pSrcline++;
  13701. pDstline += 6;
  13702. }
  13703. #ifdef MNG_SUPPORT_TRACE
  13704. MNG_TRACE (pData, MNG_FN_PROMOTE_IDX8_RGB16, MNG_LC_END);
  13705. #endif
  13706. return MNG_NOERROR;
  13707. }
  13708. #endif
  13709. /* ************************************************************************** */
  13710. mng_retcode mng_promote_idx8_rgba8 (mng_datap pData)
  13711. {
  13712. mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf;
  13713. mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc;
  13714. mng_uint8p pDstline = (mng_uint8p)pData->pPromDst;
  13715. mng_uint32 iX;
  13716. mng_uint8 iB;
  13717. #ifdef MNG_SUPPORT_TRACE
  13718. MNG_TRACE (pData, MNG_FN_PROMOTE_IDX8_RGBA8, MNG_LC_START);
  13719. #endif
  13720. #ifdef MNG_DECREMENT_LOOPS
  13721. for (iX = pData->iPromWidth; iX > 0; iX--)
  13722. #else
  13723. for (iX = 0; iX < pData->iPromWidth; iX++)
  13724. #endif
  13725. {
  13726. iB = *pSrcline;
  13727. if ((mng_uint32)iB < pBuf->iPLTEcount)
  13728. {
  13729. *pDstline = pBuf->aPLTEentries [iB].iRed;
  13730. *(pDstline+1) = pBuf->aPLTEentries [iB].iGreen;
  13731. *(pDstline+2) = pBuf->aPLTEentries [iB].iBlue;
  13732. if ((pBuf->bHasTRNS) && ((mng_uint32)iB < pBuf->iTRNScount))
  13733. *(pDstline+3) = pBuf->aTRNSentries [iB];
  13734. else
  13735. *(pDstline+3) = 0xFF;
  13736. }
  13737. pSrcline++;
  13738. pDstline += 4;
  13739. }
  13740. #ifdef MNG_SUPPORT_TRACE
  13741. MNG_TRACE (pData, MNG_FN_PROMOTE_IDX8_RGBA8, MNG_LC_END);
  13742. #endif
  13743. return MNG_NOERROR;
  13744. }
  13745. /* ************************************************************************** */
  13746. #ifndef MNG_NO_16BIT_SUPPORT
  13747. mng_retcode mng_promote_idx8_rgba16 (mng_datap pData)
  13748. {
  13749. mng_imagedatap pBuf = (mng_imagedatap)pData->pPromBuf;
  13750. mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc;
  13751. mng_uint8p pDstline = (mng_uint8p)pData->pPromDst;
  13752. mng_uint32 iX;
  13753. mng_uint8 iN;
  13754. mng_uint16 iR;
  13755. mng_uint16 iG;
  13756. mng_uint16 iB;
  13757. mng_uint16 iA;
  13758. #ifdef MNG_SUPPORT_TRACE
  13759. MNG_TRACE (pData, MNG_FN_PROMOTE_IDX8_RGBA16, MNG_LC_START);
  13760. #endif
  13761. #ifdef MNG_DECREMENT_LOOPS
  13762. for (iX = pData->iPromWidth; iX > 0; iX--)
  13763. #else
  13764. for (iX = 0; iX < pData->iPromWidth; iX++)
  13765. #endif
  13766. {
  13767. iN = *pSrcline;
  13768. if ((mng_uint32)iN < pBuf->iPLTEcount)
  13769. {
  13770. iR = ((mng_bitdepth_16)pData->fPromBitdepth) (pBuf->aPLTEentries [iN].iRed);
  13771. iG = ((mng_bitdepth_16)pData->fPromBitdepth) (pBuf->aPLTEentries [iN].iGreen);
  13772. iB = ((mng_bitdepth_16)pData->fPromBitdepth) (pBuf->aPLTEentries [iN].iBlue);
  13773. if ((pBuf->bHasTRNS) && ((mng_uint32)iN < pBuf->iTRNScount))
  13774. iA = ((mng_bitdepth_16)pData->fPromBitdepth) (pBuf->aTRNSentries [iN]);
  13775. else
  13776. iA = 0xFFFF;
  13777. *pDstline = (mng_uint8)(iR >> 8);
  13778. *(pDstline+1) = (mng_uint8)(iR && 0xFF);
  13779. *(pDstline+2) = (mng_uint8)(iG >> 8);
  13780. *(pDstline+3) = (mng_uint8)(iG && 0xFF);
  13781. *(pDstline+4) = (mng_uint8)(iB >> 8);
  13782. *(pDstline+5) = (mng_uint8)(iB && 0xFF);
  13783. *(pDstline+6) = (mng_uint8)(iA >> 8);
  13784. *(pDstline+7) = (mng_uint8)(iA && 0xFF);
  13785. }
  13786. pSrcline++;
  13787. pDstline += 8;
  13788. }
  13789. #ifdef MNG_SUPPORT_TRACE
  13790. MNG_TRACE (pData, MNG_FN_PROMOTE_IDX8_RGBA16, MNG_LC_END);
  13791. #endif
  13792. return MNG_NOERROR;
  13793. }
  13794. /* ************************************************************************** */
  13795. mng_retcode mng_promote_rgba8_rgba16 (mng_datap pData)
  13796. {
  13797. mng_uint8p pSrcline = (mng_uint8p)pData->pPromSrc;
  13798. mng_uint8p pDstline = (mng_uint8p)pData->pPromDst;
  13799. mng_uint32 iX;
  13800. mng_uint16 iR;
  13801. mng_uint16 iG;
  13802. mng_uint16 iB;
  13803. mng_uint16 iA;
  13804. #ifdef MNG_SUPPORT_TRACE
  13805. MNG_TRACE (pData, MNG_FN_PROMOTE_RGBA8_RGBA16, MNG_LC_START);
  13806. #endif
  13807. #ifdef MNG_DECREMENT_LOOPS
  13808. for (iX = pData->iPromWidth; iX > 0; iX--)
  13809. #else
  13810. for (iX = 0; iX < pData->iPromWidth; iX++)
  13811. #endif
  13812. {
  13813. iR = ((mng_bitdepth_16)pData->fPromBitdepth) (*pSrcline);
  13814. iG = ((mng_bitdepth_16)pData->fPromBitdepth) (*(pSrcline+1));
  13815. iB = ((mng_bitdepth_16)pData->fPromBitdepth) (*(pSrcline+2));
  13816. iA = ((mng_bitdepth_16)pData->fPromBitdepth) (*(pSrcline+3));
  13817. *pDstline = (mng_uint8)(iR >> 8);
  13818. *(pDstline+1) = (mng_uint8)(iR && 0xFF);
  13819. *(pDstline+2) = (mng_uint8)(iG >> 8);
  13820. *(pDstline+3) = (mng_uint8)(iG && 0xFF);
  13821. *(pDstline+4) = (mng_uint8)(iB >> 8);
  13822. *(pDstline+5) = (mng_uint8)(iB && 0xFF);
  13823. *(pDstline+6) = (mng_uint8)(iA >> 8);
  13824. *(pDstline+7) = (mng_uint8)(iA && 0xFF);
  13825. pSrcline += 4;
  13826. pDstline += 8;
  13827. }
  13828. #ifdef MNG_SUPPORT_TRACE
  13829. MNG_TRACE (pData, MNG_FN_PROMOTE_RGBA8_RGBA16, MNG_LC_END);
  13830. #endif
  13831. return MNG_NOERROR;
  13832. }
  13833. #endif
  13834. #endif /* !defined(MNG_NO_DELTA_PNG) || !defined(MNG_SKIPCHUNK_PAST) || !defined(MNG_SKIPCHUNK_MAGN) */
  13835. /* ************************************************************************** */
  13836. /* * * */
  13837. /* * Row processing routines - convert uncompressed data from zlib to * */
  13838. /* * managable row-data which serves as input to the color-management * */
  13839. /* * routines * */
  13840. /* * * */
  13841. /* ************************************************************************** */
  13842. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  13843. mng_retcode mng_process_g1 (mng_datap pData)
  13844. {
  13845. mng_uint8p pWorkrow;
  13846. mng_uint8p pRGBArow;
  13847. mng_int32 iX;
  13848. mng_uint8 iB;
  13849. mng_uint8 iM;
  13850. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  13851. #ifdef MNG_SUPPORT_TRACE
  13852. MNG_TRACE (pData, MNG_FN_PROCESS_G1, MNG_LC_START);
  13853. #endif
  13854. if (!pBuf) /* no object? then use obj 0 */
  13855. pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf;
  13856. /* temporary work pointers */
  13857. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  13858. pRGBArow = pData->pRGBArow;
  13859. iM = 0; /* start at pixel 0 */
  13860. iB = 0;
  13861. if (pBuf->bHasTRNS) /* tRNS encountered ? */
  13862. {
  13863. if (pBuf->iTRNSgray) /* white transparent ? */
  13864. {
  13865. #ifdef MNG_DECREMENT_LOOPS
  13866. for (iX = pData->iRowsamples; iX > 0; iX--)
  13867. #else
  13868. for (iX = 0; iX < pData->iRowsamples; iX++)
  13869. #endif
  13870. {
  13871. if (!iM) /* mask underflow ? */
  13872. {
  13873. iB = *pWorkrow; /* get next input-byte */
  13874. pWorkrow++;
  13875. iM = 0x80;
  13876. }
  13877. if (iB & iM) /* is it white ? */
  13878. /* transparent ! */
  13879. mng_put_uint32 (pRGBArow, 0x00000000);
  13880. else /* opaque black */
  13881. mng_put_uint32 (pRGBArow, 0x000000FF);
  13882. pRGBArow += 4; /* next pixel */
  13883. iM >>= 1;
  13884. }
  13885. }
  13886. else /* black transparent */
  13887. {
  13888. #ifdef MNG_DECREMENT_LOOPS
  13889. for (iX = pData->iRowsamples; iX > 0; iX--)
  13890. #else
  13891. for (iX = 0; iX < pData->iRowsamples; iX++)
  13892. #endif
  13893. {
  13894. if (!iM) /* mask underflow ? */
  13895. {
  13896. iB = *pWorkrow; /* get next input-byte */
  13897. pWorkrow++;
  13898. iM = 0x80;
  13899. }
  13900. if (iB & iM) /* is it white ? */
  13901. /* opaque white */
  13902. mng_put_uint32 (pRGBArow, 0xFFFFFFFF);
  13903. else /* transparent */
  13904. mng_put_uint32 (pRGBArow, 0x00000000);
  13905. pRGBArow += 4; /* next pixel */
  13906. iM >>= 1;
  13907. }
  13908. }
  13909. pData->bIsOpaque = MNG_FALSE; /* it's not fully opaque */
  13910. }
  13911. else /* no transparency */
  13912. {
  13913. #ifdef MNG_DECREMENT_LOOPS
  13914. for (iX = pData->iRowsamples; iX > 0; iX--)
  13915. #else
  13916. for (iX = 0; iX < pData->iRowsamples; iX++)
  13917. #endif
  13918. {
  13919. if (!iM) /* mask underflow ? */
  13920. {
  13921. iB = *pWorkrow; /* get next input-byte */
  13922. pWorkrow++;
  13923. iM = 0x80;
  13924. }
  13925. if (iB & iM) /* is it white ? */
  13926. /* opaque white */
  13927. mng_put_uint32 (pRGBArow, 0xFFFFFFFF);
  13928. else /* opaque black */
  13929. mng_put_uint32 (pRGBArow, 0x000000FF);
  13930. pRGBArow += 4; /* next pixel */
  13931. iM >>= 1;
  13932. }
  13933. pData->bIsOpaque = MNG_TRUE; /* it's fully opaque */
  13934. }
  13935. #ifdef MNG_SUPPORT_TRACE
  13936. MNG_TRACE (pData, MNG_FN_PROCESS_G1, MNG_LC_END);
  13937. #endif
  13938. return MNG_NOERROR;
  13939. }
  13940. /* ************************************************************************** */
  13941. mng_retcode mng_process_g2 (mng_datap pData)
  13942. {
  13943. mng_uint8p pWorkrow;
  13944. mng_uint8p pRGBArow;
  13945. mng_int32 iX;
  13946. mng_uint8 iB;
  13947. mng_uint8 iM;
  13948. mng_uint32 iS;
  13949. mng_uint8 iQ;
  13950. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  13951. #ifdef MNG_OPTIMIZE_FOOTPRINT_SWITCH
  13952. const mng_uint32 level[4] = { 0x000000FF, 0x555555FF,
  13953. 0xAAAAAAFF, 0xFFFFFFFF};
  13954. #endif
  13955. #ifdef MNG_SUPPORT_TRACE
  13956. MNG_TRACE (pData, MNG_FN_PROCESS_G2, MNG_LC_START);
  13957. #endif
  13958. if (!pBuf) /* no object? then use obj 0 */
  13959. pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf;
  13960. /* temporary work pointers */
  13961. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  13962. pRGBArow = pData->pRGBArow;
  13963. iM = 0; /* start at pixel 0 */
  13964. iB = 0;
  13965. iS = 0;
  13966. if (pBuf->bHasTRNS) /* tRNS encountered ? */
  13967. {
  13968. #ifdef MNG_DECREMENT_LOOPS
  13969. for (iX = pData->iRowsamples; iX > 0; iX--)
  13970. #else
  13971. for (iX = 0; iX < pData->iRowsamples; iX++)
  13972. #endif
  13973. {
  13974. if (!iM) /* mask underflow ? */
  13975. {
  13976. iB = *pWorkrow; /* get next input-byte */
  13977. pWorkrow++;
  13978. iM = 0xC0;
  13979. iS = 6;
  13980. }
  13981. /* determine gray level */
  13982. iQ = (mng_uint8)((iB & iM) >> iS);
  13983. if (iQ == pBuf->iTRNSgray) /* transparent ? */
  13984. mng_put_uint32 (pRGBArow, 0x00000000);
  13985. else
  13986. {
  13987. #ifdef MNG_OPTIMIZE_FOOTPRINT_SWITCH
  13988. mng_put_uint32 (pRGBArow, level[iQ]);
  13989. #else
  13990. switch (iQ) /* determine the gray level */
  13991. {
  13992. case 0x03 : { mng_put_uint32 (pRGBArow, 0xFFFFFFFF); break; }
  13993. case 0x02 : { mng_put_uint32 (pRGBArow, 0xAAAAAAFF); break; }
  13994. case 0x01 : { mng_put_uint32 (pRGBArow, 0x555555FF); break; }
  13995. default : { mng_put_uint32 (pRGBArow, 0x000000FF); }
  13996. }
  13997. #endif
  13998. }
  13999. pRGBArow += 4; /* next pixel */
  14000. iM >>= 2;
  14001. iS -= 2;
  14002. }
  14003. pData->bIsOpaque = MNG_FALSE; /* it's not fully opaque */
  14004. }
  14005. else
  14006. {
  14007. #ifdef MNG_DECREMENT_LOOPS
  14008. for (iX = pData->iRowsamples; iX > 0; iX--)
  14009. #else
  14010. for (iX = 0; iX < pData->iRowsamples; iX++)
  14011. #endif
  14012. {
  14013. if (!iM) /* mask underflow ? */
  14014. {
  14015. iB = *pWorkrow; /* get next input-byte */
  14016. pWorkrow++;
  14017. iM = 0xC0;
  14018. iS = 6;
  14019. }
  14020. #ifdef MNG_OPTIMIZE_FOOTPRINT_SWITCH
  14021. mng_put_uint32 (pRGBArow, level[((iB & iM) >> iS)] );
  14022. #else
  14023. switch ((iB & iM) >> iS) /* determine the gray level */
  14024. {
  14025. case 0x03 : { mng_put_uint32 (pRGBArow, 0xFFFFFFFF); break; }
  14026. case 0x02 : { mng_put_uint32 (pRGBArow, 0xAAAAAAFF); break; }
  14027. case 0x01 : { mng_put_uint32 (pRGBArow, 0x555555FF); break; }
  14028. default : { mng_put_uint32 (pRGBArow, 0x000000FF); }
  14029. }
  14030. #endif
  14031. pRGBArow += 4; /* next pixel */
  14032. iM >>= 2;
  14033. iS -= 2;
  14034. }
  14035. pData->bIsOpaque = MNG_TRUE; /* it's fully opaque */
  14036. }
  14037. #ifdef MNG_SUPPORT_TRACE
  14038. MNG_TRACE (pData, MNG_FN_PROCESS_G2, MNG_LC_END);
  14039. #endif
  14040. return MNG_NOERROR;
  14041. }
  14042. /* ************************************************************************** */
  14043. mng_retcode mng_process_g4 (mng_datap pData)
  14044. {
  14045. mng_uint8p pWorkrow;
  14046. mng_uint8p pRGBArow;
  14047. mng_int32 iX;
  14048. mng_uint8 iB;
  14049. mng_uint8 iM;
  14050. mng_uint32 iS;
  14051. mng_uint8 iQ;
  14052. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  14053. #ifdef MNG_SUPPORT_TRACE
  14054. MNG_TRACE (pData, MNG_FN_PROCESS_G4, MNG_LC_START);
  14055. #endif
  14056. if (!pBuf) /* no object? then use obj 0 */
  14057. pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf;
  14058. /* temporary work pointers */
  14059. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  14060. pRGBArow = pData->pRGBArow;
  14061. iM = 0; /* start at pixel 0 */
  14062. iB = 0;
  14063. iS = 0;
  14064. if (pBuf->bHasTRNS) /* tRNS encountered ? */
  14065. {
  14066. #ifdef MNG_DECREMENT_LOOPS
  14067. for (iX = pData->iRowsamples; iX > 0; iX--)
  14068. #else
  14069. for (iX = 0; iX < pData->iRowsamples; iX++)
  14070. #endif
  14071. {
  14072. if (!iM) /* mask underflow ? */
  14073. {
  14074. iB = *pWorkrow; /* get next input-byte */
  14075. pWorkrow++;
  14076. iM = 0xF0;
  14077. iS = 4;
  14078. }
  14079. /* get the gray level */
  14080. iQ = (mng_uint8)((iB & iM) >> iS);
  14081. if (iQ == pBuf->iTRNSgray) /* transparent ? */
  14082. {
  14083. *pRGBArow = 0; /* put in intermediate row */
  14084. *(pRGBArow+1) = 0;
  14085. *(pRGBArow+2) = 0;
  14086. *(pRGBArow+3) = 0;
  14087. }
  14088. else
  14089. { /* expand to 8-bit by replication */
  14090. iQ = (mng_uint8)(iQ + (iQ << 4));
  14091. *pRGBArow = iQ; /* put in intermediate row */
  14092. *(pRGBArow+1) = iQ;
  14093. *(pRGBArow+2) = iQ;
  14094. *(pRGBArow+3) = 0xFF;
  14095. }
  14096. pRGBArow += 4; /* next pixel */
  14097. iM >>= 4;
  14098. iS -= 4;
  14099. }
  14100. pData->bIsOpaque = MNG_FALSE; /* it's not fully opaque */
  14101. }
  14102. else
  14103. {
  14104. #ifdef MNG_DECREMENT_LOOPS
  14105. for (iX = pData->iRowsamples; iX > 0; iX--)
  14106. #else
  14107. for (iX = 0; iX < pData->iRowsamples; iX++)
  14108. #endif
  14109. {
  14110. if (!iM) /* mask underflow ? */
  14111. {
  14112. iB = *pWorkrow; /* get next input-byte */
  14113. pWorkrow++;
  14114. iM = 0xF0;
  14115. iS = 4;
  14116. }
  14117. /* get the gray level */
  14118. iQ = (mng_uint8)((iB & iM) >> iS);
  14119. iQ = (mng_uint8)(iQ + (iQ << 4));/* expand to 8-bit by replication */
  14120. *pRGBArow = iQ; /* put in intermediate row */
  14121. *(pRGBArow+1) = iQ;
  14122. *(pRGBArow+2) = iQ;
  14123. *(pRGBArow+3) = 0xFF;
  14124. pRGBArow += 4; /* next pixel */
  14125. iM >>= 4;
  14126. iS -= 4;
  14127. }
  14128. pData->bIsOpaque = MNG_TRUE; /* it's fully opaque */
  14129. }
  14130. #ifdef MNG_SUPPORT_TRACE
  14131. MNG_TRACE (pData, MNG_FN_PROCESS_G4, MNG_LC_END);
  14132. #endif
  14133. return MNG_NOERROR;
  14134. }
  14135. #endif /* MNG_NO_1_2_4BIT_SUPPORT */
  14136. /* ************************************************************************** */
  14137. mng_retcode mng_process_g8 (mng_datap pData)
  14138. {
  14139. mng_uint8p pWorkrow;
  14140. mng_uint8p pRGBArow;
  14141. mng_int32 iX;
  14142. mng_uint8 iB;
  14143. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  14144. #ifdef MNG_SUPPORT_TRACE
  14145. MNG_TRACE (pData, MNG_FN_PROCESS_G8, MNG_LC_START);
  14146. #endif
  14147. if (!pBuf) /* no object? then use obj 0 */
  14148. pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf;
  14149. /* temporary work pointers */
  14150. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  14151. pRGBArow = pData->pRGBArow;
  14152. if (pBuf->bHasTRNS) /* tRNS encountered ? */
  14153. {
  14154. #ifdef MNG_DECREMENT_LOOPS
  14155. for (iX = pData->iRowsamples; iX > 0; iX--)
  14156. #else
  14157. for (iX = 0; iX < pData->iRowsamples; iX++)
  14158. #endif
  14159. {
  14160. iB = *pWorkrow; /* get next input-byte */
  14161. if (iB == pBuf->iTRNSgray) /* transparent ? */
  14162. {
  14163. *pRGBArow = 0; /* put in intermediate row */
  14164. *(pRGBArow+1) = 0;
  14165. *(pRGBArow+2) = 0;
  14166. *(pRGBArow+3) = 0;
  14167. }
  14168. else
  14169. {
  14170. *pRGBArow = iB; /* put in intermediate row */
  14171. *(pRGBArow+1) = iB;
  14172. *(pRGBArow+2) = iB;
  14173. *(pRGBArow+3) = 0xFF;
  14174. }
  14175. pRGBArow += 4; /* next pixel */
  14176. pWorkrow++;
  14177. }
  14178. pData->bIsOpaque = MNG_FALSE; /* it's not fully opaque */
  14179. }
  14180. else
  14181. {
  14182. #ifdef MNG_DECREMENT_LOOPS
  14183. for (iX = pData->iRowsamples; iX > 0; iX--)
  14184. #else
  14185. for (iX = 0; iX < pData->iRowsamples; iX++)
  14186. #endif
  14187. {
  14188. iB = *pWorkrow; /* get next input-byte */
  14189. *pRGBArow = iB; /* put in intermediate row */
  14190. *(pRGBArow+1) = iB;
  14191. *(pRGBArow+2) = iB;
  14192. *(pRGBArow+3) = 0xFF;
  14193. pRGBArow += 4; /* next pixel */
  14194. pWorkrow++;
  14195. }
  14196. pData->bIsOpaque = MNG_TRUE; /* it's fully opaque */
  14197. }
  14198. #ifdef MNG_SUPPORT_TRACE
  14199. MNG_TRACE (pData, MNG_FN_PROCESS_G8, MNG_LC_END);
  14200. #endif
  14201. return MNG_NOERROR;
  14202. }
  14203. /* ************************************************************************** */
  14204. #ifndef MNG_NO_16BIT_SUPPORT
  14205. mng_retcode mng_process_g16 (mng_datap pData)
  14206. {
  14207. mng_uint8p pWorkrow;
  14208. mng_uint8p pRGBArow;
  14209. mng_int32 iX;
  14210. mng_uint16 iW;
  14211. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  14212. #ifdef MNG_SUPPORT_TRACE
  14213. MNG_TRACE (pData, MNG_FN_PROCESS_G16, MNG_LC_START);
  14214. #endif
  14215. if (!pBuf) /* no object? then use obj 0 */
  14216. pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf;
  14217. /* temporary work pointers */
  14218. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  14219. pRGBArow = pData->pRGBArow;
  14220. if (pBuf->bHasTRNS) /* tRNS encountered ? */
  14221. {
  14222. #ifdef MNG_DECREMENT_LOOPS
  14223. for (iX = pData->iRowsamples; iX > 0; iX--)
  14224. #else
  14225. for (iX = 0; iX < pData->iRowsamples; iX++)
  14226. #endif
  14227. {
  14228. iW = mng_get_uint16 (pWorkrow); /* get input */
  14229. if (iW == pBuf->iTRNSgray) /* transparent ? */
  14230. { /* put in intermediate row */
  14231. mng_put_uint16 (pRGBArow, 0);
  14232. mng_put_uint16 (pRGBArow+2, 0);
  14233. mng_put_uint16 (pRGBArow+4, 0);
  14234. mng_put_uint16 (pRGBArow+6, 0);
  14235. }
  14236. else
  14237. { /* put in intermediate row */
  14238. mng_put_uint16 (pRGBArow, iW);
  14239. mng_put_uint16 (pRGBArow+2, iW);
  14240. mng_put_uint16 (pRGBArow+4, iW);
  14241. mng_put_uint16 (pRGBArow+6, 0xFFFF);
  14242. }
  14243. pRGBArow += 8; /* next pixel */
  14244. pWorkrow += 2;
  14245. }
  14246. pData->bIsOpaque = MNG_FALSE; /* it's not fully opaque */
  14247. }
  14248. else
  14249. {
  14250. #ifdef MNG_DECREMENT_LOOPS
  14251. for (iX = pData->iRowsamples; iX > 0; iX--)
  14252. #else
  14253. for (iX = 0; iX < pData->iRowsamples; iX++)
  14254. #endif
  14255. {
  14256. iW = mng_get_uint16 (pWorkrow); /* get input */
  14257. mng_put_uint16 (pRGBArow, iW); /* and put in intermediate row */
  14258. mng_put_uint16 (pRGBArow+2, iW);
  14259. mng_put_uint16 (pRGBArow+4, iW);
  14260. mng_put_uint16 (pRGBArow+6, 0xFFFF);
  14261. pRGBArow += 8; /* next pixel */
  14262. pWorkrow += 2;
  14263. }
  14264. pData->bIsOpaque = MNG_TRUE; /* it's fully opaque */
  14265. }
  14266. #ifdef MNG_SUPPORT_TRACE
  14267. MNG_TRACE (pData, MNG_FN_PROCESS_G16, MNG_LC_END);
  14268. #endif
  14269. return MNG_NOERROR;
  14270. }
  14271. #endif
  14272. /* ************************************************************************** */
  14273. mng_retcode mng_process_rgb8 (mng_datap pData)
  14274. {
  14275. mng_uint8p pWorkrow;
  14276. mng_uint8p pRGBArow;
  14277. mng_int32 iX;
  14278. mng_uint8 iR, iG, iB;
  14279. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  14280. #ifdef MNG_SUPPORT_TRACE
  14281. MNG_TRACE (pData, MNG_FN_PROCESS_RGB8, MNG_LC_START);
  14282. #endif
  14283. if (!pBuf) /* no object? then use obj 0 */
  14284. pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf;
  14285. /* temporary work pointers */
  14286. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  14287. pRGBArow = pData->pRGBArow;
  14288. if (pBuf->bHasTRNS) /* tRNS encountered ? */
  14289. {
  14290. #ifdef MNG_DECREMENT_LOOPS
  14291. for (iX = pData->iRowsamples; iX > 0; iX--)
  14292. #else
  14293. for (iX = 0; iX < pData->iRowsamples; iX++)
  14294. #endif
  14295. {
  14296. iR = *pWorkrow; /* get the RGB values */
  14297. iG = *(pWorkrow+1);
  14298. iB = *(pWorkrow+2);
  14299. /* transparent ? */
  14300. if ((iR == pBuf->iTRNSred) && (iG == pBuf->iTRNSgreen) &&
  14301. (iB == pBuf->iTRNSblue))
  14302. {
  14303. *pRGBArow = 0; /* this pixel is transparent ! */
  14304. *(pRGBArow+1) = 0;
  14305. *(pRGBArow+2) = 0;
  14306. *(pRGBArow+3) = 0;
  14307. }
  14308. else
  14309. {
  14310. *pRGBArow = iR; /* copy the RGB values */
  14311. *(pRGBArow+1) = iG;
  14312. *(pRGBArow+2) = iB;
  14313. *(pRGBArow+3) = 0xFF; /* this one isn't transparent */
  14314. }
  14315. pWorkrow += 3; /* next pixel */
  14316. pRGBArow += 4;
  14317. }
  14318. pData->bIsOpaque = MNG_FALSE; /* it's not fully opaque */
  14319. }
  14320. else
  14321. {
  14322. #ifdef MNG_DECREMENT_LOOPS
  14323. for (iX = pData->iRowsamples; iX > 0; iX--)
  14324. #else
  14325. for (iX = 0; iX < pData->iRowsamples; iX++)
  14326. #endif
  14327. {
  14328. *pRGBArow = *pWorkrow; /* copy the RGB bytes */
  14329. *(pRGBArow+1) = *(pWorkrow+1);
  14330. *(pRGBArow+2) = *(pWorkrow+2);
  14331. *(pRGBArow+3) = 0xFF; /* no alpha; so always fully opaque */
  14332. pWorkrow += 3; /* next pixel */
  14333. pRGBArow += 4;
  14334. }
  14335. pData->bIsOpaque = MNG_TRUE; /* it's fully opaque */
  14336. }
  14337. #ifdef MNG_SUPPORT_TRACE
  14338. MNG_TRACE (pData, MNG_FN_PROCESS_RGB8, MNG_LC_END);
  14339. #endif
  14340. return MNG_NOERROR;
  14341. }
  14342. /* ************************************************************************** */
  14343. #ifndef MNG_NO_16BIT_SUPPORT
  14344. mng_retcode mng_process_rgb16 (mng_datap pData)
  14345. {
  14346. mng_uint8p pWorkrow;
  14347. mng_uint8p pRGBArow;
  14348. mng_int32 iX;
  14349. mng_uint16 iR, iG, iB;
  14350. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  14351. #ifdef MNG_SUPPORT_TRACE
  14352. MNG_TRACE (pData, MNG_FN_PROCESS_RGB16, MNG_LC_START);
  14353. #endif
  14354. if (!pBuf) /* no object? then use obj 0 */
  14355. pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf;
  14356. /* temporary work pointers */
  14357. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  14358. pRGBArow = pData->pRGBArow;
  14359. if (pBuf->bHasTRNS) /* tRNS encountered ? */
  14360. {
  14361. #ifdef MNG_DECREMENT_LOOPS
  14362. for (iX = pData->iRowsamples; iX > 0; iX--)
  14363. #else
  14364. for (iX = 0; iX < pData->iRowsamples; iX++)
  14365. #endif
  14366. {
  14367. iR = mng_get_uint16 (pWorkrow); /* get the RGB values */
  14368. iG = mng_get_uint16 (pWorkrow+2);
  14369. iB = mng_get_uint16 (pWorkrow+4);
  14370. /* transparent ? */
  14371. if ((iR == pBuf->iTRNSred) && (iG == pBuf->iTRNSgreen) &&
  14372. (iB == pBuf->iTRNSblue))
  14373. { /* transparent then */
  14374. mng_put_uint16 (pRGBArow, 0);
  14375. mng_put_uint16 (pRGBArow+2, 0);
  14376. mng_put_uint16 (pRGBArow+4, 0);
  14377. mng_put_uint16 (pRGBArow+6, 0);
  14378. }
  14379. else
  14380. { /* put in intermediate row */
  14381. mng_put_uint16 (pRGBArow, iR);
  14382. mng_put_uint16 (pRGBArow+2, iG);
  14383. mng_put_uint16 (pRGBArow+4, iB);
  14384. mng_put_uint16 (pRGBArow+6, 0xFFFF);
  14385. }
  14386. pWorkrow += 6; /* next pixel */
  14387. pRGBArow += 8;
  14388. }
  14389. pData->bIsOpaque = MNG_FALSE; /* it's not fully opaque */
  14390. }
  14391. else
  14392. {
  14393. #ifdef MNG_DECREMENT_LOOPS
  14394. for (iX = pData->iRowsamples; iX > 0; iX--)
  14395. #else
  14396. for (iX = 0; iX < pData->iRowsamples; iX++)
  14397. #endif
  14398. { /* copy the RGB values */
  14399. mng_put_uint16 (pRGBArow, mng_get_uint16 (pWorkrow ));
  14400. mng_put_uint16 (pRGBArow+2, mng_get_uint16 (pWorkrow+2));
  14401. mng_put_uint16 (pRGBArow+4, mng_get_uint16 (pWorkrow+4));
  14402. mng_put_uint16 (pRGBArow+6, 0xFFFF);
  14403. pWorkrow += 6; /* next pixel */
  14404. pRGBArow += 8;
  14405. }
  14406. pData->bIsOpaque = MNG_TRUE; /* it's fully opaque */
  14407. }
  14408. #ifdef MNG_SUPPORT_TRACE
  14409. MNG_TRACE (pData, MNG_FN_PROCESS_RGB16, MNG_LC_END);
  14410. #endif
  14411. return MNG_NOERROR;
  14412. }
  14413. #endif
  14414. /* ************************************************************************** */
  14415. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  14416. mng_retcode mng_process_idx1 (mng_datap pData)
  14417. {
  14418. mng_uint8p pWorkrow;
  14419. mng_uint8p pRGBArow;
  14420. mng_int32 iX;
  14421. mng_uint8 iB;
  14422. mng_uint8 iM;
  14423. mng_uint32 iS;
  14424. mng_uint8 iQ;
  14425. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  14426. #ifdef MNG_SUPPORT_TRACE
  14427. MNG_TRACE (pData, MNG_FN_PROCESS_IDX1, MNG_LC_START);
  14428. #endif
  14429. if (!pBuf) /* no object? then use obj 0 */
  14430. pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf;
  14431. /* temporary work pointers */
  14432. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  14433. pRGBArow = pData->pRGBArow;
  14434. iM = 0; /* start at pixel 0 */
  14435. iB = 0;
  14436. iS = 0;
  14437. if (pBuf->bHasTRNS) /* tRNS encountered ? */
  14438. {
  14439. #ifdef MNG_DECREMENT_LOOPS
  14440. for (iX = pData->iRowsamples; iX > 0; iX--)
  14441. #else
  14442. for (iX = 0; iX < pData->iRowsamples; iX++)
  14443. #endif
  14444. {
  14445. if (!iM) /* mask underflow ? */
  14446. {
  14447. iB = *pWorkrow; /* get next input-byte */
  14448. pWorkrow++;
  14449. iM = 0x80;
  14450. iS = 7;
  14451. }
  14452. /* get the index */
  14453. iQ = (mng_uint8)((iB & iM) >> iS);
  14454. /* index valid ? */
  14455. if ((mng_uint32)iQ < pBuf->iPLTEcount)
  14456. { /* put in intermediate row */
  14457. *pRGBArow = pBuf->aPLTEentries [iQ].iRed;
  14458. *(pRGBArow+1) = pBuf->aPLTEentries [iQ].iGreen;
  14459. *(pRGBArow+2) = pBuf->aPLTEentries [iQ].iBlue;
  14460. /* transparency for this index ? */
  14461. if ((mng_uint32)iQ < pBuf->iTRNScount)
  14462. *(pRGBArow+3) = pBuf->aTRNSentries [iQ];
  14463. else
  14464. *(pRGBArow+3) = 0xFF;
  14465. }
  14466. else
  14467. MNG_ERROR (pData, MNG_PLTEINDEXERROR);
  14468. pRGBArow += 4; /* next pixel */
  14469. iM >>= 1;
  14470. iS -= 1;
  14471. }
  14472. pData->bIsOpaque = MNG_FALSE; /* it's not fully opaque */
  14473. }
  14474. else
  14475. {
  14476. #ifdef MNG_DECREMENT_LOOPS
  14477. for (iX = pData->iRowsamples; iX > 0; iX--)
  14478. #else
  14479. for (iX = 0; iX < pData->iRowsamples; iX++)
  14480. #endif
  14481. {
  14482. if (!iM) /* mask underflow ? */
  14483. {
  14484. iB = *pWorkrow; /* get next input-byte */
  14485. pWorkrow++;
  14486. iM = 0x80;
  14487. iS = 7;
  14488. }
  14489. /* get the index */
  14490. iQ = (mng_uint8)((iB & iM) >> iS);
  14491. /* index valid ? */
  14492. if ((mng_uint32)iQ < pBuf->iPLTEcount)
  14493. { /* put in intermediate row */
  14494. *pRGBArow = pBuf->aPLTEentries [iQ].iRed;
  14495. *(pRGBArow+1) = pBuf->aPLTEentries [iQ].iGreen;
  14496. *(pRGBArow+2) = pBuf->aPLTEentries [iQ].iBlue;
  14497. *(pRGBArow+3) = 0xFF;
  14498. }
  14499. else
  14500. MNG_ERROR (pData, MNG_PLTEINDEXERROR);
  14501. pRGBArow += 4; /* next pixel */
  14502. iM >>= 1;
  14503. iS -= 1;
  14504. }
  14505. pData->bIsOpaque = MNG_TRUE; /* it's fully opaque */
  14506. }
  14507. #ifdef MNG_SUPPORT_TRACE
  14508. MNG_TRACE (pData, MNG_FN_PROCESS_IDX1, MNG_LC_END);
  14509. #endif
  14510. return MNG_NOERROR;
  14511. }
  14512. /* ************************************************************************** */
  14513. mng_retcode mng_process_idx2 (mng_datap pData)
  14514. {
  14515. mng_uint8p pWorkrow;
  14516. mng_uint8p pRGBArow;
  14517. mng_int32 iX;
  14518. mng_uint8 iB;
  14519. mng_uint8 iM;
  14520. mng_uint32 iS;
  14521. mng_uint8 iQ;
  14522. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  14523. #ifdef MNG_SUPPORT_TRACE
  14524. MNG_TRACE (pData, MNG_FN_PROCESS_IDX2, MNG_LC_START);
  14525. #endif
  14526. if (!pBuf) /* no object? then use obj 0 */
  14527. pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf;
  14528. /* temporary work pointers */
  14529. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  14530. pRGBArow = pData->pRGBArow;
  14531. iM = 0; /* start at pixel 0 */
  14532. iB = 0;
  14533. iS = 0;
  14534. if (pBuf->bHasTRNS) /* tRNS encountered ? */
  14535. {
  14536. #ifdef MNG_DECREMENT_LOOPS
  14537. for (iX = pData->iRowsamples; iX > 0; iX--)
  14538. #else
  14539. for (iX = 0; iX < pData->iRowsamples; iX++)
  14540. #endif
  14541. {
  14542. if (!iM) /* mask underflow ? */
  14543. {
  14544. iB = *pWorkrow; /* get next input-byte */
  14545. pWorkrow++;
  14546. iM = 0xC0;
  14547. iS = 6;
  14548. }
  14549. /* get the index */
  14550. iQ = (mng_uint8)((iB & iM) >> iS);
  14551. /* index valid ? */
  14552. if ((mng_uint32)iQ < pBuf->iPLTEcount)
  14553. { /* put in intermediate row */
  14554. *pRGBArow = pBuf->aPLTEentries [iQ].iRed;
  14555. *(pRGBArow+1) = pBuf->aPLTEentries [iQ].iGreen;
  14556. *(pRGBArow+2) = pBuf->aPLTEentries [iQ].iBlue;
  14557. /* transparency for this index ? */
  14558. if ((mng_uint32)iQ < pBuf->iTRNScount)
  14559. *(pRGBArow+3) = pBuf->aTRNSentries [iQ];
  14560. else
  14561. *(pRGBArow+3) = 0xFF;
  14562. }
  14563. else
  14564. MNG_ERROR (pData, MNG_PLTEINDEXERROR);
  14565. pRGBArow += 4; /* next pixel */
  14566. iM >>= 2;
  14567. iS -= 2;
  14568. }
  14569. pData->bIsOpaque = MNG_FALSE; /* it's not fully opaque */
  14570. }
  14571. else
  14572. {
  14573. #ifdef MNG_DECREMENT_LOOPS
  14574. for (iX = pData->iRowsamples; iX > 0; iX--)
  14575. #else
  14576. for (iX = 0; iX < pData->iRowsamples; iX++)
  14577. #endif
  14578. {
  14579. if (!iM) /* mask underflow ? */
  14580. {
  14581. iB = *pWorkrow; /* get next input-byte */
  14582. pWorkrow++;
  14583. iM = 0xC0;
  14584. iS = 6;
  14585. }
  14586. /* get the index */
  14587. iQ = (mng_uint8)((iB & iM) >> iS);
  14588. /* index valid ? */
  14589. if ((mng_uint32)iQ < pBuf->iPLTEcount)
  14590. { /* put in intermediate row */
  14591. *pRGBArow = pBuf->aPLTEentries [iQ].iRed;
  14592. *(pRGBArow+1) = pBuf->aPLTEentries [iQ].iGreen;
  14593. *(pRGBArow+2) = pBuf->aPLTEentries [iQ].iBlue;
  14594. *(pRGBArow+3) = 0xFF;
  14595. }
  14596. else
  14597. MNG_ERROR (pData, MNG_PLTEINDEXERROR);
  14598. pRGBArow += 4; /* next pixel */
  14599. iM >>= 2;
  14600. iS -= 2;
  14601. }
  14602. pData->bIsOpaque = MNG_TRUE; /* it's fully opaque */
  14603. }
  14604. #ifdef MNG_SUPPORT_TRACE
  14605. MNG_TRACE (pData, MNG_FN_PROCESS_IDX2, MNG_LC_END);
  14606. #endif
  14607. return MNG_NOERROR;
  14608. }
  14609. /* ************************************************************************** */
  14610. mng_retcode mng_process_idx4 (mng_datap pData)
  14611. {
  14612. mng_uint8p pWorkrow;
  14613. mng_uint8p pRGBArow;
  14614. mng_int32 iX;
  14615. mng_uint8 iB;
  14616. mng_uint8 iM;
  14617. mng_uint32 iS;
  14618. mng_uint8 iQ;
  14619. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  14620. #ifdef MNG_SUPPORT_TRACE
  14621. MNG_TRACE (pData, MNG_FN_PROCESS_IDX4, MNG_LC_START);
  14622. #endif
  14623. if (!pBuf) /* no object? then use obj 0 */
  14624. pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf;
  14625. /* temporary work pointers */
  14626. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  14627. pRGBArow = pData->pRGBArow;
  14628. iM = 0; /* start at pixel 0 */
  14629. iB = 0;
  14630. iS = 0;
  14631. if (pBuf->bHasTRNS) /* tRNS encountered ? */
  14632. {
  14633. #ifdef MNG_DECREMENT_LOOPS
  14634. for (iX = pData->iRowsamples; iX > 0; iX--)
  14635. #else
  14636. for (iX = 0; iX < pData->iRowsamples; iX++)
  14637. #endif
  14638. {
  14639. if (!iM) /* mask underflow ? */
  14640. {
  14641. iB = pWorkrow [0]; /* get next input-byte */
  14642. pWorkrow++;
  14643. iM = 0xF0;
  14644. iS = 4;
  14645. }
  14646. /* get the index */
  14647. iQ = (mng_uint8)((iB & iM) >> iS);
  14648. /* index valid ? */
  14649. if ((mng_uint32)iQ < pBuf->iPLTEcount)
  14650. { /* put in intermediate row */
  14651. pRGBArow [0] = pBuf->aPLTEentries [iQ].iRed;
  14652. pRGBArow [1] = pBuf->aPLTEentries [iQ].iGreen;
  14653. pRGBArow [2] = pBuf->aPLTEentries [iQ].iBlue;
  14654. /* transparency for this index ? */
  14655. if ((mng_uint32)iQ < pBuf->iTRNScount)
  14656. pRGBArow [3] = pBuf->aTRNSentries [iQ];
  14657. else
  14658. pRGBArow [3] = 0xFF;
  14659. }
  14660. else
  14661. MNG_ERROR (pData, MNG_PLTEINDEXERROR);
  14662. pRGBArow += 4; /* next pixel */
  14663. iM >>= 4;
  14664. iS -= 4;
  14665. }
  14666. pData->bIsOpaque = MNG_FALSE; /* it's not fully opaque */
  14667. }
  14668. else
  14669. {
  14670. #ifdef MNG_DECREMENT_LOOPS
  14671. for (iX = pData->iRowsamples; iX > 0; iX--)
  14672. #else
  14673. for (iX = 0; iX < pData->iRowsamples; iX++)
  14674. #endif
  14675. {
  14676. if (!iM) /* mask underflow ? */
  14677. {
  14678. iB = pWorkrow [0]; /* get next input-byte */
  14679. pWorkrow++;
  14680. iM = 0xF0;
  14681. iS = 4;
  14682. }
  14683. /* get the index */
  14684. iQ = (mng_uint8)((iB & iM) >> iS);
  14685. /* index valid ? */
  14686. if ((mng_uint32)iQ < pBuf->iPLTEcount)
  14687. { /* put in intermediate row */
  14688. pRGBArow [0] = pBuf->aPLTEentries [iQ].iRed;
  14689. pRGBArow [1] = pBuf->aPLTEentries [iQ].iGreen;
  14690. pRGBArow [2] = pBuf->aPLTEentries [iQ].iBlue;
  14691. pRGBArow [3] = 0xFF;
  14692. }
  14693. else
  14694. MNG_ERROR (pData, MNG_PLTEINDEXERROR);
  14695. pRGBArow += 4; /* next pixel */
  14696. iM >>= 4;
  14697. iS -= 4;
  14698. }
  14699. pData->bIsOpaque = MNG_TRUE; /* it's fully opaque */
  14700. }
  14701. #ifdef MNG_SUPPORT_TRACE
  14702. MNG_TRACE (pData, MNG_FN_PROCESS_IDX4, MNG_LC_END);
  14703. #endif
  14704. return MNG_NOERROR;
  14705. }
  14706. #endif /* MNG_NO_1_2_4BIT_SUPPORT */
  14707. /* ************************************************************************** */
  14708. mng_retcode mng_process_idx8 (mng_datap pData)
  14709. {
  14710. mng_uint8p pWorkrow;
  14711. mng_uint8p pRGBArow;
  14712. mng_int32 iX;
  14713. mng_uint8 iQ;
  14714. mng_imagedatap pBuf = (mng_imagedatap)pData->pStorebuf;
  14715. #ifdef MNG_SUPPORT_TRACE
  14716. MNG_TRACE (pData, MNG_FN_PROCESS_IDX8, MNG_LC_START);
  14717. #endif
  14718. if (!pBuf) /* no object? then use obj 0 */
  14719. pBuf = ((mng_imagep)pData->pObjzero)->pImgbuf;
  14720. /* temporary work pointers */
  14721. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  14722. pRGBArow = pData->pRGBArow;
  14723. if (pBuf->bHasTRNS) /* tRNS encountered ? */
  14724. {
  14725. #ifdef MNG_DECREMENT_LOOPS
  14726. for (iX = pData->iRowsamples; iX > 0; iX--)
  14727. #else
  14728. for (iX = 0; iX < pData->iRowsamples; iX++)
  14729. #endif
  14730. {
  14731. iQ = *pWorkrow; /* get input byte */
  14732. /* index valid ? */
  14733. if ((mng_uint32)iQ < pBuf->iPLTEcount)
  14734. { /* put in intermediate row */
  14735. pRGBArow [0] = pBuf->aPLTEentries [iQ].iRed;
  14736. pRGBArow [1] = pBuf->aPLTEentries [iQ].iGreen;
  14737. pRGBArow [2] = pBuf->aPLTEentries [iQ].iBlue;
  14738. /* transparency for this index ? */
  14739. if ((mng_uint32)iQ < pBuf->iTRNScount)
  14740. pRGBArow [3] = pBuf->aTRNSentries [iQ];
  14741. else
  14742. pRGBArow [3] = 0xFF;
  14743. }
  14744. else
  14745. MNG_ERROR (pData, MNG_PLTEINDEXERROR);
  14746. pRGBArow += 4; /* next pixel */
  14747. pWorkrow++;
  14748. }
  14749. pData->bIsOpaque = MNG_FALSE; /* it's not fully opaque */
  14750. }
  14751. else
  14752. {
  14753. #ifdef MNG_DECREMENT_LOOPS
  14754. for (iX = pData->iRowsamples; iX > 0; iX--)
  14755. #else
  14756. for (iX = 0; iX < pData->iRowsamples; iX++)
  14757. #endif
  14758. {
  14759. iQ = *pWorkrow; /* get input byte */
  14760. /* index valid ? */
  14761. if ((mng_uint32)iQ < pBuf->iPLTEcount)
  14762. { /* put in intermediate row */
  14763. pRGBArow [0] = pBuf->aPLTEentries [iQ].iRed;
  14764. pRGBArow [1] = pBuf->aPLTEentries [iQ].iGreen;
  14765. pRGBArow [2] = pBuf->aPLTEentries [iQ].iBlue;
  14766. pRGBArow [3] = 0xFF;
  14767. }
  14768. else
  14769. MNG_ERROR (pData, MNG_PLTEINDEXERROR);
  14770. pRGBArow += 4; /* next pixel */
  14771. pWorkrow++;
  14772. }
  14773. pData->bIsOpaque = MNG_TRUE; /* it's fully opaque */
  14774. }
  14775. #ifdef MNG_SUPPORT_TRACE
  14776. MNG_TRACE (pData, MNG_FN_PROCESS_IDX8, MNG_LC_END);
  14777. #endif
  14778. return MNG_NOERROR;
  14779. }
  14780. /* ************************************************************************** */
  14781. mng_retcode mng_process_ga8 (mng_datap pData)
  14782. {
  14783. mng_uint8p pWorkrow;
  14784. mng_uint8p pRGBArow;
  14785. mng_int32 iX;
  14786. #ifdef MNG_SUPPORT_TRACE
  14787. MNG_TRACE (pData, MNG_FN_PROCESS_GA8, MNG_LC_START);
  14788. #endif
  14789. /* temporary work pointers */
  14790. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  14791. pRGBArow = pData->pRGBArow;
  14792. #ifdef MNG_DECREMENT_LOOPS
  14793. for (iX = pData->iRowsamples; iX > 0; iX--)
  14794. #else
  14795. for (iX = 0; iX < pData->iRowsamples; iX++)
  14796. #endif
  14797. {
  14798. *pRGBArow = *pWorkrow; /* copy the gray value */
  14799. *(pRGBArow+1) = *pWorkrow;
  14800. *(pRGBArow+2) = *pWorkrow;
  14801. *(pRGBArow+3) = *(pWorkrow+1); /* copy the alpha value */
  14802. pWorkrow += 2; /* next pixel */
  14803. pRGBArow += 4;
  14804. }
  14805. pData->bIsOpaque = MNG_FALSE; /* it's definitely not fully opaque */
  14806. #ifdef MNG_SUPPORT_TRACE
  14807. MNG_TRACE (pData, MNG_FN_PROCESS_GA8, MNG_LC_END);
  14808. #endif
  14809. return MNG_NOERROR;
  14810. }
  14811. /* ************************************************************************** */
  14812. #ifndef MNG_NO_16BIT_SUPPORT
  14813. mng_retcode mng_process_ga16 (mng_datap pData)
  14814. {
  14815. mng_uint8p pWorkrow;
  14816. mng_uint8p pRGBArow;
  14817. mng_int32 iX;
  14818. mng_uint16 iW;
  14819. #ifdef MNG_SUPPORT_TRACE
  14820. MNG_TRACE (pData, MNG_FN_PROCESS_GA16, MNG_LC_START);
  14821. #endif
  14822. /* temporary work pointers */
  14823. pWorkrow = pData->pWorkrow + pData->iPixelofs;
  14824. pRGBArow = pData->pRGBArow;
  14825. #ifdef MNG_DECREMENT_LOOPS
  14826. for (iX = pData->iRowsamples; iX > 0; iX--)
  14827. #else
  14828. for (iX = 0; iX < pData->iRowsamples; iX++)
  14829. #endif
  14830. {
  14831. iW = mng_get_uint16 (pWorkrow); /* copy the gray value */
  14832. mng_put_uint16 (pRGBArow, iW);
  14833. mng_put_uint16 (pRGBArow+2, iW);
  14834. mng_put_uint16 (pRGBArow+4, iW);
  14835. /* copy the alpha value */
  14836. mng_put_uint16 (pRGBArow+6, mng_get_uint16 (pWorkrow+2));
  14837. pWorkrow += 4; /* next pixel */
  14838. pRGBArow += 8;
  14839. }
  14840. pData->bIsOpaque = MNG_FALSE; /* it's definitely not fully opaque */
  14841. #ifdef MNG_SUPPORT_TRACE
  14842. MNG_TRACE (pData, MNG_FN_PROCESS_GA16, MNG_LC_END);
  14843. #endif
  14844. return MNG_NOERROR;
  14845. }
  14846. #endif
  14847. /* ************************************************************************** */
  14848. mng_retcode mng_process_rgba8 (mng_datap pData)
  14849. {
  14850. #ifdef MNG_SUPPORT_TRACE
  14851. MNG_TRACE (pData, MNG_FN_PROCESS_RGBA8, MNG_LC_START);
  14852. #endif
  14853. /* this is the easiest transform */
  14854. MNG_COPY (pData->pRGBArow, pData->pWorkrow + pData->iPixelofs, pData->iRowsize);
  14855. pData->bIsOpaque = MNG_FALSE; /* it's definitely not fully opaque */
  14856. #ifdef MNG_SUPPORT_TRACE
  14857. MNG_TRACE (pData, MNG_FN_PROCESS_RGBA8, MNG_LC_END);
  14858. #endif
  14859. return MNG_NOERROR;
  14860. }
  14861. /* ************************************************************************** */
  14862. #ifndef MNG_NO_16BIT_SUPPORT
  14863. mng_retcode mng_process_rgba16 (mng_datap pData)
  14864. {
  14865. #ifdef MNG_SUPPORT_TRACE
  14866. MNG_TRACE (pData, MNG_FN_PROCESS_RGBA16, MNG_LC_START);
  14867. #endif
  14868. /* this is the easiest transform */
  14869. MNG_COPY (pData->pRGBArow, pData->pWorkrow + pData->iPixelofs, pData->iRowsize);
  14870. pData->bIsOpaque = MNG_FALSE; /* it's definitely not fully opaque */
  14871. #ifdef MNG_SUPPORT_TRACE
  14872. MNG_TRACE (pData, MNG_FN_PROCESS_RGBA16, MNG_LC_END);
  14873. #endif
  14874. return MNG_NOERROR;
  14875. }
  14876. #endif
  14877. /* ************************************************************************** */
  14878. /* * * */
  14879. /* * Row processing initialization routines - set up the variables needed * */
  14880. /* * to process uncompressed row-data * */
  14881. /* * * */
  14882. /* ************************************************************************** */
  14883. #ifndef MNG_OPTIMIZE_FOOTPRINT_INIT
  14884. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  14885. mng_retcode mng_init_g1_ni (mng_datap pData)
  14886. {
  14887. #ifdef MNG_SUPPORT_TRACE
  14888. MNG_TRACE (pData, MNG_FN_INIT_G1_NI, MNG_LC_START);
  14889. #endif
  14890. if (pData->fDisplayrow)
  14891. pData->fProcessrow = (mng_fptr)mng_process_g1;
  14892. if (pData->pStoreobj) /* store in object too ? */
  14893. { /* immediate delta ? */
  14894. #ifndef MNG_NO_DELTA_PNG
  14895. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  14896. pData->fStorerow = (mng_fptr)mng_delta_g1;
  14897. else
  14898. #endif
  14899. pData->fStorerow = (mng_fptr)mng_store_g1;
  14900. }
  14901. #ifdef FILTER192 /* leveling & differing ? */
  14902. if (pData->iFilter == MNG_FILTER_DIFFERING)
  14903. pData->fDifferrow = (mng_fptr)mng_differ_g1;
  14904. #endif
  14905. pData->iPass = -1;
  14906. pData->iRow = 0;
  14907. pData->iRowinc = 1;
  14908. pData->iCol = 0;
  14909. pData->iColinc = 1;
  14910. pData->iRowsamples = pData->iDatawidth;
  14911. pData->iSamplemul = 1;
  14912. pData->iSampleofs = 7;
  14913. pData->iSamplediv = 3;
  14914. pData->iRowsize = (pData->iRowsamples + 7) >> 3;
  14915. pData->iRowmax = pData->iRowsize + pData->iPixelofs;
  14916. pData->iFilterbpp = 1;
  14917. pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */
  14918. #ifdef MNG_SUPPORT_TRACE
  14919. MNG_TRACE (pData, MNG_FN_INIT_G1_NI, MNG_LC_END);
  14920. #endif
  14921. return mng_init_rowproc (pData);
  14922. }
  14923. /* ************************************************************************** */
  14924. mng_retcode mng_init_g1_i (mng_datap pData)
  14925. {
  14926. #ifdef MNG_SUPPORT_TRACE
  14927. MNG_TRACE (pData, MNG_FN_INIT_G1_I, MNG_LC_START);
  14928. #endif
  14929. if (pData->fDisplayrow)
  14930. pData->fProcessrow = (mng_fptr)mng_process_g1;
  14931. if (pData->pStoreobj) /* store in object too ? */
  14932. { /* immediate delta ? */
  14933. #ifndef MNG_NO_DELTA_PNG
  14934. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  14935. pData->fStorerow = (mng_fptr)mng_delta_g1;
  14936. else
  14937. #endif
  14938. pData->fStorerow = (mng_fptr)mng_store_g1;
  14939. }
  14940. #ifdef FILTER192 /* leveling & differing ? */
  14941. if (pData->iFilter == MNG_FILTER_DIFFERING)
  14942. pData->fDifferrow = (mng_fptr)mng_differ_g1;
  14943. #endif
  14944. pData->iPass = 0; /* from 0..6; is 1..7 in specifications */
  14945. pData->iRow = interlace_row [0];
  14946. pData->iRowinc = interlace_rowskip [0];
  14947. pData->iCol = interlace_col [0];
  14948. pData->iColinc = interlace_colskip [0];
  14949. pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0];
  14950. pData->iSamplemul = 1;
  14951. pData->iSampleofs = 7;
  14952. pData->iSamplediv = 3;
  14953. pData->iRowsize = ((pData->iRowsamples + 7) >> 3);
  14954. pData->iRowmax = ((pData->iDatawidth + 7) >> 3) + pData->iPixelofs;
  14955. pData->iFilterbpp = 1;
  14956. pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */
  14957. #ifdef MNG_SUPPORT_TRACE
  14958. MNG_TRACE (pData, MNG_FN_INIT_G1_I, MNG_LC_END);
  14959. #endif
  14960. return mng_init_rowproc (pData);
  14961. }
  14962. /* ************************************************************************** */
  14963. mng_retcode mng_init_g2_ni (mng_datap pData)
  14964. {
  14965. #ifdef MNG_SUPPORT_TRACE
  14966. MNG_TRACE (pData, MNG_FN_INIT_G2_NI, MNG_LC_START);
  14967. #endif
  14968. if (pData->fDisplayrow)
  14969. pData->fProcessrow = (mng_fptr)mng_process_g2;
  14970. if (pData->pStoreobj) /* store in object too ? */
  14971. { /* immediate delta ? */
  14972. #ifndef MNG_NO_DELTA_PNG
  14973. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  14974. pData->fStorerow = (mng_fptr)mng_delta_g2;
  14975. else
  14976. #endif
  14977. pData->fStorerow = (mng_fptr)mng_store_g2;
  14978. }
  14979. #ifdef FILTER192 /* leveling & differing ? */
  14980. if (pData->iFilter == MNG_FILTER_DIFFERING)
  14981. pData->fDifferrow = (mng_fptr)mng_differ_g2;
  14982. #endif
  14983. pData->iPass = -1;
  14984. pData->iRow = 0;
  14985. pData->iRowinc = 1;
  14986. pData->iCol = 0;
  14987. pData->iColinc = 1;
  14988. pData->iRowsamples = pData->iDatawidth;
  14989. pData->iSamplemul = 1;
  14990. pData->iSampleofs = 3;
  14991. pData->iSamplediv = 2;
  14992. pData->iRowsize = (pData->iRowsamples + 3) >> 2;
  14993. pData->iRowmax = pData->iRowsize + pData->iPixelofs;
  14994. pData->iFilterbpp = 1;
  14995. pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */
  14996. #ifdef MNG_SUPPORT_TRACE
  14997. MNG_TRACE (pData, MNG_FN_INIT_G2_NI, MNG_LC_END);
  14998. #endif
  14999. return mng_init_rowproc (pData);
  15000. }
  15001. /* ************************************************************************** */
  15002. mng_retcode mng_init_g2_i (mng_datap pData)
  15003. {
  15004. #ifdef MNG_SUPPORT_TRACE
  15005. MNG_TRACE (pData, MNG_FN_INIT_G2_I, MNG_LC_START);
  15006. #endif
  15007. if (pData->fDisplayrow)
  15008. pData->fProcessrow = (mng_fptr)mng_process_g2;
  15009. if (pData->pStoreobj) /* store in object too ? */
  15010. { /* immediate delta ? */
  15011. #ifndef MNG_NO_DELTA_PNG
  15012. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  15013. pData->fStorerow = (mng_fptr)mng_delta_g2;
  15014. else
  15015. #endif
  15016. pData->fStorerow = (mng_fptr)mng_store_g2;
  15017. }
  15018. #ifdef FILTER192 /* leveling & differing ? */
  15019. if (pData->iFilter == MNG_FILTER_DIFFERING)
  15020. pData->fDifferrow = (mng_fptr)mng_differ_g2;
  15021. #endif
  15022. pData->iPass = 0; /* from 0..6; is 1..7 in specifications */
  15023. pData->iRow = interlace_row [0];
  15024. pData->iRowinc = interlace_rowskip [0];
  15025. pData->iCol = interlace_col [0];
  15026. pData->iColinc = interlace_colskip [0];
  15027. pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0];
  15028. pData->iSamplemul = 1;
  15029. pData->iSampleofs = 3;
  15030. pData->iSamplediv = 2;
  15031. pData->iRowsize = ((pData->iRowsamples + 3) >> 2);
  15032. pData->iRowmax = ((pData->iDatawidth + 3) >> 2) + pData->iPixelofs;
  15033. pData->iFilterbpp = 1;
  15034. pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */
  15035. #ifdef MNG_SUPPORT_TRACE
  15036. MNG_TRACE (pData, MNG_FN_INIT_G2_I, MNG_LC_END);
  15037. #endif
  15038. return mng_init_rowproc (pData);
  15039. }
  15040. /* ************************************************************************** */
  15041. mng_retcode mng_init_g4_ni (mng_datap pData)
  15042. {
  15043. #ifdef MNG_SUPPORT_TRACE
  15044. MNG_TRACE (pData, MNG_FN_INIT_G4_NI, MNG_LC_START);
  15045. #endif
  15046. if (pData->fDisplayrow)
  15047. pData->fProcessrow = (mng_fptr)mng_process_g4;
  15048. if (pData->pStoreobj) /* store in object too ? */
  15049. { /* immediate delta ? */
  15050. #ifndef MNG_NO_DELTA_PNG
  15051. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  15052. pData->fStorerow = (mng_fptr)mng_delta_g4;
  15053. else
  15054. #endif
  15055. pData->fStorerow = (mng_fptr)mng_store_g4;
  15056. }
  15057. #ifdef FILTER192 /* leveling & differing ? */
  15058. if (pData->iFilter == MNG_FILTER_DIFFERING)
  15059. pData->fDifferrow = (mng_fptr)mng_differ_g4;
  15060. #endif
  15061. pData->iPass = -1;
  15062. pData->iRow = 0;
  15063. pData->iRowinc = 1;
  15064. pData->iCol = 0;
  15065. pData->iColinc = 1;
  15066. pData->iRowsamples = pData->iDatawidth;
  15067. pData->iSamplemul = 1;
  15068. pData->iSampleofs = 1;
  15069. pData->iSamplediv = 1;
  15070. pData->iRowsize = (pData->iRowsamples + 1) >> 1;
  15071. pData->iRowmax = pData->iRowsize + pData->iPixelofs;
  15072. pData->iFilterbpp = 1;
  15073. pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */
  15074. #ifdef MNG_SUPPORT_TRACE
  15075. MNG_TRACE (pData, MNG_FN_INIT_G4_NI, MNG_LC_END);
  15076. #endif
  15077. return mng_init_rowproc (pData);
  15078. }
  15079. /* ************************************************************************** */
  15080. mng_retcode mng_init_g4_i (mng_datap pData)
  15081. {
  15082. #ifdef MNG_SUPPORT_TRACE
  15083. MNG_TRACE (pData, MNG_FN_INIT_G4_I, MNG_LC_START);
  15084. #endif
  15085. if (pData->fDisplayrow)
  15086. pData->fProcessrow = (mng_fptr)mng_process_g4;
  15087. if (pData->pStoreobj) /* store in object too ? */
  15088. { /* immediate delta ? */
  15089. #ifndef MNG_NO_DELTA_PNG
  15090. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  15091. pData->fStorerow = (mng_fptr)mng_delta_g4;
  15092. else
  15093. #endif
  15094. pData->fStorerow = (mng_fptr)mng_store_g4;
  15095. }
  15096. #ifdef FILTER192 /* leveling & differing ? */
  15097. if (pData->iFilter == MNG_FILTER_DIFFERING)
  15098. pData->fDifferrow = (mng_fptr)mng_differ_g4;
  15099. #endif
  15100. pData->iPass = 0; /* from 0..6; is 1..7 in specifications */
  15101. pData->iRow = interlace_row [0];
  15102. pData->iRowinc = interlace_rowskip [0];
  15103. pData->iCol = interlace_col [0];
  15104. pData->iColinc = interlace_colskip [0];
  15105. pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0];
  15106. pData->iSamplemul = 1;
  15107. pData->iSampleofs = 1;
  15108. pData->iSamplediv = 1;
  15109. pData->iRowsize = ((pData->iRowsamples + 1) >> 1);
  15110. pData->iRowmax = ((pData->iDatawidth + 1) >> 1) + pData->iPixelofs;
  15111. pData->iFilterbpp = 1;
  15112. pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */
  15113. #ifdef MNG_SUPPORT_TRACE
  15114. MNG_TRACE (pData, MNG_FN_INIT_G4_I, MNG_LC_END);
  15115. #endif
  15116. return mng_init_rowproc (pData);
  15117. }
  15118. #endif /* MNG_NO_1_2_4BIT_SUPPORT */
  15119. /* ************************************************************************** */
  15120. mng_retcode mng_init_g8_ni (mng_datap pData)
  15121. {
  15122. #ifdef MNG_SUPPORT_TRACE
  15123. MNG_TRACE (pData, MNG_FN_INIT_G8_NI, MNG_LC_START);
  15124. #endif
  15125. if (pData->fDisplayrow)
  15126. pData->fProcessrow = (mng_fptr)mng_process_g8;
  15127. if (pData->pStoreobj) /* store in object too ? */
  15128. { /* immediate delta ? */
  15129. #ifndef MNG_NO_DELTA_PNG
  15130. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  15131. pData->fStorerow = (mng_fptr)mng_delta_g8;
  15132. else
  15133. #endif
  15134. pData->fStorerow = (mng_fptr)mng_store_g8;
  15135. }
  15136. #ifdef FILTER192 /* leveling & differing ? */
  15137. if (pData->iFilter == MNG_FILTER_DIFFERING)
  15138. pData->fDifferrow = (mng_fptr)mng_differ_g8;
  15139. #endif
  15140. pData->iPass = -1;
  15141. pData->iRow = 0;
  15142. pData->iRowinc = 1;
  15143. pData->iCol = 0;
  15144. pData->iColinc = 1;
  15145. pData->iRowsamples = pData->iDatawidth;
  15146. pData->iSamplemul = 1;
  15147. pData->iSampleofs = 0;
  15148. pData->iSamplediv = 0;
  15149. pData->iRowsize = pData->iRowsamples;
  15150. pData->iRowmax = pData->iRowsize + pData->iPixelofs;
  15151. pData->iFilterbpp = 1;
  15152. pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */
  15153. #ifdef MNG_SUPPORT_TRACE
  15154. MNG_TRACE (pData, MNG_FN_INIT_G8_NI, MNG_LC_END);
  15155. #endif
  15156. return mng_init_rowproc (pData);
  15157. }
  15158. /* ************************************************************************** */
  15159. mng_retcode mng_init_g8_i (mng_datap pData)
  15160. {
  15161. #ifdef MNG_SUPPORT_TRACE
  15162. MNG_TRACE (pData, MNG_FN_INIT_G8_I, MNG_LC_START);
  15163. #endif
  15164. if (pData->fDisplayrow)
  15165. pData->fProcessrow = (mng_fptr)mng_process_g8;
  15166. if (pData->pStoreobj) /* store in object too ? */
  15167. { /* immediate delta ? */
  15168. #ifndef MNG_NO_DELTA_PNG
  15169. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  15170. pData->fStorerow = (mng_fptr)mng_delta_g8;
  15171. else
  15172. #endif
  15173. pData->fStorerow = (mng_fptr)mng_store_g8;
  15174. }
  15175. #ifdef FILTER192 /* leveling & differing ? */
  15176. if (pData->iFilter == MNG_FILTER_DIFFERING)
  15177. pData->fDifferrow = (mng_fptr)mng_differ_g8;
  15178. #endif
  15179. pData->iPass = 0; /* from 0..6; is 1..7 in specifications */
  15180. pData->iRow = interlace_row [0];
  15181. pData->iRowinc = interlace_rowskip [0];
  15182. pData->iCol = interlace_col [0];
  15183. pData->iColinc = interlace_colskip [0];
  15184. pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0];
  15185. pData->iSamplemul = 1;
  15186. pData->iSampleofs = 0;
  15187. pData->iSamplediv = 0;
  15188. pData->iRowsize = pData->iRowsamples;
  15189. pData->iRowmax = pData->iDatawidth + pData->iPixelofs;
  15190. pData->iFilterbpp = 1;
  15191. pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */
  15192. #ifdef MNG_SUPPORT_TRACE
  15193. MNG_TRACE (pData, MNG_FN_INIT_G8_I, MNG_LC_END);
  15194. #endif
  15195. return mng_init_rowproc (pData);
  15196. }
  15197. /* ************************************************************************** */
  15198. #ifndef MNG_NO_16BIT_SUPPORT
  15199. mng_retcode mng_init_g16_ni (mng_datap pData)
  15200. {
  15201. #ifdef MNG_SUPPORT_TRACE
  15202. MNG_TRACE (pData, MNG_FN_INIT_G16_NI, MNG_LC_START);
  15203. #endif
  15204. if (pData->fDisplayrow)
  15205. pData->fProcessrow = (mng_fptr)mng_process_g16;
  15206. if (pData->pStoreobj) /* store in object too ? */
  15207. { /* immediate delta ? */
  15208. #ifndef MNG_NO_DELTA_PNG
  15209. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  15210. pData->fStorerow = (mng_fptr)mng_delta_g16;
  15211. else
  15212. #endif
  15213. pData->fStorerow = (mng_fptr)mng_store_g16;
  15214. }
  15215. #ifdef FILTER192 /* leveling & differing ? */
  15216. if (pData->iFilter == MNG_FILTER_DIFFERING)
  15217. pData->fDifferrow = (mng_fptr)mng_differ_g16;
  15218. #endif
  15219. pData->iPass = -1;
  15220. pData->iRow = 0;
  15221. pData->iRowinc = 1;
  15222. pData->iCol = 0;
  15223. pData->iColinc = 1;
  15224. pData->iRowsamples = pData->iDatawidth;
  15225. pData->iSamplemul = 2;
  15226. pData->iSampleofs = 0;
  15227. pData->iSamplediv = 0;
  15228. pData->iRowsize = pData->iRowsamples << 1;
  15229. pData->iRowmax = pData->iRowsize + pData->iPixelofs;
  15230. pData->iFilterbpp = 2;
  15231. pData->bIsRGBA16 = MNG_TRUE; /* intermediate row is 16-bit deep */
  15232. #ifdef MNG_SUPPORT_TRACE
  15233. MNG_TRACE (pData, MNG_FN_INIT_G16_NI, MNG_LC_END);
  15234. #endif
  15235. return mng_init_rowproc (pData);
  15236. }
  15237. #endif
  15238. /* ************************************************************************** */
  15239. #ifndef MNG_NO_16BIT_SUPPORT
  15240. mng_retcode mng_init_g16_i (mng_datap pData)
  15241. {
  15242. #ifdef MNG_SUPPORT_TRACE
  15243. MNG_TRACE (pData, MNG_FN_INIT_G16_I, MNG_LC_START);
  15244. #endif
  15245. if (pData->fDisplayrow)
  15246. pData->fProcessrow = (mng_fptr)mng_process_g16;
  15247. if (pData->pStoreobj) /* store in object too ? */
  15248. { /* immediate delta ? */
  15249. #ifndef MNG_NO_DELTA_PNG
  15250. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  15251. pData->fStorerow = (mng_fptr)mng_delta_g16;
  15252. else
  15253. #endif
  15254. pData->fStorerow = (mng_fptr)mng_store_g16;
  15255. }
  15256. #ifdef FILTER192 /* leveling & differing ? */
  15257. if (pData->iFilter == MNG_FILTER_DIFFERING)
  15258. pData->fDifferrow = (mng_fptr)mng_differ_g16;
  15259. #endif
  15260. pData->iPass = 0; /* from 0..6; is 1..7 in specifications */
  15261. pData->iRow = interlace_row [0];
  15262. pData->iRowinc = interlace_rowskip [0];
  15263. pData->iCol = interlace_col [0];
  15264. pData->iColinc = interlace_colskip [0];
  15265. pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0];
  15266. pData->iSamplemul = 2;
  15267. pData->iSampleofs = 0;
  15268. pData->iSamplediv = 0;
  15269. pData->iRowsize = pData->iRowsamples << 1;
  15270. pData->iRowmax = (pData->iDatawidth << 1) + pData->iPixelofs;
  15271. pData->iFilterbpp = 2;
  15272. pData->bIsRGBA16 = MNG_TRUE; /* intermediate row is 16-bit deep */
  15273. #ifdef MNG_SUPPORT_TRACE
  15274. MNG_TRACE (pData, MNG_FN_INIT_G16_I, MNG_LC_END);
  15275. #endif
  15276. return mng_init_rowproc (pData);
  15277. }
  15278. #endif
  15279. /* ************************************************************************** */
  15280. mng_retcode mng_init_rgb8_ni (mng_datap pData)
  15281. {
  15282. #ifdef MNG_SUPPORT_TRACE
  15283. MNG_TRACE (pData, MNG_FN_INIT_RGB8_NI, MNG_LC_START);
  15284. #endif
  15285. if (pData->fDisplayrow)
  15286. pData->fProcessrow = (mng_fptr)mng_process_rgb8;
  15287. if (pData->pStoreobj) /* store in object too ? */
  15288. { /* immediate delta ? */
  15289. #ifndef MNG_NO_DELTA_PNG
  15290. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  15291. pData->fStorerow = (mng_fptr)mng_delta_rgb8;
  15292. else
  15293. #endif
  15294. pData->fStorerow = (mng_fptr)mng_store_rgb8;
  15295. }
  15296. #ifdef FILTER192 /* leveling & differing ? */
  15297. if (pData->iFilter == MNG_FILTER_DIFFERING)
  15298. pData->fDifferrow = (mng_fptr)mng_differ_rgb8;
  15299. #endif
  15300. pData->iPass = -1;
  15301. pData->iRow = 0;
  15302. pData->iRowinc = 1;
  15303. pData->iCol = 0;
  15304. pData->iColinc = 1;
  15305. pData->iRowsamples = pData->iDatawidth;
  15306. pData->iSamplemul = 3;
  15307. pData->iSampleofs = 0;
  15308. pData->iSamplediv = 0;
  15309. pData->iRowsize = pData->iRowsamples * 3;
  15310. pData->iRowmax = pData->iRowsize + pData->iPixelofs;
  15311. pData->iFilterbpp = 3;
  15312. pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */
  15313. #ifdef MNG_SUPPORT_TRACE
  15314. MNG_TRACE (pData, MNG_FN_INIT_RGB8_NI, MNG_LC_END);
  15315. #endif
  15316. return mng_init_rowproc (pData);
  15317. }
  15318. /* ************************************************************************** */
  15319. mng_retcode mng_init_rgb8_i (mng_datap pData)
  15320. {
  15321. #ifdef MNG_SUPPORT_TRACE
  15322. MNG_TRACE (pData, MNG_FN_INIT_RGB8_I, MNG_LC_START);
  15323. #endif
  15324. if (pData->fDisplayrow)
  15325. pData->fProcessrow = (mng_fptr)mng_process_rgb8;
  15326. if (pData->pStoreobj) /* store in object too ? */
  15327. { /* immediate delta ? */
  15328. #ifndef MNG_NO_DELTA_PNG
  15329. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  15330. pData->fStorerow = (mng_fptr)mng_delta_rgb8;
  15331. else
  15332. #endif
  15333. pData->fStorerow = (mng_fptr)mng_store_rgb8;
  15334. }
  15335. #ifdef FILTER192 /* leveling & differing ? */
  15336. if (pData->iFilter == MNG_FILTER_DIFFERING)
  15337. pData->fDifferrow = (mng_fptr)mng_differ_rgb8;
  15338. #endif
  15339. pData->iPass = 0; /* from 0..6; is 1..7 in specifications */
  15340. pData->iRow = interlace_row [0];
  15341. pData->iRowinc = interlace_rowskip [0];
  15342. pData->iCol = interlace_col [0];
  15343. pData->iColinc = interlace_colskip [0];
  15344. pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0];
  15345. pData->iSamplemul = 3;
  15346. pData->iSampleofs = 0;
  15347. pData->iSamplediv = 0;
  15348. pData->iRowsize = pData->iRowsamples * 3;
  15349. pData->iRowmax = (pData->iDatawidth * 3) + pData->iPixelofs;
  15350. pData->iFilterbpp = 3;
  15351. pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */
  15352. #ifdef MNG_SUPPORT_TRACE
  15353. MNG_TRACE (pData, MNG_FN_INIT_RGB8_I, MNG_LC_END);
  15354. #endif
  15355. return mng_init_rowproc (pData);
  15356. }
  15357. /* ************************************************************************** */
  15358. #ifndef MNG_NO_16BIT_SUPPORT
  15359. mng_retcode mng_init_rgb16_ni (mng_datap pData)
  15360. {
  15361. #ifdef MNG_SUPPORT_TRACE
  15362. MNG_TRACE (pData, MNG_FN_INIT_RGB16_NI, MNG_LC_START);
  15363. #endif
  15364. if (pData->fDisplayrow)
  15365. pData->fProcessrow = (mng_fptr)mng_process_rgb16;
  15366. if (pData->pStoreobj) /* store in object too ? */
  15367. { /* immediate delta ? */
  15368. #ifndef MNG_NO_DELTA_PNG
  15369. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  15370. pData->fStorerow = (mng_fptr)mng_delta_rgb16;
  15371. else
  15372. #endif
  15373. pData->fStorerow = (mng_fptr)mng_store_rgb16;
  15374. }
  15375. #ifdef FILTER192 /* leveling & differing ? */
  15376. if (pData->iFilter == MNG_FILTER_DIFFERING)
  15377. pData->fDifferrow = (mng_fptr)mng_differ_rgb16;
  15378. #endif
  15379. pData->iPass = -1;
  15380. pData->iRow = 0;
  15381. pData->iRowinc = 1;
  15382. pData->iCol = 0;
  15383. pData->iColinc = 1;
  15384. pData->iRowsamples = pData->iDatawidth;
  15385. pData->iSamplemul = 6;
  15386. pData->iSampleofs = 0;
  15387. pData->iSamplediv = 0;
  15388. pData->iRowsize = pData->iRowsamples * 6;
  15389. pData->iRowmax = pData->iRowsize + pData->iPixelofs;
  15390. pData->iFilterbpp = 6;
  15391. pData->bIsRGBA16 = MNG_TRUE; /* intermediate row is 16-bit deep */
  15392. #ifdef MNG_SUPPORT_TRACE
  15393. MNG_TRACE (pData, MNG_FN_INIT_RGB16_NI, MNG_LC_END);
  15394. #endif
  15395. return mng_init_rowproc (pData);
  15396. }
  15397. #endif
  15398. /* ************************************************************************** */
  15399. #ifndef MNG_NO_16BIT_SUPPORT
  15400. mng_retcode mng_init_rgb16_i (mng_datap pData)
  15401. {
  15402. #ifdef MNG_SUPPORT_TRACE
  15403. MNG_TRACE (pData, MNG_FN_INIT_RGB16_I, MNG_LC_START);
  15404. #endif
  15405. if (pData->fDisplayrow)
  15406. pData->fProcessrow = (mng_fptr)mng_process_rgb16;
  15407. if (pData->pStoreobj) /* store in object too ? */
  15408. { /* immediate delta ? */
  15409. #ifndef MNG_NO_DELTA_PNG
  15410. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  15411. pData->fStorerow = (mng_fptr)mng_delta_rgb16;
  15412. else
  15413. #endif
  15414. pData->fStorerow = (mng_fptr)mng_store_rgb16;
  15415. }
  15416. #ifdef FILTER192 /* leveling & differing ? */
  15417. if (pData->iFilter == MNG_FILTER_DIFFERING)
  15418. pData->fDifferrow = (mng_fptr)mng_differ_rgb16;
  15419. #endif
  15420. pData->iPass = 0; /* from 0..6; is 1..7 in specifications */
  15421. pData->iRow = interlace_row [0];
  15422. pData->iRowinc = interlace_rowskip [0];
  15423. pData->iCol = interlace_col [0];
  15424. pData->iColinc = interlace_colskip [0];
  15425. pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0];
  15426. pData->iSamplemul = 6;
  15427. pData->iSampleofs = 0;
  15428. pData->iSamplediv = 0;
  15429. pData->iRowsize = pData->iRowsamples * 6;
  15430. pData->iRowmax = (pData->iDatawidth * 6) + pData->iPixelofs;
  15431. pData->iFilterbpp = 6;
  15432. pData->bIsRGBA16 = MNG_TRUE; /* intermediate row is 16-bit deep */
  15433. #ifdef MNG_SUPPORT_TRACE
  15434. MNG_TRACE (pData, MNG_FN_INIT_RGB16_I, MNG_LC_END);
  15435. #endif
  15436. return mng_init_rowproc (pData);
  15437. }
  15438. #endif
  15439. /* ************************************************************************** */
  15440. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  15441. mng_retcode mng_init_idx1_ni (mng_datap pData)
  15442. {
  15443. #ifdef MNG_SUPPORT_TRACE
  15444. MNG_TRACE (pData, MNG_FN_INIT_IDX1_NI, MNG_LC_START);
  15445. #endif
  15446. if (pData->fDisplayrow)
  15447. pData->fProcessrow = (mng_fptr)mng_process_idx1;
  15448. if (pData->pStoreobj) /* store in object too ? */
  15449. { /* immediate delta ? */
  15450. #ifndef MNG_NO_DELTA_PNG
  15451. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  15452. pData->fStorerow = (mng_fptr)mng_delta_idx1;
  15453. else
  15454. #endif
  15455. pData->fStorerow = (mng_fptr)mng_store_idx1;
  15456. }
  15457. #ifdef FILTER192 /* leveling & differing ? */
  15458. if (pData->iFilter == MNG_FILTER_DIFFERING)
  15459. pData->fDifferrow = (mng_fptr)mng_differ_idx1;
  15460. #endif
  15461. pData->iPass = -1;
  15462. pData->iRow = 0;
  15463. pData->iRowinc = 1;
  15464. pData->iCol = 0;
  15465. pData->iColinc = 1;
  15466. pData->iRowsamples = pData->iDatawidth;
  15467. pData->iSamplemul = 1;
  15468. pData->iSampleofs = 7;
  15469. pData->iSamplediv = 3;
  15470. pData->iRowsize = (pData->iRowsamples + 7) >> 3;
  15471. pData->iRowmax = pData->iRowsize + pData->iPixelofs;
  15472. pData->iFilterbpp = 1;
  15473. pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */
  15474. #ifdef MNG_SUPPORT_TRACE
  15475. MNG_TRACE (pData, MNG_FN_INIT_IDX1_NI, MNG_LC_END);
  15476. #endif
  15477. return mng_init_rowproc (pData);
  15478. }
  15479. /* ************************************************************************** */
  15480. mng_retcode mng_init_idx1_i (mng_datap pData)
  15481. {
  15482. #ifdef MNG_SUPPORT_TRACE
  15483. MNG_TRACE (pData, MNG_FN_INIT_IDX1_I, MNG_LC_START);
  15484. #endif
  15485. if (pData->fDisplayrow)
  15486. pData->fProcessrow = (mng_fptr)mng_process_idx1;
  15487. if (pData->pStoreobj) /* store in object too ? */
  15488. { /* immediate delta ? */
  15489. #ifndef MNG_NO_DELTA_PNG
  15490. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  15491. pData->fStorerow = (mng_fptr)mng_delta_idx1;
  15492. else
  15493. #endif
  15494. pData->fStorerow = (mng_fptr)mng_store_idx1;
  15495. }
  15496. #ifdef FILTER192 /* leveling & differing ? */
  15497. if (pData->iFilter == MNG_FILTER_DIFFERING)
  15498. pData->fDifferrow = (mng_fptr)mng_differ_idx1;
  15499. #endif
  15500. pData->iPass = 0; /* from 0..6; is 1..7 in specifications */
  15501. pData->iRow = interlace_row [0];
  15502. pData->iRowinc = interlace_rowskip [0];
  15503. pData->iCol = interlace_col [0];
  15504. pData->iColinc = interlace_colskip [0];
  15505. pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0];
  15506. pData->iSamplemul = 1;
  15507. pData->iSampleofs = 7;
  15508. pData->iSamplediv = 3;
  15509. pData->iRowsize = (pData->iRowsamples + 7) >> 3;
  15510. pData->iRowmax = ((pData->iDatawidth + 7) >> 3) + pData->iPixelofs;
  15511. pData->iFilterbpp = 1;
  15512. pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */
  15513. #ifdef MNG_SUPPORT_TRACE
  15514. MNG_TRACE (pData, MNG_FN_INIT_IDX1_I, MNG_LC_END);
  15515. #endif
  15516. return mng_init_rowproc (pData);
  15517. }
  15518. /* ************************************************************************** */
  15519. mng_retcode mng_init_idx2_ni (mng_datap pData)
  15520. {
  15521. #ifdef MNG_SUPPORT_TRACE
  15522. MNG_TRACE (pData, MNG_FN_INIT_IDX2_NI, MNG_LC_START);
  15523. #endif
  15524. if (pData->fDisplayrow)
  15525. pData->fProcessrow = (mng_fptr)mng_process_idx2;
  15526. if (pData->pStoreobj) /* store in object too ? */
  15527. { /* immediate delta ? */
  15528. #ifndef MNG_NO_DELTA_PNG
  15529. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  15530. pData->fStorerow = (mng_fptr)mng_delta_idx2;
  15531. else
  15532. #endif
  15533. pData->fStorerow = (mng_fptr)mng_store_idx2;
  15534. }
  15535. #ifdef FILTER192 /* leveling & differing ? */
  15536. if (pData->iFilter == MNG_FILTER_DIFFERING)
  15537. pData->fDifferrow = (mng_fptr)mng_differ_idx2;
  15538. #endif
  15539. pData->iPass = -1;
  15540. pData->iRow = 0;
  15541. pData->iRowinc = 1;
  15542. pData->iCol = 0;
  15543. pData->iColinc = 1;
  15544. pData->iRowsamples = pData->iDatawidth;
  15545. pData->iSamplemul = 1;
  15546. pData->iSampleofs = 3;
  15547. pData->iSamplediv = 2;
  15548. pData->iRowsize = (pData->iRowsamples + 3) >> 2;
  15549. pData->iRowmax = pData->iRowsize + pData->iPixelofs;
  15550. pData->iFilterbpp = 1;
  15551. pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */
  15552. #ifdef MNG_SUPPORT_TRACE
  15553. MNG_TRACE (pData, MNG_FN_INIT_IDX2_NI, MNG_LC_END);
  15554. #endif
  15555. return mng_init_rowproc (pData);
  15556. }
  15557. /* ************************************************************************** */
  15558. mng_retcode mng_init_idx2_i (mng_datap pData)
  15559. {
  15560. #ifdef MNG_SUPPORT_TRACE
  15561. MNG_TRACE (pData, MNG_FN_INIT_IDX2_I, MNG_LC_START);
  15562. #endif
  15563. if (pData->fDisplayrow)
  15564. pData->fProcessrow = (mng_fptr)mng_process_idx2;
  15565. if (pData->pStoreobj) /* store in object too ? */
  15566. { /* immediate delta ? */
  15567. #ifndef MNG_NO_DELTA_PNG
  15568. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  15569. pData->fStorerow = (mng_fptr)mng_delta_idx2;
  15570. else
  15571. #endif
  15572. pData->fStorerow = (mng_fptr)mng_store_idx2;
  15573. }
  15574. #ifdef FILTER192 /* leveling & differing ? */
  15575. if (pData->iFilter == MNG_FILTER_DIFFERING)
  15576. pData->fDifferrow = (mng_fptr)mng_differ_idx2;
  15577. #endif
  15578. pData->iPass = 0; /* from 0..6; is 1..7 in specifications */
  15579. pData->iRow = interlace_row [0];
  15580. pData->iRowinc = interlace_rowskip [0];
  15581. pData->iCol = interlace_col [0];
  15582. pData->iColinc = interlace_colskip [0];
  15583. pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0];
  15584. pData->iSamplemul = 1;
  15585. pData->iSampleofs = 3;
  15586. pData->iSamplediv = 2;
  15587. pData->iRowsize = (pData->iRowsamples + 3) >> 2;
  15588. pData->iRowmax = ((pData->iDatawidth + 3) >> 2) + pData->iPixelofs;
  15589. pData->iFilterbpp = 1;
  15590. pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */
  15591. #ifdef MNG_SUPPORT_TRACE
  15592. MNG_TRACE (pData, MNG_FN_INIT_IDX2_I, MNG_LC_END);
  15593. #endif
  15594. return mng_init_rowproc (pData);
  15595. }
  15596. /* ************************************************************************** */
  15597. mng_retcode mng_init_idx4_ni (mng_datap pData)
  15598. {
  15599. #ifdef MNG_SUPPORT_TRACE
  15600. MNG_TRACE (pData, MNG_FN_INIT_IDX4_NI, MNG_LC_START);
  15601. #endif
  15602. if (pData->fDisplayrow)
  15603. pData->fProcessrow = (mng_fptr)mng_process_idx4;
  15604. if (pData->pStoreobj) /* store in object too ? */
  15605. { /* immediate delta ? */
  15606. #ifndef MNG_NO_DELTA_PNG
  15607. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  15608. pData->fStorerow = (mng_fptr)mng_delta_idx4;
  15609. else
  15610. #endif
  15611. pData->fStorerow = (mng_fptr)mng_store_idx4;
  15612. }
  15613. #ifdef FILTER192 /* leveling & differing ? */
  15614. if (pData->iFilter == MNG_FILTER_DIFFERING)
  15615. pData->fDifferrow = (mng_fptr)mng_differ_idx4;
  15616. #endif
  15617. pData->iPass = -1;
  15618. pData->iRow = 0;
  15619. pData->iRowinc = 1;
  15620. pData->iCol = 0;
  15621. pData->iColinc = 1;
  15622. pData->iRowsamples = pData->iDatawidth;
  15623. pData->iSamplemul = 1;
  15624. pData->iSampleofs = 1;
  15625. pData->iSamplediv = 1;
  15626. pData->iRowsize = (pData->iRowsamples + 1) >> 1;
  15627. pData->iRowmax = pData->iRowsize + pData->iPixelofs;
  15628. pData->iFilterbpp = 1;
  15629. pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */
  15630. #ifdef MNG_SUPPORT_TRACE
  15631. MNG_TRACE (pData, MNG_FN_INIT_IDX4_NI, MNG_LC_END);
  15632. #endif
  15633. return mng_init_rowproc (pData);
  15634. }
  15635. /* ************************************************************************** */
  15636. mng_retcode mng_init_idx4_i (mng_datap pData)
  15637. {
  15638. #ifdef MNG_SUPPORT_TRACE
  15639. MNG_TRACE (pData, MNG_FN_INIT_IDX4_I, MNG_LC_START);
  15640. #endif
  15641. if (pData->fDisplayrow)
  15642. pData->fProcessrow = (mng_fptr)mng_process_idx4;
  15643. if (pData->pStoreobj) /* store in object too ? */
  15644. { /* immediate delta ? */
  15645. #ifndef MNG_NO_DELTA_PNG
  15646. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  15647. pData->fStorerow = (mng_fptr)mng_delta_idx4;
  15648. else
  15649. #endif
  15650. pData->fStorerow = (mng_fptr)mng_store_idx4;
  15651. }
  15652. #ifdef FILTER192 /* leveling & differing ? */
  15653. if (pData->iFilter == MNG_FILTER_DIFFERING)
  15654. pData->fDifferrow = (mng_fptr)mng_differ_idx4;
  15655. #endif
  15656. pData->iPass = 0; /* from 0..6; is 1..7 in specifications */
  15657. pData->iRow = interlace_row [0];
  15658. pData->iRowinc = interlace_rowskip [0];
  15659. pData->iCol = interlace_col [0];
  15660. pData->iColinc = interlace_colskip [0];
  15661. pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0];
  15662. pData->iSamplemul = 1;
  15663. pData->iSampleofs = 1;
  15664. pData->iSamplediv = 1;
  15665. pData->iRowsize = (pData->iRowsamples + 1) >> 1;
  15666. pData->iRowmax = ((pData->iDatawidth + 1) >> 1) + pData->iPixelofs;
  15667. pData->iFilterbpp = 1;
  15668. pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */
  15669. #ifdef MNG_SUPPORT_TRACE
  15670. MNG_TRACE (pData, MNG_FN_INIT_IDX4_I, MNG_LC_END);
  15671. #endif
  15672. return mng_init_rowproc (pData);
  15673. }
  15674. #endif /* MNG_NO_1_2_4BIT_SUPPORT */
  15675. /* ************************************************************************** */
  15676. mng_retcode mng_init_idx8_ni (mng_datap pData)
  15677. {
  15678. #ifdef MNG_SUPPORT_TRACE
  15679. MNG_TRACE (pData, MNG_FN_INIT_IDX8_NI, MNG_LC_START);
  15680. #endif
  15681. if (pData->fDisplayrow)
  15682. pData->fProcessrow = (mng_fptr)mng_process_idx8;
  15683. if (pData->pStoreobj) /* store in object too ? */
  15684. { /* immediate delta ? */
  15685. #ifndef MNG_NO_DELTA_PNG
  15686. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  15687. pData->fStorerow = (mng_fptr)mng_delta_idx8;
  15688. else
  15689. #endif
  15690. pData->fStorerow = (mng_fptr)mng_store_idx8;
  15691. }
  15692. #ifdef FILTER192 /* leveling & differing ? */
  15693. if (pData->iFilter == MNG_FILTER_DIFFERING)
  15694. pData->fDifferrow = (mng_fptr)mng_differ_idx8;
  15695. #endif
  15696. pData->iPass = -1;
  15697. pData->iRow = 0;
  15698. pData->iRowinc = 1;
  15699. pData->iCol = 0;
  15700. pData->iColinc = 1;
  15701. pData->iRowsamples = pData->iDatawidth;
  15702. pData->iSamplemul = 1;
  15703. pData->iSampleofs = 0;
  15704. pData->iSamplediv = 0;
  15705. pData->iRowsize = pData->iRowsamples;
  15706. pData->iRowmax = pData->iRowsize + pData->iPixelofs;
  15707. pData->iFilterbpp = 1;
  15708. pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */
  15709. #ifdef MNG_SUPPORT_TRACE
  15710. MNG_TRACE (pData, MNG_FN_INIT_IDX8_NI, MNG_LC_END);
  15711. #endif
  15712. return mng_init_rowproc (pData);
  15713. }
  15714. /* ************************************************************************** */
  15715. mng_retcode mng_init_idx8_i (mng_datap pData)
  15716. {
  15717. #ifdef MNG_SUPPORT_TRACE
  15718. MNG_TRACE (pData, MNG_FN_INIT_IDX8_I, MNG_LC_START);
  15719. #endif
  15720. if (pData->fDisplayrow)
  15721. pData->fProcessrow = (mng_fptr)mng_process_idx8;
  15722. if (pData->pStoreobj) /* store in object too ? */
  15723. { /* immediate delta ? */
  15724. #ifndef MNG_NO_DELTA_PNG
  15725. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  15726. pData->fStorerow = (mng_fptr)mng_delta_idx8;
  15727. else
  15728. #endif
  15729. pData->fStorerow = (mng_fptr)mng_store_idx8;
  15730. }
  15731. #ifdef FILTER192 /* leveling & differing ? */
  15732. if (pData->iFilter == MNG_FILTER_DIFFERING)
  15733. pData->fDifferrow = (mng_fptr)mng_differ_idx8;
  15734. #endif
  15735. pData->iPass = 0; /* from 0..6; is 1..7 in specifications */
  15736. pData->iRow = interlace_row [0];
  15737. pData->iRowinc = interlace_rowskip [0];
  15738. pData->iCol = interlace_col [0];
  15739. pData->iColinc = interlace_colskip [0];
  15740. pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0];
  15741. pData->iSamplemul = 1;
  15742. pData->iSampleofs = 0;
  15743. pData->iSamplediv = 0;
  15744. pData->iRowsize = pData->iRowsamples;
  15745. pData->iRowmax = pData->iDatawidth + pData->iPixelofs;
  15746. pData->iFilterbpp = 1;
  15747. pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */
  15748. #ifdef MNG_SUPPORT_TRACE
  15749. MNG_TRACE (pData, MNG_FN_INIT_IDX8_I, MNG_LC_END);
  15750. #endif
  15751. return mng_init_rowproc (pData);
  15752. }
  15753. /* ************************************************************************** */
  15754. mng_retcode mng_init_ga8_ni (mng_datap pData)
  15755. {
  15756. #ifdef MNG_SUPPORT_TRACE
  15757. MNG_TRACE (pData, MNG_FN_INIT_GA8_NI, MNG_LC_START);
  15758. #endif
  15759. if (pData->fDisplayrow)
  15760. pData->fProcessrow = (mng_fptr)mng_process_ga8;
  15761. if (pData->pStoreobj) /* store in object too ? */
  15762. { /* immediate delta ? */
  15763. #ifndef MNG_NO_DELTA_PNG
  15764. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  15765. pData->fStorerow = (mng_fptr)mng_delta_ga8;
  15766. else
  15767. #endif
  15768. pData->fStorerow = (mng_fptr)mng_store_ga8;
  15769. }
  15770. #ifdef FILTER192 /* leveling & differing ? */
  15771. if (pData->iFilter == MNG_FILTER_DIFFERING)
  15772. pData->fDifferrow = (mng_fptr)mng_differ_ga8;
  15773. #endif
  15774. pData->iPass = -1;
  15775. pData->iRow = 0;
  15776. pData->iRowinc = 1;
  15777. pData->iCol = 0;
  15778. pData->iColinc = 1;
  15779. pData->iRowsamples = pData->iDatawidth;
  15780. pData->iSamplemul = 2;
  15781. pData->iSampleofs = 0;
  15782. pData->iSamplediv = 0;
  15783. pData->iRowsize = pData->iRowsamples << 1;
  15784. pData->iRowmax = pData->iRowsize + pData->iPixelofs;
  15785. pData->iFilterbpp = 2;
  15786. pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */
  15787. #ifdef MNG_SUPPORT_TRACE
  15788. MNG_TRACE (pData, MNG_FN_INIT_GA8_NI, MNG_LC_END);
  15789. #endif
  15790. return mng_init_rowproc (pData);
  15791. }
  15792. /* ************************************************************************** */
  15793. mng_retcode mng_init_ga8_i (mng_datap pData)
  15794. {
  15795. #ifdef MNG_SUPPORT_TRACE
  15796. MNG_TRACE (pData, MNG_FN_INIT_GA8_I, MNG_LC_START);
  15797. #endif
  15798. if (pData->fDisplayrow)
  15799. pData->fProcessrow = (mng_fptr)mng_process_ga8;
  15800. if (pData->pStoreobj) /* store in object too ? */
  15801. { /* immediate delta ? */
  15802. #ifndef MNG_NO_DELTA_PNG
  15803. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  15804. pData->fStorerow = (mng_fptr)mng_delta_ga8;
  15805. else
  15806. #endif
  15807. pData->fStorerow = (mng_fptr)mng_store_ga8;
  15808. }
  15809. #ifdef FILTER192 /* leveling & differing ? */
  15810. if (pData->iFilter == MNG_FILTER_DIFFERING)
  15811. pData->fDifferrow = (mng_fptr)mng_differ_ga8;
  15812. #endif
  15813. pData->iPass = 0; /* from 0..6; is 1..7 in specifications */
  15814. pData->iRow = interlace_row [0];
  15815. pData->iRowinc = interlace_rowskip [0];
  15816. pData->iCol = interlace_col [0];
  15817. pData->iColinc = interlace_colskip [0];
  15818. pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0];
  15819. pData->iSamplemul = 2;
  15820. pData->iSampleofs = 0;
  15821. pData->iSamplediv = 0;
  15822. pData->iRowsize = pData->iRowsamples << 1;
  15823. pData->iRowmax = (pData->iDatawidth << 1) + pData->iPixelofs;
  15824. pData->iFilterbpp = 2;
  15825. pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */
  15826. #ifdef MNG_SUPPORT_TRACE
  15827. MNG_TRACE (pData, MNG_FN_INIT_GA8_I, MNG_LC_END);
  15828. #endif
  15829. return mng_init_rowproc (pData);
  15830. }
  15831. /* ************************************************************************** */
  15832. #ifndef MNG_NO_16BIT_SUPPORT
  15833. mng_retcode mng_init_ga16_ni (mng_datap pData)
  15834. {
  15835. #ifdef MNG_SUPPORT_TRACE
  15836. MNG_TRACE (pData, MNG_FN_INIT_GA16_NI, MNG_LC_START);
  15837. #endif
  15838. if (pData->fDisplayrow)
  15839. pData->fProcessrow = (mng_fptr)mng_process_ga16;
  15840. if (pData->pStoreobj) /* store in object too ? */
  15841. { /* immediate delta ? */
  15842. #ifndef MNG_NO_DELTA_PNG
  15843. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  15844. pData->fStorerow = (mng_fptr)mng_delta_ga16;
  15845. else
  15846. #endif
  15847. pData->fStorerow = (mng_fptr)mng_store_ga16;
  15848. }
  15849. #ifdef FILTER192 /* leveling & differing ? */
  15850. if (pData->iFilter == MNG_FILTER_DIFFERING)
  15851. pData->fDifferrow = (mng_fptr)mng_differ_ga16;
  15852. #endif
  15853. pData->iPass = -1;
  15854. pData->iRow = 0;
  15855. pData->iRowinc = 1;
  15856. pData->iCol = 0;
  15857. pData->iColinc = 1;
  15858. pData->iRowsamples = pData->iDatawidth;
  15859. pData->iSamplemul = 4;
  15860. pData->iSampleofs = 0;
  15861. pData->iSamplediv = 0;
  15862. pData->iRowsize = pData->iRowsamples << 2;
  15863. pData->iRowmax = pData->iRowsize + pData->iPixelofs;
  15864. pData->iFilterbpp = 4;
  15865. pData->bIsRGBA16 = MNG_TRUE; /* intermediate row is 16-bit deep */
  15866. #ifdef MNG_SUPPORT_TRACE
  15867. MNG_TRACE (pData, MNG_FN_INIT_GA16_NI, MNG_LC_END);
  15868. #endif
  15869. return mng_init_rowproc (pData);
  15870. }
  15871. #endif
  15872. /* ************************************************************************** */
  15873. #ifndef MNG_NO_16BIT_SUPPORT
  15874. mng_retcode mng_init_ga16_i (mng_datap pData)
  15875. {
  15876. #ifdef MNG_SUPPORT_TRACE
  15877. MNG_TRACE (pData, MNG_FN_INIT_GA16_I, MNG_LC_START);
  15878. #endif
  15879. if (pData->fDisplayrow)
  15880. pData->fProcessrow = (mng_fptr)mng_process_ga16;
  15881. if (pData->pStoreobj) /* store in object too ? */
  15882. { /* immediate delta ? */
  15883. #ifndef MNG_NO_DELTA_PNG
  15884. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  15885. pData->fStorerow = (mng_fptr)mng_delta_ga16;
  15886. else
  15887. #endif
  15888. pData->fStorerow = (mng_fptr)mng_store_ga16;
  15889. }
  15890. #ifdef FILTER192 /* leveling & differing ? */
  15891. if (pData->iFilter == MNG_FILTER_DIFFERING)
  15892. pData->fDifferrow = (mng_fptr)mng_differ_ga16;
  15893. #endif
  15894. pData->iPass = 0; /* from 0..6; is 1..7 in specifications */
  15895. pData->iRow = interlace_row [0];
  15896. pData->iRowinc = interlace_rowskip [0];
  15897. pData->iCol = interlace_col [0];
  15898. pData->iColinc = interlace_colskip [0];
  15899. pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0];
  15900. pData->iSamplemul = 4;
  15901. pData->iSampleofs = 0;
  15902. pData->iSamplediv = 0;
  15903. pData->iRowsize = pData->iRowsamples << 2;
  15904. pData->iRowmax = (pData->iDatawidth << 2) + pData->iPixelofs;
  15905. pData->iFilterbpp = 4;
  15906. pData->bIsRGBA16 = MNG_TRUE; /* intermediate row is 16-bit deep */
  15907. #ifdef MNG_SUPPORT_TRACE
  15908. MNG_TRACE (pData, MNG_FN_INIT_GA16_I, MNG_LC_END);
  15909. #endif
  15910. return mng_init_rowproc (pData);
  15911. }
  15912. #endif
  15913. /* ************************************************************************** */
  15914. mng_retcode mng_init_rgba8_ni (mng_datap pData)
  15915. {
  15916. #ifdef MNG_SUPPORT_TRACE
  15917. MNG_TRACE (pData, MNG_FN_INIT_RGBA8_NI, MNG_LC_START);
  15918. #endif
  15919. if (pData->fDisplayrow)
  15920. pData->fProcessrow = (mng_fptr)mng_process_rgba8;
  15921. if (pData->pStoreobj) /* store in object too ? */
  15922. { /* immediate delta ? */
  15923. #ifndef MNG_NO_DELTA_PNG
  15924. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  15925. pData->fStorerow = (mng_fptr)mng_delta_rgba8;
  15926. else
  15927. #endif
  15928. pData->fStorerow = (mng_fptr)mng_store_rgba8;
  15929. }
  15930. #ifdef FILTER192 /* leveling & differing ? */
  15931. if (pData->iFilter == MNG_FILTER_DIFFERING)
  15932. pData->fDifferrow = (mng_fptr)mng_differ_rgba8;
  15933. #endif
  15934. pData->iPass = -1;
  15935. pData->iRow = 0;
  15936. pData->iRowinc = 1;
  15937. pData->iCol = 0;
  15938. pData->iColinc = 1;
  15939. pData->iRowsamples = pData->iDatawidth;
  15940. pData->iSamplemul = 4;
  15941. pData->iSampleofs = 0;
  15942. pData->iSamplediv = 0;
  15943. pData->iRowsize = pData->iRowsamples << 2;
  15944. pData->iRowmax = pData->iRowsize + pData->iPixelofs;
  15945. pData->iFilterbpp = 4;
  15946. pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */
  15947. #ifdef MNG_SUPPORT_TRACE
  15948. MNG_TRACE (pData, MNG_FN_INIT_RGBA8_NI, MNG_LC_END);
  15949. #endif
  15950. return mng_init_rowproc (pData);
  15951. }
  15952. /* ************************************************************************** */
  15953. mng_retcode mng_init_rgba8_i (mng_datap pData)
  15954. {
  15955. #ifdef MNG_SUPPORT_TRACE
  15956. MNG_TRACE (pData, MNG_FN_INIT_RGBA8_I, MNG_LC_START);
  15957. #endif
  15958. if (pData->fDisplayrow)
  15959. pData->fProcessrow = (mng_fptr)mng_process_rgba8;
  15960. if (pData->pStoreobj) /* store in object too ? */
  15961. { /* immediate delta ? */
  15962. #ifndef MNG_NO_DELTA_PNG
  15963. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  15964. pData->fStorerow = (mng_fptr)mng_delta_rgba8;
  15965. else
  15966. #endif
  15967. pData->fStorerow = (mng_fptr)mng_store_rgba8;
  15968. }
  15969. #ifdef FILTER192 /* leveling & differing ? */
  15970. if (pData->iFilter == MNG_FILTER_DIFFERING)
  15971. pData->fDifferrow = (mng_fptr)mng_differ_rgba8;
  15972. #endif
  15973. pData->iPass = 0; /* from 0..6; is 1..7 in specifications */
  15974. pData->iRow = interlace_row [0];
  15975. pData->iRowinc = interlace_rowskip [0];
  15976. pData->iCol = interlace_col [0];
  15977. pData->iColinc = interlace_colskip [0];
  15978. pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0];
  15979. pData->iSamplemul = 4;
  15980. pData->iSampleofs = 0;
  15981. pData->iSamplediv = 0;
  15982. pData->iRowsize = pData->iRowsamples << 2;
  15983. pData->iRowmax = (pData->iDatawidth << 2) + pData->iPixelofs;
  15984. pData->iFilterbpp = 4;
  15985. pData->bIsRGBA16 = MNG_FALSE; /* intermediate row is 8-bit deep */
  15986. #ifdef MNG_SUPPORT_TRACE
  15987. MNG_TRACE (pData, MNG_FN_INIT_RGBA8_I, MNG_LC_END);
  15988. #endif
  15989. return mng_init_rowproc (pData);
  15990. }
  15991. /* ************************************************************************** */
  15992. #ifndef MNG_NO_16BIT_SUPPORT
  15993. mng_retcode mng_init_rgba16_ni (mng_datap pData)
  15994. {
  15995. #ifdef MNG_SUPPORT_TRACE
  15996. MNG_TRACE (pData, MNG_FN_INIT_RGBA16_NI, MNG_LC_START);
  15997. #endif
  15998. if (pData->fDisplayrow)
  15999. pData->fProcessrow = (mng_fptr)mng_process_rgba16;
  16000. if (pData->pStoreobj) /* store in object too ? */
  16001. { /* immediate delta ? */
  16002. #ifndef MNG_NO_DELTA_PNG
  16003. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  16004. pData->fStorerow = (mng_fptr)mng_delta_rgba16;
  16005. else
  16006. #endif
  16007. pData->fStorerow = (mng_fptr)mng_store_rgba16;
  16008. }
  16009. #ifdef FILTER192 /* leveling & differing ? */
  16010. if (pData->iFilter == MNG_FILTER_DIFFERING)
  16011. pData->fDifferrow = (mng_fptr)mng_differ_rgba16;
  16012. #endif
  16013. pData->iPass = -1;
  16014. pData->iRow = 0;
  16015. pData->iRowinc = 1;
  16016. pData->iCol = 0;
  16017. pData->iColinc = 1;
  16018. pData->iRowsamples = pData->iDatawidth;
  16019. pData->iSamplemul = 8;
  16020. pData->iSampleofs = 0;
  16021. pData->iSamplediv = 0;
  16022. pData->iRowsize = pData->iRowsamples << 3;
  16023. pData->iRowmax = pData->iRowsize + pData->iPixelofs;
  16024. pData->iFilterbpp = 8;
  16025. pData->bIsRGBA16 = MNG_TRUE; /* intermediate row is 16-bit deep */
  16026. #ifdef MNG_SUPPORT_TRACE
  16027. MNG_TRACE (pData, MNG_FN_INIT_RGBA16_NI, MNG_LC_END);
  16028. #endif
  16029. return mng_init_rowproc (pData);
  16030. }
  16031. #endif
  16032. /* ************************************************************************** */
  16033. #ifndef MNG_NO_16BIT_SUPPORT
  16034. mng_retcode mng_init_rgba16_i (mng_datap pData)
  16035. {
  16036. #ifdef MNG_SUPPORT_TRACE
  16037. MNG_TRACE (pData, MNG_FN_INIT_RGBA16_I, MNG_LC_START);
  16038. #endif
  16039. if (pData->fDisplayrow)
  16040. pData->fProcessrow = (mng_fptr)mng_process_rgba16;
  16041. if (pData->pStoreobj) /* store in object too ? */
  16042. { /* immediate delta ? */
  16043. #ifndef MNG_NO_DELTA_PNG
  16044. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  16045. pData->fStorerow = (mng_fptr)mng_delta_rgba16;
  16046. else
  16047. #endif
  16048. pData->fStorerow = (mng_fptr)mng_store_rgba16;
  16049. }
  16050. #ifdef FILTER192 /* leveling & differing ? */
  16051. if (pData->iFilter == MNG_FILTER_DIFFERING)
  16052. pData->fDifferrow = (mng_fptr)mng_differ_rgba16;
  16053. #endif
  16054. pData->iPass = 0; /* from 0..6; (1..7 in specification) */
  16055. pData->iRow = interlace_row [0];
  16056. pData->iRowinc = interlace_rowskip [0];
  16057. pData->iCol = interlace_col [0];
  16058. pData->iColinc = interlace_colskip [0];
  16059. pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >> interlace_divider [0];
  16060. pData->iSamplemul = 8;
  16061. pData->iSampleofs = 0;
  16062. pData->iSamplediv = 0;
  16063. pData->iRowsize = pData->iRowsamples << 3;
  16064. pData->iRowmax = (pData->iDatawidth << 3) + pData->iPixelofs;
  16065. pData->iFilterbpp = 8;
  16066. pData->bIsRGBA16 = MNG_TRUE; /* intermediate row is 16-bit deep */
  16067. #ifdef MNG_SUPPORT_TRACE
  16068. MNG_TRACE (pData, MNG_FN_INIT_RGBA16_I, MNG_LC_END);
  16069. #endif
  16070. return mng_init_rowproc (pData);
  16071. }
  16072. #endif
  16073. /* ************************************************************************** */
  16074. /* * * */
  16075. /* * Row processing initialization routines (JPEG) - set up the variables * */
  16076. /* * needed to process uncompressed row-data * */
  16077. /* * * */
  16078. /* ************************************************************************** */
  16079. #ifdef MNG_INCLUDE_JNG
  16080. /* ************************************************************************** */
  16081. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  16082. mng_retcode mng_init_jpeg_a1_ni (mng_datap pData)
  16083. {
  16084. #ifdef MNG_SUPPORT_TRACE
  16085. MNG_TRACE (pData, MNG_FN_INIT_JPEG_A1_NI, MNG_LC_START);
  16086. #endif
  16087. if (pData->pStoreobj) /* store in object too ? */
  16088. {
  16089. if (pData->iJHDRimgbitdepth == 8)
  16090. {
  16091. switch (pData->iJHDRcolortype)
  16092. {
  16093. case 12 : { pData->fStorerow = (mng_fptr)mng_store_jpeg_g8_a1; break; }
  16094. case 14 : { pData->fStorerow = (mng_fptr)mng_store_jpeg_rgb8_a1; break; }
  16095. }
  16096. }
  16097. /* TODO: bitdepth 12 & 20 */
  16098. }
  16099. #ifdef FILTER192 /* leveling & differing ? */
  16100. if (pData->iFilter == MNG_FILTER_DIFFERING)
  16101. pData->fDifferrow = (mng_fptr)mng_differ_g1;
  16102. #endif
  16103. pData->iPass = -1;
  16104. pData->iRow = 0;
  16105. pData->iRowinc = 1;
  16106. pData->iCol = 0;
  16107. pData->iColinc = 1;
  16108. pData->iRowsamples = pData->iDatawidth;
  16109. pData->iSamplemul = 1;
  16110. pData->iSampleofs = 7;
  16111. pData->iSamplediv = 3;
  16112. pData->iRowsize = (pData->iRowsamples + 7) >> 3;
  16113. pData->iRowmax = pData->iRowsize + pData->iPixelofs;
  16114. pData->iFilterbpp = 1;
  16115. #ifdef MNG_SUPPORT_TRACE
  16116. MNG_TRACE (pData, MNG_FN_INIT_JPEG_A1_NI, MNG_LC_END);
  16117. #endif
  16118. return mng_init_rowproc (pData);
  16119. }
  16120. /* ************************************************************************** */
  16121. mng_retcode mng_init_jpeg_a2_ni (mng_datap pData)
  16122. {
  16123. #ifdef MNG_SUPPORT_TRACE
  16124. MNG_TRACE (pData, MNG_FN_INIT_JPEG_A2_NI, MNG_LC_START);
  16125. #endif
  16126. if (pData->pStoreobj) /* store in object too ? */
  16127. {
  16128. if (pData->iJHDRimgbitdepth == 8)
  16129. {
  16130. switch (pData->iJHDRcolortype)
  16131. {
  16132. case 12 : { pData->fStorerow = (mng_fptr)mng_store_jpeg_g8_a2; break; }
  16133. case 14 : { pData->fStorerow = (mng_fptr)mng_store_jpeg_rgb8_a2; break; }
  16134. }
  16135. }
  16136. /* TODO: bitdepth 12 & 20 */
  16137. }
  16138. #ifdef FILTER192 /* leveling & differing ? */
  16139. if (pData->iFilter == MNG_FILTER_DIFFERING)
  16140. pData->fDifferrow = (mng_fptr)mng_differ_g2;
  16141. #endif
  16142. pData->iPass = -1;
  16143. pData->iRow = 0;
  16144. pData->iRowinc = 1;
  16145. pData->iCol = 0;
  16146. pData->iColinc = 1;
  16147. pData->iRowsamples = pData->iDatawidth;
  16148. pData->iSamplemul = 1;
  16149. pData->iSampleofs = 3;
  16150. pData->iSamplediv = 2;
  16151. pData->iRowsize = (pData->iRowsamples + 3) >> 2;
  16152. pData->iRowmax = pData->iRowsize + pData->iPixelofs;
  16153. pData->iFilterbpp = 1;
  16154. #ifdef MNG_SUPPORT_TRACE
  16155. MNG_TRACE (pData, MNG_FN_INIT_JPEG_A2_NI, MNG_LC_END);
  16156. #endif
  16157. return mng_init_rowproc (pData);
  16158. }
  16159. /* ************************************************************************** */
  16160. mng_retcode mng_init_jpeg_a4_ni (mng_datap pData)
  16161. {
  16162. #ifdef MNG_SUPPORT_TRACE
  16163. MNG_TRACE (pData, MNG_FN_INIT_JPEG_A4_NI, MNG_LC_START);
  16164. #endif
  16165. if (pData->pStoreobj) /* store in object too ? */
  16166. {
  16167. if (pData->iJHDRimgbitdepth == 8)
  16168. {
  16169. switch (pData->iJHDRcolortype)
  16170. {
  16171. case 12 : { pData->fStorerow = (mng_fptr)mng_store_jpeg_g8_a4; break; }
  16172. case 14 : { pData->fStorerow = (mng_fptr)mng_store_jpeg_rgb8_a4; break; }
  16173. }
  16174. }
  16175. /* TODO: bitdepth 12 & 20 */
  16176. }
  16177. #ifdef FILTER192 /* leveling & differing ? */
  16178. if (pData->iFilter == MNG_FILTER_DIFFERING)
  16179. pData->fDifferrow = (mng_fptr)mng_differ_g4;
  16180. #endif
  16181. pData->iPass = -1;
  16182. pData->iRow = 0;
  16183. pData->iRowinc = 1;
  16184. pData->iCol = 0;
  16185. pData->iColinc = 1;
  16186. pData->iRowsamples = pData->iDatawidth;
  16187. pData->iSamplemul = 1;
  16188. pData->iSampleofs = 1;
  16189. pData->iSamplediv = 1;
  16190. pData->iRowsize = (pData->iRowsamples + 1) >> 1;
  16191. pData->iRowmax = pData->iRowsize + pData->iPixelofs;
  16192. pData->iFilterbpp = 1;
  16193. #ifdef MNG_SUPPORT_TRACE
  16194. MNG_TRACE (pData, MNG_FN_INIT_JPEG_A4_NI, MNG_LC_END);
  16195. #endif
  16196. return mng_init_rowproc (pData);
  16197. }
  16198. #endif /* MNG_NO_1_2_4BIT_SUPPORT */
  16199. /* ************************************************************************** */
  16200. mng_retcode mng_init_jpeg_a8_ni (mng_datap pData)
  16201. {
  16202. #ifdef MNG_SUPPORT_TRACE
  16203. MNG_TRACE (pData, MNG_FN_INIT_JPEG_A8_NI, MNG_LC_START);
  16204. #endif
  16205. if (pData->pStoreobj) /* store in object too ? */
  16206. {
  16207. if (pData->iJHDRimgbitdepth == 8)
  16208. {
  16209. switch (pData->iJHDRcolortype)
  16210. {
  16211. case 12 : { pData->fStorerow = (mng_fptr)mng_store_jpeg_g8_a8; break; }
  16212. case 14 : { pData->fStorerow = (mng_fptr)mng_store_jpeg_rgb8_a8; break; }
  16213. }
  16214. }
  16215. /* TODO: bitdepth 12 & 20 */
  16216. }
  16217. #ifdef FILTER192 /* leveling & differing ? */
  16218. if (pData->iFilter == MNG_FILTER_DIFFERING)
  16219. pData->fDifferrow = (mng_fptr)mng_differ_g8;
  16220. #endif
  16221. pData->iPass = -1;
  16222. pData->iRow = 0;
  16223. pData->iRowinc = 1;
  16224. pData->iCol = 0;
  16225. pData->iColinc = 1;
  16226. pData->iRowsamples = pData->iDatawidth;
  16227. pData->iSamplemul = 1;
  16228. pData->iSampleofs = 0;
  16229. pData->iSamplediv = 0;
  16230. pData->iRowsize = pData->iRowsamples;
  16231. pData->iRowmax = pData->iRowsize + pData->iPixelofs;
  16232. pData->iFilterbpp = 1;
  16233. #ifdef MNG_SUPPORT_TRACE
  16234. MNG_TRACE (pData, MNG_FN_INIT_JPEG_A8_NI, MNG_LC_END);
  16235. #endif
  16236. return mng_init_rowproc (pData);
  16237. }
  16238. /* ************************************************************************** */
  16239. #ifndef MNG_NO_16BIT_SUPPORT
  16240. mng_retcode mng_init_jpeg_a16_ni (mng_datap pData)
  16241. {
  16242. #ifdef MNG_SUPPORT_TRACE
  16243. MNG_TRACE (pData, MNG_FN_INIT_JPEG_A16_NI, MNG_LC_START);
  16244. #endif
  16245. if (pData->pStoreobj) /* store in object too ? */
  16246. {
  16247. if (pData->iJHDRimgbitdepth == 8)
  16248. {
  16249. switch (pData->iJHDRcolortype)
  16250. {
  16251. case 12 : { pData->fStorerow = (mng_fptr)mng_store_jpeg_g8_a16; break; }
  16252. case 14 : { pData->fStorerow = (mng_fptr)mng_store_jpeg_rgb8_a16; break; }
  16253. }
  16254. }
  16255. /* TODO: bitdepth 12 & 20 */
  16256. }
  16257. #ifdef FILTER192 /* leveling & differing ? */
  16258. if (pData->iFilter == MNG_FILTER_DIFFERING)
  16259. pData->fDifferrow = (mng_fptr)mng_differ_g16;
  16260. #endif
  16261. pData->iPass = -1;
  16262. pData->iRow = 0;
  16263. pData->iRowinc = 1;
  16264. pData->iCol = 0;
  16265. pData->iColinc = 1;
  16266. pData->iRowsamples = pData->iDatawidth;
  16267. pData->iSamplemul = 2;
  16268. pData->iSampleofs = 0;
  16269. pData->iSamplediv = 0;
  16270. pData->iRowsize = pData->iRowsamples << 1;
  16271. pData->iRowmax = pData->iRowsize + pData->iPixelofs;
  16272. pData->iFilterbpp = 2;
  16273. #ifdef MNG_SUPPORT_TRACE
  16274. MNG_TRACE (pData, MNG_FN_INIT_JPEG_A16_NI, MNG_LC_END);
  16275. #endif
  16276. return mng_init_rowproc (pData);
  16277. }
  16278. #endif
  16279. /* ************************************************************************** */
  16280. #endif /* MNG_INCLUDE_JNG */
  16281. #endif /* MNG_OPTIMIZE_FOOTPRINT_INIT */
  16282. /* ************************************************************************** */
  16283. /* * * */
  16284. /* * Generic row processing initialization & cleanup routines * */
  16285. /* * - initialize the buffers used by the row processing routines * */
  16286. /* * - cleanup the buffers used by the row processing routines * */
  16287. /* * * */
  16288. /* ************************************************************************** */
  16289. mng_retcode mng_init_rowproc (mng_datap pData)
  16290. {
  16291. #ifdef MNG_SUPPORT_TRACE
  16292. MNG_TRACE (pData, MNG_FN_INIT_ROWPROC, MNG_LC_START);
  16293. #endif
  16294. #ifdef MNG_OPTIMIZE_FOOTPRINT_INIT
  16295. if (pData->ePng_imgtype != png_none)
  16296. {
  16297. if (pData->fDisplayrow)
  16298. switch (pData->ePng_imgtype)
  16299. {
  16300. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  16301. case png_g1:
  16302. pData->fProcessrow = (mng_fptr)mng_process_g1;
  16303. break;
  16304. case png_g2:
  16305. pData->fProcessrow = (mng_fptr)mng_process_g2;
  16306. break;
  16307. case png_g4:
  16308. pData->fProcessrow = (mng_fptr)mng_process_g4;
  16309. break;
  16310. #endif /* MNG_NO_1_2_4BIT_SUPPORT */
  16311. case png_g8:
  16312. pData->fProcessrow = (mng_fptr)mng_process_g8;
  16313. break;
  16314. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  16315. case png_idx1:
  16316. pData->fProcessrow = (mng_fptr)mng_process_idx1;
  16317. break;
  16318. case png_idx2:
  16319. pData->fProcessrow = (mng_fptr)mng_process_idx2;
  16320. break;
  16321. case png_idx4:
  16322. pData->fProcessrow = (mng_fptr)mng_process_idx4;
  16323. break;
  16324. #endif /* MNG_NO_1_2_4BIT_SUPPORT */
  16325. case png_idx8:
  16326. pData->fProcessrow = (mng_fptr)mng_process_idx8;
  16327. break;
  16328. case png_ga8:
  16329. pData->fProcessrow = (mng_fptr)mng_process_ga8;
  16330. break;
  16331. case png_rgb8:
  16332. pData->fProcessrow = (mng_fptr)mng_process_rgb8;
  16333. break;
  16334. case png_rgba8:
  16335. pData->fProcessrow = (mng_fptr)mng_process_rgba8;
  16336. break;
  16337. #ifndef MNG_NO_16BIT_SUPPORT
  16338. case png_g16:
  16339. pData->fProcessrow = (mng_fptr)mng_process_g16;
  16340. break;
  16341. case png_ga16:
  16342. pData->fProcessrow = (mng_fptr)mng_process_ga16;
  16343. break;
  16344. case png_rgb16:
  16345. pData->fProcessrow = (mng_fptr)mng_process_rgb16;
  16346. break;
  16347. case png_rgba16:
  16348. pData->fProcessrow = (mng_fptr)mng_process_rgba16;
  16349. break;
  16350. #endif
  16351. default:
  16352. break;
  16353. }
  16354. if (pData->pStoreobj) /* store in object too ? */
  16355. {
  16356. #ifndef MNG_NO_DELTA_PNG
  16357. if ((pData->bHasDHDR) && (pData->bDeltaimmediate))
  16358. switch (pData->ePng_imgtype)
  16359. {
  16360. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  16361. case png_g1:
  16362. pData->fStorerow = (mng_fptr)mng_delta_g1;
  16363. break;
  16364. case png_g2:
  16365. pData->fStorerow = (mng_fptr)mng_delta_g2;
  16366. break;
  16367. case png_g4:
  16368. pData->fStorerow = (mng_fptr)mng_delta_g4;
  16369. break;
  16370. #endif /* MNG_NO_1_2_4BIT_SUPPORT */
  16371. case png_g8:
  16372. pData->fStorerow = (mng_fptr)mng_delta_g8;
  16373. break;
  16374. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  16375. case png_idx1:
  16376. pData->fStorerow = (mng_fptr)mng_delta_idx1;
  16377. break;
  16378. case png_idx2:
  16379. pData->fStorerow = (mng_fptr)mng_delta_idx2;
  16380. break;
  16381. case png_idx4:
  16382. pData->fStorerow = (mng_fptr)mng_delta_idx4;
  16383. break;
  16384. #endif /* MNG_NO_1_2_4BIT_SUPPORT */
  16385. case png_idx8:
  16386. pData->fStorerow = (mng_fptr)mng_delta_idx8;
  16387. break;
  16388. case png_ga8:
  16389. pData->fStorerow = (mng_fptr)mng_delta_ga8;
  16390. break;
  16391. case png_rgb8:
  16392. pData->fStorerow = (mng_fptr)mng_delta_rgb8;
  16393. break;
  16394. case png_rgba8:
  16395. pData->fStorerow = (mng_fptr)mng_delta_rgba8;
  16396. break;
  16397. #ifndef MNG_NO_16BIT_SUPPORT
  16398. case png_g16:
  16399. pData->fStorerow = (mng_fptr)mng_delta_g16;
  16400. break;
  16401. case png_ga16:
  16402. pData->fStorerow = (mng_fptr)mng_delta_ga16;
  16403. break;
  16404. case png_rgb16:
  16405. pData->fStorerow = (mng_fptr)mng_delta_rgb16;
  16406. break;
  16407. case png_rgba16:
  16408. pData->fStorerow = (mng_fptr)mng_delta_rgba16;
  16409. break;
  16410. #endif
  16411. default:
  16412. break;
  16413. }
  16414. else
  16415. #endif /* MNG_NO_DELTA_PNG */
  16416. switch (pData->ePng_imgtype)
  16417. {
  16418. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  16419. case png_g1:
  16420. pData->fStorerow = (mng_fptr)mng_store_g1;
  16421. break;
  16422. case png_g2:
  16423. pData->fStorerow = (mng_fptr)mng_store_g2;
  16424. break;
  16425. case png_g4:
  16426. pData->fStorerow = (mng_fptr)mng_store_g4;
  16427. break;
  16428. #endif /* MNG_NO_1_2_4BIT_SUPPORT */
  16429. case png_g8:
  16430. pData->fStorerow = (mng_fptr)mng_store_g8;
  16431. break;
  16432. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  16433. case png_idx1:
  16434. pData->fStorerow = (mng_fptr)mng_store_idx1;
  16435. break;
  16436. case png_idx2:
  16437. pData->fStorerow = (mng_fptr)mng_store_idx2;
  16438. break;
  16439. case png_idx4:
  16440. pData->fStorerow = (mng_fptr)mng_store_idx4;
  16441. break;
  16442. #endif /* MNG_NO_1_2_4BIT_SUPPORT */
  16443. case png_idx8:
  16444. pData->fStorerow = (mng_fptr)mng_store_idx8;
  16445. break;
  16446. case png_ga8:
  16447. pData->fStorerow = (mng_fptr)mng_store_ga8;
  16448. break;
  16449. case png_rgb8:
  16450. pData->fStorerow = (mng_fptr)mng_store_rgb8;
  16451. break;
  16452. case png_rgba8:
  16453. pData->fStorerow = (mng_fptr)mng_store_rgba8;
  16454. break;
  16455. #ifndef MNG_NO_16BIT_SUPPORT
  16456. case png_g16:
  16457. pData->fStorerow = (mng_fptr)mng_store_g16;
  16458. break;
  16459. case png_ga16:
  16460. pData->fStorerow = (mng_fptr)mng_store_ga16;
  16461. break;
  16462. case png_rgb16:
  16463. pData->fStorerow = (mng_fptr)mng_store_rgb16;
  16464. break;
  16465. case png_rgba16:
  16466. pData->fStorerow = (mng_fptr)mng_store_rgba16;
  16467. break;
  16468. #endif
  16469. #ifdef MNG_INCLUDE_JNG
  16470. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  16471. case png_jpeg_a1:
  16472. /* if (pData->iJHDRimgbitdepth == 8) */
  16473. {
  16474. switch (pData->iJHDRcolortype)
  16475. {
  16476. case 12 :
  16477. { pData->fStorerow = (mng_fptr)mng_store_jpeg_g8_a1; break; }
  16478. case 14 :
  16479. { pData->fStorerow = (mng_fptr)mng_store_jpeg_rgb8_a1; break; }
  16480. }
  16481. }
  16482. /* TODO: bitdepth 12 & 20 */
  16483. break;
  16484. case png_jpeg_a2:
  16485. /* if (pData->iJHDRimgbitdepth == 8) */
  16486. {
  16487. switch (pData->iJHDRcolortype)
  16488. {
  16489. case 12 :
  16490. { pData->fStorerow = (mng_fptr)mng_store_jpeg_g8_a2; break; }
  16491. case 14 :
  16492. { pData->fStorerow = (mng_fptr)mng_store_jpeg_rgb8_a2; break; }
  16493. }
  16494. }
  16495. break;
  16496. /* TODO: bitdepth 12 & 20 */
  16497. case png_jpeg_a4:
  16498. /* if (pData->iJHDRimgbitdepth == 8) */
  16499. {
  16500. switch (pData->iJHDRcolortype)
  16501. {
  16502. case 12 :
  16503. { pData->fStorerow = (mng_fptr)mng_store_jpeg_g8_a4; break; }
  16504. case 14 :
  16505. { pData->fStorerow = (mng_fptr)mng_store_jpeg_rgb8_a4; break; }
  16506. }
  16507. }
  16508. break;
  16509. #endif /* MNG_NO_1_2_4BIT_SUPPORT */
  16510. /* TODO: bitdepth 12 & 20 */
  16511. case png_jpeg_a8:
  16512. /* if (pData->iJHDRimgbitdepth == 8) */
  16513. {
  16514. switch (pData->iJHDRcolortype)
  16515. {
  16516. case 12 :
  16517. { pData->fStorerow = (mng_fptr)mng_store_jpeg_g8_a8; break; }
  16518. case 14 :
  16519. { pData->fStorerow = (mng_fptr)mng_store_jpeg_rgb8_a8; break; }
  16520. }
  16521. }
  16522. break;
  16523. /* TODO: bitdepth 12 & 20 */
  16524. #ifndef MNG_NO_16BIT_SUPPORT
  16525. case png_jpeg_a16:
  16526. /* if (pData->iJHDRimgbitdepth == 8) */
  16527. {
  16528. switch (pData->iJHDRcolortype)
  16529. {
  16530. case 12 :
  16531. { pData->fStorerow = (mng_fptr)mng_store_jpeg_g8_a16; break; }
  16532. case 14 :
  16533. { pData->fStorerow = (mng_fptr)mng_store_jpeg_rgb8_a16; break; }
  16534. }
  16535. }
  16536. break;
  16537. /* TODO: bitdepth 12 & 20 */
  16538. #endif
  16539. #endif /* MNG_INCLUDE_JNG */
  16540. default:
  16541. break;
  16542. }
  16543. }
  16544. #ifdef FILTER192 /* leveling & differing ? */
  16545. if (pData->iFilter == MNG_FILTER_DIFFERING)
  16546. switch (pData->ePng_imgtype)
  16547. {
  16548. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  16549. case png_g1:
  16550. #ifdef MNG_INCLUDE_JNG
  16551. case png_jpeg_a1:
  16552. #endif
  16553. pData->fDifferrow = (mng_fptr)mng_differ_g1;
  16554. break;
  16555. case png_g2:
  16556. #ifdef MNG_INCLUDE_JNG
  16557. case png_jpeg_a2:
  16558. #endif
  16559. pData->fDifferrow = (mng_fptr)mng_differ_g2;
  16560. break;
  16561. case png_g4:
  16562. #ifdef MNG_INCLUDE_JNG
  16563. case png_jpeg_a4:
  16564. #endif
  16565. pData->fDifferrow = (mng_fptr)mng_differ_g4;
  16566. break;
  16567. #endif /* MNG_NO_1_2_4BIT_SUPPORT */
  16568. case png_g8:
  16569. #ifdef MNG_INCLUDE_JNG
  16570. case png_jpeg_a8:
  16571. #endif
  16572. pData->fDifferrow = (mng_fptr)mng_differ_g8;
  16573. break;
  16574. case png_rgb8:
  16575. pData->fDifferrow = (mng_fptr)mng_differ_rgb8;
  16576. break;
  16577. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  16578. case png_idx1:
  16579. pData->fDifferrow = (mng_fptr)mng_differ_idx1;
  16580. break;
  16581. case png_idx2:
  16582. pData->fDifferrow = (mng_fptr)mng_differ_idx2;
  16583. break;
  16584. case png_idx4:
  16585. pData->fDifferrow = (mng_fptr)mng_differ_idx4;
  16586. break;
  16587. #endif /* MNG_NO_1_2_4BIT_SUPPORT */
  16588. case png_idx8:
  16589. pData->fDifferrow = (mng_fptr)mng_differ_idx8;
  16590. break;
  16591. case png_ga8:
  16592. pData->fDifferrow = (mng_fptr)mng_differ_ga8;
  16593. break;
  16594. case png_rgb8:
  16595. pData->fDifferrow = (mng_fptr)mng_differ_rgb8;
  16596. break;
  16597. case png_rgba8:
  16598. pData->fDifferrow = (mng_fptr)mng_differ_rgba8;
  16599. break;
  16600. #ifndef MNG_NO_16BIT_SUPPORT
  16601. case png_g16:
  16602. #ifdef MNG_INCLUDE_JNG
  16603. case png_jpeg_a16:
  16604. #endif
  16605. pData->fDifferrow = (mng_fptr)mng_differ_g16;
  16606. break;
  16607. case png_ga16:
  16608. pData->fDifferrow = (mng_fptr)mng_differ_ga16;
  16609. break;
  16610. case png_rgb16:
  16611. pData->fDifferrow = (mng_fptr)mng_differ_rgb16;
  16612. break;
  16613. case png_rgba16:
  16614. pData->fDifferrow = (mng_fptr)mng_differ_rgba16;
  16615. break;
  16616. #endif
  16617. default:
  16618. break;
  16619. }
  16620. #endif
  16621. switch (pData->ePng_imgtype)
  16622. {
  16623. #ifndef MNG_NO_1_2_4BIT_SUPPORT
  16624. case png_g1:
  16625. case png_idx1:
  16626. #ifdef MNG_INCLUDE_JNG
  16627. case png_jpeg_a1:
  16628. #endif
  16629. pData->iSamplemul = 1;
  16630. pData->iSampleofs = 7;
  16631. pData->iSamplediv = 3;
  16632. pData->iFilterbpp = 1;
  16633. break;
  16634. case png_g2:
  16635. case png_idx2:
  16636. #ifdef MNG_INCLUDE_JNG
  16637. case png_jpeg_a2:
  16638. #endif
  16639. pData->iSamplemul = 1;
  16640. pData->iSampleofs = 3;
  16641. pData->iSamplediv = 2;
  16642. pData->iFilterbpp = 1;
  16643. break;
  16644. case png_g4:
  16645. case png_idx4:
  16646. #ifdef MNG_INCLUDE_JNG
  16647. case png_jpeg_a4:
  16648. #endif
  16649. pData->iSamplemul = 1;
  16650. pData->iSampleofs = 1;
  16651. pData->iSamplediv = 1;
  16652. pData->iFilterbpp = 1;
  16653. break;
  16654. #endif /* MNG_NO_1_2_4BIT_SUPPORT */
  16655. case png_g8:
  16656. case png_idx8:
  16657. #ifdef MNG_INCLUDE_JNG
  16658. case png_jpeg_a8:
  16659. #endif
  16660. pData->iSamplemul = 1;
  16661. pData->iSampleofs = 0;
  16662. pData->iSamplediv = 0;
  16663. pData->iFilterbpp = 1;
  16664. break;
  16665. case png_ga8:
  16666. #ifndef MNG_NO_16BIT_SUPPORT
  16667. case png_g16:
  16668. #ifdef MNG_INCLUDE_JNG
  16669. case png_jpeg_a16:
  16670. #endif
  16671. #endif
  16672. pData->iSamplemul = 2;
  16673. pData->iSampleofs = 0;
  16674. pData->iSamplediv = 0;
  16675. pData->iFilterbpp = 2;
  16676. break;
  16677. case png_rgb8:
  16678. pData->iSamplemul = 3;
  16679. pData->iSampleofs = 0;
  16680. pData->iSamplediv = 0;
  16681. pData->iFilterbpp = 3;
  16682. break;
  16683. #ifndef MNG_NO_16BIT_SUPPORT
  16684. case png_ga16:
  16685. #endif
  16686. case png_rgba8:
  16687. pData->iSamplemul = 4;
  16688. pData->iSampleofs = 0;
  16689. pData->iSamplediv = 0;
  16690. pData->iFilterbpp = 4;
  16691. break;
  16692. #ifndef MNG_NO_16BIT_SUPPORT
  16693. case png_rgb16:
  16694. pData->iSamplemul = 6;
  16695. pData->iSampleofs = 0;
  16696. pData->iSamplediv = 0;
  16697. pData->iFilterbpp = 6;
  16698. break;
  16699. case png_rgba16:
  16700. pData->iSamplemul = 8;
  16701. pData->iSampleofs = 0;
  16702. pData->iSamplediv = 0;
  16703. pData->iFilterbpp = 8;
  16704. break;
  16705. #endif
  16706. default:
  16707. break;
  16708. }
  16709. if (pData->iInterlace) /* noninterlaced */
  16710. {
  16711. pData->iPass = 0; /* from 0..6; (1..7 in specification) */
  16712. pData->iRow = interlace_row [0];
  16713. pData->iRowinc = interlace_rowskip [0];
  16714. pData->iCol = interlace_col [0];
  16715. pData->iColinc = interlace_colskip [0];
  16716. pData->iRowsamples = (pData->iDatawidth + interlace_roundoff [0]) >>
  16717. interlace_divider [0];
  16718. pData->iRowmax = ((pData->iDatawidth * pData->iSamplemul +
  16719. pData->iSampleofs) >> pData->iSamplediv) + pData->iPixelofs;
  16720. }
  16721. else /* interlaced */
  16722. {
  16723. pData->iPass = -1;
  16724. pData->iRow = 0;
  16725. pData->iRowinc = 1;
  16726. pData->iCol = 0;
  16727. pData->iColinc = 1;
  16728. pData->iRowsamples = pData->iDatawidth;
  16729. }
  16730. if (pData->iSamplediv > 0)
  16731. pData->iRowsize = (pData->iRowsamples + pData->iSampleofs) >>
  16732. pData->iSamplediv;
  16733. else
  16734. pData->iRowsize = (pData->iRowsamples * pData->iSamplemul);
  16735. if (!pData->iInterlace) /* noninterlaced */
  16736. pData->iRowmax = pData->iRowsize + pData->iPixelofs;
  16737. #ifdef MNG_NO_16BIT_SUPPORT
  16738. pData->bIsRGBA16 = MNG_FALSE;
  16739. #else
  16740. switch (pData->ePng_imgtype)
  16741. {
  16742. case png_g16:
  16743. case png_ga16:
  16744. case png_rgb16:
  16745. case png_rgba16:
  16746. pData->bIsRGBA16 = MNG_TRUE;
  16747. break;
  16748. default:
  16749. pData->bIsRGBA16 = MNG_FALSE;
  16750. break;
  16751. }
  16752. #endif
  16753. }
  16754. #endif /* MNG_OPTIMIZE_FOOTPRINT_INIT */
  16755. if (pData->pStoreobj) /* storage object selected ? */
  16756. {
  16757. pData->pStorebuf = ((mng_imagep)pData->pStoreobj)->pImgbuf;
  16758. /* and so it becomes viewable ! */
  16759. ((mng_imagep)pData->pStoreobj)->bViewable = MNG_TRUE;
  16760. ((mng_imagedatap)pData->pStorebuf)->bViewable = MNG_TRUE;
  16761. }
  16762. /* allocate the buffers; the individual init routines have already
  16763. calculated the required maximum size; except in the case of a JNG
  16764. without alpha!!! */
  16765. if (pData->iRowmax)
  16766. {
  16767. #if defined(MNG_NO_16BIT_SUPPORT) || defined (MNG_NO_1_2_4BIT_SUPPORT)
  16768. mng_uint8 iRowadd = 0;
  16769. #ifdef MNG_NO_1_2_4BIT_SUPPORT
  16770. if (pData->iPNGdepth < 8)
  16771. iRowadd=(pData->iPNGdepth*pData->iRowmax+7)/8;
  16772. #endif
  16773. #ifdef MNG_NO_16BIT_SUPPORT
  16774. if (pData->iPNGdepth > 8)
  16775. iRowadd=pData->iRowmax;
  16776. #endif
  16777. MNG_ALLOC (pData, pData->pWorkrow, pData->iRowmax+iRowadd);
  16778. MNG_ALLOC (pData, pData->pPrevrow, pData->iRowmax+iRowadd);
  16779. #else
  16780. MNG_ALLOC (pData, pData->pWorkrow, pData->iRowmax);
  16781. MNG_ALLOC (pData, pData->pPrevrow, pData->iRowmax);
  16782. #endif
  16783. }
  16784. /* allocate an RGBA16 row for intermediate processing */
  16785. MNG_ALLOC (pData, pData->pRGBArow, (pData->iDatawidth << 3));
  16786. #ifndef MNG_NO_CMS
  16787. if (pData->fDisplayrow) /* display "on-the-fly" ? */
  16788. {
  16789. #if defined(MNG_FULL_CMS) /* determine color-management initialization */
  16790. mng_retcode iRetcode = mng_init_full_cms (pData, MNG_TRUE, MNG_TRUE, MNG_FALSE);
  16791. #elif defined(MNG_GAMMA_ONLY)
  16792. mng_retcode iRetcode = mng_init_gamma_only (pData, MNG_TRUE, MNG_TRUE, MNG_FALSE);
  16793. #elif defined(MNG_APP_CMS)
  16794. mng_retcode iRetcode = mng_init_app_cms (pData, MNG_TRUE, MNG_TRUE, MNG_FALSE);
  16795. #endif
  16796. if (iRetcode) /* on error bail out */
  16797. return iRetcode;
  16798. }
  16799. #endif /* !MNG_NO_CMS */
  16800. #ifdef MNG_SUPPORT_TRACE
  16801. MNG_TRACE (pData, MNG_FN_INIT_ROWPROC, MNG_LC_END);
  16802. #endif
  16803. return MNG_NOERROR;
  16804. }
  16805. /* ************************************************************************** */
  16806. mng_retcode mng_next_row (mng_datap pData)
  16807. {
  16808. #ifdef MNG_SUPPORT_TRACE
  16809. MNG_TRACE (pData, MNG_FN_NEXT_ROW, MNG_LC_START);
  16810. #endif
  16811. pData->iRow += pData->iRowinc; /* increase the row counter */
  16812. if (pData->iPass >= 0) /* interlaced ? */
  16813. {
  16814. while ((pData->iPass < 7) && /* went 'outside' the image ? */
  16815. ((pData->iRow >= (mng_int32)pData->iDataheight) ||
  16816. (pData->iCol >= (mng_int32)pData->iDatawidth ) ))
  16817. {
  16818. pData->iPass++; /* next pass ! */
  16819. if (pData->iPass < 7) /* there's only 7 passes ! */
  16820. {
  16821. pData->iRow = interlace_row [pData->iPass];
  16822. pData->iRowinc = interlace_rowskip [pData->iPass];
  16823. pData->iCol = interlace_col [pData->iPass];
  16824. pData->iColinc = interlace_colskip [pData->iPass];
  16825. pData->iRowsamples = (pData->iDatawidth - pData->iCol + interlace_roundoff [pData->iPass])
  16826. >> interlace_divider [pData->iPass];
  16827. if (pData->iSamplemul > 1) /* recalculate row dimension */
  16828. pData->iRowsize = pData->iRowsamples * pData->iSamplemul;
  16829. else
  16830. if (pData->iSamplediv > 0)
  16831. pData->iRowsize = (pData->iRowsamples + pData->iSampleofs) >> pData->iSamplediv;
  16832. else
  16833. pData->iRowsize = pData->iRowsamples;
  16834. }
  16835. if ((pData->iPass < 7) && /* reset previous row to zeroes ? */
  16836. (pData->iRow < (mng_int32)pData->iDataheight) &&
  16837. (pData->iCol < (mng_int32)pData->iDatawidth ) )
  16838. { /* making sure the filters will work properly! */
  16839. mng_int32 iX;
  16840. mng_uint8p pTemp = pData->pPrevrow;
  16841. #ifdef MNG_NO_16BIT_SUPPORT
  16842. #ifdef MNG_DECREMENT_LOOPS
  16843. for (iX = pData->iPNGmult*pData->iRowsize; iX > 0; iX--)
  16844. #else
  16845. for (iX = 0; iX < pData->iPNGmult*pData->iRowsize; iX++)
  16846. #endif
  16847. #else
  16848. #ifdef MNG_DECREMENT_LOOPS
  16849. for (iX = pData->iRowsize; iX > 0; iX--)
  16850. #else
  16851. for (iX = 0; iX < pData->iRowsize; iX++)
  16852. #endif
  16853. #endif
  16854. {
  16855. *pTemp = 0;
  16856. pTemp++;
  16857. }
  16858. }
  16859. }
  16860. }
  16861. #ifdef MNG_SUPPORT_TRACE
  16862. MNG_TRACE (pData, MNG_FN_NEXT_ROW, MNG_LC_END);
  16863. #endif
  16864. return MNG_NOERROR;
  16865. }
  16866. /* ************************************************************************** */
  16867. mng_retcode mng_cleanup_rowproc (mng_datap pData)
  16868. {
  16869. #ifdef MNG_SUPPORT_TRACE
  16870. MNG_TRACE (pData, MNG_FN_CLEANUP_ROWPROC, MNG_LC_START);
  16871. #endif
  16872. #ifdef MNG_INCLUDE_LCMS /* cleanup cms profile/transform */
  16873. {
  16874. mng_retcode iRetcode = mng_clear_cms (pData);
  16875. if (iRetcode) /* on error bail out */
  16876. return iRetcode;
  16877. }
  16878. #endif /* MNG_INCLUDE_LCMS */
  16879. if (pData->pRGBArow) /* cleanup buffer for intermediate row */
  16880. MNG_FREEX (pData, pData->pRGBArow, (pData->iDatawidth << 3));
  16881. if (pData->pPrevrow) /* cleanup buffer for previous row */
  16882. MNG_FREEX (pData, pData->pPrevrow, pData->iRowmax);
  16883. if (pData->pWorkrow) /* cleanup buffer for working row */
  16884. MNG_FREEX (pData, pData->pWorkrow, pData->iRowmax);
  16885. pData->pWorkrow = MNG_NULL; /* propogate uninitialized buffers */
  16886. pData->pPrevrow = MNG_NULL;
  16887. pData->pRGBArow = MNG_NULL;
  16888. #ifdef MNG_SUPPORT_TRACE
  16889. MNG_TRACE (pData, MNG_FN_CLEANUP_ROWPROC, MNG_LC_END);
  16890. #endif
  16891. return MNG_NOERROR; /* woohiii */
  16892. }
  16893. /* ************************************************************************** */
  16894. /* * * */
  16895. /* * Generic row processing routines for JNG * */
  16896. /* * * */
  16897. /* ************************************************************************** */
  16898. #ifdef MNG_INCLUDE_JNG
  16899. /* ************************************************************************** */
  16900. mng_retcode mng_display_jpeg_rows (mng_datap pData)
  16901. {
  16902. mng_retcode iRetcode;
  16903. #ifdef MNG_SUPPORT_TRACE
  16904. MNG_TRACE (pData, MNG_FN_DISPLAY_JPEG_ROWS, MNG_LC_START);
  16905. #endif
  16906. /* any completed rows ? */
  16907. if ((pData->iJPEGrow > pData->iJPEGdisprow) &&
  16908. (pData->iJPEGalpharow > pData->iJPEGdisprow) )
  16909. {
  16910. mng_uint32 iX, iMax;
  16911. mng_uint32 iSaverow = pData->iRow; /* save alpha decompression row-count */
  16912. /* determine the highest complete(!) row */
  16913. if (pData->iJPEGrow > pData->iJPEGalpharow)
  16914. iMax = pData->iJPEGalpharow;
  16915. else
  16916. iMax = pData->iJPEGrow;
  16917. /* display the rows */
  16918. for (iX = pData->iJPEGdisprow; iX < iMax; iX++)
  16919. {
  16920. pData->iRow = iX; /* make sure we all know which row to handle */
  16921. /* makeup an intermediate row from the buffer */
  16922. iRetcode = ((mng_retrieverow)pData->fRetrieverow) (pData);
  16923. /* color-correct it if necessary */
  16924. if ((!iRetcode) && (pData->fCorrectrow))
  16925. iRetcode = ((mng_correctrow)pData->fCorrectrow) (pData);
  16926. if (!iRetcode) /* and display it */
  16927. {
  16928. iRetcode = ((mng_displayrow)pData->fDisplayrow) (pData);
  16929. if (!iRetcode) /* check progressive display refresh */
  16930. iRetcode = mng_display_progressive_check (pData);
  16931. }
  16932. if (iRetcode) /* on error bail out */
  16933. return iRetcode;
  16934. }
  16935. pData->iJPEGdisprow = iMax; /* keep track of the last displayed row */
  16936. pData->iRow = iSaverow; /* restore alpha decompression row-count */
  16937. }
  16938. #ifdef MNG_SUPPORT_TRACE
  16939. MNG_TRACE (pData, MNG_FN_DISPLAY_JPEG_ROWS, MNG_LC_END);
  16940. #endif
  16941. return MNG_NOERROR;
  16942. }
  16943. /* ************************************************************************** */
  16944. mng_retcode mng_next_jpeg_alpharow (mng_datap pData)
  16945. {
  16946. mng_retcode iRetcode;
  16947. #ifdef MNG_SUPPORT_TRACE
  16948. MNG_TRACE (pData, MNG_FN_NEXT_JPEG_ALPHAROW, MNG_LC_START);
  16949. #endif
  16950. pData->iJPEGalpharow++; /* count the row */
  16951. if (pData->fDisplayrow) /* display "on-the-fly" ? */
  16952. { /* try to display what you can */
  16953. iRetcode = mng_display_jpeg_rows (pData);
  16954. if (iRetcode) /* on error bail out */
  16955. return iRetcode;
  16956. }
  16957. #ifdef MNG_SUPPORT_TRACE
  16958. MNG_TRACE (pData, MNG_FN_NEXT_JPEG_ALPHAROW, MNG_LC_END);
  16959. #endif
  16960. return MNG_NOERROR;
  16961. }
  16962. /* ************************************************************************** */
  16963. mng_retcode mng_next_jpeg_row (mng_datap pData)
  16964. {
  16965. mng_retcode iRetcode;
  16966. #ifdef MNG_SUPPORT_TRACE
  16967. MNG_TRACE (pData, MNG_FN_NEXT_JPEG_ROW, MNG_LC_START);
  16968. #endif
  16969. pData->iJPEGrow++; /* increase the row-counter */
  16970. if (pData->fDisplayrow) /* display "on-the-fly" ? */
  16971. { /* has alpha channel ? */
  16972. if ((pData->iJHDRcolortype == MNG_COLORTYPE_JPEGGRAYA ) ||
  16973. (pData->iJHDRcolortype == MNG_COLORTYPE_JPEGCOLORA) )
  16974. { /* try to display what you can */
  16975. iRetcode = mng_display_jpeg_rows (pData);
  16976. }
  16977. else
  16978. { /* make sure we all know which row to handle */
  16979. pData->iRow = pData->iJPEGrow - 1;
  16980. /* makeup an intermediate row from the buffer */
  16981. iRetcode = ((mng_retrieverow)pData->fRetrieverow) (pData);
  16982. /* color-correct it if necessary */
  16983. if ((!iRetcode) && (pData->fCorrectrow))
  16984. iRetcode = ((mng_correctrow)pData->fCorrectrow) (pData);
  16985. if (!iRetcode) /* and display it */
  16986. {
  16987. iRetcode = ((mng_displayrow)pData->fDisplayrow) (pData);
  16988. if (!iRetcode) /* check progressive display refresh */
  16989. iRetcode = mng_display_progressive_check (pData);
  16990. }
  16991. }
  16992. if (iRetcode) /* on error bail out */
  16993. return iRetcode;
  16994. }
  16995. /* surpassed last filled row ? */
  16996. if (pData->iJPEGrow > pData->iJPEGrgbrow)
  16997. pData->iJPEGrgbrow = pData->iJPEGrow;
  16998. #ifdef MNG_SUPPORT_TRACE
  16999. MNG_TRACE (pData, MNG_FN_NEXT_JPEG_ROW, MNG_LC_END);
  17000. #endif
  17001. return MNG_NOERROR;
  17002. }
  17003. /* ************************************************************************** */
  17004. #endif /* MNG_INCLUDE_JNG */
  17005. /* ************************************************************************** */
  17006. #ifndef MNG_SKIPCHUNK_MAGN
  17007. #ifndef MNG_OPTIMIZE_FOOTPRINT_MAGN
  17008. #ifndef MNG_NO_GRAY_SUPPORT
  17009. mng_retcode mng_magnify_g8_x1 (mng_datap pData,
  17010. mng_uint16 iMX,
  17011. mng_uint16 iML,
  17012. mng_uint16 iMR,
  17013. mng_uint32 iWidth,
  17014. mng_uint8p pSrcline,
  17015. mng_uint8p pDstline)
  17016. {
  17017. mng_uint32 iX, iS, iM;
  17018. mng_uint8p pTempsrc1;
  17019. mng_uint8p pTempdst;
  17020. #ifdef MNG_SUPPORT_TRACE
  17021. MNG_TRACE (pData, MNG_FN_MAGNIFY_G8_X1, MNG_LC_START);
  17022. #endif
  17023. pTempsrc1 = pSrcline; /* initialize pixel-loop */
  17024. pTempdst = pDstline;
  17025. for (iX = 0; iX < iWidth; iX++)
  17026. {
  17027. *pTempdst = *pTempsrc1; /* copy original source pixel */
  17028. pTempdst++;
  17029. if (iX == 0) /* first interval ? */
  17030. iM = iML;
  17031. else
  17032. if (iX == (iWidth - 1)) /* last interval ? */
  17033. iM = iMR;
  17034. else
  17035. iM = iMX;
  17036. for (iS = 1; iS < iM; iS++) /* fill interval */
  17037. {
  17038. *pTempdst = *pTempsrc1; /* copy original source pixel */
  17039. pTempdst++;
  17040. }
  17041. pTempsrc1++;
  17042. }
  17043. #ifdef MNG_SUPPORT_TRACE
  17044. MNG_TRACE (pData, MNG_FN_MAGNIFY_G8_X1, MNG_LC_END);
  17045. #endif
  17046. return MNG_NOERROR;
  17047. }
  17048. /* ************************************************************************** */
  17049. mng_retcode mng_magnify_g8_x2 (mng_datap pData,
  17050. mng_uint16 iMX,
  17051. mng_uint16 iML,
  17052. mng_uint16 iMR,
  17053. mng_uint32 iWidth,
  17054. mng_uint8p pSrcline,
  17055. mng_uint8p pDstline)
  17056. {
  17057. mng_uint32 iX;
  17058. mng_int32 iS, iM;
  17059. mng_uint8p pTempsrc1;
  17060. mng_uint8p pTempsrc2;
  17061. mng_uint8p pTempdst;
  17062. #ifdef MNG_SUPPORT_TRACE
  17063. MNG_TRACE (pData, MNG_FN_MAGNIFY_G8_X2, MNG_LC_START);
  17064. #endif
  17065. pTempsrc1 = pSrcline; /* initialize pixel-loop */
  17066. pTempdst = pDstline;
  17067. for (iX = 0; iX < iWidth; iX++)
  17068. {
  17069. pTempsrc2 = pTempsrc1 + 1;
  17070. *pTempdst = *pTempsrc1; /* copy original source pixel */
  17071. pTempdst++;
  17072. if (iX == 0) /* first interval ? */
  17073. {
  17074. if (iWidth == 1) /* single pixel ? */
  17075. pTempsrc2 = MNG_NULL;
  17076. iM = iML;
  17077. }
  17078. else
  17079. if (iX == (iWidth - 2)) /* last interval ? */
  17080. iM = iMR;
  17081. else
  17082. iM = iMX;
  17083. /* fill interval ? */
  17084. if ((iX < iWidth - 1) || (iWidth == 1))
  17085. {
  17086. if (pTempsrc2) /* do we have the second pixel ? */
  17087. { /* is it same as first ? */
  17088. if (*pTempsrc1 == *pTempsrc2)
  17089. {
  17090. for (iS = 1; iS < iM; iS++) /* then just repeat the first */
  17091. {
  17092. *pTempdst = *pTempsrc1;
  17093. pTempdst++;
  17094. }
  17095. }
  17096. else
  17097. {
  17098. for (iS = 1; iS < iM; iS++) /* calculate the distances */
  17099. {
  17100. *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*pTempsrc2) -
  17101. (mng_int32)(*pTempsrc1) ) + iM) /
  17102. (iM * 2)) + (mng_int32)(*pTempsrc1) );
  17103. pTempdst++;
  17104. }
  17105. }
  17106. }
  17107. else
  17108. {
  17109. for (iS = 1; iS < iM; iS++)
  17110. {
  17111. *pTempdst = *pTempsrc1; /* repeat first source pixel */
  17112. pTempdst++;
  17113. }
  17114. }
  17115. }
  17116. pTempsrc1++;
  17117. }
  17118. #ifdef MNG_SUPPORT_TRACE
  17119. MNG_TRACE (pData, MNG_FN_MAGNIFY_G8_X2, MNG_LC_END);
  17120. #endif
  17121. return MNG_NOERROR;
  17122. }
  17123. /* ************************************************************************** */
  17124. mng_retcode mng_magnify_g8_x3 (mng_datap pData,
  17125. mng_uint16 iMX,
  17126. mng_uint16 iML,
  17127. mng_uint16 iMR,
  17128. mng_uint32 iWidth,
  17129. mng_uint8p pSrcline,
  17130. mng_uint8p pDstline)
  17131. {
  17132. mng_uint32 iX;
  17133. mng_int32 iS, iM, iH;
  17134. mng_uint8p pTempsrc1;
  17135. mng_uint8p pTempsrc2;
  17136. mng_uint8p pTempdst;
  17137. #ifdef MNG_SUPPORT_TRACE
  17138. MNG_TRACE (pData, MNG_FN_MAGNIFY_G8_X3, MNG_LC_START);
  17139. #endif
  17140. pTempsrc1 = pSrcline; /* initialize pixel-loop */
  17141. pTempdst = pDstline;
  17142. for (iX = 0; iX < iWidth; iX++)
  17143. {
  17144. pTempsrc2 = pTempsrc1 + 1;
  17145. *pTempdst = *pTempsrc1; /* copy original source pixel */
  17146. pTempdst++;
  17147. if (iX == 0) /* first interval ? */
  17148. {
  17149. if (iWidth == 1) /* single pixel ? */
  17150. pTempsrc2 = MNG_NULL;
  17151. iM = iML;
  17152. }
  17153. else
  17154. if (iX == (iWidth - 2)) /* last interval ? */
  17155. iM = iMR;
  17156. else
  17157. iM = iMX;
  17158. /* fill interval ? */
  17159. if ((iX < iWidth - 1) || (iWidth == 1))
  17160. {
  17161. if (pTempsrc2) /* do we have the second pixel ? */
  17162. { /* is it same as first ? */
  17163. if (*pTempsrc1 == *pTempsrc2)
  17164. {
  17165. for (iS = 1; iS < iM; iS++) /* then just repeat the first */
  17166. {
  17167. *pTempdst = *pTempsrc1;
  17168. pTempdst++;
  17169. }
  17170. }
  17171. else
  17172. {
  17173. iH = (iM+1) / 2; /* calculate halfway point */
  17174. for (iS = 1; iS < iH; iS++) /* replicate first half */
  17175. {
  17176. *pTempdst = *pTempsrc1;
  17177. pTempdst++;
  17178. }
  17179. for (iS = iH; iS < iM; iS++) /* replicate second half */
  17180. {
  17181. *pTempdst = *pTempsrc2;
  17182. pTempdst++;
  17183. }
  17184. }
  17185. }
  17186. else
  17187. {
  17188. for (iS = 1; iS < iM; iS++)
  17189. {
  17190. *pTempdst = *pTempsrc1; /* repeat first source pixel */
  17191. pTempdst++;
  17192. }
  17193. }
  17194. }
  17195. pTempsrc1++;
  17196. }
  17197. #ifdef MNG_SUPPORT_TRACE
  17198. MNG_TRACE (pData, MNG_FN_MAGNIFY_G8_X3, MNG_LC_END);
  17199. #endif
  17200. return MNG_NOERROR;
  17201. }
  17202. #endif /* MNG_NO_GRAY_SUPPORT */
  17203. /* ************************************************************************** */
  17204. mng_retcode mng_magnify_rgb8_x1 (mng_datap pData,
  17205. mng_uint16 iMX,
  17206. mng_uint16 iML,
  17207. mng_uint16 iMR,
  17208. mng_uint32 iWidth,
  17209. mng_uint8p pSrcline,
  17210. mng_uint8p pDstline)
  17211. {
  17212. mng_uint32 iX, iS, iM;
  17213. mng_uint8p pTempsrc1;
  17214. mng_uint8p pTempdst;
  17215. #ifdef MNG_SUPPORT_TRACE
  17216. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB8_X1, MNG_LC_START);
  17217. #endif
  17218. pTempsrc1 = pSrcline; /* initialize pixel-loop */
  17219. pTempdst = pDstline;
  17220. for (iX = 0; iX < iWidth; iX++)
  17221. {
  17222. *pTempdst = *pTempsrc1; /* copy original source pixel */
  17223. pTempdst++;
  17224. *pTempdst = *(pTempsrc1+1);
  17225. pTempdst++;
  17226. *pTempdst = *(pTempsrc1+2);
  17227. pTempdst++;
  17228. if (iX == 0) /* first interval ? */
  17229. iM = iML;
  17230. else
  17231. if (iX == (iWidth - 1)) /* last interval ? */
  17232. iM = iMR;
  17233. else
  17234. iM = iMX;
  17235. for (iS = 1; iS < iM; iS++) /* fill interval */
  17236. {
  17237. *pTempdst = *pTempsrc1; /* copy original source pixel */
  17238. pTempdst++;
  17239. *pTempdst = *(pTempsrc1+1);
  17240. pTempdst++;
  17241. *pTempdst = *(pTempsrc1+2);
  17242. pTempdst++;
  17243. }
  17244. pTempsrc1 += 3;
  17245. }
  17246. #ifdef MNG_SUPPORT_TRACE
  17247. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB8_X1, MNG_LC_END);
  17248. #endif
  17249. return MNG_NOERROR;
  17250. }
  17251. /* ************************************************************************** */
  17252. mng_retcode mng_magnify_rgb8_x2 (mng_datap pData,
  17253. mng_uint16 iMX,
  17254. mng_uint16 iML,
  17255. mng_uint16 iMR,
  17256. mng_uint32 iWidth,
  17257. mng_uint8p pSrcline,
  17258. mng_uint8p pDstline)
  17259. {
  17260. mng_uint32 iX;
  17261. mng_int32 iS, iM;
  17262. mng_uint8p pTempsrc1;
  17263. mng_uint8p pTempsrc2;
  17264. mng_uint8p pTempdst;
  17265. #ifdef MNG_SUPPORT_TRACE
  17266. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB8_X2, MNG_LC_START);
  17267. #endif
  17268. pTempsrc1 = pSrcline; /* initialize pixel-loop */
  17269. pTempdst = pDstline;
  17270. for (iX = 0; iX < iWidth; iX++)
  17271. {
  17272. pTempsrc2 = pTempsrc1 + 3;
  17273. *pTempdst = *pTempsrc1; /* copy original source pixel */
  17274. pTempdst++;
  17275. *pTempdst = *(pTempsrc1+1);
  17276. pTempdst++;
  17277. *pTempdst = *(pTempsrc1+2);
  17278. pTempdst++;
  17279. if (iX == 0) /* first interval ? */
  17280. {
  17281. if (iWidth == 1) /* single pixel ? */
  17282. pTempsrc2 = MNG_NULL;
  17283. iM = (mng_int32)iML;
  17284. }
  17285. else
  17286. if (iX == (iWidth - 2)) /* last interval ? */
  17287. iM = (mng_int32)iMR;
  17288. else
  17289. iM = (mng_int32)iMX;
  17290. /* fill interval ? */
  17291. if ((iX < iWidth - 1) || (iWidth == 1))
  17292. {
  17293. if (pTempsrc2) /* do we have the second pixel ? */
  17294. {
  17295. for (iS = 1; iS < iM; iS++)
  17296. {
  17297. if (*pTempsrc1 == *pTempsrc2)
  17298. *pTempdst = *pTempsrc1; /* just repeat the first */
  17299. else /* calculate the distance */
  17300. *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*pTempsrc2) -
  17301. (mng_int32)(*pTempsrc1) ) + iM) /
  17302. (iM * 2)) + (mng_int32)(*pTempsrc1) );
  17303. pTempdst++;
  17304. if (*(pTempsrc1+1) == *(pTempsrc2+1))
  17305. *pTempdst = *(pTempsrc1+1);
  17306. else
  17307. *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+1)) -
  17308. (mng_int32)(*(pTempsrc1+1)) ) + iM) /
  17309. (iM * 2)) + (mng_int32)(*(pTempsrc1+1)) );
  17310. pTempdst++;
  17311. if (*(pTempsrc1+2) == *(pTempsrc2+2))
  17312. *pTempdst = *(pTempsrc1+2);
  17313. else
  17314. *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+2)) -
  17315. (mng_int32)(*(pTempsrc1+2)) ) + iM) /
  17316. (iM * 2)) + (mng_int32)(*(pTempsrc1+2)) );
  17317. pTempdst++;
  17318. }
  17319. }
  17320. else
  17321. {
  17322. for (iS = 1; iS < iM; iS++)
  17323. {
  17324. *pTempdst = *pTempsrc1; /* repeat first source pixel */
  17325. pTempdst++;
  17326. *pTempdst = *(pTempsrc1+1);
  17327. pTempdst++;
  17328. *pTempdst = *(pTempsrc1+2);
  17329. pTempdst++;
  17330. }
  17331. }
  17332. }
  17333. pTempsrc1 += 3;
  17334. }
  17335. #ifdef MNG_SUPPORT_TRACE
  17336. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB8_X2, MNG_LC_END);
  17337. #endif
  17338. return MNG_NOERROR;
  17339. }
  17340. /* ************************************************************************** */
  17341. mng_retcode mng_magnify_rgb8_x3 (mng_datap pData,
  17342. mng_uint16 iMX,
  17343. mng_uint16 iML,
  17344. mng_uint16 iMR,
  17345. mng_uint32 iWidth,
  17346. mng_uint8p pSrcline,
  17347. mng_uint8p pDstline)
  17348. {
  17349. mng_uint32 iX;
  17350. mng_int32 iS, iM, iH;
  17351. mng_uint8p pTempsrc1;
  17352. mng_uint8p pTempsrc2;
  17353. mng_uint8p pTempdst;
  17354. #ifdef MNG_SUPPORT_TRACE
  17355. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB8_X3, MNG_LC_START);
  17356. #endif
  17357. pTempsrc1 = pSrcline; /* initialize pixel-loop */
  17358. pTempdst = pDstline;
  17359. for (iX = 0; iX < iWidth; iX++)
  17360. {
  17361. pTempsrc2 = pTempsrc1 + 3;
  17362. *pTempdst = *pTempsrc1; /* copy original source pixel */
  17363. pTempdst++;
  17364. *pTempdst = *(pTempsrc1+1);
  17365. pTempdst++;
  17366. *pTempdst = *(pTempsrc1+2);
  17367. pTempdst++;
  17368. if (iX == 0) /* first interval ? */
  17369. {
  17370. if (iWidth == 1) /* single pixel ? */
  17371. pTempsrc2 = MNG_NULL;
  17372. iM = (mng_int32)iML;
  17373. }
  17374. else
  17375. if (iX == (iWidth - 2)) /* last interval ? */
  17376. iM = (mng_int32)iMR;
  17377. else
  17378. iM = (mng_int32)iMX;
  17379. /* fill interval ? */
  17380. if ((iX < iWidth - 1) || (iWidth == 1))
  17381. {
  17382. if (pTempsrc2) /* do we have the second pixel ? */
  17383. {
  17384. iH = (iM+1) / 2; /* calculate halfway point */
  17385. for (iS = 1; iS < iH; iS++) /* replicate first half */
  17386. {
  17387. *pTempdst = *pTempsrc1;
  17388. *(pTempdst+1) = *(pTempsrc1+1);
  17389. *(pTempdst+2) = *(pTempsrc1+2);
  17390. pTempdst += 3;
  17391. }
  17392. for (iS = iH; iS < iM; iS++) /* replicate second half */
  17393. {
  17394. *pTempdst = *pTempsrc2;
  17395. *(pTempdst+1) = *(pTempsrc2+1);
  17396. *(pTempdst+2) = *(pTempsrc2+2);
  17397. pTempdst += 3;
  17398. }
  17399. }
  17400. else
  17401. {
  17402. for (iS = 1; iS < iM; iS++)
  17403. {
  17404. *pTempdst = *pTempsrc1; /* repeat first source pixel */
  17405. pTempdst++;
  17406. *pTempdst = *(pTempsrc1+1);
  17407. pTempdst++;
  17408. *pTempdst = *(pTempsrc1+2);
  17409. pTempdst++;
  17410. }
  17411. }
  17412. }
  17413. pTempsrc1 += 3;
  17414. }
  17415. #ifdef MNG_SUPPORT_TRACE
  17416. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB8_X3, MNG_LC_END);
  17417. #endif
  17418. return MNG_NOERROR;
  17419. }
  17420. /* ************************************************************************** */
  17421. #ifndef MNG_NO_GRAY_SUPPORT
  17422. mng_retcode mng_magnify_ga8_x1 (mng_datap pData,
  17423. mng_uint16 iMX,
  17424. mng_uint16 iML,
  17425. mng_uint16 iMR,
  17426. mng_uint32 iWidth,
  17427. mng_uint8p pSrcline,
  17428. mng_uint8p pDstline)
  17429. {
  17430. mng_uint32 iX, iS, iM;
  17431. mng_uint8p pTempsrc1;
  17432. mng_uint8p pTempdst;
  17433. #ifdef MNG_SUPPORT_TRACE
  17434. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_X1, MNG_LC_START);
  17435. #endif
  17436. pTempsrc1 = pSrcline; /* initialize pixel-loop */
  17437. pTempdst = pDstline;
  17438. for (iX = 0; iX < iWidth; iX++)
  17439. {
  17440. *pTempdst = *pTempsrc1; /* copy original source pixel */
  17441. pTempdst++;
  17442. *pTempdst = *(pTempsrc1+1);
  17443. pTempdst++;
  17444. if (iX == 0) /* first interval ? */
  17445. iM = iML;
  17446. else
  17447. if (iX == (iWidth - 1)) /* last interval ? */
  17448. iM = iMR;
  17449. else
  17450. iM = iMX;
  17451. for (iS = 1; iS < iM; iS++) /* fill interval */
  17452. {
  17453. *pTempdst = *pTempsrc1; /* copy original source pixel */
  17454. pTempdst++;
  17455. *pTempdst = *(pTempsrc1+1);
  17456. pTempdst++;
  17457. }
  17458. pTempsrc1 += 2;
  17459. }
  17460. #ifdef MNG_SUPPORT_TRACE
  17461. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_X1, MNG_LC_END);
  17462. #endif
  17463. return MNG_NOERROR;
  17464. }
  17465. /* ************************************************************************** */
  17466. mng_retcode mng_magnify_ga8_x2 (mng_datap pData,
  17467. mng_uint16 iMX,
  17468. mng_uint16 iML,
  17469. mng_uint16 iMR,
  17470. mng_uint32 iWidth,
  17471. mng_uint8p pSrcline,
  17472. mng_uint8p pDstline)
  17473. {
  17474. mng_uint32 iX;
  17475. mng_int32 iS, iM;
  17476. mng_uint8p pTempsrc1;
  17477. mng_uint8p pTempsrc2;
  17478. mng_uint8p pTempdst;
  17479. #ifdef MNG_SUPPORT_TRACE
  17480. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_X2, MNG_LC_START);
  17481. #endif
  17482. pTempsrc1 = pSrcline; /* initialize pixel-loop */
  17483. pTempdst = pDstline;
  17484. for (iX = 0; iX < iWidth; iX++)
  17485. {
  17486. pTempsrc2 = pTempsrc1 + 2;
  17487. *pTempdst = *pTempsrc1; /* copy original source pixel */
  17488. pTempdst++;
  17489. *pTempdst = *(pTempsrc1+1);
  17490. pTempdst++;
  17491. if (iX == 0) /* first interval ? */
  17492. {
  17493. if (iWidth == 1) /* single pixel ? */
  17494. pTempsrc2 = MNG_NULL;
  17495. iM = iML;
  17496. }
  17497. else
  17498. if (iX == (iWidth - 2)) /* last interval ? */
  17499. iM = iMR;
  17500. else
  17501. iM = iMX;
  17502. /* fill interval ? */
  17503. if ((iX < iWidth - 1) || (iWidth == 1))
  17504. {
  17505. if (pTempsrc2) /* do we have the second pixel ? */
  17506. {
  17507. for (iS = 1; iS < iM; iS++)
  17508. {
  17509. if (*pTempsrc1 == *pTempsrc2)
  17510. *pTempdst = *pTempsrc1; /* just repeat the first */
  17511. else /* calculate the distance */
  17512. *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*pTempsrc2) -
  17513. (mng_int32)(*pTempsrc1) ) + iM) /
  17514. (iM * 2)) + (mng_int32)(*pTempsrc1) );
  17515. pTempdst++;
  17516. if (*(pTempsrc1+1) == *(pTempsrc2+1))
  17517. *pTempdst = *(pTempsrc1+1);
  17518. else
  17519. *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+1)) -
  17520. (mng_int32)(*(pTempsrc1+1)) ) + iM) /
  17521. (iM * 2)) + (mng_int32)(*(pTempsrc1+1)) );
  17522. pTempdst++;
  17523. }
  17524. }
  17525. else
  17526. {
  17527. for (iS = 1; iS < iM; iS++)
  17528. {
  17529. *pTempdst = *pTempsrc1; /* repeat first source pixel */
  17530. pTempdst++;
  17531. *pTempdst = *(pTempsrc1+1);
  17532. pTempdst++;
  17533. }
  17534. }
  17535. }
  17536. pTempsrc1 += 2;
  17537. }
  17538. #ifdef MNG_SUPPORT_TRACE
  17539. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_X2, MNG_LC_END);
  17540. #endif
  17541. return MNG_NOERROR;
  17542. }
  17543. /* ************************************************************************** */
  17544. mng_retcode mng_magnify_ga8_x3 (mng_datap pData,
  17545. mng_uint16 iMX,
  17546. mng_uint16 iML,
  17547. mng_uint16 iMR,
  17548. mng_uint32 iWidth,
  17549. mng_uint8p pSrcline,
  17550. mng_uint8p pDstline)
  17551. {
  17552. mng_uint32 iX;
  17553. mng_int32 iS, iM, iH;
  17554. mng_uint8p pTempsrc1;
  17555. mng_uint8p pTempsrc2;
  17556. mng_uint8p pTempdst;
  17557. #ifdef MNG_SUPPORT_TRACE
  17558. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_X3, MNG_LC_START);
  17559. #endif
  17560. pTempsrc1 = pSrcline; /* initialize pixel-loop */
  17561. pTempdst = pDstline;
  17562. for (iX = 0; iX < iWidth; iX++)
  17563. {
  17564. pTempsrc2 = pTempsrc1 + 2;
  17565. *pTempdst = *pTempsrc1; /* copy original source pixel */
  17566. pTempdst++;
  17567. *pTempdst = *(pTempsrc1+1);
  17568. pTempdst++;
  17569. if (iX == 0) /* first interval ? */
  17570. {
  17571. if (iWidth == 1) /* single pixel ? */
  17572. pTempsrc2 = MNG_NULL;
  17573. iM = iML;
  17574. }
  17575. else
  17576. if (iX == (iWidth - 2)) /* last interval ? */
  17577. iM = iMR;
  17578. else
  17579. iM = iMX;
  17580. /* fill interval ? */
  17581. if ((iX < iWidth - 1) || (iWidth == 1))
  17582. {
  17583. if (pTempsrc2) /* do we have the second pixel ? */
  17584. {
  17585. iH = (iM+1) / 2; /* calculate halfway point */
  17586. for (iS = 1; iS < iH; iS++) /* replicate first half */
  17587. {
  17588. *pTempdst = *pTempsrc1;
  17589. *(pTempdst+1) = *(pTempsrc1+1);
  17590. pTempdst += 2;
  17591. }
  17592. for (iS = iH; iS < iM; iS++) /* replicate second half */
  17593. {
  17594. *pTempdst = *pTempsrc2;
  17595. *(pTempdst+1) = *(pTempsrc2+1);
  17596. pTempdst += 2;
  17597. }
  17598. }
  17599. else
  17600. {
  17601. for (iS = 1; iS < iM; iS++)
  17602. {
  17603. *pTempdst = *pTempsrc1; /* repeat first source pixel */
  17604. pTempdst++;
  17605. *pTempdst = *(pTempsrc1+1);
  17606. pTempdst++;
  17607. }
  17608. }
  17609. }
  17610. pTempsrc1 += 2;
  17611. }
  17612. #ifdef MNG_SUPPORT_TRACE
  17613. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_X3, MNG_LC_END);
  17614. #endif
  17615. return MNG_NOERROR;
  17616. }
  17617. /* ************************************************************************** */
  17618. mng_retcode mng_magnify_ga8_x4 (mng_datap pData,
  17619. mng_uint16 iMX,
  17620. mng_uint16 iML,
  17621. mng_uint16 iMR,
  17622. mng_uint32 iWidth,
  17623. mng_uint8p pSrcline,
  17624. mng_uint8p pDstline)
  17625. {
  17626. mng_uint32 iX;
  17627. mng_int32 iS, iM, iH;
  17628. mng_uint8p pTempsrc1;
  17629. mng_uint8p pTempsrc2;
  17630. mng_uint8p pTempdst;
  17631. #ifdef MNG_SUPPORT_TRACE
  17632. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_X4, MNG_LC_START);
  17633. #endif
  17634. pTempsrc1 = pSrcline; /* initialize pixel-loop */
  17635. pTempdst = pDstline;
  17636. for (iX = 0; iX < iWidth; iX++)
  17637. {
  17638. pTempsrc2 = pTempsrc1 + 2;
  17639. *pTempdst = *pTempsrc1; /* copy original source pixel */
  17640. pTempdst++;
  17641. *pTempdst = *(pTempsrc1+1);
  17642. pTempdst++;
  17643. if (iX == 0) /* first interval ? */
  17644. {
  17645. if (iWidth == 1) /* single pixel ? */
  17646. pTempsrc2 = MNG_NULL;
  17647. iM = iML;
  17648. }
  17649. else
  17650. if (iX == (iWidth - 2)) /* last interval ? */
  17651. iM = iMR;
  17652. else
  17653. iM = iMX;
  17654. /* fill interval ? */
  17655. if ((iX < iWidth - 1) || (iWidth == 1))
  17656. {
  17657. if (pTempsrc2) /* do we have the second pixel ? */
  17658. {
  17659. iH = (iM+1) / 2; /* calculate halfway point */
  17660. for (iS = 1; iS < iH; iS++) /* first half */
  17661. {
  17662. if (*pTempsrc1 == *pTempsrc2)
  17663. *pTempdst = *pTempsrc1; /* just repeat the first */
  17664. else /* calculate the distance */
  17665. *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*pTempsrc2) -
  17666. (mng_int32)(*pTempsrc1) ) + iM) /
  17667. (iM * 2)) + (mng_int32)(*pTempsrc1) );
  17668. pTempdst++;
  17669. *pTempdst = *(pTempsrc1+1); /* replicate alpha from left */
  17670. pTempdst++;
  17671. }
  17672. for (iS = iH; iS < iM; iS++) /* second half */
  17673. {
  17674. if (*pTempsrc1 == *pTempsrc2)
  17675. *pTempdst = *pTempsrc1; /* just repeat the first */
  17676. else /* calculate the distance */
  17677. *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*pTempsrc2) -
  17678. (mng_int32)(*pTempsrc1) ) + iM) /
  17679. (iM * 2)) + (mng_int32)(*pTempsrc1) );
  17680. pTempdst++;
  17681. *pTempdst = *(pTempsrc2+1); /* replicate alpha from right */
  17682. pTempdst++;
  17683. }
  17684. }
  17685. else
  17686. {
  17687. for (iS = 1; iS < iM; iS++)
  17688. {
  17689. *pTempdst = *pTempsrc1; /* repeat first source pixel */
  17690. pTempdst++;
  17691. *pTempdst = *(pTempsrc1+1);
  17692. pTempdst++;
  17693. }
  17694. }
  17695. }
  17696. pTempsrc1 += 2;
  17697. }
  17698. #ifdef MNG_SUPPORT_TRACE
  17699. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_X4, MNG_LC_END);
  17700. #endif
  17701. return MNG_NOERROR;
  17702. }
  17703. /* ************************************************************************** */
  17704. mng_retcode mng_magnify_ga8_x5 (mng_datap pData,
  17705. mng_uint16 iMX,
  17706. mng_uint16 iML,
  17707. mng_uint16 iMR,
  17708. mng_uint32 iWidth,
  17709. mng_uint8p pSrcline,
  17710. mng_uint8p pDstline)
  17711. {
  17712. mng_uint32 iX;
  17713. mng_int32 iS, iM, iH;
  17714. mng_uint8p pTempsrc1;
  17715. mng_uint8p pTempsrc2;
  17716. mng_uint8p pTempdst;
  17717. #ifdef MNG_SUPPORT_TRACE
  17718. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_X5, MNG_LC_START);
  17719. #endif
  17720. pTempsrc1 = pSrcline; /* initialize pixel-loop */
  17721. pTempdst = pDstline;
  17722. for (iX = 0; iX < iWidth; iX++)
  17723. {
  17724. pTempsrc2 = pTempsrc1 + 2;
  17725. *pTempdst = *pTempsrc1; /* copy original source pixel */
  17726. pTempdst++;
  17727. *pTempdst = *(pTempsrc1+1);
  17728. pTempdst++;
  17729. if (iX == 0) /* first interval ? */
  17730. {
  17731. if (iWidth == 1) /* single pixel ? */
  17732. pTempsrc2 = MNG_NULL;
  17733. iM = iML;
  17734. }
  17735. else
  17736. if (iX == (iWidth - 2)) /* last interval ? */
  17737. iM = iMR;
  17738. else
  17739. iM = iMX;
  17740. /* fill interval ? */
  17741. if ((iX < iWidth - 1) || (iWidth == 1))
  17742. {
  17743. if (pTempsrc2) /* do we have the second pixel ? */
  17744. {
  17745. iH = (iM+1) / 2; /* calculate halfway point */
  17746. for (iS = 1; iS < iH; iS++) /* first half */
  17747. {
  17748. *pTempdst = *pTempsrc1; /* replicate gray from left */
  17749. pTempdst++;
  17750. if (*(pTempsrc1+1) == *(pTempsrc2+1))
  17751. *pTempdst = *(pTempsrc1+1);/* just repeat the first */
  17752. else /* calculate the distance */
  17753. *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+1)) -
  17754. (mng_int32)(*(pTempsrc1+1)) ) + iM) /
  17755. (iM * 2)) + (mng_int32)(*(pTempsrc1+1)) );
  17756. pTempdst++;
  17757. }
  17758. for (iS = iH; iS < iM; iS++) /* second half */
  17759. {
  17760. *pTempdst = *pTempsrc2; /* replicate gray from right */
  17761. pTempdst++;
  17762. if (*(pTempsrc1+1) == *(pTempsrc2+1))
  17763. *pTempdst = *(pTempsrc1+1);/* just repeat the first */
  17764. else /* calculate the distance */
  17765. *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+1)) -
  17766. (mng_int32)(*(pTempsrc1+1)) ) + iM) /
  17767. (iM * 2)) + (mng_int32)(*(pTempsrc1+1)) );
  17768. pTempdst++;
  17769. }
  17770. }
  17771. else
  17772. {
  17773. for (iS = 1; iS < iM; iS++)
  17774. {
  17775. *pTempdst = *pTempsrc1; /* repeat first source pixel */
  17776. pTempdst++;
  17777. *pTempdst = *(pTempsrc1+1);
  17778. pTempdst++;
  17779. }
  17780. }
  17781. }
  17782. pTempsrc1 += 2;
  17783. }
  17784. #ifdef MNG_SUPPORT_TRACE
  17785. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_X5, MNG_LC_END);
  17786. #endif
  17787. return MNG_NOERROR;
  17788. }
  17789. #endif /* MNG_NO_GRAY_SUPPORT */
  17790. #endif /* MNG_OPTIMIZE_FOOTPRINT_MAGN */
  17791. /* ************************************************************************** */
  17792. mng_retcode mng_magnify_rgba8_x1 (mng_datap pData,
  17793. mng_uint16 iMX,
  17794. mng_uint16 iML,
  17795. mng_uint16 iMR,
  17796. mng_uint32 iWidth,
  17797. mng_uint8p pSrcline,
  17798. mng_uint8p pDstline)
  17799. {
  17800. mng_uint32 iX, iS, iM;
  17801. mng_uint8p pTempsrc1;
  17802. mng_uint8p pTempdst;
  17803. #ifdef MNG_SUPPORT_TRACE
  17804. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_X1, MNG_LC_START);
  17805. #endif
  17806. pTempsrc1 = pSrcline; /* initialize pixel-loop */
  17807. pTempdst = pDstline;
  17808. for (iX = 0; iX < iWidth; iX++)
  17809. {
  17810. *pTempdst = *pTempsrc1; /* copy original source pixel */
  17811. pTempdst++;
  17812. *pTempdst = *(pTempsrc1+1);
  17813. pTempdst++;
  17814. *pTempdst = *(pTempsrc1+2);
  17815. pTempdst++;
  17816. *pTempdst = *(pTempsrc1+3);
  17817. pTempdst++;
  17818. if (iX == 0) /* first interval ? */
  17819. iM = iML;
  17820. else
  17821. if (iX == (iWidth - 1)) /* last interval ? */
  17822. iM = iMR;
  17823. else
  17824. iM = iMX;
  17825. for (iS = 1; iS < iM; iS++) /* fill interval */
  17826. {
  17827. *pTempdst = *pTempsrc1; /* copy original source pixel */
  17828. pTempdst++;
  17829. *pTempdst = *(pTempsrc1+1);
  17830. pTempdst++;
  17831. *pTempdst = *(pTempsrc1+2);
  17832. pTempdst++;
  17833. *pTempdst = *(pTempsrc1+3);
  17834. pTempdst++;
  17835. }
  17836. pTempsrc1 += 4;
  17837. }
  17838. #ifdef MNG_SUPPORT_TRACE
  17839. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_X1, MNG_LC_END);
  17840. #endif
  17841. return MNG_NOERROR;
  17842. }
  17843. /* ************************************************************************** */
  17844. mng_retcode mng_magnify_rgba8_x2 (mng_datap pData,
  17845. mng_uint16 iMX,
  17846. mng_uint16 iML,
  17847. mng_uint16 iMR,
  17848. mng_uint32 iWidth,
  17849. mng_uint8p pSrcline,
  17850. mng_uint8p pDstline)
  17851. {
  17852. mng_uint32 iX;
  17853. mng_int32 iS, iM;
  17854. mng_uint8p pTempsrc1;
  17855. mng_uint8p pTempsrc2;
  17856. mng_uint8p pTempdst;
  17857. #ifdef MNG_SUPPORT_TRACE
  17858. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_X2, MNG_LC_START);
  17859. #endif
  17860. pTempsrc1 = pSrcline; /* initialize pixel-loop */
  17861. pTempdst = pDstline;
  17862. for (iX = 0; iX < iWidth; iX++)
  17863. {
  17864. pTempsrc2 = pTempsrc1 + 4;
  17865. *pTempdst = *pTempsrc1; /* copy original source pixel */
  17866. pTempdst++;
  17867. *pTempdst = *(pTempsrc1+1);
  17868. pTempdst++;
  17869. *pTempdst = *(pTempsrc1+2);
  17870. pTempdst++;
  17871. *pTempdst = *(pTempsrc1+3);
  17872. pTempdst++;
  17873. if (iX == 0) /* first interval ? */
  17874. {
  17875. if (iWidth == 1) /* single pixel ? */
  17876. pTempsrc2 = MNG_NULL;
  17877. iM = (mng_int32)iML;
  17878. }
  17879. else
  17880. if (iX == (iWidth - 2)) /* last interval ? */
  17881. iM = (mng_int32)iMR;
  17882. else
  17883. iM = (mng_int32)iMX;
  17884. /* fill interval ? */
  17885. if ((iX < iWidth - 1) || (iWidth == 1))
  17886. {
  17887. if (pTempsrc2) /* do we have the second pixel ? */
  17888. {
  17889. for (iS = 1; iS < iM; iS++)
  17890. {
  17891. if (*pTempsrc1 == *pTempsrc2)
  17892. *pTempdst = *pTempsrc1; /* just repeat the first */
  17893. else /* calculate the distance */
  17894. *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*pTempsrc2) -
  17895. (mng_int32)(*pTempsrc1) ) + iM) /
  17896. (iM * 2)) + (mng_int32)(*pTempsrc1) );
  17897. pTempdst++;
  17898. if (*(pTempsrc1+1) == *(pTempsrc2+1))
  17899. *pTempdst = *(pTempsrc1+1);
  17900. else
  17901. *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+1)) -
  17902. (mng_int32)(*(pTempsrc1+1)) ) + iM) /
  17903. (iM * 2)) + (mng_int32)(*(pTempsrc1+1)) );
  17904. pTempdst++;
  17905. if (*(pTempsrc1+2) == *(pTempsrc2+2))
  17906. *pTempdst = *(pTempsrc1+2);
  17907. else
  17908. *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+2)) -
  17909. (mng_int32)(*(pTempsrc1+2)) ) + iM) /
  17910. (iM * 2)) + (mng_int32)(*(pTempsrc1+2)) );
  17911. pTempdst++;
  17912. if (*(pTempsrc1+3) == *(pTempsrc2+3))
  17913. *pTempdst = *(pTempsrc1+3);
  17914. else
  17915. *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+3)) -
  17916. (mng_int32)(*(pTempsrc1+3)) ) + iM) /
  17917. (iM * 2)) + (mng_int32)(*(pTempsrc1+3)) );
  17918. pTempdst++;
  17919. }
  17920. }
  17921. else
  17922. {
  17923. for (iS = 1; iS < iM; iS++)
  17924. {
  17925. *pTempdst = *pTempsrc1; /* repeat first source pixel */
  17926. pTempdst++;
  17927. *pTempdst = *(pTempsrc1+1);
  17928. pTempdst++;
  17929. *pTempdst = *(pTempsrc1+2);
  17930. pTempdst++;
  17931. *pTempdst = *(pTempsrc1+3);
  17932. pTempdst++;
  17933. }
  17934. }
  17935. }
  17936. pTempsrc1 += 4;
  17937. }
  17938. #ifdef MNG_SUPPORT_TRACE
  17939. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_X2, MNG_LC_END);
  17940. #endif
  17941. return MNG_NOERROR;
  17942. }
  17943. /* ************************************************************************** */
  17944. mng_retcode mng_magnify_rgba8_x3 (mng_datap pData,
  17945. mng_uint16 iMX,
  17946. mng_uint16 iML,
  17947. mng_uint16 iMR,
  17948. mng_uint32 iWidth,
  17949. mng_uint8p pSrcline,
  17950. mng_uint8p pDstline)
  17951. {
  17952. mng_uint32 iX;
  17953. mng_int32 iS, iM, iH;
  17954. mng_uint8p pTempsrc1;
  17955. mng_uint8p pTempsrc2;
  17956. mng_uint8p pTempdst;
  17957. #ifdef MNG_SUPPORT_TRACE
  17958. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_X3, MNG_LC_START);
  17959. #endif
  17960. pTempsrc1 = pSrcline; /* initialize pixel-loop */
  17961. pTempdst = pDstline;
  17962. for (iX = 0; iX < iWidth; iX++)
  17963. {
  17964. pTempsrc2 = pTempsrc1 + 4;
  17965. *pTempdst = *pTempsrc1; /* copy original source pixel */
  17966. pTempdst++;
  17967. *pTempdst = *(pTempsrc1+1);
  17968. pTempdst++;
  17969. *pTempdst = *(pTempsrc1+2);
  17970. pTempdst++;
  17971. *pTempdst = *(pTempsrc1+3);
  17972. pTempdst++;
  17973. if (iX == 0) /* first interval ? */
  17974. {
  17975. if (iWidth == 1) /* single pixel ? */
  17976. pTempsrc2 = MNG_NULL;
  17977. iM = (mng_int32)iML;
  17978. }
  17979. else
  17980. if (iX == (iWidth - 2)) /* last interval ? */
  17981. iM = (mng_int32)iMR;
  17982. else
  17983. iM = (mng_int32)iMX;
  17984. /* fill interval ? */
  17985. if ((iX < iWidth - 1) || (iWidth == 1))
  17986. {
  17987. if (pTempsrc2) /* do we have the second pixel ? */
  17988. {
  17989. iH = (iM+1) / 2; /* calculate halfway point */
  17990. for (iS = 1; iS < iH; iS++) /* replicate first half */
  17991. {
  17992. *pTempdst = *pTempsrc1;
  17993. *(pTempdst+1) = *(pTempsrc1+1);
  17994. *(pTempdst+2) = *(pTempsrc1+2);
  17995. *(pTempdst+3) = *(pTempsrc1+3);
  17996. pTempdst += 4;
  17997. }
  17998. for (iS = iH; iS < iM; iS++) /* replicate second half */
  17999. {
  18000. *pTempdst = *pTempsrc2;
  18001. *(pTempdst+1) = *(pTempsrc2+1);
  18002. *(pTempdst+2) = *(pTempsrc2+2);
  18003. *(pTempdst+3) = *(pTempsrc2+3);
  18004. pTempdst += 4;
  18005. }
  18006. }
  18007. else
  18008. {
  18009. for (iS = 1; iS < iM; iS++)
  18010. {
  18011. *pTempdst = *pTempsrc1; /* repeat first source pixel */
  18012. pTempdst++;
  18013. *pTempdst = *(pTempsrc1+1);
  18014. pTempdst++;
  18015. *pTempdst = *(pTempsrc1+2);
  18016. pTempdst++;
  18017. *pTempdst = *(pTempsrc1+3);
  18018. pTempdst++;
  18019. }
  18020. }
  18021. }
  18022. pTempsrc1 += 4;
  18023. }
  18024. #ifdef MNG_SUPPORT_TRACE
  18025. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_X3, MNG_LC_END);
  18026. #endif
  18027. return MNG_NOERROR;
  18028. }
  18029. /* ************************************************************************** */
  18030. mng_retcode mng_magnify_rgba8_x4 (mng_datap pData,
  18031. mng_uint16 iMX,
  18032. mng_uint16 iML,
  18033. mng_uint16 iMR,
  18034. mng_uint32 iWidth,
  18035. mng_uint8p pSrcline,
  18036. mng_uint8p pDstline)
  18037. {
  18038. mng_uint32 iX;
  18039. mng_int32 iS, iM, iH;
  18040. mng_uint8p pTempsrc1;
  18041. mng_uint8p pTempsrc2;
  18042. mng_uint8p pTempdst;
  18043. #ifdef MNG_SUPPORT_TRACE
  18044. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_X4, MNG_LC_START);
  18045. #endif
  18046. pTempsrc1 = pSrcline; /* initialize pixel-loop */
  18047. pTempdst = pDstline;
  18048. for (iX = 0; iX < iWidth; iX++)
  18049. {
  18050. pTempsrc2 = pTempsrc1 + 4;
  18051. *pTempdst = *pTempsrc1; /* copy original source pixel */
  18052. pTempdst++;
  18053. *pTempdst = *(pTempsrc1+1);
  18054. pTempdst++;
  18055. *pTempdst = *(pTempsrc1+2);
  18056. pTempdst++;
  18057. *pTempdst = *(pTempsrc1+3);
  18058. pTempdst++;
  18059. if (iX == 0) /* first interval ? */
  18060. {
  18061. if (iWidth == 1) /* single pixel ? */
  18062. pTempsrc2 = MNG_NULL;
  18063. iM = (mng_int32)iML;
  18064. }
  18065. else
  18066. if (iX == (iWidth - 2)) /* last interval ? */
  18067. iM = (mng_int32)iMR;
  18068. else
  18069. iM = (mng_int32)iMX;
  18070. /* fill interval ? */
  18071. if ((iX < iWidth - 1) || (iWidth == 1))
  18072. {
  18073. if (pTempsrc2) /* do we have the second pixel ? */
  18074. {
  18075. iH = (iM+1) / 2; /* calculate halfway point */
  18076. for (iS = 1; iS < iH; iS++) /* first half */
  18077. {
  18078. if (*pTempsrc1 == *pTempsrc2)
  18079. *pTempdst = *pTempsrc1; /* just repeat the first */
  18080. else /* calculate the distance */
  18081. *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*pTempsrc2) -
  18082. (mng_int32)(*pTempsrc1) ) + iM) /
  18083. (iM * 2)) + (mng_int32)(*pTempsrc1) );
  18084. pTempdst++;
  18085. if (*(pTempsrc1+1) == *(pTempsrc2+1))
  18086. *pTempdst = *(pTempsrc1+1);
  18087. else
  18088. *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+1)) -
  18089. (mng_int32)(*(pTempsrc1+1)) ) + iM) /
  18090. (iM * 2)) + (mng_int32)(*(pTempsrc1+1)) );
  18091. pTempdst++;
  18092. if (*(pTempsrc1+2) == *(pTempsrc2+2))
  18093. *pTempdst = *(pTempsrc1+2);
  18094. else
  18095. *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+2)) -
  18096. (mng_int32)(*(pTempsrc1+2)) ) + iM) /
  18097. (iM * 2)) + (mng_int32)(*(pTempsrc1+2)) );
  18098. pTempdst++;
  18099. /* replicate alpha from left */
  18100. *pTempdst = *(pTempsrc1+3);
  18101. pTempdst++;
  18102. }
  18103. for (iS = iH; iS < iM; iS++) /* second half */
  18104. {
  18105. if (*pTempsrc1 == *pTempsrc2)
  18106. *pTempdst = *pTempsrc1; /* just repeat the first */
  18107. else /* calculate the distance */
  18108. *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*pTempsrc2) -
  18109. (mng_int32)(*pTempsrc1) ) + iM) /
  18110. (iM * 2)) + (mng_int32)(*pTempsrc1) );
  18111. pTempdst++;
  18112. if (*(pTempsrc1+1) == *(pTempsrc2+1))
  18113. *pTempdst = *(pTempsrc1+1);
  18114. else
  18115. *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+1)) -
  18116. (mng_int32)(*(pTempsrc1+1)) ) + iM) /
  18117. (iM * 2)) + (mng_int32)(*(pTempsrc1+1)) );
  18118. pTempdst++;
  18119. if (*(pTempsrc1+2) == *(pTempsrc2+2))
  18120. *pTempdst = *(pTempsrc1+2);
  18121. else
  18122. *pTempdst = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+2)) -
  18123. (mng_int32)(*(pTempsrc1+2)) ) + iM) /
  18124. (iM * 2)) + (mng_int32)(*(pTempsrc1+2)) );
  18125. pTempdst++;
  18126. /* replicate alpha from right */
  18127. *pTempdst = *(pTempsrc2+3);
  18128. pTempdst++;
  18129. }
  18130. }
  18131. else
  18132. {
  18133. for (iS = 1; iS < iM; iS++)
  18134. {
  18135. *pTempdst = *pTempsrc1; /* repeat first source pixel */
  18136. pTempdst++;
  18137. *pTempdst = *(pTempsrc1+1);
  18138. pTempdst++;
  18139. *pTempdst = *(pTempsrc1+2);
  18140. pTempdst++;
  18141. *pTempdst = *(pTempsrc1+3);
  18142. pTempdst++;
  18143. }
  18144. }
  18145. }
  18146. pTempsrc1 += 4;
  18147. }
  18148. #ifdef MNG_SUPPORT_TRACE
  18149. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_X4, MNG_LC_END);
  18150. #endif
  18151. return MNG_NOERROR;
  18152. }
  18153. /* ************************************************************************** */
  18154. mng_retcode mng_magnify_rgba8_x5 (mng_datap pData,
  18155. mng_uint16 iMX,
  18156. mng_uint16 iML,
  18157. mng_uint16 iMR,
  18158. mng_uint32 iWidth,
  18159. mng_uint8p pSrcline,
  18160. mng_uint8p pDstline)
  18161. {
  18162. mng_uint32 iX;
  18163. mng_int32 iS, iM, iH;
  18164. mng_uint8p pTempsrc1;
  18165. mng_uint8p pTempsrc2;
  18166. mng_uint8p pTempdst;
  18167. #ifdef MNG_SUPPORT_TRACE
  18168. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_X5, MNG_LC_START);
  18169. #endif
  18170. pTempsrc1 = pSrcline; /* initialize pixel-loop */
  18171. pTempdst = pDstline;
  18172. for (iX = 0; iX < iWidth; iX++)
  18173. {
  18174. pTempsrc2 = pTempsrc1 + 4;
  18175. *pTempdst = *pTempsrc1; /* copy original source pixel */
  18176. pTempdst++;
  18177. *pTempdst = *(pTempsrc1+1);
  18178. pTempdst++;
  18179. *pTempdst = *(pTempsrc1+2);
  18180. pTempdst++;
  18181. *pTempdst = *(pTempsrc1+3);
  18182. pTempdst++;
  18183. if (iX == 0) /* first interval ? */
  18184. {
  18185. if (iWidth == 1) /* single pixel ? */
  18186. pTempsrc2 = MNG_NULL;
  18187. iM = (mng_int32)iML;
  18188. }
  18189. else
  18190. if (iX == (iWidth - 2)) /* last interval ? */
  18191. iM = (mng_int32)iMR;
  18192. else
  18193. iM = (mng_int32)iMX;
  18194. /* fill interval ? */
  18195. if ((iX < iWidth - 1) || (iWidth == 1))
  18196. {
  18197. if (pTempsrc2) /* do we have the second pixel ? */
  18198. {
  18199. iH = (iM+1) / 2; /* calculate halfway point */
  18200. for (iS = 1; iS < iH; iS++) /* first half */
  18201. {
  18202. *pTempdst = *pTempsrc1; /* replicate color from left */
  18203. *(pTempdst+1) = *(pTempsrc1+1);
  18204. *(pTempdst+2) = *(pTempsrc1+2);
  18205. if (*(pTempsrc1+3) == *(pTempsrc2+3))
  18206. *(pTempdst+3) = *(pTempsrc1+3);
  18207. else
  18208. *(pTempdst+3) = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+3)) -
  18209. (mng_int32)(*(pTempsrc1+3)) ) + iM) /
  18210. (iM * 2)) + (mng_int32)(*(pTempsrc1+3)) );
  18211. pTempdst += 4;
  18212. }
  18213. for (iS = iH; iS < iM; iS++) /* second half */
  18214. {
  18215. *pTempdst = *pTempsrc2; /* replicate color from right */
  18216. *(pTempdst+1) = *(pTempsrc2+1);
  18217. *(pTempdst+2) = *(pTempsrc2+2);
  18218. if (*(pTempsrc1+3) == *(pTempsrc2+3))
  18219. *(pTempdst+3) = *(pTempsrc1+3);
  18220. else
  18221. *(pTempdst+3) = (mng_uint8)(((2 * iS * ( (mng_int32)(*(pTempsrc2+3)) -
  18222. (mng_int32)(*(pTempsrc1+3)) ) + iM) /
  18223. (iM * 2)) + (mng_int32)(*(pTempsrc1+3)) );
  18224. pTempdst += 4;
  18225. }
  18226. }
  18227. else
  18228. {
  18229. for (iS = 1; iS < iM; iS++)
  18230. {
  18231. *pTempdst = *pTempsrc1; /* repeat first source pixel */
  18232. pTempdst++;
  18233. *pTempdst = *(pTempsrc1+1);
  18234. pTempdst++;
  18235. *pTempdst = *(pTempsrc1+2);
  18236. pTempdst++;
  18237. *pTempdst = *(pTempsrc1+3);
  18238. pTempdst++;
  18239. }
  18240. }
  18241. }
  18242. pTempsrc1 += 4;
  18243. }
  18244. #ifdef MNG_SUPPORT_TRACE
  18245. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_X4, MNG_LC_END);
  18246. #endif
  18247. return MNG_NOERROR;
  18248. }
  18249. /* ************************************************************************** */
  18250. #ifndef MNG_OPTIMIZE_FOOTPRINT_MAGN
  18251. #ifndef MNG_NO_GRAY_SUPPORT
  18252. mng_retcode mng_magnify_g8_y1 (mng_datap pData,
  18253. mng_int32 iS,
  18254. mng_int32 iM,
  18255. mng_uint32 iWidth,
  18256. mng_uint8p pSrcline1,
  18257. mng_uint8p pSrcline2,
  18258. mng_uint8p pDstline)
  18259. {
  18260. #ifdef MNG_SUPPORT_TRACE
  18261. MNG_TRACE (pData, MNG_FN_MAGNIFY_G8_Y1, MNG_LC_START);
  18262. #endif
  18263. MNG_COPY (pDstline, pSrcline1, iWidth);
  18264. #ifdef MNG_SUPPORT_TRACE
  18265. MNG_TRACE (pData, MNG_FN_MAGNIFY_G8_Y1, MNG_LC_END);
  18266. #endif
  18267. return MNG_NOERROR;
  18268. }
  18269. /* ************************************************************************** */
  18270. mng_retcode mng_magnify_g8_y2 (mng_datap pData,
  18271. mng_int32 iS,
  18272. mng_int32 iM,
  18273. mng_uint32 iWidth,
  18274. mng_uint8p pSrcline1,
  18275. mng_uint8p pSrcline2,
  18276. mng_uint8p pDstline)
  18277. {
  18278. mng_uint32 iX;
  18279. mng_uint8p pTempsrc1;
  18280. mng_uint8p pTempsrc2;
  18281. mng_uint8p pTempdst;
  18282. #ifdef MNG_SUPPORT_TRACE
  18283. MNG_TRACE (pData, MNG_FN_MAGNIFY_G8_Y2, MNG_LC_START);
  18284. #endif
  18285. pTempsrc1 = pSrcline1; /* initialize pixel-loop */
  18286. pTempsrc2 = pSrcline2;
  18287. pTempdst = pDstline;
  18288. if (pTempsrc2) /* do we have a second line ? */
  18289. {
  18290. for (iX = 0; iX < iWidth; iX++)
  18291. { /* calculate the distances */
  18292. if (*pTempsrc1 == *pTempsrc2)
  18293. *pTempdst = *pTempsrc1;
  18294. else
  18295. *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) -
  18296. (mng_int32)(*pTempsrc1) ) + iM) /
  18297. (iM * 2) ) + (mng_int32)(*pTempsrc1) );
  18298. pTempdst++;
  18299. pTempsrc1++;
  18300. pTempsrc2++;
  18301. }
  18302. }
  18303. else
  18304. { /* just repeat the entire line */
  18305. MNG_COPY (pTempdst, pTempsrc1, iWidth);
  18306. }
  18307. #ifdef MNG_SUPPORT_TRACE
  18308. MNG_TRACE (pData, MNG_FN_MAGNIFY_G8_Y2, MNG_LC_END);
  18309. #endif
  18310. return MNG_NOERROR;
  18311. }
  18312. /* ************************************************************************** */
  18313. mng_retcode mng_magnify_g8_y3 (mng_datap pData,
  18314. mng_int32 iS,
  18315. mng_int32 iM,
  18316. mng_uint32 iWidth,
  18317. mng_uint8p pSrcline1,
  18318. mng_uint8p pSrcline2,
  18319. mng_uint8p pDstline)
  18320. {
  18321. #ifdef MNG_SUPPORT_TRACE
  18322. MNG_TRACE (pData, MNG_FN_MAGNIFY_G8_Y3, MNG_LC_START);
  18323. #endif
  18324. if (pSrcline2) /* do we have a second line ? */
  18325. {
  18326. if (iS < (iM+1) / 2) /* top half ? */
  18327. MNG_COPY (pDstline, pSrcline1, iWidth)
  18328. else
  18329. MNG_COPY (pDstline, pSrcline2, iWidth);
  18330. }
  18331. else
  18332. { /* just repeat the entire line */
  18333. MNG_COPY (pDstline, pSrcline1, iWidth);
  18334. }
  18335. #ifdef MNG_SUPPORT_TRACE
  18336. MNG_TRACE (pData, MNG_FN_MAGNIFY_G8_Y3, MNG_LC_END);
  18337. #endif
  18338. return MNG_NOERROR;
  18339. }
  18340. #endif /* MNG_NO_GRAY_SUPPORT */
  18341. /* ************************************************************************** */
  18342. mng_retcode mng_magnify_rgb8_y1 (mng_datap pData,
  18343. mng_int32 iS,
  18344. mng_int32 iM,
  18345. mng_uint32 iWidth,
  18346. mng_uint8p pSrcline1,
  18347. mng_uint8p pSrcline2,
  18348. mng_uint8p pDstline)
  18349. {
  18350. #ifdef MNG_SUPPORT_TRACE
  18351. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB8_Y1, MNG_LC_START);
  18352. #endif
  18353. MNG_COPY (pDstline, pSrcline1, iWidth * 3);
  18354. #ifdef MNG_SUPPORT_TRACE
  18355. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB8_Y1, MNG_LC_END);
  18356. #endif
  18357. return MNG_NOERROR;
  18358. }
  18359. /* ************************************************************************** */
  18360. mng_retcode mng_magnify_rgb8_y2 (mng_datap pData,
  18361. mng_int32 iS,
  18362. mng_int32 iM,
  18363. mng_uint32 iWidth,
  18364. mng_uint8p pSrcline1,
  18365. mng_uint8p pSrcline2,
  18366. mng_uint8p pDstline)
  18367. {
  18368. mng_uint32 iX;
  18369. mng_uint8p pTempsrc1;
  18370. mng_uint8p pTempsrc2;
  18371. mng_uint8p pTempdst;
  18372. #ifdef MNG_SUPPORT_TRACE
  18373. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB8_Y2, MNG_LC_START);
  18374. #endif
  18375. pTempsrc1 = pSrcline1; /* initialize pixel-loop */
  18376. pTempsrc2 = pSrcline2;
  18377. pTempdst = pDstline;
  18378. if (pTempsrc2) /* do we have a second line ? */
  18379. {
  18380. for (iX = 0; iX < iWidth; iX++)
  18381. { /* calculate the distances */
  18382. if (*pTempsrc1 == *pTempsrc2)
  18383. *pTempdst = *pTempsrc1;
  18384. else
  18385. *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) -
  18386. (mng_int32)(*pTempsrc1) ) + iM) /
  18387. (iM * 2) ) + (mng_int32)(*pTempsrc1) );
  18388. pTempdst++;
  18389. pTempsrc1++;
  18390. pTempsrc2++;
  18391. if (*pTempsrc1 == *pTempsrc2)
  18392. *pTempdst = *pTempsrc1;
  18393. else
  18394. *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) -
  18395. (mng_int32)(*pTempsrc1) ) + iM) /
  18396. (iM * 2) ) + (mng_int32)(*pTempsrc1) );
  18397. pTempdst++;
  18398. pTempsrc1++;
  18399. pTempsrc2++;
  18400. if (*pTempsrc1 == *pTempsrc2)
  18401. *pTempdst = *pTempsrc1;
  18402. else
  18403. *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) -
  18404. (mng_int32)(*pTempsrc1) ) + iM) /
  18405. (iM * 2) ) + (mng_int32)(*pTempsrc1) );
  18406. pTempdst++;
  18407. pTempsrc1++;
  18408. pTempsrc2++;
  18409. }
  18410. }
  18411. else
  18412. { /* just repeat the entire line */
  18413. MNG_COPY (pTempdst, pTempsrc1, iWidth * 3);
  18414. }
  18415. #ifdef MNG_SUPPORT_TRACE
  18416. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB8_Y2, MNG_LC_END);
  18417. #endif
  18418. return MNG_NOERROR;
  18419. }
  18420. /* ************************************************************************** */
  18421. mng_retcode mng_magnify_rgb8_y3 (mng_datap pData,
  18422. mng_int32 iS,
  18423. mng_int32 iM,
  18424. mng_uint32 iWidth,
  18425. mng_uint8p pSrcline1,
  18426. mng_uint8p pSrcline2,
  18427. mng_uint8p pDstline)
  18428. {
  18429. #ifdef MNG_SUPPORT_TRACE
  18430. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB8_Y3, MNG_LC_START);
  18431. #endif
  18432. if (pSrcline2) /* do we have a second line ? */
  18433. {
  18434. if (iS < (iM+1) / 2) /* top half ? */
  18435. MNG_COPY (pDstline, pSrcline1, iWidth * 3)
  18436. else
  18437. MNG_COPY (pDstline, pSrcline2, iWidth * 3);
  18438. }
  18439. else
  18440. { /* just repeat the entire line */
  18441. MNG_COPY (pDstline, pSrcline1, iWidth * 3);
  18442. }
  18443. #ifdef MNG_SUPPORT_TRACE
  18444. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB8_Y3, MNG_LC_END);
  18445. #endif
  18446. return MNG_NOERROR;
  18447. }
  18448. /* ************************************************************************** */
  18449. #ifndef MNG_NO_GRAY_SUPPORT
  18450. mng_retcode mng_magnify_ga8_y1 (mng_datap pData,
  18451. mng_int32 iS,
  18452. mng_int32 iM,
  18453. mng_uint32 iWidth,
  18454. mng_uint8p pSrcline1,
  18455. mng_uint8p pSrcline2,
  18456. mng_uint8p pDstline)
  18457. {
  18458. #ifdef MNG_SUPPORT_TRACE
  18459. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_Y1, MNG_LC_START);
  18460. #endif
  18461. MNG_COPY (pDstline, pSrcline1, iWidth << 1);
  18462. #ifdef MNG_SUPPORT_TRACE
  18463. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_Y1, MNG_LC_END);
  18464. #endif
  18465. return MNG_NOERROR;
  18466. }
  18467. /* ************************************************************************** */
  18468. mng_retcode mng_magnify_ga8_y2 (mng_datap pData,
  18469. mng_int32 iS,
  18470. mng_int32 iM,
  18471. mng_uint32 iWidth,
  18472. mng_uint8p pSrcline1,
  18473. mng_uint8p pSrcline2,
  18474. mng_uint8p pDstline)
  18475. {
  18476. mng_uint32 iX;
  18477. mng_uint8p pTempsrc1;
  18478. mng_uint8p pTempsrc2;
  18479. mng_uint8p pTempdst;
  18480. #ifdef MNG_SUPPORT_TRACE
  18481. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_Y2, MNG_LC_START);
  18482. #endif
  18483. pTempsrc1 = pSrcline1; /* initialize pixel-loop */
  18484. pTempsrc2 = pSrcline2;
  18485. pTempdst = pDstline;
  18486. if (pTempsrc2) /* do we have a second line ? */
  18487. {
  18488. for (iX = 0; iX < iWidth; iX++)
  18489. { /* calculate the distances */
  18490. if (*pTempsrc1 == *pTempsrc2)
  18491. *pTempdst = *pTempsrc1;
  18492. else
  18493. *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) -
  18494. (mng_int32)(*pTempsrc1) ) + iM) /
  18495. (iM * 2) ) + (mng_int32)(*pTempsrc1) );
  18496. pTempdst++;
  18497. pTempsrc1++;
  18498. pTempsrc2++;
  18499. if (*pTempsrc1 == *pTempsrc2)
  18500. *pTempdst = *pTempsrc1;
  18501. else
  18502. *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) -
  18503. (mng_int32)(*pTempsrc1) ) + iM) /
  18504. (iM * 2) ) + (mng_int32)(*pTempsrc1) );
  18505. pTempdst++;
  18506. pTempsrc1++;
  18507. pTempsrc2++;
  18508. }
  18509. }
  18510. else
  18511. { /* just repeat the entire line */
  18512. MNG_COPY (pTempdst, pTempsrc1, iWidth << 1);
  18513. }
  18514. #ifdef MNG_SUPPORT_TRACE
  18515. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_Y2, MNG_LC_END);
  18516. #endif
  18517. return MNG_NOERROR;
  18518. }
  18519. /* ************************************************************************** */
  18520. mng_retcode mng_magnify_ga8_y3 (mng_datap pData,
  18521. mng_int32 iS,
  18522. mng_int32 iM,
  18523. mng_uint32 iWidth,
  18524. mng_uint8p pSrcline1,
  18525. mng_uint8p pSrcline2,
  18526. mng_uint8p pDstline)
  18527. {
  18528. #ifdef MNG_SUPPORT_TRACE
  18529. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_Y3, MNG_LC_START);
  18530. #endif
  18531. if (pSrcline2) /* do we have a second line ? */
  18532. {
  18533. if (iS < (iM+1) / 2) /* top half ? */
  18534. MNG_COPY (pDstline, pSrcline1, iWidth << 1)
  18535. else
  18536. MNG_COPY (pDstline, pSrcline2, iWidth << 1);
  18537. }
  18538. else
  18539. { /* just repeat the entire line */
  18540. MNG_COPY (pDstline, pSrcline1, iWidth << 1);
  18541. }
  18542. #ifdef MNG_SUPPORT_TRACE
  18543. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_Y2, MNG_LC_END);
  18544. #endif
  18545. return MNG_NOERROR;
  18546. }
  18547. /* ************************************************************************** */
  18548. mng_retcode mng_magnify_ga8_y4 (mng_datap pData,
  18549. mng_int32 iS,
  18550. mng_int32 iM,
  18551. mng_uint32 iWidth,
  18552. mng_uint8p pSrcline1,
  18553. mng_uint8p pSrcline2,
  18554. mng_uint8p pDstline)
  18555. {
  18556. mng_uint32 iX;
  18557. mng_uint8p pTempsrc1;
  18558. mng_uint8p pTempsrc2;
  18559. mng_uint8p pTempdst;
  18560. #ifdef MNG_SUPPORT_TRACE
  18561. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_Y4, MNG_LC_START);
  18562. #endif
  18563. pTempsrc1 = pSrcline1; /* initialize pixel-loop */
  18564. pTempsrc2 = pSrcline2;
  18565. pTempdst = pDstline;
  18566. if (pTempsrc2) /* do we have a second line ? */
  18567. {
  18568. if (iS < (iM+1) / 2) /* top half ? */
  18569. {
  18570. for (iX = 0; iX < iWidth; iX++)
  18571. { /* calculate the distances */
  18572. if (*pTempsrc1 == *pTempsrc2)
  18573. *pTempdst = *pTempsrc1;
  18574. else
  18575. *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) -
  18576. (mng_int32)(*pTempsrc1) ) + iM) /
  18577. (iM * 2) ) + (mng_int32)(*pTempsrc1) );
  18578. pTempdst++;
  18579. pTempsrc1++;
  18580. pTempsrc2 += 2;
  18581. *pTempdst++ = *pTempsrc1++; /* replicate alpha from top */
  18582. }
  18583. }
  18584. else
  18585. {
  18586. for (iX = 0; iX < iWidth; iX++)
  18587. { /* calculate the distances */
  18588. if (*pTempsrc1 == *pTempsrc2)
  18589. *pTempdst = *pTempsrc1;
  18590. else
  18591. *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) -
  18592. (mng_int32)(*pTempsrc1) ) + iM) /
  18593. (iM * 2) ) + (mng_int32)(*pTempsrc1) );
  18594. pTempdst++;
  18595. pTempsrc1 += 2;
  18596. pTempsrc2++;
  18597. *pTempdst++ = *pTempsrc2++; /* replicate alpha from bottom */
  18598. }
  18599. }
  18600. }
  18601. else
  18602. { /* just repeat the entire line */
  18603. MNG_COPY (pTempdst, pTempsrc1, iWidth << 1);
  18604. }
  18605. #ifdef MNG_SUPPORT_TRACE
  18606. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_Y4, MNG_LC_END);
  18607. #endif
  18608. return MNG_NOERROR;
  18609. }
  18610. /* ************************************************************************** */
  18611. mng_retcode mng_magnify_ga8_y5 (mng_datap pData,
  18612. mng_int32 iS,
  18613. mng_int32 iM,
  18614. mng_uint32 iWidth,
  18615. mng_uint8p pSrcline1,
  18616. mng_uint8p pSrcline2,
  18617. mng_uint8p pDstline)
  18618. {
  18619. mng_uint32 iX;
  18620. mng_uint8p pTempsrc1;
  18621. mng_uint8p pTempsrc2;
  18622. mng_uint8p pTempdst;
  18623. #ifdef MNG_SUPPORT_TRACE
  18624. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_Y5, MNG_LC_START);
  18625. #endif
  18626. pTempsrc1 = pSrcline1; /* initialize pixel-loop */
  18627. pTempsrc2 = pSrcline2;
  18628. pTempdst = pDstline;
  18629. if (pTempsrc2) /* do we have a second line ? */
  18630. {
  18631. if (iS < (iM+1) / 2) /* top half ? */
  18632. {
  18633. for (iX = 0; iX < iWidth; iX++)
  18634. {
  18635. *pTempdst = *pTempsrc1; /* replicate gray from top */
  18636. pTempdst++;
  18637. pTempsrc1++;
  18638. pTempsrc2++;
  18639. if (*pTempsrc1 == *pTempsrc2) /* calculate the distances */
  18640. *pTempdst = *pTempsrc1;
  18641. else
  18642. *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) -
  18643. (mng_int32)(*pTempsrc1) ) + iM) /
  18644. (iM * 2) ) + (mng_int32)(*pTempsrc1) );
  18645. pTempdst++;
  18646. pTempsrc1++;
  18647. pTempsrc2++;
  18648. }
  18649. }
  18650. else
  18651. {
  18652. for (iX = 0; iX < iWidth; iX++)
  18653. {
  18654. *pTempdst = *pTempsrc2; /* replicate gray from bottom */
  18655. pTempdst++;
  18656. pTempsrc1++;
  18657. pTempsrc2++;
  18658. if (*pTempsrc1 == *pTempsrc2) /* calculate the distances */
  18659. *pTempdst = *pTempsrc1;
  18660. else
  18661. *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) -
  18662. (mng_int32)(*pTempsrc1) ) + iM) /
  18663. (iM * 2) ) + (mng_int32)(*pTempsrc1) );
  18664. pTempdst++;
  18665. pTempsrc1++;
  18666. pTempsrc2++;
  18667. }
  18668. }
  18669. }
  18670. else
  18671. { /* just repeat the entire line */
  18672. MNG_COPY (pTempdst, pTempsrc1, iWidth << 1);
  18673. }
  18674. #ifdef MNG_SUPPORT_TRACE
  18675. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA8_Y5, MNG_LC_END);
  18676. #endif
  18677. return MNG_NOERROR;
  18678. }
  18679. #endif /* MNG_NO_GRAY_SUPPORT */
  18680. #endif /* MNG_OPTIMIZE_FOOTPRINT_MAGN */
  18681. /* ************************************************************************** */
  18682. mng_retcode mng_magnify_rgba8_y1 (mng_datap pData,
  18683. mng_int32 iS,
  18684. mng_int32 iM,
  18685. mng_uint32 iWidth,
  18686. mng_uint8p pSrcline1,
  18687. mng_uint8p pSrcline2,
  18688. mng_uint8p pDstline)
  18689. {
  18690. #ifdef MNG_SUPPORT_TRACE
  18691. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_Y1, MNG_LC_START);
  18692. #endif
  18693. MNG_COPY (pDstline, pSrcline1, iWidth << 2);
  18694. #ifdef MNG_SUPPORT_TRACE
  18695. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_Y1, MNG_LC_END);
  18696. #endif
  18697. return MNG_NOERROR;
  18698. }
  18699. /* ************************************************************************** */
  18700. mng_retcode mng_magnify_rgba8_y2 (mng_datap pData,
  18701. mng_int32 iS,
  18702. mng_int32 iM,
  18703. mng_uint32 iWidth,
  18704. mng_uint8p pSrcline1,
  18705. mng_uint8p pSrcline2,
  18706. mng_uint8p pDstline)
  18707. {
  18708. mng_uint32 iX;
  18709. mng_uint8p pTempsrc1;
  18710. mng_uint8p pTempsrc2;
  18711. mng_uint8p pTempdst;
  18712. #ifdef MNG_SUPPORT_TRACE
  18713. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_Y2, MNG_LC_START);
  18714. #endif
  18715. pTempsrc1 = pSrcline1; /* initialize pixel-loop */
  18716. pTempsrc2 = pSrcline2;
  18717. pTempdst = pDstline;
  18718. if (pTempsrc2) /* do we have a second line ? */
  18719. {
  18720. for (iX = 0; iX < iWidth; iX++)
  18721. { /* calculate the distances */
  18722. if (*pTempsrc1 == *pTempsrc2)
  18723. *pTempdst = *pTempsrc1;
  18724. else
  18725. *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) -
  18726. (mng_int32)(*pTempsrc1) ) + iM) /
  18727. (iM * 2) ) + (mng_int32)(*pTempsrc1) );
  18728. pTempdst++;
  18729. pTempsrc1++;
  18730. pTempsrc2++;
  18731. if (*pTempsrc1 == *pTempsrc2)
  18732. *pTempdst = *pTempsrc1;
  18733. else
  18734. *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) -
  18735. (mng_int32)(*pTempsrc1) ) + iM) /
  18736. (iM * 2) ) + (mng_int32)(*pTempsrc1) );
  18737. pTempdst++;
  18738. pTempsrc1++;
  18739. pTempsrc2++;
  18740. if (*pTempsrc1 == *pTempsrc2)
  18741. *pTempdst = *pTempsrc1;
  18742. else
  18743. *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) -
  18744. (mng_int32)(*pTempsrc1) ) + iM) /
  18745. (iM * 2) ) + (mng_int32)(*pTempsrc1) );
  18746. pTempdst++;
  18747. pTempsrc1++;
  18748. pTempsrc2++;
  18749. if (*pTempsrc1 == *pTempsrc2)
  18750. *pTempdst = *pTempsrc1;
  18751. else
  18752. *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) -
  18753. (mng_int32)(*pTempsrc1) ) + iM) /
  18754. (iM * 2) ) + (mng_int32)(*pTempsrc1) );
  18755. pTempdst++;
  18756. pTempsrc1++;
  18757. pTempsrc2++;
  18758. }
  18759. }
  18760. else
  18761. { /* just repeat the entire line */
  18762. MNG_COPY (pTempdst, pTempsrc1, iWidth << 2);
  18763. }
  18764. #ifdef MNG_SUPPORT_TRACE
  18765. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_Y2, MNG_LC_END);
  18766. #endif
  18767. return MNG_NOERROR;
  18768. }
  18769. /* ************************************************************************** */
  18770. mng_retcode mng_magnify_rgba8_y3 (mng_datap pData,
  18771. mng_int32 iS,
  18772. mng_int32 iM,
  18773. mng_uint32 iWidth,
  18774. mng_uint8p pSrcline1,
  18775. mng_uint8p pSrcline2,
  18776. mng_uint8p pDstline)
  18777. {
  18778. #ifdef MNG_SUPPORT_TRACE
  18779. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_Y3, MNG_LC_START);
  18780. #endif
  18781. if (pSrcline2) /* do we have a second line ? */
  18782. {
  18783. if (iS < (iM+1) / 2) /* top half ? */
  18784. MNG_COPY (pDstline, pSrcline1, iWidth << 2)
  18785. else
  18786. MNG_COPY (pDstline, pSrcline2, iWidth << 2);
  18787. }
  18788. else
  18789. { /* just repeat the entire line */
  18790. MNG_COPY (pDstline, pSrcline1, iWidth << 2);
  18791. }
  18792. #ifdef MNG_SUPPORT_TRACE
  18793. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_Y2, MNG_LC_END);
  18794. #endif
  18795. return MNG_NOERROR;
  18796. }
  18797. /* ************************************************************************** */
  18798. mng_retcode mng_magnify_rgba8_y4 (mng_datap pData,
  18799. mng_int32 iS,
  18800. mng_int32 iM,
  18801. mng_uint32 iWidth,
  18802. mng_uint8p pSrcline1,
  18803. mng_uint8p pSrcline2,
  18804. mng_uint8p pDstline)
  18805. {
  18806. mng_uint32 iX;
  18807. mng_uint8p pTempsrc1;
  18808. mng_uint8p pTempsrc2;
  18809. mng_uint8p pTempdst;
  18810. #ifdef MNG_SUPPORT_TRACE
  18811. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_Y4, MNG_LC_START);
  18812. #endif
  18813. pTempsrc1 = pSrcline1; /* initialize pixel-loop */
  18814. pTempsrc2 = pSrcline2;
  18815. pTempdst = pDstline;
  18816. if (pTempsrc2) /* do we have a second line ? */
  18817. {
  18818. if (iS < (iM+1) / 2) /* top half ? */
  18819. {
  18820. for (iX = 0; iX < iWidth; iX++)
  18821. { /* calculate the distances */
  18822. if (*pTempsrc1 == *pTempsrc2)
  18823. *pTempdst = *pTempsrc1;
  18824. else
  18825. *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) -
  18826. (mng_int32)(*pTempsrc1) ) + iM) /
  18827. (iM * 2) ) + (mng_int32)(*pTempsrc1) );
  18828. pTempdst++;
  18829. pTempsrc1++;
  18830. pTempsrc2++;
  18831. if (*pTempsrc1 == *pTempsrc2)
  18832. *pTempdst = *pTempsrc1;
  18833. else
  18834. *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) -
  18835. (mng_int32)(*pTempsrc1) ) + iM) /
  18836. (iM * 2) ) + (mng_int32)(*pTempsrc1) );
  18837. pTempdst++;
  18838. pTempsrc1++;
  18839. pTempsrc2++;
  18840. if (*pTempsrc1 == *pTempsrc2)
  18841. *pTempdst = *pTempsrc1;
  18842. else
  18843. *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) -
  18844. (mng_int32)(*pTempsrc1) ) + iM) /
  18845. (iM * 2) ) + (mng_int32)(*pTempsrc1) );
  18846. pTempdst++;
  18847. pTempsrc1++;
  18848. pTempsrc2 += 2;
  18849. *pTempdst++ = *pTempsrc1++; /* replicate alpha from top */
  18850. }
  18851. }
  18852. else
  18853. {
  18854. for (iX = 0; iX < iWidth; iX++)
  18855. { /* calculate the distances */
  18856. if (*pTempsrc1 == *pTempsrc2)
  18857. *pTempdst = *pTempsrc1;
  18858. else
  18859. *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) -
  18860. (mng_int32)(*pTempsrc1) ) + iM) /
  18861. (iM * 2) ) + (mng_int32)(*pTempsrc1) );
  18862. pTempdst++;
  18863. pTempsrc1++;
  18864. pTempsrc2++;
  18865. if (*pTempsrc1 == *pTempsrc2)
  18866. *pTempdst = *pTempsrc1;
  18867. else
  18868. *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) -
  18869. (mng_int32)(*pTempsrc1) ) + iM) /
  18870. (iM * 2) ) + (mng_int32)(*pTempsrc1) );
  18871. pTempdst++;
  18872. pTempsrc1++;
  18873. pTempsrc2++;
  18874. if (*pTempsrc1 == *pTempsrc2)
  18875. *pTempdst = *pTempsrc1;
  18876. else
  18877. *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) -
  18878. (mng_int32)(*pTempsrc1) ) + iM) /
  18879. (iM * 2) ) + (mng_int32)(*pTempsrc1) );
  18880. pTempdst++;
  18881. pTempsrc1 += 2;
  18882. pTempsrc2++;
  18883. *pTempdst++ = *pTempsrc2++; /* replicate alpha from bottom */
  18884. }
  18885. }
  18886. }
  18887. else
  18888. { /* just repeat the entire line */
  18889. MNG_COPY (pTempdst, pTempsrc1, iWidth << 2);
  18890. }
  18891. #ifdef MNG_SUPPORT_TRACE
  18892. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_Y4, MNG_LC_END);
  18893. #endif
  18894. return MNG_NOERROR;
  18895. }
  18896. /* ************************************************************************** */
  18897. mng_retcode mng_magnify_rgba8_y5 (mng_datap pData,
  18898. mng_int32 iS,
  18899. mng_int32 iM,
  18900. mng_uint32 iWidth,
  18901. mng_uint8p pSrcline1,
  18902. mng_uint8p pSrcline2,
  18903. mng_uint8p pDstline)
  18904. {
  18905. mng_uint32 iX;
  18906. mng_uint8p pTempsrc1;
  18907. mng_uint8p pTempsrc2;
  18908. mng_uint8p pTempdst;
  18909. #ifdef MNG_SUPPORT_TRACE
  18910. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_Y5, MNG_LC_START);
  18911. #endif
  18912. pTempsrc1 = pSrcline1; /* initialize pixel-loop */
  18913. pTempsrc2 = pSrcline2;
  18914. pTempdst = pDstline;
  18915. if (pTempsrc2) /* do we have a second line ? */
  18916. {
  18917. if (iS < (iM+1) / 2) /* top half ? */
  18918. {
  18919. for (iX = 0; iX < iWidth; iX++)
  18920. {
  18921. *pTempdst++ = *pTempsrc1++; /* replicate color from top */
  18922. *pTempdst++ = *pTempsrc1++;
  18923. *pTempdst++ = *pTempsrc1++;
  18924. pTempsrc2 += 3;
  18925. if (*pTempsrc1 == *pTempsrc2) /* calculate the distances */
  18926. *pTempdst = *pTempsrc1;
  18927. else
  18928. *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) -
  18929. (mng_int32)(*pTempsrc1) ) + iM) /
  18930. (iM * 2) ) + (mng_int32)(*pTempsrc1) );
  18931. pTempdst++;
  18932. pTempsrc1++;
  18933. pTempsrc2++;
  18934. }
  18935. }
  18936. else
  18937. {
  18938. for (iX = 0; iX < iWidth; iX++)
  18939. {
  18940. *pTempdst++ = *pTempsrc2++; /* replicate color from bottom */
  18941. *pTempdst++ = *pTempsrc2++;
  18942. *pTempdst++ = *pTempsrc2++;
  18943. pTempsrc1 += 3;
  18944. if (*pTempsrc1 == *pTempsrc2) /* calculate the distances */
  18945. *pTempdst = *pTempsrc1;
  18946. else
  18947. *pTempdst = (mng_uint8)( ( (2 * iS * ( (mng_int32)(*pTempsrc2) -
  18948. (mng_int32)(*pTempsrc1) ) + iM) /
  18949. (iM * 2) ) + (mng_int32)(*pTempsrc1) );
  18950. pTempdst++;
  18951. pTempsrc1++;
  18952. pTempsrc2++;
  18953. }
  18954. }
  18955. }
  18956. else
  18957. { /* just repeat the entire line */
  18958. MNG_COPY (pTempdst, pTempsrc1, iWidth << 2);
  18959. }
  18960. #ifdef MNG_SUPPORT_TRACE
  18961. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA8_Y5, MNG_LC_END);
  18962. #endif
  18963. return MNG_NOERROR;
  18964. }
  18965. /* ************************************************************************** */
  18966. #ifndef MNG_OPTIMIZE_FOOTPRINT_MAGN
  18967. #ifndef MNG_NO_16BIT_SUPPORT
  18968. #ifndef MNG_NO_GRAY_SUPPORT
  18969. mng_retcode mng_magnify_g16_x1 (mng_datap pData,
  18970. mng_uint16 iMX,
  18971. mng_uint16 iML,
  18972. mng_uint16 iMR,
  18973. mng_uint32 iWidth,
  18974. mng_uint8p pSrcline,
  18975. mng_uint8p pDstline)
  18976. {
  18977. mng_uint32 iX, iS, iM;
  18978. mng_uint16p pTempsrc1;
  18979. mng_uint16p pTempdst;
  18980. #ifdef MNG_SUPPORT_TRACE
  18981. MNG_TRACE (pData, MNG_FN_MAGNIFY_G16_X1, MNG_LC_START);
  18982. #endif
  18983. pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */
  18984. pTempdst = (mng_uint16p)pDstline;
  18985. for (iX = 0; iX < iWidth; iX++)
  18986. {
  18987. *pTempdst = *pTempsrc1; /* copy original source pixel */
  18988. pTempdst++;
  18989. if (iX == 0) /* first interval ? */
  18990. iM = iML;
  18991. else
  18992. if (iX == (iWidth - 1)) /* last interval ? */
  18993. iM = iMR;
  18994. else
  18995. iM = iMX;
  18996. for (iS = 1; iS < iM; iS++) /* fill interval */
  18997. {
  18998. *pTempdst = *pTempsrc1; /* copy original source pixel */
  18999. pTempdst++;
  19000. }
  19001. pTempsrc1++;
  19002. }
  19003. #ifdef MNG_SUPPORT_TRACE
  19004. MNG_TRACE (pData, MNG_FN_MAGNIFY_G16_X1, MNG_LC_END);
  19005. #endif
  19006. return MNG_NOERROR;
  19007. }
  19008. /* ************************************************************************** */
  19009. mng_retcode mng_magnify_g16_x2 (mng_datap pData,
  19010. mng_uint16 iMX,
  19011. mng_uint16 iML,
  19012. mng_uint16 iMR,
  19013. mng_uint32 iWidth,
  19014. mng_uint8p pSrcline,
  19015. mng_uint8p pDstline)
  19016. {
  19017. mng_uint32 iX;
  19018. mng_int32 iS, iM;
  19019. mng_uint16p pTempsrc1;
  19020. mng_uint16p pTempsrc2;
  19021. mng_uint16p pTempdst;
  19022. #ifdef MNG_SUPPORT_TRACE
  19023. MNG_TRACE (pData, MNG_FN_MAGNIFY_G16_X2, MNG_LC_START);
  19024. #endif
  19025. pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */
  19026. pTempdst = (mng_uint16p)pDstline;
  19027. for (iX = 0; iX < iWidth; iX++)
  19028. {
  19029. pTempsrc2 = pTempsrc1 + 1;
  19030. *pTempdst = *pTempsrc1; /* copy original source pixel */
  19031. pTempdst++;
  19032. if (iX == 0) /* first interval ? */
  19033. {
  19034. if (iWidth == 1) /* single pixel ? */
  19035. pTempsrc2 = MNG_NULL;
  19036. iM = iML;
  19037. }
  19038. else
  19039. if (iX == (iWidth - 2)) /* last interval ? */
  19040. iM = iMR;
  19041. else
  19042. iM = iMX;
  19043. /* fill interval ? */
  19044. if ((iX < iWidth - 1) || (iWidth == 1))
  19045. {
  19046. if (pTempsrc2) /* do we have the second pixel ? */
  19047. { /* is it same as first ? */
  19048. if (*pTempsrc1 == *pTempsrc2)
  19049. {
  19050. for (iS = 1; iS < iM; iS++) /* then just repeat the first */
  19051. {
  19052. *pTempdst = *pTempsrc1;
  19053. pTempdst++;
  19054. }
  19055. }
  19056. else
  19057. {
  19058. for (iS = 1; iS < iM; iS++) /* calculate the distances */
  19059. {
  19060. mng_put_uint16 ((mng_uint8p)pTempdst,
  19061. (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  19062. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  19063. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ));
  19064. pTempdst++;
  19065. }
  19066. }
  19067. }
  19068. else
  19069. {
  19070. for (iS = 1; iS < iM; iS++)
  19071. {
  19072. *pTempdst = *pTempsrc1; /* repeat first source pixel */
  19073. pTempdst++;
  19074. }
  19075. }
  19076. }
  19077. pTempsrc1++;
  19078. }
  19079. #ifdef MNG_SUPPORT_TRACE
  19080. MNG_TRACE (pData, MNG_FN_MAGNIFY_G16_X2, MNG_LC_END);
  19081. #endif
  19082. return MNG_NOERROR;
  19083. }
  19084. /* ************************************************************************** */
  19085. mng_retcode mng_magnify_g16_x3 (mng_datap pData,
  19086. mng_uint16 iMX,
  19087. mng_uint16 iML,
  19088. mng_uint16 iMR,
  19089. mng_uint32 iWidth,
  19090. mng_uint8p pSrcline,
  19091. mng_uint8p pDstline)
  19092. {
  19093. mng_uint32 iX;
  19094. mng_int32 iS, iM, iH;
  19095. mng_uint16p pTempsrc1;
  19096. mng_uint16p pTempsrc2;
  19097. mng_uint16p pTempdst;
  19098. #ifdef MNG_SUPPORT_TRACE
  19099. MNG_TRACE (pData, MNG_FN_MAGNIFY_G16_X3, MNG_LC_START);
  19100. #endif
  19101. pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */
  19102. pTempdst = (mng_uint16p)pDstline;
  19103. for (iX = 0; iX < iWidth; iX++)
  19104. {
  19105. pTempsrc2 = pTempsrc1 + 1;
  19106. *pTempdst = *pTempsrc1; /* copy original source pixel */
  19107. pTempdst++;
  19108. if (iX == 0) /* first interval ? */
  19109. {
  19110. if (iWidth == 1) /* single pixel ? */
  19111. pTempsrc2 = MNG_NULL;
  19112. iM = iML;
  19113. }
  19114. else
  19115. if (iX == (iWidth - 2)) /* last interval ? */
  19116. iM = iMR;
  19117. else
  19118. iM = iMX;
  19119. /* fill interval ? */
  19120. if ((iX < iWidth - 1) || (iWidth == 1))
  19121. {
  19122. if (pTempsrc2) /* do we have the second pixel ? */
  19123. { /* is it same as first ? */
  19124. if (*pTempsrc1 == *pTempsrc2)
  19125. {
  19126. for (iS = 1; iS < iM; iS++) /* then just repeat the first */
  19127. {
  19128. *pTempdst = *pTempsrc1;
  19129. pTempdst++;
  19130. }
  19131. }
  19132. else
  19133. {
  19134. iH = (iM+1) / 2; /* calculate halfway point */
  19135. for (iS = 1; iS < iH; iS++) /* replicate first half */
  19136. {
  19137. *pTempdst = *pTempsrc1;
  19138. pTempdst++;
  19139. }
  19140. for (iS = iH; iS < iM; iS++) /* replicate second half */
  19141. {
  19142. *pTempdst = *pTempsrc2;
  19143. pTempdst++;
  19144. }
  19145. }
  19146. }
  19147. else
  19148. {
  19149. for (iS = 1; iS < iM; iS++)
  19150. {
  19151. *pTempdst = *pTempsrc1; /* repeat first source pixel */
  19152. pTempdst++;
  19153. }
  19154. }
  19155. }
  19156. pTempsrc1++;
  19157. }
  19158. #ifdef MNG_SUPPORT_TRACE
  19159. MNG_TRACE (pData, MNG_FN_MAGNIFY_G16_X3, MNG_LC_END);
  19160. #endif
  19161. return MNG_NOERROR;
  19162. }
  19163. #endif /* MNG_NO_GRAY_SUPPORT */
  19164. /* ************************************************************************** */
  19165. mng_retcode mng_magnify_rgb16_x1 (mng_datap pData,
  19166. mng_uint16 iMX,
  19167. mng_uint16 iML,
  19168. mng_uint16 iMR,
  19169. mng_uint32 iWidth,
  19170. mng_uint8p pSrcline,
  19171. mng_uint8p pDstline)
  19172. {
  19173. mng_uint32 iX, iS, iM;
  19174. mng_uint16p pTempsrc1;
  19175. mng_uint16p pTempdst;
  19176. #ifdef MNG_SUPPORT_TRACE
  19177. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB16_X1, MNG_LC_START);
  19178. #endif
  19179. pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */
  19180. pTempdst = (mng_uint16p)pDstline;
  19181. for (iX = 0; iX < iWidth; iX++)
  19182. {
  19183. *pTempdst = *pTempsrc1; /* copy original source pixel */
  19184. pTempdst++;
  19185. *pTempdst = *(pTempsrc1+1);
  19186. pTempdst++;
  19187. *pTempdst = *(pTempsrc1+2);
  19188. pTempdst++;
  19189. if (iX == 0) /* first interval ? */
  19190. iM = iML;
  19191. else
  19192. if (iX == (iWidth - 1)) /* last interval ? */
  19193. iM = iMR;
  19194. else
  19195. iM = iMX;
  19196. for (iS = 1; iS < iM; iS++) /* fill interval */
  19197. {
  19198. *pTempdst = *pTempsrc1; /* copy original source pixel */
  19199. pTempdst++;
  19200. *pTempdst = *(pTempsrc1+1);
  19201. pTempdst++;
  19202. *pTempdst = *(pTempsrc1+2);
  19203. pTempdst++;
  19204. }
  19205. pTempsrc1 += 3;
  19206. }
  19207. #ifdef MNG_SUPPORT_TRACE
  19208. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB16_X1, MNG_LC_END);
  19209. #endif
  19210. return MNG_NOERROR;
  19211. }
  19212. /* ************************************************************************** */
  19213. mng_retcode mng_magnify_rgb16_x2 (mng_datap pData,
  19214. mng_uint16 iMX,
  19215. mng_uint16 iML,
  19216. mng_uint16 iMR,
  19217. mng_uint32 iWidth,
  19218. mng_uint8p pSrcline,
  19219. mng_uint8p pDstline)
  19220. {
  19221. mng_uint32 iX;
  19222. mng_int32 iS, iM;
  19223. mng_uint16p pTempsrc1;
  19224. mng_uint16p pTempsrc2;
  19225. mng_uint16p pTempdst;
  19226. #ifdef MNG_SUPPORT_TRACE
  19227. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB16_X2, MNG_LC_START);
  19228. #endif
  19229. pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */
  19230. pTempdst = (mng_uint16p)pDstline;
  19231. for (iX = 0; iX < iWidth; iX++)
  19232. {
  19233. pTempsrc2 = pTempsrc1 + 3;
  19234. *pTempdst = *pTempsrc1; /* copy original source pixel */
  19235. pTempdst++;
  19236. *pTempdst = *(pTempsrc1+1);
  19237. pTempdst++;
  19238. *pTempdst = *(pTempsrc1+2);
  19239. pTempdst++;
  19240. if (iX == 0) /* first interval ? */
  19241. {
  19242. if (iWidth == 1) /* single pixel ? */
  19243. pTempsrc2 = MNG_NULL;
  19244. iM = (mng_int32)iML;
  19245. }
  19246. else
  19247. if (iX == (iWidth - 2)) /* last interval ? */
  19248. iM = (mng_int32)iMR;
  19249. else
  19250. iM = (mng_int32)iMX;
  19251. /* fill interval ? */
  19252. if ((iX < iWidth - 1) || (iWidth == 1))
  19253. {
  19254. if (pTempsrc2) /* do we have the second pixel ? */
  19255. {
  19256. for (iS = 1; iS < iM; iS++)
  19257. {
  19258. if (*pTempsrc1 == *pTempsrc2)
  19259. *pTempdst = *pTempsrc1; /* just repeat the first */
  19260. else /* calculate the distance */
  19261. mng_put_uint16 ((mng_uint8p)pTempdst,
  19262. (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  19263. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  19264. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  19265. pTempdst++;
  19266. if (*(pTempsrc1+1) == *(pTempsrc2+1))
  19267. *pTempdst = *(pTempsrc1+1);
  19268. else
  19269. mng_put_uint16 ((mng_uint8p)pTempdst,
  19270. (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+1))) -
  19271. (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) + iM) /
  19272. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) );
  19273. pTempdst++;
  19274. if (*(pTempsrc1+2) == *(pTempsrc2+2))
  19275. *pTempdst = *(pTempsrc1+2);
  19276. else
  19277. mng_put_uint16 ((mng_uint8p)pTempdst,
  19278. (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+2))) -
  19279. (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+2))) ) + iM) /
  19280. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+2))) ) );
  19281. pTempdst++;
  19282. }
  19283. }
  19284. else
  19285. {
  19286. for (iS = 1; iS < iM; iS++)
  19287. {
  19288. *pTempdst = *pTempsrc1; /* repeat first source pixel */
  19289. pTempdst++;
  19290. *pTempdst = *(pTempsrc1+1);
  19291. pTempdst++;
  19292. *pTempdst = *(pTempsrc1+2);
  19293. pTempdst++;
  19294. }
  19295. }
  19296. }
  19297. pTempsrc1 += 3;
  19298. }
  19299. #ifdef MNG_SUPPORT_TRACE
  19300. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB16_X2, MNG_LC_END);
  19301. #endif
  19302. return MNG_NOERROR;
  19303. }
  19304. /* ************************************************************************** */
  19305. mng_retcode mng_magnify_rgb16_x3 (mng_datap pData,
  19306. mng_uint16 iMX,
  19307. mng_uint16 iML,
  19308. mng_uint16 iMR,
  19309. mng_uint32 iWidth,
  19310. mng_uint8p pSrcline,
  19311. mng_uint8p pDstline)
  19312. {
  19313. mng_uint32 iX;
  19314. mng_int32 iS, iM, iH;
  19315. mng_uint16p pTempsrc1;
  19316. mng_uint16p pTempsrc2;
  19317. mng_uint16p pTempdst;
  19318. #ifdef MNG_SUPPORT_TRACE
  19319. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB16_X3, MNG_LC_START);
  19320. #endif
  19321. pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */
  19322. pTempdst = (mng_uint16p)pDstline;
  19323. for (iX = 0; iX < iWidth; iX++)
  19324. {
  19325. pTempsrc2 = pTempsrc1 + 3;
  19326. *pTempdst = *pTempsrc1; /* copy original source pixel */
  19327. pTempdst++;
  19328. *pTempdst = *(pTempsrc1+1);
  19329. pTempdst++;
  19330. *pTempdst = *(pTempsrc1+2);
  19331. pTempdst++;
  19332. if (iX == 0) /* first interval ? */
  19333. {
  19334. if (iWidth == 1) /* single pixel ? */
  19335. pTempsrc2 = MNG_NULL;
  19336. iM = (mng_int32)iML;
  19337. }
  19338. else
  19339. if (iX == (iWidth - 2)) /* last interval ? */
  19340. iM = (mng_int32)iMR;
  19341. else
  19342. iM = (mng_int32)iMX;
  19343. /* fill interval ? */
  19344. if ((iX < iWidth - 1) || (iWidth == 1))
  19345. {
  19346. if (pTempsrc2) /* do we have the second pixel ? */
  19347. {
  19348. iH = (iM+1) / 2; /* calculate halfway point */
  19349. for (iS = 1; iS < iH; iS++) /* replicate first half */
  19350. {
  19351. *pTempdst = *pTempsrc1;
  19352. *(pTempdst+1) = *(pTempsrc1+1);
  19353. *(pTempdst+2) = *(pTempsrc1+2);
  19354. pTempdst += 3;
  19355. }
  19356. for (iS = iH; iS < iM; iS++) /* replicate second half */
  19357. {
  19358. *pTempdst = *pTempsrc2;
  19359. *(pTempdst+1) = *(pTempsrc2+1);
  19360. *(pTempdst+2) = *(pTempsrc2+2);
  19361. pTempdst += 3;
  19362. }
  19363. }
  19364. else
  19365. {
  19366. for (iS = 1; iS < iM; iS++)
  19367. {
  19368. *pTempdst = *pTempsrc1; /* repeat first source pixel */
  19369. pTempdst++;
  19370. *pTempdst = *(pTempsrc1+1);
  19371. pTempdst++;
  19372. *pTempdst = *(pTempsrc1+2);
  19373. pTempdst++;
  19374. }
  19375. }
  19376. }
  19377. pTempsrc1 += 3;
  19378. }
  19379. #ifdef MNG_SUPPORT_TRACE
  19380. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB16_X3, MNG_LC_END);
  19381. #endif
  19382. return MNG_NOERROR;
  19383. }
  19384. /* ************************************************************************** */
  19385. #ifndef MNG_NO_GRAY_SUPPORT
  19386. mng_retcode mng_magnify_ga16_x1 (mng_datap pData,
  19387. mng_uint16 iMX,
  19388. mng_uint16 iML,
  19389. mng_uint16 iMR,
  19390. mng_uint32 iWidth,
  19391. mng_uint8p pSrcline,
  19392. mng_uint8p pDstline)
  19393. {
  19394. mng_uint32 iX, iS, iM;
  19395. mng_uint16p pTempsrc1;
  19396. mng_uint16p pTempdst;
  19397. #ifdef MNG_SUPPORT_TRACE
  19398. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_X1, MNG_LC_START);
  19399. #endif
  19400. pTempsrc1 = (mng_uint16p) pSrcline; /* initialize pixel-loop */
  19401. pTempdst = (mng_uint16p)pDstline;
  19402. for (iX = 0; iX < iWidth; iX++)
  19403. {
  19404. *pTempdst = *pTempsrc1; /* copy original source pixel */
  19405. pTempdst++;
  19406. *pTempdst = *(pTempsrc1+1);
  19407. pTempdst++;
  19408. if (iX == 0) /* first interval ? */
  19409. iM = iML;
  19410. else
  19411. if (iX == (iWidth - 1)) /* last interval ? */
  19412. iM = iMR;
  19413. else
  19414. iM = iMX;
  19415. for (iS = 1; iS < iM; iS++) /* fill interval */
  19416. {
  19417. *pTempdst = *pTempsrc1; /* copy original source pixel */
  19418. pTempdst++;
  19419. *pTempdst = *(pTempsrc1+1);
  19420. pTempdst++;
  19421. }
  19422. pTempsrc1 += 2;
  19423. }
  19424. #ifdef MNG_SUPPORT_TRACE
  19425. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_X1, MNG_LC_END);
  19426. #endif
  19427. return MNG_NOERROR;
  19428. }
  19429. /* ************************************************************************** */
  19430. mng_retcode mng_magnify_ga16_x2 (mng_datap pData,
  19431. mng_uint16 iMX,
  19432. mng_uint16 iML,
  19433. mng_uint16 iMR,
  19434. mng_uint32 iWidth,
  19435. mng_uint8p pSrcline,
  19436. mng_uint8p pDstline)
  19437. {
  19438. mng_uint32 iX;
  19439. mng_int32 iS, iM;
  19440. mng_uint16p pTempsrc1;
  19441. mng_uint16p pTempsrc2;
  19442. mng_uint16p pTempdst;
  19443. #ifdef MNG_SUPPORT_TRACE
  19444. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_X2, MNG_LC_START);
  19445. #endif
  19446. pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */
  19447. pTempdst = (mng_uint16p)pDstline;
  19448. for (iX = 0; iX < iWidth; iX++)
  19449. {
  19450. pTempsrc2 = pTempsrc1 + 2;
  19451. *pTempdst = *pTempsrc1; /* copy original source pixel */
  19452. pTempdst++;
  19453. *pTempdst = *(pTempsrc1+1);
  19454. pTempdst++;
  19455. if (iX == 0) /* first interval ? */
  19456. {
  19457. if (iWidth == 1) /* single pixel ? */
  19458. pTempsrc2 = MNG_NULL;
  19459. iM = iML;
  19460. }
  19461. else
  19462. if (iX == (iWidth - 2)) /* last interval ? */
  19463. iM = iMR;
  19464. else
  19465. iM = iMX;
  19466. /* fill interval ? */
  19467. if ((iX < iWidth - 1) || (iWidth == 1))
  19468. {
  19469. if (pTempsrc2) /* do we have the second pixel ? */
  19470. {
  19471. for (iS = 1; iS < iM; iS++)
  19472. {
  19473. if (*pTempsrc1 == *pTempsrc2)
  19474. *pTempdst = *pTempsrc1; /* just repeat the first */
  19475. else /* calculate the distance */
  19476. mng_put_uint16 ((mng_uint8p)pTempdst,
  19477. (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  19478. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  19479. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  19480. pTempdst++;
  19481. if (*(pTempsrc1+1) == *(pTempsrc2+1))
  19482. *pTempdst = *(pTempsrc1+1);
  19483. else
  19484. mng_put_uint16 ((mng_uint8p)pTempdst,
  19485. (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+1))) -
  19486. (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) + iM) /
  19487. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) );
  19488. pTempdst++;
  19489. }
  19490. }
  19491. else
  19492. {
  19493. for (iS = 1; iS < iM; iS++)
  19494. {
  19495. *pTempdst = *pTempsrc1; /* repeat first source pixel */
  19496. pTempdst++;
  19497. *pTempdst = *(pTempsrc1+1);
  19498. pTempdst++;
  19499. }
  19500. }
  19501. }
  19502. pTempsrc1 += 2;
  19503. }
  19504. #ifdef MNG_SUPPORT_TRACE
  19505. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_X2, MNG_LC_END);
  19506. #endif
  19507. return MNG_NOERROR;
  19508. }
  19509. /* ************************************************************************** */
  19510. mng_retcode mng_magnify_ga16_x3 (mng_datap pData,
  19511. mng_uint16 iMX,
  19512. mng_uint16 iML,
  19513. mng_uint16 iMR,
  19514. mng_uint32 iWidth,
  19515. mng_uint8p pSrcline,
  19516. mng_uint8p pDstline)
  19517. {
  19518. mng_uint32 iX;
  19519. mng_int32 iS, iM, iH;
  19520. mng_uint16p pTempsrc1;
  19521. mng_uint16p pTempsrc2;
  19522. mng_uint16p pTempdst;
  19523. #ifdef MNG_SUPPORT_TRACE
  19524. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_X3, MNG_LC_START);
  19525. #endif
  19526. pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */
  19527. pTempdst = (mng_uint16p)pDstline;
  19528. for (iX = 0; iX < iWidth; iX++)
  19529. {
  19530. pTempsrc2 = pTempsrc1 + 2;
  19531. *pTempdst = *pTempsrc1; /* copy original source pixel */
  19532. pTempdst++;
  19533. *pTempdst = *(pTempsrc1+1);
  19534. pTempdst++;
  19535. if (iX == 0) /* first interval ? */
  19536. {
  19537. if (iWidth == 1) /* single pixel ? */
  19538. pTempsrc2 = MNG_NULL;
  19539. iM = iML;
  19540. }
  19541. else
  19542. if (iX == (iWidth - 2)) /* last interval ? */
  19543. iM = iMR;
  19544. else
  19545. iM = iMX;
  19546. /* fill interval ? */
  19547. if ((iX < iWidth - 1) || (iWidth == 1))
  19548. {
  19549. if (pTempsrc2) /* do we have the second pixel ? */
  19550. {
  19551. iH = (iM+1) / 2; /* calculate halfway point */
  19552. for (iS = 1; iS < iH; iS++) /* replicate first half */
  19553. {
  19554. *pTempdst = *pTempsrc1;
  19555. *(pTempdst+1) = *(pTempsrc1+1);
  19556. pTempdst += 2;
  19557. }
  19558. for (iS = iH; iS < iM; iS++) /* replicate second half */
  19559. {
  19560. *pTempdst = *pTempsrc2;
  19561. *(pTempdst+1) = *(pTempsrc2+1);
  19562. pTempdst += 2;
  19563. }
  19564. }
  19565. else
  19566. {
  19567. for (iS = 1; iS < iM; iS++)
  19568. {
  19569. *pTempdst = *pTempsrc1; /* repeat first source pixel */
  19570. pTempdst++;
  19571. *pTempdst = *(pTempsrc1+1);
  19572. pTempdst++;
  19573. }
  19574. }
  19575. }
  19576. pTempsrc1 += 2;
  19577. }
  19578. #ifdef MNG_SUPPORT_TRACE
  19579. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_X3, MNG_LC_END);
  19580. #endif
  19581. return MNG_NOERROR;
  19582. }
  19583. /* ************************************************************************** */
  19584. mng_retcode mng_magnify_ga16_x4 (mng_datap pData,
  19585. mng_uint16 iMX,
  19586. mng_uint16 iML,
  19587. mng_uint16 iMR,
  19588. mng_uint32 iWidth,
  19589. mng_uint8p pSrcline,
  19590. mng_uint8p pDstline)
  19591. {
  19592. mng_uint32 iX;
  19593. mng_int32 iS, iM, iH;
  19594. mng_uint16p pTempsrc1;
  19595. mng_uint16p pTempsrc2;
  19596. mng_uint16p pTempdst;
  19597. #ifdef MNG_SUPPORT_TRACE
  19598. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_X4, MNG_LC_START);
  19599. #endif
  19600. pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */
  19601. pTempdst = (mng_uint16p)pDstline;
  19602. for (iX = 0; iX < iWidth; iX++)
  19603. {
  19604. pTempsrc2 = pTempsrc1 + 2;
  19605. *pTempdst = *pTempsrc1; /* copy original source pixel */
  19606. pTempdst++;
  19607. *pTempdst = *(pTempsrc1+1);
  19608. pTempdst++;
  19609. if (iX == 0) /* first interval ? */
  19610. {
  19611. if (iWidth == 1) /* single pixel ? */
  19612. pTempsrc2 = MNG_NULL;
  19613. iM = iML;
  19614. }
  19615. else
  19616. if (iX == (iWidth - 2)) /* last interval ? */
  19617. iM = iMR;
  19618. else
  19619. iM = iMX;
  19620. /* fill interval ? */
  19621. if ((iX < iWidth - 1) || (iWidth == 1))
  19622. {
  19623. if (pTempsrc2) /* do we have the second pixel ? */
  19624. {
  19625. iH = (iM+1) / 2; /* calculate halfway point */
  19626. for (iS = 1; iS < iH; iS++) /* first half */
  19627. {
  19628. if (*pTempsrc1 == *pTempsrc2)
  19629. *pTempdst = *pTempsrc1; /* just repeat the first */
  19630. else /* calculate the distance */
  19631. mng_put_uint16 ((mng_uint8p)pTempdst,
  19632. (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  19633. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  19634. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  19635. pTempdst++;
  19636. *pTempdst = *(pTempsrc1+1); /* replicate alpha from left */
  19637. pTempdst++;
  19638. }
  19639. for (iS = iH; iS < iM; iS++) /* second half */
  19640. {
  19641. if (*pTempsrc1 == *pTempsrc2)
  19642. *pTempdst = *pTempsrc1; /* just repeat the first */
  19643. else /* calculate the distance */
  19644. mng_put_uint16 ((mng_uint8p)pTempdst,
  19645. (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  19646. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  19647. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  19648. pTempdst++;
  19649. *pTempdst = *(pTempsrc2+1); /* replicate alpha from right */
  19650. pTempdst++;
  19651. }
  19652. }
  19653. else
  19654. {
  19655. for (iS = 1; iS < iM; iS++)
  19656. {
  19657. *pTempdst = *pTempsrc1; /* repeat first source pixel */
  19658. pTempdst++;
  19659. *pTempdst = *(pTempsrc1+1);
  19660. pTempdst++;
  19661. }
  19662. }
  19663. }
  19664. pTempsrc1 += 2;
  19665. }
  19666. #ifdef MNG_SUPPORT_TRACE
  19667. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_X4, MNG_LC_END);
  19668. #endif
  19669. return MNG_NOERROR;
  19670. }
  19671. /* ************************************************************************** */
  19672. mng_retcode mng_magnify_ga16_x5 (mng_datap pData,
  19673. mng_uint16 iMX,
  19674. mng_uint16 iML,
  19675. mng_uint16 iMR,
  19676. mng_uint32 iWidth,
  19677. mng_uint8p pSrcline,
  19678. mng_uint8p pDstline)
  19679. {
  19680. mng_uint32 iX;
  19681. mng_int32 iS, iM, iH;
  19682. mng_uint16p pTempsrc1;
  19683. mng_uint16p pTempsrc2;
  19684. mng_uint16p pTempdst;
  19685. #ifdef MNG_SUPPORT_TRACE
  19686. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_X5, MNG_LC_START);
  19687. #endif
  19688. pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */
  19689. pTempdst = (mng_uint16p)pDstline;
  19690. for (iX = 0; iX < iWidth; iX++)
  19691. {
  19692. pTempsrc2 = pTempsrc1 + 2;
  19693. *pTempdst = *pTempsrc1; /* copy original source pixel */
  19694. pTempdst++;
  19695. *pTempdst = *(pTempsrc1+1);
  19696. pTempdst++;
  19697. if (iX == 0) /* first interval ? */
  19698. {
  19699. if (iWidth == 1) /* single pixel ? */
  19700. pTempsrc2 = MNG_NULL;
  19701. iM = iML;
  19702. }
  19703. else
  19704. if (iX == (iWidth - 2)) /* last interval ? */
  19705. iM = iMR;
  19706. else
  19707. iM = iMX;
  19708. /* fill interval ? */
  19709. if ((iX < iWidth - 1) || (iWidth == 1))
  19710. {
  19711. if (pTempsrc2) /* do we have the second pixel ? */
  19712. {
  19713. iH = (iM+1) / 2; /* calculate halfway point */
  19714. for (iS = 1; iS < iH; iS++) /* first half */
  19715. {
  19716. *pTempdst = *pTempsrc1; /* replicate gray from left */
  19717. pTempdst++;
  19718. if (*(pTempsrc1+1) == *(pTempsrc2+1))
  19719. *pTempdst = *(pTempsrc1+1);/* just repeat the first */
  19720. else /* calculate the distance */
  19721. mng_put_uint16 ((mng_uint8p)pTempdst,
  19722. (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+1))) -
  19723. (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) + iM) /
  19724. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) );
  19725. pTempdst++;
  19726. }
  19727. for (iS = iH; iS < iM; iS++) /* second half */
  19728. {
  19729. *pTempdst = *pTempsrc2; /* replicate gray from right */
  19730. pTempdst++;
  19731. if (*(pTempsrc1+1) == *(pTempsrc2+1))
  19732. *pTempdst = *(pTempsrc1+1);/* just repeat the first */
  19733. else /* calculate the distance */
  19734. mng_put_uint16 ((mng_uint8p)pTempdst,
  19735. (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+1))) -
  19736. (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) + iM) /
  19737. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) );
  19738. pTempdst++;
  19739. }
  19740. }
  19741. else
  19742. {
  19743. for (iS = 1; iS < iM; iS++)
  19744. {
  19745. *pTempdst = *pTempsrc1; /* repeat first source pixel */
  19746. pTempdst++;
  19747. *pTempdst = *(pTempsrc1+1);
  19748. pTempdst++;
  19749. }
  19750. }
  19751. }
  19752. pTempsrc1 += 2;
  19753. }
  19754. #ifdef MNG_SUPPORT_TRACE
  19755. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_X5, MNG_LC_END);
  19756. #endif
  19757. return MNG_NOERROR;
  19758. }
  19759. #endif /* MNG_NO_GRAY_SUPPORT */
  19760. /* ************************************************************************** */
  19761. mng_retcode mng_magnify_rgba16_x1 (mng_datap pData,
  19762. mng_uint16 iMX,
  19763. mng_uint16 iML,
  19764. mng_uint16 iMR,
  19765. mng_uint32 iWidth,
  19766. mng_uint8p pSrcline,
  19767. mng_uint8p pDstline)
  19768. {
  19769. mng_uint32 iX, iS, iM;
  19770. mng_uint16p pTempsrc1;
  19771. mng_uint16p pTempdst;
  19772. #ifdef MNG_SUPPORT_TRACE
  19773. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_X1, MNG_LC_START);
  19774. #endif
  19775. pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */
  19776. pTempdst = (mng_uint16p)pDstline;
  19777. for (iX = 0; iX < iWidth; iX++)
  19778. {
  19779. *pTempdst = *pTempsrc1; /* copy original source pixel */
  19780. pTempdst++;
  19781. *pTempdst = *(pTempsrc1+1);
  19782. pTempdst++;
  19783. *pTempdst = *(pTempsrc1+2);
  19784. pTempdst++;
  19785. *pTempdst = *(pTempsrc1+3);
  19786. pTempdst++;
  19787. if (iX == 0) /* first interval ? */
  19788. iM = iML;
  19789. else
  19790. if (iX == (iWidth - 1)) /* last interval ? */
  19791. iM = iMR;
  19792. else
  19793. iM = iMX;
  19794. for (iS = 1; iS < iM; iS++) /* fill interval */
  19795. {
  19796. *pTempdst = *pTempsrc1; /* copy original source pixel */
  19797. pTempdst++;
  19798. *pTempdst = *(pTempsrc1+1);
  19799. pTempdst++;
  19800. *pTempdst = *(pTempsrc1+2);
  19801. pTempdst++;
  19802. *pTempdst = *(pTempsrc1+3);
  19803. pTempdst++;
  19804. }
  19805. pTempsrc1 += 4;
  19806. }
  19807. #ifdef MNG_SUPPORT_TRACE
  19808. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_X1, MNG_LC_END);
  19809. #endif
  19810. return MNG_NOERROR;
  19811. }
  19812. /* ************************************************************************** */
  19813. mng_retcode mng_magnify_rgba16_x2 (mng_datap pData,
  19814. mng_uint16 iMX,
  19815. mng_uint16 iML,
  19816. mng_uint16 iMR,
  19817. mng_uint32 iWidth,
  19818. mng_uint8p pSrcline,
  19819. mng_uint8p pDstline)
  19820. {
  19821. mng_uint32 iX;
  19822. mng_int32 iS, iM;
  19823. mng_uint16p pTempsrc1;
  19824. mng_uint16p pTempsrc2;
  19825. mng_uint16p pTempdst;
  19826. #ifdef MNG_SUPPORT_TRACE
  19827. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_X2, MNG_LC_START);
  19828. #endif
  19829. pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */
  19830. pTempdst = (mng_uint16p)pDstline;
  19831. for (iX = 0; iX < iWidth; iX++)
  19832. {
  19833. pTempsrc2 = pTempsrc1 + 4;
  19834. *pTempdst = *pTempsrc1; /* copy original source pixel */
  19835. pTempdst++;
  19836. *pTempdst = *(pTempsrc1+1);
  19837. pTempdst++;
  19838. *pTempdst = *(pTempsrc1+2);
  19839. pTempdst++;
  19840. *pTempdst = *(pTempsrc1+3);
  19841. pTempdst++;
  19842. if (iX == 0) /* first interval ? */
  19843. {
  19844. if (iWidth == 1) /* single pixel ? */
  19845. pTempsrc2 = MNG_NULL;
  19846. iM = (mng_int32)iML;
  19847. }
  19848. else
  19849. if (iX == (iWidth - 2)) /* last interval ? */
  19850. iM = (mng_int32)iMR;
  19851. else
  19852. iM = (mng_int32)iMX;
  19853. /* fill interval ? */
  19854. if ((iX < iWidth - 1) || (iWidth == 1))
  19855. {
  19856. if (pTempsrc2) /* do we have the second pixel ? */
  19857. {
  19858. for (iS = 1; iS < iM; iS++)
  19859. {
  19860. if (*pTempsrc1 == *pTempsrc2)
  19861. *pTempdst = *pTempsrc1; /* just repeat the first */
  19862. else /* calculate the distance */
  19863. mng_put_uint16 ((mng_uint8p)pTempdst,
  19864. (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  19865. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  19866. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  19867. pTempdst++;
  19868. if (*(pTempsrc1+1) == *(pTempsrc2+1))
  19869. *pTempdst = *(pTempsrc1+1);
  19870. else
  19871. mng_put_uint16 ((mng_uint8p)pTempdst,
  19872. (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+1))) -
  19873. (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) + iM) /
  19874. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) );
  19875. pTempdst++;
  19876. if (*(pTempsrc1+2) == *(pTempsrc2+2))
  19877. *pTempdst = *(pTempsrc1+2);
  19878. else
  19879. mng_put_uint16 ((mng_uint8p)pTempdst,
  19880. (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+2))) -
  19881. (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+2))) ) + iM) /
  19882. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+2))) ) );
  19883. pTempdst++;
  19884. if (*(pTempsrc1+3) == *(pTempsrc2+3))
  19885. *pTempdst = *(pTempsrc1+3);
  19886. else
  19887. mng_put_uint16 ((mng_uint8p)pTempdst,
  19888. (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+3))) -
  19889. (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+3))) ) + iM) /
  19890. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+3))) ) );
  19891. pTempdst++;
  19892. }
  19893. }
  19894. else
  19895. {
  19896. for (iS = 1; iS < iM; iS++)
  19897. {
  19898. *pTempdst = *pTempsrc1; /* repeat first source pixel */
  19899. pTempdst++;
  19900. *pTempdst = *(pTempsrc1+1);
  19901. pTempdst++;
  19902. *pTempdst = *(pTempsrc1+2);
  19903. pTempdst++;
  19904. *pTempdst = *(pTempsrc1+3);
  19905. pTempdst++;
  19906. }
  19907. }
  19908. }
  19909. pTempsrc1 += 4;
  19910. }
  19911. #ifdef MNG_SUPPORT_TRACE
  19912. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_X2, MNG_LC_END);
  19913. #endif
  19914. return MNG_NOERROR;
  19915. }
  19916. /* ************************************************************************** */
  19917. mng_retcode mng_magnify_rgba16_x3 (mng_datap pData,
  19918. mng_uint16 iMX,
  19919. mng_uint16 iML,
  19920. mng_uint16 iMR,
  19921. mng_uint32 iWidth,
  19922. mng_uint8p pSrcline,
  19923. mng_uint8p pDstline)
  19924. {
  19925. mng_uint32 iX;
  19926. mng_int32 iS, iM, iH;
  19927. mng_uint16p pTempsrc1;
  19928. mng_uint16p pTempsrc2;
  19929. mng_uint16p pTempdst;
  19930. #ifdef MNG_SUPPORT_TRACE
  19931. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_X3, MNG_LC_START);
  19932. #endif
  19933. pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */
  19934. pTempdst = (mng_uint16p)pDstline;
  19935. for (iX = 0; iX < iWidth; iX++)
  19936. {
  19937. pTempsrc2 = pTempsrc1 + 4;
  19938. *pTempdst = *pTempsrc1; /* copy original source pixel */
  19939. pTempdst++;
  19940. *pTempdst = *(pTempsrc1+1);
  19941. pTempdst++;
  19942. *pTempdst = *(pTempsrc1+2);
  19943. pTempdst++;
  19944. *pTempdst = *(pTempsrc1+3);
  19945. pTempdst++;
  19946. if (iX == 0) /* first interval ? */
  19947. {
  19948. if (iWidth == 1) /* single pixel ? */
  19949. pTempsrc2 = MNG_NULL;
  19950. iM = (mng_int32)iML;
  19951. }
  19952. else
  19953. if (iX == (iWidth - 2)) /* last interval ? */
  19954. iM = (mng_int32)iMR;
  19955. else
  19956. iM = (mng_int32)iMX;
  19957. /* fill interval ? */
  19958. if ((iX < iWidth - 1) || (iWidth == 1))
  19959. {
  19960. if (pTempsrc2) /* do we have the second pixel ? */
  19961. {
  19962. iH = (iM+1) / 2; /* calculate halfway point */
  19963. for (iS = 1; iS < iH; iS++) /* replicate first half */
  19964. {
  19965. *pTempdst = *pTempsrc1;
  19966. *(pTempdst+1) = *(pTempsrc1+1);
  19967. *(pTempdst+2) = *(pTempsrc1+2);
  19968. *(pTempdst+3) = *(pTempsrc1+3);
  19969. pTempdst += 4;
  19970. }
  19971. for (iS = iH; iS < iM; iS++) /* replicate second half */
  19972. {
  19973. *pTempdst = *pTempsrc2;
  19974. *(pTempdst+1) = *(pTempsrc2+1);
  19975. *(pTempdst+2) = *(pTempsrc2+2);
  19976. *(pTempdst+3) = *(pTempsrc2+3);
  19977. pTempdst += 4;
  19978. }
  19979. }
  19980. else
  19981. {
  19982. for (iS = 1; iS < iM; iS++)
  19983. {
  19984. *pTempdst = *pTempsrc1; /* repeat first source pixel */
  19985. pTempdst++;
  19986. *pTempdst = *(pTempsrc1+1);
  19987. pTempdst++;
  19988. *pTempdst = *(pTempsrc1+2);
  19989. pTempdst++;
  19990. *pTempdst = *(pTempsrc1+3);
  19991. pTempdst++;
  19992. }
  19993. }
  19994. }
  19995. pTempsrc1 += 4;
  19996. }
  19997. #ifdef MNG_SUPPORT_TRACE
  19998. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_X3, MNG_LC_END);
  19999. #endif
  20000. return MNG_NOERROR;
  20001. }
  20002. /* ************************************************************************** */
  20003. mng_retcode mng_magnify_rgba16_x4 (mng_datap pData,
  20004. mng_uint16 iMX,
  20005. mng_uint16 iML,
  20006. mng_uint16 iMR,
  20007. mng_uint32 iWidth,
  20008. mng_uint8p pSrcline,
  20009. mng_uint8p pDstline)
  20010. {
  20011. mng_uint32 iX;
  20012. mng_int32 iS, iM, iH;
  20013. mng_uint16p pTempsrc1;
  20014. mng_uint16p pTempsrc2;
  20015. mng_uint16p pTempdst;
  20016. #ifdef MNG_SUPPORT_TRACE
  20017. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_X4, MNG_LC_START);
  20018. #endif
  20019. pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */
  20020. pTempdst = (mng_uint16p)pDstline;
  20021. for (iX = 0; iX < iWidth; iX++)
  20022. {
  20023. pTempsrc2 = pTempsrc1 + 4;
  20024. *pTempdst = *pTempsrc1; /* copy original source pixel */
  20025. pTempdst++;
  20026. *pTempdst = *(pTempsrc1+1);
  20027. pTempdst++;
  20028. *pTempdst = *(pTempsrc1+2);
  20029. pTempdst++;
  20030. *pTempdst = *(pTempsrc1+3);
  20031. pTempdst++;
  20032. if (iX == 0) /* first interval ? */
  20033. {
  20034. if (iWidth == 1) /* single pixel ? */
  20035. pTempsrc2 = MNG_NULL;
  20036. iM = (mng_int32)iML;
  20037. }
  20038. else
  20039. if (iX == (iWidth - 2)) /* last interval ? */
  20040. iM = (mng_int32)iMR;
  20041. else
  20042. iM = (mng_int32)iMX;
  20043. /* fill interval ? */
  20044. if ((iX < iWidth - 1) || (iWidth == 1))
  20045. {
  20046. if (pTempsrc2) /* do we have the second pixel ? */
  20047. {
  20048. iH = (iM+1) / 2; /* calculate halfway point */
  20049. for (iS = 1; iS < iH; iS++) /* first half */
  20050. {
  20051. if (*pTempsrc1 == *pTempsrc2)
  20052. *pTempdst = *pTempsrc1; /* just repeat the first */
  20053. else /* calculate the distance */
  20054. mng_put_uint16 ((mng_uint8p)pTempdst,
  20055. (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  20056. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  20057. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  20058. pTempdst++;
  20059. if (*(pTempsrc1+1) == *(pTempsrc2+1))
  20060. *pTempdst = *(pTempsrc1+1);
  20061. else
  20062. mng_put_uint16 ((mng_uint8p)pTempdst,
  20063. (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+1))) -
  20064. (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) + iM) /
  20065. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) );
  20066. pTempdst++;
  20067. if (*(pTempsrc1+2) == *(pTempsrc2+2))
  20068. *pTempdst = *(pTempsrc1+2);
  20069. else
  20070. mng_put_uint16 ((mng_uint8p)pTempdst,
  20071. (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+2))) -
  20072. (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+2))) ) + iM) /
  20073. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+2))) ) );
  20074. pTempdst++;
  20075. /* replicate alpha from left */
  20076. *pTempdst = *(pTempsrc1+3);
  20077. pTempdst++;
  20078. }
  20079. for (iS = iH; iS < iM; iS++) /* second half */
  20080. {
  20081. if (*pTempsrc1 == *pTempsrc2)
  20082. *pTempdst = *pTempsrc1; /* just repeat the first */
  20083. else /* calculate the distance */
  20084. mng_put_uint16 ((mng_uint8p)pTempdst,
  20085. (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  20086. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  20087. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  20088. pTempdst++;
  20089. if (*(pTempsrc1+1) == *(pTempsrc2+1))
  20090. *pTempdst = *(pTempsrc1+1);
  20091. else
  20092. mng_put_uint16 ((mng_uint8p)pTempdst,
  20093. (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+1))) -
  20094. (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) + iM) /
  20095. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+1))) ) );
  20096. pTempdst++;
  20097. if (*(pTempsrc1+2) == *(pTempsrc2+2))
  20098. *pTempdst = *(pTempsrc1+2);
  20099. else
  20100. mng_put_uint16 ((mng_uint8p)pTempdst,
  20101. (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+2))) -
  20102. (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+2))) ) + iM) /
  20103. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+2))) ) );
  20104. pTempdst++;
  20105. /* replicate alpha from right */
  20106. *pTempdst = *(pTempsrc2+3);
  20107. pTempdst++;
  20108. }
  20109. }
  20110. else
  20111. {
  20112. for (iS = 1; iS < iM; iS++)
  20113. {
  20114. *pTempdst = *pTempsrc1; /* repeat first source pixel */
  20115. pTempdst++;
  20116. *pTempdst = *(pTempsrc1+1);
  20117. pTempdst++;
  20118. *pTempdst = *(pTempsrc1+2);
  20119. pTempdst++;
  20120. *pTempdst = *(pTempsrc1+3);
  20121. pTempdst++;
  20122. }
  20123. }
  20124. }
  20125. pTempsrc1 += 4;
  20126. }
  20127. #ifdef MNG_SUPPORT_TRACE
  20128. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_X4, MNG_LC_END);
  20129. #endif
  20130. return MNG_NOERROR;
  20131. }
  20132. /* ************************************************************************** */
  20133. mng_retcode mng_magnify_rgba16_x5 (mng_datap pData,
  20134. mng_uint16 iMX,
  20135. mng_uint16 iML,
  20136. mng_uint16 iMR,
  20137. mng_uint32 iWidth,
  20138. mng_uint8p pSrcline,
  20139. mng_uint8p pDstline)
  20140. {
  20141. mng_uint32 iX;
  20142. mng_int32 iS, iM, iH;
  20143. mng_uint16p pTempsrc1;
  20144. mng_uint16p pTempsrc2;
  20145. mng_uint16p pTempdst;
  20146. #ifdef MNG_SUPPORT_TRACE
  20147. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_X5, MNG_LC_START);
  20148. #endif
  20149. pTempsrc1 = (mng_uint16p)pSrcline; /* initialize pixel-loop */
  20150. pTempdst = (mng_uint16p)pDstline;
  20151. for (iX = 0; iX < iWidth; iX++)
  20152. {
  20153. pTempsrc2 = pTempsrc1 + 4;
  20154. *pTempdst = *pTempsrc1; /* copy original source pixel */
  20155. pTempdst++;
  20156. *pTempdst = *(pTempsrc1+1);
  20157. pTempdst++;
  20158. *pTempdst = *(pTempsrc1+2);
  20159. pTempdst++;
  20160. *pTempdst = *(pTempsrc1+3);
  20161. pTempdst++;
  20162. if (iX == 0) /* first interval ? */
  20163. {
  20164. if (iWidth == 1) /* single pixel ? */
  20165. pTempsrc2 = MNG_NULL;
  20166. iM = (mng_int32)iML;
  20167. }
  20168. else
  20169. if (iX == (iWidth - 2)) /* last interval ? */
  20170. iM = (mng_int32)iMR;
  20171. else
  20172. iM = (mng_int32)iMX;
  20173. /* fill interval ? */
  20174. if ((iX < iWidth - 1) || (iWidth == 1))
  20175. {
  20176. if (pTempsrc2) /* do we have the second pixel ? */
  20177. {
  20178. iH = (iM+1) / 2; /* calculate halfway point */
  20179. for (iS = 1; iS < iH; iS++) /* first half */
  20180. {
  20181. *pTempdst = *pTempsrc1; /* replicate color from left */
  20182. *(pTempdst+1) = *(pTempsrc1+1);
  20183. *(pTempdst+2) = *(pTempsrc1+2);
  20184. if (*(pTempsrc1+3) == *(pTempsrc2+3))
  20185. *(pTempdst+3) = *(pTempsrc1+3);
  20186. else
  20187. mng_put_uint16 ((mng_uint8p)(pTempdst+3),
  20188. (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+3))) -
  20189. (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+3))) ) + iM) /
  20190. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+3))) ) );
  20191. pTempdst += 4;
  20192. }
  20193. for (iS = iH; iS < iM; iS++) /* second half */
  20194. {
  20195. *pTempdst = *pTempsrc2; /* replicate color from right */
  20196. *(pTempdst+1) = *(pTempsrc2+1);
  20197. *(pTempdst+2) = *(pTempsrc2+2);
  20198. if (*(pTempsrc1+3) == *(pTempsrc2+3))
  20199. *(pTempdst+3) = *(pTempsrc1+3);
  20200. else
  20201. mng_put_uint16 ((mng_uint8p)(pTempdst+3),
  20202. (mng_uint16)(((2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc2+3))) -
  20203. (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+3))) ) + iM) /
  20204. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)(pTempsrc1+3))) ) );
  20205. pTempdst += 4;
  20206. }
  20207. }
  20208. else
  20209. {
  20210. for (iS = 1; iS < iM; iS++)
  20211. {
  20212. *pTempdst = *pTempsrc1; /* repeat first source pixel */
  20213. pTempdst++;
  20214. *pTempdst = *(pTempsrc1+1);
  20215. pTempdst++;
  20216. *pTempdst = *(pTempsrc1+2);
  20217. pTempdst++;
  20218. *pTempdst = *(pTempsrc1+3);
  20219. pTempdst++;
  20220. }
  20221. }
  20222. }
  20223. pTempsrc1 += 4;
  20224. }
  20225. #ifdef MNG_SUPPORT_TRACE
  20226. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_X4, MNG_LC_END);
  20227. #endif
  20228. return MNG_NOERROR;
  20229. }
  20230. /* ************************************************************************** */
  20231. #ifndef MNG_NO_GRAY_SUPPORT
  20232. mng_retcode mng_magnify_g16_y1 (mng_datap pData,
  20233. mng_int32 iS,
  20234. mng_int32 iM,
  20235. mng_uint32 iWidth,
  20236. mng_uint8p pSrcline1,
  20237. mng_uint8p pSrcline2,
  20238. mng_uint8p pDstline)
  20239. {
  20240. #ifdef MNG_SUPPORT_TRACE
  20241. MNG_TRACE (pData, MNG_FN_MAGNIFY_G16_Y1, MNG_LC_START);
  20242. #endif
  20243. MNG_COPY (pDstline, pSrcline1, (iWidth << 1));
  20244. #ifdef MNG_SUPPORT_TRACE
  20245. MNG_TRACE (pData, MNG_FN_MAGNIFY_G16_Y1, MNG_LC_END);
  20246. #endif
  20247. return MNG_NOERROR;
  20248. }
  20249. /* ************************************************************************** */
  20250. mng_retcode mng_magnify_g16_y2 (mng_datap pData,
  20251. mng_int32 iS,
  20252. mng_int32 iM,
  20253. mng_uint32 iWidth,
  20254. mng_uint8p pSrcline1,
  20255. mng_uint8p pSrcline2,
  20256. mng_uint8p pDstline)
  20257. {
  20258. mng_uint32 iX;
  20259. mng_uint16p pTempsrc1;
  20260. mng_uint16p pTempsrc2;
  20261. mng_uint16p pTempdst;
  20262. #ifdef MNG_SUPPORT_TRACE
  20263. MNG_TRACE (pData, MNG_FN_MAGNIFY_G16_Y2, MNG_LC_START);
  20264. #endif
  20265. pTempsrc1 = (mng_uint16p)pSrcline1; /* initialize pixel-loop */
  20266. pTempsrc2 = (mng_uint16p)pSrcline2;
  20267. pTempdst = (mng_uint16p)pDstline;
  20268. if (pTempsrc2) /* do we have a second line ? */
  20269. {
  20270. for (iX = 0; iX < iWidth; iX++)
  20271. { /* calculate the distances */
  20272. if (*pTempsrc1 == *pTempsrc2)
  20273. *pTempdst = *pTempsrc1;
  20274. else
  20275. mng_put_uint16 ((mng_uint8p)pTempdst,
  20276. (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  20277. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  20278. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  20279. pTempdst++;
  20280. pTempsrc1++;
  20281. pTempsrc2++;
  20282. }
  20283. }
  20284. else
  20285. { /* just repeat the entire line */
  20286. MNG_COPY (pTempdst, pTempsrc1, (iWidth << 1));
  20287. }
  20288. #ifdef MNG_SUPPORT_TRACE
  20289. MNG_TRACE (pData, MNG_FN_MAGNIFY_G16_Y2, MNG_LC_END);
  20290. #endif
  20291. return MNG_NOERROR;
  20292. }
  20293. /* ************************************************************************** */
  20294. mng_retcode mng_magnify_g16_y3 (mng_datap pData,
  20295. mng_int32 iS,
  20296. mng_int32 iM,
  20297. mng_uint32 iWidth,
  20298. mng_uint8p pSrcline1,
  20299. mng_uint8p pSrcline2,
  20300. mng_uint8p pDstline)
  20301. {
  20302. #ifdef MNG_SUPPORT_TRACE
  20303. MNG_TRACE (pData, MNG_FN_MAGNIFY_G16_Y3, MNG_LC_START);
  20304. #endif
  20305. if (pSrcline2) /* do we have a second line ? */
  20306. {
  20307. if (iS < (iM+1) / 2) /* top half ? */
  20308. MNG_COPY (pDstline, pSrcline1, (iWidth << 1))
  20309. else
  20310. MNG_COPY (pDstline, pSrcline2, (iWidth << 1));
  20311. }
  20312. else
  20313. { /* just repeat the entire line */
  20314. MNG_COPY (pDstline, pSrcline1, (iWidth << 1));
  20315. }
  20316. #ifdef MNG_SUPPORT_TRACE
  20317. MNG_TRACE (pData, MNG_FN_MAGNIFY_G16_Y3, MNG_LC_END);
  20318. #endif
  20319. return MNG_NOERROR;
  20320. }
  20321. #endif /* MNG_NO_GRAY_SUPPORT */
  20322. /* ************************************************************************** */
  20323. mng_retcode mng_magnify_rgb16_y1 (mng_datap pData,
  20324. mng_int32 iS,
  20325. mng_int32 iM,
  20326. mng_uint32 iWidth,
  20327. mng_uint8p pSrcline1,
  20328. mng_uint8p pSrcline2,
  20329. mng_uint8p pDstline)
  20330. {
  20331. #ifdef MNG_SUPPORT_TRACE
  20332. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB16_Y1, MNG_LC_START);
  20333. #endif
  20334. MNG_COPY (pDstline, pSrcline1, iWidth * 6);
  20335. #ifdef MNG_SUPPORT_TRACE
  20336. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB16_Y1, MNG_LC_END);
  20337. #endif
  20338. return MNG_NOERROR;
  20339. }
  20340. /* ************************************************************************** */
  20341. mng_retcode mng_magnify_rgb16_y2 (mng_datap pData,
  20342. mng_int32 iS,
  20343. mng_int32 iM,
  20344. mng_uint32 iWidth,
  20345. mng_uint8p pSrcline1,
  20346. mng_uint8p pSrcline2,
  20347. mng_uint8p pDstline)
  20348. {
  20349. mng_uint32 iX;
  20350. mng_uint16p pTempsrc1;
  20351. mng_uint16p pTempsrc2;
  20352. mng_uint16p pTempdst;
  20353. #ifdef MNG_SUPPORT_TRACE
  20354. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB16_Y2, MNG_LC_START);
  20355. #endif
  20356. pTempsrc1 = (mng_uint16p)pSrcline1; /* initialize pixel-loop */
  20357. pTempsrc2 = (mng_uint16p)pSrcline2;
  20358. pTempdst = (mng_uint16p)pDstline;
  20359. if (pTempsrc2) /* do we have a second line ? */
  20360. {
  20361. for (iX = 0; iX < iWidth; iX++)
  20362. { /* calculate the distances */
  20363. if (*pTempsrc1 == *pTempsrc2)
  20364. *pTempdst = *pTempsrc1;
  20365. else
  20366. mng_put_uint16 ((mng_uint8p)pTempdst,
  20367. (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  20368. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  20369. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  20370. pTempdst++;
  20371. pTempsrc1++;
  20372. pTempsrc2++;
  20373. if (*pTempsrc1 == *pTempsrc2)
  20374. *pTempdst = *pTempsrc1;
  20375. else
  20376. mng_put_uint16 ((mng_uint8p)pTempdst,
  20377. (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  20378. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  20379. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  20380. pTempdst++;
  20381. pTempsrc1++;
  20382. pTempsrc2++;
  20383. if (*pTempsrc1 == *pTempsrc2)
  20384. *pTempdst = *pTempsrc1;
  20385. else
  20386. mng_put_uint16 ((mng_uint8p)pTempdst,
  20387. (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  20388. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  20389. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  20390. pTempdst++;
  20391. pTempsrc1++;
  20392. pTempsrc2++;
  20393. }
  20394. }
  20395. else
  20396. { /* just repeat the entire line */
  20397. MNG_COPY (pTempdst, pTempsrc1, iWidth * 6);
  20398. }
  20399. #ifdef MNG_SUPPORT_TRACE
  20400. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB16_Y2, MNG_LC_END);
  20401. #endif
  20402. return MNG_NOERROR;
  20403. }
  20404. /* ************************************************************************** */
  20405. mng_retcode mng_magnify_rgb16_y3 (mng_datap pData,
  20406. mng_int32 iS,
  20407. mng_int32 iM,
  20408. mng_uint32 iWidth,
  20409. mng_uint8p pSrcline1,
  20410. mng_uint8p pSrcline2,
  20411. mng_uint8p pDstline)
  20412. {
  20413. #ifdef MNG_SUPPORT_TRACE
  20414. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB16_Y3, MNG_LC_START);
  20415. #endif
  20416. if (pSrcline2) /* do we have a second line ? */
  20417. {
  20418. if (iS < (iM+1) / 2) /* top half ? */
  20419. MNG_COPY (pDstline, pSrcline1, iWidth * 6)
  20420. else
  20421. MNG_COPY (pDstline, pSrcline2, iWidth * 6);
  20422. }
  20423. else
  20424. { /* just repeat the entire line */
  20425. MNG_COPY (pDstline, pSrcline1, iWidth * 6);
  20426. }
  20427. #ifdef MNG_SUPPORT_TRACE
  20428. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGB16_Y3, MNG_LC_END);
  20429. #endif
  20430. return MNG_NOERROR;
  20431. }
  20432. /* ************************************************************************** */
  20433. #ifndef MNG_NO_GRAY_SUPPORT
  20434. mng_retcode mng_magnify_ga16_y1 (mng_datap pData,
  20435. mng_int32 iS,
  20436. mng_int32 iM,
  20437. mng_uint32 iWidth,
  20438. mng_uint8p pSrcline1,
  20439. mng_uint8p pSrcline2,
  20440. mng_uint8p pDstline)
  20441. {
  20442. #ifdef MNG_SUPPORT_TRACE
  20443. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_Y1, MNG_LC_START);
  20444. #endif
  20445. MNG_COPY (pDstline, pSrcline1, (iWidth << 2));
  20446. #ifdef MNG_SUPPORT_TRACE
  20447. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_Y1, MNG_LC_END);
  20448. #endif
  20449. return MNG_NOERROR;
  20450. }
  20451. /* ************************************************************************** */
  20452. mng_retcode mng_magnify_ga16_y2 (mng_datap pData,
  20453. mng_int32 iS,
  20454. mng_int32 iM,
  20455. mng_uint32 iWidth,
  20456. mng_uint8p pSrcline1,
  20457. mng_uint8p pSrcline2,
  20458. mng_uint8p pDstline)
  20459. {
  20460. mng_uint32 iX;
  20461. mng_uint16p pTempsrc1;
  20462. mng_uint16p pTempsrc2;
  20463. mng_uint16p pTempdst;
  20464. #ifdef MNG_SUPPORT_TRACE
  20465. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_Y2, MNG_LC_START);
  20466. #endif
  20467. pTempsrc1 = (mng_uint16p)pSrcline1; /* initialize pixel-loop */
  20468. pTempsrc2 = (mng_uint16p)pSrcline2;
  20469. pTempdst = (mng_uint16p)pDstline;
  20470. if (pTempsrc2) /* do we have a second line ? */
  20471. {
  20472. for (iX = 0; iX < iWidth; iX++)
  20473. { /* calculate the distances */
  20474. if (*pTempsrc1 == *pTempsrc2)
  20475. *pTempdst = *pTempsrc1;
  20476. else
  20477. mng_put_uint16 ((mng_uint8p)pTempdst,
  20478. (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  20479. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  20480. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  20481. pTempdst++;
  20482. pTempsrc1++;
  20483. pTempsrc2++;
  20484. if (*pTempsrc1 == *pTempsrc2)
  20485. *pTempdst = *pTempsrc1;
  20486. else
  20487. mng_put_uint16 ((mng_uint8p)pTempdst,
  20488. (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  20489. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  20490. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  20491. pTempdst++;
  20492. pTempsrc1++;
  20493. pTempsrc2++;
  20494. }
  20495. }
  20496. else
  20497. { /* just repeat the entire line */
  20498. MNG_COPY (pTempdst, pTempsrc1, (iWidth << 2));
  20499. }
  20500. #ifdef MNG_SUPPORT_TRACE
  20501. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_Y2, MNG_LC_END);
  20502. #endif
  20503. return MNG_NOERROR;
  20504. }
  20505. /* ************************************************************************** */
  20506. mng_retcode mng_magnify_ga16_y3 (mng_datap pData,
  20507. mng_int32 iS,
  20508. mng_int32 iM,
  20509. mng_uint32 iWidth,
  20510. mng_uint8p pSrcline1,
  20511. mng_uint8p pSrcline2,
  20512. mng_uint8p pDstline)
  20513. {
  20514. #ifdef MNG_SUPPORT_TRACE
  20515. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_Y3, MNG_LC_START);
  20516. #endif
  20517. if (pSrcline2) /* do we have a second line ? */
  20518. {
  20519. if (iS < (iM+1) / 2) /* top half ? */
  20520. MNG_COPY (pDstline, pSrcline1, (iWidth << 2))
  20521. else
  20522. MNG_COPY (pDstline, pSrcline2, (iWidth << 2));
  20523. }
  20524. else
  20525. { /* just repeat the entire line */
  20526. MNG_COPY (pDstline, pSrcline1, (iWidth << 2));
  20527. }
  20528. #ifdef MNG_SUPPORT_TRACE
  20529. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_Y2, MNG_LC_END);
  20530. #endif
  20531. return MNG_NOERROR;
  20532. }
  20533. /* ************************************************************************** */
  20534. mng_retcode mng_magnify_ga16_y4 (mng_datap pData,
  20535. mng_int32 iS,
  20536. mng_int32 iM,
  20537. mng_uint32 iWidth,
  20538. mng_uint8p pSrcline1,
  20539. mng_uint8p pSrcline2,
  20540. mng_uint8p pDstline)
  20541. {
  20542. mng_uint32 iX;
  20543. mng_uint16p pTempsrc1;
  20544. mng_uint16p pTempsrc2;
  20545. mng_uint16p pTempdst;
  20546. #ifdef MNG_SUPPORT_TRACE
  20547. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_Y4, MNG_LC_START);
  20548. #endif
  20549. pTempsrc1 = (mng_uint16p)pSrcline1; /* initialize pixel-loop */
  20550. pTempsrc2 = (mng_uint16p)pSrcline2;
  20551. pTempdst = (mng_uint16p)pDstline;
  20552. if (pTempsrc2) /* do we have a second line ? */
  20553. {
  20554. if (iS < (iM+1) / 2) /* top half ? */
  20555. {
  20556. for (iX = 0; iX < iWidth; iX++)
  20557. { /* calculate the distances */
  20558. if (*pTempsrc1 == *pTempsrc2)
  20559. *pTempdst = *pTempsrc1;
  20560. else
  20561. mng_put_uint16 ((mng_uint8p)pTempdst,
  20562. (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  20563. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  20564. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  20565. pTempdst++;
  20566. pTempsrc1++;
  20567. pTempsrc2 += 2;
  20568. *pTempdst++ = *pTempsrc1++; /* replicate alpha from top */
  20569. }
  20570. }
  20571. else
  20572. {
  20573. for (iX = 0; iX < iWidth; iX++)
  20574. { /* calculate the distances */
  20575. if (*pTempsrc1 == *pTempsrc2)
  20576. *pTempdst = *pTempsrc1;
  20577. else
  20578. mng_put_uint16 ((mng_uint8p)pTempdst,
  20579. (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  20580. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  20581. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  20582. pTempdst++;
  20583. pTempsrc1 += 2;
  20584. pTempsrc2++;
  20585. *pTempdst++ = *pTempsrc2++; /* replicate alpha from bottom */
  20586. }
  20587. }
  20588. }
  20589. else
  20590. { /* just repeat the entire line */
  20591. MNG_COPY (pTempdst, pTempsrc1, (iWidth << 2));
  20592. }
  20593. #ifdef MNG_SUPPORT_TRACE
  20594. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_Y4, MNG_LC_END);
  20595. #endif
  20596. return MNG_NOERROR;
  20597. }
  20598. /* ************************************************************************** */
  20599. mng_retcode mng_magnify_ga16_y5 (mng_datap pData,
  20600. mng_int32 iS,
  20601. mng_int32 iM,
  20602. mng_uint32 iWidth,
  20603. mng_uint8p pSrcline1,
  20604. mng_uint8p pSrcline2,
  20605. mng_uint8p pDstline)
  20606. {
  20607. mng_uint32 iX;
  20608. mng_uint16p pTempsrc1;
  20609. mng_uint16p pTempsrc2;
  20610. mng_uint16p pTempdst;
  20611. #ifdef MNG_SUPPORT_TRACE
  20612. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_Y5, MNG_LC_START);
  20613. #endif
  20614. pTempsrc1 = (mng_uint16p)pSrcline1; /* initialize pixel-loop */
  20615. pTempsrc2 = (mng_uint16p)pSrcline2;
  20616. pTempdst = (mng_uint16p)pDstline;
  20617. if (pTempsrc2) /* do we have a second line ? */
  20618. {
  20619. if (iS < (iM+1) / 2) /* top half ? */
  20620. {
  20621. for (iX = 0; iX < iWidth; iX++)
  20622. {
  20623. *pTempdst = *pTempsrc1; /* replicate gray from top */
  20624. pTempdst++;
  20625. pTempsrc1++;
  20626. pTempsrc2++;
  20627. if (*pTempsrc1 == *pTempsrc2) /* calculate the distances */
  20628. *pTempdst = *pTempsrc1;
  20629. else
  20630. mng_put_uint16 ((mng_uint8p)pTempdst,
  20631. (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  20632. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  20633. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  20634. pTempdst++;
  20635. pTempsrc1++;
  20636. pTempsrc2++;
  20637. }
  20638. }
  20639. else
  20640. {
  20641. for (iX = 0; iX < iWidth; iX++)
  20642. {
  20643. *pTempdst = *pTempsrc2; /* replicate gray from bottom */
  20644. pTempdst++;
  20645. pTempsrc1++;
  20646. pTempsrc2++;
  20647. if (*pTempsrc1 == *pTempsrc2) /* calculate the distances */
  20648. *pTempdst = *pTempsrc1;
  20649. else
  20650. mng_put_uint16 ((mng_uint8p)pTempdst,
  20651. (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  20652. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  20653. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  20654. pTempdst++;
  20655. pTempsrc1++;
  20656. pTempsrc2++;
  20657. }
  20658. }
  20659. }
  20660. else
  20661. { /* just repeat the entire line */
  20662. MNG_COPY (pTempdst, pTempsrc1, (iWidth << 2));
  20663. }
  20664. #ifdef MNG_SUPPORT_TRACE
  20665. MNG_TRACE (pData, MNG_FN_MAGNIFY_GA16_Y5, MNG_LC_END);
  20666. #endif
  20667. return MNG_NOERROR;
  20668. }
  20669. #endif /* MNG_NO_GRAY_SUPPORT */
  20670. /* ************************************************************************** */
  20671. mng_retcode mng_magnify_rgba16_y1 (mng_datap pData,
  20672. mng_int32 iS,
  20673. mng_int32 iM,
  20674. mng_uint32 iWidth,
  20675. mng_uint8p pSrcline1,
  20676. mng_uint8p pSrcline2,
  20677. mng_uint8p pDstline)
  20678. {
  20679. #ifdef MNG_SUPPORT_TRACE
  20680. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_Y1, MNG_LC_START);
  20681. #endif
  20682. MNG_COPY (pDstline, pSrcline1, (iWidth << 3));
  20683. #ifdef MNG_SUPPORT_TRACE
  20684. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_Y1, MNG_LC_END);
  20685. #endif
  20686. return MNG_NOERROR;
  20687. }
  20688. /* ************************************************************************** */
  20689. mng_retcode mng_magnify_rgba16_y2 (mng_datap pData,
  20690. mng_int32 iS,
  20691. mng_int32 iM,
  20692. mng_uint32 iWidth,
  20693. mng_uint8p pSrcline1,
  20694. mng_uint8p pSrcline2,
  20695. mng_uint8p pDstline)
  20696. {
  20697. mng_uint32 iX;
  20698. mng_uint16p pTempsrc1;
  20699. mng_uint16p pTempsrc2;
  20700. mng_uint16p pTempdst;
  20701. #ifdef MNG_SUPPORT_TRACE
  20702. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_Y2, MNG_LC_START);
  20703. #endif
  20704. pTempsrc1 = (mng_uint16p)pSrcline1; /* initialize pixel-loop */
  20705. pTempsrc2 = (mng_uint16p)pSrcline2;
  20706. pTempdst = (mng_uint16p)pDstline;
  20707. if (pTempsrc2) /* do we have a second line ? */
  20708. {
  20709. for (iX = 0; iX < iWidth; iX++)
  20710. { /* calculate the distances */
  20711. if (*pTempsrc1 == *pTempsrc2)
  20712. *pTempdst = *pTempsrc1;
  20713. else
  20714. mng_put_uint16 ((mng_uint8p)pTempdst,
  20715. (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  20716. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  20717. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  20718. pTempdst++;
  20719. pTempsrc1++;
  20720. pTempsrc2++;
  20721. if (*pTempsrc1 == *pTempsrc2)
  20722. *pTempdst = *pTempsrc1;
  20723. else
  20724. mng_put_uint16 ((mng_uint8p)pTempdst,
  20725. (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  20726. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  20727. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  20728. pTempdst++;
  20729. pTempsrc1++;
  20730. pTempsrc2++;
  20731. if (*pTempsrc1 == *pTempsrc2)
  20732. *pTempdst = *pTempsrc1;
  20733. else
  20734. mng_put_uint16 ((mng_uint8p)pTempdst,
  20735. (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  20736. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  20737. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  20738. pTempdst++;
  20739. pTempsrc1++;
  20740. pTempsrc2++;
  20741. if (*pTempsrc1 == *pTempsrc2)
  20742. *pTempdst = *pTempsrc1;
  20743. else
  20744. mng_put_uint16 ((mng_uint8p)pTempdst,
  20745. (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  20746. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  20747. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  20748. pTempdst++;
  20749. pTempsrc1++;
  20750. pTempsrc2++;
  20751. }
  20752. }
  20753. else
  20754. { /* just repeat the entire line */
  20755. MNG_COPY (pTempdst, pTempsrc1, (iWidth << 3));
  20756. }
  20757. #ifdef MNG_SUPPORT_TRACE
  20758. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_Y2, MNG_LC_END);
  20759. #endif
  20760. return MNG_NOERROR;
  20761. }
  20762. /* ************************************************************************** */
  20763. mng_retcode mng_magnify_rgba16_y3 (mng_datap pData,
  20764. mng_int32 iS,
  20765. mng_int32 iM,
  20766. mng_uint32 iWidth,
  20767. mng_uint8p pSrcline1,
  20768. mng_uint8p pSrcline2,
  20769. mng_uint8p pDstline)
  20770. {
  20771. #ifdef MNG_SUPPORT_TRACE
  20772. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_Y3, MNG_LC_START);
  20773. #endif
  20774. if (pSrcline2) /* do we have a second line ? */
  20775. {
  20776. if (iS < (iM+1) / 2) /* top half ? */
  20777. MNG_COPY (pDstline, pSrcline1, (iWidth << 3))
  20778. else
  20779. MNG_COPY (pDstline, pSrcline2, (iWidth << 3));
  20780. }
  20781. else
  20782. { /* just repeat the entire line */
  20783. MNG_COPY (pDstline, pSrcline1, (iWidth << 3));
  20784. }
  20785. #ifdef MNG_SUPPORT_TRACE
  20786. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_Y2, MNG_LC_END);
  20787. #endif
  20788. return MNG_NOERROR;
  20789. }
  20790. /* ************************************************************************** */
  20791. mng_retcode mng_magnify_rgba16_y4 (mng_datap pData,
  20792. mng_int32 iS,
  20793. mng_int32 iM,
  20794. mng_uint32 iWidth,
  20795. mng_uint8p pSrcline1,
  20796. mng_uint8p pSrcline2,
  20797. mng_uint8p pDstline)
  20798. {
  20799. mng_uint32 iX;
  20800. mng_uint16p pTempsrc1;
  20801. mng_uint16p pTempsrc2;
  20802. mng_uint16p pTempdst;
  20803. #ifdef MNG_SUPPORT_TRACE
  20804. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_Y4, MNG_LC_START);
  20805. #endif
  20806. pTempsrc1 = (mng_uint16p)pSrcline1; /* initialize pixel-loop */
  20807. pTempsrc2 = (mng_uint16p)pSrcline2;
  20808. pTempdst = (mng_uint16p)pDstline;
  20809. if (pTempsrc2) /* do we have a second line ? */
  20810. {
  20811. if (iS < (iM+1) / 2) /* top half ? */
  20812. {
  20813. for (iX = 0; iX < iWidth; iX++)
  20814. { /* calculate the distances */
  20815. if (*pTempsrc1 == *pTempsrc2)
  20816. *pTempdst = *pTempsrc1;
  20817. else
  20818. mng_put_uint16 ((mng_uint8p)pTempdst,
  20819. (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  20820. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  20821. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  20822. pTempdst++;
  20823. pTempsrc1++;
  20824. pTempsrc2++;
  20825. if (*pTempsrc1 == *pTempsrc2)
  20826. *pTempdst = *pTempsrc1;
  20827. else
  20828. mng_put_uint16 ((mng_uint8p)pTempdst,
  20829. (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  20830. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  20831. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  20832. pTempdst++;
  20833. pTempsrc1++;
  20834. pTempsrc2++;
  20835. if (*pTempsrc1 == *pTempsrc2)
  20836. *pTempdst = *pTempsrc1;
  20837. else
  20838. mng_put_uint16 ((mng_uint8p)pTempdst,
  20839. (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  20840. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  20841. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  20842. pTempdst++;
  20843. pTempsrc1++;
  20844. pTempsrc2 += 2;
  20845. *pTempdst++ = *pTempsrc1++; /* replicate alpha from top */
  20846. }
  20847. }
  20848. else
  20849. {
  20850. for (iX = 0; iX < iWidth; iX++)
  20851. { /* calculate the distances */
  20852. if (*pTempsrc1 == *pTempsrc2)
  20853. *pTempdst = *pTempsrc1;
  20854. else
  20855. mng_put_uint16 ((mng_uint8p)pTempdst,
  20856. (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  20857. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  20858. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  20859. pTempdst++;
  20860. pTempsrc1++;
  20861. pTempsrc2++;
  20862. if (*pTempsrc1 == *pTempsrc2)
  20863. *pTempdst = *pTempsrc1;
  20864. else
  20865. mng_put_uint16 ((mng_uint8p)pTempdst,
  20866. (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  20867. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  20868. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  20869. pTempdst++;
  20870. pTempsrc1++;
  20871. pTempsrc2++;
  20872. if (*pTempsrc1 == *pTempsrc2)
  20873. *pTempdst = *pTempsrc1;
  20874. else
  20875. mng_put_uint16 ((mng_uint8p)pTempdst,
  20876. (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  20877. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  20878. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  20879. pTempdst++;
  20880. pTempsrc1 += 2;
  20881. pTempsrc2++;
  20882. *pTempdst++ = *pTempsrc2++; /* replicate alpha from bottom */
  20883. }
  20884. }
  20885. }
  20886. else
  20887. { /* just repeat the entire line */
  20888. MNG_COPY (pTempdst, pTempsrc1, (iWidth << 3));
  20889. }
  20890. #ifdef MNG_SUPPORT_TRACE
  20891. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_Y4, MNG_LC_END);
  20892. #endif
  20893. return MNG_NOERROR;
  20894. }
  20895. /* ************************************************************************** */
  20896. mng_retcode mng_magnify_rgba16_y5 (mng_datap pData,
  20897. mng_int32 iS,
  20898. mng_int32 iM,
  20899. mng_uint32 iWidth,
  20900. mng_uint8p pSrcline1,
  20901. mng_uint8p pSrcline2,
  20902. mng_uint8p pDstline)
  20903. {
  20904. mng_uint32 iX;
  20905. mng_uint16p pTempsrc1;
  20906. mng_uint16p pTempsrc2;
  20907. mng_uint16p pTempdst;
  20908. #ifdef MNG_SUPPORT_TRACE
  20909. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_Y5, MNG_LC_START);
  20910. #endif
  20911. pTempsrc1 = (mng_uint16p)pSrcline1; /* initialize pixel-loop */
  20912. pTempsrc2 = (mng_uint16p)pSrcline2;
  20913. pTempdst = (mng_uint16p)pDstline;
  20914. if (pTempsrc2) /* do we have a second line ? */
  20915. {
  20916. if (iS < (iM+1) / 2) /* top half ? */
  20917. {
  20918. for (iX = 0; iX < iWidth; iX++)
  20919. {
  20920. *pTempdst++ = *pTempsrc1++; /* replicate color from top */
  20921. *pTempdst++ = *pTempsrc1++;
  20922. *pTempdst++ = *pTempsrc1++;
  20923. pTempsrc2 += 3;
  20924. if (*pTempsrc1 == *pTempsrc2) /* calculate the distances */
  20925. *pTempdst = *pTempsrc1;
  20926. else
  20927. mng_put_uint16 ((mng_uint8p)pTempdst,
  20928. (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  20929. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  20930. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  20931. pTempdst++;
  20932. pTempsrc1++;
  20933. pTempsrc2++;
  20934. }
  20935. }
  20936. else
  20937. {
  20938. for (iX = 0; iX < iWidth; iX++)
  20939. {
  20940. *pTempdst++ = *pTempsrc2++; /* replicate color from bottom */
  20941. *pTempdst++ = *pTempsrc2++;
  20942. *pTempdst++ = *pTempsrc2++;
  20943. pTempsrc1 += 3;
  20944. if (*pTempsrc1 == *pTempsrc2) /* calculate the distances */
  20945. *pTempdst = *pTempsrc1;
  20946. else
  20947. mng_put_uint16 ((mng_uint8p)pTempdst,
  20948. (mng_uint16)( ( (2 * iS * ( (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc2)) -
  20949. (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) + iM) /
  20950. (iM * 2)) + (mng_int32)(mng_get_uint16 ((mng_uint8p)pTempsrc1)) ) );
  20951. pTempdst++;
  20952. pTempsrc1++;
  20953. pTempsrc2++;
  20954. }
  20955. }
  20956. }
  20957. else
  20958. { /* just repeat the entire line */
  20959. MNG_COPY (pTempdst, pTempsrc1, (iWidth << 3));
  20960. }
  20961. #ifdef MNG_SUPPORT_TRACE
  20962. MNG_TRACE (pData, MNG_FN_MAGNIFY_RGBA16_Y5, MNG_LC_END);
  20963. #endif
  20964. return MNG_NOERROR;
  20965. }
  20966. #endif /* MNG_NO_16BIT_SUPPORT */
  20967. #endif /* MNG_OPTIMIZE_FOOTPRINT_MAGN */
  20968. #endif /* MNG_SKIPCHUNK_MAGN */
  20969. /* ************************************************************************** */
  20970. /* * * */
  20971. /* * PAST composition routines - compose over/under with a target object * */
  20972. /* * * */
  20973. /* ************************************************************************** */
  20974. #ifndef MNG_SKIPCHUNK_PAST
  20975. mng_retcode mng_composeover_rgba8 (mng_datap pData)
  20976. {
  20977. mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf;
  20978. mng_uint8p pWorkrow;
  20979. mng_uint8p pOutrow;
  20980. mng_int32 iX;
  20981. mng_uint8 iFGa8, iBGa8;
  20982. mng_uint8 iCr8, iCg8, iCb8, iCa8;
  20983. #ifdef MNG_SUPPORT_TRACE
  20984. MNG_TRACE (pData, MNG_FN_COMPOSEOVER_RGBA8, MNG_LC_START);
  20985. #endif
  20986. pWorkrow = pData->pRGBArow;
  20987. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  20988. (pData->iCol * pBuf->iSamplesize);
  20989. #ifdef MNG_DECREMENT_LOOPS
  20990. for (iX = pData->iRowsamples; iX > 0; iX--)
  20991. #else
  20992. for (iX = 0; iX < pData->iRowsamples; iX++)
  20993. #endif
  20994. {
  20995. iFGa8 = *(pWorkrow+3); /* get alpha values */
  20996. iBGa8 = *(pOutrow+3);
  20997. if (iFGa8) /* any opacity at all ? */
  20998. { /* fully opaque or background fully transparent ? */
  20999. if ((iFGa8 == 0xFF) || (iBGa8 == 0))
  21000. { /* then simply copy the values */
  21001. *pOutrow = *pWorkrow;
  21002. *(pOutrow+1) = *(pWorkrow+1);
  21003. *(pOutrow+2) = *(pWorkrow+2);
  21004. *(pOutrow+3) = iFGa8;
  21005. }
  21006. else
  21007. {
  21008. if (iBGa8 == 0xFF) /* background fully opaque ? */
  21009. { /* do alpha composing */
  21010. #ifdef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  21011. int i;
  21012. for (i=2; i >= 0; i--)
  21013. {
  21014. MNG_COMPOSE8 (*(pOutrow+i), *(pWorkrow+i), iFGa8, *(pOutrow+i));
  21015. }
  21016. #else
  21017. MNG_COMPOSE8 (*pOutrow, *pWorkrow, iFGa8, *pOutrow );
  21018. MNG_COMPOSE8 (*(pOutrow+1), *(pWorkrow+1), iFGa8, *(pOutrow+1));
  21019. MNG_COMPOSE8 (*(pOutrow+2), *(pWorkrow+2), iFGa8, *(pOutrow+2));
  21020. #endif
  21021. /* alpha remains fully opaque !!! */
  21022. }
  21023. else
  21024. { /* here we'll have to blend */
  21025. MNG_BLEND8 (*pWorkrow, *(pWorkrow+1), *(pWorkrow+2), iFGa8,
  21026. *pOutrow, *(pOutrow+1), *(pOutrow+2), iBGa8,
  21027. iCr8, iCg8, iCb8, iCa8);
  21028. /* and return the composed values */
  21029. *pOutrow = iCr8;
  21030. *(pOutrow+1) = iCg8;
  21031. *(pOutrow+2) = iCb8;
  21032. *(pOutrow+3) = iCa8;
  21033. }
  21034. }
  21035. }
  21036. pOutrow += 4;
  21037. pWorkrow += 4;
  21038. }
  21039. #ifdef MNG_SUPPORT_TRACE
  21040. MNG_TRACE (pData, MNG_FN_COMPOSEOVER_RGBA8, MNG_LC_END);
  21041. #endif
  21042. return MNG_NOERROR;
  21043. }
  21044. /* ************************************************************************** */
  21045. #ifndef MNG_NO_16BIT_SUPPORT
  21046. mng_retcode mng_composeover_rgba16 (mng_datap pData)
  21047. {
  21048. mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf;
  21049. mng_uint16p pWorkrow;
  21050. mng_uint16p pOutrow;
  21051. mng_int32 iX;
  21052. mng_uint16 iFGa16, iFGr16, iFGg16, iFGb16;
  21053. mng_uint16 iBGa16, iBGr16, iBGg16, iBGb16;
  21054. mng_uint16 iCr16, iCg16, iCb16, iCa16;
  21055. #ifdef MNG_SUPPORT_TRACE
  21056. MNG_TRACE (pData, MNG_FN_COMPOSEOVER_RGBA16, MNG_LC_START);
  21057. #endif
  21058. pWorkrow = (mng_uint16p)pData->pRGBArow;
  21059. pOutrow = (mng_uint16p)(pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  21060. (pData->iCol * pBuf->iSamplesize));
  21061. #ifdef MNG_DECREMENT_LOOPS
  21062. for (iX = pData->iRowsamples; iX > 0; iX--)
  21063. #else
  21064. for (iX = 0; iX < pData->iRowsamples; iX++)
  21065. #endif
  21066. { /* get alpha values */
  21067. iFGa16 = mng_get_uint16 ((mng_uint8p)(pWorkrow+3));
  21068. iBGa16 = mng_get_uint16 ((mng_uint8p)(pOutrow+3));
  21069. if (iFGa16) /* any opacity at all ? */
  21070. { /* fully opaque or background fully transparent ? */
  21071. if ((iFGa16 == 0xFFFF) || (iBGa16 == 0))
  21072. { /* then simply copy the values */
  21073. *pOutrow = *pWorkrow;
  21074. *(pOutrow+1) = *(pWorkrow+1);
  21075. *(pOutrow+2) = *(pWorkrow+2);
  21076. *(pOutrow+3) = *(pWorkrow+3);
  21077. }
  21078. else
  21079. { /* get color values */
  21080. iFGr16 = mng_get_uint16 ((mng_uint8p)pWorkrow);
  21081. iFGg16 = mng_get_uint16 ((mng_uint8p)(pWorkrow+1));
  21082. iFGb16 = mng_get_uint16 ((mng_uint8p)(pWorkrow+2));
  21083. iBGr16 = mng_get_uint16 ((mng_uint8p)pOutrow);
  21084. iBGg16 = mng_get_uint16 ((mng_uint8p)(pOutrow+1));
  21085. iBGb16 = mng_get_uint16 ((mng_uint8p)(pOutrow+2));
  21086. if (iBGa16 == 0xFFFF) /* background fully opaque ? */
  21087. { /* do alpha composing */
  21088. MNG_COMPOSE16 (iFGr16, iFGr16, iFGa16, iBGr16);
  21089. MNG_COMPOSE16 (iFGg16, iFGg16, iFGa16, iBGg16);
  21090. MNG_COMPOSE16 (iFGb16, iFGb16, iFGa16, iBGb16);
  21091. mng_put_uint16 ((mng_uint8p)pOutrow, iFGr16);
  21092. mng_put_uint16 ((mng_uint8p)(pOutrow+1), iFGg16);
  21093. mng_put_uint16 ((mng_uint8p)(pOutrow+2), iFGb16);
  21094. /* alpha remains fully opaque !!! */
  21095. }
  21096. else
  21097. { /* here we'll have to blend */
  21098. MNG_BLEND16 (iFGr16, iFGg16, iFGb16, iFGa16,
  21099. iBGr16, iBGg16, iBGb16, iBGa16,
  21100. iCr16, iCg16, iCb16, iCa16);
  21101. /* and return the composed values */
  21102. mng_put_uint16 ((mng_uint8p)pOutrow, iCr16);
  21103. mng_put_uint16 ((mng_uint8p)(pOutrow+1), iCg16);
  21104. mng_put_uint16 ((mng_uint8p)(pOutrow+2), iCb16);
  21105. mng_put_uint16 ((mng_uint8p)(pOutrow+3), iCa16);
  21106. }
  21107. }
  21108. }
  21109. pOutrow += 4;
  21110. pWorkrow += 4;
  21111. }
  21112. #ifdef MNG_SUPPORT_TRACE
  21113. MNG_TRACE (pData, MNG_FN_COMPOSEOVER_RGBA16, MNG_LC_END);
  21114. #endif
  21115. return MNG_NOERROR;
  21116. }
  21117. #endif
  21118. /* ************************************************************************** */
  21119. mng_retcode mng_composeunder_rgba8 (mng_datap pData)
  21120. {
  21121. mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf;
  21122. mng_uint8p pWorkrow;
  21123. mng_uint8p pOutrow;
  21124. mng_int32 iX;
  21125. mng_uint8 iFGa8, iBGa8;
  21126. mng_uint8 iCr8, iCg8, iCb8, iCa8;
  21127. #ifdef MNG_SUPPORT_TRACE
  21128. MNG_TRACE (pData, MNG_FN_COMPOSEUNDER_RGBA8, MNG_LC_START);
  21129. #endif
  21130. pWorkrow = pData->pRGBArow;
  21131. pOutrow = pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  21132. (pData->iCol * pBuf->iSamplesize);
  21133. #ifdef MNG_DECREMENT_LOOPS
  21134. for (iX = pData->iRowsamples; iX > 0; iX--)
  21135. #else
  21136. for (iX = 0; iX < pData->iRowsamples; iX++)
  21137. #endif
  21138. {
  21139. iFGa8 = *(pOutrow+3); /* get alpha values */
  21140. iBGa8 = *(pWorkrow+3);
  21141. /* anything to do at all ? */
  21142. if ((iBGa8) && (iFGa8 != 0xFF))
  21143. {
  21144. if (iBGa8 == 0xFF) /* background fully opaque ? */
  21145. { /* do alpha composing */
  21146. #ifdef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
  21147. int i;
  21148. for (i=2; i >= 0; i--)
  21149. {
  21150. MNG_COMPOSE8 (*(pOutrow+i), *(pOutrow+i), iFGa8, *(pWorkrow+i));
  21151. }
  21152. #else
  21153. MNG_COMPOSE8 (*pOutrow, *pOutrow, iFGa8, *pWorkrow );
  21154. MNG_COMPOSE8 (*(pOutrow+1), *(pOutrow+1), iFGa8, *(pWorkrow+1));
  21155. MNG_COMPOSE8 (*(pOutrow+2), *(pOutrow+2), iFGa8, *(pWorkrow+2));
  21156. #endif
  21157. *(pOutrow+3) = 0xFF; /* alpha becomes fully opaque !!! */
  21158. }
  21159. else
  21160. { /* here we'll have to blend */
  21161. MNG_BLEND8 (*pOutrow, *(pOutrow+1), *(pOutrow+2), iFGa8,
  21162. *pWorkrow, *(pWorkrow+1), *(pWorkrow+2), iBGa8,
  21163. iCr8, iCg8, iCb8, iCa8);
  21164. /* and return the composed values */
  21165. *pOutrow = iCr8;
  21166. *(pOutrow+1) = iCg8;
  21167. *(pOutrow+2) = iCb8;
  21168. *(pOutrow+3) = iCa8;
  21169. }
  21170. }
  21171. pOutrow += 4;
  21172. pWorkrow += 4;
  21173. }
  21174. #ifdef MNG_SUPPORT_TRACE
  21175. MNG_TRACE (pData, MNG_FN_COMPOSEUNDER_RGBA8, MNG_LC_END);
  21176. #endif
  21177. return MNG_NOERROR;
  21178. }
  21179. /* ************************************************************************** */
  21180. #ifndef MNG_NO_16BIT_SUPPORT
  21181. mng_retcode mng_composeunder_rgba16 (mng_datap pData)
  21182. {
  21183. mng_imagedatap pBuf = ((mng_imagep)pData->pStoreobj)->pImgbuf;
  21184. mng_uint16p pWorkrow;
  21185. mng_uint16p pOutrow;
  21186. mng_int32 iX;
  21187. mng_uint16 iFGa16, iFGr16, iFGg16, iFGb16;
  21188. mng_uint16 iBGa16, iBGr16, iBGg16, iBGb16;
  21189. mng_uint16 iCr16, iCg16, iCb16, iCa16;
  21190. #ifdef MNG_SUPPORT_TRACE
  21191. MNG_TRACE (pData, MNG_FN_COMPOSEUNDER_RGBA16, MNG_LC_START);
  21192. #endif
  21193. pWorkrow = (mng_uint16p)pData->pRGBArow;
  21194. pOutrow = (mng_uint16p)(pBuf->pImgdata + (pData->iRow * pBuf->iRowsize ) +
  21195. (pData->iCol * pBuf->iSamplesize));
  21196. #ifdef MNG_DECREMENT_LOOPS
  21197. for (iX = pData->iRowsamples; iX > 0; iX--)
  21198. #else
  21199. for (iX = 0; iX < pData->iRowsamples; iX++)
  21200. #endif
  21201. { /* get alpha values */
  21202. iFGa16 = mng_get_uint16 ((mng_uint8p)(pOutrow+3));
  21203. iBGa16 = mng_get_uint16 ((mng_uint8p)(pWorkrow+3));
  21204. /* anything to do at all ? */
  21205. if ((iBGa16) && (iFGa16 != 0xFFFF))
  21206. {
  21207. iFGr16 = mng_get_uint16 ((mng_uint8p)pOutrow);
  21208. iFGg16 = mng_get_uint16 ((mng_uint8p)(pOutrow+1));
  21209. iFGb16 = mng_get_uint16 ((mng_uint8p)(pOutrow+2));
  21210. iBGr16 = mng_get_uint16 ((mng_uint8p)pWorkrow);
  21211. iBGg16 = mng_get_uint16 ((mng_uint8p)(pWorkrow+1));
  21212. iBGb16 = mng_get_uint16 ((mng_uint8p)(pWorkrow+2));
  21213. if (iBGa16 == 0xFFFF) /* background fully opaque ? */
  21214. { /* do alpha composing */
  21215. MNG_COMPOSE16 (iFGr16, iFGr16, iFGa16, iBGr16);
  21216. MNG_COMPOSE16 (iFGg16, iFGg16, iFGa16, iBGg16);
  21217. MNG_COMPOSE16 (iFGb16, iFGb16, iFGa16, iBGb16);
  21218. mng_put_uint16 ((mng_uint8p)pOutrow, iFGr16);
  21219. mng_put_uint16 ((mng_uint8p)(pOutrow+1), iFGg16);
  21220. mng_put_uint16 ((mng_uint8p)(pOutrow+2), iFGb16);
  21221. *(pOutrow+3) = 0xFFFF; /* alpha becomes fully opaque !!! */
  21222. }
  21223. else
  21224. { /* here we'll have to blend */
  21225. MNG_BLEND16 (iFGr16, iFGg16, iFGb16, iFGa16,
  21226. iBGr16, iBGg16, iBGb16, iBGa16,
  21227. iCr16, iCg16, iCb16, iCa16);
  21228. /* and return the composed values */
  21229. mng_put_uint16 ((mng_uint8p)pOutrow, iCr16);
  21230. mng_put_uint16 ((mng_uint8p)(pOutrow+1), iCg16);
  21231. mng_put_uint16 ((mng_uint8p)(pOutrow+2), iCb16);
  21232. mng_put_uint16 ((mng_uint8p)(pOutrow+3), iCa16);
  21233. }
  21234. }
  21235. pOutrow += 4;
  21236. pWorkrow += 4;
  21237. }
  21238. #ifdef MNG_SUPPORT_TRACE
  21239. MNG_TRACE (pData, MNG_FN_COMPOSEUNDER_RGBA16, MNG_LC_END);
  21240. #endif
  21241. return MNG_NOERROR;
  21242. }
  21243. #endif
  21244. #endif
  21245. /* ************************************************************************** */
  21246. /* * * */
  21247. /* * PAST flip & tile routines - flip or tile a row of pixels * */
  21248. /* * * */
  21249. /* ************************************************************************** */
  21250. #ifndef MNG_SKIPCHUNK_PAST
  21251. mng_retcode mng_flip_rgba8 (mng_datap pData)
  21252. {
  21253. mng_uint32p pWorkrow;
  21254. mng_uint32p pOutrow;
  21255. mng_int32 iX;
  21256. #ifdef MNG_SUPPORT_TRACE
  21257. MNG_TRACE (pData, MNG_FN_FLIP_RGBA8, MNG_LC_START);
  21258. #endif
  21259. /* setup temp pointers */
  21260. pWorkrow = (mng_uint32p)pData->pRGBArow + pData->iRowsamples - 1;
  21261. pOutrow = (mng_uint32p)pData->pWorkrow;
  21262. /* swap original buffers */
  21263. pData->pWorkrow = pData->pRGBArow;
  21264. pData->pRGBArow = (mng_uint8p)pOutrow;
  21265. #ifdef MNG_DECREMENT_LOOPS
  21266. for (iX = pData->iRowsamples; iX > 0; iX--)
  21267. #else
  21268. for (iX = 0; iX < pData->iRowsamples; iX++)
  21269. #endif
  21270. { /* let's flip */
  21271. *pOutrow = *pWorkrow;
  21272. pOutrow++;
  21273. pWorkrow--;
  21274. }
  21275. #ifdef MNG_SUPPORT_TRACE
  21276. MNG_TRACE (pData, MNG_FN_FLIP_RGBA8, MNG_LC_END);
  21277. #endif
  21278. return MNG_NOERROR;
  21279. }
  21280. /* ************************************************************************** */
  21281. #ifndef MNG_NO_16BIT_SUPPORT
  21282. mng_retcode mng_flip_rgba16 (mng_datap pData)
  21283. {
  21284. mng_uint32p pWorkrow;
  21285. mng_uint32p pOutrow;
  21286. mng_int32 iX;
  21287. #ifdef MNG_SUPPORT_TRACE
  21288. MNG_TRACE (pData, MNG_FN_FLIP_RGBA16, MNG_LC_START);
  21289. #endif
  21290. /* setup temp pointers */
  21291. pWorkrow = (mng_uint32p)pData->pRGBArow + ((pData->iRowsamples - 1) << 1);
  21292. pOutrow = (mng_uint32p)pData->pWorkrow;
  21293. /* swap original buffers */
  21294. pData->pWorkrow = pData->pRGBArow;
  21295. pData->pRGBArow = (mng_uint8p)pOutrow;
  21296. #ifdef MNG_DECREMENT_LOOPS
  21297. for (iX = pData->iRowsamples; iX > 0; iX--)
  21298. #else
  21299. for (iX = 0; iX < pData->iRowsamples; iX++)
  21300. #endif
  21301. { /* let's flip */
  21302. *pOutrow = *pWorkrow;
  21303. *(pOutrow + 1) = *(pWorkrow + 1);
  21304. pOutrow += 2;
  21305. pWorkrow -= 2;
  21306. }
  21307. #ifdef MNG_SUPPORT_TRACE
  21308. MNG_TRACE (pData, MNG_FN_FLIP_RGBA16, MNG_LC_END);
  21309. #endif
  21310. return MNG_NOERROR;
  21311. }
  21312. #endif
  21313. /* ************************************************************************** */
  21314. mng_retcode mng_tile_rgba8 (mng_datap pData)
  21315. {
  21316. mng_uint32p pWorkrow;
  21317. mng_uint32p pOutrow;
  21318. mng_int32 iX;
  21319. mng_uint32 iZ, iMax;
  21320. #ifdef MNG_SUPPORT_TRACE
  21321. MNG_TRACE (pData, MNG_FN_TILE_RGBA8, MNG_LC_START);
  21322. #endif
  21323. iZ = pData->iSourcel; /* indent ? */
  21324. /* what's our source-length */
  21325. iMax = ((mng_imagep)pData->pRetrieveobj)->pImgbuf->iWidth;
  21326. /* setup temp pointers */
  21327. pWorkrow = (mng_uint32p)pData->pRGBArow + iZ;
  21328. pOutrow = (mng_uint32p)pData->pWorkrow;
  21329. /* swap original buffers */
  21330. pData->pWorkrow = pData->pRGBArow;
  21331. pData->pRGBArow = (mng_uint8p)pOutrow;
  21332. for (iX = pData->iDestl; iX < pData->iDestr; iX++)
  21333. { /* tiiiile */
  21334. *pOutrow = *pWorkrow;
  21335. pWorkrow++;
  21336. pOutrow++;
  21337. iZ++;
  21338. if (iZ >= iMax) /* end of source ? */
  21339. {
  21340. iZ = 0;
  21341. pWorkrow = (mng_uint32p)pData->pWorkrow;
  21342. }
  21343. }
  21344. #ifdef MNG_SUPPORT_TRACE
  21345. MNG_TRACE (pData, MNG_FN_TILE_RGBA8, MNG_LC_END);
  21346. #endif
  21347. return MNG_NOERROR;
  21348. }
  21349. /* ************************************************************************** */
  21350. #ifndef MNG_NO_16BIT_SUPPORT
  21351. mng_retcode mng_tile_rgba16 (mng_datap pData)
  21352. {
  21353. mng_uint32p pWorkrow;
  21354. mng_uint32p pOutrow;
  21355. mng_int32 iX;
  21356. mng_uint32 iZ, iMax;
  21357. #ifdef MNG_SUPPORT_TRACE
  21358. MNG_TRACE (pData, MNG_FN_TILE_RGBA16, MNG_LC_START);
  21359. #endif
  21360. iZ = pData->iSourcel; /* indent ? */
  21361. /* what's our source-length */
  21362. iMax = ((mng_imagep)pData->pRetrieveobj)->pImgbuf->iWidth;
  21363. /* setup temp pointers */
  21364. pWorkrow = (mng_uint32p)pData->pRGBArow + (iZ << 1);
  21365. pOutrow = (mng_uint32p)pData->pWorkrow;
  21366. /* swap original buffers */
  21367. pData->pWorkrow = pData->pRGBArow;
  21368. pData->pRGBArow = (mng_uint8p)pOutrow;
  21369. for (iX = pData->iDestl; iX < pData->iDestr; iX++)
  21370. { /* tiiiile */
  21371. *pOutrow = *pWorkrow;
  21372. *(pOutrow + 1) = *(pWorkrow + 1);
  21373. pWorkrow += 2;
  21374. pOutrow += 2;
  21375. iZ++;
  21376. if (iZ >= iMax) /* end of source ? */
  21377. {
  21378. iZ = 0;
  21379. pWorkrow = (mng_uint32p)pData->pWorkrow;
  21380. }
  21381. }
  21382. #ifdef MNG_SUPPORT_TRACE
  21383. MNG_TRACE (pData, MNG_FN_TILE_RGBA16, MNG_LC_END);
  21384. #endif
  21385. return MNG_NOERROR;
  21386. }
  21387. #endif
  21388. #endif /* MNG_SKIPCHUNK_PAST */
  21389. /* ************************************************************************** */
  21390. #endif /* MNG_INCLUDE_DISPLAY_PROCS */
  21391. /* ************************************************************************** */
  21392. /* * end of file * */
  21393. /* ************************************************************************** */