PageRenderTime 59ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 2ms

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

http://github.com/xbmc/xbmc
C | 13878 lines | 11466 code | 1525 blank | 887 comment | 1488 complexity | bb712b345ae5b5ba9c95d4b8afc68903 MD5 | raw file
Possible License(s): GPL-3.0, CC-BY-SA-3.0, LGPL-2.0, 0BSD, Unlicense, GPL-2.0, AGPL-1.0, BSD-3-Clause, LGPL-2.1, LGPL-3.0
  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