rfreeimage 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (860) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +1 -0
  4. data/Rakefile +34 -0
  5. data/ext/rfreeimage/extconf.rb +35 -0
  6. data/ext/rfreeimage/rfi_main.c +389 -0
  7. data/lib/rfreeimage/image.rb +26 -0
  8. data/lib/rfreeimage/version.rb +3 -0
  9. data/lib/rfreeimage.rb +3 -0
  10. data/rfreeimage.gemspec +32 -0
  11. data/vendor/FreeImage/Makefile +34 -0
  12. data/vendor/FreeImage/Makefile.cygwin +74 -0
  13. data/vendor/FreeImage/Makefile.fip +84 -0
  14. data/vendor/FreeImage/Makefile.gnu +83 -0
  15. data/vendor/FreeImage/Makefile.iphone +96 -0
  16. data/vendor/FreeImage/Makefile.mingw +136 -0
  17. data/vendor/FreeImage/Makefile.osx +115 -0
  18. data/vendor/FreeImage/Makefile.solaris +66 -0
  19. data/vendor/FreeImage/Makefile.srcs +6 -0
  20. data/vendor/FreeImage/README.iphone +19 -0
  21. data/vendor/FreeImage/README.linux +50 -0
  22. data/vendor/FreeImage/README.minGW +236 -0
  23. data/vendor/FreeImage/README.osx +44 -0
  24. data/vendor/FreeImage/README.solaris +67 -0
  25. data/vendor/FreeImage/Source/CacheFile.h +92 -0
  26. data/vendor/FreeImage/Source/DeprecationManager/Deprecated.cpp +36 -0
  27. data/vendor/FreeImage/Source/DeprecationManager/DeprecationMgr.cpp +103 -0
  28. data/vendor/FreeImage/Source/DeprecationManager/DeprecationMgr.h +83 -0
  29. data/vendor/FreeImage/Source/FreeImage/BitmapAccess.cpp +1573 -0
  30. data/vendor/FreeImage/Source/FreeImage/CacheFile.cpp +271 -0
  31. data/vendor/FreeImage/Source/FreeImage/ColorLookup.cpp +785 -0
  32. data/vendor/FreeImage/Source/FreeImage/Conversion.cpp +551 -0
  33. data/vendor/FreeImage/Source/FreeImage/Conversion16_555.cpp +209 -0
  34. data/vendor/FreeImage/Source/FreeImage/Conversion16_565.cpp +204 -0
  35. data/vendor/FreeImage/Source/FreeImage/Conversion24.cpp +252 -0
  36. data/vendor/FreeImage/Source/FreeImage/Conversion32.cpp +345 -0
  37. data/vendor/FreeImage/Source/FreeImage/Conversion4.cpp +246 -0
  38. data/vendor/FreeImage/Source/FreeImage/Conversion8.cpp +305 -0
  39. data/vendor/FreeImage/Source/FreeImage/ConversionFloat.cpp +194 -0
  40. data/vendor/FreeImage/Source/FreeImage/ConversionRGB16.cpp +144 -0
  41. data/vendor/FreeImage/Source/FreeImage/ConversionRGBA16.cpp +147 -0
  42. data/vendor/FreeImage/Source/FreeImage/ConversionRGBAF.cpp +250 -0
  43. data/vendor/FreeImage/Source/FreeImage/ConversionRGBF.cpp +243 -0
  44. data/vendor/FreeImage/Source/FreeImage/ConversionType.cpp +699 -0
  45. data/vendor/FreeImage/Source/FreeImage/ConversionUINT16.cpp +134 -0
  46. data/vendor/FreeImage/Source/FreeImage/FreeImage.cpp +226 -0
  47. data/vendor/FreeImage/Source/FreeImage/FreeImageC.c +22 -0
  48. data/vendor/FreeImage/Source/FreeImage/FreeImageIO.cpp +175 -0
  49. data/vendor/FreeImage/Source/FreeImage/GetType.cpp +92 -0
  50. data/vendor/FreeImage/Source/FreeImage/Halftoning.cpp +474 -0
  51. data/vendor/FreeImage/Source/FreeImage/J2KHelper.cpp +591 -0
  52. data/vendor/FreeImage/Source/FreeImage/J2KHelper.h +36 -0
  53. data/vendor/FreeImage/Source/FreeImage/LFPQuantizer.cpp +208 -0
  54. data/vendor/FreeImage/Source/FreeImage/MNGHelper.cpp +1320 -0
  55. data/vendor/FreeImage/Source/FreeImage/MemoryIO.cpp +237 -0
  56. data/vendor/FreeImage/Source/FreeImage/MultiPage.cpp +974 -0
  57. data/vendor/FreeImage/Source/FreeImage/NNQuantizer.cpp +507 -0
  58. data/vendor/FreeImage/Source/FreeImage/PSDParser.cpp +1057 -0
  59. data/vendor/FreeImage/Source/FreeImage/PSDParser.h +271 -0
  60. data/vendor/FreeImage/Source/FreeImage/PixelAccess.cpp +197 -0
  61. data/vendor/FreeImage/Source/FreeImage/Plugin.cpp +822 -0
  62. data/vendor/FreeImage/Source/FreeImage/PluginBMP.cpp +1494 -0
  63. data/vendor/FreeImage/Source/FreeImage/PluginCUT.cpp +240 -0
  64. data/vendor/FreeImage/Source/FreeImage/PluginDDS.cpp +655 -0
  65. data/vendor/FreeImage/Source/FreeImage/PluginEXR.cpp +773 -0
  66. data/vendor/FreeImage/Source/FreeImage/PluginG3.cpp +433 -0
  67. data/vendor/FreeImage/Source/FreeImage/PluginGIF.cpp +1407 -0
  68. data/vendor/FreeImage/Source/FreeImage/PluginHDR.cpp +722 -0
  69. data/vendor/FreeImage/Source/FreeImage/PluginICO.cpp +824 -0
  70. data/vendor/FreeImage/Source/FreeImage/PluginIFF.cpp +459 -0
  71. data/vendor/FreeImage/Source/FreeImage/PluginJ2K.cpp +328 -0
  72. data/vendor/FreeImage/Source/FreeImage/PluginJNG.cpp +162 -0
  73. data/vendor/FreeImage/Source/FreeImage/PluginJP2.cpp +328 -0
  74. data/vendor/FreeImage/Source/FreeImage/PluginJPEG.cpp +1706 -0
  75. data/vendor/FreeImage/Source/FreeImage/PluginJXR.cpp +1475 -0
  76. data/vendor/FreeImage/Source/FreeImage/PluginKOALA.cpp +243 -0
  77. data/vendor/FreeImage/Source/FreeImage/PluginMNG.cpp +153 -0
  78. data/vendor/FreeImage/Source/FreeImage/PluginPCD.cpp +251 -0
  79. data/vendor/FreeImage/Source/FreeImage/PluginPCX.cpp +659 -0
  80. data/vendor/FreeImage/Source/FreeImage/PluginPFM.cpp +409 -0
  81. data/vendor/FreeImage/Source/FreeImage/PluginPICT.cpp +1343 -0
  82. data/vendor/FreeImage/Source/FreeImage/PluginPNG.cpp +1115 -0
  83. data/vendor/FreeImage/Source/FreeImage/PluginPNM.cpp +838 -0
  84. data/vendor/FreeImage/Source/FreeImage/PluginPSD.cpp +131 -0
  85. data/vendor/FreeImage/Source/FreeImage/PluginRAS.cpp +512 -0
  86. data/vendor/FreeImage/Source/FreeImage/PluginRAW.cpp +793 -0
  87. data/vendor/FreeImage/Source/FreeImage/PluginSGI.cpp +425 -0
  88. data/vendor/FreeImage/Source/FreeImage/PluginTARGA.cpp +1591 -0
  89. data/vendor/FreeImage/Source/FreeImage/PluginTIFF.cpp +2631 -0
  90. data/vendor/FreeImage/Source/FreeImage/PluginWBMP.cpp +372 -0
  91. data/vendor/FreeImage/Source/FreeImage/PluginWebP.cpp +698 -0
  92. data/vendor/FreeImage/Source/FreeImage/PluginXBM.cpp +399 -0
  93. data/vendor/FreeImage/Source/FreeImage/PluginXPM.cpp +487 -0
  94. data/vendor/FreeImage/Source/FreeImage/TIFFLogLuv.cpp +65 -0
  95. data/vendor/FreeImage/Source/FreeImage/ToneMapping.cpp +75 -0
  96. data/vendor/FreeImage/Source/FreeImage/WuQuantizer.cpp +559 -0
  97. data/vendor/FreeImage/Source/FreeImage/ZLibInterface.cpp +223 -0
  98. data/vendor/FreeImage/Source/FreeImage/tmoColorConvert.cpp +479 -0
  99. data/vendor/FreeImage/Source/FreeImage/tmoDrago03.cpp +295 -0
  100. data/vendor/FreeImage/Source/FreeImage/tmoFattal02.cpp +689 -0
  101. data/vendor/FreeImage/Source/FreeImage/tmoReinhard05.cpp +260 -0
  102. data/vendor/FreeImage/Source/FreeImage.h +1153 -0
  103. data/vendor/FreeImage/Source/FreeImageIO.h +63 -0
  104. data/vendor/FreeImage/Source/FreeImageToolkit/BSplineRotate.cpp +730 -0
  105. data/vendor/FreeImage/Source/FreeImageToolkit/Background.cpp +895 -0
  106. data/vendor/FreeImage/Source/FreeImageToolkit/Channels.cpp +488 -0
  107. data/vendor/FreeImage/Source/FreeImageToolkit/ClassicRotate.cpp +917 -0
  108. data/vendor/FreeImage/Source/FreeImageToolkit/Colors.cpp +967 -0
  109. data/vendor/FreeImage/Source/FreeImageToolkit/CopyPaste.cpp +861 -0
  110. data/vendor/FreeImage/Source/FreeImageToolkit/Display.cpp +230 -0
  111. data/vendor/FreeImage/Source/FreeImageToolkit/Filters.h +287 -0
  112. data/vendor/FreeImage/Source/FreeImageToolkit/Flip.cpp +166 -0
  113. data/vendor/FreeImage/Source/FreeImageToolkit/JPEGTransform.cpp +623 -0
  114. data/vendor/FreeImage/Source/FreeImageToolkit/MultigridPoissonSolver.cpp +505 -0
  115. data/vendor/FreeImage/Source/FreeImageToolkit/Rescale.cpp +192 -0
  116. data/vendor/FreeImage/Source/FreeImageToolkit/Resize.cpp +2116 -0
  117. data/vendor/FreeImage/Source/FreeImageToolkit/Resize.h +196 -0
  118. data/vendor/FreeImage/Source/LibJPEG/ansi2knr.c +739 -0
  119. data/vendor/FreeImage/Source/LibJPEG/cderror.h +134 -0
  120. data/vendor/FreeImage/Source/LibJPEG/cdjpeg.c +181 -0
  121. data/vendor/FreeImage/Source/LibJPEG/cdjpeg.h +187 -0
  122. data/vendor/FreeImage/Source/LibJPEG/cjpeg.c +664 -0
  123. data/vendor/FreeImage/Source/LibJPEG/ckconfig.c +402 -0
  124. data/vendor/FreeImage/Source/LibJPEG/djpeg.c +617 -0
  125. data/vendor/FreeImage/Source/LibJPEG/example.c +433 -0
  126. data/vendor/FreeImage/Source/LibJPEG/jaricom.c +153 -0
  127. data/vendor/FreeImage/Source/LibJPEG/jcapimin.c +288 -0
  128. data/vendor/FreeImage/Source/LibJPEG/jcapistd.c +162 -0
  129. data/vendor/FreeImage/Source/LibJPEG/jcarith.c +944 -0
  130. data/vendor/FreeImage/Source/LibJPEG/jccoefct.c +454 -0
  131. data/vendor/FreeImage/Source/LibJPEG/jccolor.c +604 -0
  132. data/vendor/FreeImage/Source/LibJPEG/jcdctmgr.c +477 -0
  133. data/vendor/FreeImage/Source/LibJPEG/jchuff.c +1573 -0
  134. data/vendor/FreeImage/Source/LibJPEG/jcinit.c +84 -0
  135. data/vendor/FreeImage/Source/LibJPEG/jcmainct.c +297 -0
  136. data/vendor/FreeImage/Source/LibJPEG/jcmarker.c +719 -0
  137. data/vendor/FreeImage/Source/LibJPEG/jcmaster.c +856 -0
  138. data/vendor/FreeImage/Source/LibJPEG/jcomapi.c +106 -0
  139. data/vendor/FreeImage/Source/LibJPEG/jconfig.h +161 -0
  140. data/vendor/FreeImage/Source/LibJPEG/jcparam.c +675 -0
  141. data/vendor/FreeImage/Source/LibJPEG/jcprepct.c +358 -0
  142. data/vendor/FreeImage/Source/LibJPEG/jcsample.c +545 -0
  143. data/vendor/FreeImage/Source/LibJPEG/jctrans.c +385 -0
  144. data/vendor/FreeImage/Source/LibJPEG/jdapimin.c +399 -0
  145. data/vendor/FreeImage/Source/LibJPEG/jdapistd.c +276 -0
  146. data/vendor/FreeImage/Source/LibJPEG/jdarith.c +796 -0
  147. data/vendor/FreeImage/Source/LibJPEG/jdatadst.c +270 -0
  148. data/vendor/FreeImage/Source/LibJPEG/jdatasrc.c +275 -0
  149. data/vendor/FreeImage/Source/LibJPEG/jdcoefct.c +741 -0
  150. data/vendor/FreeImage/Source/LibJPEG/jdcolor.c +748 -0
  151. data/vendor/FreeImage/Source/LibJPEG/jdct.h +393 -0
  152. data/vendor/FreeImage/Source/LibJPEG/jddctmgr.c +384 -0
  153. data/vendor/FreeImage/Source/LibJPEG/jdhuff.c +1554 -0
  154. data/vendor/FreeImage/Source/LibJPEG/jdinput.c +662 -0
  155. data/vendor/FreeImage/Source/LibJPEG/jdmainct.c +513 -0
  156. data/vendor/FreeImage/Source/LibJPEG/jdmarker.c +1511 -0
  157. data/vendor/FreeImage/Source/LibJPEG/jdmaster.c +543 -0
  158. data/vendor/FreeImage/Source/LibJPEG/jdmerge.c +401 -0
  159. data/vendor/FreeImage/Source/LibJPEG/jdpostct.c +290 -0
  160. data/vendor/FreeImage/Source/LibJPEG/jdsample.c +361 -0
  161. data/vendor/FreeImage/Source/LibJPEG/jdtrans.c +140 -0
  162. data/vendor/FreeImage/Source/LibJPEG/jerror.c +253 -0
  163. data/vendor/FreeImage/Source/LibJPEG/jerror.h +304 -0
  164. data/vendor/FreeImage/Source/LibJPEG/jfdctflt.c +174 -0
  165. data/vendor/FreeImage/Source/LibJPEG/jfdctfst.c +230 -0
  166. data/vendor/FreeImage/Source/LibJPEG/jfdctint.c +4406 -0
  167. data/vendor/FreeImage/Source/LibJPEG/jidctflt.c +235 -0
  168. data/vendor/FreeImage/Source/LibJPEG/jidctfst.c +368 -0
  169. data/vendor/FreeImage/Source/LibJPEG/jidctint.c +5179 -0
  170. data/vendor/FreeImage/Source/LibJPEG/jinclude.h +91 -0
  171. data/vendor/FreeImage/Source/LibJPEG/jmemansi.c +167 -0
  172. data/vendor/FreeImage/Source/LibJPEG/jmemdos.c +638 -0
  173. data/vendor/FreeImage/Source/LibJPEG/jmemmac.c +289 -0
  174. data/vendor/FreeImage/Source/LibJPEG/jmemmgr.c +1119 -0
  175. data/vendor/FreeImage/Source/LibJPEG/jmemname.c +276 -0
  176. data/vendor/FreeImage/Source/LibJPEG/jmemnobs.c +109 -0
  177. data/vendor/FreeImage/Source/LibJPEG/jmemsys.h +198 -0
  178. data/vendor/FreeImage/Source/LibJPEG/jmorecfg.h +442 -0
  179. data/vendor/FreeImage/Source/LibJPEG/jpegint.h +426 -0
  180. data/vendor/FreeImage/Source/LibJPEG/jpeglib.h +1180 -0
  181. data/vendor/FreeImage/Source/LibJPEG/jpegtran.c +577 -0
  182. data/vendor/FreeImage/Source/LibJPEG/jquant1.c +857 -0
  183. data/vendor/FreeImage/Source/LibJPEG/jquant2.c +1311 -0
  184. data/vendor/FreeImage/Source/LibJPEG/jutils.c +227 -0
  185. data/vendor/FreeImage/Source/LibJPEG/jversion.h +14 -0
  186. data/vendor/FreeImage/Source/LibJPEG/rdbmp.c +480 -0
  187. data/vendor/FreeImage/Source/LibJPEG/rdcolmap.c +253 -0
  188. data/vendor/FreeImage/Source/LibJPEG/rdgif.c +38 -0
  189. data/vendor/FreeImage/Source/LibJPEG/rdjpgcom.c +515 -0
  190. data/vendor/FreeImage/Source/LibJPEG/rdppm.c +459 -0
  191. data/vendor/FreeImage/Source/LibJPEG/rdrle.c +387 -0
  192. data/vendor/FreeImage/Source/LibJPEG/rdswitch.c +365 -0
  193. data/vendor/FreeImage/Source/LibJPEG/rdtarga.c +500 -0
  194. data/vendor/FreeImage/Source/LibJPEG/transupp.c +1763 -0
  195. data/vendor/FreeImage/Source/LibJPEG/transupp.h +219 -0
  196. data/vendor/FreeImage/Source/LibJPEG/wrbmp.c +442 -0
  197. data/vendor/FreeImage/Source/LibJPEG/wrgif.c +399 -0
  198. data/vendor/FreeImage/Source/LibJPEG/wrjpgcom.c +583 -0
  199. data/vendor/FreeImage/Source/LibJPEG/wrppm.c +269 -0
  200. data/vendor/FreeImage/Source/LibJPEG/wrrle.c +305 -0
  201. data/vendor/FreeImage/Source/LibJPEG/wrtarga.c +253 -0
  202. data/vendor/FreeImage/Source/LibJXR/common/include/guiddef.h +230 -0
  203. data/vendor/FreeImage/Source/LibJXR/common/include/wmsal.h +757 -0
  204. data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstring.h +342 -0
  205. data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstrings_adt.h +71 -0
  206. data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstrings_strict.h +1096 -0
  207. data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstrings_undef.h +406 -0
  208. data/vendor/FreeImage/Source/LibJXR/image/decode/JXRTranscode.c +987 -0
  209. data/vendor/FreeImage/Source/LibJXR/image/decode/decode.c +200 -0
  210. data/vendor/FreeImage/Source/LibJXR/image/decode/decode.h +143 -0
  211. data/vendor/FreeImage/Source/LibJXR/image/decode/postprocess.c +288 -0
  212. data/vendor/FreeImage/Source/LibJXR/image/decode/segdec.c +1205 -0
  213. data/vendor/FreeImage/Source/LibJXR/image/decode/strInvTransform.c +1888 -0
  214. data/vendor/FreeImage/Source/LibJXR/image/decode/strPredQuantDec.c +539 -0
  215. data/vendor/FreeImage/Source/LibJXR/image/decode/strdec.c +3628 -0
  216. data/vendor/FreeImage/Source/LibJXR/image/decode/strdec_x86.c +1640 -0
  217. data/vendor/FreeImage/Source/LibJXR/image/encode/encode.c +144 -0
  218. data/vendor/FreeImage/Source/LibJXR/image/encode/encode.h +113 -0
  219. data/vendor/FreeImage/Source/LibJXR/image/encode/segenc.c +1186 -0
  220. data/vendor/FreeImage/Source/LibJXR/image/encode/strFwdTransform.c +1111 -0
  221. data/vendor/FreeImage/Source/LibJXR/image/encode/strPredQuantEnc.c +511 -0
  222. data/vendor/FreeImage/Source/LibJXR/image/encode/strenc.c +2370 -0
  223. data/vendor/FreeImage/Source/LibJXR/image/encode/strenc_x86.c +409 -0
  224. data/vendor/FreeImage/Source/LibJXR/image/sys/adapthuff.c +511 -0
  225. data/vendor/FreeImage/Source/LibJXR/image/sys/ansi.h +61 -0
  226. data/vendor/FreeImage/Source/LibJXR/image/sys/common.h +131 -0
  227. data/vendor/FreeImage/Source/LibJXR/image/sys/image.c +183 -0
  228. data/vendor/FreeImage/Source/LibJXR/image/sys/perfTimer.h +115 -0
  229. data/vendor/FreeImage/Source/LibJXR/image/sys/perfTimerANSI.c +274 -0
  230. data/vendor/FreeImage/Source/LibJXR/image/sys/strPredQuant.c +306 -0
  231. data/vendor/FreeImage/Source/LibJXR/image/sys/strTransform.c +85 -0
  232. data/vendor/FreeImage/Source/LibJXR/image/sys/strTransform.h +50 -0
  233. data/vendor/FreeImage/Source/LibJXR/image/sys/strcodec.c +1251 -0
  234. data/vendor/FreeImage/Source/LibJXR/image/sys/strcodec.h +681 -0
  235. data/vendor/FreeImage/Source/LibJXR/image/sys/windowsmediaphoto.h +515 -0
  236. data/vendor/FreeImage/Source/LibJXR/image/sys/xplatform_image.h +84 -0
  237. data/vendor/FreeImage/Source/LibJXR/image/x86/x86.h +58 -0
  238. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGlue.c +930 -0
  239. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGlue.h +636 -0
  240. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGlueJxr.c +2246 -0
  241. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGluePFC.c +2338 -0
  242. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRMeta.c +905 -0
  243. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRMeta.h +258 -0
  244. data/vendor/FreeImage/Source/LibOpenJPEG/bio.c +188 -0
  245. data/vendor/FreeImage/Source/LibOpenJPEG/bio.h +128 -0
  246. data/vendor/FreeImage/Source/LibOpenJPEG/cidx_manager.c +239 -0
  247. data/vendor/FreeImage/Source/LibOpenJPEG/cidx_manager.h +68 -0
  248. data/vendor/FreeImage/Source/LibOpenJPEG/cio.c +644 -0
  249. data/vendor/FreeImage/Source/LibOpenJPEG/cio.h +393 -0
  250. data/vendor/FreeImage/Source/LibOpenJPEG/dwt.c +919 -0
  251. data/vendor/FreeImage/Source/LibOpenJPEG/dwt.h +116 -0
  252. data/vendor/FreeImage/Source/LibOpenJPEG/event.c +141 -0
  253. data/vendor/FreeImage/Source/LibOpenJPEG/event.h +97 -0
  254. data/vendor/FreeImage/Source/LibOpenJPEG/function_list.c +114 -0
  255. data/vendor/FreeImage/Source/LibOpenJPEG/function_list.h +126 -0
  256. data/vendor/FreeImage/Source/LibOpenJPEG/image.c +235 -0
  257. data/vendor/FreeImage/Source/LibOpenJPEG/image.h +63 -0
  258. data/vendor/FreeImage/Source/LibOpenJPEG/indexbox_manager.h +148 -0
  259. data/vendor/FreeImage/Source/LibOpenJPEG/invert.c +289 -0
  260. data/vendor/FreeImage/Source/LibOpenJPEG/invert.h +59 -0
  261. data/vendor/FreeImage/Source/LibOpenJPEG/j2k.c +10238 -0
  262. data/vendor/FreeImage/Source/LibOpenJPEG/j2k.h +838 -0
  263. data/vendor/FreeImage/Source/LibOpenJPEG/jp2.c +2776 -0
  264. data/vendor/FreeImage/Source/LibOpenJPEG/jp2.h +490 -0
  265. data/vendor/FreeImage/Source/LibOpenJPEG/mct.c +319 -0
  266. data/vendor/FreeImage/Source/LibOpenJPEG/mct.h +149 -0
  267. data/vendor/FreeImage/Source/LibOpenJPEG/mqc.c +604 -0
  268. data/vendor/FreeImage/Source/LibOpenJPEG/mqc.h +201 -0
  269. data/vendor/FreeImage/Source/LibOpenJPEG/openjpeg.c +955 -0
  270. data/vendor/FreeImage/Source/LibOpenJPEG/openjpeg.h +1475 -0
  271. data/vendor/FreeImage/Source/LibOpenJPEG/opj_clock.c +59 -0
  272. data/vendor/FreeImage/Source/LibOpenJPEG/opj_clock.h +54 -0
  273. data/vendor/FreeImage/Source/LibOpenJPEG/opj_codec.h +160 -0
  274. data/vendor/FreeImage/Source/LibOpenJPEG/opj_config.h +9 -0
  275. data/vendor/FreeImage/Source/LibOpenJPEG/opj_config_private.h +16 -0
  276. data/vendor/FreeImage/Source/LibOpenJPEG/opj_includes.h +175 -0
  277. data/vendor/FreeImage/Source/LibOpenJPEG/opj_intmath.h +172 -0
  278. data/vendor/FreeImage/Source/LibOpenJPEG/opj_inttypes.h +43 -0
  279. data/vendor/FreeImage/Source/LibOpenJPEG/opj_malloc.h +180 -0
  280. data/vendor/FreeImage/Source/LibOpenJPEG/opj_stdint.h +47 -0
  281. data/vendor/FreeImage/Source/LibOpenJPEG/phix_manager.c +191 -0
  282. data/vendor/FreeImage/Source/LibOpenJPEG/pi.c +1870 -0
  283. data/vendor/FreeImage/Source/LibOpenJPEG/pi.h +182 -0
  284. data/vendor/FreeImage/Source/LibOpenJPEG/ppix_manager.c +194 -0
  285. data/vendor/FreeImage/Source/LibOpenJPEG/raw.c +89 -0
  286. data/vendor/FreeImage/Source/LibOpenJPEG/raw.h +100 -0
  287. data/vendor/FreeImage/Source/LibOpenJPEG/t1.c +1751 -0
  288. data/vendor/FreeImage/Source/LibOpenJPEG/t1.h +157 -0
  289. data/vendor/FreeImage/Source/LibOpenJPEG/t1_generate_luts.c +276 -0
  290. data/vendor/FreeImage/Source/LibOpenJPEG/t1_luts.h +143 -0
  291. data/vendor/FreeImage/Source/LibOpenJPEG/t2.c +1334 -0
  292. data/vendor/FreeImage/Source/LibOpenJPEG/t2.h +127 -0
  293. data/vendor/FreeImage/Source/LibOpenJPEG/tcd.c +2123 -0
  294. data/vendor/FreeImage/Source/LibOpenJPEG/tcd.h +348 -0
  295. data/vendor/FreeImage/Source/LibOpenJPEG/tgt.c +331 -0
  296. data/vendor/FreeImage/Source/LibOpenJPEG/tgt.h +140 -0
  297. data/vendor/FreeImage/Source/LibOpenJPEG/thix_manager.c +134 -0
  298. data/vendor/FreeImage/Source/LibOpenJPEG/tpix_manager.c +185 -0
  299. data/vendor/FreeImage/Source/LibPNG/example.c +1061 -0
  300. data/vendor/FreeImage/Source/LibPNG/png.c +4493 -0
  301. data/vendor/FreeImage/Source/LibPNG/png.h +3282 -0
  302. data/vendor/FreeImage/Source/LibPNG/pngconf.h +644 -0
  303. data/vendor/FreeImage/Source/LibPNG/pngdebug.h +154 -0
  304. data/vendor/FreeImage/Source/LibPNG/pngerror.c +963 -0
  305. data/vendor/FreeImage/Source/LibPNG/pngget.c +1213 -0
  306. data/vendor/FreeImage/Source/LibPNG/pnginfo.h +260 -0
  307. data/vendor/FreeImage/Source/LibPNG/pnglibconf.h +218 -0
  308. data/vendor/FreeImage/Source/LibPNG/pngmem.c +281 -0
  309. data/vendor/FreeImage/Source/LibPNG/pngpread.c +1168 -0
  310. data/vendor/FreeImage/Source/LibPNG/pngpriv.h +1944 -0
  311. data/vendor/FreeImage/Source/LibPNG/pngread.c +4121 -0
  312. data/vendor/FreeImage/Source/LibPNG/pngrio.c +120 -0
  313. data/vendor/FreeImage/Source/LibPNG/pngrtran.c +4994 -0
  314. data/vendor/FreeImage/Source/LibPNG/pngrutil.c +4474 -0
  315. data/vendor/FreeImage/Source/LibPNG/pngset.c +1611 -0
  316. data/vendor/FreeImage/Source/LibPNG/pngstruct.h +489 -0
  317. data/vendor/FreeImage/Source/LibPNG/pngtest.c +2011 -0
  318. data/vendor/FreeImage/Source/LibPNG/pngtrans.c +849 -0
  319. data/vendor/FreeImage/Source/LibPNG/pngwio.c +168 -0
  320. data/vendor/FreeImage/Source/LibPNG/pngwrite.c +2455 -0
  321. data/vendor/FreeImage/Source/LibPNG/pngwtran.c +574 -0
  322. data/vendor/FreeImage/Source/LibPNG/pngwutil.c +3029 -0
  323. data/vendor/FreeImage/Source/LibRawLite/dcraw/dcraw.c +15462 -0
  324. data/vendor/FreeImage/Source/LibRawLite/internal/aahd_demosaic.cpp +706 -0
  325. data/vendor/FreeImage/Source/LibRawLite/internal/dcb_demosaicing.c +710 -0
  326. data/vendor/FreeImage/Source/LibRawLite/internal/dcraw_common.cpp +13593 -0
  327. data/vendor/FreeImage/Source/LibRawLite/internal/dcraw_fileio.cpp +240 -0
  328. data/vendor/FreeImage/Source/LibRawLite/internal/defines.h +167 -0
  329. data/vendor/FreeImage/Source/LibRawLite/internal/demosaic_packs.cpp +99 -0
  330. data/vendor/FreeImage/Source/LibRawLite/internal/dht_demosaic.cpp +873 -0
  331. data/vendor/FreeImage/Source/LibRawLite/internal/libraw_internal_funcs.h +282 -0
  332. data/vendor/FreeImage/Source/LibRawLite/internal/libraw_x3f.cpp +1919 -0
  333. data/vendor/FreeImage/Source/LibRawLite/internal/var_defines.h +216 -0
  334. data/vendor/FreeImage/Source/LibRawLite/internal/wf_filtering.cpp +1950 -0
  335. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw.h +338 -0
  336. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_alloc.h +99 -0
  337. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_const.h +233 -0
  338. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_datastream.h +238 -0
  339. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_internal.h +225 -0
  340. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_types.h +442 -0
  341. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_version.h +62 -0
  342. data/vendor/FreeImage/Source/LibRawLite/src/libraw_c_api.cpp +230 -0
  343. data/vendor/FreeImage/Source/LibRawLite/src/libraw_cxx.cpp +4533 -0
  344. data/vendor/FreeImage/Source/LibRawLite/src/libraw_datastream.cpp +703 -0
  345. data/vendor/FreeImage/Source/LibTIFF4/mkg3states.c +451 -0
  346. data/vendor/FreeImage/Source/LibTIFF4/mkspans.c +82 -0
  347. data/vendor/FreeImage/Source/LibTIFF4/t4.h +292 -0
  348. data/vendor/FreeImage/Source/LibTIFF4/tif_aux.c +358 -0
  349. data/vendor/FreeImage/Source/LibTIFF4/tif_close.c +140 -0
  350. data/vendor/FreeImage/Source/LibTIFF4/tif_codec.c +166 -0
  351. data/vendor/FreeImage/Source/LibTIFF4/tif_color.c +287 -0
  352. data/vendor/FreeImage/Source/LibTIFF4/tif_compress.c +304 -0
  353. data/vendor/FreeImage/Source/LibTIFF4/tif_config.h +97 -0
  354. data/vendor/FreeImage/Source/LibTIFF4/tif_config.vc.h +74 -0
  355. data/vendor/FreeImage/Source/LibTIFF4/tif_config.wince.h +71 -0
  356. data/vendor/FreeImage/Source/LibTIFF4/tif_dir.c +1700 -0
  357. data/vendor/FreeImage/Source/LibTIFF4/tif_dir.h +308 -0
  358. data/vendor/FreeImage/Source/LibTIFF4/tif_dirinfo.c +959 -0
  359. data/vendor/FreeImage/Source/LibTIFF4/tif_dirread.c +5640 -0
  360. data/vendor/FreeImage/Source/LibTIFF4/tif_dirwrite.c +2910 -0
  361. data/vendor/FreeImage/Source/LibTIFF4/tif_dumpmode.c +143 -0
  362. data/vendor/FreeImage/Source/LibTIFF4/tif_error.c +80 -0
  363. data/vendor/FreeImage/Source/LibTIFF4/tif_extension.c +118 -0
  364. data/vendor/FreeImage/Source/LibTIFF4/tif_fax3.c +1595 -0
  365. data/vendor/FreeImage/Source/LibTIFF4/tif_fax3.h +538 -0
  366. data/vendor/FreeImage/Source/LibTIFF4/tif_fax3sm.c +1260 -0
  367. data/vendor/FreeImage/Source/LibTIFF4/tif_flush.c +118 -0
  368. data/vendor/FreeImage/Source/LibTIFF4/tif_getimage.c +2890 -0
  369. data/vendor/FreeImage/Source/LibTIFF4/tif_jbig.c +213 -0
  370. data/vendor/FreeImage/Source/LibTIFF4/tif_jpeg.c +2354 -0
  371. data/vendor/FreeImage/Source/LibTIFF4/tif_jpeg_12.c +65 -0
  372. data/vendor/FreeImage/Source/LibTIFF4/tif_luv.c +1683 -0
  373. data/vendor/FreeImage/Source/LibTIFF4/tif_lzma.c +495 -0
  374. data/vendor/FreeImage/Source/LibTIFF4/tif_lzw.c +1169 -0
  375. data/vendor/FreeImage/Source/LibTIFF4/tif_next.c +181 -0
  376. data/vendor/FreeImage/Source/LibTIFF4/tif_ojpeg.c +2501 -0
  377. data/vendor/FreeImage/Source/LibTIFF4/tif_open.c +725 -0
  378. data/vendor/FreeImage/Source/LibTIFF4/tif_packbits.c +300 -0
  379. data/vendor/FreeImage/Source/LibTIFF4/tif_pixarlog.c +1442 -0
  380. data/vendor/FreeImage/Source/LibTIFF4/tif_predict.c +764 -0
  381. data/vendor/FreeImage/Source/LibTIFF4/tif_predict.h +77 -0
  382. data/vendor/FreeImage/Source/LibTIFF4/tif_print.c +716 -0
  383. data/vendor/FreeImage/Source/LibTIFF4/tif_read.c +1086 -0
  384. data/vendor/FreeImage/Source/LibTIFF4/tif_strip.c +383 -0
  385. data/vendor/FreeImage/Source/LibTIFF4/tif_swab.c +310 -0
  386. data/vendor/FreeImage/Source/LibTIFF4/tif_thunder.c +207 -0
  387. data/vendor/FreeImage/Source/LibTIFF4/tif_tile.c +299 -0
  388. data/vendor/FreeImage/Source/LibTIFF4/tif_unix.c +325 -0
  389. data/vendor/FreeImage/Source/LibTIFF4/tif_version.c +40 -0
  390. data/vendor/FreeImage/Source/LibTIFF4/tif_vms.c +603 -0
  391. data/vendor/FreeImage/Source/LibTIFF4/tif_warning.c +81 -0
  392. data/vendor/FreeImage/Source/LibTIFF4/tif_win32.c +443 -0
  393. data/vendor/FreeImage/Source/LibTIFF4/tif_wince.c +293 -0
  394. data/vendor/FreeImage/Source/LibTIFF4/tif_write.c +771 -0
  395. data/vendor/FreeImage/Source/LibTIFF4/tif_zip.c +472 -0
  396. data/vendor/FreeImage/Source/LibTIFF4/tiff.h +681 -0
  397. data/vendor/FreeImage/Source/LibTIFF4/tiffconf.h +170 -0
  398. data/vendor/FreeImage/Source/LibTIFF4/tiffconf.vc.h +160 -0
  399. data/vendor/FreeImage/Source/LibTIFF4/tiffconf.wince.h +121 -0
  400. data/vendor/FreeImage/Source/LibTIFF4/tiffio.h +557 -0
  401. data/vendor/FreeImage/Source/LibTIFF4/tiffiop.h +367 -0
  402. data/vendor/FreeImage/Source/LibTIFF4/tiffvers.h +9 -0
  403. data/vendor/FreeImage/Source/LibTIFF4/uvcode.h +180 -0
  404. data/vendor/FreeImage/Source/LibWebP/src/dec/alphai.h +55 -0
  405. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.alpha.c +167 -0
  406. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.buffer.c +249 -0
  407. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.frame.c +827 -0
  408. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.idec.c +857 -0
  409. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.io.c +640 -0
  410. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.quant.c +110 -0
  411. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.tree.c +525 -0
  412. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.vp8.c +663 -0
  413. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.vp8l.c +1584 -0
  414. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.webp.c +834 -0
  415. data/vendor/FreeImage/Source/LibWebP/src/dec/decode_vp8.h +185 -0
  416. data/vendor/FreeImage/Source/LibWebP/src/dec/vp8i.h +353 -0
  417. data/vendor/FreeImage/Source/LibWebP/src/dec/vp8li.h +136 -0
  418. data/vendor/FreeImage/Source/LibWebP/src/dec/webpi.h +120 -0
  419. data/vendor/FreeImage/Source/LibWebP/src/demux/demux.demux.c +957 -0
  420. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.alpha_processing.c +377 -0
  421. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.alpha_processing_mips_dsp_r2.c +139 -0
  422. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.alpha_processing_sse2.c +296 -0
  423. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.argb.c +68 -0
  424. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.argb_mips_dsp_r2.c +108 -0
  425. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.argb_sse2.c +62 -0
  426. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost.c +412 -0
  427. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost_mips32.c +154 -0
  428. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost_mips_dsp_r2.c +107 -0
  429. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost_sse2.c +121 -0
  430. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cpu.c +138 -0
  431. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec.c +760 -0
  432. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_clip_tables.c +366 -0
  433. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_mips32.c +585 -0
  434. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_mips_dsp_r2.c +992 -0
  435. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_neon.c +1489 -0
  436. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_sse2.c +1284 -0
  437. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc.c +788 -0
  438. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_avx2.c +24 -0
  439. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_mips32.c +670 -0
  440. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_mips_dsp_r2.c +1510 -0
  441. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_neon.c +932 -0
  442. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_sse2.c +940 -0
  443. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.filters.c +240 -0
  444. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.filters_mips_dsp_r2.c +404 -0
  445. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.filters_sse2.c +349 -0
  446. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.h +434 -0
  447. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless.c +1838 -0
  448. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_mips32.c +416 -0
  449. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_mips_dsp_r2.c +921 -0
  450. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_neon.c +357 -0
  451. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_sse2.c +535 -0
  452. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.rescaler.c +115 -0
  453. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.rescaler_mips32.c +192 -0
  454. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.rescaler_mips_dsp_r2.c +210 -0
  455. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling.c +252 -0
  456. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling_mips_dsp_r2.c +280 -0
  457. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling_neon.c +267 -0
  458. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling_sse2.c +214 -0
  459. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv.c +166 -0
  460. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv_mips32.c +100 -0
  461. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv_mips_dsp_r2.c +131 -0
  462. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv_sse2.c +322 -0
  463. data/vendor/FreeImage/Source/LibWebP/src/dsp/lossless.h +313 -0
  464. data/vendor/FreeImage/Source/LibWebP/src/dsp/mips_macro.h +200 -0
  465. data/vendor/FreeImage/Source/LibWebP/src/dsp/neon.h +82 -0
  466. data/vendor/FreeImage/Source/LibWebP/src/dsp/yuv.h +321 -0
  467. data/vendor/FreeImage/Source/LibWebP/src/dsp/yuv_tables_sse2.h +536 -0
  468. data/vendor/FreeImage/Source/LibWebP/src/enc/backward_references.h +202 -0
  469. data/vendor/FreeImage/Source/LibWebP/src/enc/cost.h +69 -0
  470. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.alpha.c +440 -0
  471. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.analysis.c +501 -0
  472. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.backward_references.c +1076 -0
  473. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.config.c +163 -0
  474. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.cost.c +355 -0
  475. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.filter.c +296 -0
  476. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.frame.c +850 -0
  477. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.histogram.c +897 -0
  478. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.iterator.c +456 -0
  479. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.near_lossless.c +160 -0
  480. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture.c +290 -0
  481. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_csp.c +1100 -0
  482. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_psnr.c +150 -0
  483. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_rescale.c +285 -0
  484. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_tools.c +206 -0
  485. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.quant.c +1191 -0
  486. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.syntax.c +383 -0
  487. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.token.c +285 -0
  488. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.tree.c +504 -0
  489. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.vp8l.c +1437 -0
  490. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.webpenc.c +379 -0
  491. data/vendor/FreeImage/Source/LibWebP/src/enc/histogram.h +114 -0
  492. data/vendor/FreeImage/Source/LibWebP/src/enc/vp8enci.h +551 -0
  493. data/vendor/FreeImage/Source/LibWebP/src/enc/vp8li.h +78 -0
  494. data/vendor/FreeImage/Source/LibWebP/src/mux/mux.anim_encode.c +1241 -0
  495. data/vendor/FreeImage/Source/LibWebP/src/mux/mux.muxedit.c +696 -0
  496. data/vendor/FreeImage/Source/LibWebP/src/mux/mux.muxinternal.c +551 -0
  497. data/vendor/FreeImage/Source/LibWebP/src/mux/mux.muxread.c +544 -0
  498. data/vendor/FreeImage/Source/LibWebP/src/mux/muxi.h +232 -0
  499. data/vendor/FreeImage/Source/LibWebP/src/utils/bit_reader.h +168 -0
  500. data/vendor/FreeImage/Source/LibWebP/src/utils/bit_reader_inl.h +172 -0
  501. data/vendor/FreeImage/Source/LibWebP/src/utils/bit_writer.h +120 -0
  502. data/vendor/FreeImage/Source/LibWebP/src/utils/color_cache.h +74 -0
  503. data/vendor/FreeImage/Source/LibWebP/src/utils/endian_inl.h +100 -0
  504. data/vendor/FreeImage/Source/LibWebP/src/utils/filters.h +32 -0
  505. data/vendor/FreeImage/Source/LibWebP/src/utils/huffman.h +67 -0
  506. data/vendor/FreeImage/Source/LibWebP/src/utils/huffman_encode.h +60 -0
  507. data/vendor/FreeImage/Source/LibWebP/src/utils/quant_levels.h +36 -0
  508. data/vendor/FreeImage/Source/LibWebP/src/utils/quant_levels_dec.h +35 -0
  509. data/vendor/FreeImage/Source/LibWebP/src/utils/random.h +63 -0
  510. data/vendor/FreeImage/Source/LibWebP/src/utils/rescaler.h +78 -0
  511. data/vendor/FreeImage/Source/LibWebP/src/utils/thread.h +93 -0
  512. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.bit_reader.c +208 -0
  513. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.bit_writer.c +308 -0
  514. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.color_cache.c +49 -0
  515. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.filters.c +76 -0
  516. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.h +121 -0
  517. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.huffman.c +205 -0
  518. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.huffman_encode.c +417 -0
  519. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.quant_levels.c +140 -0
  520. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.quant_levels_dec.c +279 -0
  521. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.random.c +43 -0
  522. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.rescaler.c +82 -0
  523. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.thread.c +309 -0
  524. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.utils.c +211 -0
  525. data/vendor/FreeImage/Source/LibWebP/src/webp/decode.h +493 -0
  526. data/vendor/FreeImage/Source/LibWebP/src/webp/demux.h +224 -0
  527. data/vendor/FreeImage/Source/LibWebP/src/webp/encode.h +515 -0
  528. data/vendor/FreeImage/Source/LibWebP/src/webp/format_constants.h +88 -0
  529. data/vendor/FreeImage/Source/LibWebP/src/webp/mux.h +507 -0
  530. data/vendor/FreeImage/Source/LibWebP/src/webp/mux_types.h +97 -0
  531. data/vendor/FreeImage/Source/LibWebP/src/webp/types.h +52 -0
  532. data/vendor/FreeImage/Source/MapIntrospector.h +212 -0
  533. data/vendor/FreeImage/Source/Metadata/Exif.cpp +1253 -0
  534. data/vendor/FreeImage/Source/Metadata/FIRational.cpp +176 -0
  535. data/vendor/FreeImage/Source/Metadata/FIRational.h +108 -0
  536. data/vendor/FreeImage/Source/Metadata/FreeImageTag.cpp +353 -0
  537. data/vendor/FreeImage/Source/Metadata/FreeImageTag.h +500 -0
  538. data/vendor/FreeImage/Source/Metadata/IPTC.cpp +342 -0
  539. data/vendor/FreeImage/Source/Metadata/TagConversion.cpp +1094 -0
  540. data/vendor/FreeImage/Source/Metadata/TagLib.cpp +1618 -0
  541. data/vendor/FreeImage/Source/Metadata/XTIFF.cpp +766 -0
  542. data/vendor/FreeImage/Source/OpenEXR/Half/eLut.cpp +114 -0
  543. data/vendor/FreeImage/Source/OpenEXR/Half/eLut.h +71 -0
  544. data/vendor/FreeImage/Source/OpenEXR/Half/half.cpp +310 -0
  545. data/vendor/FreeImage/Source/OpenEXR/Half/half.h +757 -0
  546. data/vendor/FreeImage/Source/OpenEXR/Half/halfExport.h +27 -0
  547. data/vendor/FreeImage/Source/OpenEXR/Half/halfFunction.h +179 -0
  548. data/vendor/FreeImage/Source/OpenEXR/Half/halfLimits.h +102 -0
  549. data/vendor/FreeImage/Source/OpenEXR/Half/toFloat.cpp +164 -0
  550. data/vendor/FreeImage/Source/OpenEXR/Half/toFloat.h +16391 -0
  551. data/vendor/FreeImage/Source/OpenEXR/Iex/Iex.h +60 -0
  552. data/vendor/FreeImage/Source/OpenEXR/Iex/IexBaseExc.cpp +156 -0
  553. data/vendor/FreeImage/Source/OpenEXR/Iex/IexBaseExc.h +264 -0
  554. data/vendor/FreeImage/Source/OpenEXR/Iex/IexErrnoExc.h +208 -0
  555. data/vendor/FreeImage/Source/OpenEXR/Iex/IexExport.h +51 -0
  556. data/vendor/FreeImage/Source/OpenEXR/Iex/IexForward.h +229 -0
  557. data/vendor/FreeImage/Source/OpenEXR/Iex/IexMacros.h +170 -0
  558. data/vendor/FreeImage/Source/OpenEXR/Iex/IexMathExc.h +57 -0
  559. data/vendor/FreeImage/Source/OpenEXR/Iex/IexNamespace.h +112 -0
  560. data/vendor/FreeImage/Source/OpenEXR/Iex/IexThrowErrnoExc.cpp +873 -0
  561. data/vendor/FreeImage/Source/OpenEXR/Iex/IexThrowErrnoExc.h +97 -0
  562. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFloatExc.cpp +113 -0
  563. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFloatExc.h +146 -0
  564. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFpu.cpp +530 -0
  565. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFpu.h +91 -0
  566. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathIeeeExc.h +62 -0
  567. data/vendor/FreeImage/Source/OpenEXR/IlmBaseConfig.h +61 -0
  568. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAcesFile.cpp +633 -0
  569. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAcesFile.h +324 -0
  570. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfArray.h +285 -0
  571. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAttribute.cpp +158 -0
  572. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAttribute.h +407 -0
  573. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAutoArray.h +95 -0
  574. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfB44Compressor.cpp +1072 -0
  575. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfB44Compressor.h +118 -0
  576. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfBoxAttribute.cpp +111 -0
  577. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfBoxAttribute.h +87 -0
  578. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCRgbaFile.cpp +1438 -0
  579. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCRgbaFile.h +555 -0
  580. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelList.cpp +322 -0
  581. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelList.h +436 -0
  582. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelListAttribute.cpp +150 -0
  583. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelListAttribute.h +74 -0
  584. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCheckedArithmetic.h +163 -0
  585. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticities.cpp +151 -0
  586. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticities.h +131 -0
  587. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticitiesAttribute.cpp +87 -0
  588. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticitiesAttribute.h +73 -0
  589. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompositeDeepScanLine.cpp +591 -0
  590. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompositeDeepScanLine.h +142 -0
  591. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompression.h +84 -0
  592. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressionAttribute.cpp +78 -0
  593. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressionAttribute.h +64 -0
  594. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressor.cpp +226 -0
  595. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressor.h +265 -0
  596. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfConvert.cpp +143 -0
  597. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfConvert.h +107 -0
  598. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepCompositing.cpp +110 -0
  599. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepCompositing.h +132 -0
  600. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepFrameBuffer.cpp +230 -0
  601. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepFrameBuffer.h +339 -0
  602. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepImageState.h +96 -0
  603. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepImageStateAttribute.cpp +78 -0
  604. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepImageStateAttribute.h +68 -0
  605. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputFile.cpp +2025 -0
  606. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputFile.h +276 -0
  607. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputPart.cpp +149 -0
  608. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputPart.h +181 -0
  609. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputFile.cpp +1552 -0
  610. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputFile.h +244 -0
  611. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputPart.cpp +107 -0
  612. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputPart.h +168 -0
  613. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputFile.cpp +1979 -0
  614. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputFile.h +437 -0
  615. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputPart.cpp +273 -0
  616. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputPart.h +362 -0
  617. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputFile.cpp +2055 -0
  618. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputFile.h +475 -0
  619. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputPart.cpp +250 -0
  620. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputPart.h +394 -0
  621. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDoubleAttribute.cpp +57 -0
  622. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDoubleAttribute.h +59 -0
  623. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDwaCompressor.cpp +3424 -0
  624. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDwaCompressor.h +210 -0
  625. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDwaCompressorSimd.h +2145 -0
  626. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmap.cpp +335 -0
  627. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmap.h +336 -0
  628. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmapAttribute.cpp +76 -0
  629. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmapAttribute.h +68 -0
  630. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfExport.h +46 -0
  631. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFastHuf.cpp +768 -0
  632. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFastHuf.h +148 -0
  633. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatAttribute.cpp +57 -0
  634. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatAttribute.h +58 -0
  635. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatVectorAttribute.cpp +84 -0
  636. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatVectorAttribute.h +76 -0
  637. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfForward.h +127 -0
  638. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFrameBuffer.cpp +228 -0
  639. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFrameBuffer.h +386 -0
  640. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFramesPerSecond.cpp +76 -0
  641. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFramesPerSecond.h +94 -0
  642. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericInputFile.cpp +76 -0
  643. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericInputFile.h +58 -0
  644. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericOutputFile.cpp +112 -0
  645. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericOutputFile.h +62 -0
  646. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHeader.cpp +1283 -0
  647. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHeader.h +699 -0
  648. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHuf.cpp +1114 -0
  649. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHuf.h +82 -0
  650. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIO.cpp +110 -0
  651. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIO.h +255 -0
  652. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputFile.cpp +895 -0
  653. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputFile.h +240 -0
  654. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPart.cpp +114 -0
  655. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPart.h +84 -0
  656. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPartData.cpp +51 -0
  657. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPartData.h +69 -0
  658. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputStreamMutex.h +68 -0
  659. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInt64.h +56 -0
  660. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIntAttribute.cpp +57 -0
  661. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIntAttribute.h +58 -0
  662. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCode.cpp +217 -0
  663. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCode.h +167 -0
  664. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCodeAttribute.cpp +99 -0
  665. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCodeAttribute.h +73 -0
  666. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLineOrder.h +69 -0
  667. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLineOrderAttribute.cpp +78 -0
  668. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLineOrderAttribute.h +72 -0
  669. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLut.cpp +178 -0
  670. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLut.h +188 -0
  671. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMatrixAttribute.cpp +263 -0
  672. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMatrixAttribute.h +83 -0
  673. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMisc.cpp +1872 -0
  674. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMisc.h +466 -0
  675. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartInputFile.cpp +783 -0
  676. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartInputFile.h +128 -0
  677. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartOutputFile.cpp +519 -0
  678. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartOutputFile.h +118 -0
  679. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiView.cpp +435 -0
  680. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiView.h +187 -0
  681. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfName.h +150 -0
  682. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfNamespace.h +115 -0
  683. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOpaqueAttribute.cpp +126 -0
  684. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOpaqueAttribute.h +110 -0
  685. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOptimizedPixelReading.h +646 -0
  686. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputFile.cpp +1378 -0
  687. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputFile.h +263 -0
  688. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPart.cpp +105 -0
  689. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPart.h +77 -0
  690. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPartData.cpp +52 -0
  691. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPartData.h +62 -0
  692. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputStreamMutex.h +70 -0
  693. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPartHelper.h +262 -0
  694. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPartType.cpp +63 -0
  695. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPartType.h +62 -0
  696. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPixelType.h +67 -0
  697. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPizCompressor.cpp +667 -0
  698. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPizCompressor.h +117 -0
  699. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImage.cpp +104 -0
  700. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImage.h +135 -0
  701. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImageAttribute.cpp +103 -0
  702. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImageAttribute.h +70 -0
  703. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPxr24Compressor.cpp +553 -0
  704. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPxr24Compressor.h +109 -0
  705. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRational.cpp +127 -0
  706. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRational.h +98 -0
  707. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRationalAttribute.cpp +74 -0
  708. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRationalAttribute.h +69 -0
  709. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgba.h +109 -0
  710. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaFile.cpp +1405 -0
  711. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaFile.h +346 -0
  712. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaYca.cpp +497 -0
  713. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaYca.h +259 -0
  714. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRle.cpp +157 -0
  715. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRle.h +63 -0
  716. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRleCompressor.cpp +220 -0
  717. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRleCompressor.h +80 -0
  718. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfScanLineInputFile.cpp +1702 -0
  719. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfScanLineInputFile.h +210 -0
  720. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfSimd.h +59 -0
  721. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStandardAttributes.cpp +125 -0
  722. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStandardAttributes.h +382 -0
  723. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStdIO.cpp +242 -0
  724. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStdIO.h +160 -0
  725. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringAttribute.cpp +80 -0
  726. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringAttribute.h +71 -0
  727. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringVectorAttribute.cpp +100 -0
  728. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringVectorAttribute.h +74 -0
  729. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfSystemSpecific.cpp +129 -0
  730. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfSystemSpecific.h +172 -0
  731. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTestFile.cpp +216 -0
  732. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTestFile.h +97 -0
  733. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfThreading.cpp +62 -0
  734. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfThreading.h +95 -0
  735. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileDescription.h +107 -0
  736. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileDescriptionAttribute.cpp +86 -0
  737. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileDescriptionAttribute.h +72 -0
  738. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileOffsets.cpp +552 -0
  739. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileOffsets.h +125 -0
  740. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputFile.cpp +1533 -0
  741. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputFile.h +401 -0
  742. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputPart.cpp +208 -0
  743. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputPart.h +100 -0
  744. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledMisc.cpp +389 -0
  745. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledMisc.h +106 -0
  746. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputFile.cpp +1841 -0
  747. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputFile.h +495 -0
  748. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputPart.cpp +228 -0
  749. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputPart.h +105 -0
  750. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledRgbaFile.cpp +1163 -0
  751. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledRgbaFile.h +482 -0
  752. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCode.cpp +431 -0
  753. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCode.h +242 -0
  754. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCodeAttribute.cpp +79 -0
  755. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCodeAttribute.h +74 -0
  756. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVecAttribute.cpp +217 -0
  757. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVecAttribute.h +100 -0
  758. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVersion.cpp +60 -0
  759. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVersion.h +136 -0
  760. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfWav.cpp +391 -0
  761. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfWav.h +78 -0
  762. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfXdr.h +927 -0
  763. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZip.cpp +196 -0
  764. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZip.h +78 -0
  765. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZipCompressor.cpp +127 -0
  766. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZipCompressor.h +89 -0
  767. data/vendor/FreeImage/Source/OpenEXR/IlmImf/b44ExpLogTable.cpp +136 -0
  768. data/vendor/FreeImage/Source/OpenEXR/IlmImf/b44ExpLogTable.h +16396 -0
  769. data/vendor/FreeImage/Source/OpenEXR/IlmImf/dwaLookups.cpp +573 -0
  770. data/vendor/FreeImage/Source/OpenEXR/IlmImf/dwaLookups.h +98334 -0
  771. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThread.cpp +80 -0
  772. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThread.h +143 -0
  773. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadExport.h +46 -0
  774. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadForward.h +52 -0
  775. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutex.cpp +59 -0
  776. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutex.h +160 -0
  777. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutexPosix.cpp +85 -0
  778. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutexWin32.cpp +79 -0
  779. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadNamespace.h +114 -0
  780. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadPool.cpp +483 -0
  781. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadPool.h +160 -0
  782. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadPosix.cpp +98 -0
  783. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphore.cpp +60 -0
  784. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphore.h +112 -0
  785. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphorePosix.cpp +106 -0
  786. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphorePosixCompat.cpp +155 -0
  787. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphoreWin32.cpp +153 -0
  788. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadWin32.cpp +100 -0
  789. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathBox.cpp +37 -0
  790. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathBox.h +849 -0
  791. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathBoxAlgo.h +1016 -0
  792. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathColor.h +736 -0
  793. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathColorAlgo.cpp +178 -0
  794. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathColorAlgo.h +257 -0
  795. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathEuler.h +926 -0
  796. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathExc.h +73 -0
  797. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathExport.h +46 -0
  798. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathForward.h +72 -0
  799. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFrame.h +192 -0
  800. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFrustum.h +741 -0
  801. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFrustumTest.h +417 -0
  802. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFun.cpp +181 -0
  803. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFun.h +269 -0
  804. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathGL.h +166 -0
  805. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathGLU.h +54 -0
  806. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathHalfLimits.h +68 -0
  807. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathInt64.h +62 -0
  808. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathInterval.h +226 -0
  809. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathLimits.h +268 -0
  810. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathLine.h +185 -0
  811. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathLineAlgo.h +288 -0
  812. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMath.h +208 -0
  813. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMatrix.h +3441 -0
  814. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMatrixAlgo.cpp +1252 -0
  815. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMatrixAlgo.h +1425 -0
  816. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathNamespace.h +115 -0
  817. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathPlane.h +257 -0
  818. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathPlatform.h +112 -0
  819. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathQuat.h +964 -0
  820. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathRandom.cpp +194 -0
  821. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathRandom.h +401 -0
  822. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathRoots.h +219 -0
  823. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathShear.cpp +54 -0
  824. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathShear.h +656 -0
  825. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathSphere.h +177 -0
  826. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathVec.cpp +583 -0
  827. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathVec.h +2227 -0
  828. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathVecAlgo.h +147 -0
  829. data/vendor/FreeImage/Source/OpenEXR/OpenEXRConfig.h +72 -0
  830. data/vendor/FreeImage/Source/Plugin.h +144 -0
  831. data/vendor/FreeImage/Source/Quantizers.h +354 -0
  832. data/vendor/FreeImage/Source/ToneMapping.h +44 -0
  833. data/vendor/FreeImage/Source/Utilities.h +516 -0
  834. data/vendor/FreeImage/Source/ZLib/adler32.c +179 -0
  835. data/vendor/FreeImage/Source/ZLib/compress.c +80 -0
  836. data/vendor/FreeImage/Source/ZLib/crc32.c +425 -0
  837. data/vendor/FreeImage/Source/ZLib/crc32.h +441 -0
  838. data/vendor/FreeImage/Source/ZLib/deflate.c +1967 -0
  839. data/vendor/FreeImage/Source/ZLib/deflate.h +346 -0
  840. data/vendor/FreeImage/Source/ZLib/gzclose.c +25 -0
  841. data/vendor/FreeImage/Source/ZLib/gzguts.h +209 -0
  842. data/vendor/FreeImage/Source/ZLib/gzlib.c +634 -0
  843. data/vendor/FreeImage/Source/ZLib/gzread.c +594 -0
  844. data/vendor/FreeImage/Source/ZLib/gzwrite.c +577 -0
  845. data/vendor/FreeImage/Source/ZLib/infback.c +640 -0
  846. data/vendor/FreeImage/Source/ZLib/inffast.c +340 -0
  847. data/vendor/FreeImage/Source/ZLib/inffast.h +11 -0
  848. data/vendor/FreeImage/Source/ZLib/inffixed.h +94 -0
  849. data/vendor/FreeImage/Source/ZLib/inflate.c +1512 -0
  850. data/vendor/FreeImage/Source/ZLib/inflate.h +122 -0
  851. data/vendor/FreeImage/Source/ZLib/inftrees.c +306 -0
  852. data/vendor/FreeImage/Source/ZLib/inftrees.h +62 -0
  853. data/vendor/FreeImage/Source/ZLib/trees.c +1226 -0
  854. data/vendor/FreeImage/Source/ZLib/trees.h +128 -0
  855. data/vendor/FreeImage/Source/ZLib/uncompr.c +59 -0
  856. data/vendor/FreeImage/Source/ZLib/zconf.h +511 -0
  857. data/vendor/FreeImage/Source/ZLib/zlib.h +1768 -0
  858. data/vendor/FreeImage/Source/ZLib/zutil.c +324 -0
  859. data/vendor/FreeImage/Source/ZLib/zutil.h +253 -0
  860. metadata +931 -0
@@ -0,0 +1,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 */