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,2116 @@
1
+ // ==========================================================
2
+ // Upsampling / downsampling classes
3
+ //
4
+ // Design and implementation by
5
+ // - Herv� Drolon (drolon@infonie.fr)
6
+ // - Detlev Vendt (detlev.vendt@brillit.de)
7
+ // - Carsten Klein (cklein05@users.sourceforge.net)
8
+ //
9
+ // This file is part of FreeImage 3
10
+ //
11
+ // COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
12
+ // OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
13
+ // THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
14
+ // OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
15
+ // CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
16
+ // THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
17
+ // SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
18
+ // PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
19
+ // THIS DISCLAIMER.
20
+ //
21
+ // Use at your own risk!
22
+ // ==========================================================
23
+
24
+ #include "Resize.h"
25
+
26
+ /**
27
+ Returns the color type of a bitmap. In contrast to FreeImage_GetColorType,
28
+ this function optionally supports a boolean OUT parameter, that receives TRUE,
29
+ if the specified bitmap is greyscale, that is, it consists of grey colors only.
30
+ Although it returns the same value as returned by FreeImage_GetColorType for all
31
+ image types, this extended function primarily is intended for palletized images,
32
+ since the boolean pointed to by 'bIsGreyscale' remains unchanged for RGB(A/F)
33
+ images. However, the outgoing boolean is properly maintained for palletized images,
34
+ as well as for any non-RGB image type, like FIT_UINTxx and FIT_DOUBLE, for example.
35
+ @param dib A pointer to a FreeImage bitmap to calculate the extended color type for
36
+ @param bIsGreyscale A pointer to a boolean, that receives TRUE, if the specified bitmap
37
+ is greyscale, that is, it consists of grey colors only. This parameter can be NULL.
38
+ @return the color type of the specified bitmap
39
+ */
40
+ static FREE_IMAGE_COLOR_TYPE
41
+ GetExtendedColorType(FIBITMAP *dib, BOOL *bIsGreyscale) {
42
+ const unsigned bpp = FreeImage_GetBPP(dib);
43
+ const unsigned size = CalculateUsedPaletteEntries(bpp);
44
+ const RGBQUAD * const pal = FreeImage_GetPalette(dib);
45
+ FREE_IMAGE_COLOR_TYPE color_type = FIC_MINISBLACK;
46
+ BOOL bIsGrey = TRUE;
47
+
48
+ switch (bpp) {
49
+ case 1:
50
+ {
51
+ for (unsigned i = 0; i < size; i++) {
52
+ if ((pal[i].rgbRed != pal[i].rgbGreen) || (pal[i].rgbRed != pal[i].rgbBlue)) {
53
+ color_type = FIC_PALETTE;
54
+ bIsGrey = FALSE;
55
+ break;
56
+ }
57
+ }
58
+ if (bIsGrey) {
59
+ if (pal[0].rgbBlue == 255 && pal[1].rgbBlue == 0) {
60
+ color_type = FIC_MINISWHITE;
61
+ } else if (pal[0].rgbBlue != 0 || pal[1].rgbBlue != 255) {
62
+ color_type = FIC_PALETTE;
63
+ }
64
+ }
65
+ break;
66
+ }
67
+
68
+ case 4:
69
+ case 8:
70
+ {
71
+ for (unsigned i = 0; i < size; i++) {
72
+ if ((pal[i].rgbRed != pal[i].rgbGreen) || (pal[i].rgbRed != pal[i].rgbBlue)) {
73
+ color_type = FIC_PALETTE;
74
+ bIsGrey = FALSE;
75
+ break;
76
+ }
77
+ if (color_type != FIC_PALETTE && pal[i].rgbBlue != i) {
78
+ if ((size - i - 1) != pal[i].rgbBlue) {
79
+ color_type = FIC_PALETTE;
80
+ if (!bIsGreyscale) {
81
+ // exit loop if we're not setting
82
+ // bIsGreyscale parameter
83
+ break;
84
+ }
85
+ } else {
86
+ color_type = FIC_MINISWHITE;
87
+ }
88
+ }
89
+ }
90
+ break;
91
+ }
92
+
93
+ default:
94
+ {
95
+ color_type = FreeImage_GetColorType(dib);
96
+ bIsGrey = (color_type == FIC_MINISBLACK) ? TRUE : FALSE;
97
+ break;
98
+ }
99
+
100
+ }
101
+ if (bIsGreyscale) {
102
+ *bIsGreyscale = bIsGrey;
103
+ }
104
+
105
+ return color_type;
106
+ }
107
+
108
+ /**
109
+ Returns a pointer to an RGBA palette, created from the specified bitmap.
110
+ The RGBA palette is a copy of the specified bitmap's palette, that, additionally
111
+ contains the bitmap's transparency information in the rgbReserved member
112
+ of the palette's RGBQUAD elements.
113
+ @param dib A pointer to a FreeImage bitmap to create the RGBA palette from.
114
+ @param buffer A pointer to the buffer to store the RGBA palette.
115
+ @return A pointer to the newly created RGBA palette or NULL, if the specified
116
+ bitmap is no palletized standard bitmap. If non-NULL, the returned value is
117
+ actually the pointer passed in parameter 'buffer'.
118
+ */
119
+ static inline RGBQUAD *
120
+ GetRGBAPalette(FIBITMAP *dib, RGBQUAD * const buffer) {
121
+ // clone the palette
122
+ const unsigned ncolors = FreeImage_GetColorsUsed(dib);
123
+ if (ncolors == 0) {
124
+ return NULL;
125
+ }
126
+ memcpy(buffer, FreeImage_GetPalette(dib), ncolors * sizeof(RGBQUAD));
127
+ // merge the transparency table
128
+ const unsigned ntransp = MIN(ncolors, FreeImage_GetTransparencyCount(dib));
129
+ const BYTE * const tt = FreeImage_GetTransparencyTable(dib);
130
+ for (unsigned i = 0; i < ntransp; i++) {
131
+ buffer[i].rgbReserved = tt[i];
132
+ }
133
+ for (unsigned i = ntransp; i < ncolors; i++) {
134
+ buffer[i].rgbReserved = 255;
135
+ }
136
+ return buffer;
137
+ }
138
+
139
+ // --------------------------------------------------------------------------
140
+
141
+ CWeightsTable::CWeightsTable(CGenericFilter *pFilter, unsigned uDstSize, unsigned uSrcSize) {
142
+ double dWidth;
143
+ double dFScale;
144
+ const double dFilterWidth = pFilter->GetWidth();
145
+
146
+ // scale factor
147
+ const double dScale = double(uDstSize) / double(uSrcSize);
148
+
149
+ if(dScale < 1.0) {
150
+ // minification
151
+ dWidth = dFilterWidth / dScale;
152
+ dFScale = dScale;
153
+ } else {
154
+ // magnification
155
+ dWidth = dFilterWidth;
156
+ dFScale = 1.0;
157
+ }
158
+
159
+ // allocate a new line contributions structure
160
+ //
161
+ // window size is the number of sampled pixels
162
+ m_WindowSize = 2 * (int)ceil(dWidth) + 1;
163
+ // length of dst line (no. of rows / cols)
164
+ m_LineLength = uDstSize;
165
+
166
+ // allocate list of contributions
167
+ m_WeightTable = (Contribution*)malloc(m_LineLength * sizeof(Contribution));
168
+ for(unsigned u = 0; u < m_LineLength; u++) {
169
+ // allocate contributions for every pixel
170
+ m_WeightTable[u].Weights = (double*)malloc(m_WindowSize * sizeof(double));
171
+ }
172
+
173
+ // offset for discrete to continuous coordinate conversion
174
+ const double dOffset = (0.5 / dScale);
175
+
176
+ for(unsigned u = 0; u < m_LineLength; u++) {
177
+ // scan through line of contributions
178
+
179
+ // inverse mapping (discrete dst 'u' to continous src 'dCenter')
180
+ const double dCenter = (double)u / dScale + dOffset;
181
+
182
+ // find the significant edge points that affect the pixel
183
+ const int iLeft = MAX(0, (int)(dCenter - dWidth + 0.5));
184
+ const int iRight = MIN((int)(dCenter + dWidth + 0.5), int(uSrcSize));
185
+
186
+ m_WeightTable[u].Left = iLeft;
187
+ m_WeightTable[u].Right = iRight;
188
+
189
+ double dTotalWeight = 0; // sum of weights (initialized to zero)
190
+ for(int iSrc = iLeft; iSrc < iRight; iSrc++) {
191
+ // calculate weights
192
+ const double weight = dFScale * pFilter->Filter(dFScale * ((double)iSrc + 0.5 - dCenter));
193
+ // assert((iSrc-iLeft) < m_WindowSize);
194
+ m_WeightTable[u].Weights[iSrc-iLeft] = weight;
195
+ dTotalWeight += weight;
196
+ }
197
+ if((dTotalWeight > 0) && (dTotalWeight != 1)) {
198
+ // normalize weight of neighbouring points
199
+ for(int iSrc = iLeft; iSrc < iRight; iSrc++) {
200
+ // normalize point
201
+ m_WeightTable[u].Weights[iSrc-iLeft] /= dTotalWeight;
202
+ }
203
+ }
204
+
205
+ // simplify the filter, discarding null weights at the right
206
+ {
207
+ int iTrailing = iRight - iLeft - 1;
208
+ while(m_WeightTable[u].Weights[iTrailing] == 0) {
209
+ m_WeightTable[u].Right--;
210
+ iTrailing--;
211
+ if(m_WeightTable[u].Right == m_WeightTable[u].Left) {
212
+ break;
213
+ }
214
+ }
215
+
216
+ }
217
+
218
+ } // next dst pixel
219
+ }
220
+
221
+ CWeightsTable::~CWeightsTable() {
222
+ for(unsigned u = 0; u < m_LineLength; u++) {
223
+ // free contributions for every pixel
224
+ free(m_WeightTable[u].Weights);
225
+ }
226
+ // free list of pixels contributions
227
+ free(m_WeightTable);
228
+ }
229
+
230
+ // --------------------------------------------------------------------------
231
+
232
+ FIBITMAP* CResizeEngine::scale(FIBITMAP *src, unsigned dst_width, unsigned dst_height, unsigned src_left, unsigned src_top, unsigned src_width, unsigned src_height, unsigned flags) {
233
+
234
+ const FREE_IMAGE_TYPE image_type = FreeImage_GetImageType(src);
235
+ const unsigned src_bpp = FreeImage_GetBPP(src);
236
+
237
+ // determine the image's color type
238
+ BOOL bIsGreyscale = FALSE;
239
+ FREE_IMAGE_COLOR_TYPE color_type;
240
+ if (src_bpp <= 8) {
241
+ color_type = GetExtendedColorType(src, &bIsGreyscale);
242
+ } else {
243
+ color_type = FIC_RGB;
244
+ }
245
+
246
+ // determine the required bit depth of the destination image
247
+ unsigned dst_bpp;
248
+ unsigned dst_bpp_s1 = 0;
249
+ if (color_type == FIC_PALETTE && !bIsGreyscale) {
250
+ // non greyscale FIC_PALETTE images require a high-color destination
251
+ // image (24- or 32-bits depending on the image's transparent state)
252
+ dst_bpp = FreeImage_IsTransparent(src) ? 32 : 24;
253
+ } else if (src_bpp <= 8) {
254
+ // greyscale images require an 8-bit destination image
255
+ // (or a 32-bit image if the image is transparent);
256
+ // however, if flag FI_RESCALE_TRUE_COLOR is set, we will return
257
+ // a true color (24 bpp) image
258
+ if (FreeImage_IsTransparent(src)) {
259
+ dst_bpp = 32;
260
+ // additionally, for transparent images we always need a
261
+ // palette including transparency information (an RGBA palette)
262
+ // so, set color_type accordingly
263
+ color_type = FIC_PALETTE;
264
+ } else {
265
+ dst_bpp = ((flags & FI_RESCALE_TRUE_COLOR) == FI_RESCALE_TRUE_COLOR) ? 24 : 8;
266
+ // in any case, we use a fast 8-bit temporary image for the
267
+ // first filter operation (stage 1, either horizontal or
268
+ // vertical) and implicitly convert to 24 bpp (if requested
269
+ // by flag FI_RESCALE_TRUE_COLOR) during the second filter
270
+ // operation
271
+ dst_bpp_s1 = 8;
272
+ }
273
+ } else if (src_bpp == 16 && image_type == FIT_BITMAP) {
274
+ // 16-bit 555 and 565 RGB images require a high-color destination
275
+ // image (fixed to 24 bits, since 16-bit RGBs don't support
276
+ // transparency in FreeImage)
277
+ dst_bpp = 24;
278
+ } else {
279
+ // bit depth remains unchanged for all other images
280
+ dst_bpp = src_bpp;
281
+ }
282
+
283
+ // make 'stage 1' bpp a copy of the destination bpp if it
284
+ // was not explicitly set
285
+ if (dst_bpp_s1 == 0) {
286
+ dst_bpp_s1 = dst_bpp;
287
+ }
288
+
289
+ // early exit if destination size is equal to source size
290
+ if ((src_width == dst_width) && (src_height == dst_height)) {
291
+ FIBITMAP *out = src;
292
+ FIBITMAP *tmp = src;
293
+ if ((src_width != FreeImage_GetWidth(src)) || (src_height != FreeImage_GetHeight(src))) {
294
+ out = FreeImage_Copy(tmp, src_left, src_top, src_left + src_width, src_top + src_height);
295
+ tmp = out;
296
+ }
297
+ if (src_bpp != dst_bpp) {
298
+ switch (dst_bpp) {
299
+ case 8:
300
+ out = FreeImage_ConvertToGreyscale(tmp);
301
+ break;
302
+ case 24:
303
+ out = FreeImage_ConvertTo24Bits(tmp);
304
+ break;
305
+ case 32:
306
+ out = FreeImage_ConvertTo32Bits(tmp);
307
+ break;
308
+ default:
309
+ break;
310
+ }
311
+ if (tmp != src) {
312
+ FreeImage_Unload(tmp);
313
+ tmp = NULL;
314
+ }
315
+ }
316
+
317
+ return (out != src) ? out : FreeImage_Clone(src);
318
+ }
319
+
320
+ RGBQUAD pal_buffer[256];
321
+ RGBQUAD *src_pal = NULL;
322
+
323
+ // provide the source image's palette to the rescaler for
324
+ // FIC_PALETTE type images (this includes palletized greyscale
325
+ // images with an unordered palette as well as transparent images)
326
+ if (color_type == FIC_PALETTE) {
327
+ if (dst_bpp == 32) {
328
+ // a 32-bit destination image signals transparency, so
329
+ // create an RGBA palette from the source palette
330
+ src_pal = GetRGBAPalette(src, pal_buffer);
331
+ } else {
332
+ src_pal = FreeImage_GetPalette(src);
333
+ }
334
+ }
335
+
336
+ // allocate the dst image
337
+ FIBITMAP *dst = FreeImage_AllocateT(image_type, dst_width, dst_height, dst_bpp, 0, 0, 0);
338
+ if (!dst) {
339
+ return NULL;
340
+ }
341
+
342
+ if (dst_bpp == 8) {
343
+ RGBQUAD * const dst_pal = FreeImage_GetPalette(dst);
344
+ if (color_type == FIC_MINISWHITE) {
345
+ // build an inverted greyscale palette
346
+ CREATE_GREYSCALE_PALETTE_REVERSE(dst_pal, 256);
347
+ }
348
+ /*
349
+ else {
350
+ // build a default greyscale palette
351
+ // Currently, FreeImage_AllocateT already creates a default
352
+ // greyscale palette for 8 bpp images, so we can skip this here.
353
+ CREATE_GREYSCALE_PALETTE(dst_pal, 256);
354
+ }
355
+ */
356
+ }
357
+
358
+ // calculate x and y offsets; since FreeImage uses bottom-up bitmaps, the
359
+ // value of src_offset_y is measured from the bottom of the image
360
+ unsigned src_offset_x = src_left;
361
+ unsigned src_offset_y = FreeImage_GetHeight(src) - src_height - src_top;
362
+
363
+ /*
364
+ Decide which filtering order (xy or yx) is faster for this mapping.
365
+ --- The theory ---
366
+ Try to minimize calculations by counting the number of convolution multiplies
367
+ if(dst_width*src_height <= src_width*dst_height) {
368
+ // xy filtering
369
+ } else {
370
+ // yx filtering
371
+ }
372
+ --- The practice ---
373
+ Try to minimize calculations by counting the number of vertical convolutions (the most time consuming task)
374
+ if(dst_width*dst_height <= src_width*dst_height) {
375
+ // xy filtering
376
+ } else {
377
+ // yx filtering
378
+ }
379
+ */
380
+
381
+ if (dst_width <= src_width) {
382
+ // xy filtering
383
+ // -------------
384
+
385
+ FIBITMAP *tmp = NULL;
386
+
387
+ if (src_width != dst_width) {
388
+ // source and destination widths are different so, we must
389
+ // filter horizontally
390
+ if (src_height != dst_height) {
391
+ // source and destination heights are also different so, we need
392
+ // a temporary image
393
+ tmp = FreeImage_AllocateT(image_type, dst_width, src_height, dst_bpp_s1, 0, 0, 0);
394
+ if (!tmp) {
395
+ FreeImage_Unload(dst);
396
+ return NULL;
397
+ }
398
+ } else {
399
+ // source and destination heights are equal so, we can directly
400
+ // scale into destination image (second filter method will not
401
+ // be invoked)
402
+ tmp = dst;
403
+ }
404
+
405
+ // scale source image horizontally into temporary (or destination) image
406
+ horizontalFilter(src, src_height, src_width, src_offset_x, src_offset_y, src_pal, tmp, dst_width);
407
+
408
+ // set x and y offsets to zero for the second filter method
409
+ // invocation (the temporary image only contains the portion of
410
+ // the image to be rescaled with no offsets)
411
+ src_offset_x = 0;
412
+ src_offset_y = 0;
413
+
414
+ // also ensure, that the second filter method gets no source
415
+ // palette (the temporary image is palletized only, if it is
416
+ // greyscale; in that case, it is an 8-bit image with a linear
417
+ // palette so, the source palette is not needed or will even be
418
+ // mismatching, if the source palette is unordered)
419
+ src_pal = NULL;
420
+ } else {
421
+ // source and destination widths are equal so, just copy the
422
+ // image pointer
423
+ tmp = src;
424
+ }
425
+
426
+ if (src_height != dst_height) {
427
+ // source and destination heights are different so, scale
428
+ // temporary (or source) image vertically into destination image
429
+ verticalFilter(tmp, dst_width, src_height, src_offset_x, src_offset_y, src_pal, dst, dst_height);
430
+ }
431
+
432
+ // free temporary image, if not pointing to either src or dst
433
+ if (tmp != src && tmp != dst) {
434
+ FreeImage_Unload(tmp);
435
+ }
436
+
437
+ } else {
438
+ // yx filtering
439
+ // -------------
440
+
441
+ // Remark:
442
+ // The yx filtering branch could be more optimized by taking into,
443
+ // account that (src_width != dst_width) is always true, which
444
+ // follows from the above condition, which selects filtering order.
445
+ // Since (dst_width <= src_width) == TRUE selects xy filtering,
446
+ // both widths must be different when performing yx filtering.
447
+ // However, to make the code more robust, not depending on that
448
+ // condition and more symmetric to the xy filtering case, these
449
+ // (src_width != dst_width) conditions are still in place.
450
+
451
+ FIBITMAP *tmp = NULL;
452
+
453
+ if (src_height != dst_height) {
454
+ // source and destination heights are different so, we must
455
+ // filter vertically
456
+ if (src_width != dst_width) {
457
+ // source and destination widths are also different so, we need
458
+ // a temporary image
459
+ tmp = FreeImage_AllocateT(image_type, src_width, dst_height, dst_bpp_s1, 0, 0, 0);
460
+ if (!tmp) {
461
+ FreeImage_Unload(dst);
462
+ return NULL;
463
+ }
464
+ } else {
465
+ // source and destination widths are equal so, we can directly
466
+ // scale into destination image (second filter method will not
467
+ // be invoked)
468
+ tmp = dst;
469
+ }
470
+
471
+ // scale source image vertically into temporary (or destination) image
472
+ verticalFilter(src, src_width, src_height, src_offset_x, src_offset_y, src_pal, tmp, dst_height);
473
+
474
+ // set x and y offsets to zero for the second filter method
475
+ // invocation (the temporary image only contains the portion of
476
+ // the image to be rescaled with no offsets)
477
+ src_offset_x = 0;
478
+ src_offset_y = 0;
479
+
480
+ // also ensure, that the second filter method gets no source
481
+ // palette (the temporary image is palletized only, if it is
482
+ // greyscale; in that case, it is an 8-bit image with a linear
483
+ // palette so, the source palette is not needed or will even be
484
+ // mismatching, if the source palette is unordered)
485
+ src_pal = NULL;
486
+
487
+ } else {
488
+ // source and destination heights are equal so, just copy the
489
+ // image pointer
490
+ tmp = src;
491
+ }
492
+
493
+ if (src_width != dst_width) {
494
+ // source and destination heights are different so, scale
495
+ // temporary (or source) image horizontally into destination image
496
+ horizontalFilter(tmp, dst_height, src_width, src_offset_x, src_offset_y, src_pal, dst, dst_width);
497
+ }
498
+
499
+ // free temporary image, if not pointing to either src or dst
500
+ if (tmp != src && tmp != dst) {
501
+ FreeImage_Unload(tmp);
502
+ }
503
+ }
504
+
505
+ return dst;
506
+ }
507
+
508
+ void CResizeEngine::horizontalFilter(FIBITMAP *const src, unsigned height, unsigned src_width, unsigned src_offset_x, unsigned src_offset_y, const RGBQUAD *const src_pal, FIBITMAP *const dst, unsigned dst_width) {
509
+
510
+ // allocate and calculate the contributions
511
+ CWeightsTable weightsTable(m_pFilter, dst_width, src_width);
512
+
513
+ // step through rows
514
+ switch(FreeImage_GetImageType(src)) {
515
+ case FIT_BITMAP:
516
+ {
517
+ switch(FreeImage_GetBPP(src)) {
518
+ case 1:
519
+ {
520
+ switch(FreeImage_GetBPP(dst)) {
521
+ case 8:
522
+ {
523
+ // transparently convert the 1-bit non-transparent greyscale image to 8 bpp
524
+ src_offset_x >>= 3;
525
+ if (src_pal) {
526
+ // we have got a palette
527
+ for (unsigned y = 0; y < height; y++) {
528
+ // scale each row
529
+ const BYTE * const src_bits = FreeImage_GetScanLine(src, y + src_offset_y) + src_offset_x;
530
+ BYTE * const dst_bits = FreeImage_GetScanLine(dst, y);
531
+
532
+ for (unsigned x = 0; x < dst_width; x++) {
533
+ // loop through row
534
+ const unsigned iLeft = weightsTable.getLeftBoundary(x); // retrieve left boundary
535
+ const unsigned iRight = weightsTable.getRightBoundary(x); // retrieve right boundary
536
+ double value = 0;
537
+
538
+ for (unsigned i = iLeft; i < iRight; i++) {
539
+ // scan between boundaries
540
+ // accumulate weighted effect of each neighboring pixel
541
+ const unsigned pixel = (src_bits[i >> 3] & (0x80 >> (i & 0x07))) != 0;
542
+ value += (weightsTable.getWeight(x, i - iLeft) * (double)*(BYTE *)&src_pal[pixel]);
543
+ }
544
+
545
+ // clamp and place result in destination pixel
546
+ dst_bits[x] = (BYTE)CLAMP<int>((int)(value + 0.5), 0, 0xFF);
547
+ }
548
+ }
549
+ } else {
550
+ // we do not have a palette
551
+ for (unsigned y = 0; y < height; y++) {
552
+ // scale each row
553
+ const BYTE * const src_bits = FreeImage_GetScanLine(src, y + src_offset_y) + src_offset_x;
554
+ BYTE * const dst_bits = FreeImage_GetScanLine(dst, y);
555
+
556
+ for (unsigned x = 0; x < dst_width; x++) {
557
+ // loop through row
558
+ const unsigned iLeft = weightsTable.getLeftBoundary(x); // retrieve left boundary
559
+ const unsigned iRight = weightsTable.getRightBoundary(x); // retrieve right boundary
560
+ double value = 0;
561
+
562
+ for (unsigned i = iLeft; i < iRight; i++) {
563
+ // scan between boundaries
564
+ // accumulate weighted effect of each neighboring pixel
565
+ const unsigned pixel = (src_bits[i >> 3] & (0x80 >> (i & 0x07))) != 0;
566
+ value += (weightsTable.getWeight(x, i - iLeft) * (double)pixel);
567
+ }
568
+ value *= 0xFF;
569
+
570
+ // clamp and place result in destination pixel
571
+ dst_bits[x] = (BYTE)CLAMP<int>((int)(value + 0.5), 0, 0xFF);
572
+ }
573
+ }
574
+ }
575
+ }
576
+ break;
577
+
578
+ case 24:
579
+ {
580
+ // transparently convert the non-transparent 1-bit image to 24 bpp
581
+ src_offset_x >>= 3;
582
+ if (src_pal) {
583
+ // we have got a palette
584
+ for (unsigned y = 0; y < height; y++) {
585
+ // scale each row
586
+ const BYTE * const src_bits = FreeImage_GetScanLine(src, y + src_offset_y) + src_offset_x;
587
+ BYTE *dst_bits = FreeImage_GetScanLine(dst, y);
588
+
589
+ for (unsigned x = 0; x < dst_width; x++) {
590
+ // loop through row
591
+ const unsigned iLeft = weightsTable.getLeftBoundary(x); // retrieve left boundary
592
+ const unsigned iRight = weightsTable.getRightBoundary(x); // retrieve right boundary
593
+ double r = 0, g = 0, b = 0;
594
+
595
+ for (unsigned i = iLeft; i < iRight; i++) {
596
+ // scan between boundaries
597
+ // accumulate weighted effect of each neighboring pixel
598
+ const double weight = weightsTable.getWeight(x, i - iLeft);
599
+ const unsigned pixel = (src_bits[i >> 3] & (0x80 >> (i & 0x07))) != 0;
600
+ const BYTE * const entry = (BYTE *)&src_pal[pixel];
601
+ r += (weight * (double)entry[FI_RGBA_RED]);
602
+ g += (weight * (double)entry[FI_RGBA_GREEN]);
603
+ b += (weight * (double)entry[FI_RGBA_BLUE]);
604
+ }
605
+
606
+ // clamp and place result in destination pixel
607
+ dst_bits[FI_RGBA_RED] = (BYTE)CLAMP<int>((int)(r + 0.5), 0, 0xFF);
608
+ dst_bits[FI_RGBA_GREEN] = (BYTE)CLAMP<int>((int)(g + 0.5), 0, 0xFF);
609
+ dst_bits[FI_RGBA_BLUE] = (BYTE)CLAMP<int>((int)(b + 0.5), 0, 0xFF);
610
+ dst_bits += 3;
611
+ }
612
+ }
613
+ } else {
614
+ // we do not have a palette
615
+ for (unsigned y = 0; y < height; y++) {
616
+ // scale each row
617
+ const BYTE * const src_bits = FreeImage_GetScanLine(src, y + src_offset_y) + src_offset_x;
618
+ BYTE *dst_bits = FreeImage_GetScanLine(dst, y);
619
+
620
+ for (unsigned x = 0; x < dst_width; x++) {
621
+ // loop through row
622
+ const unsigned iLeft = weightsTable.getLeftBoundary(x); // retrieve left boundary
623
+ const unsigned iRight = weightsTable.getRightBoundary(x); // retrieve right boundary
624
+ double value = 0;
625
+
626
+ for (unsigned i = iLeft; i < iRight; i++) {
627
+ // scan between boundaries
628
+ // accumulate weighted effect of each neighboring pixel
629
+ const unsigned pixel = (src_bits[i >> 3] & (0x80 >> (i & 0x07))) != 0;
630
+ value += (weightsTable.getWeight(x, i - iLeft) * (double)pixel);
631
+ }
632
+ value *= 0xFF;
633
+
634
+ // clamp and place result in destination pixel
635
+ const BYTE bval = (BYTE)CLAMP<int>((int)(value + 0.5), 0, 0xFF);
636
+ dst_bits[FI_RGBA_RED] = bval;
637
+ dst_bits[FI_RGBA_GREEN] = bval;
638
+ dst_bits[FI_RGBA_BLUE] = bval;
639
+ dst_bits += 3;
640
+ }
641
+ }
642
+ }
643
+ }
644
+ break;
645
+
646
+ case 32:
647
+ {
648
+ // transparently convert the transparent 1-bit image to 32 bpp;
649
+ // we always have got a palette here
650
+ src_offset_x >>= 3;
651
+
652
+ for (unsigned y = 0; y < height; y++) {
653
+ // scale each row
654
+ const BYTE * const src_bits = FreeImage_GetScanLine(src, y + src_offset_y) + src_offset_x;
655
+ BYTE *dst_bits = FreeImage_GetScanLine(dst, y);
656
+
657
+ for (unsigned x = 0; x < dst_width; x++) {
658
+ // loop through row
659
+ const unsigned iLeft = weightsTable.getLeftBoundary(x); // retrieve left boundary
660
+ const unsigned iRight = weightsTable.getRightBoundary(x); // retrieve right boundary
661
+ double r = 0, g = 0, b = 0, a = 0;
662
+
663
+ for (unsigned i = iLeft; i < iRight; i++) {
664
+ // scan between boundaries
665
+ // accumulate weighted effect of each neighboring pixel
666
+ const double weight = weightsTable.getWeight(x, i - iLeft);
667
+ const unsigned pixel = (src_bits[i >> 3] & (0x80 >> (i & 0x07))) != 0;
668
+ const BYTE * const entry = (BYTE *)&src_pal[pixel];
669
+ r += (weight * (double)entry[FI_RGBA_RED]);
670
+ g += (weight * (double)entry[FI_RGBA_GREEN]);
671
+ b += (weight * (double)entry[FI_RGBA_BLUE]);
672
+ a += (weight * (double)entry[FI_RGBA_ALPHA]);
673
+ }
674
+
675
+ // clamp and place result in destination pixel
676
+ dst_bits[FI_RGBA_RED] = (BYTE)CLAMP<int>((int)(r + 0.5), 0, 0xFF);
677
+ dst_bits[FI_RGBA_GREEN] = (BYTE)CLAMP<int>((int)(g + 0.5), 0, 0xFF);
678
+ dst_bits[FI_RGBA_BLUE] = (BYTE)CLAMP<int>((int)(b + 0.5), 0, 0xFF);
679
+ dst_bits[FI_RGBA_ALPHA] = (BYTE)CLAMP<int>((int)(a + 0.5), 0, 0xFF);
680
+ dst_bits += 4;
681
+ }
682
+ }
683
+ }
684
+ break;
685
+ }
686
+ }
687
+ break;
688
+
689
+ case 4:
690
+ {
691
+ switch(FreeImage_GetBPP(dst)) {
692
+ case 8:
693
+ {
694
+ // transparently convert the non-transparent 4-bit greyscale image to 8 bpp;
695
+ // we always have got a palette for 4-bit images
696
+ src_offset_x >>= 1;
697
+
698
+ for (unsigned y = 0; y < height; y++) {
699
+ // scale each row
700
+ const BYTE * const src_bits = FreeImage_GetScanLine(src, y + src_offset_y) + src_offset_x;
701
+ BYTE * const dst_bits = FreeImage_GetScanLine(dst, y);
702
+
703
+ for (unsigned x = 0; x < dst_width; x++) {
704
+ // loop through row
705
+ const unsigned iLeft = weightsTable.getLeftBoundary(x); // retrieve left boundary
706
+ const unsigned iRight = weightsTable.getRightBoundary(x); // retrieve right boundary
707
+ double value = 0;
708
+
709
+ for (unsigned i = iLeft; i < iRight; i++) {
710
+ // scan between boundaries
711
+ // accumulate weighted effect of each neighboring pixel
712
+ const unsigned pixel = i & 0x01 ? src_bits[i >> 1] & 0x0F : src_bits[i >> 1] >> 4;
713
+ value += (weightsTable.getWeight(x, i - iLeft) * (double)*(BYTE *)&src_pal[pixel]);
714
+ }
715
+
716
+ // clamp and place result in destination pixel
717
+ dst_bits[x] = (BYTE)CLAMP<int>((int)(value + 0.5), 0, 0xFF);
718
+ }
719
+ }
720
+ }
721
+ break;
722
+
723
+ case 24:
724
+ {
725
+ // transparently convert the non-transparent 4-bit image to 24 bpp;
726
+ // we always have got a palette for 4-bit images
727
+ src_offset_x >>= 1;
728
+
729
+ for (unsigned y = 0; y < height; y++) {
730
+ // scale each row
731
+ const BYTE * const src_bits = FreeImage_GetScanLine(src, y + src_offset_y) + src_offset_x;
732
+ BYTE *dst_bits = FreeImage_GetScanLine(dst, y);
733
+
734
+ for (unsigned x = 0; x < dst_width; x++) {
735
+ // loop through row
736
+ const unsigned iLeft = weightsTable.getLeftBoundary(x); // retrieve left boundary
737
+ const unsigned iRight = weightsTable.getRightBoundary(x); // retrieve right boundary
738
+ double r = 0, g = 0, b = 0;
739
+
740
+ for (unsigned i = iLeft; i < iRight; i++) {
741
+ // scan between boundaries
742
+ // accumulate weighted effect of each neighboring pixel
743
+ const double weight = weightsTable.getWeight(x, i - iLeft);
744
+ const unsigned pixel = i & 0x01 ? src_bits[i >> 1] & 0x0F : src_bits[i >> 1] >> 4;
745
+ const BYTE * const entry = (BYTE *)&src_pal[pixel];
746
+ r += (weight * (double)entry[FI_RGBA_RED]);
747
+ g += (weight * (double)entry[FI_RGBA_GREEN]);
748
+ b += (weight * (double)entry[FI_RGBA_BLUE]);
749
+ }
750
+
751
+ // clamp and place result in destination pixel
752
+ dst_bits[FI_RGBA_RED] = (BYTE)CLAMP<int>((int)(r + 0.5), 0, 0xFF);
753
+ dst_bits[FI_RGBA_GREEN] = (BYTE)CLAMP<int>((int)(g + 0.5), 0, 0xFF);
754
+ dst_bits[FI_RGBA_BLUE] = (BYTE)CLAMP<int>((int)(b + 0.5), 0, 0xFF);
755
+ dst_bits += 3;
756
+ }
757
+ }
758
+ }
759
+ break;
760
+
761
+ case 32:
762
+ {
763
+ // transparently convert the transparent 4-bit image to 32 bpp;
764
+ // we always have got a palette for 4-bit images
765
+ src_offset_x >>= 1;
766
+
767
+ for (unsigned y = 0; y < height; y++) {
768
+ // scale each row
769
+ const BYTE * const src_bits = FreeImage_GetScanLine(src, y + src_offset_y) + src_offset_x;
770
+ BYTE *dst_bits = FreeImage_GetScanLine(dst, y);
771
+
772
+ for (unsigned x = 0; x < dst_width; x++) {
773
+ // loop through row
774
+ const unsigned iLeft = weightsTable.getLeftBoundary(x); // retrieve left boundary
775
+ const unsigned iRight = weightsTable.getRightBoundary(x); // retrieve right boundary
776
+ double r = 0, g = 0, b = 0, a = 0;
777
+
778
+ for (unsigned i = iLeft; i < iRight; i++) {
779
+ // scan between boundaries
780
+ // accumulate weighted effect of each neighboring pixel
781
+ const double weight = weightsTable.getWeight(x, i - iLeft);
782
+ const unsigned pixel = i & 0x01 ? src_bits[i >> 1] & 0x0F : src_bits[i >> 1] >> 4;
783
+ const BYTE * const entry = (BYTE *)&src_pal[pixel];
784
+ r += (weight * (double)entry[FI_RGBA_RED]);
785
+ g += (weight * (double)entry[FI_RGBA_GREEN]);
786
+ b += (weight * (double)entry[FI_RGBA_BLUE]);
787
+ a += (weight * (double)entry[FI_RGBA_ALPHA]);
788
+ }
789
+
790
+ // clamp and place result in destination pixel
791
+ dst_bits[FI_RGBA_RED] = (BYTE)CLAMP<int>((int)(r + 0.5), 0, 0xFF);
792
+ dst_bits[FI_RGBA_GREEN] = (BYTE)CLAMP<int>((int)(g + 0.5), 0, 0xFF);
793
+ dst_bits[FI_RGBA_BLUE] = (BYTE)CLAMP<int>((int)(b + 0.5), 0, 0xFF);
794
+ dst_bits[FI_RGBA_ALPHA] = (BYTE)CLAMP<int>((int)(a + 0.5), 0, 0xFF);
795
+ dst_bits += 4;
796
+ }
797
+ }
798
+ }
799
+ break;
800
+ }
801
+ }
802
+ break;
803
+
804
+ case 8:
805
+ {
806
+ switch(FreeImage_GetBPP(dst)) {
807
+ case 8:
808
+ {
809
+ // scale the 8-bit non-transparent greyscale image
810
+ // into an 8 bpp destination image
811
+ if (src_pal) {
812
+ // we have got a palette
813
+ for (unsigned y = 0; y < height; y++) {
814
+ // scale each row
815
+ const BYTE * const src_bits = FreeImage_GetScanLine(src, y + src_offset_y) + src_offset_x;
816
+ BYTE * const dst_bits = FreeImage_GetScanLine(dst, y);
817
+
818
+ for (unsigned x = 0; x < dst_width; x++) {
819
+ // loop through row
820
+ const unsigned iLeft = weightsTable.getLeftBoundary(x); // retrieve left boundary
821
+ const unsigned iLimit = weightsTable.getRightBoundary(x) - iLeft; // retrieve right boundary
822
+ const BYTE * const pixel = src_bits + iLeft;
823
+ double value = 0;
824
+
825
+ // for(i = iLeft to iRight)
826
+ for (unsigned i = 0; i < iLimit; i++) {
827
+ // scan between boundaries
828
+ // accumulate weighted effect of each neighboring pixel
829
+ value += (weightsTable.getWeight(x, i) * (double)*(BYTE *)&src_pal[pixel[i]]);
830
+ }
831
+
832
+ // clamp and place result in destination pixel
833
+ dst_bits[x] = (BYTE)CLAMP<int>((int)(value + 0.5), 0, 0xFF);
834
+ }
835
+ }
836
+ } else {
837
+ // we do not have a palette
838
+ for (unsigned y = 0; y < height; y++) {
839
+ // scale each row
840
+ const BYTE * const src_bits = FreeImage_GetScanLine(src, y + src_offset_y) + src_offset_x;
841
+ BYTE * const dst_bits = FreeImage_GetScanLine(dst, y);
842
+
843
+ for (unsigned x = 0; x < dst_width; x++) {
844
+ // loop through row
845
+ const unsigned iLeft = weightsTable.getLeftBoundary(x); // retrieve left boundary
846
+ const unsigned iLimit = weightsTable.getRightBoundary(x) - iLeft; // retrieve right boundary
847
+ const BYTE * const pixel = src_bits + iLeft;
848
+ double value = 0;
849
+
850
+ // for(i = iLeft to iRight)
851
+ for (unsigned i = 0; i < iLimit; i++) {
852
+ // scan between boundaries
853
+ // accumulate weighted effect of each neighboring pixel
854
+ value += (weightsTable.getWeight(x, i) * (double)pixel[i]);
855
+ }
856
+
857
+ // clamp and place result in destination pixel
858
+ dst_bits[x] = (BYTE)CLAMP<int>((int)(value + 0.5), 0, 0xFF);
859
+ }
860
+ }
861
+ }
862
+ }
863
+ break;
864
+
865
+ case 24:
866
+ {
867
+ // transparently convert the non-transparent 8-bit image to 24 bpp
868
+ if (src_pal) {
869
+ // we have got a palette
870
+ for (unsigned y = 0; y < height; y++) {
871
+ // scale each row
872
+ const BYTE * const src_bits = FreeImage_GetScanLine(src, y + src_offset_y) + src_offset_x;
873
+ BYTE *dst_bits = FreeImage_GetScanLine(dst, y);
874
+
875
+ for (unsigned x = 0; x < dst_width; x++) {
876
+ // loop through row
877
+ const unsigned iLeft = weightsTable.getLeftBoundary(x); // retrieve left boundary
878
+ const unsigned iLimit = weightsTable.getRightBoundary(x) - iLeft; // retrieve right boundary
879
+ const BYTE * const pixel = src_bits + iLeft;
880
+ double r = 0, g = 0, b = 0;
881
+
882
+ // for(i = iLeft to iRight)
883
+ for (unsigned i = 0; i < iLimit; i++) {
884
+ // scan between boundaries
885
+ // accumulate weighted effect of each neighboring pixel
886
+ const double weight = weightsTable.getWeight(x, i);
887
+ const BYTE *const entry = (BYTE *)&src_pal[pixel[i]];
888
+ r += (weight * (double)entry[FI_RGBA_RED]);
889
+ g += (weight * (double)entry[FI_RGBA_GREEN]);
890
+ b += (weight * (double)entry[FI_RGBA_BLUE]);
891
+ }
892
+
893
+ // clamp and place result in destination pixel
894
+ dst_bits[FI_RGBA_RED] = (BYTE)CLAMP<int>((int)(r + 0.5), 0, 0xFF);
895
+ dst_bits[FI_RGBA_GREEN] = (BYTE)CLAMP<int>((int)(g + 0.5), 0, 0xFF);
896
+ dst_bits[FI_RGBA_BLUE] = (BYTE)CLAMP<int>((int)(b + 0.5), 0, 0xFF);
897
+ dst_bits += 3;
898
+ }
899
+ }
900
+ } else {
901
+ // we do not have a palette
902
+ for (unsigned y = 0; y < height; y++) {
903
+ // scale each row
904
+ const BYTE * const src_bits = FreeImage_GetScanLine(src, y + src_offset_y) + src_offset_x;
905
+ BYTE *dst_bits = FreeImage_GetScanLine(dst, y);
906
+
907
+ for (unsigned x = 0; x < dst_width; x++) {
908
+ // loop through row
909
+ const unsigned iLeft = weightsTable.getLeftBoundary(x); // retrieve left boundary
910
+ const unsigned iLimit = weightsTable.getRightBoundary(x) - iLeft; // retrieve right boundary
911
+ const BYTE * const pixel = src_bits + iLeft;
912
+ double value = 0;
913
+
914
+ // for(i = iLeft to iRight)
915
+ for (unsigned i = 0; i < iLimit; i++) {
916
+ // scan between boundaries
917
+ // accumulate weighted effect of each neighboring pixel
918
+ const double weight = weightsTable.getWeight(x, i);
919
+ value += (weight * (double)pixel[i]);
920
+ }
921
+
922
+ // clamp and place result in destination pixel
923
+ const BYTE bval = (BYTE)CLAMP<int>((int)(value + 0.5), 0, 0xFF);
924
+ dst_bits[FI_RGBA_RED] = bval;
925
+ dst_bits[FI_RGBA_GREEN] = bval;
926
+ dst_bits[FI_RGBA_BLUE] = bval;
927
+ dst_bits += 3;
928
+ }
929
+ }
930
+ }
931
+ }
932
+ break;
933
+
934
+ case 32:
935
+ {
936
+ // transparently convert the transparent 8-bit image to 32 bpp;
937
+ // we always have got a palette here
938
+ for (unsigned y = 0; y < height; y++) {
939
+ // scale each row
940
+ const BYTE * const src_bits = FreeImage_GetScanLine(src, y + src_offset_y) + src_offset_x;
941
+ BYTE *dst_bits = FreeImage_GetScanLine(dst, y);
942
+
943
+ for (unsigned x = 0; x < dst_width; x++) {
944
+ // loop through row
945
+ const unsigned iLeft = weightsTable.getLeftBoundary(x); // retrieve left boundary
946
+ const unsigned iLimit = weightsTable.getRightBoundary(x) - iLeft; // retrieve right boundary
947
+ const BYTE * const pixel = src_bits + iLeft;
948
+ double r = 0, g = 0, b = 0, a = 0;
949
+
950
+ // for(i = iLeft to iRight)
951
+ for (unsigned i = 0; i < iLimit; i++) {
952
+ // scan between boundaries
953
+ // accumulate weighted effect of each neighboring pixel
954
+ const double weight = weightsTable.getWeight(x, i);
955
+ const BYTE * const entry = (BYTE *)&src_pal[pixel[i]];
956
+ r += (weight * (double)entry[FI_RGBA_RED]);
957
+ g += (weight * (double)entry[FI_RGBA_GREEN]);
958
+ b += (weight * (double)entry[FI_RGBA_BLUE]);
959
+ a += (weight * (double)entry[FI_RGBA_ALPHA]);
960
+ }
961
+
962
+ // clamp and place result in destination pixel
963
+ dst_bits[FI_RGBA_RED] = (BYTE)CLAMP<int>((int)(r + 0.5), 0, 0xFF);
964
+ dst_bits[FI_RGBA_GREEN] = (BYTE)CLAMP<int>((int)(g + 0.5), 0, 0xFF);
965
+ dst_bits[FI_RGBA_BLUE] = (BYTE)CLAMP<int>((int)(b + 0.5), 0, 0xFF);
966
+ dst_bits[FI_RGBA_ALPHA] = (BYTE)CLAMP<int>((int)(a + 0.5), 0, 0xFF);
967
+ dst_bits += 4;
968
+ }
969
+ }
970
+ }
971
+ break;
972
+ }
973
+ }
974
+ break;
975
+
976
+ case 16:
977
+ {
978
+ // transparently convert the 16-bit non-transparent image to 24 bpp
979
+ if (IS_FORMAT_RGB565(src)) {
980
+ // image has 565 format
981
+ for (unsigned y = 0; y < height; y++) {
982
+ // scale each row
983
+ const WORD * const src_bits = (WORD *)FreeImage_GetScanLine(src, y + src_offset_y) + src_offset_x / sizeof(WORD);
984
+ BYTE *dst_bits = FreeImage_GetScanLine(dst, y);
985
+
986
+ for (unsigned x = 0; x < dst_width; x++) {
987
+ // loop through row
988
+ const unsigned iLeft = weightsTable.getLeftBoundary(x); // retrieve left boundary
989
+ const unsigned iLimit = weightsTable.getRightBoundary(x) - iLeft; // retrieve right boundary
990
+ const WORD *pixel = src_bits + iLeft;
991
+ double r = 0, g = 0, b = 0;
992
+
993
+ // for(i = iLeft to iRight)
994
+ for (unsigned i = 0; i < iLimit; i++) {
995
+ // scan between boundaries
996
+ // accumulate weighted effect of each neighboring pixel
997
+ const double weight = weightsTable.getWeight(x, i);
998
+ r += (weight * (double)((*pixel & FI16_565_RED_MASK) >> FI16_565_RED_SHIFT));
999
+ g += (weight * (double)((*pixel & FI16_565_GREEN_MASK) >> FI16_565_GREEN_SHIFT));
1000
+ b += (weight * (double)((*pixel & FI16_565_BLUE_MASK) >> FI16_565_BLUE_SHIFT));
1001
+ pixel++;
1002
+ }
1003
+
1004
+ // clamp and place result in destination pixel
1005
+ dst_bits[FI_RGBA_RED] = (BYTE)CLAMP<int>((int)(((r * 0xFF) / 0x1F) + 0.5), 0, 0xFF);
1006
+ dst_bits[FI_RGBA_GREEN] = (BYTE)CLAMP<int>((int)(((g * 0xFF) / 0x3F) + 0.5), 0, 0xFF);
1007
+ dst_bits[FI_RGBA_BLUE] = (BYTE)CLAMP<int>((int)(((b * 0xFF) / 0x1F) + 0.5), 0, 0xFF);
1008
+ dst_bits += 3;
1009
+ }
1010
+ }
1011
+ } else {
1012
+ // image has 555 format
1013
+ for (unsigned y = 0; y < height; y++) {
1014
+ // scale each row
1015
+ const WORD * const src_bits = (WORD *)FreeImage_GetScanLine(src, y + src_offset_y) + src_offset_x;
1016
+ BYTE *dst_bits = FreeImage_GetScanLine(dst, y);
1017
+
1018
+ for (unsigned x = 0; x < dst_width; x++) {
1019
+ // loop through row
1020
+ const unsigned iLeft = weightsTable.getLeftBoundary(x); // retrieve left boundary
1021
+ const unsigned iLimit = weightsTable.getRightBoundary(x) - iLeft; // retrieve right boundary
1022
+ const WORD *pixel = src_bits + iLeft;
1023
+ double r = 0, g = 0, b = 0;
1024
+
1025
+ // for(i = iLeft to iRight)
1026
+ for (unsigned i = 0; i < iLimit; i++) {
1027
+ // scan between boundaries
1028
+ // accumulate weighted effect of each neighboring pixel
1029
+ const double weight = weightsTable.getWeight(x, i);
1030
+ r += (weight * (double)((*pixel & FI16_555_RED_MASK) >> FI16_555_RED_SHIFT));
1031
+ g += (weight * (double)((*pixel & FI16_555_GREEN_MASK) >> FI16_555_GREEN_SHIFT));
1032
+ b += (weight * (double)((*pixel & FI16_555_BLUE_MASK) >> FI16_555_BLUE_SHIFT));
1033
+ pixel++;
1034
+ }
1035
+
1036
+ // clamp and place result in destination pixel
1037
+ dst_bits[FI_RGBA_RED] = (BYTE)CLAMP<int>((int)(((r * 0xFF) / 0x1F) + 0.5), 0, 0xFF);
1038
+ dst_bits[FI_RGBA_GREEN] = (BYTE)CLAMP<int>((int)(((g * 0xFF) / 0x1F) + 0.5), 0, 0xFF);
1039
+ dst_bits[FI_RGBA_BLUE] = (BYTE)CLAMP<int>((int)(((b * 0xFF) / 0x1F) + 0.5), 0, 0xFF);
1040
+ dst_bits += 3;
1041
+ }
1042
+ }
1043
+ }
1044
+ }
1045
+ break;
1046
+
1047
+ case 24:
1048
+ {
1049
+ // scale the 24-bit non-transparent image into a 24 bpp destination image
1050
+ for (unsigned y = 0; y < height; y++) {
1051
+ // scale each row
1052
+ const BYTE * const src_bits = FreeImage_GetScanLine(src, y + src_offset_y) + src_offset_x * 3;
1053
+ BYTE *dst_bits = FreeImage_GetScanLine(dst, y);
1054
+
1055
+ for (unsigned x = 0; x < dst_width; x++) {
1056
+ // loop through row
1057
+ const unsigned iLeft = weightsTable.getLeftBoundary(x); // retrieve left boundary
1058
+ const unsigned iLimit = weightsTable.getRightBoundary(x) - iLeft; // retrieve right boundary
1059
+ const BYTE * pixel = src_bits + iLeft * 3;
1060
+ double r = 0, g = 0, b = 0;
1061
+
1062
+ // for(i = iLeft to iRight)
1063
+ for (unsigned i = 0; i < iLimit; i++) {
1064
+ // scan between boundaries
1065
+ // accumulate weighted effect of each neighboring pixel
1066
+ const double weight = weightsTable.getWeight(x, i);
1067
+ r += (weight * (double)pixel[FI_RGBA_RED]);
1068
+ g += (weight * (double)pixel[FI_RGBA_GREEN]);
1069
+ b += (weight * (double)pixel[FI_RGBA_BLUE]);
1070
+ pixel += 3;
1071
+ }
1072
+
1073
+ // clamp and place result in destination pixel
1074
+ dst_bits[FI_RGBA_RED] = (BYTE)CLAMP<int>((int)(r + 0.5), 0, 0xFF);
1075
+ dst_bits[FI_RGBA_GREEN] = (BYTE)CLAMP<int>((int)(g + 0.5), 0, 0xFF);
1076
+ dst_bits[FI_RGBA_BLUE] = (BYTE)CLAMP<int>((int)(b + 0.5), 0, 0xFF);
1077
+ dst_bits += 3;
1078
+ }
1079
+ }
1080
+ }
1081
+ break;
1082
+
1083
+ case 32:
1084
+ {
1085
+ // scale the 32-bit transparent image into a 32 bpp destination image
1086
+ for (unsigned y = 0; y < height; y++) {
1087
+ // scale each row
1088
+ const BYTE * const src_bits = FreeImage_GetScanLine(src, y + src_offset_y) + src_offset_x * 4;
1089
+ BYTE *dst_bits = FreeImage_GetScanLine(dst, y);
1090
+
1091
+ for (unsigned x = 0; x < dst_width; x++) {
1092
+ // loop through row
1093
+ const unsigned iLeft = weightsTable.getLeftBoundary(x); // retrieve left boundary
1094
+ const unsigned iLimit = weightsTable.getRightBoundary(x) - iLeft; // retrieve right boundary
1095
+ const BYTE *pixel = src_bits + iLeft * 4;
1096
+ double r = 0, g = 0, b = 0, a = 0;
1097
+
1098
+ // for(i = iLeft to iRight)
1099
+ for (unsigned i = 0; i < iLimit; i++) {
1100
+ // scan between boundaries
1101
+ // accumulate weighted effect of each neighboring pixel
1102
+ const double weight = weightsTable.getWeight(x, i);
1103
+ r += (weight * (double)pixel[FI_RGBA_RED]);
1104
+ g += (weight * (double)pixel[FI_RGBA_GREEN]);
1105
+ b += (weight * (double)pixel[FI_RGBA_BLUE]);
1106
+ a += (weight * (double)pixel[FI_RGBA_ALPHA]);
1107
+ pixel += 4;
1108
+ }
1109
+
1110
+ // clamp and place result in destination pixel
1111
+ dst_bits[FI_RGBA_RED] = (BYTE)CLAMP<int>((int)(r + 0.5), 0, 0xFF);
1112
+ dst_bits[FI_RGBA_GREEN] = (BYTE)CLAMP<int>((int)(g + 0.5), 0, 0xFF);
1113
+ dst_bits[FI_RGBA_BLUE] = (BYTE)CLAMP<int>((int)(b + 0.5), 0, 0xFF);
1114
+ dst_bits[FI_RGBA_ALPHA] = (BYTE)CLAMP<int>((int)(a + 0.5), 0, 0xFF);
1115
+ dst_bits += 4;
1116
+ }
1117
+ }
1118
+ }
1119
+ break;
1120
+ }
1121
+ }
1122
+ break;
1123
+
1124
+ case FIT_UINT16:
1125
+ {
1126
+ // Calculate the number of words per pixel (1 for 16-bit, 3 for 48-bit or 4 for 64-bit)
1127
+ const unsigned wordspp = (FreeImage_GetLine(src) / src_width) / sizeof(WORD);
1128
+
1129
+ for (unsigned y = 0; y < height; y++) {
1130
+ // scale each row
1131
+ const WORD *src_bits = (WORD*)FreeImage_GetScanLine(src, y + src_offset_y) + src_offset_x / sizeof(WORD);
1132
+ WORD *dst_bits = (WORD*)FreeImage_GetScanLine(dst, y);
1133
+
1134
+ for (unsigned x = 0; x < dst_width; x++) {
1135
+ // loop through row
1136
+ const unsigned iLeft = weightsTable.getLeftBoundary(x); // retrieve left boundary
1137
+ const unsigned iLimit = weightsTable.getRightBoundary(x) - iLeft; // retrieve right boundary
1138
+ const WORD *pixel = src_bits + iLeft * wordspp;
1139
+ double value = 0;
1140
+
1141
+ // for(i = iLeft to iRight)
1142
+ for (unsigned i = 0; i < iLimit; i++) {
1143
+ // scan between boundaries
1144
+ // accumulate weighted effect of each neighboring pixel
1145
+ const double weight = weightsTable.getWeight(x, i);
1146
+ value += (weight * (double)pixel[0]);
1147
+ pixel++;
1148
+ }
1149
+
1150
+ // clamp and place result in destination pixel
1151
+ dst_bits[0] = (WORD)CLAMP<int>((int)(value + 0.5), 0, 0xFFFF);
1152
+ dst_bits += wordspp;
1153
+ }
1154
+ }
1155
+ }
1156
+ break;
1157
+
1158
+ case FIT_RGB16:
1159
+ {
1160
+ // Calculate the number of words per pixel (1 for 16-bit, 3 for 48-bit or 4 for 64-bit)
1161
+ const unsigned wordspp = (FreeImage_GetLine(src) / src_width) / sizeof(WORD);
1162
+
1163
+ for (unsigned y = 0; y < height; y++) {
1164
+ // scale each row
1165
+ const WORD *src_bits = (WORD*)FreeImage_GetScanLine(src, y + src_offset_y) + src_offset_x / sizeof(WORD);
1166
+ WORD *dst_bits = (WORD*)FreeImage_GetScanLine(dst, y);
1167
+
1168
+ for (unsigned x = 0; x < dst_width; x++) {
1169
+ // loop through row
1170
+ const unsigned iLeft = weightsTable.getLeftBoundary(x); // retrieve left boundary
1171
+ const unsigned iLimit = weightsTable.getRightBoundary(x) - iLeft; // retrieve right boundary
1172
+ const WORD *pixel = src_bits + iLeft * wordspp;
1173
+ double r = 0, g = 0, b = 0;
1174
+
1175
+ // for(i = iLeft to iRight)
1176
+ for (unsigned i = 0; i < iLimit; i++) {
1177
+ // scan between boundaries
1178
+ // accumulate weighted effect of each neighboring pixel
1179
+ const double weight = weightsTable.getWeight(x, i);
1180
+ r += (weight * (double)pixel[0]);
1181
+ g += (weight * (double)pixel[1]);
1182
+ b += (weight * (double)pixel[2]);
1183
+ pixel += wordspp;
1184
+ }
1185
+
1186
+ // clamp and place result in destination pixel
1187
+ dst_bits[0] = (WORD)CLAMP<int>((int)(r + 0.5), 0, 0xFFFF);
1188
+ dst_bits[1] = (WORD)CLAMP<int>((int)(g + 0.5), 0, 0xFFFF);
1189
+ dst_bits[2] = (WORD)CLAMP<int>((int)(b + 0.5), 0, 0xFFFF);
1190
+ dst_bits += wordspp;
1191
+ }
1192
+ }
1193
+ }
1194
+ break;
1195
+
1196
+ case FIT_RGBA16:
1197
+ {
1198
+ // Calculate the number of words per pixel (1 for 16-bit, 3 for 48-bit or 4 for 64-bit)
1199
+ const unsigned wordspp = (FreeImage_GetLine(src) / src_width) / sizeof(WORD);
1200
+
1201
+ for (unsigned y = 0; y < height; y++) {
1202
+ // scale each row
1203
+ const WORD *src_bits = (WORD*)FreeImage_GetScanLine(src, y + src_offset_y) + src_offset_x / sizeof(WORD);
1204
+ WORD *dst_bits = (WORD*)FreeImage_GetScanLine(dst, y);
1205
+
1206
+ for (unsigned x = 0; x < dst_width; x++) {
1207
+ // loop through row
1208
+ const unsigned iLeft = weightsTable.getLeftBoundary(x); // retrieve left boundary
1209
+ const unsigned iLimit = weightsTable.getRightBoundary(x) - iLeft; // retrieve right boundary
1210
+ const WORD *pixel = src_bits + iLeft * wordspp;
1211
+ double r = 0, g = 0, b = 0, a = 0;
1212
+
1213
+ // for(i = iLeft to iRight)
1214
+ for (unsigned i = 0; i < iLimit; i++) {
1215
+ // scan between boundaries
1216
+ // accumulate weighted effect of each neighboring pixel
1217
+ const double weight = weightsTable.getWeight(x, i);
1218
+ r += (weight * (double)pixel[0]);
1219
+ g += (weight * (double)pixel[1]);
1220
+ b += (weight * (double)pixel[2]);
1221
+ a += (weight * (double)pixel[3]);
1222
+ pixel += wordspp;
1223
+ }
1224
+
1225
+ // clamp and place result in destination pixel
1226
+ dst_bits[0] = (WORD)CLAMP<int>((int)(r + 0.5), 0, 0xFFFF);
1227
+ dst_bits[1] = (WORD)CLAMP<int>((int)(g + 0.5), 0, 0xFFFF);
1228
+ dst_bits[2] = (WORD)CLAMP<int>((int)(b + 0.5), 0, 0xFFFF);
1229
+ dst_bits[3] = (WORD)CLAMP<int>((int)(a + 0.5), 0, 0xFFFF);
1230
+ dst_bits += wordspp;
1231
+ }
1232
+ }
1233
+ }
1234
+ break;
1235
+
1236
+ case FIT_FLOAT:
1237
+ case FIT_RGBF:
1238
+ case FIT_RGBAF:
1239
+ {
1240
+ // Calculate the number of floats per pixel (1 for 32-bit, 3 for 96-bit or 4 for 128-bit)
1241
+ const unsigned floatspp = (FreeImage_GetLine(src) / src_width) / sizeof(float);
1242
+
1243
+ for(unsigned y = 0; y < height; y++) {
1244
+ // scale each row
1245
+ const float *src_bits = (float*)FreeImage_GetScanLine(src, y + src_offset_y) + src_offset_x / sizeof(float);
1246
+ float *dst_bits = (float*)FreeImage_GetScanLine(dst, y);
1247
+
1248
+ for(unsigned x = 0; x < dst_width; x++) {
1249
+ // loop through row
1250
+ const unsigned iLeft = weightsTable.getLeftBoundary(x); // retrieve left boundary
1251
+ const unsigned iRight = weightsTable.getRightBoundary(x); // retrieve right boundary
1252
+ double value[4] = {0, 0, 0, 0}; // 4 = 128 bpp max
1253
+
1254
+ for(unsigned i = iLeft; i < iRight; i++) {
1255
+ // scan between boundaries
1256
+ // accumulate weighted effect of each neighboring pixel
1257
+ const double weight = weightsTable.getWeight(x, i-iLeft);
1258
+
1259
+ unsigned index = i * floatspp; // pixel index
1260
+ for (unsigned j = 0; j < floatspp; j++) {
1261
+ value[j] += (weight * (double)src_bits[index++]);
1262
+ }
1263
+ }
1264
+
1265
+ // place result in destination pixel
1266
+ for (unsigned j = 0; j < floatspp; j++) {
1267
+ dst_bits[j] = (float)value[j];
1268
+ }
1269
+
1270
+ dst_bits += floatspp;
1271
+ }
1272
+ }
1273
+ }
1274
+ break;
1275
+ }
1276
+ }
1277
+
1278
+ /// Performs vertical image filtering
1279
+ void CResizeEngine::verticalFilter(FIBITMAP *const src, unsigned width, unsigned src_height, unsigned src_offset_x, unsigned src_offset_y, const RGBQUAD *const src_pal, FIBITMAP *const dst, unsigned dst_height) {
1280
+
1281
+ // allocate and calculate the contributions
1282
+ CWeightsTable weightsTable(m_pFilter, dst_height, src_height);
1283
+
1284
+ // step through columns
1285
+ switch(FreeImage_GetImageType(src)) {
1286
+ case FIT_BITMAP:
1287
+ {
1288
+ const unsigned dst_pitch = FreeImage_GetPitch(dst);
1289
+ BYTE * const dst_base = FreeImage_GetBits(dst);
1290
+
1291
+ switch(FreeImage_GetBPP(src)) {
1292
+ case 1:
1293
+ {
1294
+ const unsigned src_pitch = FreeImage_GetPitch(src);
1295
+ const BYTE * const src_base = FreeImage_GetBits(src) + src_offset_y * src_pitch + (src_offset_x >> 3);
1296
+
1297
+ switch(FreeImage_GetBPP(dst)) {
1298
+ case 8:
1299
+ {
1300
+ // transparently convert the 1-bit non-transparent greyscale image to 8 bpp
1301
+ if (src_pal) {
1302
+ // we have got a palette
1303
+ for (unsigned x = 0; x < width; x++) {
1304
+ // work on column x in dst
1305
+ BYTE *dst_bits = dst_base + x;
1306
+ const unsigned index = x >> 3;
1307
+ const unsigned mask = 0x80 >> (x & 0x07);
1308
+
1309
+ // scale each column
1310
+ for (unsigned y = 0; y < dst_height; y++) {
1311
+ // loop through column
1312
+ const unsigned iLeft = weightsTable.getLeftBoundary(y); // retrieve left boundary
1313
+ const unsigned iLimit = weightsTable.getRightBoundary(y) - iLeft; // retrieve right boundary
1314
+ const BYTE *src_bits = src_base + iLeft * src_pitch + index;
1315
+ double value = 0;
1316
+
1317
+ for (unsigned i = 0; i < iLimit; i++) {
1318
+ // scan between boundaries
1319
+ // accumulate weighted effect of each neighboring pixel
1320
+ const unsigned pixel = (*src_bits & mask) != 0;
1321
+ value += (weightsTable.getWeight(y, i) * (double)*(BYTE *)&src_pal[pixel]);
1322
+ src_bits += src_pitch;
1323
+ }
1324
+ value *= 0xFF;
1325
+
1326
+ // clamp and place result in destination pixel
1327
+ *dst_bits = (BYTE)CLAMP<int>((int)(value + 0.5), 0, 0xFF);
1328
+ dst_bits += dst_pitch;
1329
+ }
1330
+ }
1331
+ } else {
1332
+ // we do not have a palette
1333
+ for (unsigned x = 0; x < width; x++) {
1334
+ // work on column x in dst
1335
+ BYTE *dst_bits = dst_base + x;
1336
+ const unsigned index = x >> 3;
1337
+ const unsigned mask = 0x80 >> (x & 0x07);
1338
+
1339
+ // scale each column
1340
+ for (unsigned y = 0; y < dst_height; y++) {
1341
+ // loop through column
1342
+ const unsigned iLeft = weightsTable.getLeftBoundary(y); // retrieve left boundary
1343
+ const unsigned iLimit = weightsTable.getRightBoundary(y) - iLeft; // retrieve right boundary
1344
+ const BYTE *src_bits = src_base + iLeft * src_pitch + index;
1345
+ double value = 0;
1346
+
1347
+ for (unsigned i = 0; i < iLimit; i++) {
1348
+ // scan between boundaries
1349
+ // accumulate weighted effect of each neighboring pixel
1350
+ value += (weightsTable.getWeight(y, i) * (double)((*src_bits & mask) != 0));
1351
+ src_bits += src_pitch;
1352
+ }
1353
+ value *= 0xFF;
1354
+
1355
+ // clamp and place result in destination pixel
1356
+ *dst_bits = (BYTE)CLAMP<int>((int)(value + 0.5), 0, 0xFF);
1357
+ dst_bits += dst_pitch;
1358
+ }
1359
+ }
1360
+ }
1361
+ }
1362
+ break;
1363
+
1364
+ case 24:
1365
+ {
1366
+ // transparently convert the non-transparent 1-bit image to 24 bpp
1367
+ if (src_pal) {
1368
+ // we have got a palette
1369
+ for (unsigned x = 0; x < width; x++) {
1370
+ // work on column x in dst
1371
+ BYTE *dst_bits = dst_base + x * 3;
1372
+ const unsigned index = x >> 3;
1373
+ const unsigned mask = 0x80 >> (x & 0x07);
1374
+
1375
+ // scale each column
1376
+ for (unsigned y = 0; y < dst_height; y++) {
1377
+ // loop through column
1378
+ const unsigned iLeft = weightsTable.getLeftBoundary(y); // retrieve left boundary
1379
+ const unsigned iLimit = weightsTable.getRightBoundary(y) - iLeft; // retrieve right boundary
1380
+ const BYTE *src_bits = src_base + iLeft * src_pitch + index;
1381
+ double r = 0, g = 0, b = 0;
1382
+
1383
+ for (unsigned i = 0; i < iLimit; i++) {
1384
+ // scan between boundaries
1385
+ // accumulate weighted effect of each neighboring pixel
1386
+ const double weight = weightsTable.getWeight(y, i);
1387
+ const unsigned pixel = (*src_bits & mask) != 0;
1388
+ const BYTE * const entry = (BYTE *)&src_pal[pixel];
1389
+ r += (weight * (double)entry[FI_RGBA_RED]);
1390
+ g += (weight * (double)entry[FI_RGBA_GREEN]);
1391
+ b += (weight * (double)entry[FI_RGBA_BLUE]);
1392
+ src_bits += src_pitch;
1393
+ }
1394
+
1395
+ // clamp and place result in destination pixel
1396
+ dst_bits[FI_RGBA_RED] = (BYTE)CLAMP<int>((int)(r + 0.5), 0, 0xFF);
1397
+ dst_bits[FI_RGBA_GREEN] = (BYTE)CLAMP<int>((int)(g + 0.5), 0, 0xFF);
1398
+ dst_bits[FI_RGBA_BLUE] = (BYTE)CLAMP<int>((int)(b + 0.5), 0, 0xFF);
1399
+ dst_bits += dst_pitch;
1400
+ }
1401
+ }
1402
+ } else {
1403
+ // we do not have a palette
1404
+ for (unsigned x = 0; x < width; x++) {
1405
+ // work on column x in dst
1406
+ BYTE *dst_bits = dst_base + x * 3;
1407
+ const unsigned index = x >> 3;
1408
+ const unsigned mask = 0x80 >> (x & 0x07);
1409
+
1410
+ // scale each column
1411
+ for (unsigned y = 0; y < dst_height; y++) {
1412
+ // loop through column
1413
+ const unsigned iLeft = weightsTable.getLeftBoundary(y); // retrieve left boundary
1414
+ const unsigned iLimit = weightsTable.getRightBoundary(y) - iLeft; // retrieve right boundary
1415
+ const BYTE *src_bits = src_base + iLeft * src_pitch + index;
1416
+ double value = 0;
1417
+
1418
+ for (unsigned i = 0; i < iLimit; i++) {
1419
+ // scan between boundaries
1420
+ // accumulate weighted effect of each neighboring pixel
1421
+ value += (weightsTable.getWeight(y, i) * (double)((*src_bits & mask) != 0));
1422
+ src_bits += src_pitch;
1423
+ }
1424
+ value *= 0xFF;
1425
+
1426
+ // clamp and place result in destination pixel
1427
+ const BYTE bval = (BYTE)CLAMP<int>((int)(value + 0.5), 0, 0xFF);
1428
+ dst_bits[FI_RGBA_RED] = bval;
1429
+ dst_bits[FI_RGBA_GREEN] = bval;
1430
+ dst_bits[FI_RGBA_BLUE] = bval;
1431
+ dst_bits += dst_pitch;
1432
+ }
1433
+ }
1434
+ }
1435
+ }
1436
+ break;
1437
+
1438
+ case 32:
1439
+ {
1440
+ // transparently convert the transparent 1-bit image to 32 bpp;
1441
+ // we always have got a palette here
1442
+ for (unsigned x = 0; x < width; x++) {
1443
+ // work on column x in dst
1444
+ BYTE *dst_bits = dst_base + x * 4;
1445
+ const unsigned index = x >> 3;
1446
+ const unsigned mask = 0x80 >> (x & 0x07);
1447
+
1448
+ // scale each column
1449
+ for (unsigned y = 0; y < dst_height; y++) {
1450
+ // loop through column
1451
+ const unsigned iLeft = weightsTable.getLeftBoundary(y); // retrieve left boundary
1452
+ const unsigned iLimit = weightsTable.getRightBoundary(y) - iLeft; // retrieve right boundary
1453
+ const BYTE *src_bits = src_base + iLeft * src_pitch + index;
1454
+ double r = 0, g = 0, b = 0, a = 0;
1455
+
1456
+ for (unsigned i = 0; i < iLimit; i++) {
1457
+ // scan between boundaries
1458
+ // accumulate weighted effect of each neighboring pixel
1459
+ const double weight = weightsTable.getWeight(y, i);
1460
+ const unsigned pixel = (*src_bits & mask) != 0;
1461
+ const BYTE * const entry = (BYTE *)&src_pal[pixel];
1462
+ r += (weight * (double)entry[FI_RGBA_RED]);
1463
+ g += (weight * (double)entry[FI_RGBA_GREEN]);
1464
+ b += (weight * (double)entry[FI_RGBA_BLUE]);
1465
+ a += (weight * (double)entry[FI_RGBA_ALPHA]);
1466
+ src_bits += src_pitch;
1467
+ }
1468
+
1469
+ // clamp and place result in destination pixel
1470
+ dst_bits[FI_RGBA_RED] = (BYTE)CLAMP<int>((int)(r + 0.5), 0, 0xFF);
1471
+ dst_bits[FI_RGBA_GREEN] = (BYTE)CLAMP<int>((int)(g + 0.5), 0, 0xFF);
1472
+ dst_bits[FI_RGBA_BLUE] = (BYTE)CLAMP<int>((int)(b + 0.5), 0, 0xFF);
1473
+ dst_bits[FI_RGBA_ALPHA] = (BYTE)CLAMP<int>((int)(a + 0.5), 0, 0xFF);
1474
+ dst_bits += dst_pitch;
1475
+ }
1476
+ }
1477
+ }
1478
+ break;
1479
+ }
1480
+ }
1481
+ break;
1482
+
1483
+ case 4:
1484
+ {
1485
+ const unsigned src_pitch = FreeImage_GetPitch(src);
1486
+ const BYTE *const src_base = FreeImage_GetBits(src) + src_offset_y * src_pitch + (src_offset_x >> 1);
1487
+
1488
+ switch(FreeImage_GetBPP(dst)) {
1489
+ case 8:
1490
+ {
1491
+ // transparently convert the non-transparent 4-bit greyscale image to 8 bpp;
1492
+ // we always have got a palette for 4-bit images
1493
+ for (unsigned x = 0; x < width; x++) {
1494
+ // work on column x in dst
1495
+ BYTE *dst_bits = dst_base + x;
1496
+ const unsigned index = x >> 1;
1497
+
1498
+ // scale each column
1499
+ for (unsigned y = 0; y < dst_height; y++) {
1500
+ // loop through column
1501
+ const unsigned iLeft = weightsTable.getLeftBoundary(y); // retrieve left boundary
1502
+ const unsigned iLimit = weightsTable.getRightBoundary(y) - iLeft; // retrieve right boundary
1503
+ const BYTE *src_bits = src_base + iLeft * src_pitch + index;
1504
+ double value = 0;
1505
+
1506
+ for (unsigned i = 0; i < iLimit; i++) {
1507
+ // scan between boundaries
1508
+ // accumulate weighted effect of each neighboring pixel
1509
+ const unsigned pixel = x & 0x01 ? *src_bits & 0x0F : *src_bits >> 4;
1510
+ value += (weightsTable.getWeight(y, i) * (double)*(BYTE *)&src_pal[pixel]);
1511
+ src_bits += src_pitch;
1512
+ }
1513
+
1514
+ // clamp and place result in destination pixel
1515
+ *dst_bits = (BYTE)CLAMP<int>((int)(value + 0.5), 0, 0xFF);
1516
+ dst_bits += dst_pitch;
1517
+ }
1518
+ }
1519
+ }
1520
+ break;
1521
+
1522
+ case 24:
1523
+ {
1524
+ // transparently convert the non-transparent 4-bit image to 24 bpp;
1525
+ // we always have got a palette for 4-bit images
1526
+ for (unsigned x = 0; x < width; x++) {
1527
+ // work on column x in dst
1528
+ BYTE *dst_bits = dst_base + x * 3;
1529
+ const unsigned index = x >> 1;
1530
+
1531
+ // scale each column
1532
+ for (unsigned y = 0; y < dst_height; y++) {
1533
+ // loop through column
1534
+ const unsigned iLeft = weightsTable.getLeftBoundary(y); // retrieve left boundary
1535
+ const unsigned iLimit = weightsTable.getRightBoundary(y) - iLeft; // retrieve right boundary
1536
+ const BYTE *src_bits = src_base + iLeft * src_pitch + index;
1537
+ double r = 0, g = 0, b = 0;
1538
+
1539
+ for (unsigned i = 0; i < iLimit; i++) {
1540
+ // scan between boundaries
1541
+ // accumulate weighted effect of each neighboring pixel
1542
+ const double weight = weightsTable.getWeight(y, i);
1543
+ const unsigned pixel = x & 0x01 ? *src_bits & 0x0F : *src_bits >> 4;
1544
+ const BYTE *const entry = (BYTE *)&src_pal[pixel];
1545
+ r += (weight * (double)entry[FI_RGBA_RED]);
1546
+ g += (weight * (double)entry[FI_RGBA_GREEN]);
1547
+ b += (weight * (double)entry[FI_RGBA_BLUE]);
1548
+ src_bits += src_pitch;
1549
+ }
1550
+
1551
+ // clamp and place result in destination pixel
1552
+ dst_bits[FI_RGBA_RED] = (BYTE)CLAMP<int>((int)(r + 0.5), 0, 0xFF);
1553
+ dst_bits[FI_RGBA_GREEN] = (BYTE)CLAMP<int>((int)(g + 0.5), 0, 0xFF);
1554
+ dst_bits[FI_RGBA_BLUE] = (BYTE)CLAMP<int>((int)(b + 0.5), 0, 0xFF);
1555
+ dst_bits += dst_pitch;
1556
+ }
1557
+ }
1558
+ }
1559
+ break;
1560
+
1561
+ case 32:
1562
+ {
1563
+ // transparently convert the transparent 4-bit image to 32 bpp;
1564
+ // we always have got a palette for 4-bit images
1565
+ for (unsigned x = 0; x < width; x++) {
1566
+ // work on column x in dst
1567
+ BYTE *dst_bits = dst_base + x * 4;
1568
+ const unsigned index = x >> 1;
1569
+
1570
+ // scale each column
1571
+ for (unsigned y = 0; y < dst_height; y++) {
1572
+ // loop through column
1573
+ const unsigned iLeft = weightsTable.getLeftBoundary(y); // retrieve left boundary
1574
+ const unsigned iLimit = weightsTable.getRightBoundary(y) - iLeft; // retrieve right boundary
1575
+ const BYTE *src_bits = src_base + iLeft * src_pitch + index;
1576
+ double r = 0, g = 0, b = 0, a = 0;
1577
+
1578
+ for (unsigned i = 0; i < iLimit; i++) {
1579
+ // scan between boundaries
1580
+ // accumulate weighted effect of each neighboring pixel
1581
+ const double weight = weightsTable.getWeight(y, i);
1582
+ const unsigned pixel = x & 0x01 ? *src_bits & 0x0F : *src_bits >> 4;
1583
+ const BYTE *const entry = (BYTE *)&src_pal[pixel];
1584
+ r += (weight * (double)entry[FI_RGBA_RED]);
1585
+ g += (weight * (double)entry[FI_RGBA_GREEN]);
1586
+ b += (weight * (double)entry[FI_RGBA_BLUE]);
1587
+ a += (weight * (double)entry[FI_RGBA_ALPHA]);
1588
+ src_bits += src_pitch;
1589
+ }
1590
+
1591
+ // clamp and place result in destination pixel
1592
+ dst_bits[FI_RGBA_RED] = (BYTE)CLAMP<int>((int)(r + 0.5), 0, 0xFF);
1593
+ dst_bits[FI_RGBA_GREEN] = (BYTE)CLAMP<int>((int)(g + 0.5), 0, 0xFF);
1594
+ dst_bits[FI_RGBA_BLUE] = (BYTE)CLAMP<int>((int)(b + 0.5), 0, 0xFF);
1595
+ dst_bits[FI_RGBA_ALPHA] = (BYTE)CLAMP<int>((int)(a + 0.5), 0, 0xFF);
1596
+ dst_bits += dst_pitch;
1597
+ }
1598
+ }
1599
+ }
1600
+ break;
1601
+ }
1602
+ }
1603
+ break;
1604
+
1605
+ case 8:
1606
+ {
1607
+ const unsigned src_pitch = FreeImage_GetPitch(src);
1608
+ const BYTE *const src_base = FreeImage_GetBits(src) + src_offset_y * src_pitch + src_offset_x;
1609
+
1610
+ switch(FreeImage_GetBPP(dst)) {
1611
+ case 8:
1612
+ {
1613
+ // scale the 8-bit non-transparent greyscale image into an 8 bpp destination image
1614
+ if (src_pal) {
1615
+ // we have got a palette
1616
+ for (unsigned x = 0; x < width; x++) {
1617
+ // work on column x in dst
1618
+ BYTE *dst_bits = dst_base + x;
1619
+
1620
+ // scale each column
1621
+ for (unsigned y = 0; y < dst_height; y++) {
1622
+ // loop through column
1623
+ const unsigned iLeft = weightsTable.getLeftBoundary(y); // retrieve left boundary
1624
+ const unsigned iLimit = weightsTable.getRightBoundary(y) - iLeft; // retrieve right boundary
1625
+ const BYTE *src_bits = src_base + iLeft * src_pitch + x;
1626
+ double value = 0;
1627
+
1628
+ for (unsigned i = 0; i < iLimit; i++) {
1629
+ // scan between boundaries
1630
+ // accumulate weighted effect of each neighboring pixel
1631
+ value += (weightsTable.getWeight(y, i) * (double)*(BYTE *)&src_pal[*src_bits]);
1632
+ src_bits += src_pitch;
1633
+ }
1634
+
1635
+ // clamp and place result in destination pixel
1636
+ *dst_bits = (BYTE)CLAMP<int>((int)(value + 0.5), 0, 0xFF);
1637
+ dst_bits += dst_pitch;
1638
+ }
1639
+ }
1640
+ } else {
1641
+ // we do not have a palette
1642
+ for (unsigned x = 0; x < width; x++) {
1643
+ // work on column x in dst
1644
+ BYTE *dst_bits = dst_base + x;
1645
+
1646
+ // scale each column
1647
+ for (unsigned y = 0; y < dst_height; y++) {
1648
+ // loop through column
1649
+ const unsigned iLeft = weightsTable.getLeftBoundary(y); // retrieve left boundary
1650
+ const unsigned iLimit = weightsTable.getRightBoundary(y) - iLeft; // retrieve right boundary
1651
+ const BYTE *src_bits = src_base + iLeft * src_pitch + x;
1652
+ double value = 0;
1653
+
1654
+ for (unsigned i = 0; i < iLimit; i++) {
1655
+ // scan between boundaries
1656
+ // accumulate weighted effect of each neighboring pixel
1657
+ value += (weightsTable.getWeight(y, i) * (double)*src_bits);
1658
+ src_bits += src_pitch;
1659
+ }
1660
+
1661
+ // clamp and place result in destination pixel
1662
+ *dst_bits = (BYTE)CLAMP<int>((int)(value + 0.5), 0, 0xFF);
1663
+ dst_bits += dst_pitch;
1664
+ }
1665
+ }
1666
+ }
1667
+ }
1668
+ break;
1669
+
1670
+ case 24:
1671
+ {
1672
+ // transparently convert the non-transparent 8-bit image to 24 bpp
1673
+ if (src_pal) {
1674
+ // we have got a palette
1675
+ for (unsigned x = 0; x < width; x++) {
1676
+ // work on column x in dst
1677
+ BYTE *dst_bits = dst_base + x * 3;
1678
+
1679
+ // scale each column
1680
+ for (unsigned y = 0; y < dst_height; y++) {
1681
+ // loop through column
1682
+ const unsigned iLeft = weightsTable.getLeftBoundary(y); // retrieve left boundary
1683
+ const unsigned iLimit = weightsTable.getRightBoundary(y) - iLeft; // retrieve right boundary
1684
+ const BYTE *src_bits = src_base + iLeft * src_pitch + x;
1685
+ double r = 0, g = 0, b = 0;
1686
+
1687
+ for (unsigned i = 0; i < iLimit; i++) {
1688
+ // scan between boundaries
1689
+ // accumulate weighted effect of each neighboring pixel
1690
+ const double weight = weightsTable.getWeight(y, i);
1691
+ const BYTE * const entry = (BYTE *)&src_pal[*src_bits];
1692
+ r += (weight * (double)entry[FI_RGBA_RED]);
1693
+ g += (weight * (double)entry[FI_RGBA_GREEN]);
1694
+ b += (weight * (double)entry[FI_RGBA_BLUE]);
1695
+ src_bits += src_pitch;
1696
+ }
1697
+
1698
+ // clamp and place result in destination pixel
1699
+ dst_bits[FI_RGBA_RED] = (BYTE)CLAMP<int>((int)(r + 0.5), 0, 0xFF);
1700
+ dst_bits[FI_RGBA_GREEN] = (BYTE)CLAMP<int>((int)(g + 0.5), 0, 0xFF);
1701
+ dst_bits[FI_RGBA_BLUE] = (BYTE)CLAMP<int>((int)(b + 0.5), 0, 0xFF);
1702
+ dst_bits += dst_pitch;
1703
+ }
1704
+ }
1705
+ } else {
1706
+ // we do not have a palette
1707
+ for (unsigned x = 0; x < width; x++) {
1708
+ // work on column x in dst
1709
+ BYTE *dst_bits = dst_base + x * 3;
1710
+
1711
+ // scale each column
1712
+ for (unsigned y = 0; y < dst_height; y++) {
1713
+ // loop through column
1714
+ const unsigned iLeft = weightsTable.getLeftBoundary(y); // retrieve left boundary
1715
+ const unsigned iLimit = weightsTable.getRightBoundary(y) - iLeft; // retrieve right boundary
1716
+ const BYTE *src_bits = src_base + iLeft * src_pitch + x;
1717
+ double value = 0;
1718
+
1719
+ for (unsigned i = 0; i < iLimit; i++) {
1720
+ // scan between boundaries
1721
+ // accumulate weighted effect of each neighboring pixel
1722
+ value += (weightsTable.getWeight(y, i) * (double)*src_bits);
1723
+ src_bits += src_pitch;
1724
+ }
1725
+
1726
+ // clamp and place result in destination pixel
1727
+ const BYTE bval = (BYTE)CLAMP<int>((int)(value + 0.5), 0, 0xFF);
1728
+ dst_bits[FI_RGBA_RED] = bval;
1729
+ dst_bits[FI_RGBA_GREEN] = bval;
1730
+ dst_bits[FI_RGBA_BLUE] = bval;
1731
+ dst_bits += dst_pitch;
1732
+ }
1733
+ }
1734
+ }
1735
+ }
1736
+ break;
1737
+
1738
+ case 32:
1739
+ {
1740
+ // transparently convert the transparent 8-bit image to 32 bpp;
1741
+ // we always have got a palette here
1742
+ for (unsigned x = 0; x < width; x++) {
1743
+ // work on column x in dst
1744
+ BYTE *dst_bits = dst_base + x * 4;
1745
+
1746
+ // scale each column
1747
+ for (unsigned y = 0; y < dst_height; y++) {
1748
+ // loop through column
1749
+ const unsigned iLeft = weightsTable.getLeftBoundary(y); // retrieve left boundary
1750
+ const unsigned iLimit = weightsTable.getRightBoundary(y) - iLeft; // retrieve right boundary
1751
+ const BYTE *src_bits = src_base + iLeft * src_pitch + x;
1752
+ double r = 0, g = 0, b = 0, a = 0;
1753
+
1754
+ for (unsigned i = 0; i < iLimit; i++) {
1755
+ // scan between boundaries
1756
+ // accumulate weighted effect of each neighboring pixel
1757
+ const double weight = weightsTable.getWeight(y, i);
1758
+ const BYTE * const entry = (BYTE *)&src_pal[*src_bits];
1759
+ r += (weight * (double)entry[FI_RGBA_RED]);
1760
+ g += (weight * (double)entry[FI_RGBA_GREEN]);
1761
+ b += (weight * (double)entry[FI_RGBA_BLUE]);
1762
+ a += (weight * (double)entry[FI_RGBA_ALPHA]);
1763
+ src_bits += src_pitch;
1764
+ }
1765
+
1766
+ // clamp and place result in destination pixel
1767
+ dst_bits[FI_RGBA_RED] = (BYTE)CLAMP<int>((int)(r + 0.5), 0, 0xFF);
1768
+ dst_bits[FI_RGBA_GREEN] = (BYTE)CLAMP<int>((int)(g + 0.5), 0, 0xFF);
1769
+ dst_bits[FI_RGBA_BLUE] = (BYTE)CLAMP<int>((int)(b + 0.5), 0, 0xFF);
1770
+ dst_bits[FI_RGBA_ALPHA] = (BYTE)CLAMP<int>((int)(a + 0.5), 0, 0xFF);
1771
+ dst_bits += dst_pitch;
1772
+ }
1773
+ }
1774
+ }
1775
+ break;
1776
+ }
1777
+ }
1778
+ break;
1779
+
1780
+ case 16:
1781
+ {
1782
+ // transparently convert the 16-bit non-transparent image to 24 bpp
1783
+ const unsigned src_pitch = FreeImage_GetPitch(src) / sizeof(WORD);
1784
+ const WORD *const src_base = (WORD *)FreeImage_GetBits(src) + src_offset_y * src_pitch + src_offset_x;
1785
+
1786
+ if (IS_FORMAT_RGB565(src)) {
1787
+ // image has 565 format
1788
+ for (unsigned x = 0; x < width; x++) {
1789
+ // work on column x in dst
1790
+ BYTE *dst_bits = dst_base + x * 3;
1791
+
1792
+ // scale each column
1793
+ for (unsigned y = 0; y < dst_height; y++) {
1794
+ // loop through column
1795
+ const unsigned iLeft = weightsTable.getLeftBoundary(y); // retrieve left boundary
1796
+ const unsigned iLimit = weightsTable.getRightBoundary(y) - iLeft; // retrieve right boundary
1797
+ const WORD *src_bits = src_base + iLeft * src_pitch + x;
1798
+ double r = 0, g = 0, b = 0;
1799
+
1800
+ for (unsigned i = 0; i < iLimit; i++) {
1801
+ // scan between boundaries
1802
+ // accumulate weighted effect of each neighboring pixel
1803
+ const double weight = weightsTable.getWeight(y, i);
1804
+ r += (weight * (double)((*src_bits & FI16_565_RED_MASK) >> FI16_565_RED_SHIFT));
1805
+ g += (weight * (double)((*src_bits & FI16_565_GREEN_MASK) >> FI16_565_GREEN_SHIFT));
1806
+ b += (weight * (double)((*src_bits & FI16_565_BLUE_MASK) >> FI16_565_BLUE_SHIFT));
1807
+ src_bits += src_pitch;
1808
+ }
1809
+
1810
+ // clamp and place result in destination pixel
1811
+ dst_bits[FI_RGBA_RED] = (BYTE)CLAMP<int>((int)(((r * 0xFF) / 0x1F) + 0.5), 0, 0xFF);
1812
+ dst_bits[FI_RGBA_GREEN] = (BYTE)CLAMP<int>((int)(((g * 0xFF) / 0x3F) + 0.5), 0, 0xFF);
1813
+ dst_bits[FI_RGBA_BLUE] = (BYTE)CLAMP<int>((int)(((b * 0xFF) / 0x1F) + 0.5), 0, 0xFF);
1814
+ dst_bits += dst_pitch;
1815
+ }
1816
+ }
1817
+ } else {
1818
+ // image has 555 format
1819
+ for (unsigned x = 0; x < width; x++) {
1820
+ // work on column x in dst
1821
+ BYTE *dst_bits = dst_base + x * 3;
1822
+
1823
+ // scale each column
1824
+ for (unsigned y = 0; y < dst_height; y++) {
1825
+ // loop through column
1826
+ const unsigned iLeft = weightsTable.getLeftBoundary(y); // retrieve left boundary
1827
+ const unsigned iLimit = weightsTable.getRightBoundary(y) - iLeft; // retrieve right boundary
1828
+ const WORD *src_bits = src_base + iLeft * src_pitch + x;
1829
+ double r = 0, g = 0, b = 0;
1830
+
1831
+ for (unsigned i = 0; i < iLimit; i++) {
1832
+ // scan between boundaries
1833
+ // accumulate weighted effect of each neighboring pixel
1834
+ const double weight = weightsTable.getWeight(y, i);
1835
+ r += (weight * (double)((*src_bits & FI16_555_RED_MASK) >> FI16_555_RED_SHIFT));
1836
+ g += (weight * (double)((*src_bits & FI16_555_GREEN_MASK) >> FI16_555_GREEN_SHIFT));
1837
+ b += (weight * (double)((*src_bits & FI16_555_BLUE_MASK) >> FI16_555_BLUE_SHIFT));
1838
+ src_bits += src_pitch;
1839
+ }
1840
+
1841
+ // clamp and place result in destination pixel
1842
+ dst_bits[FI_RGBA_RED] = (BYTE)CLAMP<int>((int)(((r * 0xFF) / 0x1F) + 0.5), 0, 0xFF);
1843
+ dst_bits[FI_RGBA_GREEN] = (BYTE)CLAMP<int>((int)(((g * 0xFF) / 0x1F) + 0.5), 0, 0xFF);
1844
+ dst_bits[FI_RGBA_BLUE] = (BYTE)CLAMP<int>((int)(((b * 0xFF) / 0x1F) + 0.5), 0, 0xFF);
1845
+ dst_bits += dst_pitch;
1846
+ }
1847
+ }
1848
+ }
1849
+ }
1850
+ break;
1851
+
1852
+ case 24:
1853
+ {
1854
+ // scale the 24-bit transparent image into a 24 bpp destination image
1855
+ const unsigned src_pitch = FreeImage_GetPitch(src);
1856
+ const BYTE *const src_base = FreeImage_GetBits(src) + src_offset_y * src_pitch + src_offset_x * 3;
1857
+
1858
+ for (unsigned x = 0; x < width; x++) {
1859
+ // work on column x in dst
1860
+ const unsigned index = x * 3;
1861
+ BYTE *dst_bits = dst_base + index;
1862
+
1863
+ // scale each column
1864
+ for (unsigned y = 0; y < dst_height; y++) {
1865
+ // loop through column
1866
+ const unsigned iLeft = weightsTable.getLeftBoundary(y); // retrieve left boundary
1867
+ const unsigned iLimit = weightsTable.getRightBoundary(y) - iLeft; // retrieve right boundary
1868
+ const BYTE *src_bits = src_base + iLeft * src_pitch + index;
1869
+ double r = 0, g = 0, b = 0;
1870
+
1871
+ for (unsigned i = 0; i < iLimit; i++) {
1872
+ // scan between boundaries
1873
+ // accumulate weighted effect of each neighboring pixel
1874
+ const double weight = weightsTable.getWeight(y, i);
1875
+ r += (weight * (double)src_bits[FI_RGBA_RED]);
1876
+ g += (weight * (double)src_bits[FI_RGBA_GREEN]);
1877
+ b += (weight * (double)src_bits[FI_RGBA_BLUE]);
1878
+ src_bits += src_pitch;
1879
+ }
1880
+
1881
+ // clamp and place result in destination pixel
1882
+ dst_bits[FI_RGBA_RED] = (BYTE)CLAMP<int>((int) (r + 0.5), 0, 0xFF);
1883
+ dst_bits[FI_RGBA_GREEN] = (BYTE)CLAMP<int>((int) (g + 0.5), 0, 0xFF);
1884
+ dst_bits[FI_RGBA_BLUE] = (BYTE)CLAMP<int>((int) (b + 0.5), 0, 0xFF);
1885
+ dst_bits += dst_pitch;
1886
+ }
1887
+ }
1888
+ }
1889
+ break;
1890
+
1891
+ case 32:
1892
+ {
1893
+ // scale the 32-bit transparent image into a 32 bpp destination image
1894
+ const unsigned src_pitch = FreeImage_GetPitch(src);
1895
+ const BYTE *const src_base = FreeImage_GetBits(src) + src_offset_y * src_pitch + src_offset_x * 4;
1896
+
1897
+ for (unsigned x = 0; x < width; x++) {
1898
+ // work on column x in dst
1899
+ const unsigned index = x * 4;
1900
+ BYTE *dst_bits = dst_base + index;
1901
+
1902
+ // scale each column
1903
+ for (unsigned y = 0; y < dst_height; y++) {
1904
+ // loop through column
1905
+ const unsigned iLeft = weightsTable.getLeftBoundary(y); // retrieve left boundary
1906
+ const unsigned iLimit = weightsTable.getRightBoundary(y) - iLeft; // retrieve right boundary
1907
+ const BYTE *src_bits = src_base + iLeft * src_pitch + index;
1908
+ double r = 0, g = 0, b = 0, a = 0;
1909
+
1910
+ for (unsigned i = 0; i < iLimit; i++) {
1911
+ // scan between boundaries
1912
+ // accumulate weighted effect of each neighboring pixel
1913
+ const double weight = weightsTable.getWeight(y, i);
1914
+ r += (weight * (double)src_bits[FI_RGBA_RED]);
1915
+ g += (weight * (double)src_bits[FI_RGBA_GREEN]);
1916
+ b += (weight * (double)src_bits[FI_RGBA_BLUE]);
1917
+ a += (weight * (double)src_bits[FI_RGBA_ALPHA]);
1918
+ src_bits += src_pitch;
1919
+ }
1920
+
1921
+ // clamp and place result in destination pixel
1922
+ dst_bits[FI_RGBA_RED] = (BYTE)CLAMP<int>((int) (r + 0.5), 0, 0xFF);
1923
+ dst_bits[FI_RGBA_GREEN] = (BYTE)CLAMP<int>((int) (g + 0.5), 0, 0xFF);
1924
+ dst_bits[FI_RGBA_BLUE] = (BYTE)CLAMP<int>((int) (b + 0.5), 0, 0xFF);
1925
+ dst_bits[FI_RGBA_ALPHA] = (BYTE)CLAMP<int>((int) (a + 0.5), 0, 0xFF);
1926
+ dst_bits += dst_pitch;
1927
+ }
1928
+ }
1929
+ }
1930
+ break;
1931
+ }
1932
+ }
1933
+ break;
1934
+
1935
+ case FIT_UINT16:
1936
+ {
1937
+ // Calculate the number of words per pixel (1 for 16-bit, 3 for 48-bit or 4 for 64-bit)
1938
+ const unsigned wordspp = (FreeImage_GetLine(src) / width) / sizeof(WORD);
1939
+
1940
+ const unsigned dst_pitch = FreeImage_GetPitch(dst) / sizeof(WORD);
1941
+ WORD *const dst_base = (WORD *)FreeImage_GetBits(dst);
1942
+
1943
+ const unsigned src_pitch = FreeImage_GetPitch(src) / sizeof(WORD);
1944
+ const WORD *const src_base = (WORD *)FreeImage_GetBits(src) + src_offset_y * src_pitch + src_offset_x * wordspp;
1945
+
1946
+ for (unsigned x = 0; x < width; x++) {
1947
+ // work on column x in dst
1948
+ const unsigned index = x * wordspp; // pixel index
1949
+ WORD *dst_bits = dst_base + index;
1950
+
1951
+ // scale each column
1952
+ for (unsigned y = 0; y < dst_height; y++) {
1953
+ // loop through column
1954
+ const unsigned iLeft = weightsTable.getLeftBoundary(y); // retrieve left boundary
1955
+ const unsigned iLimit = weightsTable.getRightBoundary(y) - iLeft; // retrieve right boundary
1956
+ const WORD *src_bits = src_base + iLeft * src_pitch + index;
1957
+ double value = 0;
1958
+
1959
+ for (unsigned i = 0; i < iLimit; i++) {
1960
+ // scan between boundaries
1961
+ // accumulate weighted effect of each neighboring pixel
1962
+ const double weight = weightsTable.getWeight(y, i);
1963
+ value += (weight * (double)src_bits[0]);
1964
+ src_bits += src_pitch;
1965
+ }
1966
+
1967
+ // clamp and place result in destination pixel
1968
+ dst_bits[0] = (WORD)CLAMP<int>((int)(value + 0.5), 0, 0xFFFF);
1969
+
1970
+ dst_bits += dst_pitch;
1971
+ }
1972
+ }
1973
+ }
1974
+ break;
1975
+
1976
+ case FIT_RGB16:
1977
+ {
1978
+ // Calculate the number of words per pixel (1 for 16-bit, 3 for 48-bit or 4 for 64-bit)
1979
+ const unsigned wordspp = (FreeImage_GetLine(src) / width) / sizeof(WORD);
1980
+
1981
+ const unsigned dst_pitch = FreeImage_GetPitch(dst) / sizeof(WORD);
1982
+ WORD *const dst_base = (WORD *)FreeImage_GetBits(dst);
1983
+
1984
+ const unsigned src_pitch = FreeImage_GetPitch(src) / sizeof(WORD);
1985
+ const WORD *const src_base = (WORD *)FreeImage_GetBits(src) + src_offset_y * src_pitch + src_offset_x * wordspp;
1986
+
1987
+ for (unsigned x = 0; x < width; x++) {
1988
+ // work on column x in dst
1989
+ const unsigned index = x * wordspp; // pixel index
1990
+ WORD *dst_bits = dst_base + index;
1991
+
1992
+ // scale each column
1993
+ for (unsigned y = 0; y < dst_height; y++) {
1994
+ // loop through column
1995
+ const unsigned iLeft = weightsTable.getLeftBoundary(y); // retrieve left boundary
1996
+ const unsigned iLimit = weightsTable.getRightBoundary(y) - iLeft; // retrieve right boundary
1997
+ const WORD *src_bits = src_base + iLeft * src_pitch + index;
1998
+ double r = 0, g = 0, b = 0;
1999
+
2000
+ for (unsigned i = 0; i < iLimit; i++) {
2001
+ // scan between boundaries
2002
+ // accumulate weighted effect of each neighboring pixel
2003
+ const double weight = weightsTable.getWeight(y, i);
2004
+ r += (weight * (double)src_bits[0]);
2005
+ g += (weight * (double)src_bits[1]);
2006
+ b += (weight * (double)src_bits[2]);
2007
+
2008
+ src_bits += src_pitch;
2009
+ }
2010
+
2011
+ // clamp and place result in destination pixel
2012
+ dst_bits[0] = (WORD)CLAMP<int>((int)(r + 0.5), 0, 0xFFFF);
2013
+ dst_bits[1] = (WORD)CLAMP<int>((int)(g + 0.5), 0, 0xFFFF);
2014
+ dst_bits[2] = (WORD)CLAMP<int>((int)(b + 0.5), 0, 0xFFFF);
2015
+
2016
+ dst_bits += dst_pitch;
2017
+ }
2018
+ }
2019
+ }
2020
+ break;
2021
+
2022
+ case FIT_RGBA16:
2023
+ {
2024
+ // Calculate the number of words per pixel (1 for 16-bit, 3 for 48-bit or 4 for 64-bit)
2025
+ const unsigned wordspp = (FreeImage_GetLine(src) / width) / sizeof(WORD);
2026
+
2027
+ const unsigned dst_pitch = FreeImage_GetPitch(dst) / sizeof(WORD);
2028
+ WORD *const dst_base = (WORD *)FreeImage_GetBits(dst);
2029
+
2030
+ const unsigned src_pitch = FreeImage_GetPitch(src) / sizeof(WORD);
2031
+ const WORD *const src_base = (WORD *)FreeImage_GetBits(src) + src_offset_y * src_pitch + src_offset_x * wordspp;
2032
+
2033
+ for (unsigned x = 0; x < width; x++) {
2034
+ // work on column x in dst
2035
+ const unsigned index = x * wordspp; // pixel index
2036
+ WORD *dst_bits = dst_base + index;
2037
+
2038
+ // scale each column
2039
+ for (unsigned y = 0; y < dst_height; y++) {
2040
+ // loop through column
2041
+ const unsigned iLeft = weightsTable.getLeftBoundary(y); // retrieve left boundary
2042
+ const unsigned iLimit = weightsTable.getRightBoundary(y) - iLeft; // retrieve right boundary
2043
+ const WORD *src_bits = src_base + iLeft * src_pitch + index;
2044
+ double r = 0, g = 0, b = 0, a = 0;
2045
+
2046
+ for (unsigned i = 0; i < iLimit; i++) {
2047
+ // scan between boundaries
2048
+ // accumulate weighted effect of each neighboring pixel
2049
+ const double weight = weightsTable.getWeight(y, i);
2050
+ r += (weight * (double)src_bits[0]);
2051
+ g += (weight * (double)src_bits[1]);
2052
+ b += (weight * (double)src_bits[2]);
2053
+ a += (weight * (double)src_bits[3]);
2054
+
2055
+ src_bits += src_pitch;
2056
+ }
2057
+
2058
+ // clamp and place result in destination pixel
2059
+ dst_bits[0] = (WORD)CLAMP<int>((int)(r + 0.5), 0, 0xFFFF);
2060
+ dst_bits[1] = (WORD)CLAMP<int>((int)(g + 0.5), 0, 0xFFFF);
2061
+ dst_bits[2] = (WORD)CLAMP<int>((int)(b + 0.5), 0, 0xFFFF);
2062
+ dst_bits[3] = (WORD)CLAMP<int>((int)(a + 0.5), 0, 0xFFFF);
2063
+
2064
+ dst_bits += dst_pitch;
2065
+ }
2066
+ }
2067
+ }
2068
+ break;
2069
+
2070
+ case FIT_FLOAT:
2071
+ case FIT_RGBF:
2072
+ case FIT_RGBAF:
2073
+ {
2074
+ // Calculate the number of floats per pixel (1 for 32-bit, 3 for 96-bit or 4 for 128-bit)
2075
+ const unsigned floatspp = (FreeImage_GetLine(src) / width) / sizeof(float);
2076
+
2077
+ const unsigned dst_pitch = FreeImage_GetPitch(dst) / sizeof(float);
2078
+ float *const dst_base = (float *)FreeImage_GetBits(dst);
2079
+
2080
+ const unsigned src_pitch = FreeImage_GetPitch(src) / sizeof(float);
2081
+ const float *const src_base = (float *)FreeImage_GetBits(src) + src_offset_y * src_pitch + src_offset_x * floatspp;
2082
+
2083
+ for (unsigned x = 0; x < width; x++) {
2084
+ // work on column x in dst
2085
+ const unsigned index = x * floatspp; // pixel index
2086
+ float *dst_bits = (float *)dst_base + index;
2087
+
2088
+ // scale each column
2089
+ for (unsigned y = 0; y < dst_height; y++) {
2090
+ // loop through column
2091
+ const unsigned iLeft = weightsTable.getLeftBoundary(y); // retrieve left boundary
2092
+ const unsigned iRight = weightsTable.getRightBoundary(y); // retrieve right boundary
2093
+ const float *src_bits = src_base + iLeft * src_pitch + index;
2094
+ double value[4] = {0, 0, 0, 0}; // 4 = 128 bpp max
2095
+
2096
+ for (unsigned i = iLeft; i < iRight; i++) {
2097
+ // scan between boundaries
2098
+ // accumulate weighted effect of each neighboring pixel
2099
+ const double weight = weightsTable.getWeight(y, i - iLeft);
2100
+ for (unsigned j = 0; j < floatspp; j++) {
2101
+ value[j] += (weight * (double)src_bits[j]);
2102
+ }
2103
+ src_bits += src_pitch;
2104
+ }
2105
+
2106
+ // place result in destination pixel
2107
+ for (unsigned j = 0; j < floatspp; j++) {
2108
+ dst_bits[j] = (float)value[j];
2109
+ }
2110
+ dst_bits += dst_pitch;
2111
+ }
2112
+ }
2113
+ }
2114
+ break;
2115
+ }
2116
+ }