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,1573 @@
1
+ // ==========================================================
2
+ // FreeImage implementation
3
+ //
4
+ // Design and implementation by
5
+ // - Floris van den Berg (flvdberg@wxs.nl)
6
+ // - Herv� Drolon (drolon@infonie.fr)
7
+ // - Detlev Vendt (detlev.vendt@brillit.de)
8
+ // - Petr Supina (psup@centrum.cz)
9
+ // - Carsten Klein (c.klein@datagis.com)
10
+ // - Mihail Naydenov (mnaydenov@users.sourceforge.net)
11
+ //
12
+ // This file is part of FreeImage 3
13
+ //
14
+ // COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
15
+ // OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
16
+ // THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
17
+ // OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
18
+ // CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
19
+ // THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
20
+ // SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
21
+ // PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
22
+ // THIS DISCLAIMER.
23
+ //
24
+ // Use at your own risk!
25
+ // ==========================================================
26
+
27
+ #ifdef _MSC_VER
28
+ #pragma warning (disable : 4786) // identifier was truncated to 'number' characters
29
+ #endif
30
+
31
+ #include <stdlib.h>
32
+ #if defined(_WIN32) || defined(_WIN64) || defined(__MINGW32__)
33
+ #include <malloc.h>
34
+ #endif // _WIN32 || _WIN64 || __MINGW32__
35
+
36
+ #include "FreeImage.h"
37
+ #include "FreeImageIO.h"
38
+ #include "Utilities.h"
39
+ #include "MapIntrospector.h"
40
+
41
+ #include "../Metadata/FreeImageTag.h"
42
+
43
+ /**
44
+ Constants for the BITMAPINFOHEADER::biCompression field
45
+ BI_RGB:
46
+ The bitmap is in uncompressed red green blue (RGB) format that is not compressed and does not use color masks.
47
+ BI_BITFIELDS:
48
+ The bitmap is not compressed and the color table consists of three DWORD color masks that specify the red, green, and blue components,
49
+ respectively, of each pixel. This is valid when used with 16 and 32-bits per pixel bitmaps.
50
+ */
51
+ #ifndef _WINGDI_
52
+ #define BI_RGB 0L
53
+ #define BI_BITFIELDS 3L
54
+ #endif // _WINGDI_
55
+
56
+ // ----------------------------------------------------------
57
+ // Metadata definitions
58
+ // ----------------------------------------------------------
59
+
60
+ /** helper for map<key, value> where value is a pointer to a FreeImage tag */
61
+ typedef std::map<std::string, FITAG*> TAGMAP;
62
+
63
+ /** helper for map<FREE_IMAGE_MDMODEL, TAGMAP*> */
64
+ typedef std::map<int, TAGMAP*> METADATAMAP;
65
+
66
+ /** helper for metadata iterator */
67
+ FI_STRUCT (METADATAHEADER) {
68
+ long pos; //! current position when iterating the map
69
+ TAGMAP *tagmap; //! pointer to the tag map
70
+ };
71
+
72
+ // ----------------------------------------------------------
73
+ // FIBITMAP definition
74
+ // ----------------------------------------------------------
75
+
76
+ /**
77
+ FreeImage header structure
78
+ */
79
+ FI_STRUCT (FREEIMAGEHEADER) {
80
+ /** data type - bitmap, array of long, double, complex, etc */
81
+ FREE_IMAGE_TYPE type;
82
+
83
+ /** background color used for RGB transparency */
84
+ RGBQUAD bkgnd_color;
85
+
86
+ /**@name transparency management */
87
+ //@{
88
+ /**
89
+ why another table ? for easy transparency table retrieval !
90
+ transparency could be stored in the palette, which is better
91
+ overall, but it requires quite some changes and it will render
92
+ FreeImage_GetTransparencyTable obsolete in its current form;
93
+ */
94
+ BYTE transparent_table[256];
95
+ /** number of transparent colors */
96
+ int transparency_count;
97
+ /** TRUE if the image is transparent */
98
+ BOOL transparent;
99
+ //@}
100
+
101
+ /** space to hold ICC profile */
102
+ FIICCPROFILE iccProfile;
103
+
104
+ /** contains a list of metadata models attached to the bitmap */
105
+ METADATAMAP *metadata;
106
+
107
+ /** FALSE if the FIBITMAP only contains the header and no pixel data */
108
+ BOOL has_pixels;
109
+
110
+ /** optionally contains a thumbnail attached to the bitmap */
111
+ FIBITMAP *thumbnail;
112
+
113
+ /**@name external pixel buffer management */
114
+ //@{
115
+ /** pointer to user provided pixels, NULL otherwise */
116
+ BYTE *external_bits;
117
+ /** user provided pitch, 0 otherwise */
118
+ unsigned external_pitch;
119
+ //@}
120
+
121
+ //BYTE filler[1]; // fill to 32-bit alignment
122
+ };
123
+
124
+ // ----------------------------------------------------------
125
+ // FREEIMAGERGBMASKS definition
126
+ // ----------------------------------------------------------
127
+
128
+ /**
129
+ RGB mask structure - mainly used for 16-bit RGB555 / RGB 565 FIBITMAP
130
+ */
131
+ FI_STRUCT (FREEIMAGERGBMASKS) {
132
+ unsigned red_mask; //! bit layout of the red components
133
+ unsigned green_mask; //! bit layout of the green components
134
+ unsigned blue_mask; //! bit layout of the blue components
135
+ };
136
+
137
+ // ----------------------------------------------------------
138
+ // Memory allocation on a specified alignment boundary
139
+ // ----------------------------------------------------------
140
+
141
+ #if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32__)
142
+
143
+ void* FreeImage_Aligned_Malloc(size_t amount, size_t alignment) {
144
+ assert(alignment == FIBITMAP_ALIGNMENT);
145
+ return _aligned_malloc(amount, alignment);
146
+ }
147
+
148
+ void FreeImage_Aligned_Free(void* mem) {
149
+ _aligned_free(mem);
150
+ }
151
+
152
+ #elif defined (__MINGW32__)
153
+
154
+ void* FreeImage_Aligned_Malloc(size_t amount, size_t alignment) {
155
+ assert(alignment == FIBITMAP_ALIGNMENT);
156
+ return __mingw_aligned_malloc (amount, alignment);
157
+ }
158
+
159
+ void FreeImage_Aligned_Free(void* mem) {
160
+ __mingw_aligned_free (mem);
161
+ }
162
+
163
+ #else
164
+
165
+ void* FreeImage_Aligned_Malloc(size_t amount, size_t alignment) {
166
+ assert(alignment == FIBITMAP_ALIGNMENT);
167
+ /*
168
+ In some rare situations, the malloc routines can return misaligned memory.
169
+ The routine FreeImage_Aligned_Malloc allocates a bit more memory to do
170
+ aligned writes. Normally, it *should* allocate "alignment" extra memory and then writes
171
+ one dword back the true pointer. But if the memory manager returns a
172
+ misaligned block that is less than a dword from the next alignment,
173
+ then the writing back one dword will corrupt memory.
174
+
175
+ For example, suppose that alignment is 16 and malloc returns the address 0xFFFF.
176
+
177
+ 16 - 0xFFFF % 16 + 0xFFFF = 16 - 15 + 0xFFFF = 0x10000.
178
+
179
+ Now, you subtract one dword from that and write and that will corrupt memory.
180
+
181
+ That's why the code below allocates *two* alignments instead of one.
182
+ */
183
+ void* mem_real = malloc(amount + 2 * alignment);
184
+ if(!mem_real) return NULL;
185
+ char* mem_align = (char*)((unsigned long)(2 * alignment - (unsigned long)mem_real % (unsigned long)alignment) + (unsigned long)mem_real);
186
+ *((long*)mem_align - 1) = (long)mem_real;
187
+ return mem_align;
188
+ }
189
+
190
+ void FreeImage_Aligned_Free(void* mem) {
191
+ free((void*)*((long*)mem - 1));
192
+ }
193
+
194
+ #endif // _WIN32 || _WIN64
195
+
196
+ // ----------------------------------------------------------
197
+ // FIBITMAP memory management
198
+ // ----------------------------------------------------------
199
+
200
+ /**
201
+ Calculate the size of a FreeImage image.
202
+ Align the palette and the pixels on a FIBITMAP_ALIGNMENT bytes alignment boundary.
203
+ This function includes a protection against malicious images, based on a KISS integer overflow detection mechanism.
204
+
205
+ @param header_only If TRUE, calculate a 'header only' FIBITMAP size, otherwise calculate a full FIBITMAP size
206
+ @param width Image width
207
+ @param height Image height
208
+ @param bpp Number of bits-per-pixel
209
+ @param need_masks We only store the masks (and allocate memory for them) for 16-bit images of type FIT_BITMAP
210
+ @return Returns a size in BYTE units
211
+ @see FreeImage_AllocateBitmap
212
+ */
213
+ static size_t
214
+ FreeImage_GetInternalImageSize(BOOL header_only, unsigned width, unsigned height, unsigned bpp, BOOL need_masks) {
215
+ size_t dib_size = sizeof(FREEIMAGEHEADER);
216
+ dib_size += (dib_size % FIBITMAP_ALIGNMENT ? FIBITMAP_ALIGNMENT - dib_size % FIBITMAP_ALIGNMENT : 0);
217
+ dib_size += FIBITMAP_ALIGNMENT - sizeof(BITMAPINFOHEADER) % FIBITMAP_ALIGNMENT;
218
+ dib_size += sizeof(BITMAPINFOHEADER);
219
+ // palette is aligned on a 16 bytes boundary
220
+ dib_size += sizeof(RGBQUAD) * CalculateUsedPaletteEntries(bpp);
221
+ // we both add palette size and masks size if need_masks is true, since CalculateUsedPaletteEntries
222
+ // always returns 0 if need_masks is true (which is only true for 16 bit images).
223
+ dib_size += need_masks ? sizeof(DWORD) * 3 : 0;
224
+ dib_size += (dib_size % FIBITMAP_ALIGNMENT ? FIBITMAP_ALIGNMENT - dib_size % FIBITMAP_ALIGNMENT : 0);
225
+
226
+ if(!header_only) {
227
+ const size_t header_size = dib_size;
228
+
229
+ // pixels are aligned on a 16 bytes boundary
230
+ dib_size += (size_t)CalculatePitch(CalculateLine(width, bpp)) * (size_t)height;
231
+
232
+ // check for possible malloc overflow using a KISS integer overflow detection mechanism
233
+ {
234
+ const double dPitch = floor( ((double)bpp * width + 31.0) / 32.0 ) * 4.0;
235
+ const double dImageSize = (double)header_size + dPitch * height;
236
+ if(dImageSize != (double)dib_size) {
237
+ // here, we are sure to encounter a malloc overflow: try to avoid it ...
238
+ return 0;
239
+ }
240
+
241
+ /*
242
+ The following constant take into account the additionnal memory used by
243
+ aligned malloc functions as well as debug malloc functions.
244
+ It is supposed here that using a (8 * FIBITMAP_ALIGNMENT) risk margin will be enough
245
+ for the target compiler.
246
+ */
247
+ const double FIBITMAP_MAX_MEMORY = (double)((size_t)-1) - 8 * FIBITMAP_ALIGNMENT;
248
+
249
+ if(dImageSize > FIBITMAP_MAX_MEMORY) {
250
+ // avoid possible overflow inside C allocation functions
251
+ return 0;
252
+ }
253
+ }
254
+ }
255
+
256
+ return dib_size;
257
+ }
258
+
259
+ /**
260
+ Helper for 16-bit FIT_BITMAP
261
+ Returns a pointer to the bitmap's red-, green- and blue masks.
262
+ @param dib The bitmap to obtain masks from.
263
+ @return Returns a pointer to the bitmap's red-, green- and blue masks
264
+ or NULL, if no masks are present (e.g. for 24 bit images).
265
+ */
266
+ static FREEIMAGERGBMASKS *
267
+ FreeImage_GetRGBMasks(FIBITMAP *dib) {
268
+ return FreeImage_HasRGBMasks(dib) ? (FREEIMAGERGBMASKS *)(((BYTE *)FreeImage_GetInfoHeader(dib)) + sizeof(BITMAPINFOHEADER)) : NULL;
269
+ }
270
+
271
+ /**
272
+ Internal FIBITMAP allocation.
273
+
274
+ This function accepts (ext_bits, ext_pitch) arguments. If these are provided the FIBITMAP
275
+ will be allocated as "header only", but bits and pitch will be stored within the FREEIMAGEHEADER
276
+ and the resulting FIBITMAP will have pixels, i.e. HasPixels() will return TRUE.
277
+ - GetBits() and GetPitch return the correct values - either offsets or the stored values (user-provided bits and pitch).
278
+ - Clone() creates a new FIBITMAP with copy of the user pixel data.
279
+ - Unload's implementation does not need to change - it just release a "header only" dib.
280
+ Note that when using external data, the data does not need to have the same alignment as the default 4-byte alignment.
281
+ This enables the possibility to access buffers with, for instance, stricter alignment,
282
+ like the ones used in low-level APIs like OpenCL or intrinsics.
283
+
284
+ @param header_only If TRUE, allocate a 'header only' FIBITMAP, otherwise allocate a full FIBITMAP
285
+ @param ext_bits Pointer to external user's pixel buffer if using wrapped buffer, NULL otherwise
286
+ @param ext_pitch Pointer to external user's pixel buffer pitch if using wrapped buffer, 0 otherwise
287
+ @param type Image type
288
+ @param width Image width
289
+ @param height Image height
290
+ @param bpp Number of bits per pixel
291
+ @param red_mask Image red mask
292
+ @param green_mask Image green mask
293
+ @param blue_mask Image blue mask
294
+ @return Returns the allocated FIBITMAP if successful, returns NULL otherwise
295
+ */
296
+ static FIBITMAP *
297
+ FreeImage_AllocateBitmap(BOOL header_only, BYTE *ext_bits, unsigned ext_pitch, FREE_IMAGE_TYPE type, int width, int height, int bpp, unsigned red_mask, unsigned green_mask, unsigned blue_mask) {
298
+
299
+ // check input variables
300
+ width = abs(width);
301
+ height = abs(height);
302
+ if(!((width > 0) && (height > 0))) {
303
+ return NULL;
304
+ }
305
+ if(ext_bits) {
306
+ if(ext_pitch == 0) {
307
+ return NULL;
308
+ }
309
+ assert(header_only == FALSE);
310
+ }
311
+
312
+ // we only store the masks (and allocate memory for them) for 16-bit images of type FIT_BITMAP
313
+ BOOL need_masks = FALSE;
314
+
315
+ // check pixel bit depth
316
+ switch(type) {
317
+ case FIT_BITMAP:
318
+ switch(bpp) {
319
+ case 1:
320
+ case 4:
321
+ case 8:
322
+ break;
323
+ case 16:
324
+ need_masks = TRUE;
325
+ break;
326
+ case 24:
327
+ case 32:
328
+ break;
329
+ default:
330
+ bpp = 8;
331
+ break;
332
+ }
333
+ break;
334
+ case FIT_UINT16:
335
+ bpp = 8 * sizeof(unsigned short);
336
+ break;
337
+ case FIT_INT16:
338
+ bpp = 8 * sizeof(short);
339
+ break;
340
+ case FIT_UINT32:
341
+ bpp = 8 * sizeof(DWORD);
342
+ break;
343
+ case FIT_INT32:
344
+ bpp = 8 * sizeof(LONG);
345
+ break;
346
+ case FIT_FLOAT:
347
+ bpp = 8 * sizeof(float);
348
+ break;
349
+ case FIT_DOUBLE:
350
+ bpp = 8 * sizeof(double);
351
+ break;
352
+ case FIT_COMPLEX:
353
+ bpp = 8 * sizeof(FICOMPLEX);
354
+ break;
355
+ case FIT_RGB16:
356
+ bpp = 8 * sizeof(FIRGB16);
357
+ break;
358
+ case FIT_RGBA16:
359
+ bpp = 8 * sizeof(FIRGBA16);
360
+ break;
361
+ case FIT_RGBF:
362
+ bpp = 8 * sizeof(FIRGBF);
363
+ break;
364
+ case FIT_RGBAF:
365
+ bpp = 8 * sizeof(FIRGBAF);
366
+ break;
367
+ default:
368
+ return NULL;
369
+ }
370
+
371
+ FIBITMAP *bitmap = (FIBITMAP *)malloc(sizeof(FIBITMAP));
372
+
373
+ if (bitmap != NULL) {
374
+
375
+ // calculate the size of a FreeImage image
376
+ // align the palette and the pixels on a FIBITMAP_ALIGNMENT bytes alignment boundary
377
+ // palette is aligned on a 16 bytes boundary
378
+ // pixels are aligned on a 16 bytes boundary
379
+
380
+ // when using a user provided pixel buffer, force a 'header only' allocation
381
+
382
+ size_t dib_size = FreeImage_GetInternalImageSize(header_only || ext_bits, width, height, bpp, need_masks);
383
+
384
+ if(dib_size == 0) {
385
+ // memory allocation will fail (probably a malloc overflow)
386
+ free(bitmap);
387
+ return NULL;
388
+ }
389
+
390
+ bitmap->data = (BYTE *)FreeImage_Aligned_Malloc(dib_size * sizeof(BYTE), FIBITMAP_ALIGNMENT);
391
+
392
+ if (bitmap->data != NULL) {
393
+ memset(bitmap->data, 0, dib_size);
394
+
395
+ // write out the FREEIMAGEHEADER
396
+
397
+ FREEIMAGEHEADER *fih = (FREEIMAGEHEADER *)bitmap->data;
398
+
399
+ fih->type = type;
400
+
401
+ memset(&fih->bkgnd_color, 0, sizeof(RGBQUAD));
402
+
403
+ fih->transparent = FALSE;
404
+ fih->transparency_count = 0;
405
+ memset(fih->transparent_table, 0xff, 256);
406
+
407
+ fih->has_pixels = header_only ? FALSE : TRUE;
408
+
409
+ // initialize FIICCPROFILE link
410
+
411
+ FIICCPROFILE *iccProfile = FreeImage_GetICCProfile(bitmap);
412
+ iccProfile->size = 0;
413
+ iccProfile->data = 0;
414
+ iccProfile->flags = 0;
415
+
416
+ // initialize metadata models list
417
+
418
+ fih->metadata = new(std::nothrow) METADATAMAP;
419
+
420
+ // initialize attached thumbnail
421
+
422
+ fih->thumbnail = NULL;
423
+
424
+ // store a pointer to user provided pixel buffer (if any)
425
+
426
+ fih->external_bits = ext_bits;
427
+ fih->external_pitch = ext_pitch;
428
+
429
+ // write out the BITMAPINFOHEADER
430
+
431
+ BITMAPINFOHEADER *bih = FreeImage_GetInfoHeader(bitmap);
432
+ bih->biSize = sizeof(BITMAPINFOHEADER);
433
+ bih->biWidth = width;
434
+ bih->biHeight = height;
435
+ bih->biPlanes = 1;
436
+ bih->biCompression = need_masks ? BI_BITFIELDS : BI_RGB;
437
+ bih->biBitCount = (WORD)bpp;
438
+ bih->biClrUsed = CalculateUsedPaletteEntries(bpp);
439
+ bih->biClrImportant = bih->biClrUsed;
440
+ bih->biXPelsPerMeter = 2835; // 72 dpi
441
+ bih->biYPelsPerMeter = 2835; // 72 dpi
442
+
443
+ if(bpp == 8) {
444
+ // build a default greyscale palette (very useful for image processing)
445
+ RGBQUAD *pal = FreeImage_GetPalette(bitmap);
446
+ for(int i = 0; i < 256; i++) {
447
+ pal[i].rgbRed = (BYTE)i;
448
+ pal[i].rgbGreen = (BYTE)i;
449
+ pal[i].rgbBlue = (BYTE)i;
450
+ }
451
+ }
452
+
453
+ // just setting the masks (only if needed) just like the palette.
454
+ if (need_masks) {
455
+ FREEIMAGERGBMASKS *masks = FreeImage_GetRGBMasks(bitmap);
456
+ masks->red_mask = red_mask;
457
+ masks->green_mask = green_mask;
458
+ masks->blue_mask = blue_mask;
459
+ }
460
+
461
+ return bitmap;
462
+ }
463
+
464
+ free(bitmap);
465
+ }
466
+
467
+ return NULL;
468
+ }
469
+
470
+ FIBITMAP * DLL_CALLCONV
471
+ FreeImage_AllocateHeaderForBits(BYTE *ext_bits, unsigned ext_pitch, FREE_IMAGE_TYPE type, int width, int height, int bpp, unsigned red_mask, unsigned green_mask, unsigned blue_mask) {
472
+ return FreeImage_AllocateBitmap(FALSE, ext_bits, ext_pitch, type, width, height, bpp, red_mask, green_mask, blue_mask);
473
+ }
474
+
475
+ FIBITMAP * DLL_CALLCONV
476
+ FreeImage_AllocateHeaderT(BOOL header_only, FREE_IMAGE_TYPE type, int width, int height, int bpp, unsigned red_mask, unsigned green_mask, unsigned blue_mask) {
477
+ return FreeImage_AllocateBitmap(header_only, NULL, 0, type, width, height, bpp, red_mask, green_mask, blue_mask);
478
+ }
479
+
480
+ FIBITMAP * DLL_CALLCONV
481
+ FreeImage_AllocateHeader(BOOL header_only, int width, int height, int bpp, unsigned red_mask, unsigned green_mask, unsigned blue_mask) {
482
+ return FreeImage_AllocateBitmap(header_only, NULL, 0, FIT_BITMAP, width, height, bpp, red_mask, green_mask, blue_mask);
483
+ }
484
+
485
+ FIBITMAP * DLL_CALLCONV
486
+ FreeImage_Allocate(int width, int height, int bpp, unsigned red_mask, unsigned green_mask, unsigned blue_mask) {
487
+ return FreeImage_AllocateBitmap(FALSE, NULL, 0, FIT_BITMAP, width, height, bpp, red_mask, green_mask, blue_mask);
488
+ }
489
+
490
+ FIBITMAP * DLL_CALLCONV
491
+ FreeImage_AllocateT(FREE_IMAGE_TYPE type, int width, int height, int bpp, unsigned red_mask, unsigned green_mask, unsigned blue_mask) {
492
+ return FreeImage_AllocateBitmap(FALSE, NULL, 0, type, width, height, bpp, red_mask, green_mask, blue_mask);
493
+ }
494
+
495
+ void DLL_CALLCONV
496
+ FreeImage_Unload(FIBITMAP *dib) {
497
+ if (NULL != dib) {
498
+ if (NULL != dib->data) {
499
+ // delete possible icc profile ...
500
+ if (FreeImage_GetICCProfile(dib)->data) {
501
+ free(FreeImage_GetICCProfile(dib)->data);
502
+ }
503
+
504
+ // delete metadata models
505
+ METADATAMAP *metadata = ((FREEIMAGEHEADER *)dib->data)->metadata;
506
+
507
+ for(METADATAMAP::iterator i = (*metadata).begin(); i != (*metadata).end(); i++) {
508
+ TAGMAP *tagmap = (*i).second;
509
+
510
+ if(tagmap) {
511
+ for(TAGMAP::iterator j = tagmap->begin(); j != tagmap->end(); j++) {
512
+ FITAG *tag = (*j).second;
513
+ FreeImage_DeleteTag(tag);
514
+ }
515
+
516
+ delete tagmap;
517
+ }
518
+ }
519
+
520
+ delete metadata;
521
+
522
+ // delete embedded thumbnail
523
+ FreeImage_Unload(FreeImage_GetThumbnail(dib));
524
+
525
+ // delete bitmap ...
526
+ FreeImage_Aligned_Free(dib->data);
527
+ }
528
+
529
+ free(dib); // ... and the wrapper
530
+ }
531
+ }
532
+
533
+ // ----------------------------------------------------------
534
+
535
+ FIBITMAP * DLL_CALLCONV
536
+ FreeImage_Clone(FIBITMAP *dib) {
537
+ if(!dib) {
538
+ return NULL;
539
+ }
540
+
541
+ FREE_IMAGE_TYPE type = FreeImage_GetImageType(dib);
542
+ unsigned width = FreeImage_GetWidth(dib);
543
+ unsigned height = FreeImage_GetHeight(dib);
544
+ unsigned bpp = FreeImage_GetBPP(dib);
545
+
546
+ const BYTE *ext_bits = ((FREEIMAGEHEADER *)dib->data)->external_bits;
547
+
548
+ // check for pixel availability ...
549
+ BOOL header_only = FreeImage_HasPixels(dib) ? FALSE : TRUE;
550
+
551
+ // check whether this image has masks defined ...
552
+ BOOL need_masks = (bpp == 16 && type == FIT_BITMAP) ? TRUE : FALSE;
553
+
554
+ // allocate a new dib
555
+ FIBITMAP *new_dib = FreeImage_AllocateHeaderT(header_only, type, width, height, bpp,
556
+ FreeImage_GetRedMask(dib), FreeImage_GetGreenMask(dib), FreeImage_GetBlueMask(dib));
557
+
558
+ if (new_dib) {
559
+ // save ICC profile links
560
+ FIICCPROFILE *src_iccProfile = FreeImage_GetICCProfile(dib);
561
+ FIICCPROFILE *dst_iccProfile = FreeImage_GetICCProfile(new_dib);
562
+
563
+ // save metadata links
564
+ METADATAMAP *src_metadata = ((FREEIMAGEHEADER *)dib->data)->metadata;
565
+ METADATAMAP *dst_metadata = ((FREEIMAGEHEADER *)new_dib->data)->metadata;
566
+
567
+ // calculate the size of the src image
568
+ // align the palette and the pixels on a FIBITMAP_ALIGNMENT bytes alignment boundary
569
+ // palette is aligned on a 16 bytes boundary
570
+ // pixels are aligned on a 16 bytes boundary
571
+
572
+ // when using a user provided pixel buffer, force a 'header only' calculation
573
+
574
+ size_t dib_size = FreeImage_GetInternalImageSize(header_only || ext_bits, width, height, bpp, need_masks);
575
+
576
+ // copy the bitmap + internal pointers (remember to restore new_dib internal pointers later)
577
+ memcpy(new_dib->data, dib->data, dib_size);
578
+
579
+ // reset ICC profile link for new_dib
580
+ memset(dst_iccProfile, 0, sizeof(FIICCPROFILE));
581
+
582
+ // restore metadata link for new_dib
583
+ ((FREEIMAGEHEADER *)new_dib->data)->metadata = dst_metadata;
584
+
585
+ // reset thumbnail link for new_dib
586
+ ((FREEIMAGEHEADER *)new_dib->data)->thumbnail = NULL;
587
+
588
+ // copy possible ICC profile
589
+ FreeImage_CreateICCProfile(new_dib, src_iccProfile->data, src_iccProfile->size);
590
+ dst_iccProfile->flags = src_iccProfile->flags;
591
+
592
+ // copy metadata models
593
+ for(METADATAMAP::iterator i = (*src_metadata).begin(); i != (*src_metadata).end(); i++) {
594
+ int model = (*i).first;
595
+ TAGMAP *src_tagmap = (*i).second;
596
+
597
+ if(src_tagmap) {
598
+ // create a metadata model
599
+ TAGMAP *dst_tagmap = new(std::nothrow) TAGMAP();
600
+
601
+ if(dst_tagmap) {
602
+ // fill the model
603
+ for(TAGMAP::iterator j = src_tagmap->begin(); j != src_tagmap->end(); j++) {
604
+ std::string dst_key = (*j).first;
605
+ FITAG *dst_tag = FreeImage_CloneTag( (*j).second );
606
+
607
+ // assign key and tag value
608
+ (*dst_tagmap)[dst_key] = dst_tag;
609
+ }
610
+
611
+ // assign model and tagmap
612
+ (*dst_metadata)[model] = dst_tagmap;
613
+ }
614
+ }
615
+ }
616
+
617
+ // copy the thumbnail
618
+ FreeImage_SetThumbnail(new_dib, FreeImage_GetThumbnail(dib));
619
+
620
+ // copy user provided pixel buffer (if any)
621
+ if(ext_bits) {
622
+ const unsigned pitch = FreeImage_GetPitch(dib);
623
+ const unsigned linesize = FreeImage_GetLine(dib);
624
+ for(unsigned y = 0; y < height; y++) {
625
+ memcpy(FreeImage_GetScanLine(new_dib, y), ext_bits, linesize);
626
+ ext_bits += pitch;
627
+ }
628
+ }
629
+
630
+ return new_dib;
631
+ }
632
+
633
+ return NULL;
634
+ }
635
+
636
+ // ----------------------------------------------------------
637
+
638
+ BYTE * DLL_CALLCONV
639
+ FreeImage_GetBits(FIBITMAP *dib) {
640
+ if(!FreeImage_HasPixels(dib)) {
641
+ return NULL;
642
+ }
643
+
644
+ if(((FREEIMAGEHEADER *)dib->data)->external_bits) {
645
+ return ((FREEIMAGEHEADER *)dib->data)->external_bits;
646
+ }
647
+
648
+ // returns the pixels aligned on a FIBITMAP_ALIGNMENT bytes alignment boundary
649
+ size_t lp = (size_t)FreeImage_GetInfoHeader(dib);
650
+ lp += sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * FreeImage_GetColorsUsed(dib);
651
+ lp += FreeImage_HasRGBMasks(dib) ? sizeof(DWORD) * 3 : 0;
652
+ lp += (lp % FIBITMAP_ALIGNMENT ? FIBITMAP_ALIGNMENT - lp % FIBITMAP_ALIGNMENT : 0);
653
+ return (BYTE *)lp;
654
+ }
655
+
656
+ // ----------------------------------------------------------
657
+ // DIB information functions
658
+ // ----------------------------------------------------------
659
+
660
+ FIBITMAP* DLL_CALLCONV
661
+ FreeImage_GetThumbnail(FIBITMAP *dib) {
662
+ return (dib != NULL) ? ((FREEIMAGEHEADER *)dib->data)->thumbnail : NULL;
663
+ }
664
+
665
+ BOOL DLL_CALLCONV
666
+ FreeImage_SetThumbnail(FIBITMAP *dib, FIBITMAP *thumbnail) {
667
+ if(dib == NULL) {
668
+ return FALSE;
669
+ }
670
+ FIBITMAP *currentThumbnail = ((FREEIMAGEHEADER *)dib->data)->thumbnail;
671
+ if(currentThumbnail == thumbnail) {
672
+ return TRUE;
673
+ }
674
+ FreeImage_Unload(currentThumbnail);
675
+
676
+ ((FREEIMAGEHEADER *)dib->data)->thumbnail = FreeImage_HasPixels(thumbnail) ? FreeImage_Clone(thumbnail) : NULL;
677
+
678
+ return TRUE;
679
+ }
680
+
681
+ // ----------------------------------------------------------
682
+
683
+ FREE_IMAGE_COLOR_TYPE DLL_CALLCONV
684
+ FreeImage_GetColorType(FIBITMAP *dib) {
685
+ RGBQUAD *rgb;
686
+
687
+ const FREE_IMAGE_TYPE image_type = FreeImage_GetImageType(dib);
688
+
689
+ // special bitmap type
690
+ if(image_type != FIT_BITMAP) {
691
+ switch(image_type) {
692
+ case FIT_UINT16:
693
+ {
694
+ // 16-bit greyscale TIF can be either FIC_MINISBLACK (the most common case) or FIC_MINISWHITE
695
+ // you can check this using EXIF_MAIN metadata
696
+ FITAG *photometricTag = NULL;
697
+ if(FreeImage_GetMetadata(FIMD_EXIF_MAIN, dib, "PhotometricInterpretation", &photometricTag)) {
698
+ const short *value = (short*)FreeImage_GetTagValue(photometricTag);
699
+ // PHOTOMETRIC_MINISWHITE = 0 => min value is white
700
+ // PHOTOMETRIC_MINISBLACK = 1 => min value is black
701
+ return (*value == 0) ? FIC_MINISWHITE : FIC_MINISBLACK;
702
+ }
703
+ return FIC_MINISBLACK;
704
+ }
705
+ break;
706
+ case FIT_RGB16:
707
+ case FIT_RGBF:
708
+ return FIC_RGB;
709
+ case FIT_RGBA16:
710
+ case FIT_RGBAF:
711
+ return FIC_RGBALPHA;
712
+ }
713
+
714
+ return FIC_MINISBLACK;
715
+ }
716
+
717
+ // standard image type
718
+ switch (FreeImage_GetBPP(dib)) {
719
+ case 1:
720
+ {
721
+ rgb = FreeImage_GetPalette(dib);
722
+
723
+ if ((rgb->rgbRed == 0) && (rgb->rgbGreen == 0) && (rgb->rgbBlue == 0)) {
724
+ rgb++;
725
+
726
+ if ((rgb->rgbRed == 255) && (rgb->rgbGreen == 255) && (rgb->rgbBlue == 255)) {
727
+ return FIC_MINISBLACK;
728
+ }
729
+ }
730
+
731
+ if ((rgb->rgbRed == 255) && (rgb->rgbGreen == 255) && (rgb->rgbBlue == 255)) {
732
+ rgb++;
733
+
734
+ if ((rgb->rgbRed == 0) && (rgb->rgbGreen == 0) && (rgb->rgbBlue == 0)) {
735
+ return FIC_MINISWHITE;
736
+ }
737
+ }
738
+
739
+ return FIC_PALETTE;
740
+ }
741
+
742
+ case 4:
743
+ case 8: // Check if the DIB has a color or a greyscale palette
744
+ {
745
+ int ncolors = FreeImage_GetColorsUsed(dib);
746
+ int minisblack = 1;
747
+ rgb = FreeImage_GetPalette(dib);
748
+
749
+ for (int i = 0; i < ncolors; i++) {
750
+ if ((rgb->rgbRed != rgb->rgbGreen) || (rgb->rgbRed != rgb->rgbBlue)) {
751
+ return FIC_PALETTE;
752
+ }
753
+
754
+ // The DIB has a color palette if the greyscale isn't a linear ramp
755
+ // Take care of reversed grey images
756
+ if (rgb->rgbRed != i) {
757
+ if ((ncolors-i-1) != rgb->rgbRed) {
758
+ return FIC_PALETTE;
759
+ } else {
760
+ minisblack = 0;
761
+ }
762
+ }
763
+
764
+ rgb++;
765
+ }
766
+
767
+ return minisblack ? FIC_MINISBLACK : FIC_MINISWHITE;
768
+ }
769
+
770
+ case 16:
771
+ case 24:
772
+ return FIC_RGB;
773
+
774
+ case 32:
775
+ {
776
+ if (FreeImage_GetICCProfile(dib)->flags & FIICC_COLOR_IS_CMYK) {
777
+ return FIC_CMYK;
778
+ }
779
+
780
+ if( FreeImage_HasPixels(dib) ) {
781
+ // check for fully opaque alpha layer
782
+ for (unsigned y = 0; y < FreeImage_GetHeight(dib); y++) {
783
+ rgb = (RGBQUAD *)FreeImage_GetScanLine(dib, y);
784
+
785
+ for (unsigned x = 0; x < FreeImage_GetWidth(dib); x++) {
786
+ if (rgb[x].rgbReserved != 0xFF) {
787
+ return FIC_RGBALPHA;
788
+ }
789
+ }
790
+ }
791
+ return FIC_RGB;
792
+ }
793
+
794
+ return FIC_RGBALPHA;
795
+ }
796
+
797
+ default :
798
+ return FIC_MINISBLACK;
799
+ }
800
+ }
801
+
802
+ // ----------------------------------------------------------
803
+
804
+ FREE_IMAGE_TYPE DLL_CALLCONV
805
+ FreeImage_GetImageType(FIBITMAP *dib) {
806
+ return (dib != NULL) ? ((FREEIMAGEHEADER *)dib->data)->type : FIT_UNKNOWN;
807
+ }
808
+
809
+ // ----------------------------------------------------------
810
+
811
+ BOOL DLL_CALLCONV
812
+ FreeImage_HasPixels(FIBITMAP *dib) {
813
+ return (dib != NULL) ? ((FREEIMAGEHEADER *)dib->data)->has_pixels : FALSE;
814
+ }
815
+
816
+ // ----------------------------------------------------------
817
+
818
+ BOOL DLL_CALLCONV
819
+ FreeImage_HasRGBMasks(FIBITMAP *dib) {
820
+ return dib && FreeImage_GetInfoHeader(dib)->biCompression == BI_BITFIELDS;
821
+ }
822
+
823
+ unsigned DLL_CALLCONV
824
+ FreeImage_GetRedMask(FIBITMAP *dib) {
825
+ FREEIMAGERGBMASKS *masks = NULL;
826
+ FREE_IMAGE_TYPE image_type = FreeImage_GetImageType(dib);
827
+ switch(image_type) {
828
+ case FIT_BITMAP:
829
+ // check for 16-bit RGB (565 or 555)
830
+ masks = FreeImage_GetRGBMasks(dib);
831
+ if (masks) {
832
+ return masks->red_mask;
833
+ }
834
+ return FreeImage_GetBPP(dib) >= 24 ? FI_RGBA_RED_MASK : 0;
835
+ default:
836
+ return 0;
837
+ }
838
+ }
839
+
840
+ unsigned DLL_CALLCONV
841
+ FreeImage_GetGreenMask(FIBITMAP *dib) {
842
+ FREEIMAGERGBMASKS *masks = NULL;
843
+ FREE_IMAGE_TYPE image_type = FreeImage_GetImageType(dib);
844
+ switch(image_type) {
845
+ case FIT_BITMAP:
846
+ // check for 16-bit RGB (565 or 555)
847
+ masks = FreeImage_GetRGBMasks(dib);
848
+ if (masks) {
849
+ return masks->green_mask;
850
+ }
851
+ return FreeImage_GetBPP(dib) >= 24 ? FI_RGBA_GREEN_MASK : 0;
852
+ default:
853
+ return 0;
854
+ }
855
+ }
856
+
857
+ unsigned DLL_CALLCONV
858
+ FreeImage_GetBlueMask(FIBITMAP *dib) {
859
+ FREEIMAGERGBMASKS *masks = NULL;
860
+ FREE_IMAGE_TYPE image_type = FreeImage_GetImageType(dib);
861
+ switch(image_type) {
862
+ case FIT_BITMAP:
863
+ // check for 16-bit RGB (565 or 555)
864
+ masks = FreeImage_GetRGBMasks(dib);
865
+ if (masks) {
866
+ return masks->blue_mask;
867
+ }
868
+ return FreeImage_GetBPP(dib) >= 24 ? FI_RGBA_BLUE_MASK : 0;
869
+ default:
870
+ return 0;
871
+ }
872
+ }
873
+
874
+ // ----------------------------------------------------------
875
+
876
+ BOOL DLL_CALLCONV
877
+ FreeImage_HasBackgroundColor(FIBITMAP *dib) {
878
+ if(dib) {
879
+ RGBQUAD *bkgnd_color = &((FREEIMAGEHEADER *)dib->data)->bkgnd_color;
880
+ return (bkgnd_color->rgbReserved != 0) ? TRUE : FALSE;
881
+ }
882
+ return FALSE;
883
+ }
884
+
885
+ BOOL DLL_CALLCONV
886
+ FreeImage_GetBackgroundColor(FIBITMAP *dib, RGBQUAD *bkcolor) {
887
+ if(dib && bkcolor) {
888
+ if(FreeImage_HasBackgroundColor(dib)) {
889
+ // get the background color
890
+ RGBQUAD *bkgnd_color = &((FREEIMAGEHEADER *)dib->data)->bkgnd_color;
891
+ memcpy(bkcolor, bkgnd_color, sizeof(RGBQUAD));
892
+ // get the background index
893
+ if(FreeImage_GetBPP(dib) == 8) {
894
+ RGBQUAD *pal = FreeImage_GetPalette(dib);
895
+ for(unsigned i = 0; i < FreeImage_GetColorsUsed(dib); i++) {
896
+ if(bkgnd_color->rgbRed == pal[i].rgbRed) {
897
+ if(bkgnd_color->rgbGreen == pal[i].rgbGreen) {
898
+ if(bkgnd_color->rgbBlue == pal[i].rgbBlue) {
899
+ bkcolor->rgbReserved = (BYTE)i;
900
+ return TRUE;
901
+ }
902
+ }
903
+ }
904
+ }
905
+ }
906
+
907
+ bkcolor->rgbReserved = 0;
908
+
909
+ return TRUE;
910
+ }
911
+ }
912
+
913
+ return FALSE;
914
+ }
915
+
916
+ BOOL DLL_CALLCONV
917
+ FreeImage_SetBackgroundColor(FIBITMAP *dib, RGBQUAD *bkcolor) {
918
+ if(dib) {
919
+ RGBQUAD *bkgnd_color = &((FREEIMAGEHEADER *)dib->data)->bkgnd_color;
920
+ if(bkcolor) {
921
+ // set the background color
922
+ memcpy(bkgnd_color, bkcolor, sizeof(RGBQUAD));
923
+ // enable the file background color
924
+ bkgnd_color->rgbReserved = 1;
925
+ } else {
926
+ // clear and disable the file background color
927
+ memset(bkgnd_color, 0, sizeof(RGBQUAD));
928
+ }
929
+ return TRUE;
930
+ }
931
+
932
+ return FALSE;
933
+ }
934
+
935
+ // ----------------------------------------------------------
936
+
937
+ BOOL DLL_CALLCONV
938
+ FreeImage_IsTransparent(FIBITMAP *dib) {
939
+ if(dib) {
940
+ FREE_IMAGE_TYPE image_type = FreeImage_GetImageType(dib);
941
+ switch(image_type) {
942
+ case FIT_BITMAP:
943
+ if(FreeImage_GetBPP(dib) == 32) {
944
+ if(FreeImage_GetColorType(dib) == FIC_RGBALPHA) {
945
+ return TRUE;
946
+ }
947
+ } else {
948
+ return ((FREEIMAGEHEADER *)dib->data)->transparent ? TRUE : FALSE;
949
+ }
950
+ break;
951
+ case FIT_RGBA16:
952
+ case FIT_RGBAF:
953
+ return TRUE;
954
+ default:
955
+ break;
956
+ }
957
+ }
958
+ return FALSE;
959
+ }
960
+
961
+ BYTE * DLL_CALLCONV
962
+ FreeImage_GetTransparencyTable(FIBITMAP *dib) {
963
+ return dib ? ((FREEIMAGEHEADER *)dib->data)->transparent_table : NULL;
964
+ }
965
+
966
+ void DLL_CALLCONV
967
+ FreeImage_SetTransparent(FIBITMAP *dib, BOOL enabled) {
968
+ if (dib) {
969
+ if ((FreeImage_GetBPP(dib) <= 8) || (FreeImage_GetBPP(dib) == 32)) {
970
+ ((FREEIMAGEHEADER *)dib->data)->transparent = enabled;
971
+ } else {
972
+ ((FREEIMAGEHEADER *)dib->data)->transparent = FALSE;
973
+ }
974
+ }
975
+ }
976
+
977
+ unsigned DLL_CALLCONV
978
+ FreeImage_GetTransparencyCount(FIBITMAP *dib) {
979
+ return dib ? ((FREEIMAGEHEADER *)dib->data)->transparency_count : 0;
980
+ }
981
+
982
+ void DLL_CALLCONV
983
+ FreeImage_SetTransparencyTable(FIBITMAP *dib, BYTE *table, int count) {
984
+ if (dib) {
985
+ count = MAX(0, MIN(count, 256));
986
+ if (FreeImage_GetBPP(dib) <= 8) {
987
+ ((FREEIMAGEHEADER *)dib->data)->transparent = (count > 0) ? TRUE : FALSE;
988
+ ((FREEIMAGEHEADER *)dib->data)->transparency_count = count;
989
+
990
+ if (table) {
991
+ memcpy(((FREEIMAGEHEADER *)dib->data)->transparent_table, table, count);
992
+ } else {
993
+ memset(((FREEIMAGEHEADER *)dib->data)->transparent_table, 0xff, count);
994
+ }
995
+ }
996
+ }
997
+ }
998
+
999
+ /** @brief Sets the index of the palette entry to be used as transparent color
1000
+ for the image specified. Does nothing on high color images.
1001
+
1002
+ This method sets the index of the palette entry to be used as single transparent
1003
+ color for the image specified. This works on palletised images only and does
1004
+ nothing for high color images.
1005
+
1006
+ Although it is possible for palletised images to have more than one transparent
1007
+ color, this method sets the palette entry specified as the single transparent
1008
+ color for the image. All other colors will be set to be non-transparent by this
1009
+ method.
1010
+
1011
+ As with FreeImage_SetTransparencyTable(), this method also sets the image's
1012
+ transparency property to TRUE (as it is set and obtained by
1013
+ FreeImage_SetTransparent() and FreeImage_IsTransparent() respectively) for
1014
+ palletised images.
1015
+
1016
+ @param dib Input image, whose transparent color is to be set.
1017
+ @param index The index of the palette entry to be set as transparent color.
1018
+ */
1019
+ void DLL_CALLCONV
1020
+ FreeImage_SetTransparentIndex(FIBITMAP *dib, int index) {
1021
+ if (dib) {
1022
+ int count = FreeImage_GetColorsUsed(dib);
1023
+ if (count) {
1024
+ BYTE *new_tt = (BYTE *)malloc(count * sizeof(BYTE));
1025
+ memset(new_tt, 0xFF, count);
1026
+ if ((index >= 0) && (index < count)) {
1027
+ new_tt[index] = 0x00;
1028
+ }
1029
+ FreeImage_SetTransparencyTable(dib, new_tt, count);
1030
+ free(new_tt);
1031
+ }
1032
+ }
1033
+ }
1034
+
1035
+ /** @brief Returns the palette entry used as transparent color for the image
1036
+ specified. Works for palletised images only and returns -1 for high color
1037
+ images or if the image has no color set to be transparent.
1038
+
1039
+ Although it is possible for palletised images to have more than one transparent
1040
+ color, this function always returns the index of the first palette entry, set
1041
+ to be transparent.
1042
+
1043
+ @param dib Input image, whose transparent color is to be returned.
1044
+ @return Returns the index of the palette entry used as transparent color for
1045
+ the image specified or -1 if there is no transparent color found (e.g. the image
1046
+ is a high color image).
1047
+ */
1048
+ int DLL_CALLCONV
1049
+ FreeImage_GetTransparentIndex(FIBITMAP *dib) {
1050
+ int count = FreeImage_GetTransparencyCount(dib);
1051
+ BYTE *tt = FreeImage_GetTransparencyTable(dib);
1052
+ for (int i = 0; i < count; i++) {
1053
+ if (tt[i] == 0) {
1054
+ return i;
1055
+ }
1056
+ }
1057
+ return -1;
1058
+ }
1059
+
1060
+ // ----------------------------------------------------------
1061
+
1062
+ FIICCPROFILE * DLL_CALLCONV
1063
+ FreeImage_GetICCProfile(FIBITMAP *dib) {
1064
+ FIICCPROFILE *profile = (dib) ? (FIICCPROFILE *)&((FREEIMAGEHEADER *)dib->data)->iccProfile : NULL;
1065
+ return profile;
1066
+ }
1067
+
1068
+ FIICCPROFILE * DLL_CALLCONV
1069
+ FreeImage_CreateICCProfile(FIBITMAP *dib, void *data, long size) {
1070
+ // clear the profile but preserve profile->flags
1071
+ FreeImage_DestroyICCProfile(dib);
1072
+ // create the new profile
1073
+ FIICCPROFILE *profile = FreeImage_GetICCProfile(dib);
1074
+ if(size && profile) {
1075
+ profile->data = malloc(size);
1076
+ if(profile->data) {
1077
+ memcpy(profile->data, data, profile->size = size);
1078
+ }
1079
+ }
1080
+ return profile;
1081
+ }
1082
+
1083
+ void DLL_CALLCONV
1084
+ FreeImage_DestroyICCProfile(FIBITMAP *dib) {
1085
+ FIICCPROFILE *profile = FreeImage_GetICCProfile(dib);
1086
+ if(profile) {
1087
+ if (profile->data) {
1088
+ free (profile->data);
1089
+ }
1090
+ // clear the profile but preserve profile->flags
1091
+ profile->data = NULL;
1092
+ profile->size = 0;
1093
+ }
1094
+ }
1095
+
1096
+ // ----------------------------------------------------------
1097
+
1098
+ unsigned DLL_CALLCONV
1099
+ FreeImage_GetWidth(FIBITMAP *dib) {
1100
+ return dib ? FreeImage_GetInfoHeader(dib)->biWidth : 0;
1101
+ }
1102
+
1103
+ unsigned DLL_CALLCONV
1104
+ FreeImage_GetHeight(FIBITMAP *dib) {
1105
+ return (dib) ? FreeImage_GetInfoHeader(dib)->biHeight : 0;
1106
+ }
1107
+
1108
+ unsigned DLL_CALLCONV
1109
+ FreeImage_GetBPP(FIBITMAP *dib) {
1110
+ return dib ? FreeImage_GetInfoHeader(dib)->biBitCount : 0;
1111
+ }
1112
+
1113
+ unsigned DLL_CALLCONV
1114
+ FreeImage_GetLine(FIBITMAP *dib) {
1115
+ return dib ? ((FreeImage_GetWidth(dib) * FreeImage_GetBPP(dib)) + 7) / 8 : 0;
1116
+ }
1117
+
1118
+ unsigned DLL_CALLCONV
1119
+ FreeImage_GetPitch(FIBITMAP *dib) {
1120
+ if(dib) {
1121
+ FREEIMAGEHEADER *fih = (FREEIMAGEHEADER *)dib->data;
1122
+ return fih->external_bits ? fih->external_pitch : (FreeImage_GetLine(dib) + 3 & ~3);
1123
+ }
1124
+ return 0;
1125
+ }
1126
+
1127
+ unsigned DLL_CALLCONV
1128
+ FreeImage_GetColorsUsed(FIBITMAP *dib) {
1129
+ return dib ? FreeImage_GetInfoHeader(dib)->biClrUsed : 0;
1130
+ }
1131
+
1132
+ unsigned DLL_CALLCONV
1133
+ FreeImage_GetDIBSize(FIBITMAP *dib) {
1134
+ return (dib) ? sizeof(BITMAPINFOHEADER) + (FreeImage_GetColorsUsed(dib) * sizeof(RGBQUAD)) + (FreeImage_GetPitch(dib) * FreeImage_GetHeight(dib)) : 0;
1135
+ }
1136
+
1137
+ RGBQUAD * DLL_CALLCONV
1138
+ FreeImage_GetPalette(FIBITMAP *dib) {
1139
+ return (dib && FreeImage_GetBPP(dib) < 16) ? (RGBQUAD *)(((BYTE *)FreeImage_GetInfoHeader(dib)) + sizeof(BITMAPINFOHEADER)) : NULL;
1140
+ }
1141
+
1142
+ unsigned DLL_CALLCONV
1143
+ FreeImage_GetDotsPerMeterX(FIBITMAP *dib) {
1144
+ return (dib) ? FreeImage_GetInfoHeader(dib)->biXPelsPerMeter : 0;
1145
+ }
1146
+
1147
+ unsigned DLL_CALLCONV
1148
+ FreeImage_GetDotsPerMeterY(FIBITMAP *dib) {
1149
+ return (dib) ? FreeImage_GetInfoHeader(dib)->biYPelsPerMeter : 0;
1150
+ }
1151
+
1152
+ void DLL_CALLCONV
1153
+ FreeImage_SetDotsPerMeterX(FIBITMAP *dib, unsigned res) {
1154
+ if(dib) {
1155
+ FreeImage_GetInfoHeader(dib)->biXPelsPerMeter = res;
1156
+ }
1157
+ }
1158
+
1159
+ void DLL_CALLCONV
1160
+ FreeImage_SetDotsPerMeterY(FIBITMAP *dib, unsigned res) {
1161
+ if(dib) {
1162
+ FreeImage_GetInfoHeader(dib)->biYPelsPerMeter = res;
1163
+ }
1164
+ }
1165
+
1166
+ BITMAPINFOHEADER * DLL_CALLCONV
1167
+ FreeImage_GetInfoHeader(FIBITMAP *dib) {
1168
+ if(!dib) {
1169
+ return NULL;
1170
+ }
1171
+ size_t lp = (size_t)dib->data + sizeof(FREEIMAGEHEADER);
1172
+ lp += (lp % FIBITMAP_ALIGNMENT ? FIBITMAP_ALIGNMENT - lp % FIBITMAP_ALIGNMENT : 0);
1173
+ lp += FIBITMAP_ALIGNMENT - sizeof(BITMAPINFOHEADER) % FIBITMAP_ALIGNMENT;
1174
+ return (BITMAPINFOHEADER *)lp;
1175
+ }
1176
+
1177
+ BITMAPINFO * DLL_CALLCONV
1178
+ FreeImage_GetInfo(FIBITMAP *dib) {
1179
+ return (BITMAPINFO *)FreeImage_GetInfoHeader(dib);
1180
+ }
1181
+
1182
+ // ----------------------------------------------------------
1183
+ // Metadata routines
1184
+ // ----------------------------------------------------------
1185
+
1186
+ FIMETADATA * DLL_CALLCONV
1187
+ FreeImage_FindFirstMetadata(FREE_IMAGE_MDMODEL model, FIBITMAP *dib, FITAG **tag) {
1188
+ if(!dib) {
1189
+ return NULL;
1190
+ }
1191
+
1192
+ // get the metadata model
1193
+ METADATAMAP *metadata = ((FREEIMAGEHEADER *)dib->data)->metadata;
1194
+ TAGMAP *tagmap = NULL;
1195
+ if( (*metadata).find(model) != (*metadata).end() ) {
1196
+ tagmap = (*metadata)[model];
1197
+ }
1198
+ if(tagmap) {
1199
+ // allocate a handle
1200
+ FIMETADATA *handle = (FIMETADATA *)malloc(sizeof(FIMETADATA));
1201
+ if(handle) {
1202
+ // calculate the size of a METADATAHEADER
1203
+ int header_size = sizeof(METADATAHEADER);
1204
+
1205
+ handle->data = (BYTE *)malloc(header_size * sizeof(BYTE));
1206
+
1207
+ if(handle->data) {
1208
+ memset(handle->data, 0, header_size * sizeof(BYTE));
1209
+
1210
+ // write out the METADATAHEADER
1211
+ METADATAHEADER *mdh = (METADATAHEADER *)handle->data;
1212
+
1213
+ mdh->pos = 1;
1214
+ mdh->tagmap = tagmap;
1215
+
1216
+ // get the first element
1217
+ TAGMAP::iterator i = tagmap->begin();
1218
+ *tag = (*i).second;
1219
+
1220
+ return handle;
1221
+ }
1222
+
1223
+ free(handle);
1224
+ }
1225
+ }
1226
+
1227
+ return NULL;
1228
+ }
1229
+
1230
+ BOOL DLL_CALLCONV
1231
+ FreeImage_FindNextMetadata(FIMETADATA *mdhandle, FITAG **tag) {
1232
+ if(!mdhandle) {
1233
+ return FALSE;
1234
+ }
1235
+
1236
+ METADATAHEADER *mdh = (METADATAHEADER *)mdhandle->data;
1237
+ TAGMAP *tagmap = mdh->tagmap;
1238
+
1239
+ int current_pos = mdh->pos;
1240
+ int mapsize = (int)tagmap->size();
1241
+
1242
+ if(current_pos < mapsize) {
1243
+ // get the tag element at position pos
1244
+ int count = 0;
1245
+
1246
+ for(TAGMAP::iterator i = tagmap->begin(); i != tagmap->end(); i++) {
1247
+ if(count == current_pos) {
1248
+ *tag = (*i).second;
1249
+ mdh->pos++;
1250
+ break;
1251
+ }
1252
+ count++;
1253
+ }
1254
+
1255
+ return TRUE;
1256
+ }
1257
+
1258
+ return FALSE;
1259
+ }
1260
+
1261
+ void DLL_CALLCONV
1262
+ FreeImage_FindCloseMetadata(FIMETADATA *mdhandle) {
1263
+ if (NULL != mdhandle) { // delete the handle
1264
+ if (NULL != mdhandle->data) {
1265
+ free(mdhandle->data);
1266
+ }
1267
+ free(mdhandle); // ... and the wrapper
1268
+ }
1269
+ }
1270
+
1271
+
1272
+ // ----------------------------------------------------------
1273
+
1274
+ BOOL DLL_CALLCONV
1275
+ FreeImage_CloneMetadata(FIBITMAP *dst, FIBITMAP *src) {
1276
+ if(!src || !dst) {
1277
+ return FALSE;
1278
+ }
1279
+
1280
+ // get metadata links
1281
+ METADATAMAP *src_metadata = ((FREEIMAGEHEADER *)src->data)->metadata;
1282
+ METADATAMAP *dst_metadata = ((FREEIMAGEHEADER *)dst->data)->metadata;
1283
+
1284
+ // copy metadata models, *except* the FIMD_ANIMATION model
1285
+ for(METADATAMAP::iterator i = (*src_metadata).begin(); i != (*src_metadata).end(); i++) {
1286
+ int model = (*i).first;
1287
+ if(model == (int)FIMD_ANIMATION) {
1288
+ continue;
1289
+ }
1290
+ TAGMAP *src_tagmap = (*i).second;
1291
+
1292
+ if(src_tagmap) {
1293
+ if( dst_metadata->find(model) != dst_metadata->end() ) {
1294
+ // destroy dst model
1295
+ FreeImage_SetMetadata((FREE_IMAGE_MDMODEL)model, dst, NULL, NULL);
1296
+ }
1297
+
1298
+ // create a metadata model
1299
+ TAGMAP *dst_tagmap = new(std::nothrow) TAGMAP();
1300
+
1301
+ if(dst_tagmap) {
1302
+ // fill the model
1303
+ for(TAGMAP::iterator j = src_tagmap->begin(); j != src_tagmap->end(); j++) {
1304
+ std::string dst_key = (*j).first;
1305
+ FITAG *dst_tag = FreeImage_CloneTag( (*j).second );
1306
+
1307
+ // assign key and tag value
1308
+ (*dst_tagmap)[dst_key] = dst_tag;
1309
+ }
1310
+
1311
+ // assign model and tagmap
1312
+ (*dst_metadata)[model] = dst_tagmap;
1313
+ }
1314
+ }
1315
+ }
1316
+
1317
+ // clone resolution
1318
+ FreeImage_SetDotsPerMeterX(dst, FreeImage_GetDotsPerMeterX(src));
1319
+ FreeImage_SetDotsPerMeterY(dst, FreeImage_GetDotsPerMeterY(src));
1320
+
1321
+ return TRUE;
1322
+ }
1323
+
1324
+ // ----------------------------------------------------------
1325
+
1326
+ BOOL DLL_CALLCONV
1327
+ FreeImage_SetMetadata(FREE_IMAGE_MDMODEL model, FIBITMAP *dib, const char *key, FITAG *tag) {
1328
+ if(!dib) {
1329
+ return FALSE;
1330
+ }
1331
+
1332
+ TAGMAP *tagmap = NULL;
1333
+
1334
+ // get the metadata model
1335
+ METADATAMAP *metadata = ((FREEIMAGEHEADER *)dib->data)->metadata;
1336
+ METADATAMAP::iterator model_iterator = metadata->find(model);
1337
+ if (model_iterator != metadata->end()) {
1338
+ tagmap = model_iterator->second;
1339
+ }
1340
+
1341
+ if(key != NULL) {
1342
+
1343
+ if(!tagmap) {
1344
+ // this model, doesn't exist: create it
1345
+ tagmap = new(std::nothrow) TAGMAP();
1346
+ (*metadata)[model] = tagmap;
1347
+ }
1348
+
1349
+ if(tag) {
1350
+ // first check the tag
1351
+ if(FreeImage_GetTagKey(tag) == NULL) {
1352
+ FreeImage_SetTagKey(tag, key);
1353
+ } else if(strcmp(key, FreeImage_GetTagKey(tag)) != 0) {
1354
+ // set the tag key
1355
+ FreeImage_SetTagKey(tag, key);
1356
+ }
1357
+ if(FreeImage_GetTagCount(tag) * FreeImage_TagDataWidth(FreeImage_GetTagType(tag)) != FreeImage_GetTagLength(tag)) {
1358
+ FreeImage_OutputMessageProc(FIF_UNKNOWN, "Invalid data count for tag '%s'", key);
1359
+ return FALSE;
1360
+ }
1361
+
1362
+ // fill the tag ID if possible and if it's needed
1363
+ TagLib& tag_lib = TagLib::instance();
1364
+ switch(model) {
1365
+ case FIMD_IPTC:
1366
+ {
1367
+ int id = tag_lib.getTagID(TagLib::IPTC, key);
1368
+ /*
1369
+ if(id == -1) {
1370
+ FreeImage_OutputMessageProc(FIF_UNKNOWN, "IPTC: Invalid key '%s'", key);
1371
+ }
1372
+ */
1373
+ FreeImage_SetTagID(tag, (WORD)id);
1374
+ }
1375
+ break;
1376
+
1377
+ default:
1378
+ break;
1379
+ }
1380
+
1381
+ // delete existing tag
1382
+ FITAG *old_tag = (*tagmap)[key];
1383
+ if(old_tag) {
1384
+ FreeImage_DeleteTag(old_tag);
1385
+ }
1386
+
1387
+ // create a new tag
1388
+ (*tagmap)[key] = FreeImage_CloneTag(tag);
1389
+ }
1390
+ else {
1391
+ // delete existing tag
1392
+ TAGMAP::iterator i = tagmap->find(key);
1393
+ if(i != tagmap->end()) {
1394
+ FITAG *old_tag = (*i).second;
1395
+ FreeImage_DeleteTag(old_tag);
1396
+ tagmap->erase(key);
1397
+ }
1398
+ }
1399
+ }
1400
+ else {
1401
+ // destroy the metadata model
1402
+ if(tagmap) {
1403
+ for(TAGMAP::iterator i = tagmap->begin(); i != tagmap->end(); i++) {
1404
+ FITAG *tag = (*i).second;
1405
+ FreeImage_DeleteTag(tag);
1406
+ }
1407
+
1408
+ delete tagmap;
1409
+ metadata->erase(model_iterator);
1410
+ }
1411
+ }
1412
+
1413
+ return TRUE;
1414
+ }
1415
+
1416
+ BOOL DLL_CALLCONV
1417
+ FreeImage_GetMetadata(FREE_IMAGE_MDMODEL model, FIBITMAP *dib, const char *key, FITAG **tag) {
1418
+ if(!dib || !key || !tag) {
1419
+ return FALSE;
1420
+ }
1421
+
1422
+ TAGMAP *tagmap = NULL;
1423
+ *tag = NULL;
1424
+
1425
+ // get the metadata model
1426
+ METADATAMAP *metadata = ((FREEIMAGEHEADER *)dib->data)->metadata;
1427
+ if(!(*metadata).empty()) {
1428
+ METADATAMAP::iterator model_iterator = metadata->find(model);
1429
+ if (model_iterator != metadata->end() ) {
1430
+ // this model exists : try to get the requested tag
1431
+ tagmap = model_iterator->second;
1432
+ TAGMAP::iterator tag_iterator = tagmap->find(key);
1433
+ if (tag_iterator != tagmap->end() ) {
1434
+ // get the requested tag
1435
+ *tag = tag_iterator->second;
1436
+ }
1437
+ }
1438
+ }
1439
+
1440
+ return (*tag != NULL) ? TRUE : FALSE;
1441
+ }
1442
+
1443
+ /**
1444
+ Build and set a FITAG whose type is FIDT_ASCII.
1445
+ @param model Metadata model to be filled
1446
+ @param dib Image to be filled
1447
+ @param key Tag key
1448
+ @param value Tag value as a ASCII string
1449
+ @return Returns TRUE if successful, returns FALSE otherwise
1450
+ */
1451
+ BOOL DLL_CALLCONV
1452
+ FreeImage_SetMetadataKeyValue(FREE_IMAGE_MDMODEL model, FIBITMAP *dib, const char *key, const char *value) {
1453
+ if(!dib || !key || !value) {
1454
+ return FALSE;
1455
+ }
1456
+ // create a tag
1457
+ FITAG *tag = FreeImage_CreateTag();
1458
+ if(tag) {
1459
+ BOOL bSuccess = TRUE;
1460
+ // fill the tag
1461
+ DWORD tag_length = (DWORD)(strlen(value) + 1);
1462
+ bSuccess &= FreeImage_SetTagKey(tag, key);
1463
+ bSuccess &= FreeImage_SetTagLength(tag, tag_length);
1464
+ bSuccess &= FreeImage_SetTagCount(tag, tag_length);
1465
+ bSuccess &= FreeImage_SetTagType(tag, FIDT_ASCII);
1466
+ bSuccess &= FreeImage_SetTagValue(tag, value);
1467
+ if(bSuccess) {
1468
+ // set the tag
1469
+ bSuccess &= FreeImage_SetMetadata(model, dib, FreeImage_GetTagKey(tag), tag);
1470
+ }
1471
+ // delete the tag
1472
+ FreeImage_DeleteTag(tag);
1473
+
1474
+ return bSuccess;
1475
+ }
1476
+
1477
+ return FALSE;
1478
+ }
1479
+
1480
+ // ----------------------------------------------------------
1481
+
1482
+ unsigned DLL_CALLCONV
1483
+ FreeImage_GetMetadataCount(FREE_IMAGE_MDMODEL model, FIBITMAP *dib) {
1484
+ if(!dib) {
1485
+ return FALSE;
1486
+ }
1487
+
1488
+ TAGMAP *tagmap = NULL;
1489
+
1490
+ // get the metadata model
1491
+ METADATAMAP *metadata = ((FREEIMAGEHEADER *)dib->data)->metadata;
1492
+ if( (*metadata).find(model) != (*metadata).end() ) {
1493
+ tagmap = (*metadata)[model];
1494
+ }
1495
+ if(!tagmap) {
1496
+ // this model, doesn't exist: return
1497
+ return 0;
1498
+ }
1499
+
1500
+ // get the tag count
1501
+ return (unsigned)tagmap->size();
1502
+ }
1503
+
1504
+ // ----------------------------------------------------------
1505
+
1506
+ unsigned DLL_CALLCONV
1507
+ FreeImage_GetMemorySize(FIBITMAP *dib) {
1508
+ if (!dib) {
1509
+ return 0;
1510
+ }
1511
+ FREEIMAGEHEADER *header = (FREEIMAGEHEADER *)dib->data;
1512
+ BITMAPINFOHEADER *bih = FreeImage_GetInfoHeader(dib);
1513
+
1514
+ BOOL header_only = !header->has_pixels || header->external_bits != NULL;
1515
+ BOOL need_masks = bih->biCompression == BI_BITFIELDS;
1516
+ unsigned width = bih->biWidth;
1517
+ unsigned height = bih->biHeight;
1518
+ unsigned bpp = bih->biBitCount;
1519
+
1520
+ // start off with the size of the FIBITMAP structure
1521
+ size_t size = sizeof(FIBITMAP);
1522
+
1523
+ // add sizes of FREEIMAGEHEADER, BITMAPINFOHEADER, palette and DIB data
1524
+ size += FreeImage_GetInternalImageSize(header_only, width, height, bpp, need_masks);
1525
+
1526
+ // add ICC profile size
1527
+ size += header->iccProfile.size;
1528
+
1529
+ // add thumbnail image size
1530
+ if (header->thumbnail) {
1531
+ // we assume a thumbnail not having a thumbnail as well,
1532
+ // so this recursive call should not create an infinite loop
1533
+ size += FreeImage_GetMemorySize(header->thumbnail);
1534
+ }
1535
+
1536
+ // add metadata size
1537
+ METADATAMAP *md = header->metadata;
1538
+ if (!md) {
1539
+ return (unsigned)size;
1540
+ }
1541
+
1542
+ // add size of METADATAMAP
1543
+ size += sizeof(METADATAMAP);
1544
+
1545
+ const size_t models = md->size();
1546
+ if (models == 0) {
1547
+ return (unsigned)size;
1548
+ }
1549
+
1550
+ unsigned tags = 0;
1551
+
1552
+ for (METADATAMAP::iterator i = md->begin(); i != md->end(); i++) {
1553
+ TAGMAP *tm = i->second;
1554
+ if (tm) {
1555
+ for (TAGMAP::iterator j = tm->begin(); j != tm->end(); j++) {
1556
+ ++tags;
1557
+ const std::string & key = j->first;
1558
+ size += key.capacity();
1559
+ size += FreeImage_GetTagMemorySize(j->second);
1560
+ }
1561
+ }
1562
+ }
1563
+
1564
+ // add size of all TAGMAP instances
1565
+ size += models * sizeof(TAGMAP);
1566
+ // add size of tree nodes in METADATAMAP
1567
+ size += MapIntrospector<METADATAMAP>::GetNodesMemorySize(models);
1568
+ // add size of tree nodes in TAGMAP
1569
+ size += MapIntrospector<TAGMAP>::GetNodesMemorySize(tags);
1570
+
1571
+ return (unsigned)size;
1572
+ }
1573
+