libpng.3
上传用户:sesekoo
上传日期:2020-07-18
资源大小:21543k
文件大小:168k
源码类别:

界面编程

开发平台:

Visual C++

  1. .TH LIBPNG 3 "December 18, 2008"
  2. .SH NAME
  3. libpng - Portable Network Graphics (PNG) Reference Library 1.2.34
  4. .SH SYNOPSIS
  5. fIfB
  6. fB#include <png.h>fP
  7. fIfB
  8. fBpng_uint_32 png_access_version_number fI(voidfPfB);fP
  9. fIfB
  10. fBint png_check_sig (png_bytep fPfIsigfPfB, int fInumfPfB);fP
  11. fIfB
  12. fBvoid png_chunk_error (png_structp fPfIpng_ptrfPfB, png_const_charp fIerrorfPfB);fP
  13. fIfB
  14. fBvoid png_chunk_warning (png_structp fPfIpng_ptrfPfB, png_const_charp fImessagefPfB);fP
  15. fIfB
  16. fBvoid png_convert_from_struct_tm (png_timep fPfIptimefPfB, struct tm FAR * fIttimefPfB);fP
  17. fIfB
  18. fBvoid png_convert_from_time_t (png_timep fPfIptimefPfB, time_t fIttimefPfB);fP
  19. fIfB
  20. fBpng_charp png_convert_to_rfc1123 (png_structp fPfIpng_ptrfPfB, png_timep fIptimefPfB);fP
  21. fIfB
  22. fBpng_infop png_create_info_struct (png_structp fIpng_ptrfPfB);fP
  23. fIfB
  24. fBpng_structp png_create_read_struct (png_const_charp fPfIuser_png_verfPfB, png_voidp fPfIerror_ptrfPfB, png_error_ptr fPfIerror_fnfPfB, png_error_ptr fIwarn_fnfPfB);fP
  25. fIfB
  26. fBpng_structp png_create_read_struct_2(png_const_charp fPfIuser_png_verfPfB, png_voidp fPfIerror_ptrfPfB, png_error_ptr fPfIerror_fnfPfB, png_error_ptr fPfIwarn_fnfPfB, png_voidp fPfImem_ptrfPfB, png_malloc_ptr fPfImalloc_fnfPfB, png_free_ptr fIfree_fnfPfB);fP
  27. fIfB
  28. fBpng_structp png_create_write_struct (png_const_charp fPfIuser_png_verfPfB, png_voidp fPfIerror_ptrfPfB, png_error_ptr fPfIerror_fnfPfB, png_error_ptr fIwarn_fnfPfB);fP
  29. fIfB
  30. fBpng_structp png_create_write_struct_2(png_const_charp fPfIuser_png_verfPfB, png_voidp fPfIerror_ptrfPfB, png_error_ptr fPfIerror_fnfPfB, png_error_ptr fPfIwarn_fnfPfB, png_voidp fPfImem_ptrfPfB, png_malloc_ptr fPfImalloc_fnfPfB, png_free_ptr fIfree_fnfPfB);fP
  31. fIfB
  32. fBint png_debug(int fPfIlevelfPfB, png_const_charp fImessagefPfB);fP
  33. fIfB
  34. fBint png_debug1(int fPfIlevelfPfB, png_const_charp fPfImessagefPfB, fIp1fPfB);fP
  35. fIfB
  36. fBint png_debug2(int fPfIlevelfPfB, png_const_charp fPfImessagefPfB, fPfIp1fPfB, fIp2fPfB);fP
  37. fIfB
  38. fBvoid png_destroy_info_struct (png_structp fPfIpng_ptrfPfB, png_infopp fIinfo_ptr_ptrfPfB);fP
  39. fIfB
  40. fBvoid png_destroy_read_struct (png_structpp fPfIpng_ptr_ptrfPfB, png_infopp fPfIinfo_ptr_ptrfPfB, png_infopp fIend_info_ptr_ptrfPfB);fP
  41. fIfB
  42. fBvoid png_destroy_write_struct (png_structpp fPfIpng_ptr_ptrfPfB, png_infopp fIinfo_ptr_ptrfPfB);fP
  43. fIfB
  44. fBvoid png_error (png_structp fPfIpng_ptrfPfB, png_const_charp fIerrorfPfB);fP
  45. fIfB
  46. fBvoid png_free (png_structp fPfIpng_ptrfPfB, png_voidp fIptrfPfB);fP
  47. fIfB
  48. fBvoid png_free_chunk_list (png_structp fIpng_ptrfPfB);fP
  49. fIfB
  50. fBvoid png_free_default(png_structp fPfIpng_ptrfPfB, png_voidp fIptrfPfB);fP
  51. fIfB
  52. fBvoid png_free_data (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, int fInumfPfB);fP
  53. fIfB
  54. fBpng_byte png_get_bit_depth (png_structp fPfIpng_ptrfPfB, png_infop fIinfo_ptrfPfB);fP
  55. fIfB
  56. fBpng_uint_32 png_get_bKGD (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_color_16p fI*backgroundfPfB);fP
  57. fIfB
  58. fBpng_byte png_get_channels (png_structp fPfIpng_ptrfPfB, png_infop fIinfo_ptrfPfB);fP
  59. fIfB
  60. fBpng_uint_32 png_get_cHRM (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, double fPfI*white_xfPfB, double fPfI*white_yfPfB, double fPfI*red_xfPfB, double fPfI*red_yfPfB, double fPfI*green_xfPfB, double fPfI*green_yfPfB, double fPfI*blue_xfPfB, double fI*blue_yfPfB);fP
  61. fIfB
  62. fBpng_uint_32 png_get_cHRM_fixed (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_uint_32 fPfI*white_xfPfB, png_uint_32 fPfI*white_yfPfB, png_uint_32 fPfI*red_xfPfB, png_uint_32 fPfI*red_yfPfB, png_uint_32 fPfI*green_xfPfB, png_uint_32 fPfI*green_yfPfB, png_uint_32 fPfI*blue_xfPfB, png_uint_32 fI*blue_yfPfB);fP
  63. fIfB
  64. fBpng_byte png_get_color_type (png_structp fPfIpng_ptrfPfB, png_infop fIinfo_ptrfPfB);fP
  65. fIfB
  66. fBpng_byte png_get_compression_type (png_structp fPfIpng_ptrfPfB, png_infop fIinfo_ptrfPfB);fP
  67. fIfB
  68. fBpng_byte png_get_copyright (png_structp fIpng_ptrfPfB);fP
  69. fIfB
  70. fBpng_voidp png_get_error_ptr (png_structp fIpng_ptrfPfB);fP
  71. fIfB
  72. fBpng_byte png_get_filter_type (png_structp fPfIpng_ptrfPfB, png_infop fIinfo_ptrfPfB);fP
  73. fIfB
  74. fBpng_uint_32 png_get_gAMA (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, double fI*file_gammafPfB);fP
  75. fIfB
  76. fBpng_uint_32 png_get_gAMA_fixed (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_uint_32 fI*int_file_gammafPfB);fP
  77. fIfB
  78. fBpng_byte png_get_header_ver (png_structp fIpng_ptrfPfB);fP
  79. fIfB
  80. fBpng_byte png_get_header_version (png_structp fIpng_ptrfPfB);fP
  81. fIfB
  82. fBpng_uint_32 png_get_hIST (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_uint_16p fI*histfPfB);fP
  83. fIfB
  84. fBpng_uint_32 png_get_iCCP (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_charpp fPfInamefPfB, int fPfI*compression_typefPfB, png_charpp fPfIprofilefPfB, png_uint_32 fI*proflenfPfB);fP
  85. fIfB
  86. fBpng_uint_32 png_get_IHDR (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_uint_32 fPfI*widthfPfB, png_uint_32 fPfI*heightfPfB, int fPfI*bit_depthfPfB, int fPfI*color_typefPfB, int fPfI*interlace_typefPfB, int fPfI*compression_typefPfB, int fI*filter_typefPfB);fP
  87. fIfB
  88. fBpng_uint_32 png_get_image_height (png_structp fPfIpng_ptrfPfB, png_infop fIinfo_ptrfPfB);fP
  89. fIfB
  90. fBpng_uint_32 png_get_image_width (png_structp fPfIpng_ptrfPfB, png_infop fIinfo_ptrfPfB);fP
  91. fIfB
  92. fB#if fI!defined(PNG_1_0_X)
  93. fBpng_int_32 png_get_int_32 (png_bytep fIbuffPfB);fP
  94. fIfB#endif
  95. fIfB
  96. fBpng_byte png_get_interlace_type (png_structp fPfIpng_ptrfPfB, png_infop fIinfo_ptrfPfB);fP
  97. fIfB
  98. fBpng_voidp png_get_io_ptr (png_structp fIpng_ptrfPfB);fP
  99. fIfB
  100. fBpng_byte png_get_libpng_ver (png_structp fIpng_ptrfPfB);fP
  101. fIfB
  102. fBpng_voidp png_get_mem_ptr(png_structp fIpng_ptrfPfB);fP
  103. fIfB
  104. fBpng_uint_32 png_get_oFFs (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_uint_32 fPfI*offset_xfPfB, png_uint_32 fPfI*offset_yfPfB, int fI*unit_typefPfB);fP
  105. fIfB
  106. fBpng_uint_32 png_get_pCAL (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_charp fPfI*purposefPfB, png_int_32 fPfI*X0fPfB, png_int_32 fPfI*X1fPfB, int fPfI*typefPfB, int fPfI*nparamsfPfB, png_charp fPfI*unitsfPfB, png_charpp fI*paramsfPfB);fP
  107. fIfB
  108. fBpng_uint_32 png_get_pHYs (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_uint_32 fPfI*res_xfPfB, png_uint_32 fPfI*res_yfPfB, int fI*unit_typefPfB);fP
  109. fIfB
  110. fBfloat png_get_pixel_aspect_ratio (png_structp fPfIpng_ptrfPfB, png_infop fIinfo_ptrfPfB);fP
  111. fIfB
  112. fBpng_uint_32 png_get_pixels_per_meter (png_structp fPfIpng_ptrfPfB, png_infop fIinfo_ptrfPfB);fP
  113. fIfB
  114. fBpng_voidp png_get_progressive_ptr (png_structp fIpng_ptrfPfB);fP
  115. fIfB
  116. fBpng_uint_32 png_get_PLTE (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_colorp fPfI*palettefPfB, int fI*num_palettefPfB);fP
  117. fIfB
  118. fBpng_byte png_get_rgb_to_gray_status (png_structp fIpng_ptr)
  119. fBpng_uint_32 png_get_rowbytes (png_structp fPfIpng_ptrfPfB, png_infop fIinfo_ptrfPfB);fP
  120. fIfB
  121. fBpng_bytepp png_get_rows (png_structp fPfIpng_ptrfPfB, png_infop fIinfo_ptrfPfB);fP
  122. fIfB
  123. fBpng_uint_32 png_get_sBIT (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_color_8p fI*sig_bitfPfB);fP
  124. fIfB
  125. fBpng_bytep png_get_signature (png_structp fPfIpng_ptrfPfB, png_infop fIinfo_ptrfPfB);fP
  126. fIfB
  127. fBpng_uint_32 png_get_sPLT (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_spalette_p fI*splt_ptrfPfB);fP
  128. fIfB
  129. fBpng_uint_32 png_get_sRGB (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, int fI*intentfPfB);fP
  130. fIfB
  131. fBpng_uint_32 png_get_text (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_textp fPfI*text_ptrfPfB, int fI*num_textfPfB);fP
  132. fIfB
  133. fBpng_uint_32 png_get_tIME (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_timep fI*mod_timefPfB);fP
  134. fIfB
  135. fBpng_uint_32 png_get_tRNS (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_bytep fPfI*transfPfB, int fPfI*num_transfPfB, png_color_16p fI*trans_valuesfPfB);fP
  136. fIfB
  137. fB#if fI!defined(PNG_1_0_X)
  138. fBpng_uint_16 png_get_uint_16 (png_bytep fIbuffPfB);fP
  139. fIfB
  140. fBpng_uint_32 png_get_uint_31 (png_bytep fIbuffPfB);fP
  141. fIfB
  142. fBpng_uint_32 png_get_uint_32 (png_bytep fIbuffPfB);fP
  143. fIfB#endif
  144. fIfB
  145. fBpng_uint_32 png_get_unknown_chunks (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_unknown_chunkpp fIunknownsfPfB);fP
  146. fIfB
  147. fBpng_voidp png_get_user_chunk_ptr (png_structp fIpng_ptrfPfB);fP
  148. fIfB
  149. fBpng_uint_32 png_get_user_height_max( png_structp fIpng_ptrfPfB);fP
  150. fIfB
  151. fBpng_voidp png_get_user_transform_ptr (png_structp fIpng_ptrfPfB);fP
  152. fIfB
  153. fBpng_uint_32 png_get_user_width_max (png_structp fIpng_ptrfPfB);fP
  154. fIfB
  155. fBpng_uint_32 png_get_valid (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_uint_32 fIflagfPfB);fP
  156. fIfB
  157. fBpng_int_32 png_get_x_offset_microns (png_structp fPfIpng_ptrfPfB, png_infop fIinfo_ptrfPfB);fP
  158. fIfB
  159. fBpng_int_32 png_get_x_offset_pixels (png_structp fPfIpng_ptrfPfB, png_infop fIinfo_ptrfPfB);fP
  160. fIfB
  161. fBpng_uint_32 png_get_x_pixels_per_meter (png_structp fPfIpng_ptrfPfB, png_infop fIinfo_ptrfPfB);fP
  162. fIfB
  163. fBpng_int_32 png_get_y_offset_microns (png_structp fPfIpng_ptrfPfB, png_infop fIinfo_ptrfPfB);fP
  164. fIfB
  165. fBpng_int_32 png_get_y_offset_pixels (png_structp fPfIpng_ptrfPfB, png_infop fIinfo_ptrfPfB);fP
  166. fIfB
  167. fBpng_uint_32 png_get_y_pixels_per_meter (png_structp fPfIpng_ptrfPfB, png_infop fIinfo_ptrfPfB);fP
  168. fIfB
  169. fBpng_uint_32 png_get_compression_buffer_size (png_structp fIpng_ptrfPfB);fP
  170. fIfB
  171. fBint png_handle_as_unknown (png_structp fPfIpng_ptrfPfB, png_bytep fIchunk_namefPfB);fP
  172. fIfB
  173. fBvoid png_init_io (png_structp fPfIpng_ptrfPfB, FILE fI*fpfPfB);fP
  174. fIfB
  175. fBDEPRECATED: void png_info_init (png_infop fIinfo_ptrfPfB);fP
  176. fIfB
  177. fBDEPRECATED: void png_info_init_2 (png_infopp fPfIptr_ptrfPfB, png_size_t fIpng_info_struct_sizefPfB);fP
  178. fIfB
  179. fBpng_voidp png_malloc (png_structp fPfIpng_ptrfPfB, png_uint_32 fIsizefPfB);fP
  180. fIfB
  181. fBpng_voidp png_malloc_default(png_structp fPfIpng_ptrfPfB, png_uint_32 fIsizefPfB);fP
  182. fIfB
  183. fBvoidp png_memcpy (png_voidp fPfIs1fPfB, png_voidp fPfIs2fPfB, png_size_t fIsizefPfB);fP
  184. fIfB
  185. fBpng_voidp png_memcpy_check (png_structp fPfIpng_ptrfPfB, png_voidp fPfIs1fPfB, png_voidp fPfIs2fPfB, png_uint_32 fIsizefPfB);fP
  186. fIfB
  187. fBvoidp png_memset (png_voidp fPfIs1fPfB, int fPfIvaluefPfB, png_size_t fIsizefPfB);fP
  188. fIfB
  189. fBpng_voidp png_memset_check (png_structp fPfIpng_ptrfPfB, png_voidp fPfIs1fPfB, int fPfIvaluefPfB, png_uint_32 fIsizefPfB);fP
  190. fIfB
  191. fBDEPRECATED: void png_permit_empty_plte (png_structp fPfIpng_ptrfPfB, int fIempty_plte_permittedfPfB);fP
  192. fIfB
  193. fBvoid png_process_data (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_bytep fPfIbufferfPfB, png_size_t fIbuffer_sizefPfB);fP
  194. fIfB
  195. fBvoid png_progressive_combine_row (png_structp fPfIpng_ptrfPfB, png_bytep fPfIold_rowfPfB, png_bytep fInew_rowfPfB);fP
  196. fIfB
  197. fBvoid png_read_destroy (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_infop fIend_info_ptrfPfB);fP
  198. fIfB
  199. fBvoid png_read_end (png_structp fPfIpng_ptrfPfB, png_infop fIinfo_ptrfPfB);fP
  200. fIfB
  201. fBvoid png_read_image (png_structp fPfIpng_ptrfPfB, png_bytepp fIimagefPfB);fP
  202. fIfB
  203. fBDEPRECATED: void png_read_init (png_structp fIpng_ptrfPfB);fP
  204. fIfB
  205. fBDEPRECATED: void png_read_init_2 (png_structpp fPfIptr_ptrfPfB, png_const_charp fPfIuser_png_verfPfB, png_size_t fPfIpng_struct_sizefPfB, png_size_t fIpng_info_sizefPfB);fP
  206. fIfB
  207. fBvoid png_read_info (png_structp fPfIpng_ptrfPfB, png_infop fIinfo_ptrfPfB);fP
  208. fIfB
  209. fBvoid png_read_png (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, int fPfItransformsfPfB, png_voidp fIparamsfPfB);fP
  210. fIfB
  211. fBvoid png_read_row (png_structp fPfIpng_ptrfPfB, png_bytep fPfIrowfPfB, png_bytep fIdisplay_rowfPfB);fP
  212. fIfB
  213. fBvoid png_read_rows (png_structp fPfIpng_ptrfPfB, png_bytepp fPfIrowfPfB, png_bytepp fPfIdisplay_rowfPfB, png_uint_32 fInum_rowsfPfB);fP
  214. fIfB
  215. fBvoid png_read_update_info (png_structp fPfIpng_ptrfPfB, png_infop fIinfo_ptrfPfB);fP
  216. fIfB
  217. fB#if fI!defined(PNG_1_0_X)
  218. fBpng_save_int_32 (png_bytep fPfIbuffPfB, png_int_32 fIifPfB);fP
  219. fIfB
  220. fBvoid png_save_uint_16 (png_bytep fPfIbuffPfB, unsigned int fIifPfB);fP
  221. fIfB
  222. fBvoid png_save_uint_32 (png_bytep fPfIbuffPfB, png_uint_32 fIifPfB);fP
  223. fIfB
  224. fBvoid png_set_add_alpha (png_structp fPfIpng_ptrfPfB, png_uint_32 fPfIfillerfPfB, int fIflagsfPfB);fP
  225. fIfB#endif
  226. fIfB
  227. fBvoid png_set_background (png_structp fPfIpng_ptrfPfB, png_color_16p fPfIbackground_colorfPfB, int fPfIbackground_gamma_codefPfB, int fPfIneed_expandfPfB, double fIbackground_gammafPfB);fP
  228. fIfB
  229. fBvoid png_set_bgr (png_structp fIpng_ptrfPfB);fP
  230. fIfB
  231. fBvoid png_set_bKGD (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_color_16p fIbackgroundfPfB);fP
  232. fIfB
  233. fBvoid png_set_cHRM (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, double fPfIwhite_xfPfB, double fPfIwhite_yfPfB, double fPfIred_xfPfB, double fPfIred_yfPfB, double fPfIgreen_xfPfB, double fPfIgreen_yfPfB, double fPfIblue_xfPfB, double fIblue_yfPfB);fP
  234. fIfB
  235. fBvoid png_set_cHRM_fixed (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_uint_32 fPfIwhite_xfPfB, png_uint_32 fPfIwhite_yfPfB, png_uint_32 fPfIred_xfPfB, png_uint_32 fPfIred_yfPfB, png_uint_32 fPfIgreen_xfPfB, png_uint_32 fPfIgreen_yfPfB, png_uint_32 fPfIblue_xfPfB, png_uint_32 fIblue_yfPfB);fP
  236. fIfB
  237. fBvoid png_set_compression_level (png_structp fPfIpng_ptrfPfB, int fIlevelfPfB);fP
  238. fIfB
  239. fBvoid png_set_compression_mem_level (png_structp fPfIpng_ptrfPfB, int fImem_levelfPfB);fP
  240. fIfB
  241. fBvoid png_set_compression_method (png_structp fPfIpng_ptrfPfB, int fImethodfPfB);fP
  242. fIfB
  243. fBvoid png_set_compression_strategy (png_structp fPfIpng_ptrfPfB, int fIstrategyfPfB);fP
  244. fIfB
  245. fBvoid png_set_compression_window_bits (png_structp fPfIpng_ptrfPfB, int fIwindow_bitsfPfB);fP
  246. fIfB
  247. fBvoid png_set_crc_action (png_structp fPfIpng_ptrfPfB, int fPfIcrit_actionfPfB, int fIancil_actionfPfB);fP
  248. fIfB
  249. fBvoid png_set_dither (png_structp fPfIpng_ptrfPfB, png_colorp fPfIpalettefPfB, int fPfInum_palettefPfB, int fPfImaximum_colorsfPfB, png_uint_16p fPfIhistogramfPfB, int fIfull_ditherfPfB);fP
  250. fIfB
  251. fBvoid png_set_error_fn (png_structp fPfIpng_ptrfPfB, png_voidp fPfIerror_ptrfPfB, png_error_ptr fPfIerror_fnfPfB, png_error_ptr fIwarning_fnfPfB);fP
  252. fIfB
  253. fBvoid png_set_expand (png_structp fIpng_ptrfPfB);fP
  254. fIfB
  255. fBvoid png_set_expand_gray_1_2_4_to_8(png_structp fIpng_ptrfPfB);fP
  256. fIfB
  257. fBvoid png_set_filler (png_structp fPfIpng_ptrfPfB, png_uint_32 fPfIfillerfPfB, int fIflagsfPfB);fP
  258. fIfB
  259. fBvoid png_set_filter (png_structp fPfIpng_ptrfPfB, int fPfImethodfPfB, int fIfiltersfPfB);fP
  260. fIfB
  261. fBvoid png_set_filter_heuristics (png_structp fPfIpng_ptrfPfB, int fPfIheuristic_methodfPfB, int fPfInum_weightsfPfB, png_doublep fPfIfilter_weightsfPfB, png_doublep fIfilter_costsfPfB);fP
  262. fIfB
  263. fBvoid png_set_flush (png_structp fPfIpng_ptrfPfB, int fInrowsfPfB);fP
  264. fIfB
  265. fBvoid png_set_gamma (png_structp fPfIpng_ptrfPfB, double fPfIscreen_gammafPfB, double fIdefault_file_gammafPfB);fP
  266. fIfB
  267. fBvoid png_set_gAMA (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, double fIfile_gammafPfB);fP
  268. fIfB
  269. fBvoid png_set_gAMA_fixed (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_uint_32 fIfile_gammafPfB);fP
  270. fIfB
  271. fBvoid png_set_gray_1_2_4_to_8(png_structp fIpng_ptrfPfB);fP
  272. fIfB
  273. fBvoid png_set_gray_to_rgb (png_structp fIpng_ptrfPfB);fP
  274. fIfB
  275. fBvoid png_set_hIST (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_uint_16p fIhistfPfB);fP
  276. fIfB
  277. fBvoid png_set_iCCP (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_charp fPfInamefPfB, int fPfIcompression_typefPfB, png_charp fPfIprofilefPfB, png_uint_32 fIproflenfPfB);fP
  278. fIfB
  279. fBint png_set_interlace_handling (png_structp fIpng_ptrfPfB);fP
  280. fIfB
  281. fBvoid png_set_invalid (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, int fImaskfPfB);fP
  282. fIfB
  283. fBvoid png_set_invert_alpha (png_structp fIpng_ptrfPfB);fP
  284. fIfB
  285. fBvoid png_set_invert_mono (png_structp fIpng_ptrfPfB);fP
  286. fIfB
  287. fBvoid png_set_IHDR (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_uint_32 fPfIwidthfPfB, png_uint_32 fPfIheightfPfB, int fPfIbit_depthfPfB, int fPfIcolor_typefPfB, int fPfIinterlace_typefPfB, int fPfIcompression_typefPfB, int fIfilter_typefPfB);fP
  288. fIfB
  289. fBvoid png_set_keep_unknown_chunks (png_structp fPfIpng_ptrfPfB, int fPfIkeepfPfB, png_bytep fPfIchunk_listfPfB, int fInum_chunksfPfB);fP
  290. fIfB
  291. fBvoid png_set_mem_fn(png_structp fPfIpng_ptrfPfB, png_voidp fPfImem_ptrfPfB, png_malloc_ptr fPfImalloc_fnfPfB, png_free_ptr fIfree_fnfPfB);fP
  292. fIfB
  293. fBvoid png_set_oFFs (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_uint_32 fPfIoffset_xfPfB, png_uint_32 fPfIoffset_yfPfB, int fIunit_typefPfB);fP
  294. fIfB
  295. fBvoid png_set_packing (png_structp fIpng_ptrfPfB);fP
  296. fIfB
  297. fBvoid png_set_packswap (png_structp fIpng_ptrfPfB);fP
  298. fIfB
  299. fBvoid png_set_palette_to_rgb(png_structp fIpng_ptrfPfB);fP
  300. fIfB
  301. fBvoid png_set_pCAL (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_charp fPfIpurposefPfB, png_int_32 fPfIX0fPfB, png_int_32 fPfIX1fPfB, int fPfItypefPfB, int fPfInparamsfPfB, png_charp fPfIunitsfPfB, png_charpp fIparamsfPfB);fP
  302. fIfB
  303. fBvoid png_set_pHYs (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_uint_32 fPfIres_xfPfB, png_uint_32 fPfIres_yfPfB, int fIunit_typefPfB);fP
  304. fIfB
  305. fBvoid png_set_progressive_read_fn (png_structp fPfIpng_ptrfPfB, png_voidp fPfIprogressive_ptrfPfB, png_progressive_info_ptr fPfIinfo_fnfPfB, png_progressive_row_ptr fPfIrow_fnfPfB, png_progressive_end_ptr fIend_fnfPfB);fP
  306. fIfB
  307. fBvoid png_set_PLTE (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_colorp fPfIpalettefPfB, int fInum_palettefPfB);fP
  308. fIfB
  309. fBvoid png_set_read_fn (png_structp fPfIpng_ptrfPfB, png_voidp fPfIio_ptrfPfB, png_rw_ptr fIread_data_fnfPfB);fP
  310. fIfB
  311. fBvoid png_set_read_status_fn (png_structp fPfIpng_ptrfPfB, png_read_status_ptr fIread_row_fnfPfB);fP
  312. fIfB
  313. fBvoid png_set_read_user_transform_fn (png_structp fPfIpng_ptrfPfB, png_user_transform_ptr fIread_user_transform_fnfPfB);fP
  314. fIfB
  315. fBvoid png_set_rgb_to_gray (png_structp fPfIpng_ptrfPfB, int fPfIerror_actionfPfB, double fPfIredfPfB, double fIgreenfPfB);fP
  316. fIfB
  317. fBvoid png_set_rgb_to_gray_fixed (png_structp fPfIpng_ptrfPfB, int error_action png_fixed_point fPfIredfPfB, png_fixed_point fIgreenfPfB);fP
  318. fIfB
  319. fBvoid png_set_rows (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_bytepp fIrow_pointersfPfB);fP
  320. fIfB
  321. fBvoid png_set_sBIT (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_color_8p fIsig_bitfPfB);fP
  322. fIfB
  323. fBvoid png_set_sCAL (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_charp fPfIunitfPfB, double fPfIwidthfPfB, double fIheightfPfB);fP
  324. fIfB
  325. fBvoid png_set_shift (png_structp fPfIpng_ptrfPfB, png_color_8p fItrue_bitsfPfB);fP
  326. fIfB
  327. fBvoid png_set_sig_bytes (png_structp fPfIpng_ptrfPfB, int fInum_bytesfPfB);fP
  328. fIfB
  329. fBvoid png_set_sPLT (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_spalette_p fPfIsplt_ptrfPfB, int fInum_spalettesfPfB);fP
  330. fIfB
  331. fBvoid png_set_sRGB (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, int fIintentfPfB);fP
  332. fIfB
  333. fBvoid png_set_sRGB_gAMA_and_cHRM (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, int fIintentfPfB);fP
  334. fIfB
  335. fBvoid png_set_strip_16 (png_structp fIpng_ptrfPfB);fP
  336. fIfB
  337. fBvoid png_set_strip_alpha (png_structp fIpng_ptrfPfB);fP
  338. fIfB
  339. fBvoid png_set_swap (png_structp fIpng_ptrfPfB);fP
  340. fIfB
  341. fBvoid png_set_swap_alpha (png_structp fIpng_ptrfPfB);fP
  342. fIfB
  343. fBvoid png_set_text (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_textp fPfItext_ptrfPfB, int fInum_textfPfB);fP
  344. fIfB
  345. fBvoid png_set_tIME (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_timep fImod_timefPfB);fP
  346. fIfB
  347. fBvoid png_set_tRNS (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_bytep fPfItransfPfB, int fPfInum_transfPfB, png_color_16p fItrans_valuesfPfB);fP
  348. fIfB
  349. fBvoid png_set_tRNS_to_alpha(png_structp fIpng_ptrfPfB);fP
  350. fIfB
  351. fBpng_uint_32 png_set_unknown_chunks (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, png_unknown_chunkp fPfIunknownsfPfB, int fPfInumfPfB, int fIlocationfPfB);fP
  352. fIfB
  353. fBvoid png_set_unknown_chunk_location(png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, int fPfIchunkfPfB, int fIlocationfPfB);fP
  354. fIfB
  355. fBvoid png_set_read_user_chunk_fn (png_structp fPfIpng_ptrfPfB, png_voidp fPfIuser_chunk_ptrfPfB, png_user_chunk_ptr fIread_user_chunk_fnfPfB);fP
  356. fIfB
  357. fBvoid png_set_user_limits (png_structp fPfIpng_ptrfPfB, png_uint_32 fPfIuser_width_maxfPfB, png_uint_32 fIuser_height_maxfPfB);fP
  358. fIfB
  359. fBvoid png_set_user_transform_info (png_structp fPfIpng_ptrfPfB, png_voidp fPfIuser_transform_ptrfPfB, int fPfIuser_transform_depthfPfB, int fIuser_transform_channelsfPfB);fP
  360. fIfB
  361. fBvoid png_set_write_fn (png_structp fPfIpng_ptrfPfB, png_voidp fPfIio_ptrfPfB, png_rw_ptr fPfIwrite_data_fnfPfB, png_flush_ptr fIoutput_flush_fnfPfB);fP
  362. fIfB
  363. fBvoid png_set_write_status_fn (png_structp fPfIpng_ptrfPfB, png_write_status_ptr fIwrite_row_fnfPfB);fP
  364. fIfB
  365. fBvoid png_set_write_user_transform_fn (png_structp fPfIpng_ptrfPfB, png_user_transform_ptr fIwrite_user_transform_fnfPfB);fP
  366. fIfB
  367. fBvoid png_set_compression_buffer_size(png_structp fPfIpng_ptrfPfB, png_uint_32 fIsizefPfB);fP
  368. fIfB
  369. fBint png_sig_cmp (png_bytep fPfIsigfPfB, png_size_t fPfIstartfPfB, png_size_t fInum_to_checkfPfB);fP
  370. fIfB
  371. fBvoid png_start_read_image (png_structp fIpng_ptrfPfB);fP
  372. fIfB
  373. fBvoid png_warning (png_structp fPfIpng_ptrfPfB, png_const_charp fImessagefPfB);fP
  374. fIfB
  375. fBvoid png_write_chunk (png_structp fPfIpng_ptrfPfB, png_bytep fPfIchunk_namefPfB, png_bytep fPfIdatafPfB, png_size_t fIlengthfPfB);fP
  376. fIfB
  377. fBvoid png_write_chunk_data (png_structp fPfIpng_ptrfPfB, png_bytep fPfIdatafPfB, png_size_t fIlengthfPfB);fP
  378. fIfB
  379. fBvoid png_write_chunk_end (png_structp fIpng_ptrfPfB);fP
  380. fIfB
  381. fBvoid png_write_chunk_start (png_structp fPfIpng_ptrfPfB, png_bytep fPfIchunk_namefPfB, png_uint_32 fIlengthfPfB);fP
  382. fIfB
  383. fBvoid png_write_destroy (png_structp fIpng_ptrfPfB);fP
  384. fIfB
  385. fBvoid png_write_end (png_structp fPfIpng_ptrfPfB, png_infop fIinfo_ptrfPfB);fP
  386. fIfB
  387. fBvoid png_write_flush (png_structp fIpng_ptrfPfB);fP
  388. fIfB
  389. fBvoid png_write_image (png_structp fPfIpng_ptrfPfB, png_bytepp fIimagefPfB);fP
  390. fIfB
  391. fBDEPRECATED: void png_write_init (png_structp fIpng_ptrfPfB);fP
  392. fIfB
  393. fBDEPRECATED: void png_write_init_2 (png_structpp fPfIptr_ptrfPfB, png_const_charp fPfIuser_png_verfPfB, png_size_t fPfIpng_struct_sizefPfB, png_size_t fIpng_info_sizefPfB);fP
  394. fIfB
  395. fBvoid png_write_info (png_structp fPfIpng_ptrfPfB, png_infop fIinfo_ptrfPfB);fP
  396. fIfB
  397. fBvoid png_write_info_before_PLTE (png_structp fPfIpng_ptrfPfB, png_infop fIinfo_ptrfPfB);fP
  398. fIfB
  399. fBvoid png_write_png (png_structp fPfIpng_ptrfPfB, png_infop fPfIinfo_ptrfPfB, int fPfItransformsfPfB, png_voidp fIparamsfPfB);fP
  400. fIfB
  401. fBvoid png_write_row (png_structp fPfIpng_ptrfPfB, png_bytep fIrowfPfB);fP
  402. fIfB
  403. fBvoid png_write_rows (png_structp fPfIpng_ptrfPfB, png_bytepp fPfIrowfPfB, png_uint_32 fInum_rowsfPfB);fP
  404. fIfB
  405. fBvoidpf png_zalloc (voidpf fPfIpng_ptrfPfB, uInt fPfIitemsfPfB, uInt fIsizefPfB);fP
  406. fIfB
  407. fBvoid png_zfree (voidpf fPfIpng_ptrfPfB, voidpf fIptrfPfB);fP
  408. fIfB
  409. .SH DESCRIPTION
  410. The
  411. .I libpng
  412. library supports encoding, decoding, and various manipulations of
  413. the Portable Network Graphics (PNG) format image files.  It uses the
  414. .IR zlib(3)
  415. compression library.
  416. Following is a copy of the libpng.txt file that accompanies libpng.
  417. .SH LIBPNG.TXT
  418. libpng.txt - A description on how to use and modify libpng
  419.  libpng version 1.2.34 - December 18, 2008
  420.  Updated and distributed by Glenn Randers-Pehrson
  421.  <glennrp at users.sourceforge.net>
  422.  Copyright (c) 1998-2008 Glenn Randers-Pehrson
  423.  For conditions of distribution and use, see copyright
  424.  notice in png.h.
  425.  Based on:
  426.  libpng versions 0.97, January 1998, through 1.2.34 - December 18, 2008
  427.  Updated and distributed by Glenn Randers-Pehrson
  428.  Copyright (c) 1998-2008 Glenn Randers-Pehrson
  429.  libpng 1.0 beta 6  version 0.96 May 28, 1997
  430.  Updated and distributed by Andreas Dilger
  431.  Copyright (c) 1996, 1997 Andreas Dilger
  432.  libpng 1.0 beta 2 - version 0.88  January 26, 1996
  433.  For conditions of distribution and use, see copyright
  434.  notice in png.h. Copyright (c) 1995, 1996 Guy Eric
  435.  Schalnat, Group 42, Inc.
  436.  Updated/rewritten per request in the libpng FAQ
  437.  Copyright (c) 1995, 1996 Frank J. T. Wojcik
  438.  December 18, 1995 & January 20, 1996
  439. .SH I. Introduction
  440. This file describes how to use and modify the PNG reference library
  441. (known as libpng) for your own use.  There are five sections to this
  442. file: introduction, structures, reading, writing, and modification and
  443. configuration notes for various special platforms.  In addition to this
  444. file, example.c is a good starting point for using the library, as
  445. it is heavily commented and should include everything most people
  446. will need.  We assume that libpng is already installed; see the
  447. INSTALL file for instructions on how to install libpng.
  448. For examples of libpng usage, see the files "example.c", "pngtest.c",
  449. and the files in the "contrib" directory, all of which are included in the
  450. libpng distribution.
  451. Libpng was written as a companion to the PNG specification, as a way
  452. of reducing the amount of time and effort it takes to support the PNG
  453. file format in application programs.
  454. The PNG specification (second edition), November 2003, is available as
  455. a W3C Recommendation and as an ISO Standard (ISO/IEC 15948:2003 (E)) at
  456. <http://www.w3.org/TR/2003/REC-PNG-20031110/
  457. The W3C and ISO documents have identical technical content.
  458. The PNG-1.2 specification is available at
  459. <http://www.libpng.org/pub/png/documents/>.  It is technically equivalent
  460. to the PNG specification (second edition) but has some additional material.
  461. The PNG-1.0 specification is available
  462. as RFC 2083 <http://www.libpng.org/pub/png/documents/> and as a
  463. W3C Recommendation <http://www.w3.org/TR/REC.png.html>.
  464. Some additional chunks are described in the special-purpose public chunks
  465. documents at <http://www.libpng.org/pub/png/documents/>.
  466. Other information
  467. about PNG, and the latest version of libpng, can be found at the PNG home
  468. page, <http://www.libpng.org/pub/png/>.
  469. Most users will not have to modify the library significantly; advanced
  470. users may want to modify it more.  All attempts were made to make it as
  471. complete as possible, while keeping the code easy to understand.
  472. Currently, this library only supports C.  Support for other languages
  473. is being considered.
  474. Libpng has been designed to handle multiple sessions at one time,
  475. to be easily modifiable, to be portable to the vast majority of
  476. machines (ANSI, K&R, 16-, 32-, and 64-bit) available, and to be easy
  477. to use.  The ultimate goal of libpng is to promote the acceptance of
  478. the PNG file format in whatever way possible.  While there is still
  479. work to be done (see the TODO file), libpng should cover the
  480. majority of the needs of its users.
  481. Libpng uses zlib for its compression and decompression of PNG files.
  482. Further information about zlib, and the latest version of zlib, can
  483. be found at the zlib home page, <http://www.info-zip.org/pub/infozip/zlib/>.
  484. The zlib compression utility is a general purpose utility that is
  485. useful for more than PNG files, and can be used without libpng.
  486. See the documentation delivered with zlib for more details.
  487. You can usually find the source files for the zlib utility wherever you
  488. find the libpng source files.
  489. Libpng is thread safe, provided the threads are using different
  490. instances of the structures.  Each thread should have its own
  491. png_struct and png_info instances, and thus its own image.
  492. Libpng does not protect itself against two threads using the
  493. same instance of a structure.
  494. .SH II. Structures
  495. There are two main structures that are important to libpng, png_struct
  496. and png_info.  The first, png_struct, is an internal structure that
  497. will not, for the most part, be used by a user except as the first
  498. variable passed to every libpng function call.
  499. The png_info structure is designed to provide information about the
  500. PNG file.  At one time, the fields of png_info were intended to be
  501. directly accessible to the user.  However, this tended to cause problems
  502. with applications using dynamically loaded libraries, and as a result
  503. a set of interface functions for png_info (the png_get_*() and png_set_*()
  504. functions) was developed.  The fields of png_info are still available for
  505. older applications, but it is suggested that applications use the new
  506. interfaces if at all possible.
  507. Applications that do make direct access to the members of png_struct (except
  508. for png_ptr->jmpbuf) must be recompiled whenever the library is updated,
  509. and applications that make direct access to the members of png_info must
  510. be recompiled if they were compiled or loaded with libpng version 1.0.6,
  511. in which the members were in a different order.  In version 1.0.7, the
  512. members of the png_info structure reverted to the old order, as they were
  513. in versions 0.97c through 1.0.5.  Starting with version 2.0.0, both
  514. structures are going to be hidden, and the contents of the structures will
  515. only be accessible through the png_get/png_set functions.
  516. The png.h header file is an invaluable reference for programming with libpng.
  517. And while I'm on the topic, make sure you include the libpng header file:
  518. #include <png.h>
  519. .SH III. Reading
  520. We'll now walk you through the possible functions to call when reading
  521. in a PNG file sequentially, briefly explaining the syntax and purpose
  522. of each one.  See example.c and png.h for more detail.  While
  523. progressive reading is covered in the next section, you will still
  524. need some of the functions discussed in this section to read a PNG
  525. file.
  526. .SS Setup
  527. You will want to do the I/O initialization(*) before you get into libpng,
  528. so if it doesn't work, you don't have much to undo.  Of course, you
  529. will also want to insure that you are, in fact, dealing with a PNG
  530. file.  Libpng provides a simple check to see if a file is a PNG file.
  531. To use it, pass in the first 1 to 8 bytes of the file to the function
  532. png_sig_cmp(), and it will return 0 if the bytes match the corresponding
  533. bytes of the PNG signature, or nonzero otherwise.  Of course, the more bytes
  534. you pass in, the greater the accuracy of the prediction.
  535. If you are intending to keep the file pointer open for use in libpng,
  536. you must ensure you don't read more than 8 bytes from the beginning
  537. of the file, and you also have to make a call to png_set_sig_bytes_read()
  538. with the number of bytes you read from the beginning.  Libpng will
  539. then only check the bytes (if any) that your program didn't read.
  540. (*): If you are not using the standard I/O functions, you will need
  541. to replace them with custom functions.  See the discussion under
  542. Customizing libpng.
  543.     FILE *fp = fopen(file_name, "rb");
  544.     if (!fp)
  545.     {
  546.         return (ERROR);
  547.     }
  548.     fread(header, 1, number, fp);
  549.     is_png = !png_sig_cmp(header, 0, number);
  550.     if (!is_png)
  551.     {
  552.         return (NOT_PNG);
  553.     }
  554. Next, png_struct and png_info need to be allocated and initialized.  In
  555. order to ensure that the size of these structures is correct even with a
  556. dynamically linked libpng, there are functions to initialize and
  557. allocate the structures.  We also pass the library version, optional
  558. pointers to error handling functions, and a pointer to a data struct for
  559. use by the error functions, if necessary (the pointer and functions can
  560. be NULL if the default error handlers are to be used).  See the section
  561. on Changes to Libpng below regarding the old initialization functions.
  562. The structure allocation functions quietly return NULL if they fail to
  563. create the structure, so your application should check for that.
  564.     png_structp png_ptr = png_create_read_struct
  565.        (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
  566.         user_error_fn, user_warning_fn);
  567.     if (!png_ptr)
  568.         return (ERROR);
  569.     png_infop info_ptr = png_create_info_struct(png_ptr);
  570.     if (!info_ptr)
  571.     {
  572.         png_destroy_read_struct(&png_ptr,
  573.            (png_infopp)NULL, (png_infopp)NULL);
  574.         return (ERROR);
  575.     }
  576.     png_infop end_info = png_create_info_struct(png_ptr);
  577.     if (!end_info)
  578.     {
  579.         png_destroy_read_struct(&png_ptr, &info_ptr,
  580.           (png_infopp)NULL);
  581.         return (ERROR);
  582.     }
  583. If you want to use your own memory allocation routines,
  584. define PNG_USER_MEM_SUPPORTED and use
  585. png_create_read_struct_2() instead of png_create_read_struct():
  586.     png_structp png_ptr = png_create_read_struct_2
  587.        (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
  588.         user_error_fn, user_warning_fn, (png_voidp)
  589.         user_mem_ptr, user_malloc_fn, user_free_fn);
  590. The error handling routines passed to png_create_read_struct()
  591. and the memory alloc/free routines passed to png_create_struct_2()
  592. are only necessary if you are not using the libpng supplied error
  593. handling and memory alloc/free functions.
  594. When libpng encounters an error, it expects to longjmp back
  595. to your routine.  Therefore, you will need to call setjmp and pass
  596. your png_jmpbuf(png_ptr).  If you read the file from different
  597. routines, you will need to update the jmpbuf field every time you enter
  598. a new routine that will call a png_*() function.
  599. See your documentation of setjmp/longjmp for your compiler for more
  600. information on setjmp/longjmp.  See the discussion on libpng error
  601. handling in the Customizing Libpng section below for more information
  602. on the libpng error handling.  If an error occurs, and libpng longjmp's
  603. back to your setjmp, you will want to call png_destroy_read_struct() to
  604. free any memory.
  605.     if (setjmp(png_jmpbuf(png_ptr)))
  606.     {
  607.         png_destroy_read_struct(&png_ptr, &info_ptr,
  608.            &end_info);
  609.         fclose(fp);
  610.         return (ERROR);
  611.     }
  612. If you would rather avoid the complexity of setjmp/longjmp issues,
  613. you can compile libpng with PNG_SETJMP_NOT_SUPPORTED, in which case
  614. errors will result in a call to PNG_ABORT() which defaults to abort().
  615. Now you need to set up the input code.  The default for libpng is to
  616. use the C function fread().  If you use this, you will need to pass a
  617. valid FILE * in the function png_init_io().  Be sure that the file is
  618. opened in binary mode.  If you wish to handle reading data in another
  619. way, you need not call the png_init_io() function, but you must then
  620. implement the libpng I/O methods discussed in the Customizing Libpng
  621. section below.
  622.     png_init_io(png_ptr, fp);
  623. If you had previously opened the file and read any of the signature from
  624. the beginning in order to see if this was a PNG file, you need to let
  625. libpng know that there are some bytes missing from the start of the file.
  626.     png_set_sig_bytes(png_ptr, number);
  627. .SS Setting up callback code
  628. You can set up a callback function to handle any unknown chunks in the
  629. input stream. You must supply the function
  630.     read_chunk_callback(png_ptr ptr,
  631.          png_unknown_chunkp chunk);
  632.     {
  633.        /* The unknown chunk structure contains your
  634.           chunk data, along with similar data for any other
  635.           unknown chunks: */
  636.            png_byte name[5];
  637.            png_byte *data;
  638.            png_size_t size;
  639.        /* Note that libpng has already taken care of
  640.           the CRC handling */
  641.        /* put your code here.  Search for your chunk in the
  642.           unknown chunk structure, process it, and return one
  643.           of the following: */
  644.        return (-n); /* chunk had an error */
  645.        return (0); /* did not recognize */
  646.        return (n); /* success */
  647.     }
  648. (You can give your function another name that you like instead of
  649. "read_chunk_callback")
  650. To inform libpng about your function, use
  651.     png_set_read_user_chunk_fn(png_ptr, user_chunk_ptr,
  652.         read_chunk_callback);
  653. This names not only the callback function, but also a user pointer that
  654. you can retrieve with
  655.     png_get_user_chunk_ptr(png_ptr);
  656. If you call the png_set_read_user_chunk_fn() function, then all unknown
  657. chunks will be saved when read, in case your callback function will need
  658. one or more of them.  This behavior can be changed with the
  659. png_set_keep_unknown_chunks() function, described below.
  660. At this point, you can set up a callback function that will be
  661. called after each row has been read, which you can use to control
  662. a progress meter or the like.  It's demonstrated in pngtest.c.
  663. You must supply a function
  664.     void read_row_callback(png_ptr ptr, png_uint_32 row,
  665.        int pass);
  666.     {
  667.       /* put your code here */
  668.     }
  669. (You can give it another name that you like instead of "read_row_callback")
  670. To inform libpng about your function, use
  671.     png_set_read_status_fn(png_ptr, read_row_callback);
  672. .SS Width and height limits
  673. The PNG specification allows the width and height of an image to be as
  674. large as 2^31-1 (0x7fffffff), or about 2.147 billion rows and columns.
  675. Since very few applications really need to process such large images,
  676. we have imposed an arbitrary 1-million limit on rows and columns.
  677. Larger images will be rejected immediately with a png_error() call. If
  678. you wish to override this limit, you can use
  679.    png_set_user_limits(png_ptr, width_max, height_max);
  680. to set your own limits, or use width_max = height_max = 0x7fffffffL
  681. to allow all valid dimensions (libpng may reject some very large images
  682. anyway because of potential buffer overflow conditions).
  683. You should put this statement after you create the PNG structure and
  684. before calling png_read_info(), png_read_png(), or png_process_data().
  685. If you need to retrieve the limits that are being applied, use
  686.    width_max = png_get_user_width_max(png_ptr);
  687.    height_max = png_get_user_height_max(png_ptr);
  688. .SS Unknown-chunk handling
  689. Now you get to set the way the library processes unknown chunks in the
  690. input PNG stream. Both known and unknown chunks will be read.  Normal
  691. behavior is that known chunks will be parsed into information in
  692. various info_ptr members while unknown chunks will be discarded. This
  693. behavior can be wasteful if your application will never use some known
  694. chunk types. To change this, you can call:
  695.     png_set_keep_unknown_chunks(png_ptr, keep,
  696.         chunk_list, num_chunks);
  697.     keep       - 0: default unknown chunk handling
  698.                  1: ignore; do not keep
  699.                  2: keep only if safe-to-copy
  700.                  3: keep even if unsafe-to-copy
  701.                You can use these definitions:
  702.                  PNG_HANDLE_CHUNK_AS_DEFAULT   0
  703.                  PNG_HANDLE_CHUNK_NEVER        1
  704.                  PNG_HANDLE_CHUNK_IF_SAFE      2
  705.                  PNG_HANDLE_CHUNK_ALWAYS       3
  706.     chunk_list - list of chunks affected (a byte string,
  707.                  five bytes per chunk, NULL or '' if
  708.                  num_chunks is 0)
  709.     num_chunks - number of chunks affected; if 0, all
  710.                  unknown chunks are affected.  If nonzero,
  711.                  only the chunks in the list are affected
  712. Unknown chunks declared in this way will be saved as raw data onto a
  713. list of png_unknown_chunk structures.  If a chunk that is normally
  714. known to libpng is named in the list, it will be handled as unknown,
  715. according to the "keep" directive.  If a chunk is named in successive
  716. instances of png_set_keep_unknown_chunks(), the final instance will
  717. take precedence.  The IHDR and IEND chunks should not be named in
  718. chunk_list; if they are, libpng will process them normally anyway.
  719. Here is an example of the usage of png_set_keep_unknown_chunks(),
  720. where the private "vpAg" chunk will later be processed by a user chunk
  721. callback function:
  722.     png_byte vpAg[5]={118, 112,  65, 103, (png_byte) ''};
  723.     #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
  724.       png_byte unused_chunks[]=
  725.       {
  726.         104,  73,  83,  84, (png_byte) '',   /* hIST */
  727.         105,  84,  88, 116, (png_byte) '',   /* iTXt */
  728.         112,  67,  65,  76, (png_byte) '',   /* pCAL */
  729.         115,  67,  65,  76, (png_byte) '',   /* sCAL */
  730.         115,  80,  76,  84, (png_byte) '',   /* sPLT */
  731.         116,  73,  77,  69, (png_byte) '',   /* tIME */
  732.       };
  733.     #endif
  734.     ...
  735.     #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
  736.       /* ignore all unknown chunks: */
  737.       png_set_keep_unknown_chunks(read_ptr, 1, NULL, 0);
  738.       /* except for vpAg: */
  739.       png_set_keep_unknown_chunks(read_ptr, 2, vpAg, 1);
  740.       /* also ignore unused known chunks: */
  741.       png_set_keep_unknown_chunks(read_ptr, 1, unused_chunks,
  742.          (int)sizeof(unused_chunks)/5);
  743.     #endif
  744. .SS The high-level read interface
  745. At this point there are two ways to proceed; through the high-level
  746. read interface, or through a sequence of low-level read operations.
  747. You can use the high-level interface if (a) you are willing to read
  748. the entire image into memory, and (b) the input transformations
  749. you want to do are limited to the following set:
  750.     PNG_TRANSFORM_IDENTITY      No transformation
  751.     PNG_TRANSFORM_STRIP_16      Strip 16-bit samples to
  752.                                 8 bits
  753.     PNG_TRANSFORM_STRIP_ALPHA   Discard the alpha channel
  754.     PNG_TRANSFORM_PACKING       Expand 1, 2 and 4-bit
  755.                                 samples to bytes
  756.     PNG_TRANSFORM_PACKSWAP      Change order of packed
  757.                                 pixels to LSB first
  758.     PNG_TRANSFORM_EXPAND        Perform set_expand()
  759.     PNG_TRANSFORM_INVERT_MONO   Invert monochrome images
  760.     PNG_TRANSFORM_SHIFT         Normalize pixels to the
  761.                                 sBIT depth
  762.     PNG_TRANSFORM_BGR           Flip RGB to BGR, RGBA
  763.                                 to BGRA
  764.     PNG_TRANSFORM_SWAP_ALPHA    Flip RGBA to ARGB or GA
  765.                                 to AG
  766.     PNG_TRANSFORM_INVERT_ALPHA  Change alpha from opacity
  767.                                 to transparency
  768.     PNG_TRANSFORM_SWAP_ENDIAN   Byte-swap 16-bit samples
  769. (This excludes setting a background color, doing gamma transformation,
  770. dithering, and setting filler.)  If this is the case, simply do this:
  771.     png_read_png(png_ptr, info_ptr, png_transforms, NULL)
  772. where png_transforms is an integer containing the bitwise OR of
  773. some set of transformation flags.  This call is equivalent to png_read_info(),
  774. followed the set of transformations indicated by the transform mask,
  775. then png_read_image(), and finally png_read_end().
  776. (The final parameter of this call is not yet used.  Someday it might point
  777. to transformation parameters required by some future input transform.)
  778. You must use png_transforms and not call any png_set_transform() functions
  779. when you use png_read_png().
  780. After you have called png_read_png(), you can retrieve the image data
  781. with
  782.    row_pointers = png_get_rows(png_ptr, info_ptr);
  783. where row_pointers is an array of pointers to the pixel data for each row:
  784.    png_bytep row_pointers[height];
  785. If you know your image size and pixel size ahead of time, you can allocate
  786. row_pointers prior to calling png_read_png() with
  787.    if (height > PNG_UINT_32_MAX/png_sizeof(png_byte))
  788.       png_error (png_ptr,
  789.          "Image is too tall to process in memory");
  790.    if (width > PNG_UINT_32_MAX/pixel_size)
  791.       png_error (png_ptr,
  792.          "Image is too wide to process in memory");
  793.    row_pointers = png_malloc(png_ptr,
  794.       height*png_sizeof(png_bytep));
  795.    for (int i=0; i<height, i++)
  796.       row_pointers[i]=png_malloc(png_ptr,
  797.          width*pixel_size);
  798.    png_set_rows(png_ptr, info_ptr, &row_pointers);
  799. Alternatively you could allocate your image in one big block and define
  800. row_pointers[i] to point into the proper places in your block.
  801. If you use png_set_rows(), the application is responsible for freeing
  802. row_pointers (and row_pointers[i], if they were separately allocated).
  803. If you don't allocate row_pointers ahead of time, png_read_png() will
  804. do it, and it'll be free'ed when you call png_destroy_*().
  805. .SS The low-level read interface
  806. If you are going the low-level route, you are now ready to read all
  807. the file information up to the actual image data.  You do this with a
  808. call to png_read_info().
  809.     png_read_info(png_ptr, info_ptr);
  810. This will process all chunks up to but not including the image data.
  811. .SS Querying the info structure
  812. Functions are used to get the information from the info_ptr once it
  813. has been read.  Note that these fields may not be completely filled
  814. in until png_read_end() has read the chunk data following the image.
  815.     png_get_IHDR(png_ptr, info_ptr, &width, &height,
  816.        &bit_depth, &color_type, &interlace_type,
  817.        &compression_type, &filter_method);
  818.     width          - holds the width of the image
  819.                      in pixels (up to 2^31).
  820.     height         - holds the height of the image
  821.                      in pixels (up to 2^31).
  822.     bit_depth      - holds the bit depth of one of the
  823.                      image channels.  (valid values are
  824.                      1, 2, 4, 8, 16 and depend also on
  825.                      the color_type.  See also
  826.                      significant bits (sBIT) below).
  827.     color_type     - describes which color/alpha channels
  828.                          are present.
  829.                      PNG_COLOR_TYPE_GRAY
  830.                         (bit depths 1, 2, 4, 8, 16)
  831.                      PNG_COLOR_TYPE_GRAY_ALPHA
  832.                         (bit depths 8, 16)
  833.                      PNG_COLOR_TYPE_PALETTE
  834.                         (bit depths 1, 2, 4, 8)
  835.                      PNG_COLOR_TYPE_RGB
  836.                         (bit_depths 8, 16)
  837.                      PNG_COLOR_TYPE_RGB_ALPHA
  838.                         (bit_depths 8, 16)
  839.                      PNG_COLOR_MASK_PALETTE
  840.                      PNG_COLOR_MASK_COLOR
  841.                      PNG_COLOR_MASK_ALPHA
  842.     filter_method  - (must be PNG_FILTER_TYPE_BASE
  843.                      for PNG 1.0, and can also be
  844.                      PNG_INTRAPIXEL_DIFFERENCING if
  845.                      the PNG datastream is embedded in
  846.                      a MNG-1.0 datastream)
  847.     compression_type - (must be PNG_COMPRESSION_TYPE_BASE
  848.                      for PNG 1.0)
  849.     interlace_type - (PNG_INTERLACE_NONE or
  850.                      PNG_INTERLACE_ADAM7)
  851.     Any or all of interlace_type, compression_type, of
  852.     filter_method can be NULL if you are
  853.     not interested in their values.
  854.     channels = png_get_channels(png_ptr, info_ptr);
  855.     channels       - number of channels of info for the
  856.                      color type (valid values are 1 (GRAY,
  857.                      PALETTE), 2 (GRAY_ALPHA), 3 (RGB),
  858.                      4 (RGB_ALPHA or RGB + filler byte))
  859.     rowbytes = png_get_rowbytes(png_ptr, info_ptr);
  860.     rowbytes       - number of bytes needed to hold a row
  861.     signature = png_get_signature(png_ptr, info_ptr);
  862.     signature      - holds the signature read from the
  863.                      file (if any).  The data is kept in
  864.                      the same offset it would be if the
  865.                      whole signature were read (i.e. if an
  866.                      application had already read in 4
  867.                      bytes of signature before starting
  868.                      libpng, the remaining 4 bytes would
  869.                      be in signature[4] through signature[7]
  870.                      (see png_set_sig_bytes())).
  871.     width            = png_get_image_width(png_ptr,
  872.                          info_ptr);
  873.     height           = png_get_image_height(png_ptr,
  874.                          info_ptr);
  875.     bit_depth        = png_get_bit_depth(png_ptr,
  876.                          info_ptr);
  877.     color_type       = png_get_color_type(png_ptr,
  878.                          info_ptr);
  879.     filter_method    = png_get_filter_type(png_ptr,
  880.                          info_ptr);
  881.     compression_type = png_get_compression_type(png_ptr,
  882.                          info_ptr);
  883.     interlace_type   = png_get_interlace_type(png_ptr,
  884.                          info_ptr);
  885. These are also important, but their validity depends on whether the chunk
  886. has been read.  The png_get_valid(png_ptr, info_ptr, PNG_INFO_<chunk>) and
  887. png_get_<chunk>(png_ptr, info_ptr, ...) functions return non-zero if the
  888. data has been read, or zero if it is missing.  The parameters to the
  889. png_get_<chunk> are set directly if they are simple data types, or a pointer
  890. into the info_ptr is returned for any complex types.
  891.     png_get_PLTE(png_ptr, info_ptr, &palette,
  892.                      &num_palette);
  893.     palette        - the palette for the file
  894.                      (array of png_color)
  895.     num_palette    - number of entries in the palette
  896.     png_get_gAMA(png_ptr, info_ptr, &gamma);
  897.     gamma          - the gamma the file is written
  898.                      at (PNG_INFO_gAMA)
  899.     png_get_sRGB(png_ptr, info_ptr, &srgb_intent);
  900.     srgb_intent    - the rendering intent (PNG_INFO_sRGB)
  901.                      The presence of the sRGB chunk
  902.                      means that the pixel data is in the
  903.                      sRGB color space.  This chunk also
  904.                      implies specific values of gAMA and
  905.                      cHRM.
  906.     png_get_iCCP(png_ptr, info_ptr, &name,
  907.        &compression_type, &profile, &proflen);
  908.     name            - The profile name.
  909.     compression     - The compression type; always
  910.                       PNG_COMPRESSION_TYPE_BASE for PNG 1.0.
  911.                       You may give NULL to this argument to
  912.                       ignore it.
  913.     profile         - International Color Consortium color
  914.                       profile data. May contain NULs.
  915.     proflen         - length of profile data in bytes.
  916.     png_get_sBIT(png_ptr, info_ptr, &sig_bit);
  917.     sig_bit        - the number of significant bits for
  918.                      (PNG_INFO_sBIT) each of the gray,
  919.                      red, green, and blue channels,
  920.                      whichever are appropriate for the
  921.                      given color type (png_color_16)
  922.     png_get_tRNS(png_ptr, info_ptr, &trans, &num_trans,
  923.                      &trans_values);
  924.     trans          - array of transparent entries for
  925.                      palette (PNG_INFO_tRNS)
  926.     trans_values   - graylevel or color sample values of
  927.                      the single transparent color for
  928.                      non-paletted images (PNG_INFO_tRNS)
  929.     num_trans      - number of transparent entries
  930.                      (PNG_INFO_tRNS)
  931.     png_get_hIST(png_ptr, info_ptr, &hist);
  932.                      (PNG_INFO_hIST)
  933.     hist           - histogram of palette (array of
  934.                      png_uint_16)
  935.     png_get_tIME(png_ptr, info_ptr, &mod_time);
  936.     mod_time       - time image was last modified
  937.                     (PNG_VALID_tIME)
  938.     png_get_bKGD(png_ptr, info_ptr, &background);
  939.     background     - background color (PNG_VALID_bKGD)
  940.                      valid 16-bit red, green and blue
  941.                      values, regardless of color_type
  942.     num_comments   = png_get_text(png_ptr, info_ptr,
  943.                      &text_ptr, &num_text);
  944.     num_comments   - number of comments
  945.     text_ptr       - array of png_text holding image
  946.                      comments
  947.     text_ptr[i].compression - type of compression used
  948.                  on "text" PNG_TEXT_COMPRESSION_NONE
  949.                            PNG_TEXT_COMPRESSION_zTXt
  950.                            PNG_ITXT_COMPRESSION_NONE
  951.                            PNG_ITXT_COMPRESSION_zTXt
  952.     text_ptr[i].key   - keyword for comment.  Must contain
  953.                          1-79 characters.
  954.     text_ptr[i].text  - text comments for current
  955.                          keyword.  Can be empty.
  956.     text_ptr[i].text_length - length of text string,
  957.                  after decompression, 0 for iTXt
  958.     text_ptr[i].itxt_length - length of itxt string,
  959.                  after decompression, 0 for tEXt/zTXt
  960.     text_ptr[i].lang  - language of comment (empty
  961.                          string for unknown).
  962.     text_ptr[i].lang_key  - keyword in UTF-8
  963.                          (empty string for unknown).
  964.     num_text       - number of comments (same as
  965.                      num_comments; you can put NULL here
  966.                      to avoid the duplication)
  967.     Note while png_set_text() will accept text, language,
  968.     and translated keywords that can be NULL pointers, the
  969.     structure returned by png_get_text will always contain
  970.     regular zero-terminated C strings.  They might be
  971.     empty strings but they will never be NULL pointers.
  972.     num_spalettes = png_get_sPLT(png_ptr, info_ptr,
  973.        &palette_ptr);
  974.     palette_ptr    - array of palette structures holding
  975.                      contents of one or more sPLT chunks
  976.                      read.
  977.     num_spalettes  - number of sPLT chunks read.
  978.     png_get_oFFs(png_ptr, info_ptr, &offset_x, &offset_y,
  979.        &unit_type);
  980.     offset_x       - positive offset from the left edge
  981.                      of the screen
  982.     offset_y       - positive offset from the top edge
  983.                      of the screen
  984.     unit_type      - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER
  985.     png_get_pHYs(png_ptr, info_ptr, &res_x, &res_y,
  986.        &unit_type);
  987.     res_x          - pixels/unit physical resolution in
  988.                      x direction
  989.     res_y          - pixels/unit physical resolution in
  990.                      x direction
  991.     unit_type      - PNG_RESOLUTION_UNKNOWN,
  992.                      PNG_RESOLUTION_METER
  993.     png_get_sCAL(png_ptr, info_ptr, &unit, &width,
  994.        &height)
  995.     unit        - physical scale units (an integer)
  996.     width       - width of a pixel in physical scale units
  997.     height      - height of a pixel in physical scale units
  998.                  (width and height are doubles)
  999.     png_get_sCAL_s(png_ptr, info_ptr, &unit, &width,
  1000.        &height)
  1001.     unit        - physical scale units (an integer)
  1002.     width       - width of a pixel in physical scale units
  1003.     height      - height of a pixel in physical scale units
  1004.                  (width and height are strings like "2.54")
  1005.     num_unknown_chunks = png_get_unknown_chunks(png_ptr,
  1006.        info_ptr, &unknowns)
  1007.     unknowns          - array of png_unknown_chunk
  1008.                         structures holding unknown chunks
  1009.     unknowns[i].name  - name of unknown chunk
  1010.     unknowns[i].data  - data of unknown chunk
  1011.     unknowns[i].size  - size of unknown chunk's data
  1012.     unknowns[i].location - position of chunk in file
  1013.     The value of "i" corresponds to the order in which the
  1014.     chunks were read from the PNG file or inserted with the
  1015.     png_set_unknown_chunks() function.
  1016. The data from the pHYs chunk can be retrieved in several convenient
  1017. forms:
  1018.     res_x = png_get_x_pixels_per_meter(png_ptr,
  1019.        info_ptr)
  1020.     res_y = png_get_y_pixels_per_meter(png_ptr,
  1021.        info_ptr)
  1022.     res_x_and_y = png_get_pixels_per_meter(png_ptr,
  1023.        info_ptr)
  1024.     res_x = png_get_x_pixels_per_inch(png_ptr,
  1025.        info_ptr)
  1026.     res_y = png_get_y_pixels_per_inch(png_ptr,
  1027.        info_ptr)
  1028.     res_x_and_y = png_get_pixels_per_inch(png_ptr,
  1029.        info_ptr)
  1030.     aspect_ratio = png_get_pixel_aspect_ratio(png_ptr,
  1031.        info_ptr)
  1032.    (Each of these returns 0 [signifying "unknown"] if
  1033.        the data is not present or if res_x is 0;
  1034.        res_x_and_y is 0 if res_x != res_y)
  1035. The data from the oFFs chunk can be retrieved in several convenient
  1036. forms:
  1037.     x_offset = png_get_x_offset_microns(png_ptr, info_ptr);
  1038.     y_offset = png_get_y_offset_microns(png_ptr, info_ptr);
  1039.     x_offset = png_get_x_offset_inches(png_ptr, info_ptr);
  1040.     y_offset = png_get_y_offset_inches(png_ptr, info_ptr);
  1041.    (Each of these returns 0 [signifying "unknown" if both
  1042.        x and y are 0] if the data is not present or if the
  1043.        chunk is present but the unit is the pixel)
  1044. For more information, see the png_info definition in png.h and the
  1045. PNG specification for chunk contents.  Be careful with trusting
  1046. rowbytes, as some of the transformations could increase the space
  1047. needed to hold a row (expand, filler, gray_to_rgb, etc.).
  1048. See png_read_update_info(), below.
  1049. A quick word about text_ptr and num_text.  PNG stores comments in
  1050. keyword/text pairs, one pair per chunk, with no limit on the number
  1051. of text chunks, and a 2^31 byte limit on their size.  While there are
  1052. suggested keywords, there is no requirement to restrict the use to these
  1053. strings.  It is strongly suggested that keywords and text be sensible
  1054. to humans (that's the point), so don't use abbreviations.  Non-printing
  1055. symbols are not allowed.  See the PNG specification for more details.
  1056. There is also no requirement to have text after the keyword.
  1057. Keywords should be limited to 79 Latin-1 characters without leading or
  1058. trailing spaces, but non-consecutive spaces are allowed within the
  1059. keyword.  It is possible to have the same keyword any number of times.
  1060. The text_ptr is an array of png_text structures, each holding a
  1061. pointer to a language string, a pointer to a keyword and a pointer to
  1062. a text string.  The text string, language code, and translated
  1063. keyword may be empty or NULL pointers.  The keyword/text
  1064. pairs are put into the array in the order that they are received.
  1065. However, some or all of the text chunks may be after the image, so, to
  1066. make sure you have read all the text chunks, don't mess with these
  1067. until after you read the stuff after the image.  This will be
  1068. mentioned again below in the discussion that goes with png_read_end().
  1069. .SS Input transformations
  1070. After you've read the header information, you can set up the library
  1071. to handle any special transformations of the image data.  The various
  1072. ways to transform the data will be described in the order that they
  1073. should occur.  This is important, as some of these change the color
  1074. type and/or bit depth of the data, and some others only work on
  1075. certain color types and bit depths.  Even though each transformation
  1076. checks to see if it has data that it can do something with, you should
  1077. make sure to only enable a transformation if it will be valid for the
  1078. data.  For example, don't swap red and blue on grayscale data.
  1079. The colors used for the background and transparency values should be
  1080. supplied in the same format/depth as the current image data.  They
  1081. are stored in the same format/depth as the image data in a bKGD or tRNS
  1082. chunk, so this is what libpng expects for this data.  The colors are
  1083. transformed to keep in sync with the image data when an application
  1084. calls the png_read_update_info() routine (see below).
  1085. Data will be decoded into the supplied row buffers packed into bytes
  1086. unless the library has been told to transform it into another format.
  1087. For example, 4 bit/pixel paletted or grayscale data will be returned
  1088. 2 pixels/byte with the leftmost pixel in the high-order bits of the
  1089. byte, unless png_set_packing() is called.  8-bit RGB data will be stored
  1090. in RGB RGB RGB format unless png_set_filler() or png_set_add_alpha()
  1091. is called to insert filler bytes, either before or after each RGB triplet.
  1092. 16-bit RGB data will be returned RRGGBB RRGGBB, with the most significant
  1093. byte of the color value first, unless png_set_strip_16() is called to
  1094. transform it to regular RGB RGB triplets, or png_set_filler() or
  1095. png_set_add alpha() is called to insert filler bytes, either before or
  1096. after each RRGGBB triplet.  Similarly, 8-bit or 16-bit grayscale data can
  1097. be modified with
  1098. png_set_filler(), png_set_add_alpha(), or png_set_strip_16().
  1099. The following code transforms grayscale images of less than 8 to 8 bits,
  1100. changes paletted images to RGB, and adds a full alpha channel if there is
  1101. transparency information in a tRNS chunk.  This is most useful on
  1102. grayscale images with bit depths of 2 or 4 or if there is a multiple-image
  1103. viewing application that wishes to treat all images in the same way.
  1104.     if (color_type == PNG_COLOR_TYPE_PALETTE)
  1105.         png_set_palette_to_rgb(png_ptr);
  1106.     if (color_type == PNG_COLOR_TYPE_GRAY &&
  1107.         bit_depth < 8) png_set_expand_gray_1_2_4_to_8(png_ptr);
  1108.     if (png_get_valid(png_ptr, info_ptr,
  1109.         PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png_ptr);
  1110. These three functions are actually aliases for png_set_expand(), added
  1111. in libpng version 1.0.4, with the function names expanded to improve code
  1112. readability.  In some future version they may actually do different
  1113. things.
  1114. As of libpng version 1.2.9, png_set_expand_gray_1_2_4_to_8() was
  1115. added.  It expands the sample depth without changing tRNS to alpha.
  1116. At the same time, png_set_gray_1_2_4_to_8() was deprecated, and it
  1117. will be removed from a future version.
  1118. PNG can have files with 16 bits per channel.  If you only can handle
  1119. 8 bits per channel, this will strip the pixels down to 8 bit.
  1120.     if (bit_depth == 16)
  1121.         png_set_strip_16(png_ptr);
  1122. If, for some reason, you don't need the alpha channel on an image,
  1123. and you want to remove it rather than combining it with the background
  1124. (but the image author certainly had in mind that you *would* combine
  1125. it with the background, so that's what you should probably do):
  1126.     if (color_type & PNG_COLOR_MASK_ALPHA)
  1127.         png_set_strip_alpha(png_ptr);
  1128. In PNG files, the alpha channel in an image
  1129. is the level of opacity.  If you need the alpha channel in an image to
  1130. be the level of transparency instead of opacity, you can invert the
  1131. alpha channel (or the tRNS chunk data) after it's read, so that 0 is
  1132. fully opaque and 255 (in 8-bit or paletted images) or 65535 (in 16-bit
  1133. images) is fully transparent, with
  1134.     png_set_invert_alpha(png_ptr);
  1135. PNG files pack pixels of bit depths 1, 2, and 4 into bytes as small as
  1136. they can, resulting in, for example, 8 pixels per byte for 1 bit
  1137. files.  This code expands to 1 pixel per byte without changing the
  1138. values of the pixels:
  1139.     if (bit_depth < 8)
  1140.         png_set_packing(png_ptr);
  1141. PNG files have possible bit depths of 1, 2, 4, 8, and 16.  All pixels
  1142. stored in a PNG image have been "scaled" or "shifted" up to the next
  1143. higher possible bit depth (e.g. from 5 bits/sample in the range [0,31] to
  1144. 8 bits/sample in the range [0, 255]).  However, it is also possible to
  1145. convert the PNG pixel data back to the original bit depth of the image.
  1146. This call reduces the pixels back down to the original bit depth:
  1147.     png_color_8p sig_bit;
  1148.     if (png_get_sBIT(png_ptr, info_ptr, &sig_bit))
  1149.         png_set_shift(png_ptr, sig_bit);
  1150. PNG files store 3-color pixels in red, green, blue order.  This code
  1151. changes the storage of the pixels to blue, green, red:
  1152.     if (color_type == PNG_COLOR_TYPE_RGB ||
  1153.         color_type == PNG_COLOR_TYPE_RGB_ALPHA)
  1154.         png_set_bgr(png_ptr);
  1155. PNG files store RGB pixels packed into 3 or 6 bytes. This code expands them
  1156. into 4 or 8 bytes for windowing systems that need them in this format:
  1157.     if (color_type == PNG_COLOR_TYPE_RGB)
  1158.         png_set_filler(png_ptr, filler, PNG_FILLER_BEFORE);
  1159. where "filler" is the 8 or 16-bit number to fill with, and the location is
  1160. either PNG_FILLER_BEFORE or PNG_FILLER_AFTER, depending upon whether
  1161. you want the filler before the RGB or after.  This transformation
  1162. does not affect images that already have full alpha channels.  To add an
  1163. opaque alpha channel, use filler=0xff or 0xffff and PNG_FILLER_AFTER which
  1164. will generate RGBA pixels.
  1165. Note that png_set_filler() does not change the color type.  If you want
  1166. to do that, you can add a true alpha channel with
  1167.     if (color_type == PNG_COLOR_TYPE_RGB ||
  1168.            color_type == PNG_COLOR_TYPE_GRAY)
  1169.     png_set_add_alpha(png_ptr, filler, PNG_FILLER_AFTER);
  1170. where "filler" contains the alpha value to assign to each pixel.
  1171. This function was added in libpng-1.2.7.
  1172. If you are reading an image with an alpha channel, and you need the
  1173. data as ARGB instead of the normal PNG format RGBA:
  1174.     if (color_type == PNG_COLOR_TYPE_RGB_ALPHA)
  1175.         png_set_swap_alpha(png_ptr);
  1176. For some uses, you may want a grayscale image to be represented as
  1177. RGB.  This code will do that conversion:
  1178.     if (color_type == PNG_COLOR_TYPE_GRAY ||
  1179.         color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
  1180.           png_set_gray_to_rgb(png_ptr);
  1181. Conversely, you can convert an RGB or RGBA image to grayscale or grayscale
  1182. with alpha.
  1183.     if (color_type == PNG_COLOR_TYPE_RGB ||
  1184.         color_type == PNG_COLOR_TYPE_RGB_ALPHA)
  1185.           png_set_rgb_to_gray_fixed(png_ptr, error_action,
  1186.              int red_weight, int green_weight);
  1187.     error_action = 1: silently do the conversion
  1188.     error_action = 2: issue a warning if the original
  1189.                       image has any pixel where
  1190.                       red != green or red != blue
  1191.     error_action = 3: issue an error and abort the
  1192.                       conversion if the original
  1193.                       image has any pixel where
  1194.                       red != green or red != blue
  1195.     red_weight:       weight of red component times 100000
  1196.     green_weight:     weight of green component times 100000
  1197.                       If either weight is negative, default
  1198.                       weights (21268, 71514) are used.
  1199. If you have set error_action = 1 or 2, you can
  1200. later check whether the image really was gray, after processing
  1201. the image rows, with the png_get_rgb_to_gray_status(png_ptr) function.
  1202. It will return a png_byte that is zero if the image was gray or
  1203. 1 if there were any non-gray pixels.  bKGD and sBIT data
  1204. will be silently converted to grayscale, using the green channel
  1205. data, regardless of the error_action setting.
  1206. With red_weight+green_weight<=100000,
  1207. the normalized graylevel is computed:
  1208.     int rw = red_weight * 65536;
  1209.     int gw = green_weight * 65536;
  1210.     int bw = 65536 - (rw + gw);
  1211.     gray = (rw*red + gw*green + bw*blue)/65536;
  1212. The default values approximate those recommended in the Charles
  1213. Poynton's Color FAQ, <http://www.inforamp.net/~poynton/>
  1214. Copyright (c) 1998-01-04 Charles Poynton <poynton at inforamp.net>
  1215.     Y = 0.212671 * R + 0.715160 * G + 0.072169 * B
  1216. Libpng approximates this with
  1217.     Y = 0.21268 * R    + 0.7151 * G    + 0.07217 * B
  1218. which can be expressed with integers as
  1219.     Y = (6969 * R + 23434 * G + 2365 * B)/32768
  1220. The calculation is done in a linear colorspace, if the image gamma
  1221. is known.
  1222. If you have a grayscale and you are using png_set_expand_depth(),
  1223. png_set_expand(), or png_set_gray_to_rgb to change to truecolor or to
  1224. a higher bit-depth, you must either supply the background color as a gray
  1225. value at the original file bit-depth (need_expand = 1) or else supply the
  1226. background color as an RGB triplet at the final, expanded bit depth
  1227. (need_expand = 0).  Similarly, if you are reading a paletted image, you
  1228. must either supply the background color as a palette index (need_expand = 1)
  1229. or as an RGB triplet that may or may not be in the palette (need_expand = 0).
  1230.     png_color_16 my_background;
  1231.     png_color_16p image_background;
  1232.     if (png_get_bKGD(png_ptr, info_ptr, &image_background))
  1233.         png_set_background(png_ptr, image_background,
  1234.           PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
  1235.     else
  1236.         png_set_background(png_ptr, &my_background,
  1237.           PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
  1238. The png_set_background() function tells libpng to composite images
  1239. with alpha or simple transparency against the supplied background
  1240. color.  If the PNG file contains a bKGD chunk (PNG_INFO_bKGD valid),
  1241. you may use this color, or supply another color more suitable for
  1242. the current display (e.g., the background color from a web page).  You
  1243. need to tell libpng whether the color is in the gamma space of the
  1244. display (PNG_BACKGROUND_GAMMA_SCREEN for colors you supply), the file
  1245. (PNG_BACKGROUND_GAMMA_FILE for colors from the bKGD chunk), or one
  1246. that is neither of these gammas (PNG_BACKGROUND_GAMMA_UNIQUE - I don't
  1247. know why anyone would use this, but it's here).
  1248. To properly display PNG images on any kind of system, the application needs
  1249. to know what the display gamma is.  Ideally, the user will know this, and
  1250. the application will allow them to set it.  One method of allowing the user
  1251. to set the display gamma separately for each system is to check for a
  1252. SCREEN_GAMMA or DISPLAY_GAMMA environment variable, which will hopefully be
  1253. correctly set.
  1254. Note that display_gamma is the overall gamma correction required to produce
  1255. pleasing results, which depends on the lighting conditions in the surrounding
  1256. environment.  In a dim or brightly lit room, no compensation other than
  1257. the physical gamma exponent of the monitor is needed, while in a dark room
  1258. a slightly smaller exponent is better.
  1259.    double gamma, screen_gamma;
  1260.    if (/* We have a user-defined screen
  1261.        gamma value */)
  1262.    {
  1263.       screen_gamma = user_defined_screen_gamma;
  1264.    }
  1265.    /* One way that applications can share the same
  1266.       screen gamma value */
  1267.    else if ((gamma_str = getenv("SCREEN_GAMMA"))
  1268.       != NULL)
  1269.    {
  1270.       screen_gamma = (double)atof(gamma_str);
  1271.    }
  1272.    /* If we don't have another value */
  1273.    else
  1274.    {
  1275.       screen_gamma = 2.2; /* A good guess for a
  1276.            PC monitor in a bright office or a dim room */
  1277.       screen_gamma = 2.0; /* A good guess for a
  1278.            PC monitor in a dark room */
  1279.       screen_gamma = 1.7 or 1.0;  /* A good
  1280.            guess for Mac systems */
  1281.    }
  1282. The png_set_gamma() function handles gamma transformations of the data.
  1283. Pass both the file gamma and the current screen_gamma.  If the file does
  1284. not have a gamma value, you can pass one anyway if you have an idea what
  1285. it is (usually 0.45455 is a good guess for GIF images on PCs).  Note
  1286. that file gammas are inverted from screen gammas.  See the discussions
  1287. on gamma in the PNG specification for an excellent description of what
  1288. gamma is, and why all applications should support it.  It is strongly
  1289. recommended that PNG viewers support gamma correction.
  1290.    if (png_get_gAMA(png_ptr, info_ptr, &gamma))
  1291.       png_set_gamma(png_ptr, screen_gamma, gamma);
  1292.    else
  1293.       png_set_gamma(png_ptr, screen_gamma, 0.45455);
  1294. If you need to reduce an RGB file to a paletted file, or if a paletted
  1295. file has more entries then will fit on your screen, png_set_dither()
  1296. will do that.  Note that this is a simple match dither that merely
  1297. finds the closest color available.  This should work fairly well with
  1298. optimized palettes, and fairly badly with linear color cubes.  If you
  1299. pass a palette that is larger then maximum_colors, the file will
  1300. reduce the number of colors in the palette so it will fit into
  1301. maximum_colors.  If there is a histogram, it will use it to make
  1302. more intelligent choices when reducing the palette.  If there is no
  1303. histogram, it may not do as good a job.
  1304.    if (color_type & PNG_COLOR_MASK_COLOR)
  1305.    {
  1306.       if (png_get_valid(png_ptr, info_ptr,
  1307.          PNG_INFO_PLTE))
  1308.       {
  1309.          png_uint_16p histogram = NULL;
  1310.          png_get_hIST(png_ptr, info_ptr,
  1311.             &histogram);
  1312.          png_set_dither(png_ptr, palette, num_palette,
  1313.             max_screen_colors, histogram, 1);
  1314.       }
  1315.       else
  1316.       {
  1317.          png_color std_color_cube[MAX_SCREEN_COLORS] =
  1318.             { ... colors ... };
  1319.          png_set_dither(png_ptr, std_color_cube,
  1320.             MAX_SCREEN_COLORS, MAX_SCREEN_COLORS,
  1321.             NULL,0);
  1322.       }
  1323.    }
  1324. PNG files describe monochrome as black being zero and white being one.
  1325. The following code will reverse this (make black be one and white be
  1326. zero):
  1327.    if (bit_depth == 1 && color_type == PNG_COLOR_TYPE_GRAY)
  1328.       png_set_invert_mono(png_ptr);
  1329. This function can also be used to invert grayscale and gray-alpha images:
  1330.    if (color_type == PNG_COLOR_TYPE_GRAY ||
  1331.         color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
  1332.       png_set_invert_mono(png_ptr);
  1333. PNG files store 16 bit pixels in network byte order (big-endian,
  1334. ie. most significant bits first).  This code changes the storage to the
  1335. other way (little-endian, i.e. least significant bits first, the
  1336. way PCs store them):
  1337.     if (bit_depth == 16)
  1338.         png_set_swap(png_ptr);
  1339. If you are using packed-pixel images (1, 2, or 4 bits/pixel), and you
  1340. need to change the order the pixels are packed into bytes, you can use:
  1341.     if (bit_depth < 8)
  1342.        png_set_packswap(png_ptr);
  1343. Finally, you can write your own transformation function if none of
  1344. the existing ones meets your needs.  This is done by setting a callback
  1345. with
  1346.     png_set_read_user_transform_fn(png_ptr,
  1347.        read_transform_fn);
  1348. You must supply the function
  1349.     void read_transform_fn(png_ptr ptr, row_info_ptr
  1350.        row_info, png_bytep data)
  1351. See pngtest.c for a working example.  Your function will be called
  1352. after all of the other transformations have been processed.
  1353. You can also set up a pointer to a user structure for use by your
  1354. callback function, and you can inform libpng that your transform
  1355. function will change the number of channels or bit depth with the
  1356. function
  1357.     png_set_user_transform_info(png_ptr, user_ptr,
  1358.        user_depth, user_channels);
  1359. The user's application, not libpng, is responsible for allocating and
  1360. freeing any memory required for the user structure.
  1361. You can retrieve the pointer via the function
  1362. png_get_user_transform_ptr().  For example:
  1363.     voidp read_user_transform_ptr =
  1364.        png_get_user_transform_ptr(png_ptr);
  1365. The last thing to handle is interlacing; this is covered in detail below,
  1366. but you must call the function here if you want libpng to handle expansion
  1367. of the interlaced image.
  1368.     number_of_passes = png_set_interlace_handling(png_ptr);
  1369. After setting the transformations, libpng can update your png_info
  1370. structure to reflect any transformations you've requested with this
  1371. call.  This is most useful to update the info structure's rowbytes
  1372. field so you can use it to allocate your image memory.  This function
  1373. will also update your palette with the correct screen_gamma and
  1374. background if these have been given with the calls above.
  1375.     png_read_update_info(png_ptr, info_ptr);
  1376. After you call png_read_update_info(), you can allocate any
  1377. memory you need to hold the image.  The row data is simply
  1378. raw byte data for all forms of images.  As the actual allocation
  1379. varies among applications, no example will be given.  If you
  1380. are allocating one large chunk, you will need to build an
  1381. array of pointers to each row, as it will be needed for some
  1382. of the functions below.
  1383. .SS Reading image data
  1384. After you've allocated memory, you can read the image data.
  1385. The simplest way to do this is in one function call.  If you are
  1386. allocating enough memory to hold the whole image, you can just
  1387. call png_read_image() and libpng will read in all the image data
  1388. and put it in the memory area supplied.  You will need to pass in
  1389. an array of pointers to each row.
  1390. This function automatically handles interlacing, so you don't need
  1391. to call png_set_interlace_handling() or call this function multiple
  1392. times, or any of that other stuff necessary with png_read_rows().
  1393.    png_read_image(png_ptr, row_pointers);
  1394. where row_pointers is:
  1395.    png_bytep row_pointers[height];
  1396. You can point to void or char or whatever you use for pixels.
  1397. If you don't want to read in the whole image at once, you can
  1398. use png_read_rows() instead.  If there is no interlacing (check
  1399. interlace_type == PNG_INTERLACE_NONE), this is simple:
  1400.     png_read_rows(png_ptr, row_pointers, NULL,
  1401.        number_of_rows);
  1402. where row_pointers is the same as in the png_read_image() call.
  1403. If you are doing this just one row at a time, you can do this with
  1404. a single row_pointer instead of an array of row_pointers:
  1405.     png_bytep row_pointer = row;
  1406.     png_read_row(png_ptr, row_pointer, NULL);
  1407. If the file is interlaced (interlace_type != 0 in the IHDR chunk), things
  1408. get somewhat harder.  The only current (PNG Specification version 1.2)
  1409. interlacing type for PNG is (interlace_type == PNG_INTERLACE_ADAM7)
  1410. is a somewhat complicated 2D interlace scheme, known as Adam7, that
  1411. breaks down an image into seven smaller images of varying size, based
  1412. on an 8x8 grid.
  1413. libpng can fill out those images or it can give them to you "as is".
  1414. If you want them filled out, there are two ways to do that.  The one