rfreeimage 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (860) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +1 -0
  4. data/Rakefile +34 -0
  5. data/ext/rfreeimage/extconf.rb +35 -0
  6. data/ext/rfreeimage/rfi_main.c +389 -0
  7. data/lib/rfreeimage/image.rb +26 -0
  8. data/lib/rfreeimage/version.rb +3 -0
  9. data/lib/rfreeimage.rb +3 -0
  10. data/rfreeimage.gemspec +32 -0
  11. data/vendor/FreeImage/Makefile +34 -0
  12. data/vendor/FreeImage/Makefile.cygwin +74 -0
  13. data/vendor/FreeImage/Makefile.fip +84 -0
  14. data/vendor/FreeImage/Makefile.gnu +83 -0
  15. data/vendor/FreeImage/Makefile.iphone +96 -0
  16. data/vendor/FreeImage/Makefile.mingw +136 -0
  17. data/vendor/FreeImage/Makefile.osx +115 -0
  18. data/vendor/FreeImage/Makefile.solaris +66 -0
  19. data/vendor/FreeImage/Makefile.srcs +6 -0
  20. data/vendor/FreeImage/README.iphone +19 -0
  21. data/vendor/FreeImage/README.linux +50 -0
  22. data/vendor/FreeImage/README.minGW +236 -0
  23. data/vendor/FreeImage/README.osx +44 -0
  24. data/vendor/FreeImage/README.solaris +67 -0
  25. data/vendor/FreeImage/Source/CacheFile.h +92 -0
  26. data/vendor/FreeImage/Source/DeprecationManager/Deprecated.cpp +36 -0
  27. data/vendor/FreeImage/Source/DeprecationManager/DeprecationMgr.cpp +103 -0
  28. data/vendor/FreeImage/Source/DeprecationManager/DeprecationMgr.h +83 -0
  29. data/vendor/FreeImage/Source/FreeImage/BitmapAccess.cpp +1573 -0
  30. data/vendor/FreeImage/Source/FreeImage/CacheFile.cpp +271 -0
  31. data/vendor/FreeImage/Source/FreeImage/ColorLookup.cpp +785 -0
  32. data/vendor/FreeImage/Source/FreeImage/Conversion.cpp +551 -0
  33. data/vendor/FreeImage/Source/FreeImage/Conversion16_555.cpp +209 -0
  34. data/vendor/FreeImage/Source/FreeImage/Conversion16_565.cpp +204 -0
  35. data/vendor/FreeImage/Source/FreeImage/Conversion24.cpp +252 -0
  36. data/vendor/FreeImage/Source/FreeImage/Conversion32.cpp +345 -0
  37. data/vendor/FreeImage/Source/FreeImage/Conversion4.cpp +246 -0
  38. data/vendor/FreeImage/Source/FreeImage/Conversion8.cpp +305 -0
  39. data/vendor/FreeImage/Source/FreeImage/ConversionFloat.cpp +194 -0
  40. data/vendor/FreeImage/Source/FreeImage/ConversionRGB16.cpp +144 -0
  41. data/vendor/FreeImage/Source/FreeImage/ConversionRGBA16.cpp +147 -0
  42. data/vendor/FreeImage/Source/FreeImage/ConversionRGBAF.cpp +250 -0
  43. data/vendor/FreeImage/Source/FreeImage/ConversionRGBF.cpp +243 -0
  44. data/vendor/FreeImage/Source/FreeImage/ConversionType.cpp +699 -0
  45. data/vendor/FreeImage/Source/FreeImage/ConversionUINT16.cpp +134 -0
  46. data/vendor/FreeImage/Source/FreeImage/FreeImage.cpp +226 -0
  47. data/vendor/FreeImage/Source/FreeImage/FreeImageC.c +22 -0
  48. data/vendor/FreeImage/Source/FreeImage/FreeImageIO.cpp +175 -0
  49. data/vendor/FreeImage/Source/FreeImage/GetType.cpp +92 -0
  50. data/vendor/FreeImage/Source/FreeImage/Halftoning.cpp +474 -0
  51. data/vendor/FreeImage/Source/FreeImage/J2KHelper.cpp +591 -0
  52. data/vendor/FreeImage/Source/FreeImage/J2KHelper.h +36 -0
  53. data/vendor/FreeImage/Source/FreeImage/LFPQuantizer.cpp +208 -0
  54. data/vendor/FreeImage/Source/FreeImage/MNGHelper.cpp +1320 -0
  55. data/vendor/FreeImage/Source/FreeImage/MemoryIO.cpp +237 -0
  56. data/vendor/FreeImage/Source/FreeImage/MultiPage.cpp +974 -0
  57. data/vendor/FreeImage/Source/FreeImage/NNQuantizer.cpp +507 -0
  58. data/vendor/FreeImage/Source/FreeImage/PSDParser.cpp +1057 -0
  59. data/vendor/FreeImage/Source/FreeImage/PSDParser.h +271 -0
  60. data/vendor/FreeImage/Source/FreeImage/PixelAccess.cpp +197 -0
  61. data/vendor/FreeImage/Source/FreeImage/Plugin.cpp +822 -0
  62. data/vendor/FreeImage/Source/FreeImage/PluginBMP.cpp +1494 -0
  63. data/vendor/FreeImage/Source/FreeImage/PluginCUT.cpp +240 -0
  64. data/vendor/FreeImage/Source/FreeImage/PluginDDS.cpp +655 -0
  65. data/vendor/FreeImage/Source/FreeImage/PluginEXR.cpp +773 -0
  66. data/vendor/FreeImage/Source/FreeImage/PluginG3.cpp +433 -0
  67. data/vendor/FreeImage/Source/FreeImage/PluginGIF.cpp +1407 -0
  68. data/vendor/FreeImage/Source/FreeImage/PluginHDR.cpp +722 -0
  69. data/vendor/FreeImage/Source/FreeImage/PluginICO.cpp +824 -0
  70. data/vendor/FreeImage/Source/FreeImage/PluginIFF.cpp +459 -0
  71. data/vendor/FreeImage/Source/FreeImage/PluginJ2K.cpp +328 -0
  72. data/vendor/FreeImage/Source/FreeImage/PluginJNG.cpp +162 -0
  73. data/vendor/FreeImage/Source/FreeImage/PluginJP2.cpp +328 -0
  74. data/vendor/FreeImage/Source/FreeImage/PluginJPEG.cpp +1706 -0
  75. data/vendor/FreeImage/Source/FreeImage/PluginJXR.cpp +1475 -0
  76. data/vendor/FreeImage/Source/FreeImage/PluginKOALA.cpp +243 -0
  77. data/vendor/FreeImage/Source/FreeImage/PluginMNG.cpp +153 -0
  78. data/vendor/FreeImage/Source/FreeImage/PluginPCD.cpp +251 -0
  79. data/vendor/FreeImage/Source/FreeImage/PluginPCX.cpp +659 -0
  80. data/vendor/FreeImage/Source/FreeImage/PluginPFM.cpp +409 -0
  81. data/vendor/FreeImage/Source/FreeImage/PluginPICT.cpp +1343 -0
  82. data/vendor/FreeImage/Source/FreeImage/PluginPNG.cpp +1115 -0
  83. data/vendor/FreeImage/Source/FreeImage/PluginPNM.cpp +838 -0
  84. data/vendor/FreeImage/Source/FreeImage/PluginPSD.cpp +131 -0
  85. data/vendor/FreeImage/Source/FreeImage/PluginRAS.cpp +512 -0
  86. data/vendor/FreeImage/Source/FreeImage/PluginRAW.cpp +793 -0
  87. data/vendor/FreeImage/Source/FreeImage/PluginSGI.cpp +425 -0
  88. data/vendor/FreeImage/Source/FreeImage/PluginTARGA.cpp +1591 -0
  89. data/vendor/FreeImage/Source/FreeImage/PluginTIFF.cpp +2631 -0
  90. data/vendor/FreeImage/Source/FreeImage/PluginWBMP.cpp +372 -0
  91. data/vendor/FreeImage/Source/FreeImage/PluginWebP.cpp +698 -0
  92. data/vendor/FreeImage/Source/FreeImage/PluginXBM.cpp +399 -0
  93. data/vendor/FreeImage/Source/FreeImage/PluginXPM.cpp +487 -0
  94. data/vendor/FreeImage/Source/FreeImage/TIFFLogLuv.cpp +65 -0
  95. data/vendor/FreeImage/Source/FreeImage/ToneMapping.cpp +75 -0
  96. data/vendor/FreeImage/Source/FreeImage/WuQuantizer.cpp +559 -0
  97. data/vendor/FreeImage/Source/FreeImage/ZLibInterface.cpp +223 -0
  98. data/vendor/FreeImage/Source/FreeImage/tmoColorConvert.cpp +479 -0
  99. data/vendor/FreeImage/Source/FreeImage/tmoDrago03.cpp +295 -0
  100. data/vendor/FreeImage/Source/FreeImage/tmoFattal02.cpp +689 -0
  101. data/vendor/FreeImage/Source/FreeImage/tmoReinhard05.cpp +260 -0
  102. data/vendor/FreeImage/Source/FreeImage.h +1153 -0
  103. data/vendor/FreeImage/Source/FreeImageIO.h +63 -0
  104. data/vendor/FreeImage/Source/FreeImageToolkit/BSplineRotate.cpp +730 -0
  105. data/vendor/FreeImage/Source/FreeImageToolkit/Background.cpp +895 -0
  106. data/vendor/FreeImage/Source/FreeImageToolkit/Channels.cpp +488 -0
  107. data/vendor/FreeImage/Source/FreeImageToolkit/ClassicRotate.cpp +917 -0
  108. data/vendor/FreeImage/Source/FreeImageToolkit/Colors.cpp +967 -0
  109. data/vendor/FreeImage/Source/FreeImageToolkit/CopyPaste.cpp +861 -0
  110. data/vendor/FreeImage/Source/FreeImageToolkit/Display.cpp +230 -0
  111. data/vendor/FreeImage/Source/FreeImageToolkit/Filters.h +287 -0
  112. data/vendor/FreeImage/Source/FreeImageToolkit/Flip.cpp +166 -0
  113. data/vendor/FreeImage/Source/FreeImageToolkit/JPEGTransform.cpp +623 -0
  114. data/vendor/FreeImage/Source/FreeImageToolkit/MultigridPoissonSolver.cpp +505 -0
  115. data/vendor/FreeImage/Source/FreeImageToolkit/Rescale.cpp +192 -0
  116. data/vendor/FreeImage/Source/FreeImageToolkit/Resize.cpp +2116 -0
  117. data/vendor/FreeImage/Source/FreeImageToolkit/Resize.h +196 -0
  118. data/vendor/FreeImage/Source/LibJPEG/ansi2knr.c +739 -0
  119. data/vendor/FreeImage/Source/LibJPEG/cderror.h +134 -0
  120. data/vendor/FreeImage/Source/LibJPEG/cdjpeg.c +181 -0
  121. data/vendor/FreeImage/Source/LibJPEG/cdjpeg.h +187 -0
  122. data/vendor/FreeImage/Source/LibJPEG/cjpeg.c +664 -0
  123. data/vendor/FreeImage/Source/LibJPEG/ckconfig.c +402 -0
  124. data/vendor/FreeImage/Source/LibJPEG/djpeg.c +617 -0
  125. data/vendor/FreeImage/Source/LibJPEG/example.c +433 -0
  126. data/vendor/FreeImage/Source/LibJPEG/jaricom.c +153 -0
  127. data/vendor/FreeImage/Source/LibJPEG/jcapimin.c +288 -0
  128. data/vendor/FreeImage/Source/LibJPEG/jcapistd.c +162 -0
  129. data/vendor/FreeImage/Source/LibJPEG/jcarith.c +944 -0
  130. data/vendor/FreeImage/Source/LibJPEG/jccoefct.c +454 -0
  131. data/vendor/FreeImage/Source/LibJPEG/jccolor.c +604 -0
  132. data/vendor/FreeImage/Source/LibJPEG/jcdctmgr.c +477 -0
  133. data/vendor/FreeImage/Source/LibJPEG/jchuff.c +1573 -0
  134. data/vendor/FreeImage/Source/LibJPEG/jcinit.c +84 -0
  135. data/vendor/FreeImage/Source/LibJPEG/jcmainct.c +297 -0
  136. data/vendor/FreeImage/Source/LibJPEG/jcmarker.c +719 -0
  137. data/vendor/FreeImage/Source/LibJPEG/jcmaster.c +856 -0
  138. data/vendor/FreeImage/Source/LibJPEG/jcomapi.c +106 -0
  139. data/vendor/FreeImage/Source/LibJPEG/jconfig.h +161 -0
  140. data/vendor/FreeImage/Source/LibJPEG/jcparam.c +675 -0
  141. data/vendor/FreeImage/Source/LibJPEG/jcprepct.c +358 -0
  142. data/vendor/FreeImage/Source/LibJPEG/jcsample.c +545 -0
  143. data/vendor/FreeImage/Source/LibJPEG/jctrans.c +385 -0
  144. data/vendor/FreeImage/Source/LibJPEG/jdapimin.c +399 -0
  145. data/vendor/FreeImage/Source/LibJPEG/jdapistd.c +276 -0
  146. data/vendor/FreeImage/Source/LibJPEG/jdarith.c +796 -0
  147. data/vendor/FreeImage/Source/LibJPEG/jdatadst.c +270 -0
  148. data/vendor/FreeImage/Source/LibJPEG/jdatasrc.c +275 -0
  149. data/vendor/FreeImage/Source/LibJPEG/jdcoefct.c +741 -0
  150. data/vendor/FreeImage/Source/LibJPEG/jdcolor.c +748 -0
  151. data/vendor/FreeImage/Source/LibJPEG/jdct.h +393 -0
  152. data/vendor/FreeImage/Source/LibJPEG/jddctmgr.c +384 -0
  153. data/vendor/FreeImage/Source/LibJPEG/jdhuff.c +1554 -0
  154. data/vendor/FreeImage/Source/LibJPEG/jdinput.c +662 -0
  155. data/vendor/FreeImage/Source/LibJPEG/jdmainct.c +513 -0
  156. data/vendor/FreeImage/Source/LibJPEG/jdmarker.c +1511 -0
  157. data/vendor/FreeImage/Source/LibJPEG/jdmaster.c +543 -0
  158. data/vendor/FreeImage/Source/LibJPEG/jdmerge.c +401 -0
  159. data/vendor/FreeImage/Source/LibJPEG/jdpostct.c +290 -0
  160. data/vendor/FreeImage/Source/LibJPEG/jdsample.c +361 -0
  161. data/vendor/FreeImage/Source/LibJPEG/jdtrans.c +140 -0
  162. data/vendor/FreeImage/Source/LibJPEG/jerror.c +253 -0
  163. data/vendor/FreeImage/Source/LibJPEG/jerror.h +304 -0
  164. data/vendor/FreeImage/Source/LibJPEG/jfdctflt.c +174 -0
  165. data/vendor/FreeImage/Source/LibJPEG/jfdctfst.c +230 -0
  166. data/vendor/FreeImage/Source/LibJPEG/jfdctint.c +4406 -0
  167. data/vendor/FreeImage/Source/LibJPEG/jidctflt.c +235 -0
  168. data/vendor/FreeImage/Source/LibJPEG/jidctfst.c +368 -0
  169. data/vendor/FreeImage/Source/LibJPEG/jidctint.c +5179 -0
  170. data/vendor/FreeImage/Source/LibJPEG/jinclude.h +91 -0
  171. data/vendor/FreeImage/Source/LibJPEG/jmemansi.c +167 -0
  172. data/vendor/FreeImage/Source/LibJPEG/jmemdos.c +638 -0
  173. data/vendor/FreeImage/Source/LibJPEG/jmemmac.c +289 -0
  174. data/vendor/FreeImage/Source/LibJPEG/jmemmgr.c +1119 -0
  175. data/vendor/FreeImage/Source/LibJPEG/jmemname.c +276 -0
  176. data/vendor/FreeImage/Source/LibJPEG/jmemnobs.c +109 -0
  177. data/vendor/FreeImage/Source/LibJPEG/jmemsys.h +198 -0
  178. data/vendor/FreeImage/Source/LibJPEG/jmorecfg.h +442 -0
  179. data/vendor/FreeImage/Source/LibJPEG/jpegint.h +426 -0
  180. data/vendor/FreeImage/Source/LibJPEG/jpeglib.h +1180 -0
  181. data/vendor/FreeImage/Source/LibJPEG/jpegtran.c +577 -0
  182. data/vendor/FreeImage/Source/LibJPEG/jquant1.c +857 -0
  183. data/vendor/FreeImage/Source/LibJPEG/jquant2.c +1311 -0
  184. data/vendor/FreeImage/Source/LibJPEG/jutils.c +227 -0
  185. data/vendor/FreeImage/Source/LibJPEG/jversion.h +14 -0
  186. data/vendor/FreeImage/Source/LibJPEG/rdbmp.c +480 -0
  187. data/vendor/FreeImage/Source/LibJPEG/rdcolmap.c +253 -0
  188. data/vendor/FreeImage/Source/LibJPEG/rdgif.c +38 -0
  189. data/vendor/FreeImage/Source/LibJPEG/rdjpgcom.c +515 -0
  190. data/vendor/FreeImage/Source/LibJPEG/rdppm.c +459 -0
  191. data/vendor/FreeImage/Source/LibJPEG/rdrle.c +387 -0
  192. data/vendor/FreeImage/Source/LibJPEG/rdswitch.c +365 -0
  193. data/vendor/FreeImage/Source/LibJPEG/rdtarga.c +500 -0
  194. data/vendor/FreeImage/Source/LibJPEG/transupp.c +1763 -0
  195. data/vendor/FreeImage/Source/LibJPEG/transupp.h +219 -0
  196. data/vendor/FreeImage/Source/LibJPEG/wrbmp.c +442 -0
  197. data/vendor/FreeImage/Source/LibJPEG/wrgif.c +399 -0
  198. data/vendor/FreeImage/Source/LibJPEG/wrjpgcom.c +583 -0
  199. data/vendor/FreeImage/Source/LibJPEG/wrppm.c +269 -0
  200. data/vendor/FreeImage/Source/LibJPEG/wrrle.c +305 -0
  201. data/vendor/FreeImage/Source/LibJPEG/wrtarga.c +253 -0
  202. data/vendor/FreeImage/Source/LibJXR/common/include/guiddef.h +230 -0
  203. data/vendor/FreeImage/Source/LibJXR/common/include/wmsal.h +757 -0
  204. data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstring.h +342 -0
  205. data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstrings_adt.h +71 -0
  206. data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstrings_strict.h +1096 -0
  207. data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstrings_undef.h +406 -0
  208. data/vendor/FreeImage/Source/LibJXR/image/decode/JXRTranscode.c +987 -0
  209. data/vendor/FreeImage/Source/LibJXR/image/decode/decode.c +200 -0
  210. data/vendor/FreeImage/Source/LibJXR/image/decode/decode.h +143 -0
  211. data/vendor/FreeImage/Source/LibJXR/image/decode/postprocess.c +288 -0
  212. data/vendor/FreeImage/Source/LibJXR/image/decode/segdec.c +1205 -0
  213. data/vendor/FreeImage/Source/LibJXR/image/decode/strInvTransform.c +1888 -0
  214. data/vendor/FreeImage/Source/LibJXR/image/decode/strPredQuantDec.c +539 -0
  215. data/vendor/FreeImage/Source/LibJXR/image/decode/strdec.c +3628 -0
  216. data/vendor/FreeImage/Source/LibJXR/image/decode/strdec_x86.c +1640 -0
  217. data/vendor/FreeImage/Source/LibJXR/image/encode/encode.c +144 -0
  218. data/vendor/FreeImage/Source/LibJXR/image/encode/encode.h +113 -0
  219. data/vendor/FreeImage/Source/LibJXR/image/encode/segenc.c +1186 -0
  220. data/vendor/FreeImage/Source/LibJXR/image/encode/strFwdTransform.c +1111 -0
  221. data/vendor/FreeImage/Source/LibJXR/image/encode/strPredQuantEnc.c +511 -0
  222. data/vendor/FreeImage/Source/LibJXR/image/encode/strenc.c +2370 -0
  223. data/vendor/FreeImage/Source/LibJXR/image/encode/strenc_x86.c +409 -0
  224. data/vendor/FreeImage/Source/LibJXR/image/sys/adapthuff.c +511 -0
  225. data/vendor/FreeImage/Source/LibJXR/image/sys/ansi.h +61 -0
  226. data/vendor/FreeImage/Source/LibJXR/image/sys/common.h +131 -0
  227. data/vendor/FreeImage/Source/LibJXR/image/sys/image.c +183 -0
  228. data/vendor/FreeImage/Source/LibJXR/image/sys/perfTimer.h +115 -0
  229. data/vendor/FreeImage/Source/LibJXR/image/sys/perfTimerANSI.c +274 -0
  230. data/vendor/FreeImage/Source/LibJXR/image/sys/strPredQuant.c +306 -0
  231. data/vendor/FreeImage/Source/LibJXR/image/sys/strTransform.c +85 -0
  232. data/vendor/FreeImage/Source/LibJXR/image/sys/strTransform.h +50 -0
  233. data/vendor/FreeImage/Source/LibJXR/image/sys/strcodec.c +1251 -0
  234. data/vendor/FreeImage/Source/LibJXR/image/sys/strcodec.h +681 -0
  235. data/vendor/FreeImage/Source/LibJXR/image/sys/windowsmediaphoto.h +515 -0
  236. data/vendor/FreeImage/Source/LibJXR/image/sys/xplatform_image.h +84 -0
  237. data/vendor/FreeImage/Source/LibJXR/image/x86/x86.h +58 -0
  238. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGlue.c +930 -0
  239. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGlue.h +636 -0
  240. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGlueJxr.c +2246 -0
  241. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGluePFC.c +2338 -0
  242. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRMeta.c +905 -0
  243. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRMeta.h +258 -0
  244. data/vendor/FreeImage/Source/LibOpenJPEG/bio.c +188 -0
  245. data/vendor/FreeImage/Source/LibOpenJPEG/bio.h +128 -0
  246. data/vendor/FreeImage/Source/LibOpenJPEG/cidx_manager.c +239 -0
  247. data/vendor/FreeImage/Source/LibOpenJPEG/cidx_manager.h +68 -0
  248. data/vendor/FreeImage/Source/LibOpenJPEG/cio.c +644 -0
  249. data/vendor/FreeImage/Source/LibOpenJPEG/cio.h +393 -0
  250. data/vendor/FreeImage/Source/LibOpenJPEG/dwt.c +919 -0
  251. data/vendor/FreeImage/Source/LibOpenJPEG/dwt.h +116 -0
  252. data/vendor/FreeImage/Source/LibOpenJPEG/event.c +141 -0
  253. data/vendor/FreeImage/Source/LibOpenJPEG/event.h +97 -0
  254. data/vendor/FreeImage/Source/LibOpenJPEG/function_list.c +114 -0
  255. data/vendor/FreeImage/Source/LibOpenJPEG/function_list.h +126 -0
  256. data/vendor/FreeImage/Source/LibOpenJPEG/image.c +235 -0
  257. data/vendor/FreeImage/Source/LibOpenJPEG/image.h +63 -0
  258. data/vendor/FreeImage/Source/LibOpenJPEG/indexbox_manager.h +148 -0
  259. data/vendor/FreeImage/Source/LibOpenJPEG/invert.c +289 -0
  260. data/vendor/FreeImage/Source/LibOpenJPEG/invert.h +59 -0
  261. data/vendor/FreeImage/Source/LibOpenJPEG/j2k.c +10238 -0
  262. data/vendor/FreeImage/Source/LibOpenJPEG/j2k.h +838 -0
  263. data/vendor/FreeImage/Source/LibOpenJPEG/jp2.c +2776 -0
  264. data/vendor/FreeImage/Source/LibOpenJPEG/jp2.h +490 -0
  265. data/vendor/FreeImage/Source/LibOpenJPEG/mct.c +319 -0
  266. data/vendor/FreeImage/Source/LibOpenJPEG/mct.h +149 -0
  267. data/vendor/FreeImage/Source/LibOpenJPEG/mqc.c +604 -0
  268. data/vendor/FreeImage/Source/LibOpenJPEG/mqc.h +201 -0
  269. data/vendor/FreeImage/Source/LibOpenJPEG/openjpeg.c +955 -0
  270. data/vendor/FreeImage/Source/LibOpenJPEG/openjpeg.h +1475 -0
  271. data/vendor/FreeImage/Source/LibOpenJPEG/opj_clock.c +59 -0
  272. data/vendor/FreeImage/Source/LibOpenJPEG/opj_clock.h +54 -0
  273. data/vendor/FreeImage/Source/LibOpenJPEG/opj_codec.h +160 -0
  274. data/vendor/FreeImage/Source/LibOpenJPEG/opj_config.h +9 -0
  275. data/vendor/FreeImage/Source/LibOpenJPEG/opj_config_private.h +16 -0
  276. data/vendor/FreeImage/Source/LibOpenJPEG/opj_includes.h +175 -0
  277. data/vendor/FreeImage/Source/LibOpenJPEG/opj_intmath.h +172 -0
  278. data/vendor/FreeImage/Source/LibOpenJPEG/opj_inttypes.h +43 -0
  279. data/vendor/FreeImage/Source/LibOpenJPEG/opj_malloc.h +180 -0
  280. data/vendor/FreeImage/Source/LibOpenJPEG/opj_stdint.h +47 -0
  281. data/vendor/FreeImage/Source/LibOpenJPEG/phix_manager.c +191 -0
  282. data/vendor/FreeImage/Source/LibOpenJPEG/pi.c +1870 -0
  283. data/vendor/FreeImage/Source/LibOpenJPEG/pi.h +182 -0
  284. data/vendor/FreeImage/Source/LibOpenJPEG/ppix_manager.c +194 -0
  285. data/vendor/FreeImage/Source/LibOpenJPEG/raw.c +89 -0
  286. data/vendor/FreeImage/Source/LibOpenJPEG/raw.h +100 -0
  287. data/vendor/FreeImage/Source/LibOpenJPEG/t1.c +1751 -0
  288. data/vendor/FreeImage/Source/LibOpenJPEG/t1.h +157 -0
  289. data/vendor/FreeImage/Source/LibOpenJPEG/t1_generate_luts.c +276 -0
  290. data/vendor/FreeImage/Source/LibOpenJPEG/t1_luts.h +143 -0
  291. data/vendor/FreeImage/Source/LibOpenJPEG/t2.c +1334 -0
  292. data/vendor/FreeImage/Source/LibOpenJPEG/t2.h +127 -0
  293. data/vendor/FreeImage/Source/LibOpenJPEG/tcd.c +2123 -0
  294. data/vendor/FreeImage/Source/LibOpenJPEG/tcd.h +348 -0
  295. data/vendor/FreeImage/Source/LibOpenJPEG/tgt.c +331 -0
  296. data/vendor/FreeImage/Source/LibOpenJPEG/tgt.h +140 -0
  297. data/vendor/FreeImage/Source/LibOpenJPEG/thix_manager.c +134 -0
  298. data/vendor/FreeImage/Source/LibOpenJPEG/tpix_manager.c +185 -0
  299. data/vendor/FreeImage/Source/LibPNG/example.c +1061 -0
  300. data/vendor/FreeImage/Source/LibPNG/png.c +4493 -0
  301. data/vendor/FreeImage/Source/LibPNG/png.h +3282 -0
  302. data/vendor/FreeImage/Source/LibPNG/pngconf.h +644 -0
  303. data/vendor/FreeImage/Source/LibPNG/pngdebug.h +154 -0
  304. data/vendor/FreeImage/Source/LibPNG/pngerror.c +963 -0
  305. data/vendor/FreeImage/Source/LibPNG/pngget.c +1213 -0
  306. data/vendor/FreeImage/Source/LibPNG/pnginfo.h +260 -0
  307. data/vendor/FreeImage/Source/LibPNG/pnglibconf.h +218 -0
  308. data/vendor/FreeImage/Source/LibPNG/pngmem.c +281 -0
  309. data/vendor/FreeImage/Source/LibPNG/pngpread.c +1168 -0
  310. data/vendor/FreeImage/Source/LibPNG/pngpriv.h +1944 -0
  311. data/vendor/FreeImage/Source/LibPNG/pngread.c +4121 -0
  312. data/vendor/FreeImage/Source/LibPNG/pngrio.c +120 -0
  313. data/vendor/FreeImage/Source/LibPNG/pngrtran.c +4994 -0
  314. data/vendor/FreeImage/Source/LibPNG/pngrutil.c +4474 -0
  315. data/vendor/FreeImage/Source/LibPNG/pngset.c +1611 -0
  316. data/vendor/FreeImage/Source/LibPNG/pngstruct.h +489 -0
  317. data/vendor/FreeImage/Source/LibPNG/pngtest.c +2011 -0
  318. data/vendor/FreeImage/Source/LibPNG/pngtrans.c +849 -0
  319. data/vendor/FreeImage/Source/LibPNG/pngwio.c +168 -0
  320. data/vendor/FreeImage/Source/LibPNG/pngwrite.c +2455 -0
  321. data/vendor/FreeImage/Source/LibPNG/pngwtran.c +574 -0
  322. data/vendor/FreeImage/Source/LibPNG/pngwutil.c +3029 -0
  323. data/vendor/FreeImage/Source/LibRawLite/dcraw/dcraw.c +15462 -0
  324. data/vendor/FreeImage/Source/LibRawLite/internal/aahd_demosaic.cpp +706 -0
  325. data/vendor/FreeImage/Source/LibRawLite/internal/dcb_demosaicing.c +710 -0
  326. data/vendor/FreeImage/Source/LibRawLite/internal/dcraw_common.cpp +13593 -0
  327. data/vendor/FreeImage/Source/LibRawLite/internal/dcraw_fileio.cpp +240 -0
  328. data/vendor/FreeImage/Source/LibRawLite/internal/defines.h +167 -0
  329. data/vendor/FreeImage/Source/LibRawLite/internal/demosaic_packs.cpp +99 -0
  330. data/vendor/FreeImage/Source/LibRawLite/internal/dht_demosaic.cpp +873 -0
  331. data/vendor/FreeImage/Source/LibRawLite/internal/libraw_internal_funcs.h +282 -0
  332. data/vendor/FreeImage/Source/LibRawLite/internal/libraw_x3f.cpp +1919 -0
  333. data/vendor/FreeImage/Source/LibRawLite/internal/var_defines.h +216 -0
  334. data/vendor/FreeImage/Source/LibRawLite/internal/wf_filtering.cpp +1950 -0
  335. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw.h +338 -0
  336. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_alloc.h +99 -0
  337. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_const.h +233 -0
  338. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_datastream.h +238 -0
  339. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_internal.h +225 -0
  340. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_types.h +442 -0
  341. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_version.h +62 -0
  342. data/vendor/FreeImage/Source/LibRawLite/src/libraw_c_api.cpp +230 -0
  343. data/vendor/FreeImage/Source/LibRawLite/src/libraw_cxx.cpp +4533 -0
  344. data/vendor/FreeImage/Source/LibRawLite/src/libraw_datastream.cpp +703 -0
  345. data/vendor/FreeImage/Source/LibTIFF4/mkg3states.c +451 -0
  346. data/vendor/FreeImage/Source/LibTIFF4/mkspans.c +82 -0
  347. data/vendor/FreeImage/Source/LibTIFF4/t4.h +292 -0
  348. data/vendor/FreeImage/Source/LibTIFF4/tif_aux.c +358 -0
  349. data/vendor/FreeImage/Source/LibTIFF4/tif_close.c +140 -0
  350. data/vendor/FreeImage/Source/LibTIFF4/tif_codec.c +166 -0
  351. data/vendor/FreeImage/Source/LibTIFF4/tif_color.c +287 -0
  352. data/vendor/FreeImage/Source/LibTIFF4/tif_compress.c +304 -0
  353. data/vendor/FreeImage/Source/LibTIFF4/tif_config.h +97 -0
  354. data/vendor/FreeImage/Source/LibTIFF4/tif_config.vc.h +74 -0
  355. data/vendor/FreeImage/Source/LibTIFF4/tif_config.wince.h +71 -0
  356. data/vendor/FreeImage/Source/LibTIFF4/tif_dir.c +1700 -0
  357. data/vendor/FreeImage/Source/LibTIFF4/tif_dir.h +308 -0
  358. data/vendor/FreeImage/Source/LibTIFF4/tif_dirinfo.c +959 -0
  359. data/vendor/FreeImage/Source/LibTIFF4/tif_dirread.c +5640 -0
  360. data/vendor/FreeImage/Source/LibTIFF4/tif_dirwrite.c +2910 -0
  361. data/vendor/FreeImage/Source/LibTIFF4/tif_dumpmode.c +143 -0
  362. data/vendor/FreeImage/Source/LibTIFF4/tif_error.c +80 -0
  363. data/vendor/FreeImage/Source/LibTIFF4/tif_extension.c +118 -0
  364. data/vendor/FreeImage/Source/LibTIFF4/tif_fax3.c +1595 -0
  365. data/vendor/FreeImage/Source/LibTIFF4/tif_fax3.h +538 -0
  366. data/vendor/FreeImage/Source/LibTIFF4/tif_fax3sm.c +1260 -0
  367. data/vendor/FreeImage/Source/LibTIFF4/tif_flush.c +118 -0
  368. data/vendor/FreeImage/Source/LibTIFF4/tif_getimage.c +2890 -0
  369. data/vendor/FreeImage/Source/LibTIFF4/tif_jbig.c +213 -0
  370. data/vendor/FreeImage/Source/LibTIFF4/tif_jpeg.c +2354 -0
  371. data/vendor/FreeImage/Source/LibTIFF4/tif_jpeg_12.c +65 -0
  372. data/vendor/FreeImage/Source/LibTIFF4/tif_luv.c +1683 -0
  373. data/vendor/FreeImage/Source/LibTIFF4/tif_lzma.c +495 -0
  374. data/vendor/FreeImage/Source/LibTIFF4/tif_lzw.c +1169 -0
  375. data/vendor/FreeImage/Source/LibTIFF4/tif_next.c +181 -0
  376. data/vendor/FreeImage/Source/LibTIFF4/tif_ojpeg.c +2501 -0
  377. data/vendor/FreeImage/Source/LibTIFF4/tif_open.c +725 -0
  378. data/vendor/FreeImage/Source/LibTIFF4/tif_packbits.c +300 -0
  379. data/vendor/FreeImage/Source/LibTIFF4/tif_pixarlog.c +1442 -0
  380. data/vendor/FreeImage/Source/LibTIFF4/tif_predict.c +764 -0
  381. data/vendor/FreeImage/Source/LibTIFF4/tif_predict.h +77 -0
  382. data/vendor/FreeImage/Source/LibTIFF4/tif_print.c +716 -0
  383. data/vendor/FreeImage/Source/LibTIFF4/tif_read.c +1086 -0
  384. data/vendor/FreeImage/Source/LibTIFF4/tif_strip.c +383 -0
  385. data/vendor/FreeImage/Source/LibTIFF4/tif_swab.c +310 -0
  386. data/vendor/FreeImage/Source/LibTIFF4/tif_thunder.c +207 -0
  387. data/vendor/FreeImage/Source/LibTIFF4/tif_tile.c +299 -0
  388. data/vendor/FreeImage/Source/LibTIFF4/tif_unix.c +325 -0
  389. data/vendor/FreeImage/Source/LibTIFF4/tif_version.c +40 -0
  390. data/vendor/FreeImage/Source/LibTIFF4/tif_vms.c +603 -0
  391. data/vendor/FreeImage/Source/LibTIFF4/tif_warning.c +81 -0
  392. data/vendor/FreeImage/Source/LibTIFF4/tif_win32.c +443 -0
  393. data/vendor/FreeImage/Source/LibTIFF4/tif_wince.c +293 -0
  394. data/vendor/FreeImage/Source/LibTIFF4/tif_write.c +771 -0
  395. data/vendor/FreeImage/Source/LibTIFF4/tif_zip.c +472 -0
  396. data/vendor/FreeImage/Source/LibTIFF4/tiff.h +681 -0
  397. data/vendor/FreeImage/Source/LibTIFF4/tiffconf.h +170 -0
  398. data/vendor/FreeImage/Source/LibTIFF4/tiffconf.vc.h +160 -0
  399. data/vendor/FreeImage/Source/LibTIFF4/tiffconf.wince.h +121 -0
  400. data/vendor/FreeImage/Source/LibTIFF4/tiffio.h +557 -0
  401. data/vendor/FreeImage/Source/LibTIFF4/tiffiop.h +367 -0
  402. data/vendor/FreeImage/Source/LibTIFF4/tiffvers.h +9 -0
  403. data/vendor/FreeImage/Source/LibTIFF4/uvcode.h +180 -0
  404. data/vendor/FreeImage/Source/LibWebP/src/dec/alphai.h +55 -0
  405. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.alpha.c +167 -0
  406. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.buffer.c +249 -0
  407. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.frame.c +827 -0
  408. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.idec.c +857 -0
  409. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.io.c +640 -0
  410. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.quant.c +110 -0
  411. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.tree.c +525 -0
  412. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.vp8.c +663 -0
  413. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.vp8l.c +1584 -0
  414. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.webp.c +834 -0
  415. data/vendor/FreeImage/Source/LibWebP/src/dec/decode_vp8.h +185 -0
  416. data/vendor/FreeImage/Source/LibWebP/src/dec/vp8i.h +353 -0
  417. data/vendor/FreeImage/Source/LibWebP/src/dec/vp8li.h +136 -0
  418. data/vendor/FreeImage/Source/LibWebP/src/dec/webpi.h +120 -0
  419. data/vendor/FreeImage/Source/LibWebP/src/demux/demux.demux.c +957 -0
  420. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.alpha_processing.c +377 -0
  421. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.alpha_processing_mips_dsp_r2.c +139 -0
  422. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.alpha_processing_sse2.c +296 -0
  423. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.argb.c +68 -0
  424. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.argb_mips_dsp_r2.c +108 -0
  425. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.argb_sse2.c +62 -0
  426. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost.c +412 -0
  427. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost_mips32.c +154 -0
  428. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost_mips_dsp_r2.c +107 -0
  429. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost_sse2.c +121 -0
  430. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cpu.c +138 -0
  431. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec.c +760 -0
  432. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_clip_tables.c +366 -0
  433. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_mips32.c +585 -0
  434. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_mips_dsp_r2.c +992 -0
  435. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_neon.c +1489 -0
  436. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_sse2.c +1284 -0
  437. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc.c +788 -0
  438. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_avx2.c +24 -0
  439. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_mips32.c +670 -0
  440. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_mips_dsp_r2.c +1510 -0
  441. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_neon.c +932 -0
  442. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_sse2.c +940 -0
  443. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.filters.c +240 -0
  444. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.filters_mips_dsp_r2.c +404 -0
  445. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.filters_sse2.c +349 -0
  446. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.h +434 -0
  447. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless.c +1838 -0
  448. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_mips32.c +416 -0
  449. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_mips_dsp_r2.c +921 -0
  450. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_neon.c +357 -0
  451. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_sse2.c +535 -0
  452. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.rescaler.c +115 -0
  453. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.rescaler_mips32.c +192 -0
  454. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.rescaler_mips_dsp_r2.c +210 -0
  455. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling.c +252 -0
  456. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling_mips_dsp_r2.c +280 -0
  457. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling_neon.c +267 -0
  458. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling_sse2.c +214 -0
  459. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv.c +166 -0
  460. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv_mips32.c +100 -0
  461. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv_mips_dsp_r2.c +131 -0
  462. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv_sse2.c +322 -0
  463. data/vendor/FreeImage/Source/LibWebP/src/dsp/lossless.h +313 -0
  464. data/vendor/FreeImage/Source/LibWebP/src/dsp/mips_macro.h +200 -0
  465. data/vendor/FreeImage/Source/LibWebP/src/dsp/neon.h +82 -0
  466. data/vendor/FreeImage/Source/LibWebP/src/dsp/yuv.h +321 -0
  467. data/vendor/FreeImage/Source/LibWebP/src/dsp/yuv_tables_sse2.h +536 -0
  468. data/vendor/FreeImage/Source/LibWebP/src/enc/backward_references.h +202 -0
  469. data/vendor/FreeImage/Source/LibWebP/src/enc/cost.h +69 -0
  470. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.alpha.c +440 -0
  471. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.analysis.c +501 -0
  472. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.backward_references.c +1076 -0
  473. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.config.c +163 -0
  474. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.cost.c +355 -0
  475. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.filter.c +296 -0
  476. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.frame.c +850 -0
  477. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.histogram.c +897 -0
  478. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.iterator.c +456 -0
  479. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.near_lossless.c +160 -0
  480. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture.c +290 -0
  481. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_csp.c +1100 -0
  482. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_psnr.c +150 -0
  483. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_rescale.c +285 -0
  484. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_tools.c +206 -0
  485. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.quant.c +1191 -0
  486. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.syntax.c +383 -0
  487. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.token.c +285 -0
  488. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.tree.c +504 -0
  489. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.vp8l.c +1437 -0
  490. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.webpenc.c +379 -0
  491. data/vendor/FreeImage/Source/LibWebP/src/enc/histogram.h +114 -0
  492. data/vendor/FreeImage/Source/LibWebP/src/enc/vp8enci.h +551 -0
  493. data/vendor/FreeImage/Source/LibWebP/src/enc/vp8li.h +78 -0
  494. data/vendor/FreeImage/Source/LibWebP/src/mux/mux.anim_encode.c +1241 -0
  495. data/vendor/FreeImage/Source/LibWebP/src/mux/mux.muxedit.c +696 -0
  496. data/vendor/FreeImage/Source/LibWebP/src/mux/mux.muxinternal.c +551 -0
  497. data/vendor/FreeImage/Source/LibWebP/src/mux/mux.muxread.c +544 -0
  498. data/vendor/FreeImage/Source/LibWebP/src/mux/muxi.h +232 -0
  499. data/vendor/FreeImage/Source/LibWebP/src/utils/bit_reader.h +168 -0
  500. data/vendor/FreeImage/Source/LibWebP/src/utils/bit_reader_inl.h +172 -0
  501. data/vendor/FreeImage/Source/LibWebP/src/utils/bit_writer.h +120 -0
  502. data/vendor/FreeImage/Source/LibWebP/src/utils/color_cache.h +74 -0
  503. data/vendor/FreeImage/Source/LibWebP/src/utils/endian_inl.h +100 -0
  504. data/vendor/FreeImage/Source/LibWebP/src/utils/filters.h +32 -0
  505. data/vendor/FreeImage/Source/LibWebP/src/utils/huffman.h +67 -0
  506. data/vendor/FreeImage/Source/LibWebP/src/utils/huffman_encode.h +60 -0
  507. data/vendor/FreeImage/Source/LibWebP/src/utils/quant_levels.h +36 -0
  508. data/vendor/FreeImage/Source/LibWebP/src/utils/quant_levels_dec.h +35 -0
  509. data/vendor/FreeImage/Source/LibWebP/src/utils/random.h +63 -0
  510. data/vendor/FreeImage/Source/LibWebP/src/utils/rescaler.h +78 -0
  511. data/vendor/FreeImage/Source/LibWebP/src/utils/thread.h +93 -0
  512. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.bit_reader.c +208 -0
  513. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.bit_writer.c +308 -0
  514. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.color_cache.c +49 -0
  515. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.filters.c +76 -0
  516. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.h +121 -0
  517. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.huffman.c +205 -0
  518. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.huffman_encode.c +417 -0
  519. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.quant_levels.c +140 -0
  520. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.quant_levels_dec.c +279 -0
  521. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.random.c +43 -0
  522. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.rescaler.c +82 -0
  523. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.thread.c +309 -0
  524. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.utils.c +211 -0
  525. data/vendor/FreeImage/Source/LibWebP/src/webp/decode.h +493 -0
  526. data/vendor/FreeImage/Source/LibWebP/src/webp/demux.h +224 -0
  527. data/vendor/FreeImage/Source/LibWebP/src/webp/encode.h +515 -0
  528. data/vendor/FreeImage/Source/LibWebP/src/webp/format_constants.h +88 -0
  529. data/vendor/FreeImage/Source/LibWebP/src/webp/mux.h +507 -0
  530. data/vendor/FreeImage/Source/LibWebP/src/webp/mux_types.h +97 -0
  531. data/vendor/FreeImage/Source/LibWebP/src/webp/types.h +52 -0
  532. data/vendor/FreeImage/Source/MapIntrospector.h +212 -0
  533. data/vendor/FreeImage/Source/Metadata/Exif.cpp +1253 -0
  534. data/vendor/FreeImage/Source/Metadata/FIRational.cpp +176 -0
  535. data/vendor/FreeImage/Source/Metadata/FIRational.h +108 -0
  536. data/vendor/FreeImage/Source/Metadata/FreeImageTag.cpp +353 -0
  537. data/vendor/FreeImage/Source/Metadata/FreeImageTag.h +500 -0
  538. data/vendor/FreeImage/Source/Metadata/IPTC.cpp +342 -0
  539. data/vendor/FreeImage/Source/Metadata/TagConversion.cpp +1094 -0
  540. data/vendor/FreeImage/Source/Metadata/TagLib.cpp +1618 -0
  541. data/vendor/FreeImage/Source/Metadata/XTIFF.cpp +766 -0
  542. data/vendor/FreeImage/Source/OpenEXR/Half/eLut.cpp +114 -0
  543. data/vendor/FreeImage/Source/OpenEXR/Half/eLut.h +71 -0
  544. data/vendor/FreeImage/Source/OpenEXR/Half/half.cpp +310 -0
  545. data/vendor/FreeImage/Source/OpenEXR/Half/half.h +757 -0
  546. data/vendor/FreeImage/Source/OpenEXR/Half/halfExport.h +27 -0
  547. data/vendor/FreeImage/Source/OpenEXR/Half/halfFunction.h +179 -0
  548. data/vendor/FreeImage/Source/OpenEXR/Half/halfLimits.h +102 -0
  549. data/vendor/FreeImage/Source/OpenEXR/Half/toFloat.cpp +164 -0
  550. data/vendor/FreeImage/Source/OpenEXR/Half/toFloat.h +16391 -0
  551. data/vendor/FreeImage/Source/OpenEXR/Iex/Iex.h +60 -0
  552. data/vendor/FreeImage/Source/OpenEXR/Iex/IexBaseExc.cpp +156 -0
  553. data/vendor/FreeImage/Source/OpenEXR/Iex/IexBaseExc.h +264 -0
  554. data/vendor/FreeImage/Source/OpenEXR/Iex/IexErrnoExc.h +208 -0
  555. data/vendor/FreeImage/Source/OpenEXR/Iex/IexExport.h +51 -0
  556. data/vendor/FreeImage/Source/OpenEXR/Iex/IexForward.h +229 -0
  557. data/vendor/FreeImage/Source/OpenEXR/Iex/IexMacros.h +170 -0
  558. data/vendor/FreeImage/Source/OpenEXR/Iex/IexMathExc.h +57 -0
  559. data/vendor/FreeImage/Source/OpenEXR/Iex/IexNamespace.h +112 -0
  560. data/vendor/FreeImage/Source/OpenEXR/Iex/IexThrowErrnoExc.cpp +873 -0
  561. data/vendor/FreeImage/Source/OpenEXR/Iex/IexThrowErrnoExc.h +97 -0
  562. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFloatExc.cpp +113 -0
  563. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFloatExc.h +146 -0
  564. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFpu.cpp +530 -0
  565. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFpu.h +91 -0
  566. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathIeeeExc.h +62 -0
  567. data/vendor/FreeImage/Source/OpenEXR/IlmBaseConfig.h +61 -0
  568. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAcesFile.cpp +633 -0
  569. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAcesFile.h +324 -0
  570. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfArray.h +285 -0
  571. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAttribute.cpp +158 -0
  572. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAttribute.h +407 -0
  573. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAutoArray.h +95 -0
  574. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfB44Compressor.cpp +1072 -0
  575. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfB44Compressor.h +118 -0
  576. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfBoxAttribute.cpp +111 -0
  577. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfBoxAttribute.h +87 -0
  578. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCRgbaFile.cpp +1438 -0
  579. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCRgbaFile.h +555 -0
  580. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelList.cpp +322 -0
  581. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelList.h +436 -0
  582. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelListAttribute.cpp +150 -0
  583. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelListAttribute.h +74 -0
  584. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCheckedArithmetic.h +163 -0
  585. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticities.cpp +151 -0
  586. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticities.h +131 -0
  587. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticitiesAttribute.cpp +87 -0
  588. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticitiesAttribute.h +73 -0
  589. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompositeDeepScanLine.cpp +591 -0
  590. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompositeDeepScanLine.h +142 -0
  591. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompression.h +84 -0
  592. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressionAttribute.cpp +78 -0
  593. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressionAttribute.h +64 -0
  594. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressor.cpp +226 -0
  595. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressor.h +265 -0
  596. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfConvert.cpp +143 -0
  597. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfConvert.h +107 -0
  598. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepCompositing.cpp +110 -0
  599. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepCompositing.h +132 -0
  600. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepFrameBuffer.cpp +230 -0
  601. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepFrameBuffer.h +339 -0
  602. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepImageState.h +96 -0
  603. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepImageStateAttribute.cpp +78 -0
  604. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepImageStateAttribute.h +68 -0
  605. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputFile.cpp +2025 -0
  606. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputFile.h +276 -0
  607. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputPart.cpp +149 -0
  608. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputPart.h +181 -0
  609. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputFile.cpp +1552 -0
  610. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputFile.h +244 -0
  611. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputPart.cpp +107 -0
  612. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputPart.h +168 -0
  613. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputFile.cpp +1979 -0
  614. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputFile.h +437 -0
  615. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputPart.cpp +273 -0
  616. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputPart.h +362 -0
  617. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputFile.cpp +2055 -0
  618. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputFile.h +475 -0
  619. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputPart.cpp +250 -0
  620. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputPart.h +394 -0
  621. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDoubleAttribute.cpp +57 -0
  622. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDoubleAttribute.h +59 -0
  623. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDwaCompressor.cpp +3424 -0
  624. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDwaCompressor.h +210 -0
  625. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDwaCompressorSimd.h +2145 -0
  626. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmap.cpp +335 -0
  627. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmap.h +336 -0
  628. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmapAttribute.cpp +76 -0
  629. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmapAttribute.h +68 -0
  630. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfExport.h +46 -0
  631. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFastHuf.cpp +768 -0
  632. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFastHuf.h +148 -0
  633. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatAttribute.cpp +57 -0
  634. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatAttribute.h +58 -0
  635. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatVectorAttribute.cpp +84 -0
  636. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatVectorAttribute.h +76 -0
  637. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfForward.h +127 -0
  638. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFrameBuffer.cpp +228 -0
  639. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFrameBuffer.h +386 -0
  640. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFramesPerSecond.cpp +76 -0
  641. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFramesPerSecond.h +94 -0
  642. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericInputFile.cpp +76 -0
  643. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericInputFile.h +58 -0
  644. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericOutputFile.cpp +112 -0
  645. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericOutputFile.h +62 -0
  646. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHeader.cpp +1283 -0
  647. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHeader.h +699 -0
  648. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHuf.cpp +1114 -0
  649. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHuf.h +82 -0
  650. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIO.cpp +110 -0
  651. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIO.h +255 -0
  652. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputFile.cpp +895 -0
  653. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputFile.h +240 -0
  654. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPart.cpp +114 -0
  655. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPart.h +84 -0
  656. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPartData.cpp +51 -0
  657. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPartData.h +69 -0
  658. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputStreamMutex.h +68 -0
  659. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInt64.h +56 -0
  660. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIntAttribute.cpp +57 -0
  661. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIntAttribute.h +58 -0
  662. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCode.cpp +217 -0
  663. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCode.h +167 -0
  664. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCodeAttribute.cpp +99 -0
  665. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCodeAttribute.h +73 -0
  666. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLineOrder.h +69 -0
  667. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLineOrderAttribute.cpp +78 -0
  668. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLineOrderAttribute.h +72 -0
  669. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLut.cpp +178 -0
  670. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLut.h +188 -0
  671. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMatrixAttribute.cpp +263 -0
  672. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMatrixAttribute.h +83 -0
  673. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMisc.cpp +1872 -0
  674. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMisc.h +466 -0
  675. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartInputFile.cpp +783 -0
  676. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartInputFile.h +128 -0
  677. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartOutputFile.cpp +519 -0
  678. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartOutputFile.h +118 -0
  679. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiView.cpp +435 -0
  680. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiView.h +187 -0
  681. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfName.h +150 -0
  682. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfNamespace.h +115 -0
  683. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOpaqueAttribute.cpp +126 -0
  684. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOpaqueAttribute.h +110 -0
  685. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOptimizedPixelReading.h +646 -0
  686. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputFile.cpp +1378 -0
  687. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputFile.h +263 -0
  688. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPart.cpp +105 -0
  689. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPart.h +77 -0
  690. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPartData.cpp +52 -0
  691. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPartData.h +62 -0
  692. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputStreamMutex.h +70 -0
  693. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPartHelper.h +262 -0
  694. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPartType.cpp +63 -0
  695. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPartType.h +62 -0
  696. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPixelType.h +67 -0
  697. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPizCompressor.cpp +667 -0
  698. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPizCompressor.h +117 -0
  699. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImage.cpp +104 -0
  700. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImage.h +135 -0
  701. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImageAttribute.cpp +103 -0
  702. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImageAttribute.h +70 -0
  703. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPxr24Compressor.cpp +553 -0
  704. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPxr24Compressor.h +109 -0
  705. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRational.cpp +127 -0
  706. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRational.h +98 -0
  707. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRationalAttribute.cpp +74 -0
  708. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRationalAttribute.h +69 -0
  709. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgba.h +109 -0
  710. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaFile.cpp +1405 -0
  711. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaFile.h +346 -0
  712. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaYca.cpp +497 -0
  713. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaYca.h +259 -0
  714. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRle.cpp +157 -0
  715. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRle.h +63 -0
  716. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRleCompressor.cpp +220 -0
  717. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRleCompressor.h +80 -0
  718. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfScanLineInputFile.cpp +1702 -0
  719. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfScanLineInputFile.h +210 -0
  720. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfSimd.h +59 -0
  721. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStandardAttributes.cpp +125 -0
  722. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStandardAttributes.h +382 -0
  723. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStdIO.cpp +242 -0
  724. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStdIO.h +160 -0
  725. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringAttribute.cpp +80 -0
  726. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringAttribute.h +71 -0
  727. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringVectorAttribute.cpp +100 -0
  728. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringVectorAttribute.h +74 -0
  729. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfSystemSpecific.cpp +129 -0
  730. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfSystemSpecific.h +172 -0
  731. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTestFile.cpp +216 -0
  732. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTestFile.h +97 -0
  733. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfThreading.cpp +62 -0
  734. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfThreading.h +95 -0
  735. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileDescription.h +107 -0
  736. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileDescriptionAttribute.cpp +86 -0
  737. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileDescriptionAttribute.h +72 -0
  738. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileOffsets.cpp +552 -0
  739. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileOffsets.h +125 -0
  740. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputFile.cpp +1533 -0
  741. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputFile.h +401 -0
  742. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputPart.cpp +208 -0
  743. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputPart.h +100 -0
  744. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledMisc.cpp +389 -0
  745. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledMisc.h +106 -0
  746. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputFile.cpp +1841 -0
  747. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputFile.h +495 -0
  748. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputPart.cpp +228 -0
  749. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputPart.h +105 -0
  750. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledRgbaFile.cpp +1163 -0
  751. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledRgbaFile.h +482 -0
  752. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCode.cpp +431 -0
  753. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCode.h +242 -0
  754. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCodeAttribute.cpp +79 -0
  755. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCodeAttribute.h +74 -0
  756. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVecAttribute.cpp +217 -0
  757. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVecAttribute.h +100 -0
  758. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVersion.cpp +60 -0
  759. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVersion.h +136 -0
  760. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfWav.cpp +391 -0
  761. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfWav.h +78 -0
  762. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfXdr.h +927 -0
  763. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZip.cpp +196 -0
  764. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZip.h +78 -0
  765. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZipCompressor.cpp +127 -0
  766. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZipCompressor.h +89 -0
  767. data/vendor/FreeImage/Source/OpenEXR/IlmImf/b44ExpLogTable.cpp +136 -0
  768. data/vendor/FreeImage/Source/OpenEXR/IlmImf/b44ExpLogTable.h +16396 -0
  769. data/vendor/FreeImage/Source/OpenEXR/IlmImf/dwaLookups.cpp +573 -0
  770. data/vendor/FreeImage/Source/OpenEXR/IlmImf/dwaLookups.h +98334 -0
  771. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThread.cpp +80 -0
  772. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThread.h +143 -0
  773. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadExport.h +46 -0
  774. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadForward.h +52 -0
  775. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutex.cpp +59 -0
  776. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutex.h +160 -0
  777. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutexPosix.cpp +85 -0
  778. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutexWin32.cpp +79 -0
  779. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadNamespace.h +114 -0
  780. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadPool.cpp +483 -0
  781. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadPool.h +160 -0
  782. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadPosix.cpp +98 -0
  783. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphore.cpp +60 -0
  784. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphore.h +112 -0
  785. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphorePosix.cpp +106 -0
  786. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphorePosixCompat.cpp +155 -0
  787. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphoreWin32.cpp +153 -0
  788. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadWin32.cpp +100 -0
  789. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathBox.cpp +37 -0
  790. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathBox.h +849 -0
  791. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathBoxAlgo.h +1016 -0
  792. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathColor.h +736 -0
  793. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathColorAlgo.cpp +178 -0
  794. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathColorAlgo.h +257 -0
  795. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathEuler.h +926 -0
  796. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathExc.h +73 -0
  797. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathExport.h +46 -0
  798. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathForward.h +72 -0
  799. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFrame.h +192 -0
  800. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFrustum.h +741 -0
  801. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFrustumTest.h +417 -0
  802. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFun.cpp +181 -0
  803. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFun.h +269 -0
  804. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathGL.h +166 -0
  805. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathGLU.h +54 -0
  806. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathHalfLimits.h +68 -0
  807. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathInt64.h +62 -0
  808. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathInterval.h +226 -0
  809. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathLimits.h +268 -0
  810. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathLine.h +185 -0
  811. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathLineAlgo.h +288 -0
  812. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMath.h +208 -0
  813. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMatrix.h +3441 -0
  814. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMatrixAlgo.cpp +1252 -0
  815. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMatrixAlgo.h +1425 -0
  816. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathNamespace.h +115 -0
  817. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathPlane.h +257 -0
  818. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathPlatform.h +112 -0
  819. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathQuat.h +964 -0
  820. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathRandom.cpp +194 -0
  821. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathRandom.h +401 -0
  822. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathRoots.h +219 -0
  823. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathShear.cpp +54 -0
  824. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathShear.h +656 -0
  825. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathSphere.h +177 -0
  826. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathVec.cpp +583 -0
  827. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathVec.h +2227 -0
  828. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathVecAlgo.h +147 -0
  829. data/vendor/FreeImage/Source/OpenEXR/OpenEXRConfig.h +72 -0
  830. data/vendor/FreeImage/Source/Plugin.h +144 -0
  831. data/vendor/FreeImage/Source/Quantizers.h +354 -0
  832. data/vendor/FreeImage/Source/ToneMapping.h +44 -0
  833. data/vendor/FreeImage/Source/Utilities.h +516 -0
  834. data/vendor/FreeImage/Source/ZLib/adler32.c +179 -0
  835. data/vendor/FreeImage/Source/ZLib/compress.c +80 -0
  836. data/vendor/FreeImage/Source/ZLib/crc32.c +425 -0
  837. data/vendor/FreeImage/Source/ZLib/crc32.h +441 -0
  838. data/vendor/FreeImage/Source/ZLib/deflate.c +1967 -0
  839. data/vendor/FreeImage/Source/ZLib/deflate.h +346 -0
  840. data/vendor/FreeImage/Source/ZLib/gzclose.c +25 -0
  841. data/vendor/FreeImage/Source/ZLib/gzguts.h +209 -0
  842. data/vendor/FreeImage/Source/ZLib/gzlib.c +634 -0
  843. data/vendor/FreeImage/Source/ZLib/gzread.c +594 -0
  844. data/vendor/FreeImage/Source/ZLib/gzwrite.c +577 -0
  845. data/vendor/FreeImage/Source/ZLib/infback.c +640 -0
  846. data/vendor/FreeImage/Source/ZLib/inffast.c +340 -0
  847. data/vendor/FreeImage/Source/ZLib/inffast.h +11 -0
  848. data/vendor/FreeImage/Source/ZLib/inffixed.h +94 -0
  849. data/vendor/FreeImage/Source/ZLib/inflate.c +1512 -0
  850. data/vendor/FreeImage/Source/ZLib/inflate.h +122 -0
  851. data/vendor/FreeImage/Source/ZLib/inftrees.c +306 -0
  852. data/vendor/FreeImage/Source/ZLib/inftrees.h +62 -0
  853. data/vendor/FreeImage/Source/ZLib/trees.c +1226 -0
  854. data/vendor/FreeImage/Source/ZLib/trees.h +128 -0
  855. data/vendor/FreeImage/Source/ZLib/uncompr.c +59 -0
  856. data/vendor/FreeImage/Source/ZLib/zconf.h +511 -0
  857. data/vendor/FreeImage/Source/ZLib/zlib.h +1768 -0
  858. data/vendor/FreeImage/Source/ZLib/zutil.c +324 -0
  859. data/vendor/FreeImage/Source/ZLib/zutil.h +253 -0
  860. metadata +931 -0
