rfreeimage 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (860) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +1 -0
  4. data/Rakefile +34 -0
  5. data/ext/rfreeimage/extconf.rb +35 -0
  6. data/ext/rfreeimage/rfi_main.c +389 -0
  7. data/lib/rfreeimage/image.rb +26 -0
  8. data/lib/rfreeimage/version.rb +3 -0
  9. data/lib/rfreeimage.rb +3 -0
  10. data/rfreeimage.gemspec +32 -0
  11. data/vendor/FreeImage/Makefile +34 -0
  12. data/vendor/FreeImage/Makefile.cygwin +74 -0
  13. data/vendor/FreeImage/Makefile.fip +84 -0
  14. data/vendor/FreeImage/Makefile.gnu +83 -0
  15. data/vendor/FreeImage/Makefile.iphone +96 -0
  16. data/vendor/FreeImage/Makefile.mingw +136 -0
  17. data/vendor/FreeImage/Makefile.osx +115 -0
  18. data/vendor/FreeImage/Makefile.solaris +66 -0
  19. data/vendor/FreeImage/Makefile.srcs +6 -0
  20. data/vendor/FreeImage/README.iphone +19 -0
  21. data/vendor/FreeImage/README.linux +50 -0
  22. data/vendor/FreeImage/README.minGW +236 -0
  23. data/vendor/FreeImage/README.osx +44 -0
  24. data/vendor/FreeImage/README.solaris +67 -0
  25. data/vendor/FreeImage/Source/CacheFile.h +92 -0
  26. data/vendor/FreeImage/Source/DeprecationManager/Deprecated.cpp +36 -0
  27. data/vendor/FreeImage/Source/DeprecationManager/DeprecationMgr.cpp +103 -0
  28. data/vendor/FreeImage/Source/DeprecationManager/DeprecationMgr.h +83 -0
  29. data/vendor/FreeImage/Source/FreeImage/BitmapAccess.cpp +1573 -0
  30. data/vendor/FreeImage/Source/FreeImage/CacheFile.cpp +271 -0
  31. data/vendor/FreeImage/Source/FreeImage/ColorLookup.cpp +785 -0
  32. data/vendor/FreeImage/Source/FreeImage/Conversion.cpp +551 -0
  33. data/vendor/FreeImage/Source/FreeImage/Conversion16_555.cpp +209 -0
  34. data/vendor/FreeImage/Source/FreeImage/Conversion16_565.cpp +204 -0
  35. data/vendor/FreeImage/Source/FreeImage/Conversion24.cpp +252 -0
  36. data/vendor/FreeImage/Source/FreeImage/Conversion32.cpp +345 -0
  37. data/vendor/FreeImage/Source/FreeImage/Conversion4.cpp +246 -0
  38. data/vendor/FreeImage/Source/FreeImage/Conversion8.cpp +305 -0
  39. data/vendor/FreeImage/Source/FreeImage/ConversionFloat.cpp +194 -0
  40. data/vendor/FreeImage/Source/FreeImage/ConversionRGB16.cpp +144 -0
  41. data/vendor/FreeImage/Source/FreeImage/ConversionRGBA16.cpp +147 -0
  42. data/vendor/FreeImage/Source/FreeImage/ConversionRGBAF.cpp +250 -0
  43. data/vendor/FreeImage/Source/FreeImage/ConversionRGBF.cpp +243 -0
  44. data/vendor/FreeImage/Source/FreeImage/ConversionType.cpp +699 -0
  45. data/vendor/FreeImage/Source/FreeImage/ConversionUINT16.cpp +134 -0
  46. data/vendor/FreeImage/Source/FreeImage/FreeImage.cpp +226 -0
  47. data/vendor/FreeImage/Source/FreeImage/FreeImageC.c +22 -0
  48. data/vendor/FreeImage/Source/FreeImage/FreeImageIO.cpp +175 -0
  49. data/vendor/FreeImage/Source/FreeImage/GetType.cpp +92 -0
  50. data/vendor/FreeImage/Source/FreeImage/Halftoning.cpp +474 -0
  51. data/vendor/FreeImage/Source/FreeImage/J2KHelper.cpp +591 -0
  52. data/vendor/FreeImage/Source/FreeImage/J2KHelper.h +36 -0
  53. data/vendor/FreeImage/Source/FreeImage/LFPQuantizer.cpp +208 -0
  54. data/vendor/FreeImage/Source/FreeImage/MNGHelper.cpp +1320 -0
  55. data/vendor/FreeImage/Source/FreeImage/MemoryIO.cpp +237 -0
  56. data/vendor/FreeImage/Source/FreeImage/MultiPage.cpp +974 -0
  57. data/vendor/FreeImage/Source/FreeImage/NNQuantizer.cpp +507 -0
  58. data/vendor/FreeImage/Source/FreeImage/PSDParser.cpp +1057 -0
  59. data/vendor/FreeImage/Source/FreeImage/PSDParser.h +271 -0
  60. data/vendor/FreeImage/Source/FreeImage/PixelAccess.cpp +197 -0
  61. data/vendor/FreeImage/Source/FreeImage/Plugin.cpp +822 -0
  62. data/vendor/FreeImage/Source/FreeImage/PluginBMP.cpp +1494 -0
  63. data/vendor/FreeImage/Source/FreeImage/PluginCUT.cpp +240 -0
  64. data/vendor/FreeImage/Source/FreeImage/PluginDDS.cpp +655 -0
  65. data/vendor/FreeImage/Source/FreeImage/PluginEXR.cpp +773 -0
  66. data/vendor/FreeImage/Source/FreeImage/PluginG3.cpp +433 -0
  67. data/vendor/FreeImage/Source/FreeImage/PluginGIF.cpp +1407 -0
  68. data/vendor/FreeImage/Source/FreeImage/PluginHDR.cpp +722 -0
  69. data/vendor/FreeImage/Source/FreeImage/PluginICO.cpp +824 -0
  70. data/vendor/FreeImage/Source/FreeImage/PluginIFF.cpp +459 -0
  71. data/vendor/FreeImage/Source/FreeImage/PluginJ2K.cpp +328 -0
  72. data/vendor/FreeImage/Source/FreeImage/PluginJNG.cpp +162 -0
  73. data/vendor/FreeImage/Source/FreeImage/PluginJP2.cpp +328 -0
  74. data/vendor/FreeImage/Source/FreeImage/PluginJPEG.cpp +1706 -0
  75. data/vendor/FreeImage/Source/FreeImage/PluginJXR.cpp +1475 -0
  76. data/vendor/FreeImage/Source/FreeImage/PluginKOALA.cpp +243 -0
  77. data/vendor/FreeImage/Source/FreeImage/PluginMNG.cpp +153 -0
  78. data/vendor/FreeImage/Source/FreeImage/PluginPCD.cpp +251 -0
  79. data/vendor/FreeImage/Source/FreeImage/PluginPCX.cpp +659 -0
  80. data/vendor/FreeImage/Source/FreeImage/PluginPFM.cpp +409 -0
  81. data/vendor/FreeImage/Source/FreeImage/PluginPICT.cpp +1343 -0
  82. data/vendor/FreeImage/Source/FreeImage/PluginPNG.cpp +1115 -0
  83. data/vendor/FreeImage/Source/FreeImage/PluginPNM.cpp +838 -0
  84. data/vendor/FreeImage/Source/FreeImage/PluginPSD.cpp +131 -0
  85. data/vendor/FreeImage/Source/FreeImage/PluginRAS.cpp +512 -0
  86. data/vendor/FreeImage/Source/FreeImage/PluginRAW.cpp +793 -0
  87. data/vendor/FreeImage/Source/FreeImage/PluginSGI.cpp +425 -0
  88. data/vendor/FreeImage/Source/FreeImage/PluginTARGA.cpp +1591 -0
  89. data/vendor/FreeImage/Source/FreeImage/PluginTIFF.cpp +2631 -0
  90. data/vendor/FreeImage/Source/FreeImage/PluginWBMP.cpp +372 -0
  91. data/vendor/FreeImage/Source/FreeImage/PluginWebP.cpp +698 -0
  92. data/vendor/FreeImage/Source/FreeImage/PluginXBM.cpp +399 -0
  93. data/vendor/FreeImage/Source/FreeImage/PluginXPM.cpp +487 -0
  94. data/vendor/FreeImage/Source/FreeImage/TIFFLogLuv.cpp +65 -0
  95. data/vendor/FreeImage/Source/FreeImage/ToneMapping.cpp +75 -0
  96. data/vendor/FreeImage/Source/FreeImage/WuQuantizer.cpp +559 -0
  97. data/vendor/FreeImage/Source/FreeImage/ZLibInterface.cpp +223 -0
  98. data/vendor/FreeImage/Source/FreeImage/tmoColorConvert.cpp +479 -0
  99. data/vendor/FreeImage/Source/FreeImage/tmoDrago03.cpp +295 -0
  100. data/vendor/FreeImage/Source/FreeImage/tmoFattal02.cpp +689 -0
  101. data/vendor/FreeImage/Source/FreeImage/tmoReinhard05.cpp +260 -0
  102. data/vendor/FreeImage/Source/FreeImage.h +1153 -0
  103. data/vendor/FreeImage/Source/FreeImageIO.h +63 -0
  104. data/vendor/FreeImage/Source/FreeImageToolkit/BSplineRotate.cpp +730 -0
  105. data/vendor/FreeImage/Source/FreeImageToolkit/Background.cpp +895 -0
  106. data/vendor/FreeImage/Source/FreeImageToolkit/Channels.cpp +488 -0
  107. data/vendor/FreeImage/Source/FreeImageToolkit/ClassicRotate.cpp +917 -0
  108. data/vendor/FreeImage/Source/FreeImageToolkit/Colors.cpp +967 -0
  109. data/vendor/FreeImage/Source/FreeImageToolkit/CopyPaste.cpp +861 -0
  110. data/vendor/FreeImage/Source/FreeImageToolkit/Display.cpp +230 -0
  111. data/vendor/FreeImage/Source/FreeImageToolkit/Filters.h +287 -0
  112. data/vendor/FreeImage/Source/FreeImageToolkit/Flip.cpp +166 -0
  113. data/vendor/FreeImage/Source/FreeImageToolkit/JPEGTransform.cpp +623 -0
  114. data/vendor/FreeImage/Source/FreeImageToolkit/MultigridPoissonSolver.cpp +505 -0
  115. data/vendor/FreeImage/Source/FreeImageToolkit/Rescale.cpp +192 -0
  116. data/vendor/FreeImage/Source/FreeImageToolkit/Resize.cpp +2116 -0
  117. data/vendor/FreeImage/Source/FreeImageToolkit/Resize.h +196 -0
  118. data/vendor/FreeImage/Source/LibJPEG/ansi2knr.c +739 -0
  119. data/vendor/FreeImage/Source/LibJPEG/cderror.h +134 -0
  120. data/vendor/FreeImage/Source/LibJPEG/cdjpeg.c +181 -0
  121. data/vendor/FreeImage/Source/LibJPEG/cdjpeg.h +187 -0
  122. data/vendor/FreeImage/Source/LibJPEG/cjpeg.c +664 -0
  123. data/vendor/FreeImage/Source/LibJPEG/ckconfig.c +402 -0
  124. data/vendor/FreeImage/Source/LibJPEG/djpeg.c +617 -0
  125. data/vendor/FreeImage/Source/LibJPEG/example.c +433 -0
  126. data/vendor/FreeImage/Source/LibJPEG/jaricom.c +153 -0
  127. data/vendor/FreeImage/Source/LibJPEG/jcapimin.c +288 -0
  128. data/vendor/FreeImage/Source/LibJPEG/jcapistd.c +162 -0
  129. data/vendor/FreeImage/Source/LibJPEG/jcarith.c +944 -0
  130. data/vendor/FreeImage/Source/LibJPEG/jccoefct.c +454 -0
  131. data/vendor/FreeImage/Source/LibJPEG/jccolor.c +604 -0
  132. data/vendor/FreeImage/Source/LibJPEG/jcdctmgr.c +477 -0
  133. data/vendor/FreeImage/Source/LibJPEG/jchuff.c +1573 -0
  134. data/vendor/FreeImage/Source/LibJPEG/jcinit.c +84 -0
  135. data/vendor/FreeImage/Source/LibJPEG/jcmainct.c +297 -0
  136. data/vendor/FreeImage/Source/LibJPEG/jcmarker.c +719 -0
  137. data/vendor/FreeImage/Source/LibJPEG/jcmaster.c +856 -0
  138. data/vendor/FreeImage/Source/LibJPEG/jcomapi.c +106 -0
  139. data/vendor/FreeImage/Source/LibJPEG/jconfig.h +161 -0
  140. data/vendor/FreeImage/Source/LibJPEG/jcparam.c +675 -0
  141. data/vendor/FreeImage/Source/LibJPEG/jcprepct.c +358 -0
  142. data/vendor/FreeImage/Source/LibJPEG/jcsample.c +545 -0
  143. data/vendor/FreeImage/Source/LibJPEG/jctrans.c +385 -0
  144. data/vendor/FreeImage/Source/LibJPEG/jdapimin.c +399 -0
  145. data/vendor/FreeImage/Source/LibJPEG/jdapistd.c +276 -0
  146. data/vendor/FreeImage/Source/LibJPEG/jdarith.c +796 -0
  147. data/vendor/FreeImage/Source/LibJPEG/jdatadst.c +270 -0
  148. data/vendor/FreeImage/Source/LibJPEG/jdatasrc.c +275 -0
  149. data/vendor/FreeImage/Source/LibJPEG/jdcoefct.c +741 -0
  150. data/vendor/FreeImage/Source/LibJPEG/jdcolor.c +748 -0
  151. data/vendor/FreeImage/Source/LibJPEG/jdct.h +393 -0
  152. data/vendor/FreeImage/Source/LibJPEG/jddctmgr.c +384 -0
  153. data/vendor/FreeImage/Source/LibJPEG/jdhuff.c +1554 -0
  154. data/vendor/FreeImage/Source/LibJPEG/jdinput.c +662 -0
  155. data/vendor/FreeImage/Source/LibJPEG/jdmainct.c +513 -0
  156. data/vendor/FreeImage/Source/LibJPEG/jdmarker.c +1511 -0
  157. data/vendor/FreeImage/Source/LibJPEG/jdmaster.c +543 -0
  158. data/vendor/FreeImage/Source/LibJPEG/jdmerge.c +401 -0
  159. data/vendor/FreeImage/Source/LibJPEG/jdpostct.c +290 -0
  160. data/vendor/FreeImage/Source/LibJPEG/jdsample.c +361 -0
  161. data/vendor/FreeImage/Source/LibJPEG/jdtrans.c +140 -0
  162. data/vendor/FreeImage/Source/LibJPEG/jerror.c +253 -0
  163. data/vendor/FreeImage/Source/LibJPEG/jerror.h +304 -0
  164. data/vendor/FreeImage/Source/LibJPEG/jfdctflt.c +174 -0
  165. data/vendor/FreeImage/Source/LibJPEG/jfdctfst.c +230 -0
  166. data/vendor/FreeImage/Source/LibJPEG/jfdctint.c +4406 -0
  167. data/vendor/FreeImage/Source/LibJPEG/jidctflt.c +235 -0
  168. data/vendor/FreeImage/Source/LibJPEG/jidctfst.c +368 -0
  169. data/vendor/FreeImage/Source/LibJPEG/jidctint.c +5179 -0
  170. data/vendor/FreeImage/Source/LibJPEG/jinclude.h +91 -0
  171. data/vendor/FreeImage/Source/LibJPEG/jmemansi.c +167 -0
  172. data/vendor/FreeImage/Source/LibJPEG/jmemdos.c +638 -0
  173. data/vendor/FreeImage/Source/LibJPEG/jmemmac.c +289 -0
  174. data/vendor/FreeImage/Source/LibJPEG/jmemmgr.c +1119 -0
  175. data/vendor/FreeImage/Source/LibJPEG/jmemname.c +276 -0
  176. data/vendor/FreeImage/Source/LibJPEG/jmemnobs.c +109 -0
  177. data/vendor/FreeImage/Source/LibJPEG/jmemsys.h +198 -0
  178. data/vendor/FreeImage/Source/LibJPEG/jmorecfg.h +442 -0
  179. data/vendor/FreeImage/Source/LibJPEG/jpegint.h +426 -0
  180. data/vendor/FreeImage/Source/LibJPEG/jpeglib.h +1180 -0
  181. data/vendor/FreeImage/Source/LibJPEG/jpegtran.c +577 -0
  182. data/vendor/FreeImage/Source/LibJPEG/jquant1.c +857 -0
  183. data/vendor/FreeImage/Source/LibJPEG/jquant2.c +1311 -0
  184. data/vendor/FreeImage/Source/LibJPEG/jutils.c +227 -0
  185. data/vendor/FreeImage/Source/LibJPEG/jversion.h +14 -0
  186. data/vendor/FreeImage/Source/LibJPEG/rdbmp.c +480 -0
  187. data/vendor/FreeImage/Source/LibJPEG/rdcolmap.c +253 -0
  188. data/vendor/FreeImage/Source/LibJPEG/rdgif.c +38 -0
  189. data/vendor/FreeImage/Source/LibJPEG/rdjpgcom.c +515 -0
  190. data/vendor/FreeImage/Source/LibJPEG/rdppm.c +459 -0
  191. data/vendor/FreeImage/Source/LibJPEG/rdrle.c +387 -0
  192. data/vendor/FreeImage/Source/LibJPEG/rdswitch.c +365 -0
  193. data/vendor/FreeImage/Source/LibJPEG/rdtarga.c +500 -0
  194. data/vendor/FreeImage/Source/LibJPEG/transupp.c +1763 -0
  195. data/vendor/FreeImage/Source/LibJPEG/transupp.h +219 -0
  196. data/vendor/FreeImage/Source/LibJPEG/wrbmp.c +442 -0
  197. data/vendor/FreeImage/Source/LibJPEG/wrgif.c +399 -0
  198. data/vendor/FreeImage/Source/LibJPEG/wrjpgcom.c +583 -0
  199. data/vendor/FreeImage/Source/LibJPEG/wrppm.c +269 -0
  200. data/vendor/FreeImage/Source/LibJPEG/wrrle.c +305 -0
  201. data/vendor/FreeImage/Source/LibJPEG/wrtarga.c +253 -0
  202. data/vendor/FreeImage/Source/LibJXR/common/include/guiddef.h +230 -0
  203. data/vendor/FreeImage/Source/LibJXR/common/include/wmsal.h +757 -0
  204. data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstring.h +342 -0
  205. data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstrings_adt.h +71 -0
  206. data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstrings_strict.h +1096 -0
  207. data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstrings_undef.h +406 -0
  208. data/vendor/FreeImage/Source/LibJXR/image/decode/JXRTranscode.c +987 -0
  209. data/vendor/FreeImage/Source/LibJXR/image/decode/decode.c +200 -0
  210. data/vendor/FreeImage/Source/LibJXR/image/decode/decode.h +143 -0
  211. data/vendor/FreeImage/Source/LibJXR/image/decode/postprocess.c +288 -0
  212. data/vendor/FreeImage/Source/LibJXR/image/decode/segdec.c +1205 -0
  213. data/vendor/FreeImage/Source/LibJXR/image/decode/strInvTransform.c +1888 -0
  214. data/vendor/FreeImage/Source/LibJXR/image/decode/strPredQuantDec.c +539 -0
  215. data/vendor/FreeImage/Source/LibJXR/image/decode/strdec.c +3628 -0
  216. data/vendor/FreeImage/Source/LibJXR/image/decode/strdec_x86.c +1640 -0
  217. data/vendor/FreeImage/Source/LibJXR/image/encode/encode.c +144 -0
  218. data/vendor/FreeImage/Source/LibJXR/image/encode/encode.h +113 -0
  219. data/vendor/FreeImage/Source/LibJXR/image/encode/segenc.c +1186 -0
  220. data/vendor/FreeImage/Source/LibJXR/image/encode/strFwdTransform.c +1111 -0
  221. data/vendor/FreeImage/Source/LibJXR/image/encode/strPredQuantEnc.c +511 -0
  222. data/vendor/FreeImage/Source/LibJXR/image/encode/strenc.c +2370 -0
  223. data/vendor/FreeImage/Source/LibJXR/image/encode/strenc_x86.c +409 -0
  224. data/vendor/FreeImage/Source/LibJXR/image/sys/adapthuff.c +511 -0
  225. data/vendor/FreeImage/Source/LibJXR/image/sys/ansi.h +61 -0
  226. data/vendor/FreeImage/Source/LibJXR/image/sys/common.h +131 -0
  227. data/vendor/FreeImage/Source/LibJXR/image/sys/image.c +183 -0
  228. data/vendor/FreeImage/Source/LibJXR/image/sys/perfTimer.h +115 -0
  229. data/vendor/FreeImage/Source/LibJXR/image/sys/perfTimerANSI.c +274 -0
  230. data/vendor/FreeImage/Source/LibJXR/image/sys/strPredQuant.c +306 -0
  231. data/vendor/FreeImage/Source/LibJXR/image/sys/strTransform.c +85 -0
  232. data/vendor/FreeImage/Source/LibJXR/image/sys/strTransform.h +50 -0
  233. data/vendor/FreeImage/Source/LibJXR/image/sys/strcodec.c +1251 -0
  234. data/vendor/FreeImage/Source/LibJXR/image/sys/strcodec.h +681 -0
  235. data/vendor/FreeImage/Source/LibJXR/image/sys/windowsmediaphoto.h +515 -0
  236. data/vendor/FreeImage/Source/LibJXR/image/sys/xplatform_image.h +84 -0
  237. data/vendor/FreeImage/Source/LibJXR/image/x86/x86.h +58 -0
  238. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGlue.c +930 -0
  239. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGlue.h +636 -0
  240. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGlueJxr.c +2246 -0
  241. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGluePFC.c +2338 -0
  242. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRMeta.c +905 -0
  243. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRMeta.h +258 -0
  244. data/vendor/FreeImage/Source/LibOpenJPEG/bio.c +188 -0
  245. data/vendor/FreeImage/Source/LibOpenJPEG/bio.h +128 -0
  246. data/vendor/FreeImage/Source/LibOpenJPEG/cidx_manager.c +239 -0
  247. data/vendor/FreeImage/Source/LibOpenJPEG/cidx_manager.h +68 -0
  248. data/vendor/FreeImage/Source/LibOpenJPEG/cio.c +644 -0
  249. data/vendor/FreeImage/Source/LibOpenJPEG/cio.h +393 -0
  250. data/vendor/FreeImage/Source/LibOpenJPEG/dwt.c +919 -0
  251. data/vendor/FreeImage/Source/LibOpenJPEG/dwt.h +116 -0
  252. data/vendor/FreeImage/Source/LibOpenJPEG/event.c +141 -0
  253. data/vendor/FreeImage/Source/LibOpenJPEG/event.h +97 -0
  254. data/vendor/FreeImage/Source/LibOpenJPEG/function_list.c +114 -0
  255. data/vendor/FreeImage/Source/LibOpenJPEG/function_list.h +126 -0
  256. data/vendor/FreeImage/Source/LibOpenJPEG/image.c +235 -0
  257. data/vendor/FreeImage/Source/LibOpenJPEG/image.h +63 -0
  258. data/vendor/FreeImage/Source/LibOpenJPEG/indexbox_manager.h +148 -0
  259. data/vendor/FreeImage/Source/LibOpenJPEG/invert.c +289 -0
  260. data/vendor/FreeImage/Source/LibOpenJPEG/invert.h +59 -0
  261. data/vendor/FreeImage/Source/LibOpenJPEG/j2k.c +10238 -0
  262. data/vendor/FreeImage/Source/LibOpenJPEG/j2k.h +838 -0
  263. data/vendor/FreeImage/Source/LibOpenJPEG/jp2.c +2776 -0
  264. data/vendor/FreeImage/Source/LibOpenJPEG/jp2.h +490 -0
  265. data/vendor/FreeImage/Source/LibOpenJPEG/mct.c +319 -0
  266. data/vendor/FreeImage/Source/LibOpenJPEG/mct.h +149 -0
  267. data/vendor/FreeImage/Source/LibOpenJPEG/mqc.c +604 -0
  268. data/vendor/FreeImage/Source/LibOpenJPEG/mqc.h +201 -0
  269. data/vendor/FreeImage/Source/LibOpenJPEG/openjpeg.c +955 -0
  270. data/vendor/FreeImage/Source/LibOpenJPEG/openjpeg.h +1475 -0
  271. data/vendor/FreeImage/Source/LibOpenJPEG/opj_clock.c +59 -0
  272. data/vendor/FreeImage/Source/LibOpenJPEG/opj_clock.h +54 -0
  273. data/vendor/FreeImage/Source/LibOpenJPEG/opj_codec.h +160 -0
  274. data/vendor/FreeImage/Source/LibOpenJPEG/opj_config.h +9 -0
  275. data/vendor/FreeImage/Source/LibOpenJPEG/opj_config_private.h +16 -0
  276. data/vendor/FreeImage/Source/LibOpenJPEG/opj_includes.h +175 -0
  277. data/vendor/FreeImage/Source/LibOpenJPEG/opj_intmath.h +172 -0
  278. data/vendor/FreeImage/Source/LibOpenJPEG/opj_inttypes.h +43 -0
  279. data/vendor/FreeImage/Source/LibOpenJPEG/opj_malloc.h +180 -0
  280. data/vendor/FreeImage/Source/LibOpenJPEG/opj_stdint.h +47 -0
  281. data/vendor/FreeImage/Source/LibOpenJPEG/phix_manager.c +191 -0
  282. data/vendor/FreeImage/Source/LibOpenJPEG/pi.c +1870 -0
  283. data/vendor/FreeImage/Source/LibOpenJPEG/pi.h +182 -0
  284. data/vendor/FreeImage/Source/LibOpenJPEG/ppix_manager.c +194 -0
  285. data/vendor/FreeImage/Source/LibOpenJPEG/raw.c +89 -0
  286. data/vendor/FreeImage/Source/LibOpenJPEG/raw.h +100 -0
  287. data/vendor/FreeImage/Source/LibOpenJPEG/t1.c +1751 -0
  288. data/vendor/FreeImage/Source/LibOpenJPEG/t1.h +157 -0
  289. data/vendor/FreeImage/Source/LibOpenJPEG/t1_generate_luts.c +276 -0
  290. data/vendor/FreeImage/Source/LibOpenJPEG/t1_luts.h +143 -0
  291. data/vendor/FreeImage/Source/LibOpenJPEG/t2.c +1334 -0
  292. data/vendor/FreeImage/Source/LibOpenJPEG/t2.h +127 -0
  293. data/vendor/FreeImage/Source/LibOpenJPEG/tcd.c +2123 -0
  294. data/vendor/FreeImage/Source/LibOpenJPEG/tcd.h +348 -0
  295. data/vendor/FreeImage/Source/LibOpenJPEG/tgt.c +331 -0
  296. data/vendor/FreeImage/Source/LibOpenJPEG/tgt.h +140 -0
  297. data/vendor/FreeImage/Source/LibOpenJPEG/thix_manager.c +134 -0
  298. data/vendor/FreeImage/Source/LibOpenJPEG/tpix_manager.c +185 -0
  299. data/vendor/FreeImage/Source/LibPNG/example.c +1061 -0
  300. data/vendor/FreeImage/Source/LibPNG/png.c +4493 -0
  301. data/vendor/FreeImage/Source/LibPNG/png.h +3282 -0
  302. data/vendor/FreeImage/Source/LibPNG/pngconf.h +644 -0
  303. data/vendor/FreeImage/Source/LibPNG/pngdebug.h +154 -0
  304. data/vendor/FreeImage/Source/LibPNG/pngerror.c +963 -0
  305. data/vendor/FreeImage/Source/LibPNG/pngget.c +1213 -0
  306. data/vendor/FreeImage/Source/LibPNG/pnginfo.h +260 -0
  307. data/vendor/FreeImage/Source/LibPNG/pnglibconf.h +218 -0
  308. data/vendor/FreeImage/Source/LibPNG/pngmem.c +281 -0
  309. data/vendor/FreeImage/Source/LibPNG/pngpread.c +1168 -0
  310. data/vendor/FreeImage/Source/LibPNG/pngpriv.h +1944 -0
  311. data/vendor/FreeImage/Source/LibPNG/pngread.c +4121 -0
  312. data/vendor/FreeImage/Source/LibPNG/pngrio.c +120 -0
  313. data/vendor/FreeImage/Source/LibPNG/pngrtran.c +4994 -0
  314. data/vendor/FreeImage/Source/LibPNG/pngrutil.c +4474 -0
  315. data/vendor/FreeImage/Source/LibPNG/pngset.c +1611 -0
  316. data/vendor/FreeImage/Source/LibPNG/pngstruct.h +489 -0
  317. data/vendor/FreeImage/Source/LibPNG/pngtest.c +2011 -0
  318. data/vendor/FreeImage/Source/LibPNG/pngtrans.c +849 -0
  319. data/vendor/FreeImage/Source/LibPNG/pngwio.c +168 -0
  320. data/vendor/FreeImage/Source/LibPNG/pngwrite.c +2455 -0
  321. data/vendor/FreeImage/Source/LibPNG/pngwtran.c +574 -0
  322. data/vendor/FreeImage/Source/LibPNG/pngwutil.c +3029 -0
  323. data/vendor/FreeImage/Source/LibRawLite/dcraw/dcraw.c +15462 -0
  324. data/vendor/FreeImage/Source/LibRawLite/internal/aahd_demosaic.cpp +706 -0
  325. data/vendor/FreeImage/Source/LibRawLite/internal/dcb_demosaicing.c +710 -0
  326. data/vendor/FreeImage/Source/LibRawLite/internal/dcraw_common.cpp +13593 -0
  327. data/vendor/FreeImage/Source/LibRawLite/internal/dcraw_fileio.cpp +240 -0
  328. data/vendor/FreeImage/Source/LibRawLite/internal/defines.h +167 -0
  329. data/vendor/FreeImage/Source/LibRawLite/internal/demosaic_packs.cpp +99 -0
  330. data/vendor/FreeImage/Source/LibRawLite/internal/dht_demosaic.cpp +873 -0
  331. data/vendor/FreeImage/Source/LibRawLite/internal/libraw_internal_funcs.h +282 -0
  332. data/vendor/FreeImage/Source/LibRawLite/internal/libraw_x3f.cpp +1919 -0
  333. data/vendor/FreeImage/Source/LibRawLite/internal/var_defines.h +216 -0
  334. data/vendor/FreeImage/Source/LibRawLite/internal/wf_filtering.cpp +1950 -0
  335. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw.h +338 -0
  336. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_alloc.h +99 -0
  337. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_const.h +233 -0
  338. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_datastream.h +238 -0
  339. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_internal.h +225 -0
  340. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_types.h +442 -0
  341. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_version.h +62 -0
  342. data/vendor/FreeImage/Source/LibRawLite/src/libraw_c_api.cpp +230 -0
  343. data/vendor/FreeImage/Source/LibRawLite/src/libraw_cxx.cpp +4533 -0
  344. data/vendor/FreeImage/Source/LibRawLite/src/libraw_datastream.cpp +703 -0
  345. data/vendor/FreeImage/Source/LibTIFF4/mkg3states.c +451 -0
  346. data/vendor/FreeImage/Source/LibTIFF4/mkspans.c +82 -0
  347. data/vendor/FreeImage/Source/LibTIFF4/t4.h +292 -0
  348. data/vendor/FreeImage/Source/LibTIFF4/tif_aux.c +358 -0
  349. data/vendor/FreeImage/Source/LibTIFF4/tif_close.c +140 -0
  350. data/vendor/FreeImage/Source/LibTIFF4/tif_codec.c +166 -0
  351. data/vendor/FreeImage/Source/LibTIFF4/tif_color.c +287 -0
  352. data/vendor/FreeImage/Source/LibTIFF4/tif_compress.c +304 -0
  353. data/vendor/FreeImage/Source/LibTIFF4/tif_config.h +97 -0
  354. data/vendor/FreeImage/Source/LibTIFF4/tif_config.vc.h +74 -0
  355. data/vendor/FreeImage/Source/LibTIFF4/tif_config.wince.h +71 -0
  356. data/vendor/FreeImage/Source/LibTIFF4/tif_dir.c +1700 -0
  357. data/vendor/FreeImage/Source/LibTIFF4/tif_dir.h +308 -0
  358. data/vendor/FreeImage/Source/LibTIFF4/tif_dirinfo.c +959 -0
  359. data/vendor/FreeImage/Source/LibTIFF4/tif_dirread.c +5640 -0
  360. data/vendor/FreeImage/Source/LibTIFF4/tif_dirwrite.c +2910 -0
  361. data/vendor/FreeImage/Source/LibTIFF4/tif_dumpmode.c +143 -0
  362. data/vendor/FreeImage/Source/LibTIFF4/tif_error.c +80 -0
  363. data/vendor/FreeImage/Source/LibTIFF4/tif_extension.c +118 -0
  364. data/vendor/FreeImage/Source/LibTIFF4/tif_fax3.c +1595 -0
  365. data/vendor/FreeImage/Source/LibTIFF4/tif_fax3.h +538 -0
  366. data/vendor/FreeImage/Source/LibTIFF4/tif_fax3sm.c +1260 -0
  367. data/vendor/FreeImage/Source/LibTIFF4/tif_flush.c +118 -0
  368. data/vendor/FreeImage/Source/LibTIFF4/tif_getimage.c +2890 -0
  369. data/vendor/FreeImage/Source/LibTIFF4/tif_jbig.c +213 -0
  370. data/vendor/FreeImage/Source/LibTIFF4/tif_jpeg.c +2354 -0
  371. data/vendor/FreeImage/Source/LibTIFF4/tif_jpeg_12.c +65 -0
  372. data/vendor/FreeImage/Source/LibTIFF4/tif_luv.c +1683 -0
  373. data/vendor/FreeImage/Source/LibTIFF4/tif_lzma.c +495 -0
  374. data/vendor/FreeImage/Source/LibTIFF4/tif_lzw.c +1169 -0
  375. data/vendor/FreeImage/Source/LibTIFF4/tif_next.c +181 -0
  376. data/vendor/FreeImage/Source/LibTIFF4/tif_ojpeg.c +2501 -0
  377. data/vendor/FreeImage/Source/LibTIFF4/tif_open.c +725 -0
  378. data/vendor/FreeImage/Source/LibTIFF4/tif_packbits.c +300 -0
  379. data/vendor/FreeImage/Source/LibTIFF4/tif_pixarlog.c +1442 -0
  380. data/vendor/FreeImage/Source/LibTIFF4/tif_predict.c +764 -0
  381. data/vendor/FreeImage/Source/LibTIFF4/tif_predict.h +77 -0
  382. data/vendor/FreeImage/Source/LibTIFF4/tif_print.c +716 -0
  383. data/vendor/FreeImage/Source/LibTIFF4/tif_read.c +1086 -0
  384. data/vendor/FreeImage/Source/LibTIFF4/tif_strip.c +383 -0
  385. data/vendor/FreeImage/Source/LibTIFF4/tif_swab.c +310 -0
  386. data/vendor/FreeImage/Source/LibTIFF4/tif_thunder.c +207 -0
  387. data/vendor/FreeImage/Source/LibTIFF4/tif_tile.c +299 -0
  388. data/vendor/FreeImage/Source/LibTIFF4/tif_unix.c +325 -0
  389. data/vendor/FreeImage/Source/LibTIFF4/tif_version.c +40 -0
  390. data/vendor/FreeImage/Source/LibTIFF4/tif_vms.c +603 -0
  391. data/vendor/FreeImage/Source/LibTIFF4/tif_warning.c +81 -0
  392. data/vendor/FreeImage/Source/LibTIFF4/tif_win32.c +443 -0
  393. data/vendor/FreeImage/Source/LibTIFF4/tif_wince.c +293 -0
  394. data/vendor/FreeImage/Source/LibTIFF4/tif_write.c +771 -0
  395. data/vendor/FreeImage/Source/LibTIFF4/tif_zip.c +472 -0
  396. data/vendor/FreeImage/Source/LibTIFF4/tiff.h +681 -0
  397. data/vendor/FreeImage/Source/LibTIFF4/tiffconf.h +170 -0
  398. data/vendor/FreeImage/Source/LibTIFF4/tiffconf.vc.h +160 -0
  399. data/vendor/FreeImage/Source/LibTIFF4/tiffconf.wince.h +121 -0
  400. data/vendor/FreeImage/Source/LibTIFF4/tiffio.h +557 -0
  401. data/vendor/FreeImage/Source/LibTIFF4/tiffiop.h +367 -0
  402. data/vendor/FreeImage/Source/LibTIFF4/tiffvers.h +9 -0
  403. data/vendor/FreeImage/Source/LibTIFF4/uvcode.h +180 -0
  404. data/vendor/FreeImage/Source/LibWebP/src/dec/alphai.h +55 -0
  405. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.alpha.c +167 -0
  406. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.buffer.c +249 -0
  407. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.frame.c +827 -0
  408. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.idec.c +857 -0
  409. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.io.c +640 -0
  410. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.quant.c +110 -0
  411. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.tree.c +525 -0
  412. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.vp8.c +663 -0
  413. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.vp8l.c +1584 -0
  414. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.webp.c +834 -0
  415. data/vendor/FreeImage/Source/LibWebP/src/dec/decode_vp8.h +185 -0
  416. data/vendor/FreeImage/Source/LibWebP/src/dec/vp8i.h +353 -0
  417. data/vendor/FreeImage/Source/LibWebP/src/dec/vp8li.h +136 -0
  418. data/vendor/FreeImage/Source/LibWebP/src/dec/webpi.h +120 -0
  419. data/vendor/FreeImage/Source/LibWebP/src/demux/demux.demux.c +957 -0
  420. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.alpha_processing.c +377 -0
  421. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.alpha_processing_mips_dsp_r2.c +139 -0
  422. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.alpha_processing_sse2.c +296 -0
  423. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.argb.c +68 -0
  424. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.argb_mips_dsp_r2.c +108 -0
  425. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.argb_sse2.c +62 -0
  426. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost.c +412 -0
  427. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost_mips32.c +154 -0
  428. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost_mips_dsp_r2.c +107 -0
  429. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost_sse2.c +121 -0
  430. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cpu.c +138 -0
  431. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec.c +760 -0
  432. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_clip_tables.c +366 -0
  433. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_mips32.c +585 -0
  434. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_mips_dsp_r2.c +992 -0
  435. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_neon.c +1489 -0
  436. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_sse2.c +1284 -0
  437. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc.c +788 -0
  438. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_avx2.c +24 -0
  439. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_mips32.c +670 -0
  440. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_mips_dsp_r2.c +1510 -0
  441. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_neon.c +932 -0
  442. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_sse2.c +940 -0
  443. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.filters.c +240 -0
  444. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.filters_mips_dsp_r2.c +404 -0
  445. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.filters_sse2.c +349 -0
  446. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.h +434 -0
  447. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless.c +1838 -0
  448. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_mips32.c +416 -0
  449. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_mips_dsp_r2.c +921 -0
  450. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_neon.c +357 -0
  451. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_sse2.c +535 -0
  452. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.rescaler.c +115 -0
  453. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.rescaler_mips32.c +192 -0
  454. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.rescaler_mips_dsp_r2.c +210 -0
  455. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling.c +252 -0
  456. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling_mips_dsp_r2.c +280 -0
  457. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling_neon.c +267 -0
  458. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling_sse2.c +214 -0
  459. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv.c +166 -0
  460. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv_mips32.c +100 -0
  461. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv_mips_dsp_r2.c +131 -0
  462. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv_sse2.c +322 -0
  463. data/vendor/FreeImage/Source/LibWebP/src/dsp/lossless.h +313 -0
  464. data/vendor/FreeImage/Source/LibWebP/src/dsp/mips_macro.h +200 -0
  465. data/vendor/FreeImage/Source/LibWebP/src/dsp/neon.h +82 -0
  466. data/vendor/FreeImage/Source/LibWebP/src/dsp/yuv.h +321 -0
  467. data/vendor/FreeImage/Source/LibWebP/src/dsp/yuv_tables_sse2.h +536 -0
  468. data/vendor/FreeImage/Source/LibWebP/src/enc/backward_references.h +202 -0
  469. data/vendor/FreeImage/Source/LibWebP/src/enc/cost.h +69 -0
  470. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.alpha.c +440 -0
  471. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.analysis.c +501 -0
  472. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.backward_references.c +1076 -0
  473. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.config.c +163 -0
  474. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.cost.c +355 -0
  475. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.filter.c +296 -0
  476. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.frame.c +850 -0
  477. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.histogram.c +897 -0
  478. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.iterator.c +456 -0
  479. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.near_lossless.c +160 -0
  480. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture.c +290 -0
  481. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_csp.c +1100 -0
  482. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_psnr.c +150 -0
  483. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_rescale.c +285 -0
  484. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_tools.c +206 -0
  485. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.quant.c +1191 -0
  486. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.syntax.c +383 -0
  487. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.token.c +285 -0
  488. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.tree.c +504 -0
  489. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.vp8l.c +1437 -0
  490. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.webpenc.c +379 -0
  491. data/vendor/FreeImage/Source/LibWebP/src/enc/histogram.h +114 -0
  492. data/vendor/FreeImage/Source/LibWebP/src/enc/vp8enci.h +551 -0
  493. data/vendor/FreeImage/Source/LibWebP/src/enc/vp8li.h +78 -0
  494. data/vendor/FreeImage/Source/LibWebP/src/mux/mux.anim_encode.c +1241 -0
  495. data/vendor/FreeImage/Source/LibWebP/src/mux/mux.muxedit.c +696 -0
  496. data/vendor/FreeImage/Source/LibWebP/src/mux/mux.muxinternal.c +551 -0
  497. data/vendor/FreeImage/Source/LibWebP/src/mux/mux.muxread.c +544 -0
  498. data/vendor/FreeImage/Source/LibWebP/src/mux/muxi.h +232 -0
  499. data/vendor/FreeImage/Source/LibWebP/src/utils/bit_reader.h +168 -0
  500. data/vendor/FreeImage/Source/LibWebP/src/utils/bit_reader_inl.h +172 -0
  501. data/vendor/FreeImage/Source/LibWebP/src/utils/bit_writer.h +120 -0
  502. data/vendor/FreeImage/Source/LibWebP/src/utils/color_cache.h +74 -0
  503. data/vendor/FreeImage/Source/LibWebP/src/utils/endian_inl.h +100 -0
  504. data/vendor/FreeImage/Source/LibWebP/src/utils/filters.h +32 -0
  505. data/vendor/FreeImage/Source/LibWebP/src/utils/huffman.h +67 -0
  506. data/vendor/FreeImage/Source/LibWebP/src/utils/huffman_encode.h +60 -0
  507. data/vendor/FreeImage/Source/LibWebP/src/utils/quant_levels.h +36 -0
  508. data/vendor/FreeImage/Source/LibWebP/src/utils/quant_levels_dec.h +35 -0
  509. data/vendor/FreeImage/Source/LibWebP/src/utils/random.h +63 -0
  510. data/vendor/FreeImage/Source/LibWebP/src/utils/rescaler.h +78 -0
  511. data/vendor/FreeImage/Source/LibWebP/src/utils/thread.h +93 -0
  512. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.bit_reader.c +208 -0
  513. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.bit_writer.c +308 -0
  514. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.color_cache.c +49 -0
  515. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.filters.c +76 -0
  516. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.h +121 -0
  517. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.huffman.c +205 -0
  518. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.huffman_encode.c +417 -0
  519. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.quant_levels.c +140 -0
  520. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.quant_levels_dec.c +279 -0
  521. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.random.c +43 -0
  522. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.rescaler.c +82 -0
  523. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.thread.c +309 -0
  524. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.utils.c +211 -0
  525. data/vendor/FreeImage/Source/LibWebP/src/webp/decode.h +493 -0
  526. data/vendor/FreeImage/Source/LibWebP/src/webp/demux.h +224 -0
  527. data/vendor/FreeImage/Source/LibWebP/src/webp/encode.h +515 -0
  528. data/vendor/FreeImage/Source/LibWebP/src/webp/format_constants.h +88 -0
  529. data/vendor/FreeImage/Source/LibWebP/src/webp/mux.h +507 -0
  530. data/vendor/FreeImage/Source/LibWebP/src/webp/mux_types.h +97 -0
  531. data/vendor/FreeImage/Source/LibWebP/src/webp/types.h +52 -0
  532. data/vendor/FreeImage/Source/MapIntrospector.h +212 -0
  533. data/vendor/FreeImage/Source/Metadata/Exif.cpp +1253 -0
  534. data/vendor/FreeImage/Source/Metadata/FIRational.cpp +176 -0
  535. data/vendor/FreeImage/Source/Metadata/FIRational.h +108 -0
  536. data/vendor/FreeImage/Source/Metadata/FreeImageTag.cpp +353 -0
  537. data/vendor/FreeImage/Source/Metadata/FreeImageTag.h +500 -0
  538. data/vendor/FreeImage/Source/Metadata/IPTC.cpp +342 -0
  539. data/vendor/FreeImage/Source/Metadata/TagConversion.cpp +1094 -0
  540. data/vendor/FreeImage/Source/Metadata/TagLib.cpp +1618 -0
  541. data/vendor/FreeImage/Source/Metadata/XTIFF.cpp +766 -0
  542. data/vendor/FreeImage/Source/OpenEXR/Half/eLut.cpp +114 -0
  543. data/vendor/FreeImage/Source/OpenEXR/Half/eLut.h +71 -0
  544. data/vendor/FreeImage/Source/OpenEXR/Half/half.cpp +310 -0
  545. data/vendor/FreeImage/Source/OpenEXR/Half/half.h +757 -0
  546. data/vendor/FreeImage/Source/OpenEXR/Half/halfExport.h +27 -0
  547. data/vendor/FreeImage/Source/OpenEXR/Half/halfFunction.h +179 -0
  548. data/vendor/FreeImage/Source/OpenEXR/Half/halfLimits.h +102 -0
  549. data/vendor/FreeImage/Source/OpenEXR/Half/toFloat.cpp +164 -0
  550. data/vendor/FreeImage/Source/OpenEXR/Half/toFloat.h +16391 -0
  551. data/vendor/FreeImage/Source/OpenEXR/Iex/Iex.h +60 -0
  552. data/vendor/FreeImage/Source/OpenEXR/Iex/IexBaseExc.cpp +156 -0
  553. data/vendor/FreeImage/Source/OpenEXR/Iex/IexBaseExc.h +264 -0
  554. data/vendor/FreeImage/Source/OpenEXR/Iex/IexErrnoExc.h +208 -0
  555. data/vendor/FreeImage/Source/OpenEXR/Iex/IexExport.h +51 -0
  556. data/vendor/FreeImage/Source/OpenEXR/Iex/IexForward.h +229 -0
  557. data/vendor/FreeImage/Source/OpenEXR/Iex/IexMacros.h +170 -0
  558. data/vendor/FreeImage/Source/OpenEXR/Iex/IexMathExc.h +57 -0
  559. data/vendor/FreeImage/Source/OpenEXR/Iex/IexNamespace.h +112 -0
  560. data/vendor/FreeImage/Source/OpenEXR/Iex/IexThrowErrnoExc.cpp +873 -0
  561. data/vendor/FreeImage/Source/OpenEXR/Iex/IexThrowErrnoExc.h +97 -0
  562. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFloatExc.cpp +113 -0
  563. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFloatExc.h +146 -0
  564. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFpu.cpp +530 -0
  565. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFpu.h +91 -0
  566. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathIeeeExc.h +62 -0
  567. data/vendor/FreeImage/Source/OpenEXR/IlmBaseConfig.h +61 -0
  568. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAcesFile.cpp +633 -0
  569. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAcesFile.h +324 -0
  570. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfArray.h +285 -0
  571. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAttribute.cpp +158 -0
  572. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAttribute.h +407 -0
  573. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAutoArray.h +95 -0
  574. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfB44Compressor.cpp +1072 -0
  575. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfB44Compressor.h +118 -0
  576. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfBoxAttribute.cpp +111 -0
  577. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfBoxAttribute.h +87 -0
  578. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCRgbaFile.cpp +1438 -0
  579. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCRgbaFile.h +555 -0
  580. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelList.cpp +322 -0
  581. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelList.h +436 -0
  582. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelListAttribute.cpp +150 -0
  583. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelListAttribute.h +74 -0
  584. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCheckedArithmetic.h +163 -0
  585. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticities.cpp +151 -0
  586. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticities.h +131 -0
  587. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticitiesAttribute.cpp +87 -0
  588. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticitiesAttribute.h +73 -0
  589. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompositeDeepScanLine.cpp +591 -0
  590. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompositeDeepScanLine.h +142 -0
  591. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompression.h +84 -0
  592. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressionAttribute.cpp +78 -0
  593. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressionAttribute.h +64 -0
  594. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressor.cpp +226 -0
  595. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressor.h +265 -0
  596. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfConvert.cpp +143 -0
  597. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfConvert.h +107 -0
  598. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepCompositing.cpp +110 -0
  599. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepCompositing.h +132 -0
  600. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepFrameBuffer.cpp +230 -0
  601. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepFrameBuffer.h +339 -0
  602. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepImageState.h +96 -0
  603. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepImageStateAttribute.cpp +78 -0
  604. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepImageStateAttribute.h +68 -0
  605. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputFile.cpp +2025 -0
  606. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputFile.h +276 -0
  607. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputPart.cpp +149 -0
  608. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputPart.h +181 -0
  609. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputFile.cpp +1552 -0
  610. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputFile.h +244 -0
  611. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputPart.cpp +107 -0
  612. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputPart.h +168 -0
  613. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputFile.cpp +1979 -0
  614. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputFile.h +437 -0
  615. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputPart.cpp +273 -0
  616. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputPart.h +362 -0
  617. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputFile.cpp +2055 -0
  618. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputFile.h +475 -0
  619. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputPart.cpp +250 -0
  620. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputPart.h +394 -0
  621. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDoubleAttribute.cpp +57 -0
  622. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDoubleAttribute.h +59 -0
  623. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDwaCompressor.cpp +3424 -0
  624. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDwaCompressor.h +210 -0
  625. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDwaCompressorSimd.h +2145 -0
  626. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmap.cpp +335 -0
  627. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmap.h +336 -0
  628. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmapAttribute.cpp +76 -0
  629. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmapAttribute.h +68 -0
  630. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfExport.h +46 -0
  631. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFastHuf.cpp +768 -0
  632. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFastHuf.h +148 -0
  633. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatAttribute.cpp +57 -0
  634. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatAttribute.h +58 -0
  635. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatVectorAttribute.cpp +84 -0
  636. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatVectorAttribute.h +76 -0
  637. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfForward.h +127 -0
  638. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFrameBuffer.cpp +228 -0
  639. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFrameBuffer.h +386 -0
  640. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFramesPerSecond.cpp +76 -0
  641. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFramesPerSecond.h +94 -0
  642. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericInputFile.cpp +76 -0
  643. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericInputFile.h +58 -0
  644. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericOutputFile.cpp +112 -0
  645. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericOutputFile.h +62 -0
  646. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHeader.cpp +1283 -0
  647. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHeader.h +699 -0
  648. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHuf.cpp +1114 -0
  649. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHuf.h +82 -0
  650. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIO.cpp +110 -0
  651. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIO.h +255 -0
  652. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputFile.cpp +895 -0
  653. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputFile.h +240 -0
  654. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPart.cpp +114 -0
  655. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPart.h +84 -0
  656. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPartData.cpp +51 -0
  657. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPartData.h +69 -0
  658. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputStreamMutex.h +68 -0
  659. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInt64.h +56 -0
  660. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIntAttribute.cpp +57 -0
  661. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIntAttribute.h +58 -0
  662. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCode.cpp +217 -0
  663. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCode.h +167 -0
  664. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCodeAttribute.cpp +99 -0
  665. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCodeAttribute.h +73 -0
  666. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLineOrder.h +69 -0
  667. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLineOrderAttribute.cpp +78 -0
  668. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLineOrderAttribute.h +72 -0
  669. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLut.cpp +178 -0
  670. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLut.h +188 -0
  671. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMatrixAttribute.cpp +263 -0
  672. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMatrixAttribute.h +83 -0
  673. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMisc.cpp +1872 -0
  674. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMisc.h +466 -0
  675. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartInputFile.cpp +783 -0
  676. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartInputFile.h +128 -0
  677. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartOutputFile.cpp +519 -0
  678. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartOutputFile.h +118 -0
  679. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiView.cpp +435 -0
  680. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiView.h +187 -0
  681. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfName.h +150 -0
  682. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfNamespace.h +115 -0
  683. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOpaqueAttribute.cpp +126 -0
  684. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOpaqueAttribute.h +110 -0
  685. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOptimizedPixelReading.h +646 -0
  686. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputFile.cpp +1378 -0
  687. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputFile.h +263 -0
  688. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPart.cpp +105 -0
  689. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPart.h +77 -0
  690. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPartData.cpp +52 -0
  691. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPartData.h +62 -0
  692. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputStreamMutex.h +70 -0
  693. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPartHelper.h +262 -0
  694. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPartType.cpp +63 -0
  695. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPartType.h +62 -0
  696. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPixelType.h +67 -0
  697. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPizCompressor.cpp +667 -0
  698. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPizCompressor.h +117 -0
  699. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImage.cpp +104 -0
  700. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImage.h +135 -0
  701. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImageAttribute.cpp +103 -0
  702. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImageAttribute.h +70 -0
  703. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPxr24Compressor.cpp +553 -0
  704. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPxr24Compressor.h +109 -0
  705. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRational.cpp +127 -0
  706. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRational.h +98 -0
  707. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRationalAttribute.cpp +74 -0
  708. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRationalAttribute.h +69 -0
  709. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgba.h +109 -0
  710. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaFile.cpp +1405 -0
  711. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaFile.h +346 -0
  712. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaYca.cpp +497 -0
  713. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaYca.h +259 -0
  714. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRle.cpp +157 -0
  715. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRle.h +63 -0
  716. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRleCompressor.cpp +220 -0
  717. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRleCompressor.h +80 -0
  718. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfScanLineInputFile.cpp +1702 -0
  719. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfScanLineInputFile.h +210 -0
  720. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfSimd.h +59 -0
  721. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStandardAttributes.cpp +125 -0
  722. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStandardAttributes.h +382 -0
  723. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStdIO.cpp +242 -0
  724. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStdIO.h +160 -0
  725. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringAttribute.cpp +80 -0
  726. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringAttribute.h +71 -0
  727. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringVectorAttribute.cpp +100 -0
  728. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringVectorAttribute.h +74 -0
  729. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfSystemSpecific.cpp +129 -0
  730. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfSystemSpecific.h +172 -0
  731. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTestFile.cpp +216 -0
  732. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTestFile.h +97 -0
  733. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfThreading.cpp +62 -0
  734. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfThreading.h +95 -0
  735. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileDescription.h +107 -0
  736. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileDescriptionAttribute.cpp +86 -0
  737. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileDescriptionAttribute.h +72 -0
  738. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileOffsets.cpp +552 -0
  739. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileOffsets.h +125 -0
  740. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputFile.cpp +1533 -0
  741. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputFile.h +401 -0
  742. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputPart.cpp +208 -0
  743. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputPart.h +100 -0
  744. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledMisc.cpp +389 -0
  745. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledMisc.h +106 -0
  746. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputFile.cpp +1841 -0
  747. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputFile.h +495 -0
  748. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputPart.cpp +228 -0
  749. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputPart.h +105 -0
  750. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledRgbaFile.cpp +1163 -0
  751. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledRgbaFile.h +482 -0
  752. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCode.cpp +431 -0
  753. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCode.h +242 -0
  754. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCodeAttribute.cpp +79 -0
  755. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCodeAttribute.h +74 -0
  756. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVecAttribute.cpp +217 -0
  757. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVecAttribute.h +100 -0
  758. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVersion.cpp +60 -0
  759. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVersion.h +136 -0
  760. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfWav.cpp +391 -0
  761. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfWav.h +78 -0
  762. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfXdr.h +927 -0
  763. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZip.cpp +196 -0
  764. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZip.h +78 -0
  765. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZipCompressor.cpp +127 -0
  766. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZipCompressor.h +89 -0
  767. data/vendor/FreeImage/Source/OpenEXR/IlmImf/b44ExpLogTable.cpp +136 -0
  768. data/vendor/FreeImage/Source/OpenEXR/IlmImf/b44ExpLogTable.h +16396 -0
  769. data/vendor/FreeImage/Source/OpenEXR/IlmImf/dwaLookups.cpp +573 -0
  770. data/vendor/FreeImage/Source/OpenEXR/IlmImf/dwaLookups.h +98334 -0
  771. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThread.cpp +80 -0
  772. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThread.h +143 -0
  773. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadExport.h +46 -0
  774. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadForward.h +52 -0
  775. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutex.cpp +59 -0
  776. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutex.h +160 -0
  777. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutexPosix.cpp +85 -0
  778. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutexWin32.cpp +79 -0
  779. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadNamespace.h +114 -0
  780. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadPool.cpp +483 -0
  781. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadPool.h +160 -0
  782. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadPosix.cpp +98 -0
  783. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphore.cpp +60 -0
  784. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphore.h +112 -0
  785. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphorePosix.cpp +106 -0
  786. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphorePosixCompat.cpp +155 -0
  787. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphoreWin32.cpp +153 -0
  788. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadWin32.cpp +100 -0
  789. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathBox.cpp +37 -0
  790. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathBox.h +849 -0
  791. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathBoxAlgo.h +1016 -0
  792. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathColor.h +736 -0
  793. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathColorAlgo.cpp +178 -0
  794. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathColorAlgo.h +257 -0
  795. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathEuler.h +926 -0
  796. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathExc.h +73 -0
  797. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathExport.h +46 -0
  798. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathForward.h +72 -0
  799. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFrame.h +192 -0
  800. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFrustum.h +741 -0
  801. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFrustumTest.h +417 -0
  802. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFun.cpp +181 -0
  803. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFun.h +269 -0
  804. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathGL.h +166 -0
  805. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathGLU.h +54 -0
  806. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathHalfLimits.h +68 -0
  807. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathInt64.h +62 -0
  808. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathInterval.h +226 -0
  809. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathLimits.h +268 -0
  810. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathLine.h +185 -0
  811. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathLineAlgo.h +288 -0
  812. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMath.h +208 -0
  813. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMatrix.h +3441 -0
  814. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMatrixAlgo.cpp +1252 -0
  815. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMatrixAlgo.h +1425 -0
  816. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathNamespace.h +115 -0
  817. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathPlane.h +257 -0
  818. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathPlatform.h +112 -0
  819. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathQuat.h +964 -0
  820. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathRandom.cpp +194 -0
  821. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathRandom.h +401 -0
  822. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathRoots.h +219 -0
  823. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathShear.cpp +54 -0
  824. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathShear.h +656 -0
  825. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathSphere.h +177 -0
  826. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathVec.cpp +583 -0
  827. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathVec.h +2227 -0
  828. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathVecAlgo.h +147 -0
  829. data/vendor/FreeImage/Source/OpenEXR/OpenEXRConfig.h +72 -0
  830. data/vendor/FreeImage/Source/Plugin.h +144 -0
  831. data/vendor/FreeImage/Source/Quantizers.h +354 -0
  832. data/vendor/FreeImage/Source/ToneMapping.h +44 -0
  833. data/vendor/FreeImage/Source/Utilities.h +516 -0
  834. data/vendor/FreeImage/Source/ZLib/adler32.c +179 -0
  835. data/vendor/FreeImage/Source/ZLib/compress.c +80 -0
  836. data/vendor/FreeImage/Source/ZLib/crc32.c +425 -0
  837. data/vendor/FreeImage/Source/ZLib/crc32.h +441 -0
  838. data/vendor/FreeImage/Source/ZLib/deflate.c +1967 -0
  839. data/vendor/FreeImage/Source/ZLib/deflate.h +346 -0
  840. data/vendor/FreeImage/Source/ZLib/gzclose.c +25 -0
  841. data/vendor/FreeImage/Source/ZLib/gzguts.h +209 -0
  842. data/vendor/FreeImage/Source/ZLib/gzlib.c +634 -0
  843. data/vendor/FreeImage/Source/ZLib/gzread.c +594 -0
  844. data/vendor/FreeImage/Source/ZLib/gzwrite.c +577 -0
  845. data/vendor/FreeImage/Source/ZLib/infback.c +640 -0
  846. data/vendor/FreeImage/Source/ZLib/inffast.c +340 -0
  847. data/vendor/FreeImage/Source/ZLib/inffast.h +11 -0
  848. data/vendor/FreeImage/Source/ZLib/inffixed.h +94 -0
  849. data/vendor/FreeImage/Source/ZLib/inflate.c +1512 -0
  850. data/vendor/FreeImage/Source/ZLib/inflate.h +122 -0
  851. data/vendor/FreeImage/Source/ZLib/inftrees.c +306 -0
  852. data/vendor/FreeImage/Source/ZLib/inftrees.h +62 -0
  853. data/vendor/FreeImage/Source/ZLib/trees.c +1226 -0
  854. data/vendor/FreeImage/Source/ZLib/trees.h +128 -0
  855. data/vendor/FreeImage/Source/ZLib/uncompr.c +59 -0
  856. data/vendor/FreeImage/Source/ZLib/zconf.h +511 -0
  857. data/vendor/FreeImage/Source/ZLib/zlib.h +1768 -0
  858. data/vendor/FreeImage/Source/ZLib/zutil.c +324 -0
  859. data/vendor/FreeImage/Source/ZLib/zutil.h +253 -0
  860. metadata +931 -0
