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,2455 @@
1
+
2
+ /* pngwrite.c - general routines to write 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
+
14
+ #include "pngpriv.h"
15
+ #if defined(PNG_SIMPLIFIED_WRITE_SUPPORTED) && defined(PNG_STDIO_SUPPORTED)
16
+ # include <errno.h>
17
+ #endif
18
+
19
+ #ifdef PNG_WRITE_SUPPORTED
20
+
21
+ #ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
22
+ /* Write out all the unknown chunks for the current given location */
23
+ static void
24
+ write_unknown_chunks(png_structrp png_ptr, png_const_inforp info_ptr,
25
+ unsigned int where)
26
+ {
27
+ if (info_ptr->unknown_chunks_num != 0)
28
+ {
29
+ png_const_unknown_chunkp up;
30
+
31
+ png_debug(5, "writing extra chunks");
32
+
33
+ for (up = info_ptr->unknown_chunks;
34
+ up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num;
35
+ ++up)
36
+ if ((up->location & where) != 0)
37
+ {
38
+ /* If per-chunk unknown chunk handling is enabled use it, otherwise
39
+ * just write the chunks the application has set.
40
+ */
41
+ #ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
42
+ int keep = png_handle_as_unknown(png_ptr, up->name);
43
+
44
+ /* NOTE: this code is radically different from the read side in the
45
+ * matter of handling an ancillary unknown chunk. In the read side
46
+ * the default behavior is to discard it, in the code below the default
47
+ * behavior is to write it. Critical chunks are, however, only
48
+ * written if explicitly listed or if the default is set to write all
49
+ * unknown chunks.
50
+ *
51
+ * The default handling is also slightly weird - it is not possible to
52
+ * stop the writing of all unsafe-to-copy chunks!
53
+ *
54
+ * TODO: REVIEW: this would seem to be a bug.
55
+ */
56
+ if (keep != PNG_HANDLE_CHUNK_NEVER &&
57
+ ((up->name[3] & 0x20) /* safe-to-copy overrides everything */ ||
58
+ keep == PNG_HANDLE_CHUNK_ALWAYS ||
59
+ (keep == PNG_HANDLE_CHUNK_AS_DEFAULT &&
60
+ png_ptr->unknown_default == PNG_HANDLE_CHUNK_ALWAYS)))
61
+ #endif
62
+ {
63
+ /* TODO: review, what is wrong with a zero length unknown chunk? */
64
+ if (up->size == 0)
65
+ png_warning(png_ptr, "Writing zero-length unknown chunk");
66
+
67
+ png_write_chunk(png_ptr, up->name, up->data, up->size);
68
+ }
69
+ }
70
+ }
71
+ }
72
+ #endif /* WRITE_UNKNOWN_CHUNKS */
73
+
74
+ /* Writes all the PNG information. This is the suggested way to use the
75
+ * library. If you have a new chunk to add, make a function to write it,
76
+ * and put it in the correct location here. If you want the chunk written
77
+ * after the image data, put it in png_write_end(). I strongly encourage
78
+ * you to supply a PNG_INFO_ flag, and check info_ptr->valid before writing
79
+ * the chunk, as that will keep the code from breaking if you want to just
80
+ * write a plain PNG file. If you have long comments, I suggest writing
81
+ * them in png_write_end(), and compressing them.
82
+ */
83
+ void PNGAPI
84
+ png_write_info_before_PLTE(png_structrp png_ptr, png_const_inforp info_ptr)
85
+ {
86
+ png_debug(1, "in png_write_info_before_PLTE");
87
+
88
+ if (png_ptr == NULL || info_ptr == NULL)
89
+ return;
90
+
91
+ if ((png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE) == 0)
92
+ {
93
+ /* Write PNG signature */
94
+ png_write_sig(png_ptr);
95
+
96
+ #ifdef PNG_MNG_FEATURES_SUPPORTED
97
+ if ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) != 0 && \
98
+ png_ptr->mng_features_permitted != 0)
99
+ {
100
+ png_warning(png_ptr, "MNG features are not allowed in a PNG datastream");
101
+ png_ptr->mng_features_permitted = 0;
102
+ }
103
+ #endif
104
+
105
+ /* Write IHDR information. */
106
+ png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height,
107
+ info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type,
108
+ info_ptr->filter_type,
109
+ #ifdef PNG_WRITE_INTERLACING_SUPPORTED
110
+ info_ptr->interlace_type
111
+ #else
112
+ 0
113
+ #endif
114
+ );
115
+
116
+ /* The rest of these check to see if the valid field has the appropriate
117
+ * flag set, and if it does, writes the chunk.
118
+ *
119
+ * 1.6.0: COLORSPACE support controls the writing of these chunks too, and
120
+ * the chunks will be written if the WRITE routine is there and information
121
+ * is available in the COLORSPACE. (See png_colorspace_sync_info in png.c
122
+ * for where the valid flags get set.)
123
+ *
124
+ * Under certain circumstances the colorspace can be invalidated without
125
+ * syncing the info_struct 'valid' flags; this happens if libpng detects and
126
+ * error and calls png_error while the color space is being set, yet the
127
+ * application continues writing the PNG. So check the 'invalid' flag here
128
+ * too.
129
+ */
130
+ #ifdef PNG_GAMMA_SUPPORTED
131
+ # ifdef PNG_WRITE_gAMA_SUPPORTED
132
+ if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
133
+ (info_ptr->colorspace.flags & PNG_COLORSPACE_FROM_gAMA) != 0 &&
134
+ (info_ptr->valid & PNG_INFO_gAMA) != 0)
135
+ png_write_gAMA_fixed(png_ptr, info_ptr->colorspace.gamma);
136
+ # endif
137
+ #endif
138
+
139
+ #ifdef PNG_COLORSPACE_SUPPORTED
140
+ /* Write only one of sRGB or an ICC profile. If a profile was supplied
141
+ * and it matches one of the known sRGB ones issue a warning.
142
+ */
143
+ # ifdef PNG_WRITE_iCCP_SUPPORTED
144
+ if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
145
+ (info_ptr->valid & PNG_INFO_iCCP) != 0)
146
+ {
147
+ # ifdef PNG_WRITE_sRGB_SUPPORTED
148
+ if ((info_ptr->valid & PNG_INFO_sRGB) != 0)
149
+ png_app_warning(png_ptr,
150
+ "profile matches sRGB but writing iCCP instead");
151
+ # endif
152
+
153
+ png_write_iCCP(png_ptr, info_ptr->iccp_name,
154
+ info_ptr->iccp_profile);
155
+ }
156
+ # ifdef PNG_WRITE_sRGB_SUPPORTED
157
+ else
158
+ # endif
159
+ # endif
160
+
161
+ # ifdef PNG_WRITE_sRGB_SUPPORTED
162
+ if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
163
+ (info_ptr->valid & PNG_INFO_sRGB) != 0)
164
+ png_write_sRGB(png_ptr, info_ptr->colorspace.rendering_intent);
165
+ # endif /* WRITE_sRGB */
166
+ #endif /* COLORSPACE */
167
+
168
+ #ifdef PNG_WRITE_sBIT_SUPPORTED
169
+ if ((info_ptr->valid & PNG_INFO_sBIT) != 0)
170
+ png_write_sBIT(png_ptr, &(info_ptr->sig_bit), info_ptr->color_type);
171
+ #endif
172
+
173
+ #ifdef PNG_COLORSPACE_SUPPORTED
174
+ # ifdef PNG_WRITE_cHRM_SUPPORTED
175
+ if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
176
+ (info_ptr->colorspace.flags & PNG_COLORSPACE_FROM_cHRM) != 0 &&
177
+ (info_ptr->valid & PNG_INFO_cHRM) != 0)
178
+ png_write_cHRM_fixed(png_ptr, &info_ptr->colorspace.end_points_xy);
179
+ # endif
180
+ #endif
181
+
182
+ #ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
183
+ write_unknown_chunks(png_ptr, info_ptr, PNG_HAVE_IHDR);
184
+ #endif
185
+
186
+ png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE;
187
+ }
188
+ }
189
+
190
+ void PNGAPI
191
+ png_write_info(png_structrp png_ptr, png_const_inforp info_ptr)
192
+ {
193
+ #if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED)
194
+ int i;
195
+ #endif
196
+
197
+ png_debug(1, "in png_write_info");
198
+
199
+ if (png_ptr == NULL || info_ptr == NULL)
200
+ return;
201
+
202
+ png_write_info_before_PLTE(png_ptr, info_ptr);
203
+
204
+ if ((info_ptr->valid & PNG_INFO_PLTE) != 0)
205
+ png_write_PLTE(png_ptr, info_ptr->palette,
206
+ (png_uint_32)info_ptr->num_palette);
207
+
208
+ else if ((info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) !=0)
209
+ png_error(png_ptr, "Valid palette required for paletted images");
210
+
211
+ #ifdef PNG_WRITE_tRNS_SUPPORTED
212
+ if ((info_ptr->valid & PNG_INFO_tRNS) !=0)
213
+ {
214
+ #ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED
215
+ /* Invert the alpha channel (in tRNS) */
216
+ if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0 &&
217
+ info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
218
+ {
219
+ int j;
220
+ for (j = 0; j<(int)info_ptr->num_trans; j++)
221
+ info_ptr->trans_alpha[j] =
222
+ (png_byte)(255 - info_ptr->trans_alpha[j]);
223
+ }
224
+ #endif
225
+ png_write_tRNS(png_ptr, info_ptr->trans_alpha, &(info_ptr->trans_color),
226
+ info_ptr->num_trans, info_ptr->color_type);
227
+ }
228
+ #endif
229
+ #ifdef PNG_WRITE_bKGD_SUPPORTED
230
+ if ((info_ptr->valid & PNG_INFO_bKGD) != 0)
231
+ png_write_bKGD(png_ptr, &(info_ptr->background), info_ptr->color_type);
232
+ #endif
233
+
234
+ #ifdef PNG_WRITE_hIST_SUPPORTED
235
+ if ((info_ptr->valid & PNG_INFO_hIST) != 0)
236
+ png_write_hIST(png_ptr, info_ptr->hist, info_ptr->num_palette);
237
+ #endif
238
+
239
+ #ifdef PNG_WRITE_oFFs_SUPPORTED
240
+ if ((info_ptr->valid & PNG_INFO_oFFs) != 0)
241
+ png_write_oFFs(png_ptr, info_ptr->x_offset, info_ptr->y_offset,
242
+ info_ptr->offset_unit_type);
243
+ #endif
244
+
245
+ #ifdef PNG_WRITE_pCAL_SUPPORTED
246
+ if ((info_ptr->valid & PNG_INFO_pCAL) != 0)
247
+ png_write_pCAL(png_ptr, info_ptr->pcal_purpose, info_ptr->pcal_X0,
248
+ info_ptr->pcal_X1, info_ptr->pcal_type, info_ptr->pcal_nparams,
249
+ info_ptr->pcal_units, info_ptr->pcal_params);
250
+ #endif
251
+
252
+ #ifdef PNG_WRITE_sCAL_SUPPORTED
253
+ if ((info_ptr->valid & PNG_INFO_sCAL) != 0)
254
+ png_write_sCAL_s(png_ptr, (int)info_ptr->scal_unit,
255
+ info_ptr->scal_s_width, info_ptr->scal_s_height);
256
+ #endif /* sCAL */
257
+
258
+ #ifdef PNG_WRITE_pHYs_SUPPORTED
259
+ if ((info_ptr->valid & PNG_INFO_pHYs) != 0)
260
+ png_write_pHYs(png_ptr, info_ptr->x_pixels_per_unit,
261
+ info_ptr->y_pixels_per_unit, info_ptr->phys_unit_type);
262
+ #endif /* pHYs */
263
+
264
+ #ifdef PNG_WRITE_tIME_SUPPORTED
265
+ if ((info_ptr->valid & PNG_INFO_tIME) != 0)
266
+ {
267
+ png_write_tIME(png_ptr, &(info_ptr->mod_time));
268
+ png_ptr->mode |= PNG_WROTE_tIME;
269
+ }
270
+ #endif /* tIME */
271
+
272
+ #ifdef PNG_WRITE_sPLT_SUPPORTED
273
+ if ((info_ptr->valid & PNG_INFO_sPLT) != 0)
274
+ for (i = 0; i < (int)info_ptr->splt_palettes_num; i++)
275
+ png_write_sPLT(png_ptr, info_ptr->splt_palettes + i);
276
+ #endif /* sPLT */
277
+
278
+ #ifdef PNG_WRITE_TEXT_SUPPORTED
279
+ /* Check to see if we need to write text chunks */
280
+ for (i = 0; i < info_ptr->num_text; i++)
281
+ {
282
+ png_debug2(2, "Writing header text chunk %d, type %d", i,
283
+ info_ptr->text[i].compression);
284
+ /* An internationalized chunk? */
285
+ if (info_ptr->text[i].compression > 0)
286
+ {
287
+ #ifdef PNG_WRITE_iTXt_SUPPORTED
288
+ /* Write international chunk */
289
+ png_write_iTXt(png_ptr,
290
+ info_ptr->text[i].compression,
291
+ info_ptr->text[i].key,
292
+ info_ptr->text[i].lang,
293
+ info_ptr->text[i].lang_key,
294
+ info_ptr->text[i].text);
295
+ /* Mark this chunk as written */
296
+ if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)
297
+ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
298
+ else
299
+ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR;
300
+ #else
301
+ png_warning(png_ptr, "Unable to write international text");
302
+ #endif
303
+ }
304
+
305
+ /* If we want a compressed text chunk */
306
+ else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_zTXt)
307
+ {
308
+ #ifdef PNG_WRITE_zTXt_SUPPORTED
309
+ /* Write compressed chunk */
310
+ png_write_zTXt(png_ptr, info_ptr->text[i].key,
311
+ info_ptr->text[i].text, info_ptr->text[i].compression);
312
+ /* Mark this chunk as written */
313
+ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR;
314
+ #else
315
+ png_warning(png_ptr, "Unable to write compressed text");
316
+ #endif
317
+ }
318
+
319
+ else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)
320
+ {
321
+ #ifdef PNG_WRITE_tEXt_SUPPORTED
322
+ /* Write uncompressed chunk */
323
+ png_write_tEXt(png_ptr, info_ptr->text[i].key,
324
+ info_ptr->text[i].text,
325
+ 0);
326
+ /* Mark this chunk as written */
327
+ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
328
+ #else
329
+ /* Can't get here */
330
+ png_warning(png_ptr, "Unable to write uncompressed text");
331
+ #endif
332
+ }
333
+ }
334
+ #endif /* tEXt */
335
+
336
+ #ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
337
+ write_unknown_chunks(png_ptr, info_ptr, PNG_HAVE_PLTE);
338
+ #endif
339
+ }
340
+
341
+ /* Writes the end of the PNG file. If you don't want to write comments or
342
+ * time information, you can pass NULL for info. If you already wrote these
343
+ * in png_write_info(), do not write them again here. If you have long
344
+ * comments, I suggest writing them here, and compressing them.
345
+ */
346
+ void PNGAPI
347
+ png_write_end(png_structrp png_ptr, png_inforp info_ptr)
348
+ {
349
+ png_debug(1, "in png_write_end");
350
+
351
+ if (png_ptr == NULL)
352
+ return;
353
+
354
+ if ((png_ptr->mode & PNG_HAVE_IDAT) == 0)
355
+ png_error(png_ptr, "No IDATs written into file");
356
+
357
+ #ifdef PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED
358
+ if (png_ptr->num_palette_max > png_ptr->num_palette)
359
+ png_benign_error(png_ptr, "Wrote palette index exceeding num_palette");
360
+ #endif
361
+
362
+ /* See if user wants us to write information chunks */
363
+ if (info_ptr != NULL)
364
+ {
365
+ #ifdef PNG_WRITE_TEXT_SUPPORTED
366
+ int i; /* local index variable */
367
+ #endif
368
+ #ifdef PNG_WRITE_tIME_SUPPORTED
369
+ /* Check to see if user has supplied a time chunk */
370
+ if ((info_ptr->valid & PNG_INFO_tIME) != 0 &&
371
+ (png_ptr->mode & PNG_WROTE_tIME) == 0)
372
+ png_write_tIME(png_ptr, &(info_ptr->mod_time));
373
+
374
+ #endif
375
+ #ifdef PNG_WRITE_TEXT_SUPPORTED
376
+ /* Loop through comment chunks */
377
+ for (i = 0; i < info_ptr->num_text; i++)
378
+ {
379
+ png_debug2(2, "Writing trailer text chunk %d, type %d", i,
380
+ info_ptr->text[i].compression);
381
+ /* An internationalized chunk? */
382
+ if (info_ptr->text[i].compression > 0)
383
+ {
384
+ #ifdef PNG_WRITE_iTXt_SUPPORTED
385
+ /* Write international chunk */
386
+ png_write_iTXt(png_ptr,
387
+ info_ptr->text[i].compression,
388
+ info_ptr->text[i].key,
389
+ info_ptr->text[i].lang,
390
+ info_ptr->text[i].lang_key,
391
+ info_ptr->text[i].text);
392
+ /* Mark this chunk as written */
393
+ if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)
394
+ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
395
+ else
396
+ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR;
397
+ #else
398
+ png_warning(png_ptr, "Unable to write international text");
399
+ #endif
400
+ }
401
+
402
+ else if (info_ptr->text[i].compression >= PNG_TEXT_COMPRESSION_zTXt)
403
+ {
404
+ #ifdef PNG_WRITE_zTXt_SUPPORTED
405
+ /* Write compressed chunk */
406
+ png_write_zTXt(png_ptr, info_ptr->text[i].key,
407
+ info_ptr->text[i].text, info_ptr->text[i].compression);
408
+ /* Mark this chunk as written */
409
+ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR;
410
+ #else
411
+ png_warning(png_ptr, "Unable to write compressed text");
412
+ #endif
413
+ }
414
+
415
+ else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)
416
+ {
417
+ #ifdef PNG_WRITE_tEXt_SUPPORTED
418
+ /* Write uncompressed chunk */
419
+ png_write_tEXt(png_ptr, info_ptr->text[i].key,
420
+ info_ptr->text[i].text, 0);
421
+ /* Mark this chunk as written */
422
+ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
423
+ #else
424
+ png_warning(png_ptr, "Unable to write uncompressed text");
425
+ #endif
426
+ }
427
+ }
428
+ #endif
429
+ #ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
430
+ write_unknown_chunks(png_ptr, info_ptr, PNG_AFTER_IDAT);
431
+ #endif
432
+ }
433
+
434
+ png_ptr->mode |= PNG_AFTER_IDAT;
435
+
436
+ /* Write end of PNG file */
437
+ png_write_IEND(png_ptr);
438
+
439
+ /* This flush, added in libpng-1.0.8, removed from libpng-1.0.9beta03,
440
+ * and restored again in libpng-1.2.30, may cause some applications that
441
+ * do not set png_ptr->output_flush_fn to crash. If your application
442
+ * experiences a problem, please try building libpng with
443
+ * PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED defined, and report the event to
444
+ * png-mng-implement at lists.sf.net .
445
+ */
446
+ #ifdef PNG_WRITE_FLUSH_SUPPORTED
447
+ # ifdef PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED
448
+ png_flush(png_ptr);
449
+ # endif
450
+ #endif
451
+ }
452
+
453
+ #ifdef PNG_CONVERT_tIME_SUPPORTED
454
+ void PNGAPI
455
+ png_convert_from_struct_tm(png_timep ptime, PNG_CONST struct tm * ttime)
456
+ {
457
+ png_debug(1, "in png_convert_from_struct_tm");
458
+
459
+ ptime->year = (png_uint_16)(1900 + ttime->tm_year);
460
+ ptime->month = (png_byte)(ttime->tm_mon + 1);
461
+ ptime->day = (png_byte)ttime->tm_mday;
462
+ ptime->hour = (png_byte)ttime->tm_hour;
463
+ ptime->minute = (png_byte)ttime->tm_min;
464
+ ptime->second = (png_byte)ttime->tm_sec;
465
+ }
466
+
467
+ void PNGAPI
468
+ png_convert_from_time_t(png_timep ptime, time_t ttime)
469
+ {
470
+ struct tm *tbuf;
471
+
472
+ png_debug(1, "in png_convert_from_time_t");
473
+
474
+ tbuf = gmtime(&ttime);
475
+ png_convert_from_struct_tm(ptime, tbuf);
476
+ }
477
+ #endif
478
+
479
+ /* Initialize png_ptr structure, and allocate any memory needed */
480
+ PNG_FUNCTION(png_structp,PNGAPI
481
+ png_create_write_struct,(png_const_charp user_png_ver, png_voidp error_ptr,
482
+ png_error_ptr error_fn, png_error_ptr warn_fn),PNG_ALLOCATED)
483
+ {
484
+ #ifndef PNG_USER_MEM_SUPPORTED
485
+ png_structrp png_ptr = png_create_png_struct(user_png_ver, error_ptr,
486
+ error_fn, warn_fn, NULL, NULL, NULL);
487
+ #else
488
+ return png_create_write_struct_2(user_png_ver, error_ptr, error_fn,
489
+ warn_fn, NULL, NULL, NULL);
490
+ }
491
+
492
+ /* Alternate initialize png_ptr structure, and allocate any memory needed */
493
+ PNG_FUNCTION(png_structp,PNGAPI
494
+ png_create_write_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr,
495
+ png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,
496
+ png_malloc_ptr malloc_fn, png_free_ptr free_fn),PNG_ALLOCATED)
497
+ {
498
+ png_structrp png_ptr = png_create_png_struct(user_png_ver, error_ptr,
499
+ error_fn, warn_fn, mem_ptr, malloc_fn, free_fn);
500
+ #endif /* USER_MEM */
501
+ if (png_ptr != NULL)
502
+ {
503
+ /* Set the zlib control values to defaults; they can be overridden by the
504
+ * application after the struct has been created.
505
+ */
506
+ png_ptr->zbuffer_size = PNG_ZBUF_SIZE;
507
+
508
+ /* The 'zlib_strategy' setting is irrelevant because png_default_claim in
509
+ * pngwutil.c defaults it according to whether or not filters will be
510
+ * used, and ignores this setting.
511
+ */
512
+ png_ptr->zlib_strategy = PNG_Z_DEFAULT_STRATEGY;
513
+ png_ptr->zlib_level = PNG_Z_DEFAULT_COMPRESSION;
514
+ png_ptr->zlib_mem_level = 8;
515
+ png_ptr->zlib_window_bits = 15;
516
+ png_ptr->zlib_method = 8;
517
+
518
+ #ifdef PNG_WRITE_COMPRESSED_TEXT_SUPPORTED
519
+ png_ptr->zlib_text_strategy = PNG_TEXT_Z_DEFAULT_STRATEGY;
520
+ png_ptr->zlib_text_level = PNG_TEXT_Z_DEFAULT_COMPRESSION;
521
+ png_ptr->zlib_text_mem_level = 8;
522
+ png_ptr->zlib_text_window_bits = 15;
523
+ png_ptr->zlib_text_method = 8;
524
+ #endif /* WRITE_COMPRESSED_TEXT */
525
+
526
+ /* This is a highly dubious configuration option; by default it is off,
527
+ * but it may be appropriate for private builds that are testing
528
+ * extensions not conformant to the current specification, or of
529
+ * applications that must not fail to write at all costs!
530
+ */
531
+ #ifdef PNG_BENIGN_WRITE_ERRORS_SUPPORTED
532
+ /* In stable builds only warn if an application error can be completely
533
+ * handled.
534
+ */
535
+ png_ptr->flags |= PNG_FLAG_BENIGN_ERRORS_WARN;
536
+ #endif
537
+
538
+ /* App warnings are warnings in release (or release candidate) builds but
539
+ * are errors during development.
540
+ */
541
+ #if PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC
542
+ png_ptr->flags |= PNG_FLAG_APP_WARNINGS_WARN;
543
+ #endif
544
+
545
+ /* TODO: delay this, it can be done in png_init_io() (if the app doesn't
546
+ * do it itself) avoiding setting the default function if it is not
547
+ * required.
548
+ */
549
+ png_set_write_fn(png_ptr, NULL, NULL, NULL);
550
+ }
551
+
552
+ return png_ptr;
553
+ }
554
+
555
+
556
+ /* Write a few rows of image data. If the image is interlaced,
557
+ * either you will have to write the 7 sub images, or, if you
558
+ * have called png_set_interlace_handling(), you will have to
559
+ * "write" the image seven times.
560
+ */
561
+ void PNGAPI
562
+ png_write_rows(png_structrp png_ptr, png_bytepp row,
563
+ png_uint_32 num_rows)
564
+ {
565
+ png_uint_32 i; /* row counter */
566
+ png_bytepp rp; /* row pointer */
567
+
568
+ png_debug(1, "in png_write_rows");
569
+
570
+ if (png_ptr == NULL)
571
+ return;
572
+
573
+ /* Loop through the rows */
574
+ for (i = 0, rp = row; i < num_rows; i++, rp++)
575
+ {
576
+ png_write_row(png_ptr, *rp);
577
+ }
578
+ }
579
+
580
+ /* Write the image. You only need to call this function once, even
581
+ * if you are writing an interlaced image.
582
+ */
583
+ void PNGAPI
584
+ png_write_image(png_structrp png_ptr, png_bytepp image)
585
+ {
586
+ png_uint_32 i; /* row index */
587
+ int pass, num_pass; /* pass variables */
588
+ png_bytepp rp; /* points to current row */
589
+
590
+ if (png_ptr == NULL)
591
+ return;
592
+
593
+ png_debug(1, "in png_write_image");
594
+
595
+ #ifdef PNG_WRITE_INTERLACING_SUPPORTED
596
+ /* Initialize interlace handling. If image is not interlaced,
597
+ * this will set pass to 1
598
+ */
599
+ num_pass = png_set_interlace_handling(png_ptr);
600
+ #else
601
+ num_pass = 1;
602
+ #endif
603
+ /* Loop through passes */
604
+ for (pass = 0; pass < num_pass; pass++)
605
+ {
606
+ /* Loop through image */
607
+ for (i = 0, rp = image; i < png_ptr->height; i++, rp++)
608
+ {
609
+ png_write_row(png_ptr, *rp);
610
+ }
611
+ }
612
+ }
613
+
614
+ #ifdef PNG_MNG_FEATURES_SUPPORTED
615
+ /* Performs intrapixel differencing */
616
+ static void
617
+ png_do_write_intrapixel(png_row_infop row_info, png_bytep row)
618
+ {
619
+ png_debug(1, "in png_do_write_intrapixel");
620
+
621
+ if ((row_info->color_type & PNG_COLOR_MASK_COLOR) != 0)
622
+ {
623
+ int bytes_per_pixel;
624
+ png_uint_32 row_width = row_info->width;
625
+ if (row_info->bit_depth == 8)
626
+ {
627
+ png_bytep rp;
628
+ png_uint_32 i;
629
+
630
+ if (row_info->color_type == PNG_COLOR_TYPE_RGB)
631
+ bytes_per_pixel = 3;
632
+
633
+ else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
634
+ bytes_per_pixel = 4;
635
+
636
+ else
637
+ return;
638
+
639
+ for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
640
+ {
641
+ *(rp) = (png_byte)((*rp - *(rp + 1)) & 0xff);
642
+ *(rp + 2) = (png_byte)((*(rp + 2) - *(rp + 1)) & 0xff);
643
+ }
644
+ }
645
+
646
+ #ifdef PNG_WRITE_16BIT_SUPPORTED
647
+ else if (row_info->bit_depth == 16)
648
+ {
649
+ png_bytep rp;
650
+ png_uint_32 i;
651
+
652
+ if (row_info->color_type == PNG_COLOR_TYPE_RGB)
653
+ bytes_per_pixel = 6;
654
+
655
+ else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
656
+ bytes_per_pixel = 8;
657
+
658
+ else
659
+ return;
660
+
661
+ for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
662
+ {
663
+ png_uint_32 s0 = (*(rp ) << 8) | *(rp + 1);
664
+ png_uint_32 s1 = (*(rp + 2) << 8) | *(rp + 3);
665
+ png_uint_32 s2 = (*(rp + 4) << 8) | *(rp + 5);
666
+ png_uint_32 red = (png_uint_32)((s0 - s1) & 0xffffL);
667
+ png_uint_32 blue = (png_uint_32)((s2 - s1) & 0xffffL);
668
+ *(rp ) = (png_byte)((red >> 8) & 0xff);
669
+ *(rp + 1) = (png_byte)(red & 0xff);
670
+ *(rp + 4) = (png_byte)((blue >> 8) & 0xff);
671
+ *(rp + 5) = (png_byte)(blue & 0xff);
672
+ }
673
+ }
674
+ #endif /* WRITE_16BIT */
675
+ }
676
+ }
677
+ #endif /* MNG_FEATURES */
678
+
679
+ /* Called by user to write a row of image data */
680
+ void PNGAPI
681
+ png_write_row(png_structrp png_ptr, png_const_bytep row)
682
+ {
683
+ /* 1.5.6: moved from png_struct to be a local structure: */
684
+ png_row_info row_info;
685
+
686
+ if (png_ptr == NULL)
687
+ return;
688
+
689
+ png_debug2(1, "in png_write_row (row %u, pass %d)",
690
+ png_ptr->row_number, png_ptr->pass);
691
+
692
+ /* Initialize transformations and other stuff if first time */
693
+ if (png_ptr->row_number == 0 && png_ptr->pass == 0)
694
+ {
695
+ /* Make sure we wrote the header info */
696
+ if ((png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE) == 0)
697
+ png_error(png_ptr,
698
+ "png_write_info was never called before png_write_row");
699
+
700
+ /* Check for transforms that have been set but were defined out */
701
+ #if !defined(PNG_WRITE_INVERT_SUPPORTED) && defined(PNG_READ_INVERT_SUPPORTED)
702
+ if ((png_ptr->transformations & PNG_INVERT_MONO) != 0)
703
+ png_warning(png_ptr, "PNG_WRITE_INVERT_SUPPORTED is not defined");
704
+ #endif
705
+
706
+ #if !defined(PNG_WRITE_FILLER_SUPPORTED) && defined(PNG_READ_FILLER_SUPPORTED)
707
+ if ((png_ptr->transformations & PNG_FILLER) != 0)
708
+ png_warning(png_ptr, "PNG_WRITE_FILLER_SUPPORTED is not defined");
709
+ #endif
710
+ #if !defined(PNG_WRITE_PACKSWAP_SUPPORTED) && \
711
+ defined(PNG_READ_PACKSWAP_SUPPORTED)
712
+ if ((png_ptr->transformations & PNG_PACKSWAP) != 0)
713
+ png_warning(png_ptr,
714
+ "PNG_WRITE_PACKSWAP_SUPPORTED is not defined");
715
+ #endif
716
+
717
+ #if !defined(PNG_WRITE_PACK_SUPPORTED) && defined(PNG_READ_PACK_SUPPORTED)
718
+ if ((png_ptr->transformations & PNG_PACK) != 0)
719
+ png_warning(png_ptr, "PNG_WRITE_PACK_SUPPORTED is not defined");
720
+ #endif
721
+
722
+ #if !defined(PNG_WRITE_SHIFT_SUPPORTED) && defined(PNG_READ_SHIFT_SUPPORTED)
723
+ if ((png_ptr->transformations & PNG_SHIFT) != 0)
724
+ png_warning(png_ptr, "PNG_WRITE_SHIFT_SUPPORTED is not defined");
725
+ #endif
726
+
727
+ #if !defined(PNG_WRITE_BGR_SUPPORTED) && defined(PNG_READ_BGR_SUPPORTED)
728
+ if ((png_ptr->transformations & PNG_BGR) != 0)
729
+ png_warning(png_ptr, "PNG_WRITE_BGR_SUPPORTED is not defined");
730
+ #endif
731
+
732
+ #if !defined(PNG_WRITE_SWAP_SUPPORTED) && defined(PNG_READ_SWAP_SUPPORTED)
733
+ if ((png_ptr->transformations & PNG_SWAP_BYTES) != 0)
734
+ png_warning(png_ptr, "PNG_WRITE_SWAP_SUPPORTED is not defined");
735
+ #endif
736
+
737
+ png_write_start_row(png_ptr);
738
+ }
739
+
740
+ #ifdef PNG_WRITE_INTERLACING_SUPPORTED
741
+ /* If interlaced and not interested in row, return */
742
+ if (png_ptr->interlaced != 0 &&
743
+ (png_ptr->transformations & PNG_INTERLACE) != 0)
744
+ {
745
+ switch (png_ptr->pass)
746
+ {
747
+ case 0:
748
+ if ((png_ptr->row_number & 0x07) != 0)
749
+ {
750
+ png_write_finish_row(png_ptr);
751
+ return;
752
+ }
753
+ break;
754
+
755
+ case 1:
756
+ if ((png_ptr->row_number & 0x07) != 0 || png_ptr->width < 5)
757
+ {
758
+ png_write_finish_row(png_ptr);
759
+ return;
760
+ }
761
+ break;
762
+
763
+ case 2:
764
+ if ((png_ptr->row_number & 0x07) != 4)
765
+ {
766
+ png_write_finish_row(png_ptr);
767
+ return;
768
+ }
769
+ break;
770
+
771
+ case 3:
772
+ if ((png_ptr->row_number & 0x03) != 0 || png_ptr->width < 3)
773
+ {
774
+ png_write_finish_row(png_ptr);
775
+ return;
776
+ }
777
+ break;
778
+
779
+ case 4:
780
+ if ((png_ptr->row_number & 0x03) != 2)
781
+ {
782
+ png_write_finish_row(png_ptr);
783
+ return;
784
+ }
785
+ break;
786
+
787
+ case 5:
788
+ if ((png_ptr->row_number & 0x01) != 0 || png_ptr->width < 2)
789
+ {
790
+ png_write_finish_row(png_ptr);
791
+ return;
792
+ }
793
+ break;
794
+
795
+ case 6:
796
+ if ((png_ptr->row_number & 0x01) == 0)
797
+ {
798
+ png_write_finish_row(png_ptr);
799
+ return;
800
+ }
801
+ break;
802
+
803
+ default: /* error: ignore it */
804
+ break;
805
+ }
806
+ }
807
+ #endif
808
+
809
+ /* Set up row info for transformations */
810
+ row_info.color_type = png_ptr->color_type;
811
+ row_info.width = png_ptr->usr_width;
812
+ row_info.channels = png_ptr->usr_channels;
813
+ row_info.bit_depth = png_ptr->usr_bit_depth;
814
+ row_info.pixel_depth = (png_byte)(row_info.bit_depth * row_info.channels);
815
+ row_info.rowbytes = PNG_ROWBYTES(row_info.pixel_depth, row_info.width);
816
+
817
+ png_debug1(3, "row_info->color_type = %d", row_info.color_type);
818
+ png_debug1(3, "row_info->width = %u", row_info.width);
819
+ png_debug1(3, "row_info->channels = %d", row_info.channels);
820
+ png_debug1(3, "row_info->bit_depth = %d", row_info.bit_depth);
821
+ png_debug1(3, "row_info->pixel_depth = %d", row_info.pixel_depth);
822
+ png_debug1(3, "row_info->rowbytes = %lu", (unsigned long)row_info.rowbytes);
823
+
824
+ /* Copy user's row into buffer, leaving room for filter byte. */
825
+ memcpy(png_ptr->row_buf + 1, row, row_info.rowbytes);
826
+
827
+ #ifdef PNG_WRITE_INTERLACING_SUPPORTED
828
+ /* Handle interlacing */
829
+ if (png_ptr->interlaced && png_ptr->pass < 6 &&
830
+ (png_ptr->transformations & PNG_INTERLACE) != 0)
831
+ {
832
+ png_do_write_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass);
833
+ /* This should always get caught above, but still ... */
834
+ if (row_info.width == 0)
835
+ {
836
+ png_write_finish_row(png_ptr);
837
+ return;
838
+ }
839
+ }
840
+ #endif
841
+
842
+ #ifdef PNG_WRITE_TRANSFORMS_SUPPORTED
843
+ /* Handle other transformations */
844
+ if (png_ptr->transformations != 0)
845
+ png_do_write_transformations(png_ptr, &row_info);
846
+ #endif
847
+
848
+ /* At this point the row_info pixel depth must match the 'transformed' depth,
849
+ * which is also the output depth.
850
+ */
851
+ if (row_info.pixel_depth != png_ptr->pixel_depth ||
852
+ row_info.pixel_depth != png_ptr->transformed_pixel_depth)
853
+ png_error(png_ptr, "internal write transform logic error");
854
+
855
+ #ifdef PNG_MNG_FEATURES_SUPPORTED
856
+ /* Write filter_method 64 (intrapixel differencing) only if
857
+ * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and
858
+ * 2. Libpng did not write a PNG signature (this filter_method is only
859
+ * used in PNG datastreams that are embedded in MNG datastreams) and
860
+ * 3. The application called png_permit_mng_features with a mask that
861
+ * included PNG_FLAG_MNG_FILTER_64 and
862
+ * 4. The filter_method is 64 and
863
+ * 5. The color_type is RGB or RGBA
864
+ */
865
+ if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) != 0 &&
866
+ (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING))
867
+ {
868
+ /* Intrapixel differencing */
869
+ png_do_write_intrapixel(&row_info, png_ptr->row_buf + 1);
870
+ }
871
+ #endif
872
+
873
+ /* Added at libpng-1.5.10 */
874
+ #ifdef PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED
875
+ /* Check for out-of-range palette index */
876
+ if (row_info.color_type == PNG_COLOR_TYPE_PALETTE &&
877
+ png_ptr->num_palette_max >= 0)
878
+ png_do_check_palette_indexes(png_ptr, &row_info);
879
+ #endif
880
+
881
+ /* Find a filter if necessary, filter the row and write it out. */
882
+ png_write_find_filter(png_ptr, &row_info);
883
+
884
+ if (png_ptr->write_row_fn != NULL)
885
+ (*(png_ptr->write_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass);
886
+ }
887
+
888
+ #ifdef PNG_WRITE_FLUSH_SUPPORTED
889
+ /* Set the automatic flush interval or 0 to turn flushing off */
890
+ void PNGAPI
891
+ png_set_flush(png_structrp png_ptr, int nrows)
892
+ {
893
+ png_debug(1, "in png_set_flush");
894
+
895
+ if (png_ptr == NULL)
896
+ return;
897
+
898
+ png_ptr->flush_dist = (nrows < 0 ? 0 : nrows);
899
+ }
900
+
901
+ /* Flush the current output buffers now */
902
+ void PNGAPI
903
+ png_write_flush(png_structrp png_ptr)
904
+ {
905
+ png_debug(1, "in png_write_flush");
906
+
907
+ if (png_ptr == NULL)
908
+ return;
909
+
910
+ /* We have already written out all of the data */
911
+ if (png_ptr->row_number >= png_ptr->num_rows)
912
+ return;
913
+
914
+ png_compress_IDAT(png_ptr, NULL, 0, Z_SYNC_FLUSH);
915
+ png_ptr->flush_rows = 0;
916
+ png_flush(png_ptr);
917
+ }
918
+ #endif /* WRITE_FLUSH */
919
+
920
+ #ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
921
+ static void png_reset_filter_heuristics(png_structrp png_ptr);/* forward decl */
922
+ #endif
923
+
924
+ /* Free any memory used in png_ptr struct without freeing the struct itself. */
925
+ static void
926
+ png_write_destroy(png_structrp png_ptr)
927
+ {
928
+ png_debug(1, "in png_write_destroy");
929
+
930
+ /* Free any memory zlib uses */
931
+ if ((png_ptr->flags & PNG_FLAG_ZSTREAM_INITIALIZED) != 0)
932
+ deflateEnd(&png_ptr->zstream);
933
+
934
+ /* Free our memory. png_free checks NULL for us. */
935
+ png_free_buffer_list(png_ptr, &png_ptr->zbuffer_list);
936
+ png_free(png_ptr, png_ptr->row_buf);
937
+ png_ptr->row_buf = NULL;
938
+ #ifdef PNG_WRITE_FILTER_SUPPORTED
939
+ png_free(png_ptr, png_ptr->prev_row);
940
+ png_free(png_ptr, png_ptr->sub_row);
941
+ png_free(png_ptr, png_ptr->up_row);
942
+ png_free(png_ptr, png_ptr->avg_row);
943
+ png_free(png_ptr, png_ptr->paeth_row);
944
+ png_ptr->prev_row = NULL;
945
+ png_ptr->sub_row = NULL;
946
+ png_ptr->up_row = NULL;
947
+ png_ptr->avg_row = NULL;
948
+ png_ptr->paeth_row = NULL;
949
+ #endif
950
+
951
+ #ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
952
+ /* Use this to save a little code space, it doesn't free the filter_costs */
953
+ png_reset_filter_heuristics(png_ptr);
954
+ png_free(png_ptr, png_ptr->filter_costs);
955
+ png_free(png_ptr, png_ptr->inv_filter_costs);
956
+ png_ptr->filter_costs = NULL;
957
+ png_ptr->inv_filter_costs = NULL;
958
+ #endif
959
+
960
+ #ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
961
+ png_free(png_ptr, png_ptr->chunk_list);
962
+ png_ptr->chunk_list = NULL;
963
+ #endif
964
+
965
+ /* The error handling and memory handling information is left intact at this
966
+ * point: the jmp_buf may still have to be freed. See png_destroy_png_struct
967
+ * for how this happens.
968
+ */
969
+ }
970
+
971
+ /* Free all memory used by the write.
972
+ * In libpng 1.6.0 this API changed quietly to no longer accept a NULL value for
973
+ * *png_ptr_ptr. Prior to 1.6.0 it would accept such a value and it would free
974
+ * the passed in info_structs but it would quietly fail to free any of the data
975
+ * inside them. In 1.6.0 it quietly does nothing (it has to be quiet because it
976
+ * has no png_ptr.)
977
+ */
978
+ void PNGAPI
979
+ png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)
980
+ {
981
+ png_debug(1, "in png_destroy_write_struct");
982
+
983
+ if (png_ptr_ptr != NULL)
984
+ {
985
+ png_structrp png_ptr = *png_ptr_ptr;
986
+
987
+ if (png_ptr != NULL) /* added in libpng 1.6.0 */
988
+ {
989
+ png_destroy_info_struct(png_ptr, info_ptr_ptr);
990
+
991
+ *png_ptr_ptr = NULL;
992
+ png_write_destroy(png_ptr);
993
+ png_destroy_png_struct(png_ptr);
994
+ }
995
+ }
996
+ }
997
+
998
+ /* Allow the application to select one or more row filters to use. */
999
+ void PNGAPI
1000
+ png_set_filter(png_structrp png_ptr, int method, int filters)
1001
+ {
1002
+ png_debug(1, "in png_set_filter");
1003
+
1004
+ if (png_ptr == NULL)
1005
+ return;
1006
+
1007
+ #ifdef PNG_MNG_FEATURES_SUPPORTED
1008
+ if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) != 0 &&
1009
+ (method == PNG_INTRAPIXEL_DIFFERENCING))
1010
+ method = PNG_FILTER_TYPE_BASE;
1011
+
1012
+ #endif
1013
+ if (method == PNG_FILTER_TYPE_BASE)
1014
+ {
1015
+ switch (filters & (PNG_ALL_FILTERS | 0x07))
1016
+ {
1017
+ #ifdef PNG_WRITE_FILTER_SUPPORTED
1018
+ case 5:
1019
+ case 6:
1020
+ case 7: png_app_error(png_ptr, "Unknown row filter for method 0");
1021
+ /* FALL THROUGH */
1022
+ #endif /* WRITE_FILTER */
1023
+ case PNG_FILTER_VALUE_NONE:
1024
+ png_ptr->do_filter = PNG_FILTER_NONE; break;
1025
+
1026
+ #ifdef PNG_WRITE_FILTER_SUPPORTED
1027
+ case PNG_FILTER_VALUE_SUB:
1028
+ png_ptr->do_filter = PNG_FILTER_SUB; break;
1029
+
1030
+ case PNG_FILTER_VALUE_UP:
1031
+ png_ptr->do_filter = PNG_FILTER_UP; break;
1032
+
1033
+ case PNG_FILTER_VALUE_AVG:
1034
+ png_ptr->do_filter = PNG_FILTER_AVG; break;
1035
+
1036
+ case PNG_FILTER_VALUE_PAETH:
1037
+ png_ptr->do_filter = PNG_FILTER_PAETH; break;
1038
+
1039
+ default:
1040
+ png_ptr->do_filter = (png_byte)filters; break;
1041
+ #else
1042
+ default:
1043
+ png_app_error(png_ptr, "Unknown row filter for method 0");
1044
+ #endif /* WRITE_FILTER */
1045
+ }
1046
+
1047
+ /* If we have allocated the row_buf, this means we have already started
1048
+ * with the image and we should have allocated all of the filter buffers
1049
+ * that have been selected. If prev_row isn't already allocated, then
1050
+ * it is too late to start using the filters that need it, since we
1051
+ * will be missing the data in the previous row. If an application
1052
+ * wants to start and stop using particular filters during compression,
1053
+ * it should start out with all of the filters, and then add and
1054
+ * remove them after the start of compression.
1055
+ */
1056
+ if (png_ptr->row_buf != NULL)
1057
+ {
1058
+ #ifdef PNG_WRITE_FILTER_SUPPORTED
1059
+ if ((png_ptr->do_filter & PNG_FILTER_SUB) != 0 &&
1060
+ png_ptr->sub_row == NULL)
1061
+ {
1062
+ png_ptr->sub_row = (png_bytep)png_malloc(png_ptr,
1063
+ (png_ptr->rowbytes + 1));
1064
+ png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB;
1065
+ }
1066
+
1067
+ if ((png_ptr->do_filter & PNG_FILTER_UP) != 0 &&
1068
+ png_ptr->up_row == NULL)
1069
+ {
1070
+ if (png_ptr->prev_row == NULL)
1071
+ {
1072
+ png_warning(png_ptr, "Can't add Up filter after starting");
1073
+ png_ptr->do_filter = (png_byte)(png_ptr->do_filter &
1074
+ ~PNG_FILTER_UP);
1075
+ }
1076
+
1077
+ else
1078
+ {
1079
+ png_ptr->up_row = (png_bytep)png_malloc(png_ptr,
1080
+ (png_ptr->rowbytes + 1));
1081
+ png_ptr->up_row[0] = PNG_FILTER_VALUE_UP;
1082
+ }
1083
+ }
1084
+
1085
+ if ((png_ptr->do_filter & PNG_FILTER_AVG) != 0 &&
1086
+ png_ptr->avg_row == NULL)
1087
+ {
1088
+ if (png_ptr->prev_row == NULL)
1089
+ {
1090
+ png_warning(png_ptr, "Can't add Average filter after starting");
1091
+ png_ptr->do_filter = (png_byte)(png_ptr->do_filter &
1092
+ ~PNG_FILTER_AVG);
1093
+ }
1094
+
1095
+ else
1096
+ {
1097
+ png_ptr->avg_row = (png_bytep)png_malloc(png_ptr,
1098
+ (png_ptr->rowbytes + 1));
1099
+ png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG;
1100
+ }
1101
+ }
1102
+
1103
+ if ((png_ptr->do_filter & PNG_FILTER_PAETH) != 0 &&
1104
+ png_ptr->paeth_row == NULL)
1105
+ {
1106
+ if (png_ptr->prev_row == NULL)
1107
+ {
1108
+ png_warning(png_ptr, "Can't add Paeth filter after starting");
1109
+ png_ptr->do_filter &= (png_byte)(~PNG_FILTER_PAETH);
1110
+ }
1111
+
1112
+ else
1113
+ {
1114
+ png_ptr->paeth_row = (png_bytep)png_malloc(png_ptr,
1115
+ (png_ptr->rowbytes + 1));
1116
+ png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH;
1117
+ }
1118
+ }
1119
+
1120
+ if (png_ptr->do_filter == PNG_NO_FILTERS)
1121
+ #endif /* WRITE_FILTER */
1122
+ png_ptr->do_filter = PNG_FILTER_NONE;
1123
+ }
1124
+ }
1125
+ else
1126
+ png_error(png_ptr, "Unknown custom filter method");
1127
+ }
1128
+
1129
+ /* This allows us to influence the way in which libpng chooses the "best"
1130
+ * filter for the current scanline. While the "minimum-sum-of-absolute-
1131
+ * differences metric is relatively fast and effective, there is some
1132
+ * question as to whether it can be improved upon by trying to keep the
1133
+ * filtered data going to zlib more consistent, hopefully resulting in
1134
+ * better compression.
1135
+ */
1136
+ #ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* GRR 970116 */
1137
+ /* Convenience reset API. */
1138
+ static void
1139
+ png_reset_filter_heuristics(png_structrp png_ptr)
1140
+ {
1141
+ /* Clear out any old values in the 'weights' - this must be done because if
1142
+ * the app calls set_filter_heuristics multiple times with different
1143
+ * 'num_weights' values we would otherwise potentially have wrong sized
1144
+ * arrays.
1145
+ */
1146
+ png_ptr->num_prev_filters = 0;
1147
+ png_ptr->heuristic_method = PNG_FILTER_HEURISTIC_UNWEIGHTED;
1148
+ if (png_ptr->prev_filters != NULL)
1149
+ {
1150
+ png_bytep old = png_ptr->prev_filters;
1151
+ png_ptr->prev_filters = NULL;
1152
+ png_free(png_ptr, old);
1153
+ }
1154
+ if (png_ptr->filter_weights != NULL)
1155
+ {
1156
+ png_uint_16p old = png_ptr->filter_weights;
1157
+ png_ptr->filter_weights = NULL;
1158
+ png_free(png_ptr, old);
1159
+ }
1160
+
1161
+ if (png_ptr->inv_filter_weights != NULL)
1162
+ {
1163
+ png_uint_16p old = png_ptr->inv_filter_weights;
1164
+ png_ptr->inv_filter_weights = NULL;
1165
+ png_free(png_ptr, old);
1166
+ }
1167
+
1168
+ /* Leave the filter_costs - this array is fixed size. */
1169
+ }
1170
+
1171
+ static int
1172
+ png_init_filter_heuristics(png_structrp png_ptr, int heuristic_method,
1173
+ int num_weights)
1174
+ {
1175
+ if (png_ptr == NULL)
1176
+ return 0;
1177
+
1178
+ /* Clear out the arrays */
1179
+ png_reset_filter_heuristics(png_ptr);
1180
+
1181
+ /* Check arguments; the 'reset' function makes the correct settings for the
1182
+ * unweighted case, but we must handle the weight case by initializing the
1183
+ * arrays for the caller.
1184
+ */
1185
+ if (heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
1186
+ {
1187
+ int i;
1188
+
1189
+ if (num_weights > 0)
1190
+ {
1191
+ png_ptr->prev_filters = (png_bytep)png_malloc(png_ptr,
1192
+ (png_uint_32)((sizeof (png_byte)) * num_weights));
1193
+
1194
+ /* To make sure that the weighting starts out fairly */
1195
+ for (i = 0; i < num_weights; i++)
1196
+ {
1197
+ png_ptr->prev_filters[i] = 255;
1198
+ }
1199
+
1200
+ png_ptr->filter_weights = (png_uint_16p)png_malloc(png_ptr,
1201
+ (png_uint_32)((sizeof (png_uint_16)) * num_weights));
1202
+
1203
+ png_ptr->inv_filter_weights = (png_uint_16p)png_malloc(png_ptr,
1204
+ (png_uint_32)((sizeof (png_uint_16)) * num_weights));
1205
+
1206
+ for (i = 0; i < num_weights; i++)
1207
+ {
1208
+ png_ptr->inv_filter_weights[i] =
1209
+ png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR;
1210
+ }
1211
+
1212
+ /* Safe to set this now */
1213
+ png_ptr->num_prev_filters = (png_byte)num_weights;
1214
+ }
1215
+
1216
+ /* If, in the future, there are other filter methods, this would
1217
+ * need to be based on png_ptr->filter.
1218
+ */
1219
+ if (png_ptr->filter_costs == NULL)
1220
+ {
1221
+ png_ptr->filter_costs = (png_uint_16p)png_malloc(png_ptr,
1222
+ (png_uint_32)((sizeof (png_uint_16)) * PNG_FILTER_VALUE_LAST));
1223
+
1224
+ png_ptr->inv_filter_costs = (png_uint_16p)png_malloc(png_ptr,
1225
+ (png_uint_32)((sizeof (png_uint_16)) * PNG_FILTER_VALUE_LAST));
1226
+ }
1227
+
1228
+ for (i = 0; i < PNG_FILTER_VALUE_LAST; i++)
1229
+ {
1230
+ png_ptr->inv_filter_costs[i] =
1231
+ png_ptr->filter_costs[i] = PNG_COST_FACTOR;
1232
+ }
1233
+
1234
+ /* All the arrays are inited, safe to set this: */
1235
+ png_ptr->heuristic_method = PNG_FILTER_HEURISTIC_WEIGHTED;
1236
+
1237
+ /* Return the 'ok' code. */
1238
+ return 1;
1239
+ }
1240
+ else if (heuristic_method == PNG_FILTER_HEURISTIC_DEFAULT ||
1241
+ heuristic_method == PNG_FILTER_HEURISTIC_UNWEIGHTED)
1242
+ {
1243
+ return 1;
1244
+ }
1245
+ else
1246
+ {
1247
+ png_warning(png_ptr, "Unknown filter heuristic method");
1248
+ return 0;
1249
+ }
1250
+ }
1251
+
1252
+ /* Provide floating and fixed point APIs */
1253
+ #ifdef PNG_FLOATING_POINT_SUPPORTED
1254
+ void PNGAPI
1255
+ png_set_filter_heuristics(png_structrp png_ptr, int heuristic_method,
1256
+ int num_weights, png_const_doublep filter_weights,
1257
+ png_const_doublep filter_costs)
1258
+ {
1259
+ png_debug(1, "in png_set_filter_heuristics");
1260
+
1261
+ /* The internal API allocates all the arrays and ensures that the elements of
1262
+ * those arrays are set to the default value.
1263
+ */
1264
+ if (png_init_filter_heuristics(png_ptr, heuristic_method, num_weights) == 0)
1265
+ return;
1266
+
1267
+ /* If using the weighted method copy in the weights. */
1268
+ if (heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
1269
+ {
1270
+ int i;
1271
+ for (i = 0; i < num_weights; i++)
1272
+ {
1273
+ if (filter_weights[i] <= 0.0)
1274
+ {
1275
+ png_ptr->inv_filter_weights[i] =
1276
+ png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR;
1277
+ }
1278
+
1279
+ else
1280
+ {
1281
+ png_ptr->inv_filter_weights[i] =
1282
+ (png_uint_16)(PNG_WEIGHT_FACTOR*filter_weights[i]+.5);
1283
+
1284
+ png_ptr->filter_weights[i] =
1285
+ (png_uint_16)(PNG_WEIGHT_FACTOR/filter_weights[i]+.5);
1286
+ }
1287
+ }
1288
+
1289
+ /* Here is where we set the relative costs of the different filters. We
1290
+ * should take the desired compression level into account when setting
1291
+ * the costs, so that Paeth, for instance, has a high relative cost at low
1292
+ * compression levels, while it has a lower relative cost at higher
1293
+ * compression settings. The filter types are in order of increasing
1294
+ * relative cost, so it would be possible to do this with an algorithm.
1295
+ */
1296
+ for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) if (filter_costs[i] >= 1.0)
1297
+ {
1298
+ png_ptr->inv_filter_costs[i] =
1299
+ (png_uint_16)(PNG_COST_FACTOR / filter_costs[i] + .5);
1300
+
1301
+ png_ptr->filter_costs[i] =
1302
+ (png_uint_16)(PNG_COST_FACTOR * filter_costs[i] + .5);
1303
+ }
1304
+ }
1305
+ }
1306
+ #endif /* FLOATING_POINT */
1307
+
1308
+ #ifdef PNG_FIXED_POINT_SUPPORTED
1309
+ void PNGAPI
1310
+ png_set_filter_heuristics_fixed(png_structrp png_ptr, int heuristic_method,
1311
+ int num_weights, png_const_fixed_point_p filter_weights,
1312
+ png_const_fixed_point_p filter_costs)
1313
+ {
1314
+ png_debug(1, "in png_set_filter_heuristics_fixed");
1315
+
1316
+ /* The internal API allocates all the arrays and ensures that the elements of
1317
+ * those arrays are set to the default value.
1318
+ */
1319
+ if (png_init_filter_heuristics(png_ptr, heuristic_method, num_weights) == 0)
1320
+ return;
1321
+
1322
+ /* If using the weighted method copy in the weights. */
1323
+ if (heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
1324
+ {
1325
+ int i;
1326
+ for (i = 0; i < num_weights; i++)
1327
+ {
1328
+ if (filter_weights[i] <= 0)
1329
+ {
1330
+ png_ptr->inv_filter_weights[i] =
1331
+ png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR;
1332
+ }
1333
+
1334
+ else
1335
+ {
1336
+ png_ptr->inv_filter_weights[i] = (png_uint_16)
1337
+ ((PNG_WEIGHT_FACTOR*filter_weights[i]+PNG_FP_HALF)/PNG_FP_1);
1338
+
1339
+ png_ptr->filter_weights[i] = (png_uint_16)((PNG_WEIGHT_FACTOR*
1340
+ PNG_FP_1+(filter_weights[i]/2))/filter_weights[i]);
1341
+ }
1342
+ }
1343
+
1344
+ /* Here is where we set the relative costs of the different filters. We
1345
+ * should take the desired compression level into account when setting
1346
+ * the costs, so that Paeth, for instance, has a high relative cost at low
1347
+ * compression levels, while it has a lower relative cost at higher
1348
+ * compression settings. The filter types are in order of increasing
1349
+ * relative cost, so it would be possible to do this with an algorithm.
1350
+ */
1351
+ for (i = 0; i < PNG_FILTER_VALUE_LAST; i++)
1352
+ if (filter_costs[i] >= PNG_FP_1)
1353
+ {
1354
+ png_uint_32 tmp;
1355
+
1356
+ /* Use a 32 bit unsigned temporary here because otherwise the
1357
+ * intermediate value will be a 32 bit *signed* integer (ANSI rules)
1358
+ * and this will get the wrong answer on division.
1359
+ */
1360
+ tmp = PNG_COST_FACTOR*PNG_FP_1 + (filter_costs[i]/2);
1361
+ tmp /= filter_costs[i];
1362
+
1363
+ png_ptr->inv_filter_costs[i] = (png_uint_16)tmp;
1364
+
1365
+ tmp = PNG_COST_FACTOR * filter_costs[i] + PNG_FP_HALF;
1366
+ tmp /= PNG_FP_1;
1367
+
1368
+ png_ptr->filter_costs[i] = (png_uint_16)tmp;
1369
+ }
1370
+ }
1371
+ }
1372
+ #endif /* FIXED_POINT */
1373
+ #endif /* WRITE_WEIGHTED_FILTER */
1374
+
1375
+ void PNGAPI
1376
+ png_set_compression_level(png_structrp png_ptr, int level)
1377
+ {
1378
+ png_debug(1, "in png_set_compression_level");
1379
+
1380
+ if (png_ptr == NULL)
1381
+ return;
1382
+
1383
+ png_ptr->zlib_level = level;
1384
+ }
1385
+
1386
+ void PNGAPI
1387
+ png_set_compression_mem_level(png_structrp png_ptr, int mem_level)
1388
+ {
1389
+ png_debug(1, "in png_set_compression_mem_level");
1390
+
1391
+ if (png_ptr == NULL)
1392
+ return;
1393
+
1394
+ png_ptr->zlib_mem_level = mem_level;
1395
+ }
1396
+
1397
+ void PNGAPI
1398
+ png_set_compression_strategy(png_structrp png_ptr, int strategy)
1399
+ {
1400
+ png_debug(1, "in png_set_compression_strategy");
1401
+
1402
+ if (png_ptr == NULL)
1403
+ return;
1404
+
1405
+ /* The flag setting here prevents the libpng dynamic selection of strategy.
1406
+ */
1407
+ png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_STRATEGY;
1408
+ png_ptr->zlib_strategy = strategy;
1409
+ }
1410
+
1411
+ /* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a
1412
+ * smaller value of window_bits if it can do so safely.
1413
+ */
1414
+ void PNGAPI
1415
+ png_set_compression_window_bits(png_structrp png_ptr, int window_bits)
1416
+ {
1417
+ if (png_ptr == NULL)
1418
+ return;
1419
+
1420
+ /* Prior to 1.6.0 this would warn but then set the window_bits value, this
1421
+ * meant that negative window bits values could be selected which would cause
1422
+ * libpng to write a non-standard PNG file with raw deflate or gzip
1423
+ * compressed IDAT or ancillary chunks. Such files can be read and there is
1424
+ * no warning on read, so this seems like a very bad idea.
1425
+ */
1426
+ if (window_bits > 15)
1427
+ {
1428
+ png_warning(png_ptr, "Only compression windows <= 32k supported by PNG");
1429
+ window_bits = 15;
1430
+ }
1431
+
1432
+ else if (window_bits < 8)
1433
+ {
1434
+ png_warning(png_ptr, "Only compression windows >= 256 supported by PNG");
1435
+ window_bits = 8;
1436
+ }
1437
+
1438
+ png_ptr->zlib_window_bits = window_bits;
1439
+ }
1440
+
1441
+ void PNGAPI
1442
+ png_set_compression_method(png_structrp png_ptr, int method)
1443
+ {
1444
+ png_debug(1, "in png_set_compression_method");
1445
+
1446
+ if (png_ptr == NULL)
1447
+ return;
1448
+
1449
+ /* This would produce an invalid PNG file if it worked, but it doesn't and
1450
+ * deflate will fault it, so it is harmless to just warn here.
1451
+ */
1452
+ if (method != 8)
1453
+ png_warning(png_ptr, "Only compression method 8 is supported by PNG");
1454
+
1455
+ png_ptr->zlib_method = method;
1456
+ }
1457
+
1458
+ /* The following were added to libpng-1.5.4 */
1459
+ #ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
1460
+ void PNGAPI
1461
+ png_set_text_compression_level(png_structrp png_ptr, int level)
1462
+ {
1463
+ png_debug(1, "in png_set_text_compression_level");
1464
+
1465
+ if (png_ptr == NULL)
1466
+ return;
1467
+
1468
+ png_ptr->zlib_text_level = level;
1469
+ }
1470
+
1471
+ void PNGAPI
1472
+ png_set_text_compression_mem_level(png_structrp png_ptr, int mem_level)
1473
+ {
1474
+ png_debug(1, "in png_set_text_compression_mem_level");
1475
+
1476
+ if (png_ptr == NULL)
1477
+ return;
1478
+
1479
+ png_ptr->zlib_text_mem_level = mem_level;
1480
+ }
1481
+
1482
+ void PNGAPI
1483
+ png_set_text_compression_strategy(png_structrp png_ptr, int strategy)
1484
+ {
1485
+ png_debug(1, "in png_set_text_compression_strategy");
1486
+
1487
+ if (png_ptr == NULL)
1488
+ return;
1489
+
1490
+ png_ptr->zlib_text_strategy = strategy;
1491
+ }
1492
+
1493
+ /* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a
1494
+ * smaller value of window_bits if it can do so safely.
1495
+ */
1496
+ void PNGAPI
1497
+ png_set_text_compression_window_bits(png_structrp png_ptr, int window_bits)
1498
+ {
1499
+ if (png_ptr == NULL)
1500
+ return;
1501
+
1502
+ if (window_bits > 15)
1503
+ {
1504
+ png_warning(png_ptr, "Only compression windows <= 32k supported by PNG");
1505
+ window_bits = 15;
1506
+ }
1507
+
1508
+ else if (window_bits < 8)
1509
+ {
1510
+ png_warning(png_ptr, "Only compression windows >= 256 supported by PNG");
1511
+ window_bits = 8;
1512
+ }
1513
+
1514
+ png_ptr->zlib_text_window_bits = window_bits;
1515
+ }
1516
+
1517
+ void PNGAPI
1518
+ png_set_text_compression_method(png_structrp png_ptr, int method)
1519
+ {
1520
+ png_debug(1, "in png_set_text_compression_method");
1521
+
1522
+ if (png_ptr == NULL)
1523
+ return;
1524
+
1525
+ if (method != 8)
1526
+ png_warning(png_ptr, "Only compression method 8 is supported by PNG");
1527
+
1528
+ png_ptr->zlib_text_method = method;
1529
+ }
1530
+ #endif /* WRITE_CUSTOMIZE_ZTXT_COMPRESSION */
1531
+ /* end of API added to libpng-1.5.4 */
1532
+
1533
+ void PNGAPI
1534
+ png_set_write_status_fn(png_structrp png_ptr, png_write_status_ptr write_row_fn)
1535
+ {
1536
+ if (png_ptr == NULL)
1537
+ return;
1538
+
1539
+ png_ptr->write_row_fn = write_row_fn;
1540
+ }
1541
+
1542
+ #ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
1543
+ void PNGAPI
1544
+ png_set_write_user_transform_fn(png_structrp png_ptr, png_user_transform_ptr
1545
+ write_user_transform_fn)
1546
+ {
1547
+ png_debug(1, "in png_set_write_user_transform_fn");
1548
+
1549
+ if (png_ptr == NULL)
1550
+ return;
1551
+
1552
+ png_ptr->transformations |= PNG_USER_TRANSFORM;
1553
+ png_ptr->write_user_transform_fn = write_user_transform_fn;
1554
+ }
1555
+ #endif
1556
+
1557
+
1558
+ #ifdef PNG_INFO_IMAGE_SUPPORTED
1559
+ void PNGAPI
1560
+ png_write_png(png_structrp png_ptr, png_inforp info_ptr,
1561
+ int transforms, voidp params)
1562
+ {
1563
+ if (png_ptr == NULL || info_ptr == NULL)
1564
+ return;
1565
+
1566
+ if ((info_ptr->valid & PNG_INFO_IDAT) == 0)
1567
+ {
1568
+ png_app_error(png_ptr, "no rows for png_write_image to write");
1569
+ return;
1570
+ }
1571
+
1572
+ /* Write the file header information. */
1573
+ png_write_info(png_ptr, info_ptr);
1574
+
1575
+ /* ------ these transformations don't touch the info structure ------- */
1576
+
1577
+ /* Invert monochrome pixels */
1578
+ if ((transforms & PNG_TRANSFORM_INVERT_MONO) != 0)
1579
+ #ifdef PNG_WRITE_INVERT_SUPPORTED
1580
+ png_set_invert_mono(png_ptr);
1581
+ #else
1582
+ png_app_error(png_ptr, "PNG_TRANSFORM_INVERT_MONO not supported");
1583
+ #endif
1584
+
1585
+ /* Shift the pixels up to a legal bit depth and fill in
1586
+ * as appropriate to correctly scale the image.
1587
+ */
1588
+ if ((transforms & PNG_TRANSFORM_SHIFT) != 0)
1589
+ #ifdef PNG_WRITE_SHIFT_SUPPORTED
1590
+ if ((info_ptr->valid & PNG_INFO_sBIT) != 0)
1591
+ png_set_shift(png_ptr, &info_ptr->sig_bit);
1592
+ #else
1593
+ png_app_error(png_ptr, "PNG_TRANSFORM_SHIFT not supported");
1594
+ #endif
1595
+
1596
+ /* Pack pixels into bytes */
1597
+ if ((transforms & PNG_TRANSFORM_PACKING) != 0)
1598
+ #ifdef PNG_WRITE_PACK_SUPPORTED
1599
+ png_set_packing(png_ptr);
1600
+ #else
1601
+ png_app_error(png_ptr, "PNG_TRANSFORM_PACKING not supported");
1602
+ #endif
1603
+
1604
+ /* Swap location of alpha bytes from ARGB to RGBA */
1605
+ if ((transforms & PNG_TRANSFORM_SWAP_ALPHA) != 0)
1606
+ #ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED
1607
+ png_set_swap_alpha(png_ptr);
1608
+ #else
1609
+ png_app_error(png_ptr, "PNG_TRANSFORM_SWAP_ALPHA not supported");
1610
+ #endif
1611
+
1612
+ /* Remove a filler (X) from XRGB/RGBX/AG/GA into to convert it into
1613
+ * RGB, note that the code expects the input color type to be G or RGB; no
1614
+ * alpha channel.
1615
+ */
1616
+ if ((transforms & (PNG_TRANSFORM_STRIP_FILLER_AFTER|
1617
+ PNG_TRANSFORM_STRIP_FILLER_BEFORE)) != 0)
1618
+ {
1619
+ #ifdef PNG_WRITE_FILLER_SUPPORTED
1620
+ if ((transforms & PNG_TRANSFORM_STRIP_FILLER_AFTER) != 0)
1621
+ {
1622
+ if ((transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE) != 0)
1623
+ png_app_error(png_ptr,
1624
+ "PNG_TRANSFORM_STRIP_FILLER: BEFORE+AFTER not supported");
1625
+
1626
+ /* Continue if ignored - this is the pre-1.6.10 behavior */
1627
+ png_set_filler(png_ptr, 0, PNG_FILLER_AFTER);
1628
+ }
1629
+
1630
+ else if ((transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE) != 0)
1631
+ png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE);
1632
+ #else
1633
+ png_app_error(png_ptr, "PNG_TRANSFORM_STRIP_FILLER not supported");
1634
+ #endif
1635
+ }
1636
+
1637
+ /* Flip BGR pixels to RGB */
1638
+ if ((transforms & PNG_TRANSFORM_BGR) != 0)
1639
+ #ifdef PNG_WRITE_BGR_SUPPORTED
1640
+ png_set_bgr(png_ptr);
1641
+ #else
1642
+ png_app_error(png_ptr, "PNG_TRANSFORM_BGR not supported");
1643
+ #endif
1644
+
1645
+ /* Swap bytes of 16-bit files to most significant byte first */
1646
+ if ((transforms & PNG_TRANSFORM_SWAP_ENDIAN) != 0)
1647
+ #ifdef PNG_WRITE_SWAP_SUPPORTED
1648
+ png_set_swap(png_ptr);
1649
+ #else
1650
+ png_app_error(png_ptr, "PNG_TRANSFORM_SWAP_ENDIAN not supported");
1651
+ #endif
1652
+
1653
+ /* Swap bits of 1, 2, 4 bit packed pixel formats */
1654
+ if ((transforms & PNG_TRANSFORM_PACKSWAP) != 0)
1655
+ #ifdef PNG_WRITE_PACKSWAP_SUPPORTED
1656
+ png_set_packswap(png_ptr);
1657
+ #else
1658
+ png_app_error(png_ptr, "PNG_TRANSFORM_PACKSWAP not supported");
1659
+ #endif
1660
+
1661
+ /* Invert the alpha channel from opacity to transparency */
1662
+ if ((transforms & PNG_TRANSFORM_INVERT_ALPHA) != 0)
1663
+ #ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED
1664
+ png_set_invert_alpha(png_ptr);
1665
+ #else
1666
+ png_app_error(png_ptr, "PNG_TRANSFORM_INVERT_ALPHA not supported");
1667
+ #endif
1668
+
1669
+ /* ----------------------- end of transformations ------------------- */
1670
+
1671
+ /* Write the bits */
1672
+ png_write_image(png_ptr, info_ptr->row_pointers);
1673
+
1674
+ /* It is REQUIRED to call this to finish writing the rest of the file */
1675
+ png_write_end(png_ptr, info_ptr);
1676
+
1677
+ PNG_UNUSED(params)
1678
+ }
1679
+ #endif
1680
+
1681
+
1682
+ #ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED
1683
+ #ifdef PNG_STDIO_SUPPORTED /* currently required for png_image_write_* */
1684
+ /* Initialize the write structure - general purpose utility. */
1685
+ static int
1686
+ png_image_write_init(png_imagep image)
1687
+ {
1688
+ png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, image,
1689
+ png_safe_error, png_safe_warning);
1690
+
1691
+ if (png_ptr != NULL)
1692
+ {
1693
+ png_infop info_ptr = png_create_info_struct(png_ptr);
1694
+
1695
+ if (info_ptr != NULL)
1696
+ {
1697
+ png_controlp control = png_voidcast(png_controlp,
1698
+ png_malloc_warn(png_ptr, (sizeof *control)));
1699
+
1700
+ if (control != NULL)
1701
+ {
1702
+ memset(control, 0, (sizeof *control));
1703
+
1704
+ control->png_ptr = png_ptr;
1705
+ control->info_ptr = info_ptr;
1706
+ control->for_write = 1;
1707
+
1708
+ image->opaque = control;
1709
+ return 1;
1710
+ }
1711
+
1712
+ /* Error clean up */
1713
+ png_destroy_info_struct(png_ptr, &info_ptr);
1714
+ }
1715
+
1716
+ png_destroy_write_struct(&png_ptr, NULL);
1717
+ }
1718
+
1719
+ return png_image_error(image, "png_image_write_: out of memory");
1720
+ }
1721
+
1722
+ /* Arguments to png_image_write_main: */
1723
+ typedef struct
1724
+ {
1725
+ /* Arguments: */
1726
+ png_imagep image;
1727
+ png_const_voidp buffer;
1728
+ png_int_32 row_stride;
1729
+ png_const_voidp colormap;
1730
+ int convert_to_8bit;
1731
+ /* Local variables: */
1732
+ png_const_voidp first_row;
1733
+ ptrdiff_t row_bytes;
1734
+ png_voidp local_row;
1735
+ } png_image_write_control;
1736
+
1737
+ /* Write png_uint_16 input to a 16-bit PNG; the png_ptr has already been set to
1738
+ * do any necessary byte swapping. The component order is defined by the
1739
+ * png_image format value.
1740
+ */
1741
+ static int
1742
+ png_write_image_16bit(png_voidp argument)
1743
+ {
1744
+ png_image_write_control *display = png_voidcast(png_image_write_control*,
1745
+ argument);
1746
+ png_imagep image = display->image;
1747
+ png_structrp png_ptr = image->opaque->png_ptr;
1748
+
1749
+ png_const_uint_16p input_row = png_voidcast(png_const_uint_16p,
1750
+ display->first_row);
1751
+ png_uint_16p output_row = png_voidcast(png_uint_16p, display->local_row);
1752
+ png_uint_16p row_end;
1753
+ const int channels = (image->format & PNG_FORMAT_FLAG_COLOR) != 0 ? 3 : 1;
1754
+ int aindex = 0;
1755
+ png_uint_32 y = image->height;
1756
+
1757
+ if ((image->format & PNG_FORMAT_FLAG_ALPHA) != 0)
1758
+ {
1759
+ # ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED
1760
+ if ((image->format & PNG_FORMAT_FLAG_AFIRST) != 0)
1761
+ {
1762
+ aindex = -1;
1763
+ ++input_row; /* To point to the first component */
1764
+ ++output_row;
1765
+ }
1766
+
1767
+ else
1768
+ # endif
1769
+ aindex = channels;
1770
+ }
1771
+
1772
+ else
1773
+ png_error(png_ptr, "png_write_image: internal call error");
1774
+
1775
+ /* Work out the output row end and count over this, note that the increment
1776
+ * above to 'row' means that row_end can actually be beyond the end of the
1777
+ * row; this is correct.
1778
+ */
1779
+ row_end = output_row + image->width * (channels+1);
1780
+
1781
+ while (y-- > 0)
1782
+ {
1783
+ png_const_uint_16p in_ptr = input_row;
1784
+ png_uint_16p out_ptr = output_row;
1785
+
1786
+ while (out_ptr < row_end)
1787
+ {
1788
+ const png_uint_16 alpha = in_ptr[aindex];
1789
+ png_uint_32 reciprocal = 0;
1790
+ int c;
1791
+
1792
+ out_ptr[aindex] = alpha;
1793
+
1794
+ /* Calculate a reciprocal. The correct calculation is simply
1795
+ * component/alpha*65535 << 15. (I.e. 15 bits of precision); this
1796
+ * allows correct rounding by adding .5 before the shift. 'reciprocal'
1797
+ * is only initialized when required.
1798
+ */
1799
+ if (alpha > 0 && alpha < 65535)
1800
+ reciprocal = ((0xffff<<15)+(alpha>>1))/alpha;
1801
+
1802
+ c = channels;
1803
+ do /* always at least one channel */
1804
+ {
1805
+ png_uint_16 component = *in_ptr++;
1806
+
1807
+ /* The following gives 65535 for an alpha of 0, which is fine,
1808
+ * otherwise if 0/0 is represented as some other value there is more
1809
+ * likely to be a discontinuity which will probably damage
1810
+ * compression when moving from a fully transparent area to a
1811
+ * nearly transparent one. (The assumption here is that opaque
1812
+ * areas tend not to be 0 intensity.)
1813
+ */
1814
+ if (component >= alpha)
1815
+ component = 65535;
1816
+
1817
+ /* component<alpha, so component/alpha is less than one and
1818
+ * component*reciprocal is less than 2^31.
1819
+ */
1820
+ else if (component > 0 && alpha < 65535)
1821
+ {
1822
+ png_uint_32 calc = component * reciprocal;
1823
+ calc += 16384; /* round to nearest */
1824
+ component = (png_uint_16)(calc >> 15);
1825
+ }
1826
+
1827
+ *out_ptr++ = component;
1828
+ }
1829
+ while (--c > 0);
1830
+
1831
+ /* Skip to next component (skip the intervening alpha channel) */
1832
+ ++in_ptr;
1833
+ ++out_ptr;
1834
+ }
1835
+
1836
+ png_write_row(png_ptr, png_voidcast(png_const_bytep, display->local_row));
1837
+ input_row += display->row_bytes/(sizeof (png_uint_16));
1838
+ }
1839
+
1840
+ return 1;
1841
+ }
1842
+
1843
+ /* Given 16-bit input (1 to 4 channels) write 8-bit output. If an alpha channel
1844
+ * is present it must be removed from the components, the components are then
1845
+ * written in sRGB encoding. No components are added or removed.
1846
+ *
1847
+ * Calculate an alpha reciprocal to reverse pre-multiplication. As above the
1848
+ * calculation can be done to 15 bits of accuracy; however, the output needs to
1849
+ * be scaled in the range 0..255*65535, so include that scaling here.
1850
+ */
1851
+ #define UNP_RECIPROCAL(alpha) ((((0xffff*0xff)<<7)+(alpha>>1))/alpha)
1852
+
1853
+ static png_byte
1854
+ png_unpremultiply(png_uint_32 component, png_uint_32 alpha,
1855
+ png_uint_32 reciprocal/*from the above macro*/)
1856
+ {
1857
+ /* The following gives 1.0 for an alpha of 0, which is fine, otherwise if 0/0
1858
+ * is represented as some other value there is more likely to be a
1859
+ * discontinuity which will probably damage compression when moving from a
1860
+ * fully transparent area to a nearly transparent one. (The assumption here
1861
+ * is that opaque areas tend not to be 0 intensity.)
1862
+ *
1863
+ * There is a rounding problem here; if alpha is less than 128 it will end up
1864
+ * as 0 when scaled to 8 bits. To avoid introducing spurious colors into the
1865
+ * output change for this too.
1866
+ */
1867
+ if (component >= alpha || alpha < 128)
1868
+ return 255;
1869
+
1870
+ /* component<alpha, so component/alpha is less than one and
1871
+ * component*reciprocal is less than 2^31.
1872
+ */
1873
+ else if (component > 0)
1874
+ {
1875
+ /* The test is that alpha/257 (rounded) is less than 255, the first value
1876
+ * that becomes 255 is 65407.
1877
+ * NOTE: this must agree with the PNG_DIV257 macro (which must, therefore,
1878
+ * be exact!) [Could also test reciprocal != 0]
1879
+ */
1880
+ if (alpha < 65407)
1881
+ {
1882
+ component *= reciprocal;
1883
+ component += 64; /* round to nearest */
1884
+ component >>= 7;
1885
+ }
1886
+
1887
+ else
1888
+ component *= 255;
1889
+
1890
+ /* Convert the component to sRGB. */
1891
+ return (png_byte)PNG_sRGB_FROM_LINEAR(component);
1892
+ }
1893
+
1894
+ else
1895
+ return 0;
1896
+ }
1897
+
1898
+ static int
1899
+ png_write_image_8bit(png_voidp argument)
1900
+ {
1901
+ png_image_write_control *display = png_voidcast(png_image_write_control*,
1902
+ argument);
1903
+ png_imagep image = display->image;
1904
+ png_structrp png_ptr = image->opaque->png_ptr;
1905
+
1906
+ png_const_uint_16p input_row = png_voidcast(png_const_uint_16p,
1907
+ display->first_row);
1908
+ png_bytep output_row = png_voidcast(png_bytep, display->local_row);
1909
+ png_uint_32 y = image->height;
1910
+ const int channels = (image->format & PNG_FORMAT_FLAG_COLOR) != 0 ? 3 : 1;
1911
+
1912
+ if ((image->format & PNG_FORMAT_FLAG_ALPHA) != 0)
1913
+ {
1914
+ png_bytep row_end;
1915
+ int aindex;
1916
+
1917
+ # ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED
1918
+ if ((image->format & PNG_FORMAT_FLAG_AFIRST) != 0)
1919
+ {
1920
+ aindex = -1;
1921
+ ++input_row; /* To point to the first component */
1922
+ ++output_row;
1923
+ }
1924
+
1925
+ else
1926
+ # endif
1927
+ aindex = channels;
1928
+
1929
+ /* Use row_end in place of a loop counter: */
1930
+ row_end = output_row + image->width * (channels+1);
1931
+
1932
+ while (y-- > 0)
1933
+ {
1934
+ png_const_uint_16p in_ptr = input_row;
1935
+ png_bytep out_ptr = output_row;
1936
+
1937
+ while (out_ptr < row_end)
1938
+ {
1939
+ png_uint_16 alpha = in_ptr[aindex];
1940
+ png_byte alphabyte = (png_byte)PNG_DIV257(alpha);
1941
+ png_uint_32 reciprocal = 0;
1942
+ int c;
1943
+
1944
+ /* Scale and write the alpha channel. */
1945
+ out_ptr[aindex] = alphabyte;
1946
+
1947
+ if (alphabyte > 0 && alphabyte < 255)
1948
+ reciprocal = UNP_RECIPROCAL(alpha);
1949
+
1950
+ c = channels;
1951
+ do /* always at least one channel */
1952
+ *out_ptr++ = png_unpremultiply(*in_ptr++, alpha, reciprocal);
1953
+ while (--c > 0);
1954
+
1955
+ /* Skip to next component (skip the intervening alpha channel) */
1956
+ ++in_ptr;
1957
+ ++out_ptr;
1958
+ } /* while out_ptr < row_end */
1959
+
1960
+ png_write_row(png_ptr, png_voidcast(png_const_bytep,
1961
+ display->local_row));
1962
+ input_row += display->row_bytes/(sizeof (png_uint_16));
1963
+ } /* while y */
1964
+ }
1965
+
1966
+ else
1967
+ {
1968
+ /* No alpha channel, so the row_end really is the end of the row and it
1969
+ * is sufficient to loop over the components one by one.
1970
+ */
1971
+ png_bytep row_end = output_row + image->width * channels;
1972
+
1973
+ while (y-- > 0)
1974
+ {
1975
+ png_const_uint_16p in_ptr = input_row;
1976
+ png_bytep out_ptr = output_row;
1977
+
1978
+ while (out_ptr < row_end)
1979
+ {
1980
+ png_uint_32 component = *in_ptr++;
1981
+
1982
+ component *= 255;
1983
+ *out_ptr++ = (png_byte)PNG_sRGB_FROM_LINEAR(component);
1984
+ }
1985
+
1986
+ png_write_row(png_ptr, output_row);
1987
+ input_row += display->row_bytes/(sizeof (png_uint_16));
1988
+ }
1989
+ }
1990
+
1991
+ return 1;
1992
+ }
1993
+
1994
+ static void
1995
+ png_image_set_PLTE(png_image_write_control *display)
1996
+ {
1997
+ const png_imagep image = display->image;
1998
+ const void *cmap = display->colormap;
1999
+ const int entries = image->colormap_entries > 256 ? 256 :
2000
+ (int)image->colormap_entries;
2001
+
2002
+ /* NOTE: the caller must check for cmap != NULL and entries != 0 */
2003
+ const png_uint_32 format = image->format;
2004
+ const int channels = PNG_IMAGE_SAMPLE_CHANNELS(format);
2005
+
2006
+ # if defined(PNG_FORMAT_BGR_SUPPORTED) &&\
2007
+ defined(PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED)
2008
+ const int afirst = (format & PNG_FORMAT_FLAG_AFIRST) != 0 &&
2009
+ (format & PNG_FORMAT_FLAG_ALPHA) != 0;
2010
+ # else
2011
+ # define afirst 0
2012
+ # endif
2013
+
2014
+ # ifdef PNG_FORMAT_BGR_SUPPORTED
2015
+ const int bgr = (format & PNG_FORMAT_FLAG_BGR) != 0 ? 2 : 0;
2016
+ # else
2017
+ # define bgr 0
2018
+ # endif
2019
+
2020
+ int i, num_trans;
2021
+ png_color palette[256];
2022
+ png_byte tRNS[256];
2023
+
2024
+ memset(tRNS, 255, (sizeof tRNS));
2025
+ memset(palette, 0, (sizeof palette));
2026
+
2027
+ for (i=num_trans=0; i<entries; ++i)
2028
+ {
2029
+ /* This gets automatically converted to sRGB with reversal of the
2030
+ * pre-multiplication if the color-map has an alpha channel.
2031
+ */
2032
+ if ((format & PNG_FORMAT_FLAG_LINEAR) != 0)
2033
+ {
2034
+ png_const_uint_16p entry = png_voidcast(png_const_uint_16p, cmap);
2035
+
2036
+ entry += i * channels;
2037
+
2038
+ if ((channels & 1) != 0) /* no alpha */
2039
+ {
2040
+ if (channels >= 3) /* RGB */
2041
+ {
2042
+ palette[i].blue = (png_byte)PNG_sRGB_FROM_LINEAR(255 *
2043
+ entry[(2 ^ bgr)]);
2044
+ palette[i].green = (png_byte)PNG_sRGB_FROM_LINEAR(255 *
2045
+ entry[1]);
2046
+ palette[i].red = (png_byte)PNG_sRGB_FROM_LINEAR(255 *
2047
+ entry[bgr]);
2048
+ }
2049
+
2050
+ else /* Gray */
2051
+ palette[i].blue = palette[i].red = palette[i].green =
2052
+ (png_byte)PNG_sRGB_FROM_LINEAR(255 * *entry);
2053
+ }
2054
+
2055
+ else /* alpha */
2056
+ {
2057
+ png_uint_16 alpha = entry[afirst ? 0 : channels-1];
2058
+ png_byte alphabyte = (png_byte)PNG_DIV257(alpha);
2059
+ png_uint_32 reciprocal = 0;
2060
+
2061
+ /* Calculate a reciprocal, as in the png_write_image_8bit code above
2062
+ * this is designed to produce a value scaled to 255*65535 when
2063
+ * divided by 128 (i.e. asr 7).
2064
+ */
2065
+ if (alphabyte > 0 && alphabyte < 255)
2066
+ reciprocal = (((0xffff*0xff)<<7)+(alpha>>1))/alpha;
2067
+
2068
+ tRNS[i] = alphabyte;
2069
+ if (alphabyte < 255)
2070
+ num_trans = i+1;
2071
+
2072
+ if (channels >= 3) /* RGB */
2073
+ {
2074
+ palette[i].blue = png_unpremultiply(entry[afirst + (2 ^ bgr)],
2075
+ alpha, reciprocal);
2076
+ palette[i].green = png_unpremultiply(entry[afirst + 1], alpha,
2077
+ reciprocal);
2078
+ palette[i].red = png_unpremultiply(entry[afirst + bgr], alpha,
2079
+ reciprocal);
2080
+ }
2081
+
2082
+ else /* gray */
2083
+ palette[i].blue = palette[i].red = palette[i].green =
2084
+ png_unpremultiply(entry[afirst], alpha, reciprocal);
2085
+ }
2086
+ }
2087
+
2088
+ else /* Color-map has sRGB values */
2089
+ {
2090
+ png_const_bytep entry = png_voidcast(png_const_bytep, cmap);
2091
+
2092
+ entry += i * channels;
2093
+
2094
+ switch (channels)
2095
+ {
2096
+ case 4:
2097
+ tRNS[i] = entry[afirst ? 0 : 3];
2098
+ if (tRNS[i] < 255)
2099
+ num_trans = i+1;
2100
+ /* FALL THROUGH */
2101
+ case 3:
2102
+ palette[i].blue = entry[afirst + (2 ^ bgr)];
2103
+ palette[i].green = entry[afirst + 1];
2104
+ palette[i].red = entry[afirst + bgr];
2105
+ break;
2106
+
2107
+ case 2:
2108
+ tRNS[i] = entry[1 ^ afirst];
2109
+ if (tRNS[i] < 255)
2110
+ num_trans = i+1;
2111
+ /* FALL THROUGH */
2112
+ case 1:
2113
+ palette[i].blue = palette[i].red = palette[i].green =
2114
+ entry[afirst];
2115
+ break;
2116
+
2117
+ default:
2118
+ break;
2119
+ }
2120
+ }
2121
+ }
2122
+
2123
+ # ifdef afirst
2124
+ # undef afirst
2125
+ # endif
2126
+ # ifdef bgr
2127
+ # undef bgr
2128
+ # endif
2129
+
2130
+ png_set_PLTE(image->opaque->png_ptr, image->opaque->info_ptr, palette,
2131
+ entries);
2132
+
2133
+ if (num_trans > 0)
2134
+ png_set_tRNS(image->opaque->png_ptr, image->opaque->info_ptr, tRNS,
2135
+ num_trans, NULL);
2136
+
2137
+ image->colormap_entries = entries;
2138
+ }
2139
+
2140
+ static int
2141
+ png_image_write_main(png_voidp argument)
2142
+ {
2143
+ png_image_write_control *display = png_voidcast(png_image_write_control*,
2144
+ argument);
2145
+ png_imagep image = display->image;
2146
+ png_structrp png_ptr = image->opaque->png_ptr;
2147
+ png_inforp info_ptr = image->opaque->info_ptr;
2148
+ png_uint_32 format = image->format;
2149
+
2150
+ /* The following four ints are actually booleans */
2151
+ int colormap = (format & PNG_FORMAT_FLAG_COLORMAP);
2152
+ int linear = !colormap && (format & PNG_FORMAT_FLAG_LINEAR); /* input */
2153
+ int alpha = !colormap && (format & PNG_FORMAT_FLAG_ALPHA);
2154
+ int write_16bit = linear && !colormap && (display->convert_to_8bit == 0);
2155
+
2156
+ # ifdef PNG_BENIGN_ERRORS_SUPPORTED
2157
+ /* Make sure we error out on any bad situation */
2158
+ png_set_benign_errors(png_ptr, 0/*error*/);
2159
+ # endif
2160
+
2161
+ /* Default the 'row_stride' parameter if required. */
2162
+ if (display->row_stride == 0)
2163
+ display->row_stride = PNG_IMAGE_ROW_STRIDE(*image);
2164
+
2165
+ /* Set the required transforms then write the rows in the correct order. */
2166
+ if ((format & PNG_FORMAT_FLAG_COLORMAP) != 0)
2167
+ {
2168
+ if (display->colormap != NULL && image->colormap_entries > 0)
2169
+ {
2170
+ png_uint_32 entries = image->colormap_entries;
2171
+
2172
+ png_set_IHDR(png_ptr, info_ptr, image->width, image->height,
2173
+ entries > 16 ? 8 : (entries > 4 ? 4 : (entries > 2 ? 2 : 1)),
2174
+ PNG_COLOR_TYPE_PALETTE, PNG_INTERLACE_NONE,
2175
+ PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
2176
+
2177
+ png_image_set_PLTE(display);
2178
+ }
2179
+
2180
+ else
2181
+ png_error(image->opaque->png_ptr,
2182
+ "no color-map for color-mapped image");
2183
+ }
2184
+
2185
+ else
2186
+ png_set_IHDR(png_ptr, info_ptr, image->width, image->height,
2187
+ write_16bit ? 16 : 8,
2188
+ ((format & PNG_FORMAT_FLAG_COLOR) ? PNG_COLOR_MASK_COLOR : 0) +
2189
+ ((format & PNG_FORMAT_FLAG_ALPHA) ? PNG_COLOR_MASK_ALPHA : 0),
2190
+ PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
2191
+
2192
+ /* Counter-intuitively the data transformations must be called *after*
2193
+ * png_write_info, not before as in the read code, but the 'set' functions
2194
+ * must still be called before. Just set the color space information, never
2195
+ * write an interlaced image.
2196
+ */
2197
+
2198
+ if (write_16bit != 0)
2199
+ {
2200
+ /* The gamma here is 1.0 (linear) and the cHRM chunk matches sRGB. */
2201
+ png_set_gAMA_fixed(png_ptr, info_ptr, PNG_GAMMA_LINEAR);
2202
+
2203
+ if ((image->flags & PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB) == 0)
2204
+ png_set_cHRM_fixed(png_ptr, info_ptr,
2205
+ /* color x y */
2206
+ /* white */ 31270, 32900,
2207
+ /* red */ 64000, 33000,
2208
+ /* green */ 30000, 60000,
2209
+ /* blue */ 15000, 6000
2210
+ );
2211
+ }
2212
+
2213
+ else if ((image->flags & PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB) == 0)
2214
+ png_set_sRGB(png_ptr, info_ptr, PNG_sRGB_INTENT_PERCEPTUAL);
2215
+
2216
+ /* Else writing an 8-bit file and the *colors* aren't sRGB, but the 8-bit
2217
+ * space must still be gamma encoded.
2218
+ */
2219
+ else
2220
+ png_set_gAMA_fixed(png_ptr, info_ptr, PNG_GAMMA_sRGB_INVERSE);
2221
+
2222
+ /* Write the file header. */
2223
+ png_write_info(png_ptr, info_ptr);
2224
+
2225
+ /* Now set up the data transformations (*after* the header is written),
2226
+ * remove the handled transformations from the 'format' flags for checking.
2227
+ *
2228
+ * First check for a little endian system if writing 16 bit files.
2229
+ */
2230
+ if (write_16bit != 0)
2231
+ {
2232
+ PNG_CONST png_uint_16 le = 0x0001;
2233
+
2234
+ if ((*(png_const_bytep) & le) != 0)
2235
+ png_set_swap(png_ptr);
2236
+ }
2237
+
2238
+ # ifdef PNG_SIMPLIFIED_WRITE_BGR_SUPPORTED
2239
+ if ((format & PNG_FORMAT_FLAG_BGR) != 0)
2240
+ {
2241
+ if (colormap == 0 && (format & PNG_FORMAT_FLAG_COLOR) != 0)
2242
+ png_set_bgr(png_ptr);
2243
+ format &= ~PNG_FORMAT_FLAG_BGR;
2244
+ }
2245
+ # endif
2246
+
2247
+ # ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED
2248
+ if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
2249
+ {
2250
+ if (colormap == 0 && (format & PNG_FORMAT_FLAG_ALPHA) != 0)
2251
+ png_set_swap_alpha(png_ptr);
2252
+ format &= ~PNG_FORMAT_FLAG_AFIRST;
2253
+ }
2254
+ # endif
2255
+
2256
+ /* If there are 16 or fewer color-map entries we wrote a lower bit depth
2257
+ * above, but the application data is still byte packed.
2258
+ */
2259
+ if (colormap != 0 && image->colormap_entries <= 16)
2260
+ png_set_packing(png_ptr);
2261
+
2262
+ /* That should have handled all (both) the transforms. */
2263
+ if ((format & ~(png_uint_32)(PNG_FORMAT_FLAG_COLOR | PNG_FORMAT_FLAG_LINEAR |
2264
+ PNG_FORMAT_FLAG_ALPHA | PNG_FORMAT_FLAG_COLORMAP)) != 0)
2265
+ png_error(png_ptr, "png_write_image: unsupported transformation");
2266
+
2267
+ {
2268
+ png_const_bytep row = png_voidcast(png_const_bytep, display->buffer);
2269
+ ptrdiff_t row_bytes = display->row_stride;
2270
+
2271
+ if (linear != 0)
2272
+ row_bytes *= (sizeof (png_uint_16));
2273
+
2274
+ if (row_bytes < 0)
2275
+ row += (image->height-1) * (-row_bytes);
2276
+
2277
+ display->first_row = row;
2278
+ display->row_bytes = row_bytes;
2279
+ }
2280
+
2281
+ /* Apply 'fast' options if the flag is set. */
2282
+ if ((image->flags & PNG_IMAGE_FLAG_FAST) != 0)
2283
+ {
2284
+ png_set_filter(png_ptr, PNG_FILTER_TYPE_BASE, PNG_NO_FILTERS);
2285
+ /* NOTE: determined by experiment using pngstest, this reflects some
2286
+ * balance between the time to write the image once and the time to read
2287
+ * it about 50 times. The speed-up in pngstest was about 10-20% of the
2288
+ * total (user) time on a heavily loaded system.
2289
+ */
2290
+ png_set_compression_level(png_ptr, 3);
2291
+ }
2292
+
2293
+ /* Check for the cases that currently require a pre-transform on the row
2294
+ * before it is written. This only applies when the input is 16-bit and
2295
+ * either there is an alpha channel or it is converted to 8-bit.
2296
+ */
2297
+ if ((linear != 0 && alpha != 0 ) ||
2298
+ (colormap == 0 && display->convert_to_8bit != 0))
2299
+ {
2300
+ png_bytep row = png_voidcast(png_bytep, png_malloc(png_ptr,
2301
+ png_get_rowbytes(png_ptr, info_ptr)));
2302
+ int result;
2303
+
2304
+ display->local_row = row;
2305
+ if (write_16bit != 0)
2306
+ result = png_safe_execute(image, png_write_image_16bit, display);
2307
+ else
2308
+ result = png_safe_execute(image, png_write_image_8bit, display);
2309
+ display->local_row = NULL;
2310
+
2311
+ png_free(png_ptr, row);
2312
+
2313
+ /* Skip the 'write_end' on error: */
2314
+ if (result == 0)
2315
+ return 0;
2316
+ }
2317
+
2318
+ /* Otherwise this is the case where the input is in a format currently
2319
+ * supported by the rest of the libpng write code; call it directly.
2320
+ */
2321
+ else
2322
+ {
2323
+ png_const_bytep row = png_voidcast(png_const_bytep, display->first_row);
2324
+ ptrdiff_t row_bytes = display->row_bytes;
2325
+ png_uint_32 y = image->height;
2326
+
2327
+ while (y-- > 0)
2328
+ {
2329
+ png_write_row(png_ptr, row);
2330
+ row += row_bytes;
2331
+ }
2332
+ }
2333
+
2334
+ png_write_end(png_ptr, info_ptr);
2335
+ return 1;
2336
+ }
2337
+
2338
+ int PNGAPI
2339
+ png_image_write_to_stdio(png_imagep image, FILE *file, int convert_to_8bit,
2340
+ const void *buffer, png_int_32 row_stride, const void *colormap)
2341
+ {
2342
+ /* Write the image to the given (FILE*). */
2343
+ if (image != NULL && image->version == PNG_IMAGE_VERSION)
2344
+ {
2345
+ if (file != NULL)
2346
+ {
2347
+ if (png_image_write_init(image) != 0)
2348
+ {
2349
+ png_image_write_control display;
2350
+ int result;
2351
+
2352
+ /* This is slightly evil, but png_init_io doesn't do anything other
2353
+ * than this and we haven't changed the standard IO functions so
2354
+ * this saves a 'safe' function.
2355
+ */
2356
+ image->opaque->png_ptr->io_ptr = file;
2357
+
2358
+ memset(&display, 0, (sizeof display));
2359
+ display.image = image;
2360
+ display.buffer = buffer;
2361
+ display.row_stride = row_stride;
2362
+ display.colormap = colormap;
2363
+ display.convert_to_8bit = convert_to_8bit;
2364
+
2365
+ result = png_safe_execute(image, png_image_write_main, &display);
2366
+ png_image_free(image);
2367
+ return result;
2368
+ }
2369
+
2370
+ else
2371
+ return 0;
2372
+ }
2373
+
2374
+ else
2375
+ return png_image_error(image,
2376
+ "png_image_write_to_stdio: invalid argument");
2377
+ }
2378
+
2379
+ else if (image != NULL)
2380
+ return png_image_error(image,
2381
+ "png_image_write_to_stdio: incorrect PNG_IMAGE_VERSION");
2382
+
2383
+ else
2384
+ return 0;
2385
+ }
2386
+
2387
+ int PNGAPI
2388
+ png_image_write_to_file(png_imagep image, const char *file_name,
2389
+ int convert_to_8bit, const void *buffer, png_int_32 row_stride,
2390
+ const void *colormap)
2391
+ {
2392
+ /* Write the image to the named file. */
2393
+ if (image != NULL && image->version == PNG_IMAGE_VERSION)
2394
+ {
2395
+ if (file_name != NULL)
2396
+ {
2397
+ FILE *fp = fopen(file_name, "wb");
2398
+
2399
+ if (fp != NULL)
2400
+ {
2401
+ if (png_image_write_to_stdio(image, fp, convert_to_8bit, buffer,
2402
+ row_stride, colormap) != 0)
2403
+ {
2404
+ int error; /* from fflush/fclose */
2405
+
2406
+ /* Make sure the file is flushed correctly. */
2407
+ if (fflush(fp) == 0 && ferror(fp) == 0)
2408
+ {
2409
+ if (fclose(fp) == 0)
2410
+ return 1;
2411
+
2412
+ error = errno; /* from fclose */
2413
+ }
2414
+
2415
+ else
2416
+ {
2417
+ error = errno; /* from fflush or ferror */
2418
+ (void)fclose(fp);
2419
+ }
2420
+
2421
+ (void)remove(file_name);
2422
+ /* The image has already been cleaned up; this is just used to
2423
+ * set the error (because the original write succeeded).
2424
+ */
2425
+ return png_image_error(image, strerror(error));
2426
+ }
2427
+
2428
+ else
2429
+ {
2430
+ /* Clean up: just the opened file. */
2431
+ (void)fclose(fp);
2432
+ (void)remove(file_name);
2433
+ return 0;
2434
+ }
2435
+ }
2436
+
2437
+ else
2438
+ return png_image_error(image, strerror(errno));
2439
+ }
2440
+
2441
+ else
2442
+ return png_image_error(image,
2443
+ "png_image_write_to_file: invalid argument");
2444
+ }
2445
+
2446
+ else if (image != NULL)
2447
+ return png_image_error(image,
2448
+ "png_image_write_to_file: incorrect PNG_IMAGE_VERSION");
2449
+
2450
+ else
2451
+ return 0;
2452
+ }
2453
+ #endif /* STDIO */
2454
+ #endif /* SIMPLIFIED_WRITE */
2455
+ #endif /* WRITE */