rfreeimage 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (860) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +1 -0
  4. data/Rakefile +34 -0
  5. data/ext/rfreeimage/extconf.rb +35 -0
  6. data/ext/rfreeimage/rfi_main.c +389 -0
  7. data/lib/rfreeimage/image.rb +26 -0
  8. data/lib/rfreeimage/version.rb +3 -0
  9. data/lib/rfreeimage.rb +3 -0
  10. data/rfreeimage.gemspec +32 -0
  11. data/vendor/FreeImage/Makefile +34 -0
  12. data/vendor/FreeImage/Makefile.cygwin +74 -0
  13. data/vendor/FreeImage/Makefile.fip +84 -0
  14. data/vendor/FreeImage/Makefile.gnu +83 -0
  15. data/vendor/FreeImage/Makefile.iphone +96 -0
  16. data/vendor/FreeImage/Makefile.mingw +136 -0
  17. data/vendor/FreeImage/Makefile.osx +115 -0
  18. data/vendor/FreeImage/Makefile.solaris +66 -0
  19. data/vendor/FreeImage/Makefile.srcs +6 -0
  20. data/vendor/FreeImage/README.iphone +19 -0
  21. data/vendor/FreeImage/README.linux +50 -0
  22. data/vendor/FreeImage/README.minGW +236 -0
  23. data/vendor/FreeImage/README.osx +44 -0
  24. data/vendor/FreeImage/README.solaris +67 -0
  25. data/vendor/FreeImage/Source/CacheFile.h +92 -0
  26. data/vendor/FreeImage/Source/DeprecationManager/Deprecated.cpp +36 -0
  27. data/vendor/FreeImage/Source/DeprecationManager/DeprecationMgr.cpp +103 -0
  28. data/vendor/FreeImage/Source/DeprecationManager/DeprecationMgr.h +83 -0
  29. data/vendor/FreeImage/Source/FreeImage/BitmapAccess.cpp +1573 -0
  30. data/vendor/FreeImage/Source/FreeImage/CacheFile.cpp +271 -0
  31. data/vendor/FreeImage/Source/FreeImage/ColorLookup.cpp +785 -0
  32. data/vendor/FreeImage/Source/FreeImage/Conversion.cpp +551 -0
  33. data/vendor/FreeImage/Source/FreeImage/Conversion16_555.cpp +209 -0
  34. data/vendor/FreeImage/Source/FreeImage/Conversion16_565.cpp +204 -0
  35. data/vendor/FreeImage/Source/FreeImage/Conversion24.cpp +252 -0
  36. data/vendor/FreeImage/Source/FreeImage/Conversion32.cpp +345 -0
  37. data/vendor/FreeImage/Source/FreeImage/Conversion4.cpp +246 -0
  38. data/vendor/FreeImage/Source/FreeImage/Conversion8.cpp +305 -0
  39. data/vendor/FreeImage/Source/FreeImage/ConversionFloat.cpp +194 -0
  40. data/vendor/FreeImage/Source/FreeImage/ConversionRGB16.cpp +144 -0
  41. data/vendor/FreeImage/Source/FreeImage/ConversionRGBA16.cpp +147 -0
  42. data/vendor/FreeImage/Source/FreeImage/ConversionRGBAF.cpp +250 -0
  43. data/vendor/FreeImage/Source/FreeImage/ConversionRGBF.cpp +243 -0
  44. data/vendor/FreeImage/Source/FreeImage/ConversionType.cpp +699 -0
  45. data/vendor/FreeImage/Source/FreeImage/ConversionUINT16.cpp +134 -0
  46. data/vendor/FreeImage/Source/FreeImage/FreeImage.cpp +226 -0
  47. data/vendor/FreeImage/Source/FreeImage/FreeImageC.c +22 -0
  48. data/vendor/FreeImage/Source/FreeImage/FreeImageIO.cpp +175 -0
  49. data/vendor/FreeImage/Source/FreeImage/GetType.cpp +92 -0
  50. data/vendor/FreeImage/Source/FreeImage/Halftoning.cpp +474 -0
  51. data/vendor/FreeImage/Source/FreeImage/J2KHelper.cpp +591 -0
  52. data/vendor/FreeImage/Source/FreeImage/J2KHelper.h +36 -0
  53. data/vendor/FreeImage/Source/FreeImage/LFPQuantizer.cpp +208 -0
  54. data/vendor/FreeImage/Source/FreeImage/MNGHelper.cpp +1320 -0
  55. data/vendor/FreeImage/Source/FreeImage/MemoryIO.cpp +237 -0
  56. data/vendor/FreeImage/Source/FreeImage/MultiPage.cpp +974 -0
  57. data/vendor/FreeImage/Source/FreeImage/NNQuantizer.cpp +507 -0
  58. data/vendor/FreeImage/Source/FreeImage/PSDParser.cpp +1057 -0
  59. data/vendor/FreeImage/Source/FreeImage/PSDParser.h +271 -0
  60. data/vendor/FreeImage/Source/FreeImage/PixelAccess.cpp +197 -0
  61. data/vendor/FreeImage/Source/FreeImage/Plugin.cpp +822 -0
  62. data/vendor/FreeImage/Source/FreeImage/PluginBMP.cpp +1494 -0
  63. data/vendor/FreeImage/Source/FreeImage/PluginCUT.cpp +240 -0
  64. data/vendor/FreeImage/Source/FreeImage/PluginDDS.cpp +655 -0
  65. data/vendor/FreeImage/Source/FreeImage/PluginEXR.cpp +773 -0
  66. data/vendor/FreeImage/Source/FreeImage/PluginG3.cpp +433 -0
  67. data/vendor/FreeImage/Source/FreeImage/PluginGIF.cpp +1407 -0
  68. data/vendor/FreeImage/Source/FreeImage/PluginHDR.cpp +722 -0
  69. data/vendor/FreeImage/Source/FreeImage/PluginICO.cpp +824 -0
  70. data/vendor/FreeImage/Source/FreeImage/PluginIFF.cpp +459 -0
  71. data/vendor/FreeImage/Source/FreeImage/PluginJ2K.cpp +328 -0
  72. data/vendor/FreeImage/Source/FreeImage/PluginJNG.cpp +162 -0
  73. data/vendor/FreeImage/Source/FreeImage/PluginJP2.cpp +328 -0
  74. data/vendor/FreeImage/Source/FreeImage/PluginJPEG.cpp +1706 -0
  75. data/vendor/FreeImage/Source/FreeImage/PluginJXR.cpp +1475 -0
  76. data/vendor/FreeImage/Source/FreeImage/PluginKOALA.cpp +243 -0
  77. data/vendor/FreeImage/Source/FreeImage/PluginMNG.cpp +153 -0
  78. data/vendor/FreeImage/Source/FreeImage/PluginPCD.cpp +251 -0
  79. data/vendor/FreeImage/Source/FreeImage/PluginPCX.cpp +659 -0
  80. data/vendor/FreeImage/Source/FreeImage/PluginPFM.cpp +409 -0
  81. data/vendor/FreeImage/Source/FreeImage/PluginPICT.cpp +1343 -0
  82. data/vendor/FreeImage/Source/FreeImage/PluginPNG.cpp +1115 -0
  83. data/vendor/FreeImage/Source/FreeImage/PluginPNM.cpp +838 -0
  84. data/vendor/FreeImage/Source/FreeImage/PluginPSD.cpp +131 -0
  85. data/vendor/FreeImage/Source/FreeImage/PluginRAS.cpp +512 -0
  86. data/vendor/FreeImage/Source/FreeImage/PluginRAW.cpp +793 -0
  87. data/vendor/FreeImage/Source/FreeImage/PluginSGI.cpp +425 -0
  88. data/vendor/FreeImage/Source/FreeImage/PluginTARGA.cpp +1591 -0
  89. data/vendor/FreeImage/Source/FreeImage/PluginTIFF.cpp +2631 -0
  90. data/vendor/FreeImage/Source/FreeImage/PluginWBMP.cpp +372 -0
  91. data/vendor/FreeImage/Source/FreeImage/PluginWebP.cpp +698 -0
  92. data/vendor/FreeImage/Source/FreeImage/PluginXBM.cpp +399 -0
  93. data/vendor/FreeImage/Source/FreeImage/PluginXPM.cpp +487 -0
  94. data/vendor/FreeImage/Source/FreeImage/TIFFLogLuv.cpp +65 -0
  95. data/vendor/FreeImage/Source/FreeImage/ToneMapping.cpp +75 -0
  96. data/vendor/FreeImage/Source/FreeImage/WuQuantizer.cpp +559 -0
  97. data/vendor/FreeImage/Source/FreeImage/ZLibInterface.cpp +223 -0
  98. data/vendor/FreeImage/Source/FreeImage/tmoColorConvert.cpp +479 -0
  99. data/vendor/FreeImage/Source/FreeImage/tmoDrago03.cpp +295 -0
  100. data/vendor/FreeImage/Source/FreeImage/tmoFattal02.cpp +689 -0
  101. data/vendor/FreeImage/Source/FreeImage/tmoReinhard05.cpp +260 -0
  102. data/vendor/FreeImage/Source/FreeImage.h +1153 -0
  103. data/vendor/FreeImage/Source/FreeImageIO.h +63 -0
  104. data/vendor/FreeImage/Source/FreeImageToolkit/BSplineRotate.cpp +730 -0
  105. data/vendor/FreeImage/Source/FreeImageToolkit/Background.cpp +895 -0
  106. data/vendor/FreeImage/Source/FreeImageToolkit/Channels.cpp +488 -0
  107. data/vendor/FreeImage/Source/FreeImageToolkit/ClassicRotate.cpp +917 -0
  108. data/vendor/FreeImage/Source/FreeImageToolkit/Colors.cpp +967 -0
  109. data/vendor/FreeImage/Source/FreeImageToolkit/CopyPaste.cpp +861 -0
  110. data/vendor/FreeImage/Source/FreeImageToolkit/Display.cpp +230 -0
  111. data/vendor/FreeImage/Source/FreeImageToolkit/Filters.h +287 -0
  112. data/vendor/FreeImage/Source/FreeImageToolkit/Flip.cpp +166 -0
  113. data/vendor/FreeImage/Source/FreeImageToolkit/JPEGTransform.cpp +623 -0
  114. data/vendor/FreeImage/Source/FreeImageToolkit/MultigridPoissonSolver.cpp +505 -0
  115. data/vendor/FreeImage/Source/FreeImageToolkit/Rescale.cpp +192 -0
  116. data/vendor/FreeImage/Source/FreeImageToolkit/Resize.cpp +2116 -0
  117. data/vendor/FreeImage/Source/FreeImageToolkit/Resize.h +196 -0
  118. data/vendor/FreeImage/Source/LibJPEG/ansi2knr.c +739 -0
  119. data/vendor/FreeImage/Source/LibJPEG/cderror.h +134 -0
  120. data/vendor/FreeImage/Source/LibJPEG/cdjpeg.c +181 -0
  121. data/vendor/FreeImage/Source/LibJPEG/cdjpeg.h +187 -0
  122. data/vendor/FreeImage/Source/LibJPEG/cjpeg.c +664 -0
  123. data/vendor/FreeImage/Source/LibJPEG/ckconfig.c +402 -0
  124. data/vendor/FreeImage/Source/LibJPEG/djpeg.c +617 -0
  125. data/vendor/FreeImage/Source/LibJPEG/example.c +433 -0
  126. data/vendor/FreeImage/Source/LibJPEG/jaricom.c +153 -0
  127. data/vendor/FreeImage/Source/LibJPEG/jcapimin.c +288 -0
  128. data/vendor/FreeImage/Source/LibJPEG/jcapistd.c +162 -0
  129. data/vendor/FreeImage/Source/LibJPEG/jcarith.c +944 -0
  130. data/vendor/FreeImage/Source/LibJPEG/jccoefct.c +454 -0
  131. data/vendor/FreeImage/Source/LibJPEG/jccolor.c +604 -0
  132. data/vendor/FreeImage/Source/LibJPEG/jcdctmgr.c +477 -0
  133. data/vendor/FreeImage/Source/LibJPEG/jchuff.c +1573 -0
  134. data/vendor/FreeImage/Source/LibJPEG/jcinit.c +84 -0
  135. data/vendor/FreeImage/Source/LibJPEG/jcmainct.c +297 -0
  136. data/vendor/FreeImage/Source/LibJPEG/jcmarker.c +719 -0
  137. data/vendor/FreeImage/Source/LibJPEG/jcmaster.c +856 -0
  138. data/vendor/FreeImage/Source/LibJPEG/jcomapi.c +106 -0
  139. data/vendor/FreeImage/Source/LibJPEG/jconfig.h +161 -0
  140. data/vendor/FreeImage/Source/LibJPEG/jcparam.c +675 -0
  141. data/vendor/FreeImage/Source/LibJPEG/jcprepct.c +358 -0
  142. data/vendor/FreeImage/Source/LibJPEG/jcsample.c +545 -0
  143. data/vendor/FreeImage/Source/LibJPEG/jctrans.c +385 -0
  144. data/vendor/FreeImage/Source/LibJPEG/jdapimin.c +399 -0
  145. data/vendor/FreeImage/Source/LibJPEG/jdapistd.c +276 -0
  146. data/vendor/FreeImage/Source/LibJPEG/jdarith.c +796 -0
  147. data/vendor/FreeImage/Source/LibJPEG/jdatadst.c +270 -0
  148. data/vendor/FreeImage/Source/LibJPEG/jdatasrc.c +275 -0
  149. data/vendor/FreeImage/Source/LibJPEG/jdcoefct.c +741 -0
  150. data/vendor/FreeImage/Source/LibJPEG/jdcolor.c +748 -0
  151. data/vendor/FreeImage/Source/LibJPEG/jdct.h +393 -0
  152. data/vendor/FreeImage/Source/LibJPEG/jddctmgr.c +384 -0
  153. data/vendor/FreeImage/Source/LibJPEG/jdhuff.c +1554 -0
  154. data/vendor/FreeImage/Source/LibJPEG/jdinput.c +662 -0
  155. data/vendor/FreeImage/Source/LibJPEG/jdmainct.c +513 -0
  156. data/vendor/FreeImage/Source/LibJPEG/jdmarker.c +1511 -0
  157. data/vendor/FreeImage/Source/LibJPEG/jdmaster.c +543 -0
  158. data/vendor/FreeImage/Source/LibJPEG/jdmerge.c +401 -0
  159. data/vendor/FreeImage/Source/LibJPEG/jdpostct.c +290 -0
  160. data/vendor/FreeImage/Source/LibJPEG/jdsample.c +361 -0
  161. data/vendor/FreeImage/Source/LibJPEG/jdtrans.c +140 -0
  162. data/vendor/FreeImage/Source/LibJPEG/jerror.c +253 -0
  163. data/vendor/FreeImage/Source/LibJPEG/jerror.h +304 -0
  164. data/vendor/FreeImage/Source/LibJPEG/jfdctflt.c +174 -0
  165. data/vendor/FreeImage/Source/LibJPEG/jfdctfst.c +230 -0
  166. data/vendor/FreeImage/Source/LibJPEG/jfdctint.c +4406 -0
  167. data/vendor/FreeImage/Source/LibJPEG/jidctflt.c +235 -0
  168. data/vendor/FreeImage/Source/LibJPEG/jidctfst.c +368 -0
  169. data/vendor/FreeImage/Source/LibJPEG/jidctint.c +5179 -0
  170. data/vendor/FreeImage/Source/LibJPEG/jinclude.h +91 -0
  171. data/vendor/FreeImage/Source/LibJPEG/jmemansi.c +167 -0
  172. data/vendor/FreeImage/Source/LibJPEG/jmemdos.c +638 -0
  173. data/vendor/FreeImage/Source/LibJPEG/jmemmac.c +289 -0
  174. data/vendor/FreeImage/Source/LibJPEG/jmemmgr.c +1119 -0
  175. data/vendor/FreeImage/Source/LibJPEG/jmemname.c +276 -0
  176. data/vendor/FreeImage/Source/LibJPEG/jmemnobs.c +109 -0
  177. data/vendor/FreeImage/Source/LibJPEG/jmemsys.h +198 -0
  178. data/vendor/FreeImage/Source/LibJPEG/jmorecfg.h +442 -0
  179. data/vendor/FreeImage/Source/LibJPEG/jpegint.h +426 -0
  180. data/vendor/FreeImage/Source/LibJPEG/jpeglib.h +1180 -0
  181. data/vendor/FreeImage/Source/LibJPEG/jpegtran.c +577 -0
  182. data/vendor/FreeImage/Source/LibJPEG/jquant1.c +857 -0
  183. data/vendor/FreeImage/Source/LibJPEG/jquant2.c +1311 -0
  184. data/vendor/FreeImage/Source/LibJPEG/jutils.c +227 -0
  185. data/vendor/FreeImage/Source/LibJPEG/jversion.h +14 -0
  186. data/vendor/FreeImage/Source/LibJPEG/rdbmp.c +480 -0
  187. data/vendor/FreeImage/Source/LibJPEG/rdcolmap.c +253 -0
  188. data/vendor/FreeImage/Source/LibJPEG/rdgif.c +38 -0
  189. data/vendor/FreeImage/Source/LibJPEG/rdjpgcom.c +515 -0
  190. data/vendor/FreeImage/Source/LibJPEG/rdppm.c +459 -0
  191. data/vendor/FreeImage/Source/LibJPEG/rdrle.c +387 -0
  192. data/vendor/FreeImage/Source/LibJPEG/rdswitch.c +365 -0
  193. data/vendor/FreeImage/Source/LibJPEG/rdtarga.c +500 -0
  194. data/vendor/FreeImage/Source/LibJPEG/transupp.c +1763 -0
  195. data/vendor/FreeImage/Source/LibJPEG/transupp.h +219 -0
  196. data/vendor/FreeImage/Source/LibJPEG/wrbmp.c +442 -0
  197. data/vendor/FreeImage/Source/LibJPEG/wrgif.c +399 -0
  198. data/vendor/FreeImage/Source/LibJPEG/wrjpgcom.c +583 -0
  199. data/vendor/FreeImage/Source/LibJPEG/wrppm.c +269 -0
  200. data/vendor/FreeImage/Source/LibJPEG/wrrle.c +305 -0
  201. data/vendor/FreeImage/Source/LibJPEG/wrtarga.c +253 -0
  202. data/vendor/FreeImage/Source/LibJXR/common/include/guiddef.h +230 -0
  203. data/vendor/FreeImage/Source/LibJXR/common/include/wmsal.h +757 -0
  204. data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstring.h +342 -0
  205. data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstrings_adt.h +71 -0
  206. data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstrings_strict.h +1096 -0
  207. data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstrings_undef.h +406 -0
  208. data/vendor/FreeImage/Source/LibJXR/image/decode/JXRTranscode.c +987 -0
  209. data/vendor/FreeImage/Source/LibJXR/image/decode/decode.c +200 -0
  210. data/vendor/FreeImage/Source/LibJXR/image/decode/decode.h +143 -0
  211. data/vendor/FreeImage/Source/LibJXR/image/decode/postprocess.c +288 -0
  212. data/vendor/FreeImage/Source/LibJXR/image/decode/segdec.c +1205 -0
  213. data/vendor/FreeImage/Source/LibJXR/image/decode/strInvTransform.c +1888 -0
  214. data/vendor/FreeImage/Source/LibJXR/image/decode/strPredQuantDec.c +539 -0
  215. data/vendor/FreeImage/Source/LibJXR/image/decode/strdec.c +3628 -0
  216. data/vendor/FreeImage/Source/LibJXR/image/decode/strdec_x86.c +1640 -0
  217. data/vendor/FreeImage/Source/LibJXR/image/encode/encode.c +144 -0
  218. data/vendor/FreeImage/Source/LibJXR/image/encode/encode.h +113 -0
  219. data/vendor/FreeImage/Source/LibJXR/image/encode/segenc.c +1186 -0
  220. data/vendor/FreeImage/Source/LibJXR/image/encode/strFwdTransform.c +1111 -0
  221. data/vendor/FreeImage/Source/LibJXR/image/encode/strPredQuantEnc.c +511 -0
  222. data/vendor/FreeImage/Source/LibJXR/image/encode/strenc.c +2370 -0
  223. data/vendor/FreeImage/Source/LibJXR/image/encode/strenc_x86.c +409 -0
  224. data/vendor/FreeImage/Source/LibJXR/image/sys/adapthuff.c +511 -0
  225. data/vendor/FreeImage/Source/LibJXR/image/sys/ansi.h +61 -0
  226. data/vendor/FreeImage/Source/LibJXR/image/sys/common.h +131 -0
  227. data/vendor/FreeImage/Source/LibJXR/image/sys/image.c +183 -0
  228. data/vendor/FreeImage/Source/LibJXR/image/sys/perfTimer.h +115 -0
  229. data/vendor/FreeImage/Source/LibJXR/image/sys/perfTimerANSI.c +274 -0
  230. data/vendor/FreeImage/Source/LibJXR/image/sys/strPredQuant.c +306 -0
  231. data/vendor/FreeImage/Source/LibJXR/image/sys/strTransform.c +85 -0
  232. data/vendor/FreeImage/Source/LibJXR/image/sys/strTransform.h +50 -0
  233. data/vendor/FreeImage/Source/LibJXR/image/sys/strcodec.c +1251 -0
  234. data/vendor/FreeImage/Source/LibJXR/image/sys/strcodec.h +681 -0
  235. data/vendor/FreeImage/Source/LibJXR/image/sys/windowsmediaphoto.h +515 -0
  236. data/vendor/FreeImage/Source/LibJXR/image/sys/xplatform_image.h +84 -0
  237. data/vendor/FreeImage/Source/LibJXR/image/x86/x86.h +58 -0
  238. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGlue.c +930 -0
  239. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGlue.h +636 -0
  240. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGlueJxr.c +2246 -0
  241. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGluePFC.c +2338 -0
  242. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRMeta.c +905 -0
  243. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRMeta.h +258 -0
  244. data/vendor/FreeImage/Source/LibOpenJPEG/bio.c +188 -0
  245. data/vendor/FreeImage/Source/LibOpenJPEG/bio.h +128 -0
  246. data/vendor/FreeImage/Source/LibOpenJPEG/cidx_manager.c +239 -0
  247. data/vendor/FreeImage/Source/LibOpenJPEG/cidx_manager.h +68 -0
  248. data/vendor/FreeImage/Source/LibOpenJPEG/cio.c +644 -0
  249. data/vendor/FreeImage/Source/LibOpenJPEG/cio.h +393 -0
  250. data/vendor/FreeImage/Source/LibOpenJPEG/dwt.c +919 -0
  251. data/vendor/FreeImage/Source/LibOpenJPEG/dwt.h +116 -0
  252. data/vendor/FreeImage/Source/LibOpenJPEG/event.c +141 -0
  253. data/vendor/FreeImage/Source/LibOpenJPEG/event.h +97 -0
  254. data/vendor/FreeImage/Source/LibOpenJPEG/function_list.c +114 -0
  255. data/vendor/FreeImage/Source/LibOpenJPEG/function_list.h +126 -0
  256. data/vendor/FreeImage/Source/LibOpenJPEG/image.c +235 -0
  257. data/vendor/FreeImage/Source/LibOpenJPEG/image.h +63 -0
  258. data/vendor/FreeImage/Source/LibOpenJPEG/indexbox_manager.h +148 -0
  259. data/vendor/FreeImage/Source/LibOpenJPEG/invert.c +289 -0
  260. data/vendor/FreeImage/Source/LibOpenJPEG/invert.h +59 -0
  261. data/vendor/FreeImage/Source/LibOpenJPEG/j2k.c +10238 -0
  262. data/vendor/FreeImage/Source/LibOpenJPEG/j2k.h +838 -0
  263. data/vendor/FreeImage/Source/LibOpenJPEG/jp2.c +2776 -0
  264. data/vendor/FreeImage/Source/LibOpenJPEG/jp2.h +490 -0
  265. data/vendor/FreeImage/Source/LibOpenJPEG/mct.c +319 -0
  266. data/vendor/FreeImage/Source/LibOpenJPEG/mct.h +149 -0
  267. data/vendor/FreeImage/Source/LibOpenJPEG/mqc.c +604 -0
  268. data/vendor/FreeImage/Source/LibOpenJPEG/mqc.h +201 -0
  269. data/vendor/FreeImage/Source/LibOpenJPEG/openjpeg.c +955 -0
  270. data/vendor/FreeImage/Source/LibOpenJPEG/openjpeg.h +1475 -0
  271. data/vendor/FreeImage/Source/LibOpenJPEG/opj_clock.c +59 -0
  272. data/vendor/FreeImage/Source/LibOpenJPEG/opj_clock.h +54 -0
  273. data/vendor/FreeImage/Source/LibOpenJPEG/opj_codec.h +160 -0
  274. data/vendor/FreeImage/Source/LibOpenJPEG/opj_config.h +9 -0
  275. data/vendor/FreeImage/Source/LibOpenJPEG/opj_config_private.h +16 -0
  276. data/vendor/FreeImage/Source/LibOpenJPEG/opj_includes.h +175 -0
  277. data/vendor/FreeImage/Source/LibOpenJPEG/opj_intmath.h +172 -0
  278. data/vendor/FreeImage/Source/LibOpenJPEG/opj_inttypes.h +43 -0
  279. data/vendor/FreeImage/Source/LibOpenJPEG/opj_malloc.h +180 -0
  280. data/vendor/FreeImage/Source/LibOpenJPEG/opj_stdint.h +47 -0
  281. data/vendor/FreeImage/Source/LibOpenJPEG/phix_manager.c +191 -0
  282. data/vendor/FreeImage/Source/LibOpenJPEG/pi.c +1870 -0
  283. data/vendor/FreeImage/Source/LibOpenJPEG/pi.h +182 -0
  284. data/vendor/FreeImage/Source/LibOpenJPEG/ppix_manager.c +194 -0
  285. data/vendor/FreeImage/Source/LibOpenJPEG/raw.c +89 -0
  286. data/vendor/FreeImage/Source/LibOpenJPEG/raw.h +100 -0
  287. data/vendor/FreeImage/Source/LibOpenJPEG/t1.c +1751 -0
  288. data/vendor/FreeImage/Source/LibOpenJPEG/t1.h +157 -0
  289. data/vendor/FreeImage/Source/LibOpenJPEG/t1_generate_luts.c +276 -0
  290. data/vendor/FreeImage/Source/LibOpenJPEG/t1_luts.h +143 -0
  291. data/vendor/FreeImage/Source/LibOpenJPEG/t2.c +1334 -0
  292. data/vendor/FreeImage/Source/LibOpenJPEG/t2.h +127 -0
  293. data/vendor/FreeImage/Source/LibOpenJPEG/tcd.c +2123 -0
  294. data/vendor/FreeImage/Source/LibOpenJPEG/tcd.h +348 -0
  295. data/vendor/FreeImage/Source/LibOpenJPEG/tgt.c +331 -0
  296. data/vendor/FreeImage/Source/LibOpenJPEG/tgt.h +140 -0
  297. data/vendor/FreeImage/Source/LibOpenJPEG/thix_manager.c +134 -0
  298. data/vendor/FreeImage/Source/LibOpenJPEG/tpix_manager.c +185 -0
  299. data/vendor/FreeImage/Source/LibPNG/example.c +1061 -0
  300. data/vendor/FreeImage/Source/LibPNG/png.c +4493 -0
  301. data/vendor/FreeImage/Source/LibPNG/png.h +3282 -0
  302. data/vendor/FreeImage/Source/LibPNG/pngconf.h +644 -0
  303. data/vendor/FreeImage/Source/LibPNG/pngdebug.h +154 -0
  304. data/vendor/FreeImage/Source/LibPNG/pngerror.c +963 -0
  305. data/vendor/FreeImage/Source/LibPNG/pngget.c +1213 -0
  306. data/vendor/FreeImage/Source/LibPNG/pnginfo.h +260 -0
  307. data/vendor/FreeImage/Source/LibPNG/pnglibconf.h +218 -0
  308. data/vendor/FreeImage/Source/LibPNG/pngmem.c +281 -0
  309. data/vendor/FreeImage/Source/LibPNG/pngpread.c +1168 -0
  310. data/vendor/FreeImage/Source/LibPNG/pngpriv.h +1944 -0
  311. data/vendor/FreeImage/Source/LibPNG/pngread.c +4121 -0
  312. data/vendor/FreeImage/Source/LibPNG/pngrio.c +120 -0
  313. data/vendor/FreeImage/Source/LibPNG/pngrtran.c +4994 -0
  314. data/vendor/FreeImage/Source/LibPNG/pngrutil.c +4474 -0
  315. data/vendor/FreeImage/Source/LibPNG/pngset.c +1611 -0
  316. data/vendor/FreeImage/Source/LibPNG/pngstruct.h +489 -0
  317. data/vendor/FreeImage/Source/LibPNG/pngtest.c +2011 -0
  318. data/vendor/FreeImage/Source/LibPNG/pngtrans.c +849 -0
  319. data/vendor/FreeImage/Source/LibPNG/pngwio.c +168 -0
  320. data/vendor/FreeImage/Source/LibPNG/pngwrite.c +2455 -0
  321. data/vendor/FreeImage/Source/LibPNG/pngwtran.c +574 -0
  322. data/vendor/FreeImage/Source/LibPNG/pngwutil.c +3029 -0
  323. data/vendor/FreeImage/Source/LibRawLite/dcraw/dcraw.c +15462 -0
  324. data/vendor/FreeImage/Source/LibRawLite/internal/aahd_demosaic.cpp +706 -0
  325. data/vendor/FreeImage/Source/LibRawLite/internal/dcb_demosaicing.c +710 -0
  326. data/vendor/FreeImage/Source/LibRawLite/internal/dcraw_common.cpp +13593 -0
  327. data/vendor/FreeImage/Source/LibRawLite/internal/dcraw_fileio.cpp +240 -0
  328. data/vendor/FreeImage/Source/LibRawLite/internal/defines.h +167 -0
  329. data/vendor/FreeImage/Source/LibRawLite/internal/demosaic_packs.cpp +99 -0
  330. data/vendor/FreeImage/Source/LibRawLite/internal/dht_demosaic.cpp +873 -0
  331. data/vendor/FreeImage/Source/LibRawLite/internal/libraw_internal_funcs.h +282 -0
  332. data/vendor/FreeImage/Source/LibRawLite/internal/libraw_x3f.cpp +1919 -0
  333. data/vendor/FreeImage/Source/LibRawLite/internal/var_defines.h +216 -0
  334. data/vendor/FreeImage/Source/LibRawLite/internal/wf_filtering.cpp +1950 -0
  335. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw.h +338 -0
  336. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_alloc.h +99 -0
  337. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_const.h +233 -0
  338. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_datastream.h +238 -0
  339. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_internal.h +225 -0
  340. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_types.h +442 -0
  341. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_version.h +62 -0
  342. data/vendor/FreeImage/Source/LibRawLite/src/libraw_c_api.cpp +230 -0
  343. data/vendor/FreeImage/Source/LibRawLite/src/libraw_cxx.cpp +4533 -0
  344. data/vendor/FreeImage/Source/LibRawLite/src/libraw_datastream.cpp +703 -0
  345. data/vendor/FreeImage/Source/LibTIFF4/mkg3states.c +451 -0
  346. data/vendor/FreeImage/Source/LibTIFF4/mkspans.c +82 -0
  347. data/vendor/FreeImage/Source/LibTIFF4/t4.h +292 -0
  348. data/vendor/FreeImage/Source/LibTIFF4/tif_aux.c +358 -0
  349. data/vendor/FreeImage/Source/LibTIFF4/tif_close.c +140 -0
  350. data/vendor/FreeImage/Source/LibTIFF4/tif_codec.c +166 -0
  351. data/vendor/FreeImage/Source/LibTIFF4/tif_color.c +287 -0
  352. data/vendor/FreeImage/Source/LibTIFF4/tif_compress.c +304 -0
  353. data/vendor/FreeImage/Source/LibTIFF4/tif_config.h +97 -0
  354. data/vendor/FreeImage/Source/LibTIFF4/tif_config.vc.h +74 -0
  355. data/vendor/FreeImage/Source/LibTIFF4/tif_config.wince.h +71 -0
  356. data/vendor/FreeImage/Source/LibTIFF4/tif_dir.c +1700 -0
  357. data/vendor/FreeImage/Source/LibTIFF4/tif_dir.h +308 -0
  358. data/vendor/FreeImage/Source/LibTIFF4/tif_dirinfo.c +959 -0
  359. data/vendor/FreeImage/Source/LibTIFF4/tif_dirread.c +5640 -0
  360. data/vendor/FreeImage/Source/LibTIFF4/tif_dirwrite.c +2910 -0
  361. data/vendor/FreeImage/Source/LibTIFF4/tif_dumpmode.c +143 -0
  362. data/vendor/FreeImage/Source/LibTIFF4/tif_error.c +80 -0
  363. data/vendor/FreeImage/Source/LibTIFF4/tif_extension.c +118 -0
  364. data/vendor/FreeImage/Source/LibTIFF4/tif_fax3.c +1595 -0
  365. data/vendor/FreeImage/Source/LibTIFF4/tif_fax3.h +538 -0
  366. data/vendor/FreeImage/Source/LibTIFF4/tif_fax3sm.c +1260 -0
  367. data/vendor/FreeImage/Source/LibTIFF4/tif_flush.c +118 -0
  368. data/vendor/FreeImage/Source/LibTIFF4/tif_getimage.c +2890 -0
  369. data/vendor/FreeImage/Source/LibTIFF4/tif_jbig.c +213 -0
  370. data/vendor/FreeImage/Source/LibTIFF4/tif_jpeg.c +2354 -0
  371. data/vendor/FreeImage/Source/LibTIFF4/tif_jpeg_12.c +65 -0
  372. data/vendor/FreeImage/Source/LibTIFF4/tif_luv.c +1683 -0
  373. data/vendor/FreeImage/Source/LibTIFF4/tif_lzma.c +495 -0
  374. data/vendor/FreeImage/Source/LibTIFF4/tif_lzw.c +1169 -0
  375. data/vendor/FreeImage/Source/LibTIFF4/tif_next.c +181 -0
  376. data/vendor/FreeImage/Source/LibTIFF4/tif_ojpeg.c +2501 -0
  377. data/vendor/FreeImage/Source/LibTIFF4/tif_open.c +725 -0
  378. data/vendor/FreeImage/Source/LibTIFF4/tif_packbits.c +300 -0
  379. data/vendor/FreeImage/Source/LibTIFF4/tif_pixarlog.c +1442 -0
  380. data/vendor/FreeImage/Source/LibTIFF4/tif_predict.c +764 -0
  381. data/vendor/FreeImage/Source/LibTIFF4/tif_predict.h +77 -0
  382. data/vendor/FreeImage/Source/LibTIFF4/tif_print.c +716 -0
  383. data/vendor/FreeImage/Source/LibTIFF4/tif_read.c +1086 -0
  384. data/vendor/FreeImage/Source/LibTIFF4/tif_strip.c +383 -0
  385. data/vendor/FreeImage/Source/LibTIFF4/tif_swab.c +310 -0
  386. data/vendor/FreeImage/Source/LibTIFF4/tif_thunder.c +207 -0
  387. data/vendor/FreeImage/Source/LibTIFF4/tif_tile.c +299 -0
  388. data/vendor/FreeImage/Source/LibTIFF4/tif_unix.c +325 -0
  389. data/vendor/FreeImage/Source/LibTIFF4/tif_version.c +40 -0
  390. data/vendor/FreeImage/Source/LibTIFF4/tif_vms.c +603 -0
  391. data/vendor/FreeImage/Source/LibTIFF4/tif_warning.c +81 -0
  392. data/vendor/FreeImage/Source/LibTIFF4/tif_win32.c +443 -0
  393. data/vendor/FreeImage/Source/LibTIFF4/tif_wince.c +293 -0
  394. data/vendor/FreeImage/Source/LibTIFF4/tif_write.c +771 -0
  395. data/vendor/FreeImage/Source/LibTIFF4/tif_zip.c +472 -0
  396. data/vendor/FreeImage/Source/LibTIFF4/tiff.h +681 -0
  397. data/vendor/FreeImage/Source/LibTIFF4/tiffconf.h +170 -0
  398. data/vendor/FreeImage/Source/LibTIFF4/tiffconf.vc.h +160 -0
  399. data/vendor/FreeImage/Source/LibTIFF4/tiffconf.wince.h +121 -0
  400. data/vendor/FreeImage/Source/LibTIFF4/tiffio.h +557 -0
  401. data/vendor/FreeImage/Source/LibTIFF4/tiffiop.h +367 -0
  402. data/vendor/FreeImage/Source/LibTIFF4/tiffvers.h +9 -0
  403. data/vendor/FreeImage/Source/LibTIFF4/uvcode.h +180 -0
  404. data/vendor/FreeImage/Source/LibWebP/src/dec/alphai.h +55 -0
  405. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.alpha.c +167 -0
  406. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.buffer.c +249 -0
  407. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.frame.c +827 -0
  408. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.idec.c +857 -0
  409. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.io.c +640 -0
  410. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.quant.c +110 -0
  411. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.tree.c +525 -0
  412. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.vp8.c +663 -0
  413. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.vp8l.c +1584 -0
  414. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.webp.c +834 -0
  415. data/vendor/FreeImage/Source/LibWebP/src/dec/decode_vp8.h +185 -0
  416. data/vendor/FreeImage/Source/LibWebP/src/dec/vp8i.h +353 -0
  417. data/vendor/FreeImage/Source/LibWebP/src/dec/vp8li.h +136 -0
  418. data/vendor/FreeImage/Source/LibWebP/src/dec/webpi.h +120 -0
  419. data/vendor/FreeImage/Source/LibWebP/src/demux/demux.demux.c +957 -0
  420. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.alpha_processing.c +377 -0
  421. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.alpha_processing_mips_dsp_r2.c +139 -0
  422. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.alpha_processing_sse2.c +296 -0
  423. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.argb.c +68 -0
  424. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.argb_mips_dsp_r2.c +108 -0
  425. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.argb_sse2.c +62 -0
  426. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost.c +412 -0
  427. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost_mips32.c +154 -0
  428. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost_mips_dsp_r2.c +107 -0
  429. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost_sse2.c +121 -0
  430. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cpu.c +138 -0
  431. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec.c +760 -0
  432. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_clip_tables.c +366 -0
  433. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_mips32.c +585 -0
  434. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_mips_dsp_r2.c +992 -0
  435. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_neon.c +1489 -0
  436. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_sse2.c +1284 -0
  437. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc.c +788 -0
  438. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_avx2.c +24 -0
  439. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_mips32.c +670 -0
  440. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_mips_dsp_r2.c +1510 -0
  441. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_neon.c +932 -0
  442. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_sse2.c +940 -0
  443. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.filters.c +240 -0
  444. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.filters_mips_dsp_r2.c +404 -0
  445. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.filters_sse2.c +349 -0
  446. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.h +434 -0
  447. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless.c +1838 -0
  448. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_mips32.c +416 -0
  449. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_mips_dsp_r2.c +921 -0
  450. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_neon.c +357 -0
  451. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_sse2.c +535 -0
  452. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.rescaler.c +115 -0
  453. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.rescaler_mips32.c +192 -0
  454. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.rescaler_mips_dsp_r2.c +210 -0
  455. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling.c +252 -0
  456. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling_mips_dsp_r2.c +280 -0
  457. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling_neon.c +267 -0
  458. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling_sse2.c +214 -0
  459. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv.c +166 -0
  460. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv_mips32.c +100 -0
  461. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv_mips_dsp_r2.c +131 -0
  462. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv_sse2.c +322 -0
  463. data/vendor/FreeImage/Source/LibWebP/src/dsp/lossless.h +313 -0
  464. data/vendor/FreeImage/Source/LibWebP/src/dsp/mips_macro.h +200 -0
  465. data/vendor/FreeImage/Source/LibWebP/src/dsp/neon.h +82 -0
  466. data/vendor/FreeImage/Source/LibWebP/src/dsp/yuv.h +321 -0
  467. data/vendor/FreeImage/Source/LibWebP/src/dsp/yuv_tables_sse2.h +536 -0
  468. data/vendor/FreeImage/Source/LibWebP/src/enc/backward_references.h +202 -0
  469. data/vendor/FreeImage/Source/LibWebP/src/enc/cost.h +69 -0
  470. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.alpha.c +440 -0
  471. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.analysis.c +501 -0
  472. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.backward_references.c +1076 -0
  473. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.config.c +163 -0
  474. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.cost.c +355 -0
  475. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.filter.c +296 -0
  476. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.frame.c +850 -0
  477. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.histogram.c +897 -0
  478. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.iterator.c +456 -0
  479. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.near_lossless.c +160 -0
  480. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture.c +290 -0
  481. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_csp.c +1100 -0
  482. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_psnr.c +150 -0
  483. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_rescale.c +285 -0
  484. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_tools.c +206 -0
  485. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.quant.c +1191 -0
  486. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.syntax.c +383 -0
  487. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.token.c +285 -0
  488. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.tree.c +504 -0
  489. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.vp8l.c +1437 -0
  490. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.webpenc.c +379 -0
  491. data/vendor/FreeImage/Source/LibWebP/src/enc/histogram.h +114 -0
  492. data/vendor/FreeImage/Source/LibWebP/src/enc/vp8enci.h +551 -0
  493. data/vendor/FreeImage/Source/LibWebP/src/enc/vp8li.h +78 -0
  494. data/vendor/FreeImage/Source/LibWebP/src/mux/mux.anim_encode.c +1241 -0
  495. data/vendor/FreeImage/Source/LibWebP/src/mux/mux.muxedit.c +696 -0
  496. data/vendor/FreeImage/Source/LibWebP/src/mux/mux.muxinternal.c +551 -0
  497. data/vendor/FreeImage/Source/LibWebP/src/mux/mux.muxread.c +544 -0
  498. data/vendor/FreeImage/Source/LibWebP/src/mux/muxi.h +232 -0
  499. data/vendor/FreeImage/Source/LibWebP/src/utils/bit_reader.h +168 -0
  500. data/vendor/FreeImage/Source/LibWebP/src/utils/bit_reader_inl.h +172 -0
  501. data/vendor/FreeImage/Source/LibWebP/src/utils/bit_writer.h +120 -0
  502. data/vendor/FreeImage/Source/LibWebP/src/utils/color_cache.h +74 -0
  503. data/vendor/FreeImage/Source/LibWebP/src/utils/endian_inl.h +100 -0
  504. data/vendor/FreeImage/Source/LibWebP/src/utils/filters.h +32 -0
  505. data/vendor/FreeImage/Source/LibWebP/src/utils/huffman.h +67 -0
  506. data/vendor/FreeImage/Source/LibWebP/src/utils/huffman_encode.h +60 -0
  507. data/vendor/FreeImage/Source/LibWebP/src/utils/quant_levels.h +36 -0
  508. data/vendor/FreeImage/Source/LibWebP/src/utils/quant_levels_dec.h +35 -0
  509. data/vendor/FreeImage/Source/LibWebP/src/utils/random.h +63 -0
  510. data/vendor/FreeImage/Source/LibWebP/src/utils/rescaler.h +78 -0
  511. data/vendor/FreeImage/Source/LibWebP/src/utils/thread.h +93 -0
  512. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.bit_reader.c +208 -0
  513. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.bit_writer.c +308 -0
  514. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.color_cache.c +49 -0
  515. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.filters.c +76 -0
  516. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.h +121 -0
  517. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.huffman.c +205 -0
  518. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.huffman_encode.c +417 -0
  519. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.quant_levels.c +140 -0
  520. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.quant_levels_dec.c +279 -0
  521. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.random.c +43 -0
  522. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.rescaler.c +82 -0
  523. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.thread.c +309 -0
  524. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.utils.c +211 -0
  525. data/vendor/FreeImage/Source/LibWebP/src/webp/decode.h +493 -0
  526. data/vendor/FreeImage/Source/LibWebP/src/webp/demux.h +224 -0
  527. data/vendor/FreeImage/Source/LibWebP/src/webp/encode.h +515 -0
  528. data/vendor/FreeImage/Source/LibWebP/src/webp/format_constants.h +88 -0
  529. data/vendor/FreeImage/Source/LibWebP/src/webp/mux.h +507 -0
  530. data/vendor/FreeImage/Source/LibWebP/src/webp/mux_types.h +97 -0
  531. data/vendor/FreeImage/Source/LibWebP/src/webp/types.h +52 -0
  532. data/vendor/FreeImage/Source/MapIntrospector.h +212 -0
  533. data/vendor/FreeImage/Source/Metadata/Exif.cpp +1253 -0
  534. data/vendor/FreeImage/Source/Metadata/FIRational.cpp +176 -0
  535. data/vendor/FreeImage/Source/Metadata/FIRational.h +108 -0
  536. data/vendor/FreeImage/Source/Metadata/FreeImageTag.cpp +353 -0
  537. data/vendor/FreeImage/Source/Metadata/FreeImageTag.h +500 -0
  538. data/vendor/FreeImage/Source/Metadata/IPTC.cpp +342 -0
  539. data/vendor/FreeImage/Source/Metadata/TagConversion.cpp +1094 -0
  540. data/vendor/FreeImage/Source/Metadata/TagLib.cpp +1618 -0
  541. data/vendor/FreeImage/Source/Metadata/XTIFF.cpp +766 -0
  542. data/vendor/FreeImage/Source/OpenEXR/Half/eLut.cpp +114 -0
  543. data/vendor/FreeImage/Source/OpenEXR/Half/eLut.h +71 -0
  544. data/vendor/FreeImage/Source/OpenEXR/Half/half.cpp +310 -0
  545. data/vendor/FreeImage/Source/OpenEXR/Half/half.h +757 -0
  546. data/vendor/FreeImage/Source/OpenEXR/Half/halfExport.h +27 -0
  547. data/vendor/FreeImage/Source/OpenEXR/Half/halfFunction.h +179 -0
  548. data/vendor/FreeImage/Source/OpenEXR/Half/halfLimits.h +102 -0
  549. data/vendor/FreeImage/Source/OpenEXR/Half/toFloat.cpp +164 -0
  550. data/vendor/FreeImage/Source/OpenEXR/Half/toFloat.h +16391 -0
  551. data/vendor/FreeImage/Source/OpenEXR/Iex/Iex.h +60 -0
  552. data/vendor/FreeImage/Source/OpenEXR/Iex/IexBaseExc.cpp +156 -0
  553. data/vendor/FreeImage/Source/OpenEXR/Iex/IexBaseExc.h +264 -0
  554. data/vendor/FreeImage/Source/OpenEXR/Iex/IexErrnoExc.h +208 -0
  555. data/vendor/FreeImage/Source/OpenEXR/Iex/IexExport.h +51 -0
  556. data/vendor/FreeImage/Source/OpenEXR/Iex/IexForward.h +229 -0
  557. data/vendor/FreeImage/Source/OpenEXR/Iex/IexMacros.h +170 -0
  558. data/vendor/FreeImage/Source/OpenEXR/Iex/IexMathExc.h +57 -0
  559. data/vendor/FreeImage/Source/OpenEXR/Iex/IexNamespace.h +112 -0
  560. data/vendor/FreeImage/Source/OpenEXR/Iex/IexThrowErrnoExc.cpp +873 -0
  561. data/vendor/FreeImage/Source/OpenEXR/Iex/IexThrowErrnoExc.h +97 -0
  562. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFloatExc.cpp +113 -0
  563. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFloatExc.h +146 -0
  564. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFpu.cpp +530 -0
  565. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFpu.h +91 -0
  566. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathIeeeExc.h +62 -0
  567. data/vendor/FreeImage/Source/OpenEXR/IlmBaseConfig.h +61 -0
  568. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAcesFile.cpp +633 -0
  569. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAcesFile.h +324 -0
  570. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfArray.h +285 -0
  571. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAttribute.cpp +158 -0
  572. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAttribute.h +407 -0
  573. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAutoArray.h +95 -0
  574. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfB44Compressor.cpp +1072 -0
  575. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfB44Compressor.h +118 -0
  576. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfBoxAttribute.cpp +111 -0
  577. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfBoxAttribute.h +87 -0
  578. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCRgbaFile.cpp +1438 -0
  579. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCRgbaFile.h +555 -0
  580. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelList.cpp +322 -0
  581. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelList.h +436 -0
  582. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelListAttribute.cpp +150 -0
  583. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelListAttribute.h +74 -0
  584. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCheckedArithmetic.h +163 -0
  585. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticities.cpp +151 -0
  586. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticities.h +131 -0
  587. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticitiesAttribute.cpp +87 -0
  588. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticitiesAttribute.h +73 -0
  589. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompositeDeepScanLine.cpp +591 -0
  590. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompositeDeepScanLine.h +142 -0
  591. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompression.h +84 -0
  592. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressionAttribute.cpp +78 -0
  593. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressionAttribute.h +64 -0
  594. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressor.cpp +226 -0
  595. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressor.h +265 -0
  596. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfConvert.cpp +143 -0
  597. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfConvert.h +107 -0
  598. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepCompositing.cpp +110 -0
  599. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepCompositing.h +132 -0
  600. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepFrameBuffer.cpp +230 -0
  601. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepFrameBuffer.h +339 -0
  602. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepImageState.h +96 -0
  603. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepImageStateAttribute.cpp +78 -0
  604. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepImageStateAttribute.h +68 -0
  605. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputFile.cpp +2025 -0
  606. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputFile.h +276 -0
  607. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputPart.cpp +149 -0
  608. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputPart.h +181 -0
  609. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputFile.cpp +1552 -0
  610. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputFile.h +244 -0
  611. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputPart.cpp +107 -0
  612. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputPart.h +168 -0
  613. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputFile.cpp +1979 -0
  614. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputFile.h +437 -0
  615. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputPart.cpp +273 -0
  616. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputPart.h +362 -0
  617. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputFile.cpp +2055 -0
  618. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputFile.h +475 -0
  619. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputPart.cpp +250 -0
  620. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputPart.h +394 -0
  621. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDoubleAttribute.cpp +57 -0
  622. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDoubleAttribute.h +59 -0
  623. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDwaCompressor.cpp +3424 -0
  624. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDwaCompressor.h +210 -0
  625. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDwaCompressorSimd.h +2145 -0
  626. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmap.cpp +335 -0
  627. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmap.h +336 -0
  628. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmapAttribute.cpp +76 -0
  629. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmapAttribute.h +68 -0
  630. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfExport.h +46 -0
  631. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFastHuf.cpp +768 -0
  632. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFastHuf.h +148 -0
  633. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatAttribute.cpp +57 -0
  634. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatAttribute.h +58 -0
  635. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatVectorAttribute.cpp +84 -0
  636. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatVectorAttribute.h +76 -0
  637. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfForward.h +127 -0
  638. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFrameBuffer.cpp +228 -0
  639. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFrameBuffer.h +386 -0
  640. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFramesPerSecond.cpp +76 -0
  641. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFramesPerSecond.h +94 -0
  642. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericInputFile.cpp +76 -0
  643. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericInputFile.h +58 -0
  644. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericOutputFile.cpp +112 -0
  645. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericOutputFile.h +62 -0
  646. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHeader.cpp +1283 -0
  647. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHeader.h +699 -0
  648. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHuf.cpp +1114 -0
  649. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHuf.h +82 -0
  650. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIO.cpp +110 -0
  651. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIO.h +255 -0
  652. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputFile.cpp +895 -0
  653. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputFile.h +240 -0
  654. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPart.cpp +114 -0
  655. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPart.h +84 -0
  656. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPartData.cpp +51 -0
  657. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPartData.h +69 -0
  658. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputStreamMutex.h +68 -0
  659. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInt64.h +56 -0
  660. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIntAttribute.cpp +57 -0
  661. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIntAttribute.h +58 -0
  662. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCode.cpp +217 -0
  663. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCode.h +167 -0
  664. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCodeAttribute.cpp +99 -0
  665. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCodeAttribute.h +73 -0
  666. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLineOrder.h +69 -0
  667. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLineOrderAttribute.cpp +78 -0
  668. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLineOrderAttribute.h +72 -0
  669. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLut.cpp +178 -0
  670. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLut.h +188 -0
  671. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMatrixAttribute.cpp +263 -0
  672. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMatrixAttribute.h +83 -0
  673. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMisc.cpp +1872 -0
  674. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMisc.h +466 -0
  675. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartInputFile.cpp +783 -0
  676. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartInputFile.h +128 -0
  677. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartOutputFile.cpp +519 -0
  678. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartOutputFile.h +118 -0
  679. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiView.cpp +435 -0
  680. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiView.h +187 -0
  681. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfName.h +150 -0
  682. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfNamespace.h +115 -0
  683. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOpaqueAttribute.cpp +126 -0
  684. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOpaqueAttribute.h +110 -0
  685. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOptimizedPixelReading.h +646 -0
  686. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputFile.cpp +1378 -0
  687. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputFile.h +263 -0
  688. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPart.cpp +105 -0
  689. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPart.h +77 -0
  690. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPartData.cpp +52 -0
  691. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPartData.h +62 -0
  692. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputStreamMutex.h +70 -0
  693. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPartHelper.h +262 -0
  694. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPartType.cpp +63 -0
  695. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPartType.h +62 -0
  696. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPixelType.h +67 -0
  697. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPizCompressor.cpp +667 -0
  698. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPizCompressor.h +117 -0
  699. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImage.cpp +104 -0
  700. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImage.h +135 -0
  701. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImageAttribute.cpp +103 -0
  702. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImageAttribute.h +70 -0
  703. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPxr24Compressor.cpp +553 -0
  704. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPxr24Compressor.h +109 -0
  705. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRational.cpp +127 -0
  706. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRational.h +98 -0
  707. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRationalAttribute.cpp +74 -0
  708. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRationalAttribute.h +69 -0
  709. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgba.h +109 -0
  710. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaFile.cpp +1405 -0
  711. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaFile.h +346 -0
  712. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaYca.cpp +497 -0
  713. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaYca.h +259 -0
  714. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRle.cpp +157 -0
  715. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRle.h +63 -0
  716. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRleCompressor.cpp +220 -0
  717. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRleCompressor.h +80 -0
  718. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfScanLineInputFile.cpp +1702 -0
  719. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfScanLineInputFile.h +210 -0
  720. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfSimd.h +59 -0
  721. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStandardAttributes.cpp +125 -0
  722. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStandardAttributes.h +382 -0
  723. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStdIO.cpp +242 -0
  724. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStdIO.h +160 -0
  725. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringAttribute.cpp +80 -0
  726. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringAttribute.h +71 -0
  727. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringVectorAttribute.cpp +100 -0
  728. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringVectorAttribute.h +74 -0
  729. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfSystemSpecific.cpp +129 -0
  730. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfSystemSpecific.h +172 -0
  731. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTestFile.cpp +216 -0
  732. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTestFile.h +97 -0
  733. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfThreading.cpp +62 -0
  734. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfThreading.h +95 -0
  735. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileDescription.h +107 -0
  736. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileDescriptionAttribute.cpp +86 -0
  737. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileDescriptionAttribute.h +72 -0
  738. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileOffsets.cpp +552 -0
  739. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileOffsets.h +125 -0
  740. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputFile.cpp +1533 -0
  741. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputFile.h +401 -0
  742. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputPart.cpp +208 -0
  743. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputPart.h +100 -0
  744. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledMisc.cpp +389 -0
  745. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledMisc.h +106 -0
  746. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputFile.cpp +1841 -0
  747. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputFile.h +495 -0
  748. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputPart.cpp +228 -0
  749. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputPart.h +105 -0
  750. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledRgbaFile.cpp +1163 -0
  751. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledRgbaFile.h +482 -0
  752. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCode.cpp +431 -0
  753. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCode.h +242 -0
  754. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCodeAttribute.cpp +79 -0
  755. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCodeAttribute.h +74 -0
  756. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVecAttribute.cpp +217 -0
  757. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVecAttribute.h +100 -0
  758. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVersion.cpp +60 -0
  759. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVersion.h +136 -0
  760. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfWav.cpp +391 -0
  761. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfWav.h +78 -0
  762. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfXdr.h +927 -0
  763. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZip.cpp +196 -0
  764. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZip.h +78 -0
  765. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZipCompressor.cpp +127 -0
  766. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZipCompressor.h +89 -0
  767. data/vendor/FreeImage/Source/OpenEXR/IlmImf/b44ExpLogTable.cpp +136 -0
  768. data/vendor/FreeImage/Source/OpenEXR/IlmImf/b44ExpLogTable.h +16396 -0
  769. data/vendor/FreeImage/Source/OpenEXR/IlmImf/dwaLookups.cpp +573 -0
  770. data/vendor/FreeImage/Source/OpenEXR/IlmImf/dwaLookups.h +98334 -0
  771. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThread.cpp +80 -0
  772. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThread.h +143 -0
  773. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadExport.h +46 -0
  774. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadForward.h +52 -0
  775. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutex.cpp +59 -0
  776. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutex.h +160 -0
  777. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutexPosix.cpp +85 -0
  778. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutexWin32.cpp +79 -0
  779. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadNamespace.h +114 -0
  780. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadPool.cpp +483 -0
  781. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadPool.h +160 -0
  782. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadPosix.cpp +98 -0
  783. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphore.cpp +60 -0
  784. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphore.h +112 -0
  785. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphorePosix.cpp +106 -0
  786. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphorePosixCompat.cpp +155 -0
  787. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphoreWin32.cpp +153 -0
  788. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadWin32.cpp +100 -0
  789. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathBox.cpp +37 -0
  790. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathBox.h +849 -0
  791. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathBoxAlgo.h +1016 -0
  792. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathColor.h +736 -0
  793. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathColorAlgo.cpp +178 -0
  794. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathColorAlgo.h +257 -0
  795. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathEuler.h +926 -0
  796. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathExc.h +73 -0
  797. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathExport.h +46 -0
  798. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathForward.h +72 -0
  799. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFrame.h +192 -0
  800. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFrustum.h +741 -0
  801. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFrustumTest.h +417 -0
  802. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFun.cpp +181 -0
  803. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFun.h +269 -0
  804. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathGL.h +166 -0
  805. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathGLU.h +54 -0
  806. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathHalfLimits.h +68 -0
  807. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathInt64.h +62 -0
  808. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathInterval.h +226 -0
  809. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathLimits.h +268 -0
  810. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathLine.h +185 -0
  811. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathLineAlgo.h +288 -0
  812. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMath.h +208 -0
  813. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMatrix.h +3441 -0
  814. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMatrixAlgo.cpp +1252 -0
  815. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMatrixAlgo.h +1425 -0
  816. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathNamespace.h +115 -0
  817. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathPlane.h +257 -0
  818. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathPlatform.h +112 -0
  819. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathQuat.h +964 -0
  820. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathRandom.cpp +194 -0
  821. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathRandom.h +401 -0
  822. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathRoots.h +219 -0
  823. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathShear.cpp +54 -0
  824. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathShear.h +656 -0
  825. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathSphere.h +177 -0
  826. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathVec.cpp +583 -0
  827. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathVec.h +2227 -0
  828. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathVecAlgo.h +147 -0
  829. data/vendor/FreeImage/Source/OpenEXR/OpenEXRConfig.h +72 -0
  830. data/vendor/FreeImage/Source/Plugin.h +144 -0
  831. data/vendor/FreeImage/Source/Quantizers.h +354 -0
  832. data/vendor/FreeImage/Source/ToneMapping.h +44 -0
  833. data/vendor/FreeImage/Source/Utilities.h +516 -0
  834. data/vendor/FreeImage/Source/ZLib/adler32.c +179 -0
  835. data/vendor/FreeImage/Source/ZLib/compress.c +80 -0
  836. data/vendor/FreeImage/Source/ZLib/crc32.c +425 -0
  837. data/vendor/FreeImage/Source/ZLib/crc32.h +441 -0
  838. data/vendor/FreeImage/Source/ZLib/deflate.c +1967 -0
  839. data/vendor/FreeImage/Source/ZLib/deflate.h +346 -0
  840. data/vendor/FreeImage/Source/ZLib/gzclose.c +25 -0
  841. data/vendor/FreeImage/Source/ZLib/gzguts.h +209 -0
  842. data/vendor/FreeImage/Source/ZLib/gzlib.c +634 -0
  843. data/vendor/FreeImage/Source/ZLib/gzread.c +594 -0
  844. data/vendor/FreeImage/Source/ZLib/gzwrite.c +577 -0
  845. data/vendor/FreeImage/Source/ZLib/infback.c +640 -0
  846. data/vendor/FreeImage/Source/ZLib/inffast.c +340 -0
  847. data/vendor/FreeImage/Source/ZLib/inffast.h +11 -0
  848. data/vendor/FreeImage/Source/ZLib/inffixed.h +94 -0
  849. data/vendor/FreeImage/Source/ZLib/inflate.c +1512 -0
  850. data/vendor/FreeImage/Source/ZLib/inflate.h +122 -0
  851. data/vendor/FreeImage/Source/ZLib/inftrees.c +306 -0
  852. data/vendor/FreeImage/Source/ZLib/inftrees.h +62 -0
  853. data/vendor/FreeImage/Source/ZLib/trees.c +1226 -0
  854. data/vendor/FreeImage/Source/ZLib/trees.h +128 -0
  855. data/vendor/FreeImage/Source/ZLib/uncompr.c +59 -0
  856. data/vendor/FreeImage/Source/ZLib/zconf.h +511 -0
  857. data/vendor/FreeImage/Source/ZLib/zlib.h +1768 -0
  858. data/vendor/FreeImage/Source/ZLib/zutil.c +324 -0
  859. data/vendor/FreeImage/Source/ZLib/zutil.h +253 -0
  860. metadata +931 -0