@@ -0,0 +1,4121 @@
1
+
2
+ /* pngread.c - read a PNG file
3
+ *
4
+ * Last changed in libpng 1.6.15 [November 20, 2014]
5
+ * Copyright (c) 1998-2014 Glenn Randers-Pehrson
6
+ * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
7
+ * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
8
+ *
9
+ * This code is released under the libpng license.
10
+ * For conditions of distribution and use, see the disclaimer
11
+ * and license in png.h
12
+ *
13
+ * This file contains routines that an application calls directly to
14
+ * read a PNG file or stream.
15
+ */
16
+
17
+ #include "pngpriv.h"
18
+ #if defined(PNG_SIMPLIFIED_READ_SUPPORTED) && defined(PNG_STDIO_SUPPORTED)
19
+ # include <errno.h>
20
+ #endif
21
+
22
+ #ifdef PNG_READ_SUPPORTED
23
+
24
+ /* Create a PNG structure for reading, and allocate any memory needed. */
25
+ PNG_FUNCTION(png_structp,PNGAPI
26
+ png_create_read_struct,(png_const_charp user_png_ver, png_voidp error_ptr,
27
+ png_error_ptr error_fn, png_error_ptr warn_fn),PNG_ALLOCATED)
28
+ {
29
+ #ifndef PNG_USER_MEM_SUPPORTED
30
+ png_structp png_ptr = png_create_png_struct(user_png_ver, error_ptr,
31
+ error_fn, warn_fn, NULL, NULL, NULL);
32
+ #else
33
+ return png_create_read_struct_2(user_png_ver, error_ptr, error_fn,
34
+ warn_fn, NULL, NULL, NULL);
35
+ }
36
+
37
+ /* Alternate create PNG structure for reading, and allocate any memory
38
+ * needed.
39
+ */
40
+ PNG_FUNCTION(png_structp,PNGAPI
41
+ png_create_read_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr,
42
+ png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,
43
+ png_malloc_ptr malloc_fn, png_free_ptr free_fn),PNG_ALLOCATED)
44
+ {
45
+ png_structp png_ptr = png_create_png_struct(user_png_ver, error_ptr,
46
+ error_fn, warn_fn, mem_ptr, malloc_fn, free_fn);
47
+ #endif /* USER_MEM */
48
+
49
+ if (png_ptr != NULL)
50
+ {
51
+ png_ptr->mode = PNG_IS_READ_STRUCT;
52
+
53
+ /* Added in libpng-1.6.0; this can be used to detect a read structure if
54
+ * required (it will be zero in a write structure.)
55
+ */
56
+ # ifdef PNG_SEQUENTIAL_READ_SUPPORTED
57
+ png_ptr->IDAT_read_size = PNG_IDAT_READ_SIZE;
58
+ # endif
59
+
60
+ # ifdef PNG_BENIGN_READ_ERRORS_SUPPORTED
61
+ png_ptr->flags |= PNG_FLAG_BENIGN_ERRORS_WARN;
62
+
63
+ /* In stable builds only warn if an application error can be completely
64
+ * handled.
65
+ */
66
+ # if PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC
67
+ png_ptr->flags |= PNG_FLAG_APP_WARNINGS_WARN;
68
+ # endif
69
+ # endif
70
+
71
+ /* TODO: delay this, it can be done in png_init_io (if the app doesn't
72
+ * do it itself) avoiding setting the default function if it is not
73
+ * required.
74
+ */
75
+ png_set_read_fn(png_ptr, NULL, NULL);
76
+ }
77
+
78
+ return png_ptr;
79
+ }
80
+
81
+
82
+ #ifdef PNG_SEQUENTIAL_READ_SUPPORTED
83
+ /* Read the information before the actual image data. This has been
84
+ * changed in v0.90 to allow reading a file that already has the magic
85
+ * bytes read from the stream. You can tell libpng how many bytes have
86
+ * been read from the beginning of the stream (up to the maximum of 8)
87
+ * via png_set_sig_bytes(), and we will only check the remaining bytes
88
+ * here. The application can then have access to the signature bytes we
89
+ * read if it is determined that this isn't a valid PNG file.
90
+ */
91
+ void PNGAPI
92
+ png_read_info(png_structrp png_ptr, png_inforp info_ptr)
93
+ {
94
+ #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
95
+ int keep;
96
+ #endif
97
+
98
+ png_debug(1, "in png_read_info");
99
+
100
+ if (png_ptr == NULL || info_ptr == NULL)
101
+ return;
102
+
103
+ /* Read and check the PNG file signature. */
104
+ png_read_sig(png_ptr, info_ptr);
105
+
106
+ for (;;)
107
+ {
108
+ png_uint_32 length = png_read_chunk_header(png_ptr);
109
+ png_uint_32 chunk_name = png_ptr->chunk_name;
110
+
111
+ /* IDAT logic needs to happen here to simplify getting the two flags
112
+ * right.
113
+ */
114
+ if (chunk_name == png_IDAT)
115
+ {
116
+ if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
117
+ png_chunk_error(png_ptr, "Missing IHDR before IDAT");
118
+
119
+ else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
120
+ (png_ptr->mode & PNG_HAVE_PLTE) == 0)
121
+ png_chunk_error(png_ptr, "Missing PLTE before IDAT");
122
+
123
+ else if ((png_ptr->mode & PNG_AFTER_IDAT) != 0)
124
+ png_chunk_benign_error(png_ptr, "Too many IDATs found");
125
+
126
+ png_ptr->mode |= PNG_HAVE_IDAT;
127
+ }
128
+
129
+ else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
130
+ png_ptr->mode |= PNG_AFTER_IDAT;
131
+
132
+ /* This should be a binary subdivision search or a hash for
133
+ * matching the chunk name rather than a linear search.
134
+ */
135
+ if (chunk_name == png_IHDR)
136
+ png_handle_IHDR(png_ptr, info_ptr, length);
137
+
138
+ else if (chunk_name == png_IEND)
139
+ png_handle_IEND(png_ptr, info_ptr, length);
140
+
141
+ #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
142
+ else if ((keep = png_chunk_unknown_handling(png_ptr, chunk_name)) != 0)
143
+ {
144
+ png_handle_unknown(png_ptr, info_ptr, length, keep);
145
+
146
+ if (chunk_name == png_PLTE)
147
+ png_ptr->mode |= PNG_HAVE_PLTE;
148
+
149
+ else if (chunk_name == png_IDAT)
150
+ {
151
+ png_ptr->idat_size = 0; /* It has been consumed */
152
+ break;
153
+ }
154
+ }
155
+ #endif
156
+ else if (chunk_name == png_PLTE)
157
+ png_handle_PLTE(png_ptr, info_ptr, length);
158
+
159
+ else if (chunk_name == png_IDAT)
160
+ {
161
+ png_ptr->idat_size = length;
162
+ break;
163
+ }
164
+
165
+ #ifdef PNG_READ_bKGD_SUPPORTED
166
+ else if (chunk_name == png_bKGD)
167
+ png_handle_bKGD(png_ptr, info_ptr, length);
168
+ #endif
169
+
170
+ #ifdef PNG_READ_cHRM_SUPPORTED
171
+ else if (chunk_name == png_cHRM)
172
+ png_handle_cHRM(png_ptr, info_ptr, length);
173
+ #endif
174
+
175
+ #ifdef PNG_READ_gAMA_SUPPORTED
176
+ else if (chunk_name == png_gAMA)
177
+ png_handle_gAMA(png_ptr, info_ptr, length);
178
+ #endif
179
+
180
+ #ifdef PNG_READ_hIST_SUPPORTED
181
+ else if (chunk_name == png_hIST)
182
+ png_handle_hIST(png_ptr, info_ptr, length);
183
+ #endif
184
+
185
+ #ifdef PNG_READ_oFFs_SUPPORTED
186
+ else if (chunk_name == png_oFFs)
187
+ png_handle_oFFs(png_ptr, info_ptr, length);
188
+ #endif
189
+
190
+ #ifdef PNG_READ_pCAL_SUPPORTED
191
+ else if (chunk_name == png_pCAL)
192
+ png_handle_pCAL(png_ptr, info_ptr, length);
193
+ #endif
194
+
195
+ #ifdef PNG_READ_sCAL_SUPPORTED
196
+ else if (chunk_name == png_sCAL)
197
+ png_handle_sCAL(png_ptr, info_ptr, length);
198
+ #endif
199
+
200
+ #ifdef PNG_READ_pHYs_SUPPORTED
201
+ else if (chunk_name == png_pHYs)
202
+ png_handle_pHYs(png_ptr, info_ptr, length);
203
+ #endif
204
+
205
+ #ifdef PNG_READ_sBIT_SUPPORTED
206
+ else if (chunk_name == png_sBIT)
207
+ png_handle_sBIT(png_ptr, info_ptr, length);
208
+ #endif
209
+
210
+ #ifdef PNG_READ_sRGB_SUPPORTED
211
+ else if (chunk_name == png_sRGB)
212
+ png_handle_sRGB(png_ptr, info_ptr, length);
213
+ #endif
214
+
215
+ #ifdef PNG_READ_iCCP_SUPPORTED
216
+ else if (chunk_name == png_iCCP)
217
+ png_handle_iCCP(png_ptr, info_ptr, length);
218
+ #endif
219
+
220
+ #ifdef PNG_READ_sPLT_SUPPORTED
221
+ else if (chunk_name == png_sPLT)
222
+ png_handle_sPLT(png_ptr, info_ptr, length);
223
+ #endif
224
+
225
+ #ifdef PNG_READ_tEXt_SUPPORTED
226
+ else if (chunk_name == png_tEXt)
227
+ png_handle_tEXt(png_ptr, info_ptr, length);
228
+ #endif
229
+
230
+ #ifdef PNG_READ_tIME_SUPPORTED
231
+ else if (chunk_name == png_tIME)
232
+ png_handle_tIME(png_ptr, info_ptr, length);
233
+ #endif
234
+
235
+ #ifdef PNG_READ_tRNS_SUPPORTED
236
+ else if (chunk_name == png_tRNS)
237
+ png_handle_tRNS(png_ptr, info_ptr, length);
238
+ #endif
239
+
240
+ #ifdef PNG_READ_zTXt_SUPPORTED
241
+ else if (chunk_name == png_zTXt)
242
+ png_handle_zTXt(png_ptr, info_ptr, length);
243
+ #endif
244
+
245
+ #ifdef PNG_READ_iTXt_SUPPORTED
246
+ else if (chunk_name == png_iTXt)
247
+ png_handle_iTXt(png_ptr, info_ptr, length);
248
+ #endif
249
+
250
+ else
251
+ png_handle_unknown(png_ptr, info_ptr, length,
252
+ PNG_HANDLE_CHUNK_AS_DEFAULT);
253
+ }
254
+ }
255
+ #endif /* SEQUENTIAL_READ */
256
+
257
+ /* Optional call to update the users info_ptr structure */
258
+ void PNGAPI
259
+ png_read_update_info(png_structrp png_ptr, png_inforp info_ptr)
260
+ {
261
+ png_debug(1, "in png_read_update_info");
262
+
263
+ if (png_ptr != NULL)
264
+ {
265
+ if ((png_ptr->flags & PNG_FLAG_ROW_INIT) == 0)
266
+ {
267
+ png_read_start_row(png_ptr);
268
+
269
+ # ifdef PNG_READ_TRANSFORMS_SUPPORTED
270
+ png_read_transform_info(png_ptr, info_ptr);
271
+ # else
272
+ PNG_UNUSED(info_ptr)
273
+ # endif
274
+ }
275
+
276
+ /* New in 1.6.0 this avoids the bug of doing the initializations twice */
277
+ else
278
+ png_app_error(png_ptr,
279
+ "png_read_update_info/png_start_read_image: duplicate call");
280
+ }
281
+ }
282
+
283
+ #ifdef PNG_SEQUENTIAL_READ_SUPPORTED
284
+ /* Initialize palette, background, etc, after transformations
285
+ * are set, but before any reading takes place. This allows
286
+ * the user to obtain a gamma-corrected palette, for example.
287
+ * If the user doesn't call this, we will do it ourselves.
288
+ */
289
+ void PNGAPI
290
+ png_start_read_image(png_structrp png_ptr)
291
+ {
292
+ png_debug(1, "in png_start_read_image");
293
+
294
+ if (png_ptr != NULL)
295
+ {
296
+ if ((png_ptr->flags & PNG_FLAG_ROW_INIT) == 0)
297
+ png_read_start_row(png_ptr);
298
+
299
+ /* New in 1.6.0 this avoids the bug of doing the initializations twice */
300
+ else
301
+ png_app_error(png_ptr,
302
+ "png_start_read_image/png_read_update_info: duplicate call");
303
+ }
304
+ }
305
+ #endif /* SEQUENTIAL_READ */
306
+
307
+ #ifdef PNG_SEQUENTIAL_READ_SUPPORTED
308
+ #ifdef PNG_MNG_FEATURES_SUPPORTED
309
+ /* Undoes intrapixel differencing,
310
+ * NOTE: this is apparently only supported in the 'sequential' reader.
311
+ */
312
+ static void
313
+ png_do_read_intrapixel(png_row_infop row_info, png_bytep row)
314
+ {
315
+ png_debug(1, "in png_do_read_intrapixel");
316
+
317
+ if (
318
+ (row_info->color_type & PNG_COLOR_MASK_COLOR) != 0)
319
+ {
320
+ int bytes_per_pixel;
321
+ png_uint_32 row_width = row_info->width;
322
+
323
+ if (row_info->bit_depth == 8)
324
+ {
325
+ png_bytep rp;
326
+ png_uint_32 i;
327
+
328
+ if (row_info->color_type == PNG_COLOR_TYPE_RGB)
329
+ bytes_per_pixel = 3;
330
+
331
+ else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
332
+ bytes_per_pixel = 4;
333
+
334
+ else
335
+ return;
336
+
337
+ for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
338
+ {
339
+ *(rp) = (png_byte)((256 + *rp + *(rp + 1)) & 0xff);
340
+ *(rp+2) = (png_byte)((256 + *(rp + 2) + *(rp + 1)) & 0xff);
341
+ }
342
+ }
343
+ else if (row_info->bit_depth == 16)
344
+ {
345
+ png_bytep rp;
346
+ png_uint_32 i;
347
+
348
+ if (row_info->color_type == PNG_COLOR_TYPE_RGB)
349
+ bytes_per_pixel = 6;
350
+
351
+ else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
352
+ bytes_per_pixel = 8;
353
+
354
+ else
355
+ return;
356
+
357
+ for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
358
+ {
359
+ png_uint_32 s0 = (*(rp ) << 8) | *(rp + 1);
360
+ png_uint_32 s1 = (*(rp + 2) << 8) | *(rp + 3);
361
+ png_uint_32 s2 = (*(rp + 4) << 8) | *(rp + 5);
362
+ png_uint_32 red = (s0 + s1 + 65536) & 0xffff;
363
+ png_uint_32 blue = (s2 + s1 + 65536) & 0xffff;
364
+ *(rp ) = (png_byte)((red >> 8) & 0xff);
365
+ *(rp + 1) = (png_byte)(red & 0xff);
366
+ *(rp + 4) = (png_byte)((blue >> 8) & 0xff);
367
+ *(rp + 5) = (png_byte)(blue & 0xff);
368
+ }
369
+ }
370
+ }
371
+ }
372
+ #endif /* MNG_FEATURES */
373
+
374
+ void PNGAPI
375
+ png_read_row(png_structrp png_ptr, png_bytep row, png_bytep dsp_row)
376
+ {
377
+ png_row_info row_info;
378
+
379
+ if (png_ptr == NULL)
380
+ return;
381
+
382
+ png_debug2(1, "in png_read_row (row %lu, pass %d)",
383
+ (unsigned long)png_ptr->row_number, png_ptr->pass);
384
+
385
+ /* png_read_start_row sets the information (in particular iwidth) for this
386
+ * interlace pass.
387
+ */
388
+ if ((png_ptr->flags & PNG_FLAG_ROW_INIT) == 0)
389
+ png_read_start_row(png_ptr);
390
+
391
+ /* 1.5.6: row_info moved out of png_struct to a local here. */
392
+ row_info.width = png_ptr->iwidth; /* NOTE: width of current interlaced row */
393
+ row_info.color_type = png_ptr->color_type;
394
+ row_info.bit_depth = png_ptr->bit_depth;
395
+ row_info.channels = png_ptr->channels;
396
+ row_info.pixel_depth = png_ptr->pixel_depth;
397
+ row_info.rowbytes = PNG_ROWBYTES(row_info.pixel_depth, row_info.width);
398
+
399
+ #ifdef PNG_WARNINGS_SUPPORTED
400
+ if (png_ptr->row_number == 0 && png_ptr->pass == 0)
401
+ {
402
+ /* Check for transforms that have been set but were defined out */
403
+ #if defined(PNG_WRITE_INVERT_SUPPORTED) && !defined(PNG_READ_INVERT_SUPPORTED)
404
+ if ((png_ptr->transformations & PNG_INVERT_MONO) != 0)
405
+ png_warning(png_ptr, "PNG_READ_INVERT_SUPPORTED is not defined");
406
+ #endif
407
+
408
+ #if defined(PNG_WRITE_FILLER_SUPPORTED) && !defined(PNG_READ_FILLER_SUPPORTED)
409
+ if ((png_ptr->transformations & PNG_FILLER) != 0)
410
+ png_warning(png_ptr, "PNG_READ_FILLER_SUPPORTED is not defined");
411
+ #endif
412
+
413
+ #if defined(PNG_WRITE_PACKSWAP_SUPPORTED) && \
414
+ !defined(PNG_READ_PACKSWAP_SUPPORTED)
415
+ if ((png_ptr->transformations & PNG_PACKSWAP) != 0)
416
+ png_warning(png_ptr, "PNG_READ_PACKSWAP_SUPPORTED is not defined");
417
+ #endif
418
+
419
+ #if defined(PNG_WRITE_PACK_SUPPORTED) && !defined(PNG_READ_PACK_SUPPORTED)
420
+ if ((png_ptr->transformations & PNG_PACK) != 0)
421
+ png_warning(png_ptr, "PNG_READ_PACK_SUPPORTED is not defined");
422
+ #endif
423
+
424
+ #if defined(PNG_WRITE_SHIFT_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED)
425
+ if ((png_ptr->transformations & PNG_SHIFT) != 0)
426
+ png_warning(png_ptr, "PNG_READ_SHIFT_SUPPORTED is not defined");
427
+ #endif
428
+
429
+ #if defined(PNG_WRITE_BGR_SUPPORTED) && !defined(PNG_READ_BGR_SUPPORTED)
430
+ if ((png_ptr->transformations & PNG_BGR) != 0)
431
+ png_warning(png_ptr, "PNG_READ_BGR_SUPPORTED is not defined");
432
+ #endif
433
+
434
+ #if defined(PNG_WRITE_SWAP_SUPPORTED) && !defined(PNG_READ_SWAP_SUPPORTED)
435
+ if ((png_ptr->transformations & PNG_SWAP_BYTES) != 0)
436
+ png_warning(png_ptr, "PNG_READ_SWAP_SUPPORTED is not defined");
437
+ #endif
438
+ }
439
+ #endif /* WARNINGS */
440
+
441
+ #ifdef PNG_READ_INTERLACING_SUPPORTED
442
+ /* If interlaced and we do not need a new row, combine row and return.
443
+ * Notice that the pixels we have from previous rows have been transformed
444
+ * already; we can only combine like with like (transformed or
445
+ * untransformed) and, because of the libpng API for interlaced images, this
446
+ * means we must transform before de-interlacing.
447
+ */
448
+ if (png_ptr->interlaced != 0 &&
449
+ (png_ptr->transformations & PNG_INTERLACE) != 0)
450
+ {
451
+ switch (png_ptr->pass)
452
+ {
453
+ case 0:
454
+ if (png_ptr->row_number & 0x07)
455
+ {
456
+ if (dsp_row != NULL)
457
+ png_combine_row(png_ptr, dsp_row, 1/*display*/);
458
+ png_read_finish_row(png_ptr);
459
+ return;
460
+ }
461
+ break;
462
+
463
+ case 1:
464
+ if ((png_ptr->row_number & 0x07) || png_ptr->width < 5)
465
+ {
466
+ if (dsp_row != NULL)
467
+ png_combine_row(png_ptr, dsp_row, 1/*display*/);
468
+
469
+ png_read_finish_row(png_ptr);
470
+ return;
471
+ }
472
+ break;
473
+
474
+ case 2:
475
+ if ((png_ptr->row_number & 0x07) != 4)
476
+ {
477
+ if (dsp_row != NULL && (png_ptr->row_number & 4))
478
+ png_combine_row(png_ptr, dsp_row, 1/*display*/);
479
+
480
+ png_read_finish_row(png_ptr);
481
+ return;
482
+ }
483
+ break;
484
+
485
+ case 3:
486
+ if ((png_ptr->row_number & 3) || png_ptr->width < 3)
487
+ {
488
+ if (dsp_row != NULL)
489
+ png_combine_row(png_ptr, dsp_row, 1/*display*/);
490
+
491
+ png_read_finish_row(png_ptr);
492
+ return;
493
+ }
494
+ break;
495
+
496
+ case 4:
497
+ if ((png_ptr->row_number & 3) != 2)
498
+ {
499
+ if (dsp_row != NULL && (png_ptr->row_number & 2))
500
+ png_combine_row(png_ptr, dsp_row, 1/*display*/);
501
+
502
+ png_read_finish_row(png_ptr);
503
+ return;
504
+ }
505
+ break;
506
+
507
+ case 5:
508
+ if ((png_ptr->row_number & 1) || png_ptr->width < 2)
509
+ {
510
+ if (dsp_row != NULL)
511
+ png_combine_row(png_ptr, dsp_row, 1/*display*/);
512
+
513
+ png_read_finish_row(png_ptr);
514
+ return;
515
+ }
516
+ break;
517
+
518
+ default:
519
+ case 6:
520
+ if ((png_ptr->row_number & 1) == 0)
521
+ {
522
+ png_read_finish_row(png_ptr);
523
+ return;
524
+ }
525
+ break;
526
+ }
527
+ }
528
+ #endif
529
+
530
+ if ((png_ptr->mode & PNG_HAVE_IDAT) == 0)
531
+ png_error(png_ptr, "Invalid attempt to read row data");
532
+
533
+ /* Fill the row with IDAT data: */
534
+ png_read_IDAT_data(png_ptr, png_ptr->row_buf, row_info.rowbytes + 1);
535
+
536
+ if (png_ptr->row_buf[0] > PNG_FILTER_VALUE_NONE)
537
+ {
538
+ if (png_ptr->row_buf[0] < PNG_FILTER_VALUE_LAST)
539
+ png_read_filter_row(png_ptr, &row_info, png_ptr->row_buf + 1,
540
+ png_ptr->prev_row + 1, png_ptr->row_buf[0]);
541
+ else
542
+ png_error(png_ptr, "bad adaptive filter value");
543
+ }
544
+
545
+ /* libpng 1.5.6: the following line was copying png_ptr->rowbytes before
546
+ * 1.5.6, while the buffer really is this big in current versions of libpng
547
+ * it may not be in the future, so this was changed just to copy the
548
+ * interlaced count:
549
+ */
550
+ memcpy(png_ptr->prev_row, png_ptr->row_buf, row_info.rowbytes + 1);
551
+
552
+ #ifdef PNG_MNG_FEATURES_SUPPORTED
553
+ if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) != 0 &&
554
+ (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING))
555
+ {
556
+ /* Intrapixel differencing */
557
+ png_do_read_intrapixel(&row_info, png_ptr->row_buf + 1);
558
+ }
559
+ #endif
560
+
561
+ #ifdef PNG_READ_TRANSFORMS_SUPPORTED
562
+ if (png_ptr->transformations)
563
+ png_do_read_transformations(png_ptr, &row_info);
564
+ #endif
565
+
566
+ /* The transformed pixel depth should match the depth now in row_info. */
567
+ if (png_ptr->transformed_pixel_depth == 0)
568
+ {
569
+ png_ptr->transformed_pixel_depth = row_info.pixel_depth;
570
+ if (row_info.pixel_depth > png_ptr->maximum_pixel_depth)
571
+ png_error(png_ptr, "sequential row overflow");
572
+ }
573
+
574
+ else if (png_ptr->transformed_pixel_depth != row_info.pixel_depth)
575
+ png_error(png_ptr, "internal sequential row size calculation error");
576
+
577
+ #ifdef PNG_READ_INTERLACING_SUPPORTED
578
+ /* Expand interlaced rows to full size */
579
+ if (png_ptr->interlaced != 0 &&
580
+ (png_ptr->transformations & PNG_INTERLACE) != 0)
581
+ {
582
+ if (png_ptr->pass < 6)
583
+ png_do_read_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass,
584
+ png_ptr->transformations);
585
+
586
+ if (dsp_row != NULL)
587
+ png_combine_row(png_ptr, dsp_row, 1/*display*/);
588
+
589
+ if (row != NULL)
590
+ png_combine_row(png_ptr, row, 0/*row*/);
591
+ }
592
+
593
+ else
594
+ #endif
595
+ {
596
+ if (row != NULL)
597
+ png_combine_row(png_ptr, row, -1/*ignored*/);
598
+
599
+ if (dsp_row != NULL)
600
+ png_combine_row(png_ptr, dsp_row, -1/*ignored*/);
601
+ }
602
+ png_read_finish_row(png_ptr);
603
+
604
+ if (png_ptr->read_row_fn != NULL)
605
+ (*(png_ptr->read_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass);
606
+
607
+ }
608
+ #endif /* SEQUENTIAL_READ */
609
+
610
+ #ifdef PNG_SEQUENTIAL_READ_SUPPORTED
611
+ /* Read one or more rows of image data. If the image is interlaced,
612
+ * and png_set_interlace_handling() has been called, the rows need to
613
+ * contain the contents of the rows from the previous pass. If the
614
+ * image has alpha or transparency, and png_handle_alpha()[*] has been
615
+ * called, the rows contents must be initialized to the contents of the
616
+ * screen.
617
+ *
618
+ * "row" holds the actual image, and pixels are placed in it
619
+ * as they arrive. If the image is displayed after each pass, it will
620
+ * appear to "sparkle" in. "display_row" can be used to display a
621
+ * "chunky" progressive image, with finer detail added as it becomes
622
+ * available. If you do not want this "chunky" display, you may pass
623
+ * NULL for display_row. If you do not want the sparkle display, and
624
+ * you have not called png_handle_alpha(), you may pass NULL for rows.
625
+ * If you have called png_handle_alpha(), and the image has either an
626
+ * alpha channel or a transparency chunk, you must provide a buffer for
627
+ * rows. In this case, you do not have to provide a display_row buffer
628
+ * also, but you may. If the image is not interlaced, or if you have
629
+ * not called png_set_interlace_handling(), the display_row buffer will
630
+ * be ignored, so pass NULL to it.
631
+ *
632
+ * [*] png_handle_alpha() does not exist yet, as of this version of libpng
633
+ */
634
+
635
+ void PNGAPI
636
+ png_read_rows(png_structrp png_ptr, png_bytepp row,
637
+ png_bytepp display_row, png_uint_32 num_rows)
638
+ {
639
+ png_uint_32 i;
640
+ png_bytepp rp;
641
+ png_bytepp dp;
642
+
643
+ png_debug(1, "in png_read_rows");
644
+
645
+ if (png_ptr == NULL)
646
+ return;
647
+
648
+ rp = row;
649
+ dp = display_row;
650
+ if (rp != NULL && dp != NULL)
651
+ for (i = 0; i < num_rows; i++)
652
+ {
653
+ png_bytep rptr = *rp++;
654
+ png_bytep dptr = *dp++;
655
+
656
+ png_read_row(png_ptr, rptr, dptr);
657
+ }
658
+
659
+ else if (rp != NULL)
660
+ for (i = 0; i < num_rows; i++)
661
+ {
662
+ png_bytep rptr = *rp;
663
+ png_read_row(png_ptr, rptr, NULL);
664
+ rp++;
665
+ }
666
+
667
+ else if (dp != NULL)
668
+ for (i = 0; i < num_rows; i++)
669
+ {
670
+ png_bytep dptr = *dp;
671
+ png_read_row(png_ptr, NULL, dptr);
672
+ dp++;
673
+ }
674
+ }
675
+ #endif /* SEQUENTIAL_READ */
676
+
677
+ #ifdef PNG_SEQUENTIAL_READ_SUPPORTED
678
+ /* Read the entire image. If the image has an alpha channel or a tRNS
679
+ * chunk, and you have called png_handle_alpha()[*], you will need to
680
+ * initialize the image to the current image that PNG will be overlaying.
681
+ * We set the num_rows again here, in case it was incorrectly set in
682
+ * png_read_start_row() by a call to png_read_update_info() or
683
+ * png_start_read_image() if png_set_interlace_handling() wasn't called
684
+ * prior to either of these functions like it should have been. You can
685
+ * only call this function once. If you desire to have an image for
686
+ * each pass of a interlaced image, use png_read_rows() instead.
687
+ *
688
+ * [*] png_handle_alpha() does not exist yet, as of this version of libpng
689
+ */
690
+ void PNGAPI
691
+ png_read_image(png_structrp png_ptr, png_bytepp image)
692
+ {
693
+ png_uint_32 i, image_height;
694
+ int pass, j;
695
+ png_bytepp rp;
696
+
697
+ png_debug(1, "in png_read_image");
698
+
699
+ if (png_ptr == NULL)
700
+ return;
701
+
702
+ #ifdef PNG_READ_INTERLACING_SUPPORTED
703
+ if ((png_ptr->flags & PNG_FLAG_ROW_INIT) == 0)
704
+ {
705
+ pass = png_set_interlace_handling(png_ptr);
706
+ /* And make sure transforms are initialized. */
707
+ png_start_read_image(png_ptr);
708
+ }
709
+ else
710
+ {
711
+ if (png_ptr->interlaced != 0 &&
712
+ (png_ptr->transformations & PNG_INTERLACE) == 0)
713
+ {
714
+ /* Caller called png_start_read_image or png_read_update_info without
715
+ * first turning on the PNG_INTERLACE transform. We can fix this here,
716
+ * but the caller should do it!
717
+ */
718
+ png_warning(png_ptr, "Interlace handling should be turned on when "
719
+ "using png_read_image");
720
+ /* Make sure this is set correctly */
721
+ png_ptr->num_rows = png_ptr->height;
722
+ }
723
+
724
+ /* Obtain the pass number, which also turns on the PNG_INTERLACE flag in
725
+ * the above error case.
726
+ */
727
+ pass = png_set_interlace_handling(png_ptr);
728
+ }
729
+ #else
730
+ if (png_ptr->interlaced)
731
+ png_error(png_ptr,
732
+ "Cannot read interlaced image -- interlace handler disabled");
733
+
734
+ pass = 1;
735
+ #endif
736
+
737
+ image_height=png_ptr->height;
738
+
739
+ for (j = 0; j < pass; j++)
740
+ {
741
+ rp = image;
742
+ for (i = 0; i < image_height; i++)
743
+ {
744
+ png_read_row(png_ptr, *rp, NULL);
745
+ rp++;
746
+ }
747
+ }
748
+ }
749
+ #endif /* SEQUENTIAL_READ */
750
+
751
+ #ifdef PNG_SEQUENTIAL_READ_SUPPORTED
752
+ /* Read the end of the PNG file. Will not read past the end of the
753
+ * file, will verify the end is accurate, and will read any comments
754
+ * or time information at the end of the file, if info is not NULL.
755
+ */
756
+ void PNGAPI
757
+ png_read_end(png_structrp png_ptr, png_inforp info_ptr)
758
+ {
759
+ #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
760
+ int keep;
761
+ #endif
762
+
763
+ png_debug(1, "in png_read_end");
764
+
765
+ if (png_ptr == NULL)
766
+ return;
767
+
768
+ /* If png_read_end is called in the middle of reading the rows there may
769
+ * still be pending IDAT data and an owned zstream. Deal with this here.
770
+ */
771
+ #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
772
+ if (png_chunk_unknown_handling(png_ptr, png_IDAT) == 0)
773
+ #endif
774
+ png_read_finish_IDAT(png_ptr);
775
+
776
+ #ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED
777
+ /* Report invalid palette index; added at libng-1.5.10 */
778
+ if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
779
+ png_ptr->num_palette_max > png_ptr->num_palette)
780
+ png_benign_error(png_ptr, "Read palette index exceeding num_palette");
781
+ #endif
782
+
783
+ do
784
+ {
785
+ png_uint_32 length = png_read_chunk_header(png_ptr);
786
+ png_uint_32 chunk_name = png_ptr->chunk_name;
787
+
788
+ if (chunk_name == png_IEND)
789
+ png_handle_IEND(png_ptr, info_ptr, length);
790
+
791
+ else if (chunk_name == png_IHDR)
792
+ png_handle_IHDR(png_ptr, info_ptr, length);
793
+
794
+ else if (info_ptr == NULL)
795
+ png_crc_finish(png_ptr, length);
796
+
797
+ #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
798
+ else if ((keep = png_chunk_unknown_handling(png_ptr, chunk_name)) != 0)
799
+ {
800
+ if (chunk_name == png_IDAT)
801
+ {
802
+ if ((length > 0) ||
803
+ (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)
804
+ png_benign_error(png_ptr, "Too many IDATs found");
805
+ }
806
+ png_handle_unknown(png_ptr, info_ptr, length, keep);
807
+ if (chunk_name == png_PLTE)
808
+ png_ptr->mode |= PNG_HAVE_PLTE;
809
+ }
810
+ #endif
811
+
812
+ else if (chunk_name == png_IDAT)
813
+ {
814
+ /* Zero length IDATs are legal after the last IDAT has been
815
+ * read, but not after other chunks have been read.
816
+ */
817
+ if ((length > 0) ||
818
+ (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)
819
+ png_benign_error(png_ptr, "Too many IDATs found");
820
+
821
+ png_crc_finish(png_ptr, length);
822
+ }
823
+ else if (chunk_name == png_PLTE)
824
+ png_handle_PLTE(png_ptr, info_ptr, length);
825
+
826
+ #ifdef PNG_READ_bKGD_SUPPORTED
827
+ else if (chunk_name == png_bKGD)
828
+ png_handle_bKGD(png_ptr, info_ptr, length);
829
+ #endif
830
+
831
+ #ifdef PNG_READ_cHRM_SUPPORTED
832
+ else if (chunk_name == png_cHRM)
833
+ png_handle_cHRM(png_ptr, info_ptr, length);
834
+ #endif
835
+
836
+ #ifdef PNG_READ_gAMA_SUPPORTED
837
+ else if (chunk_name == png_gAMA)
838
+ png_handle_gAMA(png_ptr, info_ptr, length);
839
+ #endif
840
+
841
+ #ifdef PNG_READ_hIST_SUPPORTED
842
+ else if (chunk_name == png_hIST)
843
+ png_handle_hIST(png_ptr, info_ptr, length);
844
+ #endif
845
+
846
+ #ifdef PNG_READ_oFFs_SUPPORTED
847
+ else if (chunk_name == png_oFFs)
848
+ png_handle_oFFs(png_ptr, info_ptr, length);
849
+ #endif
850
+
851
+ #ifdef PNG_READ_pCAL_SUPPORTED
852
+ else if (chunk_name == png_pCAL)
853
+ png_handle_pCAL(png_ptr, info_ptr, length);
854
+ #endif
855
+
856
+ #ifdef PNG_READ_sCAL_SUPPORTED
857
+ else if (chunk_name == png_sCAL)
858
+ png_handle_sCAL(png_ptr, info_ptr, length);
859
+ #endif
860
+
861
+ #ifdef PNG_READ_pHYs_SUPPORTED
862
+ else if (chunk_name == png_pHYs)
863
+ png_handle_pHYs(png_ptr, info_ptr, length);
864
+ #endif
865
+
866
+ #ifdef PNG_READ_sBIT_SUPPORTED
867
+ else if (chunk_name == png_sBIT)
868
+ png_handle_sBIT(png_ptr, info_ptr, length);
869
+ #endif
870
+
871
+ #ifdef PNG_READ_sRGB_SUPPORTED
872
+ else if (chunk_name == png_sRGB)
873
+ png_handle_sRGB(png_ptr, info_ptr, length);
874
+ #endif
875
+
876
+ #ifdef PNG_READ_iCCP_SUPPORTED
877
+ else if (chunk_name == png_iCCP)
878
+ png_handle_iCCP(png_ptr, info_ptr, length);
879
+ #endif
880
+
881
+ #ifdef PNG_READ_sPLT_SUPPORTED
882
+ else if (chunk_name == png_sPLT)
883
+ png_handle_sPLT(png_ptr, info_ptr, length);
884
+ #endif
885
+
886
+ #ifdef PNG_READ_tEXt_SUPPORTED
887
+ else if (chunk_name == png_tEXt)
888
+ png_handle_tEXt(png_ptr, info_ptr, length);
889
+ #endif
890
+
891
+ #ifdef PNG_READ_tIME_SUPPORTED
892
+ else if (chunk_name == png_tIME)
893
+ png_handle_tIME(png_ptr, info_ptr, length);
894
+ #endif
895
+
896
+ #ifdef PNG_READ_tRNS_SUPPORTED
897
+ else if (chunk_name == png_tRNS)
898
+ png_handle_tRNS(png_ptr, info_ptr, length);
899
+ #endif
900
+
901
+ #ifdef PNG_READ_zTXt_SUPPORTED
902
+ else if (chunk_name == png_zTXt)
903
+ png_handle_zTXt(png_ptr, info_ptr, length);
904
+ #endif
905
+
906
+ #ifdef PNG_READ_iTXt_SUPPORTED
907
+ else if (chunk_name == png_iTXt)
908
+ png_handle_iTXt(png_ptr, info_ptr, length);
909
+ #endif
910
+
911
+ else
912
+ png_handle_unknown(png_ptr, info_ptr, length,
913
+ PNG_HANDLE_CHUNK_AS_DEFAULT);
914
+ } while ((png_ptr->mode & PNG_HAVE_IEND) == 0);
915
+ }
916
+ #endif /* SEQUENTIAL_READ */
917
+
918
+ /* Free all memory used in the read struct */
919
+ static void
920
+ png_read_destroy(png_structrp png_ptr)
921
+ {
922
+ png_debug(1, "in png_read_destroy");
923
+
924
+ #ifdef PNG_READ_GAMMA_SUPPORTED
925
+ png_destroy_gamma_table(png_ptr);
926
+ #endif
927
+
928
+ png_free(png_ptr, png_ptr->big_row_buf);
929
+ png_ptr->big_row_buf = NULL;
930
+ png_free(png_ptr, png_ptr->big_prev_row);
931
+ png_ptr->big_prev_row = NULL;
932
+ png_free(png_ptr, png_ptr->read_buffer);
933
+ png_ptr->read_buffer = NULL;
934
+
935
+ #ifdef PNG_READ_QUANTIZE_SUPPORTED
936
+ png_free(png_ptr, png_ptr->palette_lookup);
937
+ png_ptr->palette_lookup = NULL;
938
+ png_free(png_ptr, png_ptr->quantize_index);
939
+ png_ptr->quantize_index = NULL;
940
+ #endif
941
+
942
+ if ((png_ptr->free_me & PNG_FREE_PLTE) != 0)
943
+ {
944
+ png_zfree(png_ptr, png_ptr->palette);
945
+ png_ptr->palette = NULL;
946
+ }
947
+ png_ptr->free_me &= ~PNG_FREE_PLTE;
948
+
949
+ #if defined(PNG_tRNS_SUPPORTED) || \
950
+ defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
951
+ if ((png_ptr->free_me & PNG_FREE_TRNS) != 0)
952
+ {
953
+ png_free(png_ptr, png_ptr->trans_alpha);
954
+ png_ptr->trans_alpha = NULL;
955
+ }
956
+ png_ptr->free_me &= ~PNG_FREE_TRNS;
957
+ #endif
958
+
959
+ inflateEnd(&png_ptr->zstream);
960
+
961
+ #ifdef PNG_PROGRESSIVE_READ_SUPPORTED
962
+ png_free(png_ptr, png_ptr->save_buffer);
963
+ png_ptr->save_buffer = NULL;
964
+ #endif
965
+
966
+ #if defined(PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED) && \
967
+ defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
968
+ png_free(png_ptr, png_ptr->unknown_chunk.data);
969
+ png_ptr->unknown_chunk.data = NULL;
970
+ #endif
971
+
972
+ #ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
973
+ png_free(png_ptr, png_ptr->chunk_list);
974
+ png_ptr->chunk_list = NULL;
975
+ #endif
976
+
977
+ /* NOTE: the 'setjmp' buffer may still be allocated and the memory and error
978
+ * callbacks are still set at this point. They are required to complete the
979
+ * destruction of the png_struct itself.
980
+ */
981
+ }
982
+
983
+ /* Free all memory used by the read */
984
+ void PNGAPI
985
+ png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr,
986
+ png_infopp end_info_ptr_ptr)
987
+ {
988
+ png_structrp png_ptr = NULL;
989
+
990
+ png_debug(1, "in png_destroy_read_struct");
991
+
992
+ if (png_ptr_ptr != NULL)
993
+ png_ptr = *png_ptr_ptr;
994
+
995
+ if (png_ptr == NULL)
996
+ return;
997
+
998
+ /* libpng 1.6.0: use the API to destroy info structs to ensure consistent
999
+ * behavior. Prior to 1.6.0 libpng did extra 'info' destruction in this API.
1000
+ * The extra was, apparently, unnecessary yet this hides memory leak bugs.
1001
+ */
1002
+ png_destroy_info_struct(png_ptr, end_info_ptr_ptr);
1003
+ png_destroy_info_struct(png_ptr, info_ptr_ptr);
1004
+
1005
+ *png_ptr_ptr = NULL;
1006
+ png_read_destroy(png_ptr);
1007
+ png_destroy_png_struct(png_ptr);
1008
+ }
1009
+
1010
+ void PNGAPI
1011
+ png_set_read_status_fn(png_structrp png_ptr, png_read_status_ptr read_row_fn)
1012
+ {
1013
+ if (png_ptr == NULL)
1014
+ return;
1015
+
1016
+ png_ptr->read_row_fn = read_row_fn;
1017
+ }
1018
+
1019
+
1020
+ #ifdef PNG_SEQUENTIAL_READ_SUPPORTED
1021
+ #ifdef PNG_INFO_IMAGE_SUPPORTED
1022
+ void PNGAPI
1023
+ png_read_png(png_structrp png_ptr, png_inforp info_ptr,
1024
+ int transforms,
1025
+ voidp params)
1026
+ {
1027
+ if (png_ptr == NULL || info_ptr == NULL)
1028
+ return;
1029
+
1030
+ /* png_read_info() gives us all of the information from the
1031
+ * PNG file before the first IDAT (image data chunk).
1032
+ */
1033
+ png_read_info(png_ptr, info_ptr);
1034
+ if (info_ptr->height > PNG_UINT_32_MAX/(sizeof (png_bytep)))
1035
+ png_error(png_ptr, "Image is too high to process with png_read_png()");
1036
+
1037
+ /* -------------- image transformations start here ------------------- */
1038
+ /* libpng 1.6.10: add code to cause a png_app_error if a selected TRANSFORM
1039
+ * is not implemented. This will only happen in de-configured (non-default)
1040
+ * libpng builds. The results can be unexpected - png_read_png may return
1041
+ * short or mal-formed rows because the transform is skipped.
1042
+ */
1043
+
1044
+ /* Tell libpng to strip 16-bit/color files down to 8 bits per color.
1045
+ */
1046
+ if ((transforms & PNG_TRANSFORM_SCALE_16) != 0)
1047
+ /* Added at libpng-1.5.4. "strip_16" produces the same result that it
1048
+ * did in earlier versions, while "scale_16" is now more accurate.
1049
+ */
1050
+ #ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
1051
+ png_set_scale_16(png_ptr);
1052
+ #else
1053
+ png_app_error(png_ptr, "PNG_TRANSFORM_SCALE_16 not supported");
1054
+ #endif
1055
+
1056
+ /* If both SCALE and STRIP are required pngrtran will effectively cancel the
1057
+ * latter by doing SCALE first. This is ok and allows apps not to check for
1058
+ * which is supported to get the right answer.
1059
+ */
1060
+ if ((transforms & PNG_TRANSFORM_STRIP_16) != 0)
1061
+ #ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
1062
+ png_set_strip_16(png_ptr);
1063
+ #else
1064
+ png_app_error(png_ptr, "PNG_TRANSFORM_STRIP_16 not supported");
1065
+ #endif
1066
+
1067
+ /* Strip alpha bytes from the input data without combining with
1068
+ * the background (not recommended).
1069
+ */
1070
+ if ((transforms & PNG_TRANSFORM_STRIP_ALPHA) != 0)
1071
+ #ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
1072
+ png_set_strip_alpha(png_ptr);
1073
+ #else
1074
+ png_app_error(png_ptr, "PNG_TRANSFORM_STRIP_ALPHA not supported");
1075
+ #endif
1076
+
1077
+ /* Extract multiple pixels with bit depths of 1, 2, or 4 from a single
1078
+ * byte into separate bytes (useful for paletted and grayscale images).
1079
+ */
1080
+ if ((transforms & PNG_TRANSFORM_PACKING) != 0)
1081
+ #ifdef PNG_READ_PACK_SUPPORTED
1082
+ png_set_packing(png_ptr);
1083
+ #else
1084
+ png_app_error(png_ptr, "PNG_TRANSFORM_PACKING not supported");
1085
+ #endif
1086
+
1087
+ /* Change the order of packed pixels to least significant bit first
1088
+ * (not useful if you are using png_set_packing).
1089
+ */
1090
+ if ((transforms & PNG_TRANSFORM_PACKSWAP) != 0)
1091
+ #ifdef PNG_READ_PACKSWAP_SUPPORTED
1092
+ png_set_packswap(png_ptr);
1093
+ #else
1094
+ png_app_error(png_ptr, "PNG_TRANSFORM_PACKSWAP not supported");
1095
+ #endif
1096
+
1097
+ /* Expand paletted colors into true RGB triplets
1098
+ * Expand grayscale images to full 8 bits from 1, 2, or 4 bits/pixel
1099
+ * Expand paletted or RGB images with transparency to full alpha
1100
+ * channels so the data will be available as RGBA quartets.
1101
+ */
1102
+ if ((transforms & PNG_TRANSFORM_EXPAND) != 0)
1103
+ #ifdef PNG_READ_EXPAND_SUPPORTED
1104
+ png_set_expand(png_ptr);
1105
+ #else
1106
+ png_app_error(png_ptr, "PNG_TRANSFORM_EXPAND not supported");
1107
+ #endif
1108
+
1109
+ /* We don't handle background color or gamma transformation or quantizing.
1110
+ */
1111
+
1112
+ /* Invert monochrome files to have 0 as white and 1 as black
1113
+ */
1114
+ if ((transforms & PNG_TRANSFORM_INVERT_MONO) != 0)
1115
+ #ifdef PNG_READ_INVERT_SUPPORTED
1116
+ png_set_invert_mono(png_ptr);
1117
+ #else
1118
+ png_app_error(png_ptr, "PNG_TRANSFORM_INVERT_MONO not supported");
1119
+ #endif
1120
+
1121
+ /* If you want to shift the pixel values from the range [0,255] or
1122
+ * [0,65535] to the original [0,7] or [0,31], or whatever range the
1123
+ * colors were originally in:
1124
+ */
1125
+ if ((transforms & PNG_TRANSFORM_SHIFT) != 0)
1126
+ #ifdef PNG_READ_SHIFT_SUPPORTED
1127
+ if ((info_ptr->valid & PNG_INFO_sBIT) != 0)
1128
+ png_set_shift(png_ptr, &info_ptr->sig_bit);
1129
+ #else
1130
+ png_app_error(png_ptr, "PNG_TRANSFORM_SHIFT not supported");
1131
+ #endif
1132
+
1133
+ /* Flip the RGB pixels to BGR (or RGBA to BGRA) */
1134
+ if ((transforms & PNG_TRANSFORM_BGR) != 0)
1135
+ #ifdef PNG_READ_BGR_SUPPORTED
1136
+ png_set_bgr(png_ptr);
1137
+ #else
1138
+ png_app_error(png_ptr, "PNG_TRANSFORM_BGR not supported");
1139
+ #endif
1140
+
1141
+ /* Swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR) */
1142
+ if ((transforms & PNG_TRANSFORM_SWAP_ALPHA) != 0)
1143
+ #ifdef PNG_READ_SWAP_ALPHA_SUPPORTED
1144
+ png_set_swap_alpha(png_ptr);
1145
+ #else
1146
+ png_app_error(png_ptr, "PNG_TRANSFORM_SWAP_ALPHA not supported");
1147
+ #endif
1148
+
1149
+ /* Swap bytes of 16-bit files to least significant byte first */
1150
+ if ((transforms & PNG_TRANSFORM_SWAP_ENDIAN) != 0)
1151
+ #ifdef PNG_READ_SWAP_SUPPORTED
1152
+ png_set_swap(png_ptr);
1153
+ #else
1154
+ png_app_error(png_ptr, "PNG_TRANSFORM_SWAP_ENDIAN not supported");
1155
+ #endif
1156
+
1157
+ /* Added at libpng-1.2.41 */
1158
+ /* Invert the alpha channel from opacity to transparency */
1159
+ if ((transforms & PNG_TRANSFORM_INVERT_ALPHA) != 0)
1160
+ #ifdef PNG_READ_INVERT_ALPHA_SUPPORTED
1161
+ png_set_invert_alpha(png_ptr);
1162
+ #else
1163
+ png_app_error(png_ptr, "PNG_TRANSFORM_INVERT_ALPHA not supported");
1164
+ #endif
1165
+
1166
+ /* Added at libpng-1.2.41 */
1167
+ /* Expand grayscale image to RGB */
1168
+ if ((transforms & PNG_TRANSFORM_GRAY_TO_RGB) != 0)
1169
+ #ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
1170
+ png_set_gray_to_rgb(png_ptr);
1171
+ #else
1172
+ png_app_error(png_ptr, "PNG_TRANSFORM_GRAY_TO_RGB not supported");
1173
+ #endif
1174
+
1175
+ /* Added at libpng-1.5.4 */
1176
+ if ((transforms & PNG_TRANSFORM_EXPAND_16) != 0)
1177
+ #ifdef PNG_READ_EXPAND_16_SUPPORTED
1178
+ png_set_expand_16(png_ptr);
1179
+ #else
1180
+ png_app_error(png_ptr, "PNG_TRANSFORM_EXPAND_16 not supported");
1181
+ #endif
1182
+
1183
+ /* We don't handle adding filler bytes */
1184
+
1185
+ /* We use png_read_image and rely on that for interlace handling, but we also
1186
+ * call png_read_update_info therefore must turn on interlace handling now:
1187
+ */
1188
+ (void)png_set_interlace_handling(png_ptr);
1189
+
1190
+ /* Optional call to gamma correct and add the background to the palette
1191
+ * and update info structure. REQUIRED if you are expecting libpng to
1192
+ * update the palette for you (i.e., you selected such a transform above).
1193
+ */
1194
+ png_read_update_info(png_ptr, info_ptr);
1195
+
1196
+ /* -------------- image transformations end here ------------------- */
1197
+
1198
+ png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0);
1199
+ if (info_ptr->row_pointers == NULL)
1200
+ {
1201
+ png_uint_32 iptr;
1202
+
1203
+ info_ptr->row_pointers = png_voidcast(png_bytepp, png_malloc(png_ptr,
1204
+ info_ptr->height * (sizeof (png_bytep))));
1205
+
1206
+ for (iptr=0; iptr<info_ptr->height; iptr++)
1207
+ info_ptr->row_pointers[iptr] = NULL;
1208
+
1209
+ info_ptr->free_me |= PNG_FREE_ROWS;
1210
+
1211
+ for (iptr = 0; iptr < info_ptr->height; iptr++)
1212
+ info_ptr->row_pointers[iptr] = png_voidcast(png_bytep,
1213
+ png_malloc(png_ptr, info_ptr->rowbytes));
1214
+ }
1215
+
1216
+ png_read_image(png_ptr, info_ptr->row_pointers);
1217
+ info_ptr->valid |= PNG_INFO_IDAT;
1218
+
1219
+ /* Read rest of file, and get additional chunks in info_ptr - REQUIRED */
1220
+ png_read_end(png_ptr, info_ptr);
1221
+
1222
+ PNG_UNUSED(params)
1223
+ }
1224
+ #endif /* INFO_IMAGE */
1225
+ #endif /* SEQUENTIAL_READ */
1226
+
1227
+ #ifdef PNG_SIMPLIFIED_READ_SUPPORTED
1228
+ /* SIMPLIFIED READ
1229
+ *
1230
+ * This code currently relies on the sequential reader, though it could easily
1231
+ * be made to work with the progressive one.
1232
+ */
1233
+ /* Arguments to png_image_finish_read: */
1234
+
1235
+ /* Encoding of PNG data (used by the color-map code) */
1236
+ # define P_NOTSET 0 /* File encoding not yet known */
1237
+ # define P_sRGB 1 /* 8-bit encoded to sRGB gamma */
1238
+ # define P_LINEAR 2 /* 16-bit linear: not encoded, NOT pre-multiplied! */
1239
+ # define P_FILE 3 /* 8-bit encoded to file gamma, not sRGB or linear */
1240
+ # define P_LINEAR8 4 /* 8-bit linear: only from a file value */
1241
+
1242
+ /* Color-map processing: after libpng has run on the PNG image further
1243
+ * processing may be needed to convert the data to color-map indices.
1244
+ */
1245
+ #define PNG_CMAP_NONE 0
1246
+ #define PNG_CMAP_GA 1 /* Process GA data to a color-map with alpha */
1247
+ #define PNG_CMAP_TRANS 2 /* Process GA data to a background index */
1248
+ #define PNG_CMAP_RGB 3 /* Process RGB data */
1249
+ #define PNG_CMAP_RGB_ALPHA 4 /* Process RGBA data */
1250
+
1251
+ /* The following document where the background is for each processing case. */
1252
+ #define PNG_CMAP_NONE_BACKGROUND 256
1253
+ #define PNG_CMAP_GA_BACKGROUND 231
1254
+ #define PNG_CMAP_TRANS_BACKGROUND 254
1255
+ #define PNG_CMAP_RGB_BACKGROUND 256
1256
+ #define PNG_CMAP_RGB_ALPHA_BACKGROUND 216
1257
+
1258
+ typedef struct
1259
+ {
1260
+ /* Arguments: */
1261
+ png_imagep image;
1262
+ png_voidp buffer;
1263
+ png_int_32 row_stride;
1264
+ png_voidp colormap;
1265
+ png_const_colorp background;
1266
+ /* Local variables: */
1267
+ png_voidp local_row;
1268
+ png_voidp first_row;
1269
+ ptrdiff_t row_bytes; /* step between rows */
1270
+ int file_encoding; /* E_ values above */
1271
+ png_fixed_point gamma_to_linear; /* For P_FILE, reciprocal of gamma */
1272
+ int colormap_processing; /* PNG_CMAP_ values above */
1273
+ } png_image_read_control;
1274
+
1275
+ /* Do all the *safe* initialization - 'safe' means that png_error won't be
1276
+ * called, so setting up the jmp_buf is not required. This means that anything
1277
+ * called from here must *not* call png_malloc - it has to call png_malloc_warn
1278
+ * instead so that control is returned safely back to this routine.
1279
+ */
1280
+ static int
1281
+ png_image_read_init(png_imagep image)
1282
+ {
1283
+ if (image->opaque == NULL)
1284
+ {
1285
+ png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, image,
1286
+ png_safe_error, png_safe_warning);
1287
+
1288
+ /* And set the rest of the structure to NULL to ensure that the various
1289
+ * fields are consistent.
1290
+ */
1291
+ memset(image, 0, (sizeof *image));
1292
+ image->version = PNG_IMAGE_VERSION;
1293
+
1294
+ if (png_ptr != NULL)
1295
+ {
1296
+ png_infop info_ptr = png_create_info_struct(png_ptr);
1297
+
1298
+ if (info_ptr != NULL)
1299
+ {
1300
+ png_controlp control = png_voidcast(png_controlp,
1301
+ png_malloc_warn(png_ptr, (sizeof *control)));
1302
+
1303
+ if (control != NULL)
1304
+ {
1305
+ memset(control, 0, (sizeof *control));
1306
+
1307
+ control->png_ptr = png_ptr;
1308
+ control->info_ptr = info_ptr;
1309
+ control->for_write = 0;
1310
+
1311
+ image->opaque = control;
1312
+ return 1;
1313
+ }
1314
+
1315
+ /* Error clean up */
1316
+ png_destroy_info_struct(png_ptr, &info_ptr);
1317
+ }
1318
+
1319
+ png_destroy_read_struct(&png_ptr, NULL, NULL);
1320
+ }
1321
+
1322
+ return png_image_error(image, "png_image_read: out of memory");
1323
+ }
1324
+
1325
+ return png_image_error(image, "png_image_read: opaque pointer not NULL");
1326
+ }
1327
+
1328
+ /* Utility to find the base format of a PNG file from a png_struct. */
1329
+ static png_uint_32
1330
+ png_image_format(png_structrp png_ptr)
1331
+ {
1332
+ png_uint_32 format = 0;
1333
+
1334
+ if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)
1335
+ format |= PNG_FORMAT_FLAG_COLOR;
1336
+
1337
+ if ((png_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0)
1338
+ format |= PNG_FORMAT_FLAG_ALPHA;
1339
+
1340
+ /* Use png_ptr here, not info_ptr, because by examination png_handle_tRNS
1341
+ * sets the png_struct fields; that's all we are interested in here. The
1342
+ * precise interaction with an app call to png_set_tRNS and PNG file reading
1343
+ * is unclear.
1344
+ */
1345
+ else if (png_ptr->num_trans > 0)
1346
+ format |= PNG_FORMAT_FLAG_ALPHA;
1347
+
1348
+ if (png_ptr->bit_depth == 16)
1349
+ format |= PNG_FORMAT_FLAG_LINEAR;
1350
+
1351
+ if ((png_ptr->color_type & PNG_COLOR_MASK_PALETTE) != 0)
1352
+ format |= PNG_FORMAT_FLAG_COLORMAP;
1353
+
1354
+ return format;
1355
+ }
1356
+
1357
+ /* Is the given gamma significantly different from sRGB? The test is the same
1358
+ * one used in pngrtran.c when deciding whether to do gamma correction. The
1359
+ * arithmetic optimizes the division by using the fact that the inverse of the
1360
+ * file sRGB gamma is 2.2
1361
+ */
1362
+ static int
1363
+ png_gamma_not_sRGB(png_fixed_point g)
1364
+ {
1365
+ if (g < PNG_FP_1)
1366
+ {
1367
+ /* An uninitialized gamma is assumed to be sRGB for the simplified API. */
1368
+ if (g == 0)
1369
+ return 0;
1370
+
1371
+ return png_gamma_significant((g * 11 + 2)/5 /* i.e. *2.2, rounded */);
1372
+ }
1373
+
1374
+ return 1;
1375
+ }
1376
+
1377
+ /* Do the main body of a 'png_image_begin_read' function; read the PNG file
1378
+ * header and fill in all the information. This is executed in a safe context,
1379
+ * unlike the init routine above.
1380
+ */
1381
+ static int
1382
+ png_image_read_header(png_voidp argument)
1383
+ {
1384
+ png_imagep image = png_voidcast(png_imagep, argument);
1385
+ png_structrp png_ptr = image->opaque->png_ptr;
1386
+ png_inforp info_ptr = image->opaque->info_ptr;
1387
+
1388
+ png_set_benign_errors(png_ptr, 1/*warn*/);
1389
+ png_read_info(png_ptr, info_ptr);
1390
+
1391
+ /* Do this the fast way; just read directly out of png_struct. */
1392
+ image->width = png_ptr->width;
1393
+ image->height = png_ptr->height;
1394
+
1395
+ {
1396
+ png_uint_32 format = png_image_format(png_ptr);
1397
+
1398
+ image->format = format;
1399
+
1400
+ #ifdef PNG_COLORSPACE_SUPPORTED
1401
+ /* Does the colorspace match sRGB? If there is no color endpoint
1402
+ * (colorant) information assume yes, otherwise require the
1403
+ * 'ENDPOINTS_MATCHP_sRGB' colorspace flag to have been set. If the
1404
+ * colorspace has been determined to be invalid ignore it.
1405
+ */
1406
+ if ((format & PNG_FORMAT_FLAG_COLOR) != 0 && ((png_ptr->colorspace.flags
1407
+ & (PNG_COLORSPACE_HAVE_ENDPOINTS|PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB|
1408
+ PNG_COLORSPACE_INVALID)) == PNG_COLORSPACE_HAVE_ENDPOINTS))
1409
+ image->flags |= PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB;
1410
+ #endif
1411
+ }
1412
+
1413
+ /* We need the maximum number of entries regardless of the format the
1414
+ * application sets here.
1415
+ */
1416
+ {
1417
+ png_uint_32 cmap_entries;
1418
+
1419
+ switch (png_ptr->color_type)
1420
+ {
1421
+ case PNG_COLOR_TYPE_GRAY:
1422
+ cmap_entries = 1U << png_ptr->bit_depth;
1423
+ break;
1424
+
1425
+ case PNG_COLOR_TYPE_PALETTE:
1426
+ cmap_entries = png_ptr->num_palette;
1427
+ break;
1428
+
1429
+ default:
1430
+ cmap_entries = 256;
1431
+ break;
1432
+ }
1433
+
1434
+ if (cmap_entries > 256)
1435
+ cmap_entries = 256;
1436
+
1437
+ image->colormap_entries = cmap_entries;
1438
+ }
1439
+
1440
+ return 1;
1441
+ }
1442
+
1443
+ #ifdef PNG_STDIO_SUPPORTED
1444
+ int PNGAPI
1445
+ png_image_begin_read_from_stdio(png_imagep image, FILE* file)
1446
+ {
1447
+ if (image != NULL && image->version == PNG_IMAGE_VERSION)
1448
+ {
1449
+ if (file != NULL)
1450
+ {
1451
+ if (png_image_read_init(image) != 0)
1452
+ {
1453
+ /* This is slightly evil, but png_init_io doesn't do anything other
1454
+ * than this and we haven't changed the standard IO functions so
1455
+ * this saves a 'safe' function.
1456
+ */
1457
+ image->opaque->png_ptr->io_ptr = file;
1458
+ return png_safe_execute(image, png_image_read_header, image);
1459
+ }
1460
+ }
1461
+
1462
+ else
1463
+ return png_image_error(image,
1464
+ "png_image_begin_read_from_stdio: invalid argument");
1465
+ }
1466
+
1467
+ else if (image != NULL)
1468
+ return png_image_error(image,
1469
+ "png_image_begin_read_from_stdio: incorrect PNG_IMAGE_VERSION");
1470
+
1471
+ return 0;
1472
+ }
1473
+
1474
+ int PNGAPI
1475
+ png_image_begin_read_from_file(png_imagep image, const char *file_name)
1476
+ {
1477
+ if (image != NULL && image->version == PNG_IMAGE_VERSION)
1478
+ {
1479
+ if (file_name != NULL)
1480
+ {
1481
+ FILE *fp = fopen(file_name, "rb");
1482
+
1483
+ if (fp != NULL)
1484
+ {
1485
+ if (png_image_read_init(image) != 0)
1486
+ {
1487
+ image->opaque->png_ptr->io_ptr = fp;
1488
+ image->opaque->owned_file = 1;
1489
+ return png_safe_execute(image, png_image_read_header, image);
1490
+ }
1491
+
1492
+ /* Clean up: just the opened file. */
1493
+ (void)fclose(fp);
1494
+ }
1495
+
1496
+ else
1497
+ return png_image_error(image, strerror(errno));
1498
+ }
1499
+
1500
+ else
1501
+ return png_image_error(image,
1502
+ "png_image_begin_read_from_file: invalid argument");
1503
+ }
1504
+
1505
+ else if (image != NULL)
1506
+ return png_image_error(image,
1507
+ "png_image_begin_read_from_file: incorrect PNG_IMAGE_VERSION");
1508
+
1509
+ return 0;
1510
+ }
1511
+ #endif /* STDIO */
1512
+
1513
+ static void PNGCBAPI
1514
+ png_image_memory_read(png_structp png_ptr, png_bytep out, png_size_t need)
1515
+ {
1516
+ if (png_ptr != NULL)
1517
+ {
1518
+ png_imagep image = png_voidcast(png_imagep, png_ptr->io_ptr);
1519
+ if (image != NULL)
1520
+ {
1521
+ png_controlp cp = image->opaque;
1522
+ if (cp != NULL)
1523
+ {
1524
+ png_const_bytep memory = cp->memory;
1525
+ png_size_t size = cp->size;
1526
+
1527
+ if (memory != NULL && size >= need)
1528
+ {
1529
+ memcpy(out, memory, need);
1530
+ cp->memory = memory + need;
1531
+ cp->size = size - need;
1532
+ return;
1533
+ }
1534
+
1535
+ png_error(png_ptr, "read beyond end of data");
1536
+ }
1537
+ }
1538
+
1539
+ png_error(png_ptr, "invalid memory read");
1540
+ }
1541
+ }
1542
+
1543
+ int PNGAPI png_image_begin_read_from_memory(png_imagep image,
1544
+ png_const_voidp memory, png_size_t size)
1545
+ {
1546
+ if (image != NULL && image->version == PNG_IMAGE_VERSION)
1547
+ {
1548
+ if (memory != NULL && size > 0)
1549
+ {
1550
+ if (png_image_read_init(image) != 0)
1551
+ {
1552
+ /* Now set the IO functions to read from the memory buffer and
1553
+ * store it into io_ptr. Again do this in-place to avoid calling a
1554
+ * libpng function that requires error handling.
1555
+ */
1556
+ image->opaque->memory = png_voidcast(png_const_bytep, memory);
1557
+ image->opaque->size = size;
1558
+ image->opaque->png_ptr->io_ptr = image;
1559
+ image->opaque->png_ptr->read_data_fn = png_image_memory_read;
1560
+
1561
+ return png_safe_execute(image, png_image_read_header, image);
1562
+ }
1563
+ }
1564
+
1565
+ else
1566
+ return png_image_error(image,
1567
+ "png_image_begin_read_from_memory: invalid argument");
1568
+ }
1569
+
1570
+ else if (image != NULL)
1571
+ return png_image_error(image,
1572
+ "png_image_begin_read_from_memory: incorrect PNG_IMAGE_VERSION");
1573
+
1574
+ return 0;
1575
+ }
1576
+
1577
+ /* Utility function to skip chunks that are not used by the simplified image
1578
+ * read functions and an appropriate macro to call it.
1579
+ */
1580
+ #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
1581
+ static void
1582
+ png_image_skip_unused_chunks(png_structrp png_ptr)
1583
+ {
1584
+ /* Prepare the reader to ignore all recognized chunks whose data will not
1585
+ * be used, i.e., all chunks recognized by libpng except for those
1586
+ * involved in basic image reading:
1587
+ *
1588
+ * IHDR, PLTE, IDAT, IEND
1589
+ *
1590
+ * Or image data handling:
1591
+ *
1592
+ * tRNS, bKGD, gAMA, cHRM, sRGB, [iCCP] and sBIT.
1593
+ *
1594
+ * This provides a small performance improvement and eliminates any
1595
+ * potential vulnerability to security problems in the unused chunks.
1596
+ *
1597
+ * At present the iCCP chunk data isn't used, so iCCP chunk can be ignored
1598
+ * too. This allows the simplified API to be compiled without iCCP support,
1599
+ * however if the support is there the chunk is still checked to detect
1600
+ * errors (which are unfortunately quite common.)
1601
+ */
1602
+ {
1603
+ static PNG_CONST png_byte chunks_to_process[] = {
1604
+ 98, 75, 71, 68, '\0', /* bKGD */
1605
+ 99, 72, 82, 77, '\0', /* cHRM */
1606
+ 103, 65, 77, 65, '\0', /* gAMA */
1607
+ # ifdef PNG_READ_iCCP_SUPPORTED
1608
+ 105, 67, 67, 80, '\0', /* iCCP */
1609
+ # endif
1610
+ 115, 66, 73, 84, '\0', /* sBIT */
1611
+ 115, 82, 71, 66, '\0', /* sRGB */
1612
+ };
1613
+
1614
+ /* Ignore unknown chunks and all other chunks except for the
1615
+ * IHDR, PLTE, tRNS, IDAT, and IEND chunks.
1616
+ */
1617
+ png_set_keep_unknown_chunks(png_ptr, PNG_HANDLE_CHUNK_NEVER,
1618
+ NULL, -1);
1619
+
1620
+ /* But do not ignore image data handling chunks */
1621
+ png_set_keep_unknown_chunks(png_ptr, PNG_HANDLE_CHUNK_AS_DEFAULT,
1622
+ chunks_to_process, (int)/*SAFE*/(sizeof chunks_to_process)/5);
1623
+ }
1624
+ }
1625
+
1626
+ # define PNG_SKIP_CHUNKS(p) png_image_skip_unused_chunks(p)
1627
+ #else
1628
+ # define PNG_SKIP_CHUNKS(p) ((void)0)
1629
+ #endif /* HANDLE_AS_UNKNOWN */
1630
+
1631
+ /* The following macro gives the exact rounded answer for all values in the
1632
+ * range 0..255 (it actually divides by 51.2, but the rounding still generates
1633
+ * the correct numbers 0..5
1634
+ */
1635
+ #define PNG_DIV51(v8) (((v8) * 5 + 130) >> 8)
1636
+
1637
+ /* Utility functions to make particular color-maps */
1638
+ static void
1639
+ set_file_encoding(png_image_read_control *display)
1640
+ {
1641
+ png_fixed_point g = display->image->opaque->png_ptr->colorspace.gamma;
1642
+ if (png_gamma_significant(g) != 0)
1643
+ {
1644
+ if (png_gamma_not_sRGB(g) != 0)
1645
+ {
1646
+ display->file_encoding = P_FILE;
1647
+ display->gamma_to_linear = png_reciprocal(g);
1648
+ }
1649
+
1650
+ else
1651
+ display->file_encoding = P_sRGB;
1652
+ }
1653
+
1654
+ else
1655
+ display->file_encoding = P_LINEAR8;
1656
+ }
1657
+
1658
+ static unsigned int
1659
+ decode_gamma(png_image_read_control *display, png_uint_32 value, int encoding)
1660
+ {
1661
+ if (encoding == P_FILE) /* double check */
1662
+ encoding = display->file_encoding;
1663
+
1664
+ if (encoding == P_NOTSET) /* must be the file encoding */
1665
+ {
1666
+ set_file_encoding(display);
1667
+ encoding = display->file_encoding;
1668
+ }
1669
+
1670
+ switch (encoding)
1671
+ {
1672
+ case P_FILE:
1673
+ value = png_gamma_16bit_correct(value*257, display->gamma_to_linear);
1674
+ break;
1675
+
1676
+ case P_sRGB:
1677
+ value = png_sRGB_table[value];
1678
+ break;
1679
+
1680
+ case P_LINEAR:
1681
+ break;
1682
+
1683
+ case P_LINEAR8:
1684
+ value *= 257;
1685
+ break;
1686
+
1687
+ default:
1688
+ png_error(display->image->opaque->png_ptr,
1689
+ "unexpected encoding (internal error)");
1690
+ break;
1691
+ }
1692
+
1693
+ return value;
1694
+ }
1695
+
1696
+ static png_uint_32
1697
+ png_colormap_compose(png_image_read_control *display,
1698
+ png_uint_32 foreground, int foreground_encoding, png_uint_32 alpha,
1699
+ png_uint_32 background, int encoding)
1700
+ {
1701
+ /* The file value is composed on the background, the background has the given
1702
+ * encoding and so does the result, the file is encoded with P_FILE and the
1703
+ * file and alpha are 8-bit values. The (output) encoding will always be
1704
+ * P_LINEAR or P_sRGB.
1705
+ */
1706
+ png_uint_32 f = decode_gamma(display, foreground, foreground_encoding);
1707
+ png_uint_32 b = decode_gamma(display, background, encoding);
1708
+
1709
+ /* The alpha is always an 8-bit value (it comes from the palette), the value
1710
+ * scaled by 255 is what PNG_sRGB_FROM_LINEAR requires.
1711
+ */
1712
+ f = f * alpha + b * (255-alpha);
1713
+
1714
+ if (encoding == P_LINEAR)
1715
+ {
1716
+ /* Scale to 65535; divide by 255, approximately (in fact this is extremely
1717
+ * accurate, it divides by 255.00000005937181414556, with no overflow.)
1718
+ */
1719
+ f *= 257; /* Now scaled by 65535 */
1720
+ f += f >> 16;
1721
+ f = (f+32768) >> 16;
1722
+ }
1723
+
1724
+ else /* P_sRGB */
1725
+ f = PNG_sRGB_FROM_LINEAR(f);
1726
+
1727
+ return f;
1728
+ }
1729
+
1730
+ /* NOTE: P_LINEAR values to this routine must be 16-bit, but P_FILE values must
1731
+ * be 8-bit.
1732
+ */
1733
+ static void
1734
+ png_create_colormap_entry(png_image_read_control *display,
1735
+ png_uint_32 ip, png_uint_32 red, png_uint_32 green, png_uint_32 blue,
1736
+ png_uint_32 alpha, int encoding)
1737
+ {
1738
+ png_imagep image = display->image;
1739
+ const int output_encoding = (image->format & PNG_FORMAT_FLAG_LINEAR) != 0 ?
1740
+ P_LINEAR : P_sRGB;
1741
+ const int convert_to_Y = (image->format & PNG_FORMAT_FLAG_COLOR) == 0 &&
1742
+ (red != green || green != blue);
1743
+
1744
+ if (ip > 255)
1745
+ png_error(image->opaque->png_ptr, "color-map index out of range");
1746
+
1747
+ /* Update the cache with whether the file gamma is significantly different
1748
+ * from sRGB.
1749
+ */
1750
+ if (encoding == P_FILE)
1751
+ {
1752
+ if (display->file_encoding == P_NOTSET)
1753
+ set_file_encoding(display);
1754
+
1755
+ /* Note that the cached value may be P_FILE too, but if it is then the
1756
+ * gamma_to_linear member has been set.
1757
+ */
1758
+ encoding = display->file_encoding;
1759
+ }
1760
+
1761
+ if (encoding == P_FILE)
1762
+ {
1763
+ png_fixed_point g = display->gamma_to_linear;
1764
+
1765
+ red = png_gamma_16bit_correct(red*257, g);
1766
+ green = png_gamma_16bit_correct(green*257, g);
1767
+ blue = png_gamma_16bit_correct(blue*257, g);
1768
+
1769
+ if (convert_to_Y != 0 || output_encoding == P_LINEAR)
1770
+ {
1771
+ alpha *= 257;
1772
+ encoding = P_LINEAR;
1773
+ }
1774
+
1775
+ else
1776
+ {
1777
+ red = PNG_sRGB_FROM_LINEAR(red * 255);
1778
+ green = PNG_sRGB_FROM_LINEAR(green * 255);
1779
+ blue = PNG_sRGB_FROM_LINEAR(blue * 255);
1780
+ encoding = P_sRGB;
1781
+ }
1782
+ }
1783
+
1784
+ else if (encoding == P_LINEAR8)
1785
+ {
1786
+ /* This encoding occurs quite frequently in test cases because PngSuite
1787
+ * includes a gAMA 1.0 chunk with most images.
1788
+ */
1789
+ red *= 257;
1790
+ green *= 257;
1791
+ blue *= 257;
1792
+ alpha *= 257;
1793
+ encoding = P_LINEAR;
1794
+ }
1795
+
1796
+ else if (encoding == P_sRGB &&
1797
+ (convert_to_Y != 0 || output_encoding == P_LINEAR))
1798
+ {
1799
+ /* The values are 8-bit sRGB values, but must be converted to 16-bit
1800
+ * linear.
1801
+ */
1802
+ red = png_sRGB_table[red];
1803
+ green = png_sRGB_table[green];
1804
+ blue = png_sRGB_table[blue];
1805
+ alpha *= 257;
1806
+ encoding = P_LINEAR;
1807
+ }
1808
+
1809
+ /* This is set if the color isn't gray but the output is. */
1810
+ if (encoding == P_LINEAR)
1811
+ {
1812
+ if (convert_to_Y != 0)
1813
+ {
1814
+ /* NOTE: these values are copied from png_do_rgb_to_gray */
1815
+ png_uint_32 y = (png_uint_32)6968 * red + (png_uint_32)23434 * green +
1816
+ (png_uint_32)2366 * blue;
1817
+
1818
+ if (output_encoding == P_LINEAR)
1819
+ y = (y + 16384) >> 15;
1820
+
1821
+ else
1822
+ {
1823
+ /* y is scaled by 32768, we need it scaled by 255: */
1824
+ y = (y + 128) >> 8;
1825
+ y *= 255;
1826
+ y = PNG_sRGB_FROM_LINEAR((y + 64) >> 7);
1827
+ encoding = P_sRGB;
1828
+ }
1829
+
1830
+ blue = red = green = y;
1831
+ }
1832
+
1833
+ else if (output_encoding == P_sRGB)
1834
+ {
1835
+ red = PNG_sRGB_FROM_LINEAR(red * 255);
1836
+ green = PNG_sRGB_FROM_LINEAR(green * 255);
1837
+ blue = PNG_sRGB_FROM_LINEAR(blue * 255);
1838
+ alpha = PNG_DIV257(alpha);
1839
+ encoding = P_sRGB;
1840
+ }
1841
+ }
1842
+
1843
+ if (encoding != output_encoding)
1844
+ png_error(image->opaque->png_ptr, "bad encoding (internal error)");
1845
+
1846
+ /* Store the value. */
1847
+ {
1848
+ # ifdef PNG_FORMAT_AFIRST_SUPPORTED
1849
+ const int afirst = (image->format & PNG_FORMAT_FLAG_AFIRST) != 0 &&
1850
+ (image->format & PNG_FORMAT_FLAG_ALPHA) != 0;
1851
+ # else
1852
+ # define afirst 0
1853
+ # endif
1854
+ # ifdef PNG_FORMAT_BGR_SUPPORTED
1855
+ const int bgr = (image->format & PNG_FORMAT_FLAG_BGR) != 0 ? 2 : 0;
1856
+ # else
1857
+ # define bgr 0
1858
+ # endif
1859
+
1860
+ if (output_encoding == P_LINEAR)
1861
+ {
1862
+ png_uint_16p entry = png_voidcast(png_uint_16p, display->colormap);
1863
+
1864
+ entry += ip * PNG_IMAGE_SAMPLE_CHANNELS(image->format);
1865
+
1866
+ /* The linear 16-bit values must be pre-multiplied by the alpha channel
1867
+ * value, if less than 65535 (this is, effectively, composite on black
1868
+ * if the alpha channel is removed.)
1869
+ */
1870
+ switch (PNG_IMAGE_SAMPLE_CHANNELS(image->format))
1871
+ {
1872
+ case 4:
1873
+ entry[afirst ? 0 : 3] = (png_uint_16)alpha;
1874
+ /* FALL THROUGH */
1875
+
1876
+ case 3:
1877
+ if (alpha < 65535)
1878
+ {
1879
+ if (alpha > 0)
1880
+ {
1881
+ blue = (blue * alpha + 32767U)/65535U;
1882
+ green = (green * alpha + 32767U)/65535U;
1883
+ red = (red * alpha + 32767U)/65535U;
1884
+ }
1885
+
1886
+ else
1887
+ red = green = blue = 0;
1888
+ }
1889
+ entry[afirst + (2 ^ bgr)] = (png_uint_16)blue;
1890
+ entry[afirst + 1] = (png_uint_16)green;
1891
+ entry[afirst + bgr] = (png_uint_16)red;
1892
+ break;
1893
+
1894
+ case 2:
1895
+ entry[1 ^ afirst] = (png_uint_16)alpha;
1896
+ /* FALL THROUGH */
1897
+
1898
+ case 1:
1899
+ if (alpha < 65535)
1900
+ {
1901
+ if (alpha > 0)
1902
+ green = (green * alpha + 32767U)/65535U;
1903
+
1904
+ else
1905
+ green = 0;
1906
+ }
1907
+ entry[afirst] = (png_uint_16)green;
1908
+ break;
1909
+
1910
+ default:
1911
+ break;
1912
+ }
1913
+ }
1914
+
1915
+ else /* output encoding is P_sRGB */
1916
+ {
1917
+ png_bytep entry = png_voidcast(png_bytep, display->colormap);
1918
+
1919
+ entry += ip * PNG_IMAGE_SAMPLE_CHANNELS(image->format);
1920
+
1921
+ switch (PNG_IMAGE_SAMPLE_CHANNELS(image->format))
1922
+ {
1923
+ case 4:
1924
+ entry[afirst ? 0 : 3] = (png_byte)alpha;
1925
+ case 3:
1926
+ entry[afirst + (2 ^ bgr)] = (png_byte)blue;
1927
+ entry[afirst + 1] = (png_byte)green;
1928
+ entry[afirst + bgr] = (png_byte)red;
1929
+ break;
1930
+
1931
+ case 2:
1932
+ entry[1 ^ afirst] = (png_byte)alpha;
1933
+ case 1:
1934
+ entry[afirst] = (png_byte)green;
1935
+ break;
1936
+
1937
+ default:
1938
+ break;
1939
+ }
1940
+ }
1941
+
1942
+ # ifdef afirst
1943
+ # undef afirst
1944
+ # endif
1945
+ # ifdef bgr
1946
+ # undef bgr
1947
+ # endif
1948
+ }
1949
+ }
1950
+
1951
+ static int
1952
+ make_gray_file_colormap(png_image_read_control *display)
1953
+ {
1954
+ unsigned int i;
1955
+
1956
+ for (i=0; i<256; ++i)
1957
+ png_create_colormap_entry(display, i, i, i, i, 255, P_FILE);
1958
+
1959
+ return i;
1960
+ }
1961
+
1962
+ static int
1963
+ make_gray_colormap(png_image_read_control *display)
1964
+ {
1965
+ unsigned int i;
1966
+
1967
+ for (i=0; i<256; ++i)
1968
+ png_create_colormap_entry(display, i, i, i, i, 255, P_sRGB);
1969
+
1970
+ return i;
1971
+ }
1972
+ #define PNG_GRAY_COLORMAP_ENTRIES 256
1973
+
1974
+ static int
1975
+ make_ga_colormap(png_image_read_control *display)
1976
+ {
1977
+ unsigned int i, a;
1978
+
1979
+ /* Alpha is retained, the output will be a color-map with entries
1980
+ * selected by six levels of alpha. One transparent entry, 6 gray
1981
+ * levels for all the intermediate alpha values, leaving 230 entries
1982
+ * for the opaque grays. The color-map entries are the six values
1983
+ * [0..5]*51, the GA processing uses PNG_DIV51(value) to find the
1984
+ * relevant entry.
1985
+ *
1986
+ * if (alpha > 229) // opaque
1987
+ * {
1988
+ * // The 231 entries are selected to make the math below work:
1989
+ * base = 0;
1990
+ * entry = (231 * gray + 128) >> 8;
1991
+ * }
1992
+ * else if (alpha < 26) // transparent
1993
+ * {
1994
+ * base = 231;
1995
+ * entry = 0;
1996
+ * }
1997
+ * else // partially opaque
1998
+ * {
1999
+ * base = 226 + 6 * PNG_DIV51(alpha);
2000
+ * entry = PNG_DIV51(gray);
2001
+ * }
2002
+ */
2003
+ i = 0;
2004
+ while (i < 231)
2005
+ {
2006
+ unsigned int gray = (i * 256 + 115) / 231;
2007
+ png_create_colormap_entry(display, i++, gray, gray, gray, 255, P_sRGB);
2008
+ }
2009
+
2010
+ /* 255 is used here for the component values for consistency with the code
2011
+ * that undoes premultiplication in pngwrite.c.
2012
+ */
2013
+ png_create_colormap_entry(display, i++, 255, 255, 255, 0, P_sRGB);
2014
+
2015
+ for (a=1; a<5; ++a)
2016
+ {
2017
+ unsigned int g;
2018
+
2019
+ for (g=0; g<6; ++g)
2020
+ png_create_colormap_entry(display, i++, g*51, g*51, g*51, a*51,
2021
+ P_sRGB);
2022
+ }
2023
+
2024
+ return i;
2025
+ }
2026
+
2027
+ #define PNG_GA_COLORMAP_ENTRIES 256
2028
+
2029
+ static int
2030
+ make_rgb_colormap(png_image_read_control *display)
2031
+ {
2032
+ unsigned int i, r;
2033
+
2034
+ /* Build a 6x6x6 opaque RGB cube */
2035
+ for (i=r=0; r<6; ++r)
2036
+ {
2037
+ unsigned int g;
2038
+
2039
+ for (g=0; g<6; ++g)
2040
+ {
2041
+ unsigned int b;
2042
+
2043
+ for (b=0; b<6; ++b)
2044
+ png_create_colormap_entry(display, i++, r*51, g*51, b*51, 255,
2045
+ P_sRGB);
2046
+ }
2047
+ }
2048
+
2049
+ return i;
2050
+ }
2051
+
2052
+ #define PNG_RGB_COLORMAP_ENTRIES 216
2053
+
2054
+ /* Return a palette index to the above palette given three 8-bit sRGB values. */
2055
+ #define PNG_RGB_INDEX(r,g,b) \
2056
+ ((png_byte)(6 * (6 * PNG_DIV51(r) + PNG_DIV51(g)) + PNG_DIV51(b)))
2057
+
2058
+ static int
2059
+ png_image_read_colormap(png_voidp argument)
2060
+ {
2061
+ png_image_read_control *display =
2062
+ png_voidcast(png_image_read_control*, argument);
2063
+ const png_imagep image = display->image;
2064
+
2065
+ const png_structrp png_ptr = image->opaque->png_ptr;
2066
+ const png_uint_32 output_format = image->format;
2067
+ const int output_encoding = (output_format & PNG_FORMAT_FLAG_LINEAR) != 0 ?
2068
+ P_LINEAR : P_sRGB;
2069
+
2070
+ unsigned int cmap_entries;
2071
+ unsigned int output_processing; /* Output processing option */
2072
+ unsigned int data_encoding = P_NOTSET; /* Encoding libpng must produce */
2073
+
2074
+ /* Background information; the background color and the index of this color
2075
+ * in the color-map if it exists (else 256).
2076
+ */
2077
+ unsigned int background_index = 256;
2078
+ png_uint_32 back_r, back_g, back_b;
2079
+
2080
+ /* Flags to accumulate things that need to be done to the input. */
2081
+ int expand_tRNS = 0;
2082
+
2083
+ /* Exclude the NYI feature of compositing onto a color-mapped buffer; it is
2084
+ * very difficult to do, the results look awful, and it is difficult to see
2085
+ * what possible use it is because the application can't control the
2086
+ * color-map.
2087
+ */
2088
+ if (((png_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0 ||
2089
+ png_ptr->num_trans > 0) /* alpha in input */ &&
2090
+ ((output_format & PNG_FORMAT_FLAG_ALPHA) == 0) /* no alpha in output */)
2091
+ {
2092
+ if (output_encoding == P_LINEAR) /* compose on black */
2093
+ back_b = back_g = back_r = 0;
2094
+
2095
+ else if (display->background == NULL /* no way to remove it */)
2096
+ png_error(png_ptr,
2097
+ "a background color must be supplied to remove alpha/transparency");
2098
+
2099
+ /* Get a copy of the background color (this avoids repeating the checks
2100
+ * below.) The encoding is 8-bit sRGB or 16-bit linear, depending on the
2101
+ * output format.
2102
+ */
2103
+ else
2104
+ {
2105
+ back_g = display->background->green;
2106
+ if ((output_format & PNG_FORMAT_FLAG_COLOR) != 0)
2107
+ {
2108
+ back_r = display->background->red;
2109
+ back_b = display->background->blue;
2110
+ }
2111
+ else
2112
+ back_b = back_r = back_g;
2113
+ }
2114
+ }
2115
+
2116
+ else if (output_encoding == P_LINEAR)
2117
+ back_b = back_r = back_g = 65535;
2118
+
2119
+ else
2120
+ back_b = back_r = back_g = 255;
2121
+
2122
+ /* Default the input file gamma if required - this is necessary because
2123
+ * libpng assumes that if no gamma information is present the data is in the
2124
+ * output format, but the simplified API deduces the gamma from the input
2125
+ * format.
2126
+ */
2127
+ if ((png_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) == 0)
2128
+ {
2129
+ /* Do this directly, not using the png_colorspace functions, to ensure
2130
+ * that it happens even if the colorspace is invalid (though probably if
2131
+ * it is the setting will be ignored) Note that the same thing can be
2132
+ * achieved at the application interface with png_set_gAMA.
2133
+ */
2134
+ if (png_ptr->bit_depth == 16 &&
2135
+ (image->flags & PNG_IMAGE_FLAG_16BIT_sRGB) == 0)
2136
+ png_ptr->colorspace.gamma = PNG_GAMMA_LINEAR;
2137
+
2138
+ else
2139
+ png_ptr->colorspace.gamma = PNG_GAMMA_sRGB_INVERSE;
2140
+
2141
+ png_ptr->colorspace.flags |= PNG_COLORSPACE_HAVE_GAMMA;
2142
+ }
2143
+
2144
+ /* Decide what to do based on the PNG color type of the input data. The
2145
+ * utility function png_create_colormap_entry deals with most aspects of the
2146
+ * output transformations; this code works out how to produce bytes of
2147
+ * color-map entries from the original format.
2148
+ */
2149
+ switch (png_ptr->color_type)
2150
+ {
2151
+ case PNG_COLOR_TYPE_GRAY:
2152
+ if (png_ptr->bit_depth <= 8)
2153
+ {
2154
+ /* There at most 256 colors in the output, regardless of
2155
+ * transparency.
2156
+ */
2157
+ unsigned int step, i, val, trans = 256/*ignore*/, back_alpha = 0;
2158
+
2159
+ cmap_entries = 1U << png_ptr->bit_depth;
2160
+ if (cmap_entries > image->colormap_entries)
2161
+ png_error(png_ptr, "gray[8] color-map: too few entries");
2162
+
2163
+ step = 255 / (cmap_entries - 1);
2164
+ output_processing = PNG_CMAP_NONE;
2165
+
2166
+ /* If there is a tRNS chunk then this either selects a transparent
2167
+ * value or, if the output has no alpha, the background color.
2168
+ */
2169
+ if (png_ptr->num_trans > 0)
2170
+ {
2171
+ trans = png_ptr->trans_color.gray;
2172
+
2173
+ if ((output_format & PNG_FORMAT_FLAG_ALPHA) == 0)
2174
+ back_alpha = output_encoding == P_LINEAR ? 65535 : 255;
2175
+ }
2176
+
2177
+ /* png_create_colormap_entry just takes an RGBA and writes the
2178
+ * corresponding color-map entry using the format from 'image',
2179
+ * including the required conversion to sRGB or linear as
2180
+ * appropriate. The input values are always either sRGB (if the
2181
+ * gamma correction flag is 0) or 0..255 scaled file encoded values
2182
+ * (if the function must gamma correct them).
2183
+ */
2184
+ for (i=val=0; i<cmap_entries; ++i, val += step)
2185
+ {
2186
+ /* 'i' is a file value. While this will result in duplicated
2187
+ * entries for 8-bit non-sRGB encoded files it is necessary to
2188
+ * have non-gamma corrected values to do tRNS handling.
2189
+ */
2190
+ if (i != trans)
2191
+ png_create_colormap_entry(display, i, val, val, val, 255,
2192
+ P_FILE/*8-bit with file gamma*/);
2193
+
2194
+ /* Else this entry is transparent. The colors don't matter if
2195
+ * there is an alpha channel (back_alpha == 0), but it does no
2196
+ * harm to pass them in; the values are not set above so this
2197
+ * passes in white.
2198
+ *
2199
+ * NOTE: this preserves the full precision of the application
2200
+ * supplied background color when it is used.
2201
+ */
2202
+ else
2203
+ png_create_colormap_entry(display, i, back_r, back_g, back_b,
2204
+ back_alpha, output_encoding);
2205
+ }
2206
+
2207
+ /* We need libpng to preserve the original encoding. */
2208
+ data_encoding = P_FILE;
2209
+
2210
+ /* The rows from libpng, while technically gray values, are now also
2211
+ * color-map indices; however, they may need to be expanded to 1
2212
+ * byte per pixel. This is what png_set_packing does (i.e., it
2213
+ * unpacks the bit values into bytes.)
2214
+ */
2215
+ if (png_ptr->bit_depth < 8)
2216
+ png_set_packing(png_ptr);
2217
+ }
2218
+
2219
+ else /* bit depth is 16 */
2220
+ {
2221
+ /* The 16-bit input values can be converted directly to 8-bit gamma
2222
+ * encoded values; however, if a tRNS chunk is present 257 color-map
2223
+ * entries are required. This means that the extra entry requires
2224
+ * special processing; add an alpha channel, sacrifice gray level
2225
+ * 254 and convert transparent (alpha==0) entries to that.
2226
+ *
2227
+ * Use libpng to chop the data to 8 bits. Convert it to sRGB at the
2228
+ * same time to minimize quality loss. If a tRNS chunk is present
2229
+ * this means libpng must handle it too; otherwise it is impossible
2230
+ * to do the exact match on the 16-bit value.
2231
+ *
2232
+ * If the output has no alpha channel *and* the background color is
2233
+ * gray then it is possible to let libpng handle the substitution by
2234
+ * ensuring that the corresponding gray level matches the background
2235
+ * color exactly.
2236
+ */
2237
+ data_encoding = P_sRGB;
2238
+
2239
+ if (PNG_GRAY_COLORMAP_ENTRIES > image->colormap_entries)
2240
+ png_error(png_ptr, "gray[16] color-map: too few entries");
2241
+
2242
+ cmap_entries = make_gray_colormap(display);
2243
+
2244
+ if (png_ptr->num_trans > 0)
2245
+ {
2246
+ unsigned int back_alpha;
2247
+
2248
+ if ((output_format & PNG_FORMAT_FLAG_ALPHA) != 0)
2249
+ back_alpha = 0;
2250
+
2251
+ else
2252
+ {
2253
+ if (back_r == back_g && back_g == back_b)
2254
+ {
2255
+ /* Background is gray; no special processing will be
2256
+ * required.
2257
+ */
2258
+ png_color_16 c;
2259
+ png_uint_32 gray = back_g;
2260
+
2261
+ if (output_encoding == P_LINEAR)
2262
+ {
2263
+ gray = PNG_sRGB_FROM_LINEAR(gray * 255);
2264
+
2265
+ /* And make sure the corresponding palette entry
2266
+ * matches.
2267
+ */
2268
+ png_create_colormap_entry(display, gray, back_g, back_g,
2269
+ back_g, 65535, P_LINEAR);
2270
+ }
2271
+
2272
+ /* The background passed to libpng, however, must be the
2273
+ * sRGB value.
2274
+ */
2275
+ c.index = 0; /*unused*/
2276
+ c.gray = c.red = c.green = c.blue = (png_uint_16)gray;
2277
+
2278
+ /* NOTE: does this work without expanding tRNS to alpha?
2279
+ * It should be the color->gray case below apparently
2280
+ * doesn't.
2281
+ */
2282
+ png_set_background_fixed(png_ptr, &c,
2283
+ PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
2284
+ 0/*gamma: not used*/);
2285
+
2286
+ output_processing = PNG_CMAP_NONE;
2287
+ break;
2288
+ }
2289
+
2290
+ back_alpha = output_encoding == P_LINEAR ? 65535 : 255;
2291
+ }
2292
+
2293
+ /* output_processing means that the libpng-processed row will be
2294
+ * 8-bit GA and it has to be processing to single byte color-map
2295
+ * values. Entry 254 is replaced by either a completely
2296
+ * transparent entry or by the background color at full
2297
+ * precision (and the background color is not a simple gray
2298
+ * level in this case.)
2299
+ */
2300
+ expand_tRNS = 1;
2301
+ output_processing = PNG_CMAP_TRANS;
2302
+ background_index = 254;
2303
+
2304
+ /* And set (overwrite) color-map entry 254 to the actual
2305
+ * background color at full precision.
2306
+ */
2307
+ png_create_colormap_entry(display, 254, back_r, back_g, back_b,
2308
+ back_alpha, output_encoding);
2309
+ }
2310
+
2311
+ else
2312
+ output_processing = PNG_CMAP_NONE;
2313
+ }
2314
+ break;
2315
+
2316
+ case PNG_COLOR_TYPE_GRAY_ALPHA:
2317
+ /* 8-bit or 16-bit PNG with two channels - gray and alpha. A minimum
2318
+ * of 65536 combinations. If, however, the alpha channel is to be
2319
+ * removed there are only 256 possibilities if the background is gray.
2320
+ * (Otherwise there is a subset of the 65536 possibilities defined by
2321
+ * the triangle between black, white and the background color.)
2322
+ *
2323
+ * Reduce 16-bit files to 8-bit and sRGB encode the result. No need to
2324
+ * worry about tRNS matching - tRNS is ignored if there is an alpha
2325
+ * channel.
2326
+ */
2327
+ data_encoding = P_sRGB;
2328
+
2329
+ if ((output_format & PNG_FORMAT_FLAG_ALPHA) != 0)
2330
+ {
2331
+ if (PNG_GA_COLORMAP_ENTRIES > image->colormap_entries)
2332
+ png_error(png_ptr, "gray+alpha color-map: too few entries");
2333
+
2334
+ cmap_entries = make_ga_colormap(display);
2335
+
2336
+ background_index = PNG_CMAP_GA_BACKGROUND;
2337
+ output_processing = PNG_CMAP_GA;
2338
+ }
2339
+
2340
+ else /* alpha is removed */
2341
+ {
2342
+ /* Alpha must be removed as the PNG data is processed when the
2343
+ * background is a color because the G and A channels are
2344
+ * independent and the vector addition (non-parallel vectors) is a
2345
+ * 2-D problem.
2346
+ *
2347
+ * This can be reduced to the same algorithm as above by making a
2348
+ * colormap containing gray levels (for the opaque grays), a
2349
+ * background entry (for a transparent pixel) and a set of four six
2350
+ * level color values, one set for each intermediate alpha value.
2351
+ * See the comments in make_ga_colormap for how this works in the
2352
+ * per-pixel processing.
2353
+ *
2354
+ * If the background is gray, however, we only need a 256 entry gray
2355
+ * level color map. It is sufficient to make the entry generated
2356
+ * for the background color be exactly the color specified.
2357
+ */
2358
+ if ((output_format & PNG_FORMAT_FLAG_COLOR) == 0 ||
2359
+ (back_r == back_g && back_g == back_b))
2360
+ {
2361
+ /* Background is gray; no special processing will be required. */
2362
+ png_color_16 c;
2363
+ png_uint_32 gray = back_g;
2364
+
2365
+ if (PNG_GRAY_COLORMAP_ENTRIES > image->colormap_entries)
2366
+ png_error(png_ptr, "gray-alpha color-map: too few entries");
2367
+
2368
+ cmap_entries = make_gray_colormap(display);
2369
+
2370
+ if (output_encoding == P_LINEAR)
2371
+ {
2372
+ gray = PNG_sRGB_FROM_LINEAR(gray * 255);
2373
+
2374
+ /* And make sure the corresponding palette entry matches. */
2375
+ png_create_colormap_entry(display, gray, back_g, back_g,
2376
+ back_g, 65535, P_LINEAR);
2377
+ }
2378
+
2379
+ /* The background passed to libpng, however, must be the sRGB
2380
+ * value.
2381
+ */
2382
+ c.index = 0; /*unused*/
2383
+ c.gray = c.red = c.green = c.blue = (png_uint_16)gray;
2384
+
2385
+ png_set_background_fixed(png_ptr, &c,
2386
+ PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
2387
+ 0/*gamma: not used*/);
2388
+
2389
+ output_processing = PNG_CMAP_NONE;
2390
+ }
2391
+
2392
+ else
2393
+ {
2394
+ png_uint_32 i, a;
2395
+
2396
+ /* This is the same as png_make_ga_colormap, above, except that
2397
+ * the entries are all opaque.
2398
+ */
2399
+ if (PNG_GA_COLORMAP_ENTRIES > image->colormap_entries)
2400
+ png_error(png_ptr, "ga-alpha color-map: too few entries");
2401
+
2402
+ i = 0;
2403
+ while (i < 231)
2404
+ {
2405
+ png_uint_32 gray = (i * 256 + 115) / 231;
2406
+ png_create_colormap_entry(display, i++, gray, gray, gray,
2407
+ 255, P_sRGB);
2408
+ }
2409
+
2410
+ /* NOTE: this preserves the full precision of the application
2411
+ * background color.
2412
+ */
2413
+ background_index = i;
2414
+ png_create_colormap_entry(display, i++, back_r, back_g, back_b,
2415
+ output_encoding == P_LINEAR ? 65535U : 255U, output_encoding);
2416
+
2417
+ /* For non-opaque input composite on the sRGB background - this
2418
+ * requires inverting the encoding for each component. The input
2419
+ * is still converted to the sRGB encoding because this is a
2420
+ * reasonable approximate to the logarithmic curve of human
2421
+ * visual sensitivity, at least over the narrow range which PNG
2422
+ * represents. Consequently 'G' is always sRGB encoded, while
2423
+ * 'A' is linear. We need the linear background colors.
2424
+ */
2425
+ if (output_encoding == P_sRGB) /* else already linear */
2426
+ {
2427
+ /* This may produce a value not exactly matching the
2428
+ * background, but that's ok because these numbers are only
2429
+ * used when alpha != 0
2430
+ */
2431
+ back_r = png_sRGB_table[back_r];
2432
+ back_g = png_sRGB_table[back_g];
2433
+ back_b = png_sRGB_table[back_b];
2434
+ }
2435
+
2436
+ for (a=1; a<5; ++a)
2437
+ {
2438
+ unsigned int g;
2439
+
2440
+ /* PNG_sRGB_FROM_LINEAR expects a 16-bit linear value scaled
2441
+ * by an 8-bit alpha value (0..255).
2442
+ */
2443
+ png_uint_32 alpha = 51 * a;
2444
+ png_uint_32 back_rx = (255-alpha) * back_r;
2445
+ png_uint_32 back_gx = (255-alpha) * back_g;
2446
+ png_uint_32 back_bx = (255-alpha) * back_b;
2447
+
2448
+ for (g=0; g<6; ++g)
2449
+ {
2450
+ png_uint_32 gray = png_sRGB_table[g*51] * alpha;
2451
+
2452
+ png_create_colormap_entry(display, i++,
2453
+ PNG_sRGB_FROM_LINEAR(gray + back_rx),
2454
+ PNG_sRGB_FROM_LINEAR(gray + back_gx),
2455
+ PNG_sRGB_FROM_LINEAR(gray + back_bx), 255, P_sRGB);
2456
+ }
2457
+ }
2458
+
2459
+ cmap_entries = i;
2460
+ output_processing = PNG_CMAP_GA;
2461
+ }
2462
+ }
2463
+ break;
2464
+
2465
+ case PNG_COLOR_TYPE_RGB:
2466
+ case PNG_COLOR_TYPE_RGB_ALPHA:
2467
+ /* Exclude the case where the output is gray; we can always handle this
2468
+ * with the cases above.
2469
+ */
2470
+ if ((output_format & PNG_FORMAT_FLAG_COLOR) == 0)
2471
+ {
2472
+ /* The color-map will be grayscale, so we may as well convert the
2473
+ * input RGB values to a simple grayscale and use the grayscale
2474
+ * code above.
2475
+ *
2476
+ * NOTE: calling this apparently damages the recognition of the
2477
+ * transparent color in background color handling; call
2478
+ * png_set_tRNS_to_alpha before png_set_background_fixed.
2479
+ */
2480
+ png_set_rgb_to_gray_fixed(png_ptr, PNG_ERROR_ACTION_NONE, -1,
2481
+ -1);
2482
+ data_encoding = P_sRGB;
2483
+
2484
+ /* The output will now be one or two 8-bit gray or gray+alpha
2485
+ * channels. The more complex case arises when the input has alpha.
2486
+ */
2487
+ if ((png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||
2488
+ png_ptr->num_trans > 0) &&
2489
+ (output_format & PNG_FORMAT_FLAG_ALPHA) != 0)
2490
+ {
2491
+ /* Both input and output have an alpha channel, so no background
2492
+ * processing is required; just map the GA bytes to the right
2493
+ * color-map entry.
2494
+ */
2495
+ expand_tRNS = 1;
2496
+
2497
+ if (PNG_GA_COLORMAP_ENTRIES > image->colormap_entries)
2498
+ png_error(png_ptr, "rgb[ga] color-map: too few entries");
2499
+
2500
+ cmap_entries = make_ga_colormap(display);
2501
+ background_index = PNG_CMAP_GA_BACKGROUND;
2502
+ output_processing = PNG_CMAP_GA;
2503
+ }
2504
+
2505
+ else
2506
+ {
2507
+ /* Either the input or the output has no alpha channel, so there
2508
+ * will be no non-opaque pixels in the color-map; it will just be
2509
+ * grayscale.
2510
+ */
2511
+ if (PNG_GRAY_COLORMAP_ENTRIES > image->colormap_entries)
2512
+ png_error(png_ptr, "rgb[gray] color-map: too few entries");
2513
+
2514
+ /* Ideally this code would use libpng to do the gamma correction,
2515
+ * but if an input alpha channel is to be removed we will hit the
2516
+ * libpng bug in gamma+compose+rgb-to-gray (the double gamma
2517
+ * correction bug). Fix this by dropping the gamma correction in
2518
+ * this case and doing it in the palette; this will result in
2519
+ * duplicate palette entries, but that's better than the
2520
+ * alternative of double gamma correction.
2521
+ */
2522
+ if ((png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||
2523
+ png_ptr->num_trans > 0) &&
2524
+ png_gamma_not_sRGB(png_ptr->colorspace.gamma) != 0)
2525
+ {
2526
+ cmap_entries = make_gray_file_colormap(display);
2527
+ data_encoding = P_FILE;
2528
+ }
2529
+
2530
+ else
2531
+ cmap_entries = make_gray_colormap(display);
2532
+
2533
+ /* But if the input has alpha or transparency it must be removed
2534
+ */
2535
+ if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||
2536
+ png_ptr->num_trans > 0)
2537
+ {
2538
+ png_color_16 c;
2539
+ png_uint_32 gray = back_g;
2540
+
2541
+ /* We need to ensure that the application background exists in
2542
+ * the colormap and that completely transparent pixels map to
2543
+ * it. Achieve this simply by ensuring that the entry
2544
+ * selected for the background really is the background color.
2545
+ */
2546
+ if (data_encoding == P_FILE) /* from the fixup above */
2547
+ {
2548
+ /* The app supplied a gray which is in output_encoding, we
2549
+ * need to convert it to a value of the input (P_FILE)
2550
+ * encoding then set this palette entry to the required
2551
+ * output encoding.
2552
+ */
2553
+ if (output_encoding == P_sRGB)
2554
+ gray = png_sRGB_table[gray]; /* now P_LINEAR */
2555
+
2556
+ gray = PNG_DIV257(png_gamma_16bit_correct(gray,
2557
+ png_ptr->colorspace.gamma)); /* now P_FILE */
2558
+
2559
+ /* And make sure the corresponding palette entry contains
2560
+ * exactly the required sRGB value.
2561
+ */
2562
+ png_create_colormap_entry(display, gray, back_g, back_g,
2563
+ back_g, 0/*unused*/, output_encoding);
2564
+ }
2565
+
2566
+ else if (output_encoding == P_LINEAR)
2567
+ {
2568
+ gray = PNG_sRGB_FROM_LINEAR(gray * 255);
2569
+
2570
+ /* And make sure the corresponding palette entry matches.
2571
+ */
2572
+ png_create_colormap_entry(display, gray, back_g, back_g,
2573
+ back_g, 0/*unused*/, P_LINEAR);
2574
+ }
2575
+
2576
+ /* The background passed to libpng, however, must be the
2577
+ * output (normally sRGB) value.
2578
+ */
2579
+ c.index = 0; /*unused*/
2580
+ c.gray = c.red = c.green = c.blue = (png_uint_16)gray;
2581
+
2582
+ /* NOTE: the following is apparently a bug in libpng. Without
2583
+ * it the transparent color recognition in
2584
+ * png_set_background_fixed seems to go wrong.
2585
+ */
2586
+ expand_tRNS = 1;
2587
+ png_set_background_fixed(png_ptr, &c,
2588
+ PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
2589
+ 0/*gamma: not used*/);
2590
+ }
2591
+
2592
+ output_processing = PNG_CMAP_NONE;
2593
+ }
2594
+ }
2595
+
2596
+ else /* output is color */
2597
+ {
2598
+ /* We could use png_quantize here so long as there is no transparent
2599
+ * color or alpha; png_quantize ignores alpha. Easier overall just
2600
+ * to do it once and using PNG_DIV51 on the 6x6x6 reduced RGB cube.
2601
+ * Consequently we always want libpng to produce sRGB data.
2602
+ */
2603
+ data_encoding = P_sRGB;
2604
+
2605
+ /* Is there any transparency or alpha? */
2606
+ if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||
2607
+ png_ptr->num_trans > 0)
2608
+ {
2609
+ /* Is there alpha in the output too? If so all four channels are
2610
+ * processed into a special RGB cube with alpha support.
2611
+ */
2612
+ if ((output_format & PNG_FORMAT_FLAG_ALPHA) != 0)
2613
+ {
2614
+ png_uint_32 r;
2615
+
2616
+ if (PNG_RGB_COLORMAP_ENTRIES+1+27 > image->colormap_entries)
2617
+ png_error(png_ptr, "rgb+alpha color-map: too few entries");
2618
+
2619
+ cmap_entries = make_rgb_colormap(display);
2620
+
2621
+ /* Add a transparent entry. */
2622
+ png_create_colormap_entry(display, cmap_entries, 255, 255,
2623
+ 255, 0, P_sRGB);
2624
+
2625
+ /* This is stored as the background index for the processing
2626
+ * algorithm.
2627
+ */
2628
+ background_index = cmap_entries++;
2629
+
2630
+ /* Add 27 r,g,b entries each with alpha 0.5. */
2631
+ for (r=0; r<256; r = (r << 1) | 0x7f)
2632
+ {
2633
+ png_uint_32 g;
2634
+
2635
+ for (g=0; g<256; g = (g << 1) | 0x7f)
2636
+ {
2637
+ png_uint_32 b;
2638
+
2639
+ /* This generates components with the values 0, 127 and
2640
+ * 255
2641
+ */
2642
+ for (b=0; b<256; b = (b << 1) | 0x7f)
2643
+ png_create_colormap_entry(display, cmap_entries++,
2644
+ r, g, b, 128, P_sRGB);
2645
+ }
2646
+ }
2647
+
2648
+ expand_tRNS = 1;
2649
+ output_processing = PNG_CMAP_RGB_ALPHA;
2650
+ }
2651
+
2652
+ else
2653
+ {
2654
+ /* Alpha/transparency must be removed. The background must
2655
+ * exist in the color map (achieved by setting adding it after
2656
+ * the 666 color-map). If the standard processing code will
2657
+ * pick up this entry automatically that's all that is
2658
+ * required; libpng can be called to do the background
2659
+ * processing.
2660
+ */
2661
+ unsigned int sample_size =
2662
+ PNG_IMAGE_SAMPLE_SIZE(output_format);
2663
+ png_uint_32 r, g, b; /* sRGB background */
2664
+
2665
+ if (PNG_RGB_COLORMAP_ENTRIES+1+27 > image->colormap_entries)
2666
+ png_error(png_ptr, "rgb-alpha color-map: too few entries");
2667
+
2668
+ cmap_entries = make_rgb_colormap(display);
2669
+
2670
+ png_create_colormap_entry(display, cmap_entries, back_r,
2671
+ back_g, back_b, 0/*unused*/, output_encoding);
2672
+
2673
+ if (output_encoding == P_LINEAR)
2674
+ {
2675
+ r = PNG_sRGB_FROM_LINEAR(back_r * 255);
2676
+ g = PNG_sRGB_FROM_LINEAR(back_g * 255);
2677
+ b = PNG_sRGB_FROM_LINEAR(back_b * 255);
2678
+ }
2679
+
2680
+ else
2681
+ {
2682
+ r = back_r;
2683
+ g = back_g;
2684
+ b = back_g;
2685
+ }
2686
+
2687
+ /* Compare the newly-created color-map entry with the one the
2688
+ * PNG_CMAP_RGB algorithm will use. If the two entries don't
2689
+ * match, add the new one and set this as the background
2690
+ * index.
2691
+ */
2692
+ if (memcmp((png_const_bytep)display->colormap +
2693
+ sample_size * cmap_entries,
2694
+ (png_const_bytep)display->colormap +
2695
+ sample_size * PNG_RGB_INDEX(r,g,b),
2696
+ sample_size) != 0)
2697
+ {
2698
+ /* The background color must be added. */
2699
+ background_index = cmap_entries++;
2700
+
2701
+ /* Add 27 r,g,b entries each with created by composing with
2702
+ * the background at alpha 0.5.
2703
+ */
2704
+ for (r=0; r<256; r = (r << 1) | 0x7f)
2705
+ {
2706
+ for (g=0; g<256; g = (g << 1) | 0x7f)
2707
+ {
2708
+ /* This generates components with the values 0, 127
2709
+ * and 255
2710
+ */
2711
+ for (b=0; b<256; b = (b << 1) | 0x7f)
2712
+ png_create_colormap_entry(display, cmap_entries++,
2713
+ png_colormap_compose(display, r, P_sRGB, 128,
2714
+ back_r, output_encoding),
2715
+ png_colormap_compose(display, g, P_sRGB, 128,
2716
+ back_g, output_encoding),
2717
+ png_colormap_compose(display, b, P_sRGB, 128,
2718
+ back_b, output_encoding),
2719
+ 0/*unused*/, output_encoding);
2720
+ }
2721
+ }
2722
+
2723
+ expand_tRNS = 1;
2724
+ output_processing = PNG_CMAP_RGB_ALPHA;
2725
+ }
2726
+
2727
+ else /* background color is in the standard color-map */
2728
+ {
2729
+ png_color_16 c;
2730
+
2731
+ c.index = 0; /*unused*/
2732
+ c.red = (png_uint_16)back_r;
2733
+ c.gray = c.green = (png_uint_16)back_g;
2734
+ c.blue = (png_uint_16)back_b;
2735
+
2736
+ png_set_background_fixed(png_ptr, &c,
2737
+ PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
2738
+ 0/*gamma: not used*/);
2739
+
2740
+ output_processing = PNG_CMAP_RGB;
2741
+ }
2742
+ }
2743
+ }
2744
+
2745
+ else /* no alpha or transparency in the input */
2746
+ {
2747
+ /* Alpha in the output is irrelevant, simply map the opaque input
2748
+ * pixels to the 6x6x6 color-map.
2749
+ */
2750
+ if (PNG_RGB_COLORMAP_ENTRIES > image->colormap_entries)
2751
+ png_error(png_ptr, "rgb color-map: too few entries");
2752
+
2753
+ cmap_entries = make_rgb_colormap(display);
2754
+ output_processing = PNG_CMAP_RGB;
2755
+ }
2756
+ }
2757
+ break;
2758
+
2759
+ case PNG_COLOR_TYPE_PALETTE:
2760
+ /* It's already got a color-map. It may be necessary to eliminate the
2761
+ * tRNS entries though.
2762
+ */
2763
+ {
2764
+ unsigned int num_trans = png_ptr->num_trans;
2765
+ png_const_bytep trans = num_trans > 0 ? png_ptr->trans_alpha : NULL;
2766
+ png_const_colorp colormap = png_ptr->palette;
2767
+ const int do_background = trans != NULL &&
2768
+ (output_format & PNG_FORMAT_FLAG_ALPHA) == 0;
2769
+ unsigned int i;
2770
+
2771
+ /* Just in case: */
2772
+ if (trans == NULL)
2773
+ num_trans = 0;
2774
+
2775
+ output_processing = PNG_CMAP_NONE;
2776
+ data_encoding = P_FILE; /* Don't change from color-map indices */
2777
+ cmap_entries = png_ptr->num_palette;
2778
+ if (cmap_entries > 256)
2779
+ cmap_entries = 256;
2780
+
2781
+ if (cmap_entries > image->colormap_entries)
2782
+ png_error(png_ptr, "palette color-map: too few entries");
2783
+
2784
+ for (i=0; i < cmap_entries; ++i)
2785
+ {
2786
+ if (do_background != 0 && i < num_trans && trans[i] < 255)
2787
+ {
2788
+ if (trans[i] == 0)
2789
+ png_create_colormap_entry(display, i, back_r, back_g,
2790
+ back_b, 0, output_encoding);
2791
+
2792
+ else
2793
+ {
2794
+ /* Must compose the PNG file color in the color-map entry
2795
+ * on the sRGB color in 'back'.
2796
+ */
2797
+ png_create_colormap_entry(display, i,
2798
+ png_colormap_compose(display, colormap[i].red, P_FILE,
2799
+ trans[i], back_r, output_encoding),
2800
+ png_colormap_compose(display, colormap[i].green, P_FILE,
2801
+ trans[i], back_g, output_encoding),
2802
+ png_colormap_compose(display, colormap[i].blue, P_FILE,
2803
+ trans[i], back_b, output_encoding),
2804
+ output_encoding == P_LINEAR ? trans[i] * 257U :
2805
+ trans[i],
2806
+ output_encoding);
2807
+ }
2808
+ }
2809
+
2810
+ else
2811
+ png_create_colormap_entry(display, i, colormap[i].red,
2812
+ colormap[i].green, colormap[i].blue,
2813
+ i < num_trans ? trans[i] : 255U, P_FILE/*8-bit*/);
2814
+ }
2815
+
2816
+ /* The PNG data may have indices packed in fewer than 8 bits, it
2817
+ * must be expanded if so.
2818
+ */
2819
+ if (png_ptr->bit_depth < 8)
2820
+ png_set_packing(png_ptr);
2821
+ }
2822
+ break;
2823
+
2824
+ default:
2825
+ png_error(png_ptr, "invalid PNG color type");
2826
+ /*NOT REACHED*/
2827
+ break;
2828
+ }
2829
+
2830
+ /* Now deal with the output processing */
2831
+ if (expand_tRNS != 0 && png_ptr->num_trans > 0 &&
2832
+ (png_ptr->color_type & PNG_COLOR_MASK_ALPHA) == 0)
2833
+ png_set_tRNS_to_alpha(png_ptr);
2834
+
2835
+ switch (data_encoding)
2836
+ {
2837
+ default:
2838
+ png_error(png_ptr, "bad data option (internal error)");
2839
+ break;
2840
+
2841
+ case P_sRGB:
2842
+ /* Change to 8-bit sRGB */
2843
+ png_set_alpha_mode_fixed(png_ptr, PNG_ALPHA_PNG, PNG_GAMMA_sRGB);
2844
+ /* FALL THROUGH */
2845
+
2846
+ case P_FILE:
2847
+ if (png_ptr->bit_depth > 8)
2848
+ png_set_scale_16(png_ptr);
2849
+ break;
2850
+ }
2851
+
2852
+ if (cmap_entries > 256 || cmap_entries > image->colormap_entries)
2853
+ png_error(png_ptr, "color map overflow (BAD internal error)");
2854
+
2855
+ image->colormap_entries = cmap_entries;
2856
+
2857
+ /* Double check using the recorded background index */
2858
+ switch (output_processing)
2859
+ {
2860
+ case PNG_CMAP_NONE:
2861
+ if (background_index != PNG_CMAP_NONE_BACKGROUND)
2862
+ goto bad_background;
2863
+ break;
2864
+
2865
+ case PNG_CMAP_GA:
2866
+ if (background_index != PNG_CMAP_GA_BACKGROUND)
2867
+ goto bad_background;
2868
+ break;
2869
+
2870
+ case PNG_CMAP_TRANS:
2871
+ if (background_index >= cmap_entries ||
2872
+ background_index != PNG_CMAP_TRANS_BACKGROUND)
2873
+ goto bad_background;
2874
+ break;
2875
+
2876
+ case PNG_CMAP_RGB:
2877
+ if (background_index != PNG_CMAP_RGB_BACKGROUND)
2878
+ goto bad_background;
2879
+ break;
2880
+
2881
+ case PNG_CMAP_RGB_ALPHA:
2882
+ if (background_index != PNG_CMAP_RGB_ALPHA_BACKGROUND)
2883
+ goto bad_background;
2884
+ break;
2885
+
2886
+ default:
2887
+ png_error(png_ptr, "bad processing option (internal error)");
2888
+
2889
+ bad_background:
2890
+ png_error(png_ptr, "bad background index (internal error)");
2891
+ }
2892
+
2893
+ display->colormap_processing = output_processing;
2894
+
2895
+ return 1/*ok*/;
2896
+ }
2897
+
2898
+ /* The final part of the color-map read called from png_image_finish_read. */
2899
+ static int
2900
+ png_image_read_and_map(png_voidp argument)
2901
+ {
2902
+ png_image_read_control *display = png_voidcast(png_image_read_control*,
2903
+ argument);
2904
+ png_imagep image = display->image;
2905
+ png_structrp png_ptr = image->opaque->png_ptr;
2906
+ int passes;
2907
+
2908
+ /* Called when the libpng data must be transformed into the color-mapped
2909
+ * form. There is a local row buffer in display->local and this routine must
2910
+ * do the interlace handling.
2911
+ */
2912
+ switch (png_ptr->interlaced)
2913
+ {
2914
+ case PNG_INTERLACE_NONE:
2915
+ passes = 1;
2916
+ break;
2917
+
2918
+ case PNG_INTERLACE_ADAM7:
2919
+ passes = PNG_INTERLACE_ADAM7_PASSES;
2920
+ break;
2921
+
2922
+ default:
2923
+ png_error(png_ptr, "unknown interlace type");
2924
+ }
2925
+
2926
+ {
2927
+ png_uint_32 height = image->height;
2928
+ png_uint_32 width = image->width;
2929
+ int proc = display->colormap_processing;
2930
+ png_bytep first_row = png_voidcast(png_bytep, display->first_row);
2931
+ ptrdiff_t step_row = display->row_bytes;
2932
+ int pass;
2933
+
2934
+ for (pass = 0; pass < passes; ++pass)
2935
+ {
2936
+ unsigned int startx, stepx, stepy;
2937
+ png_uint_32 y;
2938
+
2939
+ if (png_ptr->interlaced == PNG_INTERLACE_ADAM7)
2940
+ {
2941
+ /* The row may be empty for a short image: */
2942
+ if (PNG_PASS_COLS(width, pass) == 0)
2943
+ continue;
2944
+
2945
+ startx = PNG_PASS_START_COL(pass);
2946
+ stepx = PNG_PASS_COL_OFFSET(pass);
2947
+ y = PNG_PASS_START_ROW(pass);
2948
+ stepy = PNG_PASS_ROW_OFFSET(pass);
2949
+ }
2950
+
2951
+ else
2952
+ {
2953
+ y = 0;
2954
+ startx = 0;
2955
+ stepx = stepy = 1;
2956
+ }
2957
+
2958
+ for (; y<height; y += stepy)
2959
+ {
2960
+ png_bytep inrow = png_voidcast(png_bytep, display->local_row);
2961
+ png_bytep outrow = first_row + y * step_row;
2962
+ png_const_bytep end_row = outrow + width;
2963
+
2964
+ /* Read read the libpng data into the temporary buffer. */
2965
+ png_read_row(png_ptr, inrow, NULL);
2966
+
2967
+ /* Now process the row according to the processing option, note
2968
+ * that the caller verifies that the format of the libpng output
2969
+ * data is as required.
2970
+ */
2971
+ outrow += startx;
2972
+ switch (proc)
2973
+ {
2974
+ case PNG_CMAP_GA:
2975
+ for (; outrow < end_row; outrow += stepx)
2976
+ {
2977
+ /* The data is always in the PNG order */
2978
+ unsigned int gray = *inrow++;
2979
+ unsigned int alpha = *inrow++;
2980
+ unsigned int entry;
2981
+
2982
+ /* NOTE: this code is copied as a comment in
2983
+ * make_ga_colormap above. Please update the
2984
+ * comment if you change this code!
2985
+ */
2986
+ if (alpha > 229) /* opaque */
2987
+ {
2988
+ entry = (231 * gray + 128) >> 8;
2989
+ }
2990
+ else if (alpha < 26) /* transparent */
2991
+ {
2992
+ entry = 231;
2993
+ }
2994
+ else /* partially opaque */
2995
+ {
2996
+ entry = 226 + 6 * PNG_DIV51(alpha) + PNG_DIV51(gray);
2997
+ }
2998
+
2999
+ *outrow = (png_byte)entry;
3000
+ }
3001
+ break;
3002
+
3003
+ case PNG_CMAP_TRANS:
3004
+ for (; outrow < end_row; outrow += stepx)
3005
+ {
3006
+ png_byte gray = *inrow++;
3007
+ png_byte alpha = *inrow++;
3008
+
3009
+ if (alpha == 0)
3010
+ *outrow = PNG_CMAP_TRANS_BACKGROUND;
3011
+
3012
+ else if (gray != PNG_CMAP_TRANS_BACKGROUND)
3013
+ *outrow = gray;
3014
+
3015
+ else
3016
+ *outrow = (png_byte)(PNG_CMAP_TRANS_BACKGROUND+1);
3017
+ }
3018
+ break;
3019
+
3020
+ case PNG_CMAP_RGB:
3021
+ for (; outrow < end_row; outrow += stepx)
3022
+ {
3023
+ *outrow = PNG_RGB_INDEX(inrow[0], inrow[1], inrow[2]);
3024
+ inrow += 3;
3025
+ }
3026
+ break;
3027
+
3028
+ case PNG_CMAP_RGB_ALPHA:
3029
+ for (; outrow < end_row; outrow += stepx)
3030
+ {
3031
+ unsigned int alpha = inrow[3];
3032
+
3033
+ /* Because the alpha entries only hold alpha==0.5 values
3034
+ * split the processing at alpha==0.25 (64) and 0.75
3035
+ * (196).
3036
+ */
3037
+
3038
+ if (alpha >= 196)
3039
+ *outrow = PNG_RGB_INDEX(inrow[0], inrow[1],
3040
+ inrow[2]);
3041
+
3042
+ else if (alpha < 64)
3043
+ *outrow = PNG_CMAP_RGB_ALPHA_BACKGROUND;
3044
+
3045
+ else
3046
+ {
3047
+ /* Likewise there are three entries for each of r, g
3048
+ * and b. We could select the entry by popcount on
3049
+ * the top two bits on those architectures that
3050
+ * support it, this is what the code below does,
3051
+ * crudely.
3052
+ */
3053
+ unsigned int back_i = PNG_CMAP_RGB_ALPHA_BACKGROUND+1;
3054
+
3055
+ /* Here are how the values map:
3056
+ *
3057
+ * 0x00 .. 0x3f -> 0
3058
+ * 0x40 .. 0xbf -> 1
3059
+ * 0xc0 .. 0xff -> 2
3060
+ *
3061
+ * So, as above with the explicit alpha checks, the
3062
+ * breakpoints are at 64 and 196.
3063
+ */
3064
+ if (inrow[0] & 0x80) back_i += 9; /* red */
3065
+ if (inrow[0] & 0x40) back_i += 9;
3066
+ if (inrow[0] & 0x80) back_i += 3; /* green */
3067
+ if (inrow[0] & 0x40) back_i += 3;
3068
+ if (inrow[0] & 0x80) back_i += 1; /* blue */
3069
+ if (inrow[0] & 0x40) back_i += 1;
3070
+
3071
+ *outrow = (png_byte)back_i;
3072
+ }
3073
+
3074
+ inrow += 4;
3075
+ }
3076
+ break;
3077
+
3078
+ default:
3079
+ break;
3080
+ }
3081
+ }
3082
+ }
3083
+ }
3084
+
3085
+ return 1;
3086
+ }
3087
+
3088
+ static int
3089
+ png_image_read_colormapped(png_voidp argument)
3090
+ {
3091
+ png_image_read_control *display = png_voidcast(png_image_read_control*,
3092
+ argument);
3093
+ png_imagep image = display->image;
3094
+ png_controlp control = image->opaque;
3095
+ png_structrp png_ptr = control->png_ptr;
3096
+ png_inforp info_ptr = control->info_ptr;
3097
+
3098
+ int passes = 0; /* As a flag */
3099
+
3100
+ PNG_SKIP_CHUNKS(png_ptr);
3101
+
3102
+ /* Update the 'info' structure and make sure the result is as required; first
3103
+ * make sure to turn on the interlace handling if it will be required
3104
+ * (because it can't be turned on *after* the call to png_read_update_info!)
3105
+ */
3106
+ if (display->colormap_processing == PNG_CMAP_NONE)
3107
+ passes = png_set_interlace_handling(png_ptr);
3108
+
3109
+ png_read_update_info(png_ptr, info_ptr);
3110
+
3111
+ /* The expected output can be deduced from the colormap_processing option. */
3112
+ switch (display->colormap_processing)
3113
+ {
3114
+ case PNG_CMAP_NONE:
3115
+ /* Output must be one channel and one byte per pixel, the output
3116
+ * encoding can be anything.
3117
+ */
3118
+ if ((info_ptr->color_type == PNG_COLOR_TYPE_PALETTE ||
3119
+ info_ptr->color_type == PNG_COLOR_TYPE_GRAY) &&
3120
+ info_ptr->bit_depth == 8)
3121
+ break;
3122
+
3123
+ goto bad_output;
3124
+
3125
+ case PNG_CMAP_TRANS:
3126
+ case PNG_CMAP_GA:
3127
+ /* Output must be two channels and the 'G' one must be sRGB, the latter
3128
+ * can be checked with an exact number because it should have been set
3129
+ * to this number above!
3130
+ */
3131
+ if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
3132
+ info_ptr->bit_depth == 8 &&
3133
+ png_ptr->screen_gamma == PNG_GAMMA_sRGB &&
3134
+ image->colormap_entries == 256)
3135
+ break;
3136
+
3137
+ goto bad_output;
3138
+
3139
+ case PNG_CMAP_RGB:
3140
+ /* Output must be 8-bit sRGB encoded RGB */
3141
+ if (info_ptr->color_type == PNG_COLOR_TYPE_RGB &&
3142
+ info_ptr->bit_depth == 8 &&
3143
+ png_ptr->screen_gamma == PNG_GAMMA_sRGB &&
3144
+ image->colormap_entries == 216)
3145
+ break;
3146
+
3147
+ goto bad_output;
3148
+
3149
+ case PNG_CMAP_RGB_ALPHA:
3150
+ /* Output must be 8-bit sRGB encoded RGBA */
3151
+ if (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&
3152
+ info_ptr->bit_depth == 8 &&
3153
+ png_ptr->screen_gamma == PNG_GAMMA_sRGB &&
3154
+ image->colormap_entries == 244 /* 216 + 1 + 27 */)
3155
+ break;
3156
+
3157
+ /* goto bad_output; */
3158
+ /* FALL THROUGH */
3159
+
3160
+ default:
3161
+ bad_output:
3162
+ png_error(png_ptr, "bad color-map processing (internal error)");
3163
+ }
3164
+
3165
+ /* Now read the rows. Do this here if it is possible to read directly into
3166
+ * the output buffer, otherwise allocate a local row buffer of the maximum
3167
+ * size libpng requires and call the relevant processing routine safely.
3168
+ */
3169
+ {
3170
+ png_voidp first_row = display->buffer;
3171
+ ptrdiff_t row_bytes = display->row_stride;
3172
+
3173
+ /* The following expression is designed to work correctly whether it gives
3174
+ * a signed or an unsigned result.
3175
+ */
3176
+ if (row_bytes < 0)
3177
+ {
3178
+ char *ptr = png_voidcast(char*, first_row);
3179
+ ptr += (image->height-1) * (-row_bytes);
3180
+ first_row = png_voidcast(png_voidp, ptr);
3181
+ }
3182
+
3183
+ display->first_row = first_row;
3184
+ display->row_bytes = row_bytes;
3185
+ }
3186
+
3187
+ if (passes == 0)
3188
+ {
3189
+ int result;
3190
+ png_voidp row = png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr));
3191
+
3192
+ display->local_row = row;
3193
+ result = png_safe_execute(image, png_image_read_and_map, display);
3194
+ display->local_row = NULL;
3195
+ png_free(png_ptr, row);
3196
+
3197
+ return result;
3198
+ }
3199
+
3200
+ else
3201
+ {
3202
+ png_alloc_size_t row_bytes = display->row_bytes;
3203
+
3204
+ while (--passes >= 0)
3205
+ {
3206
+ png_uint_32 y = image->height;
3207
+ png_bytep row = png_voidcast(png_bytep, display->first_row);
3208
+
3209
+ while (y-- > 0)
3210
+ {
3211
+ png_read_row(png_ptr, row, NULL);
3212
+ row += row_bytes;
3213
+ }
3214
+ }
3215
+
3216
+ return 1;
3217
+ }
3218
+ }
3219
+
3220
+ /* Just the row reading part of png_image_read. */
3221
+ static int
3222
+ png_image_read_composite(png_voidp argument)
3223
+ {
3224
+ png_image_read_control *display = png_voidcast(png_image_read_control*,
3225
+ argument);
3226
+ png_imagep image = display->image;
3227
+ png_structrp png_ptr = image->opaque->png_ptr;
3228
+ int passes;
3229
+
3230
+ switch (png_ptr->interlaced)
3231
+ {
3232
+ case PNG_INTERLACE_NONE:
3233
+ passes = 1;
3234
+ break;
3235
+
3236
+ case PNG_INTERLACE_ADAM7:
3237
+ passes = PNG_INTERLACE_ADAM7_PASSES;
3238
+ break;
3239
+
3240
+ default:
3241
+ png_error(png_ptr, "unknown interlace type");
3242
+ }
3243
+
3244
+ {
3245
+ png_uint_32 height = image->height;
3246
+ png_uint_32 width = image->width;
3247
+ ptrdiff_t step_row = display->row_bytes;
3248
+ unsigned int channels =
3249
+ (image->format & PNG_FORMAT_FLAG_COLOR) != 0 ? 3 : 1;
3250
+ int pass;
3251
+
3252
+ for (pass = 0; pass < passes; ++pass)
3253
+ {
3254
+ unsigned int startx, stepx, stepy;
3255
+ png_uint_32 y;
3256
+
3257
+ if (png_ptr->interlaced == PNG_INTERLACE_ADAM7)
3258
+ {
3259
+ /* The row may be empty for a short image: */
3260
+ if (PNG_PASS_COLS(width, pass) == 0)
3261
+ continue;
3262
+
3263
+ startx = PNG_PASS_START_COL(pass) * channels;
3264
+ stepx = PNG_PASS_COL_OFFSET(pass) * channels;
3265
+ y = PNG_PASS_START_ROW(pass);
3266
+ stepy = PNG_PASS_ROW_OFFSET(pass);
3267
+ }
3268
+
3269
+ else
3270
+ {
3271
+ y = 0;
3272
+ startx = 0;
3273
+ stepx = channels;
3274
+ stepy = 1;
3275
+ }
3276
+
3277
+ for (; y<height; y += stepy)
3278
+ {
3279
+ png_bytep inrow = png_voidcast(png_bytep, display->local_row);
3280
+ png_bytep outrow;
3281
+ png_const_bytep end_row;
3282
+
3283
+ /* Read the row, which is packed: */
3284
+ png_read_row(png_ptr, inrow, NULL);
3285
+
3286
+ outrow = png_voidcast(png_bytep, display->first_row);
3287
+ outrow += y * step_row;
3288
+ end_row = outrow + width * channels;
3289
+
3290
+ /* Now do the composition on each pixel in this row. */
3291
+ outrow += startx;
3292
+ for (; outrow < end_row; outrow += stepx)
3293
+ {
3294
+ png_byte alpha = inrow[channels];
3295
+
3296
+ if (alpha > 0) /* else no change to the output */
3297
+ {
3298
+ unsigned int c;
3299
+
3300
+ for (c=0; c<channels; ++c)
3301
+ {
3302
+ png_uint_32 component = inrow[c];
3303
+
3304
+ if (alpha < 255) /* else just use component */
3305
+ {
3306
+ /* This is PNG_OPTIMIZED_ALPHA, the component value
3307
+ * is a linear 8-bit value. Combine this with the
3308
+ * current outrow[c] value which is sRGB encoded.
3309
+ * Arithmetic here is 16-bits to preserve the output
3310
+ * values correctly.
3311
+ */
3312
+ component *= 257*255; /* =65535 */
3313
+ component += (255-alpha)*png_sRGB_table[outrow[c]];
3314
+
3315
+ /* So 'component' is scaled by 255*65535 and is
3316
+ * therefore appropriate for the sRGB to linear
3317
+ * conversion table.
3318
+ */
3319
+ component = PNG_sRGB_FROM_LINEAR(component);
3320
+ }
3321
+
3322
+ outrow[c] = (png_byte)component;
3323
+ }
3324
+ }
3325
+
3326
+ inrow += channels+1; /* components and alpha channel */
3327
+ }
3328
+ }
3329
+ }
3330
+ }
3331
+
3332
+ return 1;
3333
+ }
3334
+
3335
+ /* The do_local_background case; called when all the following transforms are to
3336
+ * be done:
3337
+ *
3338
+ * PNG_RGB_TO_GRAY
3339
+ * PNG_COMPOSITE
3340
+ * PNG_GAMMA
3341
+ *
3342
+ * This is a work-around for the fact that both the PNG_RGB_TO_GRAY and
3343
+ * PNG_COMPOSITE code performs gamma correction, so we get double gamma
3344
+ * correction. The fix-up is to prevent the PNG_COMPOSITE operation from
3345
+ * happening inside libpng, so this routine sees an 8 or 16-bit gray+alpha
3346
+ * row and handles the removal or pre-multiplication of the alpha channel.
3347
+ */
3348
+ static int
3349
+ png_image_read_background(png_voidp argument)
3350
+ {
3351
+ png_image_read_control *display = png_voidcast(png_image_read_control*,
3352
+ argument);
3353
+ png_imagep image = display->image;
3354
+ png_structrp png_ptr = image->opaque->png_ptr;
3355
+ png_inforp info_ptr = image->opaque->info_ptr;
3356
+ png_uint_32 height = image->height;
3357
+ png_uint_32 width = image->width;
3358
+ int pass, passes;
3359
+
3360
+ /* Double check the convoluted logic below. We expect to get here with
3361
+ * libpng doing rgb to gray and gamma correction but background processing
3362
+ * left to the png_image_read_background function. The rows libpng produce
3363
+ * might be 8 or 16-bit but should always have two channels; gray plus alpha.
3364
+ */
3365
+ if ((png_ptr->transformations & PNG_RGB_TO_GRAY) == 0)
3366
+ png_error(png_ptr, "lost rgb to gray");
3367
+
3368
+ if ((png_ptr->transformations & PNG_COMPOSE) != 0)
3369
+ png_error(png_ptr, "unexpected compose");
3370
+
3371
+ if (png_get_channels(png_ptr, info_ptr) != 2)
3372
+ png_error(png_ptr, "lost/gained channels");
3373
+
3374
+ /* Expect the 8-bit case to always remove the alpha channel */
3375
+ if ((image->format & PNG_FORMAT_FLAG_LINEAR) == 0 &&
3376
+ (image->format & PNG_FORMAT_FLAG_ALPHA) != 0)
3377
+ png_error(png_ptr, "unexpected 8-bit transformation");
3378
+
3379
+ switch (png_ptr->interlaced)
3380
+ {
3381
+ case PNG_INTERLACE_NONE:
3382
+ passes = 1;
3383
+ break;
3384
+
3385
+ case PNG_INTERLACE_ADAM7:
3386
+ passes = PNG_INTERLACE_ADAM7_PASSES;
3387
+ break;
3388
+
3389
+ default:
3390
+ png_error(png_ptr, "unknown interlace type");
3391
+ }
3392
+
3393
+ /* Use direct access to info_ptr here because otherwise the simplified API
3394
+ * would require PNG_EASY_ACCESS_SUPPORTED (just for this.) Note this is
3395
+ * checking the value after libpng expansions, not the original value in the
3396
+ * PNG.
3397
+ */
3398
+ switch (info_ptr->bit_depth)
3399
+ {
3400
+ default:
3401
+ png_error(png_ptr, "unexpected bit depth");
3402
+ break;
3403
+
3404
+ case 8:
3405
+ /* 8-bit sRGB gray values with an alpha channel; the alpha channel is
3406
+ * to be removed by composing on a background: either the row if
3407
+ * display->background is NULL or display->background->green if not.
3408
+ * Unlike the code above ALPHA_OPTIMIZED has *not* been done.
3409
+ */
3410
+ {
3411
+ png_bytep first_row = png_voidcast(png_bytep, display->first_row);
3412
+ ptrdiff_t step_row = display->row_bytes;
3413
+
3414
+ for (pass = 0; pass < passes; ++pass)
3415
+ {
3416
+ png_bytep row = png_voidcast(png_bytep,
3417
+ display->first_row);
3418
+ unsigned int startx, stepx, stepy;
3419
+ png_uint_32 y;
3420
+
3421
+ if (png_ptr->interlaced == PNG_INTERLACE_ADAM7)
3422
+ {
3423
+ /* The row may be empty for a short image: */
3424
+ if (PNG_PASS_COLS(width, pass) == 0)
3425
+ continue;
3426
+
3427
+ startx = PNG_PASS_START_COL(pass);
3428
+ stepx = PNG_PASS_COL_OFFSET(pass);
3429
+ y = PNG_PASS_START_ROW(pass);
3430
+ stepy = PNG_PASS_ROW_OFFSET(pass);
3431
+ }
3432
+
3433
+ else
3434
+ {
3435
+ y = 0;
3436
+ startx = 0;
3437
+ stepx = stepy = 1;
3438
+ }
3439
+
3440
+ if (display->background == NULL)
3441
+ {
3442
+ for (; y<height; y += stepy)
3443
+ {
3444
+ png_bytep inrow = png_voidcast(png_bytep,
3445
+ display->local_row);
3446
+ png_bytep outrow = first_row + y * step_row;
3447
+ png_const_bytep end_row = outrow + width;
3448
+
3449
+ /* Read the row, which is packed: */
3450
+ png_read_row(png_ptr, inrow, NULL);
3451
+
3452
+ /* Now do the composition on each pixel in this row. */
3453
+ outrow += startx;
3454
+ for (; outrow < end_row; outrow += stepx)
3455
+ {
3456
+ png_byte alpha = inrow[1];
3457
+
3458
+ if (alpha > 0) /* else no change to the output */
3459
+ {
3460
+ png_uint_32 component = inrow[0];
3461
+
3462
+ if (alpha < 255) /* else just use component */
3463
+ {
3464
+ /* Since PNG_OPTIMIZED_ALPHA was not set it is
3465
+ * necessary to invert the sRGB transfer
3466
+ * function and multiply the alpha out.
3467
+ */
3468
+ component = png_sRGB_table[component] * alpha;
3469
+ component += png_sRGB_table[outrow[0]] *
3470
+ (255-alpha);
3471
+ component = PNG_sRGB_FROM_LINEAR(component);
3472
+ }
3473
+
3474
+ outrow[0] = (png_byte)component;
3475
+ }
3476
+
3477
+ inrow += 2; /* gray and alpha channel */
3478
+ }
3479
+ }
3480
+ }
3481
+
3482
+ else /* constant background value */
3483
+ {
3484
+ png_byte background8 = display->background->green;
3485
+ png_uint_16 background = png_sRGB_table[background8];
3486
+
3487
+ for (; y<height; y += stepy)
3488
+ {
3489
+ png_bytep inrow = png_voidcast(png_bytep,
3490
+ display->local_row);
3491
+ png_bytep outrow = first_row + y * step_row;
3492
+ png_const_bytep end_row = outrow + width;
3493
+
3494
+ /* Read the row, which is packed: */
3495
+ png_read_row(png_ptr, inrow, NULL);
3496
+
3497
+ /* Now do the composition on each pixel in this row. */
3498
+ outrow += startx;
3499
+ for (; outrow < end_row; outrow += stepx)
3500
+ {
3501
+ png_byte alpha = inrow[1];
3502
+
3503
+ if (alpha > 0) /* else use background */
3504
+ {
3505
+ png_uint_32 component = inrow[0];
3506
+
3507
+ if (alpha < 255) /* else just use component */
3508
+ {
3509
+ component = png_sRGB_table[component] * alpha;
3510
+ component += background * (255-alpha);
3511
+ component = PNG_sRGB_FROM_LINEAR(component);
3512
+ }
3513
+
3514
+ outrow[0] = (png_byte)component;
3515
+ }
3516
+
3517
+ else
3518
+ outrow[0] = background8;
3519
+
3520
+ inrow += 2; /* gray and alpha channel */
3521
+ }
3522
+
3523
+ row += display->row_bytes;
3524
+ }
3525
+ }
3526
+ }
3527
+ }
3528
+ break;
3529
+
3530
+ case 16:
3531
+ /* 16-bit linear with pre-multiplied alpha; the pre-multiplication must
3532
+ * still be done and, maybe, the alpha channel removed. This code also
3533
+ * handles the alpha-first option.
3534
+ */
3535
+ {
3536
+ png_uint_16p first_row = png_voidcast(png_uint_16p,
3537
+ display->first_row);
3538
+ /* The division by two is safe because the caller passed in a
3539
+ * stride which was multiplied by 2 (below) to get row_bytes.
3540
+ */
3541
+ ptrdiff_t step_row = display->row_bytes / 2;
3542
+ int preserve_alpha = (image->format & PNG_FORMAT_FLAG_ALPHA) != 0;
3543
+ unsigned int outchannels = 1+preserve_alpha;
3544
+ int swap_alpha = 0;
3545
+
3546
+ # ifdef PNG_SIMPLIFIED_READ_AFIRST_SUPPORTED
3547
+ if (preserve_alpha != 0 &&
3548
+ (image->format & PNG_FORMAT_FLAG_AFIRST) != 0)
3549
+ swap_alpha = 1;
3550
+ # endif
3551
+
3552
+ for (pass = 0; pass < passes; ++pass)
3553
+ {
3554
+ unsigned int startx, stepx, stepy;
3555
+ png_uint_32 y;
3556
+
3557
+ /* The 'x' start and step are adjusted to output components here.
3558
+ */
3559
+ if (png_ptr->interlaced == PNG_INTERLACE_ADAM7)
3560
+ {
3561
+ /* The row may be empty for a short image: */
3562
+ if (PNG_PASS_COLS(width, pass) == 0)
3563
+ continue;
3564
+
3565
+ startx = PNG_PASS_START_COL(pass) * outchannels;
3566
+ stepx = PNG_PASS_COL_OFFSET(pass) * outchannels;
3567
+ y = PNG_PASS_START_ROW(pass);
3568
+ stepy = PNG_PASS_ROW_OFFSET(pass);
3569
+ }
3570
+
3571
+ else
3572
+ {
3573
+ y = 0;
3574
+ startx = 0;
3575
+ stepx = outchannels;
3576
+ stepy = 1;
3577
+ }
3578
+
3579
+ for (; y<height; y += stepy)
3580
+ {
3581
+ png_const_uint_16p inrow;
3582
+ png_uint_16p outrow = first_row + y*step_row;
3583
+ png_uint_16p end_row = outrow + width * outchannels;
3584
+
3585
+ /* Read the row, which is packed: */
3586
+ png_read_row(png_ptr, png_voidcast(png_bytep,
3587
+ display->local_row), NULL);
3588
+ inrow = png_voidcast(png_const_uint_16p, display->local_row);
3589
+
3590
+ /* Now do the pre-multiplication on each pixel in this row.
3591
+ */
3592
+ outrow += startx;
3593
+ for (; outrow < end_row; outrow += stepx)
3594
+ {
3595
+ png_uint_32 component = inrow[0];
3596
+ png_uint_16 alpha = inrow[1];
3597
+
3598
+ if (alpha > 0) /* else 0 */
3599
+ {
3600
+ if (alpha < 65535) /* else just use component */
3601
+ {
3602
+ component *= alpha;
3603
+ component += 32767;
3604
+ component /= 65535;
3605
+ }
3606
+ }
3607
+
3608
+ else
3609
+ component = 0;
3610
+
3611
+ outrow[swap_alpha] = (png_uint_16)component;
3612
+ if (preserve_alpha != 0)
3613
+ outrow[1 ^ swap_alpha] = alpha;
3614
+
3615
+ inrow += 2; /* components and alpha channel */
3616
+ }
3617
+ }
3618
+ }
3619
+ }
3620
+ break;
3621
+ }
3622
+
3623
+ return 1;
3624
+ }
3625
+
3626
+ /* The guts of png_image_finish_read as a png_safe_execute callback. */
3627
+ static int
3628
+ png_image_read_direct(png_voidp argument)
3629
+ {
3630
+ png_image_read_control *display = png_voidcast(png_image_read_control*,
3631
+ argument);
3632
+ png_imagep image = display->image;
3633
+ png_structrp png_ptr = image->opaque->png_ptr;
3634
+ png_inforp info_ptr = image->opaque->info_ptr;
3635
+
3636
+ png_uint_32 format = image->format;
3637
+ int linear = (format & PNG_FORMAT_FLAG_LINEAR) != 0;
3638
+ int do_local_compose = 0;
3639
+ int do_local_background = 0; /* to avoid double gamma correction bug */
3640
+ int passes = 0;
3641
+
3642
+ /* Add transforms to ensure the correct output format is produced then check
3643
+ * that the required implementation support is there. Always expand; always
3644
+ * need 8 bits minimum, no palette and expanded tRNS.
3645
+ */
3646
+ png_set_expand(png_ptr);
3647
+
3648
+ /* Now check the format to see if it was modified. */
3649
+ {
3650
+ png_uint_32 base_format = png_image_format(png_ptr) &
3651
+ ~PNG_FORMAT_FLAG_COLORMAP /* removed by png_set_expand */;
3652
+ png_uint_32 change = format ^ base_format;
3653
+ png_fixed_point output_gamma;
3654
+ int mode; /* alpha mode */
3655
+
3656
+ /* Do this first so that we have a record if rgb to gray is happening. */
3657
+ if ((change & PNG_FORMAT_FLAG_COLOR) != 0)
3658
+ {
3659
+ /* gray<->color transformation required. */
3660
+ if ((format & PNG_FORMAT_FLAG_COLOR) != 0)
3661
+ png_set_gray_to_rgb(png_ptr);
3662
+
3663
+ else
3664
+ {
3665
+ /* libpng can't do both rgb to gray and
3666
+ * background/pre-multiplication if there is also significant gamma
3667
+ * correction, because both operations require linear colors and
3668
+ * the code only supports one transform doing the gamma correction.
3669
+ * Handle this by doing the pre-multiplication or background
3670
+ * operation in this code, if necessary.
3671
+ *
3672
+ * TODO: fix this by rewriting pngrtran.c (!)
3673
+ *
3674
+ * For the moment (given that fixing this in pngrtran.c is an
3675
+ * enormous change) 'do_local_background' is used to indicate that
3676
+ * the problem exists.
3677
+ */
3678
+ if ((base_format & PNG_FORMAT_FLAG_ALPHA) != 0)
3679
+ do_local_background = 1/*maybe*/;
3680
+
3681
+ png_set_rgb_to_gray_fixed(png_ptr, PNG_ERROR_ACTION_NONE,
3682
+ PNG_RGB_TO_GRAY_DEFAULT, PNG_RGB_TO_GRAY_DEFAULT);
3683
+ }
3684
+
3685
+ change &= ~PNG_FORMAT_FLAG_COLOR;
3686
+ }
3687
+
3688
+ /* Set the gamma appropriately, linear for 16-bit input, sRGB otherwise.
3689
+ */
3690
+ {
3691
+ png_fixed_point input_gamma_default;
3692
+
3693
+ if ((base_format & PNG_FORMAT_FLAG_LINEAR) != 0 &&
3694
+ (image->flags & PNG_IMAGE_FLAG_16BIT_sRGB) == 0)
3695
+ input_gamma_default = PNG_GAMMA_LINEAR;
3696
+ else
3697
+ input_gamma_default = PNG_DEFAULT_sRGB;
3698
+
3699
+ /* Call png_set_alpha_mode to set the default for the input gamma; the
3700
+ * output gamma is set by a second call below.
3701
+ */
3702
+ png_set_alpha_mode_fixed(png_ptr, PNG_ALPHA_PNG, input_gamma_default);
3703
+ }
3704
+
3705
+ if (linear != 0)
3706
+ {
3707
+ /* If there *is* an alpha channel in the input it must be multiplied
3708
+ * out; use PNG_ALPHA_STANDARD, otherwise just use PNG_ALPHA_PNG.
3709
+ */
3710
+ if ((base_format & PNG_FORMAT_FLAG_ALPHA) != 0)
3711
+ mode = PNG_ALPHA_STANDARD; /* associated alpha */
3712
+
3713
+ else
3714
+ mode = PNG_ALPHA_PNG;
3715
+
3716
+ output_gamma = PNG_GAMMA_LINEAR;
3717
+ }
3718
+
3719
+ else
3720
+ {
3721
+ mode = PNG_ALPHA_PNG;
3722
+ output_gamma = PNG_DEFAULT_sRGB;
3723
+ }
3724
+
3725
+ /* If 'do_local_background' is set check for the presence of gamma
3726
+ * correction; this is part of the work-round for the libpng bug
3727
+ * described above.
3728
+ *
3729
+ * TODO: fix libpng and remove this.
3730
+ */
3731
+ if (do_local_background != 0)
3732
+ {
3733
+ png_fixed_point gtest;
3734
+
3735
+ /* This is 'png_gamma_threshold' from pngrtran.c; the test used for
3736
+ * gamma correction, the screen gamma hasn't been set on png_struct
3737
+ * yet; it's set below. png_struct::gamma, however, is set to the
3738
+ * final value.
3739
+ */
3740
+ if (png_muldiv(&gtest, output_gamma, png_ptr->colorspace.gamma,
3741
+ PNG_FP_1) != 0 && png_gamma_significant(gtest) == 0)
3742
+ do_local_background = 0;
3743
+
3744
+ else if (mode == PNG_ALPHA_STANDARD)
3745
+ {
3746
+ do_local_background = 2/*required*/;
3747
+ mode = PNG_ALPHA_PNG; /* prevent libpng doing it */
3748
+ }
3749
+
3750
+ /* else leave as 1 for the checks below */
3751
+ }
3752
+
3753
+ /* If the bit-depth changes then handle that here. */
3754
+ if ((change & PNG_FORMAT_FLAG_LINEAR) != 0)
3755
+ {
3756
+ if (linear != 0 /*16-bit output*/)
3757
+ png_set_expand_16(png_ptr);
3758
+
3759
+ else /* 8-bit output */
3760
+ png_set_scale_16(png_ptr);
3761
+
3762
+ change &= ~PNG_FORMAT_FLAG_LINEAR;
3763
+ }
3764
+
3765
+ /* Now the background/alpha channel changes. */
3766
+ if ((change & PNG_FORMAT_FLAG_ALPHA) != 0)
3767
+ {
3768
+ /* Removing an alpha channel requires composition for the 8-bit
3769
+ * formats; for the 16-bit it is already done, above, by the
3770
+ * pre-multiplication and the channel just needs to be stripped.
3771
+ */
3772
+ if ((base_format & PNG_FORMAT_FLAG_ALPHA) != 0)
3773
+ {
3774
+ /* If RGB->gray is happening the alpha channel must be left and the
3775
+ * operation completed locally.
3776
+ *
3777
+ * TODO: fix libpng and remove this.
3778
+ */
3779
+ if (do_local_background != 0)
3780
+ do_local_background = 2/*required*/;
3781
+
3782
+ /* 16-bit output: just remove the channel */
3783
+ else if (linear != 0) /* compose on black (well, pre-multiply) */
3784
+ png_set_strip_alpha(png_ptr);
3785
+
3786
+ /* 8-bit output: do an appropriate compose */
3787
+ else if (display->background != NULL)
3788
+ {
3789
+ png_color_16 c;
3790
+
3791
+ c.index = 0; /*unused*/
3792
+ c.red = display->background->red;
3793
+ c.green = display->background->green;
3794
+ c.blue = display->background->blue;
3795
+ c.gray = display->background->green;
3796
+
3797
+ /* This is always an 8-bit sRGB value, using the 'green' channel
3798
+ * for gray is much better than calculating the luminance here;
3799
+ * we can get off-by-one errors in that calculation relative to
3800
+ * the app expectations and that will show up in transparent
3801
+ * pixels.
3802
+ */
3803
+ png_set_background_fixed(png_ptr, &c,
3804
+ PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
3805
+ 0/*gamma: not used*/);
3806
+ }
3807
+
3808
+ else /* compose on row: implemented below. */
3809
+ {
3810
+ do_local_compose = 1;
3811
+ /* This leaves the alpha channel in the output, so it has to be
3812
+ * removed by the code below. Set the encoding to the 'OPTIMIZE'
3813
+ * one so the code only has to hack on the pixels that require
3814
+ * composition.
3815
+ */
3816
+ mode = PNG_ALPHA_OPTIMIZED;
3817
+ }
3818
+ }
3819
+
3820
+ else /* output needs an alpha channel */
3821
+ {
3822
+ /* This is tricky because it happens before the swap operation has
3823
+ * been accomplished; however, the swap does *not* swap the added
3824
+ * alpha channel (weird API), so it must be added in the correct
3825
+ * place.
3826
+ */
3827
+ png_uint_32 filler; /* opaque filler */
3828
+ int where;
3829
+
3830
+ if (linear != 0)
3831
+ filler = 65535;
3832
+
3833
+ else
3834
+ filler = 255;
3835
+
3836
+ # ifdef PNG_FORMAT_AFIRST_SUPPORTED
3837
+ if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
3838
+ {
3839
+ where = PNG_FILLER_BEFORE;
3840
+ change &= ~PNG_FORMAT_FLAG_AFIRST;
3841
+ }
3842
+
3843
+ else
3844
+ # endif
3845
+ where = PNG_FILLER_AFTER;
3846
+
3847
+ png_set_add_alpha(png_ptr, filler, where);
3848
+ }
3849
+
3850
+ /* This stops the (irrelevant) call to swap_alpha below. */
3851
+ change &= ~PNG_FORMAT_FLAG_ALPHA;
3852
+ }
3853
+
3854
+ /* Now set the alpha mode correctly; this is always done, even if there is
3855
+ * no alpha channel in either the input or the output because it correctly
3856
+ * sets the output gamma.
3857
+ */
3858
+ png_set_alpha_mode_fixed(png_ptr, mode, output_gamma);
3859
+
3860
+ # ifdef PNG_FORMAT_BGR_SUPPORTED
3861
+ if ((change & PNG_FORMAT_FLAG_BGR) != 0)
3862
+ {
3863
+ /* Check only the output format; PNG is never BGR; don't do this if
3864
+ * the output is gray, but fix up the 'format' value in that case.
3865
+ */
3866
+ if ((format & PNG_FORMAT_FLAG_COLOR) != 0)
3867
+ png_set_bgr(png_ptr);
3868
+
3869
+ else
3870
+ format &= ~PNG_FORMAT_FLAG_BGR;
3871
+
3872
+ change &= ~PNG_FORMAT_FLAG_BGR;
3873
+ }
3874
+ # endif
3875
+
3876
+ # ifdef PNG_FORMAT_AFIRST_SUPPORTED
3877
+ if ((change & PNG_FORMAT_FLAG_AFIRST) != 0)
3878
+ {
3879
+ /* Only relevant if there is an alpha channel - it's particularly
3880
+ * important to handle this correctly because do_local_compose may
3881
+ * be set above and then libpng will keep the alpha channel for this
3882
+ * code to remove.
3883
+ */
3884
+ if ((format & PNG_FORMAT_FLAG_ALPHA) != 0)
3885
+ {
3886
+ /* Disable this if doing a local background,
3887
+ * TODO: remove this when local background is no longer required.
3888
+ */
3889
+ if (do_local_background != 2)
3890
+ png_set_swap_alpha(png_ptr);
3891
+ }
3892
+
3893
+ else
3894
+ format &= ~PNG_FORMAT_FLAG_AFIRST;
3895
+
3896
+ change &= ~PNG_FORMAT_FLAG_AFIRST;
3897
+ }
3898
+ # endif
3899
+
3900
+ /* If the *output* is 16-bit then we need to check for a byte-swap on this
3901
+ * architecture.
3902
+ */
3903
+ if (linear != 0)
3904
+ {
3905
+ PNG_CONST png_uint_16 le = 0x0001;
3906
+
3907
+ if ((*(png_const_bytep) & le) != 0)
3908
+ png_set_swap(png_ptr);
3909
+ }
3910
+
3911
+ /* If change is not now 0 some transformation is missing - error out. */
3912
+ if (change != 0)
3913
+ png_error(png_ptr, "png_read_image: unsupported transformation");
3914
+ }
3915
+
3916
+ PNG_SKIP_CHUNKS(png_ptr);
3917
+
3918
+ /* Update the 'info' structure and make sure the result is as required; first
3919
+ * make sure to turn on the interlace handling if it will be required
3920
+ * (because it can't be turned on *after* the call to png_read_update_info!)
3921
+ *
3922
+ * TODO: remove the do_local_background fixup below.
3923
+ */
3924
+ if (do_local_compose == 0 && do_local_background != 2)
3925
+ passes = png_set_interlace_handling(png_ptr);
3926
+
3927
+ png_read_update_info(png_ptr, info_ptr);
3928
+
3929
+ {
3930
+ png_uint_32 info_format = 0;
3931
+
3932
+ if ((info_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)
3933
+ info_format |= PNG_FORMAT_FLAG_COLOR;
3934
+
3935
+ if ((info_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0)
3936
+ {
3937
+ /* do_local_compose removes this channel below. */
3938
+ if (do_local_compose == 0)
3939
+ {
3940
+ /* do_local_background does the same if required. */
3941
+ if (do_local_background != 2 ||
3942
+ (format & PNG_FORMAT_FLAG_ALPHA) != 0)
3943
+ info_format |= PNG_FORMAT_FLAG_ALPHA;
3944
+ }
3945
+ }
3946
+
3947
+ else if (do_local_compose != 0) /* internal error */
3948
+ png_error(png_ptr, "png_image_read: alpha channel lost");
3949
+
3950
+ if (info_ptr->bit_depth == 16)
3951
+ info_format |= PNG_FORMAT_FLAG_LINEAR;
3952
+
3953
+ # ifdef PNG_FORMAT_BGR_SUPPORTED
3954
+ if ((png_ptr->transformations & PNG_BGR) != 0)
3955
+ info_format |= PNG_FORMAT_FLAG_BGR;
3956
+ # endif
3957
+
3958
+ # ifdef PNG_FORMAT_AFIRST_SUPPORTED
3959
+ if (do_local_background == 2)
3960
+ {
3961
+ if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
3962
+ info_format |= PNG_FORMAT_FLAG_AFIRST;
3963
+ }
3964
+
3965
+ if ((png_ptr->transformations & PNG_SWAP_ALPHA) != 0 ||
3966
+ ((png_ptr->transformations & PNG_ADD_ALPHA) != 0 &&
3967
+ (png_ptr->flags & PNG_FLAG_FILLER_AFTER) == 0))
3968
+ {
3969
+ if (do_local_background == 2)
3970
+ png_error(png_ptr, "unexpected alpha swap transformation");
3971
+
3972
+ info_format |= PNG_FORMAT_FLAG_AFIRST;
3973
+ }
3974
+ # endif
3975
+
3976
+ /* This is actually an internal error. */
3977
+ if (info_format != format)
3978
+ png_error(png_ptr, "png_read_image: invalid transformations");
3979
+ }
3980
+
3981
+ /* Now read the rows. If do_local_compose is set then it is necessary to use
3982
+ * a local row buffer. The output will be GA, RGBA or BGRA and must be
3983
+ * converted to G, RGB or BGR as appropriate. The 'local_row' member of the
3984
+ * display acts as a flag.
3985
+ */
3986
+ {
3987
+ png_voidp first_row = display->buffer;
3988
+ ptrdiff_t row_bytes = display->row_stride;
3989
+
3990
+ if (linear != 0)
3991
+ row_bytes *= 2;
3992
+
3993
+ /* The following expression is designed to work correctly whether it gives
3994
+ * a signed or an unsigned result.
3995
+ */
3996
+ if (row_bytes < 0)
3997
+ {
3998
+ char *ptr = png_voidcast(char*, first_row);
3999
+ ptr += (image->height-1) * (-row_bytes);
4000
+ first_row = png_voidcast(png_voidp, ptr);
4001
+ }
4002
+
4003
+ display->first_row = first_row;
4004
+ display->row_bytes = row_bytes;
4005
+ }
4006
+
4007
+ if (do_local_compose != 0)
4008
+ {
4009
+ int result;
4010
+ png_voidp row = png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr));
4011
+
4012
+ display->local_row = row;
4013
+ result = png_safe_execute(image, png_image_read_composite, display);
4014
+ display->local_row = NULL;
4015
+ png_free(png_ptr, row);
4016
+
4017
+ return result;
4018
+ }
4019
+
4020
+ else if (do_local_background == 2)
4021
+ {
4022
+ int result;
4023
+ png_voidp row = png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr));
4024
+
4025
+ display->local_row = row;
4026
+ result = png_safe_execute(image, png_image_read_background, display);
4027
+ display->local_row = NULL;
4028
+ png_free(png_ptr, row);
4029
+
4030
+ return result;
4031
+ }
4032
+
4033
+ else
4034
+ {
4035
+ png_alloc_size_t row_bytes = display->row_bytes;
4036
+
4037
+ while (--passes >= 0)
4038
+ {
4039
+ png_uint_32 y = image->height;
4040
+ png_bytep row = png_voidcast(png_bytep, display->first_row);
4041
+
4042
+ while (y-- > 0)
4043
+ {
4044
+ png_read_row(png_ptr, row, NULL);
4045
+ row += row_bytes;
4046
+ }
4047
+ }
4048
+
4049
+ return 1;
4050
+ }
4051
+ }
4052
+
4053
+ int PNGAPI
4054
+ png_image_finish_read(png_imagep image, png_const_colorp background,
4055
+ void *buffer, png_int_32 row_stride, void *colormap)
4056
+ {
4057
+ if (image != NULL && image->version == PNG_IMAGE_VERSION)
4058
+ {
4059
+ png_uint_32 check;
4060
+
4061
+ if (row_stride == 0)
4062
+ row_stride = PNG_IMAGE_ROW_STRIDE(*image);
4063
+
4064
+ if (row_stride < 0)
4065
+ check = -row_stride;
4066
+
4067
+ else
4068
+ check = row_stride;
4069
+
4070
+ if (image->opaque != NULL && buffer != NULL &&
4071
+ check >= PNG_IMAGE_ROW_STRIDE(*image))
4072
+ {
4073
+ if ((image->format & PNG_FORMAT_FLAG_COLORMAP) == 0 ||
4074
+ (image->colormap_entries > 0 && colormap != NULL))
4075
+ {
4076
+ int result;
4077
+ png_image_read_control display;
4078
+
4079
+ memset(&display, 0, (sizeof display));
4080
+ display.image = image;
4081
+ display.buffer = buffer;
4082
+ display.row_stride = row_stride;
4083
+ display.colormap = colormap;
4084
+ display.background = background;
4085
+ display.local_row = NULL;
4086
+
4087
+ /* Choose the correct 'end' routine; for the color-map case all the
4088
+ * setup has already been done.
4089
+ */
4090
+ if ((image->format & PNG_FORMAT_FLAG_COLORMAP) != 0)
4091
+ result =
4092
+ png_safe_execute(image, png_image_read_colormap, &display) &&
4093
+ png_safe_execute(image, png_image_read_colormapped, &display);
4094
+
4095
+ else
4096
+ result =
4097
+ png_safe_execute(image, png_image_read_direct, &display);
4098
+
4099
+ png_image_free(image);
4100
+ return result;
4101
+ }
4102
+
4103
+ else
4104
+ return png_image_error(image,
4105
+ "png_image_finish_read[color-map]: no color-map");
4106
+ }
4107
+
4108
+ else
4109
+ return png_image_error(image,
4110
+ "png_image_finish_read: invalid argument");
4111
+ }
4112
+
4113
+ else if (image != NULL)
4114
+ return png_image_error(image,
4115
+ "png_image_finish_read: damaged PNG_IMAGE_VERSION");
4116
+
4117
+ return 0;
4118
+ }
4119
+
4120
+ #endif /* SIMPLIFIED_READ */
4121
+ #endif /* READ */