rfreeimage 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (860) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +1 -0
  4. data/Rakefile +34 -0
  5. data/ext/rfreeimage/extconf.rb +35 -0
  6. data/ext/rfreeimage/rfi_main.c +389 -0
  7. data/lib/rfreeimage/image.rb +26 -0
  8. data/lib/rfreeimage/version.rb +3 -0
  9. data/lib/rfreeimage.rb +3 -0
  10. data/rfreeimage.gemspec +32 -0
  11. data/vendor/FreeImage/Makefile +34 -0
  12. data/vendor/FreeImage/Makefile.cygwin +74 -0
  13. data/vendor/FreeImage/Makefile.fip +84 -0
  14. data/vendor/FreeImage/Makefile.gnu +83 -0
  15. data/vendor/FreeImage/Makefile.iphone +96 -0
  16. data/vendor/FreeImage/Makefile.mingw +136 -0
  17. data/vendor/FreeImage/Makefile.osx +115 -0
  18. data/vendor/FreeImage/Makefile.solaris +66 -0
  19. data/vendor/FreeImage/Makefile.srcs +6 -0
  20. data/vendor/FreeImage/README.iphone +19 -0
  21. data/vendor/FreeImage/README.linux +50 -0
  22. data/vendor/FreeImage/README.minGW +236 -0
  23. data/vendor/FreeImage/README.osx +44 -0
  24. data/vendor/FreeImage/README.solaris +67 -0
  25. data/vendor/FreeImage/Source/CacheFile.h +92 -0
  26. data/vendor/FreeImage/Source/DeprecationManager/Deprecated.cpp +36 -0
  27. data/vendor/FreeImage/Source/DeprecationManager/DeprecationMgr.cpp +103 -0
  28. data/vendor/FreeImage/Source/DeprecationManager/DeprecationMgr.h +83 -0
  29. data/vendor/FreeImage/Source/FreeImage/BitmapAccess.cpp +1573 -0
  30. data/vendor/FreeImage/Source/FreeImage/CacheFile.cpp +271 -0
  31. data/vendor/FreeImage/Source/FreeImage/ColorLookup.cpp +785 -0
  32. data/vendor/FreeImage/Source/FreeImage/Conversion.cpp +551 -0
  33. data/vendor/FreeImage/Source/FreeImage/Conversion16_555.cpp +209 -0
  34. data/vendor/FreeImage/Source/FreeImage/Conversion16_565.cpp +204 -0
  35. data/vendor/FreeImage/Source/FreeImage/Conversion24.cpp +252 -0
  36. data/vendor/FreeImage/Source/FreeImage/Conversion32.cpp +345 -0
  37. data/vendor/FreeImage/Source/FreeImage/Conversion4.cpp +246 -0
  38. data/vendor/FreeImage/Source/FreeImage/Conversion8.cpp +305 -0
  39. data/vendor/FreeImage/Source/FreeImage/ConversionFloat.cpp +194 -0
  40. data/vendor/FreeImage/Source/FreeImage/ConversionRGB16.cpp +144 -0
  41. data/vendor/FreeImage/Source/FreeImage/ConversionRGBA16.cpp +147 -0
  42. data/vendor/FreeImage/Source/FreeImage/ConversionRGBAF.cpp +250 -0
  43. data/vendor/FreeImage/Source/FreeImage/ConversionRGBF.cpp +243 -0
  44. data/vendor/FreeImage/Source/FreeImage/ConversionType.cpp +699 -0
  45. data/vendor/FreeImage/Source/FreeImage/ConversionUINT16.cpp +134 -0
  46. data/vendor/FreeImage/Source/FreeImage/FreeImage.cpp +226 -0
  47. data/vendor/FreeImage/Source/FreeImage/FreeImageC.c +22 -0
  48. data/vendor/FreeImage/Source/FreeImage/FreeImageIO.cpp +175 -0
  49. data/vendor/FreeImage/Source/FreeImage/GetType.cpp +92 -0
  50. data/vendor/FreeImage/Source/FreeImage/Halftoning.cpp +474 -0
  51. data/vendor/FreeImage/Source/FreeImage/J2KHelper.cpp +591 -0
  52. data/vendor/FreeImage/Source/FreeImage/J2KHelper.h +36 -0
  53. data/vendor/FreeImage/Source/FreeImage/LFPQuantizer.cpp +208 -0
  54. data/vendor/FreeImage/Source/FreeImage/MNGHelper.cpp +1320 -0
  55. data/vendor/FreeImage/Source/FreeImage/MemoryIO.cpp +237 -0
  56. data/vendor/FreeImage/Source/FreeImage/MultiPage.cpp +974 -0
  57. data/vendor/FreeImage/Source/FreeImage/NNQuantizer.cpp +507 -0
  58. data/vendor/FreeImage/Source/FreeImage/PSDParser.cpp +1057 -0
  59. data/vendor/FreeImage/Source/FreeImage/PSDParser.h +271 -0
  60. data/vendor/FreeImage/Source/FreeImage/PixelAccess.cpp +197 -0
  61. data/vendor/FreeImage/Source/FreeImage/Plugin.cpp +822 -0
  62. data/vendor/FreeImage/Source/FreeImage/PluginBMP.cpp +1494 -0
  63. data/vendor/FreeImage/Source/FreeImage/PluginCUT.cpp +240 -0
  64. data/vendor/FreeImage/Source/FreeImage/PluginDDS.cpp +655 -0
  65. data/vendor/FreeImage/Source/FreeImage/PluginEXR.cpp +773 -0
  66. data/vendor/FreeImage/Source/FreeImage/PluginG3.cpp +433 -0
  67. data/vendor/FreeImage/Source/FreeImage/PluginGIF.cpp +1407 -0
  68. data/vendor/FreeImage/Source/FreeImage/PluginHDR.cpp +722 -0
  69. data/vendor/FreeImage/Source/FreeImage/PluginICO.cpp +824 -0
  70. data/vendor/FreeImage/Source/FreeImage/PluginIFF.cpp +459 -0
  71. data/vendor/FreeImage/Source/FreeImage/PluginJ2K.cpp +328 -0
  72. data/vendor/FreeImage/Source/FreeImage/PluginJNG.cpp +162 -0
  73. data/vendor/FreeImage/Source/FreeImage/PluginJP2.cpp +328 -0
  74. data/vendor/FreeImage/Source/FreeImage/PluginJPEG.cpp +1706 -0
  75. data/vendor/FreeImage/Source/FreeImage/PluginJXR.cpp +1475 -0
  76. data/vendor/FreeImage/Source/FreeImage/PluginKOALA.cpp +243 -0
  77. data/vendor/FreeImage/Source/FreeImage/PluginMNG.cpp +153 -0
  78. data/vendor/FreeImage/Source/FreeImage/PluginPCD.cpp +251 -0
  79. data/vendor/FreeImage/Source/FreeImage/PluginPCX.cpp +659 -0
  80. data/vendor/FreeImage/Source/FreeImage/PluginPFM.cpp +409 -0
  81. data/vendor/FreeImage/Source/FreeImage/PluginPICT.cpp +1343 -0
  82. data/vendor/FreeImage/Source/FreeImage/PluginPNG.cpp +1115 -0
  83. data/vendor/FreeImage/Source/FreeImage/PluginPNM.cpp +838 -0
  84. data/vendor/FreeImage/Source/FreeImage/PluginPSD.cpp +131 -0
  85. data/vendor/FreeImage/Source/FreeImage/PluginRAS.cpp +512 -0
  86. data/vendor/FreeImage/Source/FreeImage/PluginRAW.cpp +793 -0
  87. data/vendor/FreeImage/Source/FreeImage/PluginSGI.cpp +425 -0
  88. data/vendor/FreeImage/Source/FreeImage/PluginTARGA.cpp +1591 -0
  89. data/vendor/FreeImage/Source/FreeImage/PluginTIFF.cpp +2631 -0
  90. data/vendor/FreeImage/Source/FreeImage/PluginWBMP.cpp +372 -0
  91. data/vendor/FreeImage/Source/FreeImage/PluginWebP.cpp +698 -0
  92. data/vendor/FreeImage/Source/FreeImage/PluginXBM.cpp +399 -0
  93. data/vendor/FreeImage/Source/FreeImage/PluginXPM.cpp +487 -0
  94. data/vendor/FreeImage/Source/FreeImage/TIFFLogLuv.cpp +65 -0
  95. data/vendor/FreeImage/Source/FreeImage/ToneMapping.cpp +75 -0
  96. data/vendor/FreeImage/Source/FreeImage/WuQuantizer.cpp +559 -0
  97. data/vendor/FreeImage/Source/FreeImage/ZLibInterface.cpp +223 -0
  98. data/vendor/FreeImage/Source/FreeImage/tmoColorConvert.cpp +479 -0
  99. data/vendor/FreeImage/Source/FreeImage/tmoDrago03.cpp +295 -0
  100. data/vendor/FreeImage/Source/FreeImage/tmoFattal02.cpp +689 -0
  101. data/vendor/FreeImage/Source/FreeImage/tmoReinhard05.cpp +260 -0
  102. data/vendor/FreeImage/Source/FreeImage.h +1153 -0
  103. data/vendor/FreeImage/Source/FreeImageIO.h +63 -0
  104. data/vendor/FreeImage/Source/FreeImageToolkit/BSplineRotate.cpp +730 -0
  105. data/vendor/FreeImage/Source/FreeImageToolkit/Background.cpp +895 -0
  106. data/vendor/FreeImage/Source/FreeImageToolkit/Channels.cpp +488 -0
  107. data/vendor/FreeImage/Source/FreeImageToolkit/ClassicRotate.cpp +917 -0
  108. data/vendor/FreeImage/Source/FreeImageToolkit/Colors.cpp +967 -0
  109. data/vendor/FreeImage/Source/FreeImageToolkit/CopyPaste.cpp +861 -0
  110. data/vendor/FreeImage/Source/FreeImageToolkit/Display.cpp +230 -0
  111. data/vendor/FreeImage/Source/FreeImageToolkit/Filters.h +287 -0
  112. data/vendor/FreeImage/Source/FreeImageToolkit/Flip.cpp +166 -0
  113. data/vendor/FreeImage/Source/FreeImageToolkit/JPEGTransform.cpp +623 -0
  114. data/vendor/FreeImage/Source/FreeImageToolkit/MultigridPoissonSolver.cpp +505 -0
  115. data/vendor/FreeImage/Source/FreeImageToolkit/Rescale.cpp +192 -0
  116. data/vendor/FreeImage/Source/FreeImageToolkit/Resize.cpp +2116 -0
  117. data/vendor/FreeImage/Source/FreeImageToolkit/Resize.h +196 -0
  118. data/vendor/FreeImage/Source/LibJPEG/ansi2knr.c +739 -0
  119. data/vendor/FreeImage/Source/LibJPEG/cderror.h +134 -0
  120. data/vendor/FreeImage/Source/LibJPEG/cdjpeg.c +181 -0
  121. data/vendor/FreeImage/Source/LibJPEG/cdjpeg.h +187 -0
  122. data/vendor/FreeImage/Source/LibJPEG/cjpeg.c +664 -0
  123. data/vendor/FreeImage/Source/LibJPEG/ckconfig.c +402 -0
  124. data/vendor/FreeImage/Source/LibJPEG/djpeg.c +617 -0
  125. data/vendor/FreeImage/Source/LibJPEG/example.c +433 -0
  126. data/vendor/FreeImage/Source/LibJPEG/jaricom.c +153 -0
  127. data/vendor/FreeImage/Source/LibJPEG/jcapimin.c +288 -0
  128. data/vendor/FreeImage/Source/LibJPEG/jcapistd.c +162 -0
  129. data/vendor/FreeImage/Source/LibJPEG/jcarith.c +944 -0
  130. data/vendor/FreeImage/Source/LibJPEG/jccoefct.c +454 -0
  131. data/vendor/FreeImage/Source/LibJPEG/jccolor.c +604 -0
  132. data/vendor/FreeImage/Source/LibJPEG/jcdctmgr.c +477 -0
  133. data/vendor/FreeImage/Source/LibJPEG/jchuff.c +1573 -0
  134. data/vendor/FreeImage/Source/LibJPEG/jcinit.c +84 -0
  135. data/vendor/FreeImage/Source/LibJPEG/jcmainct.c +297 -0
  136. data/vendor/FreeImage/Source/LibJPEG/jcmarker.c +719 -0
  137. data/vendor/FreeImage/Source/LibJPEG/jcmaster.c +856 -0
  138. data/vendor/FreeImage/Source/LibJPEG/jcomapi.c +106 -0
  139. data/vendor/FreeImage/Source/LibJPEG/jconfig.h +161 -0
  140. data/vendor/FreeImage/Source/LibJPEG/jcparam.c +675 -0
  141. data/vendor/FreeImage/Source/LibJPEG/jcprepct.c +358 -0
  142. data/vendor/FreeImage/Source/LibJPEG/jcsample.c +545 -0
  143. data/vendor/FreeImage/Source/LibJPEG/jctrans.c +385 -0
  144. data/vendor/FreeImage/Source/LibJPEG/jdapimin.c +399 -0
  145. data/vendor/FreeImage/Source/LibJPEG/jdapistd.c +276 -0
  146. data/vendor/FreeImage/Source/LibJPEG/jdarith.c +796 -0
  147. data/vendor/FreeImage/Source/LibJPEG/jdatadst.c +270 -0
  148. data/vendor/FreeImage/Source/LibJPEG/jdatasrc.c +275 -0
  149. data/vendor/FreeImage/Source/LibJPEG/jdcoefct.c +741 -0
  150. data/vendor/FreeImage/Source/LibJPEG/jdcolor.c +748 -0
  151. data/vendor/FreeImage/Source/LibJPEG/jdct.h +393 -0
  152. data/vendor/FreeImage/Source/LibJPEG/jddctmgr.c +384 -0
  153. data/vendor/FreeImage/Source/LibJPEG/jdhuff.c +1554 -0
  154. data/vendor/FreeImage/Source/LibJPEG/jdinput.c +662 -0
  155. data/vendor/FreeImage/Source/LibJPEG/jdmainct.c +513 -0
  156. data/vendor/FreeImage/Source/LibJPEG/jdmarker.c +1511 -0
  157. data/vendor/FreeImage/Source/LibJPEG/jdmaster.c +543 -0
  158. data/vendor/FreeImage/Source/LibJPEG/jdmerge.c +401 -0
  159. data/vendor/FreeImage/Source/LibJPEG/jdpostct.c +290 -0
  160. data/vendor/FreeImage/Source/LibJPEG/jdsample.c +361 -0
  161. data/vendor/FreeImage/Source/LibJPEG/jdtrans.c +140 -0
  162. data/vendor/FreeImage/Source/LibJPEG/jerror.c +253 -0
  163. data/vendor/FreeImage/Source/LibJPEG/jerror.h +304 -0
  164. data/vendor/FreeImage/Source/LibJPEG/jfdctflt.c +174 -0
  165. data/vendor/FreeImage/Source/LibJPEG/jfdctfst.c +230 -0
  166. data/vendor/FreeImage/Source/LibJPEG/jfdctint.c +4406 -0
  167. data/vendor/FreeImage/Source/LibJPEG/jidctflt.c +235 -0
  168. data/vendor/FreeImage/Source/LibJPEG/jidctfst.c +368 -0
  169. data/vendor/FreeImage/Source/LibJPEG/jidctint.c +5179 -0
  170. data/vendor/FreeImage/Source/LibJPEG/jinclude.h +91 -0
  171. data/vendor/FreeImage/Source/LibJPEG/jmemansi.c +167 -0
  172. data/vendor/FreeImage/Source/LibJPEG/jmemdos.c +638 -0
  173. data/vendor/FreeImage/Source/LibJPEG/jmemmac.c +289 -0
  174. data/vendor/FreeImage/Source/LibJPEG/jmemmgr.c +1119 -0
  175. data/vendor/FreeImage/Source/LibJPEG/jmemname.c +276 -0
  176. data/vendor/FreeImage/Source/LibJPEG/jmemnobs.c +109 -0
  177. data/vendor/FreeImage/Source/LibJPEG/jmemsys.h +198 -0
  178. data/vendor/FreeImage/Source/LibJPEG/jmorecfg.h +442 -0
  179. data/vendor/FreeImage/Source/LibJPEG/jpegint.h +426 -0
  180. data/vendor/FreeImage/Source/LibJPEG/jpeglib.h +1180 -0
  181. data/vendor/FreeImage/Source/LibJPEG/jpegtran.c +577 -0
  182. data/vendor/FreeImage/Source/LibJPEG/jquant1.c +857 -0
  183. data/vendor/FreeImage/Source/LibJPEG/jquant2.c +1311 -0
  184. data/vendor/FreeImage/Source/LibJPEG/jutils.c +227 -0
  185. data/vendor/FreeImage/Source/LibJPEG/jversion.h +14 -0
  186. data/vendor/FreeImage/Source/LibJPEG/rdbmp.c +480 -0
  187. data/vendor/FreeImage/Source/LibJPEG/rdcolmap.c +253 -0
  188. data/vendor/FreeImage/Source/LibJPEG/rdgif.c +38 -0
  189. data/vendor/FreeImage/Source/LibJPEG/rdjpgcom.c +515 -0
  190. data/vendor/FreeImage/Source/LibJPEG/rdppm.c +459 -0
  191. data/vendor/FreeImage/Source/LibJPEG/rdrle.c +387 -0
  192. data/vendor/FreeImage/Source/LibJPEG/rdswitch.c +365 -0
  193. data/vendor/FreeImage/Source/LibJPEG/rdtarga.c +500 -0
  194. data/vendor/FreeImage/Source/LibJPEG/transupp.c +1763 -0
  195. data/vendor/FreeImage/Source/LibJPEG/transupp.h +219 -0
  196. data/vendor/FreeImage/Source/LibJPEG/wrbmp.c +442 -0
  197. data/vendor/FreeImage/Source/LibJPEG/wrgif.c +399 -0
  198. data/vendor/FreeImage/Source/LibJPEG/wrjpgcom.c +583 -0
  199. data/vendor/FreeImage/Source/LibJPEG/wrppm.c +269 -0
  200. data/vendor/FreeImage/Source/LibJPEG/wrrle.c +305 -0
  201. data/vendor/FreeImage/Source/LibJPEG/wrtarga.c +253 -0
  202. data/vendor/FreeImage/Source/LibJXR/common/include/guiddef.h +230 -0
  203. data/vendor/FreeImage/Source/LibJXR/common/include/wmsal.h +757 -0
  204. data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstring.h +342 -0
  205. data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstrings_adt.h +71 -0
  206. data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstrings_strict.h +1096 -0
  207. data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstrings_undef.h +406 -0
  208. data/vendor/FreeImage/Source/LibJXR/image/decode/JXRTranscode.c +987 -0
  209. data/vendor/FreeImage/Source/LibJXR/image/decode/decode.c +200 -0
  210. data/vendor/FreeImage/Source/LibJXR/image/decode/decode.h +143 -0
  211. data/vendor/FreeImage/Source/LibJXR/image/decode/postprocess.c +288 -0
  212. data/vendor/FreeImage/Source/LibJXR/image/decode/segdec.c +1205 -0
  213. data/vendor/FreeImage/Source/LibJXR/image/decode/strInvTransform.c +1888 -0
  214. data/vendor/FreeImage/Source/LibJXR/image/decode/strPredQuantDec.c +539 -0
  215. data/vendor/FreeImage/Source/LibJXR/image/decode/strdec.c +3628 -0
  216. data/vendor/FreeImage/Source/LibJXR/image/decode/strdec_x86.c +1640 -0
  217. data/vendor/FreeImage/Source/LibJXR/image/encode/encode.c +144 -0
  218. data/vendor/FreeImage/Source/LibJXR/image/encode/encode.h +113 -0
  219. data/vendor/FreeImage/Source/LibJXR/image/encode/segenc.c +1186 -0
  220. data/vendor/FreeImage/Source/LibJXR/image/encode/strFwdTransform.c +1111 -0
  221. data/vendor/FreeImage/Source/LibJXR/image/encode/strPredQuantEnc.c +511 -0
  222. data/vendor/FreeImage/Source/LibJXR/image/encode/strenc.c +2370 -0
  223. data/vendor/FreeImage/Source/LibJXR/image/encode/strenc_x86.c +409 -0
  224. data/vendor/FreeImage/Source/LibJXR/image/sys/adapthuff.c +511 -0
  225. data/vendor/FreeImage/Source/LibJXR/image/sys/ansi.h +61 -0
  226. data/vendor/FreeImage/Source/LibJXR/image/sys/common.h +131 -0
  227. data/vendor/FreeImage/Source/LibJXR/image/sys/image.c +183 -0
  228. data/vendor/FreeImage/Source/LibJXR/image/sys/perfTimer.h +115 -0
  229. data/vendor/FreeImage/Source/LibJXR/image/sys/perfTimerANSI.c +274 -0
  230. data/vendor/FreeImage/Source/LibJXR/image/sys/strPredQuant.c +306 -0
  231. data/vendor/FreeImage/Source/LibJXR/image/sys/strTransform.c +85 -0
  232. data/vendor/FreeImage/Source/LibJXR/image/sys/strTransform.h +50 -0
  233. data/vendor/FreeImage/Source/LibJXR/image/sys/strcodec.c +1251 -0
  234. data/vendor/FreeImage/Source/LibJXR/image/sys/strcodec.h +681 -0
  235. data/vendor/FreeImage/Source/LibJXR/image/sys/windowsmediaphoto.h +515 -0
  236. data/vendor/FreeImage/Source/LibJXR/image/sys/xplatform_image.h +84 -0
  237. data/vendor/FreeImage/Source/LibJXR/image/x86/x86.h +58 -0
  238. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGlue.c +930 -0
  239. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGlue.h +636 -0
  240. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGlueJxr.c +2246 -0
  241. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGluePFC.c +2338 -0
  242. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRMeta.c +905 -0
  243. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRMeta.h +258 -0
  244. data/vendor/FreeImage/Source/LibOpenJPEG/bio.c +188 -0
  245. data/vendor/FreeImage/Source/LibOpenJPEG/bio.h +128 -0
  246. data/vendor/FreeImage/Source/LibOpenJPEG/cidx_manager.c +239 -0
  247. data/vendor/FreeImage/Source/LibOpenJPEG/cidx_manager.h +68 -0
  248. data/vendor/FreeImage/Source/LibOpenJPEG/cio.c +644 -0
  249. data/vendor/FreeImage/Source/LibOpenJPEG/cio.h +393 -0
  250. data/vendor/FreeImage/Source/LibOpenJPEG/dwt.c +919 -0
  251. data/vendor/FreeImage/Source/LibOpenJPEG/dwt.h +116 -0
  252. data/vendor/FreeImage/Source/LibOpenJPEG/event.c +141 -0
  253. data/vendor/FreeImage/Source/LibOpenJPEG/event.h +97 -0
  254. data/vendor/FreeImage/Source/LibOpenJPEG/function_list.c +114 -0
  255. data/vendor/FreeImage/Source/LibOpenJPEG/function_list.h +126 -0
  256. data/vendor/FreeImage/Source/LibOpenJPEG/image.c +235 -0
  257. data/vendor/FreeImage/Source/LibOpenJPEG/image.h +63 -0
  258. data/vendor/FreeImage/Source/LibOpenJPEG/indexbox_manager.h +148 -0
  259. data/vendor/FreeImage/Source/LibOpenJPEG/invert.c +289 -0
  260. data/vendor/FreeImage/Source/LibOpenJPEG/invert.h +59 -0
  261. data/vendor/FreeImage/Source/LibOpenJPEG/j2k.c +10238 -0
  262. data/vendor/FreeImage/Source/LibOpenJPEG/j2k.h +838 -0
  263. data/vendor/FreeImage/Source/LibOpenJPEG/jp2.c +2776 -0
  264. data/vendor/FreeImage/Source/LibOpenJPEG/jp2.h +490 -0
  265. data/vendor/FreeImage/Source/LibOpenJPEG/mct.c +319 -0
  266. data/vendor/FreeImage/Source/LibOpenJPEG/mct.h +149 -0
  267. data/vendor/FreeImage/Source/LibOpenJPEG/mqc.c +604 -0
  268. data/vendor/FreeImage/Source/LibOpenJPEG/mqc.h +201 -0
  269. data/vendor/FreeImage/Source/LibOpenJPEG/openjpeg.c +955 -0
  270. data/vendor/FreeImage/Source/LibOpenJPEG/openjpeg.h +1475 -0
  271. data/vendor/FreeImage/Source/LibOpenJPEG/opj_clock.c +59 -0
  272. data/vendor/FreeImage/Source/LibOpenJPEG/opj_clock.h +54 -0
  273. data/vendor/FreeImage/Source/LibOpenJPEG/opj_codec.h +160 -0
  274. data/vendor/FreeImage/Source/LibOpenJPEG/opj_config.h +9 -0
  275. data/vendor/FreeImage/Source/LibOpenJPEG/opj_config_private.h +16 -0
  276. data/vendor/FreeImage/Source/LibOpenJPEG/opj_includes.h +175 -0
  277. data/vendor/FreeImage/Source/LibOpenJPEG/opj_intmath.h +172 -0
  278. data/vendor/FreeImage/Source/LibOpenJPEG/opj_inttypes.h +43 -0
  279. data/vendor/FreeImage/Source/LibOpenJPEG/opj_malloc.h +180 -0
  280. data/vendor/FreeImage/Source/LibOpenJPEG/opj_stdint.h +47 -0
  281. data/vendor/FreeImage/Source/LibOpenJPEG/phix_manager.c +191 -0
  282. data/vendor/FreeImage/Source/LibOpenJPEG/pi.c +1870 -0
  283. data/vendor/FreeImage/Source/LibOpenJPEG/pi.h +182 -0
  284. data/vendor/FreeImage/Source/LibOpenJPEG/ppix_manager.c +194 -0
  285. data/vendor/FreeImage/Source/LibOpenJPEG/raw.c +89 -0
  286. data/vendor/FreeImage/Source/LibOpenJPEG/raw.h +100 -0
  287. data/vendor/FreeImage/Source/LibOpenJPEG/t1.c +1751 -0
  288. data/vendor/FreeImage/Source/LibOpenJPEG/t1.h +157 -0
  289. data/vendor/FreeImage/Source/LibOpenJPEG/t1_generate_luts.c +276 -0
  290. data/vendor/FreeImage/Source/LibOpenJPEG/t1_luts.h +143 -0
  291. data/vendor/FreeImage/Source/LibOpenJPEG/t2.c +1334 -0
  292. data/vendor/FreeImage/Source/LibOpenJPEG/t2.h +127 -0
  293. data/vendor/FreeImage/Source/LibOpenJPEG/tcd.c +2123 -0
  294. data/vendor/FreeImage/Source/LibOpenJPEG/tcd.h +348 -0
  295. data/vendor/FreeImage/Source/LibOpenJPEG/tgt.c +331 -0
  296. data/vendor/FreeImage/Source/LibOpenJPEG/tgt.h +140 -0
  297. data/vendor/FreeImage/Source/LibOpenJPEG/thix_manager.c +134 -0
  298. data/vendor/FreeImage/Source/LibOpenJPEG/tpix_manager.c +185 -0
  299. data/vendor/FreeImage/Source/LibPNG/example.c +1061 -0
  300. data/vendor/FreeImage/Source/LibPNG/png.c +4493 -0
  301. data/vendor/FreeImage/Source/LibPNG/png.h +3282 -0
  302. data/vendor/FreeImage/Source/LibPNG/pngconf.h +644 -0
  303. data/vendor/FreeImage/Source/LibPNG/pngdebug.h +154 -0
  304. data/vendor/FreeImage/Source/LibPNG/pngerror.c +963 -0
  305. data/vendor/FreeImage/Source/LibPNG/pngget.c +1213 -0
  306. data/vendor/FreeImage/Source/LibPNG/pnginfo.h +260 -0
  307. data/vendor/FreeImage/Source/LibPNG/pnglibconf.h +218 -0
  308. data/vendor/FreeImage/Source/LibPNG/pngmem.c +281 -0
  309. data/vendor/FreeImage/Source/LibPNG/pngpread.c +1168 -0
  310. data/vendor/FreeImage/Source/LibPNG/pngpriv.h +1944 -0
  311. data/vendor/FreeImage/Source/LibPNG/pngread.c +4121 -0
  312. data/vendor/FreeImage/Source/LibPNG/pngrio.c +120 -0
  313. data/vendor/FreeImage/Source/LibPNG/pngrtran.c +4994 -0
  314. data/vendor/FreeImage/Source/LibPNG/pngrutil.c +4474 -0
  315. data/vendor/FreeImage/Source/LibPNG/pngset.c +1611 -0
  316. data/vendor/FreeImage/Source/LibPNG/pngstruct.h +489 -0
  317. data/vendor/FreeImage/Source/LibPNG/pngtest.c +2011 -0
  318. data/vendor/FreeImage/Source/LibPNG/pngtrans.c +849 -0
  319. data/vendor/FreeImage/Source/LibPNG/pngwio.c +168 -0
  320. data/vendor/FreeImage/Source/LibPNG/pngwrite.c +2455 -0
  321. data/vendor/FreeImage/Source/LibPNG/pngwtran.c +574 -0
  322. data/vendor/FreeImage/Source/LibPNG/pngwutil.c +3029 -0
  323. data/vendor/FreeImage/Source/LibRawLite/dcraw/dcraw.c +15462 -0
  324. data/vendor/FreeImage/Source/LibRawLite/internal/aahd_demosaic.cpp +706 -0
  325. data/vendor/FreeImage/Source/LibRawLite/internal/dcb_demosaicing.c +710 -0
  326. data/vendor/FreeImage/Source/LibRawLite/internal/dcraw_common.cpp +13593 -0
  327. data/vendor/FreeImage/Source/LibRawLite/internal/dcraw_fileio.cpp +240 -0
  328. data/vendor/FreeImage/Source/LibRawLite/internal/defines.h +167 -0
  329. data/vendor/FreeImage/Source/LibRawLite/internal/demosaic_packs.cpp +99 -0
  330. data/vendor/FreeImage/Source/LibRawLite/internal/dht_demosaic.cpp +873 -0
  331. data/vendor/FreeImage/Source/LibRawLite/internal/libraw_internal_funcs.h +282 -0
  332. data/vendor/FreeImage/Source/LibRawLite/internal/libraw_x3f.cpp +1919 -0
  333. data/vendor/FreeImage/Source/LibRawLite/internal/var_defines.h +216 -0
  334. data/vendor/FreeImage/Source/LibRawLite/internal/wf_filtering.cpp +1950 -0
  335. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw.h +338 -0
  336. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_alloc.h +99 -0
  337. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_const.h +233 -0
  338. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_datastream.h +238 -0
  339. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_internal.h +225 -0
  340. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_types.h +442 -0
  341. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_version.h +62 -0
  342. data/vendor/FreeImage/Source/LibRawLite/src/libraw_c_api.cpp +230 -0
  343. data/vendor/FreeImage/Source/LibRawLite/src/libraw_cxx.cpp +4533 -0
  344. data/vendor/FreeImage/Source/LibRawLite/src/libraw_datastream.cpp +703 -0
  345. data/vendor/FreeImage/Source/LibTIFF4/mkg3states.c +451 -0
  346. data/vendor/FreeImage/Source/LibTIFF4/mkspans.c +82 -0
  347. data/vendor/FreeImage/Source/LibTIFF4/t4.h +292 -0
  348. data/vendor/FreeImage/Source/LibTIFF4/tif_aux.c +358 -0
  349. data/vendor/FreeImage/Source/LibTIFF4/tif_close.c +140 -0
  350. data/vendor/FreeImage/Source/LibTIFF4/tif_codec.c +166 -0
  351. data/vendor/FreeImage/Source/LibTIFF4/tif_color.c +287 -0
  352. data/vendor/FreeImage/Source/LibTIFF4/tif_compress.c +304 -0
  353. data/vendor/FreeImage/Source/LibTIFF4/tif_config.h +97 -0
  354. data/vendor/FreeImage/Source/LibTIFF4/tif_config.vc.h +74 -0
  355. data/vendor/FreeImage/Source/LibTIFF4/tif_config.wince.h +71 -0
  356. data/vendor/FreeImage/Source/LibTIFF4/tif_dir.c +1700 -0
  357. data/vendor/FreeImage/Source/LibTIFF4/tif_dir.h +308 -0
  358. data/vendor/FreeImage/Source/LibTIFF4/tif_dirinfo.c +959 -0
  359. data/vendor/FreeImage/Source/LibTIFF4/tif_dirread.c +5640 -0
  360. data/vendor/FreeImage/Source/LibTIFF4/tif_dirwrite.c +2910 -0
  361. data/vendor/FreeImage/Source/LibTIFF4/tif_dumpmode.c +143 -0
  362. data/vendor/FreeImage/Source/LibTIFF4/tif_error.c +80 -0
  363. data/vendor/FreeImage/Source/LibTIFF4/tif_extension.c +118 -0
  364. data/vendor/FreeImage/Source/LibTIFF4/tif_fax3.c +1595 -0
  365. data/vendor/FreeImage/Source/LibTIFF4/tif_fax3.h +538 -0
  366. data/vendor/FreeImage/Source/LibTIFF4/tif_fax3sm.c +1260 -0
  367. data/vendor/FreeImage/Source/LibTIFF4/tif_flush.c +118 -0
  368. data/vendor/FreeImage/Source/LibTIFF4/tif_getimage.c +2890 -0
  369. data/vendor/FreeImage/Source/LibTIFF4/tif_jbig.c +213 -0
  370. data/vendor/FreeImage/Source/LibTIFF4/tif_jpeg.c +2354 -0
  371. data/vendor/FreeImage/Source/LibTIFF4/tif_jpeg_12.c +65 -0
  372. data/vendor/FreeImage/Source/LibTIFF4/tif_luv.c +1683 -0
  373. data/vendor/FreeImage/Source/LibTIFF4/tif_lzma.c +495 -0
  374. data/vendor/FreeImage/Source/LibTIFF4/tif_lzw.c +1169 -0
  375. data/vendor/FreeImage/Source/LibTIFF4/tif_next.c +181 -0
  376. data/vendor/FreeImage/Source/LibTIFF4/tif_ojpeg.c +2501 -0
  377. data/vendor/FreeImage/Source/LibTIFF4/tif_open.c +725 -0
  378. data/vendor/FreeImage/Source/LibTIFF4/tif_packbits.c +300 -0
  379. data/vendor/FreeImage/Source/LibTIFF4/tif_pixarlog.c +1442 -0
  380. data/vendor/FreeImage/Source/LibTIFF4/tif_predict.c +764 -0
  381. data/vendor/FreeImage/Source/LibTIFF4/tif_predict.h +77 -0
  382. data/vendor/FreeImage/Source/LibTIFF4/tif_print.c +716 -0
  383. data/vendor/FreeImage/Source/LibTIFF4/tif_read.c +1086 -0
  384. data/vendor/FreeImage/Source/LibTIFF4/tif_strip.c +383 -0
  385. data/vendor/FreeImage/Source/LibTIFF4/tif_swab.c +310 -0
  386. data/vendor/FreeImage/Source/LibTIFF4/tif_thunder.c +207 -0
  387. data/vendor/FreeImage/Source/LibTIFF4/tif_tile.c +299 -0
  388. data/vendor/FreeImage/Source/LibTIFF4/tif_unix.c +325 -0
  389. data/vendor/FreeImage/Source/LibTIFF4/tif_version.c +40 -0
  390. data/vendor/FreeImage/Source/LibTIFF4/tif_vms.c +603 -0
  391. data/vendor/FreeImage/Source/LibTIFF4/tif_warning.c +81 -0
  392. data/vendor/FreeImage/Source/LibTIFF4/tif_win32.c +443 -0
  393. data/vendor/FreeImage/Source/LibTIFF4/tif_wince.c +293 -0
  394. data/vendor/FreeImage/Source/LibTIFF4/tif_write.c +771 -0
  395. data/vendor/FreeImage/Source/LibTIFF4/tif_zip.c +472 -0
  396. data/vendor/FreeImage/Source/LibTIFF4/tiff.h +681 -0
  397. data/vendor/FreeImage/Source/LibTIFF4/tiffconf.h +170 -0
  398. data/vendor/FreeImage/Source/LibTIFF4/tiffconf.vc.h +160 -0
  399. data/vendor/FreeImage/Source/LibTIFF4/tiffconf.wince.h +121 -0
  400. data/vendor/FreeImage/Source/LibTIFF4/tiffio.h +557 -0
  401. data/vendor/FreeImage/Source/LibTIFF4/tiffiop.h +367 -0
  402. data/vendor/FreeImage/Source/LibTIFF4/tiffvers.h +9 -0
  403. data/vendor/FreeImage/Source/LibTIFF4/uvcode.h +180 -0
  404. data/vendor/FreeImage/Source/LibWebP/src/dec/alphai.h +55 -0
  405. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.alpha.c +167 -0
  406. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.buffer.c +249 -0
  407. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.frame.c +827 -0
  408. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.idec.c +857 -0
  409. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.io.c +640 -0
  410. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.quant.c +110 -0
  411. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.tree.c +525 -0
  412. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.vp8.c +663 -0
  413. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.vp8l.c +1584 -0
  414. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.webp.c +834 -0
  415. data/vendor/FreeImage/Source/LibWebP/src/dec/decode_vp8.h +185 -0
  416. data/vendor/FreeImage/Source/LibWebP/src/dec/vp8i.h +353 -0
  417. data/vendor/FreeImage/Source/LibWebP/src/dec/vp8li.h +136 -0
  418. data/vendor/FreeImage/Source/LibWebP/src/dec/webpi.h +120 -0
  419. data/vendor/FreeImage/Source/LibWebP/src/demux/demux.demux.c +957 -0
  420. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.alpha_processing.c +377 -0
  421. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.alpha_processing_mips_dsp_r2.c +139 -0
  422. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.alpha_processing_sse2.c +296 -0
  423. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.argb.c +68 -0
  424. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.argb_mips_dsp_r2.c +108 -0
  425. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.argb_sse2.c +62 -0
  426. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost.c +412 -0
  427. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost_mips32.c +154 -0
  428. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost_mips_dsp_r2.c +107 -0
  429. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost_sse2.c +121 -0
  430. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cpu.c +138 -0
  431. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec.c +760 -0
  432. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_clip_tables.c +366 -0
  433. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_mips32.c +585 -0
  434. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_mips_dsp_r2.c +992 -0
  435. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_neon.c +1489 -0
  436. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_sse2.c +1284 -0
  437. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc.c +788 -0
  438. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_avx2.c +24 -0
  439. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_mips32.c +670 -0
  440. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_mips_dsp_r2.c +1510 -0
  441. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_neon.c +932 -0
  442. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_sse2.c +940 -0
  443. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.filters.c +240 -0
  444. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.filters_mips_dsp_r2.c +404 -0
  445. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.filters_sse2.c +349 -0
  446. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.h +434 -0
  447. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless.c +1838 -0
  448. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_mips32.c +416 -0
  449. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_mips_dsp_r2.c +921 -0
  450. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_neon.c +357 -0
  451. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_sse2.c +535 -0
  452. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.rescaler.c +115 -0
  453. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.rescaler_mips32.c +192 -0
  454. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.rescaler_mips_dsp_r2.c +210 -0
  455. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling.c +252 -0
  456. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling_mips_dsp_r2.c +280 -0
  457. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling_neon.c +267 -0
  458. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling_sse2.c +214 -0
  459. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv.c +166 -0
  460. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv_mips32.c +100 -0
  461. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv_mips_dsp_r2.c +131 -0
  462. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv_sse2.c +322 -0
  463. data/vendor/FreeImage/Source/LibWebP/src/dsp/lossless.h +313 -0
  464. data/vendor/FreeImage/Source/LibWebP/src/dsp/mips_macro.h +200 -0
  465. data/vendor/FreeImage/Source/LibWebP/src/dsp/neon.h +82 -0
  466. data/vendor/FreeImage/Source/LibWebP/src/dsp/yuv.h +321 -0
  467. data/vendor/FreeImage/Source/LibWebP/src/dsp/yuv_tables_sse2.h +536 -0
  468. data/vendor/FreeImage/Source/LibWebP/src/enc/backward_references.h +202 -0
  469. data/vendor/FreeImage/Source/LibWebP/src/enc/cost.h +69 -0
  470. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.alpha.c +440 -0
  471. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.analysis.c +501 -0
  472. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.backward_references.c +1076 -0
  473. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.config.c +163 -0
  474. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.cost.c +355 -0
  475. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.filter.c +296 -0
  476. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.frame.c +850 -0
  477. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.histogram.c +897 -0
  478. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.iterator.c +456 -0
  479. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.near_lossless.c +160 -0
  480. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture.c +290 -0
  481. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_csp.c +1100 -0
  482. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_psnr.c +150 -0
  483. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_rescale.c +285 -0
  484. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_tools.c +206 -0
  485. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.quant.c +1191 -0
  486. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.syntax.c +383 -0
  487. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.token.c +285 -0
  488. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.tree.c +504 -0
  489. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.vp8l.c +1437 -0
  490. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.webpenc.c +379 -0
  491. data/vendor/FreeImage/Source/LibWebP/src/enc/histogram.h +114 -0
  492. data/vendor/FreeImage/Source/LibWebP/src/enc/vp8enci.h +551 -0
  493. data/vendor/FreeImage/Source/LibWebP/src/enc/vp8li.h +78 -0
  494. data/vendor/FreeImage/Source/LibWebP/src/mux/mux.anim_encode.c +1241 -0
  495. data/vendor/FreeImage/Source/LibWebP/src/mux/mux.muxedit.c +696 -0
  496. data/vendor/FreeImage/Source/LibWebP/src/mux/mux.muxinternal.c +551 -0
  497. data/vendor/FreeImage/Source/LibWebP/src/mux/mux.muxread.c +544 -0
  498. data/vendor/FreeImage/Source/LibWebP/src/mux/muxi.h +232 -0
  499. data/vendor/FreeImage/Source/LibWebP/src/utils/bit_reader.h +168 -0
  500. data/vendor/FreeImage/Source/LibWebP/src/utils/bit_reader_inl.h +172 -0
  501. data/vendor/FreeImage/Source/LibWebP/src/utils/bit_writer.h +120 -0
  502. data/vendor/FreeImage/Source/LibWebP/src/utils/color_cache.h +74 -0
  503. data/vendor/FreeImage/Source/LibWebP/src/utils/endian_inl.h +100 -0
  504. data/vendor/FreeImage/Source/LibWebP/src/utils/filters.h +32 -0
  505. data/vendor/FreeImage/Source/LibWebP/src/utils/huffman.h +67 -0
  506. data/vendor/FreeImage/Source/LibWebP/src/utils/huffman_encode.h +60 -0
  507. data/vendor/FreeImage/Source/LibWebP/src/utils/quant_levels.h +36 -0
  508. data/vendor/FreeImage/Source/LibWebP/src/utils/quant_levels_dec.h +35 -0
  509. data/vendor/FreeImage/Source/LibWebP/src/utils/random.h +63 -0
  510. data/vendor/FreeImage/Source/LibWebP/src/utils/rescaler.h +78 -0
  511. data/vendor/FreeImage/Source/LibWebP/src/utils/thread.h +93 -0
  512. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.bit_reader.c +208 -0
  513. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.bit_writer.c +308 -0
  514. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.color_cache.c +49 -0
  515. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.filters.c +76 -0
  516. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.h +121 -0
  517. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.huffman.c +205 -0
  518. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.huffman_encode.c +417 -0
  519. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.quant_levels.c +140 -0
  520. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.quant_levels_dec.c +279 -0
  521. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.random.c +43 -0
  522. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.rescaler.c +82 -0
  523. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.thread.c +309 -0
  524. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.utils.c +211 -0
  525. data/vendor/FreeImage/Source/LibWebP/src/webp/decode.h +493 -0
  526. data/vendor/FreeImage/Source/LibWebP/src/webp/demux.h +224 -0
  527. data/vendor/FreeImage/Source/LibWebP/src/webp/encode.h +515 -0
  528. data/vendor/FreeImage/Source/LibWebP/src/webp/format_constants.h +88 -0
  529. data/vendor/FreeImage/Source/LibWebP/src/webp/mux.h +507 -0
  530. data/vendor/FreeImage/Source/LibWebP/src/webp/mux_types.h +97 -0
  531. data/vendor/FreeImage/Source/LibWebP/src/webp/types.h +52 -0
  532. data/vendor/FreeImage/Source/MapIntrospector.h +212 -0
  533. data/vendor/FreeImage/Source/Metadata/Exif.cpp +1253 -0
  534. data/vendor/FreeImage/Source/Metadata/FIRational.cpp +176 -0
  535. data/vendor/FreeImage/Source/Metadata/FIRational.h +108 -0
  536. data/vendor/FreeImage/Source/Metadata/FreeImageTag.cpp +353 -0
  537. data/vendor/FreeImage/Source/Metadata/FreeImageTag.h +500 -0
  538. data/vendor/FreeImage/Source/Metadata/IPTC.cpp +342 -0
  539. data/vendor/FreeImage/Source/Metadata/TagConversion.cpp +1094 -0
  540. data/vendor/FreeImage/Source/Metadata/TagLib.cpp +1618 -0
  541. data/vendor/FreeImage/Source/Metadata/XTIFF.cpp +766 -0
  542. data/vendor/FreeImage/Source/OpenEXR/Half/eLut.cpp +114 -0
  543. data/vendor/FreeImage/Source/OpenEXR/Half/eLut.h +71 -0
  544. data/vendor/FreeImage/Source/OpenEXR/Half/half.cpp +310 -0
  545. data/vendor/FreeImage/Source/OpenEXR/Half/half.h +757 -0
  546. data/vendor/FreeImage/Source/OpenEXR/Half/halfExport.h +27 -0
  547. data/vendor/FreeImage/Source/OpenEXR/Half/halfFunction.h +179 -0
  548. data/vendor/FreeImage/Source/OpenEXR/Half/halfLimits.h +102 -0
  549. data/vendor/FreeImage/Source/OpenEXR/Half/toFloat.cpp +164 -0
  550. data/vendor/FreeImage/Source/OpenEXR/Half/toFloat.h +16391 -0
  551. data/vendor/FreeImage/Source/OpenEXR/Iex/Iex.h +60 -0
  552. data/vendor/FreeImage/Source/OpenEXR/Iex/IexBaseExc.cpp +156 -0
  553. data/vendor/FreeImage/Source/OpenEXR/Iex/IexBaseExc.h +264 -0
  554. data/vendor/FreeImage/Source/OpenEXR/Iex/IexErrnoExc.h +208 -0
  555. data/vendor/FreeImage/Source/OpenEXR/Iex/IexExport.h +51 -0
  556. data/vendor/FreeImage/Source/OpenEXR/Iex/IexForward.h +229 -0
  557. data/vendor/FreeImage/Source/OpenEXR/Iex/IexMacros.h +170 -0
  558. data/vendor/FreeImage/Source/OpenEXR/Iex/IexMathExc.h +57 -0
  559. data/vendor/FreeImage/Source/OpenEXR/Iex/IexNamespace.h +112 -0
  560. data/vendor/FreeImage/Source/OpenEXR/Iex/IexThrowErrnoExc.cpp +873 -0
  561. data/vendor/FreeImage/Source/OpenEXR/Iex/IexThrowErrnoExc.h +97 -0
  562. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFloatExc.cpp +113 -0
  563. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFloatExc.h +146 -0
  564. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFpu.cpp +530 -0
  565. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFpu.h +91 -0
  566. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathIeeeExc.h +62 -0
  567. data/vendor/FreeImage/Source/OpenEXR/IlmBaseConfig.h +61 -0
  568. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAcesFile.cpp +633 -0
  569. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAcesFile.h +324 -0
  570. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfArray.h +285 -0
  571. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAttribute.cpp +158 -0
  572. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAttribute.h +407 -0
  573. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAutoArray.h +95 -0
  574. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfB44Compressor.cpp +1072 -0
  575. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfB44Compressor.h +118 -0
  576. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfBoxAttribute.cpp +111 -0
  577. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfBoxAttribute.h +87 -0
  578. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCRgbaFile.cpp +1438 -0
  579. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCRgbaFile.h +555 -0
  580. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelList.cpp +322 -0
  581. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelList.h +436 -0
  582. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelListAttribute.cpp +150 -0
  583. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelListAttribute.h +74 -0
  584. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCheckedArithmetic.h +163 -0
  585. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticities.cpp +151 -0
  586. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticities.h +131 -0
  587. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticitiesAttribute.cpp +87 -0
  588. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticitiesAttribute.h +73 -0
  589. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompositeDeepScanLine.cpp +591 -0
  590. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompositeDeepScanLine.h +142 -0
  591. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompression.h +84 -0
  592. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressionAttribute.cpp +78 -0
  593. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressionAttribute.h +64 -0
  594. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressor.cpp +226 -0
  595. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressor.h +265 -0
  596. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfConvert.cpp +143 -0
  597. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfConvert.h +107 -0
  598. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepCompositing.cpp +110 -0
  599. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepCompositing.h +132 -0
  600. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepFrameBuffer.cpp +230 -0
  601. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepFrameBuffer.h +339 -0
  602. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepImageState.h +96 -0
  603. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepImageStateAttribute.cpp +78 -0
  604. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepImageStateAttribute.h +68 -0
  605. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputFile.cpp +2025 -0
  606. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputFile.h +276 -0
  607. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputPart.cpp +149 -0
  608. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputPart.h +181 -0
  609. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputFile.cpp +1552 -0
  610. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputFile.h +244 -0
  611. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputPart.cpp +107 -0
  612. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputPart.h +168 -0
  613. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputFile.cpp +1979 -0
  614. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputFile.h +437 -0
  615. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputPart.cpp +273 -0
  616. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputPart.h +362 -0
  617. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputFile.cpp +2055 -0
  618. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputFile.h +475 -0
  619. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputPart.cpp +250 -0
  620. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputPart.h +394 -0
  621. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDoubleAttribute.cpp +57 -0
  622. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDoubleAttribute.h +59 -0
  623. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDwaCompressor.cpp +3424 -0
  624. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDwaCompressor.h +210 -0
  625. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDwaCompressorSimd.h +2145 -0
  626. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmap.cpp +335 -0
  627. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmap.h +336 -0
  628. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmapAttribute.cpp +76 -0
  629. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmapAttribute.h +68 -0
  630. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfExport.h +46 -0
  631. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFastHuf.cpp +768 -0
  632. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFastHuf.h +148 -0
  633. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatAttribute.cpp +57 -0
  634. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatAttribute.h +58 -0
  635. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatVectorAttribute.cpp +84 -0
  636. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatVectorAttribute.h +76 -0
  637. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfForward.h +127 -0
  638. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFrameBuffer.cpp +228 -0
  639. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFrameBuffer.h +386 -0
  640. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFramesPerSecond.cpp +76 -0
  641. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFramesPerSecond.h +94 -0
  642. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericInputFile.cpp +76 -0
  643. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericInputFile.h +58 -0
  644. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericOutputFile.cpp +112 -0
  645. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericOutputFile.h +62 -0
  646. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHeader.cpp +1283 -0
  647. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHeader.h +699 -0
  648. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHuf.cpp +1114 -0
  649. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHuf.h +82 -0
  650. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIO.cpp +110 -0
  651. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIO.h +255 -0
  652. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputFile.cpp +895 -0
  653. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputFile.h +240 -0
  654. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPart.cpp +114 -0
  655. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPart.h +84 -0
  656. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPartData.cpp +51 -0
  657. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPartData.h +69 -0
  658. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputStreamMutex.h +68 -0
  659. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInt64.h +56 -0
  660. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIntAttribute.cpp +57 -0
  661. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIntAttribute.h +58 -0
  662. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCode.cpp +217 -0
  663. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCode.h +167 -0
  664. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCodeAttribute.cpp +99 -0
  665. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCodeAttribute.h +73 -0
  666. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLineOrder.h +69 -0
  667. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLineOrderAttribute.cpp +78 -0
  668. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLineOrderAttribute.h +72 -0
  669. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLut.cpp +178 -0
  670. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLut.h +188 -0
  671. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMatrixAttribute.cpp +263 -0
  672. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMatrixAttribute.h +83 -0
  673. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMisc.cpp +1872 -0
  674. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMisc.h +466 -0
  675. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartInputFile.cpp +783 -0
  676. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartInputFile.h +128 -0
  677. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartOutputFile.cpp +519 -0
  678. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartOutputFile.h +118 -0
  679. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiView.cpp +435 -0
  680. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiView.h +187 -0
  681. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfName.h +150 -0
  682. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfNamespace.h +115 -0
  683. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOpaqueAttribute.cpp +126 -0
  684. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOpaqueAttribute.h +110 -0
  685. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOptimizedPixelReading.h +646 -0
  686. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputFile.cpp +1378 -0
  687. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputFile.h +263 -0
  688. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPart.cpp +105 -0
  689. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPart.h +77 -0
  690. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPartData.cpp +52 -0
  691. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPartData.h +62 -0
  692. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputStreamMutex.h +70 -0
  693. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPartHelper.h +262 -0
  694. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPartType.cpp +63 -0
  695. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPartType.h +62 -0
  696. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPixelType.h +67 -0
  697. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPizCompressor.cpp +667 -0
  698. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPizCompressor.h +117 -0
  699. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImage.cpp +104 -0
  700. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImage.h +135 -0
  701. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImageAttribute.cpp +103 -0
  702. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImageAttribute.h +70 -0
  703. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPxr24Compressor.cpp +553 -0
  704. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPxr24Compressor.h +109 -0
  705. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRational.cpp +127 -0
  706. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRational.h +98 -0
  707. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRationalAttribute.cpp +74 -0
  708. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRationalAttribute.h +69 -0
  709. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgba.h +109 -0
  710. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaFile.cpp +1405 -0
  711. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaFile.h +346 -0
  712. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaYca.cpp +497 -0
  713. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaYca.h +259 -0
  714. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRle.cpp +157 -0
  715. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRle.h +63 -0
  716. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRleCompressor.cpp +220 -0
  717. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRleCompressor.h +80 -0
  718. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfScanLineInputFile.cpp +1702 -0
  719. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfScanLineInputFile.h +210 -0
  720. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfSimd.h +59 -0
  721. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStandardAttributes.cpp +125 -0
  722. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStandardAttributes.h +382 -0
  723. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStdIO.cpp +242 -0
  724. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStdIO.h +160 -0
  725. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringAttribute.cpp +80 -0
  726. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringAttribute.h +71 -0
  727. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringVectorAttribute.cpp +100 -0
  728. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringVectorAttribute.h +74 -0
  729. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfSystemSpecific.cpp +129 -0
  730. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfSystemSpecific.h +172 -0
  731. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTestFile.cpp +216 -0
  732. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTestFile.h +97 -0
  733. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfThreading.cpp +62 -0
  734. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfThreading.h +95 -0
  735. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileDescription.h +107 -0
  736. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileDescriptionAttribute.cpp +86 -0
  737. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileDescriptionAttribute.h +72 -0
  738. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileOffsets.cpp +552 -0
  739. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileOffsets.h +125 -0
  740. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputFile.cpp +1533 -0
  741. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputFile.h +401 -0
  742. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputPart.cpp +208 -0
  743. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputPart.h +100 -0
  744. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledMisc.cpp +389 -0
  745. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledMisc.h +106 -0
  746. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputFile.cpp +1841 -0
  747. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputFile.h +495 -0
  748. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputPart.cpp +228 -0
  749. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputPart.h +105 -0
  750. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledRgbaFile.cpp +1163 -0
  751. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledRgbaFile.h +482 -0
  752. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCode.cpp +431 -0
  753. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCode.h +242 -0
  754. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCodeAttribute.cpp +79 -0
  755. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCodeAttribute.h +74 -0
  756. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVecAttribute.cpp +217 -0
  757. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVecAttribute.h +100 -0
  758. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVersion.cpp +60 -0
  759. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVersion.h +136 -0
  760. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfWav.cpp +391 -0
  761. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfWav.h +78 -0
  762. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfXdr.h +927 -0
  763. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZip.cpp +196 -0
  764. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZip.h +78 -0
  765. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZipCompressor.cpp +127 -0
  766. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZipCompressor.h +89 -0
  767. data/vendor/FreeImage/Source/OpenEXR/IlmImf/b44ExpLogTable.cpp +136 -0
  768. data/vendor/FreeImage/Source/OpenEXR/IlmImf/b44ExpLogTable.h +16396 -0
  769. data/vendor/FreeImage/Source/OpenEXR/IlmImf/dwaLookups.cpp +573 -0
  770. data/vendor/FreeImage/Source/OpenEXR/IlmImf/dwaLookups.h +98334 -0
  771. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThread.cpp +80 -0
  772. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThread.h +143 -0
  773. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadExport.h +46 -0
  774. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadForward.h +52 -0
  775. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutex.cpp +59 -0
  776. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutex.h +160 -0
  777. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutexPosix.cpp +85 -0
  778. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutexWin32.cpp +79 -0
  779. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadNamespace.h +114 -0
  780. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadPool.cpp +483 -0
  781. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadPool.h +160 -0
  782. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadPosix.cpp +98 -0
  783. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphore.cpp +60 -0
  784. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphore.h +112 -0
  785. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphorePosix.cpp +106 -0
  786. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphorePosixCompat.cpp +155 -0
  787. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphoreWin32.cpp +153 -0
  788. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadWin32.cpp +100 -0
  789. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathBox.cpp +37 -0
  790. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathBox.h +849 -0
  791. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathBoxAlgo.h +1016 -0
  792. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathColor.h +736 -0
  793. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathColorAlgo.cpp +178 -0
  794. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathColorAlgo.h +257 -0
  795. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathEuler.h +926 -0
  796. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathExc.h +73 -0
  797. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathExport.h +46 -0
  798. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathForward.h +72 -0
  799. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFrame.h +192 -0
  800. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFrustum.h +741 -0
  801. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFrustumTest.h +417 -0
  802. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFun.cpp +181 -0
  803. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFun.h +269 -0
  804. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathGL.h +166 -0
  805. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathGLU.h +54 -0
  806. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathHalfLimits.h +68 -0
  807. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathInt64.h +62 -0
  808. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathInterval.h +226 -0
  809. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathLimits.h +268 -0
  810. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathLine.h +185 -0
  811. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathLineAlgo.h +288 -0
  812. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMath.h +208 -0
  813. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMatrix.h +3441 -0
  814. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMatrixAlgo.cpp +1252 -0
  815. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMatrixAlgo.h +1425 -0
  816. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathNamespace.h +115 -0
  817. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathPlane.h +257 -0
  818. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathPlatform.h +112 -0
  819. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathQuat.h +964 -0
  820. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathRandom.cpp +194 -0
  821. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathRandom.h +401 -0
  822. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathRoots.h +219 -0
  823. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathShear.cpp +54 -0
  824. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathShear.h +656 -0
  825. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathSphere.h +177 -0
  826. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathVec.cpp +583 -0
  827. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathVec.h +2227 -0
  828. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathVecAlgo.h +147 -0
  829. data/vendor/FreeImage/Source/OpenEXR/OpenEXRConfig.h +72 -0
  830. data/vendor/FreeImage/Source/Plugin.h +144 -0
  831. data/vendor/FreeImage/Source/Quantizers.h +354 -0
  832. data/vendor/FreeImage/Source/ToneMapping.h +44 -0
  833. data/vendor/FreeImage/Source/Utilities.h +516 -0
  834. data/vendor/FreeImage/Source/ZLib/adler32.c +179 -0
  835. data/vendor/FreeImage/Source/ZLib/compress.c +80 -0
  836. data/vendor/FreeImage/Source/ZLib/crc32.c +425 -0
  837. data/vendor/FreeImage/Source/ZLib/crc32.h +441 -0
  838. data/vendor/FreeImage/Source/ZLib/deflate.c +1967 -0
  839. data/vendor/FreeImage/Source/ZLib/deflate.h +346 -0
  840. data/vendor/FreeImage/Source/ZLib/gzclose.c +25 -0
  841. data/vendor/FreeImage/Source/ZLib/gzguts.h +209 -0
  842. data/vendor/FreeImage/Source/ZLib/gzlib.c +634 -0
  843. data/vendor/FreeImage/Source/ZLib/gzread.c +594 -0
  844. data/vendor/FreeImage/Source/ZLib/gzwrite.c +577 -0
  845. data/vendor/FreeImage/Source/ZLib/infback.c +640 -0
  846. data/vendor/FreeImage/Source/ZLib/inffast.c +340 -0
  847. data/vendor/FreeImage/Source/ZLib/inffast.h +11 -0
  848. data/vendor/FreeImage/Source/ZLib/inffixed.h +94 -0
  849. data/vendor/FreeImage/Source/ZLib/inflate.c +1512 -0
  850. data/vendor/FreeImage/Source/ZLib/inflate.h +122 -0
  851. data/vendor/FreeImage/Source/ZLib/inftrees.c +306 -0
  852. data/vendor/FreeImage/Source/ZLib/inftrees.h +62 -0
  853. data/vendor/FreeImage/Source/ZLib/trees.c +1226 -0
  854. data/vendor/FreeImage/Source/ZLib/trees.h +128 -0
  855. data/vendor/FreeImage/Source/ZLib/uncompr.c +59 -0
  856. data/vendor/FreeImage/Source/ZLib/zconf.h +511 -0
  857. data/vendor/FreeImage/Source/ZLib/zlib.h +1768 -0
  858. data/vendor/FreeImage/Source/ZLib/zutil.c +324 -0
  859. data/vendor/FreeImage/Source/ZLib/zutil.h +253 -0
  860. metadata +931 -0
