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,1241 @@
1
+ // Copyright 2014 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
+ // AnimEncoder implementation.
11
+ //
12
+
13
+ #include <assert.h>
14
+ #include <limits.h>
15
+ #include <stdio.h>
16
+
17
+ #include "../utils/utils.h"
18
+ #include "../webp/decode.h"
19
+ #include "../webp/format_constants.h"
20
+ #include "../webp/mux.h"
21
+
22
+ //------------------------------------------------------------------------------
23
+ // Internal structs.
24
+
25
+ // Stores frame rectangle dimensions.
26
+ typedef struct {
27
+ int x_offset_, y_offset_, width_, height_;
28
+ } FrameRect;
29
+
30
+ // Used to store two candidates of encoded data for an animation frame. One of
31
+ // the two will be chosen later.
32
+ typedef struct {
33
+ WebPMuxFrameInfo sub_frame_; // Encoded frame rectangle.
34
+ WebPMuxFrameInfo key_frame_; // Encoded frame if it is a key-frame.
35
+ int is_key_frame_; // True if 'key_frame' has been chosen.
36
+ } EncodedFrame;
37
+
38
+ struct WebPAnimEncoder {
39
+ const int canvas_width_; // Canvas width.
40
+ const int canvas_height_; // Canvas height.
41
+ const WebPAnimEncoderOptions options_; // Global encoding options.
42
+
43
+ FrameRect prev_rect; // Previous WebP frame rectangle.
44
+ WebPConfig last_config; // Cached in case a re-encode is needed.
45
+ WebPConfig last_config2; // 2nd cached config; only valid if
46
+ // 'options_.allow_mixed' is true.
47
+
48
+ WebPPicture* curr_canvas_; // Only pointer; we don't own memory.
49
+
50
+ // Canvas buffers.
51
+ WebPPicture curr_canvas_copy_; // Possibly modified current canvas.
52
+ int curr_canvas_copy_modified_; // True if pixels in 'curr_canvas_copy_'
53
+ // differ from those in 'curr_canvas_'.
54
+
55
+ WebPPicture prev_canvas_; // Previous canvas.
56
+ WebPPicture prev_canvas_disposed_; // Previous canvas disposed to background.
57
+
58
+ // Encoded data.
59
+ EncodedFrame* encoded_frames_; // Array of encoded frames.
60
+ size_t size_; // Number of allocated frames.
61
+ size_t start_; // Frame start index.
62
+ size_t count_; // Number of valid frames.
63
+ size_t flush_count_; // If >0, 'flush_count' frames starting from
64
+ // 'start' are ready to be added to mux.
65
+
66
+ // key-frame related.
67
+ int64_t best_delta_; // min(canvas size - frame size) over the frames.
68
+ // Can be negative in certain cases due to
69
+ // transparent pixels in a frame.
70
+ int keyframe_; // Index of selected key-frame relative to 'start_'.
71
+ int count_since_key_frame_; // Frames seen since the last key-frame.
72
+ int prev_candidate_undecided_; // True if it's not yet decided if previous
73
+ // frame would be a sub-frame or a key-frame.
74
+
75
+ // Misc.
76
+ int is_first_frame_; // True if first frame is yet to be added/being added.
77
+ size_t frame_count_; // Number of frames added to mux so far.
78
+
79
+ WebPMux* mux_; // Muxer to assemble the WebP bitstream.
80
+ };
81
+
82
+ // -----------------------------------------------------------------------------
83
+ // Life of WebPAnimEncoder object.
84
+
85
+ #define DELTA_INFINITY (1ULL << 32)
86
+ #define KEYFRAME_NONE (-1)
87
+
88
+ // Reset the counters in the WebPAnimEncoder.
89
+ static void ResetCounters(WebPAnimEncoder* const enc) {
90
+ enc->start_ = 0;
91
+ enc->count_ = 0;
92
+ enc->flush_count_ = 0;
93
+ enc->best_delta_ = DELTA_INFINITY;
94
+ enc->keyframe_ = KEYFRAME_NONE;
95
+ }
96
+
97
+ static void DisableKeyframes(WebPAnimEncoderOptions* const enc_options) {
98
+ enc_options->kmax = INT_MAX;
99
+ enc_options->kmin = enc_options->kmax - 1;
100
+ }
101
+
102
+ #define MAX_CACHED_FRAMES 30
103
+
104
+ static void SanitizeEncoderOptions(WebPAnimEncoderOptions* const enc_options) {
105
+ int print_warning = enc_options->verbose;
106
+
107
+ if (enc_options->minimize_size) {
108
+ DisableKeyframes(enc_options);
109
+ }
110
+
111
+ if (enc_options->kmin <= 0) {
112
+ DisableKeyframes(enc_options);
113
+ print_warning = 0;
114
+ }
115
+ if (enc_options->kmax <= 0) { // All frames will be key-frames.
116
+ enc_options->kmin = 0;
117
+ enc_options->kmax = 0;
118
+ return;
119
+ }
120
+
121
+ if (enc_options->kmin >= enc_options->kmax) {
122
+ enc_options->kmin = enc_options->kmax - 1;
123
+ if (print_warning) {
124
+ fprintf(stderr, "WARNING: Setting kmin = %d, so that kmin < kmax.\n",
125
+ enc_options->kmin);
126
+ }
127
+ } else {
128
+ const int kmin_limit = enc_options->kmax / 2 + 1;
129
+ if (enc_options->kmin < kmin_limit && kmin_limit < enc_options->kmax) {
130
+ // This ensures that enc.keyframe + kmin >= kmax is always true. So, we
131
+ // can flush all the frames in the 'count_since_key_frame == kmax' case.
132
+ enc_options->kmin = kmin_limit;
133
+ if (print_warning) {
134
+ fprintf(stderr,
135
+ "WARNING: Setting kmin = %d, so that kmin >= kmax / 2 + 1.\n",
136
+ enc_options->kmin);
137
+ }
138
+ }
139
+ }
140
+ // Limit the max number of frames that are allocated.
141
+ if (enc_options->kmax - enc_options->kmin > MAX_CACHED_FRAMES) {
142
+ enc_options->kmin = enc_options->kmax - MAX_CACHED_FRAMES;
143
+ if (print_warning) {
144
+ fprintf(stderr,
145
+ "WARNING: Setting kmin = %d, so that kmax - kmin <= %d.\n",
146
+ enc_options->kmin, MAX_CACHED_FRAMES);
147
+ }
148
+ }
149
+ assert(enc_options->kmin < enc_options->kmax);
150
+ }
151
+
152
+ #undef MAX_CACHED_FRAMES
153
+
154
+ static void DefaultEncoderOptions(WebPAnimEncoderOptions* const enc_options) {
155
+ enc_options->anim_params.loop_count = 0;
156
+ enc_options->anim_params.bgcolor = 0xffffffff; // White.
157
+ enc_options->minimize_size = 0;
158
+ DisableKeyframes(enc_options);
159
+ enc_options->allow_mixed = 0;
160
+ enc_options->verbose = 0;
161
+ }
162
+
163
+ int WebPAnimEncoderOptionsInitInternal(WebPAnimEncoderOptions* enc_options,
164
+ int abi_version) {
165
+ if (enc_options == NULL ||
166
+ WEBP_ABI_IS_INCOMPATIBLE(abi_version, WEBP_MUX_ABI_VERSION)) {
167
+ return 0;
168
+ }
169
+ DefaultEncoderOptions(enc_options);
170
+ return 1;
171
+ }
172
+
173
+ #define TRANSPARENT_COLOR 0x00ffffff
174
+
175
+ static void ClearRectangle(WebPPicture* const picture,
176
+ int left, int top, int width, int height) {
177
+ int j;
178
+ for (j = top; j < top + height; ++j) {
179
+ uint32_t* const dst = picture->argb + j * picture->argb_stride;
180
+ int i;
181
+ for (i = left; i < left + width; ++i) {
182
+ dst[i] = TRANSPARENT_COLOR;
183
+ }
184
+ }
185
+ }
186
+
187
+ static void WebPUtilClearPic(WebPPicture* const picture,
188
+ const FrameRect* const rect) {
189
+ if (rect != NULL) {
190
+ ClearRectangle(picture, rect->x_offset_, rect->y_offset_,
191
+ rect->width_, rect->height_);
192
+ } else {
193
+ ClearRectangle(picture, 0, 0, picture->width, picture->height);
194
+ }
195
+ }
196
+
197
+ WebPAnimEncoder* WebPAnimEncoderNewInternal(
198
+ int width, int height, const WebPAnimEncoderOptions* enc_options,
199
+ int abi_version) {
200
+ WebPAnimEncoder* enc;
201
+
202
+ if (WEBP_ABI_IS_INCOMPATIBLE(abi_version, WEBP_MUX_ABI_VERSION)) {
203
+ return NULL;
204
+ }
205
+ if (width <= 0 || height <= 0 ||
206
+ (width * (uint64_t)height) >= MAX_IMAGE_AREA) {
207
+ return NULL;
208
+ }
209
+
210
+ enc = (WebPAnimEncoder*)WebPSafeCalloc(1, sizeof(*enc));
211
+ if (enc == NULL) return NULL;
212
+ // sanity inits, so we can call WebPAnimEncoderDelete():
213
+ enc->encoded_frames_ = NULL;
214
+ enc->mux_ = NULL;
215
+
216
+ // Dimensions and options.
217
+ *(int*)&enc->canvas_width_ = width;
218
+ *(int*)&enc->canvas_height_ = height;
219
+ if (enc_options != NULL) {
220
+ *(WebPAnimEncoderOptions*)&enc->options_ = *enc_options;
221
+ SanitizeEncoderOptions((WebPAnimEncoderOptions*)&enc->options_);
222
+ } else {
223
+ DefaultEncoderOptions((WebPAnimEncoderOptions*)&enc->options_);
224
+ }
225
+
226
+ // Canvas buffers.
227
+ if (!WebPPictureInit(&enc->curr_canvas_copy_) ||
228
+ !WebPPictureInit(&enc->prev_canvas_) ||
229
+ !WebPPictureInit(&enc->prev_canvas_disposed_)) {
230
+ return NULL;
231
+ }
232
+ enc->curr_canvas_copy_.width = width;
233
+ enc->curr_canvas_copy_.height = height;
234
+ enc->curr_canvas_copy_.use_argb = 1;
235
+ if (!WebPPictureAlloc(&enc->curr_canvas_copy_) ||
236
+ !WebPPictureCopy(&enc->curr_canvas_copy_, &enc->prev_canvas_) ||
237
+ !WebPPictureCopy(&enc->curr_canvas_copy_, &enc->prev_canvas_disposed_)) {
238
+ goto Err;
239
+ }
240
+ WebPUtilClearPic(&enc->prev_canvas_, NULL);
241
+ enc->curr_canvas_copy_modified_ = 1;
242
+
243
+ // Encoded frames.
244
+ ResetCounters(enc);
245
+ // Note: one extra storage is for the previous frame.
246
+ enc->size_ = enc->options_.kmax - enc->options_.kmin + 1;
247
+ // We need space for at least 2 frames. But when kmin, kmax are both zero,
248
+ // enc->size_ will be 1. So we handle that special case below.
249
+ if (enc->size_ < 2) enc->size_ = 2;
250
+ enc->encoded_frames_ =
251
+ (EncodedFrame*)WebPSafeCalloc(enc->size_, sizeof(*enc->encoded_frames_));
252
+ if (enc->encoded_frames_ == NULL) goto Err;
253
+
254
+ enc->mux_ = WebPMuxNew();
255
+ if (enc->mux_ == NULL) goto Err;
256
+
257
+ enc->count_since_key_frame_ = 0;
258
+ enc->prev_candidate_undecided_ = 0;
259
+ enc->is_first_frame_ = 1;
260
+
261
+ return enc; // All OK.
262
+
263
+ Err:
264
+ WebPAnimEncoderDelete(enc);
265
+ return NULL;
266
+ }
267
+
268
+ // Release the data contained by 'encoded_frame'.
269
+ static void FrameRelease(EncodedFrame* const encoded_frame) {
270
+ if (encoded_frame != NULL) {
271
+ WebPDataClear(&encoded_frame->sub_frame_.bitstream);
272
+ WebPDataClear(&encoded_frame->key_frame_.bitstream);
273
+ memset(encoded_frame, 0, sizeof(*encoded_frame));
274
+ }
275
+ }
276
+
277
+ void WebPAnimEncoderDelete(WebPAnimEncoder* enc) {
278
+ if (enc != NULL) {;
279
+ WebPPictureFree(&enc->curr_canvas_copy_);
280
+ WebPPictureFree(&enc->prev_canvas_);
281
+ WebPPictureFree(&enc->prev_canvas_disposed_);
282
+ if (enc->encoded_frames_ != NULL) {
283
+ size_t i;
284
+ for (i = 0; i < enc->size_; ++i) {
285
+ FrameRelease(&enc->encoded_frames_[i]);
286
+ }
287
+ WebPSafeFree(enc->encoded_frames_);
288
+ }
289
+ WebPMuxDelete(enc->mux_);
290
+ WebPSafeFree(enc);
291
+ }
292
+ }
293
+
294
+ // -----------------------------------------------------------------------------
295
+ // Frame addition.
296
+
297
+ // Returns cached frame at the given 'position'.
298
+ static EncodedFrame* GetFrame(const WebPAnimEncoder* const enc,
299
+ size_t position) {
300
+ assert(enc->start_ + position < enc->size_);
301
+ return &enc->encoded_frames_[enc->start_ + position];
302
+ }
303
+
304
+ // Returns true if 'length' number of pixels in 'src' and 'dst' are identical,
305
+ // assuming the given step sizes between pixels.
306
+ static WEBP_INLINE int ComparePixels(const uint32_t* src, int src_step,
307
+ const uint32_t* dst, int dst_step,
308
+ int length) {
309
+ assert(length > 0);
310
+ while (length-- > 0) {
311
+ if (*src != *dst) {
312
+ return 0;
313
+ }
314
+ src += src_step;
315
+ dst += dst_step;
316
+ }
317
+ return 1;
318
+ }
319
+
320
+ // Assumes that an initial valid guess of change rectangle 'rect' is passed.
321
+ static void MinimizeChangeRectangle(const WebPPicture* const src,
322
+ const WebPPicture* const dst,
323
+ FrameRect* const rect) {
324
+ int i, j;
325
+ // Sanity checks.
326
+ assert(src->width == dst->width && src->height == dst->height);
327
+ assert(rect->x_offset_ + rect->width_ <= dst->width);
328
+ assert(rect->y_offset_ + rect->height_ <= dst->height);
329
+
330
+ // Left boundary.
331
+ for (i = rect->x_offset_; i < rect->x_offset_ + rect->width_; ++i) {
332
+ const uint32_t* const src_argb =
333
+ &src->argb[rect->y_offset_ * src->argb_stride + i];
334
+ const uint32_t* const dst_argb =
335
+ &dst->argb[rect->y_offset_ * dst->argb_stride + i];
336
+ if (ComparePixels(src_argb, src->argb_stride, dst_argb, dst->argb_stride,
337
+ rect->height_)) {
338
+ --rect->width_; // Redundant column.
339
+ ++rect->x_offset_;
340
+ } else {
341
+ break;
342
+ }
343
+ }
344
+ if (rect->width_ == 0) goto End;
345
+
346
+ // Right boundary.
347
+ for (i = rect->x_offset_ + rect->width_ - 1; i >= rect->x_offset_; --i) {
348
+ const uint32_t* const src_argb =
349
+ &src->argb[rect->y_offset_ * src->argb_stride + i];
350
+ const uint32_t* const dst_argb =
351
+ &dst->argb[rect->y_offset_ * dst->argb_stride + i];
352
+ if (ComparePixels(src_argb, src->argb_stride, dst_argb, dst->argb_stride,
353
+ rect->height_)) {
354
+ --rect->width_; // Redundant column.
355
+ } else {
356
+ break;
357
+ }
358
+ }
359
+ if (rect->width_ == 0) goto End;
360
+
361
+ // Top boundary.
362
+ for (j = rect->y_offset_; j < rect->y_offset_ + rect->height_; ++j) {
363
+ const uint32_t* const src_argb =
364
+ &src->argb[j * src->argb_stride + rect->x_offset_];
365
+ const uint32_t* const dst_argb =
366
+ &dst->argb[j * dst->argb_stride + rect->x_offset_];
367
+ if (ComparePixels(src_argb, 1, dst_argb, 1, rect->width_)) {
368
+ --rect->height_; // Redundant row.
369
+ ++rect->y_offset_;
370
+ } else {
371
+ break;
372
+ }
373
+ }
374
+ if (rect->height_ == 0) goto End;
375
+
376
+ // Bottom boundary.
377
+ for (j = rect->y_offset_ + rect->height_ - 1; j >= rect->y_offset_; --j) {
378
+ const uint32_t* const src_argb =
379
+ &src->argb[j * src->argb_stride + rect->x_offset_];
380
+ const uint32_t* const dst_argb =
381
+ &dst->argb[j * dst->argb_stride + rect->x_offset_];
382
+ if (ComparePixels(src_argb, 1, dst_argb, 1, rect->width_)) {
383
+ --rect->height_; // Redundant row.
384
+ } else {
385
+ break;
386
+ }
387
+ }
388
+ if (rect->height_ == 0) goto End;
389
+
390
+ if (rect->width_ == 0 || rect->height_ == 0) {
391
+ End:
392
+ // TODO(later): This rare case can happen for a bad GIF. In such a case, the
393
+ // frame should not be encoded at all and the duration of prev frame should
394
+ // be increased instead. For now, we just create a 1x1 frame at zero offset.
395
+ rect->x_offset_ = 0;
396
+ rect->y_offset_ = 0;
397
+ rect->width_ = 1;
398
+ rect->height_ = 1;
399
+ }
400
+ }
401
+
402
+ // Snap rectangle to even offsets (and adjust dimensions if needed).
403
+ static WEBP_INLINE void SnapToEvenOffsets(FrameRect* const rect) {
404
+ rect->width_ += (rect->x_offset_ & 1);
405
+ rect->height_ += (rect->y_offset_ & 1);
406
+ rect->x_offset_ &= ~1;
407
+ rect->y_offset_ &= ~1;
408
+ }
409
+
410
+ // Given previous and current canvas, picks the optimal rectangle for the
411
+ // current frame. The initial guess for 'rect' will be the full canvas.
412
+ static int GetSubRect(const WebPPicture* const prev_canvas,
413
+ const WebPPicture* const curr_canvas, int is_key_frame,
414
+ int is_first_frame, FrameRect* const rect,
415
+ WebPPicture* const sub_frame) {
416
+ rect->x_offset_ = 0;
417
+ rect->y_offset_ = 0;
418
+ rect->width_ = curr_canvas->width;
419
+ rect->height_ = curr_canvas->height;
420
+ if (!is_key_frame || is_first_frame) { // Optimize frame rectangle.
421
+ // Note: This behaves as expected for first frame, as 'prev_canvas' is
422
+ // initialized to a fully transparent canvas in the beginning.
423
+ MinimizeChangeRectangle(prev_canvas, curr_canvas, rect);
424
+ }
425
+ SnapToEvenOffsets(rect);
426
+
427
+ return WebPPictureView(curr_canvas, rect->x_offset_, rect->y_offset_,
428
+ rect->width_, rect->height_, sub_frame);
429
+ }
430
+
431
+ // TODO: Also used in picture.c. Move to a common location?
432
+ // Copy width x height pixels from 'src' to 'dst' honoring the strides.
433
+ static void CopyPlane(const uint8_t* src, int src_stride,
434
+ uint8_t* dst, int dst_stride, int width, int height) {
435
+ while (height-- > 0) {
436
+ memcpy(dst, src, width);
437
+ src += src_stride;
438
+ dst += dst_stride;
439
+ }
440
+ }
441
+
442
+ // Copy pixels from 'src' to 'dst' honoring strides. 'src' and 'dst' are assumed
443
+ // to be already allocated.
444
+ static void CopyPixels(const WebPPicture* const src, WebPPicture* const dst) {
445
+ assert(src->width == dst->width && src->height == dst->height);
446
+ assert(src->use_argb && dst->use_argb);
447
+ CopyPlane((uint8_t*)src->argb, 4 * src->argb_stride, (uint8_t*)dst->argb,
448
+ 4 * dst->argb_stride, 4 * src->width, src->height);
449
+ }
450
+
451
+ static void DisposeFrameRectangle(int dispose_method,
452
+ const FrameRect* const rect,
453
+ WebPPicture* const curr_canvas) {
454
+ assert(rect != NULL);
455
+ if (dispose_method == WEBP_MUX_DISPOSE_BACKGROUND) {
456
+ WebPUtilClearPic(curr_canvas, rect);
457
+ }
458
+ }
459
+
460
+ static uint32_t RectArea(const FrameRect* const rect) {
461
+ return (uint32_t)rect->width_ * rect->height_;
462
+ }
463
+
464
+ static int IsBlendingPossible(const WebPPicture* const src,
465
+ const WebPPicture* const dst,
466
+ const FrameRect* const rect) {
467
+ int i, j;
468
+ assert(src->width == dst->width && src->height == dst->height);
469
+ assert(rect->x_offset_ + rect->width_ <= dst->width);
470
+ assert(rect->y_offset_ + rect->height_ <= dst->height);
471
+ for (j = rect->y_offset_; j < rect->y_offset_ + rect->height_; ++j) {
472
+ for (i = rect->x_offset_; i < rect->x_offset_ + rect->width_; ++i) {
473
+ const uint32_t src_pixel = src->argb[j * src->argb_stride + i];
474
+ const uint32_t dst_pixel = dst->argb[j * dst->argb_stride + i];
475
+ const uint32_t dst_alpha = dst_pixel >> 24;
476
+ if (dst_alpha != 0xff && src_pixel != dst_pixel) {
477
+ // In this case, if we use blending, we can't attain the desired
478
+ // 'dst_pixel' value for this pixel. So, blending is not possible.
479
+ return 0;
480
+ }
481
+ }
482
+ }
483
+ return 1;
484
+ }
485
+
486
+ #define MIN_COLORS_LOSSY 31 // Don't try lossy below this threshold.
487
+ #define MAX_COLORS_LOSSLESS 194 // Don't try lossless above this threshold.
488
+ #define MAX_COLOR_COUNT 256 // Power of 2 greater than MAX_COLORS_LOSSLESS.
489
+ #define HASH_SIZE (MAX_COLOR_COUNT * 4)
490
+ #define HASH_RIGHT_SHIFT 22 // 32 - log2(HASH_SIZE).
491
+
492
+ // TODO(urvang): Also used in enc/vp8l.c. Move to utils.
493
+ // If the number of colors in the 'pic' is at least MAX_COLOR_COUNT, return
494
+ // MAX_COLOR_COUNT. Otherwise, return the exact number of colors in the 'pic'.
495
+ static int GetColorCount(const WebPPicture* const pic) {
496
+ int x, y;
497
+ int num_colors = 0;
498
+ uint8_t in_use[HASH_SIZE] = { 0 };
499
+ uint32_t colors[HASH_SIZE];
500
+ static const uint32_t kHashMul = 0x1e35a7bd;
501
+ const uint32_t* argb = pic->argb;
502
+ const int width = pic->width;
503
+ const int height = pic->height;
504
+ uint32_t last_pix = ~argb[0]; // so we're sure that last_pix != argb[0]
505
+
506
+ for (y = 0; y < height; ++y) {
507
+ for (x = 0; x < width; ++x) {
508
+ int key;
509
+ if (argb[x] == last_pix) {
510
+ continue;
511
+ }
512
+ last_pix = argb[x];
513
+ key = (kHashMul * last_pix) >> HASH_RIGHT_SHIFT;
514
+ while (1) {
515
+ if (!in_use[key]) {
516
+ colors[key] = last_pix;
517
+ in_use[key] = 1;
518
+ ++num_colors;
519
+ if (num_colors >= MAX_COLOR_COUNT) {
520
+ return MAX_COLOR_COUNT; // Exact count not needed.
521
+ }
522
+ break;
523
+ } else if (colors[key] == last_pix) {
524
+ break; // The color is already there.
525
+ } else {
526
+ // Some other color sits here, so do linear conflict resolution.
527
+ ++key;
528
+ key &= (HASH_SIZE - 1); // Key mask.
529
+ }
530
+ }
531
+ }
532
+ argb += pic->argb_stride;
533
+ }
534
+ return num_colors;
535
+ }
536
+
537
+ #undef MAX_COLOR_COUNT
538
+ #undef HASH_SIZE
539
+ #undef HASH_RIGHT_SHIFT
540
+
541
+ // For pixels in 'rect', replace those pixels in 'dst' that are same as 'src' by
542
+ // transparent pixels.
543
+ static void IncreaseTransparency(const WebPPicture* const src,
544
+ const FrameRect* const rect,
545
+ WebPPicture* const dst) {
546
+ int i, j;
547
+ assert(src != NULL && dst != NULL && rect != NULL);
548
+ assert(src->width == dst->width && src->height == dst->height);
549
+ for (j = rect->y_offset_; j < rect->y_offset_ + rect->height_; ++j) {
550
+ const uint32_t* const psrc = src->argb + j * src->argb_stride;
551
+ uint32_t* const pdst = dst->argb + j * dst->argb_stride;
552
+ for (i = rect->x_offset_; i < rect->x_offset_ + rect->width_; ++i) {
553
+ if (psrc[i] == pdst[i]) {
554
+ pdst[i] = TRANSPARENT_COLOR;
555
+ }
556
+ }
557
+ }
558
+ }
559
+
560
+ #undef TRANSPARENT_COLOR
561
+
562
+ // Replace similar blocks of pixels by a 'see-through' transparent block
563
+ // with uniform average color.
564
+ static void FlattenSimilarBlocks(const WebPPicture* const src,
565
+ const FrameRect* const rect,
566
+ WebPPicture* const dst) {
567
+ int i, j;
568
+ const int block_size = 8;
569
+ const int y_start = (rect->y_offset_ + block_size) & ~(block_size - 1);
570
+ const int y_end = (rect->y_offset_ + rect->height_) & ~(block_size - 1);
571
+ const int x_start = (rect->x_offset_ + block_size) & ~(block_size - 1);
572
+ const int x_end = (rect->x_offset_ + rect->width_) & ~(block_size - 1);
573
+ assert(src != NULL && dst != NULL && rect != NULL);
574
+ assert(src->width == dst->width && src->height == dst->height);
575
+ assert((block_size & (block_size - 1)) == 0); // must be a power of 2
576
+ // Iterate over each block and count similar pixels.
577
+ for (j = y_start; j < y_end; j += block_size) {
578
+ for (i = x_start; i < x_end; i += block_size) {
579
+ int cnt = 0;
580
+ int avg_r = 0, avg_g = 0, avg_b = 0;
581
+ int x, y;
582
+ const uint32_t* const psrc = src->argb + j * src->argb_stride + i;
583
+ uint32_t* const pdst = dst->argb + j * dst->argb_stride + i;
584
+ for (y = 0; y < block_size; ++y) {
585
+ for (x = 0; x < block_size; ++x) {
586
+ const uint32_t src_pixel = psrc[x + y * src->argb_stride];
587
+ const int alpha = src_pixel >> 24;
588
+ if (alpha == 0xff &&
589
+ src_pixel == pdst[x + y * dst->argb_stride]) {
590
+ ++cnt;
591
+ avg_r += (src_pixel >> 16) & 0xff;
592
+ avg_g += (src_pixel >> 8) & 0xff;
593
+ avg_b += (src_pixel >> 0) & 0xff;
594
+ }
595
+ }
596
+ }
597
+ // If we have a fully similar block, we replace it with an
598
+ // average transparent block. This compresses better in lossy mode.
599
+ if (cnt == block_size * block_size) {
600
+ const uint32_t color = (0x00 << 24) |
601
+ ((avg_r / cnt) << 16) |
602
+ ((avg_g / cnt) << 8) |
603
+ ((avg_b / cnt) << 0);
604
+ for (y = 0; y < block_size; ++y) {
605
+ for (x = 0; x < block_size; ++x) {
606
+ pdst[x + y * dst->argb_stride] = color;
607
+ }
608
+ }
609
+ }
610
+ }
611
+ }
612
+ }
613
+
614
+ static int EncodeFrame(const WebPConfig* const config, WebPPicture* const pic,
615
+ WebPMemoryWriter* const memory) {
616
+ pic->use_argb = 1;
617
+ pic->writer = WebPMemoryWrite;
618
+ pic->custom_ptr = memory;
619
+ if (!WebPEncode(config, pic)) {
620
+ return 0;
621
+ }
622
+ return 1;
623
+ }
624
+
625
+ // Struct representing a candidate encoded frame including its metadata.
626
+ typedef struct {
627
+ WebPMemoryWriter mem_;
628
+ WebPMuxFrameInfo info_;
629
+ FrameRect rect_;
630
+ int evaluate_; // True if this candidate should be evaluated.
631
+ } Candidate;
632
+
633
+ // Generates a candidate encoded frame given a picture and metadata.
634
+ static WebPEncodingError EncodeCandidate(WebPPicture* const sub_frame,
635
+ const FrameRect* const rect,
636
+ const WebPConfig* const config,
637
+ int use_blending, int duration,
638
+ Candidate* const candidate) {
639
+ WebPEncodingError error_code = VP8_ENC_OK;
640
+ assert(candidate != NULL);
641
+ memset(candidate, 0, sizeof(*candidate));
642
+
643
+ // Set frame rect and info.
644
+ candidate->rect_ = *rect;
645
+ candidate->info_.id = WEBP_CHUNK_ANMF;
646
+ candidate->info_.x_offset = rect->x_offset_;
647
+ candidate->info_.y_offset = rect->y_offset_;
648
+ candidate->info_.dispose_method = WEBP_MUX_DISPOSE_NONE; // Set later.
649
+ candidate->info_.blend_method =
650
+ use_blending ? WEBP_MUX_BLEND : WEBP_MUX_NO_BLEND;
651
+ candidate->info_.duration = duration;
652
+
653
+ // Encode picture.
654
+ WebPMemoryWriterInit(&candidate->mem_);
655
+
656
+ if (!EncodeFrame(config, sub_frame, &candidate->mem_)) {
657
+ error_code = sub_frame->error_code;
658
+ goto Err;
659
+ }
660
+
661
+ candidate->evaluate_ = 1;
662
+ return error_code;
663
+
664
+ Err:
665
+ WebPMemoryWriterClear(&candidate->mem_);
666
+ return error_code;
667
+ }
668
+
669
+ static void CopyCurrentCanvas(WebPAnimEncoder* const enc) {
670
+ if (enc->curr_canvas_copy_modified_) {
671
+ CopyPixels(enc->curr_canvas_, &enc->curr_canvas_copy_);
672
+ enc->curr_canvas_copy_modified_ = 0;
673
+ }
674
+ }
675
+
676
+ enum {
677
+ LL_DISP_NONE = 0,
678
+ LL_DISP_BG,
679
+ LOSSY_DISP_NONE,
680
+ LOSSY_DISP_BG,
681
+ CANDIDATE_COUNT
682
+ };
683
+
684
+ // Generates candidates for a given dispose method given pre-filled 'rect'
685
+ // and 'sub_frame'.
686
+ static WebPEncodingError GenerateCandidates(
687
+ WebPAnimEncoder* const enc, Candidate candidates[CANDIDATE_COUNT],
688
+ WebPMuxAnimDispose dispose_method, int is_lossless, int is_key_frame,
689
+ const FrameRect* const rect, WebPPicture* sub_frame, int duration,
690
+ const WebPConfig* const config_ll, const WebPConfig* const config_lossy) {
691
+ WebPEncodingError error_code = VP8_ENC_OK;
692
+ const int is_dispose_none = (dispose_method == WEBP_MUX_DISPOSE_NONE);
693
+ Candidate* const candidate_ll =
694
+ is_dispose_none ? &candidates[LL_DISP_NONE] : &candidates[LL_DISP_BG];
695
+ Candidate* const candidate_lossy = is_dispose_none
696
+ ? &candidates[LOSSY_DISP_NONE]
697
+ : &candidates[LOSSY_DISP_BG];
698
+ WebPPicture* const curr_canvas = &enc->curr_canvas_copy_;
699
+ const WebPPicture* const prev_canvas =
700
+ is_dispose_none ? &enc->prev_canvas_ : &enc->prev_canvas_disposed_;
701
+ const int use_blending =
702
+ !is_key_frame &&
703
+ IsBlendingPossible(prev_canvas, curr_canvas, rect);
704
+
705
+ // Pick candidates to be tried.
706
+ if (!enc->options_.allow_mixed) {
707
+ candidate_ll->evaluate_ = is_lossless;
708
+ candidate_lossy->evaluate_ = !is_lossless;
709
+ } else { // Use a heuristic for trying lossless and/or lossy compression.
710
+ const int num_colors = GetColorCount(sub_frame);
711
+ candidate_ll->evaluate_ = (num_colors < MAX_COLORS_LOSSLESS);
712
+ candidate_lossy->evaluate_ = (num_colors >= MIN_COLORS_LOSSY);
713
+ }
714
+
715
+ // Generate candidates.
716
+ if (candidate_ll->evaluate_) {
717
+ CopyCurrentCanvas(enc);
718
+ if (use_blending) {
719
+ IncreaseTransparency(prev_canvas, rect, curr_canvas);
720
+ enc->curr_canvas_copy_modified_ = 1;
721
+ }
722
+ error_code = EncodeCandidate(sub_frame, rect, config_ll, use_blending,
723
+ duration, candidate_ll);
724
+ if (error_code != VP8_ENC_OK) return error_code;
725
+ }
726
+ if (candidate_lossy->evaluate_) {
727
+ CopyCurrentCanvas(enc);
728
+ if (use_blending) {
729
+ FlattenSimilarBlocks(prev_canvas, rect, curr_canvas);
730
+ enc->curr_canvas_copy_modified_ = 1;
731
+ }
732
+ error_code = EncodeCandidate(sub_frame, rect, config_lossy, use_blending,
733
+ duration, candidate_lossy);
734
+ if (error_code != VP8_ENC_OK) return error_code;
735
+ }
736
+ return error_code;
737
+ }
738
+
739
+ #undef MIN_COLORS_LOSSY
740
+ #undef MAX_COLORS_LOSSLESS
741
+
742
+ static void GetEncodedData(const WebPMemoryWriter* const memory,
743
+ WebPData* const encoded_data) {
744
+ encoded_data->bytes = memory->mem;
745
+ encoded_data->size = memory->size;
746
+ }
747
+
748
+ // Sets dispose method of the previous frame to be 'dispose_method'.
749
+ static void SetPreviousDisposeMethod(WebPAnimEncoder* const enc,
750
+ WebPMuxAnimDispose dispose_method) {
751
+ const size_t position = enc->count_ - 2;
752
+ EncodedFrame* const prev_enc_frame = GetFrame(enc, position);
753
+ assert(enc->count_ >= 2); // As current and previous frames are in enc.
754
+
755
+ if (enc->prev_candidate_undecided_) {
756
+ assert(dispose_method == WEBP_MUX_DISPOSE_NONE);
757
+ prev_enc_frame->sub_frame_.dispose_method = dispose_method;
758
+ prev_enc_frame->key_frame_.dispose_method = dispose_method;
759
+ } else {
760
+ WebPMuxFrameInfo* const prev_info = prev_enc_frame->is_key_frame_
761
+ ? &prev_enc_frame->key_frame_
762
+ : &prev_enc_frame->sub_frame_;
763
+ prev_info->dispose_method = dispose_method;
764
+ }
765
+ }
766
+
767
+ // Pick the candidate encoded frame with smallest size and release other
768
+ // candidates.
769
+ // TODO(later): Perhaps a rough SSIM/PSNR produced by the encoder should
770
+ // also be a criteria, in addition to sizes.
771
+ static void PickBestCandidate(WebPAnimEncoder* const enc,
772
+ Candidate* const candidates, int is_key_frame,
773
+ EncodedFrame* const encoded_frame) {
774
+ int i;
775
+ int best_idx = -1;
776
+ size_t best_size = ~0;
777
+ for (i = 0; i < CANDIDATE_COUNT; ++i) {
778
+ if (candidates[i].evaluate_) {
779
+ const size_t candidate_size = candidates[i].mem_.size;
780
+ if (candidate_size < best_size) {
781
+ best_idx = i;
782
+ best_size = candidate_size;
783
+ }
784
+ }
785
+ }
786
+ assert(best_idx != -1);
787
+ for (i = 0; i < CANDIDATE_COUNT; ++i) {
788
+ if (candidates[i].evaluate_) {
789
+ if (i == best_idx) {
790
+ WebPMuxFrameInfo* const dst = is_key_frame
791
+ ? &encoded_frame->key_frame_
792
+ : &encoded_frame->sub_frame_;
793
+ *dst = candidates[i].info_;
794
+ GetEncodedData(&candidates[i].mem_, &dst->bitstream);
795
+ if (!is_key_frame) {
796
+ // Note: Previous dispose method only matters for non-keyframes.
797
+ // Also, we don't want to modify previous dispose method that was
798
+ // selected when a non key-frame was assumed.
799
+ const WebPMuxAnimDispose prev_dispose_method =
800
+ (best_idx == LL_DISP_NONE || best_idx == LOSSY_DISP_NONE)
801
+ ? WEBP_MUX_DISPOSE_NONE
802
+ : WEBP_MUX_DISPOSE_BACKGROUND;
803
+ SetPreviousDisposeMethod(enc, prev_dispose_method);
804
+ }
805
+ enc->prev_rect = candidates[i].rect_; // save for next frame.
806
+ } else {
807
+ WebPMemoryWriterClear(&candidates[i].mem_);
808
+ candidates[i].evaluate_ = 0;
809
+ }
810
+ }
811
+ }
812
+ }
813
+
814
+ // Depending on the configuration, tries different compressions
815
+ // (lossy/lossless), dispose methods, blending methods etc to encode the current
816
+ // frame and outputs the best one in 'encoded_frame'.
817
+ static WebPEncodingError SetFrame(WebPAnimEncoder* const enc, int duration,
818
+ const WebPConfig* const config,
819
+ int is_key_frame,
820
+ EncodedFrame* const encoded_frame) {
821
+ int i;
822
+ WebPEncodingError error_code = VP8_ENC_OK;
823
+ const WebPPicture* const curr_canvas = &enc->curr_canvas_copy_;
824
+ const WebPPicture* const prev_canvas = &enc->prev_canvas_;
825
+ Candidate candidates[CANDIDATE_COUNT];
826
+ const int is_lossless = config->lossless;
827
+ const int is_first_frame = enc->is_first_frame_;
828
+
829
+ int try_dispose_none = 1; // Default.
830
+ FrameRect rect_none;
831
+ WebPPicture sub_frame_none;
832
+
833
+ // If current frame is a key-frame, dispose method of previous frame doesn't
834
+ // matter, so we don't try dispose to background.
835
+ // Also, if key-frame insertion is on, and previous frame could be picked as
836
+ // either a sub-frame or a key-frame, then we can't be sure about what frame
837
+ // rectangle would be disposed. In that case too, we don't try dispose to
838
+ // background.
839
+ const int dispose_bg_possible =
840
+ !is_key_frame && !enc->prev_candidate_undecided_;
841
+ int try_dispose_bg = 0; // Default.
842
+ FrameRect rect_bg;
843
+ WebPPicture sub_frame_bg;
844
+
845
+ WebPConfig config_ll = *config;
846
+ WebPConfig config_lossy = *config;
847
+ config_ll.lossless = 1;
848
+ config_lossy.lossless = 0;
849
+ enc->last_config = *config;
850
+ enc->last_config2 = config->lossless ? config_lossy : config_ll;
851
+
852
+ if (!WebPPictureInit(&sub_frame_none) || !WebPPictureInit(&sub_frame_bg)) {
853
+ return VP8_ENC_ERROR_INVALID_CONFIGURATION;
854
+ }
855
+
856
+ for (i = 0; i < CANDIDATE_COUNT; ++i) {
857
+ candidates[i].evaluate_ = 0;
858
+ }
859
+
860
+ // Change-rectangle assuming previous frame was DISPOSE_NONE.
861
+ GetSubRect(prev_canvas, curr_canvas, is_key_frame, is_first_frame,
862
+ &rect_none, &sub_frame_none);
863
+
864
+ if (dispose_bg_possible) {
865
+ // Change-rectangle assuming previous frame was DISPOSE_BACKGROUND.
866
+ WebPPicture* const prev_canvas_disposed = &enc->prev_canvas_disposed_;
867
+ CopyPixels(prev_canvas, prev_canvas_disposed);
868
+ DisposeFrameRectangle(WEBP_MUX_DISPOSE_BACKGROUND, &enc->prev_rect,
869
+ prev_canvas_disposed);
870
+ GetSubRect(prev_canvas_disposed, curr_canvas, is_key_frame, is_first_frame,
871
+ &rect_bg, &sub_frame_bg);
872
+
873
+ if (enc->options_.minimize_size) { // Try both dispose methods.
874
+ try_dispose_bg = 1;
875
+ try_dispose_none = 1;
876
+ } else if (RectArea(&rect_bg) < RectArea(&rect_none)) {
877
+ try_dispose_bg = 1; // Pick DISPOSE_BACKGROUND.
878
+ try_dispose_none = 0;
879
+ }
880
+ }
881
+
882
+ if (try_dispose_none) {
883
+ error_code = GenerateCandidates(
884
+ enc, candidates, WEBP_MUX_DISPOSE_NONE, is_lossless, is_key_frame,
885
+ &rect_none, &sub_frame_none, duration, &config_ll, &config_lossy);
886
+ if (error_code != VP8_ENC_OK) goto Err;
887
+ }
888
+
889
+ if (try_dispose_bg) {
890
+ assert(!enc->is_first_frame_);
891
+ assert(dispose_bg_possible);
892
+ error_code =
893
+ GenerateCandidates(enc, candidates, WEBP_MUX_DISPOSE_BACKGROUND,
894
+ is_lossless, is_key_frame, &rect_bg, &sub_frame_bg,
895
+ duration, &config_ll, &config_lossy);
896
+ if (error_code != VP8_ENC_OK) goto Err;
897
+ }
898
+
899
+ PickBestCandidate(enc, candidates, is_key_frame, encoded_frame);
900
+
901
+ goto End;
902
+
903
+ Err:
904
+ for (i = 0; i < CANDIDATE_COUNT; ++i) {
905
+ if (candidates[i].evaluate_) {
906
+ WebPMemoryWriterClear(&candidates[i].mem_);
907
+ }
908
+ }
909
+
910
+ End:
911
+ WebPPictureFree(&sub_frame_none);
912
+ WebPPictureFree(&sub_frame_bg);
913
+ return error_code;
914
+ }
915
+
916
+ // Calculate the penalty incurred if we encode given frame as a key frame
917
+ // instead of a sub-frame.
918
+ static int64_t KeyFramePenalty(const EncodedFrame* const encoded_frame) {
919
+ return ((int64_t)encoded_frame->key_frame_.bitstream.size -
920
+ encoded_frame->sub_frame_.bitstream.size);
921
+ }
922
+
923
+ static int CacheFrame(WebPAnimEncoder* const enc, int duration,
924
+ const WebPConfig* const config) {
925
+ int ok = 0;
926
+ WebPEncodingError error_code = VP8_ENC_OK;
927
+ const size_t position = enc->count_;
928
+ EncodedFrame* const encoded_frame = GetFrame(enc, position);
929
+
930
+ ++enc->count_;
931
+
932
+ if (enc->is_first_frame_) { // Add this as a key-frame.
933
+ error_code =
934
+ SetFrame(enc, duration, config, 1, encoded_frame);
935
+ if (error_code != VP8_ENC_OK) {
936
+ goto End;
937
+ }
938
+ assert(position == 0 && enc->count_ == 1);
939
+ encoded_frame->is_key_frame_ = 1;
940
+ enc->flush_count_ = 0;
941
+ enc->count_since_key_frame_ = 0;
942
+ enc->prev_candidate_undecided_ = 0;
943
+ } else {
944
+ ++enc->count_since_key_frame_;
945
+ if (enc->count_since_key_frame_ <= enc->options_.kmin) {
946
+ // Add this as a frame rectangle.
947
+ error_code = SetFrame(enc, duration, config, 0, encoded_frame);
948
+ if (error_code != VP8_ENC_OK) {
949
+ goto End;
950
+ }
951
+ encoded_frame->is_key_frame_ = 0;
952
+ enc->flush_count_ = enc->count_ - 1;
953
+ enc->prev_candidate_undecided_ = 0;
954
+ } else {
955
+ int64_t curr_delta;
956
+
957
+ // Add this as a frame rectangle to enc.
958
+ error_code = SetFrame(enc, duration, config, 0, encoded_frame);
959
+ if (error_code != VP8_ENC_OK) goto End;
960
+
961
+ // Add this as a key-frame to enc, too.
962
+ error_code = SetFrame(enc, duration, config, 1, encoded_frame);
963
+ if (error_code != VP8_ENC_OK) goto End;
964
+
965
+ // Analyze size difference of the two variants.
966
+ curr_delta = KeyFramePenalty(encoded_frame);
967
+ if (curr_delta <= enc->best_delta_) { // Pick this as the key-frame.
968
+ if (enc->keyframe_ != KEYFRAME_NONE) {
969
+ EncodedFrame* const old_keyframe = GetFrame(enc, enc->keyframe_);
970
+ assert(old_keyframe->is_key_frame_);
971
+ old_keyframe->is_key_frame_ = 0;
972
+ }
973
+ encoded_frame->is_key_frame_ = 1;
974
+ enc->keyframe_ = (int)position;
975
+ enc->best_delta_ = curr_delta;
976
+ enc->flush_count_ = enc->count_ - 1; // We can flush previous frames.
977
+ } else {
978
+ encoded_frame->is_key_frame_ = 0;
979
+ }
980
+ // Note: We need '>=' below because when kmin and kmax are both zero,
981
+ // count_since_key_frame will always be > kmax.
982
+ if (enc->count_since_key_frame_ >= enc->options_.kmax) {
983
+ enc->flush_count_ = enc->count_ - 1;
984
+ enc->count_since_key_frame_ = 0;
985
+ enc->keyframe_ = KEYFRAME_NONE;
986
+ enc->best_delta_ = DELTA_INFINITY;
987
+ }
988
+ enc->prev_candidate_undecided_ = 1;
989
+ }
990
+ }
991
+
992
+ // Update previous to previous and previous canvases for next call.
993
+ CopyPixels(enc->curr_canvas_, &enc->prev_canvas_);
994
+ enc->is_first_frame_ = 0;
995
+ ok = 1;
996
+
997
+ End:
998
+ if (!ok) {
999
+ FrameRelease(encoded_frame);
1000
+ --enc->count_; // We reset the count, as the frame addition failed.
1001
+ if (enc->options_.verbose) {
1002
+ fprintf(stderr, "ERROR adding frame. WebPEncodingError: %d.\n",
1003
+ error_code);
1004
+ }
1005
+ }
1006
+ enc->curr_canvas_->error_code = error_code; // report error_code
1007
+ assert(ok || error_code != VP8_ENC_OK);
1008
+ return ok;
1009
+ }
1010
+
1011
+ static int FlushFrames(WebPAnimEncoder* const enc) {
1012
+ while (enc->flush_count_ > 0) {
1013
+ WebPMuxError err;
1014
+ EncodedFrame* const curr = GetFrame(enc, 0);
1015
+ const WebPMuxFrameInfo* const info =
1016
+ curr->is_key_frame_ ? &curr->key_frame_ : &curr->sub_frame_;
1017
+ assert(enc->mux_ != NULL);
1018
+ err = WebPMuxPushFrame(enc->mux_, info, 1);
1019
+ if (err != WEBP_MUX_OK) {
1020
+ if (enc->options_.verbose) {
1021
+ fprintf(stderr, "ERROR adding frame. WebPMuxError: %d.\n", err);
1022
+ }
1023
+ return 0;
1024
+ }
1025
+ if (enc->options_.verbose) {
1026
+ fprintf(stderr,
1027
+ "Added frame. offset:%d,%d duration:%d dispose:%d blend:%d\n",
1028
+ info->x_offset, info->y_offset, info->duration,
1029
+ info->dispose_method, info->blend_method);
1030
+ }
1031
+ ++enc->frame_count_;
1032
+ FrameRelease(curr);
1033
+ ++enc->start_;
1034
+ --enc->flush_count_;
1035
+ --enc->count_;
1036
+ if (enc->keyframe_ != KEYFRAME_NONE) --enc->keyframe_;
1037
+ }
1038
+
1039
+ if (enc->count_ == 1 && enc->start_ != 0) {
1040
+ // Move enc->start to index 0.
1041
+ const int enc_start_tmp = (int)enc->start_;
1042
+ EncodedFrame temp = enc->encoded_frames_[0];
1043
+ enc->encoded_frames_[0] = enc->encoded_frames_[enc_start_tmp];
1044
+ enc->encoded_frames_[enc_start_tmp] = temp;
1045
+ FrameRelease(&enc->encoded_frames_[enc_start_tmp]);
1046
+ enc->start_ = 0;
1047
+ }
1048
+ return 1;
1049
+ }
1050
+
1051
+ #undef DELTA_INFINITY
1052
+ #undef KEYFRAME_NONE
1053
+
1054
+ int WebPAnimEncoderAdd(WebPAnimEncoder* enc, WebPPicture* frame, int duration,
1055
+ const WebPConfig* encoder_config) {
1056
+ WebPConfig config;
1057
+ if (enc == NULL || frame == NULL) {
1058
+ return 0;
1059
+ }
1060
+ if (frame->width != enc->canvas_width_ ||
1061
+ frame->height != enc->canvas_height_ || !frame->use_argb ||
1062
+ duration < 0) {
1063
+ frame->error_code = VP8_ENC_ERROR_INVALID_CONFIGURATION;
1064
+ if (enc->options_.verbose) {
1065
+ fprintf(stderr, "ERROR adding frame: Invalid input.\n");
1066
+ }
1067
+ return 0;
1068
+ }
1069
+ if (encoder_config != NULL) {
1070
+ config = *encoder_config;
1071
+ } else {
1072
+ WebPConfigInit(&config);
1073
+ config.lossless = 1;
1074
+ }
1075
+ assert(enc->curr_canvas_ == NULL);
1076
+ enc->curr_canvas_ = frame; // Store reference.
1077
+ assert(enc->curr_canvas_copy_modified_ == 1);
1078
+ CopyCurrentCanvas(enc);
1079
+
1080
+ if (!CacheFrame(enc, duration, &config)) {
1081
+ return 0;
1082
+ }
1083
+ if (!FlushFrames(enc)) {
1084
+ return 0;
1085
+ }
1086
+ enc->curr_canvas_ = NULL;
1087
+ enc->curr_canvas_copy_modified_ = 1;
1088
+ return 1;
1089
+ }
1090
+
1091
+ // -----------------------------------------------------------------------------
1092
+ // Bitstream assembly.
1093
+
1094
+ static int DecodeFrameOntoCanvas(const WebPMuxFrameInfo* const frame,
1095
+ WebPPicture* const canvas) {
1096
+ const WebPData* const image = &frame->bitstream;
1097
+ WebPPicture sub_image;
1098
+ WebPDecoderConfig config;
1099
+ WebPInitDecoderConfig(&config);
1100
+ WebPUtilClearPic(canvas, NULL);
1101
+ if (WebPGetFeatures(image->bytes, image->size, &config.input) !=
1102
+ VP8_STATUS_OK) {
1103
+ return 0;
1104
+ }
1105
+ if (!WebPPictureView(canvas, frame->x_offset, frame->y_offset,
1106
+ config.input.width, config.input.height, &sub_image)) {
1107
+ return 0;
1108
+ }
1109
+ config.output.is_external_memory = 1;
1110
+ config.output.colorspace = MODE_BGRA;
1111
+ config.output.u.RGBA.rgba = (uint8_t*)sub_image.argb;
1112
+ config.output.u.RGBA.stride = sub_image.argb_stride * 4;
1113
+ config.output.u.RGBA.size = config.output.u.RGBA.stride * sub_image.height;
1114
+
1115
+ if (WebPDecode(image->bytes, image->size, &config) != VP8_STATUS_OK) {
1116
+ return 0;
1117
+ }
1118
+ return 1;
1119
+ }
1120
+
1121
+ static int FrameToFullCanvas(WebPAnimEncoder* const enc,
1122
+ const WebPMuxFrameInfo* const frame,
1123
+ WebPData* const full_image) {
1124
+ WebPPicture* const canvas_buf = &enc->curr_canvas_copy_;
1125
+ WebPMemoryWriter mem1, mem2;
1126
+ WebPMemoryWriterInit(&mem1);
1127
+ WebPMemoryWriterInit(&mem2);
1128
+
1129
+ if (!DecodeFrameOntoCanvas(frame, canvas_buf)) goto Err;
1130
+ if (!EncodeFrame(&enc->last_config, canvas_buf, &mem1)) goto Err;
1131
+ GetEncodedData(&mem1, full_image);
1132
+
1133
+ if (enc->options_.allow_mixed) {
1134
+ if (!EncodeFrame(&enc->last_config, canvas_buf, &mem2)) goto Err;
1135
+ if (mem2.size < mem1.size) {
1136
+ GetEncodedData(&mem2, full_image);
1137
+ WebPMemoryWriterClear(&mem1);
1138
+ } else {
1139
+ WebPMemoryWriterClear(&mem2);
1140
+ }
1141
+ }
1142
+ return 1;
1143
+
1144
+ Err:
1145
+ WebPMemoryWriterClear(&mem1);
1146
+ WebPMemoryWriterClear(&mem2);
1147
+ return 0;
1148
+ }
1149
+
1150
+ // Convert a single-frame animation to a non-animated image if appropriate.
1151
+ // TODO(urvang): Can we pick one of the two heuristically (based on frame
1152
+ // rectangle and/or presence of alpha)?
1153
+ static WebPMuxError OptimizeSingleFrame(WebPAnimEncoder* const enc,
1154
+ WebPData* const webp_data) {
1155
+ WebPMuxError err = WEBP_MUX_OK;
1156
+ int canvas_width, canvas_height;
1157
+ WebPMuxFrameInfo frame;
1158
+ WebPData full_image;
1159
+ WebPData webp_data2;
1160
+ WebPMux* const mux = WebPMuxCreate(webp_data, 0);
1161
+ if (mux == NULL) return WEBP_MUX_BAD_DATA;
1162
+ assert(enc->frame_count_ == 1);
1163
+ WebPDataInit(&frame.bitstream);
1164
+ WebPDataInit(&full_image);
1165
+ WebPDataInit(&webp_data2);
1166
+
1167
+ err = WebPMuxGetFrame(mux, 1, &frame);
1168
+ if (err != WEBP_MUX_OK) goto End;
1169
+ if (frame.id != WEBP_CHUNK_ANMF) goto End; // Non-animation: nothing to do.
1170
+ err = WebPMuxGetCanvasSize(mux, &canvas_width, &canvas_height);
1171
+ if (err != WEBP_MUX_OK) goto End;
1172
+ if (!FrameToFullCanvas(enc, &frame, &full_image)) {
1173
+ err = WEBP_MUX_BAD_DATA;
1174
+ goto End;
1175
+ }
1176
+ err = WebPMuxSetImage(mux, &full_image, 1);
1177
+ if (err != WEBP_MUX_OK) goto End;
1178
+ err = WebPMuxAssemble(mux, &webp_data2);
1179
+ if (err != WEBP_MUX_OK) goto End;
1180
+
1181
+ if (webp_data2.size < webp_data->size) { // Pick 'webp_data2' if smaller.
1182
+ WebPDataClear(webp_data);
1183
+ *webp_data = webp_data2;
1184
+ WebPDataInit(&webp_data2);
1185
+ }
1186
+
1187
+ End:
1188
+ WebPDataClear(&frame.bitstream);
1189
+ WebPDataClear(&full_image);
1190
+ WebPMuxDelete(mux);
1191
+ WebPDataClear(&webp_data2);
1192
+ return err;
1193
+ }
1194
+
1195
+ int WebPAnimEncoderAssemble(WebPAnimEncoder* enc, WebPData* webp_data) {
1196
+ WebPMux* mux;
1197
+ WebPMuxError err;
1198
+
1199
+ if (enc == NULL) {
1200
+ return 0;
1201
+ }
1202
+ if (webp_data == NULL) {
1203
+ if (enc->options_.verbose) {
1204
+ fprintf(stderr, "ERROR assembling: NULL input\n");
1205
+ }
1206
+ return 0;
1207
+ }
1208
+
1209
+ // Flush any remaining frames.
1210
+ enc->flush_count_ = enc->count_;
1211
+ if (!FlushFrames(enc)) {
1212
+ return 0;
1213
+ }
1214
+
1215
+ // Set definitive canvas size.
1216
+ mux = enc->mux_;
1217
+ err = WebPMuxSetCanvasSize(mux, enc->canvas_width_, enc->canvas_height_);
1218
+ if (err != WEBP_MUX_OK) goto Err;
1219
+
1220
+ err = WebPMuxSetAnimationParams(mux, &enc->options_.anim_params);
1221
+ if (err != WEBP_MUX_OK) goto Err;
1222
+
1223
+ // Assemble into a WebP bitstream.
1224
+ err = WebPMuxAssemble(mux, webp_data);
1225
+ if (err != WEBP_MUX_OK) goto Err;
1226
+
1227
+ if (enc->frame_count_ == 1) {
1228
+ err = OptimizeSingleFrame(enc, webp_data);
1229
+ if (err != WEBP_MUX_OK) goto Err;
1230
+ }
1231
+
1232
+ return 1;
1233
+
1234
+ Err:
1235
+ if (enc->options_.verbose) {
1236
+ fprintf(stderr, "ERROR assembling WebP: %d\n", err);
1237
+ }
1238
+ return 0;
1239
+ }
1240
+
1241
+ // -----------------------------------------------------------------------------