@@ -0,0 +1,1919 @@
1
+ /* Library for accessing X3F Files
2
+ ----------------------------------------------------------------
3
+ BSD-style License
4
+ ----------------------------------------------------------------
5
+
6
+ * Copyright (c) 2010, Roland Karlsson (roland@proxel.se)
7
+ * All rights reserved.
8
+ *
9
+ * Redistribution and use in source and binary forms, with or without
10
+ * modification, are permitted provided that the following conditions are met:
11
+ * * Redistributions of source code must retain the above copyright
12
+ * notice, this list of conditions and the following disclaimer.
13
+ * * Redistributions in binary form must reproduce the above copyright
14
+ * notice, this list of conditions and the following disclaimer in the
15
+ * documentation and/or other materials provided with the distribution.
16
+ * * Neither the name of the organization nor the
17
+ * names of its contributors may be used to endorse or promote products
18
+ * derived from this software without specific prior written permission.
19
+ *
20
+ * THIS SOFTWARE IS PROVIDED BY ROLAND KARLSSON ''AS IS'' AND ANY
21
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ * DISCLAIMED. IN NO EVENT SHALL ROLAND KARLSSON BE LIABLE FOR ANY
24
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
27
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+
31
+ */
32
+
33
+ /* From X3F_IO.H */
34
+
35
+ #include <stdio.h>
36
+ #include <string.h>
37
+ #include <stdlib.h>
38
+ #include <math.h>
39
+ #include <stdio.h>
40
+ #include "../libraw/libraw_datastream.h"
41
+
42
+ #define SIZE_UNIQUE_IDENTIFIER 16
43
+ #define SIZE_WHITE_BALANCE 32
44
+ #define NUM_EXT_DATA 32
45
+
46
+ #define X3F_VERSION(MAJ,MIN) (uint32_t)(((MAJ)<<16) + MIN)
47
+ #define X3F_VERSION_2_0 X3F_VERSION(2,0)
48
+ #define X3F_VERSION_2_1 X3F_VERSION(2,1)
49
+
50
+ /* Main file identifier */
51
+ #define X3F_FOVb (uint32_t)(0x62564f46)
52
+ /* Directory identifier */
53
+ #define X3F_SECd (uint32_t)(0x64434553)
54
+ /* Property section identifiers */
55
+ #define X3F_PROP (uint32_t)(0x504f5250)
56
+ #define X3F_SECp (uint32_t)(0x70434553)
57
+ /* Image section identifiers */
58
+ #define X3F_IMAG (uint32_t)(0x46414d49)
59
+ #define X3F_IMA2 (uint32_t)(0x32414d49)
60
+ #define X3F_SECi (uint32_t)(0x69434553)
61
+ /* CAMF identifiers */
62
+ #define X3F_CAMF (uint32_t)(0x464d4143)
63
+ #define X3F_SECc (uint32_t)(0x63434553)
64
+ /* CAMF entry identifiers */
65
+ #define X3F_CMbP (uint32_t)(0x50624d43)
66
+ #define X3F_CMbT (uint32_t)(0x54624d43)
67
+ #define X3F_CMbM (uint32_t)(0x4d624d43)
68
+ #define X3F_CMb (uint32_t)(0x00624d43)
69
+
70
+ #define X3F_IMAGE_THUMB_PLAIN (uint32_t)(0x00020003)
71
+ #define X3F_IMAGE_THUMB_HUFFMAN (uint32_t)(0x0002000b)
72
+ #define X3F_IMAGE_THUMB_JPEG (uint32_t)(0x00020012)
73
+
74
+ #define X3F_IMAGE_RAW_HUFFMAN_X530 (uint32_t)(0x00030005)
75
+ #define X3F_IMAGE_RAW_HUFFMAN_10BIT (uint32_t)(0x00030006)
76
+ #define X3F_IMAGE_RAW_TRUE (uint32_t)(0x0003001e)
77
+ #define X3F_IMAGE_RAW_MERRILL (uint32_t)(0x0001001e)
78
+ #define X3F_IMAGE_RAW_QUATTRO (uint32_t)(0x00010023)
79
+
80
+ #define X3F_IMAGE_HEADER_SIZE 28
81
+ #define X3F_CAMF_HEADER_SIZE 28
82
+ #define X3F_PROPERTY_LIST_HEADER_SIZE 24
83
+
84
+ typedef uint16_t utf16_t;
85
+
86
+ typedef int bool_t;
87
+
88
+ typedef enum x3f_extended_types_e {
89
+ X3F_EXT_TYPE_NONE=0,
90
+ X3F_EXT_TYPE_EXPOSURE_ADJUST=1,
91
+ X3F_EXT_TYPE_CONTRAST_ADJUST=2,
92
+ X3F_EXT_TYPE_SHADOW_ADJUST=3,
93
+ X3F_EXT_TYPE_HIGHLIGHT_ADJUST=4,
94
+ X3F_EXT_TYPE_SATURATION_ADJUST=5,
95
+ X3F_EXT_TYPE_SHARPNESS_ADJUST=6,
96
+ X3F_EXT_TYPE_RED_ADJUST=7,
97
+ X3F_EXT_TYPE_GREEN_ADJUST=8,
98
+ X3F_EXT_TYPE_BLUE_ADJUST=9,
99
+ X3F_EXT_TYPE_FILL_LIGHT_ADJUST=10
100
+ } x3f_extended_types_t;
101
+
102
+ typedef struct x3f_property_s {
103
+ /* Read from file */
104
+ uint32_t name_offset;
105
+ uint32_t value_offset;
106
+
107
+ /* Computed */
108
+ utf16_t *name; /* 0x00 terminated UTF 16 */
109
+ utf16_t *value; /* 0x00 terminated UTF 16 */
110
+ } x3f_property_t;
111
+
112
+ typedef struct x3f_property_table_s {
113
+ uint32_t size;
114
+ x3f_property_t *element;
115
+ } x3f_property_table_t;
116
+
117
+ typedef struct x3f_property_list_s {
118
+ /* 2.0 Fields */
119
+ uint32_t num_properties;
120
+ uint32_t character_format;
121
+ uint32_t reserved;
122
+ uint32_t total_length;
123
+
124
+ x3f_property_table_t property_table;
125
+
126
+ void *data;
127
+
128
+ uint32_t data_size;
129
+
130
+ } x3f_property_list_t;
131
+
132
+ typedef struct x3f_table8_s {
133
+ uint32_t size;
134
+ uint8_t *element;
135
+ } x3f_table8_t;
136
+
137
+ typedef struct x3f_table16_s {
138
+ uint32_t size;
139
+ uint16_t *element;
140
+ } x3f_table16_t;
141
+
142
+ typedef struct x3f_table32_s {
143
+ uint32_t size;
144
+ uint32_t *element;
145
+ } x3f_table32_t;
146
+
147
+ #define UNDEFINED_LEAF 0xffffffff
148
+
149
+ typedef struct x3f_huffnode_s {
150
+ struct x3f_huffnode_s *branch[2];
151
+ uint32_t leaf;
152
+ } x3f_huffnode_t;
153
+
154
+ typedef struct x3f_hufftree_s {
155
+ uint32_t free_node_index; /* Free node index in huffman tree array */
156
+ x3f_huffnode_t *nodes; /* Coding tree */
157
+ } x3f_hufftree_t;
158
+
159
+ typedef struct x3f_true_huffman_element_s {
160
+ uint8_t code_size;
161
+ uint8_t code;
162
+ } x3f_true_huffman_element_t;
163
+
164
+ typedef struct x3f_true_huffman_s {
165
+ uint32_t size;
166
+ x3f_true_huffman_element_t *element;
167
+ } x3f_true_huffman_t;
168
+
169
+ /* 0=bottom, 1=middle, 2=top */
170
+ #define TRUE_PLANES 3
171
+
172
+ typedef struct x3f_true_s {
173
+ uint16_t seed[TRUE_PLANES]; /* Always 512,512,512 */
174
+ uint16_t unknown; /* Always 0 */
175
+ x3f_true_huffman_t table; /* Huffman table - zero
176
+ terminated. size is the number of
177
+ leaves plus 1.*/
178
+
179
+ x3f_table32_t plane_size; /* Size of the 3 planes */
180
+ uint8_t *plane_address[TRUE_PLANES]; /* computed offset to the planes */
181
+ x3f_hufftree_t tree; /* Coding tree */
182
+ x3f_table16_t x3rgb16; /* 3x16 bit X3-RGB data */
183
+ } x3f_true_t;
184
+
185
+ typedef struct x3f_quattro_s {
186
+ struct {
187
+ uint16_t columns;
188
+ uint16_t rows;
189
+ } plane[TRUE_PLANES];
190
+ uint32_t unknown;
191
+ } x3f_quattro_t;
192
+
193
+ typedef struct x3f_huffman_s {
194
+ x3f_table16_t mapping; /* Value Mapping = X3F lossy compression */
195
+ x3f_table32_t table; /* Coding Table */
196
+ x3f_hufftree_t tree; /* Coding tree */
197
+ x3f_table32_t row_offsets; /* Row offsets */
198
+ x3f_table8_t rgb8; /* 3x8 bit RGB data */
199
+ x3f_table16_t x3rgb16; /* 3x16 bit X3-RGB data */
200
+ } x3f_huffman_t;
201
+
202
+ typedef struct x3f_image_data_s {
203
+ /* 2.0 Fields */
204
+ /* ------------------------------------------------------------------ */
205
+ /* Known combinations of type and format are:
206
+ 1-6, 2-3, 2-11, 2-18, 3-6 */
207
+ uint32_t type; /* 1 = RAW X3 (SD1)
208
+ 2 = thumbnail or maybe just RGB
209
+ 3 = RAW X3 */
210
+ uint32_t format; /* 3 = 3x8 bit pixmap
211
+ 6 = 3x10 bit huffman with map table
212
+ 11 = 3x8 bit huffman
213
+ 18 = JPEG */
214
+ uint32_t type_format; /* type<<16 + format */
215
+ /* ------------------------------------------------------------------ */
216
+
217
+ uint32_t columns; /* width / row size in pixels */
218
+ uint32_t rows; /* height */
219
+ uint32_t row_stride; /* row size in bytes */
220
+
221
+ /* NULL if not used */
222
+ x3f_huffman_t *huffman; /* Huffman help data */
223
+ x3f_true_t *tru; /* TRUE help data */
224
+ x3f_quattro_t *quattro; /* Quattro help data */
225
+
226
+ void *data; /* Take from file if NULL. Otherwise,
227
+ this is the actual data bytes in
228
+ the file. */
229
+ uint32_t data_size;
230
+
231
+ } x3f_image_data_t;
232
+
233
+ typedef struct camf_entry_s {
234
+ uint32_t id;
235
+ uint32_t version;
236
+ uint32_t entry_size;
237
+ uint32_t name_offset;
238
+ uint32_t value_offset;
239
+ void *entry; /* pointer into decoded data */
240
+
241
+ /* computed values */
242
+ uint8_t *name_address;
243
+ void *value_address;
244
+ } camf_entry_t;
245
+
246
+ typedef struct camf_entry_table_s {
247
+ uint32_t size;
248
+ camf_entry_t *element;
249
+ } camf_entry_table_t;
250
+
251
+ typedef struct x3f_camf_typeN_s {
252
+ uint32_t val0;
253
+ uint32_t val1;
254
+ uint32_t val2;
255
+ uint32_t val3;
256
+ } x3f_camf_typeN_t;
257
+
258
+ typedef struct x3f_camf_type2_s {
259
+ uint32_t reserved;
260
+ uint32_t infotype;
261
+ uint32_t infotype_version;
262
+ uint32_t crypt_key;
263
+ } x3f_camf_type2_t;
264
+
265
+ typedef struct x3f_camf_type4_s {
266
+ uint32_t reserved;
267
+ uint32_t decode_bias;
268
+ uint32_t block_size;
269
+ uint32_t block_count;
270
+ } x3f_camf_type4_t;
271
+
272
+ typedef struct x3f_camf_s {
273
+
274
+ /* Header info */
275
+ uint32_t type;
276
+ union {
277
+ x3f_camf_typeN_t tN;
278
+ x3f_camf_type2_t t2;
279
+ x3f_camf_type4_t t4;
280
+ };
281
+
282
+ /* The encrypted raw data */
283
+ void *data;
284
+ uint32_t data_size;
285
+
286
+ /* Help data for type 4 Huffman compression */
287
+ x3f_true_huffman_t table;
288
+ x3f_hufftree_t tree;
289
+ uint8_t *decoding_start;
290
+
291
+ /* The decrypted data */
292
+ void *decoded_data;
293
+ uint32_t decoded_data_size;
294
+
295
+ /* Pointers into the decrypted data */
296
+ camf_entry_table_t entry_table;
297
+ } x3f_camf_t;
298
+
299
+ typedef struct x3f_directory_entry_header_s {
300
+ uint32_t identifier; /* Should be ´SECp´, "SECi", ... */
301
+ uint32_t version; /* 0x00020001 is version 2.1 */
302
+ union {
303
+ x3f_property_list_t property_list;
304
+ x3f_image_data_t image_data;
305
+ x3f_camf_t camf;
306
+ } data_subsection;
307
+ } x3f_directory_entry_header_t;
308
+
309
+ typedef struct x3f_directory_entry_s {
310
+ struct {
311
+ uint32_t offset;
312
+ uint32_t size;
313
+ } input, output;
314
+
315
+ uint32_t type;
316
+
317
+ x3f_directory_entry_header_t header;
318
+ } x3f_directory_entry_t;
319
+
320
+ typedef struct x3f_directory_section_s {
321
+ uint32_t identifier; /* Should be ´SECd´ */
322
+ uint32_t version; /* 0x00020001 is version 2.1 */
323
+
324
+ /* 2.0 Fields */
325
+ uint32_t num_directory_entries;
326
+ x3f_directory_entry_t *directory_entry;
327
+ } x3f_directory_section_t;
328
+
329
+ typedef struct x3f_header_s {
330
+ /* 2.0 Fields */
331
+ uint32_t identifier; /* Should be ´FOVb´ */
332
+ uint32_t version; /* 0x00020001 means 2.1 */
333
+ uint8_t unique_identifier[SIZE_UNIQUE_IDENTIFIER];
334
+ uint32_t mark_bits;
335
+ uint32_t columns; /* Columns and rows ... */
336
+ uint32_t rows; /* ... before rotation */
337
+ uint32_t rotation; /* 0, 90, 180, 270 */
338
+
339
+ /* Added for 2.1 and 2.2 */
340
+ uint8_t white_balance[SIZE_WHITE_BALANCE];
341
+ uint8_t extended_types[NUM_EXT_DATA]; /* x3f_extended_types_t */
342
+ uint32_t extended_data[NUM_EXT_DATA];
343
+ } x3f_header_t;
344
+
345
+ typedef struct x3f_info_s {
346
+ char *error;
347
+ struct {
348
+ LibRaw_abstract_datastream *file; /* Use if more data is needed */
349
+ } input, output;
350
+ } x3f_info_t;
351
+
352
+ typedef struct x3f_s {
353
+ x3f_info_t info;
354
+ x3f_header_t header;
355
+ x3f_directory_section_t directory_section;
356
+ } x3f_t;
357
+
358
+ typedef enum x3f_return_e {
359
+ X3F_OK=0,
360
+ X3F_ARGUMENT_ERROR=1,
361
+ X3F_INFILE_ERROR=2,
362
+ X3F_OUTFILE_ERROR=3,
363
+ X3F_INTERNAL_ERROR=4
364
+ } x3f_return_t;
365
+
366
+ x3f_return_t x3f_delete(x3f_t *x3f);
367
+
368
+
369
+ /* --------------------------------------------------------------------- */
370
+ /* Hacky external flags */
371
+ /* --------------------------------------------------------------------- */
372
+
373
+ /* extern */ int legacy_offset = 0;
374
+ /* extern */ bool_t auto_legacy_offset = 1;
375
+
376
+ /* --------------------------------------------------------------------- */
377
+ /* Huffman Decode Macros */
378
+ /* --------------------------------------------------------------------- */
379
+
380
+ #define HUF_TREE_MAX_LENGTH 27
381
+ #define HUF_TREE_MAX_NODES(_leaves) ((HUF_TREE_MAX_LENGTH+1)*(_leaves))
382
+ #define HUF_TREE_GET_LENGTH(_v) (((_v)>>27)&0x1f)
383
+ #define HUF_TREE_GET_CODE(_v) ((_v)&0x07ffffff)
384
+
385
+ /* --------------------------------------------------------------------- */
386
+ /* Reading and writing - assuming little endian in the file */
387
+ /* --------------------------------------------------------------------- */
388
+
389
+ static int x3f_get1(LibRaw_abstract_datastream *f)
390
+ {
391
+ /* Little endian file */
392
+ return f->get_char();
393
+ }
394
+
395
+ static int x3f_sget2 (uchar *s)
396
+ {
397
+ return s[0] | s[1] << 8;
398
+ }
399
+
400
+ static int x3f_get2(LibRaw_abstract_datastream *f)
401
+ {
402
+ uchar str[2] = { 0xff,0xff };
403
+ f->read (str, 1, 2);
404
+ return x3f_sget2(str);
405
+ }
406
+
407
+ unsigned x3f_sget4 (uchar *s)
408
+ {
409
+ return s[0] | s[1] << 8 | s[2] << 16 | s[3] << 24;
410
+ }
411
+
412
+ unsigned x3f_get4(LibRaw_abstract_datastream *f)
413
+ {
414
+ uchar str[4] = { 0xff,0xff,0xff,0xff };
415
+ f->read (str, 1, 4);
416
+ return x3f_sget4(str);
417
+ }
418
+
419
+ #define FREE(P) do { free(P); (P) = NULL; } while (0)
420
+
421
+ #define PUT_GET_N(_buffer,_size,_file,_func) \
422
+ do \
423
+ { \
424
+ int _left = _size; \
425
+ while (_left != 0) { \
426
+ int _cur = _file->_func(_buffer,1,_left); \
427
+ if (_cur == 0) { \
428
+ break; \
429
+ } \
430
+ _left -= _cur; \
431
+ } \
432
+ } while(0)
433
+
434
+ #define GET1(_v) do {(_v) = x3f_get1(I->input.file);} while (0)
435
+ #define GET2(_v) do {(_v) = x3f_get2(I->input.file);} while (0)
436
+ #define GET4(_v) do {(_v) = x3f_get4(I->input.file);} while (0)
437
+ #define GETN(_v,_s) PUT_GET_N(_v,_s,I->input.file,read)
438
+
439
+ #define GET_TABLE(_T, _GETX, _NUM,_TYPE) \
440
+ do { \
441
+ int _i; \
442
+ (_T).size = (_NUM); \
443
+ (_T).element = (_TYPE *)realloc((_T).element, \
444
+ (_NUM)*sizeof((_T).element[0])); \
445
+ for (_i = 0; _i < (_T).size; _i++) \
446
+ _GETX((_T).element[_i]); \
447
+ } while (0)
448
+
449
+ #define GET_PROPERTY_TABLE(_T, _NUM) \
450
+ do { \
451
+ int _i; \
452
+ (_T).size = (_NUM); \
453
+ (_T).element = (x3f_property_t *)realloc((_T).element, \
454
+ (_NUM)*sizeof((_T).element[0])); \
455
+ for (_i = 0; _i < (_T).size; _i++) { \
456
+ GET4((_T).element[_i].name_offset); \
457
+ GET4((_T).element[_i].value_offset); \
458
+ } \
459
+ } while (0)
460
+
461
+ #define GET_TRUE_HUFF_TABLE(_T) \
462
+ do { \
463
+ int _i; \
464
+ (_T).element = NULL; \
465
+ for (_i = 0; ; _i++) { \
466
+ (_T).size = _i + 1; \
467
+ (_T).element = (x3f_true_huffman_element_t *)realloc((_T).element, \
468
+ (_i + 1)*sizeof((_T).element[0])); \
469
+ GET1((_T).element[_i].code_size); \
470
+ GET1((_T).element[_i].code); \
471
+ if ((_T).element[_i].code_size == 0) break; \
472
+ } \
473
+ } while (0)
474
+
475
+
476
+
477
+ /* --------------------------------------------------------------------- */
478
+ /* Allocating Huffman tree help data */
479
+ /* --------------------------------------------------------------------- */
480
+
481
+ static void cleanup_huffman_tree(x3f_hufftree_t *HTP)
482
+ {
483
+ free(HTP->nodes);
484
+ }
485
+
486
+ static void new_huffman_tree(x3f_hufftree_t *HTP, int bits)
487
+ {
488
+ int leaves = 1<<bits;
489
+
490
+ HTP->free_node_index = 0;
491
+ HTP->nodes = (x3f_huffnode_t *)
492
+ calloc(1, HUF_TREE_MAX_NODES(leaves)*sizeof(x3f_huffnode_t));
493
+ }
494
+
495
+ /* --------------------------------------------------------------------- */
496
+ /* Allocating TRUE engine RAW help data */
497
+ /* --------------------------------------------------------------------- */
498
+
499
+ static void cleanup_true(x3f_true_t **TRUP)
500
+ {
501
+ x3f_true_t *TRU = *TRUP;
502
+
503
+ if (TRU == NULL) return;
504
+
505
+ FREE(TRU->table.element);
506
+ FREE(TRU->plane_size.element);
507
+ cleanup_huffman_tree(&TRU->tree);
508
+ FREE(TRU->x3rgb16.element);
509
+
510
+ FREE(TRU);
511
+
512
+ *TRUP = NULL;
513
+ }
514
+
515
+ static x3f_true_t *new_true(x3f_true_t **TRUP)
516
+ {
517
+ x3f_true_t *TRU = (x3f_true_t *)calloc(1, sizeof(x3f_true_t));
518
+
519
+ cleanup_true(TRUP);
520
+
521
+ TRU->table.size = 0;
522
+ TRU->table.element = NULL;
523
+ TRU->plane_size.size = 0;
524
+ TRU->plane_size.element = NULL;
525
+ TRU->tree.nodes = NULL;
526
+ TRU->x3rgb16.size = 0;
527
+ TRU->x3rgb16.element = NULL;
528
+
529
+ *TRUP = TRU;
530
+
531
+ return TRU;
532
+ }
533
+
534
+ static void cleanup_quattro(x3f_quattro_t **QP)
535
+ {
536
+ x3f_quattro_t *Q = *QP;
537
+
538
+ if (Q == NULL) return;
539
+
540
+ FREE(Q);
541
+
542
+ *QP = NULL;
543
+ }
544
+
545
+ static x3f_quattro_t *new_quattro(x3f_quattro_t **QP)
546
+ {
547
+ x3f_quattro_t *Q = (x3f_quattro_t *)calloc(1, sizeof(x3f_quattro_t));
548
+ int i;
549
+
550
+ cleanup_quattro(QP);
551
+
552
+ for (i=0; i<TRUE_PLANES; i++) {
553
+ Q->plane[i].columns = 0;
554
+ Q->plane[i].rows = 0;
555
+ }
556
+
557
+ Q->unknown = 0;
558
+
559
+ *QP = Q;
560
+
561
+ return Q;
562
+ }
563
+
564
+ /* --------------------------------------------------------------------- */
565
+ /* Allocating Huffman engine help data */
566
+ /* --------------------------------------------------------------------- */
567
+
568
+ static void cleanup_huffman(x3f_huffman_t **HUFP)
569
+ {
570
+ x3f_huffman_t *HUF = *HUFP;
571
+
572
+ if (HUF == NULL) return;
573
+
574
+ FREE(HUF->mapping.element);
575
+ FREE(HUF->table.element);
576
+ cleanup_huffman_tree(&HUF->tree);
577
+ FREE(HUF->row_offsets.element);
578
+ FREE(HUF->rgb8.element);
579
+ FREE(HUF->x3rgb16.element);
580
+ FREE(HUF);
581
+
582
+ *HUFP = NULL;
583
+ }
584
+
585
+ static x3f_huffman_t *new_huffman(x3f_huffman_t **HUFP)
586
+ {
587
+ x3f_huffman_t *HUF = (x3f_huffman_t *)calloc(1, sizeof(x3f_huffman_t));
588
+
589
+ cleanup_huffman(HUFP);
590
+
591
+ /* Set all not read data block pointers to NULL */
592
+ HUF->mapping.size = 0;
593
+ HUF->mapping.element = NULL;
594
+ HUF->table.size = 0;
595
+ HUF->table.element = NULL;
596
+ HUF->tree.nodes = NULL;
597
+ HUF->row_offsets.size = 0;
598
+ HUF->row_offsets.element = NULL;
599
+ HUF->rgb8.size = 0;
600
+ HUF->rgb8.element = NULL;
601
+ HUF->x3rgb16.size = 0;
602
+ HUF->x3rgb16.element = NULL;
603
+
604
+ *HUFP = HUF;
605
+
606
+ return HUF;
607
+ }
608
+
609
+
610
+ /* --------------------------------------------------------------------- */
611
+ /* Creating a new x3f structure from file */
612
+ /* --------------------------------------------------------------------- */
613
+
614
+ /* extern */ x3f_t *x3f_new_from_file(LibRaw_abstract_datastream *infile)
615
+ {
616
+ x3f_t *x3f = (x3f_t *)calloc(1, sizeof(x3f_t));
617
+ x3f_info_t *I = NULL;
618
+ x3f_header_t *H = NULL;
619
+ x3f_directory_section_t *DS = NULL;
620
+ int i, d;
621
+
622
+ I = &x3f->info;
623
+ I->error = NULL;
624
+ I->input.file = infile;
625
+ I->output.file = NULL;
626
+
627
+ if (infile == NULL) {
628
+ I->error = "No infile";
629
+ return x3f;
630
+ }
631
+
632
+ /* Read file header */
633
+ H = &x3f->header;
634
+ infile->seek(0, SEEK_SET);
635
+ GET4(H->identifier);
636
+
637
+ if (H->identifier != X3F_FOVb) {
638
+ #ifdef DCRAW_VERBOSE
639
+ fprintf(stderr, "Faulty file type\n");
640
+ #endif
641
+ x3f_delete(x3f);
642
+ return NULL;
643
+ }
644
+
645
+ GET4(H->version);
646
+ GETN(H->unique_identifier, SIZE_UNIQUE_IDENTIFIER);
647
+ GET4(H->mark_bits);
648
+ GET4(H->columns);
649
+ GET4(H->rows);
650
+ GET4(H->rotation);
651
+ if (H->version > X3F_VERSION_2_0) {
652
+ GETN(H->white_balance, SIZE_WHITE_BALANCE);
653
+ GETN(H->extended_types, NUM_EXT_DATA);
654
+ for (i=0; i<NUM_EXT_DATA; i++)
655
+ GET4(H->extended_data[i]);
656
+ }
657
+
658
+ /* Go to the beginning of the directory */
659
+ infile->seek(-4, SEEK_END);
660
+ infile->seek(x3f_get4(infile), SEEK_SET);
661
+
662
+ /* Read the directory header */
663
+ DS = &x3f->directory_section;
664
+ GET4(DS->identifier);
665
+ GET4(DS->version);
666
+ GET4(DS->num_directory_entries);
667
+
668
+ if (DS->num_directory_entries > 0) {
669
+ size_t size = DS->num_directory_entries * sizeof(x3f_directory_entry_t);
670
+ DS->directory_entry = (x3f_directory_entry_t *)calloc(1, size);
671
+ }
672
+
673
+ /* Traverse the directory */
674
+ for (d=0; d<DS->num_directory_entries; d++) {
675
+ x3f_directory_entry_t *DE = &DS->directory_entry[d];
676
+ x3f_directory_entry_header_t *DEH = &DE->header;
677
+ uint32_t save_dir_pos;
678
+
679
+ /* Read the directory entry info */
680
+ GET4(DE->input.offset);
681
+ GET4(DE->input.size);
682
+
683
+ DE->output.offset = 0;
684
+ DE->output.size = 0;
685
+
686
+ GET4(DE->type);
687
+
688
+ /* Save current pos and go to the entry */
689
+ save_dir_pos = infile->tell();
690
+ infile->seek(DE->input.offset, SEEK_SET);
691
+
692
+ /* Read the type independent part of the entry header */
693
+ DEH = &DE->header;
694
+ GET4(DEH->identifier);
695
+ GET4(DEH->version);
696
+
697
+ /* NOTE - the tests below could be made on DE->type instead */
698
+
699
+ if (DEH->identifier == X3F_SECp) {
700
+ x3f_property_list_t *PL = &DEH->data_subsection.property_list;
701
+
702
+ /* Read the property part of the header */
703
+ GET4(PL->num_properties);
704
+ GET4(PL->character_format);
705
+ GET4(PL->reserved);
706
+ GET4(PL->total_length);
707
+
708
+ /* Set all not read data block pointers to NULL */
709
+ PL->data = NULL;
710
+ PL->data_size = 0;
711
+ }
712
+
713
+ if (DEH->identifier == X3F_SECi) {
714
+ x3f_image_data_t *ID = &DEH->data_subsection.image_data;
715
+
716
+ /* Read the image part of the header */
717
+ GET4(ID->type);
718
+ GET4(ID->format);
719
+ ID->type_format = (ID->type << 16) + (ID->format);
720
+ GET4(ID->columns);
721
+ GET4(ID->rows);
722
+ GET4(ID->row_stride);
723
+
724
+ /* Set all not read data block pointers to NULL */
725
+ ID->huffman = NULL;
726
+
727
+ ID->data = NULL;
728
+ ID->data_size = 0;
729
+ }
730
+
731
+ if (DEH->identifier == X3F_SECc) {
732
+ x3f_camf_t *CAMF = &DEH->data_subsection.camf;
733
+
734
+ /* Read the CAMF part of the header */
735
+ GET4(CAMF->type);
736
+ GET4(CAMF->tN.val0);
737
+ GET4(CAMF->tN.val1);
738
+ GET4(CAMF->tN.val2);
739
+ GET4(CAMF->tN.val3);
740
+
741
+ /* Set all not read data block pointers to NULL */
742
+ CAMF->data = NULL;
743
+ CAMF->data_size = 0;
744
+
745
+ /* Set all not allocated help pointers to NULL */
746
+ CAMF->table.element = NULL;
747
+ CAMF->table.size = 0;
748
+ CAMF->tree.nodes = NULL;
749
+ CAMF->decoded_data = NULL;
750
+ CAMF->decoded_data_size = 0;
751
+ CAMF->entry_table.element = NULL;
752
+ CAMF->entry_table.size = 0;
753
+ }
754
+
755
+ /* Reset the file pointer back to the directory */
756
+ infile->seek(save_dir_pos, SEEK_SET);
757
+ }
758
+
759
+ return x3f;
760
+ }
761
+
762
+
763
+
764
+ /* --------------------------------------------------------------------- */
765
+ /* Clean up an x3f structure */
766
+ /* --------------------------------------------------------------------- */
767
+
768
+ /* extern */ x3f_return_t x3f_delete(x3f_t *x3f)
769
+ {
770
+ x3f_directory_section_t *DS;
771
+ int d;
772
+
773
+ if (x3f == NULL)
774
+ return X3F_ARGUMENT_ERROR;
775
+
776
+ DS = &x3f->directory_section;
777
+
778
+ for (d=0; d<DS->num_directory_entries; d++) {
779
+ x3f_directory_entry_t *DE = &DS->directory_entry[d];
780
+ x3f_directory_entry_header_t *DEH = &DE->header;
781
+
782
+ if (DEH->identifier == X3F_SECp) {
783
+ x3f_property_list_t *PL = &DEH->data_subsection.property_list;
784
+
785
+ FREE(PL->property_table.element);
786
+ FREE(PL->data);
787
+ }
788
+
789
+ if (DEH->identifier == X3F_SECi) {
790
+ x3f_image_data_t *ID = &DEH->data_subsection.image_data;
791
+
792
+ cleanup_huffman(&ID->huffman);
793
+
794
+ FREE(ID->data);
795
+ }
796
+
797
+ if (DEH->identifier == X3F_SECc) {
798
+ x3f_camf_t *CAMF = &DEH->data_subsection.camf;
799
+
800
+ FREE(CAMF->data);
801
+ FREE(CAMF->table.element);
802
+ cleanup_huffman_tree(&CAMF->tree);
803
+ FREE(CAMF->decoded_data);
804
+ FREE(CAMF->entry_table.element);
805
+ }
806
+ }
807
+
808
+ FREE(DS->directory_entry);
809
+ FREE(x3f);
810
+
811
+ return X3F_OK;
812
+ }
813
+
814
+
815
+ /* --------------------------------------------------------------------- */
816
+ /* Getting a reference to a directory entry */
817
+ /* --------------------------------------------------------------------- */
818
+
819
+ /* TODO: all those only get the first instance */
820
+
821
+ static x3f_directory_entry_t *x3f_get(x3f_t *x3f,
822
+ uint32_t type,
823
+ uint32_t image_type)
824
+ {
825
+ x3f_directory_section_t *DS;
826
+ int d;
827
+
828
+ if (x3f == NULL) return NULL;
829
+
830
+ DS = &x3f->directory_section;
831
+
832
+ for (d=0; d<DS->num_directory_entries; d++) {
833
+ x3f_directory_entry_t *DE = &DS->directory_entry[d];
834
+ x3f_directory_entry_header_t *DEH = &DE->header;
835
+
836
+ if (DEH->identifier == type) {
837
+ switch (DEH->identifier) {
838
+ case X3F_SECi:
839
+ {
840
+ x3f_image_data_t *ID = &DEH->data_subsection.image_data;
841
+
842
+ if (ID->type_format == image_type)
843
+ return DE;
844
+ }
845
+ break;
846
+ default:
847
+ return DE;
848
+ }
849
+ }
850
+ }
851
+
852
+ return NULL;
853
+ }
854
+
855
+ /* extern */ x3f_directory_entry_t *x3f_get_raw(x3f_t *x3f)
856
+ {
857
+ x3f_directory_entry_t *DE;
858
+
859
+ if ((DE = x3f_get(x3f, X3F_SECi, X3F_IMAGE_RAW_HUFFMAN_X530)) != NULL)
860
+ return DE;
861
+
862
+ if ((DE = x3f_get(x3f, X3F_SECi, X3F_IMAGE_RAW_HUFFMAN_10BIT)) != NULL)
863
+ return DE;
864
+
865
+ if ((DE = x3f_get(x3f, X3F_SECi, X3F_IMAGE_RAW_TRUE)) != NULL)
866
+ return DE;
867
+
868
+ if ((DE = x3f_get(x3f, X3F_SECi, X3F_IMAGE_RAW_MERRILL)) != NULL)
869
+ return DE;
870
+
871
+ if ((DE = x3f_get(x3f, X3F_SECi, X3F_IMAGE_RAW_QUATTRO)) != NULL)
872
+ return DE;
873
+
874
+ return NULL;
875
+ }
876
+
877
+ /* extern */ x3f_directory_entry_t *x3f_get_thumb_plain(x3f_t *x3f)
878
+ {
879
+ return x3f_get(x3f, X3F_SECi, X3F_IMAGE_THUMB_PLAIN);
880
+ }
881
+
882
+ /* extern */ x3f_directory_entry_t *x3f_get_thumb_huffman(x3f_t *x3f)
883
+ {
884
+ return x3f_get(x3f, X3F_SECi, X3F_IMAGE_THUMB_HUFFMAN);
885
+ }
886
+
887
+ /* extern */ x3f_directory_entry_t *x3f_get_thumb_jpeg(x3f_t *x3f)
888
+ {
889
+ return x3f_get(x3f, X3F_SECi, X3F_IMAGE_THUMB_JPEG);
890
+ }
891
+
892
+ /* extern */ x3f_directory_entry_t *x3f_get_camf(x3f_t *x3f)
893
+ {
894
+ return x3f_get(x3f, X3F_SECc, 0);
895
+ }
896
+
897
+ /* extern */ x3f_directory_entry_t *x3f_get_prop(x3f_t *x3f)
898
+ {
899
+ return x3f_get(x3f, X3F_SECp, 0);
900
+ }
901
+
902
+ /* For some obscure reason, the bit numbering is weird. It is
903
+ generally some kind of "big endian" style - e.g. the bit 7 is the
904
+ first in a byte and bit 31 first in a 4 byte int. For patterns in
905
+ the huffman pattern table, bit 27 is the first bit and bit 26 the
906
+ next one. */
907
+
908
+ #define PATTERN_BIT_POS(_len, _bit) ((_len) - (_bit) - 1)
909
+ #define MEMORY_BIT_POS(_bit) PATTERN_BIT_POS(8, _bit)
910
+
911
+
912
+ /* --------------------------------------------------------------------- */
913
+ /* Huffman Decode */
914
+ /* --------------------------------------------------------------------- */
915
+
916
+ /* Make the huffman tree */
917
+
918
+ #ifdef DBG_PRNT
919
+ static char *display_code(int length, uint32_t code, char *buffer)
920
+ {
921
+ int i;
922
+
923
+ for (i=0; i<length; i++) {
924
+ int pos = PATTERN_BIT_POS(length, i);
925
+ buffer[i] = ((code>>pos)&1) == 0 ? '0' : '1';
926
+ }
927
+
928
+ buffer[i] = 0;
929
+
930
+ return buffer;
931
+ }
932
+ #endif
933
+
934
+ static x3f_huffnode_t *new_node(x3f_hufftree_t *tree)
935
+ {
936
+ x3f_huffnode_t *t = &tree->nodes[tree->free_node_index];
937
+
938
+ t->branch[0] = NULL;
939
+ t->branch[1] = NULL;
940
+ t->leaf = UNDEFINED_LEAF;
941
+
942
+ tree->free_node_index++;
943
+
944
+ return t;
945
+ }
946
+
947
+ static void add_code_to_tree(x3f_hufftree_t *tree,
948
+ int length, uint32_t code, uint32_t value)
949
+ {
950
+ int i;
951
+
952
+ x3f_huffnode_t *t = tree->nodes;
953
+
954
+ for (i=0; i<length; i++) {
955
+ int pos = PATTERN_BIT_POS(length, i);
956
+ int bit = (code>>pos)&1;
957
+ x3f_huffnode_t *t_next = t->branch[bit];
958
+
959
+ if (t_next == NULL)
960
+ t_next = t->branch[bit] = new_node(tree);
961
+
962
+ t = t_next;
963
+ }
964
+
965
+ t->leaf = value;
966
+ }
967
+
968
+ static void populate_true_huffman_tree(x3f_hufftree_t *tree,
969
+ x3f_true_huffman_t *table)
970
+ {
971
+ int i;
972
+
973
+ new_node(tree);
974
+
975
+ for (i=0; i<table->size; i++) {
976
+ x3f_true_huffman_element_t *element = &table->element[i];
977
+ uint32_t length = element->code_size;
978
+
979
+ if (length != 0) {
980
+ /* add_code_to_tree wants the code right adjusted */
981
+ uint32_t code = ((element->code) >> (8 - length)) & 0xff;
982
+ uint32_t value = i;
983
+
984
+ add_code_to_tree(tree, length, code, value);
985
+
986
+ #ifdef DBG_PRNT
987
+ {
988
+ char buffer[100];
989
+
990
+ printf("H %5d : %5x : %5d : %02x %08x (%08x) (%s)\n",
991
+ i, i, value, length, code, value,
992
+ display_code(length, code, buffer));
993
+ }
994
+ #endif
995
+ }
996
+ }
997
+ }
998
+
999
+ static void populate_huffman_tree(x3f_hufftree_t *tree,
1000
+ x3f_table32_t *table,
1001
+ x3f_table16_t *mapping)
1002
+ {
1003
+ int i;
1004
+
1005
+ new_node(tree);
1006
+
1007
+ for (i=0; i<table->size; i++) {
1008
+ uint32_t element = table->element[i];
1009
+
1010
+ if (element != 0) {
1011
+ uint32_t length = HUF_TREE_GET_LENGTH(element);
1012
+ uint32_t code = HUF_TREE_GET_CODE(element);
1013
+ uint32_t value;
1014
+
1015
+ /* If we have a valid mapping table - then the value from the
1016
+ mapping table shall be used. Otherwise we use the current
1017
+ index in the table as value. */
1018
+ if (table->size == mapping->size)
1019
+ value = mapping->element[i];
1020
+ else
1021
+ value = i;
1022
+
1023
+ add_code_to_tree(tree, length, code, value);
1024
+
1025
+ #ifdef DBG_PRNT
1026
+ {
1027
+ char buffer[100];
1028
+
1029
+ printf("H %5d : %5x : %5d : %02x %08x (%08x) (%s)\n",
1030
+ i, i, value, length, code, element,
1031
+ display_code(length, code, buffer));
1032
+ }
1033
+ #endif
1034
+ }
1035
+ }
1036
+ }
1037
+
1038
+ #ifdef DBG_PRNT
1039
+ static void print_huffman_tree(x3f_huffnode_t *t, int length, uint32_t code)
1040
+ {
1041
+ char buf1[100];
1042
+ char buf2[100];
1043
+
1044
+ printf("%*s (%s,%s) %s (%s)\n",
1045
+ length, length < 1 ? "-" : (code&1) ? "1" : "0",
1046
+ t->branch[0]==NULL ? "-" : "0",
1047
+ t->branch[1]==NULL ? "-" : "1",
1048
+ t->leaf==UNDEFINED_LEAF ? "-" : (sprintf(buf1, "%x", t->leaf),buf1),
1049
+ display_code(length, code, buf2));
1050
+
1051
+ code = code << 1;
1052
+ if (t->branch[0]) print_huffman_tree(t->branch[0], length+1, code+0);
1053
+ if (t->branch[1]) print_huffman_tree(t->branch[1], length+1, code+1);
1054
+ }
1055
+ #endif
1056
+
1057
+ /* Help machinery for reading bits in a memory */
1058
+
1059
+ typedef struct bit_state_s {
1060
+ uint8_t *next_address;
1061
+ uint8_t bit_offset;
1062
+ uint8_t bits[8];
1063
+ } bit_state_t;
1064
+
1065
+ static void set_bit_state(bit_state_t *BS, uint8_t *address)
1066
+ {
1067
+ BS->next_address = address;
1068
+ BS->bit_offset = 8;
1069
+ }
1070
+
1071
+ static uint8_t get_bit(bit_state_t *BS)
1072
+ {
1073
+ if (BS->bit_offset == 8) {
1074
+ uint8_t byte = *BS->next_address;
1075
+ int i;
1076
+
1077
+ for (i=7; i>= 0; i--) {
1078
+ BS->bits[i] = byte&1;
1079
+ byte = byte >> 1;
1080
+ }
1081
+ BS->next_address++;
1082
+ BS->bit_offset = 0;
1083
+ }
1084
+
1085
+ return BS->bits[BS->bit_offset++];
1086
+ }
1087
+
1088
+ /* Decode use the TRUE algorithm */
1089
+
1090
+ static int32_t get_true_diff(bit_state_t *BS, x3f_hufftree_t *HTP)
1091
+ {
1092
+ int32_t diff;
1093
+ x3f_huffnode_t *node = &HTP->nodes[0];
1094
+ uint8_t bits;
1095
+
1096
+ while (node->branch[0] != NULL || node->branch[1] != NULL) {
1097
+ uint8_t bit = get_bit(BS);
1098
+ x3f_huffnode_t *new_node = node->branch[bit];
1099
+
1100
+ node = new_node;
1101
+ if (node == NULL) {
1102
+ #ifdef DCRAW_VERBOSE
1103
+ fprintf(stderr, "Huffman coding got unexpected bit\n");
1104
+ #endif
1105
+ return 0;
1106
+ }
1107
+ }
1108
+
1109
+ bits = node->leaf;
1110
+
1111
+ if (bits == 0)
1112
+ diff = 0;
1113
+ else {
1114
+ uint8_t first_bit = get_bit(BS);
1115
+ int i;
1116
+
1117
+ diff = first_bit;
1118
+
1119
+ for (i=1; i<bits; i++)
1120
+ diff = (diff << 1) + get_bit(BS);
1121
+
1122
+ if (first_bit == 0)
1123
+ diff -= (1<<bits) - 1;
1124
+ }
1125
+
1126
+ return diff;
1127
+ }
1128
+
1129
+ /* This code (that decodes one of the X3F color planes, really is a
1130
+ decoding of a compression algorithm suited for Bayer CFA data. In
1131
+ Bayer CFA the data is divided into 2x2 squares that represents
1132
+ (R,G1,G2,B) data. Those four positions are (in this compression)
1133
+ treated as one data stream each, where you store the differences to
1134
+ previous data in the stream. The reason for this is, of course,
1135
+ that the date is more often than not near to the next data in a
1136
+ stream that represents the same color. */
1137
+
1138
+ /* TODO: write more about the compression */
1139
+
1140
+ static void true_decode_one_color(x3f_image_data_t *ID, int color)
1141
+ {
1142
+ x3f_true_t *TRU = ID->tru;
1143
+ uint32_t seed = TRU->seed[color]; /* TODO : Is this correct ? */
1144
+ int row;
1145
+
1146
+ x3f_hufftree_t *tree = &TRU->tree;
1147
+ bit_state_t BS;
1148
+
1149
+ int32_t row_start_acc[2][2];
1150
+ uint32_t rows = ID->rows;
1151
+ uint32_t cols = ID->columns;
1152
+ uint32_t out_cols = ID->columns;
1153
+
1154
+
1155
+ set_bit_state(&BS, TRU->plane_address[color]);
1156
+
1157
+ row_start_acc[0][0] = seed;
1158
+ row_start_acc[0][1] = seed;
1159
+ row_start_acc[1][0] = seed;
1160
+ row_start_acc[1][1] = seed;
1161
+
1162
+
1163
+ int datastep = 1;
1164
+
1165
+ if (ID->type_format == X3F_IMAGE_RAW_QUATTRO) {
1166
+ if(ID->quattro->plane[color].rows < (rows/2)+16)
1167
+ {
1168
+ // Half sized layer
1169
+ datastep = 2;
1170
+ }
1171
+ rows = ID->quattro->plane[color].rows;
1172
+ cols = ID->quattro->plane[color].columns;
1173
+ }
1174
+
1175
+
1176
+ for (row = 0; row < rows; row++)
1177
+ {
1178
+ uint16_t *dst = TRU->x3rgb16.element + row * out_cols * 3 * datastep+ color;
1179
+ int col;
1180
+ bool_t odd_row = row&1;
1181
+ int32_t acc[2];
1182
+ for (col = 0; col < cols; col++)
1183
+ {
1184
+ bool_t odd_col = col&1;
1185
+ int32_t diff = get_true_diff(&BS, tree);
1186
+ int32_t prev = col < 2 ? row_start_acc[odd_row][odd_col] : acc[odd_col];
1187
+ int32_t value = prev + diff;
1188
+ acc[odd_col] = value;
1189
+ if (col < 2)
1190
+ row_start_acc[odd_row][odd_col] = value;
1191
+ if (col < out_cols)
1192
+ {
1193
+ /* For quattro the input may be larger than the output */
1194
+ *dst = value;
1195
+ dst += 3*datastep;
1196
+ }
1197
+ }
1198
+ }
1199
+ }
1200
+
1201
+ static void true_decode(x3f_info_t *I,
1202
+ x3f_directory_entry_t *DE)
1203
+ {
1204
+ x3f_directory_entry_header_t *DEH = &DE->header;
1205
+ x3f_image_data_t *ID = &DEH->data_subsection.image_data;
1206
+ int color;
1207
+
1208
+ for (color = 0; color < 3; color++) {
1209
+ true_decode_one_color(ID, color);
1210
+ }
1211
+ }
1212
+
1213
+ /* Decode use the huffman tree */
1214
+
1215
+ static int32_t get_huffman_diff(bit_state_t *BS, x3f_hufftree_t *HTP)
1216
+ {
1217
+ int32_t diff;
1218
+ x3f_huffnode_t *node = &HTP->nodes[0];
1219
+
1220
+ while (node->branch[0] != NULL || node->branch[1] != NULL) {
1221
+ uint8_t bit = get_bit(BS);
1222
+ x3f_huffnode_t *new_node = node->branch[bit];
1223
+
1224
+ node = new_node;
1225
+ if (node == NULL) {
1226
+ #ifdef DCRAW_VERBOSE
1227
+ fprintf(stderr, "Huffman coding got unexpected bit\n");
1228
+ #endif
1229
+ return 0;
1230
+ }
1231
+ }
1232
+
1233
+ diff = node->leaf;
1234
+
1235
+ return diff;
1236
+ }
1237
+
1238
+ static void huffman_decode_row(x3f_info_t *I,
1239
+ x3f_directory_entry_t *DE,
1240
+ int bits,
1241
+ int row,
1242
+ int offset,
1243
+ int *minimum)
1244
+ {
1245
+ x3f_directory_entry_header_t *DEH = &DE->header;
1246
+ x3f_image_data_t *ID = &DEH->data_subsection.image_data;
1247
+ x3f_huffman_t *HUF = ID->huffman;
1248
+
1249
+ int16_t c[3] = {offset,offset,offset};
1250
+ int col;
1251
+ bit_state_t BS;
1252
+
1253
+ set_bit_state(&BS, ((unsigned char*)ID->data) + HUF->row_offsets.element[row]);
1254
+
1255
+ for (col = 0; col < ID->columns; col++) {
1256
+ int color;
1257
+
1258
+ for (color = 0; color < 3; color++) {
1259
+ uint16_t c_fix;
1260
+
1261
+ c[color] += get_huffman_diff(&BS, &HUF->tree);
1262
+ if (c[color] < 0) {
1263
+ c_fix = 0;
1264
+ if (c[color] < *minimum)
1265
+ *minimum = c[color];
1266
+ } else {
1267
+ c_fix = c[color];
1268
+ }
1269
+
1270
+ switch (ID->type_format) {
1271
+ case X3F_IMAGE_RAW_HUFFMAN_X530:
1272
+ case X3F_IMAGE_RAW_HUFFMAN_10BIT:
1273
+ HUF->x3rgb16.element[3*(row*ID->columns + col) + color] = (uint16_t)c_fix;
1274
+ break;
1275
+ case X3F_IMAGE_THUMB_HUFFMAN:
1276
+ HUF->rgb8.element[3*(row*ID->columns + col) + color] = (uint8_t)c_fix;
1277
+ break;
1278
+ default:
1279
+ #ifdef DCRAW_VERBOSE
1280
+ fprintf(stderr, "Unknown huffman image type\n");
1281
+ #endif
1282
+ break;
1283
+ }
1284
+ }
1285
+ }
1286
+ }
1287
+
1288
+ static void huffman_decode(x3f_info_t *I,
1289
+ x3f_directory_entry_t *DE,
1290
+ int bits)
1291
+ {
1292
+ x3f_directory_entry_header_t *DEH = &DE->header;
1293
+ x3f_image_data_t *ID = &DEH->data_subsection.image_data;
1294
+
1295
+ int row;
1296
+ int minimum = 0;
1297
+ int offset = legacy_offset;
1298
+
1299
+ #ifdef DCRAW_VERBOSE
1300
+ printf("Huffman decode with offset: %d\n", offset);
1301
+ #endif
1302
+ for (row = 0; row < ID->rows; row++)
1303
+ huffman_decode_row(I, DE, bits, row, offset, &minimum);
1304
+
1305
+ if (auto_legacy_offset && minimum < 0) {
1306
+ offset = -minimum;
1307
+ #ifdef DCRAW_VERBOSE
1308
+ printf("Redo with offset: %d\n", offset);
1309
+ #endif
1310
+ for (row = 0; row < ID->rows; row++)
1311
+ huffman_decode_row(I, DE, bits, row, offset, &minimum);
1312
+ }
1313
+ }
1314
+
1315
+ static int32_t get_simple_diff(x3f_huffman_t *HUF, uint16_t index)
1316
+ {
1317
+ if (HUF->mapping.size == 0)
1318
+ return index;
1319
+ else
1320
+ return HUF->mapping.element[index];
1321
+ }
1322
+
1323
+ static void simple_decode_row(x3f_info_t *I,
1324
+ x3f_directory_entry_t *DE,
1325
+ int bits,
1326
+ int row,
1327
+ int row_stride)
1328
+ {
1329
+ x3f_directory_entry_header_t *DEH = &DE->header;
1330
+ x3f_image_data_t *ID = &DEH->data_subsection.image_data;
1331
+ x3f_huffman_t *HUF = ID->huffman;
1332
+
1333
+ uint32_t *data = (uint32_t *)((unsigned char*)ID->data + row*row_stride);
1334
+
1335
+ uint16_t c[3] = {0,0,0};
1336
+ int col;
1337
+
1338
+ uint32_t mask = 0;
1339
+
1340
+ switch (bits) {
1341
+ case 8:
1342
+ mask = 0x0ff;
1343
+ break;
1344
+ case 9:
1345
+ mask = 0x1ff;
1346
+ break;
1347
+ case 10:
1348
+ mask = 0x3ff;
1349
+ break;
1350
+ case 11:
1351
+ mask = 0x7ff;
1352
+ break;
1353
+ case 12:
1354
+ mask = 0xfff;
1355
+ break;
1356
+ default:
1357
+ #ifdef DCRAW_VERBOSE
1358
+ fprintf(stderr, "Unknown number of bits: %d\n", bits);
1359
+ #endif
1360
+ mask = 0;
1361
+ break;
1362
+ }
1363
+
1364
+ for (col = 0; col < ID->columns; col++) {
1365
+ int color;
1366
+ uint32_t val = data[col];
1367
+
1368
+ for (color = 0; color < 3; color++) {
1369
+ uint16_t c_fix;
1370
+ c[color] += get_simple_diff(HUF, (val>>(color*bits))&mask);
1371
+
1372
+ switch (ID->type_format) {
1373
+ case X3F_IMAGE_RAW_HUFFMAN_X530:
1374
+ case X3F_IMAGE_RAW_HUFFMAN_10BIT:
1375
+ c_fix = (int16_t)c[color] > 0 ? c[color] : 0;
1376
+
1377
+ HUF->x3rgb16.element[3*(row*ID->columns + col) + color] = c_fix;
1378
+ break;
1379
+ case X3F_IMAGE_THUMB_HUFFMAN:
1380
+ c_fix = (int8_t)c[color] > 0 ? c[color] : 0;
1381
+
1382
+ HUF->rgb8.element[3*(row*ID->columns + col) + color] = c_fix;
1383
+ break;
1384
+ default:
1385
+ #ifdef DCRAW_VERBOSE
1386
+ fprintf(stderr, "Unknown huffman image type\n");
1387
+ #endif
1388
+ break;
1389
+ }
1390
+ }
1391
+ }
1392
+ }
1393
+
1394
+ static void simple_decode(x3f_info_t *I,
1395
+ x3f_directory_entry_t *DE,
1396
+ int bits,
1397
+ int row_stride)
1398
+ {
1399
+ x3f_directory_entry_header_t *DEH = &DE->header;
1400
+ x3f_image_data_t *ID = &DEH->data_subsection.image_data;
1401
+
1402
+ int row;
1403
+
1404
+ for (row = 0; row < ID->rows; row++)
1405
+ simple_decode_row(I, DE, bits, row, row_stride);
1406
+ }
1407
+
1408
+ /* --------------------------------------------------------------------- */
1409
+ /* Loading the data in a directory entry */
1410
+ /* --------------------------------------------------------------------- */
1411
+
1412
+ /* First you set the offset to where to start reading the data ... */
1413
+
1414
+ static void read_data_set_offset(x3f_info_t *I,
1415
+ x3f_directory_entry_t *DE,
1416
+ uint32_t header_size)
1417
+ {
1418
+ uint32_t i_off = DE->input.offset + header_size;
1419
+
1420
+ I->input.file->seek(i_off, SEEK_SET);
1421
+ }
1422
+
1423
+ /* ... then you read the data, block for block */
1424
+
1425
+ static uint32_t read_data_block(void **data,
1426
+ x3f_info_t *I,
1427
+ x3f_directory_entry_t *DE,
1428
+ uint32_t footer)
1429
+ {
1430
+ uint32_t size =
1431
+ DE->input.size + DE->input.offset - I->input.file->tell() - footer;
1432
+
1433
+ *data = (void *)malloc(size);
1434
+
1435
+ GETN(*data, size);
1436
+
1437
+ return size;
1438
+ }
1439
+
1440
+ static void x3f_load_image_verbatim(x3f_info_t *I, x3f_directory_entry_t *DE)
1441
+ {
1442
+ x3f_directory_entry_header_t *DEH = &DE->header;
1443
+ x3f_image_data_t *ID = &DEH->data_subsection.image_data;
1444
+
1445
+ #ifdef DCRAW_VERBOSE
1446
+ printf("Load image verbatim\n");
1447
+ #endif
1448
+
1449
+ ID->data_size = read_data_block((void**)&ID->data, I, DE, 0);
1450
+ }
1451
+
1452
+ static void x3f_load_property_list(x3f_info_t *I, x3f_directory_entry_t *DE)
1453
+ {
1454
+ x3f_directory_entry_header_t *DEH = &DE->header;
1455
+ x3f_property_list_t *PL = &DEH->data_subsection.property_list;
1456
+
1457
+ int i;
1458
+
1459
+ read_data_set_offset(I, DE, X3F_PROPERTY_LIST_HEADER_SIZE);
1460
+
1461
+ GET_PROPERTY_TABLE(PL->property_table, PL->num_properties);
1462
+
1463
+ PL->data_size = read_data_block(&PL->data, I, DE, 0);
1464
+
1465
+ for (i=0; i<PL->num_properties; i++) {
1466
+ x3f_property_t *P = &PL->property_table.element[i];
1467
+
1468
+ P->name = ((utf16_t *)PL->data + P->name_offset);
1469
+ P->value = ((utf16_t *)PL->data + P->value_offset);
1470
+ }
1471
+ }
1472
+
1473
+ static void x3f_load_true(x3f_info_t *I,
1474
+ x3f_directory_entry_t *DE)
1475
+ {
1476
+ x3f_directory_entry_header_t *DEH = &DE->header;
1477
+ x3f_image_data_t *ID = &DEH->data_subsection.image_data;
1478
+ x3f_true_t *TRU = new_true(&ID->tru);
1479
+ x3f_quattro_t *Q = NULL;
1480
+ int i;
1481
+
1482
+ if (ID->type_format == X3F_IMAGE_RAW_QUATTRO) {
1483
+ #ifdef DCRAW_VERBOSE
1484
+ printf("Load Quattro extra info\n");
1485
+ #endif
1486
+ Q = new_quattro(&ID->quattro);
1487
+
1488
+ for (i=0; i<TRUE_PLANES; i++) {
1489
+ GET2(Q->plane[i].columns);
1490
+ GET2(Q->plane[i].rows);
1491
+ }
1492
+ }
1493
+ #ifdef DCRAW_VERBOSE
1494
+ printf("Load TRUE\n");
1495
+ #endif
1496
+
1497
+ /* Read TRUE header data */
1498
+ GET2(TRU->seed[0]); /* TODO : should it always be 512 ?? */
1499
+ GET2(TRU->seed[1]); /* TODO : should it always be 512 ?? */
1500
+ GET2(TRU->seed[2]); /* TODO : should it always be 512 ?? */
1501
+ GET2(TRU->unknown); /* TODO : should it always be zero ?? */
1502
+ GET_TRUE_HUFF_TABLE(TRU->table);
1503
+
1504
+ if (ID->type_format == X3F_IMAGE_RAW_QUATTRO) {
1505
+ #ifdef DCRAW_VERBOSE
1506
+ printf("Load Quattro extra info 2\n");
1507
+ #endif
1508
+ GET4(Q->unknown);
1509
+ }
1510
+
1511
+ GET_TABLE(TRU->plane_size, GET4, TRUE_PLANES,uint32_t);
1512
+
1513
+ /* Read image data */
1514
+ ID->data_size = read_data_block(&ID->data, I, DE, 0);
1515
+
1516
+ /* TODO: can it be fewer than 8 bits? Maybe taken from TRU->table? */
1517
+ new_huffman_tree(&TRU->tree, 8);
1518
+
1519
+ populate_true_huffman_tree(&TRU->tree, &TRU->table);
1520
+
1521
+ #ifdef DBG_PRNT
1522
+ print_huffman_tree(TRU->tree.nodes, 0, 0);
1523
+ #endif
1524
+
1525
+ TRU->plane_address[0] = (uint8_t*)ID->data;
1526
+ for (i=1; i<TRUE_PLANES; i++)
1527
+ TRU->plane_address[i] =
1528
+ TRU->plane_address[i-1] +
1529
+ (((TRU->plane_size.element[i-1] + 15) / 16) * 16);
1530
+
1531
+ TRU->x3rgb16.size = ID->columns * ID->rows * 3;
1532
+ TRU->x3rgb16.element =
1533
+ (uint16_t *)malloc(sizeof(uint16_t)*TRU->x3rgb16.size);
1534
+
1535
+ true_decode(I, DE);
1536
+ }
1537
+
1538
+ static void x3f_load_huffman_compressed(x3f_info_t *I,
1539
+ x3f_directory_entry_t *DE,
1540
+ int bits,
1541
+ int use_map_table)
1542
+ {
1543
+ x3f_directory_entry_header_t *DEH = &DE->header;
1544
+ x3f_image_data_t *ID = &DEH->data_subsection.image_data;
1545
+ x3f_huffman_t *HUF = ID->huffman;
1546
+ int table_size = 1<<bits;
1547
+ int row_offsets_size = ID->rows * sizeof(HUF->row_offsets.element[0]);
1548
+
1549
+ #ifdef DCRAW_VERBOSE
1550
+ printf("Load huffman compressed\n");
1551
+ #endif
1552
+ GET_TABLE(HUF->table, GET4, table_size,uint32_t);
1553
+
1554
+ ID->data_size = read_data_block(&ID->data, I, DE, row_offsets_size);
1555
+
1556
+ GET_TABLE(HUF->row_offsets, GET4, ID->rows,uint32_t);
1557
+ #ifdef DCRAW_VERBOSE
1558
+ printf("Make huffman tree ...\n");
1559
+ #endif
1560
+ new_huffman_tree(&HUF->tree, bits);
1561
+ populate_huffman_tree(&HUF->tree, &HUF->table, &HUF->mapping);
1562
+ #ifdef DCRAW_VERBOSE
1563
+ printf("... DONE\n");
1564
+ #endif
1565
+ #ifdef DBG_PRNT
1566
+ print_huffman_tree(HUF->tree.nodes, 0, 0);
1567
+ #endif
1568
+
1569
+ huffman_decode(I, DE, bits);
1570
+ }
1571
+
1572
+ static void x3f_load_huffman_not_compressed(x3f_info_t *I,
1573
+ x3f_directory_entry_t *DE,
1574
+ int bits,
1575
+ int use_map_table,
1576
+ int row_stride)
1577
+ {
1578
+ x3f_directory_entry_header_t *DEH = &DE->header;
1579
+ x3f_image_data_t *ID = &DEH->data_subsection.image_data;
1580
+ #ifdef DCRAW_VERBOSE
1581
+ printf("Load huffman not compressed\n");
1582
+ #endif
1583
+ ID->data_size = read_data_block(&ID->data, I, DE, 0);
1584
+
1585
+ simple_decode(I, DE, bits, row_stride);
1586
+ }
1587
+
1588
+ static void x3f_load_huffman(x3f_info_t *I,
1589
+ x3f_directory_entry_t *DE,
1590
+ int bits,
1591
+ int use_map_table,
1592
+ int row_stride)
1593
+ {
1594
+ x3f_directory_entry_header_t *DEH = &DE->header;
1595
+ x3f_image_data_t *ID = &DEH->data_subsection.image_data;
1596
+ x3f_huffman_t *HUF = new_huffman(&ID->huffman);
1597
+
1598
+ if (use_map_table) {
1599
+ int table_size = 1<<bits;
1600
+
1601
+ GET_TABLE(HUF->mapping, GET2, table_size,uint16_t);
1602
+ }
1603
+
1604
+ switch (ID->type_format) {
1605
+ case X3F_IMAGE_RAW_HUFFMAN_X530:
1606
+ case X3F_IMAGE_RAW_HUFFMAN_10BIT:
1607
+ HUF->x3rgb16.size = ID->columns * ID->rows * 3;
1608
+ HUF->x3rgb16.element =
1609
+ (uint16_t *)malloc(sizeof(uint16_t)*HUF->x3rgb16.size);
1610
+ break;
1611
+ case X3F_IMAGE_THUMB_HUFFMAN:
1612
+ HUF->rgb8.size = ID->columns * ID->rows * 3;
1613
+ HUF->rgb8.element =
1614
+ (uint8_t *)malloc(sizeof(uint8_t)*HUF->rgb8.size);
1615
+ break;
1616
+ default:
1617
+ #ifdef DCRAW_VERBOSE
1618
+ fprintf(stderr, "Unknown huffman image type\n");
1619
+ #endif
1620
+ break;
1621
+ }
1622
+
1623
+ if (row_stride == 0)
1624
+ return x3f_load_huffman_compressed(I, DE, bits, use_map_table);
1625
+ else
1626
+ return x3f_load_huffman_not_compressed(I, DE, bits, use_map_table, row_stride);
1627
+ }
1628
+
1629
+ static void x3f_load_pixmap(x3f_info_t *I, x3f_directory_entry_t *DE)
1630
+ {
1631
+ x3f_load_image_verbatim(I, DE);
1632
+ }
1633
+
1634
+ static void x3f_load_jpeg(x3f_info_t *I, x3f_directory_entry_t *DE)
1635
+ {
1636
+ x3f_load_image_verbatim(I, DE);
1637
+ }
1638
+
1639
+ static void x3f_load_image(x3f_info_t *I, x3f_directory_entry_t *DE)
1640
+ {
1641
+ x3f_directory_entry_header_t *DEH = &DE->header;
1642
+ x3f_image_data_t *ID = &DEH->data_subsection.image_data;
1643
+
1644
+ read_data_set_offset(I, DE, X3F_IMAGE_HEADER_SIZE);
1645
+
1646
+ switch (ID->type_format) {
1647
+ case X3F_IMAGE_RAW_TRUE:
1648
+ case X3F_IMAGE_RAW_MERRILL:
1649
+ case X3F_IMAGE_RAW_QUATTRO:
1650
+ x3f_load_true(I, DE);
1651
+ break;
1652
+ case X3F_IMAGE_RAW_HUFFMAN_X530:
1653
+ case X3F_IMAGE_RAW_HUFFMAN_10BIT:
1654
+ x3f_load_huffman(I, DE, 10, 1, ID->row_stride);
1655
+ break;
1656
+ case X3F_IMAGE_THUMB_PLAIN:
1657
+ x3f_load_pixmap(I, DE);
1658
+ break;
1659
+ case X3F_IMAGE_THUMB_HUFFMAN:
1660
+ x3f_load_huffman(I, DE, 8, 0, ID->row_stride);
1661
+ break;
1662
+ case X3F_IMAGE_THUMB_JPEG:
1663
+ x3f_load_jpeg(I, DE);
1664
+ break;
1665
+ default:
1666
+ #ifdef DCRAW_VERBOSE
1667
+ fprintf(stderr, "Unknown image type\n");
1668
+ #endif
1669
+ break;
1670
+ }
1671
+ }
1672
+
1673
+ static void x3f_load_camf_decode_type2(x3f_camf_t *CAMF)
1674
+ {
1675
+ uint32_t key = CAMF->t2.crypt_key;
1676
+ int i;
1677
+
1678
+ CAMF->decoded_data_size = CAMF->data_size;
1679
+ CAMF->decoded_data = malloc(CAMF->decoded_data_size);
1680
+
1681
+ for (i=0; i<CAMF->data_size; i++) {
1682
+ uint8_t old, _new;
1683
+ uint32_t tmp;
1684
+
1685
+ old = ((uint8_t *)CAMF->data)[i];
1686
+ key = (key * 1597 + 51749) % 244944;
1687
+ tmp = (uint32_t)(key * ((int64_t)301593171) >> 24);
1688
+ _new = (uint8_t)(old ^ (uint8_t)(((((key << 8) - tmp) >> 1) + tmp) >> 17));
1689
+ ((uint8_t *)CAMF->decoded_data)[i] = _new;
1690
+ }
1691
+ }
1692
+
1693
+
1694
+ /* NOTE: the unpacking in this code is in big respects identical to
1695
+ true_decode_one_color(). The difference is in the output you
1696
+ build. It might be possible to make some parts shared. NOTE ALSO:
1697
+ This means that the meta data is obfuscated using an image
1698
+ compression algorithm. */
1699
+
1700
+ static void camf_decode_type4(x3f_camf_t *CAMF)
1701
+ {
1702
+ uint32_t seed = CAMF->t4.decode_bias;
1703
+ int row;
1704
+
1705
+ uint8_t *dst;
1706
+ bool_t odd_dst = 0;
1707
+
1708
+ x3f_hufftree_t *tree = &CAMF->tree;
1709
+ bit_state_t BS;
1710
+
1711
+ int32_t row_start_acc[2][2];
1712
+ uint32_t rows = CAMF->t4.block_count;
1713
+ uint32_t cols = CAMF->t4.block_size;
1714
+
1715
+ CAMF->decoded_data_size = (cols * rows * 3) / 2;
1716
+ CAMF->decoded_data = malloc(CAMF->decoded_data_size);
1717
+
1718
+ dst = (uint8_t *)CAMF->decoded_data;
1719
+
1720
+ set_bit_state(&BS, CAMF->decoding_start);
1721
+
1722
+ row_start_acc[0][0] = seed;
1723
+ row_start_acc[0][1] = seed;
1724
+ row_start_acc[1][0] = seed;
1725
+ row_start_acc[1][1] = seed;
1726
+
1727
+ for (row = 0; row < rows; row++) {
1728
+ int col;
1729
+ bool_t odd_row = row&1;
1730
+ int32_t acc[2];
1731
+
1732
+ for (col = 0; col < cols; col++) {
1733
+ bool_t odd_col = col&1;
1734
+ int32_t diff = get_true_diff(&BS, tree);
1735
+ int32_t prev = col < 2 ?
1736
+ row_start_acc[odd_row][odd_col] :
1737
+ acc[odd_col];
1738
+ int32_t value = prev + diff;
1739
+
1740
+ acc[odd_col] = value;
1741
+ if (col < 2)
1742
+ row_start_acc[odd_row][odd_col] = value;
1743
+
1744
+ switch(odd_dst) {
1745
+ case 0:
1746
+ *dst++ = (uint8_t)((value>>4)&0xff);
1747
+ *dst = (uint8_t)((value<<4)&0xf0);
1748
+ break;
1749
+ case 1:
1750
+ *dst++ |= (uint8_t)((value>>8)&0x0f);
1751
+ *dst++ = (uint8_t)((value<<0)&0xff);
1752
+ break;
1753
+ }
1754
+
1755
+ odd_dst = !odd_dst;
1756
+
1757
+ } /* end col */
1758
+ } /* end row */
1759
+ }
1760
+
1761
+ static void x3f_load_camf_decode_type4(x3f_camf_t *CAMF)
1762
+ {
1763
+ int i;
1764
+ uint8_t *p;
1765
+ x3f_true_huffman_element_t *element = NULL;
1766
+
1767
+ for (i=0, p = (uint8_t*)CAMF->data; *p != 0; i++) {
1768
+ /* TODO: Is this too expensive ??*/
1769
+ element =
1770
+ (x3f_true_huffman_element_t *)realloc(element, (i+1)*sizeof(*element));
1771
+
1772
+ element[i].code_size = *p++;
1773
+ element[i].code = *p++;
1774
+ }
1775
+
1776
+ CAMF->table.size = i;
1777
+ CAMF->table.element = element;
1778
+
1779
+ /* TODO: where does thes value 32 come from? */
1780
+ #define CAMF_T4_DATA_OFFSET 32
1781
+ CAMF->decoding_start = (uint8_t *)CAMF->data + CAMF_T4_DATA_OFFSET;
1782
+
1783
+ /* TODO: can it be fewer than 8 bits? Maybe taken from TRU->table? */
1784
+ new_huffman_tree(&CAMF->tree, 8);
1785
+
1786
+ populate_true_huffman_tree(&CAMF->tree, &CAMF->table);
1787
+
1788
+ #ifdef DBG_PRNT
1789
+ print_huffman_tree(CAMF->tree.nodes, 0, 0);
1790
+ #endif
1791
+
1792
+ camf_decode_type4(CAMF);
1793
+ }
1794
+
1795
+ static void x3f_setup_camf_entries(x3f_camf_t *CAMF)
1796
+ {
1797
+ uint8_t *p = (uint8_t *)CAMF->decoded_data;
1798
+ uint8_t *end = p + CAMF->decoded_data_size;
1799
+ camf_entry_t *table = NULL;
1800
+ int i;
1801
+
1802
+ for (i=0; p < end; i++) {
1803
+ uint32_t *p4 = (uint32_t *)p;
1804
+
1805
+ if ((*p4 & 0xffffff) != X3F_CMb) {
1806
+ /* TODO: whats this all about ? Is it OK to just terminate if
1807
+ you find an invalid entry ? */
1808
+ #ifdef DCRAW_VERBOSE
1809
+ fprintf(stderr, "Unknown CAMF entry %x\n", *p4);
1810
+ #endif
1811
+ break;
1812
+ }
1813
+
1814
+ /* TODO: lots of realloc - may be inefficient */
1815
+ table = (camf_entry_t *)realloc(table, (i+1)*sizeof(camf_entry_t));
1816
+
1817
+ table[i].id = *p4++;
1818
+ table[i].version = *p4++;
1819
+ table[i].entry_size = *p4++;
1820
+ table[i].name_offset = *p4++;
1821
+ table[i].value_offset = *p4++;
1822
+
1823
+ table[i].entry = p;
1824
+
1825
+ table[i].name_address = p + table[i].name_offset;
1826
+ table[i].value_address = p + table[i].value_offset;
1827
+
1828
+ p += table[i].entry_size;
1829
+ }
1830
+
1831
+ CAMF->entry_table.size = i;
1832
+ CAMF->entry_table.element = table;
1833
+ }
1834
+
1835
+ static void x3f_load_camf(x3f_info_t *I, x3f_directory_entry_t *DE)
1836
+ {
1837
+ x3f_directory_entry_header_t *DEH = &DE->header;
1838
+ x3f_camf_t *CAMF = &DEH->data_subsection.camf;
1839
+
1840
+ read_data_set_offset(I, DE, X3F_CAMF_HEADER_SIZE);
1841
+
1842
+ CAMF->data_size = read_data_block(&CAMF->data, I, DE, 0);
1843
+
1844
+ switch (CAMF->type) {
1845
+ case 2: /* Older SD9-SD14 */
1846
+ x3f_load_camf_decode_type2(CAMF);
1847
+ break;
1848
+ case 4: /* TRUE DP1-... */
1849
+ x3f_load_camf_decode_type4(CAMF);
1850
+ break;
1851
+ default:
1852
+ #ifdef DCRAW_VERBOSE
1853
+ fprintf(stderr, "Unknown CAMF type\n");
1854
+ #endif
1855
+ break;
1856
+ }
1857
+
1858
+ if (CAMF->decoded_data != NULL)
1859
+ x3f_setup_camf_entries(CAMF);
1860
+ #ifdef DCRAW_VERBOSE
1861
+ else
1862
+ fprintf(stderr, "No decoded CAMF data\n");
1863
+ #endif
1864
+ }
1865
+
1866
+ /* extern */ x3f_return_t x3f_load_data(x3f_t *x3f, x3f_directory_entry_t *DE)
1867
+ {
1868
+ x3f_info_t *I = &x3f->info;
1869
+
1870
+ if (DE == NULL)
1871
+ return X3F_ARGUMENT_ERROR;
1872
+
1873
+ switch (DE->header.identifier) {
1874
+ case X3F_SECp:
1875
+ x3f_load_property_list(I, DE);
1876
+ break;
1877
+ case X3F_SECi:
1878
+ x3f_load_image(I, DE);
1879
+ break;
1880
+ case X3F_SECc:
1881
+ x3f_load_camf(I, DE);
1882
+ break;
1883
+ default:
1884
+ #ifdef DCRAW_VERBOSE
1885
+ fprintf(stderr, "Unknown directory entry type\n");
1886
+ #endif
1887
+ return X3F_INTERNAL_ERROR;
1888
+ }
1889
+
1890
+ return X3F_OK;
1891
+ }
1892
+
1893
+ /* extern */ x3f_return_t x3f_load_image_block(x3f_t *x3f, x3f_directory_entry_t *DE)
1894
+ {
1895
+ x3f_info_t *I = &x3f->info;
1896
+
1897
+ if (DE == NULL)
1898
+ return X3F_ARGUMENT_ERROR;
1899
+
1900
+ switch (DE->header.identifier) {
1901
+ case X3F_SECi:
1902
+ read_data_set_offset(I, DE, X3F_IMAGE_HEADER_SIZE);
1903
+ x3f_load_image_verbatim(I, DE);
1904
+ break;
1905
+ default:
1906
+ #ifdef DCRAW_VERBOSE
1907
+ fprintf(stderr, "Unknown image directory entry type\n");
1908
+ #endif
1909
+ return X3F_INTERNAL_ERROR;
1910
+ }
1911
+
1912
+ return X3F_OK;
1913
+ }
1914
+
1915
+
1916
+
1917
+ /* --------------------------------------------------------------------- */
1918
+ /* The End */
1919
+ /* --------------------------------------------------------------------- */