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,1591 @@
1
+ // ==========================================================
2
+ // TARGA Loader and Writer
3
+ //
4
+ // Design and implementation by
5
+ // - Floris van den Berg (flvdberg@wxs.nl)
6
+ // - Jani Kajala (janik@remedy.fi)
7
+ // - Martin Weber (martweb@gmx.net)
8
+ // - Machiel ten Brinke (brinkem@uni-one.nl)
9
+ // - Peter Lemmens (peter.lemmens@planetinternet.be)
10
+ // - Hervé Drolon (drolon@infonie.fr)
11
+ // - Mihail Naydenov (mnaydenov@users.sourceforge.net)
12
+ //
13
+ // This file is part of FreeImage 3
14
+ //
15
+ // COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
16
+ // OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
17
+ // THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
18
+ // OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
19
+ // CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
20
+ // THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
21
+ // SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
22
+ // PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
23
+ // THIS DISCLAIMER.
24
+ //
25
+ // Use at your own risk!
26
+ // ==========================================================
27
+
28
+ #include "FreeImage.h"
29
+ #include "Utilities.h"
30
+
31
+ // ----------------------------------------------------------
32
+ // Constants + headers
33
+ // ----------------------------------------------------------
34
+
35
+ #ifdef _WIN32
36
+ #pragma pack(push, 1)
37
+ #else
38
+ #pragma pack(1)
39
+ #endif
40
+
41
+ typedef struct tagTGAHEADER {
42
+ BYTE id_length; //! length of the image ID field
43
+ BYTE color_map_type; //! whether a color map is included
44
+ BYTE image_type; //! compression and color types
45
+
46
+ WORD cm_first_entry; //! first entry index (offset into the color map table)
47
+ WORD cm_length; //! color map length (number of entries)
48
+ BYTE cm_size; //! color map entry size, in bits (number of bits per pixel)
49
+
50
+ WORD is_xorigin; //! X-origin of image (absolute coordinate of lower-left corner for displays where origin is at the lower left)
51
+ WORD is_yorigin; //! Y-origin of image (as for X-origin)
52
+ WORD is_width; //! image width
53
+ WORD is_height; //! image height
54
+ BYTE is_pixel_depth; //! bits per pixel
55
+ BYTE is_image_descriptor; //! image descriptor, bits 3-0 give the alpha channel depth, bits 5-4 give direction
56
+ } TGAHEADER;
57
+
58
+ typedef struct tagTGAEXTENSIONAREA {
59
+ WORD extension_size; // Size in bytes of the extension area, always 495
60
+ char author_name[41]; // Name of the author. If not used, bytes should be set to NULL (\0) or spaces
61
+ char author_comments[324]; // A comment, organized as four lines, each consisting of 80 characters plus a NULL
62
+ WORD datetime_stamp[6]; // Date and time at which the image was created
63
+ char job_name[41]; // Job ID
64
+ WORD job_time[3]; // Hours, minutes and seconds spent creating the file (for billing, etc.)
65
+ char software_id[41]; // The application that created the file
66
+ BYTE software_version[3];
67
+ DWORD key_color;
68
+ WORD pixel_aspect_ratio[2];
69
+ WORD gamma_value[2];
70
+ DWORD color_correction_offset; // Number of bytes from the beginning of the file to the color correction table if present
71
+ DWORD postage_stamp_offset; // Number of bytes from the beginning of the file to the postage stamp image if present
72
+ DWORD scan_line_offset; // Number of bytes from the beginning of the file to the scan lines table if present
73
+ BYTE attributes_type; // Specifies the alpha channel
74
+ } TGAEXTENSIONAREA;
75
+
76
+ typedef struct tagTGAFOOTER {
77
+ DWORD extension_offset; // extension area offset : offset in bytes from the beginning of the file
78
+ DWORD developer_offset; // developer directory offset : offset in bytes from the beginning of the file
79
+ char signature[18]; // signature string : contains "TRUEVISION-XFILE.\0"
80
+ } TGAFOOTER;
81
+
82
+ #ifdef _WIN32
83
+ #pragma pack(pop)
84
+ #else
85
+ #pragma pack()
86
+ #endif
87
+
88
+ static const char *FI_MSG_ERROR_CORRUPTED = "Image data corrupted";
89
+
90
+ // ----------------------------------------------------------
91
+ // Image type
92
+ //
93
+ #define TGA_NULL 0 // no image data included
94
+ #define TGA_CMAP 1 // uncompressed, color-mapped image
95
+ #define TGA_RGB 2 // uncompressed, true-color image
96
+ #define TGA_MONO 3 // uncompressed, black-and-white image
97
+ #define TGA_RLECMAP 9 // run-length encoded, color-mapped image
98
+ #define TGA_RLERGB 10 // run-length encoded, true-color image
99
+ #define TGA_RLEMONO 11 // run-length encoded, black-and-white image
100
+ #define TGA_CMPCMAP 32 // compressed (Huffman/Delta/RLE) color-mapped image (e.g., VDA/D) - Obsolete
101
+ #define TGA_CMPCMAP4 33 // compressed (Huffman/Delta/RLE) color-mapped four pass image (e.g., VDA/D) - Obsolete
102
+
103
+ // ==========================================================
104
+ // Thumbnail functions
105
+ // ==========================================================
106
+
107
+ class TargaThumbnail
108
+ {
109
+ public:
110
+ TargaThumbnail() : _w(0), _h(0), _depth(0), _data(NULL) {
111
+ }
112
+ ~TargaThumbnail() {
113
+ if(_data) {
114
+ free(_data);
115
+ }
116
+ }
117
+
118
+ BOOL isNull() const {
119
+ return (_data == NULL);
120
+ }
121
+
122
+ BOOL read(FreeImageIO *io, fi_handle handle, size_t size) {
123
+ io->read_proc(&_w, 1, 1, handle);
124
+ io->read_proc(&_h, 1, 1, handle);
125
+
126
+ const size_t sizeofData = size - 2;
127
+ _data = (BYTE*)malloc(sizeofData);
128
+ if(_data) {
129
+ return (io->read_proc(_data, 1, (unsigned)sizeofData, handle) == sizeofData);
130
+ }
131
+ return FALSE;
132
+ }
133
+
134
+ void setDepth(BYTE dp) {
135
+ _depth = dp;
136
+ }
137
+
138
+ FIBITMAP* toFIBITMAP();
139
+
140
+ private:
141
+ BYTE _w;
142
+ BYTE _h;
143
+ BYTE _depth;
144
+ BYTE* _data;
145
+ };
146
+
147
+ #ifdef FREEIMAGE_BIGENDIAN
148
+ static void
149
+ swapShortPixels(FIBITMAP* dib) {
150
+ if(FreeImage_GetImageType(dib) != FIT_BITMAP) {
151
+ return;
152
+ }
153
+
154
+ const unsigned Bpp = FreeImage_GetBPP(dib)/8;
155
+ if(Bpp != 2) {
156
+ return;
157
+ }
158
+
159
+ BYTE* bits = FreeImage_GetBits(dib);
160
+ const unsigned height = FreeImage_GetHeight(dib);
161
+ const unsigned pitch = FreeImage_GetPitch(dib);
162
+
163
+ BYTE* line = bits;
164
+ for(unsigned y = 0; y < height; y++, line += pitch) {
165
+ for(BYTE* pixel = line; pixel < line + pitch ; pixel += Bpp) {
166
+ SwapShort((WORD*)pixel);
167
+ }
168
+ }
169
+ }
170
+ #endif // FREEIMAGE_BIGENDIAN
171
+
172
+ FIBITMAP* TargaThumbnail::toFIBITMAP() {
173
+ if(isNull() || _depth == 0) {
174
+ return NULL;
175
+ }
176
+
177
+ const unsigned line_size = _depth * _w / 8;
178
+ FIBITMAP* dib = FreeImage_Allocate(_w, _h, _depth);
179
+ if(!dib) {
180
+ return NULL;
181
+ }
182
+
183
+ const BYTE* line = _data;
184
+ const BYTE height = _h;
185
+ for (BYTE h = 0; h < height; ++h, line += line_size) {
186
+ BYTE* dst_line = FreeImage_GetScanLine(dib, height - 1 - h);
187
+ memcpy(dst_line, line, line_size);
188
+ }
189
+
190
+ #ifdef FREEIMAGE_BIGENDIAN
191
+ swapShortPixels(dib);
192
+ #endif
193
+
194
+ #if FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_RGB
195
+ SwapRedBlue32(dib);
196
+ #endif
197
+
198
+ return dib;
199
+ }
200
+ // ==========================================================
201
+ // Internal functions
202
+ // ==========================================================
203
+
204
+ /** This class is used when loading RLE compressed images, it implements io cache of fixed size.
205
+ In general RLE compressed images *should* be compressed line by line with line sizes stored in Scan Line Table section.
206
+ In reality, however there are images not obeying the specification, compressing image data continuously across lines,
207
+ making it impossible to load the file cached at every line.
208
+ */
209
+ class IOCache
210
+ {
211
+ public:
212
+ IOCache(FreeImageIO *io, fi_handle handle, size_t size) :
213
+ _ptr(NULL), _begin(NULL), _end(NULL), _size(size), _io(io), _handle(handle) {
214
+ _begin = (BYTE*)malloc(size);
215
+ if (_begin) {
216
+ _end = _begin + _size;
217
+ _ptr = _end; // will force refill on first access
218
+ }
219
+ }
220
+
221
+ ~IOCache() {
222
+ if (_begin != NULL) {
223
+ free(_begin);
224
+ }
225
+ }
226
+
227
+ BOOL isNull() { return _begin == NULL;}
228
+
229
+ inline
230
+ BYTE getByte() {
231
+ if (_ptr >= _end) {
232
+ // need refill
233
+ _ptr = _begin;
234
+ _io->read_proc(_ptr, sizeof(BYTE), (unsigned)_size, _handle); //### EOF - no problem?
235
+ }
236
+
237
+ BYTE result = *_ptr;
238
+
239
+ _ptr++;
240
+
241
+ return result;
242
+ }
243
+
244
+ inline
245
+ BYTE* getBytes(size_t count /*must be < _size!*/) {
246
+ if (_ptr + count >= _end) {
247
+
248
+ // need refill
249
+
250
+ // 'count' bytes might span two cache bounds,
251
+ // SEEK back to add the remains of the current cache again into the new one
252
+
253
+ long read = long(_ptr - _begin);
254
+ long remaining = long(_size - read);
255
+
256
+ _io->seek_proc(_handle, -remaining, SEEK_CUR);
257
+
258
+ _ptr = _begin;
259
+ _io->read_proc(_ptr, sizeof(BYTE), (unsigned)_size, _handle); //### EOF - no problem?
260
+ }
261
+
262
+ BYTE *result = _ptr;
263
+
264
+ _ptr += count;
265
+
266
+ return result;
267
+ }
268
+
269
+ private:
270
+ IOCache& operator=(const IOCache& src); // deleted
271
+ IOCache(const IOCache& other); // deleted
272
+
273
+ private:
274
+ BYTE *_ptr;
275
+ BYTE *_begin;
276
+ BYTE *_end;
277
+ const size_t _size;
278
+ const FreeImageIO *_io;
279
+ const fi_handle _handle;
280
+ };
281
+
282
+ #ifdef FREEIMAGE_BIGENDIAN
283
+ static void
284
+ SwapHeader(TGAHEADER *header) {
285
+ SwapShort(&header->cm_first_entry);
286
+ SwapShort(&header->cm_length);
287
+ SwapShort(&header->is_xorigin);
288
+ SwapShort(&header->is_yorigin);
289
+ SwapShort(&header->is_width);
290
+ SwapShort(&header->is_height);
291
+ }
292
+
293
+ static void
294
+ SwapExtensionArea(TGAEXTENSIONAREA *ex) {
295
+ SwapShort(&ex->extension_size);
296
+ SwapShort(&ex->datetime_stamp[0]);
297
+ SwapShort(&ex->datetime_stamp[1]);
298
+ SwapShort(&ex->datetime_stamp[2]);
299
+ SwapShort(&ex->datetime_stamp[3]);
300
+ SwapShort(&ex->datetime_stamp[4]);
301
+ SwapShort(&ex->datetime_stamp[5]);
302
+ SwapShort(&ex->job_time[0]);
303
+ SwapShort(&ex->job_time[1]);
304
+ SwapShort(&ex->job_time[2]);
305
+ SwapLong (&ex->key_color);
306
+ SwapShort(&ex->pixel_aspect_ratio[0]);
307
+ SwapShort(&ex->pixel_aspect_ratio[1]);
308
+ SwapShort(&ex->gamma_value[0]);
309
+ SwapShort(&ex->gamma_value[1]);
310
+ SwapLong (&ex->color_correction_offset);
311
+ SwapLong (&ex->postage_stamp_offset);
312
+ SwapLong (&ex->scan_line_offset);
313
+ }
314
+
315
+ static void
316
+ SwapFooter(TGAFOOTER *footer) {
317
+ SwapLong(&footer->extension_offset);
318
+ SwapLong(&footer->developer_offset);
319
+ }
320
+
321
+ #endif // FREEIMAGE_BIGENDIAN
322
+
323
+ // ==========================================================
324
+ // Plugin Interface
325
+ // ==========================================================
326
+
327
+ static int s_format_id;
328
+
329
+ // ==========================================================
330
+ // Plugin Implementation
331
+ // ==========================================================
332
+
333
+ static const char * DLL_CALLCONV
334
+ Format() {
335
+ return "TARGA";
336
+ }
337
+
338
+ static const char * DLL_CALLCONV
339
+ Description() {
340
+ return "Truevision Targa";
341
+ }
342
+
343
+ static const char * DLL_CALLCONV
344
+ Extension() {
345
+ return "tga,targa";
346
+ }
347
+
348
+ static const char * DLL_CALLCONV
349
+ RegExpr() {
350
+ return NULL;
351
+ }
352
+
353
+ static const char * DLL_CALLCONV
354
+ MimeType() {
355
+ return "image/x-tga";
356
+ }
357
+
358
+ static BOOL
359
+ isTARGA20(FreeImageIO *io, fi_handle handle) {
360
+ const unsigned sizeofSig = 18;
361
+ BYTE signature[sizeofSig];
362
+ // tga_signature = "TRUEVISION-XFILE." (TGA 2.0 only)
363
+ BYTE tga_signature[sizeofSig] = { 84, 82, 85, 69, 86, 73, 83, 73, 79, 78, 45, 88, 70, 73, 76, 69, 46, 0 };
364
+ // get the start offset
365
+ const long start_offset = io->tell_proc(handle);
366
+ // get the end-of-file
367
+ io->seek_proc(handle, 0, SEEK_END);
368
+ const long eof = io->tell_proc(handle);
369
+ // read the signature
370
+ io->seek_proc(handle, start_offset + eof - sizeofSig, SEEK_SET);
371
+ io->read_proc(&signature, 1, sizeofSig, handle);
372
+ // rewind
373
+ io->seek_proc(handle, start_offset, SEEK_SET);
374
+
375
+ return (memcmp(tga_signature, signature, sizeofSig) == 0);
376
+ }
377
+
378
+ static BOOL DLL_CALLCONV
379
+ Validate(FreeImageIO *io, fi_handle handle) {
380
+ if(isTARGA20(io, handle)) {
381
+ return TRUE;
382
+ }
383
+
384
+ // not a 2.0 image, try testing if it's a valid TGA anyway (not robust)
385
+ {
386
+ const long start_offset = io->tell_proc(handle);
387
+
388
+ // get the header
389
+ TGAHEADER header;
390
+ io->read_proc(&header, sizeof(tagTGAHEADER), 1, handle);
391
+ #ifdef FREEIMAGE_BIGENDIAN
392
+ SwapHeader(&header);
393
+ #endif
394
+ // rewind
395
+ io->seek_proc(handle, start_offset, SEEK_SET);
396
+
397
+ // the color map type should be a 0 or a 1...
398
+ if(header.color_map_type != 0 && header.color_map_type != 1) {
399
+ return FALSE;
400
+ }
401
+ // if the color map type is 1 then we validate the map entry information...
402
+ if(header.color_map_type > 0) {
403
+ // it doesn't make any sense if the first entry is larger than the color map table
404
+ if(header.cm_first_entry >= header.cm_length) {
405
+ return FALSE;
406
+ }
407
+ // check header.cm_size, don't allow 0 or anything bigger than 32
408
+ if(header.cm_size == 0 || header.cm_size > 32) {
409
+ return FALSE;
410
+ }
411
+ }
412
+ // the width/height shouldn't be 0, right ?
413
+ if(header.is_width == 0 || header.is_height == 0) {
414
+ return FALSE;
415
+ }
416
+ // let's now verify all the types that are supported by FreeImage (this is our final verification)
417
+ switch(header.image_type) {
418
+ case TGA_CMAP:
419
+ case TGA_RGB:
420
+ case TGA_MONO:
421
+ case TGA_RLECMAP:
422
+ case TGA_RLERGB:
423
+ case TGA_RLEMONO:
424
+ switch(header.is_pixel_depth) {
425
+ case 8 :
426
+ case 16:
427
+ case 24:
428
+ case 32:
429
+ return TRUE;
430
+ default:
431
+ return FALSE;
432
+ }
433
+ break;
434
+ default:
435
+ return FALSE;
436
+ }
437
+ }
438
+ }
439
+
440
+ static BOOL DLL_CALLCONV
441
+ SupportsExportDepth(int depth) {
442
+ return (
443
+ (depth == 8) ||
444
+ (depth == 16) ||
445
+ (depth == 24) ||
446
+ (depth == 32)
447
+ );
448
+ }
449
+
450
+ static BOOL DLL_CALLCONV
451
+ SupportsExportType(FREE_IMAGE_TYPE type) {
452
+ return (type == FIT_BITMAP) ? TRUE : FALSE;
453
+ }
454
+
455
+ static BOOL DLL_CALLCONV
456
+ SupportsNoPixels() {
457
+ return TRUE;
458
+ }
459
+
460
+ // ----------------------------------------------------------
461
+
462
+ /**
463
+ Used for all 32 and 24 bit loading of uncompressed images
464
+ */
465
+ static void
466
+ loadTrueColor(FIBITMAP* dib, int width, int height, int file_pixel_size, FreeImageIO* io, fi_handle handle, BOOL as24bit) {
467
+ const int pixel_size = as24bit ? 3 : file_pixel_size;
468
+
469
+ // input line cache
470
+ BYTE* file_line = (BYTE*)malloc( width * file_pixel_size);
471
+
472
+ if (!file_line) {
473
+ throw FI_MSG_ERROR_MEMORY;
474
+ }
475
+
476
+ for (int y = 0; y < height; y++) {
477
+ BYTE *bits = FreeImage_GetScanLine(dib, y);
478
+ io->read_proc(file_line, file_pixel_size, width, handle);
479
+ BYTE *bgra = file_line;
480
+
481
+ for (int x = 0; x < width; x++) {
482
+
483
+ bits[FI_RGBA_BLUE] = bgra[0];
484
+ bits[FI_RGBA_GREEN] = bgra[1];
485
+ bits[FI_RGBA_RED] = bgra[2];
486
+
487
+ if (!as24bit) {
488
+ bits[FI_RGBA_ALPHA] = bgra[3];
489
+ }
490
+
491
+ bgra += file_pixel_size;
492
+
493
+ bits += pixel_size;
494
+ }
495
+ }
496
+
497
+ free(file_line);
498
+ }
499
+
500
+ /**
501
+ For the generic RLE loader we need to abstract away the pixel format.
502
+ We use a specific overload based on bits-per-pixel for each type of pixel
503
+ */
504
+
505
+ template <int nBITS>
506
+ inline static void
507
+ _assignPixel(BYTE* bits, BYTE* val, BOOL as24bit = FALSE) {
508
+ // static assert should go here
509
+ assert(FALSE);
510
+ }
511
+
512
+ template <>
513
+ inline void
514
+ _assignPixel<8>(BYTE* bits, BYTE* val, BOOL as24bit) {
515
+ *bits = *val;
516
+ }
517
+
518
+ template <>
519
+ inline void
520
+ _assignPixel<16>(BYTE* bits, BYTE* val, BOOL as24bit) {
521
+ WORD value(*reinterpret_cast<WORD*>(val));
522
+
523
+ #ifdef FREEIMAGE_BIGENDIAN
524
+ SwapShort(&value);
525
+ #endif
526
+
527
+ if (as24bit) {
528
+ bits[FI_RGBA_BLUE] = (BYTE)((((value & FI16_555_BLUE_MASK) >> FI16_555_BLUE_SHIFT) * 0xFF) / 0x1F);
529
+ bits[FI_RGBA_GREEN] = (BYTE)((((value & FI16_555_GREEN_MASK) >> FI16_555_GREEN_SHIFT) * 0xFF) / 0x1F);
530
+ bits[FI_RGBA_RED] = (BYTE)((((value & FI16_555_RED_MASK) >> FI16_555_RED_SHIFT) * 0xFF) / 0x1F);
531
+
532
+ } else {
533
+ *reinterpret_cast<WORD *>(bits) = 0x7FFF & value;
534
+ }
535
+ }
536
+
537
+ template <>
538
+ inline void
539
+ _assignPixel<24>(BYTE* bits, BYTE* val, BOOL as24bit) {
540
+ bits[FI_RGBA_BLUE] = val[0];
541
+ bits[FI_RGBA_GREEN] = val[1];
542
+ bits[FI_RGBA_RED] = val[2];
543
+ }
544
+
545
+ template <>
546
+ inline void
547
+ _assignPixel<32>(BYTE* bits, BYTE* val, BOOL as24bit) {
548
+ if (as24bit) {
549
+ _assignPixel<24>(bits, val, TRUE);
550
+
551
+ } else {
552
+ #if FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_BGR
553
+ *(reinterpret_cast<unsigned*>(bits)) = *(reinterpret_cast<unsigned*> (val));
554
+ #else // NOTE This is faster then doing reinterpret_cast to int + INPLACESWAP !
555
+ bits[FI_RGBA_BLUE] = val[0];
556
+ bits[FI_RGBA_GREEN] = val[1];
557
+ bits[FI_RGBA_RED] = val[2];
558
+ bits[FI_RGBA_ALPHA] = val[3];
559
+ #endif
560
+ }
561
+ }
562
+
563
+ /**
564
+ Generic RLE loader
565
+ */
566
+ template<int bPP>
567
+ static void
568
+ loadRLE(FIBITMAP* dib, int width, int height, FreeImageIO* io, fi_handle handle, long eof, BOOL as24bit) {
569
+ const int file_pixel_size = bPP/8;
570
+ const int pixel_size = as24bit ? 3 : file_pixel_size;
571
+
572
+ const BYTE bpp = as24bit ? 24 : bPP;
573
+ const int line_size = CalculateLine(width, bpp);
574
+
575
+ // Note, many of the params can be computed inside the function.
576
+ // However, because this is a template function, it will lead to redundant code duplication.
577
+
578
+ BYTE rle;
579
+ BYTE *line_bits;
580
+
581
+ // this is used to guard against writing beyond the end of the image (on corrupted rle block)
582
+ const BYTE* dib_end = FreeImage_GetScanLine(dib, height);//< one-past-end row
583
+
584
+ // Compute the rough size of a line...
585
+ long pixels_offset = io->tell_proc(handle);
586
+ long sz = ((eof - pixels_offset) / height);
587
+
588
+ // ...and allocate cache of this size (yields good results)
589
+ IOCache cache(io, handle, sz);
590
+ if(cache.isNull()) {
591
+ FreeImage_Unload(dib);
592
+ dib = NULL;
593
+ return;
594
+ }
595
+
596
+ int x = 0, y = 0;
597
+
598
+ line_bits = FreeImage_GetScanLine(dib, y);
599
+
600
+ while (y < height) {
601
+
602
+ rle = cache.getByte();
603
+
604
+ BOOL has_rle = rle & 0x80;
605
+ rle &= ~0x80; // remove type-bit
606
+
607
+ BYTE packet_count = rle + 1;
608
+
609
+ //packet_count might be corrupt, test if we are not about to write beyond the last image bit
610
+
611
+ if ((line_bits+x) + packet_count*pixel_size > dib_end) {
612
+ FreeImage_OutputMessageProc(s_format_id, FI_MSG_ERROR_CORRUPTED);
613
+ // return what is left from the bitmap
614
+ return;
615
+ }
616
+
617
+ if (has_rle) {
618
+
619
+ // read a pixel value from file...
620
+ BYTE *val = cache.getBytes(file_pixel_size);
621
+
622
+ //...and fill packet_count pixels with it
623
+
624
+ for (int ix = 0; ix < packet_count; ix++) {
625
+ _assignPixel<bPP>((line_bits+x), val, as24bit);
626
+ x += pixel_size;
627
+
628
+ if (x >= line_size) {
629
+ x = 0;
630
+ y++;
631
+ line_bits = FreeImage_GetScanLine(dib, y);
632
+ }
633
+ }
634
+
635
+ } else {
636
+ // no rle commpresion
637
+
638
+ // copy packet_count pixels from file to dib
639
+ for (int ix = 0; ix < packet_count; ix++) {
640
+ BYTE *val = cache.getBytes(file_pixel_size);
641
+ _assignPixel<bPP>((line_bits+x), val, as24bit);
642
+ x += pixel_size;
643
+
644
+ if (x >= line_size) {
645
+ x = 0;
646
+ y++;
647
+ line_bits = FreeImage_GetScanLine(dib, y);
648
+ }
649
+ } //< packet_count
650
+ } //< has_rle
651
+
652
+ } //< while height
653
+
654
+ }
655
+
656
+ // --------------------------------------------------------------------------
657
+
658
+ static FIBITMAP * DLL_CALLCONV
659
+ Load(FreeImageIO *io, fi_handle handle, int page, int flags, void *data) {
660
+ FIBITMAP *dib = NULL;
661
+
662
+ if (!handle) {
663
+ return NULL;
664
+ }
665
+
666
+ try {
667
+
668
+ const BOOL header_only = (flags & FIF_LOAD_NOPIXELS) == FIF_LOAD_NOPIXELS;
669
+
670
+ // remember the start offset
671
+ long start_offset = io->tell_proc(handle);
672
+
673
+ // remember end-of-file (used for RLE cache)
674
+ io->seek_proc(handle, 0, SEEK_END);
675
+ long eof = io->tell_proc(handle);
676
+ io->seek_proc(handle, start_offset, SEEK_SET);
677
+
678
+ // read and process the bitmap's footer
679
+
680
+ TargaThumbnail thumbnail;
681
+ if(isTARGA20(io, handle)) {
682
+ TGAFOOTER footer;
683
+ const long footer_offset = start_offset + eof - sizeof(footer);
684
+
685
+ io->seek_proc(handle, footer_offset, SEEK_SET);
686
+ io->read_proc(&footer, sizeof(tagTGAFOOTER), 1, handle);
687
+
688
+ #ifdef FREEIMAGE_BIGENDIAN
689
+ SwapFooter(&footer);
690
+ #endif
691
+ BOOL hasExtensionArea = footer.extension_offset > 0;
692
+ if(hasExtensionArea) {
693
+ TGAEXTENSIONAREA extensionarea;
694
+ io->seek_proc(handle, footer.extension_offset, SEEK_SET);
695
+ io->read_proc(&extensionarea, sizeof(extensionarea), 1, handle);
696
+
697
+ #ifdef FREEIMAGE_BIGENDIAN
698
+ SwapExtensionArea(&extensionarea);
699
+ #endif
700
+
701
+ DWORD postage_stamp_offset = extensionarea.postage_stamp_offset;
702
+ BOOL hasThumbnail = (postage_stamp_offset > 0) && (postage_stamp_offset < (DWORD)footer_offset);
703
+ if(hasThumbnail) {
704
+ io->seek_proc(handle, postage_stamp_offset, SEEK_SET);
705
+ thumbnail.read(io, handle, footer_offset - postage_stamp_offset);
706
+ }
707
+ }
708
+ }
709
+
710
+ // read and process the bitmap's header
711
+
712
+ TGAHEADER header;
713
+
714
+ io->seek_proc(handle, start_offset, SEEK_SET);
715
+ io->read_proc(&header, sizeof(tagTGAHEADER), 1, handle);
716
+
717
+ #ifdef FREEIMAGE_BIGENDIAN
718
+ SwapHeader(&header);
719
+ #endif
720
+
721
+ thumbnail.setDepth(header.is_pixel_depth);
722
+
723
+ const int line = CalculateLine(header.is_width, header.is_pixel_depth);
724
+ const int pixel_bits = header.is_pixel_depth;
725
+ const int pixel_size = pixel_bits/8;
726
+
727
+ int fliphoriz = (header.is_image_descriptor & 0x10) ? 1 : 0;
728
+ int flipvert = (header.is_image_descriptor & 0x20) ? 1 : 0;
729
+
730
+ // skip comment
731
+ io->seek_proc(handle, header.id_length, SEEK_CUR);
732
+
733
+ switch (header.is_pixel_depth) {
734
+ case 8 : {
735
+ dib = FreeImage_AllocateHeader(header_only, header.is_width, header.is_height, 8);
736
+
737
+ if (dib == NULL) {
738
+ throw FI_MSG_ERROR_DIB_MEMORY;
739
+ }
740
+
741
+ // read the palette (even if header only)
742
+
743
+ RGBQUAD *palette = FreeImage_GetPalette(dib);
744
+
745
+ if (header.color_map_type > 0) {
746
+ unsigned count, csize;
747
+
748
+ // calculate the color map size
749
+ csize = header.cm_length * header.cm_size / 8;
750
+
751
+ // read the color map
752
+ BYTE *cmap = (BYTE*)malloc(csize * sizeof(BYTE));
753
+ if (cmap == NULL) {
754
+ throw FI_MSG_ERROR_DIB_MEMORY;
755
+ }
756
+ io->read_proc(cmap, sizeof(BYTE), csize, handle);
757
+
758
+ // build the palette
759
+
760
+ switch (header.cm_size) {
761
+ case 16: {
762
+ WORD *rgb555 = (WORD*)&cmap[0];
763
+ unsigned start = (unsigned)header.cm_first_entry;
764
+ unsigned stop = MIN((unsigned)256, (unsigned)header.cm_length);
765
+
766
+ for (count = start; count < stop; count++) {
767
+ palette[count].rgbRed = (BYTE)((((*rgb555 & FI16_555_RED_MASK) >> FI16_555_RED_SHIFT) * 0xFF) / 0x1F);
768
+ palette[count].rgbGreen = (BYTE)((((*rgb555 & FI16_555_GREEN_MASK) >> FI16_555_GREEN_SHIFT) * 0xFF) / 0x1F);
769
+ palette[count].rgbBlue = (BYTE)((((*rgb555 & FI16_555_BLUE_MASK) >> FI16_555_BLUE_SHIFT) * 0xFF) / 0x1F);
770
+ rgb555++;
771
+ }
772
+ }
773
+ break;
774
+
775
+ case 24: {
776
+ FILE_BGR *bgr = (FILE_BGR*)&cmap[0];
777
+ unsigned start = (unsigned)header.cm_first_entry;
778
+ unsigned stop = MIN((unsigned)256, (unsigned)header.cm_length);
779
+
780
+ for (count = start; count < stop; count++) {
781
+ palette[count].rgbBlue = bgr->b;
782
+ palette[count].rgbGreen = bgr->g;
783
+ palette[count].rgbRed = bgr->r;
784
+ bgr++;
785
+ }
786
+ }
787
+ break;
788
+
789
+ case 32: {
790
+ BYTE trns[256];
791
+
792
+ // clear the transparency table
793
+ memset(trns, 0xFF, 256);
794
+
795
+ FILE_BGRA *bgra = (FILE_BGRA*)&cmap[0];
796
+ unsigned start = (unsigned)header.cm_first_entry;
797
+ unsigned stop = MIN((unsigned)256, (unsigned)header.cm_length);
798
+
799
+ for (count = start; count < stop; count++) {
800
+ palette[count].rgbBlue = bgra->b;
801
+ palette[count].rgbGreen = bgra->g;
802
+ palette[count].rgbRed = bgra->r;
803
+ // alpha
804
+ trns[count] = bgra->a;
805
+ bgra++;
806
+ }
807
+
808
+ // set the tranparency table
809
+ FreeImage_SetTransparencyTable(dib, trns, 256);
810
+ }
811
+ break;
812
+
813
+ } // switch(header.cm_size)
814
+
815
+ free(cmap);
816
+ }
817
+
818
+ // handle thumbnail
819
+
820
+ FIBITMAP* th = thumbnail.toFIBITMAP();
821
+ if(th) {
822
+ RGBQUAD* pal = FreeImage_GetPalette(dib);
823
+ RGBQUAD* dst_pal = FreeImage_GetPalette(th);
824
+ if(dst_pal && pal) {
825
+ for(unsigned i = 0; i < FreeImage_GetColorsUsed(dib); i++) {
826
+ dst_pal[i] = pal[i];
827
+ }
828
+ }
829
+
830
+ FreeImage_SetTransparencyTable(th, FreeImage_GetTransparencyTable(dib), FreeImage_GetTransparencyCount(dib));
831
+
832
+ FreeImage_SetThumbnail(dib, th);
833
+ FreeImage_Unload(th);
834
+ }
835
+
836
+ if(header_only) {
837
+ return dib;
838
+ }
839
+
840
+ // read in the bitmap bits
841
+
842
+ switch (header.image_type) {
843
+ case TGA_CMAP:
844
+ case TGA_MONO: {
845
+ BYTE *bits = NULL;
846
+
847
+ for (unsigned count = 0; count < header.is_height; count++) {
848
+ bits = FreeImage_GetScanLine(dib, count);
849
+ io->read_proc(bits, sizeof(BYTE), line, handle);
850
+ }
851
+ }
852
+ break;
853
+
854
+ case TGA_RLECMAP:
855
+ case TGA_RLEMONO: { //(8 bit)
856
+ loadRLE<8>(dib, header.is_width, header.is_height, io, handle, eof, FALSE);
857
+ }
858
+ break;
859
+
860
+ default :
861
+ FreeImage_Unload(dib);
862
+ return NULL;
863
+ }
864
+ }
865
+ break; // header.is_pixel_depth == 8
866
+
867
+ case 15 :
868
+
869
+ case 16 : {
870
+ int pixel_bits = 16;
871
+
872
+ // allocate the dib
873
+
874
+ if (TARGA_LOAD_RGB888 & flags) {
875
+ pixel_bits = 24;
876
+ dib = FreeImage_AllocateHeader(header_only, header.is_width, header.is_height, pixel_bits, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK);
877
+
878
+ } else {
879
+ dib = FreeImage_AllocateHeader(header_only, header.is_width, header.is_height, pixel_bits, FI16_555_RED_MASK, FI16_555_GREEN_MASK, FI16_555_BLUE_MASK);
880
+ }
881
+
882
+ if (dib == NULL) {
883
+ throw FI_MSG_ERROR_DIB_MEMORY;
884
+ }
885
+
886
+ // handle thumbnail
887
+
888
+ FIBITMAP* th = thumbnail.toFIBITMAP();
889
+ if(th) {
890
+ if(TARGA_LOAD_RGB888 & flags) {
891
+ FIBITMAP* t = FreeImage_ConvertTo24Bits(th);
892
+ FreeImage_Unload(th);
893
+ th = t;
894
+ }
895
+
896
+ FreeImage_SetThumbnail(dib, th);
897
+ FreeImage_Unload(th);
898
+ }
899
+
900
+ if(header_only) {
901
+ return dib;
902
+ }
903
+
904
+ int line = CalculateLine(header.is_width, pixel_bits);
905
+
906
+ const unsigned pixel_size = unsigned(pixel_bits) / 8;
907
+ const unsigned src_pixel_size = sizeof(WORD);
908
+
909
+ // note header.cm_size is a misleading name, it should be seen as header.cm_bits
910
+ // ignore current position in file and set filepointer explicitly from the beginning of the file
911
+
912
+ int garblen = 0;
913
+
914
+ if (header.color_map_type != 0) {
915
+ garblen = (int)((header.cm_size + 7) / 8) * header.cm_length; /* should byte align */
916
+
917
+ } else {
918
+ garblen = 0;
919
+ }
920
+
921
+ io->seek_proc(handle, start_offset, SEEK_SET);
922
+ io->seek_proc(handle, sizeof(tagTGAHEADER) + header.id_length + garblen, SEEK_SET);
923
+
924
+ // read in the bitmap bits
925
+
926
+ switch (header.image_type) {
927
+ case TGA_RGB: { //(16 bit)
928
+ // input line cache
929
+ BYTE *in_line = (BYTE*)malloc(header.is_width * sizeof(WORD));
930
+
931
+ if (!in_line)
932
+ throw FI_MSG_ERROR_MEMORY;
933
+
934
+ const int h = header.is_height;
935
+
936
+ for (int y = 0; y < h; y++) {
937
+
938
+ BYTE *bits = FreeImage_GetScanLine(dib, y);
939
+ io->read_proc(in_line, src_pixel_size, header.is_width, handle);
940
+
941
+ BYTE *val = in_line;
942
+ for (int x = 0; x < line; x += pixel_size) {
943
+
944
+ _assignPixel<16>(bits+x, val, TARGA_LOAD_RGB888 & flags);
945
+
946
+ val += src_pixel_size;
947
+ }
948
+ }
949
+
950
+ free(in_line);
951
+ }
952
+ break;
953
+
954
+ case TGA_RLERGB: { //(16 bit)
955
+ loadRLE<16>(dib, header.is_width, header.is_height, io, handle, eof, TARGA_LOAD_RGB888 & flags);
956
+ }
957
+ break;
958
+
959
+ default :
960
+ FreeImage_Unload(dib);
961
+ return NULL;
962
+ }
963
+ }
964
+ break; // header.is_pixel_depth == 15 or 16
965
+
966
+ case 24 : {
967
+
968
+ dib = FreeImage_AllocateHeader(header_only, header.is_width, header.is_height, pixel_bits, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK);
969
+
970
+ if (dib == NULL) {
971
+ throw FI_MSG_ERROR_DIB_MEMORY;
972
+ }
973
+
974
+ FIBITMAP* th = thumbnail.toFIBITMAP();
975
+ if(th) {
976
+ FreeImage_SetThumbnail(dib, th);
977
+ FreeImage_Unload(th);
978
+ }
979
+
980
+ if(header_only) {
981
+ return dib;
982
+ }
983
+
984
+ // read in the bitmap bits
985
+
986
+ switch (header.image_type) {
987
+ case TGA_RGB: { //(24 bit)
988
+ //uncompressed
989
+ loadTrueColor(dib, header.is_width, header.is_height, pixel_size,io, handle, TRUE);
990
+ }
991
+ break;
992
+
993
+ case TGA_RLERGB: { //(24 bit)
994
+ loadRLE<24>(dib, header.is_width, header.is_height, io, handle, eof, TRUE);
995
+ }
996
+ break;
997
+
998
+ default :
999
+ FreeImage_Unload(dib);
1000
+ return NULL;
1001
+ }
1002
+ }
1003
+ break; // header.is_pixel_depth == 24
1004
+
1005
+ case 32 : {
1006
+ int pixel_bits = 32;
1007
+
1008
+ if (TARGA_LOAD_RGB888 & flags) {
1009
+ pixel_bits = 24;
1010
+ }
1011
+
1012
+ dib = FreeImage_AllocateHeader(header_only, header.is_width, header.is_height, pixel_bits, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK);
1013
+
1014
+ if (dib == NULL) {
1015
+ throw FI_MSG_ERROR_DIB_MEMORY;
1016
+ }
1017
+
1018
+ // handle thumbnail
1019
+
1020
+ FIBITMAP* th = thumbnail.toFIBITMAP();
1021
+ if(th) {
1022
+ if(TARGA_LOAD_RGB888 & flags) {
1023
+ FIBITMAP* t = FreeImage_ConvertTo24Bits(th);
1024
+ FreeImage_Unload(th);
1025
+ th = t;
1026
+ }
1027
+ FreeImage_SetThumbnail(dib, th);
1028
+ FreeImage_Unload(th);
1029
+ }
1030
+
1031
+ if(header_only) {
1032
+ return dib;
1033
+ }
1034
+
1035
+ // read in the bitmap bits
1036
+
1037
+ switch (header.image_type) {
1038
+ case TGA_RGB: { //(32 bit)
1039
+ // uncompressed
1040
+ loadTrueColor(dib, header.is_width, header.is_height, 4 /*file_pixel_size*/, io, handle, TARGA_LOAD_RGB888 & flags);
1041
+ }
1042
+ break;
1043
+
1044
+ case TGA_RLERGB: { //(32 bit)
1045
+ loadRLE<32>(dib, header.is_width, header.is_height, io, handle, eof, TARGA_LOAD_RGB888 & flags);
1046
+ }
1047
+ break;
1048
+
1049
+ default :
1050
+ FreeImage_Unload(dib);
1051
+ return NULL;
1052
+ }
1053
+ }
1054
+ break; // header.is_pixel_depth == 32
1055
+
1056
+ } // switch(header.is_pixel_depth)
1057
+
1058
+ if (flipvert) {
1059
+ FreeImage_FlipVertical(dib);
1060
+ }
1061
+
1062
+ if (fliphoriz) {
1063
+ FreeImage_FlipHorizontal(dib);
1064
+ }
1065
+
1066
+ return dib;
1067
+
1068
+ } catch (const char *message) {
1069
+ if (dib) {
1070
+ FreeImage_Unload(dib);
1071
+ }
1072
+
1073
+ FreeImage_OutputMessageProc(s_format_id, message);
1074
+
1075
+ return NULL;
1076
+ }
1077
+ }
1078
+
1079
+ // --------------------------------------------------------------------------
1080
+
1081
+ static BOOL
1082
+ hasValidThumbnail(FIBITMAP* dib) {
1083
+ FIBITMAP* thumbnail = FreeImage_GetThumbnail(dib);
1084
+
1085
+ return thumbnail
1086
+ && SupportsExportType(FreeImage_GetImageType(thumbnail))
1087
+ && SupportsExportDepth(FreeImage_GetBPP(thumbnail))
1088
+ // Requirements according to the specification:
1089
+ && FreeImage_GetBPP(thumbnail) == FreeImage_GetBPP(dib)
1090
+ && FreeImage_GetImageType(thumbnail) == FreeImage_GetImageType(dib)
1091
+ && FreeImage_GetWidth(thumbnail) <= 255
1092
+ && FreeImage_GetHeight(thumbnail) <= 255;
1093
+ }
1094
+
1095
+ /**
1096
+ Writes the ready RLE packet to buffer
1097
+ */
1098
+ static inline void
1099
+ flushPacket(BYTE*& dest, unsigned pixel_size, BYTE* packet_begin, BYTE*& packet, BYTE& packet_count, BOOL& has_rle) {
1100
+ if (packet_count) {
1101
+ const BYTE type_bit = has_rle ? 0x80 : 0x0;
1102
+ const BYTE write_count = has_rle ? 1 : packet_count;
1103
+
1104
+ // build packet header: zero-based count + type bit
1105
+ assert(packet_count >= 1);
1106
+ BYTE rle = packet_count - 1;
1107
+ rle |= type_bit;
1108
+
1109
+ // write packet header
1110
+ *dest = rle;
1111
+ ++dest;
1112
+
1113
+ // write packet data
1114
+ memcpy(dest, packet_begin, write_count * pixel_size);
1115
+ dest += write_count * pixel_size;
1116
+
1117
+ // reset state
1118
+ packet_count = 0;
1119
+ packet = packet_begin;
1120
+ has_rle = FALSE;
1121
+ }
1122
+ }
1123
+
1124
+
1125
+ static inline void
1126
+ writeToPacket(BYTE* packet, BYTE* pixel, unsigned pixel_size) {
1127
+ // Take care of channel and byte order here, because packet will be flushed straight to the file
1128
+ switch (pixel_size) {
1129
+ case 1:
1130
+ *packet = *pixel;
1131
+ break;
1132
+
1133
+ case 2: {
1134
+ WORD val(*(WORD*)pixel);
1135
+ #ifdef FREEIMAGE_BIGENDIAN
1136
+ SwapShort(&val);
1137
+ #endif
1138
+ *(WORD*)packet = val;
1139
+ }
1140
+ break;
1141
+
1142
+ case 3: {
1143
+ packet[0] = pixel[FI_RGBA_BLUE];
1144
+ packet[1] = pixel[FI_RGBA_GREEN];
1145
+ packet[2] = pixel[FI_RGBA_RED];
1146
+ }
1147
+ break;
1148
+
1149
+ case 4: {
1150
+ #if FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_BGR
1151
+ *(reinterpret_cast<unsigned*>(packet)) = *(reinterpret_cast<unsigned*> (pixel));
1152
+ #else
1153
+ packet[0] = pixel[FI_RGBA_BLUE];
1154
+ packet[1] = pixel[FI_RGBA_GREEN];
1155
+ packet[2] = pixel[FI_RGBA_RED];
1156
+ packet[3] = pixel[FI_RGBA_ALPHA];
1157
+ #endif
1158
+ }
1159
+ break;
1160
+
1161
+ default:
1162
+ assert(FALSE);
1163
+ }
1164
+ }
1165
+
1166
+ static inline BOOL
1167
+ isEqualPixel(BYTE* lhs, BYTE* rhs, unsigned pixel_size) {
1168
+ switch (pixel_size) {
1169
+ case 1:
1170
+ return *lhs == *rhs;
1171
+
1172
+ case 2:
1173
+ return *(WORD*)lhs == *(WORD*)rhs;
1174
+
1175
+ case 3:
1176
+ return *(WORD*)lhs == *(WORD*)rhs && lhs[2] == rhs[2];
1177
+
1178
+ case 4:
1179
+ return *(unsigned*)lhs == *(unsigned*)rhs;
1180
+
1181
+ default:
1182
+ assert(FALSE);
1183
+ return FALSE;
1184
+ }
1185
+ }
1186
+
1187
+ static void
1188
+ saveRLE(FIBITMAP* dib, FreeImageIO* io, fi_handle handle) {
1189
+ // Image is compressed line by line, packets don't span multiple lines (TGA2.0 recommendation)
1190
+
1191
+ const unsigned width = FreeImage_GetWidth(dib);
1192
+ const unsigned height = FreeImage_GetHeight(dib);
1193
+ const unsigned pixel_size = FreeImage_GetBPP(dib)/8;
1194
+ const unsigned line_size = FreeImage_GetLine(dib);
1195
+
1196
+ const BYTE max_packet_size = 128;
1197
+ BYTE packet_count = 0;
1198
+ BOOL has_rle = FALSE;
1199
+
1200
+ // packet (compressed or not) to be written to line
1201
+
1202
+ BYTE* const packet_begin = (BYTE*)malloc(max_packet_size * pixel_size);
1203
+ BYTE* packet = packet_begin;
1204
+
1205
+ // line to be written to disk
1206
+ // Note: we need some extra bytes for anti-commpressed lines. The worst case is:
1207
+ // 8 bit images were every 3th pixel is different.
1208
+ // Rle packet becomes two pixels, but nothing is compressed: two byte pixels are transformed into byte header and byte pixel value
1209
+ // After every rle packet there is a non-rle packet of one pixel: an extra byte for the header will be added for it
1210
+ // In the end we gain no bytes from compression, but also must insert a byte at every 3th pixel
1211
+
1212
+ // add extra space for anti-commpressed lines
1213
+ size_t extra_space = (size_t)ceil(width / 3.0);
1214
+ BYTE* const line_begin = (BYTE*)malloc(width * pixel_size + extra_space);
1215
+ BYTE* line = line_begin;
1216
+
1217
+ BYTE *current = (BYTE*)malloc(pixel_size);
1218
+ BYTE *next = (BYTE*)malloc(pixel_size);
1219
+
1220
+ for(unsigned y = 0; y < height; y++) {
1221
+ BYTE *bits = FreeImage_GetScanLine(dib, y);
1222
+
1223
+ // rewind line pointer
1224
+ line = line_begin;
1225
+
1226
+ for(unsigned x = 0; x < line_size; x += pixel_size) {
1227
+
1228
+ AssignPixel(current, (bits + x), pixel_size);
1229
+
1230
+ // read next pixel from dib
1231
+
1232
+ if( x + 1*pixel_size < line_size) {
1233
+ AssignPixel(next, (bits + x + 1*pixel_size), pixel_size);
1234
+
1235
+ } else {
1236
+ // last pixel in line
1237
+
1238
+ // include current pixel and flush
1239
+ if(!has_rle) {
1240
+
1241
+ writeToPacket(packet, current, pixel_size);
1242
+ packet += pixel_size;
1243
+
1244
+ }
1245
+
1246
+ assert(packet_count < max_packet_size);
1247
+
1248
+ ++packet_count;
1249
+
1250
+ flushPacket(line, pixel_size, packet_begin, packet, packet_count, has_rle);
1251
+
1252
+ // start anew on next line
1253
+ break;
1254
+ }
1255
+
1256
+ if(isEqualPixel(current, next, pixel_size)) {
1257
+
1258
+ // has rle
1259
+
1260
+ if(!has_rle) {
1261
+ // flush non rle packet
1262
+
1263
+ flushPacket(line, pixel_size, packet_begin, packet, packet_count, has_rle);
1264
+
1265
+ // start a rle packet
1266
+
1267
+ has_rle = TRUE;
1268
+
1269
+ writeToPacket(packet, current, pixel_size);
1270
+ packet += pixel_size;
1271
+ }
1272
+
1273
+ // otherwise do nothing. We will just increase the count at the end
1274
+
1275
+ } else {
1276
+
1277
+ // no rle
1278
+
1279
+ if(has_rle) {
1280
+ // flush rle packet
1281
+
1282
+ // include current pixel first
1283
+ assert(packet_count < max_packet_size);
1284
+ ++packet_count;
1285
+
1286
+ flushPacket(line, pixel_size, packet_begin, packet, packet_count, has_rle);
1287
+
1288
+ // start anew on the next pixel
1289
+ continue;
1290
+
1291
+ } else {
1292
+
1293
+ writeToPacket(packet, current, pixel_size);
1294
+ packet += pixel_size;
1295
+ }
1296
+
1297
+ }
1298
+
1299
+ // increase counter on every pixel
1300
+
1301
+ ++packet_count;
1302
+
1303
+ if(packet_count == max_packet_size) {
1304
+ flushPacket(line, pixel_size, packet_begin, packet, packet_count, has_rle);
1305
+ }
1306
+
1307
+ }//for width
1308
+
1309
+ // write line to disk
1310
+ io->write_proc(line_begin, 1, (unsigned)(line - line_begin), handle);
1311
+
1312
+ }//for height
1313
+
1314
+ free(line_begin);
1315
+ free(packet_begin);
1316
+ free(current);
1317
+ free(next);
1318
+ }
1319
+
1320
+ static BOOL DLL_CALLCONV
1321
+ Save(FreeImageIO *io, FIBITMAP *dib, fi_handle handle, int page, int flags, void *data) {
1322
+ if ((dib == NULL) || (handle == NULL)) {
1323
+ return FALSE;
1324
+ }
1325
+
1326
+ RGBQUAD *palette = FreeImage_GetPalette(dib);
1327
+ const unsigned bpp = FreeImage_GetBPP(dib);
1328
+
1329
+ // write the file header
1330
+
1331
+ TGAHEADER header;
1332
+
1333
+ header.id_length = 0;
1334
+ header.cm_first_entry = 0;
1335
+ header.is_xorigin = 0;
1336
+ header.is_yorigin = 0;
1337
+ header.is_width = (WORD)FreeImage_GetWidth(dib);
1338
+ header.is_height = (WORD)FreeImage_GetHeight(dib);
1339
+ header.is_pixel_depth = (BYTE)bpp;
1340
+ header.is_image_descriptor = (bpp == 32 ? 8 : 0);
1341
+
1342
+ if (palette) {
1343
+ header.color_map_type = 1;
1344
+ header.image_type = (TARGA_SAVE_RLE & flags) ? TGA_RLECMAP : TGA_CMAP;
1345
+ header.cm_length = (WORD)(1 << bpp);
1346
+
1347
+ if (FreeImage_IsTransparent(dib)) {
1348
+ header.cm_size = 32;
1349
+ } else {
1350
+ header.cm_size = 24;
1351
+ }
1352
+
1353
+ } else {
1354
+ header.color_map_type = 0;
1355
+ header.image_type = (TARGA_SAVE_RLE & flags) ? TGA_RLERGB : TGA_RGB;
1356
+ header.cm_length = 0;
1357
+ header.cm_size = 0;
1358
+ }
1359
+
1360
+ // write the header
1361
+
1362
+ #ifdef FREEIMAGE_BIGENDIAN
1363
+ SwapHeader(&header);
1364
+ #endif
1365
+
1366
+ io->write_proc(&header, sizeof(header), 1, handle);
1367
+
1368
+ #ifdef FREEIMAGE_BIGENDIAN
1369
+ SwapHeader(&header);
1370
+ #endif
1371
+
1372
+ // write the palette
1373
+
1374
+ if (palette) {
1375
+ if (FreeImage_IsTransparent(dib)) {
1376
+ FILE_BGRA *bgra_pal = (FILE_BGRA*)malloc(header.cm_length * sizeof(FILE_BGRA));
1377
+
1378
+ // get the transparency table
1379
+ BYTE *trns = FreeImage_GetTransparencyTable(dib);
1380
+
1381
+ for (unsigned i = 0; i < header.cm_length; i++) {
1382
+ bgra_pal[i].b = palette[i].rgbBlue;
1383
+ bgra_pal[i].g = palette[i].rgbGreen;
1384
+ bgra_pal[i].r = palette[i].rgbRed;
1385
+ bgra_pal[i].a = trns[i];
1386
+ }
1387
+
1388
+ io->write_proc(bgra_pal, sizeof(FILE_BGRA), header.cm_length, handle);
1389
+
1390
+ free(bgra_pal);
1391
+
1392
+ } else {
1393
+ FILE_BGR *bgr_pal = (FILE_BGR*)malloc(header.cm_length * sizeof(FILE_BGR));
1394
+
1395
+ for (unsigned i = 0; i < header.cm_length; i++) {
1396
+ bgr_pal[i].b = palette[i].rgbBlue;
1397
+ bgr_pal[i].g = palette[i].rgbGreen;
1398
+ bgr_pal[i].r = palette[i].rgbRed;
1399
+ }
1400
+
1401
+ io->write_proc(bgr_pal, sizeof(FILE_BGR), header.cm_length, handle);
1402
+
1403
+ free(bgr_pal);
1404
+ }
1405
+ }
1406
+
1407
+ // write the data bits
1408
+
1409
+
1410
+ if (TARGA_SAVE_RLE & flags) {
1411
+
1412
+ saveRLE(dib, io, handle);
1413
+
1414
+ } else {
1415
+
1416
+ // -- no rle compression --
1417
+
1418
+ const unsigned width = header.is_width;
1419
+ const unsigned height = header.is_height;
1420
+ const unsigned pixel_size = bpp/8;
1421
+
1422
+ BYTE *line, *const line_begin = (BYTE*)malloc(width * pixel_size);
1423
+ BYTE *line_source = line_begin;
1424
+
1425
+ for (unsigned y = 0; y < height; y++) {
1426
+ BYTE *scanline = FreeImage_GetScanLine(dib, y);
1427
+
1428
+ // rewind the line pointer
1429
+ line = line_begin;
1430
+
1431
+ switch (bpp) {
1432
+ case 8: {
1433
+ // don't copy line, read straight from dib
1434
+ line_source = scanline;
1435
+ }
1436
+ break;
1437
+
1438
+ case 16: {
1439
+ for (unsigned x = 0; x < width; x++) {
1440
+ WORD pixel = *(((WORD *)scanline) + x);
1441
+
1442
+ #ifdef FREEIMAGE_BIGENDIAN
1443
+ SwapShort(&pixel);
1444
+ #endif
1445
+ *(WORD*)line = pixel;
1446
+
1447
+ line += pixel_size;
1448
+ }
1449
+ }
1450
+ break;
1451
+
1452
+ case 24: {
1453
+
1454
+ #if FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_BGR
1455
+ line_source = scanline;
1456
+ #else
1457
+ for (unsigned x = 0; x < width; ++x) {
1458
+ RGBTRIPLE* trip = ((RGBTRIPLE *)scanline) + x;
1459
+ line[0] = trip->rgbtBlue;
1460
+ line[1] = trip->rgbtGreen;
1461
+ line[2] = trip->rgbtRed;
1462
+
1463
+ line += pixel_size;
1464
+ }
1465
+ #endif
1466
+ }
1467
+ break;
1468
+
1469
+ case 32: {
1470
+
1471
+ #if FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_BGR
1472
+ line_source = scanline;
1473
+ #else
1474
+ for (unsigned x = 0; x < width; ++x) {
1475
+ RGBQUAD* quad = ((RGBQUAD *)scanline) + x;
1476
+ line[0] = quad->rgbBlue;
1477
+ line[1] = quad->rgbGreen;
1478
+ line[2] = quad->rgbRed;
1479
+ line[3] = quad->rgbReserved;
1480
+
1481
+ line += pixel_size;
1482
+ }
1483
+ #endif
1484
+ }
1485
+ break;
1486
+
1487
+ }//switch(bpp)
1488
+
1489
+ // write line to disk
1490
+
1491
+ io->write_proc(line_source, pixel_size, width, handle);
1492
+
1493
+ }//for height
1494
+
1495
+ free(line_begin);
1496
+ }
1497
+
1498
+
1499
+ long extension_offset = 0 ;
1500
+ if(hasValidThumbnail(dib)) {
1501
+ // write extension area
1502
+
1503
+ extension_offset = io->tell_proc(handle);
1504
+
1505
+ TGAEXTENSIONAREA ex;
1506
+ memset(&ex, 0, sizeof(ex));
1507
+
1508
+ assert(sizeof(ex) == 495);
1509
+ ex.extension_size = sizeof(ex);
1510
+ ex.postage_stamp_offset = extension_offset + ex.extension_size + 0 /*< no Scan Line Table*/;
1511
+ ex.attributes_type = FreeImage_GetBPP(dib) == 32 ? 3 /*< useful Alpha channel data*/ : 0 /*< no Alpha data*/;
1512
+
1513
+ #ifdef FREEIMAGE_BIGENDIAN
1514
+ SwapExtensionArea(&ex);
1515
+ #endif
1516
+
1517
+ io->write_proc(&ex, sizeof(ex), 1, handle);
1518
+
1519
+ // (no Scan Line Table)
1520
+
1521
+ // write thumbnail
1522
+
1523
+ io->seek_proc(handle, ex.postage_stamp_offset, SEEK_SET);
1524
+
1525
+ FIBITMAP* thumbnail = FreeImage_GetThumbnail(dib);
1526
+ BYTE width = (BYTE)FreeImage_GetWidth(thumbnail);
1527
+ BYTE height = (BYTE)FreeImage_GetHeight(thumbnail);
1528
+
1529
+ io->write_proc(&width, 1, 1, handle);
1530
+ io->write_proc(&height, 1, 1, handle);
1531
+
1532
+ #if FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_RGB
1533
+ SwapRedBlue32(dib);
1534
+ #endif
1535
+
1536
+ #ifdef FREEIMAGE_BIGENDIAN
1537
+ swapShortPixels(dib);
1538
+ #endif
1539
+
1540
+ const unsigned line_size = FreeImage_GetLine(thumbnail);
1541
+
1542
+ for (BYTE h = 0; h < height; ++h) {
1543
+ BYTE* src_line = FreeImage_GetScanLine(thumbnail, height - 1 - h);
1544
+ io->write_proc(src_line, 1, line_size, handle);
1545
+ }
1546
+ }
1547
+
1548
+ // (no Color Correction Table)
1549
+
1550
+ // write the footer
1551
+
1552
+ TGAFOOTER footer;
1553
+ footer.extension_offset = extension_offset;
1554
+ footer.developer_offset = 0;
1555
+ strcpy(footer.signature, "TRUEVISION-XFILE.");
1556
+
1557
+
1558
+ #ifdef FREEIMAGE_BIGENDIAN
1559
+ SwapFooter(&footer);
1560
+ #endif
1561
+
1562
+ io->write_proc(&footer, sizeof(footer), 1, handle);
1563
+
1564
+ return TRUE;
1565
+ }
1566
+
1567
+ // ==========================================================
1568
+ // Init
1569
+ // ==========================================================
1570
+
1571
+ void DLL_CALLCONV
1572
+ InitTARGA(Plugin *plugin, int format_id) {
1573
+ s_format_id = format_id;
1574
+
1575
+ plugin->format_proc = Format;
1576
+ plugin->description_proc = Description;
1577
+ plugin->extension_proc = Extension;
1578
+ plugin->regexpr_proc = RegExpr;
1579
+ plugin->open_proc = NULL;
1580
+ plugin->close_proc = NULL;
1581
+ plugin->pagecount_proc = NULL;
1582
+ plugin->pagecapability_proc = NULL;
1583
+ plugin->load_proc = Load;
1584
+ plugin->save_proc = Save;
1585
+ plugin->validate_proc = Validate;
1586
+ plugin->mime_proc = MimeType;
1587
+ plugin->supports_export_bpp_proc = SupportsExportDepth;
1588
+ plugin->supports_export_type_proc = SupportsExportType;
1589
+ plugin->supports_icc_profiles_proc = NULL;
1590
+ plugin->supports_no_pixels_proc = SupportsNoPixels;
1591
+ }