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,1475 @@
1
+ // ==========================================================
2
+ // JPEG XR Loader & Writer
3
+ //
4
+ // Design and implementation by
5
+ // - Herve Drolon (drolon@infonie.fr)
6
+ //
7
+ // This file is part of FreeImage 3
8
+ //
9
+ // COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
10
+ // OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
11
+ // THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
12
+ // OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
13
+ // CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
14
+ // THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
15
+ // SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
16
+ // PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
17
+ // THIS DISCLAIMER.
18
+ //
19
+ // Use at your own risk!
20
+ // ==========================================================
21
+
22
+ #include "FreeImage.h"
23
+ #include "Utilities.h"
24
+ #include "../Metadata/FreeImageTag.h"
25
+
26
+ #include "../LibJXR/jxrgluelib/JXRGlue.h"
27
+
28
+ // ==========================================================
29
+ // Plugin Interface
30
+ // ==========================================================
31
+
32
+ static int s_format_id;
33
+
34
+ // ==========================================================
35
+ // FreeImageIO interface (I/O streaming functions)
36
+ // ==========================================================
37
+
38
+ /**
39
+ JXR wrapper for FreeImage I/O handle
40
+ */
41
+ typedef struct tagFreeImageJXRIO {
42
+ FreeImageIO *io;
43
+ fi_handle handle;
44
+ } FreeImageJXRIO;
45
+
46
+ static ERR
47
+ _jxr_io_Read(WMPStream* pWS, void* pv, size_t cb) {
48
+ FreeImageJXRIO *fio = (FreeImageJXRIO*)pWS->state.pvObj;
49
+ return (fio->io->read_proc(pv, (unsigned)cb, 1, fio->handle) == 1) ? WMP_errSuccess : WMP_errFileIO;
50
+ }
51
+
52
+ static ERR
53
+ _jxr_io_Write(WMPStream* pWS, const void* pv, size_t cb) {
54
+ FreeImageJXRIO *fio = (FreeImageJXRIO*)pWS->state.pvObj;
55
+ if(0 != cb) {
56
+ return (fio->io->write_proc((void*)pv, (unsigned)cb, 1, fio->handle) == 1) ? WMP_errSuccess : WMP_errFileIO;
57
+ }
58
+ return WMP_errFileIO;
59
+ }
60
+
61
+ static ERR
62
+ _jxr_io_SetPos(WMPStream* pWS, size_t offPos) {
63
+ FreeImageJXRIO *fio = (FreeImageJXRIO*)pWS->state.pvObj;
64
+ return (fio->io->seek_proc(fio->handle, (long)offPos, SEEK_SET) == 0) ? WMP_errSuccess : WMP_errFileIO;
65
+ }
66
+
67
+ static ERR
68
+ _jxr_io_GetPos(WMPStream* pWS, size_t* poffPos) {
69
+ FreeImageJXRIO *fio = (FreeImageJXRIO*)pWS->state.pvObj;
70
+ long lOff = fio->io->tell_proc(fio->handle);
71
+ if(lOff == -1) {
72
+ return WMP_errFileIO;
73
+ }
74
+ *poffPos = (size_t)lOff;
75
+ return WMP_errSuccess;
76
+ }
77
+
78
+ static Bool
79
+ _jxr_io_EOS(WMPStream* pWS) {
80
+ FreeImageJXRIO *fio = (FreeImageJXRIO*)pWS->state.pvObj;
81
+ long currentPos = fio->io->tell_proc(fio->handle);
82
+ fio->io->seek_proc(fio->handle, 0, SEEK_END);
83
+ long fileRemaining = fio->io->tell_proc(fio->handle) - currentPos;
84
+ fio->io->seek_proc(fio->handle, currentPos, SEEK_SET);
85
+ return (fileRemaining > 0);
86
+ }
87
+
88
+ static ERR
89
+ _jxr_io_Close(WMPStream** ppWS) {
90
+ WMPStream *pWS = *ppWS;
91
+ // HACK : we use fMem to avoid a stream destruction by the library
92
+ // because FreeImage MUST HAVE the ownership of the stream
93
+ // see _jxr_io_Create
94
+ if(pWS && pWS->fMem) {
95
+ free(pWS);
96
+ *ppWS = NULL;
97
+ }
98
+ return WMP_errSuccess;
99
+ }
100
+
101
+ static ERR
102
+ _jxr_io_Create(WMPStream **ppWS, FreeImageJXRIO *jxr_io) {
103
+ *ppWS = (WMPStream*)calloc(1, sizeof(**ppWS));
104
+ if(*ppWS) {
105
+ WMPStream *pWS = *ppWS;
106
+
107
+ pWS->state.pvObj = jxr_io;
108
+ pWS->Close = _jxr_io_Close;
109
+ pWS->EOS = _jxr_io_EOS;
110
+ pWS->Read = _jxr_io_Read;
111
+ pWS->Write = _jxr_io_Write;
112
+ pWS->SetPos = _jxr_io_SetPos;
113
+ pWS->GetPos = _jxr_io_GetPos;
114
+
115
+ // HACK : we use fMem to avoid a stream destruction by the library
116
+ // because FreeImage MUST HAVE the ownership of the stream
117
+ // see _jxr_io_Close
118
+ pWS->fMem = FALSE;
119
+
120
+ return WMP_errSuccess;
121
+ }
122
+ return WMP_errOutOfMemory;
123
+ }
124
+
125
+ // ==========================================================
126
+ // JPEG XR Error handling
127
+ // ==========================================================
128
+
129
+ static const char*
130
+ JXR_ErrorMessage(const int error) {
131
+ switch(error) {
132
+ case WMP_errNotYetImplemented:
133
+ case WMP_errAbstractMethod:
134
+ return "Not yet implemented";
135
+ case WMP_errOutOfMemory:
136
+ return "Out of memory";
137
+ case WMP_errFileIO:
138
+ return "File I/O error";
139
+ case WMP_errBufferOverflow:
140
+ return "Buffer overflow";
141
+ case WMP_errInvalidParameter:
142
+ return "Invalid parameter";
143
+ case WMP_errInvalidArgument:
144
+ return "Invalid argument";
145
+ case WMP_errUnsupportedFormat:
146
+ return "Unsupported format";
147
+ case WMP_errIncorrectCodecVersion:
148
+ return "Incorrect codec version";
149
+ case WMP_errIndexNotFound:
150
+ return "Format converter: Index not found";
151
+ case WMP_errOutOfSequence:
152
+ return "Metadata: Out of sequence";
153
+ case WMP_errMustBeMultipleOf16LinesUntilLastCall:
154
+ return "Must be multiple of 16 lines until last call";
155
+ case WMP_errPlanarAlphaBandedEncRequiresTempFile:
156
+ return "Planar alpha banded encoder requires temp files";
157
+ case WMP_errAlphaModeCannotBeTranscoded:
158
+ return "Alpha mode cannot be transcoded";
159
+ case WMP_errIncorrectCodecSubVersion:
160
+ return "Incorrect codec subversion";
161
+ case WMP_errFail:
162
+ case WMP_errNotInitialized:
163
+ default:
164
+ return "Invalid instruction - please contact the FreeImage team";
165
+ }
166
+ }
167
+
168
+ // ==========================================================
169
+ // Helper functions & macro
170
+ // ==========================================================
171
+
172
+ #define JXR_CHECK(error_code) \
173
+ if(error_code < 0) { \
174
+ const char *error_message = JXR_ErrorMessage(error_code); \
175
+ throw error_message; \
176
+ }
177
+
178
+ // --------------------------------------------------------------------------
179
+
180
+ /**
181
+ Input conversions natively understood by FreeImage
182
+ @see GetNativePixelFormat
183
+ */
184
+ typedef struct tagJXRInputConversion {
185
+ BITDEPTH_BITS bdBitDepth;
186
+ U32 cbitUnit;
187
+ FREE_IMAGE_TYPE image_type;
188
+ unsigned red_mask;
189
+ unsigned green_mask;
190
+ unsigned blue_mask;
191
+ } JXRInputConversion;
192
+
193
+ /**
194
+ Conversion table for native FreeImage formats
195
+ @see GetNativePixelFormat
196
+ */
197
+ static JXRInputConversion s_FreeImagePixelInfo[] = {
198
+ // 1-bit bitmap
199
+ { BD_1, 1, FIT_BITMAP, 0, 0, 0 },
200
+ // 8-, 24-, 32-bit bitmap
201
+ { BD_8, 8, FIT_BITMAP, 0, 0, 0 },
202
+ { BD_8, 24, FIT_BITMAP, 0, 0, 0 },
203
+ { BD_8, 32, FIT_BITMAP, 0, 0, 0 },
204
+ // 16-bit RGB 565
205
+ { BD_565, 16, FIT_BITMAP, FI16_565_RED_MASK, FI16_565_GREEN_MASK, FI16_565_BLUE_MASK },
206
+ // 16-bit RGB 555
207
+ { BD_5, 16, FIT_BITMAP, FI16_555_RED_MASK, FI16_555_GREEN_MASK, FI16_555_BLUE_MASK },
208
+ // 16-bit greyscale, RGB16, RGBA16 bitmap
209
+ { BD_16, 16, FIT_UINT16, 0, 0, 0 },
210
+ { BD_16, 48, FIT_RGB16, 0, 0, 0 },
211
+ { BD_16, 64, FIT_RGBA16, 0, 0, 0 },
212
+ // 32-bit float, RGBF, RGBAF bitmap
213
+ { BD_32F, 32, FIT_FLOAT, 0, 0, 0 },
214
+ { BD_32F, 96, FIT_RGBF, 0, 0, 0 },
215
+ { BD_32F, 128, FIT_RGBAF, 0, 0, 0 }
216
+ };
217
+
218
+ /**
219
+ Scan input pixelInfo specifications and return the equivalent FreeImage info for loading
220
+ @param pixelInfo Image specifications
221
+ @param out_guid_format (returned value) output pixel format
222
+ @param image_type (returned value) Image type
223
+ @param bpp (returned value) Image bit depth
224
+ @param red_mask (returned value) RGB mask
225
+ @param green_mask (returned value) RGB mask
226
+ @param blue_mask (returned value) RGB mask
227
+ @return Returns WMP_errSuccess if successful, returns WMP_errFail otherwise
228
+ @see GetInputPixelFormat
229
+ */
230
+ static ERR
231
+ GetNativePixelFormat(const PKPixelInfo *pixelInfo, PKPixelFormatGUID *out_guid_format, FREE_IMAGE_TYPE *image_type, unsigned *bpp, unsigned *red_mask, unsigned *green_mask, unsigned *blue_mask) {
232
+ const unsigned s_FreeImagePixelInfoSize = (unsigned)sizeof(s_FreeImagePixelInfo) / sizeof(*(s_FreeImagePixelInfo));
233
+
234
+ for(unsigned i = 0; i < s_FreeImagePixelInfoSize; i++) {
235
+ if(pixelInfo->bdBitDepth == s_FreeImagePixelInfo[i].bdBitDepth) {
236
+ if(pixelInfo->cbitUnit == s_FreeImagePixelInfo[i].cbitUnit) {
237
+ // found ! now get dst image format specifications
238
+ memcpy(out_guid_format, pixelInfo->pGUIDPixFmt, sizeof(PKPixelFormatGUID));
239
+ *image_type = s_FreeImagePixelInfo[i].image_type;
240
+ *bpp = s_FreeImagePixelInfo[i].cbitUnit;
241
+ *red_mask = s_FreeImagePixelInfo[i].red_mask;
242
+ *green_mask = s_FreeImagePixelInfo[i].green_mask;
243
+ *blue_mask = s_FreeImagePixelInfo[i].blue_mask;
244
+ return WMP_errSuccess;
245
+ }
246
+ }
247
+ }
248
+
249
+ // not found : need pixel format conversion
250
+ return WMP_errFail;
251
+ }
252
+
253
+ /**
254
+ Scan input file guid format and return the equivalent FreeImage info & target guid format for loading
255
+ @param pDecoder Decoder handle
256
+ @param guid_format (returned value) Output pixel format
257
+ @param image_type (returned value) Image type
258
+ @param bpp (returned value) Image bit depth
259
+ @param red_mask (returned value) RGB mask
260
+ @param green_mask (returned value) RGB mask
261
+ @param blue_mask (returned value) RGB mask
262
+ @return Returns TRUE if successful, returns FALSE otherwise
263
+ */
264
+ static ERR
265
+ GetInputPixelFormat(PKImageDecode *pDecoder, PKPixelFormatGUID *guid_format, FREE_IMAGE_TYPE *image_type, unsigned *bpp, unsigned *red_mask, unsigned *green_mask, unsigned *blue_mask) {
266
+ ERR error_code = 0; // error code as returned by the interface
267
+ PKPixelInfo pixelInfo; // image specifications
268
+
269
+ try {
270
+ // get input file pixel format ...
271
+ PKPixelFormatGUID pguidSourcePF;
272
+ error_code = pDecoder->GetPixelFormat(pDecoder, &pguidSourcePF);
273
+ JXR_CHECK(error_code);
274
+ pixelInfo.pGUIDPixFmt = &pguidSourcePF;
275
+ // ... check for a supported format and get the format specifications
276
+ error_code = PixelFormatLookup(&pixelInfo, LOOKUP_FORWARD);
277
+ JXR_CHECK(error_code);
278
+
279
+ // search for an equivalent native FreeImage format
280
+ error_code = GetNativePixelFormat(&pixelInfo, guid_format, image_type, bpp, red_mask, green_mask, blue_mask);
281
+
282
+ if(error_code != WMP_errSuccess) {
283
+ // try to find a suitable conversion function ...
284
+ const PKPixelFormatGUID *ppguidTargetPF = NULL; // target pixel format
285
+ unsigned iIndex = 0; // first available conversion function
286
+ do {
287
+ error_code = PKFormatConverter_EnumConversions(&pguidSourcePF, iIndex, &ppguidTargetPF);
288
+ if(error_code == WMP_errSuccess) {
289
+ // found a conversion function, is the converted format a native FreeImage format ?
290
+ pixelInfo.pGUIDPixFmt = ppguidTargetPF;
291
+ error_code = PixelFormatLookup(&pixelInfo, LOOKUP_FORWARD);
292
+ JXR_CHECK(error_code);
293
+ error_code = GetNativePixelFormat(&pixelInfo, guid_format, image_type, bpp, red_mask, green_mask, blue_mask);
294
+ if(error_code == WMP_errSuccess) {
295
+ break;
296
+ }
297
+ }
298
+ // try next conversion function
299
+ iIndex++;
300
+ } while(error_code != WMP_errIndexNotFound);
301
+
302
+ }
303
+
304
+ return (error_code == WMP_errSuccess) ? WMP_errSuccess : WMP_errUnsupportedFormat;
305
+
306
+ } catch(...) {
307
+ return error_code;
308
+ }
309
+ }
310
+
311
+ // --------------------------------------------------------------------------
312
+
313
+ /**
314
+ Scan input dib format and return the equivalent PKPixelFormatGUID format for saving
315
+ @param dib Image to be saved
316
+ @param guid_format (returned value) GUID format
317
+ @param bHasAlpha (returned value) TRUE if an alpha layer is present
318
+ @return Returns TRUE if successful, returns FALSE otherwise
319
+ */
320
+ static ERR
321
+ GetOutputPixelFormat(FIBITMAP *dib, PKPixelFormatGUID *guid_format, BOOL *bHasAlpha) {
322
+ const FREE_IMAGE_TYPE image_type = FreeImage_GetImageType(dib);
323
+ const unsigned bpp = FreeImage_GetBPP(dib);
324
+ const FREE_IMAGE_COLOR_TYPE color_type = FreeImage_GetColorType(dib);
325
+
326
+ *guid_format = GUID_PKPixelFormatDontCare;
327
+ *bHasAlpha = FALSE;
328
+
329
+ switch(image_type) {
330
+ case FIT_BITMAP: // standard image : 1-, 4-, 8-, 16-, 24-, 32-bit
331
+ switch(bpp) {
332
+ case 1:
333
+ // assume FIC_MINISBLACK
334
+ if(color_type == FIC_MINISBLACK) {
335
+ *guid_format = GUID_PKPixelFormatBlackWhite;
336
+ }
337
+ break;
338
+ case 8:
339
+ // assume FIC_MINISBLACK
340
+ if(color_type == FIC_MINISBLACK) {
341
+ *guid_format = GUID_PKPixelFormat8bppGray;
342
+ }
343
+ break;
344
+ case 16:
345
+ if ((FreeImage_GetRedMask(dib) == FI16_565_RED_MASK) && (FreeImage_GetGreenMask(dib) == FI16_565_GREEN_MASK) && (FreeImage_GetBlueMask(dib) == FI16_565_BLUE_MASK)) {
346
+ *guid_format = GUID_PKPixelFormat16bppRGB565;
347
+ } else {
348
+ // includes case where all the masks are 0
349
+ *guid_format = GUID_PKPixelFormat16bppRGB555;
350
+ }
351
+ break;
352
+ #if FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_BGR
353
+ case 24:
354
+ *guid_format = GUID_PKPixelFormat24bppBGR;
355
+ break;
356
+ case 32:
357
+ *guid_format = GUID_PKPixelFormat32bppBGRA;
358
+ *bHasAlpha = TRUE;
359
+ break;
360
+ #elif FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_RGB
361
+ case 24:
362
+ *guid_format = GUID_PKPixelFormat24bppRGB;
363
+ break;
364
+ case 32:
365
+ *guid_format = GUID_PKPixelFormat32bppRGBA;
366
+ *bHasAlpha = TRUE;
367
+ break;
368
+ #endif
369
+ case 4:
370
+ default:
371
+ // not supported
372
+ break;
373
+ }
374
+ break;
375
+ case FIT_UINT16: // array of unsigned short : unsigned 16-bit
376
+ *guid_format = GUID_PKPixelFormat16bppGray;
377
+ break;
378
+ case FIT_FLOAT: // array of float : 32-bit IEEE floating point
379
+ *guid_format = GUID_PKPixelFormat32bppGrayFloat;
380
+ break;
381
+ case FIT_RGB16: // 48-bit RGB image : 3 x 16-bit
382
+ *guid_format = GUID_PKPixelFormat48bppRGB;
383
+ break;
384
+ case FIT_RGBA16: // 64-bit RGBA image : 4 x 16-bit
385
+ *guid_format = GUID_PKPixelFormat64bppRGBA;
386
+ *bHasAlpha = TRUE;
387
+ break;
388
+ case FIT_RGBF: // 96-bit RGB float image : 3 x 32-bit IEEE floating point
389
+ *guid_format = GUID_PKPixelFormat96bppRGBFloat;
390
+ break;
391
+ case FIT_RGBAF: // 128-bit RGBA float image : 4 x 32-bit IEEE floating point
392
+ *guid_format = GUID_PKPixelFormat128bppRGBAFloat;
393
+ *bHasAlpha = TRUE;
394
+ break;
395
+
396
+ case FIT_INT16: // array of short : signed 16-bit
397
+ case FIT_UINT32: // array of unsigned long : unsigned 32-bit
398
+ case FIT_INT32: // array of long : signed 32-bit
399
+ case FIT_DOUBLE: // array of double : 64-bit IEEE floating point
400
+ case FIT_COMPLEX: // array of FICOMPLEX : 2 x 64-bit IEEE floating point
401
+
402
+ default:
403
+ // unsupported format
404
+ break;
405
+ }
406
+
407
+ return (*guid_format != GUID_PKPixelFormatDontCare) ? WMP_errSuccess : WMP_errUnsupportedFormat;
408
+ }
409
+
410
+ // ==========================================================
411
+ // Metadata loading
412
+ // ==========================================================
413
+
414
+ /**
415
+ Read a JPEG-XR IFD as a buffer
416
+ @see ReadMetadata
417
+ */
418
+ static ERR
419
+ ReadProfile(WMPStream* pStream, unsigned cbByteCount, unsigned uOffset, BYTE **ppbProfile) {
420
+ // (re-)allocate profile buffer
421
+ BYTE *pbProfile = *ppbProfile;
422
+ pbProfile = (BYTE*)realloc(pbProfile, cbByteCount);
423
+ if(!pbProfile) {
424
+ return WMP_errOutOfMemory;
425
+ }
426
+ // read the profile
427
+ if(WMP_errSuccess == pStream->SetPos(pStream, uOffset)) {
428
+ if(WMP_errSuccess == pStream->Read(pStream, pbProfile, cbByteCount)) {
429
+ *ppbProfile = pbProfile;
430
+ return WMP_errSuccess;
431
+ }
432
+ }
433
+ return WMP_errFileIO;
434
+ }
435
+
436
+ /**
437
+ Convert a DPKPROPVARIANT to a FITAG, then store the tag as FIMD_EXIF_MAIN
438
+ @see ReadDescriptiveMetadata
439
+ */
440
+ static BOOL
441
+ ReadPropVariant(WORD tag_id, const DPKPROPVARIANT & varSrc, FIBITMAP *dib) {
442
+ DWORD dwSize;
443
+
444
+ if(varSrc.vt == DPKVT_EMPTY) {
445
+ return FALSE;
446
+ }
447
+
448
+ // get the tag key
449
+ TagLib& s = TagLib::instance();
450
+ const char *key = s.getTagFieldName(TagLib::EXIF_MAIN, tag_id, NULL);
451
+ if(!key) {
452
+ return FALSE;
453
+ }
454
+
455
+ // create a tag
456
+ FITAG *tag = FreeImage_CreateTag();
457
+ if(tag) {
458
+ // set tag ID
459
+ FreeImage_SetTagID(tag, tag_id);
460
+ // set tag type, count, length and value
461
+ switch (varSrc.vt) {
462
+ case DPKVT_LPSTR:
463
+ FreeImage_SetTagType(tag, FIDT_ASCII);
464
+ dwSize = (DWORD)strlen(varSrc.VT.pszVal) + 1;
465
+ FreeImage_SetTagCount(tag, dwSize);
466
+ FreeImage_SetTagLength(tag, dwSize);
467
+ FreeImage_SetTagValue(tag, varSrc.VT.pszVal);
468
+ break;
469
+
470
+ case DPKVT_LPWSTR:
471
+ FreeImage_SetTagType(tag, FIDT_UNDEFINED);
472
+ dwSize = (DWORD)(sizeof(U16) * (wcslen((wchar_t *) varSrc.VT.pwszVal) + 1)); // +1 for NULL term
473
+ FreeImage_SetTagCount(tag, dwSize);
474
+ FreeImage_SetTagLength(tag, dwSize);
475
+ FreeImage_SetTagValue(tag, varSrc.VT.pwszVal);
476
+ break;
477
+
478
+ case DPKVT_UI2:
479
+ FreeImage_SetTagType(tag, FIDT_SHORT);
480
+ FreeImage_SetTagCount(tag, 1);
481
+ FreeImage_SetTagLength(tag, 2);
482
+ FreeImage_SetTagValue(tag, &varSrc.VT.uiVal);
483
+ break;
484
+
485
+ case DPKVT_UI4:
486
+ FreeImage_SetTagType(tag, FIDT_LONG);
487
+ FreeImage_SetTagCount(tag, 1);
488
+ FreeImage_SetTagLength(tag, 4);
489
+ FreeImage_SetTagValue(tag, &varSrc.VT.ulVal);
490
+ break;
491
+
492
+ default:
493
+ assert(FALSE); // This case is not handled
494
+ break;
495
+ }
496
+ // get the tag desctiption
497
+ const char *description = s.getTagDescription(TagLib::EXIF_MAIN, tag_id);
498
+ FreeImage_SetTagDescription(tag, description);
499
+
500
+ // store the tag
501
+ FreeImage_SetMetadata(FIMD_EXIF_MAIN, dib, key, tag);
502
+
503
+ FreeImage_DeleteTag(tag);
504
+ }
505
+ return TRUE;
506
+ }
507
+
508
+ /**
509
+ Read JPEG-XR descriptive metadata and store as EXIF_MAIN metadata
510
+ @see ReadPropVariant
511
+ */
512
+ static ERR
513
+ ReadDescriptiveMetadata(PKImageDecode *pID, FIBITMAP *dib) {
514
+ // get Exif TIFF metadata
515
+ const DESCRIPTIVEMETADATA *pDescMetadata = &pID->WMP.sDescMetadata;
516
+ // convert metadata to FITAG and store into the EXIF_MAIN metadata model
517
+ ReadPropVariant(WMP_tagImageDescription, pDescMetadata->pvarImageDescription, dib);
518
+ ReadPropVariant(WMP_tagCameraMake, pDescMetadata->pvarCameraMake, dib);
519
+ ReadPropVariant(WMP_tagCameraModel, pDescMetadata->pvarCameraModel, dib);
520
+ ReadPropVariant(WMP_tagSoftware, pDescMetadata->pvarSoftware, dib);
521
+ ReadPropVariant(WMP_tagDateTime, pDescMetadata->pvarDateTime, dib);
522
+ ReadPropVariant(WMP_tagArtist, pDescMetadata->pvarArtist, dib);
523
+ ReadPropVariant(WMP_tagCopyright, pDescMetadata->pvarCopyright, dib);
524
+ ReadPropVariant(WMP_tagRatingStars, pDescMetadata->pvarRatingStars, dib);
525
+ ReadPropVariant(WMP_tagRatingValue, pDescMetadata->pvarRatingValue, dib);
526
+ ReadPropVariant(WMP_tagCaption, pDescMetadata->pvarCaption, dib);
527
+ ReadPropVariant(WMP_tagDocumentName, pDescMetadata->pvarDocumentName, dib);
528
+ ReadPropVariant(WMP_tagPageName, pDescMetadata->pvarPageName, dib);
529
+ ReadPropVariant(WMP_tagPageNumber, pDescMetadata->pvarPageNumber, dib);
530
+ ReadPropVariant(WMP_tagHostComputer, pDescMetadata->pvarHostComputer, dib);
531
+ return WMP_errSuccess;
532
+ }
533
+
534
+ /**
535
+ Read ICC, XMP, Exif, Exif-GPS, IPTC, descriptive (i.e. Exif-TIFF) metadata
536
+ @see ReadProfile, ReadDescriptiveMetadata
537
+ */
538
+ static ERR
539
+ ReadMetadata(PKImageDecode *pID, FIBITMAP *dib) {
540
+ ERR error_code = 0; // error code as returned by the interface
541
+ size_t currentPos = 0; // current stream position
542
+
543
+ WMPStream *pStream = pID->pStream;
544
+ WmpDEMisc *wmiDEMisc = &pID->WMP.wmiDEMisc;
545
+ BYTE *pbProfile = NULL;
546
+
547
+ try {
548
+ // save current position
549
+ error_code = pStream->GetPos(pStream, &currentPos);
550
+ JXR_CHECK(error_code);
551
+
552
+ // ICC profile
553
+ if(0 != wmiDEMisc->uColorProfileByteCount) {
554
+ unsigned cbByteCount = wmiDEMisc->uColorProfileByteCount;
555
+ unsigned uOffset = wmiDEMisc->uColorProfileOffset;
556
+ error_code = ReadProfile(pStream, cbByteCount, uOffset, &pbProfile);
557
+ JXR_CHECK(error_code);
558
+ FreeImage_CreateICCProfile(dib, pbProfile, cbByteCount);
559
+ }
560
+
561
+ // XMP metadata
562
+ if(0 != wmiDEMisc->uXMPMetadataByteCount) {
563
+ unsigned cbByteCount = wmiDEMisc->uXMPMetadataByteCount;
564
+ unsigned uOffset = wmiDEMisc->uXMPMetadataOffset;
565
+ error_code = ReadProfile(pStream, cbByteCount, uOffset, &pbProfile);
566
+ JXR_CHECK(error_code);
567
+ // store the tag as XMP
568
+ FITAG *tag = FreeImage_CreateTag();
569
+ if(tag) {
570
+ FreeImage_SetTagLength(tag, cbByteCount);
571
+ FreeImage_SetTagCount(tag, cbByteCount);
572
+ FreeImage_SetTagType(tag, FIDT_ASCII);
573
+ FreeImage_SetTagValue(tag, pbProfile);
574
+ FreeImage_SetTagKey(tag, g_TagLib_XMPFieldName);
575
+ FreeImage_SetMetadata(FIMD_XMP, dib, FreeImage_GetTagKey(tag), tag);
576
+ FreeImage_DeleteTag(tag);
577
+ }
578
+ }
579
+
580
+ // IPTC metadata
581
+ if(0 != wmiDEMisc->uIPTCNAAMetadataByteCount) {
582
+ unsigned cbByteCount = wmiDEMisc->uIPTCNAAMetadataByteCount;
583
+ unsigned uOffset = wmiDEMisc->uIPTCNAAMetadataOffset;
584
+ error_code = ReadProfile(pStream, cbByteCount, uOffset, &pbProfile);
585
+ JXR_CHECK(error_code);
586
+ // decode the IPTC profile
587
+ read_iptc_profile(dib, pbProfile, cbByteCount);
588
+ }
589
+
590
+ // Exif metadata
591
+ if(0 != wmiDEMisc->uEXIFMetadataByteCount) {
592
+ unsigned cbByteCount = wmiDEMisc->uEXIFMetadataByteCount;
593
+ unsigned uOffset = wmiDEMisc->uEXIFMetadataOffset;
594
+ error_code = ReadProfile(pStream, cbByteCount, uOffset, &pbProfile);
595
+ JXR_CHECK(error_code);
596
+ // decode the Exif profile
597
+ jpegxr_read_exif_profile(dib, pbProfile, cbByteCount, uOffset);
598
+ }
599
+
600
+ // Exif-GPS metadata
601
+ if(0 != wmiDEMisc->uGPSInfoMetadataByteCount) {
602
+ unsigned cbByteCount = wmiDEMisc->uGPSInfoMetadataByteCount;
603
+ unsigned uOffset = wmiDEMisc->uGPSInfoMetadataOffset;
604
+ error_code = ReadProfile(pStream, cbByteCount, uOffset, &pbProfile);
605
+ JXR_CHECK(error_code);
606
+ // decode the Exif-GPS profile
607
+ jpegxr_read_exif_gps_profile(dib, pbProfile, cbByteCount, uOffset);
608
+ }
609
+
610
+ // free profile buffer
611
+ free(pbProfile);
612
+ // restore initial position
613
+ error_code = pID->pStream->SetPos(pID->pStream, currentPos);
614
+ JXR_CHECK(error_code);
615
+
616
+ // as a LAST STEP, read descriptive metadata
617
+ // these metadata overwrite possible identical Exif-TIFF metadata
618
+ // that could have been read inside the Exif IFD
619
+
620
+ return ReadDescriptiveMetadata(pID, dib);
621
+
622
+ } catch(...) {
623
+ // free profile buffer
624
+ free(pbProfile);
625
+ if(currentPos) {
626
+ // restore initial position
627
+ pStream->SetPos(pStream, currentPos);
628
+ }
629
+ return error_code;
630
+ }
631
+ }
632
+
633
+ // ==========================================================
634
+ // Metadata saving
635
+ // ==========================================================
636
+
637
+ /**
638
+ Convert a FITAG (coming from FIMD_EXIF_MAIN) to a DPKPROPVARIANT.
639
+ No allocation is needed here, the function just copy pointers when needed.
640
+ @see WriteDescriptiveMetadata
641
+ */
642
+ static BOOL
643
+ WritePropVariant(FIBITMAP *dib, WORD tag_id, DPKPROPVARIANT & varDst) {
644
+ FITAG *tag = NULL;
645
+
646
+ TagLib& s = TagLib::instance();
647
+
648
+ // clear output DPKPROPVARIANT
649
+ varDst.vt = DPKVT_EMPTY;
650
+
651
+ // given the tag id, get the tag key
652
+ const char *key = s.getTagFieldName(TagLib::EXIF_MAIN, tag_id, NULL);
653
+ // then, get the tag info
654
+ if(!FreeImage_GetMetadata(FIMD_EXIF_MAIN, dib, key, &tag)) {
655
+ return FALSE;
656
+ }
657
+
658
+ // set the tag value
659
+ switch(FreeImage_GetTagType(tag)) {
660
+ case FIDT_ASCII:
661
+ varDst.vt = DPKVT_LPSTR;
662
+ varDst.VT.pszVal = (char*)FreeImage_GetTagValue(tag);
663
+ break;
664
+ case FIDT_BYTE:
665
+ case FIDT_UNDEFINED:
666
+ varDst.vt = DPKVT_LPWSTR;
667
+ varDst.VT.pwszVal = (U16*)FreeImage_GetTagValue(tag);
668
+ break;
669
+ case FIDT_SHORT:
670
+ varDst.vt = DPKVT_UI2;
671
+ varDst.VT.uiVal = *((U16*)FreeImage_GetTagValue(tag));
672
+ break;
673
+ case FIDT_LONG:
674
+ varDst.vt = DPKVT_UI4;
675
+ varDst.VT.ulVal = *((U32*)FreeImage_GetTagValue(tag));
676
+ break;
677
+ default:
678
+ break;
679
+ }
680
+
681
+ return TRUE;
682
+ }
683
+
684
+ /**
685
+ Write EXIF_MAIN metadata to JPEG-XR descriptive metadata
686
+ @see WritePropVariant
687
+ */
688
+ static ERR
689
+ WriteDescriptiveMetadata(PKImageEncode *pIE, FIBITMAP *dib) {
690
+ ERR error_code = 0; // error code as returned by the interface
691
+ DESCRIPTIVEMETADATA DescMetadata;
692
+
693
+ // fill the DESCRIPTIVEMETADATA structure (use pointers to arrays when needed)
694
+ WritePropVariant(dib, WMP_tagImageDescription, DescMetadata.pvarImageDescription);
695
+ WritePropVariant(dib, WMP_tagCameraMake, DescMetadata.pvarCameraMake);
696
+ WritePropVariant(dib, WMP_tagCameraModel, DescMetadata.pvarCameraModel);
697
+ WritePropVariant(dib, WMP_tagSoftware, DescMetadata.pvarSoftware);
698
+ WritePropVariant(dib, WMP_tagDateTime, DescMetadata.pvarDateTime);
699
+ WritePropVariant(dib, WMP_tagArtist, DescMetadata.pvarArtist);
700
+ WritePropVariant(dib, WMP_tagCopyright, DescMetadata.pvarCopyright);
701
+ WritePropVariant(dib, WMP_tagRatingStars, DescMetadata.pvarRatingStars);
702
+ WritePropVariant(dib, WMP_tagRatingValue, DescMetadata.pvarRatingValue);
703
+ WritePropVariant(dib, WMP_tagCaption, DescMetadata.pvarCaption);
704
+ WritePropVariant(dib, WMP_tagDocumentName, DescMetadata.pvarDocumentName);
705
+ WritePropVariant(dib, WMP_tagPageName, DescMetadata.pvarPageName);
706
+ WritePropVariant(dib, WMP_tagPageNumber, DescMetadata.pvarPageNumber);
707
+ WritePropVariant(dib, WMP_tagHostComputer, DescMetadata.pvarHostComputer);
708
+
709
+ // copy the structure to the encoder
710
+ error_code = pIE->SetDescriptiveMetadata(pIE, &DescMetadata);
711
+
712
+ // no need to free anything here
713
+ return error_code;
714
+ }
715
+
716
+ /**
717
+ Write ICC, XMP, Exif, Exif-GPS, IPTC, descriptive (i.e. Exif-TIFF) metadata
718
+ */
719
+ static ERR
720
+ WriteMetadata(PKImageEncode *pIE, FIBITMAP *dib) {
721
+ ERR error_code = 0; // error code as returned by the interface
722
+ BYTE *profile = NULL;
723
+ unsigned profile_size = 0;
724
+
725
+ try {
726
+ // write ICC profile
727
+ {
728
+ FIICCPROFILE *iccProfile = FreeImage_GetICCProfile(dib);
729
+ if(iccProfile->data) {
730
+ error_code = pIE->SetColorContext(pIE, (U8*)iccProfile->data, iccProfile->size);
731
+ JXR_CHECK(error_code);
732
+ }
733
+ }
734
+
735
+ // write descriptive metadata
736
+ if(FreeImage_GetMetadataCount(FIMD_EXIF_MAIN, dib)) {
737
+ error_code = WriteDescriptiveMetadata(pIE, dib);
738
+ JXR_CHECK(error_code);
739
+ }
740
+
741
+ // write IPTC metadata
742
+ if(FreeImage_GetMetadataCount(FIMD_IPTC, dib)) {
743
+ // create a binary profile
744
+ if(write_iptc_profile(dib, &profile, &profile_size)) {
745
+ // write the profile
746
+ error_code = PKImageEncode_SetIPTCNAAMetadata_WMP(pIE, profile, profile_size);
747
+ JXR_CHECK(error_code);
748
+ // release profile
749
+ free(profile);
750
+ profile = NULL;
751
+ }
752
+ }
753
+
754
+ // write XMP metadata
755
+ {
756
+ FITAG *tag_xmp = NULL;
757
+ if(FreeImage_GetMetadata(FIMD_XMP, dib, g_TagLib_XMPFieldName, &tag_xmp)) {
758
+ error_code = PKImageEncode_SetXMPMetadata_WMP(pIE, (BYTE*)FreeImage_GetTagValue(tag_xmp), FreeImage_GetTagLength(tag_xmp));
759
+ JXR_CHECK(error_code);
760
+ }
761
+ }
762
+
763
+ // write Exif metadata
764
+ {
765
+ if(tiff_get_ifd_profile(dib, FIMD_EXIF_EXIF, &profile, &profile_size)) {
766
+ error_code = PKImageEncode_SetEXIFMetadata_WMP(pIE, profile, profile_size);
767
+ JXR_CHECK(error_code);
768
+ // release profile
769
+ free(profile);
770
+ profile = NULL;
771
+ }
772
+ }
773
+
774
+ // write Exif GPS metadata
775
+ {
776
+ if(tiff_get_ifd_profile(dib, FIMD_EXIF_GPS, &profile, &profile_size)) {
777
+ error_code = PKImageEncode_SetGPSInfoMetadata_WMP(pIE, profile, profile_size);
778
+ JXR_CHECK(error_code);
779
+ // release profile
780
+ free(profile);
781
+ profile = NULL;
782
+ }
783
+ }
784
+
785
+ return WMP_errSuccess;
786
+
787
+ } catch(...) {
788
+ free(profile);
789
+ return error_code;
790
+ }
791
+ }
792
+
793
+
794
+
795
+ // ==========================================================
796
+ // Quantization tables (Y, U, V, YHP, UHP, VHP),
797
+ // optimized for PSNR
798
+ // ==========================================================
799
+
800
+ static const int DPK_QPS_420[11][6] = { // for 8 bit only
801
+ { 66, 65, 70, 72, 72, 77 },
802
+ { 59, 58, 63, 64, 63, 68 },
803
+ { 52, 51, 57, 56, 56, 61 },
804
+ { 48, 48, 54, 51, 50, 55 },
805
+ { 43, 44, 48, 46, 46, 49 },
806
+ { 37, 37, 42, 38, 38, 43 },
807
+ { 26, 28, 31, 27, 28, 31 },
808
+ { 16, 17, 22, 16, 17, 21 },
809
+ { 10, 11, 13, 10, 10, 13 },
810
+ { 5, 5, 6, 5, 5, 6 },
811
+ { 2, 2, 3, 2, 2, 2 }
812
+ };
813
+
814
+ static const int DPK_QPS_8[12][6] = {
815
+ { 67, 79, 86, 72, 90, 98 },
816
+ { 59, 74, 80, 64, 83, 89 },
817
+ { 53, 68, 75, 57, 76, 83 },
818
+ { 49, 64, 71, 53, 70, 77 },
819
+ { 45, 60, 67, 48, 67, 74 },
820
+ { 40, 56, 62, 42, 59, 66 },
821
+ { 33, 49, 55, 35, 51, 58 },
822
+ { 27, 44, 49, 28, 45, 50 },
823
+ { 20, 36, 42, 20, 38, 44 },
824
+ { 13, 27, 34, 13, 28, 34 },
825
+ { 7, 17, 21, 8, 17, 21 }, // Photoshop 100%
826
+ { 2, 5, 6, 2, 5, 6 }
827
+ };
828
+
829
+ static const int DPK_QPS_16[11][6] = {
830
+ { 197, 203, 210, 202, 207, 213 },
831
+ { 174, 188, 193, 180, 189, 196 },
832
+ { 152, 167, 173, 156, 169, 174 },
833
+ { 135, 152, 157, 137, 153, 158 },
834
+ { 119, 137, 141, 119, 138, 142 },
835
+ { 102, 120, 125, 100, 120, 124 },
836
+ { 82, 98, 104, 79, 98, 103 },
837
+ { 60, 76, 81, 58, 76, 81 },
838
+ { 39, 52, 58, 36, 52, 58 },
839
+ { 16, 27, 33, 14, 27, 33 },
840
+ { 5, 8, 9, 4, 7, 8 }
841
+ };
842
+
843
+ static const int DPK_QPS_16f[11][6] = {
844
+ { 148, 177, 171, 165, 187, 191 },
845
+ { 133, 155, 153, 147, 172, 181 },
846
+ { 114, 133, 138, 130, 157, 167 },
847
+ { 97, 118, 120, 109, 137, 144 },
848
+ { 76, 98, 103, 85, 115, 121 },
849
+ { 63, 86, 91, 62, 96, 99 },
850
+ { 46, 68, 71, 43, 73, 75 },
851
+ { 29, 48, 52, 27, 48, 51 },
852
+ { 16, 30, 35, 14, 29, 34 },
853
+ { 8, 14, 17, 7, 13, 17 },
854
+ { 3, 5, 7, 3, 5, 6 }
855
+ };
856
+
857
+ static const int DPK_QPS_32f[11][6] = {
858
+ { 194, 206, 209, 204, 211, 217 },
859
+ { 175, 187, 196, 186, 193, 205 },
860
+ { 157, 170, 177, 167, 180, 190 },
861
+ { 133, 152, 156, 144, 163, 168 },
862
+ { 116, 138, 142, 117, 143, 148 },
863
+ { 98, 120, 123, 96, 123, 126 },
864
+ { 80, 99, 102, 78, 99, 102 },
865
+ { 65, 79, 84, 63, 79, 84 },
866
+ { 48, 61, 67, 45, 60, 66 },
867
+ { 27, 41, 46, 24, 40, 45 },
868
+ { 3, 22, 24, 2, 21, 22 }
869
+ };
870
+
871
+ // ==========================================================
872
+ // Plugin Implementation
873
+ // ==========================================================
874
+
875
+ static const char * DLL_CALLCONV
876
+ Format() {
877
+ return "JPEG-XR";
878
+ }
879
+
880
+ static const char * DLL_CALLCONV
881
+ Description() {
882
+ return "JPEG XR image format";
883
+ }
884
+
885
+ static const char * DLL_CALLCONV
886
+ Extension() {
887
+ return "jxr,wdp,hdp";
888
+ }
889
+
890
+ static const char * DLL_CALLCONV
891
+ RegExpr() {
892
+ return NULL;
893
+ }
894
+
895
+ static const char * DLL_CALLCONV
896
+ MimeType() {
897
+ return "image/vnd.ms-photo";
898
+ }
899
+
900
+ static BOOL DLL_CALLCONV
901
+ Validate(FreeImageIO *io, fi_handle handle) {
902
+ BYTE jxr_signature[3] = { 0x49, 0x49, 0xBC };
903
+ BYTE signature[3] = { 0, 0, 0 };
904
+
905
+ io->read_proc(&signature, 1, 3, handle);
906
+
907
+ return (memcmp(jxr_signature, signature, 3) == 0);
908
+ }
909
+
910
+ static BOOL DLL_CALLCONV
911
+ SupportsExportDepth(int depth) {
912
+ return (
913
+ (depth == 1) ||
914
+ (depth == 8) ||
915
+ (depth == 16) ||
916
+ (depth == 24) ||
917
+ (depth == 32)
918
+ );
919
+ }
920
+
921
+ static BOOL DLL_CALLCONV
922
+ SupportsExportType(FREE_IMAGE_TYPE type) {
923
+ return (
924
+ (type == FIT_BITMAP) ||
925
+ (type == FIT_UINT16) ||
926
+ (type == FIT_RGB16) ||
927
+ (type == FIT_RGBA16) ||
928
+ (type == FIT_FLOAT) ||
929
+ (type == FIT_RGBF) ||
930
+ (type == FIT_RGBAF)
931
+ );
932
+ }
933
+
934
+ static BOOL DLL_CALLCONV
935
+ SupportsICCProfiles() {
936
+ return TRUE;
937
+ }
938
+
939
+ static BOOL DLL_CALLCONV
940
+ SupportsNoPixels() {
941
+ return TRUE;
942
+ }
943
+
944
+ // ==========================================================
945
+ // Open & Close
946
+ // ==========================================================
947
+
948
+ static void * DLL_CALLCONV
949
+ Open(FreeImageIO *io, fi_handle handle, BOOL read) {
950
+ WMPStream *pStream = NULL; // stream interface
951
+ if(io && handle) {
952
+ // allocate the FreeImageIO stream wrapper
953
+ FreeImageJXRIO *jxr_io = (FreeImageJXRIO*)malloc(sizeof(FreeImageJXRIO));
954
+ if(jxr_io) {
955
+ jxr_io->io = io;
956
+ jxr_io->handle = handle;
957
+ // create a JXR stream wrapper
958
+ if(_jxr_io_Create(&pStream, jxr_io) != WMP_errSuccess) {
959
+ free(jxr_io);
960
+ return NULL;
961
+ }
962
+ }
963
+ }
964
+ return pStream;
965
+ }
966
+
967
+ static void DLL_CALLCONV
968
+ Close(FreeImageIO *io, fi_handle handle, void *data) {
969
+ WMPStream *pStream = (WMPStream*)data;
970
+ if(pStream) {
971
+ // free the FreeImageIO stream wrapper
972
+ FreeImageJXRIO *jxr_io = (FreeImageJXRIO*)pStream->state.pvObj;
973
+ free(jxr_io);
974
+ // free the JXR stream wrapper
975
+ pStream->fMem = TRUE;
976
+ _jxr_io_Close(&pStream);
977
+ }
978
+ }
979
+
980
+ // ==========================================================
981
+ // Load
982
+ // ==========================================================
983
+
984
+ /**
985
+ Set decoder parameters
986
+ @param pDecoder Decoder handle
987
+ @param flags FreeImage load flags
988
+ */
989
+ static void
990
+ SetDecoderParameters(PKImageDecode *pDecoder, int flags) {
991
+ // load image & alpha for formats with alpha
992
+ pDecoder->WMP.wmiSCP.uAlphaMode = 2;
993
+ // more options to come ...
994
+ }
995
+
996
+ /**
997
+ Copy or convert & copy decoded pixels into the dib
998
+ @param pDecoder Decoder handle
999
+ @param out_guid_format Target guid format
1000
+ @param dib Output dib
1001
+ @param width Image width
1002
+ @param height Image height
1003
+ @return Returns 0 if successful, returns ERR otherwise
1004
+ */
1005
+ static ERR
1006
+ CopyPixels(PKImageDecode *pDecoder, PKPixelFormatGUID out_guid_format, FIBITMAP *dib, int width, int height) {
1007
+ PKFormatConverter *pConverter = NULL; // pixel format converter
1008
+ ERR error_code = 0; // error code as returned by the interface
1009
+ BYTE *pb = NULL; // local buffer used for pixel format conversion
1010
+
1011
+ // image dimensions
1012
+ const PKRect rect = {0, 0, width, height};
1013
+
1014
+ try {
1015
+ // get input file pixel format ...
1016
+ PKPixelFormatGUID in_guid_format;
1017
+ error_code = pDecoder->GetPixelFormat(pDecoder, &in_guid_format);
1018
+ JXR_CHECK(error_code);
1019
+
1020
+ // is a format conversion needed ?
1021
+
1022
+ if(IsEqualGUID(out_guid_format, in_guid_format)) {
1023
+ // no conversion, load bytes "as is" ...
1024
+
1025
+ // get a pointer to dst pixel data
1026
+ BYTE *dib_bits = FreeImage_GetBits(dib);
1027
+
1028
+ // get dst pitch (count of BYTE for stride)
1029
+ const unsigned cbStride = FreeImage_GetPitch(dib);
1030
+
1031
+ // decode and copy bits to dst array
1032
+ error_code = pDecoder->Copy(pDecoder, &rect, dib_bits, cbStride);
1033
+ JXR_CHECK(error_code);
1034
+ }
1035
+ else {
1036
+ // we need to use the conversion API ...
1037
+
1038
+ // allocate the pixel format converter
1039
+ error_code = PKCodecFactory_CreateFormatConverter(&pConverter);
1040
+ JXR_CHECK(error_code);
1041
+
1042
+ // set the conversion function
1043
+ error_code = pConverter->Initialize(pConverter, pDecoder, NULL, out_guid_format);
1044
+ JXR_CHECK(error_code);
1045
+
1046
+ // get the maximum stride
1047
+ unsigned cbStride = 0;
1048
+ {
1049
+ PKPixelInfo pPIFrom;
1050
+ PKPixelInfo pPITo;
1051
+
1052
+ pPIFrom.pGUIDPixFmt = &in_guid_format;
1053
+ error_code = PixelFormatLookup(&pPIFrom, LOOKUP_FORWARD);
1054
+ JXR_CHECK(error_code);
1055
+
1056
+ pPITo.pGUIDPixFmt = &out_guid_format;
1057
+ error_code = PixelFormatLookup(&pPITo, LOOKUP_FORWARD);
1058
+ JXR_CHECK(error_code);
1059
+
1060
+ unsigned cbStrideFrom = ((pPIFrom.cbitUnit + 7) >> 3) * width;
1061
+ unsigned cbStrideTo = ((pPITo.cbitUnit + 7) >> 3) * width;
1062
+ cbStride = MAX(cbStrideFrom, cbStrideTo);
1063
+ }
1064
+
1065
+ // allocate a local decoder / encoder buffer
1066
+ error_code = PKAllocAligned((void **) &pb, cbStride * height, 128);
1067
+ JXR_CHECK(error_code);
1068
+
1069
+ // copy / convert pixels
1070
+ error_code = pConverter->Copy(pConverter, &rect, pb, cbStride);
1071
+ JXR_CHECK(error_code);
1072
+
1073
+ // now copy pixels into the dib
1074
+ const size_t line_size = FreeImage_GetLine(dib);
1075
+ for(int y = 0; y < height; y++) {
1076
+ BYTE *src_bits = (BYTE*)(pb + y * cbStride);
1077
+ BYTE *dst_bits = (BYTE*)FreeImage_GetScanLine(dib, y);
1078
+ memcpy(dst_bits, src_bits, line_size);
1079
+ }
1080
+
1081
+ // free the local buffer
1082
+ PKFreeAligned((void **) &pb);
1083
+
1084
+ // free the pixel format converter
1085
+ PKFormatConverter_Release(&pConverter);
1086
+ }
1087
+
1088
+ // FreeImage DIB are upside-down relative to usual graphic conventions
1089
+ FreeImage_FlipVertical(dib);
1090
+
1091
+ // post-processing ...
1092
+ // -------------------
1093
+
1094
+ // swap RGB as needed
1095
+
1096
+ #if FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_BGR
1097
+ if(IsEqualGUID(out_guid_format, GUID_PKPixelFormat24bppRGB) || IsEqualGUID(out_guid_format, GUID_PKPixelFormat32bppRGB)) {
1098
+ SwapRedBlue32(dib);
1099
+ }
1100
+ #elif FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_RGB
1101
+ if(IsEqualGUID(out_guid_format, GUID_PKPixelFormat24bppBGR) || IsEqualGUID(out_guid_format, GUID_PKPixelFormat32bppBGR)) {
1102
+ SwapRedBlue32(dib);
1103
+ }
1104
+ #endif
1105
+
1106
+ return WMP_errSuccess;
1107
+
1108
+ } catch(...) {
1109
+ // free the local buffer
1110
+ PKFreeAligned((void **) &pb);
1111
+ // free the pixel format converter
1112
+ PKFormatConverter_Release(&pConverter);
1113
+
1114
+ return error_code;
1115
+ }
1116
+ }
1117
+
1118
+ // --------------------------------------------------------------------------
1119
+
1120
+ static FIBITMAP * DLL_CALLCONV
1121
+ Load(FreeImageIO *io, fi_handle handle, int page, int flags, void *data) {
1122
+ PKImageDecode *pDecoder = NULL; // decoder interface
1123
+ ERR error_code = 0; // error code as returned by the interface
1124
+ PKPixelFormatGUID guid_format; // loaded pixel format (== input file pixel format if no conversion needed)
1125
+
1126
+ FREE_IMAGE_TYPE image_type = FIT_UNKNOWN; // input image type
1127
+ unsigned bpp = 0; // input image bit depth
1128
+ FIBITMAP *dib = NULL;
1129
+
1130
+ // get the I/O stream wrapper
1131
+ WMPStream *pDecodeStream = (WMPStream*)data;
1132
+
1133
+ if(!handle || !pDecodeStream) {
1134
+ return NULL;
1135
+ }
1136
+
1137
+ BOOL header_only = (flags & FIF_LOAD_NOPIXELS) == FIF_LOAD_NOPIXELS;
1138
+
1139
+ try {
1140
+ int width, height; // image dimensions (in pixels)
1141
+
1142
+ // create a JXR decoder interface and initialize function pointers with *_WMP functions
1143
+ error_code = PKImageDecode_Create_WMP(&pDecoder);
1144
+ JXR_CHECK(error_code);
1145
+
1146
+ // attach the stream to the decoder ...
1147
+ // ... then read the image container and the metadata
1148
+ error_code = pDecoder->Initialize(pDecoder, pDecodeStream);
1149
+ JXR_CHECK(error_code);
1150
+
1151
+ // set decoder parameters
1152
+ SetDecoderParameters(pDecoder, flags);
1153
+
1154
+ // get dst image format specifications
1155
+ unsigned red_mask = 0, green_mask = 0, blue_mask = 0;
1156
+ error_code = GetInputPixelFormat(pDecoder, &guid_format, &image_type, &bpp, &red_mask, &green_mask, &blue_mask);
1157
+ JXR_CHECK(error_code);
1158
+
1159
+ // get image dimensions
1160
+ pDecoder->GetSize(pDecoder, &width, &height);
1161
+
1162
+ // allocate dst image
1163
+ {
1164
+ dib = FreeImage_AllocateHeaderT(header_only, image_type, width, height, bpp, red_mask, green_mask, blue_mask);
1165
+ if(!dib) {
1166
+ throw FI_MSG_ERROR_DIB_MEMORY;
1167
+ }
1168
+ if(FreeImage_GetBPP(dib) == 1) {
1169
+ // BD_1 - build a FIC_MINISBLACK palette
1170
+ RGBQUAD *pal = FreeImage_GetPalette(dib);
1171
+ pal[0].rgbRed = pal[0].rgbGreen = pal[0].rgbBlue = 0;
1172
+ pal[1].rgbRed = pal[1].rgbGreen = pal[1].rgbBlue = 255;
1173
+ }
1174
+ }
1175
+
1176
+ // get image resolution
1177
+ {
1178
+ float resX, resY; // image resolution (in dots per inch)
1179
+ // convert from English units, i.e. dots per inch to universal units, i.e. dots per meter
1180
+ pDecoder->GetResolution(pDecoder, &resX, &resY);
1181
+ FreeImage_SetDotsPerMeterX(dib, (unsigned)(resX / 0.0254F + 0.5F));
1182
+ FreeImage_SetDotsPerMeterY(dib, (unsigned)(resY / 0.0254F + 0.5F));
1183
+ }
1184
+
1185
+ // get metadata & ICC profile
1186
+ error_code = ReadMetadata(pDecoder, dib);
1187
+ JXR_CHECK(error_code);
1188
+
1189
+ if(header_only) {
1190
+ // header only mode ...
1191
+
1192
+ // free the decoder
1193
+ pDecoder->Release(&pDecoder);
1194
+ assert(pDecoder == NULL);
1195
+
1196
+ return dib;
1197
+ }
1198
+
1199
+ // copy pixels into the dib, perform pixel conversion if needed
1200
+ error_code = CopyPixels(pDecoder, guid_format, dib, width, height);
1201
+ JXR_CHECK(error_code);
1202
+
1203
+ // free the decoder
1204
+ pDecoder->Release(&pDecoder);
1205
+ assert(pDecoder == NULL);
1206
+
1207
+ return dib;
1208
+
1209
+ } catch (const char *message) {
1210
+ // unload the dib
1211
+ FreeImage_Unload(dib);
1212
+ // free the decoder
1213
+ pDecoder->Release(&pDecoder);
1214
+
1215
+ if(NULL != message) {
1216
+ FreeImage_OutputMessageProc(s_format_id, message);
1217
+ }
1218
+ }
1219
+
1220
+ return NULL;
1221
+ }
1222
+
1223
+ // ==========================================================
1224
+ // Save
1225
+ // ==========================================================
1226
+
1227
+ /**
1228
+ Configure compression parameters
1229
+
1230
+ ImageQuality Q (BD==1) Q (BD==8) Q (BD==16) Q (BD==32F) Subsample Overlap
1231
+ [0.0, 0.4] 8-IQ*5 (see table) (see table) (see table) 4:4:4 2
1232
+ (0.4, 0.8) 8-IQ*5 (see table) (see table) (see table) 4:4:4 1
1233
+ [0.8, 1.0) 8-IQ*5 (see table) (see table) (see table) 4:4:4 1
1234
+ [1.0, 1.0] 1 1 1 1 4:4:4 0
1235
+
1236
+ @param wmiSCP Encoder parameters
1237
+ @param pixelInfo Image specifications
1238
+ @param fltImageQuality Image output quality in [0..1), 1 means lossless
1239
+ */
1240
+ static void
1241
+ SetCompression(CWMIStrCodecParam *wmiSCP, const PKPixelInfo *pixelInfo, float fltImageQuality) {
1242
+ if(fltImageQuality < 1.0F) {
1243
+ // overlap
1244
+ if(fltImageQuality >= 0.5F) {
1245
+ wmiSCP->olOverlap = OL_ONE;
1246
+ } else {
1247
+ wmiSCP->olOverlap = OL_TWO;
1248
+ }
1249
+ // chroma sub-sampling
1250
+ if(fltImageQuality >= 0.5F || pixelInfo->uBitsPerSample > 8) {
1251
+ wmiSCP->cfColorFormat = YUV_444;
1252
+ } else {
1253
+ wmiSCP->cfColorFormat = YUV_420;
1254
+ }
1255
+
1256
+ // bit depth
1257
+ if(pixelInfo->bdBitDepth == BD_1) {
1258
+ wmiSCP->uiDefaultQPIndex = (U8)(8 - 5.0F * fltImageQuality + 0.5F);
1259
+ }
1260
+ else {
1261
+ // remap [0.8, 0.866, 0.933, 1.0] to [0.8, 0.9, 1.0, 1.1]
1262
+ // to use 8-bit DPK QP table (0.933 == Photoshop JPEG 100)
1263
+ if(fltImageQuality > 0.8F && pixelInfo->bdBitDepth == BD_8 && wmiSCP->cfColorFormat != YUV_420 && wmiSCP->cfColorFormat != YUV_422) {
1264
+ fltImageQuality = 0.8F + (fltImageQuality - 0.8F) * 1.5F;
1265
+ }
1266
+
1267
+ const int qi = (int) (10.0F * fltImageQuality);
1268
+ const float qf = 10.0F * fltImageQuality - (float)qi;
1269
+
1270
+ const int *pQPs =
1271
+ (wmiSCP->cfColorFormat == YUV_420 || wmiSCP->cfColorFormat == YUV_422) ?
1272
+ DPK_QPS_420[qi] :
1273
+ (pixelInfo->bdBitDepth == BD_8 ? DPK_QPS_8[qi] :
1274
+ (pixelInfo->bdBitDepth == BD_16 ? DPK_QPS_16[qi] :
1275
+ (pixelInfo->bdBitDepth == BD_16F ? DPK_QPS_16f[qi] :
1276
+ DPK_QPS_32f[qi])));
1277
+
1278
+ wmiSCP->uiDefaultQPIndex = (U8) (0.5F + (float) pQPs[0] * (1.0F - qf) + (float) (pQPs + 6)[0] * qf);
1279
+ wmiSCP->uiDefaultQPIndexU = (U8) (0.5F + (float) pQPs[1] * (1.0F - qf) + (float) (pQPs + 6)[1] * qf);
1280
+ wmiSCP->uiDefaultQPIndexV = (U8) (0.5F + (float) pQPs[2] * (1.0F - qf) + (float) (pQPs + 6)[2] * qf);
1281
+ wmiSCP->uiDefaultQPIndexYHP = (U8) (0.5F + (float) pQPs[3] * (1.0F - qf) + (float) (pQPs + 6)[3] * qf);
1282
+ wmiSCP->uiDefaultQPIndexUHP = (U8) (0.5F + (float) pQPs[4] * (1.0F - qf) + (float) (pQPs + 6)[4] * qf);
1283
+ wmiSCP->uiDefaultQPIndexVHP = (U8) (0.5F + (float) pQPs[5] * (1.0F - qf) + (float) (pQPs + 6)[5] * qf);
1284
+ }
1285
+ } // fltImageQuality < 1.0F
1286
+ else {
1287
+ // lossless mode
1288
+ wmiSCP->uiDefaultQPIndex = 1;
1289
+ }
1290
+ }
1291
+
1292
+ /**
1293
+ Set encoder parameters
1294
+ @param wmiSCP Encoder parameters
1295
+ @param pixelInfo Image specifications
1296
+ @param flags FreeImage save flags
1297
+ @param bHasAlpha TRUE if an alpha layer is present
1298
+ */
1299
+ static void
1300
+ SetEncoderParameters(CWMIStrCodecParam *wmiSCP, const PKPixelInfo *pixelInfo, int flags, BOOL bHasAlpha) {
1301
+ float fltImageQuality = 1.0F;
1302
+
1303
+ // all values have been set to zero by the API
1304
+ // update default values for some attributes
1305
+ wmiSCP->cfColorFormat = YUV_444; // color format
1306
+ wmiSCP->bdBitDepth = BD_LONG; // internal bit depth
1307
+ wmiSCP->bfBitstreamFormat = SPATIAL; // compressed image data in spatial order
1308
+ wmiSCP->bProgressiveMode = FALSE; // sequential mode
1309
+ wmiSCP->olOverlap = OL_ONE; // single level overlap processing
1310
+ wmiSCP->cNumOfSliceMinus1H = 0; // # of horizontal slices
1311
+ wmiSCP->cNumOfSliceMinus1V = 0; // # of vertical slices
1312
+ wmiSCP->sbSubband = SB_ALL; // keep all subbands
1313
+ wmiSCP->uAlphaMode = 0; // 0:no alpha 1: alpha only else: something + alpha
1314
+ wmiSCP->uiDefaultQPIndex = 1; // quantization for grey or rgb layer(s), 1: lossless
1315
+ wmiSCP->uiDefaultQPIndexAlpha = 1; // quantization for alpha layer, 1: lossless
1316
+
1317
+ // process the flags
1318
+ // -----------------
1319
+
1320
+ // progressive mode
1321
+ if((flags & JXR_PROGRESSIVE) == JXR_PROGRESSIVE) {
1322
+ // turn on progressive mode (instead of sequential mode)
1323
+ wmiSCP->bProgressiveMode = TRUE;
1324
+ }
1325
+
1326
+ // quality in [0.01 - 1.0), 1.0 means lossless - default is 0.80
1327
+ int quality = flags & 0x7F;
1328
+ if(quality == 0) {
1329
+ // defaut to 0.80
1330
+ fltImageQuality = 0.8F;
1331
+ } else if((flags & JXR_LOSSLESS) == JXR_LOSSLESS) {
1332
+ fltImageQuality = 1.0F;
1333
+ } else {
1334
+ quality = (quality >= 100) ? 100 : quality;
1335
+ fltImageQuality = quality / 100.0F;
1336
+ }
1337
+ SetCompression(wmiSCP, pixelInfo, fltImageQuality);
1338
+
1339
+ // alpha compression
1340
+ if(bHasAlpha) {
1341
+ wmiSCP->uAlphaMode = 2; // encode with a planar alpha channel
1342
+ }
1343
+ }
1344
+
1345
+ // --------------------------------------------------------------------------
1346
+
1347
+ static BOOL DLL_CALLCONV
1348
+ Save(FreeImageIO *io, FIBITMAP *dib, fi_handle handle, int page, int flags, void *data) {
1349
+ BOOL bIsFlipped = FALSE; // FreeImage DIB are upside-down relative to usual graphic conventions
1350
+ PKPixelFormatGUID guid_format; // image format
1351
+ PKPixelInfo pixelInfo; // image specifications
1352
+ BOOL bHasAlpha = FALSE; // is alpha layer present ?
1353
+
1354
+ PKImageEncode *pEncoder = NULL; // encoder interface
1355
+ ERR error_code = 0; // error code as returned by the interface
1356
+
1357
+ // get the I/O stream wrapper
1358
+ WMPStream *pEncodeStream = (WMPStream*)data;
1359
+
1360
+ if(!dib || !handle || !pEncodeStream) {
1361
+ return FALSE;
1362
+ }
1363
+
1364
+ try {
1365
+ // get image dimensions
1366
+ unsigned width = FreeImage_GetWidth(dib);
1367
+ unsigned height = FreeImage_GetHeight(dib);
1368
+
1369
+ // check JPEG-XR limits
1370
+ if((width < MB_WIDTH_PIXEL) || (height < MB_HEIGHT_PIXEL)) {
1371
+ FreeImage_OutputMessageProc(s_format_id, "Unsupported image size: width x height = %d x %d", width, height);
1372
+ throw (const char*)NULL;
1373
+ }
1374
+
1375
+ // get output pixel format
1376
+ error_code = GetOutputPixelFormat(dib, &guid_format, &bHasAlpha);
1377
+ JXR_CHECK(error_code);
1378
+ pixelInfo.pGUIDPixFmt = &guid_format;
1379
+ error_code = PixelFormatLookup(&pixelInfo, LOOKUP_FORWARD);
1380
+ JXR_CHECK(error_code);
1381
+
1382
+ // create a JXR encoder interface and initialize function pointers with *_WMP functions
1383
+ error_code = PKImageEncode_Create_WMP(&pEncoder);
1384
+ JXR_CHECK(error_code);
1385
+
1386
+ // attach the stream to the encoder and set all encoder parameters to zero ...
1387
+ error_code = pEncoder->Initialize(pEncoder, pEncodeStream, &pEncoder->WMP.wmiSCP, sizeof(CWMIStrCodecParam));
1388
+ JXR_CHECK(error_code);
1389
+
1390
+ // ... then configure the encoder
1391
+ SetEncoderParameters(&pEncoder->WMP.wmiSCP, &pixelInfo, flags, bHasAlpha);
1392
+
1393
+ // set pixel format
1394
+ pEncoder->SetPixelFormat(pEncoder, guid_format);
1395
+
1396
+ // set image size
1397
+ pEncoder->SetSize(pEncoder, width, height);
1398
+
1399
+ // set resolution (convert from universal units to English units)
1400
+ float resX = (float)(unsigned)(0.5F + 0.0254F * FreeImage_GetDotsPerMeterX(dib));
1401
+ float resY = (float)(unsigned)(0.5F + 0.0254F * FreeImage_GetDotsPerMeterY(dib));
1402
+ pEncoder->SetResolution(pEncoder, resX, resY);
1403
+
1404
+ // set metadata
1405
+ WriteMetadata(pEncoder, dib);
1406
+
1407
+ // write metadata & pixels
1408
+ // -----------------------
1409
+
1410
+ // dib coordinates are upside-down relative to usual conventions
1411
+ bIsFlipped = FreeImage_FlipVertical(dib);
1412
+
1413
+ // get a pointer to dst pixel data
1414
+ BYTE *dib_bits = FreeImage_GetBits(dib);
1415
+
1416
+ // get dst pitch (count of BYTE for stride)
1417
+ const unsigned cbStride = FreeImage_GetPitch(dib);
1418
+
1419
+ // write metadata + pixels on output
1420
+ error_code = pEncoder->WritePixels(pEncoder, height, dib_bits, cbStride);
1421
+ JXR_CHECK(error_code);
1422
+
1423
+ // recover dib coordinates
1424
+ FreeImage_FlipVertical(dib);
1425
+
1426
+ // free the encoder
1427
+ pEncoder->Release(&pEncoder);
1428
+ assert(pEncoder == NULL);
1429
+
1430
+ return TRUE;
1431
+
1432
+ } catch (const char *message) {
1433
+ if(bIsFlipped) {
1434
+ // recover dib coordinates
1435
+ FreeImage_FlipVertical(dib);
1436
+ }
1437
+ if(pEncoder) {
1438
+ // free the encoder
1439
+ pEncoder->Release(&pEncoder);
1440
+ assert(pEncoder == NULL);
1441
+ }
1442
+ if(NULL != message) {
1443
+ FreeImage_OutputMessageProc(s_format_id, message);
1444
+ }
1445
+ }
1446
+
1447
+ return FALSE;
1448
+ }
1449
+
1450
+ // ==========================================================
1451
+ // Init
1452
+ // ==========================================================
1453
+
1454
+ void DLL_CALLCONV
1455
+ InitJXR(Plugin *plugin, int format_id) {
1456
+ s_format_id = format_id;
1457
+
1458
+ plugin->format_proc = Format;
1459
+ plugin->description_proc = Description;
1460
+ plugin->extension_proc = Extension;
1461
+ plugin->regexpr_proc = RegExpr;
1462
+ plugin->open_proc = Open;
1463
+ plugin->close_proc = Close;
1464
+ plugin->pagecount_proc = NULL;
1465
+ plugin->pagecapability_proc = NULL;
1466
+ plugin->load_proc = Load;
1467
+ plugin->save_proc = Save;
1468
+ plugin->validate_proc = Validate;
1469
+ plugin->mime_proc = MimeType;
1470
+ plugin->supports_export_bpp_proc = SupportsExportDepth;
1471
+ plugin->supports_export_type_proc = SupportsExportType;
1472
+ plugin->supports_icc_profiles_proc = SupportsICCProfiles;
1473
+ plugin->supports_no_pixels_proc = SupportsNoPixels;
1474
+ }
1475
+