@@ -0,0 +1,1076 @@
1
+ // Copyright 2012 Google Inc. All Rights Reserved.
2
+ //
3
+ // Use of this source code is governed by a BSD-style license
4
+ // that can be found in the COPYING file in the root of the source
5
+ // tree. An additional intellectual property rights grant can be found
6
+ // in the file PATENTS. All contributing project authors may
7
+ // be found in the AUTHORS file in the root of the source tree.
8
+ // -----------------------------------------------------------------------------
9
+ //
10
+ // Author: Jyrki Alakuijala (jyrki@google.com)
11
+ //
12
+
13
+ #include <assert.h>
14
+ #include <math.h>
15
+
16
+ #include "./backward_references.h"
17
+ #include "./histogram.h"
18
+ #include "../dsp/lossless.h"
19
+ #include "../utils/color_cache.h"
20
+ #include "../utils/utils.h"
21
+
22
+ #define VALUES_IN_BYTE 256
23
+
24
+ #define HASH_MULTIPLIER (0xc6a4a7935bd1e995ULL)
25
+
26
+ #define MIN_BLOCK_SIZE 256 // minimum block size for backward references
27
+
28
+ #define MAX_ENTROPY (1e30f)
29
+
30
+ // 1M window (4M bytes) minus 120 special codes for short distances.
31
+ #define WINDOW_SIZE ((1 << 20) - 120)
32
+
33
+ // Bounds for the match length.
34
+ #define MIN_LENGTH 2
35
+ #define MAX_LENGTH 4096
36
+
37
+ // -----------------------------------------------------------------------------
38
+
39
+ static const uint8_t plane_to_code_lut[128] = {
40
+ 96, 73, 55, 39, 23, 13, 5, 1, 255, 255, 255, 255, 255, 255, 255, 255,
41
+ 101, 78, 58, 42, 26, 16, 8, 2, 0, 3, 9, 17, 27, 43, 59, 79,
42
+ 102, 86, 62, 46, 32, 20, 10, 6, 4, 7, 11, 21, 33, 47, 63, 87,
43
+ 105, 90, 70, 52, 37, 28, 18, 14, 12, 15, 19, 29, 38, 53, 71, 91,
44
+ 110, 99, 82, 66, 48, 35, 30, 24, 22, 25, 31, 36, 49, 67, 83, 100,
45
+ 115, 108, 94, 76, 64, 50, 44, 40, 34, 41, 45, 51, 65, 77, 95, 109,
46
+ 118, 113, 103, 92, 80, 68, 60, 56, 54, 57, 61, 69, 81, 93, 104, 114,
47
+ 119, 116, 111, 106, 97, 88, 84, 74, 72, 75, 85, 89, 98, 107, 112, 117
48
+ };
49
+
50
+ static int DistanceToPlaneCode(int xsize, int dist) {
51
+ const int yoffset = dist / xsize;
52
+ const int xoffset = dist - yoffset * xsize;
53
+ if (xoffset <= 8 && yoffset < 8) {
54
+ return plane_to_code_lut[yoffset * 16 + 8 - xoffset] + 1;
55
+ } else if (xoffset > xsize - 8 && yoffset < 7) {
56
+ return plane_to_code_lut[(yoffset + 1) * 16 + 8 + (xsize - xoffset)] + 1;
57
+ }
58
+ return dist + 120;
59
+ }
60
+
61
+ // TODO(vikasa): Evaluate loading (and comparing) 32/64 bits for the inner while
62
+ // loop.
63
+ static WEBP_INLINE int FindMatchLength(const uint32_t* const array1,
64
+ const uint32_t* const array2,
65
+ int best_len_match,
66
+ int max_limit) {
67
+ int match_len = 0;
68
+ // Before 'expensive' linear match, check if the two arrays match at the
69
+ // current best length index.
70
+ if (array1[best_len_match] != array2[best_len_match]) return 0;
71
+ while (match_len < max_limit && array1[match_len] == array2[match_len]) {
72
+ ++match_len;
73
+ }
74
+ return match_len;
75
+ }
76
+
77
+ // -----------------------------------------------------------------------------
78
+ // VP8LBackwardRefs
79
+
80
+ struct PixOrCopyBlock {
81
+ PixOrCopyBlock* next_; // next block (or NULL)
82
+ PixOrCopy* start_; // data start
83
+ int size_; // currently used size
84
+ };
85
+
86
+ static void ClearBackwardRefs(VP8LBackwardRefs* const refs) {
87
+ assert(refs != NULL);
88
+ if (refs->tail_ != NULL) {
89
+ *refs->tail_ = refs->free_blocks_; // recycle all blocks at once
90
+ }
91
+ refs->free_blocks_ = refs->refs_;
92
+ refs->tail_ = &refs->refs_;
93
+ refs->last_block_ = NULL;
94
+ refs->refs_ = NULL;
95
+ }
96
+
97
+ void VP8LBackwardRefsClear(VP8LBackwardRefs* const refs) {
98
+ assert(refs != NULL);
99
+ ClearBackwardRefs(refs);
100
+ while (refs->free_blocks_ != NULL) {
101
+ PixOrCopyBlock* const next = refs->free_blocks_->next_;
102
+ WebPSafeFree(refs->free_blocks_);
103
+ refs->free_blocks_ = next;
104
+ }
105
+ }
106
+
107
+ void VP8LBackwardRefsInit(VP8LBackwardRefs* const refs, int block_size) {
108
+ assert(refs != NULL);
109
+ memset(refs, 0, sizeof(*refs));
110
+ refs->tail_ = &refs->refs_;
111
+ refs->block_size_ =
112
+ (block_size < MIN_BLOCK_SIZE) ? MIN_BLOCK_SIZE : block_size;
113
+ }
114
+
115
+ VP8LRefsCursor VP8LRefsCursorInit(const VP8LBackwardRefs* const refs) {
116
+ VP8LRefsCursor c;
117
+ c.cur_block_ = refs->refs_;
118
+ if (refs->refs_ != NULL) {
119
+ c.cur_pos = c.cur_block_->start_;
120
+ c.last_pos_ = c.cur_pos + c.cur_block_->size_;
121
+ } else {
122
+ c.cur_pos = NULL;
123
+ c.last_pos_ = NULL;
124
+ }
125
+ return c;
126
+ }
127
+
128
+ void VP8LRefsCursorNextBlock(VP8LRefsCursor* const c) {
129
+ PixOrCopyBlock* const b = c->cur_block_->next_;
130
+ c->cur_pos = (b == NULL) ? NULL : b->start_;
131
+ c->last_pos_ = (b == NULL) ? NULL : b->start_ + b->size_;
132
+ c->cur_block_ = b;
133
+ }
134
+
135
+ // Create a new block, either from the free list or allocated
136
+ static PixOrCopyBlock* BackwardRefsNewBlock(VP8LBackwardRefs* const refs) {
137
+ PixOrCopyBlock* b = refs->free_blocks_;
138
+ if (b == NULL) { // allocate new memory chunk
139
+ const size_t total_size =
140
+ sizeof(*b) + refs->block_size_ * sizeof(*b->start_);
141
+ b = (PixOrCopyBlock*)WebPSafeMalloc(1ULL, total_size);
142
+ if (b == NULL) {
143
+ refs->error_ |= 1;
144
+ return NULL;
145
+ }
146
+ b->start_ = (PixOrCopy*)((uint8_t*)b + sizeof(*b)); // not always aligned
147
+ } else { // recycle from free-list
148
+ refs->free_blocks_ = b->next_;
149
+ }
150
+ *refs->tail_ = b;
151
+ refs->tail_ = &b->next_;
152
+ refs->last_block_ = b;
153
+ b->next_ = NULL;
154
+ b->size_ = 0;
155
+ return b;
156
+ }
157
+
158
+ static WEBP_INLINE void BackwardRefsCursorAdd(VP8LBackwardRefs* const refs,
159
+ const PixOrCopy v) {
160
+ PixOrCopyBlock* b = refs->last_block_;
161
+ if (b == NULL || b->size_ == refs->block_size_) {
162
+ b = BackwardRefsNewBlock(refs);
163
+ if (b == NULL) return; // refs->error_ is set
164
+ }
165
+ b->start_[b->size_++] = v;
166
+ }
167
+
168
+ int VP8LBackwardRefsCopy(const VP8LBackwardRefs* const src,
169
+ VP8LBackwardRefs* const dst) {
170
+ const PixOrCopyBlock* b = src->refs_;
171
+ ClearBackwardRefs(dst);
172
+ assert(src->block_size_ == dst->block_size_);
173
+ while (b != NULL) {
174
+ PixOrCopyBlock* const new_b = BackwardRefsNewBlock(dst);
175
+ if (new_b == NULL) return 0; // dst->error_ is set
176
+ memcpy(new_b->start_, b->start_, b->size_ * sizeof(*b->start_));
177
+ new_b->size_ = b->size_;
178
+ b = b->next_;
179
+ }
180
+ return 1;
181
+ }
182
+
183
+ // -----------------------------------------------------------------------------
184
+ // Hash chains
185
+
186
+ // initialize as empty
187
+ static void HashChainReset(VP8LHashChain* const p) {
188
+ int i;
189
+ assert(p != NULL);
190
+ for (i = 0; i < p->size_; ++i) {
191
+ p->chain_[i] = -1;
192
+ }
193
+ for (i = 0; i < HASH_SIZE; ++i) {
194
+ p->hash_to_first_index_[i] = -1;
195
+ }
196
+ }
197
+
198
+ int VP8LHashChainInit(VP8LHashChain* const p, int size) {
199
+ assert(p->size_ == 0);
200
+ assert(p->chain_ == NULL);
201
+ assert(size > 0);
202
+ p->chain_ = (int*)WebPSafeMalloc(size, sizeof(*p->chain_));
203
+ if (p->chain_ == NULL) return 0;
204
+ p->size_ = size;
205
+ HashChainReset(p);
206
+ return 1;
207
+ }
208
+
209
+ void VP8LHashChainClear(VP8LHashChain* const p) {
210
+ assert(p != NULL);
211
+ WebPSafeFree(p->chain_);
212
+ p->size_ = 0;
213
+ p->chain_ = NULL;
214
+ }
215
+
216
+ // -----------------------------------------------------------------------------
217
+
218
+ static WEBP_INLINE uint64_t GetPixPairHash64(const uint32_t* const argb) {
219
+ uint64_t key = ((uint64_t)argb[1] << 32) | argb[0];
220
+ key = (key * HASH_MULTIPLIER) >> (64 - HASH_BITS);
221
+ return key;
222
+ }
223
+
224
+ // Insertion of two pixels at a time.
225
+ static void HashChainInsert(VP8LHashChain* const p,
226
+ const uint32_t* const argb, int pos) {
227
+ const uint64_t hash_code = GetPixPairHash64(argb);
228
+ p->chain_[pos] = p->hash_to_first_index_[hash_code];
229
+ p->hash_to_first_index_[hash_code] = pos;
230
+ }
231
+
232
+ static void GetParamsForHashChainFindCopy(
233
+ int quality, int low_effort, int* iter_max, int* len_for_unit_dist) {
234
+ *iter_max = 8 + (quality * quality) / 40;
235
+ *len_for_unit_dist = 32 + (96 * quality) / 100;
236
+ if (low_effort) {
237
+ *iter_max -= 2;
238
+ *len_for_unit_dist /= 4;
239
+ }
240
+ }
241
+
242
+ static int GetWindowSizeForHashChain(int quality, int xsize) {
243
+ const int max_window_size = (quality > 75) ? WINDOW_SIZE
244
+ : (quality > 50) ? (xsize << 8)
245
+ : (quality > 25) ? (xsize << 6)
246
+ : (xsize << 4);
247
+ assert(xsize > 0);
248
+ return (max_window_size > WINDOW_SIZE) ? WINDOW_SIZE : max_window_size;
249
+ }
250
+
251
+ static WEBP_INLINE int MaxFindCopyLength(int len) {
252
+ return (len < MAX_LENGTH) ? len : MAX_LENGTH;
253
+ }
254
+
255
+ static void HashChainFindOffset(const VP8LHashChain* const p, int base_position,
256
+ const uint32_t* const argb, int len,
257
+ int window_size, int* const distance_ptr) {
258
+ const uint32_t* const argb_start = argb + base_position;
259
+ const int min_pos =
260
+ (base_position > window_size) ? base_position - window_size : 0;
261
+ int pos;
262
+ assert(len <= MAX_LENGTH);
263
+ for (pos = p->hash_to_first_index_[GetPixPairHash64(argb_start)];
264
+ pos >= min_pos;
265
+ pos = p->chain_[pos]) {
266
+ const int curr_length =
267
+ FindMatchLength(argb + pos, argb_start, len - 1, len);
268
+ if (curr_length == len) break;
269
+ }
270
+ *distance_ptr = base_position - pos;
271
+ }
272
+
273
+ static int HashChainFindCopy(const VP8LHashChain* const p,
274
+ int base_position, int xsize,
275
+ const uint32_t* const argb, int max_len,
276
+ int window_size, int iter_max,
277
+ int len_for_unit_dist,
278
+ int* const distance_ptr,
279
+ int* const length_ptr) {
280
+ const uint32_t* const argb_start = argb + base_position;
281
+ int iter = 0;
282
+ int best_length = 1;
283
+ const int length_max = 256;
284
+ int best_distance = 0;
285
+ const int min_pos =
286
+ (base_position > window_size) ? base_position - window_size : 0;
287
+ int pos;
288
+ assert(xsize > 0);
289
+ for (pos = p->hash_to_first_index_[GetPixPairHash64(argb_start)];
290
+ pos >= min_pos;
291
+ pos = p->chain_[pos]) {
292
+ int curr_length;
293
+ int distance;
294
+ if (iter > 8) {
295
+ if (iter > iter_max || best_length >= length_max) {
296
+ break;
297
+ }
298
+ }
299
+ ++iter;
300
+
301
+ curr_length = FindMatchLength(argb + pos, argb_start, best_length, max_len);
302
+ if (curr_length < best_length) continue;
303
+
304
+ distance = base_position - pos;
305
+ if (best_length < curr_length) {
306
+ best_length = curr_length;
307
+ best_distance = distance;
308
+ if (curr_length >= max_len) {
309
+ break;
310
+ }
311
+ if ((distance == 1 || distance == xsize) &&
312
+ best_length >= len_for_unit_dist) {
313
+ break;
314
+ }
315
+ }
316
+ }
317
+ *distance_ptr = best_distance;
318
+ *length_ptr = best_length;
319
+ return (best_length >= MIN_LENGTH);
320
+ }
321
+
322
+ static void AddSingleLiteral(uint32_t pixel, int use_color_cache,
323
+ VP8LColorCache* const hashers,
324
+ VP8LBackwardRefs* const refs) {
325
+ PixOrCopy v;
326
+ if (use_color_cache && VP8LColorCacheContains(hashers, pixel)) {
327
+ // push pixel as a PixOrCopyCreateCacheIdx pixel
328
+ const int ix = VP8LColorCacheGetIndex(hashers, pixel);
329
+ v = PixOrCopyCreateCacheIdx(ix);
330
+ } else {
331
+ if (use_color_cache) VP8LColorCacheInsert(hashers, pixel);
332
+ v = PixOrCopyCreateLiteral(pixel);
333
+ }
334
+ BackwardRefsCursorAdd(refs, v);
335
+ }
336
+
337
+ static WEBP_INLINE void PushBackCopy(VP8LBackwardRefs* const refs, int length) {
338
+ while (length >= MAX_LENGTH) {
339
+ BackwardRefsCursorAdd(refs, PixOrCopyCreateCopy(1, MAX_LENGTH));
340
+ length -= MAX_LENGTH;
341
+ }
342
+ if (length > 0) {
343
+ BackwardRefsCursorAdd(refs, PixOrCopyCreateCopy(1, length));
344
+ }
345
+ }
346
+
347
+ static int BackwardReferencesRle(int xsize, int ysize,
348
+ const uint32_t* const argb,
349
+ int cache_bits, VP8LBackwardRefs* const refs) {
350
+ const int pix_count = xsize * ysize;
351
+ int match_len = 0;
352
+ int i;
353
+ int cc_init = 0;
354
+ const int use_color_cache = (cache_bits > 0);
355
+ VP8LColorCache hashers;
356
+
357
+ if (use_color_cache) {
358
+ cc_init = VP8LColorCacheInit(&hashers, cache_bits);
359
+ if (!cc_init) return 0;
360
+ }
361
+ ClearBackwardRefs(refs);
362
+ // Add first pixel as literal.
363
+ AddSingleLiteral(argb[0], use_color_cache, &hashers, refs);
364
+ for (i = 1; i < pix_count; ++i) {
365
+ if (argb[i] == argb[i - 1]) {
366
+ ++match_len;
367
+ } else {
368
+ PushBackCopy(refs, match_len);
369
+ match_len = 0;
370
+ AddSingleLiteral(argb[i], use_color_cache, &hashers, refs);
371
+ }
372
+ }
373
+ PushBackCopy(refs, match_len);
374
+ if (cc_init) VP8LColorCacheClear(&hashers);
375
+ return !refs->error_;
376
+ }
377
+
378
+ static int BackwardReferencesLz77(int xsize, int ysize,
379
+ const uint32_t* const argb, int cache_bits,
380
+ int quality, int low_effort,
381
+ VP8LHashChain* const hash_chain,
382
+ VP8LBackwardRefs* const refs) {
383
+ int i;
384
+ int ok = 0;
385
+ int cc_init = 0;
386
+ const int use_color_cache = (cache_bits > 0);
387
+ const int pix_count = xsize * ysize;
388
+ VP8LColorCache hashers;
389
+ int iter_max, len_for_unit_dist;
390
+ const int window_size = GetWindowSizeForHashChain(quality, xsize);
391
+ GetParamsForHashChainFindCopy(quality, low_effort, &iter_max,
392
+ &len_for_unit_dist);
393
+
394
+ if (use_color_cache) {
395
+ cc_init = VP8LColorCacheInit(&hashers, cache_bits);
396
+ if (!cc_init) goto Error;
397
+ }
398
+ ClearBackwardRefs(refs);
399
+ HashChainReset(hash_chain);
400
+ for (i = 0; i < pix_count - 2; ) {
401
+ // Alternative#1: Code the pixels starting at 'i' using backward reference.
402
+ int offset = 0;
403
+ int len = 0;
404
+ const int max_len = MaxFindCopyLength(pix_count - i);
405
+ HashChainFindCopy(hash_chain, i, xsize, argb, max_len, window_size,
406
+ iter_max, len_for_unit_dist, &offset, &len);
407
+ if (len >= MIN_LENGTH) {
408
+ int offset2 = 0;
409
+ int len2 = 0;
410
+ int k;
411
+ HashChainInsert(hash_chain, &argb[i], i);
412
+ if ((len < (max_len >> 2)) && !low_effort) {
413
+ // Evaluate Alternative#2: Insert the pixel at 'i' as literal, and code
414
+ // the pixels starting at 'i + 1' using backward reference.
415
+ HashChainFindCopy(hash_chain, i + 1, xsize, argb, max_len - 1,
416
+ window_size, iter_max, len_for_unit_dist, &offset2,
417
+ &len2);
418
+ if (len2 > len + 1) {
419
+ AddSingleLiteral(argb[i], use_color_cache, &hashers, refs);
420
+ i++; // Backward reference to be done for next pixel.
421
+ len = len2;
422
+ offset = offset2;
423
+ }
424
+ }
425
+ BackwardRefsCursorAdd(refs, PixOrCopyCreateCopy(offset, len));
426
+ if (use_color_cache) {
427
+ for (k = 0; k < len; ++k) {
428
+ VP8LColorCacheInsert(&hashers, argb[i + k]);
429
+ }
430
+ }
431
+ // Add to the hash_chain (but cannot add the last pixel).
432
+ {
433
+ const int last = (len < pix_count - 1 - i) ? len : pix_count - 1 - i;
434
+ for (k = 1; k < last; ++k) {
435
+ HashChainInsert(hash_chain, &argb[i + k], i + k);
436
+ }
437
+ }
438
+ i += len;
439
+ } else {
440
+ AddSingleLiteral(argb[i], use_color_cache, &hashers, refs);
441
+ HashChainInsert(hash_chain, &argb[i], i);
442
+ ++i;
443
+ }
444
+ }
445
+ while (i < pix_count) {
446
+ // Handle the last (two) pixel(s).
447
+ AddSingleLiteral(argb[i], use_color_cache, &hashers, refs);
448
+ if (i < (pix_count - 1)) HashChainInsert(hash_chain, &argb[i], i);
449
+ ++i;
450
+ }
451
+
452
+ ok = !refs->error_;
453
+ Error:
454
+ if (cc_init) VP8LColorCacheClear(&hashers);
455
+ return ok;
456
+ }
457
+
458
+ // -----------------------------------------------------------------------------
459
+
460
+ typedef struct {
461
+ double alpha_[VALUES_IN_BYTE];
462
+ double red_[VALUES_IN_BYTE];
463
+ double blue_[VALUES_IN_BYTE];
464
+ double distance_[NUM_DISTANCE_CODES];
465
+ double* literal_;
466
+ } CostModel;
467
+
468
+ static int BackwardReferencesTraceBackwards(
469
+ int xsize, int ysize, const uint32_t* const argb, int quality,
470
+ int cache_bits, VP8LHashChain* const hash_chain,
471
+ VP8LBackwardRefs* const refs);
472
+
473
+ static void ConvertPopulationCountTableToBitEstimates(
474
+ int num_symbols, const uint32_t population_counts[], double output[]) {
475
+ uint32_t sum = 0;
476
+ int nonzeros = 0;
477
+ int i;
478
+ for (i = 0; i < num_symbols; ++i) {
479
+ sum += population_counts[i];
480
+ if (population_counts[i] > 0) {
481
+ ++nonzeros;
482
+ }
483
+ }
484
+ if (nonzeros <= 1) {
485
+ memset(output, 0, num_symbols * sizeof(*output));
486
+ } else {
487
+ const double logsum = VP8LFastLog2(sum);
488
+ for (i = 0; i < num_symbols; ++i) {
489
+ output[i] = logsum - VP8LFastLog2(population_counts[i]);
490
+ }
491
+ }
492
+ }
493
+
494
+ static int CostModelBuild(CostModel* const m, int cache_bits,
495
+ VP8LBackwardRefs* const refs) {
496
+ int ok = 0;
497
+ VP8LHistogram* const histo = VP8LAllocateHistogram(cache_bits);
498
+ if (histo == NULL) goto Error;
499
+
500
+ VP8LHistogramCreate(histo, refs, cache_bits);
501
+
502
+ ConvertPopulationCountTableToBitEstimates(
503
+ VP8LHistogramNumCodes(histo->palette_code_bits_),
504
+ histo->literal_, m->literal_);
505
+ ConvertPopulationCountTableToBitEstimates(
506
+ VALUES_IN_BYTE, histo->red_, m->red_);
507
+ ConvertPopulationCountTableToBitEstimates(
508
+ VALUES_IN_BYTE, histo->blue_, m->blue_);
509
+ ConvertPopulationCountTableToBitEstimates(
510
+ VALUES_IN_BYTE, histo->alpha_, m->alpha_);
511
+ ConvertPopulationCountTableToBitEstimates(
512
+ NUM_DISTANCE_CODES, histo->distance_, m->distance_);
513
+ ok = 1;
514
+
515
+ Error:
516
+ VP8LFreeHistogram(histo);
517
+ return ok;
518
+ }
519
+
520
+ static WEBP_INLINE double GetLiteralCost(const CostModel* const m, uint32_t v) {
521
+ return m->alpha_[v >> 24] +
522
+ m->red_[(v >> 16) & 0xff] +
523
+ m->literal_[(v >> 8) & 0xff] +
524
+ m->blue_[v & 0xff];
525
+ }
526
+
527
+ static WEBP_INLINE double GetCacheCost(const CostModel* const m, uint32_t idx) {
528
+ const int literal_idx = VALUES_IN_BYTE + NUM_LENGTH_CODES + idx;
529
+ return m->literal_[literal_idx];
530
+ }
531
+
532
+ static WEBP_INLINE double GetLengthCost(const CostModel* const m,
533
+ uint32_t length) {
534
+ int code, extra_bits;
535
+ VP8LPrefixEncodeBits(length, &code, &extra_bits);
536
+ return m->literal_[VALUES_IN_BYTE + code] + extra_bits;
537
+ }
538
+
539
+ static WEBP_INLINE double GetDistanceCost(const CostModel* const m,
540
+ uint32_t distance) {
541
+ int code, extra_bits;
542
+ VP8LPrefixEncodeBits(distance, &code, &extra_bits);
543
+ return m->distance_[code] + extra_bits;
544
+ }
545
+
546
+ static void AddSingleLiteralWithCostModel(
547
+ const uint32_t* const argb, VP8LHashChain* const hash_chain,
548
+ VP8LColorCache* const hashers, const CostModel* const cost_model, int idx,
549
+ int is_last, int use_color_cache, double prev_cost, float* const cost,
550
+ uint16_t* const dist_array) {
551
+ double cost_val = prev_cost;
552
+ const uint32_t color = argb[0];
553
+ if (!is_last) {
554
+ HashChainInsert(hash_chain, argb, idx);
555
+ }
556
+ if (use_color_cache && VP8LColorCacheContains(hashers, color)) {
557
+ const double mul0 = 0.68;
558
+ const int ix = VP8LColorCacheGetIndex(hashers, color);
559
+ cost_val += GetCacheCost(cost_model, ix) * mul0;
560
+ } else {
561
+ const double mul1 = 0.82;
562
+ if (use_color_cache) VP8LColorCacheInsert(hashers, color);
563
+ cost_val += GetLiteralCost(cost_model, color) * mul1;
564
+ }
565
+ if (cost[idx] > cost_val) {
566
+ cost[idx] = (float)cost_val;
567
+ dist_array[idx] = 1; // only one is inserted.
568
+ }
569
+ }
570
+
571
+ static int BackwardReferencesHashChainDistanceOnly(
572
+ int xsize, int ysize, const uint32_t* const argb,
573
+ int quality, int cache_bits, VP8LHashChain* const hash_chain,
574
+ VP8LBackwardRefs* const refs, uint16_t* const dist_array) {
575
+ int i;
576
+ int ok = 0;
577
+ int cc_init = 0;
578
+ const int pix_count = xsize * ysize;
579
+ const int use_color_cache = (cache_bits > 0);
580
+ float* const cost =
581
+ (float*)WebPSafeMalloc(pix_count, sizeof(*cost));
582
+ const size_t literal_array_size = sizeof(double) *
583
+ (NUM_LITERAL_CODES + NUM_LENGTH_CODES +
584
+ ((cache_bits > 0) ? (1 << cache_bits) : 0));
585
+ const size_t cost_model_size = sizeof(CostModel) + literal_array_size;
586
+ CostModel* const cost_model =
587
+ (CostModel*)WebPSafeMalloc(1ULL, cost_model_size);
588
+ VP8LColorCache hashers;
589
+ const int min_distance_code = 2;
590
+ int iter_max, len_for_unit_dist;
591
+ const int window_size = GetWindowSizeForHashChain(quality, xsize);
592
+ GetParamsForHashChainFindCopy(quality, 0, &iter_max, &len_for_unit_dist);
593
+
594
+ if (cost == NULL || cost_model == NULL) goto Error;
595
+
596
+ cost_model->literal_ = (double*)(cost_model + 1);
597
+ if (use_color_cache) {
598
+ cc_init = VP8LColorCacheInit(&hashers, cache_bits);
599
+ if (!cc_init) goto Error;
600
+ }
601
+
602
+ if (!CostModelBuild(cost_model, cache_bits, refs)) {
603
+ goto Error;
604
+ }
605
+
606
+ for (i = 0; i < pix_count; ++i) cost[i] = 1e38f;
607
+
608
+ // We loop one pixel at a time, but store all currently best points to
609
+ // non-processed locations from this point.
610
+ dist_array[0] = 0;
611
+ HashChainReset(hash_chain);
612
+ // Add first pixel as literal.
613
+ AddSingleLiteralWithCostModel(argb + 0, hash_chain, &hashers, cost_model, 0,
614
+ 0, use_color_cache, 0.0, cost, dist_array);
615
+ for (i = 1; i < pix_count - 1; ++i) {
616
+ int offset = 0;
617
+ int len = 0;
618
+ double prev_cost = cost[i - 1];
619
+ const int max_len = MaxFindCopyLength(pix_count - i);
620
+ HashChainFindCopy(hash_chain, i, xsize, argb, max_len, window_size,
621
+ iter_max, len_for_unit_dist, &offset, &len);
622
+ if (len >= MIN_LENGTH) {
623
+ const int code = DistanceToPlaneCode(xsize, offset);
624
+ const double distance_cost =
625
+ prev_cost + GetDistanceCost(cost_model, code);
626
+ int k;
627
+ for (k = 1; k < len; ++k) {
628
+ const double cost_val = distance_cost + GetLengthCost(cost_model, k);
629
+ if (cost[i + k] > cost_val) {
630
+ cost[i + k] = (float)cost_val;
631
+ dist_array[i + k] = k + 1;
632
+ }
633
+ }
634
+ // This if is for speedup only. It roughly doubles the speed, and
635
+ // makes compression worse by .1 %.
636
+ if (len >= len_for_unit_dist && code <= min_distance_code) {
637
+ // Long copy for short distances, let's skip the middle
638
+ // lookups for better copies.
639
+ // 1) insert the hashes.
640
+ if (use_color_cache) {
641
+ for (k = 0; k < len; ++k) {
642
+ VP8LColorCacheInsert(&hashers, argb[i + k]);
643
+ }
644
+ }
645
+ // 2) Add to the hash_chain (but cannot add the last pixel)
646
+ {
647
+ const int last = (len + i < pix_count - 1) ? len + i
648
+ : pix_count - 1;
649
+ for (k = i; k < last; ++k) {
650
+ HashChainInsert(hash_chain, &argb[k], k);
651
+ }
652
+ }
653
+ // 3) jump.
654
+ i += len - 1; // for loop does ++i, thus -1 here.
655
+ goto next_symbol;
656
+ }
657
+ if (len != MIN_LENGTH) {
658
+ int code_min_length;
659
+ double cost_total;
660
+ HashChainFindOffset(hash_chain, i, argb, MIN_LENGTH, window_size,
661
+ &offset);
662
+ code_min_length = DistanceToPlaneCode(xsize, offset);
663
+ cost_total = prev_cost +
664
+ GetDistanceCost(cost_model, code_min_length) +
665
+ GetLengthCost(cost_model, 1);
666
+ if (cost[i + 1] > cost_total) {
667
+ cost[i + 1] = (float)cost_total;
668
+ dist_array[i + 1] = 2;
669
+ }
670
+ }
671
+ }
672
+ AddSingleLiteralWithCostModel(argb + i, hash_chain, &hashers, cost_model, i,
673
+ 0, use_color_cache, prev_cost, cost,
674
+ dist_array);
675
+ next_symbol: ;
676
+ }
677
+ // Handle the last pixel.
678
+ if (i == (pix_count - 1)) {
679
+ AddSingleLiteralWithCostModel(argb + i, hash_chain, &hashers, cost_model, i,
680
+ 1, use_color_cache, cost[pix_count - 2], cost,
681
+ dist_array);
682
+ }
683
+ ok = !refs->error_;
684
+ Error:
685
+ if (cc_init) VP8LColorCacheClear(&hashers);
686
+ WebPSafeFree(cost_model);
687
+ WebPSafeFree(cost);
688
+ return ok;
689
+ }
690
+
691
+ // We pack the path at the end of *dist_array and return
692
+ // a pointer to this part of the array. Example:
693
+ // dist_array = [1x2xx3x2] => packed [1x2x1232], chosen_path = [1232]
694
+ static void TraceBackwards(uint16_t* const dist_array,
695
+ int dist_array_size,
696
+ uint16_t** const chosen_path,
697
+ int* const chosen_path_size) {
698
+ uint16_t* path = dist_array + dist_array_size;
699
+ uint16_t* cur = dist_array + dist_array_size - 1;
700
+ while (cur >= dist_array) {
701
+ const int k = *cur;
702
+ --path;
703
+ *path = k;
704
+ cur -= k;
705
+ }
706
+ *chosen_path = path;
707
+ *chosen_path_size = (int)(dist_array + dist_array_size - path);
708
+ }
709
+
710
+ static int BackwardReferencesHashChainFollowChosenPath(
711
+ int xsize, int ysize, const uint32_t* const argb,
712
+ int quality, int cache_bits,
713
+ const uint16_t* const chosen_path, int chosen_path_size,
714
+ VP8LHashChain* const hash_chain,
715
+ VP8LBackwardRefs* const refs) {
716
+ const int pix_count = xsize * ysize;
717
+ const int use_color_cache = (cache_bits > 0);
718
+ int ix;
719
+ int i = 0;
720
+ int ok = 0;
721
+ int cc_init = 0;
722
+ const int window_size = GetWindowSizeForHashChain(quality, xsize);
723
+ VP8LColorCache hashers;
724
+
725
+ if (use_color_cache) {
726
+ cc_init = VP8LColorCacheInit(&hashers, cache_bits);
727
+ if (!cc_init) goto Error;
728
+ }
729
+
730
+ ClearBackwardRefs(refs);
731
+ HashChainReset(hash_chain);
732
+ for (ix = 0; ix < chosen_path_size; ++ix) {
733
+ int offset = 0;
734
+ const int len = chosen_path[ix];
735
+ if (len != 1) {
736
+ int k;
737
+ HashChainFindOffset(hash_chain, i, argb, len, window_size, &offset);
738
+ BackwardRefsCursorAdd(refs, PixOrCopyCreateCopy(offset, len));
739
+ if (use_color_cache) {
740
+ for (k = 0; k < len; ++k) {
741
+ VP8LColorCacheInsert(&hashers, argb[i + k]);
742
+ }
743
+ }
744
+ {
745
+ const int last = (len < pix_count - 1 - i) ? len : pix_count - 1 - i;
746
+ for (k = 0; k < last; ++k) {
747
+ HashChainInsert(hash_chain, &argb[i + k], i + k);
748
+ }
749
+ }
750
+ i += len;
751
+ } else {
752
+ PixOrCopy v;
753
+ if (use_color_cache && VP8LColorCacheContains(&hashers, argb[i])) {
754
+ // push pixel as a color cache index
755
+ const int idx = VP8LColorCacheGetIndex(&hashers, argb[i]);
756
+ v = PixOrCopyCreateCacheIdx(idx);
757
+ } else {
758
+ if (use_color_cache) VP8LColorCacheInsert(&hashers, argb[i]);
759
+ v = PixOrCopyCreateLiteral(argb[i]);
760
+ }
761
+ BackwardRefsCursorAdd(refs, v);
762
+ if (i + 1 < pix_count) {
763
+ HashChainInsert(hash_chain, &argb[i], i);
764
+ }
765
+ ++i;
766
+ }
767
+ }
768
+ ok = !refs->error_;
769
+ Error:
770
+ if (cc_init) VP8LColorCacheClear(&hashers);
771
+ return ok;
772
+ }
773
+
774
+ // Returns 1 on success.
775
+ static int BackwardReferencesTraceBackwards(int xsize, int ysize,
776
+ const uint32_t* const argb,
777
+ int quality, int cache_bits,
778
+ VP8LHashChain* const hash_chain,
779
+ VP8LBackwardRefs* const refs) {
780
+ int ok = 0;
781
+ const int dist_array_size = xsize * ysize;
782
+ uint16_t* chosen_path = NULL;
783
+ int chosen_path_size = 0;
784
+ uint16_t* dist_array =
785
+ (uint16_t*)WebPSafeMalloc(dist_array_size, sizeof(*dist_array));
786
+
787
+ if (dist_array == NULL) goto Error;
788
+
789
+ if (!BackwardReferencesHashChainDistanceOnly(
790
+ xsize, ysize, argb, quality, cache_bits, hash_chain,
791
+ refs, dist_array)) {
792
+ goto Error;
793
+ }
794
+ TraceBackwards(dist_array, dist_array_size, &chosen_path, &chosen_path_size);
795
+ if (!BackwardReferencesHashChainFollowChosenPath(
796
+ xsize, ysize, argb, quality, cache_bits, chosen_path, chosen_path_size,
797
+ hash_chain, refs)) {
798
+ goto Error;
799
+ }
800
+ ok = 1;
801
+ Error:
802
+ WebPSafeFree(dist_array);
803
+ return ok;
804
+ }
805
+
806
+ static void BackwardReferences2DLocality(int xsize,
807
+ const VP8LBackwardRefs* const refs) {
808
+ VP8LRefsCursor c = VP8LRefsCursorInit(refs);
809
+ while (VP8LRefsCursorOk(&c)) {
810
+ if (PixOrCopyIsCopy(c.cur_pos)) {
811
+ const int dist = c.cur_pos->argb_or_distance;
812
+ const int transformed_dist = DistanceToPlaneCode(xsize, dist);
813
+ c.cur_pos->argb_or_distance = transformed_dist;
814
+ }
815
+ VP8LRefsCursorNext(&c);
816
+ }
817
+ }
818
+
819
+ // Returns entropy for the given cache bits.
820
+ static double ComputeCacheEntropy(const uint32_t* const argb,
821
+ int xsize, int ysize,
822
+ const VP8LBackwardRefs* const refs,
823
+ int cache_bits) {
824
+ int pixel_index = 0;
825
+ uint32_t k;
826
+ const int use_color_cache = (cache_bits > 0);
827
+ int cc_init = 0;
828
+ double entropy = MAX_ENTROPY;
829
+ const double kSmallPenaltyForLargeCache = 4.0;
830
+ VP8LColorCache hashers;
831
+ VP8LRefsCursor c = VP8LRefsCursorInit(refs);
832
+ VP8LHistogram* histo = VP8LAllocateHistogram(cache_bits);
833
+ if (histo == NULL) goto Error;
834
+
835
+ if (use_color_cache) {
836
+ cc_init = VP8LColorCacheInit(&hashers, cache_bits);
837
+ if (!cc_init) goto Error;
838
+ }
839
+
840
+ while (VP8LRefsCursorOk(&c)) {
841
+ const PixOrCopy* const v = c.cur_pos;
842
+ if (PixOrCopyIsLiteral(v)) {
843
+ if (use_color_cache &&
844
+ VP8LColorCacheContains(&hashers, argb[pixel_index])) {
845
+ // push pixel as a cache index
846
+ const int ix = VP8LColorCacheGetIndex(&hashers, argb[pixel_index]);
847
+ const PixOrCopy token = PixOrCopyCreateCacheIdx(ix);
848
+ VP8LHistogramAddSinglePixOrCopy(histo, &token);
849
+ } else {
850
+ VP8LHistogramAddSinglePixOrCopy(histo, v);
851
+ }
852
+ } else {
853
+ VP8LHistogramAddSinglePixOrCopy(histo, v);
854
+ }
855
+ if (use_color_cache) {
856
+ for (k = 0; k < PixOrCopyLength(v); ++k) {
857
+ VP8LColorCacheInsert(&hashers, argb[pixel_index + k]);
858
+ }
859
+ }
860
+ pixel_index += PixOrCopyLength(v);
861
+ VP8LRefsCursorNext(&c);
862
+ }
863
+ assert(pixel_index == xsize * ysize);
864
+ (void)xsize; // xsize is not used in non-debug compilations otherwise.
865
+ (void)ysize; // ysize is not used in non-debug compilations otherwise.
866
+ entropy = VP8LHistogramEstimateBits(histo) +
867
+ kSmallPenaltyForLargeCache * cache_bits;
868
+ Error:
869
+ if (cc_init) VP8LColorCacheClear(&hashers);
870
+ VP8LFreeHistogram(histo);
871
+ return entropy;
872
+ }
873
+
874
+ // Evaluate optimal cache bits for the local color cache.
875
+ // The input *best_cache_bits sets the maximum cache bits to use (passing 0
876
+ // implies disabling the local color cache). The local color cache is also
877
+ // disabled for the lower (<= 25) quality.
878
+ // Returns 0 in case of memory error.
879
+ static int CalculateBestCacheSize(const uint32_t* const argb,
880
+ int xsize, int ysize, int quality,
881
+ VP8LHashChain* const hash_chain,
882
+ VP8LBackwardRefs* const refs,
883
+ int* const lz77_computed,
884
+ int* const best_cache_bits) {
885
+ int eval_low = 1;
886
+ int eval_high = 1;
887
+ double entropy_low = MAX_ENTROPY;
888
+ double entropy_high = MAX_ENTROPY;
889
+ const double cost_mul = 5e-4;
890
+ int cache_bits_low = 0;
891
+ int cache_bits_high = (quality <= 25) ? 0 : *best_cache_bits;
892
+
893
+ assert(cache_bits_high <= MAX_COLOR_CACHE_BITS);
894
+
895
+ *lz77_computed = 0;
896
+ if (cache_bits_high == 0) {
897
+ *best_cache_bits = 0;
898
+ // Local color cache is disabled.
899
+ return 1;
900
+ }
901
+ if (!BackwardReferencesLz77(xsize, ysize, argb, cache_bits_low, quality, 0,
902
+ hash_chain, refs)) {
903
+ return 0;
904
+ }
905
+ // Do a binary search to find the optimal entropy for cache_bits.
906
+ while (eval_low || eval_high) {
907
+ if (eval_low) {
908
+ entropy_low =
909
+ ComputeCacheEntropy(argb, xsize, ysize, refs, cache_bits_low);
910
+ entropy_low += entropy_low * cache_bits_low * cost_mul;
911
+ eval_low = 0;
912
+ }
913
+ if (eval_high) {
914
+ entropy_high =
915
+ ComputeCacheEntropy(argb, xsize, ysize, refs, cache_bits_high);
916
+ entropy_high += entropy_high * cache_bits_high * cost_mul;
917
+ eval_high = 0;
918
+ }
919
+ if (entropy_high < entropy_low) {
920
+ const int prev_cache_bits_low = cache_bits_low;
921
+ *best_cache_bits = cache_bits_high;
922
+ cache_bits_low = (cache_bits_low + cache_bits_high) / 2;
923
+ if (cache_bits_low != prev_cache_bits_low) eval_low = 1;
924
+ } else {
925
+ *best_cache_bits = cache_bits_low;
926
+ cache_bits_high = (cache_bits_low + cache_bits_high) / 2;
927
+ if (cache_bits_high != cache_bits_low) eval_high = 1;
928
+ }
929
+ }
930
+ *lz77_computed = 1;
931
+ return 1;
932
+ }
933
+
934
+ // Update (in-place) backward references for specified cache_bits.
935
+ static int BackwardRefsWithLocalCache(const uint32_t* const argb,
936
+ int cache_bits,
937
+ VP8LBackwardRefs* const refs) {
938
+ int pixel_index = 0;
939
+ VP8LColorCache hashers;
940
+ VP8LRefsCursor c = VP8LRefsCursorInit(refs);
941
+ if (!VP8LColorCacheInit(&hashers, cache_bits)) return 0;
942
+
943
+ while (VP8LRefsCursorOk(&c)) {
944
+ PixOrCopy* const v = c.cur_pos;
945
+ if (PixOrCopyIsLiteral(v)) {
946
+ const uint32_t argb_literal = v->argb_or_distance;
947
+ if (VP8LColorCacheContains(&hashers, argb_literal)) {
948
+ const int ix = VP8LColorCacheGetIndex(&hashers, argb_literal);
949
+ *v = PixOrCopyCreateCacheIdx(ix);
950
+ } else {
951
+ VP8LColorCacheInsert(&hashers, argb_literal);
952
+ }
953
+ ++pixel_index;
954
+ } else {
955
+ // refs was created without local cache, so it can not have cache indexes.
956
+ int k;
957
+ assert(PixOrCopyIsCopy(v));
958
+ for (k = 0; k < v->len; ++k) {
959
+ VP8LColorCacheInsert(&hashers, argb[pixel_index++]);
960
+ }
961
+ }
962
+ VP8LRefsCursorNext(&c);
963
+ }
964
+ VP8LColorCacheClear(&hashers);
965
+ return 1;
966
+ }
967
+
968
+ static VP8LBackwardRefs* GetBackwardReferencesLowEffort(
969
+ int width, int height, const uint32_t* const argb, int quality,
970
+ int* const cache_bits, VP8LHashChain* const hash_chain,
971
+ VP8LBackwardRefs refs_array[2]) {
972
+ VP8LBackwardRefs* refs_lz77 = &refs_array[0];
973
+ *cache_bits = 0;
974
+ if (!BackwardReferencesLz77(width, height, argb, 0, quality,
975
+ 1 /* Low effort. */, hash_chain, refs_lz77)) {
976
+ return NULL;
977
+ }
978
+ BackwardReferences2DLocality(width, refs_lz77);
979
+ return refs_lz77;
980
+ }
981
+
982
+ static VP8LBackwardRefs* GetBackwardReferences(
983
+ int width, int height, const uint32_t* const argb, int quality,
984
+ int* const cache_bits, VP8LHashChain* const hash_chain,
985
+ VP8LBackwardRefs refs_array[2]) {
986
+ int lz77_is_useful;
987
+ int lz77_computed;
988
+ double bit_cost_lz77, bit_cost_rle;
989
+ VP8LBackwardRefs* best = NULL;
990
+ VP8LBackwardRefs* refs_lz77 = &refs_array[0];
991
+ VP8LBackwardRefs* refs_rle = &refs_array[1];
992
+ VP8LHistogram* histo = NULL;
993
+
994
+ if (!CalculateBestCacheSize(argb, width, height, quality, hash_chain,
995
+ refs_lz77, &lz77_computed, cache_bits)) {
996
+ goto Error;
997
+ }
998
+
999
+ if (lz77_computed) {
1000
+ // Transform refs_lz77 for the optimized cache_bits.
1001
+ if (*cache_bits > 0) {
1002
+ if (!BackwardRefsWithLocalCache(argb, *cache_bits, refs_lz77)) {
1003
+ goto Error;
1004
+ }
1005
+ }
1006
+ } else {
1007
+ if (!BackwardReferencesLz77(width, height, argb, *cache_bits, quality,
1008
+ 0 /* Low effort. */, hash_chain, refs_lz77)) {
1009
+ goto Error;
1010
+ }
1011
+ }
1012
+
1013
+ if (!BackwardReferencesRle(width, height, argb, *cache_bits, refs_rle)) {
1014
+ goto Error;
1015
+ }
1016
+
1017
+ histo = VP8LAllocateHistogram(*cache_bits);
1018
+ if (histo == NULL) goto Error;
1019
+
1020
+ {
1021
+ // Evaluate LZ77 coding.
1022
+ VP8LHistogramCreate(histo, refs_lz77, *cache_bits);
1023
+ bit_cost_lz77 = VP8LHistogramEstimateBits(histo);
1024
+ // Evaluate RLE coding.
1025
+ VP8LHistogramCreate(histo, refs_rle, *cache_bits);
1026
+ bit_cost_rle = VP8LHistogramEstimateBits(histo);
1027
+ // Decide if LZ77 is useful.
1028
+ lz77_is_useful = (bit_cost_lz77 < bit_cost_rle);
1029
+ }
1030
+
1031
+ // Choose appropriate backward reference.
1032
+ if (lz77_is_useful) {
1033
+ // TraceBackwards is costly. Don't execute it at lower quality.
1034
+ const int try_lz77_trace_backwards = (quality >= 25);
1035
+ best = refs_lz77; // default guess: lz77 is better
1036
+ if (try_lz77_trace_backwards) {
1037
+ VP8LBackwardRefs* const refs_trace = refs_rle;
1038
+ if (!VP8LBackwardRefsCopy(refs_lz77, refs_trace)) {
1039
+ best = NULL;
1040
+ goto Error;
1041
+ }
1042
+ if (BackwardReferencesTraceBackwards(width, height, argb, quality,
1043
+ *cache_bits, hash_chain,
1044
+ refs_trace)) {
1045
+ double bit_cost_trace;
1046
+ // Evaluate LZ77 coding.
1047
+ VP8LHistogramCreate(histo, refs_trace, *cache_bits);
1048
+ bit_cost_trace = VP8LHistogramEstimateBits(histo);
1049
+ if (bit_cost_trace < bit_cost_lz77) {
1050
+ best = refs_trace;
1051
+ }
1052
+ }
1053
+ }
1054
+ } else {
1055
+ best = refs_rle;
1056
+ }
1057
+
1058
+ BackwardReferences2DLocality(width, best);
1059
+
1060
+ Error:
1061
+ VP8LFreeHistogram(histo);
1062
+ return best;
1063
+ }
1064
+
1065
+ VP8LBackwardRefs* VP8LGetBackwardReferences(
1066
+ int width, int height, const uint32_t* const argb, int quality,
1067
+ int low_effort, int* const cache_bits, VP8LHashChain* const hash_chain,
1068
+ VP8LBackwardRefs refs_array[2]) {
1069
+ if (low_effort) {
1070
+ return GetBackwardReferencesLowEffort(width, height, argb, quality,
1071
+ cache_bits, hash_chain, refs_array);
1072
+ } else {
1073
+ return GetBackwardReferences(width, height, argb, quality, cache_bits,
1074
+ hash_chain, refs_array);
1075
+ }
1076
+ }