rfreeimage 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 */