@@ -0,0 +1,1253 @@
1
+ // ==========================================================
2
+ // Metadata functions implementation
3
+ // Exif metadata model
4
+ //
5
+ // Design and implementation by
6
+ // - Herv� Drolon (drolon@infonie.fr)
7
+ // - Mihail Naydenov (mnaydenov@users.sourceforge.net)
8
+ //
9
+ // Based on the following implementations:
10
+ // - metadata-extractor : http://www.drewnoakes.com/code/exif/
11
+ // - jhead : http://www.sentex.net/~mwandel/jhead/
12
+ // - ImageMagick : http://www.imagemagick.org/
13
+ //
14
+ // This file is part of FreeImage 3
15
+ //
16
+ // COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
17
+ // OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
18
+ // THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
19
+ // OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
20
+ // CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
21
+ // THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
22
+ // SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
23
+ // PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
24
+ // THIS DISCLAIMER.
25
+ //
26
+ // Use at your own risk!
27
+ // ==========================================================
28
+
29
+ #ifdef _MSC_VER
30
+ #pragma warning (disable : 4786) // identifier was truncated to 'number' characters
31
+ #endif
32
+
33
+ #include "FreeImage.h"
34
+ #include "Utilities.h"
35
+ #include "FreeImageTag.h"
36
+
37
+ // ==========================================================
38
+ // Exif JPEG routines
39
+ // ==========================================================
40
+
41
+ #define EXIF_NUM_FORMATS 12
42
+
43
+ #define TAG_EXIF_OFFSET 0x8769 // Exif IFD Pointer
44
+ #define TAG_GPS_OFFSET 0x8825 // GPS Info IFD Pointer
45
+ #define TAG_INTEROP_OFFSET 0xA005 // Interoperability IFD Pointer
46
+ #define TAG_MAKER_NOTE 0x927C // Maker note
47
+
48
+ // CANON cameras have some funny bespoke fields that need further processing...
49
+ #define TAG_CANON_CAMERA_STATE_0x01 0x0001 // tags under tag 0x001 (CameraSettings)
50
+ #define TAG_CANON_CAMERA_STATE_0x02 0x0002 // tags under tag 0x002 (FocalLength)
51
+ #define TAG_CANON_CAMERA_STATE_0x04 0x0004 // tags under tag 0x004 (ShotInfo)
52
+ #define TAG_CANON_CAMERA_STATE_0x12 0x0012 // tags under tag 0x012 (AFInfo)
53
+ #define TAG_CANON_CAMERA_STATE_0xA0 0x00A0 // tags under tag 0x0A0 (ProcessingInfo)
54
+ #define TAG_CANON_CAMERA_STATE_0xE0 0x00E0 // tags under tag 0x0E0 (SensorInfo)
55
+
56
+
57
+ // =====================================================================
58
+ // Reimplementation of strnicmp (it is not supported on some systems)
59
+ // =====================================================================
60
+
61
+ /**
62
+ Compare characters of two strings without regard to case.
63
+ @param s1 Null-terminated string to compare.
64
+ @param s2 Null-terminated string to compare.
65
+ @param len Number of characters to compare
66
+ @return Returns 0 if s1 substring identical to s2 substring
67
+ */
68
+ static int
69
+ FreeImage_strnicmp(const char *s1, const char *s2, size_t len) {
70
+ unsigned char c1, c2;
71
+
72
+ if(!s1 || !s2) return -1;
73
+
74
+ c1 = 0; c2 = 0;
75
+ if(len) {
76
+ do {
77
+ c1 = *s1; c2 = *s2;
78
+ s1++; s2++;
79
+ if (!c1)
80
+ break;
81
+ if (!c2)
82
+ break;
83
+ if (c1 == c2)
84
+ continue;
85
+ c1 = (BYTE)tolower(c1);
86
+ c2 = (BYTE)tolower(c2);
87
+ if (c1 != c2)
88
+ break;
89
+ } while (--len);
90
+ }
91
+ return (int)c1 - (int)c2;
92
+ }
93
+
94
+
95
+ // ----------------------------------------------------------
96
+ // Little Endian / Big Endian io routines
97
+ // ----------------------------------------------------------
98
+
99
+ static short
100
+ ReadInt16(BOOL msb_order, const void *buffer) {
101
+ short value;
102
+
103
+ if(msb_order) {
104
+ value = (short)((((BYTE*) buffer)[0] << 8) | ((BYTE*) buffer)[1]);
105
+ return value;
106
+ }
107
+ value = (short)((((BYTE*) buffer)[1] << 8) | ((BYTE*) buffer)[0]);
108
+ return value;
109
+ }
110
+
111
+ static LONG
112
+ ReadInt32(BOOL msb_order, const void *buffer) {
113
+ LONG value;
114
+
115
+ if(msb_order) {
116
+ value = (LONG)((((BYTE*) buffer)[0] << 24) | (((BYTE*) buffer)[1] << 16) | (((BYTE*) buffer)[2] << 8) | (((BYTE*) buffer)[3]));
117
+ return value;
118
+ }
119
+ value = (LONG)((((BYTE*) buffer)[3] << 24) | (((BYTE*) buffer)[2] << 16) | (((BYTE*) buffer)[1] << 8 ) | (((BYTE*) buffer)[0]));
120
+ return value;
121
+ }
122
+
123
+ static WORD
124
+ ReadUint16(BOOL msb_order, const void *buffer) {
125
+ WORD value;
126
+
127
+ if(msb_order) {
128
+ value = (WORD) ((((BYTE*) buffer)[0] << 8) | ((BYTE*) buffer)[1]);
129
+ return value;
130
+ }
131
+ value = (WORD) ((((BYTE*) buffer)[1] << 8) | ((BYTE*) buffer)[0]);
132
+ return value;
133
+ }
134
+
135
+ static DWORD
136
+ ReadUint32(BOOL msb_order, const void *buffer) {
137
+ return ((DWORD) ReadInt32(msb_order, buffer) & 0xFFFFFFFF);
138
+ }
139
+
140
+ // ----------------------------------------------------------
141
+ // Exif JPEG markers routines
142
+ // ----------------------------------------------------------
143
+
144
+ /**
145
+ Process a IFD offset
146
+ Returns the offset and the metadata model for this tag
147
+ */
148
+ static void
149
+ processIFDOffset(FITAG *tag, const char *pval, BOOL msb_order, DWORD *subdirOffset, TagLib::MDMODEL *md_model) {
150
+ // get the IFD offset
151
+ *subdirOffset = ReadUint32(msb_order, pval);
152
+
153
+ // select a tag info table
154
+ switch(FreeImage_GetTagID(tag)) {
155
+ case TAG_EXIF_OFFSET:
156
+ *md_model = TagLib::EXIF_EXIF;
157
+ break;
158
+ case TAG_GPS_OFFSET:
159
+ *md_model = TagLib::EXIF_GPS;
160
+ break;
161
+ case TAG_INTEROP_OFFSET:
162
+ *md_model = TagLib::EXIF_INTEROP;
163
+ break;
164
+ }
165
+ }
166
+
167
+ /**
168
+ Process a maker note IFD offset
169
+ Returns the offset and the metadata model for this tag
170
+ */
171
+ static void
172
+ processMakerNote(FIBITMAP *dib, const char *pval, BOOL msb_order, DWORD *subdirOffset, TagLib::MDMODEL *md_model) {
173
+ FITAG *tagMake = NULL;
174
+
175
+ *subdirOffset = 0;
176
+ *md_model = TagLib::UNKNOWN;
177
+
178
+ // Determine the camera model and makernote format
179
+ // WARNING: note that Maker may be NULL sometimes so check its value before using it
180
+ // (NULL pointer checking is done by FreeImage_strnicmp)
181
+ FreeImage_GetMetadata(FIMD_EXIF_MAIN, dib, "Make", &tagMake);
182
+ const char *Maker = (char*)FreeImage_GetTagValue(tagMake);
183
+
184
+ if((memcmp("OLYMP\x00\x01", pval, 7) == 0) || (memcmp("OLYMP\x00\x02", pval, 7) == 0) || (memcmp("EPSON", pval, 5) == 0) || (memcmp("AGFA", pval, 4) == 0)) {
185
+ // Olympus Type 1 Makernote
186
+ // Epson and Agfa use Olympus maker note standard,
187
+ // see: http://www.ozhiker.com/electronics/pjmt/jpeg_info/
188
+ *md_model = TagLib::EXIF_MAKERNOTE_OLYMPUSTYPE1;
189
+ *subdirOffset = 8;
190
+ }
191
+ else if(memcmp("OLYMPUS\x00\x49\x49\x03\x00", pval, 12) == 0) {
192
+ // Olympus Type 2 Makernote
193
+ // !!! NOT YET SUPPORTED !!!
194
+ *subdirOffset = 0;
195
+ *md_model = TagLib::UNKNOWN;
196
+ }
197
+ else if(memcmp("Nikon", pval, 5) == 0) {
198
+ /* There are two scenarios here:
199
+ * Type 1:
200
+ * :0000: 4E 69 6B 6F 6E 00 01 00-05 00 02 00 02 00 06 00 Nikon...........
201
+ * :0010: 00 00 EC 02 00 00 03 00-03 00 01 00 00 00 06 00 ................
202
+ * Type 3:
203
+ * :0000: 4E 69 6B 6F 6E 00 02 00-00 00 4D 4D 00 2A 00 00 Nikon....MM.*...
204
+ * :0010: 00 08 00 1E 00 01 00 07-00 00 00 04 30 32 30 30 ............0200
205
+ */
206
+ if (pval[6] == 1) {
207
+ // Nikon type 1 Makernote
208
+ *md_model = TagLib::EXIF_MAKERNOTE_NIKONTYPE1;
209
+ *subdirOffset = 8;
210
+ } else if (pval[6] == 2) {
211
+ // Nikon type 3 Makernote
212
+ *md_model = TagLib::EXIF_MAKERNOTE_NIKONTYPE3;
213
+ *subdirOffset = 18;
214
+ } else {
215
+ // Unsupported makernote data ignored
216
+ *subdirOffset = 0;
217
+ *md_model = TagLib::UNKNOWN;
218
+ }
219
+ } else if(Maker && (FreeImage_strnicmp("NIKON", Maker, 5) == 0)) {
220
+ // Nikon type 2 Makernote
221
+ *md_model = TagLib::EXIF_MAKERNOTE_NIKONTYPE2;
222
+ *subdirOffset = 0;
223
+ } else if(Maker && (FreeImage_strnicmp("Canon", Maker, 5) == 0)) {
224
+ // Canon Makernote
225
+ *md_model = TagLib::EXIF_MAKERNOTE_CANON;
226
+ *subdirOffset = 0;
227
+ } else if(Maker && (FreeImage_strnicmp("Casio", Maker, 5) == 0)) {
228
+ // Casio Makernote
229
+ if(memcmp("QVC\x00\x00\x00", pval, 6) == 0) {
230
+ // Casio Type 2 Makernote
231
+ *md_model = TagLib::EXIF_MAKERNOTE_CASIOTYPE2;
232
+ *subdirOffset = 6;
233
+ } else {
234
+ // Casio Type 1 Makernote
235
+ *md_model = TagLib::EXIF_MAKERNOTE_CASIOTYPE1;
236
+ *subdirOffset = 0;
237
+ }
238
+ } else if ((memcmp("FUJIFILM", pval, 8) == 0) || (Maker && (FreeImage_strnicmp("Fujifilm", Maker, 8) == 0))) {
239
+ // Fujifile Makernote
240
+ // Fujifilm's Makernote always use little-endian order altough the Exif section maybe in little-endian order or in big-endian order.
241
+ // If msb_order == TRUE, the Makernote won't be read:
242
+ // the value of ifdStart will be 0x0c000000 instead of 0x0000000c and the MakerNote section will be discarded later
243
+ // in jpeg_read_exif_dir because the IFD is too high
244
+ *md_model = TagLib::EXIF_MAKERNOTE_FUJIFILM;
245
+ DWORD ifdStart = ReadUint32(msb_order, pval + 8);
246
+ *subdirOffset = ifdStart;
247
+ }
248
+ else if(memcmp("KYOCERA\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x00\x00\x00", pval, 22) == 0) {
249
+ *md_model = TagLib::EXIF_MAKERNOTE_KYOCERA;
250
+ *subdirOffset = 22;
251
+ }
252
+ else if(Maker && (FreeImage_strnicmp("Minolta", Maker, 7) == 0)) {
253
+ // Minolta maker note
254
+ *md_model = TagLib::EXIF_MAKERNOTE_MINOLTA;
255
+ *subdirOffset = 0;
256
+ }
257
+ else if(memcmp("Panasonic\x00\x00\x00", pval, 12) == 0) {
258
+ // Panasonic maker note
259
+ *md_model = TagLib::EXIF_MAKERNOTE_PANASONIC;
260
+ *subdirOffset = 12;
261
+ }
262
+ else if(Maker && (FreeImage_strnicmp("LEICA", Maker, 5) == 0)) {
263
+ // Leica maker note
264
+ if(memcmp("LEICA\x00\x00\x00", pval, 8) == 0) {
265
+ // not yet supported makernote data ignored
266
+ *subdirOffset = 0;
267
+ *md_model = TagLib::UNKNOWN;
268
+ }
269
+ }
270
+ else if(Maker && ((FreeImage_strnicmp("Pentax", Maker, 6) == 0) || (FreeImage_strnicmp("Asahi", Maker, 5) == 0))) {
271
+ // Pentax maker note
272
+ if(memcmp("AOC\x00", pval, 4) == 0) {
273
+ // Type 2 Pentax Makernote
274
+ *md_model = TagLib::EXIF_MAKERNOTE_PENTAX;
275
+ *subdirOffset = 6;
276
+ } else {
277
+ // Type 1 Pentax Makernote
278
+ *md_model = TagLib::EXIF_MAKERNOTE_ASAHI;
279
+ *subdirOffset = 0;
280
+ }
281
+ }
282
+ else if((memcmp("SONY CAM\x20\x00\x00\x00", pval, 12) == 0) || (memcmp("SONY DSC\x20\x00\x00\x00", pval, 12) == 0)) {
283
+ *md_model = TagLib::EXIF_MAKERNOTE_SONY;
284
+ *subdirOffset = 12;
285
+ }
286
+ else if((memcmp("SIGMA\x00\x00\x00", pval, 8) == 0) || (memcmp("FOVEON\x00\x00", pval, 8) == 0)) {
287
+ FITAG *tagModel = NULL;
288
+ FreeImage_GetMetadata(FIMD_EXIF_MAIN, dib, "Model", &tagModel);
289
+ const char *Model = (char*)FreeImage_GetTagValue(tagModel);
290
+ if(Model && (memcmp("SIGMA SD1\x00", Model, 10) == 0)) {
291
+ // Sigma SD1 maker note
292
+ *subdirOffset = 10;
293
+ *md_model = TagLib::EXIF_MAKERNOTE_SIGMA_SD1;
294
+ } else {
295
+ // Sigma / Foveon makernote
296
+ *subdirOffset = 10;
297
+ *md_model = TagLib::EXIF_MAKERNOTE_SIGMA_FOVEON;
298
+ }
299
+ }
300
+ }
301
+
302
+ /**
303
+ Process a Canon maker note tag.
304
+ A single Canon tag may contain many other tags within.
305
+ */
306
+ static BOOL
307
+ processCanonMakerNoteTag(FIBITMAP *dib, FITAG *tag) {
308
+ char defaultKey[16];
309
+ DWORD startIndex = 0;
310
+ TagLib& s = TagLib::instance();
311
+
312
+ WORD tag_id = FreeImage_GetTagID(tag);
313
+
314
+ int subTagTypeBase = 0;
315
+
316
+ switch(tag_id) {
317
+ case TAG_CANON_CAMERA_STATE_0x01:
318
+ subTagTypeBase = 0xC100;
319
+ startIndex = 1;
320
+ break;
321
+ case TAG_CANON_CAMERA_STATE_0x02:
322
+ subTagTypeBase = 0xC200;
323
+ startIndex = 0;
324
+ break;
325
+ case TAG_CANON_CAMERA_STATE_0x04:
326
+ subTagTypeBase = 0xC400;
327
+ startIndex = 1;
328
+ break;
329
+ case TAG_CANON_CAMERA_STATE_0x12:
330
+ subTagTypeBase = 0x1200;
331
+ startIndex = 0;
332
+ break;
333
+ case TAG_CANON_CAMERA_STATE_0xA0:
334
+ subTagTypeBase = 0xCA00;
335
+ startIndex = 1;
336
+ break;
337
+ case TAG_CANON_CAMERA_STATE_0xE0:
338
+ subTagTypeBase = 0xCE00;
339
+ startIndex = 1;
340
+ break;
341
+
342
+ default:
343
+ {
344
+ // process as a normal tag
345
+
346
+ // get the tag key and description
347
+ const char *key = s.getTagFieldName(TagLib::EXIF_MAKERNOTE_CANON, tag_id, defaultKey);
348
+ FreeImage_SetTagKey(tag, key);
349
+ const char *description = s.getTagDescription(TagLib::EXIF_MAKERNOTE_CANON, tag_id);
350
+ FreeImage_SetTagDescription(tag, description);
351
+
352
+ // store the tag
353
+ if(key) {
354
+ FreeImage_SetMetadata(FIMD_EXIF_MAKERNOTE, dib, key, tag);
355
+ }
356
+
357
+ return TRUE;
358
+ }
359
+ break;
360
+
361
+ }
362
+
363
+ WORD *pvalue = (WORD*)FreeImage_GetTagValue(tag);
364
+
365
+ // create a tag
366
+ FITAG *canonTag = FreeImage_CreateTag();
367
+ if(!canonTag) return FALSE;
368
+
369
+ // we intentionally skip the first array member (if needed)
370
+ for (DWORD i = startIndex; i < FreeImage_GetTagCount(tag); i++) {
371
+
372
+ tag_id = (WORD)(subTagTypeBase + i);
373
+
374
+ FreeImage_SetTagID(canonTag, tag_id);
375
+ FreeImage_SetTagType(canonTag, FIDT_SHORT);
376
+ FreeImage_SetTagCount(canonTag, 1);
377
+ FreeImage_SetTagLength(canonTag, 2);
378
+ FreeImage_SetTagValue(canonTag, &pvalue[i]);
379
+
380
+ // get the tag key and description
381
+ const char *key = s.getTagFieldName(TagLib::EXIF_MAKERNOTE_CANON, tag_id, defaultKey);
382
+ FreeImage_SetTagKey(canonTag, key);
383
+ const char *description = s.getTagDescription(TagLib::EXIF_MAKERNOTE_CANON, tag_id);
384
+ FreeImage_SetTagDescription(canonTag, description);
385
+
386
+ // store the tag
387
+ if(key) {
388
+ FreeImage_SetMetadata(FIMD_EXIF_MAKERNOTE, dib, key, canonTag);
389
+ }
390
+ }
391
+
392
+ // delete the tag
393
+ FreeImage_DeleteTag(canonTag);
394
+
395
+ return TRUE;
396
+ }
397
+
398
+ /**
399
+ Process a standard Exif tag
400
+ */
401
+ static void
402
+ processExifTag(FIBITMAP *dib, FITAG *tag, char *pval, BOOL msb_order, TagLib::MDMODEL md_model) {
403
+ char defaultKey[16];
404
+ int n;
405
+ DWORD i;
406
+
407
+ // allocate a buffer to store the tag value
408
+ BYTE *exif_value = (BYTE*)malloc(FreeImage_GetTagLength(tag) * sizeof(BYTE));
409
+ if(NULL == exif_value) {
410
+ // out of memory ...
411
+ return;
412
+ }
413
+ memset(exif_value, 0, FreeImage_GetTagLength(tag) * sizeof(BYTE));
414
+
415
+ // get the tag value
416
+ switch(FreeImage_GetTagType(tag)) {
417
+
418
+ case FIDT_SHORT:
419
+ {
420
+ WORD *value = (WORD*)&exif_value[0];
421
+ for(i = 0; i < FreeImage_GetTagCount(tag); i++) {
422
+ value[i] = ReadUint16(msb_order, pval + i * sizeof(WORD));
423
+ }
424
+ FreeImage_SetTagValue(tag, value);
425
+ break;
426
+ }
427
+ case FIDT_SSHORT:
428
+ {
429
+ short *value = (short*)&exif_value[0];
430
+ for(i = 0; i < FreeImage_GetTagCount(tag); i++) {
431
+ value[i] = ReadInt16(msb_order, pval + i * sizeof(short));
432
+ }
433
+ FreeImage_SetTagValue(tag, value);
434
+ break;
435
+ }
436
+ case FIDT_LONG:
437
+ {
438
+ DWORD *value = (DWORD*)&exif_value[0];
439
+ for(i = 0; i < FreeImage_GetTagCount(tag); i++) {
440
+ value[i] = ReadUint32(msb_order, pval + i * sizeof(DWORD));
441
+ }
442
+ FreeImage_SetTagValue(tag, value);
443
+ break;
444
+ }
445
+ case FIDT_SLONG:
446
+ {
447
+ LONG *value = (LONG*)&exif_value[0];
448
+ for(i = 0; i < FreeImage_GetTagCount(tag); i++) {
449
+ value[i] = ReadInt32(msb_order, pval + i * sizeof(LONG));
450
+ }
451
+ FreeImage_SetTagValue(tag, value);
452
+ break;
453
+ }
454
+ case FIDT_RATIONAL:
455
+ {
456
+ n = sizeof(DWORD);
457
+
458
+ DWORD *value = (DWORD*)&exif_value[0];
459
+ for(i = 0; i < 2 * FreeImage_GetTagCount(tag); i++) {
460
+ // read a sequence of (numerator, denominator)
461
+ value[i] = ReadUint32(msb_order, n*i + (char*)pval);
462
+ }
463
+ FreeImage_SetTagValue(tag, value);
464
+ break;
465
+ }
466
+ case FIDT_SRATIONAL:
467
+ {
468
+ n = sizeof(LONG);
469
+
470
+ LONG *value = (LONG*)&exif_value[0];
471
+ for(i = 0; i < 2 * FreeImage_GetTagCount(tag); i++) {
472
+ // read a sequence of (numerator, denominator)
473
+ value[i] = ReadInt32(msb_order, n*i + (char*)pval);
474
+ }
475
+ FreeImage_SetTagValue(tag, value);
476
+ break;
477
+ }
478
+ case FIDT_BYTE:
479
+ case FIDT_ASCII:
480
+ case FIDT_SBYTE:
481
+ case FIDT_UNDEFINED:
482
+ case FIDT_FLOAT:
483
+ case FIDT_DOUBLE:
484
+ default:
485
+ FreeImage_SetTagValue(tag, pval);
486
+ break;
487
+ }
488
+
489
+ if(md_model == TagLib::EXIF_MAKERNOTE_CANON) {
490
+ // A single Canon tag can have multiple values within
491
+ processCanonMakerNoteTag(dib, tag);
492
+ }
493
+ else {
494
+ TagLib& s = TagLib::instance();
495
+
496
+ WORD tag_id = FreeImage_GetTagID(tag);
497
+
498
+ // get the tag key and description
499
+ const char *key = s.getTagFieldName(md_model, tag_id, defaultKey);
500
+ FreeImage_SetTagKey(tag, key);
501
+ const char *description = s.getTagDescription(md_model, tag_id);
502
+ FreeImage_SetTagDescription(tag, description);
503
+
504
+ // store the tag
505
+ if(key) {
506
+ FreeImage_SetMetadata(s.getFreeImageModel(md_model), dib, key, tag);
507
+ }
508
+ }
509
+
510
+
511
+ // free the temporary buffer
512
+ free(exif_value);
513
+
514
+ }
515
+
516
+ /**
517
+ Process Exif directory
518
+
519
+ @param dib Input FIBITMAP
520
+ @param tiffp Pointer to the TIFF header
521
+ @param dwOffsetIfd0 Offset to the 0th IFD (first IFD)
522
+ @param dwLength Length of the Exif file
523
+ @param dwProfileOffset File offset to be used when reading 'offset/value' tags
524
+ @param msb_order Endianness order of the Exif file (TRUE if big-endian, FALSE if little-endian)
525
+ @param starting_md_model Metadata model of the IFD (should be TagLib::EXIF_MAIN for a jpeg)
526
+ @return Returns TRUE if sucessful, returns FALSE otherwise
527
+ */
528
+ static BOOL
529
+ jpeg_read_exif_dir(FIBITMAP *dib, const BYTE *tiffp, DWORD dwOffsetIfd0, DWORD dwLength, DWORD dwProfileOffset, BOOL msb_order, TagLib::MDMODEL starting_md_model) {
530
+ WORD de, nde;
531
+
532
+ std::stack<WORD> destack; // directory entries stack
533
+ std::stack<const BYTE*> ifdstack; // IFD stack
534
+ std::stack<TagLib::MDMODEL> modelstack; // metadata model stack
535
+
536
+ // Keep a list of already visited IFD to avoid stack overflows
537
+ // when recursive/cyclic directory structures exist.
538
+ // This kind of recursive Exif file was encountered with Kodak images coming from
539
+ // KODAK PROFESSIONAL DCS Photo Desk JPEG Export v3.2 W
540
+ std::map<DWORD, int> visitedIFD;
541
+
542
+ /*
543
+ "An Image File Directory (IFD) consists of a 2-byte count of the number of directory
544
+ entries (i.e. the number of fields), followed by a sequence of 12-byte field
545
+ entries, followed by a 4-byte offset of the next IFD (or 0 if none)."
546
+ The "next IFD" (1st IFD) is the thumbnail.
547
+ */
548
+ #define DIR_ENTRY_ADDR(_start, _entry) (_start + 2 + (12 * _entry))
549
+
550
+ // set the metadata model to Exif
551
+
552
+ TagLib::MDMODEL md_model = starting_md_model;
553
+
554
+ // set the pointer to the first IFD (0th IFD) and follow it were it leads.
555
+
556
+ const BYTE *ifd0th = (BYTE*)tiffp + (size_t)dwOffsetIfd0;
557
+
558
+ const BYTE *ifdp = ifd0th;
559
+
560
+ de = 0;
561
+
562
+ do {
563
+ // if there is anything on the stack then pop it off
564
+ if(!destack.empty()) {
565
+ ifdp = ifdstack.top(); ifdstack.pop();
566
+ de = destack.top(); destack.pop();
567
+ md_model = modelstack.top(); modelstack.pop();
568
+ }
569
+
570
+ // remember that we've visited this directory and entry so that we don't visit it again later
571
+ DWORD visited = (DWORD)( (((size_t)ifdp & 0xFFFF) << 16) | (size_t)de );
572
+ if(visitedIFD.find(visited) != visitedIFD.end()) {
573
+ continue;
574
+ } else {
575
+ visitedIFD[visited] = 1; // processed
576
+ }
577
+
578
+ // determine how many entries there are in the current IFD
579
+ nde = ReadUint16(msb_order, ifdp);
580
+ if (((size_t)(ifdp - tiffp) + 12 * nde) > (size_t)dwLength) {
581
+ // suspicious IFD offset, ignore
582
+ continue;
583
+ }
584
+
585
+ for(; de < nde; de++) {
586
+ char *pde = NULL; // pointer to the directory entry
587
+ char *pval = NULL; // pointer to the tag value
588
+
589
+ // create a tag
590
+ FITAG *tag = FreeImage_CreateTag();
591
+ if(!tag) return FALSE;
592
+
593
+ // point to the directory entry
594
+ pde = (char*) DIR_ENTRY_ADDR(ifdp, de);
595
+
596
+ // get the tag ID
597
+ WORD tag_id = ReadUint16(msb_order, pde);
598
+ FreeImage_SetTagID(tag, tag_id);
599
+
600
+ // get the tag type
601
+ WORD tag_type = (WORD)ReadUint16(msb_order, pde + 2);
602
+ if((tag_type - 1) >= EXIF_NUM_FORMATS) {
603
+ // a problem occured : delete the tag (not free'd after)
604
+ FreeImage_DeleteTag(tag);
605
+ // break out of the for loop
606
+ break;
607
+ }
608
+ FreeImage_SetTagType(tag, (FREE_IMAGE_MDTYPE)tag_type);
609
+
610
+ // get number of components
611
+ DWORD tag_count = ReadUint32(msb_order, pde + 4);
612
+ FreeImage_SetTagCount(tag, tag_count);
613
+
614
+ // check that tag length (size of the tag value in bytes) will fit in a DWORD
615
+ unsigned tag_data_width = FreeImage_TagDataWidth(FreeImage_GetTagType(tag));
616
+ if (tag_data_width != 0 && FreeImage_GetTagCount(tag) > ~(DWORD)0 / tag_data_width) {
617
+ FreeImage_DeleteTag(tag);
618
+ // jump to next entry
619
+ continue;
620
+ }
621
+ FreeImage_SetTagLength(tag, FreeImage_GetTagCount(tag) * tag_data_width);
622
+
623
+ if(FreeImage_GetTagLength(tag) <= 4) {
624
+ // 4 bytes or less and value is in the dir entry itself
625
+ pval = pde + 8;
626
+ } else {
627
+ // if its bigger than 4 bytes, the directory entry contains an offset
628
+ DWORD offset_value = ReadUint32(msb_order, pde + 8);
629
+ // the offset can be relative to tiffp or to an external reference (see JPEG-XR)
630
+ if(dwProfileOffset) {
631
+ offset_value -= dwProfileOffset;
632
+ }
633
+ // first check if offset exceeds buffer, at this stage FreeImage_GetTagLength may return invalid data
634
+ if(offset_value > dwLength) {
635
+ // a problem occured : delete the tag (not free'd after)
636
+ FreeImage_DeleteTag(tag);
637
+ // jump to next entry
638
+ continue;
639
+ }
640
+ // now check that length does not exceed the buffer size
641
+ if(FreeImage_GetTagLength(tag) > dwLength - offset_value){
642
+ // a problem occured : delete the tag (not free'd after)
643
+ FreeImage_DeleteTag(tag);
644
+ // jump to next entry
645
+ continue;
646
+ }
647
+ pval = (char*)(tiffp + offset_value);
648
+ }
649
+
650
+ // check for a IFD offset
651
+ BOOL isIFDOffset = FALSE;
652
+ switch(FreeImage_GetTagID(tag)) {
653
+ case TAG_EXIF_OFFSET:
654
+ case TAG_GPS_OFFSET:
655
+ case TAG_INTEROP_OFFSET:
656
+ case TAG_MAKER_NOTE:
657
+ isIFDOffset = TRUE;
658
+ break;
659
+ }
660
+ if(isIFDOffset) {
661
+ DWORD sub_offset = 0;
662
+ TagLib::MDMODEL next_mdmodel = md_model;
663
+ const BYTE *next_ifd = ifdp;
664
+
665
+ // get offset and metadata model
666
+ if (FreeImage_GetTagID(tag) == TAG_MAKER_NOTE) {
667
+ processMakerNote(dib, pval, msb_order, &sub_offset, &next_mdmodel);
668
+ next_ifd = (BYTE*)pval + sub_offset;
669
+ } else {
670
+ processIFDOffset(tag, pval, msb_order, &sub_offset, &next_mdmodel);
671
+ next_ifd = (BYTE*)tiffp + sub_offset;
672
+ }
673
+
674
+ if((sub_offset < dwLength) && (next_mdmodel != TagLib::UNKNOWN)) {
675
+ // push our current directory state onto the stack
676
+ ifdstack.push(ifdp);
677
+ // jump to the next entry
678
+ de++;
679
+ destack.push(de);
680
+
681
+ // push our current metadata model
682
+ modelstack.push(md_model);
683
+
684
+ // push new state onto of stack to cause a jump
685
+ ifdstack.push(next_ifd);
686
+ destack.push(0);
687
+
688
+ // select a new metadata model
689
+ modelstack.push(next_mdmodel);
690
+
691
+ // delete the tag as it won't be stored nor deleted in the for() loop
692
+ FreeImage_DeleteTag(tag);
693
+
694
+ break; // break out of the for loop
695
+ }
696
+ else {
697
+ // unsupported camera model, canon maker tag or something unknown
698
+ // process as a standard tag
699
+ processExifTag(dib, tag, pval, msb_order, md_model);
700
+ }
701
+
702
+ } else {
703
+ // process as a standard tag
704
+ processExifTag(dib, tag, pval, msb_order, md_model);
705
+ }
706
+
707
+ // delete the tag
708
+ FreeImage_DeleteTag(tag);
709
+
710
+ } // for(nde)
711
+
712
+ // additional thumbnail data is skipped
713
+
714
+ } while (!destack.empty());
715
+
716
+ //
717
+ // --- handle thumbnail data ---
718
+ //
719
+
720
+ const WORD entriesCount0th = ReadUint16(msb_order, ifd0th);
721
+
722
+ DWORD next_offset = ReadUint32(msb_order, DIR_ENTRY_ADDR(ifd0th, entriesCount0th));
723
+ if((next_offset == 0) || (next_offset >= dwLength)) {
724
+ return TRUE; //< no thumbnail
725
+ }
726
+
727
+ const BYTE* const ifd1st = (BYTE*)tiffp + next_offset;
728
+ const WORD entriesCount1st = ReadUint16(msb_order, ifd1st);
729
+
730
+ unsigned thCompression = 0;
731
+ unsigned thOffset = 0;
732
+ unsigned thSize = 0;
733
+
734
+ for(int e = 0; e < entriesCount1st; e++) {
735
+
736
+ // point to the directory entry
737
+ const BYTE* base = DIR_ENTRY_ADDR(ifd1st, e);
738
+
739
+ // check for buffer overflow
740
+ const size_t remaining = (size_t)base + 12 - (size_t)tiffp;
741
+ if(remaining >= dwLength) {
742
+ // bad IFD1 directory, ignore it
743
+ return FALSE;
744
+ }
745
+
746
+ // get the tag ID
747
+ WORD tag = ReadUint16(msb_order, base);
748
+ // get the tag type
749
+ /*WORD type = */ReadUint16(msb_order, base + sizeof(WORD));
750
+ // get number of components
751
+ /*DWORD count = */ReadUint32(msb_order, base + sizeof(WORD) + sizeof(WORD));
752
+ // get the tag value
753
+ DWORD offset = ReadUint32(msb_order, base + sizeof(WORD) + sizeof(WORD) + sizeof(DWORD));
754
+
755
+ switch(tag) {
756
+ case TAG_COMPRESSION:
757
+ // Tiff Compression Tag (should be COMPRESSION_OJPEG (6), but is not always respected)
758
+ thCompression = offset;
759
+ break;
760
+ case TAG_JPEG_INTERCHANGE_FORMAT:
761
+ // Tiff JPEGInterchangeFormat Tag
762
+ thOffset = offset;
763
+ break;
764
+ case TAG_JPEG_INTERCHANGE_FORMAT_LENGTH:
765
+ // Tiff JPEGInterchangeFormatLength Tag
766
+ thSize = offset;
767
+ break;
768
+ // ### X and Y Resolution ignored, orientation ignored
769
+ case TAG_X_RESOLUTION: // XResolution
770
+ case TAG_Y_RESOLUTION: // YResolution
771
+ case TAG_RESOLUTION_UNIT: // ResolutionUnit
772
+ case TAG_ORIENTATION: // Orientation
773
+ break;
774
+ default:
775
+ break;
776
+ }
777
+ }
778
+
779
+ if(/*thCompression != 6 ||*/ thOffset == 0 || thSize == 0) {
780
+ return TRUE;
781
+ }
782
+
783
+ if(thOffset + thSize > dwLength) {
784
+ return TRUE;
785
+ }
786
+
787
+ // load the thumbnail
788
+
789
+ const BYTE *thLocation = tiffp + thOffset;
790
+
791
+ FIMEMORY* hmem = FreeImage_OpenMemory(const_cast<BYTE*>(thLocation), thSize);
792
+ FIBITMAP* thumbnail = FreeImage_LoadFromMemory(FIF_JPEG, hmem);
793
+ FreeImage_CloseMemory(hmem);
794
+
795
+ // store the thumbnail
796
+ FreeImage_SetThumbnail(dib, thumbnail);
797
+ // then delete it
798
+ FreeImage_Unload(thumbnail);
799
+
800
+ return TRUE;
801
+ }
802
+
803
+ // --------------------------------------------------------------------------
804
+
805
+ /**
806
+ Read and decode JPEG_APP1 marker (Exif profile)
807
+ @param dib Input FIBITMAP
808
+ @param data Pointer to the APP1 marker
809
+ @param length APP1 marker length
810
+ @return Returns TRUE if successful, FALSE otherwise
811
+ */
812
+ BOOL
813
+ jpeg_read_exif_profile(FIBITMAP *dib, const BYTE *data, unsigned length) {
814
+ // marker identifying string for Exif = "Exif\0\0"
815
+ BYTE exif_signature[6] = { 0x45, 0x78, 0x69, 0x66, 0x00, 0x00 };
816
+ BYTE lsb_first[4] = { 0x49, 0x49, 0x2A, 0x00 }; // Classic TIFF signature - little-endian order
817
+ BYTE msb_first[4] = { 0x4D, 0x4D, 0x00, 0x2A }; // Classic TIFF signature - big-endian order
818
+
819
+ // profile size is up to 32-bit
820
+ DWORD dwProfileLength = (DWORD)length;
821
+ BYTE *pbProfile = (BYTE*)data;
822
+
823
+ // verify the identifying string
824
+ if(memcmp(exif_signature, pbProfile, sizeof(exif_signature)) == 0) {
825
+ // This is an Exif profile
826
+ // should contain a TIFF header with up to 2 IFDs (IFD stands for 'Image File Directory')
827
+ // 0th IFD : the image attributes, 1st IFD : may be used for thumbnail
828
+
829
+ pbProfile += sizeof(exif_signature);
830
+ dwProfileLength -= sizeof(exif_signature);
831
+
832
+ // read the TIFF header (8 bytes)
833
+
834
+ // check the endianess order
835
+
836
+ BOOL bBigEndian = TRUE;
837
+
838
+ if(memcmp(pbProfile, lsb_first, sizeof(lsb_first)) == 0) {
839
+ // Exif section is in little-endian order
840
+ bBigEndian = FALSE;
841
+ } else {
842
+ if(memcmp(pbProfile, msb_first, sizeof(msb_first)) == 0) {
843
+ // Exif section is in big-endian order
844
+ bBigEndian = TRUE;
845
+ } else {
846
+ // Invalid Exif alignment marker
847
+ return FALSE;
848
+ }
849
+ }
850
+
851
+ // this is the offset to the first IFD (Image File Directory)
852
+ DWORD dwFirstOffset = ReadUint32(bBigEndian, pbProfile + 4);
853
+ if (dwFirstOffset > dwProfileLength) {
854
+ // bad Exif data
855
+ return FALSE;
856
+ }
857
+
858
+ /*
859
+ Note: as FreeImage 3.14.0, this test is no longer needed for images with similar suspicious offset
860
+ => tested with Pentax Optio 230, FujiFilm SP-2500 and Canon EOS 300D
861
+ if (dwFirstOffset < 8 || dwFirstOffset > 16) {
862
+ // This is usually set to 8
863
+ // but PENTAX Optio 230 has it set differently, and uses it as offset.
864
+ FreeImage_OutputMessageProc(FIF_JPEG, "Exif: Suspicious offset of first IFD value");
865
+ return FALSE;
866
+ }
867
+ */
868
+
869
+ // process Exif directories, starting with Exif-TIFF IFD
870
+ return jpeg_read_exif_dir(dib, pbProfile, dwFirstOffset, dwProfileLength, 0, bBigEndian, TagLib::EXIF_MAIN);
871
+ }
872
+
873
+ return FALSE;
874
+ }
875
+
876
+ // ==========================================================
877
+ // Exif JPEG helper routines
878
+ // ==========================================================
879
+
880
+ /**
881
+ Read JPEG_APP1 marker (Exif profile)
882
+ @param dib Input FIBITMAP
883
+ @param dataptr Pointer to the APP1 marker
884
+ @param datalen APP1 marker length
885
+ @return Returns TRUE if successful, FALSE otherwise
886
+ */
887
+ BOOL
888
+ jpeg_read_exif_profile_raw(FIBITMAP *dib, const BYTE *profile, unsigned length) {
889
+ // marker identifying string for Exif = "Exif\0\0"
890
+ BYTE exif_signature[6] = { 0x45, 0x78, 0x69, 0x66, 0x00, 0x00 };
891
+
892
+ // verify the identifying string
893
+ if(memcmp(exif_signature, profile, sizeof(exif_signature)) != 0) {
894
+ // not an Exif profile
895
+ return FALSE;
896
+ }
897
+
898
+ // create a tag
899
+ FITAG *tag = FreeImage_CreateTag();
900
+ if(tag) {
901
+ FreeImage_SetTagKey(tag, g_TagLib_ExifRawFieldName);
902
+ FreeImage_SetTagLength(tag, (DWORD)length);
903
+ FreeImage_SetTagCount(tag, (DWORD)length);
904
+ FreeImage_SetTagType(tag, FIDT_BYTE);
905
+ FreeImage_SetTagValue(tag, profile);
906
+
907
+ // store the tag
908
+ FreeImage_SetMetadata(FIMD_EXIF_RAW, dib, FreeImage_GetTagKey(tag), tag);
909
+
910
+ // destroy the tag
911
+ FreeImage_DeleteTag(tag);
912
+
913
+ return TRUE;
914
+ }
915
+
916
+ return FALSE;
917
+ }
918
+
919
+ // ==========================================================
920
+ // Exif JPEG-XR helper routines
921
+ // ==========================================================
922
+
923
+ /**
924
+ Read and decode JPEG-XR Exif IFD
925
+ @param dib Input FIBITMAP
926
+ @param profile Pointer to the Exif marker
927
+ @param length Exif marker length
928
+ @param file_offset Reference offset in the original file of each tag value whose length is > 4
929
+ @return Returns TRUE if successful, FALSE otherwise
930
+ */
931
+ BOOL
932
+ jpegxr_read_exif_profile(FIBITMAP *dib, const BYTE *profile, unsigned length, unsigned file_offset) {
933
+ // assume Little Endian order
934
+ BOOL bBigEndian = FALSE;
935
+
936
+ // process Exif specific IFD
937
+ return jpeg_read_exif_dir(dib, profile, 0, length, file_offset, bBigEndian, TagLib::EXIF_EXIF);
938
+ }
939
+
940
+ /**
941
+ Read and decode JPEG-XR Exif-GPS IFD
942
+ @param dib Input FIBITMAP
943
+ @param profile Pointer to the Exif-GPS profile
944
+ @param length Exif-GPS profile length
945
+ @param file_offset Reference offset in the original file of each tag value whose length is > 4
946
+ @return Returns TRUE if successful, FALSE otherwise
947
+ */
948
+ BOOL
949
+ jpegxr_read_exif_gps_profile(FIBITMAP *dib, const BYTE *profile, unsigned length, unsigned file_offset) {
950
+ // assume Little Endian order
951
+ BOOL bBigEndian = FALSE;
952
+
953
+ // process Exif GPS IFD
954
+ return jpeg_read_exif_dir(dib, profile, 0, length, file_offset, bBigEndian, TagLib::EXIF_GPS);
955
+ }
956
+
957
+ // ==========================================================
958
+ // Exif common helper routines
959
+ // ==========================================================
960
+
961
+ /**
962
+ Rotate a dib according to Exif info
963
+ @param dib Input / Output dib to rotate
964
+ @see PluginJPEG.cpp
965
+ */
966
+ void
967
+ RotateExif(FIBITMAP **dib) {
968
+ // check for Exif rotation
969
+ if(FreeImage_GetMetadataCount(FIMD_EXIF_MAIN, *dib)) {
970
+ FIBITMAP *rotated = NULL;
971
+ // process Exif rotation
972
+ FITAG *tag = NULL;
973
+ FreeImage_GetMetadata(FIMD_EXIF_MAIN, *dib, "Orientation", &tag);
974
+ if((tag != NULL) && (FreeImage_GetTagID(tag) == TAG_ORIENTATION)) {
975
+ const WORD orientation = *((WORD *)FreeImage_GetTagValue(tag));
976
+ switch (orientation) {
977
+ case 1: // "top, left side" => 0�
978
+ break;
979
+ case 2: // "top, right side" => flip left-right
980
+ FreeImage_FlipHorizontal(*dib);
981
+ break;
982
+ case 3: // "bottom, right side" => -180�
983
+ rotated = FreeImage_Rotate(*dib, 180);
984
+ FreeImage_Unload(*dib);
985
+ *dib = rotated;
986
+ break;
987
+ case 4: // "bottom, left side" => flip up-down
988
+ FreeImage_FlipVertical(*dib);
989
+ break;
990
+ case 5: // "left side, top" => +90� + flip up-down
991
+ rotated = FreeImage_Rotate(*dib, 90);
992
+ FreeImage_Unload(*dib);
993
+ *dib = rotated;
994
+ FreeImage_FlipVertical(*dib);
995
+ break;
996
+ case 6: // "right side, top" => -90�
997
+ rotated = FreeImage_Rotate(*dib, -90);
998
+ FreeImage_Unload(*dib);
999
+ *dib = rotated;
1000
+ break;
1001
+ case 7: // "right side, bottom" => -90� + flip up-down
1002
+ rotated = FreeImage_Rotate(*dib, -90);
1003
+ FreeImage_Unload(*dib);
1004
+ *dib = rotated;
1005
+ FreeImage_FlipVertical(*dib);
1006
+ break;
1007
+ case 8: // "left side, bottom" => +90�
1008
+ rotated = FreeImage_Rotate(*dib, 90);
1009
+ FreeImage_Unload(*dib);
1010
+ *dib = rotated;
1011
+ break;
1012
+ default:
1013
+ break;
1014
+ }
1015
+ }
1016
+ }
1017
+ }
1018
+
1019
+ // ==========================================================
1020
+ // Exif TIFF JPEG-XR helper routines
1021
+ // ==========================================================
1022
+
1023
+ class PredicateTagIDCompare {
1024
+ public:
1025
+ bool operator()(FITAG *a, FITAG *b) {
1026
+ WORD tag_id_a = FreeImage_GetTagID(a);
1027
+ WORD tag_id_b = FreeImage_GetTagID(b);
1028
+ return (tag_id_a < tag_id_b);
1029
+ }
1030
+ };
1031
+
1032
+ /**
1033
+ Write a metadata model as a TIF IFD to a FIMEMORY handle.
1034
+ The entries in the TIF IFD are sorted in ascending order by tag id.
1035
+ The last entry is written as 0 (4 bytes) which means no more IFD to follow.
1036
+ Supported metadata models are
1037
+ <ul>
1038
+ <li>FIMD_EXIF_MAIN
1039
+ <li>FIMD_EXIF_EXIF
1040
+ <li>FIMD_EXIF_GPS
1041
+ <li>FIMD_EXIF_INTEROP
1042
+ </ul>
1043
+ The end of the buffer is filled with 4 bytes equal to 0 (end of IFD offset)
1044
+
1045
+ @param dib Input FIBITMAP
1046
+ @param md_model Metadata model to write
1047
+ @param hmem Memory handle
1048
+ @return Returns TRUE if successful, FALSE otherwise
1049
+ @see tiff_get_ifd_profile
1050
+ */
1051
+ static BOOL
1052
+ tiff_write_ifd(FIBITMAP *dib, FREE_IMAGE_MDMODEL md_model, FIMEMORY *hmem) {
1053
+ FITAG *tag = NULL;
1054
+ FIMETADATA *mdhandle = NULL;
1055
+ std::vector<FITAG*> vTagList;
1056
+ TagLib::MDMODEL internal_md_model;
1057
+
1058
+ DWORD ifd_offset = 0; // WORD-aligned IFD value offset
1059
+
1060
+ const BYTE empty_byte = 0;
1061
+
1062
+ // start of the file
1063
+ const long start_of_file = FreeImage_TellMemory(hmem);
1064
+
1065
+ // get the metadata count
1066
+ unsigned metadata_count = FreeImage_GetMetadataCount(md_model, dib);
1067
+ if(metadata_count == 0) {
1068
+ return FALSE;
1069
+ }
1070
+
1071
+ TagLib& s = TagLib::instance();
1072
+
1073
+ // check for supported metadata models
1074
+ switch(md_model) {
1075
+ case FIMD_EXIF_MAIN:
1076
+ internal_md_model = TagLib::EXIF_MAIN;
1077
+ break;
1078
+ case FIMD_EXIF_EXIF:
1079
+ internal_md_model = TagLib::EXIF_EXIF;
1080
+ break;
1081
+ case FIMD_EXIF_GPS:
1082
+ internal_md_model = TagLib::EXIF_GPS;
1083
+ break;
1084
+ case FIMD_EXIF_INTEROP:
1085
+ internal_md_model = TagLib::EXIF_INTEROP;
1086
+ break;
1087
+ default:
1088
+ return FALSE;
1089
+ }
1090
+
1091
+ try {
1092
+ // 1) according to the TIFF specifications,
1093
+ // the entries in a TIF IFD must be sorted in ascending order by tag id
1094
+
1095
+ // store the tags into a vector
1096
+ vTagList.reserve(metadata_count);
1097
+ mdhandle = FreeImage_FindFirstMetadata(md_model, dib, &tag);
1098
+ if(mdhandle) {
1099
+ // parse the tags and store them inside vTagList
1100
+ do {
1101
+ // rewrite the tag id using FreeImage internal database
1102
+ // (in case the tag id is wrong or missing)
1103
+ const char *key = FreeImage_GetTagKey(tag);
1104
+ int tag_id = s.getTagID(internal_md_model, key);
1105
+ if(tag_id != -1) {
1106
+ // this is a known tag, set the tag ID
1107
+ FreeImage_SetTagID(tag, (WORD)tag_id);
1108
+ // record the tag
1109
+ vTagList.push_back(tag);
1110
+ }
1111
+ // else ignore this tag
1112
+ } while(FreeImage_FindNextMetadata(mdhandle, &tag));
1113
+
1114
+ FreeImage_FindCloseMetadata(mdhandle);
1115
+
1116
+ // sort the vector by tag id
1117
+ std::sort(vTagList.begin(), vTagList.end(), PredicateTagIDCompare());
1118
+
1119
+ // update the metadata_count
1120
+ metadata_count = (unsigned)vTagList.size();
1121
+
1122
+ } else {
1123
+ throw(1);
1124
+ }
1125
+
1126
+ // 2) prepare the place for each IFD entries.
1127
+
1128
+ /*
1129
+ An Image File Directory (IFD) consists of a 2-byte count of the number of directory entries (i.e., the number of fields),
1130
+ followed by a sequence of 12-byte field entries,
1131
+ followed by a 4-byte offset of the next IFD (or 0 if none). Do not forget to write the 4 bytes of 0 after the last IFD.
1132
+ */
1133
+
1134
+ {
1135
+ // prepare place for 2 bytes for number of entries + 12 bytes for each entry
1136
+ unsigned ifd_size = 2 + 12 * metadata_count;
1137
+ FreeImage_WriteMemory(&empty_byte, 1, ifd_size, hmem);
1138
+ // record the offset used to write values > 4-bytes
1139
+ ifd_offset = FreeImage_TellMemory(hmem);
1140
+ // rewind
1141
+ FreeImage_SeekMemory(hmem, start_of_file, SEEK_SET);
1142
+ }
1143
+
1144
+ // 3) write each IFD entry in tag id ascending order
1145
+
1146
+ // number of directory entries
1147
+ WORD nde = (WORD)metadata_count;
1148
+ FreeImage_WriteMemory(&nde, 1, 2, hmem);
1149
+
1150
+ // for each entry ...
1151
+ for(unsigned i = 0; i < metadata_count; i++) {
1152
+ FITAG *tag = vTagList[i];
1153
+ // tag id
1154
+ WORD tag_id = FreeImage_GetTagID(tag);
1155
+ FreeImage_WriteMemory(&tag_id, 1, 2, hmem);
1156
+ // tag type (compliant with TIFF specification)
1157
+ WORD tag_type = (WORD)FreeImage_GetTagType(tag);
1158
+ FreeImage_WriteMemory(&tag_type, 1, 2, hmem);
1159
+ // tag count
1160
+ DWORD tag_count = FreeImage_GetTagCount(tag);
1161
+ FreeImage_WriteMemory(&tag_count, 1, 4, hmem);
1162
+ // tag value or offset (results are in BYTE's units)
1163
+ unsigned tag_length = FreeImage_GetTagLength(tag);
1164
+ if(tag_length <= 4) {
1165
+ // 4 bytes or less, write the value (left justified)
1166
+ const BYTE *tag_value = (BYTE*)FreeImage_GetTagValue(tag);
1167
+ FreeImage_WriteMemory(tag_value, 1, tag_length, hmem);
1168
+ for(unsigned k = tag_length; k < 4; k++) {
1169
+ FreeImage_WriteMemory(&empty_byte, 1, 1, hmem);
1170
+ }
1171
+ } else {
1172
+ // write an offset
1173
+ FreeImage_WriteMemory(&ifd_offset, 1, 4, hmem);
1174
+ // write the value
1175
+ long current_position = FreeImage_TellMemory(hmem);
1176
+ FreeImage_SeekMemory(hmem, ifd_offset, SEEK_SET);
1177
+ FreeImage_WriteMemory(FreeImage_GetTagValue(tag), 1, tag_length, hmem);
1178
+ if(tag_length & 1) {
1179
+ // align to the next WORD boundary
1180
+ FreeImage_WriteMemory(&empty_byte, 1, 1, hmem);
1181
+ }
1182
+ // next offset to use
1183
+ ifd_offset = FreeImage_TellMemory(hmem);
1184
+ // rewind
1185
+ FreeImage_SeekMemory(hmem, current_position, SEEK_SET);
1186
+ }
1187
+ }
1188
+
1189
+ // end-of-IFD or next IFD (0 == none)
1190
+ FreeImage_SeekMemory(hmem, ifd_offset, SEEK_SET);
1191
+ FreeImage_WriteMemory(&empty_byte, 1, 4, hmem);
1192
+
1193
+ return TRUE;
1194
+ }
1195
+ catch(int) {
1196
+ return FALSE;
1197
+ }
1198
+ }
1199
+
1200
+ /**
1201
+ Write a metadata model as a TIF IFD, returns the IFD as a buffer.
1202
+ The buffer is allocated by the function and must be freed by the caller, using 'free'.
1203
+ @param dib Input FIBITMAP
1204
+ @param md_model Metadata model to write
1205
+ @param ppbProfile Returned buffer
1206
+ @param uProfileLength Returned buffer size
1207
+ @return Returns TRUE if successful, FALSE otherwise
1208
+ @see tiff_write_ifd
1209
+ */
1210
+ BOOL
1211
+ tiff_get_ifd_profile(FIBITMAP *dib, FREE_IMAGE_MDMODEL md_model, BYTE **ppbProfile, unsigned *uProfileLength) {
1212
+ FIMEMORY *hmem = NULL;
1213
+
1214
+ try {
1215
+ // open a memory stream
1216
+ hmem = FreeImage_OpenMemory(NULL, 0);
1217
+ if(!hmem) {
1218
+ throw(1);
1219
+ }
1220
+
1221
+ // write the metadata model as a TIF IFD
1222
+ BOOL bResult = tiff_write_ifd(dib, md_model, hmem);
1223
+
1224
+ if(bResult) {
1225
+ BYTE *data = NULL;
1226
+ DWORD size_in_bytes = 0;
1227
+
1228
+ // get a pointer to the stream buffer
1229
+ FreeImage_AcquireMemory(hmem, &data, &size_in_bytes);
1230
+
1231
+ // (re-)allocate output buffer
1232
+ BYTE *pbProfile = *ppbProfile;
1233
+ pbProfile = (BYTE*)realloc(pbProfile, size_in_bytes);
1234
+ if(!pbProfile) {
1235
+ throw(1);
1236
+ } else {
1237
+ // copy IFD
1238
+ memcpy(pbProfile, data, size_in_bytes);
1239
+ *ppbProfile = pbProfile;
1240
+ *uProfileLength = size_in_bytes;
1241
+ }
1242
+ }
1243
+
1244
+ // free the memory stream
1245
+ FreeImage_CloseMemory(hmem);
1246
+
1247
+ return bResult;
1248
+
1249
+ } catch(int) {
1250
+ FreeImage_CloseMemory(hmem);
1251
+ return FALSE;
1252
+ }
1253
+ }