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,4994 @@
1
+
2
+ /* pngrtran.c - transforms the data in a row for PNG readers
3
+ *
4
+ * Last changed in libpng 1.6.15 [November 20, 2014]
5
+ * Copyright (c) 1998-2014 Glenn Randers-Pehrson
6
+ * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
7
+ * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
8
+ *
9
+ * This code is released under the libpng license.
10
+ * For conditions of distribution and use, see the disclaimer
11
+ * and license in png.h
12
+ *
13
+ * This file contains functions optionally called by an application
14
+ * in order to tell libpng how to handle data when reading a PNG.
15
+ * Transformations that are used in both reading and writing are
16
+ * in pngtrans.c.
17
+ */
18
+
19
+ #include "pngpriv.h"
20
+
21
+ #ifdef PNG_READ_SUPPORTED
22
+
23
+ /* Set the action on getting a CRC error for an ancillary or critical chunk. */
24
+ void PNGAPI
25
+ png_set_crc_action(png_structrp png_ptr, int crit_action, int ancil_action)
26
+ {
27
+ png_debug(1, "in png_set_crc_action");
28
+
29
+ if (png_ptr == NULL)
30
+ return;
31
+
32
+ /* Tell libpng how we react to CRC errors in critical chunks */
33
+ switch (crit_action)
34
+ {
35
+ case PNG_CRC_NO_CHANGE: /* Leave setting as is */
36
+ break;
37
+
38
+ case PNG_CRC_WARN_USE: /* Warn/use data */
39
+ png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK;
40
+ png_ptr->flags |= PNG_FLAG_CRC_CRITICAL_USE;
41
+ break;
42
+
43
+ case PNG_CRC_QUIET_USE: /* Quiet/use data */
44
+ png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK;
45
+ png_ptr->flags |= PNG_FLAG_CRC_CRITICAL_USE |
46
+ PNG_FLAG_CRC_CRITICAL_IGNORE;
47
+ break;
48
+
49
+ case PNG_CRC_WARN_DISCARD: /* Not a valid action for critical data */
50
+ png_warning(png_ptr,
51
+ "Can't discard critical data on CRC error");
52
+ case PNG_CRC_ERROR_QUIT: /* Error/quit */
53
+
54
+ case PNG_CRC_DEFAULT:
55
+ default:
56
+ png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK;
57
+ break;
58
+ }
59
+
60
+ /* Tell libpng how we react to CRC errors in ancillary chunks */
61
+ switch (ancil_action)
62
+ {
63
+ case PNG_CRC_NO_CHANGE: /* Leave setting as is */
64
+ break;
65
+
66
+ case PNG_CRC_WARN_USE: /* Warn/use data */
67
+ png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK;
68
+ png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_USE;
69
+ break;
70
+
71
+ case PNG_CRC_QUIET_USE: /* Quiet/use data */
72
+ png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK;
73
+ png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_USE |
74
+ PNG_FLAG_CRC_ANCILLARY_NOWARN;
75
+ break;
76
+
77
+ case PNG_CRC_ERROR_QUIT: /* Error/quit */
78
+ png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK;
79
+ png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_NOWARN;
80
+ break;
81
+
82
+ case PNG_CRC_WARN_DISCARD: /* Warn/discard data */
83
+
84
+ case PNG_CRC_DEFAULT:
85
+ default:
86
+ png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK;
87
+ break;
88
+ }
89
+ }
90
+
91
+ #ifdef PNG_READ_TRANSFORMS_SUPPORTED
92
+ /* Is it OK to set a transformation now? Only if png_start_read_image or
93
+ * png_read_update_info have not been called. It is not necessary for the IHDR
94
+ * to have been read in all cases; the need_IHDR parameter allows for this
95
+ * check too.
96
+ */
97
+ static int
98
+ png_rtran_ok(png_structrp png_ptr, int need_IHDR)
99
+ {
100
+ if (png_ptr != NULL)
101
+ {
102
+ if ((png_ptr->flags & PNG_FLAG_ROW_INIT) != 0)
103
+ png_app_error(png_ptr,
104
+ "invalid after png_start_read_image or png_read_update_info");
105
+
106
+ else if (need_IHDR && (png_ptr->mode & PNG_HAVE_IHDR) == 0)
107
+ png_app_error(png_ptr, "invalid before the PNG header has been read");
108
+
109
+ else
110
+ {
111
+ /* Turn on failure to initialize correctly for all transforms. */
112
+ png_ptr->flags |= PNG_FLAG_DETECT_UNINITIALIZED;
113
+
114
+ return 1; /* Ok */
115
+ }
116
+ }
117
+
118
+ return 0; /* no png_error possible! */
119
+ }
120
+ #endif
121
+
122
+ #ifdef PNG_READ_BACKGROUND_SUPPORTED
123
+ /* Handle alpha and tRNS via a background color */
124
+ void PNGFAPI
125
+ png_set_background_fixed(png_structrp png_ptr,
126
+ png_const_color_16p background_color, int background_gamma_code,
127
+ int need_expand, png_fixed_point background_gamma)
128
+ {
129
+ png_debug(1, "in png_set_background_fixed");
130
+
131
+ if (png_rtran_ok(png_ptr, 0) == 0 || background_color == NULL)
132
+ return;
133
+
134
+ if (background_gamma_code == PNG_BACKGROUND_GAMMA_UNKNOWN)
135
+ {
136
+ png_warning(png_ptr, "Application must supply a known background gamma");
137
+ return;
138
+ }
139
+
140
+ png_ptr->transformations |= PNG_COMPOSE | PNG_STRIP_ALPHA;
141
+ png_ptr->transformations &= ~PNG_ENCODE_ALPHA;
142
+ png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;
143
+
144
+ png_ptr->background = *background_color;
145
+ png_ptr->background_gamma = background_gamma;
146
+ png_ptr->background_gamma_type = (png_byte)(background_gamma_code);
147
+ if (need_expand != 0)
148
+ png_ptr->transformations |= PNG_BACKGROUND_EXPAND;
149
+ else
150
+ png_ptr->transformations &= ~PNG_BACKGROUND_EXPAND;
151
+ }
152
+
153
+ # ifdef PNG_FLOATING_POINT_SUPPORTED
154
+ void PNGAPI
155
+ png_set_background(png_structrp png_ptr,
156
+ png_const_color_16p background_color, int background_gamma_code,
157
+ int need_expand, double background_gamma)
158
+ {
159
+ png_set_background_fixed(png_ptr, background_color, background_gamma_code,
160
+ need_expand, png_fixed(png_ptr, background_gamma, "png_set_background"));
161
+ }
162
+ # endif /* FLOATING_POINT */
163
+ #endif /* READ_BACKGROUND */
164
+
165
+ /* Scale 16-bit depth files to 8-bit depth. If both of these are set then the
166
+ * one that pngrtran does first (scale) happens. This is necessary to allow the
167
+ * TRANSFORM and API behavior to be somewhat consistent, and it's simpler.
168
+ */
169
+ #ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
170
+ void PNGAPI
171
+ png_set_scale_16(png_structrp png_ptr)
172
+ {
173
+ png_debug(1, "in png_set_scale_16");
174
+
175
+ if (png_rtran_ok(png_ptr, 0) == 0)
176
+ return;
177
+
178
+ png_ptr->transformations |= PNG_SCALE_16_TO_8;
179
+ }
180
+ #endif
181
+
182
+ #ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
183
+ /* Chop 16-bit depth files to 8-bit depth */
184
+ void PNGAPI
185
+ png_set_strip_16(png_structrp png_ptr)
186
+ {
187
+ png_debug(1, "in png_set_strip_16");
188
+
189
+ if (png_rtran_ok(png_ptr, 0) == 0)
190
+ return;
191
+
192
+ png_ptr->transformations |= PNG_16_TO_8;
193
+ }
194
+ #endif
195
+
196
+ #ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
197
+ void PNGAPI
198
+ png_set_strip_alpha(png_structrp png_ptr)
199
+ {
200
+ png_debug(1, "in png_set_strip_alpha");
201
+
202
+ if (png_rtran_ok(png_ptr, 0) == 0)
203
+ return;
204
+
205
+ png_ptr->transformations |= PNG_STRIP_ALPHA;
206
+ }
207
+ #endif
208
+
209
+ #if defined(PNG_READ_ALPHA_MODE_SUPPORTED) || defined(PNG_READ_GAMMA_SUPPORTED)
210
+ static png_fixed_point
211
+ translate_gamma_flags(png_structrp png_ptr, png_fixed_point output_gamma,
212
+ int is_screen)
213
+ {
214
+ /* Check for flag values. The main reason for having the old Mac value as a
215
+ * flag is that it is pretty near impossible to work out what the correct
216
+ * value is from Apple documentation - a working Mac system is needed to
217
+ * discover the value!
218
+ */
219
+ if (output_gamma == PNG_DEFAULT_sRGB ||
220
+ output_gamma == PNG_FP_1 / PNG_DEFAULT_sRGB)
221
+ {
222
+ /* If there is no sRGB support this just sets the gamma to the standard
223
+ * sRGB value. (This is a side effect of using this function!)
224
+ */
225
+ # ifdef PNG_READ_sRGB_SUPPORTED
226
+ png_ptr->flags |= PNG_FLAG_ASSUME_sRGB;
227
+ # else
228
+ PNG_UNUSED(png_ptr)
229
+ # endif
230
+ if (is_screen != 0)
231
+ output_gamma = PNG_GAMMA_sRGB;
232
+ else
233
+ output_gamma = PNG_GAMMA_sRGB_INVERSE;
234
+ }
235
+
236
+ else if (output_gamma == PNG_GAMMA_MAC_18 ||
237
+ output_gamma == PNG_FP_1 / PNG_GAMMA_MAC_18)
238
+ {
239
+ if (is_screen != 0)
240
+ output_gamma = PNG_GAMMA_MAC_OLD;
241
+ else
242
+ output_gamma = PNG_GAMMA_MAC_INVERSE;
243
+ }
244
+
245
+ return output_gamma;
246
+ }
247
+
248
+ # ifdef PNG_FLOATING_POINT_SUPPORTED
249
+ static png_fixed_point
250
+ convert_gamma_value(png_structrp png_ptr, double output_gamma)
251
+ {
252
+ /* The following silently ignores cases where fixed point (times 100,000)
253
+ * gamma values are passed to the floating point API. This is safe and it
254
+ * means the fixed point constants work just fine with the floating point
255
+ * API. The alternative would just lead to undetected errors and spurious
256
+ * bug reports. Negative values fail inside the _fixed API unless they
257
+ * correspond to the flag values.
258
+ */
259
+ if (output_gamma > 0 && output_gamma < 128)
260
+ output_gamma *= PNG_FP_1;
261
+
262
+ /* This preserves -1 and -2 exactly: */
263
+ output_gamma = floor(output_gamma + .5);
264
+
265
+ if (output_gamma > PNG_FP_MAX || output_gamma < PNG_FP_MIN)
266
+ png_fixed_error(png_ptr, "gamma value");
267
+
268
+ return (png_fixed_point)output_gamma;
269
+ }
270
+ # endif
271
+ #endif /* READ_ALPHA_MODE || READ_GAMMA */
272
+
273
+ #ifdef PNG_READ_ALPHA_MODE_SUPPORTED
274
+ void PNGFAPI
275
+ png_set_alpha_mode_fixed(png_structrp png_ptr, int mode,
276
+ png_fixed_point output_gamma)
277
+ {
278
+ int compose = 0;
279
+ png_fixed_point file_gamma;
280
+
281
+ png_debug(1, "in png_set_alpha_mode");
282
+
283
+ if (png_rtran_ok(png_ptr, 0) == 0)
284
+ return;
285
+
286
+ output_gamma = translate_gamma_flags(png_ptr, output_gamma, 1/*screen*/);
287
+
288
+ /* Validate the value to ensure it is in a reasonable range. The value
289
+ * is expected to be 1 or greater, but this range test allows for some
290
+ * viewing correction values. The intent is to weed out users of this API
291
+ * who use the inverse of the gamma value accidentally! Since some of these
292
+ * values are reasonable this may have to be changed.
293
+ */
294
+ if (output_gamma < 70000 || output_gamma > 300000)
295
+ png_error(png_ptr, "output gamma out of expected range");
296
+
297
+ /* The default file gamma is the inverse of the output gamma; the output
298
+ * gamma may be changed below so get the file value first:
299
+ */
300
+ file_gamma = png_reciprocal(output_gamma);
301
+
302
+ /* There are really 8 possibilities here, composed of any combination
303
+ * of:
304
+ *
305
+ * premultiply the color channels
306
+ * do not encode non-opaque pixels
307
+ * encode the alpha as well as the color channels
308
+ *
309
+ * The differences disappear if the input/output ('screen') gamma is 1.0,
310
+ * because then the encoding is a no-op and there is only the choice of
311
+ * premultiplying the color channels or not.
312
+ *
313
+ * png_set_alpha_mode and png_set_background interact because both use
314
+ * png_compose to do the work. Calling both is only useful when
315
+ * png_set_alpha_mode is used to set the default mode - PNG_ALPHA_PNG - along
316
+ * with a default gamma value. Otherwise PNG_COMPOSE must not be set.
317
+ */
318
+ switch (mode)
319
+ {
320
+ case PNG_ALPHA_PNG: /* default: png standard */
321
+ /* No compose, but it may be set by png_set_background! */
322
+ png_ptr->transformations &= ~PNG_ENCODE_ALPHA;
323
+ png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;
324
+ break;
325
+
326
+ case PNG_ALPHA_ASSOCIATED: /* color channels premultiplied */
327
+ compose = 1;
328
+ png_ptr->transformations &= ~PNG_ENCODE_ALPHA;
329
+ png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;
330
+ /* The output is linear: */
331
+ output_gamma = PNG_FP_1;
332
+ break;
333
+
334
+ case PNG_ALPHA_OPTIMIZED: /* associated, non-opaque pixels linear */
335
+ compose = 1;
336
+ png_ptr->transformations &= ~PNG_ENCODE_ALPHA;
337
+ png_ptr->flags |= PNG_FLAG_OPTIMIZE_ALPHA;
338
+ /* output_gamma records the encoding of opaque pixels! */
339
+ break;
340
+
341
+ case PNG_ALPHA_BROKEN: /* associated, non-linear, alpha encoded */
342
+ compose = 1;
343
+ png_ptr->transformations |= PNG_ENCODE_ALPHA;
344
+ png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;
345
+ break;
346
+
347
+ default:
348
+ png_error(png_ptr, "invalid alpha mode");
349
+ }
350
+
351
+ /* Only set the default gamma if the file gamma has not been set (this has
352
+ * the side effect that the gamma in a second call to png_set_alpha_mode will
353
+ * be ignored.)
354
+ */
355
+ if (png_ptr->colorspace.gamma == 0)
356
+ {
357
+ png_ptr->colorspace.gamma = file_gamma;
358
+ png_ptr->colorspace.flags |= PNG_COLORSPACE_HAVE_GAMMA;
359
+ }
360
+
361
+ /* But always set the output gamma: */
362
+ png_ptr->screen_gamma = output_gamma;
363
+
364
+ /* Finally, if pre-multiplying, set the background fields to achieve the
365
+ * desired result.
366
+ */
367
+ if (compose != 0)
368
+ {
369
+ /* And obtain alpha pre-multiplication by composing on black: */
370
+ memset(&png_ptr->background, 0, (sizeof png_ptr->background));
371
+ png_ptr->background_gamma = png_ptr->colorspace.gamma; /* just in case */
372
+ png_ptr->background_gamma_type = PNG_BACKGROUND_GAMMA_FILE;
373
+ png_ptr->transformations &= ~PNG_BACKGROUND_EXPAND;
374
+
375
+ if ((png_ptr->transformations & PNG_COMPOSE) != 0)
376
+ png_error(png_ptr,
377
+ "conflicting calls to set alpha mode and background");
378
+
379
+ png_ptr->transformations |= PNG_COMPOSE;
380
+ }
381
+ }
382
+
383
+ # ifdef PNG_FLOATING_POINT_SUPPORTED
384
+ void PNGAPI
385
+ png_set_alpha_mode(png_structrp png_ptr, int mode, double output_gamma)
386
+ {
387
+ png_set_alpha_mode_fixed(png_ptr, mode, convert_gamma_value(png_ptr,
388
+ output_gamma));
389
+ }
390
+ # endif
391
+ #endif
392
+
393
+ #ifdef PNG_READ_QUANTIZE_SUPPORTED
394
+ /* Dither file to 8-bit. Supply a palette, the current number
395
+ * of elements in the palette, the maximum number of elements
396
+ * allowed, and a histogram if possible. If the current number
397
+ * of colors is greater then the maximum number, the palette will be
398
+ * modified to fit in the maximum number. "full_quantize" indicates
399
+ * whether we need a quantizing cube set up for RGB images, or if we
400
+ * simply are reducing the number of colors in a paletted image.
401
+ */
402
+
403
+ typedef struct png_dsort_struct
404
+ {
405
+ struct png_dsort_struct * next;
406
+ png_byte left;
407
+ png_byte right;
408
+ } png_dsort;
409
+ typedef png_dsort * png_dsortp;
410
+ typedef png_dsort * * png_dsortpp;
411
+
412
+ void PNGAPI
413
+ png_set_quantize(png_structrp png_ptr, png_colorp palette,
414
+ int num_palette, int maximum_colors, png_const_uint_16p histogram,
415
+ int full_quantize)
416
+ {
417
+ png_debug(1, "in png_set_quantize");
418
+
419
+ if (png_rtran_ok(png_ptr, 0) == 0)
420
+ return;
421
+
422
+ png_ptr->transformations |= PNG_QUANTIZE;
423
+
424
+ if (full_quantize == 0)
425
+ {
426
+ int i;
427
+
428
+ png_ptr->quantize_index = (png_bytep)png_malloc(png_ptr,
429
+ (png_uint_32)(num_palette * (sizeof (png_byte))));
430
+ for (i = 0; i < num_palette; i++)
431
+ png_ptr->quantize_index[i] = (png_byte)i;
432
+ }
433
+
434
+ if (num_palette > maximum_colors)
435
+ {
436
+ if (histogram != NULL)
437
+ {
438
+ /* This is easy enough, just throw out the least used colors.
439
+ * Perhaps not the best solution, but good enough.
440
+ */
441
+
442
+ int i;
443
+
444
+ /* Initialize an array to sort colors */
445
+ png_ptr->quantize_sort = (png_bytep)png_malloc(png_ptr,
446
+ (png_uint_32)(num_palette * (sizeof (png_byte))));
447
+
448
+ /* Initialize the quantize_sort array */
449
+ for (i = 0; i < num_palette; i++)
450
+ png_ptr->quantize_sort[i] = (png_byte)i;
451
+
452
+ /* Find the least used palette entries by starting a
453
+ * bubble sort, and running it until we have sorted
454
+ * out enough colors. Note that we don't care about
455
+ * sorting all the colors, just finding which are
456
+ * least used.
457
+ */
458
+
459
+ for (i = num_palette - 1; i >= maximum_colors; i--)
460
+ {
461
+ int done; /* To stop early if the list is pre-sorted */
462
+ int j;
463
+
464
+ done = 1;
465
+ for (j = 0; j < i; j++)
466
+ {
467
+ if (histogram[png_ptr->quantize_sort[j]]
468
+ < histogram[png_ptr->quantize_sort[j + 1]])
469
+ {
470
+ png_byte t;
471
+
472
+ t = png_ptr->quantize_sort[j];
473
+ png_ptr->quantize_sort[j] = png_ptr->quantize_sort[j + 1];
474
+ png_ptr->quantize_sort[j + 1] = t;
475
+ done = 0;
476
+ }
477
+ }
478
+
479
+ if (done != 0)
480
+ break;
481
+ }
482
+
483
+ /* Swap the palette around, and set up a table, if necessary */
484
+ if (full_quantize != 0)
485
+ {
486
+ int j = num_palette;
487
+
488
+ /* Put all the useful colors within the max, but don't
489
+ * move the others.
490
+ */
491
+ for (i = 0; i < maximum_colors; i++)
492
+ {
493
+ if ((int)png_ptr->quantize_sort[i] >= maximum_colors)
494
+ {
495
+ do
496
+ j--;
497
+ while ((int)png_ptr->quantize_sort[j] >= maximum_colors);
498
+
499
+ palette[i] = palette[j];
500
+ }
501
+ }
502
+ }
503
+ else
504
+ {
505
+ int j = num_palette;
506
+
507
+ /* Move all the used colors inside the max limit, and
508
+ * develop a translation table.
509
+ */
510
+ for (i = 0; i < maximum_colors; i++)
511
+ {
512
+ /* Only move the colors we need to */
513
+ if ((int)png_ptr->quantize_sort[i] >= maximum_colors)
514
+ {
515
+ png_color tmp_color;
516
+
517
+ do
518
+ j--;
519
+ while ((int)png_ptr->quantize_sort[j] >= maximum_colors);
520
+
521
+ tmp_color = palette[j];
522
+ palette[j] = palette[i];
523
+ palette[i] = tmp_color;
524
+ /* Indicate where the color went */
525
+ png_ptr->quantize_index[j] = (png_byte)i;
526
+ png_ptr->quantize_index[i] = (png_byte)j;
527
+ }
528
+ }
529
+
530
+ /* Find closest color for those colors we are not using */
531
+ for (i = 0; i < num_palette; i++)
532
+ {
533
+ if ((int)png_ptr->quantize_index[i] >= maximum_colors)
534
+ {
535
+ int min_d, k, min_k, d_index;
536
+
537
+ /* Find the closest color to one we threw out */
538
+ d_index = png_ptr->quantize_index[i];
539
+ min_d = PNG_COLOR_DIST(palette[d_index], palette[0]);
540
+ for (k = 1, min_k = 0; k < maximum_colors; k++)
541
+ {
542
+ int d;
543
+
544
+ d = PNG_COLOR_DIST(palette[d_index], palette[k]);
545
+
546
+ if (d < min_d)
547
+ {
548
+ min_d = d;
549
+ min_k = k;
550
+ }
551
+ }
552
+ /* Point to closest color */
553
+ png_ptr->quantize_index[i] = (png_byte)min_k;
554
+ }
555
+ }
556
+ }
557
+ png_free(png_ptr, png_ptr->quantize_sort);
558
+ png_ptr->quantize_sort = NULL;
559
+ }
560
+ else
561
+ {
562
+ /* This is much harder to do simply (and quickly). Perhaps
563
+ * we need to go through a median cut routine, but those
564
+ * don't always behave themselves with only a few colors
565
+ * as input. So we will just find the closest two colors,
566
+ * and throw out one of them (chosen somewhat randomly).
567
+ * [We don't understand this at all, so if someone wants to
568
+ * work on improving it, be our guest - AED, GRP]
569
+ */
570
+ int i;
571
+ int max_d;
572
+ int num_new_palette;
573
+ png_dsortp t;
574
+ png_dsortpp hash;
575
+
576
+ t = NULL;
577
+
578
+ /* Initialize palette index arrays */
579
+ png_ptr->index_to_palette = (png_bytep)png_malloc(png_ptr,
580
+ (png_uint_32)(num_palette * (sizeof (png_byte))));
581
+ png_ptr->palette_to_index = (png_bytep)png_malloc(png_ptr,
582
+ (png_uint_32)(num_palette * (sizeof (png_byte))));
583
+
584
+ /* Initialize the sort array */
585
+ for (i = 0; i < num_palette; i++)
586
+ {
587
+ png_ptr->index_to_palette[i] = (png_byte)i;
588
+ png_ptr->palette_to_index[i] = (png_byte)i;
589
+ }
590
+
591
+ hash = (png_dsortpp)png_calloc(png_ptr, (png_uint_32)(769 *
592
+ (sizeof (png_dsortp))));
593
+
594
+ num_new_palette = num_palette;
595
+
596
+ /* Initial wild guess at how far apart the farthest pixel
597
+ * pair we will be eliminating will be. Larger
598
+ * numbers mean more areas will be allocated, Smaller
599
+ * numbers run the risk of not saving enough data, and
600
+ * having to do this all over again.
601
+ *
602
+ * I have not done extensive checking on this number.
603
+ */
604
+ max_d = 96;
605
+
606
+ while (num_new_palette > maximum_colors)
607
+ {
608
+ for (i = 0; i < num_new_palette - 1; i++)
609
+ {
610
+ int j;
611
+
612
+ for (j = i + 1; j < num_new_palette; j++)
613
+ {
614
+ int d;
615
+
616
+ d = PNG_COLOR_DIST(palette[i], palette[j]);
617
+
618
+ if (d <= max_d)
619
+ {
620
+
621
+ t = (png_dsortp)png_malloc_warn(png_ptr,
622
+ (png_uint_32)(sizeof (png_dsort)));
623
+
624
+ if (t == NULL)
625
+ break;
626
+
627
+ t->next = hash[d];
628
+ t->left = (png_byte)i;
629
+ t->right = (png_byte)j;
630
+ hash[d] = t;
631
+ }
632
+ }
633
+ if (t == NULL)
634
+ break;
635
+ }
636
+
637
+ if (t != NULL)
638
+ for (i = 0; i <= max_d; i++)
639
+ {
640
+ if (hash[i] != NULL)
641
+ {
642
+ png_dsortp p;
643
+
644
+ for (p = hash[i]; p; p = p->next)
645
+ {
646
+ if ((int)png_ptr->index_to_palette[p->left]
647
+ < num_new_palette &&
648
+ (int)png_ptr->index_to_palette[p->right]
649
+ < num_new_palette)
650
+ {
651
+ int j, next_j;
652
+
653
+ if (num_new_palette & 0x01)
654
+ {
655
+ j = p->left;
656
+ next_j = p->right;
657
+ }
658
+ else
659
+ {
660
+ j = p->right;
661
+ next_j = p->left;
662
+ }
663
+
664
+ num_new_palette--;
665
+ palette[png_ptr->index_to_palette[j]]
666
+ = palette[num_new_palette];
667
+ if (full_quantize == 0)
668
+ {
669
+ int k;
670
+
671
+ for (k = 0; k < num_palette; k++)
672
+ {
673
+ if (png_ptr->quantize_index[k] ==
674
+ png_ptr->index_to_palette[j])
675
+ png_ptr->quantize_index[k] =
676
+ png_ptr->index_to_palette[next_j];
677
+
678
+ if ((int)png_ptr->quantize_index[k] ==
679
+ num_new_palette)
680
+ png_ptr->quantize_index[k] =
681
+ png_ptr->index_to_palette[j];
682
+ }
683
+ }
684
+
685
+ png_ptr->index_to_palette[png_ptr->palette_to_index
686
+ [num_new_palette]] = png_ptr->index_to_palette[j];
687
+
688
+ png_ptr->palette_to_index[png_ptr->index_to_palette[j]]
689
+ = png_ptr->palette_to_index[num_new_palette];
690
+
691
+ png_ptr->index_to_palette[j] =
692
+ (png_byte)num_new_palette;
693
+
694
+ png_ptr->palette_to_index[num_new_palette] =
695
+ (png_byte)j;
696
+ }
697
+ if (num_new_palette <= maximum_colors)
698
+ break;
699
+ }
700
+ if (num_new_palette <= maximum_colors)
701
+ break;
702
+ }
703
+ }
704
+
705
+ for (i = 0; i < 769; i++)
706
+ {
707
+ if (hash[i] != NULL)
708
+ {
709
+ png_dsortp p = hash[i];
710
+ while (p)
711
+ {
712
+ t = p->next;
713
+ png_free(png_ptr, p);
714
+ p = t;
715
+ }
716
+ }
717
+ hash[i] = 0;
718
+ }
719
+ max_d += 96;
720
+ }
721
+ png_free(png_ptr, hash);
722
+ png_free(png_ptr, png_ptr->palette_to_index);
723
+ png_free(png_ptr, png_ptr->index_to_palette);
724
+ png_ptr->palette_to_index = NULL;
725
+ png_ptr->index_to_palette = NULL;
726
+ }
727
+ num_palette = maximum_colors;
728
+ }
729
+ if (png_ptr->palette == NULL)
730
+ {
731
+ png_ptr->palette = palette;
732
+ }
733
+ png_ptr->num_palette = (png_uint_16)num_palette;
734
+
735
+ if (full_quantize != 0)
736
+ {
737
+ int i;
738
+ png_bytep distance;
739
+ int total_bits = PNG_QUANTIZE_RED_BITS + PNG_QUANTIZE_GREEN_BITS +
740
+ PNG_QUANTIZE_BLUE_BITS;
741
+ int num_red = (1 << PNG_QUANTIZE_RED_BITS);
742
+ int num_green = (1 << PNG_QUANTIZE_GREEN_BITS);
743
+ int num_blue = (1 << PNG_QUANTIZE_BLUE_BITS);
744
+ png_size_t num_entries = ((png_size_t)1 << total_bits);
745
+
746
+ png_ptr->palette_lookup = (png_bytep)png_calloc(png_ptr,
747
+ (png_uint_32)(num_entries * (sizeof (png_byte))));
748
+
749
+ distance = (png_bytep)png_malloc(png_ptr, (png_uint_32)(num_entries *
750
+ (sizeof (png_byte))));
751
+
752
+ memset(distance, 0xff, num_entries * (sizeof (png_byte)));
753
+
754
+ for (i = 0; i < num_palette; i++)
755
+ {
756
+ int ir, ig, ib;
757
+ int r = (palette[i].red >> (8 - PNG_QUANTIZE_RED_BITS));
758
+ int g = (palette[i].green >> (8 - PNG_QUANTIZE_GREEN_BITS));
759
+ int b = (palette[i].blue >> (8 - PNG_QUANTIZE_BLUE_BITS));
760
+
761
+ for (ir = 0; ir < num_red; ir++)
762
+ {
763
+ /* int dr = abs(ir - r); */
764
+ int dr = ((ir > r) ? ir - r : r - ir);
765
+ int index_r = (ir << (PNG_QUANTIZE_BLUE_BITS +
766
+ PNG_QUANTIZE_GREEN_BITS));
767
+
768
+ for (ig = 0; ig < num_green; ig++)
769
+ {
770
+ /* int dg = abs(ig - g); */
771
+ int dg = ((ig > g) ? ig - g : g - ig);
772
+ int dt = dr + dg;
773
+ int dm = ((dr > dg) ? dr : dg);
774
+ int index_g = index_r | (ig << PNG_QUANTIZE_BLUE_BITS);
775
+
776
+ for (ib = 0; ib < num_blue; ib++)
777
+ {
778
+ int d_index = index_g | ib;
779
+ /* int db = abs(ib - b); */
780
+ int db = ((ib > b) ? ib - b : b - ib);
781
+ int dmax = ((dm > db) ? dm : db);
782
+ int d = dmax + dt + db;
783
+
784
+ if (d < (int)distance[d_index])
785
+ {
786
+ distance[d_index] = (png_byte)d;
787
+ png_ptr->palette_lookup[d_index] = (png_byte)i;
788
+ }
789
+ }
790
+ }
791
+ }
792
+ }
793
+
794
+ png_free(png_ptr, distance);
795
+ }
796
+ }
797
+ #endif /* READ_QUANTIZE */
798
+
799
+ #ifdef PNG_READ_GAMMA_SUPPORTED
800
+ void PNGFAPI
801
+ png_set_gamma_fixed(png_structrp png_ptr, png_fixed_point scrn_gamma,
802
+ png_fixed_point file_gamma)
803
+ {
804
+ png_debug(1, "in png_set_gamma_fixed");
805
+
806
+ if (png_rtran_ok(png_ptr, 0) == 0)
807
+ return;
808
+
809
+ /* New in libpng-1.5.4 - reserve particular negative values as flags. */
810
+ scrn_gamma = translate_gamma_flags(png_ptr, scrn_gamma, 1/*screen*/);
811
+ file_gamma = translate_gamma_flags(png_ptr, file_gamma, 0/*file*/);
812
+
813
+ /* Checking the gamma values for being >0 was added in 1.5.4 along with the
814
+ * premultiplied alpha support; this actually hides an undocumented feature
815
+ * of the previous implementation which allowed gamma processing to be
816
+ * disabled in background handling. There is no evidence (so far) that this
817
+ * was being used; however, png_set_background itself accepted and must still
818
+ * accept '0' for the gamma value it takes, because it isn't always used.
819
+ *
820
+ * Since this is an API change (albeit a very minor one that removes an
821
+ * undocumented API feature) the following checks were only enabled in
822
+ * libpng-1.6.0.
823
+ */
824
+ if (file_gamma <= 0)
825
+ png_error(png_ptr, "invalid file gamma in png_set_gamma");
826
+
827
+ if (scrn_gamma <= 0)
828
+ png_error(png_ptr, "invalid screen gamma in png_set_gamma");
829
+
830
+ /* Set the gamma values unconditionally - this overrides the value in the PNG
831
+ * file if a gAMA chunk was present. png_set_alpha_mode provides a
832
+ * different, easier, way to default the file gamma.
833
+ */
834
+ png_ptr->colorspace.gamma = file_gamma;
835
+ png_ptr->colorspace.flags |= PNG_COLORSPACE_HAVE_GAMMA;
836
+ png_ptr->screen_gamma = scrn_gamma;
837
+ }
838
+
839
+ # ifdef PNG_FLOATING_POINT_SUPPORTED
840
+ void PNGAPI
841
+ png_set_gamma(png_structrp png_ptr, double scrn_gamma, double file_gamma)
842
+ {
843
+ png_set_gamma_fixed(png_ptr, convert_gamma_value(png_ptr, scrn_gamma),
844
+ convert_gamma_value(png_ptr, file_gamma));
845
+ }
846
+ # endif /* FLOATING_POINT */
847
+ #endif /* READ_GAMMA */
848
+
849
+ #ifdef PNG_READ_EXPAND_SUPPORTED
850
+ /* Expand paletted images to RGB, expand grayscale images of
851
+ * less than 8-bit depth to 8-bit depth, and expand tRNS chunks
852
+ * to alpha channels.
853
+ */
854
+ void PNGAPI
855
+ png_set_expand(png_structrp png_ptr)
856
+ {
857
+ png_debug(1, "in png_set_expand");
858
+
859
+ if (png_rtran_ok(png_ptr, 0) == 0)
860
+ return;
861
+
862
+ png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS);
863
+ }
864
+
865
+ /* GRR 19990627: the following three functions currently are identical
866
+ * to png_set_expand(). However, it is entirely reasonable that someone
867
+ * might wish to expand an indexed image to RGB but *not* expand a single,
868
+ * fully transparent palette entry to a full alpha channel--perhaps instead
869
+ * convert tRNS to the grayscale/RGB format (16-bit RGB value), or replace
870
+ * the transparent color with a particular RGB value, or drop tRNS entirely.
871
+ * IOW, a future version of the library may make the transformations flag
872
+ * a bit more fine-grained, with separate bits for each of these three
873
+ * functions.
874
+ *
875
+ * More to the point, these functions make it obvious what libpng will be
876
+ * doing, whereas "expand" can (and does) mean any number of things.
877
+ *
878
+ * GRP 20060307: In libpng-1.2.9, png_set_gray_1_2_4_to_8() was modified
879
+ * to expand only the sample depth but not to expand the tRNS to alpha
880
+ * and its name was changed to png_set_expand_gray_1_2_4_to_8().
881
+ */
882
+
883
+ /* Expand paletted images to RGB. */
884
+ void PNGAPI
885
+ png_set_palette_to_rgb(png_structrp png_ptr)
886
+ {
887
+ png_debug(1, "in png_set_palette_to_rgb");
888
+
889
+ if (png_rtran_ok(png_ptr, 0) == 0)
890
+ return;
891
+
892
+ png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS);
893
+ }
894
+
895
+ /* Expand grayscale images of less than 8-bit depth to 8 bits. */
896
+ void PNGAPI
897
+ png_set_expand_gray_1_2_4_to_8(png_structrp png_ptr)
898
+ {
899
+ png_debug(1, "in png_set_expand_gray_1_2_4_to_8");
900
+
901
+ if (png_rtran_ok(png_ptr, 0) == 0)
902
+ return;
903
+
904
+ png_ptr->transformations |= PNG_EXPAND;
905
+ }
906
+
907
+ /* Expand tRNS chunks to alpha channels. */
908
+ void PNGAPI
909
+ png_set_tRNS_to_alpha(png_structrp png_ptr)
910
+ {
911
+ png_debug(1, "in png_set_tRNS_to_alpha");
912
+
913
+ if (png_rtran_ok(png_ptr, 0) == 0)
914
+ return;
915
+
916
+ png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS);
917
+ }
918
+ #endif /* READ_EXPAND */
919
+
920
+ #ifdef PNG_READ_EXPAND_16_SUPPORTED
921
+ /* Expand to 16-bit channels, expand the tRNS chunk too (because otherwise
922
+ * it may not work correctly.)
923
+ */
924
+ void PNGAPI
925
+ png_set_expand_16(png_structrp png_ptr)
926
+ {
927
+ png_debug(1, "in png_set_expand_16");
928
+
929
+ if (png_rtran_ok(png_ptr, 0) == 0)
930
+ return;
931
+
932
+ png_ptr->transformations |= (PNG_EXPAND_16 | PNG_EXPAND | PNG_EXPAND_tRNS);
933
+ }
934
+ #endif
935
+
936
+ #ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
937
+ void PNGAPI
938
+ png_set_gray_to_rgb(png_structrp png_ptr)
939
+ {
940
+ png_debug(1, "in png_set_gray_to_rgb");
941
+
942
+ if (png_rtran_ok(png_ptr, 0) == 0)
943
+ return;
944
+
945
+ /* Because rgb must be 8 bits or more: */
946
+ png_set_expand_gray_1_2_4_to_8(png_ptr);
947
+ png_ptr->transformations |= PNG_GRAY_TO_RGB;
948
+ }
949
+ #endif
950
+
951
+ #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
952
+ void PNGFAPI
953
+ png_set_rgb_to_gray_fixed(png_structrp png_ptr, int error_action,
954
+ png_fixed_point red, png_fixed_point green)
955
+ {
956
+ png_debug(1, "in png_set_rgb_to_gray");
957
+
958
+ /* Need the IHDR here because of the check on color_type below. */
959
+ /* TODO: fix this */
960
+ if (png_rtran_ok(png_ptr, 1) == 0)
961
+ return;
962
+
963
+ switch (error_action)
964
+ {
965
+ case PNG_ERROR_ACTION_NONE:
966
+ png_ptr->transformations |= PNG_RGB_TO_GRAY;
967
+ break;
968
+
969
+ case PNG_ERROR_ACTION_WARN:
970
+ png_ptr->transformations |= PNG_RGB_TO_GRAY_WARN;
971
+ break;
972
+
973
+ case PNG_ERROR_ACTION_ERROR:
974
+ png_ptr->transformations |= PNG_RGB_TO_GRAY_ERR;
975
+ break;
976
+
977
+ default:
978
+ png_error(png_ptr, "invalid error action to rgb_to_gray");
979
+ break;
980
+ }
981
+
982
+ if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
983
+ #ifdef PNG_READ_EXPAND_SUPPORTED
984
+ png_ptr->transformations |= PNG_EXPAND;
985
+ #else
986
+ {
987
+ /* Make this an error in 1.6 because otherwise the application may assume
988
+ * that it just worked and get a memory overwrite.
989
+ */
990
+ png_error(png_ptr,
991
+ "Cannot do RGB_TO_GRAY without EXPAND_SUPPORTED");
992
+
993
+ /* png_ptr->transformations &= ~PNG_RGB_TO_GRAY; */
994
+ }
995
+ #endif
996
+ {
997
+ if (red >= 0 && green >= 0 && red + green <= PNG_FP_1)
998
+ {
999
+ png_uint_16 red_int, green_int;
1000
+
1001
+ /* NOTE: this calculation does not round, but this behavior is retained
1002
+ * for consistency; the inaccuracy is very small. The code here always
1003
+ * overwrites the coefficients, regardless of whether they have been
1004
+ * defaulted or set already.
1005
+ */
1006
+ red_int = (png_uint_16)(((png_uint_32)red*32768)/100000);
1007
+ green_int = (png_uint_16)(((png_uint_32)green*32768)/100000);
1008
+
1009
+ png_ptr->rgb_to_gray_red_coeff = red_int;
1010
+ png_ptr->rgb_to_gray_green_coeff = green_int;
1011
+ png_ptr->rgb_to_gray_coefficients_set = 1;
1012
+ }
1013
+
1014
+ else
1015
+ {
1016
+ if (red >= 0 && green >= 0)
1017
+ png_app_warning(png_ptr,
1018
+ "ignoring out of range rgb_to_gray coefficients");
1019
+
1020
+ /* Use the defaults, from the cHRM chunk if set, else the historical
1021
+ * values which are close to the sRGB/HDTV/ITU-Rec 709 values. See
1022
+ * png_do_rgb_to_gray for more discussion of the values. In this case
1023
+ * the coefficients are not marked as 'set' and are not overwritten if
1024
+ * something has already provided a default.
1025
+ */
1026
+ if (png_ptr->rgb_to_gray_red_coeff == 0 &&
1027
+ png_ptr->rgb_to_gray_green_coeff == 0)
1028
+ {
1029
+ png_ptr->rgb_to_gray_red_coeff = 6968;
1030
+ png_ptr->rgb_to_gray_green_coeff = 23434;
1031
+ /* png_ptr->rgb_to_gray_blue_coeff = 2366; */
1032
+ }
1033
+ }
1034
+ }
1035
+ }
1036
+
1037
+ #ifdef PNG_FLOATING_POINT_SUPPORTED
1038
+ /* Convert a RGB image to a grayscale of the same width. This allows us,
1039
+ * for example, to convert a 24 bpp RGB image into an 8 bpp grayscale image.
1040
+ */
1041
+
1042
+ void PNGAPI
1043
+ png_set_rgb_to_gray(png_structrp png_ptr, int error_action, double red,
1044
+ double green)
1045
+ {
1046
+ png_set_rgb_to_gray_fixed(png_ptr, error_action,
1047
+ png_fixed(png_ptr, red, "rgb to gray red coefficient"),
1048
+ png_fixed(png_ptr, green, "rgb to gray green coefficient"));
1049
+ }
1050
+ #endif /* FLOATING POINT */
1051
+
1052
+ #endif /* RGB_TO_GRAY */
1053
+
1054
+ #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
1055
+ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
1056
+ void PNGAPI
1057
+ png_set_read_user_transform_fn(png_structrp png_ptr, png_user_transform_ptr
1058
+ read_user_transform_fn)
1059
+ {
1060
+ png_debug(1, "in png_set_read_user_transform_fn");
1061
+
1062
+ #ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
1063
+ png_ptr->transformations |= PNG_USER_TRANSFORM;
1064
+ png_ptr->read_user_transform_fn = read_user_transform_fn;
1065
+ #endif
1066
+ }
1067
+ #endif
1068
+
1069
+ #ifdef PNG_READ_TRANSFORMS_SUPPORTED
1070
+ #ifdef PNG_READ_GAMMA_SUPPORTED
1071
+ /* In the case of gamma transformations only do transformations on images where
1072
+ * the [file] gamma and screen_gamma are not close reciprocals, otherwise it
1073
+ * slows things down slightly, and also needlessly introduces small errors.
1074
+ */
1075
+ static int /* PRIVATE */
1076
+ png_gamma_threshold(png_fixed_point screen_gamma, png_fixed_point file_gamma)
1077
+ {
1078
+ /* PNG_GAMMA_THRESHOLD is the threshold for performing gamma
1079
+ * correction as a difference of the overall transform from 1.0
1080
+ *
1081
+ * We want to compare the threshold with s*f - 1, if we get
1082
+ * overflow here it is because of wacky gamma values so we
1083
+ * turn on processing anyway.
1084
+ */
1085
+ png_fixed_point gtest;
1086
+ return !png_muldiv(&gtest, screen_gamma, file_gamma, PNG_FP_1) ||
1087
+ png_gamma_significant(gtest);
1088
+ }
1089
+ #endif
1090
+
1091
+ /* Initialize everything needed for the read. This includes modifying
1092
+ * the palette.
1093
+ */
1094
+
1095
+ /* For the moment 'png_init_palette_transformations' and
1096
+ * 'png_init_rgb_transformations' only do some flag canceling optimizations.
1097
+ * The intent is that these two routines should have palette or rgb operations
1098
+ * extracted from 'png_init_read_transformations'.
1099
+ */
1100
+ static void /* PRIVATE */
1101
+ png_init_palette_transformations(png_structrp png_ptr)
1102
+ {
1103
+ /* Called to handle the (input) palette case. In png_do_read_transformations
1104
+ * the first step is to expand the palette if requested, so this code must
1105
+ * take care to only make changes that are invariant with respect to the
1106
+ * palette expansion, or only do them if there is no expansion.
1107
+ *
1108
+ * STRIP_ALPHA has already been handled in the caller (by setting num_trans
1109
+ * to 0.)
1110
+ */
1111
+ int input_has_alpha = 0;
1112
+ int input_has_transparency = 0;
1113
+
1114
+ if (png_ptr->num_trans > 0)
1115
+ {
1116
+ int i;
1117
+
1118
+ /* Ignore if all the entries are opaque (unlikely!) */
1119
+ for (i=0; i<png_ptr->num_trans; ++i)
1120
+ {
1121
+ if (png_ptr->trans_alpha[i] == 255)
1122
+ continue;
1123
+ else if (png_ptr->trans_alpha[i] == 0)
1124
+ input_has_transparency = 1;
1125
+ else
1126
+ {
1127
+ input_has_transparency = 1;
1128
+ input_has_alpha = 1;
1129
+ break;
1130
+ }
1131
+ }
1132
+ }
1133
+
1134
+ /* If no alpha we can optimize. */
1135
+ if (input_has_alpha == 0)
1136
+ {
1137
+ /* Any alpha means background and associative alpha processing is
1138
+ * required, however if the alpha is 0 or 1 throughout OPTIMIZE_ALPHA
1139
+ * and ENCODE_ALPHA are irrelevant.
1140
+ */
1141
+ png_ptr->transformations &= ~PNG_ENCODE_ALPHA;
1142
+ png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;
1143
+
1144
+ if (input_has_transparency == 0)
1145
+ png_ptr->transformations &= ~(PNG_COMPOSE | PNG_BACKGROUND_EXPAND);
1146
+ }
1147
+
1148
+ #if defined(PNG_READ_EXPAND_SUPPORTED) && defined(PNG_READ_BACKGROUND_SUPPORTED)
1149
+ /* png_set_background handling - deals with the complexity of whether the
1150
+ * background color is in the file format or the screen format in the case
1151
+ * where an 'expand' will happen.
1152
+ */
1153
+
1154
+ /* The following code cannot be entered in the alpha pre-multiplication case
1155
+ * because PNG_BACKGROUND_EXPAND is cancelled below.
1156
+ */
1157
+ if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) != 0 &&
1158
+ (png_ptr->transformations & PNG_EXPAND) != 0)
1159
+ {
1160
+ {
1161
+ png_ptr->background.red =
1162
+ png_ptr->palette[png_ptr->background.index].red;
1163
+ png_ptr->background.green =
1164
+ png_ptr->palette[png_ptr->background.index].green;
1165
+ png_ptr->background.blue =
1166
+ png_ptr->palette[png_ptr->background.index].blue;
1167
+
1168
+ #ifdef PNG_READ_INVERT_ALPHA_SUPPORTED
1169
+ if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0)
1170
+ {
1171
+ if ((png_ptr->transformations & PNG_EXPAND_tRNS) == 0)
1172
+ {
1173
+ /* Invert the alpha channel (in tRNS) unless the pixels are
1174
+ * going to be expanded, in which case leave it for later
1175
+ */
1176
+ int i, istop = png_ptr->num_trans;
1177
+
1178
+ for (i=0; i<istop; i++)
1179
+ png_ptr->trans_alpha[i] = (png_byte)(255 -
1180
+ png_ptr->trans_alpha[i]);
1181
+ }
1182
+ }
1183
+ #endif /* READ_INVERT_ALPHA */
1184
+ }
1185
+ } /* background expand and (therefore) no alpha association. */
1186
+ #endif /* READ_EXPAND && READ_BACKGROUND */
1187
+ }
1188
+
1189
+ static void /* PRIVATE */
1190
+ png_init_rgb_transformations(png_structrp png_ptr)
1191
+ {
1192
+ /* Added to libpng-1.5.4: check the color type to determine whether there
1193
+ * is any alpha or transparency in the image and simply cancel the
1194
+ * background and alpha mode stuff if there isn't.
1195
+ */
1196
+ int input_has_alpha = (png_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0;
1197
+ int input_has_transparency = png_ptr->num_trans > 0;
1198
+
1199
+ /* If no alpha we can optimize. */
1200
+ if (input_has_alpha == 0)
1201
+ {
1202
+ /* Any alpha means background and associative alpha processing is
1203
+ * required, however if the alpha is 0 or 1 throughout OPTIMIZE_ALPHA
1204
+ * and ENCODE_ALPHA are irrelevant.
1205
+ */
1206
+ # ifdef PNG_READ_ALPHA_MODE_SUPPORTED
1207
+ png_ptr->transformations &= ~PNG_ENCODE_ALPHA;
1208
+ png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;
1209
+ # endif
1210
+
1211
+ if (input_has_transparency == 0)
1212
+ png_ptr->transformations &= ~(PNG_COMPOSE | PNG_BACKGROUND_EXPAND);
1213
+ }
1214
+
1215
+ #if defined(PNG_READ_EXPAND_SUPPORTED) && defined(PNG_READ_BACKGROUND_SUPPORTED)
1216
+ /* png_set_background handling - deals with the complexity of whether the
1217
+ * background color is in the file format or the screen format in the case
1218
+ * where an 'expand' will happen.
1219
+ */
1220
+
1221
+ /* The following code cannot be entered in the alpha pre-multiplication case
1222
+ * because PNG_BACKGROUND_EXPAND is cancelled below.
1223
+ */
1224
+ if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) != 0 &&
1225
+ (png_ptr->transformations & PNG_EXPAND) != 0 &&
1226
+ (png_ptr->color_type & PNG_COLOR_MASK_COLOR) == 0)
1227
+ /* i.e., GRAY or GRAY_ALPHA */
1228
+ {
1229
+ {
1230
+ /* Expand background and tRNS chunks */
1231
+ int gray = png_ptr->background.gray;
1232
+ int trans_gray = png_ptr->trans_color.gray;
1233
+
1234
+ switch (png_ptr->bit_depth)
1235
+ {
1236
+ case 1:
1237
+ gray *= 0xff;
1238
+ trans_gray *= 0xff;
1239
+ break;
1240
+
1241
+ case 2:
1242
+ gray *= 0x55;
1243
+ trans_gray *= 0x55;
1244
+ break;
1245
+
1246
+ case 4:
1247
+ gray *= 0x11;
1248
+ trans_gray *= 0x11;
1249
+ break;
1250
+
1251
+ default:
1252
+
1253
+ case 8:
1254
+ /* FALL THROUGH (Already 8 bits) */
1255
+
1256
+ case 16:
1257
+ /* Already a full 16 bits */
1258
+ break;
1259
+ }
1260
+
1261
+ png_ptr->background.red = png_ptr->background.green =
1262
+ png_ptr->background.blue = (png_uint_16)gray;
1263
+
1264
+ if ((png_ptr->transformations & PNG_EXPAND_tRNS) == 0)
1265
+ {
1266
+ png_ptr->trans_color.red = png_ptr->trans_color.green =
1267
+ png_ptr->trans_color.blue = (png_uint_16)trans_gray;
1268
+ }
1269
+ }
1270
+ } /* background expand and (therefore) no alpha association. */
1271
+ #endif /* READ_EXPAND && READ_BACKGROUND */
1272
+ }
1273
+
1274
+ void /* PRIVATE */
1275
+ png_init_read_transformations(png_structrp png_ptr)
1276
+ {
1277
+ png_debug(1, "in png_init_read_transformations");
1278
+
1279
+ /* This internal function is called from png_read_start_row in pngrutil.c
1280
+ * and it is called before the 'rowbytes' calculation is done, so the code
1281
+ * in here can change or update the transformations flags.
1282
+ *
1283
+ * First do updates that do not depend on the details of the PNG image data
1284
+ * being processed.
1285
+ */
1286
+
1287
+ #ifdef PNG_READ_GAMMA_SUPPORTED
1288
+ /* Prior to 1.5.4 these tests were performed from png_set_gamma, 1.5.4 adds
1289
+ * png_set_alpha_mode and this is another source for a default file gamma so
1290
+ * the test needs to be performed later - here. In addition prior to 1.5.4
1291
+ * the tests were repeated for the PALETTE color type here - this is no
1292
+ * longer necessary (and doesn't seem to have been necessary before.)
1293
+ */
1294
+ {
1295
+ /* The following temporary indicates if overall gamma correction is
1296
+ * required.
1297
+ */
1298
+ int gamma_correction = 0;
1299
+
1300
+ if (png_ptr->colorspace.gamma != 0) /* has been set */
1301
+ {
1302
+ if (png_ptr->screen_gamma != 0) /* screen set too */
1303
+ gamma_correction = png_gamma_threshold(png_ptr->colorspace.gamma,
1304
+ png_ptr->screen_gamma);
1305
+
1306
+ else
1307
+ /* Assume the output matches the input; a long time default behavior
1308
+ * of libpng, although the standard has nothing to say about this.
1309
+ */
1310
+ png_ptr->screen_gamma = png_reciprocal(png_ptr->colorspace.gamma);
1311
+ }
1312
+
1313
+ else if (png_ptr->screen_gamma != 0)
1314
+ /* The converse - assume the file matches the screen, note that this
1315
+ * perhaps undesireable default can (from 1.5.4) be changed by calling
1316
+ * png_set_alpha_mode (even if the alpha handling mode isn't required
1317
+ * or isn't changed from the default.)
1318
+ */
1319
+ png_ptr->colorspace.gamma = png_reciprocal(png_ptr->screen_gamma);
1320
+
1321
+ else /* neither are set */
1322
+ /* Just in case the following prevents any processing - file and screen
1323
+ * are both assumed to be linear and there is no way to introduce a
1324
+ * third gamma value other than png_set_background with 'UNIQUE', and,
1325
+ * prior to 1.5.4
1326
+ */
1327
+ png_ptr->screen_gamma = png_ptr->colorspace.gamma = PNG_FP_1;
1328
+
1329
+ /* We have a gamma value now. */
1330
+ png_ptr->colorspace.flags |= PNG_COLORSPACE_HAVE_GAMMA;
1331
+
1332
+ /* Now turn the gamma transformation on or off as appropriate. Notice
1333
+ * that PNG_GAMMA just refers to the file->screen correction. Alpha
1334
+ * composition may independently cause gamma correction because it needs
1335
+ * linear data (e.g. if the file has a gAMA chunk but the screen gamma
1336
+ * hasn't been specified.) In any case this flag may get turned off in
1337
+ * the code immediately below if the transform can be handled outside the
1338
+ * row loop.
1339
+ */
1340
+ if (gamma_correction != 0)
1341
+ png_ptr->transformations |= PNG_GAMMA;
1342
+
1343
+ else
1344
+ png_ptr->transformations &= ~PNG_GAMMA;
1345
+ }
1346
+ #endif
1347
+
1348
+ /* Certain transformations have the effect of preventing other
1349
+ * transformations that happen afterward in png_do_read_transformations;
1350
+ * resolve the interdependencies here. From the code of
1351
+ * png_do_read_transformations the order is:
1352
+ *
1353
+ * 1) PNG_EXPAND (including PNG_EXPAND_tRNS)
1354
+ * 2) PNG_STRIP_ALPHA (if no compose)
1355
+ * 3) PNG_RGB_TO_GRAY
1356
+ * 4) PNG_GRAY_TO_RGB iff !PNG_BACKGROUND_IS_GRAY
1357
+ * 5) PNG_COMPOSE
1358
+ * 6) PNG_GAMMA
1359
+ * 7) PNG_STRIP_ALPHA (if compose)
1360
+ * 8) PNG_ENCODE_ALPHA
1361
+ * 9) PNG_SCALE_16_TO_8
1362
+ * 10) PNG_16_TO_8
1363
+ * 11) PNG_QUANTIZE (converts to palette)
1364
+ * 12) PNG_EXPAND_16
1365
+ * 13) PNG_GRAY_TO_RGB iff PNG_BACKGROUND_IS_GRAY
1366
+ * 14) PNG_INVERT_MONO
1367
+ * 15) PNG_INVERT_ALPHA
1368
+ * 16) PNG_SHIFT
1369
+ * 17) PNG_PACK
1370
+ * 18) PNG_BGR
1371
+ * 19) PNG_PACKSWAP
1372
+ * 20) PNG_FILLER (includes PNG_ADD_ALPHA)
1373
+ * 21) PNG_SWAP_ALPHA
1374
+ * 22) PNG_SWAP_BYTES
1375
+ * 23) PNG_USER_TRANSFORM [must be last]
1376
+ */
1377
+ #ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
1378
+ if ((png_ptr->transformations & PNG_STRIP_ALPHA) != 0 &&
1379
+ (png_ptr->transformations & PNG_COMPOSE) == 0)
1380
+ {
1381
+ /* Stripping the alpha channel happens immediately after the 'expand'
1382
+ * transformations, before all other transformation, so it cancels out
1383
+ * the alpha handling. It has the side effect negating the effect of
1384
+ * PNG_EXPAND_tRNS too:
1385
+ */
1386
+ png_ptr->transformations &= ~(PNG_BACKGROUND_EXPAND | PNG_ENCODE_ALPHA |
1387
+ PNG_EXPAND_tRNS);
1388
+ png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;
1389
+
1390
+ /* Kill the tRNS chunk itself too. Prior to 1.5.4 this did not happen
1391
+ * so transparency information would remain just so long as it wasn't
1392
+ * expanded. This produces unexpected API changes if the set of things
1393
+ * that do PNG_EXPAND_tRNS changes (perfectly possible given the
1394
+ * documentation - which says ask for what you want, accept what you
1395
+ * get.) This makes the behavior consistent from 1.5.4:
1396
+ */
1397
+ png_ptr->num_trans = 0;
1398
+ }
1399
+ #endif /* STRIP_ALPHA supported, no COMPOSE */
1400
+
1401
+ #ifdef PNG_READ_ALPHA_MODE_SUPPORTED
1402
+ /* If the screen gamma is about 1.0 then the OPTIMIZE_ALPHA and ENCODE_ALPHA
1403
+ * settings will have no effect.
1404
+ */
1405
+ if (png_gamma_significant(png_ptr->screen_gamma) == 0)
1406
+ {
1407
+ png_ptr->transformations &= ~PNG_ENCODE_ALPHA;
1408
+ png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;
1409
+ }
1410
+ #endif
1411
+
1412
+ #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
1413
+ /* Make sure the coefficients for the rgb to gray conversion are set
1414
+ * appropriately.
1415
+ */
1416
+ if ((png_ptr->transformations & PNG_RGB_TO_GRAY) != 0)
1417
+ png_colorspace_set_rgb_coefficients(png_ptr);
1418
+ #endif
1419
+
1420
+ #ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
1421
+ #if defined(PNG_READ_EXPAND_SUPPORTED) && defined(PNG_READ_BACKGROUND_SUPPORTED)
1422
+ /* Detect gray background and attempt to enable optimization for
1423
+ * gray --> RGB case.
1424
+ *
1425
+ * Note: if PNG_BACKGROUND_EXPAND is set and color_type is either RGB or
1426
+ * RGB_ALPHA (in which case need_expand is superfluous anyway), the
1427
+ * background color might actually be gray yet not be flagged as such.
1428
+ * This is not a problem for the current code, which uses
1429
+ * PNG_BACKGROUND_IS_GRAY only to decide when to do the
1430
+ * png_do_gray_to_rgb() transformation.
1431
+ *
1432
+ * TODO: this code needs to be revised to avoid the complexity and
1433
+ * interdependencies. The color type of the background should be recorded in
1434
+ * png_set_background, along with the bit depth, then the code has a record
1435
+ * of exactly what color space the background is currently in.
1436
+ */
1437
+ if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) != 0)
1438
+ {
1439
+ /* PNG_BACKGROUND_EXPAND: the background is in the file color space, so if
1440
+ * the file was grayscale the background value is gray.
1441
+ */
1442
+ if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) == 0)
1443
+ png_ptr->mode |= PNG_BACKGROUND_IS_GRAY;
1444
+ }
1445
+
1446
+ else if ((png_ptr->transformations & PNG_COMPOSE) != 0)
1447
+ {
1448
+ /* PNG_COMPOSE: png_set_background was called with need_expand false,
1449
+ * so the color is in the color space of the output or png_set_alpha_mode
1450
+ * was called and the color is black. Ignore RGB_TO_GRAY because that
1451
+ * happens before GRAY_TO_RGB.
1452
+ */
1453
+ if ((png_ptr->transformations & PNG_GRAY_TO_RGB) != 0)
1454
+ {
1455
+ if (png_ptr->background.red == png_ptr->background.green &&
1456
+ png_ptr->background.red == png_ptr->background.blue)
1457
+ {
1458
+ png_ptr->mode |= PNG_BACKGROUND_IS_GRAY;
1459
+ png_ptr->background.gray = png_ptr->background.red;
1460
+ }
1461
+ }
1462
+ }
1463
+ #endif /* READ_EXPAND && READ_BACKGROUND */
1464
+ #endif /* READ_GRAY_TO_RGB */
1465
+
1466
+ /* For indexed PNG data (PNG_COLOR_TYPE_PALETTE) many of the transformations
1467
+ * can be performed directly on the palette, and some (such as rgb to gray)
1468
+ * can be optimized inside the palette. This is particularly true of the
1469
+ * composite (background and alpha) stuff, which can be pretty much all done
1470
+ * in the palette even if the result is expanded to RGB or gray afterward.
1471
+ *
1472
+ * NOTE: this is Not Yet Implemented, the code behaves as in 1.5.1 and
1473
+ * earlier and the palette stuff is actually handled on the first row. This
1474
+ * leads to the reported bug that the palette returned by png_get_PLTE is not
1475
+ * updated.
1476
+ */
1477
+ if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
1478
+ png_init_palette_transformations(png_ptr);
1479
+
1480
+ else
1481
+ png_init_rgb_transformations(png_ptr);
1482
+
1483
+ #if defined(PNG_READ_BACKGROUND_SUPPORTED) && \
1484
+ defined(PNG_READ_EXPAND_16_SUPPORTED)
1485
+ if ((png_ptr->transformations & PNG_EXPAND_16) != 0 &&
1486
+ (png_ptr->transformations & PNG_COMPOSE) != 0 &&
1487
+ (png_ptr->transformations & PNG_BACKGROUND_EXPAND) == 0 &&
1488
+ png_ptr->bit_depth != 16)
1489
+ {
1490
+ /* TODO: fix this. Because the expand_16 operation is after the compose
1491
+ * handling the background color must be 8, not 16, bits deep, but the
1492
+ * application will supply a 16-bit value so reduce it here.
1493
+ *
1494
+ * The PNG_BACKGROUND_EXPAND code above does not expand to 16 bits at
1495
+ * present, so that case is ok (until do_expand_16 is moved.)
1496
+ *
1497
+ * NOTE: this discards the low 16 bits of the user supplied background
1498
+ * color, but until expand_16 works properly there is no choice!
1499
+ */
1500
+ # define CHOP(x) (x)=((png_uint_16)PNG_DIV257(x))
1501
+ CHOP(png_ptr->background.red);
1502
+ CHOP(png_ptr->background.green);
1503
+ CHOP(png_ptr->background.blue);
1504
+ CHOP(png_ptr->background.gray);
1505
+ # undef CHOP
1506
+ }
1507
+ #endif /* READ_BACKGROUND && READ_EXPAND_16 */
1508
+
1509
+ #if defined(PNG_READ_BACKGROUND_SUPPORTED) && \
1510
+ (defined(PNG_READ_SCALE_16_TO_8_SUPPORTED) || \
1511
+ defined(PNG_READ_STRIP_16_TO_8_SUPPORTED))
1512
+ if ((png_ptr->transformations & (PNG_16_TO_8|PNG_SCALE_16_TO_8)) != 0 &&
1513
+ (png_ptr->transformations & PNG_COMPOSE) != 0 &&
1514
+ (png_ptr->transformations & PNG_BACKGROUND_EXPAND) == 0 &&
1515
+ png_ptr->bit_depth == 16)
1516
+ {
1517
+ /* On the other hand, if a 16-bit file is to be reduced to 8-bits per
1518
+ * component this will also happen after PNG_COMPOSE and so the background
1519
+ * color must be pre-expanded here.
1520
+ *
1521
+ * TODO: fix this too.
1522
+ */
1523
+ png_ptr->background.red = (png_uint_16)(png_ptr->background.red * 257);
1524
+ png_ptr->background.green =
1525
+ (png_uint_16)(png_ptr->background.green * 257);
1526
+ png_ptr->background.blue = (png_uint_16)(png_ptr->background.blue * 257);
1527
+ png_ptr->background.gray = (png_uint_16)(png_ptr->background.gray * 257);
1528
+ }
1529
+ #endif
1530
+
1531
+ /* NOTE: below 'PNG_READ_ALPHA_MODE_SUPPORTED' is presumed to also enable the
1532
+ * background support (see the comments in scripts/pnglibconf.dfa), this
1533
+ * allows pre-multiplication of the alpha channel to be implemented as
1534
+ * compositing on black. This is probably sub-optimal and has been done in
1535
+ * 1.5.4 betas simply to enable external critique and testing (i.e. to
1536
+ * implement the new API quickly, without lots of internal changes.)
1537
+ */
1538
+
1539
+ #ifdef PNG_READ_GAMMA_SUPPORTED
1540
+ # ifdef PNG_READ_BACKGROUND_SUPPORTED
1541
+ /* Includes ALPHA_MODE */
1542
+ png_ptr->background_1 = png_ptr->background;
1543
+ # endif
1544
+
1545
+ /* This needs to change - in the palette image case a whole set of tables are
1546
+ * built when it would be quicker to just calculate the correct value for
1547
+ * each palette entry directly. Also, the test is too tricky - why check
1548
+ * PNG_RGB_TO_GRAY if PNG_GAMMA is not set? The answer seems to be that
1549
+ * PNG_GAMMA is cancelled even if the gamma is known? The test excludes the
1550
+ * PNG_COMPOSE case, so apparently if there is no *overall* gamma correction
1551
+ * the gamma tables will not be built even if composition is required on a
1552
+ * gamma encoded value.
1553
+ *
1554
+ * In 1.5.4 this is addressed below by an additional check on the individual
1555
+ * file gamma - if it is not 1.0 both RGB_TO_GRAY and COMPOSE need the
1556
+ * tables.
1557
+ */
1558
+ if ((png_ptr->transformations & PNG_GAMMA) != 0 ||
1559
+ ((png_ptr->transformations & PNG_RGB_TO_GRAY) != 0 &&
1560
+ (png_gamma_significant(png_ptr->colorspace.gamma) != 0 ||
1561
+ png_gamma_significant(png_ptr->screen_gamma) != 0)) ||
1562
+ ((png_ptr->transformations & PNG_COMPOSE) != 0 &&
1563
+ (png_gamma_significant(png_ptr->colorspace.gamma) != 0 ||
1564
+ png_gamma_significant(png_ptr->screen_gamma) != 0
1565
+ # ifdef PNG_READ_BACKGROUND_SUPPORTED
1566
+ || (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_UNIQUE &&
1567
+ png_gamma_significant(png_ptr->background_gamma) != 0)
1568
+ # endif
1569
+ )) || ((png_ptr->transformations & PNG_ENCODE_ALPHA) != 0 &&
1570
+ png_gamma_significant(png_ptr->screen_gamma) != 0))
1571
+ {
1572
+ png_build_gamma_table(png_ptr, png_ptr->bit_depth);
1573
+
1574
+ #ifdef PNG_READ_BACKGROUND_SUPPORTED
1575
+ if ((png_ptr->transformations & PNG_COMPOSE) != 0)
1576
+ {
1577
+ /* Issue a warning about this combination: because RGB_TO_GRAY is
1578
+ * optimized to do the gamma transform if present yet do_background has
1579
+ * to do the same thing if both options are set a
1580
+ * double-gamma-correction happens. This is true in all versions of
1581
+ * libpng to date.
1582
+ */
1583
+ if ((png_ptr->transformations & PNG_RGB_TO_GRAY) != 0)
1584
+ png_warning(png_ptr,
1585
+ "libpng does not support gamma+background+rgb_to_gray");
1586
+
1587
+ if ((png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) != 0)
1588
+ {
1589
+ /* We don't get to here unless there is a tRNS chunk with non-opaque
1590
+ * entries - see the checking code at the start of this function.
1591
+ */
1592
+ png_color back, back_1;
1593
+ png_colorp palette = png_ptr->palette;
1594
+ int num_palette = png_ptr->num_palette;
1595
+ int i;
1596
+ if (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_FILE)
1597
+ {
1598
+
1599
+ back.red = png_ptr->gamma_table[png_ptr->background.red];
1600
+ back.green = png_ptr->gamma_table[png_ptr->background.green];
1601
+ back.blue = png_ptr->gamma_table[png_ptr->background.blue];
1602
+
1603
+ back_1.red = png_ptr->gamma_to_1[png_ptr->background.red];
1604
+ back_1.green = png_ptr->gamma_to_1[png_ptr->background.green];
1605
+ back_1.blue = png_ptr->gamma_to_1[png_ptr->background.blue];
1606
+ }
1607
+ else
1608
+ {
1609
+ png_fixed_point g, gs;
1610
+
1611
+ switch (png_ptr->background_gamma_type)
1612
+ {
1613
+ case PNG_BACKGROUND_GAMMA_SCREEN:
1614
+ g = (png_ptr->screen_gamma);
1615
+ gs = PNG_FP_1;
1616
+ break;
1617
+
1618
+ case PNG_BACKGROUND_GAMMA_FILE:
1619
+ g = png_reciprocal(png_ptr->colorspace.gamma);
1620
+ gs = png_reciprocal2(png_ptr->colorspace.gamma,
1621
+ png_ptr->screen_gamma);
1622
+ break;
1623
+
1624
+ case PNG_BACKGROUND_GAMMA_UNIQUE:
1625
+ g = png_reciprocal(png_ptr->background_gamma);
1626
+ gs = png_reciprocal2(png_ptr->background_gamma,
1627
+ png_ptr->screen_gamma);
1628
+ break;
1629
+ default:
1630
+ g = PNG_FP_1; /* back_1 */
1631
+ gs = PNG_FP_1; /* back */
1632
+ break;
1633
+ }
1634
+
1635
+ if (png_gamma_significant(gs) != 0)
1636
+ {
1637
+ back.red = png_gamma_8bit_correct(png_ptr->background.red,
1638
+ gs);
1639
+ back.green = png_gamma_8bit_correct(png_ptr->background.green,
1640
+ gs);
1641
+ back.blue = png_gamma_8bit_correct(png_ptr->background.blue,
1642
+ gs);
1643
+ }
1644
+
1645
+ else
1646
+ {
1647
+ back.red = (png_byte)png_ptr->background.red;
1648
+ back.green = (png_byte)png_ptr->background.green;
1649
+ back.blue = (png_byte)png_ptr->background.blue;
1650
+ }
1651
+
1652
+ if (png_gamma_significant(g) != 0)
1653
+ {
1654
+ back_1.red = png_gamma_8bit_correct(png_ptr->background.red,
1655
+ g);
1656
+ back_1.green = png_gamma_8bit_correct(
1657
+ png_ptr->background.green, g);
1658
+ back_1.blue = png_gamma_8bit_correct(png_ptr->background.blue,
1659
+ g);
1660
+ }
1661
+
1662
+ else
1663
+ {
1664
+ back_1.red = (png_byte)png_ptr->background.red;
1665
+ back_1.green = (png_byte)png_ptr->background.green;
1666
+ back_1.blue = (png_byte)png_ptr->background.blue;
1667
+ }
1668
+ }
1669
+
1670
+ for (i = 0; i < num_palette; i++)
1671
+ {
1672
+ if (i < (int)png_ptr->num_trans &&
1673
+ png_ptr->trans_alpha[i] != 0xff)
1674
+ {
1675
+ if (png_ptr->trans_alpha[i] == 0)
1676
+ {
1677
+ palette[i] = back;
1678
+ }
1679
+ else /* if (png_ptr->trans_alpha[i] != 0xff) */
1680
+ {
1681
+ png_byte v, w;
1682
+
1683
+ v = png_ptr->gamma_to_1[palette[i].red];
1684
+ png_composite(w, v, png_ptr->trans_alpha[i], back_1.red);
1685
+ palette[i].red = png_ptr->gamma_from_1[w];
1686
+
1687
+ v = png_ptr->gamma_to_1[palette[i].green];
1688
+ png_composite(w, v, png_ptr->trans_alpha[i], back_1.green);
1689
+ palette[i].green = png_ptr->gamma_from_1[w];
1690
+
1691
+ v = png_ptr->gamma_to_1[palette[i].blue];
1692
+ png_composite(w, v, png_ptr->trans_alpha[i], back_1.blue);
1693
+ palette[i].blue = png_ptr->gamma_from_1[w];
1694
+ }
1695
+ }
1696
+ else
1697
+ {
1698
+ palette[i].red = png_ptr->gamma_table[palette[i].red];
1699
+ palette[i].green = png_ptr->gamma_table[palette[i].green];
1700
+ palette[i].blue = png_ptr->gamma_table[palette[i].blue];
1701
+ }
1702
+ }
1703
+
1704
+ /* Prevent the transformations being done again.
1705
+ *
1706
+ * NOTE: this is highly dubious; it removes the transformations in
1707
+ * place. This seems inconsistent with the general treatment of the
1708
+ * transformations elsewhere.
1709
+ */
1710
+ png_ptr->transformations &= ~(PNG_COMPOSE | PNG_GAMMA);
1711
+ } /* color_type == PNG_COLOR_TYPE_PALETTE */
1712
+
1713
+ /* if (png_ptr->background_gamma_type!=PNG_BACKGROUND_GAMMA_UNKNOWN) */
1714
+ else /* color_type != PNG_COLOR_TYPE_PALETTE */
1715
+ {
1716
+ int gs_sig, g_sig;
1717
+ png_fixed_point g = PNG_FP_1; /* Correction to linear */
1718
+ png_fixed_point gs = PNG_FP_1; /* Correction to screen */
1719
+
1720
+ switch (png_ptr->background_gamma_type)
1721
+ {
1722
+ case PNG_BACKGROUND_GAMMA_SCREEN:
1723
+ g = png_ptr->screen_gamma;
1724
+ /* gs = PNG_FP_1; */
1725
+ break;
1726
+
1727
+ case PNG_BACKGROUND_GAMMA_FILE:
1728
+ g = png_reciprocal(png_ptr->colorspace.gamma);
1729
+ gs = png_reciprocal2(png_ptr->colorspace.gamma,
1730
+ png_ptr->screen_gamma);
1731
+ break;
1732
+
1733
+ case PNG_BACKGROUND_GAMMA_UNIQUE:
1734
+ g = png_reciprocal(png_ptr->background_gamma);
1735
+ gs = png_reciprocal2(png_ptr->background_gamma,
1736
+ png_ptr->screen_gamma);
1737
+ break;
1738
+
1739
+ default:
1740
+ png_error(png_ptr, "invalid background gamma type");
1741
+ }
1742
+
1743
+ g_sig = png_gamma_significant(g);
1744
+ gs_sig = png_gamma_significant(gs);
1745
+
1746
+ if (g_sig != 0)
1747
+ png_ptr->background_1.gray = png_gamma_correct(png_ptr,
1748
+ png_ptr->background.gray, g);
1749
+
1750
+ if (gs_sig != 0)
1751
+ png_ptr->background.gray = png_gamma_correct(png_ptr,
1752
+ png_ptr->background.gray, gs);
1753
+
1754
+ if ((png_ptr->background.red != png_ptr->background.green) ||
1755
+ (png_ptr->background.red != png_ptr->background.blue) ||
1756
+ (png_ptr->background.red != png_ptr->background.gray))
1757
+ {
1758
+ /* RGB or RGBA with color background */
1759
+ if (g_sig != 0)
1760
+ {
1761
+ png_ptr->background_1.red = png_gamma_correct(png_ptr,
1762
+ png_ptr->background.red, g);
1763
+
1764
+ png_ptr->background_1.green = png_gamma_correct(png_ptr,
1765
+ png_ptr->background.green, g);
1766
+
1767
+ png_ptr->background_1.blue = png_gamma_correct(png_ptr,
1768
+ png_ptr->background.blue, g);
1769
+ }
1770
+
1771
+ if (gs_sig != 0)
1772
+ {
1773
+ png_ptr->background.red = png_gamma_correct(png_ptr,
1774
+ png_ptr->background.red, gs);
1775
+
1776
+ png_ptr->background.green = png_gamma_correct(png_ptr,
1777
+ png_ptr->background.green, gs);
1778
+
1779
+ png_ptr->background.blue = png_gamma_correct(png_ptr,
1780
+ png_ptr->background.blue, gs);
1781
+ }
1782
+ }
1783
+
1784
+ else
1785
+ {
1786
+ /* GRAY, GRAY ALPHA, RGB, or RGBA with gray background */
1787
+ png_ptr->background_1.red = png_ptr->background_1.green
1788
+ = png_ptr->background_1.blue = png_ptr->background_1.gray;
1789
+
1790
+ png_ptr->background.red = png_ptr->background.green
1791
+ = png_ptr->background.blue = png_ptr->background.gray;
1792
+ }
1793
+
1794
+ /* The background is now in screen gamma: */
1795
+ png_ptr->background_gamma_type = PNG_BACKGROUND_GAMMA_SCREEN;
1796
+ } /* color_type != PNG_COLOR_TYPE_PALETTE */
1797
+ }/* png_ptr->transformations & PNG_BACKGROUND */
1798
+
1799
+ else
1800
+ /* Transformation does not include PNG_BACKGROUND */
1801
+ #endif /* READ_BACKGROUND */
1802
+ if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE
1803
+ #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
1804
+ /* RGB_TO_GRAY needs to have non-gamma-corrected values! */
1805
+ && ((png_ptr->transformations & PNG_EXPAND) == 0 ||
1806
+ (png_ptr->transformations & PNG_RGB_TO_GRAY) == 0)
1807
+ #endif
1808
+ )
1809
+ {
1810
+ png_colorp palette = png_ptr->palette;
1811
+ int num_palette = png_ptr->num_palette;
1812
+ int i;
1813
+
1814
+ /* NOTE: there are other transformations that should probably be in
1815
+ * here too.
1816
+ */
1817
+ for (i = 0; i < num_palette; i++)
1818
+ {
1819
+ palette[i].red = png_ptr->gamma_table[palette[i].red];
1820
+ palette[i].green = png_ptr->gamma_table[palette[i].green];
1821
+ palette[i].blue = png_ptr->gamma_table[palette[i].blue];
1822
+ }
1823
+
1824
+ /* Done the gamma correction. */
1825
+ png_ptr->transformations &= ~PNG_GAMMA;
1826
+ } /* color_type == PALETTE && !PNG_BACKGROUND transformation */
1827
+ }
1828
+ #ifdef PNG_READ_BACKGROUND_SUPPORTED
1829
+ else
1830
+ #endif
1831
+ #endif /* READ_GAMMA */
1832
+
1833
+ #ifdef PNG_READ_BACKGROUND_SUPPORTED
1834
+ /* No GAMMA transformation (see the hanging else 4 lines above) */
1835
+ if ((png_ptr->transformations & PNG_COMPOSE) != 0 &&
1836
+ (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE))
1837
+ {
1838
+ int i;
1839
+ int istop = (int)png_ptr->num_trans;
1840
+ png_color back;
1841
+ png_colorp palette = png_ptr->palette;
1842
+
1843
+ back.red = (png_byte)png_ptr->background.red;
1844
+ back.green = (png_byte)png_ptr->background.green;
1845
+ back.blue = (png_byte)png_ptr->background.blue;
1846
+
1847
+ for (i = 0; i < istop; i++)
1848
+ {
1849
+ if (png_ptr->trans_alpha[i] == 0)
1850
+ {
1851
+ palette[i] = back;
1852
+ }
1853
+
1854
+ else if (png_ptr->trans_alpha[i] != 0xff)
1855
+ {
1856
+ /* The png_composite() macro is defined in png.h */
1857
+ png_composite(palette[i].red, palette[i].red,
1858
+ png_ptr->trans_alpha[i], back.red);
1859
+
1860
+ png_composite(palette[i].green, palette[i].green,
1861
+ png_ptr->trans_alpha[i], back.green);
1862
+
1863
+ png_composite(palette[i].blue, palette[i].blue,
1864
+ png_ptr->trans_alpha[i], back.blue);
1865
+ }
1866
+ }
1867
+
1868
+ png_ptr->transformations &= ~PNG_COMPOSE;
1869
+ }
1870
+ #endif /* READ_BACKGROUND */
1871
+
1872
+ #ifdef PNG_READ_SHIFT_SUPPORTED
1873
+ if ((png_ptr->transformations & PNG_SHIFT) != 0 &&
1874
+ (png_ptr->transformations & PNG_EXPAND) == 0 &&
1875
+ (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE))
1876
+ {
1877
+ int i;
1878
+ int istop = png_ptr->num_palette;
1879
+ int shift = 8 - png_ptr->sig_bit.red;
1880
+
1881
+ png_ptr->transformations &= ~PNG_SHIFT;
1882
+
1883
+ /* significant bits can be in the range 1 to 7 for a meaninful result, if
1884
+ * the number of significant bits is 0 then no shift is done (this is an
1885
+ * error condition which is silently ignored.)
1886
+ */
1887
+ if (shift > 0 && shift < 8)
1888
+ for (i=0; i<istop; ++i)
1889
+ {
1890
+ int component = png_ptr->palette[i].red;
1891
+
1892
+ component >>= shift;
1893
+ png_ptr->palette[i].red = (png_byte)component;
1894
+ }
1895
+
1896
+ shift = 8 - png_ptr->sig_bit.green;
1897
+ if (shift > 0 && shift < 8)
1898
+ for (i=0; i<istop; ++i)
1899
+ {
1900
+ int component = png_ptr->palette[i].green;
1901
+
1902
+ component >>= shift;
1903
+ png_ptr->palette[i].green = (png_byte)component;
1904
+ }
1905
+
1906
+ shift = 8 - png_ptr->sig_bit.blue;
1907
+ if (shift > 0 && shift < 8)
1908
+ for (i=0; i<istop; ++i)
1909
+ {
1910
+ int component = png_ptr->palette[i].blue;
1911
+
1912
+ component >>= shift;
1913
+ png_ptr->palette[i].blue = (png_byte)component;
1914
+ }
1915
+ }
1916
+ #endif /* READ_SHIFT */
1917
+ }
1918
+
1919
+ /* Modify the info structure to reflect the transformations. The
1920
+ * info should be updated so a PNG file could be written with it,
1921
+ * assuming the transformations result in valid PNG data.
1922
+ */
1923
+ void /* PRIVATE */
1924
+ png_read_transform_info(png_structrp png_ptr, png_inforp info_ptr)
1925
+ {
1926
+ png_debug(1, "in png_read_transform_info");
1927
+
1928
+ #ifdef PNG_READ_EXPAND_SUPPORTED
1929
+ if ((png_ptr->transformations & PNG_EXPAND) != 0)
1930
+ {
1931
+ if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
1932
+ {
1933
+ /* This check must match what actually happens in
1934
+ * png_do_expand_palette; if it ever checks the tRNS chunk to see if
1935
+ * it is all opaque we must do the same (at present it does not.)
1936
+ */
1937
+ if (png_ptr->num_trans > 0)
1938
+ info_ptr->color_type = PNG_COLOR_TYPE_RGB_ALPHA;
1939
+
1940
+ else
1941
+ info_ptr->color_type = PNG_COLOR_TYPE_RGB;
1942
+
1943
+ info_ptr->bit_depth = 8;
1944
+ info_ptr->num_trans = 0;
1945
+
1946
+ if (png_ptr->palette == NULL)
1947
+ png_error (png_ptr, "Palette is NULL in indexed image");
1948
+ }
1949
+ else
1950
+ {
1951
+ if (png_ptr->num_trans != 0)
1952
+ {
1953
+ if ((png_ptr->transformations & PNG_EXPAND_tRNS) != 0)
1954
+ info_ptr->color_type |= PNG_COLOR_MASK_ALPHA;
1955
+ }
1956
+ if (info_ptr->bit_depth < 8)
1957
+ info_ptr->bit_depth = 8;
1958
+
1959
+ info_ptr->num_trans = 0;
1960
+ }
1961
+ }
1962
+ #endif
1963
+
1964
+ #if defined(PNG_READ_BACKGROUND_SUPPORTED) ||\
1965
+ defined(PNG_READ_ALPHA_MODE_SUPPORTED)
1966
+ /* The following is almost certainly wrong unless the background value is in
1967
+ * the screen space!
1968
+ */
1969
+ if ((png_ptr->transformations & PNG_COMPOSE) != 0)
1970
+ info_ptr->background = png_ptr->background;
1971
+ #endif
1972
+
1973
+ #ifdef PNG_READ_GAMMA_SUPPORTED
1974
+ /* The following used to be conditional on PNG_GAMMA (prior to 1.5.4),
1975
+ * however it seems that the code in png_init_read_transformations, which has
1976
+ * been called before this from png_read_update_info->png_read_start_row
1977
+ * sometimes does the gamma transform and cancels the flag.
1978
+ *
1979
+ * TODO: this looks wrong; the info_ptr should end up with a gamma equal to
1980
+ * the screen_gamma value. The following probably results in weirdness if
1981
+ * the info_ptr is used by the app after the rows have been read.
1982
+ */
1983
+ info_ptr->colorspace.gamma = png_ptr->colorspace.gamma;
1984
+ #endif
1985
+
1986
+ if (info_ptr->bit_depth == 16)
1987
+ {
1988
+ # ifdef PNG_READ_16BIT_SUPPORTED
1989
+ # ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
1990
+ if ((png_ptr->transformations & PNG_SCALE_16_TO_8) != 0)
1991
+ info_ptr->bit_depth = 8;
1992
+ # endif
1993
+
1994
+ # ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
1995
+ if ((png_ptr->transformations & PNG_16_TO_8) != 0)
1996
+ info_ptr->bit_depth = 8;
1997
+ # endif
1998
+
1999
+ # else
2000
+ /* No 16 bit support: force chopping 16-bit input down to 8, in this case
2001
+ * the app program can chose if both APIs are available by setting the
2002
+ * correct scaling to use.
2003
+ */
2004
+ # ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
2005
+ /* For compatibility with previous versions use the strip method by
2006
+ * default. This code works because if PNG_SCALE_16_TO_8 is already
2007
+ * set the code below will do that in preference to the chop.
2008
+ */
2009
+ png_ptr->transformations |= PNG_16_TO_8;
2010
+ info_ptr->bit_depth = 8;
2011
+ # else
2012
+
2013
+ # ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
2014
+ png_ptr->transformations |= PNG_SCALE_16_TO_8;
2015
+ info_ptr->bit_depth = 8;
2016
+ # else
2017
+
2018
+ CONFIGURATION ERROR: you must enable at least one 16 to 8 method
2019
+ # endif
2020
+ # endif
2021
+ #endif /* !READ_16BIT */
2022
+ }
2023
+
2024
+ #ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
2025
+ if ((png_ptr->transformations & PNG_GRAY_TO_RGB) != 0)
2026
+ info_ptr->color_type = (png_byte)(info_ptr->color_type |
2027
+ PNG_COLOR_MASK_COLOR);
2028
+ #endif
2029
+
2030
+ #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
2031
+ if ((png_ptr->transformations & PNG_RGB_TO_GRAY) != 0)
2032
+ info_ptr->color_type = (png_byte)(info_ptr->color_type &
2033
+ ~PNG_COLOR_MASK_COLOR);
2034
+ #endif
2035
+
2036
+ #ifdef PNG_READ_QUANTIZE_SUPPORTED
2037
+ if ((png_ptr->transformations & PNG_QUANTIZE) != 0)
2038
+ {
2039
+ if (((info_ptr->color_type == PNG_COLOR_TYPE_RGB) ||
2040
+ (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA)) &&
2041
+ png_ptr->palette_lookup != 0 && info_ptr->bit_depth == 8)
2042
+ {
2043
+ info_ptr->color_type = PNG_COLOR_TYPE_PALETTE;
2044
+ }
2045
+ }
2046
+ #endif
2047
+
2048
+ #ifdef PNG_READ_EXPAND_16_SUPPORTED
2049
+ if ((png_ptr->transformations & PNG_EXPAND_16) != 0 &&
2050
+ info_ptr->bit_depth == 8 &&
2051
+ info_ptr->color_type != PNG_COLOR_TYPE_PALETTE)
2052
+ {
2053
+ info_ptr->bit_depth = 16;
2054
+ }
2055
+ #endif
2056
+
2057
+ #ifdef PNG_READ_PACK_SUPPORTED
2058
+ if ((png_ptr->transformations & PNG_PACK) != 0 &&
2059
+ (info_ptr->bit_depth < 8))
2060
+ info_ptr->bit_depth = 8;
2061
+ #endif
2062
+
2063
+ if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
2064
+ info_ptr->channels = 1;
2065
+
2066
+ else if ((info_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)
2067
+ info_ptr->channels = 3;
2068
+
2069
+ else
2070
+ info_ptr->channels = 1;
2071
+
2072
+ #ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
2073
+ if ((png_ptr->transformations & PNG_STRIP_ALPHA) != 0)
2074
+ {
2075
+ info_ptr->color_type = (png_byte)(info_ptr->color_type &
2076
+ ~PNG_COLOR_MASK_ALPHA);
2077
+ info_ptr->num_trans = 0;
2078
+ }
2079
+ #endif
2080
+
2081
+ if ((info_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0)
2082
+ info_ptr->channels++;
2083
+
2084
+ #ifdef PNG_READ_FILLER_SUPPORTED
2085
+ /* STRIP_ALPHA and FILLER allowed: MASK_ALPHA bit stripped above */
2086
+ if ((png_ptr->transformations & PNG_FILLER) != 0 &&
2087
+ (info_ptr->color_type == PNG_COLOR_TYPE_RGB ||
2088
+ info_ptr->color_type == PNG_COLOR_TYPE_GRAY))
2089
+ {
2090
+ info_ptr->channels++;
2091
+ /* If adding a true alpha channel not just filler */
2092
+ if ((png_ptr->transformations & PNG_ADD_ALPHA) != 0)
2093
+ info_ptr->color_type |= PNG_COLOR_MASK_ALPHA;
2094
+ }
2095
+ #endif
2096
+
2097
+ #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) && \
2098
+ defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
2099
+ if ((png_ptr->transformations & PNG_USER_TRANSFORM) != 0)
2100
+ {
2101
+ if (info_ptr->bit_depth < png_ptr->user_transform_depth)
2102
+ info_ptr->bit_depth = png_ptr->user_transform_depth;
2103
+
2104
+ if (info_ptr->channels < png_ptr->user_transform_channels)
2105
+ info_ptr->channels = png_ptr->user_transform_channels;
2106
+ }
2107
+ #endif
2108
+
2109
+ info_ptr->pixel_depth = (png_byte)(info_ptr->channels *
2110
+ info_ptr->bit_depth);
2111
+
2112
+ info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, info_ptr->width);
2113
+
2114
+ /* Adding in 1.5.4: cache the above value in png_struct so that we can later
2115
+ * check in png_rowbytes that the user buffer won't get overwritten. Note
2116
+ * that the field is not always set - if png_read_update_info isn't called
2117
+ * the application has to either not do any transforms or get the calculation
2118
+ * right itself.
2119
+ */
2120
+ png_ptr->info_rowbytes = info_ptr->rowbytes;
2121
+
2122
+ #ifndef PNG_READ_EXPAND_SUPPORTED
2123
+ if (png_ptr != NULL)
2124
+ return;
2125
+ #endif
2126
+ }
2127
+
2128
+ #ifdef PNG_READ_PACK_SUPPORTED
2129
+ /* Unpack pixels of 1, 2, or 4 bits per pixel into 1 byte per pixel,
2130
+ * without changing the actual values. Thus, if you had a row with
2131
+ * a bit depth of 1, you would end up with bytes that only contained
2132
+ * the numbers 0 or 1. If you would rather they contain 0 and 255, use
2133
+ * png_do_shift() after this.
2134
+ */
2135
+ static void
2136
+ png_do_unpack(png_row_infop row_info, png_bytep row)
2137
+ {
2138
+ png_debug(1, "in png_do_unpack");
2139
+
2140
+ if (row_info->bit_depth < 8)
2141
+ {
2142
+ png_uint_32 i;
2143
+ png_uint_32 row_width=row_info->width;
2144
+
2145
+ switch (row_info->bit_depth)
2146
+ {
2147
+ case 1:
2148
+ {
2149
+ png_bytep sp = row + (png_size_t)((row_width - 1) >> 3);
2150
+ png_bytep dp = row + (png_size_t)row_width - 1;
2151
+ png_uint_32 shift = 7 - (int)((row_width + 7) & 0x07);
2152
+ for (i = 0; i < row_width; i++)
2153
+ {
2154
+ *dp = (png_byte)((*sp >> shift) & 0x01);
2155
+
2156
+ if (shift == 7)
2157
+ {
2158
+ shift = 0;
2159
+ sp--;
2160
+ }
2161
+
2162
+ else
2163
+ shift++;
2164
+
2165
+ dp--;
2166
+ }
2167
+ break;
2168
+ }
2169
+
2170
+ case 2:
2171
+ {
2172
+
2173
+ png_bytep sp = row + (png_size_t)((row_width - 1) >> 2);
2174
+ png_bytep dp = row + (png_size_t)row_width - 1;
2175
+ png_uint_32 shift = (int)((3 - ((row_width + 3) & 0x03)) << 1);
2176
+ for (i = 0; i < row_width; i++)
2177
+ {
2178
+ *dp = (png_byte)((*sp >> shift) & 0x03);
2179
+
2180
+ if (shift == 6)
2181
+ {
2182
+ shift = 0;
2183
+ sp--;
2184
+ }
2185
+
2186
+ else
2187
+ shift += 2;
2188
+
2189
+ dp--;
2190
+ }
2191
+ break;
2192
+ }
2193
+
2194
+ case 4:
2195
+ {
2196
+ png_bytep sp = row + (png_size_t)((row_width - 1) >> 1);
2197
+ png_bytep dp = row + (png_size_t)row_width - 1;
2198
+ png_uint_32 shift = (int)((1 - ((row_width + 1) & 0x01)) << 2);
2199
+ for (i = 0; i < row_width; i++)
2200
+ {
2201
+ *dp = (png_byte)((*sp >> shift) & 0x0f);
2202
+
2203
+ if (shift == 4)
2204
+ {
2205
+ shift = 0;
2206
+ sp--;
2207
+ }
2208
+
2209
+ else
2210
+ shift = 4;
2211
+
2212
+ dp--;
2213
+ }
2214
+ break;
2215
+ }
2216
+
2217
+ default:
2218
+ break;
2219
+ }
2220
+ row_info->bit_depth = 8;
2221
+ row_info->pixel_depth = (png_byte)(8 * row_info->channels);
2222
+ row_info->rowbytes = row_width * row_info->channels;
2223
+ }
2224
+ }
2225
+ #endif
2226
+
2227
+ #ifdef PNG_READ_SHIFT_SUPPORTED
2228
+ /* Reverse the effects of png_do_shift. This routine merely shifts the
2229
+ * pixels back to their significant bits values. Thus, if you have
2230
+ * a row of bit depth 8, but only 5 are significant, this will shift
2231
+ * the values back to 0 through 31.
2232
+ */
2233
+ static void
2234
+ png_do_unshift(png_row_infop row_info, png_bytep row,
2235
+ png_const_color_8p sig_bits)
2236
+ {
2237
+ int color_type;
2238
+
2239
+ png_debug(1, "in png_do_unshift");
2240
+
2241
+ /* The palette case has already been handled in the _init routine. */
2242
+ color_type = row_info->color_type;
2243
+
2244
+ if (color_type != PNG_COLOR_TYPE_PALETTE)
2245
+ {
2246
+ int shift[4];
2247
+ int channels = 0;
2248
+ int bit_depth = row_info->bit_depth;
2249
+
2250
+ if ((color_type & PNG_COLOR_MASK_COLOR) != 0)
2251
+ {
2252
+ shift[channels++] = bit_depth - sig_bits->red;
2253
+ shift[channels++] = bit_depth - sig_bits->green;
2254
+ shift[channels++] = bit_depth - sig_bits->blue;
2255
+ }
2256
+
2257
+ else
2258
+ {
2259
+ shift[channels++] = bit_depth - sig_bits->gray;
2260
+ }
2261
+
2262
+ if ((color_type & PNG_COLOR_MASK_ALPHA) != 0)
2263
+ {
2264
+ shift[channels++] = bit_depth - sig_bits->alpha;
2265
+ }
2266
+
2267
+ {
2268
+ int c, have_shift;
2269
+
2270
+ for (c = have_shift = 0; c < channels; ++c)
2271
+ {
2272
+ /* A shift of more than the bit depth is an error condition but it
2273
+ * gets ignored here.
2274
+ */
2275
+ if (shift[c] <= 0 || shift[c] >= bit_depth)
2276
+ shift[c] = 0;
2277
+
2278
+ else
2279
+ have_shift = 1;
2280
+ }
2281
+
2282
+ if (have_shift == 0)
2283
+ return;
2284
+ }
2285
+
2286
+ switch (bit_depth)
2287
+ {
2288
+ default:
2289
+ /* Must be 1bpp gray: should not be here! */
2290
+ /* NOTREACHED */
2291
+ break;
2292
+
2293
+ case 2:
2294
+ /* Must be 2bpp gray */
2295
+ /* assert(channels == 1 && shift[0] == 1) */
2296
+ {
2297
+ png_bytep bp = row;
2298
+ png_bytep bp_end = bp + row_info->rowbytes;
2299
+
2300
+ while (bp < bp_end)
2301
+ {
2302
+ int b = (*bp >> 1) & 0x55;
2303
+ *bp++ = (png_byte)b;
2304
+ }
2305
+ break;
2306
+ }
2307
+
2308
+ case 4:
2309
+ /* Must be 4bpp gray */
2310
+ /* assert(channels == 1) */
2311
+ {
2312
+ png_bytep bp = row;
2313
+ png_bytep bp_end = bp + row_info->rowbytes;
2314
+ int gray_shift = shift[0];
2315
+ int mask = 0xf >> gray_shift;
2316
+
2317
+ mask |= mask << 4;
2318
+
2319
+ while (bp < bp_end)
2320
+ {
2321
+ int b = (*bp >> gray_shift) & mask;
2322
+ *bp++ = (png_byte)b;
2323
+ }
2324
+ break;
2325
+ }
2326
+
2327
+ case 8:
2328
+ /* Single byte components, G, GA, RGB, RGBA */
2329
+ {
2330
+ png_bytep bp = row;
2331
+ png_bytep bp_end = bp + row_info->rowbytes;
2332
+ int channel = 0;
2333
+
2334
+ while (bp < bp_end)
2335
+ {
2336
+ int b = *bp >> shift[channel];
2337
+ if (++channel >= channels)
2338
+ channel = 0;
2339
+ *bp++ = (png_byte)b;
2340
+ }
2341
+ break;
2342
+ }
2343
+
2344
+ #ifdef PNG_READ_16BIT_SUPPORTED
2345
+ case 16:
2346
+ /* Double byte components, G, GA, RGB, RGBA */
2347
+ {
2348
+ png_bytep bp = row;
2349
+ png_bytep bp_end = bp + row_info->rowbytes;
2350
+ int channel = 0;
2351
+
2352
+ while (bp < bp_end)
2353
+ {
2354
+ int value = (bp[0] << 8) + bp[1];
2355
+
2356
+ value >>= shift[channel];
2357
+ if (++channel >= channels)
2358
+ channel = 0;
2359
+ *bp++ = (png_byte)(value >> 8);
2360
+ *bp++ = (png_byte)(value & 0xff);
2361
+ }
2362
+ break;
2363
+ }
2364
+ #endif
2365
+ }
2366
+ }
2367
+ }
2368
+ #endif
2369
+
2370
+ #ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
2371
+ /* Scale rows of bit depth 16 down to 8 accurately */
2372
+ static void
2373
+ png_do_scale_16_to_8(png_row_infop row_info, png_bytep row)
2374
+ {
2375
+ png_debug(1, "in png_do_scale_16_to_8");
2376
+
2377
+ if (row_info->bit_depth == 16)
2378
+ {
2379
+ png_bytep sp = row; /* source */
2380
+ png_bytep dp = row; /* destination */
2381
+ png_bytep ep = sp + row_info->rowbytes; /* end+1 */
2382
+
2383
+ while (sp < ep)
2384
+ {
2385
+ /* The input is an array of 16 bit components, these must be scaled to
2386
+ * 8 bits each. For a 16 bit value V the required value (from the PNG
2387
+ * specification) is:
2388
+ *
2389
+ * (V * 255) / 65535
2390
+ *
2391
+ * This reduces to round(V / 257), or floor((V + 128.5)/257)
2392
+ *
2393
+ * Represent V as the two byte value vhi.vlo. Make a guess that the
2394
+ * result is the top byte of V, vhi, then the correction to this value
2395
+ * is:
2396
+ *
2397
+ * error = floor(((V-vhi.vhi) + 128.5) / 257)
2398
+ * = floor(((vlo-vhi) + 128.5) / 257)
2399
+ *
2400
+ * This can be approximated using integer arithmetic (and a signed
2401
+ * shift):
2402
+ *
2403
+ * error = (vlo-vhi+128) >> 8;
2404
+ *
2405
+ * The approximate differs from the exact answer only when (vlo-vhi) is
2406
+ * 128; it then gives a correction of +1 when the exact correction is
2407
+ * 0. This gives 128 errors. The exact answer (correct for all 16 bit
2408
+ * input values) is:
2409
+ *
2410
+ * error = (vlo-vhi+128)*65535 >> 24;
2411
+ *
2412
+ * An alternative arithmetic calculation which also gives no errors is:
2413
+ *
2414
+ * (V * 255 + 32895) >> 16
2415
+ */
2416
+
2417
+ png_int_32 tmp = *sp++; /* must be signed! */
2418
+ tmp += (((int)*sp++ - tmp + 128) * 65535) >> 24;
2419
+ *dp++ = (png_byte)tmp;
2420
+ }
2421
+
2422
+ row_info->bit_depth = 8;
2423
+ row_info->pixel_depth = (png_byte)(8 * row_info->channels);
2424
+ row_info->rowbytes = row_info->width * row_info->channels;
2425
+ }
2426
+ }
2427
+ #endif
2428
+
2429
+ #ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
2430
+ static void
2431
+ /* Simply discard the low byte. This was the default behavior prior
2432
+ * to libpng-1.5.4.
2433
+ */
2434
+ png_do_chop(png_row_infop row_info, png_bytep row)
2435
+ {
2436
+ png_debug(1, "in png_do_chop");
2437
+
2438
+ if (row_info->bit_depth == 16)
2439
+ {
2440
+ png_bytep sp = row; /* source */
2441
+ png_bytep dp = row; /* destination */
2442
+ png_bytep ep = sp + row_info->rowbytes; /* end+1 */
2443
+
2444
+ while (sp < ep)
2445
+ {
2446
+ *dp++ = *sp;
2447
+ sp += 2; /* skip low byte */
2448
+ }
2449
+
2450
+ row_info->bit_depth = 8;
2451
+ row_info->pixel_depth = (png_byte)(8 * row_info->channels);
2452
+ row_info->rowbytes = row_info->width * row_info->channels;
2453
+ }
2454
+ }
2455
+ #endif
2456
+
2457
+ #ifdef PNG_READ_SWAP_ALPHA_SUPPORTED
2458
+ static void
2459
+ png_do_read_swap_alpha(png_row_infop row_info, png_bytep row)
2460
+ {
2461
+ png_debug(1, "in png_do_read_swap_alpha");
2462
+
2463
+ {
2464
+ png_uint_32 row_width = row_info->width;
2465
+ if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
2466
+ {
2467
+ /* This converts from RGBA to ARGB */
2468
+ if (row_info->bit_depth == 8)
2469
+ {
2470
+ png_bytep sp = row + row_info->rowbytes;
2471
+ png_bytep dp = sp;
2472
+ png_byte save;
2473
+ png_uint_32 i;
2474
+
2475
+ for (i = 0; i < row_width; i++)
2476
+ {
2477
+ save = *(--sp);
2478
+ *(--dp) = *(--sp);
2479
+ *(--dp) = *(--sp);
2480
+ *(--dp) = *(--sp);
2481
+ *(--dp) = save;
2482
+ }
2483
+ }
2484
+
2485
+ #ifdef PNG_READ_16BIT_SUPPORTED
2486
+ /* This converts from RRGGBBAA to AARRGGBB */
2487
+ else
2488
+ {
2489
+ png_bytep sp = row + row_info->rowbytes;
2490
+ png_bytep dp = sp;
2491
+ png_byte save[2];
2492
+ png_uint_32 i;
2493
+
2494
+ for (i = 0; i < row_width; i++)
2495
+ {
2496
+ save[0] = *(--sp);
2497
+ save[1] = *(--sp);
2498
+ *(--dp) = *(--sp);
2499
+ *(--dp) = *(--sp);
2500
+ *(--dp) = *(--sp);
2501
+ *(--dp) = *(--sp);
2502
+ *(--dp) = *(--sp);
2503
+ *(--dp) = *(--sp);
2504
+ *(--dp) = save[0];
2505
+ *(--dp) = save[1];
2506
+ }
2507
+ }
2508
+ #endif
2509
+ }
2510
+
2511
+ else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
2512
+ {
2513
+ /* This converts from GA to AG */
2514
+ if (row_info->bit_depth == 8)
2515
+ {
2516
+ png_bytep sp = row + row_info->rowbytes;
2517
+ png_bytep dp = sp;
2518
+ png_byte save;
2519
+ png_uint_32 i;
2520
+
2521
+ for (i = 0; i < row_width; i++)
2522
+ {
2523
+ save = *(--sp);
2524
+ *(--dp) = *(--sp);
2525
+ *(--dp) = save;
2526
+ }
2527
+ }
2528
+
2529
+ #ifdef PNG_READ_16BIT_SUPPORTED
2530
+ /* This converts from GGAA to AAGG */
2531
+ else
2532
+ {
2533
+ png_bytep sp = row + row_info->rowbytes;
2534
+ png_bytep dp = sp;
2535
+ png_byte save[2];
2536
+ png_uint_32 i;
2537
+
2538
+ for (i = 0; i < row_width; i++)
2539
+ {
2540
+ save[0] = *(--sp);
2541
+ save[1] = *(--sp);
2542
+ *(--dp) = *(--sp);
2543
+ *(--dp) = *(--sp);
2544
+ *(--dp) = save[0];
2545
+ *(--dp) = save[1];
2546
+ }
2547
+ }
2548
+ #endif
2549
+ }
2550
+ }
2551
+ }
2552
+ #endif
2553
+
2554
+ #ifdef PNG_READ_INVERT_ALPHA_SUPPORTED
2555
+ static void
2556
+ png_do_read_invert_alpha(png_row_infop row_info, png_bytep row)
2557
+ {
2558
+ png_uint_32 row_width;
2559
+ png_debug(1, "in png_do_read_invert_alpha");
2560
+
2561
+ row_width = row_info->width;
2562
+ if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
2563
+ {
2564
+ if (row_info->bit_depth == 8)
2565
+ {
2566
+ /* This inverts the alpha channel in RGBA */
2567
+ png_bytep sp = row + row_info->rowbytes;
2568
+ png_bytep dp = sp;
2569
+ png_uint_32 i;
2570
+
2571
+ for (i = 0; i < row_width; i++)
2572
+ {
2573
+ *(--dp) = (png_byte)(255 - *(--sp));
2574
+
2575
+ /* This does nothing:
2576
+ *(--dp) = *(--sp);
2577
+ *(--dp) = *(--sp);
2578
+ *(--dp) = *(--sp);
2579
+ We can replace it with:
2580
+ */
2581
+ sp-=3;
2582
+ dp=sp;
2583
+ }
2584
+ }
2585
+
2586
+ #ifdef PNG_READ_16BIT_SUPPORTED
2587
+ /* This inverts the alpha channel in RRGGBBAA */
2588
+ else
2589
+ {
2590
+ png_bytep sp = row + row_info->rowbytes;
2591
+ png_bytep dp = sp;
2592
+ png_uint_32 i;
2593
+
2594
+ for (i = 0; i < row_width; i++)
2595
+ {
2596
+ *(--dp) = (png_byte)(255 - *(--sp));
2597
+ *(--dp) = (png_byte)(255 - *(--sp));
2598
+
2599
+ /* This does nothing:
2600
+ *(--dp) = *(--sp);
2601
+ *(--dp) = *(--sp);
2602
+ *(--dp) = *(--sp);
2603
+ *(--dp) = *(--sp);
2604
+ *(--dp) = *(--sp);
2605
+ *(--dp) = *(--sp);
2606
+ We can replace it with:
2607
+ */
2608
+ sp-=6;
2609
+ dp=sp;
2610
+ }
2611
+ }
2612
+ #endif
2613
+ }
2614
+ else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
2615
+ {
2616
+ if (row_info->bit_depth == 8)
2617
+ {
2618
+ /* This inverts the alpha channel in GA */
2619
+ png_bytep sp = row + row_info->rowbytes;
2620
+ png_bytep dp = sp;
2621
+ png_uint_32 i;
2622
+
2623
+ for (i = 0; i < row_width; i++)
2624
+ {
2625
+ *(--dp) = (png_byte)(255 - *(--sp));
2626
+ *(--dp) = *(--sp);
2627
+ }
2628
+ }
2629
+
2630
+ #ifdef PNG_READ_16BIT_SUPPORTED
2631
+ else
2632
+ {
2633
+ /* This inverts the alpha channel in GGAA */
2634
+ png_bytep sp = row + row_info->rowbytes;
2635
+ png_bytep dp = sp;
2636
+ png_uint_32 i;
2637
+
2638
+ for (i = 0; i < row_width; i++)
2639
+ {
2640
+ *(--dp) = (png_byte)(255 - *(--sp));
2641
+ *(--dp) = (png_byte)(255 - *(--sp));
2642
+ /*
2643
+ *(--dp) = *(--sp);
2644
+ *(--dp) = *(--sp);
2645
+ */
2646
+ sp-=2;
2647
+ dp=sp;
2648
+ }
2649
+ }
2650
+ #endif
2651
+ }
2652
+ }
2653
+ #endif
2654
+
2655
+ #ifdef PNG_READ_FILLER_SUPPORTED
2656
+ /* Add filler channel if we have RGB color */
2657
+ static void
2658
+ png_do_read_filler(png_row_infop row_info, png_bytep row,
2659
+ png_uint_32 filler, png_uint_32 flags)
2660
+ {
2661
+ png_uint_32 i;
2662
+ png_uint_32 row_width = row_info->width;
2663
+
2664
+ #ifdef PNG_READ_16BIT_SUPPORTED
2665
+ png_byte hi_filler = (png_byte)((filler>>8) & 0xff);
2666
+ #endif
2667
+ png_byte lo_filler = (png_byte)(filler & 0xff);
2668
+
2669
+ png_debug(1, "in png_do_read_filler");
2670
+
2671
+ if (
2672
+ row_info->color_type == PNG_COLOR_TYPE_GRAY)
2673
+ {
2674
+ if (row_info->bit_depth == 8)
2675
+ {
2676
+ if ((flags & PNG_FLAG_FILLER_AFTER) != 0)
2677
+ {
2678
+ /* This changes the data from G to GX */
2679
+ png_bytep sp = row + (png_size_t)row_width;
2680
+ png_bytep dp = sp + (png_size_t)row_width;
2681
+ for (i = 1; i < row_width; i++)
2682
+ {
2683
+ *(--dp) = lo_filler;
2684
+ *(--dp) = *(--sp);
2685
+ }
2686
+ *(--dp) = lo_filler;
2687
+ row_info->channels = 2;
2688
+ row_info->pixel_depth = 16;
2689
+ row_info->rowbytes = row_width * 2;
2690
+ }
2691
+
2692
+ else
2693
+ {
2694
+ /* This changes the data from G to XG */
2695
+ png_bytep sp = row + (png_size_t)row_width;
2696
+ png_bytep dp = sp + (png_size_t)row_width;
2697
+ for (i = 0; i < row_width; i++)
2698
+ {
2699
+ *(--dp) = *(--sp);
2700
+ *(--dp) = lo_filler;
2701
+ }
2702
+ row_info->channels = 2;
2703
+ row_info->pixel_depth = 16;
2704
+ row_info->rowbytes = row_width * 2;
2705
+ }
2706
+ }
2707
+
2708
+ #ifdef PNG_READ_16BIT_SUPPORTED
2709
+ else if (row_info->bit_depth == 16)
2710
+ {
2711
+ if ((flags & PNG_FLAG_FILLER_AFTER) != 0)
2712
+ {
2713
+ /* This changes the data from GG to GGXX */
2714
+ png_bytep sp = row + (png_size_t)row_width * 2;
2715
+ png_bytep dp = sp + (png_size_t)row_width * 2;
2716
+ for (i = 1; i < row_width; i++)
2717
+ {
2718
+ *(--dp) = hi_filler;
2719
+ *(--dp) = lo_filler;
2720
+ *(--dp) = *(--sp);
2721
+ *(--dp) = *(--sp);
2722
+ }
2723
+ *(--dp) = hi_filler;
2724
+ *(--dp) = lo_filler;
2725
+ row_info->channels = 2;
2726
+ row_info->pixel_depth = 32;
2727
+ row_info->rowbytes = row_width * 4;
2728
+ }
2729
+
2730
+ else
2731
+ {
2732
+ /* This changes the data from GG to XXGG */
2733
+ png_bytep sp = row + (png_size_t)row_width * 2;
2734
+ png_bytep dp = sp + (png_size_t)row_width * 2;
2735
+ for (i = 0; i < row_width; i++)
2736
+ {
2737
+ *(--dp) = *(--sp);
2738
+ *(--dp) = *(--sp);
2739
+ *(--dp) = hi_filler;
2740
+ *(--dp) = lo_filler;
2741
+ }
2742
+ row_info->channels = 2;
2743
+ row_info->pixel_depth = 32;
2744
+ row_info->rowbytes = row_width * 4;
2745
+ }
2746
+ }
2747
+ #endif
2748
+ } /* COLOR_TYPE == GRAY */
2749
+ else if (row_info->color_type == PNG_COLOR_TYPE_RGB)
2750
+ {
2751
+ if (row_info->bit_depth == 8)
2752
+ {
2753
+ if ((flags & PNG_FLAG_FILLER_AFTER) != 0)
2754
+ {
2755
+ /* This changes the data from RGB to RGBX */
2756
+ png_bytep sp = row + (png_size_t)row_width * 3;
2757
+ png_bytep dp = sp + (png_size_t)row_width;
2758
+ for (i = 1; i < row_width; i++)
2759
+ {
2760
+ *(--dp) = lo_filler;
2761
+ *(--dp) = *(--sp);
2762
+ *(--dp) = *(--sp);
2763
+ *(--dp) = *(--sp);
2764
+ }
2765
+ *(--dp) = lo_filler;
2766
+ row_info->channels = 4;
2767
+ row_info->pixel_depth = 32;
2768
+ row_info->rowbytes = row_width * 4;
2769
+ }
2770
+
2771
+ else
2772
+ {
2773
+ /* This changes the data from RGB to XRGB */
2774
+ png_bytep sp = row + (png_size_t)row_width * 3;
2775
+ png_bytep dp = sp + (png_size_t)row_width;
2776
+ for (i = 0; i < row_width; i++)
2777
+ {
2778
+ *(--dp) = *(--sp);
2779
+ *(--dp) = *(--sp);
2780
+ *(--dp) = *(--sp);
2781
+ *(--dp) = lo_filler;
2782
+ }
2783
+ row_info->channels = 4;
2784
+ row_info->pixel_depth = 32;
2785
+ row_info->rowbytes = row_width * 4;
2786
+ }
2787
+ }
2788
+
2789
+ #ifdef PNG_READ_16BIT_SUPPORTED
2790
+ else if (row_info->bit_depth == 16)
2791
+ {
2792
+ if ((flags & PNG_FLAG_FILLER_AFTER) != 0)
2793
+ {
2794
+ /* This changes the data from RRGGBB to RRGGBBXX */
2795
+ png_bytep sp = row + (png_size_t)row_width * 6;
2796
+ png_bytep dp = sp + (png_size_t)row_width * 2;
2797
+ for (i = 1; i < row_width; i++)
2798
+ {
2799
+ *(--dp) = hi_filler;
2800
+ *(--dp) = lo_filler;
2801
+ *(--dp) = *(--sp);
2802
+ *(--dp) = *(--sp);
2803
+ *(--dp) = *(--sp);
2804
+ *(--dp) = *(--sp);
2805
+ *(--dp) = *(--sp);
2806
+ *(--dp) = *(--sp);
2807
+ }
2808
+ *(--dp) = hi_filler;
2809
+ *(--dp) = lo_filler;
2810
+ row_info->channels = 4;
2811
+ row_info->pixel_depth = 64;
2812
+ row_info->rowbytes = row_width * 8;
2813
+ }
2814
+
2815
+ else
2816
+ {
2817
+ /* This changes the data from RRGGBB to XXRRGGBB */
2818
+ png_bytep sp = row + (png_size_t)row_width * 6;
2819
+ png_bytep dp = sp + (png_size_t)row_width * 2;
2820
+ for (i = 0; i < row_width; i++)
2821
+ {
2822
+ *(--dp) = *(--sp);
2823
+ *(--dp) = *(--sp);
2824
+ *(--dp) = *(--sp);
2825
+ *(--dp) = *(--sp);
2826
+ *(--dp) = *(--sp);
2827
+ *(--dp) = *(--sp);
2828
+ *(--dp) = hi_filler;
2829
+ *(--dp) = lo_filler;
2830
+ }
2831
+
2832
+ row_info->channels = 4;
2833
+ row_info->pixel_depth = 64;
2834
+ row_info->rowbytes = row_width * 8;
2835
+ }
2836
+ }
2837
+ #endif
2838
+ } /* COLOR_TYPE == RGB */
2839
+ }
2840
+ #endif
2841
+
2842
+ #ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
2843
+ /* Expand grayscale files to RGB, with or without alpha */
2844
+ static void
2845
+ png_do_gray_to_rgb(png_row_infop row_info, png_bytep row)
2846
+ {
2847
+ png_uint_32 i;
2848
+ png_uint_32 row_width = row_info->width;
2849
+
2850
+ png_debug(1, "in png_do_gray_to_rgb");
2851
+
2852
+ if (row_info->bit_depth >= 8 &&
2853
+ (row_info->color_type & PNG_COLOR_MASK_COLOR) == 0)
2854
+ {
2855
+ if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
2856
+ {
2857
+ if (row_info->bit_depth == 8)
2858
+ {
2859
+ /* This changes G to RGB */
2860
+ png_bytep sp = row + (png_size_t)row_width - 1;
2861
+ png_bytep dp = sp + (png_size_t)row_width * 2;
2862
+ for (i = 0; i < row_width; i++)
2863
+ {
2864
+ *(dp--) = *sp;
2865
+ *(dp--) = *sp;
2866
+ *(dp--) = *(sp--);
2867
+ }
2868
+ }
2869
+
2870
+ else
2871
+ {
2872
+ /* This changes GG to RRGGBB */
2873
+ png_bytep sp = row + (png_size_t)row_width * 2 - 1;
2874
+ png_bytep dp = sp + (png_size_t)row_width * 4;
2875
+ for (i = 0; i < row_width; i++)
2876
+ {
2877
+ *(dp--) = *sp;
2878
+ *(dp--) = *(sp - 1);
2879
+ *(dp--) = *sp;
2880
+ *(dp--) = *(sp - 1);
2881
+ *(dp--) = *(sp--);
2882
+ *(dp--) = *(sp--);
2883
+ }
2884
+ }
2885
+ }
2886
+
2887
+ else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
2888
+ {
2889
+ if (row_info->bit_depth == 8)
2890
+ {
2891
+ /* This changes GA to RGBA */
2892
+ png_bytep sp = row + (png_size_t)row_width * 2 - 1;
2893
+ png_bytep dp = sp + (png_size_t)row_width * 2;
2894
+ for (i = 0; i < row_width; i++)
2895
+ {
2896
+ *(dp--) = *(sp--);
2897
+ *(dp--) = *sp;
2898
+ *(dp--) = *sp;
2899
+ *(dp--) = *(sp--);
2900
+ }
2901
+ }
2902
+
2903
+ else
2904
+ {
2905
+ /* This changes GGAA to RRGGBBAA */
2906
+ png_bytep sp = row + (png_size_t)row_width * 4 - 1;
2907
+ png_bytep dp = sp + (png_size_t)row_width * 4;
2908
+ for (i = 0; i < row_width; i++)
2909
+ {
2910
+ *(dp--) = *(sp--);
2911
+ *(dp--) = *(sp--);
2912
+ *(dp--) = *sp;
2913
+ *(dp--) = *(sp - 1);
2914
+ *(dp--) = *sp;
2915
+ *(dp--) = *(sp - 1);
2916
+ *(dp--) = *(sp--);
2917
+ *(dp--) = *(sp--);
2918
+ }
2919
+ }
2920
+ }
2921
+ row_info->channels = (png_byte)(row_info->channels + 2);
2922
+ row_info->color_type |= PNG_COLOR_MASK_COLOR;
2923
+ row_info->pixel_depth = (png_byte)(row_info->channels *
2924
+ row_info->bit_depth);
2925
+ row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);
2926
+ }
2927
+ }
2928
+ #endif
2929
+
2930
+ #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
2931
+ /* Reduce RGB files to grayscale, with or without alpha
2932
+ * using the equation given in Poynton's ColorFAQ of 1998-01-04 at
2933
+ * <http://www.inforamp.net/~poynton/> (THIS LINK IS DEAD June 2008 but
2934
+ * versions dated 1998 through November 2002 have been archived at
2935
+ * http://web.archive.org/web/20000816232553/http://www.inforamp.net/
2936
+ * ~poynton/notes/colour_and_gamma/ColorFAQ.txt )
2937
+ * Charles Poynton poynton at poynton.com
2938
+ *
2939
+ * Y = 0.212671 * R + 0.715160 * G + 0.072169 * B
2940
+ *
2941
+ * which can be expressed with integers as
2942
+ *
2943
+ * Y = (6969 * R + 23434 * G + 2365 * B)/32768
2944
+ *
2945
+ * Poynton's current link (as of January 2003 through July 2011):
2946
+ * <http://www.poynton.com/notes/colour_and_gamma/>
2947
+ * has changed the numbers slightly:
2948
+ *
2949
+ * Y = 0.2126*R + 0.7152*G + 0.0722*B
2950
+ *
2951
+ * which can be expressed with integers as
2952
+ *
2953
+ * Y = (6966 * R + 23436 * G + 2366 * B)/32768
2954
+ *
2955
+ * Historically, however, libpng uses numbers derived from the ITU-R Rec 709
2956
+ * end point chromaticities and the D65 white point. Depending on the
2957
+ * precision used for the D65 white point this produces a variety of different
2958
+ * numbers, however if the four decimal place value used in ITU-R Rec 709 is
2959
+ * used (0.3127,0.3290) the Y calculation would be:
2960
+ *
2961
+ * Y = (6968 * R + 23435 * G + 2366 * B)/32768
2962
+ *
2963
+ * While this is correct the rounding results in an overflow for white, because
2964
+ * the sum of the rounded coefficients is 32769, not 32768. Consequently
2965
+ * libpng uses, instead, the closest non-overflowing approximation:
2966
+ *
2967
+ * Y = (6968 * R + 23434 * G + 2366 * B)/32768
2968
+ *
2969
+ * Starting with libpng-1.5.5, if the image being converted has a cHRM chunk
2970
+ * (including an sRGB chunk) then the chromaticities are used to calculate the
2971
+ * coefficients. See the chunk handling in pngrutil.c for more information.
2972
+ *
2973
+ * In all cases the calculation is to be done in a linear colorspace. If no
2974
+ * gamma information is available to correct the encoding of the original RGB
2975
+ * values this results in an implicit assumption that the original PNG RGB
2976
+ * values were linear.
2977
+ *
2978
+ * Other integer coefficents can be used via png_set_rgb_to_gray(). Because
2979
+ * the API takes just red and green coefficients the blue coefficient is
2980
+ * calculated to make the sum 32768. This will result in different rounding
2981
+ * to that used above.
2982
+ */
2983
+ static int
2984
+ png_do_rgb_to_gray(png_structrp png_ptr, png_row_infop row_info, png_bytep row)
2985
+
2986
+ {
2987
+ int rgb_error = 0;
2988
+
2989
+ png_debug(1, "in png_do_rgb_to_gray");
2990
+
2991
+ if ((row_info->color_type & PNG_COLOR_MASK_PALETTE) == 0 &&
2992
+ (row_info->color_type & PNG_COLOR_MASK_COLOR) != 0)
2993
+ {
2994
+ PNG_CONST png_uint_32 rc = png_ptr->rgb_to_gray_red_coeff;
2995
+ PNG_CONST png_uint_32 gc = png_ptr->rgb_to_gray_green_coeff;
2996
+ PNG_CONST png_uint_32 bc = 32768 - rc - gc;
2997
+ PNG_CONST png_uint_32 row_width = row_info->width;
2998
+ PNG_CONST int have_alpha =
2999
+ (row_info->color_type & PNG_COLOR_MASK_ALPHA) != 0;
3000
+
3001
+ if (row_info->bit_depth == 8)
3002
+ {
3003
+ #ifdef PNG_READ_GAMMA_SUPPORTED
3004
+ /* Notice that gamma to/from 1 are not necessarily inverses (if
3005
+ * there is an overall gamma correction). Prior to 1.5.5 this code
3006
+ * checked the linearized values for equality; this doesn't match
3007
+ * the documentation, the original values must be checked.
3008
+ */
3009
+ if (png_ptr->gamma_from_1 != NULL && png_ptr->gamma_to_1 != NULL)
3010
+ {
3011
+ png_bytep sp = row;
3012
+ png_bytep dp = row;
3013
+ png_uint_32 i;
3014
+
3015
+ for (i = 0; i < row_width; i++)
3016
+ {
3017
+ png_byte red = *(sp++);
3018
+ png_byte green = *(sp++);
3019
+ png_byte blue = *(sp++);
3020
+
3021
+ if (red != green || red != blue)
3022
+ {
3023
+ red = png_ptr->gamma_to_1[red];
3024
+ green = png_ptr->gamma_to_1[green];
3025
+ blue = png_ptr->gamma_to_1[blue];
3026
+
3027
+ rgb_error |= 1;
3028
+ *(dp++) = png_ptr->gamma_from_1[
3029
+ (rc*red + gc*green + bc*blue + 16384)>>15];
3030
+ }
3031
+
3032
+ else
3033
+ {
3034
+ /* If there is no overall correction the table will not be
3035
+ * set.
3036
+ */
3037
+ if (png_ptr->gamma_table != NULL)
3038
+ red = png_ptr->gamma_table[red];
3039
+
3040
+ *(dp++) = red;
3041
+ }
3042
+
3043
+ if (have_alpha != 0)
3044
+ *(dp++) = *(sp++);
3045
+ }
3046
+ }
3047
+ else
3048
+ #endif
3049
+ {
3050
+ png_bytep sp = row;
3051
+ png_bytep dp = row;
3052
+ png_uint_32 i;
3053
+
3054
+ for (i = 0; i < row_width; i++)
3055
+ {
3056
+ png_byte red = *(sp++);
3057
+ png_byte green = *(sp++);
3058
+ png_byte blue = *(sp++);
3059
+
3060
+ if (red != green || red != blue)
3061
+ {
3062
+ rgb_error |= 1;
3063
+ /* NOTE: this is the historical approach which simply
3064
+ * truncates the results.
3065
+ */
3066
+ *(dp++) = (png_byte)((rc*red + gc*green + bc*blue)>>15);
3067
+ }
3068
+
3069
+ else
3070
+ *(dp++) = red;
3071
+
3072
+ if (have_alpha != 0)
3073
+ *(dp++) = *(sp++);
3074
+ }
3075
+ }
3076
+ }
3077
+
3078
+ else /* RGB bit_depth == 16 */
3079
+ {
3080
+ #ifdef PNG_READ_GAMMA_SUPPORTED
3081
+ if (png_ptr->gamma_16_to_1 != NULL && png_ptr->gamma_16_from_1 != NULL)
3082
+ {
3083
+ png_bytep sp = row;
3084
+ png_bytep dp = row;
3085
+ png_uint_32 i;
3086
+
3087
+ for (i = 0; i < row_width; i++)
3088
+ {
3089
+ png_uint_16 red, green, blue, w;
3090
+
3091
+ red = (png_uint_16)(((*(sp)) << 8) | *(sp + 1)); sp += 2;
3092
+ green = (png_uint_16)(((*(sp)) << 8) | *(sp + 1)); sp += 2;
3093
+ blue = (png_uint_16)(((*(sp)) << 8) | *(sp + 1)); sp += 2;
3094
+
3095
+ if (red == green && red == blue)
3096
+ {
3097
+ if (png_ptr->gamma_16_table != NULL)
3098
+ w = png_ptr->gamma_16_table[(red & 0xff)
3099
+ >> png_ptr->gamma_shift][red >> 8];
3100
+
3101
+ else
3102
+ w = red;
3103
+ }
3104
+
3105
+ else
3106
+ {
3107
+ png_uint_16 red_1 = png_ptr->gamma_16_to_1[(red&0xff)
3108
+ >> png_ptr->gamma_shift][red>>8];
3109
+ png_uint_16 green_1 =
3110
+ png_ptr->gamma_16_to_1[(green&0xff) >>
3111
+ png_ptr->gamma_shift][green>>8];
3112
+ png_uint_16 blue_1 = png_ptr->gamma_16_to_1[(blue&0xff)
3113
+ >> png_ptr->gamma_shift][blue>>8];
3114
+ png_uint_16 gray16 = (png_uint_16)((rc*red_1 + gc*green_1
3115
+ + bc*blue_1 + 16384)>>15);
3116
+ w = png_ptr->gamma_16_from_1[(gray16&0xff) >>
3117
+ png_ptr->gamma_shift][gray16 >> 8];
3118
+ rgb_error |= 1;
3119
+ }
3120
+
3121
+ *(dp++) = (png_byte)((w>>8) & 0xff);
3122
+ *(dp++) = (png_byte)(w & 0xff);
3123
+
3124
+ if (have_alpha != 0)
3125
+ {
3126
+ *(dp++) = *(sp++);
3127
+ *(dp++) = *(sp++);
3128
+ }
3129
+ }
3130
+ }
3131
+ else
3132
+ #endif
3133
+ {
3134
+ png_bytep sp = row;
3135
+ png_bytep dp = row;
3136
+ png_uint_32 i;
3137
+
3138
+ for (i = 0; i < row_width; i++)
3139
+ {
3140
+ png_uint_16 red, green, blue, gray16;
3141
+
3142
+ red = (png_uint_16)(((*(sp)) << 8) | *(sp + 1)); sp += 2;
3143
+ green = (png_uint_16)(((*(sp)) << 8) | *(sp + 1)); sp += 2;
3144
+ blue = (png_uint_16)(((*(sp)) << 8) | *(sp + 1)); sp += 2;
3145
+
3146
+ if (red != green || red != blue)
3147
+ rgb_error |= 1;
3148
+
3149
+ /* From 1.5.5 in the 16 bit case do the accurate conversion even
3150
+ * in the 'fast' case - this is because this is where the code
3151
+ * ends up when handling linear 16 bit data.
3152
+ */
3153
+ gray16 = (png_uint_16)((rc*red + gc*green + bc*blue + 16384) >>
3154
+ 15);
3155
+ *(dp++) = (png_byte)((gray16 >> 8) & 0xff);
3156
+ *(dp++) = (png_byte)(gray16 & 0xff);
3157
+
3158
+ if (have_alpha != 0)
3159
+ {
3160
+ *(dp++) = *(sp++);
3161
+ *(dp++) = *(sp++);
3162
+ }
3163
+ }
3164
+ }
3165
+ }
3166
+
3167
+ row_info->channels = (png_byte)(row_info->channels - 2);
3168
+ row_info->color_type = (png_byte)(row_info->color_type &
3169
+ ~PNG_COLOR_MASK_COLOR);
3170
+ row_info->pixel_depth = (png_byte)(row_info->channels *
3171
+ row_info->bit_depth);
3172
+ row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);
3173
+ }
3174
+ return rgb_error;
3175
+ }
3176
+ #endif
3177
+
3178
+ #if defined(PNG_READ_BACKGROUND_SUPPORTED) ||\
3179
+ defined(PNG_READ_ALPHA_MODE_SUPPORTED)
3180
+ /* Replace any alpha or transparency with the supplied background color.
3181
+ * "background" is already in the screen gamma, while "background_1" is
3182
+ * at a gamma of 1.0. Paletted files have already been taken care of.
3183
+ */
3184
+ static void
3185
+ png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr)
3186
+ {
3187
+ #ifdef PNG_READ_GAMMA_SUPPORTED
3188
+ png_const_bytep gamma_table = png_ptr->gamma_table;
3189
+ png_const_bytep gamma_from_1 = png_ptr->gamma_from_1;
3190
+ png_const_bytep gamma_to_1 = png_ptr->gamma_to_1;
3191
+ png_const_uint_16pp gamma_16 = png_ptr->gamma_16_table;
3192
+ png_const_uint_16pp gamma_16_from_1 = png_ptr->gamma_16_from_1;
3193
+ png_const_uint_16pp gamma_16_to_1 = png_ptr->gamma_16_to_1;
3194
+ int gamma_shift = png_ptr->gamma_shift;
3195
+ int optimize = (png_ptr->flags & PNG_FLAG_OPTIMIZE_ALPHA) != 0;
3196
+ #endif
3197
+
3198
+ png_bytep sp;
3199
+ png_uint_32 i;
3200
+ png_uint_32 row_width = row_info->width;
3201
+ int shift;
3202
+
3203
+ png_debug(1, "in png_do_compose");
3204
+
3205
+ {
3206
+ switch (row_info->color_type)
3207
+ {
3208
+ case PNG_COLOR_TYPE_GRAY:
3209
+ {
3210
+ switch (row_info->bit_depth)
3211
+ {
3212
+ case 1:
3213
+ {
3214
+ sp = row;
3215
+ shift = 7;
3216
+ for (i = 0; i < row_width; i++)
3217
+ {
3218
+ if ((png_uint_16)((*sp >> shift) & 0x01)
3219
+ == png_ptr->trans_color.gray)
3220
+ {
3221
+ unsigned int tmp = *sp & (0x7f7f >> (7 - shift));
3222
+ tmp |= png_ptr->background.gray << shift;
3223
+ *sp = (png_byte)(tmp & 0xff);
3224
+ }
3225
+
3226
+ if (shift == 0)
3227
+ {
3228
+ shift = 7;
3229
+ sp++;
3230
+ }
3231
+
3232
+ else
3233
+ shift--;
3234
+ }
3235
+ break;
3236
+ }
3237
+
3238
+ case 2:
3239
+ {
3240
+ #ifdef PNG_READ_GAMMA_SUPPORTED
3241
+ if (gamma_table != NULL)
3242
+ {
3243
+ sp = row;
3244
+ shift = 6;
3245
+ for (i = 0; i < row_width; i++)
3246
+ {
3247
+ if ((png_uint_16)((*sp >> shift) & 0x03)
3248
+ == png_ptr->trans_color.gray)
3249
+ {
3250
+ unsigned int tmp = *sp & (0x3f3f >> (6 - shift));
3251
+ tmp |= png_ptr->background.gray << shift;
3252
+ *sp = (png_byte)(tmp & 0xff);
3253
+ }
3254
+
3255
+ else
3256
+ {
3257
+ unsigned int p = (*sp >> shift) & 0x03;
3258
+ unsigned int g = (gamma_table [p | (p << 2) |
3259
+ (p << 4) | (p << 6)] >> 6) & 0x03;
3260
+ unsigned int tmp = *sp & (0x3f3f >> (6 - shift));
3261
+ tmp |= g << shift;
3262
+ *sp = (png_byte)(tmp & 0xff);
3263
+ }
3264
+
3265
+ if (shift == 0)
3266
+ {
3267
+ shift = 6;
3268
+ sp++;
3269
+ }
3270
+
3271
+ else
3272
+ shift -= 2;
3273
+ }
3274
+ }
3275
+
3276
+ else
3277
+ #endif
3278
+ {
3279
+ sp = row;
3280
+ shift = 6;
3281
+ for (i = 0; i < row_width; i++)
3282
+ {
3283
+ if ((png_uint_16)((*sp >> shift) & 0x03)
3284
+ == png_ptr->trans_color.gray)
3285
+ {
3286
+ unsigned int tmp = *sp & (0x3f3f >> (6 - shift));
3287
+ tmp |= png_ptr->background.gray << shift;
3288
+ *sp = (png_byte)(tmp & 0xff);
3289
+ }
3290
+
3291
+ if (shift == 0)
3292
+ {
3293
+ shift = 6;
3294
+ sp++;
3295
+ }
3296
+
3297
+ else
3298
+ shift -= 2;
3299
+ }
3300
+ }
3301
+ break;
3302
+ }
3303
+
3304
+ case 4:
3305
+ {
3306
+ #ifdef PNG_READ_GAMMA_SUPPORTED
3307
+ if (gamma_table != NULL)
3308
+ {
3309
+ sp = row;
3310
+ shift = 4;
3311
+ for (i = 0; i < row_width; i++)
3312
+ {
3313
+ if ((png_uint_16)((*sp >> shift) & 0x0f)
3314
+ == png_ptr->trans_color.gray)
3315
+ {
3316
+ unsigned int tmp = *sp & (0xf0f >> (4 - shift));
3317
+ tmp |= png_ptr->background.gray << shift;
3318
+ *sp = (png_byte)(tmp & 0xff);
3319
+ }
3320
+
3321
+ else
3322
+ {
3323
+ unsigned int p = (*sp >> shift) & 0x0f;
3324
+ unsigned int g = (gamma_table[p | (p << 4)] >> 4) &
3325
+ 0x0f;
3326
+ unsigned int tmp = *sp & (0xf0f >> (4 - shift));
3327
+ tmp |= g << shift;
3328
+ *sp = (png_byte)(tmp & 0xff);
3329
+ }
3330
+
3331
+ if (shift == 0)
3332
+ {
3333
+ shift = 4;
3334
+ sp++;
3335
+ }
3336
+
3337
+ else
3338
+ shift -= 4;
3339
+ }
3340
+ }
3341
+
3342
+ else
3343
+ #endif
3344
+ {
3345
+ sp = row;
3346
+ shift = 4;
3347
+ for (i = 0; i < row_width; i++)
3348
+ {
3349
+ if ((png_uint_16)((*sp >> shift) & 0x0f)
3350
+ == png_ptr->trans_color.gray)
3351
+ {
3352
+ unsigned int tmp = *sp & (0xf0f >> (4 - shift));
3353
+ tmp |= png_ptr->background.gray << shift;
3354
+ *sp = (png_byte)(tmp & 0xff);
3355
+ }
3356
+
3357
+ if (shift == 0)
3358
+ {
3359
+ shift = 4;
3360
+ sp++;
3361
+ }
3362
+
3363
+ else
3364
+ shift -= 4;
3365
+ }
3366
+ }
3367
+ break;
3368
+ }
3369
+
3370
+ case 8:
3371
+ {
3372
+ #ifdef PNG_READ_GAMMA_SUPPORTED
3373
+ if (gamma_table != NULL)
3374
+ {
3375
+ sp = row;
3376
+ for (i = 0; i < row_width; i++, sp++)
3377
+ {
3378
+ if (*sp == png_ptr->trans_color.gray)
3379
+ *sp = (png_byte)png_ptr->background.gray;
3380
+
3381
+ else
3382
+ *sp = gamma_table[*sp];
3383
+ }
3384
+ }
3385
+ else
3386
+ #endif
3387
+ {
3388
+ sp = row;
3389
+ for (i = 0; i < row_width; i++, sp++)
3390
+ {
3391
+ if (*sp == png_ptr->trans_color.gray)
3392
+ *sp = (png_byte)png_ptr->background.gray;
3393
+ }
3394
+ }
3395
+ break;
3396
+ }
3397
+
3398
+ case 16:
3399
+ {
3400
+ #ifdef PNG_READ_GAMMA_SUPPORTED
3401
+ if (gamma_16 != NULL)
3402
+ {
3403
+ sp = row;
3404
+ for (i = 0; i < row_width; i++, sp += 2)
3405
+ {
3406
+ png_uint_16 v;
3407
+
3408
+ v = (png_uint_16)(((*sp) << 8) + *(sp + 1));
3409
+
3410
+ if (v == png_ptr->trans_color.gray)
3411
+ {
3412
+ /* Background is already in screen gamma */
3413
+ *sp = (png_byte)((png_ptr->background.gray >> 8)
3414
+ & 0xff);
3415
+ *(sp + 1) = (png_byte)(png_ptr->background.gray
3416
+ & 0xff);
3417
+ }
3418
+
3419
+ else
3420
+ {
3421
+ v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
3422
+ *sp = (png_byte)((v >> 8) & 0xff);
3423
+ *(sp + 1) = (png_byte)(v & 0xff);
3424
+ }
3425
+ }
3426
+ }
3427
+ else
3428
+ #endif
3429
+ {
3430
+ sp = row;
3431
+ for (i = 0; i < row_width; i++, sp += 2)
3432
+ {
3433
+ png_uint_16 v;
3434
+
3435
+ v = (png_uint_16)(((*sp) << 8) + *(sp + 1));
3436
+
3437
+ if (v == png_ptr->trans_color.gray)
3438
+ {
3439
+ *sp = (png_byte)((png_ptr->background.gray >> 8)
3440
+ & 0xff);
3441
+ *(sp + 1) = (png_byte)(png_ptr->background.gray
3442
+ & 0xff);
3443
+ }
3444
+ }
3445
+ }
3446
+ break;
3447
+ }
3448
+
3449
+ default:
3450
+ break;
3451
+ }
3452
+ break;
3453
+ }
3454
+
3455
+ case PNG_COLOR_TYPE_RGB:
3456
+ {
3457
+ if (row_info->bit_depth == 8)
3458
+ {
3459
+ #ifdef PNG_READ_GAMMA_SUPPORTED
3460
+ if (gamma_table != NULL)
3461
+ {
3462
+ sp = row;
3463
+ for (i = 0; i < row_width; i++, sp += 3)
3464
+ {
3465
+ if (*sp == png_ptr->trans_color.red &&
3466
+ *(sp + 1) == png_ptr->trans_color.green &&
3467
+ *(sp + 2) == png_ptr->trans_color.blue)
3468
+ {
3469
+ *sp = (png_byte)png_ptr->background.red;
3470
+ *(sp + 1) = (png_byte)png_ptr->background.green;
3471
+ *(sp + 2) = (png_byte)png_ptr->background.blue;
3472
+ }
3473
+
3474
+ else
3475
+ {
3476
+ *sp = gamma_table[*sp];
3477
+ *(sp + 1) = gamma_table[*(sp + 1)];
3478
+ *(sp + 2) = gamma_table[*(sp + 2)];
3479
+ }
3480
+ }
3481
+ }
3482
+ else
3483
+ #endif
3484
+ {
3485
+ sp = row;
3486
+ for (i = 0; i < row_width; i++, sp += 3)
3487
+ {
3488
+ if (*sp == png_ptr->trans_color.red &&
3489
+ *(sp + 1) == png_ptr->trans_color.green &&
3490
+ *(sp + 2) == png_ptr->trans_color.blue)
3491
+ {
3492
+ *sp = (png_byte)png_ptr->background.red;
3493
+ *(sp + 1) = (png_byte)png_ptr->background.green;
3494
+ *(sp + 2) = (png_byte)png_ptr->background.blue;
3495
+ }
3496
+ }
3497
+ }
3498
+ }
3499
+ else /* if (row_info->bit_depth == 16) */
3500
+ {
3501
+ #ifdef PNG_READ_GAMMA_SUPPORTED
3502
+ if (gamma_16 != NULL)
3503
+ {
3504
+ sp = row;
3505
+ for (i = 0; i < row_width; i++, sp += 6)
3506
+ {
3507
+ png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1));
3508
+
3509
+ png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8)
3510
+ + *(sp + 3));
3511
+
3512
+ png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8)
3513
+ + *(sp + 5));
3514
+
3515
+ if (r == png_ptr->trans_color.red &&
3516
+ g == png_ptr->trans_color.green &&
3517
+ b == png_ptr->trans_color.blue)
3518
+ {
3519
+ /* Background is already in screen gamma */
3520
+ *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
3521
+ *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
3522
+ *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)
3523
+ & 0xff);
3524
+ *(sp + 3) = (png_byte)(png_ptr->background.green
3525
+ & 0xff);
3526
+ *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)
3527
+ & 0xff);
3528
+ *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
3529
+ }
3530
+
3531
+ else
3532
+ {
3533
+ png_uint_16 v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
3534
+ *sp = (png_byte)((v >> 8) & 0xff);
3535
+ *(sp + 1) = (png_byte)(v & 0xff);
3536
+
3537
+ v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)];
3538
+ *(sp + 2) = (png_byte)((v >> 8) & 0xff);
3539
+ *(sp + 3) = (png_byte)(v & 0xff);
3540
+
3541
+ v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)];
3542
+ *(sp + 4) = (png_byte)((v >> 8) & 0xff);
3543
+ *(sp + 5) = (png_byte)(v & 0xff);
3544
+ }
3545
+ }
3546
+ }
3547
+
3548
+ else
3549
+ #endif
3550
+ {
3551
+ sp = row;
3552
+ for (i = 0; i < row_width; i++, sp += 6)
3553
+ {
3554
+ png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1));
3555
+
3556
+ png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8)
3557
+ + *(sp + 3));
3558
+
3559
+ png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8)
3560
+ + *(sp + 5));
3561
+
3562
+ if (r == png_ptr->trans_color.red &&
3563
+ g == png_ptr->trans_color.green &&
3564
+ b == png_ptr->trans_color.blue)
3565
+ {
3566
+ *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
3567
+ *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
3568
+ *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)
3569
+ & 0xff);
3570
+ *(sp + 3) = (png_byte)(png_ptr->background.green
3571
+ & 0xff);
3572
+ *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)
3573
+ & 0xff);
3574
+ *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
3575
+ }
3576
+ }
3577
+ }
3578
+ }
3579
+ break;
3580
+ }
3581
+
3582
+ case PNG_COLOR_TYPE_GRAY_ALPHA:
3583
+ {
3584
+ if (row_info->bit_depth == 8)
3585
+ {
3586
+ #ifdef PNG_READ_GAMMA_SUPPORTED
3587
+ if (gamma_to_1 != NULL && gamma_from_1 != NULL &&
3588
+ gamma_table != NULL)
3589
+ {
3590
+ sp = row;
3591
+ for (i = 0; i < row_width; i++, sp += 2)
3592
+ {
3593
+ png_uint_16 a = *(sp + 1);
3594
+
3595
+ if (a == 0xff)
3596
+ *sp = gamma_table[*sp];
3597
+
3598
+ else if (a == 0)
3599
+ {
3600
+ /* Background is already in screen gamma */
3601
+ *sp = (png_byte)png_ptr->background.gray;
3602
+ }
3603
+
3604
+ else
3605
+ {
3606
+ png_byte v, w;
3607
+
3608
+ v = gamma_to_1[*sp];
3609
+ png_composite(w, v, a, png_ptr->background_1.gray);
3610
+ if (optimize == 0)
3611
+ w = gamma_from_1[w];
3612
+ *sp = w;
3613
+ }
3614
+ }
3615
+ }
3616
+ else
3617
+ #endif
3618
+ {
3619
+ sp = row;
3620
+ for (i = 0; i < row_width; i++, sp += 2)
3621
+ {
3622
+ png_byte a = *(sp + 1);
3623
+
3624
+ if (a == 0)
3625
+ *sp = (png_byte)png_ptr->background.gray;
3626
+
3627
+ else if (a < 0xff)
3628
+ png_composite(*sp, *sp, a, png_ptr->background.gray);
3629
+ }
3630
+ }
3631
+ }
3632
+ else /* if (png_ptr->bit_depth == 16) */
3633
+ {
3634
+ #ifdef PNG_READ_GAMMA_SUPPORTED
3635
+ if (gamma_16 != NULL && gamma_16_from_1 != NULL &&
3636
+ gamma_16_to_1 != NULL)
3637
+ {
3638
+ sp = row;
3639
+ for (i = 0; i < row_width; i++, sp += 4)
3640
+ {
3641
+ png_uint_16 a = (png_uint_16)(((*(sp + 2)) << 8)
3642
+ + *(sp + 3));
3643
+
3644
+ if (a == (png_uint_16)0xffff)
3645
+ {
3646
+ png_uint_16 v;
3647
+
3648
+ v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
3649
+ *sp = (png_byte)((v >> 8) & 0xff);
3650
+ *(sp + 1) = (png_byte)(v & 0xff);
3651
+ }
3652
+
3653
+ else if (a == 0)
3654
+ {
3655
+ /* Background is already in screen gamma */
3656
+ *sp = (png_byte)((png_ptr->background.gray >> 8)
3657
+ & 0xff);
3658
+ *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff);
3659
+ }
3660
+
3661
+ else
3662
+ {
3663
+ png_uint_16 g, v, w;
3664
+
3665
+ g = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp];
3666
+ png_composite_16(v, g, a, png_ptr->background_1.gray);
3667
+ if (optimize != 0)
3668
+ w = v;
3669
+ else
3670
+ w = gamma_16_from_1[(v&0xff) >> gamma_shift][v >> 8];
3671
+ *sp = (png_byte)((w >> 8) & 0xff);
3672
+ *(sp + 1) = (png_byte)(w & 0xff);
3673
+ }
3674
+ }
3675
+ }
3676
+ else
3677
+ #endif
3678
+ {
3679
+ sp = row;
3680
+ for (i = 0; i < row_width; i++, sp += 4)
3681
+ {
3682
+ png_uint_16 a = (png_uint_16)(((*(sp + 2)) << 8)
3683
+ + *(sp + 3));
3684
+
3685
+ if (a == 0)
3686
+ {
3687
+ *sp = (png_byte)((png_ptr->background.gray >> 8)
3688
+ & 0xff);
3689
+ *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff);
3690
+ }
3691
+
3692
+ else if (a < 0xffff)
3693
+ {
3694
+ png_uint_16 g, v;
3695
+
3696
+ g = (png_uint_16)(((*sp) << 8) + *(sp + 1));
3697
+ png_composite_16(v, g, a, png_ptr->background.gray);
3698
+ *sp = (png_byte)((v >> 8) & 0xff);
3699
+ *(sp + 1) = (png_byte)(v & 0xff);
3700
+ }
3701
+ }
3702
+ }
3703
+ }
3704
+ break;
3705
+ }
3706
+
3707
+ case PNG_COLOR_TYPE_RGB_ALPHA:
3708
+ {
3709
+ if (row_info->bit_depth == 8)
3710
+ {
3711
+ #ifdef PNG_READ_GAMMA_SUPPORTED
3712
+ if (gamma_to_1 != NULL && gamma_from_1 != NULL &&
3713
+ gamma_table != NULL)
3714
+ {
3715
+ sp = row;
3716
+ for (i = 0; i < row_width; i++, sp += 4)
3717
+ {
3718
+ png_byte a = *(sp + 3);
3719
+
3720
+ if (a == 0xff)
3721
+ {
3722
+ *sp = gamma_table[*sp];
3723
+ *(sp + 1) = gamma_table[*(sp + 1)];
3724
+ *(sp + 2) = gamma_table[*(sp + 2)];
3725
+ }
3726
+
3727
+ else if (a == 0)
3728
+ {
3729
+ /* Background is already in screen gamma */
3730
+ *sp = (png_byte)png_ptr->background.red;
3731
+ *(sp + 1) = (png_byte)png_ptr->background.green;
3732
+ *(sp + 2) = (png_byte)png_ptr->background.blue;
3733
+ }
3734
+
3735
+ else
3736
+ {
3737
+ png_byte v, w;
3738
+
3739
+ v = gamma_to_1[*sp];
3740
+ png_composite(w, v, a, png_ptr->background_1.red);
3741
+ if (optimize == 0) w = gamma_from_1[w];
3742
+ *sp = w;
3743
+
3744
+ v = gamma_to_1[*(sp + 1)];
3745
+ png_composite(w, v, a, png_ptr->background_1.green);
3746
+ if (optimize == 0) w = gamma_from_1[w];
3747
+ *(sp + 1) = w;
3748
+
3749
+ v = gamma_to_1[*(sp + 2)];
3750
+ png_composite(w, v, a, png_ptr->background_1.blue);
3751
+ if (optimize == 0) w = gamma_from_1[w];
3752
+ *(sp + 2) = w;
3753
+ }
3754
+ }
3755
+ }
3756
+ else
3757
+ #endif
3758
+ {
3759
+ sp = row;
3760
+ for (i = 0; i < row_width; i++, sp += 4)
3761
+ {
3762
+ png_byte a = *(sp + 3);
3763
+
3764
+ if (a == 0)
3765
+ {
3766
+ *sp = (png_byte)png_ptr->background.red;
3767
+ *(sp + 1) = (png_byte)png_ptr->background.green;
3768
+ *(sp + 2) = (png_byte)png_ptr->background.blue;
3769
+ }
3770
+
3771
+ else if (a < 0xff)
3772
+ {
3773
+ png_composite(*sp, *sp, a, png_ptr->background.red);
3774
+
3775
+ png_composite(*(sp + 1), *(sp + 1), a,
3776
+ png_ptr->background.green);
3777
+
3778
+ png_composite(*(sp + 2), *(sp + 2), a,
3779
+ png_ptr->background.blue);
3780
+ }
3781
+ }
3782
+ }
3783
+ }
3784
+ else /* if (row_info->bit_depth == 16) */
3785
+ {
3786
+ #ifdef PNG_READ_GAMMA_SUPPORTED
3787
+ if (gamma_16 != NULL && gamma_16_from_1 != NULL &&
3788
+ gamma_16_to_1 != NULL)
3789
+ {
3790
+ sp = row;
3791
+ for (i = 0; i < row_width; i++, sp += 8)
3792
+ {
3793
+ png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6))
3794
+ << 8) + (png_uint_16)(*(sp + 7)));
3795
+
3796
+ if (a == (png_uint_16)0xffff)
3797
+ {
3798
+ png_uint_16 v;
3799
+
3800
+ v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
3801
+ *sp = (png_byte)((v >> 8) & 0xff);
3802
+ *(sp + 1) = (png_byte)(v & 0xff);
3803
+
3804
+ v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)];
3805
+ *(sp + 2) = (png_byte)((v >> 8) & 0xff);
3806
+ *(sp + 3) = (png_byte)(v & 0xff);
3807
+
3808
+ v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)];
3809
+ *(sp + 4) = (png_byte)((v >> 8) & 0xff);
3810
+ *(sp + 5) = (png_byte)(v & 0xff);
3811
+ }
3812
+
3813
+ else if (a == 0)
3814
+ {
3815
+ /* Background is already in screen gamma */
3816
+ *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
3817
+ *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
3818
+ *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)
3819
+ & 0xff);
3820
+ *(sp + 3) = (png_byte)(png_ptr->background.green
3821
+ & 0xff);
3822
+ *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)
3823
+ & 0xff);
3824
+ *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
3825
+ }
3826
+
3827
+ else
3828
+ {
3829
+ png_uint_16 v, w;
3830
+
3831
+ v = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp];
3832
+ png_composite_16(w, v, a, png_ptr->background_1.red);
3833
+ if (optimize == 0)
3834
+ w = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >>
3835
+ 8];
3836
+ *sp = (png_byte)((w >> 8) & 0xff);
3837
+ *(sp + 1) = (png_byte)(w & 0xff);
3838
+
3839
+ v = gamma_16_to_1[*(sp + 3) >> gamma_shift][*(sp + 2)];
3840
+ png_composite_16(w, v, a, png_ptr->background_1.green);
3841
+ if (optimize == 0)
3842
+ w = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >>
3843
+ 8];
3844
+
3845
+ *(sp + 2) = (png_byte)((w >> 8) & 0xff);
3846
+ *(sp + 3) = (png_byte)(w & 0xff);
3847
+
3848
+ v = gamma_16_to_1[*(sp + 5) >> gamma_shift][*(sp + 4)];
3849
+ png_composite_16(w, v, a, png_ptr->background_1.blue);
3850
+ if (optimize == 0)
3851
+ w = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >>
3852
+ 8];
3853
+
3854
+ *(sp + 4) = (png_byte)((w >> 8) & 0xff);
3855
+ *(sp + 5) = (png_byte)(w & 0xff);
3856
+ }
3857
+ }
3858
+ }
3859
+
3860
+ else
3861
+ #endif
3862
+ {
3863
+ sp = row;
3864
+ for (i = 0; i < row_width; i++, sp += 8)
3865
+ {
3866
+ png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6))
3867
+ << 8) + (png_uint_16)(*(sp + 7)));
3868
+
3869
+ if (a == 0)
3870
+ {
3871
+ *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
3872
+ *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
3873
+ *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)
3874
+ & 0xff);
3875
+ *(sp + 3) = (png_byte)(png_ptr->background.green
3876
+ & 0xff);
3877
+ *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)
3878
+ & 0xff);
3879
+ *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
3880
+ }
3881
+
3882
+ else if (a < 0xffff)
3883
+ {
3884
+ png_uint_16 v;
3885
+
3886
+ png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1));
3887
+ png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8)
3888
+ + *(sp + 3));
3889
+ png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8)
3890
+ + *(sp + 5));
3891
+
3892
+ png_composite_16(v, r, a, png_ptr->background.red);
3893
+ *sp = (png_byte)((v >> 8) & 0xff);
3894
+ *(sp + 1) = (png_byte)(v & 0xff);
3895
+
3896
+ png_composite_16(v, g, a, png_ptr->background.green);
3897
+ *(sp + 2) = (png_byte)((v >> 8) & 0xff);
3898
+ *(sp + 3) = (png_byte)(v & 0xff);
3899
+
3900
+ png_composite_16(v, b, a, png_ptr->background.blue);
3901
+ *(sp + 4) = (png_byte)((v >> 8) & 0xff);
3902
+ *(sp + 5) = (png_byte)(v & 0xff);
3903
+ }
3904
+ }
3905
+ }
3906
+ }
3907
+ break;
3908
+ }
3909
+
3910
+ default:
3911
+ break;
3912
+ }
3913
+ }
3914
+ }
3915
+ #endif /* READ_BACKGROUND || READ_ALPHA_MODE */
3916
+
3917
+ #ifdef PNG_READ_GAMMA_SUPPORTED
3918
+ /* Gamma correct the image, avoiding the alpha channel. Make sure
3919
+ * you do this after you deal with the transparency issue on grayscale
3920
+ * or RGB images. If your bit depth is 8, use gamma_table, if it
3921
+ * is 16, use gamma_16_table and gamma_shift. Build these with
3922
+ * build_gamma_table().
3923
+ */
3924
+ static void
3925
+ png_do_gamma(png_row_infop row_info, png_bytep row, png_structrp png_ptr)
3926
+ {
3927
+ png_const_bytep gamma_table = png_ptr->gamma_table;
3928
+ png_const_uint_16pp gamma_16_table = png_ptr->gamma_16_table;
3929
+ int gamma_shift = png_ptr->gamma_shift;
3930
+
3931
+ png_bytep sp;
3932
+ png_uint_32 i;
3933
+ png_uint_32 row_width=row_info->width;
3934
+
3935
+ png_debug(1, "in png_do_gamma");
3936
+
3937
+ if (((row_info->bit_depth <= 8 && gamma_table != NULL) ||
3938
+ (row_info->bit_depth == 16 && gamma_16_table != NULL)))
3939
+ {
3940
+ switch (row_info->color_type)
3941
+ {
3942
+ case PNG_COLOR_TYPE_RGB:
3943
+ {
3944
+ if (row_info->bit_depth == 8)
3945
+ {
3946
+ sp = row;
3947
+ for (i = 0; i < row_width; i++)
3948
+ {
3949
+ *sp = gamma_table[*sp];
3950
+ sp++;
3951
+ *sp = gamma_table[*sp];
3952
+ sp++;
3953
+ *sp = gamma_table[*sp];
3954
+ sp++;
3955
+ }
3956
+ }
3957
+
3958
+ else /* if (row_info->bit_depth == 16) */
3959
+ {
3960
+ sp = row;
3961
+ for (i = 0; i < row_width; i++)
3962
+ {
3963
+ png_uint_16 v;
3964
+
3965
+ v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp];
3966
+ *sp = (png_byte)((v >> 8) & 0xff);
3967
+ *(sp + 1) = (png_byte)(v & 0xff);
3968
+ sp += 2;
3969
+
3970
+ v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp];
3971
+ *sp = (png_byte)((v >> 8) & 0xff);
3972
+ *(sp + 1) = (png_byte)(v & 0xff);
3973
+ sp += 2;
3974
+
3975
+ v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp];
3976
+ *sp = (png_byte)((v >> 8) & 0xff);
3977
+ *(sp + 1) = (png_byte)(v & 0xff);
3978
+ sp += 2;
3979
+ }
3980
+ }
3981
+ break;
3982
+ }
3983
+
3984
+ case PNG_COLOR_TYPE_RGB_ALPHA:
3985
+ {
3986
+ if (row_info->bit_depth == 8)
3987
+ {
3988
+ sp = row;
3989
+ for (i = 0; i < row_width; i++)
3990
+ {
3991
+ *sp = gamma_table[*sp];
3992
+ sp++;
3993
+
3994
+ *sp = gamma_table[*sp];
3995
+ sp++;
3996
+
3997
+ *sp = gamma_table[*sp];
3998
+ sp++;
3999
+
4000
+ sp++;
4001
+ }
4002
+ }
4003
+
4004
+ else /* if (row_info->bit_depth == 16) */
4005
+ {
4006
+ sp = row;
4007
+ for (i = 0; i < row_width; i++)
4008
+ {
4009
+ png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp];
4010
+ *sp = (png_byte)((v >> 8) & 0xff);
4011
+ *(sp + 1) = (png_byte)(v & 0xff);
4012
+ sp += 2;
4013
+
4014
+ v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp];
4015
+ *sp = (png_byte)((v >> 8) & 0xff);
4016
+ *(sp + 1) = (png_byte)(v & 0xff);
4017
+ sp += 2;
4018
+
4019
+ v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp];
4020
+ *sp = (png_byte)((v >> 8) & 0xff);
4021
+ *(sp + 1) = (png_byte)(v & 0xff);
4022
+ sp += 4;
4023
+ }
4024
+ }
4025
+ break;
4026
+ }
4027
+
4028
+ case PNG_COLOR_TYPE_GRAY_ALPHA:
4029
+ {
4030
+ if (row_info->bit_depth == 8)
4031
+ {
4032
+ sp = row;
4033
+ for (i = 0; i < row_width; i++)
4034
+ {
4035
+ *sp = gamma_table[*sp];
4036
+ sp += 2;
4037
+ }
4038
+ }
4039
+
4040
+ else /* if (row_info->bit_depth == 16) */
4041
+ {
4042
+ sp = row;
4043
+ for (i = 0; i < row_width; i++)
4044
+ {
4045
+ png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp];
4046
+ *sp = (png_byte)((v >> 8) & 0xff);
4047
+ *(sp + 1) = (png_byte)(v & 0xff);
4048
+ sp += 4;
4049
+ }
4050
+ }
4051
+ break;
4052
+ }
4053
+
4054
+ case PNG_COLOR_TYPE_GRAY:
4055
+ {
4056
+ if (row_info->bit_depth == 2)
4057
+ {
4058
+ sp = row;
4059
+ for (i = 0; i < row_width; i += 4)
4060
+ {
4061
+ int a = *sp & 0xc0;
4062
+ int b = *sp & 0x30;
4063
+ int c = *sp & 0x0c;
4064
+ int d = *sp & 0x03;
4065
+
4066
+ *sp = (png_byte)(
4067
+ ((((int)gamma_table[a|(a>>2)|(a>>4)|(a>>6)]) ) & 0xc0)|
4068
+ ((((int)gamma_table[(b<<2)|b|(b>>2)|(b>>4)])>>2) & 0x30)|
4069
+ ((((int)gamma_table[(c<<4)|(c<<2)|c|(c>>2)])>>4) & 0x0c)|
4070
+ ((((int)gamma_table[(d<<6)|(d<<4)|(d<<2)|d])>>6) ));
4071
+ sp++;
4072
+ }
4073
+ }
4074
+
4075
+ if (row_info->bit_depth == 4)
4076
+ {
4077
+ sp = row;
4078
+ for (i = 0; i < row_width; i += 2)
4079
+ {
4080
+ int msb = *sp & 0xf0;
4081
+ int lsb = *sp & 0x0f;
4082
+
4083
+ *sp = (png_byte)((((int)gamma_table[msb | (msb >> 4)]) & 0xf0)
4084
+ | (((int)gamma_table[(lsb << 4) | lsb]) >> 4));
4085
+ sp++;
4086
+ }
4087
+ }
4088
+
4089
+ else if (row_info->bit_depth == 8)
4090
+ {
4091
+ sp = row;
4092
+ for (i = 0; i < row_width; i++)
4093
+ {
4094
+ *sp = gamma_table[*sp];
4095
+ sp++;
4096
+ }
4097
+ }
4098
+
4099
+ else if (row_info->bit_depth == 16)
4100
+ {
4101
+ sp = row;
4102
+ for (i = 0; i < row_width; i++)
4103
+ {
4104
+ png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp];
4105
+ *sp = (png_byte)((v >> 8) & 0xff);
4106
+ *(sp + 1) = (png_byte)(v & 0xff);
4107
+ sp += 2;
4108
+ }
4109
+ }
4110
+ break;
4111
+ }
4112
+
4113
+ default:
4114
+ break;
4115
+ }
4116
+ }
4117
+ }
4118
+ #endif
4119
+
4120
+ #ifdef PNG_READ_ALPHA_MODE_SUPPORTED
4121
+ /* Encode the alpha channel to the output gamma (the input channel is always
4122
+ * linear.) Called only with color types that have an alpha channel. Needs the
4123
+ * from_1 tables.
4124
+ */
4125
+ static void
4126
+ png_do_encode_alpha(png_row_infop row_info, png_bytep row, png_structrp png_ptr)
4127
+ {
4128
+ png_uint_32 row_width = row_info->width;
4129
+
4130
+ png_debug(1, "in png_do_encode_alpha");
4131
+
4132
+ if ((row_info->color_type & PNG_COLOR_MASK_ALPHA) != 0)
4133
+ {
4134
+ if (row_info->bit_depth == 8)
4135
+ {
4136
+ PNG_CONST png_bytep table = png_ptr->gamma_from_1;
4137
+
4138
+ if (table != NULL)
4139
+ {
4140
+ PNG_CONST int step =
4141
+ (row_info->color_type & PNG_COLOR_MASK_COLOR) ? 4 : 2;
4142
+
4143
+ /* The alpha channel is the last component: */
4144
+ row += step - 1;
4145
+
4146
+ for (; row_width > 0; --row_width, row += step)
4147
+ *row = table[*row];
4148
+
4149
+ return;
4150
+ }
4151
+ }
4152
+
4153
+ else if (row_info->bit_depth == 16)
4154
+ {
4155
+ PNG_CONST png_uint_16pp table = png_ptr->gamma_16_from_1;
4156
+ PNG_CONST int gamma_shift = png_ptr->gamma_shift;
4157
+
4158
+ if (table != NULL)
4159
+ {
4160
+ PNG_CONST int step =
4161
+ (row_info->color_type & PNG_COLOR_MASK_COLOR) ? 8 : 4;
4162
+
4163
+ /* The alpha channel is the last component: */
4164
+ row += step - 2;
4165
+
4166
+ for (; row_width > 0; --row_width, row += step)
4167
+ {
4168
+ png_uint_16 v;
4169
+
4170
+ v = table[*(row + 1) >> gamma_shift][*row];
4171
+ *row = (png_byte)((v >> 8) & 0xff);
4172
+ *(row + 1) = (png_byte)(v & 0xff);
4173
+ }
4174
+
4175
+ return;
4176
+ }
4177
+ }
4178
+ }
4179
+
4180
+ /* Only get to here if called with a weird row_info; no harm has been done,
4181
+ * so just issue a warning.
4182
+ */
4183
+ png_warning(png_ptr, "png_do_encode_alpha: unexpected call");
4184
+ }
4185
+ #endif
4186
+
4187
+ #ifdef PNG_READ_EXPAND_SUPPORTED
4188
+ /* Expands a palette row to an RGB or RGBA row depending
4189
+ * upon whether you supply trans and num_trans.
4190
+ */
4191
+ static void
4192
+ png_do_expand_palette(png_row_infop row_info, png_bytep row,
4193
+ png_const_colorp palette, png_const_bytep trans_alpha, int num_trans)
4194
+ {
4195
+ int shift, value;
4196
+ png_bytep sp, dp;
4197
+ png_uint_32 i;
4198
+ png_uint_32 row_width=row_info->width;
4199
+
4200
+ png_debug(1, "in png_do_expand_palette");
4201
+
4202
+ if (row_info->color_type == PNG_COLOR_TYPE_PALETTE)
4203
+ {
4204
+ if (row_info->bit_depth < 8)
4205
+ {
4206
+ switch (row_info->bit_depth)
4207
+ {
4208
+ case 1:
4209
+ {
4210
+ sp = row + (png_size_t)((row_width - 1) >> 3);
4211
+ dp = row + (png_size_t)row_width - 1;
4212
+ shift = 7 - (int)((row_width + 7) & 0x07);
4213
+ for (i = 0; i < row_width; i++)
4214
+ {
4215
+ if ((*sp >> shift) & 0x01)
4216
+ *dp = 1;
4217
+
4218
+ else
4219
+ *dp = 0;
4220
+
4221
+ if (shift == 7)
4222
+ {
4223
+ shift = 0;
4224
+ sp--;
4225
+ }
4226
+
4227
+ else
4228
+ shift++;
4229
+
4230
+ dp--;
4231
+ }
4232
+ break;
4233
+ }
4234
+
4235
+ case 2:
4236
+ {
4237
+ sp = row + (png_size_t)((row_width - 1) >> 2);
4238
+ dp = row + (png_size_t)row_width - 1;
4239
+ shift = (int)((3 - ((row_width + 3) & 0x03)) << 1);
4240
+ for (i = 0; i < row_width; i++)
4241
+ {
4242
+ value = (*sp >> shift) & 0x03;
4243
+ *dp = (png_byte)value;
4244
+ if (shift == 6)
4245
+ {
4246
+ shift = 0;
4247
+ sp--;
4248
+ }
4249
+
4250
+ else
4251
+ shift += 2;
4252
+
4253
+ dp--;
4254
+ }
4255
+ break;
4256
+ }
4257
+
4258
+ case 4:
4259
+ {
4260
+ sp = row + (png_size_t)((row_width - 1) >> 1);
4261
+ dp = row + (png_size_t)row_width - 1;
4262
+ shift = (int)((row_width & 0x01) << 2);
4263
+ for (i = 0; i < row_width; i++)
4264
+ {
4265
+ value = (*sp >> shift) & 0x0f;
4266
+ *dp = (png_byte)value;
4267
+ if (shift == 4)
4268
+ {
4269
+ shift = 0;
4270
+ sp--;
4271
+ }
4272
+
4273
+ else
4274
+ shift += 4;
4275
+
4276
+ dp--;
4277
+ }
4278
+ break;
4279
+ }
4280
+
4281
+ default:
4282
+ break;
4283
+ }
4284
+ row_info->bit_depth = 8;
4285
+ row_info->pixel_depth = 8;
4286
+ row_info->rowbytes = row_width;
4287
+ }
4288
+
4289
+ if (row_info->bit_depth == 8)
4290
+ {
4291
+ {
4292
+ if (num_trans > 0)
4293
+ {
4294
+ sp = row + (png_size_t)row_width - 1;
4295
+ dp = row + (png_size_t)(row_width << 2) - 1;
4296
+
4297
+ for (i = 0; i < row_width; i++)
4298
+ {
4299
+ if ((int)(*sp) >= num_trans)
4300
+ *dp-- = 0xff;
4301
+
4302
+ else
4303
+ *dp-- = trans_alpha[*sp];
4304
+
4305
+ *dp-- = palette[*sp].blue;
4306
+ *dp-- = palette[*sp].green;
4307
+ *dp-- = palette[*sp].red;
4308
+ sp--;
4309
+ }
4310
+ row_info->bit_depth = 8;
4311
+ row_info->pixel_depth = 32;
4312
+ row_info->rowbytes = row_width * 4;
4313
+ row_info->color_type = 6;
4314
+ row_info->channels = 4;
4315
+ }
4316
+
4317
+ else
4318
+ {
4319
+ sp = row + (png_size_t)row_width - 1;
4320
+ dp = row + (png_size_t)(row_width * 3) - 1;
4321
+
4322
+ for (i = 0; i < row_width; i++)
4323
+ {
4324
+ *dp-- = palette[*sp].blue;
4325
+ *dp-- = palette[*sp].green;
4326
+ *dp-- = palette[*sp].red;
4327
+ sp--;
4328
+ }
4329
+
4330
+ row_info->bit_depth = 8;
4331
+ row_info->pixel_depth = 24;
4332
+ row_info->rowbytes = row_width * 3;
4333
+ row_info->color_type = 2;
4334
+ row_info->channels = 3;
4335
+ }
4336
+ }
4337
+ }
4338
+ }
4339
+ }
4340
+
4341
+ /* If the bit depth < 8, it is expanded to 8. Also, if the already
4342
+ * expanded transparency value is supplied, an alpha channel is built.
4343
+ */
4344
+ static void
4345
+ png_do_expand(png_row_infop row_info, png_bytep row,
4346
+ png_const_color_16p trans_color)
4347
+ {
4348
+ int shift, value;
4349
+ png_bytep sp, dp;
4350
+ png_uint_32 i;
4351
+ png_uint_32 row_width=row_info->width;
4352
+
4353
+ png_debug(1, "in png_do_expand");
4354
+
4355
+ {
4356
+ if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
4357
+ {
4358
+ unsigned int gray = trans_color != NULL ? trans_color->gray : 0;
4359
+
4360
+ if (row_info->bit_depth < 8)
4361
+ {
4362
+ switch (row_info->bit_depth)
4363
+ {
4364
+ case 1:
4365
+ {
4366
+ gray = (gray & 0x01) * 0xff;
4367
+ sp = row + (png_size_t)((row_width - 1) >> 3);
4368
+ dp = row + (png_size_t)row_width - 1;
4369
+ shift = 7 - (int)((row_width + 7) & 0x07);
4370
+ for (i = 0; i < row_width; i++)
4371
+ {
4372
+ if ((*sp >> shift) & 0x01)
4373
+ *dp = 0xff;
4374
+
4375
+ else
4376
+ *dp = 0;
4377
+
4378
+ if (shift == 7)
4379
+ {
4380
+ shift = 0;
4381
+ sp--;
4382
+ }
4383
+
4384
+ else
4385
+ shift++;
4386
+
4387
+ dp--;
4388
+ }
4389
+ break;
4390
+ }
4391
+
4392
+ case 2:
4393
+ {
4394
+ gray = (gray & 0x03) * 0x55;
4395
+ sp = row + (png_size_t)((row_width - 1) >> 2);
4396
+ dp = row + (png_size_t)row_width - 1;
4397
+ shift = (int)((3 - ((row_width + 3) & 0x03)) << 1);
4398
+ for (i = 0; i < row_width; i++)
4399
+ {
4400
+ value = (*sp >> shift) & 0x03;
4401
+ *dp = (png_byte)(value | (value << 2) | (value << 4) |
4402
+ (value << 6));
4403
+ if (shift == 6)
4404
+ {
4405
+ shift = 0;
4406
+ sp--;
4407
+ }
4408
+
4409
+ else
4410
+ shift += 2;
4411
+
4412
+ dp--;
4413
+ }
4414
+ break;
4415
+ }
4416
+
4417
+ case 4:
4418
+ {
4419
+ gray = (gray & 0x0f) * 0x11;
4420
+ sp = row + (png_size_t)((row_width - 1) >> 1);
4421
+ dp = row + (png_size_t)row_width - 1;
4422
+ shift = (int)((1 - ((row_width + 1) & 0x01)) << 2);
4423
+ for (i = 0; i < row_width; i++)
4424
+ {
4425
+ value = (*sp >> shift) & 0x0f;
4426
+ *dp = (png_byte)(value | (value << 4));
4427
+ if (shift == 4)
4428
+ {
4429
+ shift = 0;
4430
+ sp--;
4431
+ }
4432
+
4433
+ else
4434
+ shift = 4;
4435
+
4436
+ dp--;
4437
+ }
4438
+ break;
4439
+ }
4440
+
4441
+ default:
4442
+ break;
4443
+ }
4444
+
4445
+ row_info->bit_depth = 8;
4446
+ row_info->pixel_depth = 8;
4447
+ row_info->rowbytes = row_width;
4448
+ }
4449
+
4450
+ if (trans_color != NULL)
4451
+ {
4452
+ if (row_info->bit_depth == 8)
4453
+ {
4454
+ gray = gray & 0xff;
4455
+ sp = row + (png_size_t)row_width - 1;
4456
+ dp = row + (png_size_t)(row_width << 1) - 1;
4457
+
4458
+ for (i = 0; i < row_width; i++)
4459
+ {
4460
+ if (*sp == gray)
4461
+ *dp-- = 0;
4462
+
4463
+ else
4464
+ *dp-- = 0xff;
4465
+
4466
+ *dp-- = *sp--;
4467
+ }
4468
+ }
4469
+
4470
+ else if (row_info->bit_depth == 16)
4471
+ {
4472
+ unsigned int gray_high = (gray >> 8) & 0xff;
4473
+ unsigned int gray_low = gray & 0xff;
4474
+ sp = row + row_info->rowbytes - 1;
4475
+ dp = row + (row_info->rowbytes << 1) - 1;
4476
+ for (i = 0; i < row_width; i++)
4477
+ {
4478
+ if (*(sp - 1) == gray_high && *(sp) == gray_low)
4479
+ {
4480
+ *dp-- = 0;
4481
+ *dp-- = 0;
4482
+ }
4483
+
4484
+ else
4485
+ {
4486
+ *dp-- = 0xff;
4487
+ *dp-- = 0xff;
4488
+ }
4489
+
4490
+ *dp-- = *sp--;
4491
+ *dp-- = *sp--;
4492
+ }
4493
+ }
4494
+
4495
+ row_info->color_type = PNG_COLOR_TYPE_GRAY_ALPHA;
4496
+ row_info->channels = 2;
4497
+ row_info->pixel_depth = (png_byte)(row_info->bit_depth << 1);
4498
+ row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,
4499
+ row_width);
4500
+ }
4501
+ }
4502
+ else if (row_info->color_type == PNG_COLOR_TYPE_RGB &&
4503
+ trans_color != NULL)
4504
+ {
4505
+ if (row_info->bit_depth == 8)
4506
+ {
4507
+ png_byte red = (png_byte)(trans_color->red & 0xff);
4508
+ png_byte green = (png_byte)(trans_color->green & 0xff);
4509
+ png_byte blue = (png_byte)(trans_color->blue & 0xff);
4510
+ sp = row + (png_size_t)row_info->rowbytes - 1;
4511
+ dp = row + (png_size_t)(row_width << 2) - 1;
4512
+ for (i = 0; i < row_width; i++)
4513
+ {
4514
+ if (*(sp - 2) == red && *(sp - 1) == green && *(sp) == blue)
4515
+ *dp-- = 0;
4516
+
4517
+ else
4518
+ *dp-- = 0xff;
4519
+
4520
+ *dp-- = *sp--;
4521
+ *dp-- = *sp--;
4522
+ *dp-- = *sp--;
4523
+ }
4524
+ }
4525
+ else if (row_info->bit_depth == 16)
4526
+ {
4527
+ png_byte red_high = (png_byte)((trans_color->red >> 8) & 0xff);
4528
+ png_byte green_high = (png_byte)((trans_color->green >> 8) & 0xff);
4529
+ png_byte blue_high = (png_byte)((trans_color->blue >> 8) & 0xff);
4530
+ png_byte red_low = (png_byte)(trans_color->red & 0xff);
4531
+ png_byte green_low = (png_byte)(trans_color->green & 0xff);
4532
+ png_byte blue_low = (png_byte)(trans_color->blue & 0xff);
4533
+ sp = row + row_info->rowbytes - 1;
4534
+ dp = row + (png_size_t)(row_width << 3) - 1;
4535
+ for (i = 0; i < row_width; i++)
4536
+ {
4537
+ if (*(sp - 5) == red_high &&
4538
+ *(sp - 4) == red_low &&
4539
+ *(sp - 3) == green_high &&
4540
+ *(sp - 2) == green_low &&
4541
+ *(sp - 1) == blue_high &&
4542
+ *(sp ) == blue_low)
4543
+ {
4544
+ *dp-- = 0;
4545
+ *dp-- = 0;
4546
+ }
4547
+
4548
+ else
4549
+ {
4550
+ *dp-- = 0xff;
4551
+ *dp-- = 0xff;
4552
+ }
4553
+
4554
+ *dp-- = *sp--;
4555
+ *dp-- = *sp--;
4556
+ *dp-- = *sp--;
4557
+ *dp-- = *sp--;
4558
+ *dp-- = *sp--;
4559
+ *dp-- = *sp--;
4560
+ }
4561
+ }
4562
+ row_info->color_type = PNG_COLOR_TYPE_RGB_ALPHA;
4563
+ row_info->channels = 4;
4564
+ row_info->pixel_depth = (png_byte)(row_info->bit_depth << 2);
4565
+ row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);
4566
+ }
4567
+ }
4568
+ }
4569
+ #endif
4570
+
4571
+ #ifdef PNG_READ_EXPAND_16_SUPPORTED
4572
+ /* If the bit depth is 8 and the color type is not a palette type expand the
4573
+ * whole row to 16 bits. Has no effect otherwise.
4574
+ */
4575
+ static void
4576
+ png_do_expand_16(png_row_infop row_info, png_bytep row)
4577
+ {
4578
+ if (row_info->bit_depth == 8 &&
4579
+ row_info->color_type != PNG_COLOR_TYPE_PALETTE)
4580
+ {
4581
+ /* The row have a sequence of bytes containing [0..255] and we need
4582
+ * to turn it into another row containing [0..65535], to do this we
4583
+ * calculate:
4584
+ *
4585
+ * (input / 255) * 65535
4586
+ *
4587
+ * Which happens to be exactly input * 257 and this can be achieved
4588
+ * simply by byte replication in place (copying backwards).
4589
+ */
4590
+ png_byte *sp = row + row_info->rowbytes; /* source, last byte + 1 */
4591
+ png_byte *dp = sp + row_info->rowbytes; /* destination, end + 1 */
4592
+ while (dp > sp)
4593
+ dp[-2] = dp[-1] = *--sp, dp -= 2;
4594
+
4595
+ row_info->rowbytes *= 2;
4596
+ row_info->bit_depth = 16;
4597
+ row_info->pixel_depth = (png_byte)(row_info->channels * 16);
4598
+ }
4599
+ }
4600
+ #endif
4601
+
4602
+ #ifdef PNG_READ_QUANTIZE_SUPPORTED
4603
+ static void
4604
+ png_do_quantize(png_row_infop row_info, png_bytep row,
4605
+ png_const_bytep palette_lookup, png_const_bytep quantize_lookup)
4606
+ {
4607
+ png_bytep sp, dp;
4608
+ png_uint_32 i;
4609
+ png_uint_32 row_width=row_info->width;
4610
+
4611
+ png_debug(1, "in png_do_quantize");
4612
+
4613
+ if (row_info->bit_depth == 8)
4614
+ {
4615
+ if (row_info->color_type == PNG_COLOR_TYPE_RGB && palette_lookup)
4616
+ {
4617
+ int r, g, b, p;
4618
+ sp = row;
4619
+ dp = row;
4620
+ for (i = 0; i < row_width; i++)
4621
+ {
4622
+ r = *sp++;
4623
+ g = *sp++;
4624
+ b = *sp++;
4625
+
4626
+ /* This looks real messy, but the compiler will reduce
4627
+ * it down to a reasonable formula. For example, with
4628
+ * 5 bits per color, we get:
4629
+ * p = (((r >> 3) & 0x1f) << 10) |
4630
+ * (((g >> 3) & 0x1f) << 5) |
4631
+ * ((b >> 3) & 0x1f);
4632
+ */
4633
+ p = (((r >> (8 - PNG_QUANTIZE_RED_BITS)) &
4634
+ ((1 << PNG_QUANTIZE_RED_BITS) - 1)) <<
4635
+ (PNG_QUANTIZE_GREEN_BITS + PNG_QUANTIZE_BLUE_BITS)) |
4636
+ (((g >> (8 - PNG_QUANTIZE_GREEN_BITS)) &
4637
+ ((1 << PNG_QUANTIZE_GREEN_BITS) - 1)) <<
4638
+ (PNG_QUANTIZE_BLUE_BITS)) |
4639
+ ((b >> (8 - PNG_QUANTIZE_BLUE_BITS)) &
4640
+ ((1 << PNG_QUANTIZE_BLUE_BITS) - 1));
4641
+
4642
+ *dp++ = palette_lookup[p];
4643
+ }
4644
+
4645
+ row_info->color_type = PNG_COLOR_TYPE_PALETTE;
4646
+ row_info->channels = 1;
4647
+ row_info->pixel_depth = row_info->bit_depth;
4648
+ row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);
4649
+ }
4650
+
4651
+ else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&
4652
+ palette_lookup != NULL)
4653
+ {
4654
+ int r, g, b, p;
4655
+ sp = row;
4656
+ dp = row;
4657
+ for (i = 0; i < row_width; i++)
4658
+ {
4659
+ r = *sp++;
4660
+ g = *sp++;
4661
+ b = *sp++;
4662
+ sp++;
4663
+
4664
+ p = (((r >> (8 - PNG_QUANTIZE_RED_BITS)) &
4665
+ ((1 << PNG_QUANTIZE_RED_BITS) - 1)) <<
4666
+ (PNG_QUANTIZE_GREEN_BITS + PNG_QUANTIZE_BLUE_BITS)) |
4667
+ (((g >> (8 - PNG_QUANTIZE_GREEN_BITS)) &
4668
+ ((1 << PNG_QUANTIZE_GREEN_BITS) - 1)) <<
4669
+ (PNG_QUANTIZE_BLUE_BITS)) |
4670
+ ((b >> (8 - PNG_QUANTIZE_BLUE_BITS)) &
4671
+ ((1 << PNG_QUANTIZE_BLUE_BITS) - 1));
4672
+
4673
+ *dp++ = palette_lookup[p];
4674
+ }
4675
+
4676
+ row_info->color_type = PNG_COLOR_TYPE_PALETTE;
4677
+ row_info->channels = 1;
4678
+ row_info->pixel_depth = row_info->bit_depth;
4679
+ row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);
4680
+ }
4681
+
4682
+ else if (row_info->color_type == PNG_COLOR_TYPE_PALETTE &&
4683
+ quantize_lookup)
4684
+ {
4685
+ sp = row;
4686
+
4687
+ for (i = 0; i < row_width; i++, sp++)
4688
+ {
4689
+ *sp = quantize_lookup[*sp];
4690
+ }
4691
+ }
4692
+ }
4693
+ }
4694
+ #endif /* READ_QUANTIZE */
4695
+
4696
+ /* Transform the row. The order of transformations is significant,
4697
+ * and is very touchy. If you add a transformation, take care to
4698
+ * decide how it fits in with the other transformations here.
4699
+ */
4700
+ void /* PRIVATE */
4701
+ png_do_read_transformations(png_structrp png_ptr, png_row_infop row_info)
4702
+ {
4703
+ png_debug(1, "in png_do_read_transformations");
4704
+
4705
+ if (png_ptr->row_buf == NULL)
4706
+ {
4707
+ /* Prior to 1.5.4 this output row/pass where the NULL pointer is, but this
4708
+ * error is incredibly rare and incredibly easy to debug without this
4709
+ * information.
4710
+ */
4711
+ png_error(png_ptr, "NULL row buffer");
4712
+ }
4713
+
4714
+ /* The following is debugging; prior to 1.5.4 the code was never compiled in;
4715
+ * in 1.5.4 PNG_FLAG_DETECT_UNINITIALIZED was added and the macro
4716
+ * PNG_WARN_UNINITIALIZED_ROW removed. In 1.6 the new flag is set only for
4717
+ * all transformations, however in practice the ROW_INIT always gets done on
4718
+ * demand, if necessary.
4719
+ */
4720
+ if ((png_ptr->flags & PNG_FLAG_DETECT_UNINITIALIZED) != 0 &&
4721
+ (png_ptr->flags & PNG_FLAG_ROW_INIT) == 0)
4722
+ {
4723
+ /* Application has failed to call either png_read_start_image() or
4724
+ * png_read_update_info() after setting transforms that expand pixels.
4725
+ * This check added to libpng-1.2.19 (but not enabled until 1.5.4).
4726
+ */
4727
+ png_error(png_ptr, "Uninitialized row");
4728
+ }
4729
+
4730
+ #ifdef PNG_READ_EXPAND_SUPPORTED
4731
+ if ((png_ptr->transformations & PNG_EXPAND) != 0)
4732
+ {
4733
+ if (row_info->color_type == PNG_COLOR_TYPE_PALETTE)
4734
+ {
4735
+ png_do_expand_palette(row_info, png_ptr->row_buf + 1,
4736
+ png_ptr->palette, png_ptr->trans_alpha, png_ptr->num_trans);
4737
+ }
4738
+
4739
+ else
4740
+ {
4741
+ if (png_ptr->num_trans != 0 &&
4742
+ (png_ptr->transformations & PNG_EXPAND_tRNS) != 0)
4743
+ png_do_expand(row_info, png_ptr->row_buf + 1,
4744
+ &(png_ptr->trans_color));
4745
+
4746
+ else
4747
+ png_do_expand(row_info, png_ptr->row_buf + 1,
4748
+ NULL);
4749
+ }
4750
+ }
4751
+ #endif
4752
+
4753
+ #ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
4754
+ if ((png_ptr->transformations & PNG_STRIP_ALPHA) != 0 &&
4755
+ (png_ptr->transformations & PNG_COMPOSE) == 0 &&
4756
+ (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||
4757
+ row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA))
4758
+ png_do_strip_channel(row_info, png_ptr->row_buf + 1,
4759
+ 0 /* at_start == false, because SWAP_ALPHA happens later */);
4760
+ #endif
4761
+
4762
+ #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
4763
+ if ((png_ptr->transformations & PNG_RGB_TO_GRAY) != 0)
4764
+ {
4765
+ int rgb_error =
4766
+ png_do_rgb_to_gray(png_ptr, row_info,
4767
+ png_ptr->row_buf + 1);
4768
+
4769
+ if (rgb_error != 0)
4770
+ {
4771
+ png_ptr->rgb_to_gray_status=1;
4772
+ if ((png_ptr->transformations & PNG_RGB_TO_GRAY) ==
4773
+ PNG_RGB_TO_GRAY_WARN)
4774
+ png_warning(png_ptr, "png_do_rgb_to_gray found nongray pixel");
4775
+
4776
+ if ((png_ptr->transformations & PNG_RGB_TO_GRAY) ==
4777
+ PNG_RGB_TO_GRAY_ERR)
4778
+ png_error(png_ptr, "png_do_rgb_to_gray found nongray pixel");
4779
+ }
4780
+ }
4781
+ #endif
4782
+
4783
+ /* From Andreas Dilger e-mail to png-implement, 26 March 1998:
4784
+ *
4785
+ * In most cases, the "simple transparency" should be done prior to doing
4786
+ * gray-to-RGB, or you will have to test 3x as many bytes to check if a
4787
+ * pixel is transparent. You would also need to make sure that the
4788
+ * transparency information is upgraded to RGB.
4789
+ *
4790
+ * To summarize, the current flow is:
4791
+ * - Gray + simple transparency -> compare 1 or 2 gray bytes and composite
4792
+ * with background "in place" if transparent,
4793
+ * convert to RGB if necessary
4794
+ * - Gray + alpha -> composite with gray background and remove alpha bytes,
4795
+ * convert to RGB if necessary
4796
+ *
4797
+ * To support RGB backgrounds for gray images we need:
4798
+ * - Gray + simple transparency -> convert to RGB + simple transparency,
4799
+ * compare 3 or 6 bytes and composite with
4800
+ * background "in place" if transparent
4801
+ * (3x compare/pixel compared to doing
4802
+ * composite with gray bkgrnd)
4803
+ * - Gray + alpha -> convert to RGB + alpha, composite with background and
4804
+ * remove alpha bytes (3x float
4805
+ * operations/pixel compared with composite
4806
+ * on gray background)
4807
+ *
4808
+ * Greg's change will do this. The reason it wasn't done before is for
4809
+ * performance, as this increases the per-pixel operations. If we would check
4810
+ * in advance if the background was gray or RGB, and position the gray-to-RGB
4811
+ * transform appropriately, then it would save a lot of work/time.
4812
+ */
4813
+
4814
+ #ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
4815
+ /* If gray -> RGB, do so now only if background is non-gray; else do later
4816
+ * for performance reasons
4817
+ */
4818
+ if ((png_ptr->transformations & PNG_GRAY_TO_RGB) != 0 &&
4819
+ (png_ptr->mode & PNG_BACKGROUND_IS_GRAY) == 0)
4820
+ png_do_gray_to_rgb(row_info, png_ptr->row_buf + 1);
4821
+ #endif
4822
+
4823
+ #if defined(PNG_READ_BACKGROUND_SUPPORTED) ||\
4824
+ defined(PNG_READ_ALPHA_MODE_SUPPORTED)
4825
+ if ((png_ptr->transformations & PNG_COMPOSE) != 0)
4826
+ png_do_compose(row_info, png_ptr->row_buf + 1, png_ptr);
4827
+ #endif
4828
+
4829
+ #ifdef PNG_READ_GAMMA_SUPPORTED
4830
+ if ((png_ptr->transformations & PNG_GAMMA) != 0 &&
4831
+ #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
4832
+ /* Because RGB_TO_GRAY does the gamma transform. */
4833
+ (png_ptr->transformations & PNG_RGB_TO_GRAY) == 0 &&
4834
+ #endif
4835
+ #if defined(PNG_READ_BACKGROUND_SUPPORTED) ||\
4836
+ defined(PNG_READ_ALPHA_MODE_SUPPORTED)
4837
+ /* Because PNG_COMPOSE does the gamma transform if there is something to
4838
+ * do (if there is an alpha channel or transparency.)
4839
+ */
4840
+ !((png_ptr->transformations & PNG_COMPOSE) &&
4841
+ ((png_ptr->num_trans != 0) ||
4842
+ (png_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0)) &&
4843
+ #endif
4844
+ /* Because png_init_read_transformations transforms the palette, unless
4845
+ * RGB_TO_GRAY will do the transform.
4846
+ */
4847
+ (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE))
4848
+ png_do_gamma(row_info, png_ptr->row_buf + 1, png_ptr);
4849
+ #endif
4850
+
4851
+ #ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
4852
+ if ((png_ptr->transformations & PNG_STRIP_ALPHA) != 0 &&
4853
+ (png_ptr->transformations & PNG_COMPOSE) != 0 &&
4854
+ (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||
4855
+ row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA))
4856
+ png_do_strip_channel(row_info, png_ptr->row_buf + 1,
4857
+ 0 /* at_start == false, because SWAP_ALPHA happens later */);
4858
+ #endif
4859
+
4860
+ #ifdef PNG_READ_ALPHA_MODE_SUPPORTED
4861
+ if ((png_ptr->transformations & PNG_ENCODE_ALPHA) != 0 &&
4862
+ (row_info->color_type & PNG_COLOR_MASK_ALPHA) != 0)
4863
+ png_do_encode_alpha(row_info, png_ptr->row_buf + 1, png_ptr);
4864
+ #endif
4865
+
4866
+ #ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
4867
+ if ((png_ptr->transformations & PNG_SCALE_16_TO_8) != 0)
4868
+ png_do_scale_16_to_8(row_info, png_ptr->row_buf + 1);
4869
+ #endif
4870
+
4871
+ #ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
4872
+ /* There is no harm in doing both of these because only one has any effect,
4873
+ * by putting the 'scale' option first if the app asks for scale (either by
4874
+ * calling the API or in a TRANSFORM flag) this is what happens.
4875
+ */
4876
+ if ((png_ptr->transformations & PNG_16_TO_8) != 0)
4877
+ png_do_chop(row_info, png_ptr->row_buf + 1);
4878
+ #endif
4879
+
4880
+ #ifdef PNG_READ_QUANTIZE_SUPPORTED
4881
+ if ((png_ptr->transformations & PNG_QUANTIZE) != 0)
4882
+ {
4883
+ png_do_quantize(row_info, png_ptr->row_buf + 1,
4884
+ png_ptr->palette_lookup, png_ptr->quantize_index);
4885
+
4886
+ if (row_info->rowbytes == 0)
4887
+ png_error(png_ptr, "png_do_quantize returned rowbytes=0");
4888
+ }
4889
+ #endif /* READ_QUANTIZE */
4890
+
4891
+ #ifdef PNG_READ_EXPAND_16_SUPPORTED
4892
+ /* Do the expansion now, after all the arithmetic has been done. Notice
4893
+ * that previous transformations can handle the PNG_EXPAND_16 flag if this
4894
+ * is efficient (particularly true in the case of gamma correction, where
4895
+ * better accuracy results faster!)
4896
+ */
4897
+ if ((png_ptr->transformations & PNG_EXPAND_16) != 0)
4898
+ png_do_expand_16(row_info, png_ptr->row_buf + 1);
4899
+ #endif
4900
+
4901
+ #ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
4902
+ /* NOTE: moved here in 1.5.4 (from much later in this list.) */
4903
+ if ((png_ptr->transformations & PNG_GRAY_TO_RGB) != 0 &&
4904
+ (png_ptr->mode & PNG_BACKGROUND_IS_GRAY) != 0)
4905
+ png_do_gray_to_rgb(row_info, png_ptr->row_buf + 1);
4906
+ #endif
4907
+
4908
+ #ifdef PNG_READ_INVERT_SUPPORTED
4909
+ if ((png_ptr->transformations & PNG_INVERT_MONO) != 0)
4910
+ png_do_invert(row_info, png_ptr->row_buf + 1);
4911
+ #endif
4912
+
4913
+ #ifdef PNG_READ_INVERT_ALPHA_SUPPORTED
4914
+ if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0)
4915
+ png_do_read_invert_alpha(row_info, png_ptr->row_buf + 1);
4916
+ #endif
4917
+
4918
+ #ifdef PNG_READ_SHIFT_SUPPORTED
4919
+ if ((png_ptr->transformations & PNG_SHIFT) != 0)
4920
+ png_do_unshift(row_info, png_ptr->row_buf + 1,
4921
+ &(png_ptr->shift));
4922
+ #endif
4923
+
4924
+ #ifdef PNG_READ_PACK_SUPPORTED
4925
+ if ((png_ptr->transformations & PNG_PACK) != 0)
4926
+ png_do_unpack(row_info, png_ptr->row_buf + 1);
4927
+ #endif
4928
+
4929
+ #ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED
4930
+ /* Added at libpng-1.5.10 */
4931
+ if (row_info->color_type == PNG_COLOR_TYPE_PALETTE &&
4932
+ png_ptr->num_palette_max >= 0)
4933
+ png_do_check_palette_indexes(png_ptr, row_info);
4934
+ #endif
4935
+
4936
+ #ifdef PNG_READ_BGR_SUPPORTED
4937
+ if ((png_ptr->transformations & PNG_BGR) != 0)
4938
+ png_do_bgr(row_info, png_ptr->row_buf + 1);
4939
+ #endif
4940
+
4941
+ #ifdef PNG_READ_PACKSWAP_SUPPORTED
4942
+ if ((png_ptr->transformations & PNG_PACKSWAP) != 0)
4943
+ png_do_packswap(row_info, png_ptr->row_buf + 1);
4944
+ #endif
4945
+
4946
+ #ifdef PNG_READ_FILLER_SUPPORTED
4947
+ if ((png_ptr->transformations & PNG_FILLER) != 0)
4948
+ png_do_read_filler(row_info, png_ptr->row_buf + 1,
4949
+ (png_uint_32)png_ptr->filler, png_ptr->flags);
4950
+ #endif
4951
+
4952
+ #ifdef PNG_READ_SWAP_ALPHA_SUPPORTED
4953
+ if ((png_ptr->transformations & PNG_SWAP_ALPHA) != 0)
4954
+ png_do_read_swap_alpha(row_info, png_ptr->row_buf + 1);
4955
+ #endif
4956
+
4957
+ #ifdef PNG_READ_16BIT_SUPPORTED
4958
+ #ifdef PNG_READ_SWAP_SUPPORTED
4959
+ if ((png_ptr->transformations & PNG_SWAP_BYTES) != 0)
4960
+ png_do_swap(row_info, png_ptr->row_buf + 1);
4961
+ #endif
4962
+ #endif
4963
+
4964
+ #ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
4965
+ if ((png_ptr->transformations & PNG_USER_TRANSFORM) != 0)
4966
+ {
4967
+ if (png_ptr->read_user_transform_fn != NULL)
4968
+ (*(png_ptr->read_user_transform_fn)) /* User read transform function */
4969
+ (png_ptr, /* png_ptr */
4970
+ row_info, /* row_info: */
4971
+ /* png_uint_32 width; width of row */
4972
+ /* png_size_t rowbytes; number of bytes in row */
4973
+ /* png_byte color_type; color type of pixels */
4974
+ /* png_byte bit_depth; bit depth of samples */
4975
+ /* png_byte channels; number of channels (1-4) */
4976
+ /* png_byte pixel_depth; bits per pixel (depth*channels) */
4977
+ png_ptr->row_buf + 1); /* start of pixel data for row */
4978
+ #ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
4979
+ if (png_ptr->user_transform_depth != 0)
4980
+ row_info->bit_depth = png_ptr->user_transform_depth;
4981
+
4982
+ if (png_ptr->user_transform_channels != 0)
4983
+ row_info->channels = png_ptr->user_transform_channels;
4984
+ #endif
4985
+ row_info->pixel_depth = (png_byte)(row_info->bit_depth *
4986
+ row_info->channels);
4987
+
4988
+ row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_info->width);
4989
+ }
4990
+ #endif
4991
+ }
4992
+
4993
+ #endif /* READ_TRANSFORMS */
4994
+ #endif /* READ */