Audio plugin host https://kx.studio/carla
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

831 lines
25KB

  1. /* pngtrans.c - transforms the data in a row (used by both readers and writers)
  2. *
  3. * Last changed in libpng 1.6.0 [February 14, 2013]
  4. * Copyright (c) 1998-2013 Glenn Randers-Pehrson
  5. * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  6. * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
  7. *
  8. * This code is released under the libpng license.
  9. * For conditions of distribution and use, see the disclaimer
  10. * and license in png.h
  11. */
  12. #include "pngpriv.h"
  13. #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
  14. #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
  15. /* Turn on BGR-to-RGB mapping */
  16. void PNGAPI
  17. png_set_bgr(png_structrp png_ptr)
  18. {
  19. png_debug(1, "in png_set_bgr");
  20. if (png_ptr == NULL)
  21. return;
  22. png_ptr->transformations |= PNG_BGR;
  23. }
  24. #endif
  25. #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
  26. /* Turn on 16 bit byte swapping */
  27. void PNGAPI
  28. png_set_swap(png_structrp png_ptr)
  29. {
  30. png_debug(1, "in png_set_swap");
  31. if (png_ptr == NULL)
  32. return;
  33. if (png_ptr->bit_depth == 16)
  34. png_ptr->transformations |= PNG_SWAP_BYTES;
  35. }
  36. #endif
  37. #if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
  38. /* Turn on pixel packing */
  39. void PNGAPI
  40. png_set_packing(png_structrp png_ptr)
  41. {
  42. png_debug(1, "in png_set_packing");
  43. if (png_ptr == NULL)
  44. return;
  45. if (png_ptr->bit_depth < 8)
  46. {
  47. png_ptr->transformations |= PNG_PACK;
  48. png_ptr->usr_bit_depth = 8;
  49. }
  50. }
  51. #endif
  52. #if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
  53. /* Turn on packed pixel swapping */
  54. void PNGAPI
  55. png_set_packswap(png_structrp png_ptr)
  56. {
  57. png_debug(1, "in png_set_packswap");
  58. if (png_ptr == NULL)
  59. return;
  60. if (png_ptr->bit_depth < 8)
  61. png_ptr->transformations |= PNG_PACKSWAP;
  62. }
  63. #endif
  64. #if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
  65. void PNGAPI
  66. png_set_shift(png_structrp png_ptr, png_const_color_8p true_bits)
  67. {
  68. png_debug(1, "in png_set_shift");
  69. if (png_ptr == NULL)
  70. return;
  71. png_ptr->transformations |= PNG_SHIFT;
  72. png_ptr->shift = *true_bits;
  73. }
  74. #endif
  75. #if defined(PNG_READ_INTERLACING_SUPPORTED) || \
  76. defined(PNG_WRITE_INTERLACING_SUPPORTED)
  77. int PNGAPI
  78. png_set_interlace_handling(png_structrp png_ptr)
  79. {
  80. png_debug(1, "in png_set_interlace handling");
  81. if (png_ptr && png_ptr->interlaced)
  82. {
  83. png_ptr->transformations |= PNG_INTERLACE;
  84. return (7);
  85. }
  86. return (1);
  87. }
  88. #endif
  89. #if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
  90. /* Add a filler byte on read, or remove a filler or alpha byte on write.
  91. * The filler type has changed in v0.95 to allow future 2-byte fillers
  92. * for 48-bit input data, as well as to avoid problems with some compilers
  93. * that don't like bytes as parameters.
  94. */
  95. void PNGAPI
  96. png_set_filler(png_structrp png_ptr, png_uint_32 filler, int filler_loc)
  97. {
  98. png_debug(1, "in png_set_filler");
  99. if (png_ptr == NULL)
  100. return;
  101. /* In libpng 1.6 it is possible to determine whether this is a read or write
  102. * operation and therefore to do more checking here for a valid call.
  103. */
  104. if (png_ptr->mode & PNG_IS_READ_STRUCT)
  105. {
  106. # ifdef PNG_READ_FILLER_SUPPORTED
  107. /* On read png_set_filler is always valid, regardless of the base PNG
  108. * format, because other transformations can give a format where the
  109. * filler code can execute (basically an 8 or 16-bit component RGB or G
  110. * format.)
  111. *
  112. * NOTE: usr_channels is not used by the read code! (This has led to
  113. * confusion in the past.) The filler is only used in the read code.
  114. */
  115. png_ptr->filler = (png_uint_16)filler;
  116. # else
  117. png_app_error(png_ptr, "png_set_filler not supported on read");
  118. PNG_UNUSED(filler) /* not used in the write case */
  119. return;
  120. # endif
  121. }
  122. else /* write */
  123. {
  124. # ifdef PNG_WRITE_FILLER_SUPPORTED
  125. /* On write the usr_channels parameter must be set correctly at the
  126. * start to record the number of channels in the app-supplied data.
  127. */
  128. switch (png_ptr->color_type)
  129. {
  130. case PNG_COLOR_TYPE_RGB:
  131. png_ptr->usr_channels = 4;
  132. break;
  133. case PNG_COLOR_TYPE_GRAY:
  134. if (png_ptr->bit_depth >= 8)
  135. {
  136. png_ptr->usr_channels = 2;
  137. break;
  138. }
  139. else
  140. {
  141. /* There simply isn't any code in libpng to strip out bits
  142. * from bytes when the components are less than a byte in
  143. * size!
  144. */
  145. png_app_error(png_ptr,
  146. "png_set_filler is invalid for low bit depth gray output");
  147. return;
  148. }
  149. default:
  150. png_app_error(png_ptr,
  151. "png_set_filler: inappropriate color type");
  152. return;
  153. }
  154. # else
  155. png_app_error(png_ptr, "png_set_filler not supported on write");
  156. return;
  157. # endif
  158. }
  159. /* Here on success - libpng supports the operation, set the transformation
  160. * and the flag to say where the filler channel is.
  161. */
  162. png_ptr->transformations |= PNG_FILLER;
  163. if (filler_loc == PNG_FILLER_AFTER)
  164. png_ptr->flags |= PNG_FLAG_FILLER_AFTER;
  165. else
  166. png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER;
  167. }
  168. /* Added to libpng-1.2.7 */
  169. void PNGAPI
  170. png_set_add_alpha(png_structrp png_ptr, png_uint_32 filler, int filler_loc)
  171. {
  172. png_debug(1, "in png_set_add_alpha");
  173. if (png_ptr == NULL)
  174. return;
  175. png_set_filler(png_ptr, filler, filler_loc);
  176. /* The above may fail to do anything. */
  177. if (png_ptr->transformations & PNG_FILLER)
  178. png_ptr->transformations |= PNG_ADD_ALPHA;
  179. }
  180. #endif
  181. #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \
  182. defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
  183. void PNGAPI
  184. png_set_swap_alpha(png_structrp png_ptr)
  185. {
  186. png_debug(1, "in png_set_swap_alpha");
  187. if (png_ptr == NULL)
  188. return;
  189. png_ptr->transformations |= PNG_SWAP_ALPHA;
  190. }
  191. #endif
  192. #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \
  193. defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
  194. void PNGAPI
  195. png_set_invert_alpha(png_structrp png_ptr)
  196. {
  197. png_debug(1, "in png_set_invert_alpha");
  198. if (png_ptr == NULL)
  199. return;
  200. png_ptr->transformations |= PNG_INVERT_ALPHA;
  201. }
  202. #endif
  203. #if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
  204. void PNGAPI
  205. png_set_invert_mono(png_structrp png_ptr)
  206. {
  207. png_debug(1, "in png_set_invert_mono");
  208. if (png_ptr == NULL)
  209. return;
  210. png_ptr->transformations |= PNG_INVERT_MONO;
  211. }
  212. /* Invert monochrome grayscale data */
  213. void /* PRIVATE */
  214. png_do_invert(png_row_infop row_info, png_bytep row)
  215. {
  216. png_debug(1, "in png_do_invert");
  217. /* This test removed from libpng version 1.0.13 and 1.2.0:
  218. * if (row_info->bit_depth == 1 &&
  219. */
  220. if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
  221. {
  222. png_bytep rp = row;
  223. png_size_t i;
  224. png_size_t istop = row_info->rowbytes;
  225. for (i = 0; i < istop; i++)
  226. {
  227. *rp = (png_byte)(~(*rp));
  228. rp++;
  229. }
  230. }
  231. else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
  232. row_info->bit_depth == 8)
  233. {
  234. png_bytep rp = row;
  235. png_size_t i;
  236. png_size_t istop = row_info->rowbytes;
  237. for (i = 0; i < istop; i += 2)
  238. {
  239. *rp = (png_byte)(~(*rp));
  240. rp += 2;
  241. }
  242. }
  243. #ifdef PNG_16BIT_SUPPORTED
  244. else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
  245. row_info->bit_depth == 16)
  246. {
  247. png_bytep rp = row;
  248. png_size_t i;
  249. png_size_t istop = row_info->rowbytes;
  250. for (i = 0; i < istop; i += 4)
  251. {
  252. *rp = (png_byte)(~(*rp));
  253. *(rp + 1) = (png_byte)(~(*(rp + 1)));
  254. rp += 4;
  255. }
  256. }
  257. #endif
  258. }
  259. #endif
  260. #ifdef PNG_16BIT_SUPPORTED
  261. #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
  262. /* Swaps byte order on 16 bit depth images */
  263. void /* PRIVATE */
  264. png_do_swap(png_row_infop row_info, png_bytep row)
  265. {
  266. png_debug(1, "in png_do_swap");
  267. if (row_info->bit_depth == 16)
  268. {
  269. png_bytep rp = row;
  270. png_uint_32 i;
  271. png_uint_32 istop= row_info->width * row_info->channels;
  272. for (i = 0; i < istop; i++, rp += 2)
  273. {
  274. png_byte t = *rp;
  275. *rp = *(rp + 1);
  276. *(rp + 1) = t;
  277. }
  278. }
  279. }
  280. #endif
  281. #endif
  282. #if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
  283. static PNG_CONST png_byte onebppswaptable[256] = {
  284. 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
  285. 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
  286. 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
  287. 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
  288. 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
  289. 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
  290. 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
  291. 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
  292. 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
  293. 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
  294. 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
  295. 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
  296. 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
  297. 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
  298. 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
  299. 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
  300. 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
  301. 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
  302. 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
  303. 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
  304. 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
  305. 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
  306. 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
  307. 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
  308. 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
  309. 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
  310. 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
  311. 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
  312. 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
  313. 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
  314. 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
  315. 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
  316. };
  317. static PNG_CONST png_byte twobppswaptable[256] = {
  318. 0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0,
  319. 0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0,
  320. 0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4,
  321. 0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4,
  322. 0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8,
  323. 0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8,
  324. 0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC,
  325. 0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC,
  326. 0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1,
  327. 0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1,
  328. 0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5,
  329. 0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5,
  330. 0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9,
  331. 0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9,
  332. 0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD,
  333. 0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD,
  334. 0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2,
  335. 0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2,
  336. 0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6,
  337. 0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6,
  338. 0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA,
  339. 0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA,
  340. 0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE,
  341. 0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE,
  342. 0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3,
  343. 0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3,
  344. 0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7,
  345. 0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7,
  346. 0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB,
  347. 0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB,
  348. 0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF,
  349. 0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF
  350. };
  351. static PNG_CONST png_byte fourbppswaptable[256] = {
  352. 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
  353. 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0,
  354. 0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71,
  355. 0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1,
  356. 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72,
  357. 0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2,
  358. 0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73,
  359. 0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3,
  360. 0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74,
  361. 0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4,
  362. 0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75,
  363. 0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5,
  364. 0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76,
  365. 0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6,
  366. 0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77,
  367. 0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7,
  368. 0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78,
  369. 0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8,
  370. 0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79,
  371. 0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9,
  372. 0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A,
  373. 0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA,
  374. 0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B,
  375. 0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB,
  376. 0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C,
  377. 0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC,
  378. 0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D,
  379. 0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD,
  380. 0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E,
  381. 0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE,
  382. 0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F,
  383. 0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF
  384. };
  385. /* Swaps pixel packing order within bytes */
  386. void /* PRIVATE */
  387. png_do_packswap(png_row_infop row_info, png_bytep row)
  388. {
  389. png_debug(1, "in png_do_packswap");
  390. if (row_info->bit_depth < 8)
  391. {
  392. png_bytep rp;
  393. png_const_bytep end, table;
  394. end = row + row_info->rowbytes;
  395. if (row_info->bit_depth == 1)
  396. table = onebppswaptable;
  397. else if (row_info->bit_depth == 2)
  398. table = twobppswaptable;
  399. else if (row_info->bit_depth == 4)
  400. table = fourbppswaptable;
  401. else
  402. return;
  403. for (rp = row; rp < end; rp++)
  404. *rp = table[*rp];
  405. }
  406. }
  407. #endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */
  408. #if defined(PNG_WRITE_FILLER_SUPPORTED) || \
  409. defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
  410. /* Remove a channel - this used to be 'png_do_strip_filler' but it used a
  411. * somewhat weird combination of flags to determine what to do. All the calls
  412. * to png_do_strip_filler are changed in 1.5.2 to call this instead with the
  413. * correct arguments.
  414. *
  415. * The routine isn't general - the channel must be the channel at the start or
  416. * end (not in the middle) of each pixel.
  417. */
  418. void /* PRIVATE */
  419. png_do_strip_channel(png_row_infop row_info, png_bytep row, int at_start)
  420. {
  421. png_bytep sp = row; /* source pointer */
  422. png_bytep dp = row; /* destination pointer */
  423. png_bytep ep = row + row_info->rowbytes; /* One beyond end of row */
  424. /* At the start sp will point to the first byte to copy and dp to where
  425. * it is copied to. ep always points just beyond the end of the row, so
  426. * the loop simply copies (channels-1) channels until sp reaches ep.
  427. *
  428. * at_start: 0 -- convert AG, XG, ARGB, XRGB, AAGG, XXGG, etc.
  429. * nonzero -- convert GA, GX, RGBA, RGBX, GGAA, RRGGBBXX, etc.
  430. */
  431. /* GA, GX, XG cases */
  432. if (row_info->channels == 2)
  433. {
  434. if (row_info->bit_depth == 8)
  435. {
  436. if (at_start) /* Skip initial filler */
  437. ++sp;
  438. else /* Skip initial channel and, for sp, the filler */
  439. sp += 2, ++dp;
  440. /* For a 1 pixel wide image there is nothing to do */
  441. while (sp < ep)
  442. *dp++ = *sp, sp += 2;
  443. row_info->pixel_depth = 8;
  444. }
  445. else if (row_info->bit_depth == 16)
  446. {
  447. if (at_start) /* Skip initial filler */
  448. sp += 2;
  449. else /* Skip initial channel and, for sp, the filler */
  450. sp += 4, dp += 2;
  451. while (sp < ep)
  452. *dp++ = *sp++, *dp++ = *sp, sp += 3;
  453. row_info->pixel_depth = 16;
  454. }
  455. else
  456. return; /* bad bit depth */
  457. row_info->channels = 1;
  458. /* Finally fix the color type if it records an alpha channel */
  459. if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
  460. row_info->color_type = PNG_COLOR_TYPE_GRAY;
  461. }
  462. /* RGBA, RGBX, XRGB cases */
  463. else if (row_info->channels == 4)
  464. {
  465. if (row_info->bit_depth == 8)
  466. {
  467. if (at_start) /* Skip initial filler */
  468. ++sp;
  469. else /* Skip initial channels and, for sp, the filler */
  470. sp += 4, dp += 3;
  471. /* Note that the loop adds 3 to dp and 4 to sp each time. */
  472. while (sp < ep)
  473. *dp++ = *sp++, *dp++ = *sp++, *dp++ = *sp, sp += 2;
  474. row_info->pixel_depth = 24;
  475. }
  476. else if (row_info->bit_depth == 16)
  477. {
  478. if (at_start) /* Skip initial filler */
  479. sp += 2;
  480. else /* Skip initial channels and, for sp, the filler */
  481. sp += 8, dp += 6;
  482. while (sp < ep)
  483. {
  484. /* Copy 6 bytes, skip 2 */
  485. *dp++ = *sp++, *dp++ = *sp++;
  486. *dp++ = *sp++, *dp++ = *sp++;
  487. *dp++ = *sp++, *dp++ = *sp, sp += 3;
  488. }
  489. row_info->pixel_depth = 48;
  490. }
  491. else
  492. return; /* bad bit depth */
  493. row_info->channels = 3;
  494. /* Finally fix the color type if it records an alpha channel */
  495. if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
  496. row_info->color_type = PNG_COLOR_TYPE_RGB;
  497. }
  498. else
  499. return; /* The filler channel has gone already */
  500. /* Fix the rowbytes value. */
  501. row_info->rowbytes = dp-row;
  502. }
  503. #endif
  504. #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
  505. /* Swaps red and blue bytes within a pixel */
  506. void /* PRIVATE */
  507. png_do_bgr(png_row_infop row_info, png_bytep row)
  508. {
  509. png_debug(1, "in png_do_bgr");
  510. if ((row_info->color_type & PNG_COLOR_MASK_COLOR))
  511. {
  512. png_uint_32 row_width = row_info->width;
  513. if (row_info->bit_depth == 8)
  514. {
  515. if (row_info->color_type == PNG_COLOR_TYPE_RGB)
  516. {
  517. png_bytep rp;
  518. png_uint_32 i;
  519. for (i = 0, rp = row; i < row_width; i++, rp += 3)
  520. {
  521. png_byte save = *rp;
  522. *rp = *(rp + 2);
  523. *(rp + 2) = save;
  524. }
  525. }
  526. else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
  527. {
  528. png_bytep rp;
  529. png_uint_32 i;
  530. for (i = 0, rp = row; i < row_width; i++, rp += 4)
  531. {
  532. png_byte save = *rp;
  533. *rp = *(rp + 2);
  534. *(rp + 2) = save;
  535. }
  536. }
  537. }
  538. #ifdef PNG_16BIT_SUPPORTED
  539. else if (row_info->bit_depth == 16)
  540. {
  541. if (row_info->color_type == PNG_COLOR_TYPE_RGB)
  542. {
  543. png_bytep rp;
  544. png_uint_32 i;
  545. for (i = 0, rp = row; i < row_width; i++, rp += 6)
  546. {
  547. png_byte save = *rp;
  548. *rp = *(rp + 4);
  549. *(rp + 4) = save;
  550. save = *(rp + 1);
  551. *(rp + 1) = *(rp + 5);
  552. *(rp + 5) = save;
  553. }
  554. }
  555. else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
  556. {
  557. png_bytep rp;
  558. png_uint_32 i;
  559. for (i = 0, rp = row; i < row_width; i++, rp += 8)
  560. {
  561. png_byte save = *rp;
  562. *rp = *(rp + 4);
  563. *(rp + 4) = save;
  564. save = *(rp + 1);
  565. *(rp + 1) = *(rp + 5);
  566. *(rp + 5) = save;
  567. }
  568. }
  569. }
  570. #endif
  571. }
  572. }
  573. #endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */
  574. #if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \
  575. defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED)
  576. /* Added at libpng-1.5.10 */
  577. void /* PRIVATE */
  578. png_do_check_palette_indexes(png_structrp png_ptr, png_row_infop row_info)
  579. {
  580. if (png_ptr->num_palette < (1 << row_info->bit_depth) &&
  581. png_ptr->num_palette > 0) /* num_palette can be 0 in MNG files */
  582. {
  583. /* Calculations moved outside switch in an attempt to stop different
  584. * compiler warnings. 'padding' is in *bits* within the last byte, it is
  585. * an 'int' because pixel_depth becomes an 'int' in the expression below,
  586. * and this calculation is used because it avoids warnings that other
  587. * forms produced on either GCC or MSVC.
  588. */
  589. int padding = (-row_info->pixel_depth * row_info->width) & 7;
  590. png_bytep rp = png_ptr->row_buf + row_info->rowbytes;
  591. switch (row_info->bit_depth)
  592. {
  593. case 1:
  594. {
  595. /* in this case, all bytes must be 0 so we don't need
  596. * to unpack the pixels except for the rightmost one.
  597. */
  598. for (; rp > png_ptr->row_buf; rp--)
  599. {
  600. if (*rp >> padding != 0)
  601. png_ptr->num_palette_max = 1;
  602. padding = 0;
  603. }
  604. break;
  605. }
  606. case 2:
  607. {
  608. for (; rp > png_ptr->row_buf; rp--)
  609. {
  610. int i = ((*rp >> padding) & 0x03);
  611. if (i > png_ptr->num_palette_max)
  612. png_ptr->num_palette_max = i;
  613. i = (((*rp >> padding) >> 2) & 0x03);
  614. if (i > png_ptr->num_palette_max)
  615. png_ptr->num_palette_max = i;
  616. i = (((*rp >> padding) >> 4) & 0x03);
  617. if (i > png_ptr->num_palette_max)
  618. png_ptr->num_palette_max = i;
  619. i = (((*rp >> padding) >> 6) & 0x03);
  620. if (i > png_ptr->num_palette_max)
  621. png_ptr->num_palette_max = i;
  622. padding = 0;
  623. }
  624. break;
  625. }
  626. case 4:
  627. {
  628. for (; rp > png_ptr->row_buf; rp--)
  629. {
  630. int i = ((*rp >> padding) & 0x0f);
  631. if (i > png_ptr->num_palette_max)
  632. png_ptr->num_palette_max = i;
  633. i = (((*rp >> padding) >> 4) & 0x0f);
  634. if (i > png_ptr->num_palette_max)
  635. png_ptr->num_palette_max = i;
  636. padding = 0;
  637. }
  638. break;
  639. }
  640. case 8:
  641. {
  642. for (; rp > png_ptr->row_buf; rp--)
  643. {
  644. if (*rp > png_ptr->num_palette_max)
  645. png_ptr->num_palette_max = (int) *rp;
  646. }
  647. break;
  648. }
  649. default:
  650. break;
  651. }
  652. }
  653. }
  654. #endif /* PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED */
  655. #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
  656. defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
  657. #ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
  658. void PNGAPI
  659. png_set_user_transform_info(png_structrp png_ptr, png_voidp
  660. user_transform_ptr, int user_transform_depth, int user_transform_channels)
  661. {
  662. png_debug(1, "in png_set_user_transform_info");
  663. if (png_ptr == NULL)
  664. return;
  665. png_ptr->user_transform_ptr = user_transform_ptr;
  666. png_ptr->user_transform_depth = (png_byte)user_transform_depth;
  667. png_ptr->user_transform_channels = (png_byte)user_transform_channels;
  668. }
  669. #endif
  670. /* This function returns a pointer to the user_transform_ptr associated with
  671. * the user transform functions. The application should free any memory
  672. * associated with this pointer before png_write_destroy and png_read_destroy
  673. * are called.
  674. */
  675. #ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
  676. png_voidp PNGAPI
  677. png_get_user_transform_ptr(png_const_structrp png_ptr)
  678. {
  679. if (png_ptr == NULL)
  680. return (NULL);
  681. return png_ptr->user_transform_ptr;
  682. }
  683. #endif
  684. #ifdef PNG_USER_TRANSFORM_INFO_SUPPORTED
  685. png_uint_32 PNGAPI
  686. png_get_current_row_number(png_const_structrp png_ptr)
  687. {
  688. /* See the comments in png.h - this is the sub-image row when reading and
  689. * interlaced image.
  690. */
  691. if (png_ptr != NULL)
  692. return png_ptr->row_number;
  693. return PNG_UINT_32_MAX; /* help the app not to fail silently */
  694. }
  695. png_byte PNGAPI
  696. png_get_current_pass_number(png_const_structrp png_ptr)
  697. {
  698. if (png_ptr != NULL)
  699. return png_ptr->pass;
  700. return 8; /* invalid */
  701. }
  702. #endif /* PNG_USER_TRANSFORM_INFO_SUPPORTED */
  703. #endif /* PNG_READ_USER_TRANSFORM_SUPPORTED ||
  704. PNG_WRITE_USER_TRANSFORM_SUPPORTED */
  705. #endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */