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.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README.md +1 -0
- data/Rakefile +34 -0
- data/ext/rfreeimage/extconf.rb +35 -0
- data/ext/rfreeimage/rfi_main.c +389 -0
- data/lib/rfreeimage/image.rb +26 -0
- data/lib/rfreeimage/version.rb +3 -0
- data/lib/rfreeimage.rb +3 -0
- data/rfreeimage.gemspec +32 -0
- data/vendor/FreeImage/Makefile +34 -0
- data/vendor/FreeImage/Makefile.cygwin +74 -0
- data/vendor/FreeImage/Makefile.fip +84 -0
- data/vendor/FreeImage/Makefile.gnu +83 -0
- data/vendor/FreeImage/Makefile.iphone +96 -0
- data/vendor/FreeImage/Makefile.mingw +136 -0
- data/vendor/FreeImage/Makefile.osx +115 -0
- data/vendor/FreeImage/Makefile.solaris +66 -0
- data/vendor/FreeImage/Makefile.srcs +6 -0
- data/vendor/FreeImage/README.iphone +19 -0
- data/vendor/FreeImage/README.linux +50 -0
- data/vendor/FreeImage/README.minGW +236 -0
- data/vendor/FreeImage/README.osx +44 -0
- data/vendor/FreeImage/README.solaris +67 -0
- data/vendor/FreeImage/Source/CacheFile.h +92 -0
- data/vendor/FreeImage/Source/DeprecationManager/Deprecated.cpp +36 -0
- data/vendor/FreeImage/Source/DeprecationManager/DeprecationMgr.cpp +103 -0
- data/vendor/FreeImage/Source/DeprecationManager/DeprecationMgr.h +83 -0
- data/vendor/FreeImage/Source/FreeImage/BitmapAccess.cpp +1573 -0
- data/vendor/FreeImage/Source/FreeImage/CacheFile.cpp +271 -0
- data/vendor/FreeImage/Source/FreeImage/ColorLookup.cpp +785 -0
- data/vendor/FreeImage/Source/FreeImage/Conversion.cpp +551 -0
- data/vendor/FreeImage/Source/FreeImage/Conversion16_555.cpp +209 -0
- data/vendor/FreeImage/Source/FreeImage/Conversion16_565.cpp +204 -0
- data/vendor/FreeImage/Source/FreeImage/Conversion24.cpp +252 -0
- data/vendor/FreeImage/Source/FreeImage/Conversion32.cpp +345 -0
- data/vendor/FreeImage/Source/FreeImage/Conversion4.cpp +246 -0
- data/vendor/FreeImage/Source/FreeImage/Conversion8.cpp +305 -0
- data/vendor/FreeImage/Source/FreeImage/ConversionFloat.cpp +194 -0
- data/vendor/FreeImage/Source/FreeImage/ConversionRGB16.cpp +144 -0
- data/vendor/FreeImage/Source/FreeImage/ConversionRGBA16.cpp +147 -0
- data/vendor/FreeImage/Source/FreeImage/ConversionRGBAF.cpp +250 -0
- data/vendor/FreeImage/Source/FreeImage/ConversionRGBF.cpp +243 -0
- data/vendor/FreeImage/Source/FreeImage/ConversionType.cpp +699 -0
- data/vendor/FreeImage/Source/FreeImage/ConversionUINT16.cpp +134 -0
- data/vendor/FreeImage/Source/FreeImage/FreeImage.cpp +226 -0
- data/vendor/FreeImage/Source/FreeImage/FreeImageC.c +22 -0
- data/vendor/FreeImage/Source/FreeImage/FreeImageIO.cpp +175 -0
- data/vendor/FreeImage/Source/FreeImage/GetType.cpp +92 -0
- data/vendor/FreeImage/Source/FreeImage/Halftoning.cpp +474 -0
- data/vendor/FreeImage/Source/FreeImage/J2KHelper.cpp +591 -0
- data/vendor/FreeImage/Source/FreeImage/J2KHelper.h +36 -0
- data/vendor/FreeImage/Source/FreeImage/LFPQuantizer.cpp +208 -0
- data/vendor/FreeImage/Source/FreeImage/MNGHelper.cpp +1320 -0
- data/vendor/FreeImage/Source/FreeImage/MemoryIO.cpp +237 -0
- data/vendor/FreeImage/Source/FreeImage/MultiPage.cpp +974 -0
- data/vendor/FreeImage/Source/FreeImage/NNQuantizer.cpp +507 -0
- data/vendor/FreeImage/Source/FreeImage/PSDParser.cpp +1057 -0
- data/vendor/FreeImage/Source/FreeImage/PSDParser.h +271 -0
- data/vendor/FreeImage/Source/FreeImage/PixelAccess.cpp +197 -0
- data/vendor/FreeImage/Source/FreeImage/Plugin.cpp +822 -0
- data/vendor/FreeImage/Source/FreeImage/PluginBMP.cpp +1494 -0
- data/vendor/FreeImage/Source/FreeImage/PluginCUT.cpp +240 -0
- data/vendor/FreeImage/Source/FreeImage/PluginDDS.cpp +655 -0
- data/vendor/FreeImage/Source/FreeImage/PluginEXR.cpp +773 -0
- data/vendor/FreeImage/Source/FreeImage/PluginG3.cpp +433 -0
- data/vendor/FreeImage/Source/FreeImage/PluginGIF.cpp +1407 -0
- data/vendor/FreeImage/Source/FreeImage/PluginHDR.cpp +722 -0
- data/vendor/FreeImage/Source/FreeImage/PluginICO.cpp +824 -0
- data/vendor/FreeImage/Source/FreeImage/PluginIFF.cpp +459 -0
- data/vendor/FreeImage/Source/FreeImage/PluginJ2K.cpp +328 -0
- data/vendor/FreeImage/Source/FreeImage/PluginJNG.cpp +162 -0
- data/vendor/FreeImage/Source/FreeImage/PluginJP2.cpp +328 -0
- data/vendor/FreeImage/Source/FreeImage/PluginJPEG.cpp +1706 -0
- data/vendor/FreeImage/Source/FreeImage/PluginJXR.cpp +1475 -0
- data/vendor/FreeImage/Source/FreeImage/PluginKOALA.cpp +243 -0
- data/vendor/FreeImage/Source/FreeImage/PluginMNG.cpp +153 -0
- data/vendor/FreeImage/Source/FreeImage/PluginPCD.cpp +251 -0
- data/vendor/FreeImage/Source/FreeImage/PluginPCX.cpp +659 -0
- data/vendor/FreeImage/Source/FreeImage/PluginPFM.cpp +409 -0
- data/vendor/FreeImage/Source/FreeImage/PluginPICT.cpp +1343 -0
- data/vendor/FreeImage/Source/FreeImage/PluginPNG.cpp +1115 -0
- data/vendor/FreeImage/Source/FreeImage/PluginPNM.cpp +838 -0
- data/vendor/FreeImage/Source/FreeImage/PluginPSD.cpp +131 -0
- data/vendor/FreeImage/Source/FreeImage/PluginRAS.cpp +512 -0
- data/vendor/FreeImage/Source/FreeImage/PluginRAW.cpp +793 -0
- data/vendor/FreeImage/Source/FreeImage/PluginSGI.cpp +425 -0
- data/vendor/FreeImage/Source/FreeImage/PluginTARGA.cpp +1591 -0
- data/vendor/FreeImage/Source/FreeImage/PluginTIFF.cpp +2631 -0
- data/vendor/FreeImage/Source/FreeImage/PluginWBMP.cpp +372 -0
- data/vendor/FreeImage/Source/FreeImage/PluginWebP.cpp +698 -0
- data/vendor/FreeImage/Source/FreeImage/PluginXBM.cpp +399 -0
- data/vendor/FreeImage/Source/FreeImage/PluginXPM.cpp +487 -0
- data/vendor/FreeImage/Source/FreeImage/TIFFLogLuv.cpp +65 -0
- data/vendor/FreeImage/Source/FreeImage/ToneMapping.cpp +75 -0
- data/vendor/FreeImage/Source/FreeImage/WuQuantizer.cpp +559 -0
- data/vendor/FreeImage/Source/FreeImage/ZLibInterface.cpp +223 -0
- data/vendor/FreeImage/Source/FreeImage/tmoColorConvert.cpp +479 -0
- data/vendor/FreeImage/Source/FreeImage/tmoDrago03.cpp +295 -0
- data/vendor/FreeImage/Source/FreeImage/tmoFattal02.cpp +689 -0
- data/vendor/FreeImage/Source/FreeImage/tmoReinhard05.cpp +260 -0
- data/vendor/FreeImage/Source/FreeImage.h +1153 -0
- data/vendor/FreeImage/Source/FreeImageIO.h +63 -0
- data/vendor/FreeImage/Source/FreeImageToolkit/BSplineRotate.cpp +730 -0
- data/vendor/FreeImage/Source/FreeImageToolkit/Background.cpp +895 -0
- data/vendor/FreeImage/Source/FreeImageToolkit/Channels.cpp +488 -0
- data/vendor/FreeImage/Source/FreeImageToolkit/ClassicRotate.cpp +917 -0
- data/vendor/FreeImage/Source/FreeImageToolkit/Colors.cpp +967 -0
- data/vendor/FreeImage/Source/FreeImageToolkit/CopyPaste.cpp +861 -0
- data/vendor/FreeImage/Source/FreeImageToolkit/Display.cpp +230 -0
- data/vendor/FreeImage/Source/FreeImageToolkit/Filters.h +287 -0
- data/vendor/FreeImage/Source/FreeImageToolkit/Flip.cpp +166 -0
- data/vendor/FreeImage/Source/FreeImageToolkit/JPEGTransform.cpp +623 -0
- data/vendor/FreeImage/Source/FreeImageToolkit/MultigridPoissonSolver.cpp +505 -0
- data/vendor/FreeImage/Source/FreeImageToolkit/Rescale.cpp +192 -0
- data/vendor/FreeImage/Source/FreeImageToolkit/Resize.cpp +2116 -0
- data/vendor/FreeImage/Source/FreeImageToolkit/Resize.h +196 -0
- data/vendor/FreeImage/Source/LibJPEG/ansi2knr.c +739 -0
- data/vendor/FreeImage/Source/LibJPEG/cderror.h +134 -0
- data/vendor/FreeImage/Source/LibJPEG/cdjpeg.c +181 -0
- data/vendor/FreeImage/Source/LibJPEG/cdjpeg.h +187 -0
- data/vendor/FreeImage/Source/LibJPEG/cjpeg.c +664 -0
- data/vendor/FreeImage/Source/LibJPEG/ckconfig.c +402 -0
- data/vendor/FreeImage/Source/LibJPEG/djpeg.c +617 -0
- data/vendor/FreeImage/Source/LibJPEG/example.c +433 -0
- data/vendor/FreeImage/Source/LibJPEG/jaricom.c +153 -0
- data/vendor/FreeImage/Source/LibJPEG/jcapimin.c +288 -0
- data/vendor/FreeImage/Source/LibJPEG/jcapistd.c +162 -0
- data/vendor/FreeImage/Source/LibJPEG/jcarith.c +944 -0
- data/vendor/FreeImage/Source/LibJPEG/jccoefct.c +454 -0
- data/vendor/FreeImage/Source/LibJPEG/jccolor.c +604 -0
- data/vendor/FreeImage/Source/LibJPEG/jcdctmgr.c +477 -0
- data/vendor/FreeImage/Source/LibJPEG/jchuff.c +1573 -0
- data/vendor/FreeImage/Source/LibJPEG/jcinit.c +84 -0
- data/vendor/FreeImage/Source/LibJPEG/jcmainct.c +297 -0
- data/vendor/FreeImage/Source/LibJPEG/jcmarker.c +719 -0
- data/vendor/FreeImage/Source/LibJPEG/jcmaster.c +856 -0
- data/vendor/FreeImage/Source/LibJPEG/jcomapi.c +106 -0
- data/vendor/FreeImage/Source/LibJPEG/jconfig.h +161 -0
- data/vendor/FreeImage/Source/LibJPEG/jcparam.c +675 -0
- data/vendor/FreeImage/Source/LibJPEG/jcprepct.c +358 -0
- data/vendor/FreeImage/Source/LibJPEG/jcsample.c +545 -0
- data/vendor/FreeImage/Source/LibJPEG/jctrans.c +385 -0
- data/vendor/FreeImage/Source/LibJPEG/jdapimin.c +399 -0
- data/vendor/FreeImage/Source/LibJPEG/jdapistd.c +276 -0
- data/vendor/FreeImage/Source/LibJPEG/jdarith.c +796 -0
- data/vendor/FreeImage/Source/LibJPEG/jdatadst.c +270 -0
- data/vendor/FreeImage/Source/LibJPEG/jdatasrc.c +275 -0
- data/vendor/FreeImage/Source/LibJPEG/jdcoefct.c +741 -0
- data/vendor/FreeImage/Source/LibJPEG/jdcolor.c +748 -0
- data/vendor/FreeImage/Source/LibJPEG/jdct.h +393 -0
- data/vendor/FreeImage/Source/LibJPEG/jddctmgr.c +384 -0
- data/vendor/FreeImage/Source/LibJPEG/jdhuff.c +1554 -0
- data/vendor/FreeImage/Source/LibJPEG/jdinput.c +662 -0
- data/vendor/FreeImage/Source/LibJPEG/jdmainct.c +513 -0
- data/vendor/FreeImage/Source/LibJPEG/jdmarker.c +1511 -0
- data/vendor/FreeImage/Source/LibJPEG/jdmaster.c +543 -0
- data/vendor/FreeImage/Source/LibJPEG/jdmerge.c +401 -0
- data/vendor/FreeImage/Source/LibJPEG/jdpostct.c +290 -0
- data/vendor/FreeImage/Source/LibJPEG/jdsample.c +361 -0
- data/vendor/FreeImage/Source/LibJPEG/jdtrans.c +140 -0
- data/vendor/FreeImage/Source/LibJPEG/jerror.c +253 -0
- data/vendor/FreeImage/Source/LibJPEG/jerror.h +304 -0
- data/vendor/FreeImage/Source/LibJPEG/jfdctflt.c +174 -0
- data/vendor/FreeImage/Source/LibJPEG/jfdctfst.c +230 -0
- data/vendor/FreeImage/Source/LibJPEG/jfdctint.c +4406 -0
- data/vendor/FreeImage/Source/LibJPEG/jidctflt.c +235 -0
- data/vendor/FreeImage/Source/LibJPEG/jidctfst.c +368 -0
- data/vendor/FreeImage/Source/LibJPEG/jidctint.c +5179 -0
- data/vendor/FreeImage/Source/LibJPEG/jinclude.h +91 -0
- data/vendor/FreeImage/Source/LibJPEG/jmemansi.c +167 -0
- data/vendor/FreeImage/Source/LibJPEG/jmemdos.c +638 -0
- data/vendor/FreeImage/Source/LibJPEG/jmemmac.c +289 -0
- data/vendor/FreeImage/Source/LibJPEG/jmemmgr.c +1119 -0
- data/vendor/FreeImage/Source/LibJPEG/jmemname.c +276 -0
- data/vendor/FreeImage/Source/LibJPEG/jmemnobs.c +109 -0
- data/vendor/FreeImage/Source/LibJPEG/jmemsys.h +198 -0
- data/vendor/FreeImage/Source/LibJPEG/jmorecfg.h +442 -0
- data/vendor/FreeImage/Source/LibJPEG/jpegint.h +426 -0
- data/vendor/FreeImage/Source/LibJPEG/jpeglib.h +1180 -0
- data/vendor/FreeImage/Source/LibJPEG/jpegtran.c +577 -0
- data/vendor/FreeImage/Source/LibJPEG/jquant1.c +857 -0
- data/vendor/FreeImage/Source/LibJPEG/jquant2.c +1311 -0
- data/vendor/FreeImage/Source/LibJPEG/jutils.c +227 -0
- data/vendor/FreeImage/Source/LibJPEG/jversion.h +14 -0
- data/vendor/FreeImage/Source/LibJPEG/rdbmp.c +480 -0
- data/vendor/FreeImage/Source/LibJPEG/rdcolmap.c +253 -0
- data/vendor/FreeImage/Source/LibJPEG/rdgif.c +38 -0
- data/vendor/FreeImage/Source/LibJPEG/rdjpgcom.c +515 -0
- data/vendor/FreeImage/Source/LibJPEG/rdppm.c +459 -0
- data/vendor/FreeImage/Source/LibJPEG/rdrle.c +387 -0
- data/vendor/FreeImage/Source/LibJPEG/rdswitch.c +365 -0
- data/vendor/FreeImage/Source/LibJPEG/rdtarga.c +500 -0
- data/vendor/FreeImage/Source/LibJPEG/transupp.c +1763 -0
- data/vendor/FreeImage/Source/LibJPEG/transupp.h +219 -0
- data/vendor/FreeImage/Source/LibJPEG/wrbmp.c +442 -0
- data/vendor/FreeImage/Source/LibJPEG/wrgif.c +399 -0
- data/vendor/FreeImage/Source/LibJPEG/wrjpgcom.c +583 -0
- data/vendor/FreeImage/Source/LibJPEG/wrppm.c +269 -0
- data/vendor/FreeImage/Source/LibJPEG/wrrle.c +305 -0
- data/vendor/FreeImage/Source/LibJPEG/wrtarga.c +253 -0
- data/vendor/FreeImage/Source/LibJXR/common/include/guiddef.h +230 -0
- data/vendor/FreeImage/Source/LibJXR/common/include/wmsal.h +757 -0
- data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstring.h +342 -0
- data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstrings_adt.h +71 -0
- data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstrings_strict.h +1096 -0
- data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstrings_undef.h +406 -0
- data/vendor/FreeImage/Source/LibJXR/image/decode/JXRTranscode.c +987 -0
- data/vendor/FreeImage/Source/LibJXR/image/decode/decode.c +200 -0
- data/vendor/FreeImage/Source/LibJXR/image/decode/decode.h +143 -0
- data/vendor/FreeImage/Source/LibJXR/image/decode/postprocess.c +288 -0
- data/vendor/FreeImage/Source/LibJXR/image/decode/segdec.c +1205 -0
- data/vendor/FreeImage/Source/LibJXR/image/decode/strInvTransform.c +1888 -0
- data/vendor/FreeImage/Source/LibJXR/image/decode/strPredQuantDec.c +539 -0
- data/vendor/FreeImage/Source/LibJXR/image/decode/strdec.c +3628 -0
- data/vendor/FreeImage/Source/LibJXR/image/decode/strdec_x86.c +1640 -0
- data/vendor/FreeImage/Source/LibJXR/image/encode/encode.c +144 -0
- data/vendor/FreeImage/Source/LibJXR/image/encode/encode.h +113 -0
- data/vendor/FreeImage/Source/LibJXR/image/encode/segenc.c +1186 -0
- data/vendor/FreeImage/Source/LibJXR/image/encode/strFwdTransform.c +1111 -0
- data/vendor/FreeImage/Source/LibJXR/image/encode/strPredQuantEnc.c +511 -0
- data/vendor/FreeImage/Source/LibJXR/image/encode/strenc.c +2370 -0
- data/vendor/FreeImage/Source/LibJXR/image/encode/strenc_x86.c +409 -0
- data/vendor/FreeImage/Source/LibJXR/image/sys/adapthuff.c +511 -0
- data/vendor/FreeImage/Source/LibJXR/image/sys/ansi.h +61 -0
- data/vendor/FreeImage/Source/LibJXR/image/sys/common.h +131 -0
- data/vendor/FreeImage/Source/LibJXR/image/sys/image.c +183 -0
- data/vendor/FreeImage/Source/LibJXR/image/sys/perfTimer.h +115 -0
- data/vendor/FreeImage/Source/LibJXR/image/sys/perfTimerANSI.c +274 -0
- data/vendor/FreeImage/Source/LibJXR/image/sys/strPredQuant.c +306 -0
- data/vendor/FreeImage/Source/LibJXR/image/sys/strTransform.c +85 -0
- data/vendor/FreeImage/Source/LibJXR/image/sys/strTransform.h +50 -0
- data/vendor/FreeImage/Source/LibJXR/image/sys/strcodec.c +1251 -0
- data/vendor/FreeImage/Source/LibJXR/image/sys/strcodec.h +681 -0
- data/vendor/FreeImage/Source/LibJXR/image/sys/windowsmediaphoto.h +515 -0
- data/vendor/FreeImage/Source/LibJXR/image/sys/xplatform_image.h +84 -0
- data/vendor/FreeImage/Source/LibJXR/image/x86/x86.h +58 -0
- data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGlue.c +930 -0
- data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGlue.h +636 -0
- data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGlueJxr.c +2246 -0
- data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGluePFC.c +2338 -0
- data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRMeta.c +905 -0
- data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRMeta.h +258 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/bio.c +188 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/bio.h +128 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/cidx_manager.c +239 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/cidx_manager.h +68 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/cio.c +644 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/cio.h +393 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/dwt.c +919 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/dwt.h +116 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/event.c +141 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/event.h +97 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/function_list.c +114 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/function_list.h +126 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/image.c +235 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/image.h +63 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/indexbox_manager.h +148 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/invert.c +289 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/invert.h +59 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/j2k.c +10238 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/j2k.h +838 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/jp2.c +2776 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/jp2.h +490 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/mct.c +319 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/mct.h +149 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/mqc.c +604 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/mqc.h +201 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/openjpeg.c +955 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/openjpeg.h +1475 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/opj_clock.c +59 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/opj_clock.h +54 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/opj_codec.h +160 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/opj_config.h +9 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/opj_config_private.h +16 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/opj_includes.h +175 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/opj_intmath.h +172 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/opj_inttypes.h +43 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/opj_malloc.h +180 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/opj_stdint.h +47 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/phix_manager.c +191 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/pi.c +1870 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/pi.h +182 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/ppix_manager.c +194 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/raw.c +89 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/raw.h +100 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/t1.c +1751 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/t1.h +157 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/t1_generate_luts.c +276 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/t1_luts.h +143 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/t2.c +1334 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/t2.h +127 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/tcd.c +2123 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/tcd.h +348 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/tgt.c +331 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/tgt.h +140 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/thix_manager.c +134 -0
- data/vendor/FreeImage/Source/LibOpenJPEG/tpix_manager.c +185 -0
- data/vendor/FreeImage/Source/LibPNG/example.c +1061 -0
- data/vendor/FreeImage/Source/LibPNG/png.c +4493 -0
- data/vendor/FreeImage/Source/LibPNG/png.h +3282 -0
- data/vendor/FreeImage/Source/LibPNG/pngconf.h +644 -0
- data/vendor/FreeImage/Source/LibPNG/pngdebug.h +154 -0
- data/vendor/FreeImage/Source/LibPNG/pngerror.c +963 -0
- data/vendor/FreeImage/Source/LibPNG/pngget.c +1213 -0
- data/vendor/FreeImage/Source/LibPNG/pnginfo.h +260 -0
- data/vendor/FreeImage/Source/LibPNG/pnglibconf.h +218 -0
- data/vendor/FreeImage/Source/LibPNG/pngmem.c +281 -0
- data/vendor/FreeImage/Source/LibPNG/pngpread.c +1168 -0
- data/vendor/FreeImage/Source/LibPNG/pngpriv.h +1944 -0
- data/vendor/FreeImage/Source/LibPNG/pngread.c +4121 -0
- data/vendor/FreeImage/Source/LibPNG/pngrio.c +120 -0
- data/vendor/FreeImage/Source/LibPNG/pngrtran.c +4994 -0
- data/vendor/FreeImage/Source/LibPNG/pngrutil.c +4474 -0
- data/vendor/FreeImage/Source/LibPNG/pngset.c +1611 -0
- data/vendor/FreeImage/Source/LibPNG/pngstruct.h +489 -0
- data/vendor/FreeImage/Source/LibPNG/pngtest.c +2011 -0
- data/vendor/FreeImage/Source/LibPNG/pngtrans.c +849 -0
- data/vendor/FreeImage/Source/LibPNG/pngwio.c +168 -0
- data/vendor/FreeImage/Source/LibPNG/pngwrite.c +2455 -0
- data/vendor/FreeImage/Source/LibPNG/pngwtran.c +574 -0
- data/vendor/FreeImage/Source/LibPNG/pngwutil.c +3029 -0
- data/vendor/FreeImage/Source/LibRawLite/dcraw/dcraw.c +15462 -0
- data/vendor/FreeImage/Source/LibRawLite/internal/aahd_demosaic.cpp +706 -0
- data/vendor/FreeImage/Source/LibRawLite/internal/dcb_demosaicing.c +710 -0
- data/vendor/FreeImage/Source/LibRawLite/internal/dcraw_common.cpp +13593 -0
- data/vendor/FreeImage/Source/LibRawLite/internal/dcraw_fileio.cpp +240 -0
- data/vendor/FreeImage/Source/LibRawLite/internal/defines.h +167 -0
- data/vendor/FreeImage/Source/LibRawLite/internal/demosaic_packs.cpp +99 -0
- data/vendor/FreeImage/Source/LibRawLite/internal/dht_demosaic.cpp +873 -0
- data/vendor/FreeImage/Source/LibRawLite/internal/libraw_internal_funcs.h +282 -0
- data/vendor/FreeImage/Source/LibRawLite/internal/libraw_x3f.cpp +1919 -0
- data/vendor/FreeImage/Source/LibRawLite/internal/var_defines.h +216 -0
- data/vendor/FreeImage/Source/LibRawLite/internal/wf_filtering.cpp +1950 -0
- data/vendor/FreeImage/Source/LibRawLite/libraw/libraw.h +338 -0
- data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_alloc.h +99 -0
- data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_const.h +233 -0
- data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_datastream.h +238 -0
- data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_internal.h +225 -0
- data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_types.h +442 -0
- data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_version.h +62 -0
- data/vendor/FreeImage/Source/LibRawLite/src/libraw_c_api.cpp +230 -0
- data/vendor/FreeImage/Source/LibRawLite/src/libraw_cxx.cpp +4533 -0
- data/vendor/FreeImage/Source/LibRawLite/src/libraw_datastream.cpp +703 -0
- data/vendor/FreeImage/Source/LibTIFF4/mkg3states.c +451 -0
- data/vendor/FreeImage/Source/LibTIFF4/mkspans.c +82 -0
- data/vendor/FreeImage/Source/LibTIFF4/t4.h +292 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_aux.c +358 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_close.c +140 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_codec.c +166 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_color.c +287 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_compress.c +304 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_config.h +97 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_config.vc.h +74 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_config.wince.h +71 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_dir.c +1700 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_dir.h +308 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_dirinfo.c +959 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_dirread.c +5640 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_dirwrite.c +2910 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_dumpmode.c +143 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_error.c +80 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_extension.c +118 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_fax3.c +1595 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_fax3.h +538 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_fax3sm.c +1260 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_flush.c +118 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_getimage.c +2890 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_jbig.c +213 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_jpeg.c +2354 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_jpeg_12.c +65 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_luv.c +1683 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_lzma.c +495 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_lzw.c +1169 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_next.c +181 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_ojpeg.c +2501 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_open.c +725 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_packbits.c +300 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_pixarlog.c +1442 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_predict.c +764 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_predict.h +77 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_print.c +716 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_read.c +1086 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_strip.c +383 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_swab.c +310 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_thunder.c +207 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_tile.c +299 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_unix.c +325 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_version.c +40 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_vms.c +603 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_warning.c +81 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_win32.c +443 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_wince.c +293 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_write.c +771 -0
- data/vendor/FreeImage/Source/LibTIFF4/tif_zip.c +472 -0
- data/vendor/FreeImage/Source/LibTIFF4/tiff.h +681 -0
- data/vendor/FreeImage/Source/LibTIFF4/tiffconf.h +170 -0
- data/vendor/FreeImage/Source/LibTIFF4/tiffconf.vc.h +160 -0
- data/vendor/FreeImage/Source/LibTIFF4/tiffconf.wince.h +121 -0
- data/vendor/FreeImage/Source/LibTIFF4/tiffio.h +557 -0
- data/vendor/FreeImage/Source/LibTIFF4/tiffiop.h +367 -0
- data/vendor/FreeImage/Source/LibTIFF4/tiffvers.h +9 -0
- data/vendor/FreeImage/Source/LibTIFF4/uvcode.h +180 -0
- data/vendor/FreeImage/Source/LibWebP/src/dec/alphai.h +55 -0
- data/vendor/FreeImage/Source/LibWebP/src/dec/dec.alpha.c +167 -0
- data/vendor/FreeImage/Source/LibWebP/src/dec/dec.buffer.c +249 -0
- data/vendor/FreeImage/Source/LibWebP/src/dec/dec.frame.c +827 -0
- data/vendor/FreeImage/Source/LibWebP/src/dec/dec.idec.c +857 -0
- data/vendor/FreeImage/Source/LibWebP/src/dec/dec.io.c +640 -0
- data/vendor/FreeImage/Source/LibWebP/src/dec/dec.quant.c +110 -0
- data/vendor/FreeImage/Source/LibWebP/src/dec/dec.tree.c +525 -0
- data/vendor/FreeImage/Source/LibWebP/src/dec/dec.vp8.c +663 -0
- data/vendor/FreeImage/Source/LibWebP/src/dec/dec.vp8l.c +1584 -0
- data/vendor/FreeImage/Source/LibWebP/src/dec/dec.webp.c +834 -0
- data/vendor/FreeImage/Source/LibWebP/src/dec/decode_vp8.h +185 -0
- data/vendor/FreeImage/Source/LibWebP/src/dec/vp8i.h +353 -0
- data/vendor/FreeImage/Source/LibWebP/src/dec/vp8li.h +136 -0
- data/vendor/FreeImage/Source/LibWebP/src/dec/webpi.h +120 -0
- data/vendor/FreeImage/Source/LibWebP/src/demux/demux.demux.c +957 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.alpha_processing.c +377 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.alpha_processing_mips_dsp_r2.c +139 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.alpha_processing_sse2.c +296 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.argb.c +68 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.argb_mips_dsp_r2.c +108 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.argb_sse2.c +62 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost.c +412 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost_mips32.c +154 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost_mips_dsp_r2.c +107 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost_sse2.c +121 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cpu.c +138 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec.c +760 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_clip_tables.c +366 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_mips32.c +585 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_mips_dsp_r2.c +992 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_neon.c +1489 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_sse2.c +1284 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc.c +788 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_avx2.c +24 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_mips32.c +670 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_mips_dsp_r2.c +1510 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_neon.c +932 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_sse2.c +940 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.filters.c +240 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.filters_mips_dsp_r2.c +404 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.filters_sse2.c +349 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.h +434 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless.c +1838 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_mips32.c +416 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_mips_dsp_r2.c +921 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_neon.c +357 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_sse2.c +535 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.rescaler.c +115 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.rescaler_mips32.c +192 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.rescaler_mips_dsp_r2.c +210 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling.c +252 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling_mips_dsp_r2.c +280 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling_neon.c +267 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling_sse2.c +214 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv.c +166 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv_mips32.c +100 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv_mips_dsp_r2.c +131 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv_sse2.c +322 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/lossless.h +313 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/mips_macro.h +200 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/neon.h +82 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/yuv.h +321 -0
- data/vendor/FreeImage/Source/LibWebP/src/dsp/yuv_tables_sse2.h +536 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/backward_references.h +202 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/cost.h +69 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/enc.alpha.c +440 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/enc.analysis.c +501 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/enc.backward_references.c +1076 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/enc.config.c +163 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/enc.cost.c +355 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/enc.filter.c +296 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/enc.frame.c +850 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/enc.histogram.c +897 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/enc.iterator.c +456 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/enc.near_lossless.c +160 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture.c +290 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_csp.c +1100 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_psnr.c +150 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_rescale.c +285 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_tools.c +206 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/enc.quant.c +1191 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/enc.syntax.c +383 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/enc.token.c +285 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/enc.tree.c +504 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/enc.vp8l.c +1437 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/enc.webpenc.c +379 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/histogram.h +114 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/vp8enci.h +551 -0
- data/vendor/FreeImage/Source/LibWebP/src/enc/vp8li.h +78 -0
- data/vendor/FreeImage/Source/LibWebP/src/mux/mux.anim_encode.c +1241 -0
- data/vendor/FreeImage/Source/LibWebP/src/mux/mux.muxedit.c +696 -0
- data/vendor/FreeImage/Source/LibWebP/src/mux/mux.muxinternal.c +551 -0
- data/vendor/FreeImage/Source/LibWebP/src/mux/mux.muxread.c +544 -0
- data/vendor/FreeImage/Source/LibWebP/src/mux/muxi.h +232 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/bit_reader.h +168 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/bit_reader_inl.h +172 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/bit_writer.h +120 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/color_cache.h +74 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/endian_inl.h +100 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/filters.h +32 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/huffman.h +67 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/huffman_encode.h +60 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/quant_levels.h +36 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/quant_levels_dec.h +35 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/random.h +63 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/rescaler.h +78 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/thread.h +93 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/utils.bit_reader.c +208 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/utils.bit_writer.c +308 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/utils.color_cache.c +49 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/utils.filters.c +76 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/utils.h +121 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/utils.huffman.c +205 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/utils.huffman_encode.c +417 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/utils.quant_levels.c +140 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/utils.quant_levels_dec.c +279 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/utils.random.c +43 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/utils.rescaler.c +82 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/utils.thread.c +309 -0
- data/vendor/FreeImage/Source/LibWebP/src/utils/utils.utils.c +211 -0
- data/vendor/FreeImage/Source/LibWebP/src/webp/decode.h +493 -0
- data/vendor/FreeImage/Source/LibWebP/src/webp/demux.h +224 -0
- data/vendor/FreeImage/Source/LibWebP/src/webp/encode.h +515 -0
- data/vendor/FreeImage/Source/LibWebP/src/webp/format_constants.h +88 -0
- data/vendor/FreeImage/Source/LibWebP/src/webp/mux.h +507 -0
- data/vendor/FreeImage/Source/LibWebP/src/webp/mux_types.h +97 -0
- data/vendor/FreeImage/Source/LibWebP/src/webp/types.h +52 -0
- data/vendor/FreeImage/Source/MapIntrospector.h +212 -0
- data/vendor/FreeImage/Source/Metadata/Exif.cpp +1253 -0
- data/vendor/FreeImage/Source/Metadata/FIRational.cpp +176 -0
- data/vendor/FreeImage/Source/Metadata/FIRational.h +108 -0
- data/vendor/FreeImage/Source/Metadata/FreeImageTag.cpp +353 -0
- data/vendor/FreeImage/Source/Metadata/FreeImageTag.h +500 -0
- data/vendor/FreeImage/Source/Metadata/IPTC.cpp +342 -0
- data/vendor/FreeImage/Source/Metadata/TagConversion.cpp +1094 -0
- data/vendor/FreeImage/Source/Metadata/TagLib.cpp +1618 -0
- data/vendor/FreeImage/Source/Metadata/XTIFF.cpp +766 -0
- data/vendor/FreeImage/Source/OpenEXR/Half/eLut.cpp +114 -0
- data/vendor/FreeImage/Source/OpenEXR/Half/eLut.h +71 -0
- data/vendor/FreeImage/Source/OpenEXR/Half/half.cpp +310 -0
- data/vendor/FreeImage/Source/OpenEXR/Half/half.h +757 -0
- data/vendor/FreeImage/Source/OpenEXR/Half/halfExport.h +27 -0
- data/vendor/FreeImage/Source/OpenEXR/Half/halfFunction.h +179 -0
- data/vendor/FreeImage/Source/OpenEXR/Half/halfLimits.h +102 -0
- data/vendor/FreeImage/Source/OpenEXR/Half/toFloat.cpp +164 -0
- data/vendor/FreeImage/Source/OpenEXR/Half/toFloat.h +16391 -0
- data/vendor/FreeImage/Source/OpenEXR/Iex/Iex.h +60 -0
- data/vendor/FreeImage/Source/OpenEXR/Iex/IexBaseExc.cpp +156 -0
- data/vendor/FreeImage/Source/OpenEXR/Iex/IexBaseExc.h +264 -0
- data/vendor/FreeImage/Source/OpenEXR/Iex/IexErrnoExc.h +208 -0
- data/vendor/FreeImage/Source/OpenEXR/Iex/IexExport.h +51 -0
- data/vendor/FreeImage/Source/OpenEXR/Iex/IexForward.h +229 -0
- data/vendor/FreeImage/Source/OpenEXR/Iex/IexMacros.h +170 -0
- data/vendor/FreeImage/Source/OpenEXR/Iex/IexMathExc.h +57 -0
- data/vendor/FreeImage/Source/OpenEXR/Iex/IexNamespace.h +112 -0
- data/vendor/FreeImage/Source/OpenEXR/Iex/IexThrowErrnoExc.cpp +873 -0
- data/vendor/FreeImage/Source/OpenEXR/Iex/IexThrowErrnoExc.h +97 -0
- data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFloatExc.cpp +113 -0
- data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFloatExc.h +146 -0
- data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFpu.cpp +530 -0
- data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFpu.h +91 -0
- data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathIeeeExc.h +62 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmBaseConfig.h +61 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAcesFile.cpp +633 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAcesFile.h +324 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfArray.h +285 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAttribute.cpp +158 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAttribute.h +407 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAutoArray.h +95 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfB44Compressor.cpp +1072 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfB44Compressor.h +118 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfBoxAttribute.cpp +111 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfBoxAttribute.h +87 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCRgbaFile.cpp +1438 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCRgbaFile.h +555 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelList.cpp +322 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelList.h +436 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelListAttribute.cpp +150 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelListAttribute.h +74 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCheckedArithmetic.h +163 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticities.cpp +151 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticities.h +131 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticitiesAttribute.cpp +87 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticitiesAttribute.h +73 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompositeDeepScanLine.cpp +591 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompositeDeepScanLine.h +142 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompression.h +84 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressionAttribute.cpp +78 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressionAttribute.h +64 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressor.cpp +226 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressor.h +265 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfConvert.cpp +143 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfConvert.h +107 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepCompositing.cpp +110 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepCompositing.h +132 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepFrameBuffer.cpp +230 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepFrameBuffer.h +339 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepImageState.h +96 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepImageStateAttribute.cpp +78 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepImageStateAttribute.h +68 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputFile.cpp +2025 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputFile.h +276 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputPart.cpp +149 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputPart.h +181 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputFile.cpp +1552 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputFile.h +244 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputPart.cpp +107 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputPart.h +168 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputFile.cpp +1979 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputFile.h +437 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputPart.cpp +273 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputPart.h +362 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputFile.cpp +2055 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputFile.h +475 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputPart.cpp +250 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputPart.h +394 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDoubleAttribute.cpp +57 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDoubleAttribute.h +59 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDwaCompressor.cpp +3424 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDwaCompressor.h +210 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDwaCompressorSimd.h +2145 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmap.cpp +335 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmap.h +336 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmapAttribute.cpp +76 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmapAttribute.h +68 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfExport.h +46 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFastHuf.cpp +768 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFastHuf.h +148 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatAttribute.cpp +57 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatAttribute.h +58 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatVectorAttribute.cpp +84 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatVectorAttribute.h +76 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfForward.h +127 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFrameBuffer.cpp +228 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFrameBuffer.h +386 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFramesPerSecond.cpp +76 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFramesPerSecond.h +94 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericInputFile.cpp +76 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericInputFile.h +58 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericOutputFile.cpp +112 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericOutputFile.h +62 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHeader.cpp +1283 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHeader.h +699 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHuf.cpp +1114 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHuf.h +82 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIO.cpp +110 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIO.h +255 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputFile.cpp +895 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputFile.h +240 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPart.cpp +114 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPart.h +84 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPartData.cpp +51 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPartData.h +69 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputStreamMutex.h +68 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInt64.h +56 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIntAttribute.cpp +57 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIntAttribute.h +58 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCode.cpp +217 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCode.h +167 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCodeAttribute.cpp +99 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCodeAttribute.h +73 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLineOrder.h +69 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLineOrderAttribute.cpp +78 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLineOrderAttribute.h +72 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLut.cpp +178 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLut.h +188 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMatrixAttribute.cpp +263 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMatrixAttribute.h +83 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMisc.cpp +1872 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMisc.h +466 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartInputFile.cpp +783 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartInputFile.h +128 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartOutputFile.cpp +519 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartOutputFile.h +118 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiView.cpp +435 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiView.h +187 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfName.h +150 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfNamespace.h +115 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOpaqueAttribute.cpp +126 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOpaqueAttribute.h +110 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOptimizedPixelReading.h +646 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputFile.cpp +1378 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputFile.h +263 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPart.cpp +105 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPart.h +77 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPartData.cpp +52 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPartData.h +62 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputStreamMutex.h +70 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPartHelper.h +262 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPartType.cpp +63 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPartType.h +62 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPixelType.h +67 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPizCompressor.cpp +667 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPizCompressor.h +117 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImage.cpp +104 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImage.h +135 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImageAttribute.cpp +103 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImageAttribute.h +70 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPxr24Compressor.cpp +553 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPxr24Compressor.h +109 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRational.cpp +127 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRational.h +98 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRationalAttribute.cpp +74 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRationalAttribute.h +69 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgba.h +109 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaFile.cpp +1405 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaFile.h +346 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaYca.cpp +497 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaYca.h +259 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRle.cpp +157 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRle.h +63 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRleCompressor.cpp +220 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRleCompressor.h +80 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfScanLineInputFile.cpp +1702 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfScanLineInputFile.h +210 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfSimd.h +59 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStandardAttributes.cpp +125 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStandardAttributes.h +382 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStdIO.cpp +242 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStdIO.h +160 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringAttribute.cpp +80 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringAttribute.h +71 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringVectorAttribute.cpp +100 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringVectorAttribute.h +74 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfSystemSpecific.cpp +129 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfSystemSpecific.h +172 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTestFile.cpp +216 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTestFile.h +97 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfThreading.cpp +62 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfThreading.h +95 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileDescription.h +107 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileDescriptionAttribute.cpp +86 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileDescriptionAttribute.h +72 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileOffsets.cpp +552 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileOffsets.h +125 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputFile.cpp +1533 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputFile.h +401 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputPart.cpp +208 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputPart.h +100 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledMisc.cpp +389 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledMisc.h +106 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputFile.cpp +1841 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputFile.h +495 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputPart.cpp +228 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputPart.h +105 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledRgbaFile.cpp +1163 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledRgbaFile.h +482 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCode.cpp +431 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCode.h +242 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCodeAttribute.cpp +79 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCodeAttribute.h +74 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVecAttribute.cpp +217 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVecAttribute.h +100 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVersion.cpp +60 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVersion.h +136 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfWav.cpp +391 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfWav.h +78 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfXdr.h +927 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZip.cpp +196 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZip.h +78 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZipCompressor.cpp +127 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZipCompressor.h +89 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/b44ExpLogTable.cpp +136 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/b44ExpLogTable.h +16396 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/dwaLookups.cpp +573 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmImf/dwaLookups.h +98334 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThread.cpp +80 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThread.h +143 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadExport.h +46 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadForward.h +52 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutex.cpp +59 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutex.h +160 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutexPosix.cpp +85 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutexWin32.cpp +79 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadNamespace.h +114 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadPool.cpp +483 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadPool.h +160 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadPosix.cpp +98 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphore.cpp +60 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphore.h +112 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphorePosix.cpp +106 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphorePosixCompat.cpp +155 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphoreWin32.cpp +153 -0
- data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadWin32.cpp +100 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathBox.cpp +37 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathBox.h +849 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathBoxAlgo.h +1016 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathColor.h +736 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathColorAlgo.cpp +178 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathColorAlgo.h +257 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathEuler.h +926 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathExc.h +73 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathExport.h +46 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathForward.h +72 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFrame.h +192 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFrustum.h +741 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFrustumTest.h +417 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFun.cpp +181 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFun.h +269 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathGL.h +166 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathGLU.h +54 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathHalfLimits.h +68 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathInt64.h +62 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathInterval.h +226 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathLimits.h +268 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathLine.h +185 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathLineAlgo.h +288 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMath.h +208 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMatrix.h +3441 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMatrixAlgo.cpp +1252 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMatrixAlgo.h +1425 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathNamespace.h +115 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathPlane.h +257 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathPlatform.h +112 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathQuat.h +964 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathRandom.cpp +194 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathRandom.h +401 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathRoots.h +219 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathShear.cpp +54 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathShear.h +656 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathSphere.h +177 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathVec.cpp +583 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathVec.h +2227 -0
- data/vendor/FreeImage/Source/OpenEXR/Imath/ImathVecAlgo.h +147 -0
- data/vendor/FreeImage/Source/OpenEXR/OpenEXRConfig.h +72 -0
- data/vendor/FreeImage/Source/Plugin.h +144 -0
- data/vendor/FreeImage/Source/Quantizers.h +354 -0
- data/vendor/FreeImage/Source/ToneMapping.h +44 -0
- data/vendor/FreeImage/Source/Utilities.h +516 -0
- data/vendor/FreeImage/Source/ZLib/adler32.c +179 -0
- data/vendor/FreeImage/Source/ZLib/compress.c +80 -0
- data/vendor/FreeImage/Source/ZLib/crc32.c +425 -0
- data/vendor/FreeImage/Source/ZLib/crc32.h +441 -0
- data/vendor/FreeImage/Source/ZLib/deflate.c +1967 -0
- data/vendor/FreeImage/Source/ZLib/deflate.h +346 -0
- data/vendor/FreeImage/Source/ZLib/gzclose.c +25 -0
- data/vendor/FreeImage/Source/ZLib/gzguts.h +209 -0
- data/vendor/FreeImage/Source/ZLib/gzlib.c +634 -0
- data/vendor/FreeImage/Source/ZLib/gzread.c +594 -0
- data/vendor/FreeImage/Source/ZLib/gzwrite.c +577 -0
- data/vendor/FreeImage/Source/ZLib/infback.c +640 -0
- data/vendor/FreeImage/Source/ZLib/inffast.c +340 -0
- data/vendor/FreeImage/Source/ZLib/inffast.h +11 -0
- data/vendor/FreeImage/Source/ZLib/inffixed.h +94 -0
- data/vendor/FreeImage/Source/ZLib/inflate.c +1512 -0
- data/vendor/FreeImage/Source/ZLib/inflate.h +122 -0
- data/vendor/FreeImage/Source/ZLib/inftrees.c +306 -0
- data/vendor/FreeImage/Source/ZLib/inftrees.h +62 -0
- data/vendor/FreeImage/Source/ZLib/trees.c +1226 -0
- data/vendor/FreeImage/Source/ZLib/trees.h +128 -0
- data/vendor/FreeImage/Source/ZLib/uncompr.c +59 -0
- data/vendor/FreeImage/Source/ZLib/zconf.h +511 -0
- data/vendor/FreeImage/Source/ZLib/zlib.h +1768 -0
- data/vendor/FreeImage/Source/ZLib/zutil.c +324 -0
- data/vendor/FreeImage/Source/ZLib/zutil.h +253 -0
- metadata +931 -0
|
@@ -0,0 +1,1591 @@
|
|
|
1
|
+
// ==========================================================
|
|
2
|
+
// TARGA Loader and Writer
|
|
3
|
+
//
|
|
4
|
+
// Design and implementation by
|
|
5
|
+
// - Floris van den Berg (flvdberg@wxs.nl)
|
|
6
|
+
// - Jani Kajala (janik@remedy.fi)
|
|
7
|
+
// - Martin Weber (martweb@gmx.net)
|
|
8
|
+
// - Machiel ten Brinke (brinkem@uni-one.nl)
|
|
9
|
+
// - Peter Lemmens (peter.lemmens@planetinternet.be)
|
|
10
|
+
// - Hervé Drolon (drolon@infonie.fr)
|
|
11
|
+
// - Mihail Naydenov (mnaydenov@users.sourceforge.net)
|
|
12
|
+
//
|
|
13
|
+
// This file is part of FreeImage 3
|
|
14
|
+
//
|
|
15
|
+
// COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
|
|
16
|
+
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
|
|
17
|
+
// THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
|
|
18
|
+
// OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
|
|
19
|
+
// CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
|
|
20
|
+
// THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
|
|
21
|
+
// SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
|
|
22
|
+
// PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
|
|
23
|
+
// THIS DISCLAIMER.
|
|
24
|
+
//
|
|
25
|
+
// Use at your own risk!
|
|
26
|
+
// ==========================================================
|
|
27
|
+
|
|
28
|
+
#include "FreeImage.h"
|
|
29
|
+
#include "Utilities.h"
|
|
30
|
+
|
|
31
|
+
// ----------------------------------------------------------
|
|
32
|
+
// Constants + headers
|
|
33
|
+
// ----------------------------------------------------------
|
|
34
|
+
|
|
35
|
+
#ifdef _WIN32
|
|
36
|
+
#pragma pack(push, 1)
|
|
37
|
+
#else
|
|
38
|
+
#pragma pack(1)
|
|
39
|
+
#endif
|
|
40
|
+
|
|
41
|
+
typedef struct tagTGAHEADER {
|
|
42
|
+
BYTE id_length; //! length of the image ID field
|
|
43
|
+
BYTE color_map_type; //! whether a color map is included
|
|
44
|
+
BYTE image_type; //! compression and color types
|
|
45
|
+
|
|
46
|
+
WORD cm_first_entry; //! first entry index (offset into the color map table)
|
|
47
|
+
WORD cm_length; //! color map length (number of entries)
|
|
48
|
+
BYTE cm_size; //! color map entry size, in bits (number of bits per pixel)
|
|
49
|
+
|
|
50
|
+
WORD is_xorigin; //! X-origin of image (absolute coordinate of lower-left corner for displays where origin is at the lower left)
|
|
51
|
+
WORD is_yorigin; //! Y-origin of image (as for X-origin)
|
|
52
|
+
WORD is_width; //! image width
|
|
53
|
+
WORD is_height; //! image height
|
|
54
|
+
BYTE is_pixel_depth; //! bits per pixel
|
|
55
|
+
BYTE is_image_descriptor; //! image descriptor, bits 3-0 give the alpha channel depth, bits 5-4 give direction
|
|
56
|
+
} TGAHEADER;
|
|
57
|
+
|
|
58
|
+
typedef struct tagTGAEXTENSIONAREA {
|
|
59
|
+
WORD extension_size; // Size in bytes of the extension area, always 495
|
|
60
|
+
char author_name[41]; // Name of the author. If not used, bytes should be set to NULL (\0) or spaces
|
|
61
|
+
char author_comments[324]; // A comment, organized as four lines, each consisting of 80 characters plus a NULL
|
|
62
|
+
WORD datetime_stamp[6]; // Date and time at which the image was created
|
|
63
|
+
char job_name[41]; // Job ID
|
|
64
|
+
WORD job_time[3]; // Hours, minutes and seconds spent creating the file (for billing, etc.)
|
|
65
|
+
char software_id[41]; // The application that created the file
|
|
66
|
+
BYTE software_version[3];
|
|
67
|
+
DWORD key_color;
|
|
68
|
+
WORD pixel_aspect_ratio[2];
|
|
69
|
+
WORD gamma_value[2];
|
|
70
|
+
DWORD color_correction_offset; // Number of bytes from the beginning of the file to the color correction table if present
|
|
71
|
+
DWORD postage_stamp_offset; // Number of bytes from the beginning of the file to the postage stamp image if present
|
|
72
|
+
DWORD scan_line_offset; // Number of bytes from the beginning of the file to the scan lines table if present
|
|
73
|
+
BYTE attributes_type; // Specifies the alpha channel
|
|
74
|
+
} TGAEXTENSIONAREA;
|
|
75
|
+
|
|
76
|
+
typedef struct tagTGAFOOTER {
|
|
77
|
+
DWORD extension_offset; // extension area offset : offset in bytes from the beginning of the file
|
|
78
|
+
DWORD developer_offset; // developer directory offset : offset in bytes from the beginning of the file
|
|
79
|
+
char signature[18]; // signature string : contains "TRUEVISION-XFILE.\0"
|
|
80
|
+
} TGAFOOTER;
|
|
81
|
+
|
|
82
|
+
#ifdef _WIN32
|
|
83
|
+
#pragma pack(pop)
|
|
84
|
+
#else
|
|
85
|
+
#pragma pack()
|
|
86
|
+
#endif
|
|
87
|
+
|
|
88
|
+
static const char *FI_MSG_ERROR_CORRUPTED = "Image data corrupted";
|
|
89
|
+
|
|
90
|
+
// ----------------------------------------------------------
|
|
91
|
+
// Image type
|
|
92
|
+
//
|
|
93
|
+
#define TGA_NULL 0 // no image data included
|
|
94
|
+
#define TGA_CMAP 1 // uncompressed, color-mapped image
|
|
95
|
+
#define TGA_RGB 2 // uncompressed, true-color image
|
|
96
|
+
#define TGA_MONO 3 // uncompressed, black-and-white image
|
|
97
|
+
#define TGA_RLECMAP 9 // run-length encoded, color-mapped image
|
|
98
|
+
#define TGA_RLERGB 10 // run-length encoded, true-color image
|
|
99
|
+
#define TGA_RLEMONO 11 // run-length encoded, black-and-white image
|
|
100
|
+
#define TGA_CMPCMAP 32 // compressed (Huffman/Delta/RLE) color-mapped image (e.g., VDA/D) - Obsolete
|
|
101
|
+
#define TGA_CMPCMAP4 33 // compressed (Huffman/Delta/RLE) color-mapped four pass image (e.g., VDA/D) - Obsolete
|
|
102
|
+
|
|
103
|
+
// ==========================================================
|
|
104
|
+
// Thumbnail functions
|
|
105
|
+
// ==========================================================
|
|
106
|
+
|
|
107
|
+
class TargaThumbnail
|
|
108
|
+
{
|
|
109
|
+
public:
|
|
110
|
+
TargaThumbnail() : _w(0), _h(0), _depth(0), _data(NULL) {
|
|
111
|
+
}
|
|
112
|
+
~TargaThumbnail() {
|
|
113
|
+
if(_data) {
|
|
114
|
+
free(_data);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
BOOL isNull() const {
|
|
119
|
+
return (_data == NULL);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
BOOL read(FreeImageIO *io, fi_handle handle, size_t size) {
|
|
123
|
+
io->read_proc(&_w, 1, 1, handle);
|
|
124
|
+
io->read_proc(&_h, 1, 1, handle);
|
|
125
|
+
|
|
126
|
+
const size_t sizeofData = size - 2;
|
|
127
|
+
_data = (BYTE*)malloc(sizeofData);
|
|
128
|
+
if(_data) {
|
|
129
|
+
return (io->read_proc(_data, 1, (unsigned)sizeofData, handle) == sizeofData);
|
|
130
|
+
}
|
|
131
|
+
return FALSE;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
void setDepth(BYTE dp) {
|
|
135
|
+
_depth = dp;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
FIBITMAP* toFIBITMAP();
|
|
139
|
+
|
|
140
|
+
private:
|
|
141
|
+
BYTE _w;
|
|
142
|
+
BYTE _h;
|
|
143
|
+
BYTE _depth;
|
|
144
|
+
BYTE* _data;
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
#ifdef FREEIMAGE_BIGENDIAN
|
|
148
|
+
static void
|
|
149
|
+
swapShortPixels(FIBITMAP* dib) {
|
|
150
|
+
if(FreeImage_GetImageType(dib) != FIT_BITMAP) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const unsigned Bpp = FreeImage_GetBPP(dib)/8;
|
|
155
|
+
if(Bpp != 2) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
BYTE* bits = FreeImage_GetBits(dib);
|
|
160
|
+
const unsigned height = FreeImage_GetHeight(dib);
|
|
161
|
+
const unsigned pitch = FreeImage_GetPitch(dib);
|
|
162
|
+
|
|
163
|
+
BYTE* line = bits;
|
|
164
|
+
for(unsigned y = 0; y < height; y++, line += pitch) {
|
|
165
|
+
for(BYTE* pixel = line; pixel < line + pitch ; pixel += Bpp) {
|
|
166
|
+
SwapShort((WORD*)pixel);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
#endif // FREEIMAGE_BIGENDIAN
|
|
171
|
+
|
|
172
|
+
FIBITMAP* TargaThumbnail::toFIBITMAP() {
|
|
173
|
+
if(isNull() || _depth == 0) {
|
|
174
|
+
return NULL;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const unsigned line_size = _depth * _w / 8;
|
|
178
|
+
FIBITMAP* dib = FreeImage_Allocate(_w, _h, _depth);
|
|
179
|
+
if(!dib) {
|
|
180
|
+
return NULL;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const BYTE* line = _data;
|
|
184
|
+
const BYTE height = _h;
|
|
185
|
+
for (BYTE h = 0; h < height; ++h, line += line_size) {
|
|
186
|
+
BYTE* dst_line = FreeImage_GetScanLine(dib, height - 1 - h);
|
|
187
|
+
memcpy(dst_line, line, line_size);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
#ifdef FREEIMAGE_BIGENDIAN
|
|
191
|
+
swapShortPixels(dib);
|
|
192
|
+
#endif
|
|
193
|
+
|
|
194
|
+
#if FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_RGB
|
|
195
|
+
SwapRedBlue32(dib);
|
|
196
|
+
#endif
|
|
197
|
+
|
|
198
|
+
return dib;
|
|
199
|
+
}
|
|
200
|
+
// ==========================================================
|
|
201
|
+
// Internal functions
|
|
202
|
+
// ==========================================================
|
|
203
|
+
|
|
204
|
+
/** This class is used when loading RLE compressed images, it implements io cache of fixed size.
|
|
205
|
+
In general RLE compressed images *should* be compressed line by line with line sizes stored in Scan Line Table section.
|
|
206
|
+
In reality, however there are images not obeying the specification, compressing image data continuously across lines,
|
|
207
|
+
making it impossible to load the file cached at every line.
|
|
208
|
+
*/
|
|
209
|
+
class IOCache
|
|
210
|
+
{
|
|
211
|
+
public:
|
|
212
|
+
IOCache(FreeImageIO *io, fi_handle handle, size_t size) :
|
|
213
|
+
_ptr(NULL), _begin(NULL), _end(NULL), _size(size), _io(io), _handle(handle) {
|
|
214
|
+
_begin = (BYTE*)malloc(size);
|
|
215
|
+
if (_begin) {
|
|
216
|
+
_end = _begin + _size;
|
|
217
|
+
_ptr = _end; // will force refill on first access
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
~IOCache() {
|
|
222
|
+
if (_begin != NULL) {
|
|
223
|
+
free(_begin);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
BOOL isNull() { return _begin == NULL;}
|
|
228
|
+
|
|
229
|
+
inline
|
|
230
|
+
BYTE getByte() {
|
|
231
|
+
if (_ptr >= _end) {
|
|
232
|
+
// need refill
|
|
233
|
+
_ptr = _begin;
|
|
234
|
+
_io->read_proc(_ptr, sizeof(BYTE), (unsigned)_size, _handle); //### EOF - no problem?
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
BYTE result = *_ptr;
|
|
238
|
+
|
|
239
|
+
_ptr++;
|
|
240
|
+
|
|
241
|
+
return result;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
inline
|
|
245
|
+
BYTE* getBytes(size_t count /*must be < _size!*/) {
|
|
246
|
+
if (_ptr + count >= _end) {
|
|
247
|
+
|
|
248
|
+
// need refill
|
|
249
|
+
|
|
250
|
+
// 'count' bytes might span two cache bounds,
|
|
251
|
+
// SEEK back to add the remains of the current cache again into the new one
|
|
252
|
+
|
|
253
|
+
long read = long(_ptr - _begin);
|
|
254
|
+
long remaining = long(_size - read);
|
|
255
|
+
|
|
256
|
+
_io->seek_proc(_handle, -remaining, SEEK_CUR);
|
|
257
|
+
|
|
258
|
+
_ptr = _begin;
|
|
259
|
+
_io->read_proc(_ptr, sizeof(BYTE), (unsigned)_size, _handle); //### EOF - no problem?
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
BYTE *result = _ptr;
|
|
263
|
+
|
|
264
|
+
_ptr += count;
|
|
265
|
+
|
|
266
|
+
return result;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
private:
|
|
270
|
+
IOCache& operator=(const IOCache& src); // deleted
|
|
271
|
+
IOCache(const IOCache& other); // deleted
|
|
272
|
+
|
|
273
|
+
private:
|
|
274
|
+
BYTE *_ptr;
|
|
275
|
+
BYTE *_begin;
|
|
276
|
+
BYTE *_end;
|
|
277
|
+
const size_t _size;
|
|
278
|
+
const FreeImageIO *_io;
|
|
279
|
+
const fi_handle _handle;
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
#ifdef FREEIMAGE_BIGENDIAN
|
|
283
|
+
static void
|
|
284
|
+
SwapHeader(TGAHEADER *header) {
|
|
285
|
+
SwapShort(&header->cm_first_entry);
|
|
286
|
+
SwapShort(&header->cm_length);
|
|
287
|
+
SwapShort(&header->is_xorigin);
|
|
288
|
+
SwapShort(&header->is_yorigin);
|
|
289
|
+
SwapShort(&header->is_width);
|
|
290
|
+
SwapShort(&header->is_height);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
static void
|
|
294
|
+
SwapExtensionArea(TGAEXTENSIONAREA *ex) {
|
|
295
|
+
SwapShort(&ex->extension_size);
|
|
296
|
+
SwapShort(&ex->datetime_stamp[0]);
|
|
297
|
+
SwapShort(&ex->datetime_stamp[1]);
|
|
298
|
+
SwapShort(&ex->datetime_stamp[2]);
|
|
299
|
+
SwapShort(&ex->datetime_stamp[3]);
|
|
300
|
+
SwapShort(&ex->datetime_stamp[4]);
|
|
301
|
+
SwapShort(&ex->datetime_stamp[5]);
|
|
302
|
+
SwapShort(&ex->job_time[0]);
|
|
303
|
+
SwapShort(&ex->job_time[1]);
|
|
304
|
+
SwapShort(&ex->job_time[2]);
|
|
305
|
+
SwapLong (&ex->key_color);
|
|
306
|
+
SwapShort(&ex->pixel_aspect_ratio[0]);
|
|
307
|
+
SwapShort(&ex->pixel_aspect_ratio[1]);
|
|
308
|
+
SwapShort(&ex->gamma_value[0]);
|
|
309
|
+
SwapShort(&ex->gamma_value[1]);
|
|
310
|
+
SwapLong (&ex->color_correction_offset);
|
|
311
|
+
SwapLong (&ex->postage_stamp_offset);
|
|
312
|
+
SwapLong (&ex->scan_line_offset);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
static void
|
|
316
|
+
SwapFooter(TGAFOOTER *footer) {
|
|
317
|
+
SwapLong(&footer->extension_offset);
|
|
318
|
+
SwapLong(&footer->developer_offset);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
#endif // FREEIMAGE_BIGENDIAN
|
|
322
|
+
|
|
323
|
+
// ==========================================================
|
|
324
|
+
// Plugin Interface
|
|
325
|
+
// ==========================================================
|
|
326
|
+
|
|
327
|
+
static int s_format_id;
|
|
328
|
+
|
|
329
|
+
// ==========================================================
|
|
330
|
+
// Plugin Implementation
|
|
331
|
+
// ==========================================================
|
|
332
|
+
|
|
333
|
+
static const char * DLL_CALLCONV
|
|
334
|
+
Format() {
|
|
335
|
+
return "TARGA";
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
static const char * DLL_CALLCONV
|
|
339
|
+
Description() {
|
|
340
|
+
return "Truevision Targa";
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
static const char * DLL_CALLCONV
|
|
344
|
+
Extension() {
|
|
345
|
+
return "tga,targa";
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
static const char * DLL_CALLCONV
|
|
349
|
+
RegExpr() {
|
|
350
|
+
return NULL;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
static const char * DLL_CALLCONV
|
|
354
|
+
MimeType() {
|
|
355
|
+
return "image/x-tga";
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
static BOOL
|
|
359
|
+
isTARGA20(FreeImageIO *io, fi_handle handle) {
|
|
360
|
+
const unsigned sizeofSig = 18;
|
|
361
|
+
BYTE signature[sizeofSig];
|
|
362
|
+
// tga_signature = "TRUEVISION-XFILE." (TGA 2.0 only)
|
|
363
|
+
BYTE tga_signature[sizeofSig] = { 84, 82, 85, 69, 86, 73, 83, 73, 79, 78, 45, 88, 70, 73, 76, 69, 46, 0 };
|
|
364
|
+
// get the start offset
|
|
365
|
+
const long start_offset = io->tell_proc(handle);
|
|
366
|
+
// get the end-of-file
|
|
367
|
+
io->seek_proc(handle, 0, SEEK_END);
|
|
368
|
+
const long eof = io->tell_proc(handle);
|
|
369
|
+
// read the signature
|
|
370
|
+
io->seek_proc(handle, start_offset + eof - sizeofSig, SEEK_SET);
|
|
371
|
+
io->read_proc(&signature, 1, sizeofSig, handle);
|
|
372
|
+
// rewind
|
|
373
|
+
io->seek_proc(handle, start_offset, SEEK_SET);
|
|
374
|
+
|
|
375
|
+
return (memcmp(tga_signature, signature, sizeofSig) == 0);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
static BOOL DLL_CALLCONV
|
|
379
|
+
Validate(FreeImageIO *io, fi_handle handle) {
|
|
380
|
+
if(isTARGA20(io, handle)) {
|
|
381
|
+
return TRUE;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// not a 2.0 image, try testing if it's a valid TGA anyway (not robust)
|
|
385
|
+
{
|
|
386
|
+
const long start_offset = io->tell_proc(handle);
|
|
387
|
+
|
|
388
|
+
// get the header
|
|
389
|
+
TGAHEADER header;
|
|
390
|
+
io->read_proc(&header, sizeof(tagTGAHEADER), 1, handle);
|
|
391
|
+
#ifdef FREEIMAGE_BIGENDIAN
|
|
392
|
+
SwapHeader(&header);
|
|
393
|
+
#endif
|
|
394
|
+
// rewind
|
|
395
|
+
io->seek_proc(handle, start_offset, SEEK_SET);
|
|
396
|
+
|
|
397
|
+
// the color map type should be a 0 or a 1...
|
|
398
|
+
if(header.color_map_type != 0 && header.color_map_type != 1) {
|
|
399
|
+
return FALSE;
|
|
400
|
+
}
|
|
401
|
+
// if the color map type is 1 then we validate the map entry information...
|
|
402
|
+
if(header.color_map_type > 0) {
|
|
403
|
+
// it doesn't make any sense if the first entry is larger than the color map table
|
|
404
|
+
if(header.cm_first_entry >= header.cm_length) {
|
|
405
|
+
return FALSE;
|
|
406
|
+
}
|
|
407
|
+
// check header.cm_size, don't allow 0 or anything bigger than 32
|
|
408
|
+
if(header.cm_size == 0 || header.cm_size > 32) {
|
|
409
|
+
return FALSE;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
// the width/height shouldn't be 0, right ?
|
|
413
|
+
if(header.is_width == 0 || header.is_height == 0) {
|
|
414
|
+
return FALSE;
|
|
415
|
+
}
|
|
416
|
+
// let's now verify all the types that are supported by FreeImage (this is our final verification)
|
|
417
|
+
switch(header.image_type) {
|
|
418
|
+
case TGA_CMAP:
|
|
419
|
+
case TGA_RGB:
|
|
420
|
+
case TGA_MONO:
|
|
421
|
+
case TGA_RLECMAP:
|
|
422
|
+
case TGA_RLERGB:
|
|
423
|
+
case TGA_RLEMONO:
|
|
424
|
+
switch(header.is_pixel_depth) {
|
|
425
|
+
case 8 :
|
|
426
|
+
case 16:
|
|
427
|
+
case 24:
|
|
428
|
+
case 32:
|
|
429
|
+
return TRUE;
|
|
430
|
+
default:
|
|
431
|
+
return FALSE;
|
|
432
|
+
}
|
|
433
|
+
break;
|
|
434
|
+
default:
|
|
435
|
+
return FALSE;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
static BOOL DLL_CALLCONV
|
|
441
|
+
SupportsExportDepth(int depth) {
|
|
442
|
+
return (
|
|
443
|
+
(depth == 8) ||
|
|
444
|
+
(depth == 16) ||
|
|
445
|
+
(depth == 24) ||
|
|
446
|
+
(depth == 32)
|
|
447
|
+
);
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
static BOOL DLL_CALLCONV
|
|
451
|
+
SupportsExportType(FREE_IMAGE_TYPE type) {
|
|
452
|
+
return (type == FIT_BITMAP) ? TRUE : FALSE;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
static BOOL DLL_CALLCONV
|
|
456
|
+
SupportsNoPixels() {
|
|
457
|
+
return TRUE;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
// ----------------------------------------------------------
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
Used for all 32 and 24 bit loading of uncompressed images
|
|
464
|
+
*/
|
|
465
|
+
static void
|
|
466
|
+
loadTrueColor(FIBITMAP* dib, int width, int height, int file_pixel_size, FreeImageIO* io, fi_handle handle, BOOL as24bit) {
|
|
467
|
+
const int pixel_size = as24bit ? 3 : file_pixel_size;
|
|
468
|
+
|
|
469
|
+
// input line cache
|
|
470
|
+
BYTE* file_line = (BYTE*)malloc( width * file_pixel_size);
|
|
471
|
+
|
|
472
|
+
if (!file_line) {
|
|
473
|
+
throw FI_MSG_ERROR_MEMORY;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
for (int y = 0; y < height; y++) {
|
|
477
|
+
BYTE *bits = FreeImage_GetScanLine(dib, y);
|
|
478
|
+
io->read_proc(file_line, file_pixel_size, width, handle);
|
|
479
|
+
BYTE *bgra = file_line;
|
|
480
|
+
|
|
481
|
+
for (int x = 0; x < width; x++) {
|
|
482
|
+
|
|
483
|
+
bits[FI_RGBA_BLUE] = bgra[0];
|
|
484
|
+
bits[FI_RGBA_GREEN] = bgra[1];
|
|
485
|
+
bits[FI_RGBA_RED] = bgra[2];
|
|
486
|
+
|
|
487
|
+
if (!as24bit) {
|
|
488
|
+
bits[FI_RGBA_ALPHA] = bgra[3];
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
bgra += file_pixel_size;
|
|
492
|
+
|
|
493
|
+
bits += pixel_size;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
free(file_line);
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/**
|
|
501
|
+
For the generic RLE loader we need to abstract away the pixel format.
|
|
502
|
+
We use a specific overload based on bits-per-pixel for each type of pixel
|
|
503
|
+
*/
|
|
504
|
+
|
|
505
|
+
template <int nBITS>
|
|
506
|
+
inline static void
|
|
507
|
+
_assignPixel(BYTE* bits, BYTE* val, BOOL as24bit = FALSE) {
|
|
508
|
+
// static assert should go here
|
|
509
|
+
assert(FALSE);
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
template <>
|
|
513
|
+
inline void
|
|
514
|
+
_assignPixel<8>(BYTE* bits, BYTE* val, BOOL as24bit) {
|
|
515
|
+
*bits = *val;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
template <>
|
|
519
|
+
inline void
|
|
520
|
+
_assignPixel<16>(BYTE* bits, BYTE* val, BOOL as24bit) {
|
|
521
|
+
WORD value(*reinterpret_cast<WORD*>(val));
|
|
522
|
+
|
|
523
|
+
#ifdef FREEIMAGE_BIGENDIAN
|
|
524
|
+
SwapShort(&value);
|
|
525
|
+
#endif
|
|
526
|
+
|
|
527
|
+
if (as24bit) {
|
|
528
|
+
bits[FI_RGBA_BLUE] = (BYTE)((((value & FI16_555_BLUE_MASK) >> FI16_555_BLUE_SHIFT) * 0xFF) / 0x1F);
|
|
529
|
+
bits[FI_RGBA_GREEN] = (BYTE)((((value & FI16_555_GREEN_MASK) >> FI16_555_GREEN_SHIFT) * 0xFF) / 0x1F);
|
|
530
|
+
bits[FI_RGBA_RED] = (BYTE)((((value & FI16_555_RED_MASK) >> FI16_555_RED_SHIFT) * 0xFF) / 0x1F);
|
|
531
|
+
|
|
532
|
+
} else {
|
|
533
|
+
*reinterpret_cast<WORD *>(bits) = 0x7FFF & value;
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
template <>
|
|
538
|
+
inline void
|
|
539
|
+
_assignPixel<24>(BYTE* bits, BYTE* val, BOOL as24bit) {
|
|
540
|
+
bits[FI_RGBA_BLUE] = val[0];
|
|
541
|
+
bits[FI_RGBA_GREEN] = val[1];
|
|
542
|
+
bits[FI_RGBA_RED] = val[2];
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
template <>
|
|
546
|
+
inline void
|
|
547
|
+
_assignPixel<32>(BYTE* bits, BYTE* val, BOOL as24bit) {
|
|
548
|
+
if (as24bit) {
|
|
549
|
+
_assignPixel<24>(bits, val, TRUE);
|
|
550
|
+
|
|
551
|
+
} else {
|
|
552
|
+
#if FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_BGR
|
|
553
|
+
*(reinterpret_cast<unsigned*>(bits)) = *(reinterpret_cast<unsigned*> (val));
|
|
554
|
+
#else // NOTE This is faster then doing reinterpret_cast to int + INPLACESWAP !
|
|
555
|
+
bits[FI_RGBA_BLUE] = val[0];
|
|
556
|
+
bits[FI_RGBA_GREEN] = val[1];
|
|
557
|
+
bits[FI_RGBA_RED] = val[2];
|
|
558
|
+
bits[FI_RGBA_ALPHA] = val[3];
|
|
559
|
+
#endif
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
/**
|
|
564
|
+
Generic RLE loader
|
|
565
|
+
*/
|
|
566
|
+
template<int bPP>
|
|
567
|
+
static void
|
|
568
|
+
loadRLE(FIBITMAP* dib, int width, int height, FreeImageIO* io, fi_handle handle, long eof, BOOL as24bit) {
|
|
569
|
+
const int file_pixel_size = bPP/8;
|
|
570
|
+
const int pixel_size = as24bit ? 3 : file_pixel_size;
|
|
571
|
+
|
|
572
|
+
const BYTE bpp = as24bit ? 24 : bPP;
|
|
573
|
+
const int line_size = CalculateLine(width, bpp);
|
|
574
|
+
|
|
575
|
+
// Note, many of the params can be computed inside the function.
|
|
576
|
+
// However, because this is a template function, it will lead to redundant code duplication.
|
|
577
|
+
|
|
578
|
+
BYTE rle;
|
|
579
|
+
BYTE *line_bits;
|
|
580
|
+
|
|
581
|
+
// this is used to guard against writing beyond the end of the image (on corrupted rle block)
|
|
582
|
+
const BYTE* dib_end = FreeImage_GetScanLine(dib, height);//< one-past-end row
|
|
583
|
+
|
|
584
|
+
// Compute the rough size of a line...
|
|
585
|
+
long pixels_offset = io->tell_proc(handle);
|
|
586
|
+
long sz = ((eof - pixels_offset) / height);
|
|
587
|
+
|
|
588
|
+
// ...and allocate cache of this size (yields good results)
|
|
589
|
+
IOCache cache(io, handle, sz);
|
|
590
|
+
if(cache.isNull()) {
|
|
591
|
+
FreeImage_Unload(dib);
|
|
592
|
+
dib = NULL;
|
|
593
|
+
return;
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
int x = 0, y = 0;
|
|
597
|
+
|
|
598
|
+
line_bits = FreeImage_GetScanLine(dib, y);
|
|
599
|
+
|
|
600
|
+
while (y < height) {
|
|
601
|
+
|
|
602
|
+
rle = cache.getByte();
|
|
603
|
+
|
|
604
|
+
BOOL has_rle = rle & 0x80;
|
|
605
|
+
rle &= ~0x80; // remove type-bit
|
|
606
|
+
|
|
607
|
+
BYTE packet_count = rle + 1;
|
|
608
|
+
|
|
609
|
+
//packet_count might be corrupt, test if we are not about to write beyond the last image bit
|
|
610
|
+
|
|
611
|
+
if ((line_bits+x) + packet_count*pixel_size > dib_end) {
|
|
612
|
+
FreeImage_OutputMessageProc(s_format_id, FI_MSG_ERROR_CORRUPTED);
|
|
613
|
+
// return what is left from the bitmap
|
|
614
|
+
return;
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
if (has_rle) {
|
|
618
|
+
|
|
619
|
+
// read a pixel value from file...
|
|
620
|
+
BYTE *val = cache.getBytes(file_pixel_size);
|
|
621
|
+
|
|
622
|
+
//...and fill packet_count pixels with it
|
|
623
|
+
|
|
624
|
+
for (int ix = 0; ix < packet_count; ix++) {
|
|
625
|
+
_assignPixel<bPP>((line_bits+x), val, as24bit);
|
|
626
|
+
x += pixel_size;
|
|
627
|
+
|
|
628
|
+
if (x >= line_size) {
|
|
629
|
+
x = 0;
|
|
630
|
+
y++;
|
|
631
|
+
line_bits = FreeImage_GetScanLine(dib, y);
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
} else {
|
|
636
|
+
// no rle commpresion
|
|
637
|
+
|
|
638
|
+
// copy packet_count pixels from file to dib
|
|
639
|
+
for (int ix = 0; ix < packet_count; ix++) {
|
|
640
|
+
BYTE *val = cache.getBytes(file_pixel_size);
|
|
641
|
+
_assignPixel<bPP>((line_bits+x), val, as24bit);
|
|
642
|
+
x += pixel_size;
|
|
643
|
+
|
|
644
|
+
if (x >= line_size) {
|
|
645
|
+
x = 0;
|
|
646
|
+
y++;
|
|
647
|
+
line_bits = FreeImage_GetScanLine(dib, y);
|
|
648
|
+
}
|
|
649
|
+
} //< packet_count
|
|
650
|
+
} //< has_rle
|
|
651
|
+
|
|
652
|
+
} //< while height
|
|
653
|
+
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
// --------------------------------------------------------------------------
|
|
657
|
+
|
|
658
|
+
static FIBITMAP * DLL_CALLCONV
|
|
659
|
+
Load(FreeImageIO *io, fi_handle handle, int page, int flags, void *data) {
|
|
660
|
+
FIBITMAP *dib = NULL;
|
|
661
|
+
|
|
662
|
+
if (!handle) {
|
|
663
|
+
return NULL;
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
try {
|
|
667
|
+
|
|
668
|
+
const BOOL header_only = (flags & FIF_LOAD_NOPIXELS) == FIF_LOAD_NOPIXELS;
|
|
669
|
+
|
|
670
|
+
// remember the start offset
|
|
671
|
+
long start_offset = io->tell_proc(handle);
|
|
672
|
+
|
|
673
|
+
// remember end-of-file (used for RLE cache)
|
|
674
|
+
io->seek_proc(handle, 0, SEEK_END);
|
|
675
|
+
long eof = io->tell_proc(handle);
|
|
676
|
+
io->seek_proc(handle, start_offset, SEEK_SET);
|
|
677
|
+
|
|
678
|
+
// read and process the bitmap's footer
|
|
679
|
+
|
|
680
|
+
TargaThumbnail thumbnail;
|
|
681
|
+
if(isTARGA20(io, handle)) {
|
|
682
|
+
TGAFOOTER footer;
|
|
683
|
+
const long footer_offset = start_offset + eof - sizeof(footer);
|
|
684
|
+
|
|
685
|
+
io->seek_proc(handle, footer_offset, SEEK_SET);
|
|
686
|
+
io->read_proc(&footer, sizeof(tagTGAFOOTER), 1, handle);
|
|
687
|
+
|
|
688
|
+
#ifdef FREEIMAGE_BIGENDIAN
|
|
689
|
+
SwapFooter(&footer);
|
|
690
|
+
#endif
|
|
691
|
+
BOOL hasExtensionArea = footer.extension_offset > 0;
|
|
692
|
+
if(hasExtensionArea) {
|
|
693
|
+
TGAEXTENSIONAREA extensionarea;
|
|
694
|
+
io->seek_proc(handle, footer.extension_offset, SEEK_SET);
|
|
695
|
+
io->read_proc(&extensionarea, sizeof(extensionarea), 1, handle);
|
|
696
|
+
|
|
697
|
+
#ifdef FREEIMAGE_BIGENDIAN
|
|
698
|
+
SwapExtensionArea(&extensionarea);
|
|
699
|
+
#endif
|
|
700
|
+
|
|
701
|
+
DWORD postage_stamp_offset = extensionarea.postage_stamp_offset;
|
|
702
|
+
BOOL hasThumbnail = (postage_stamp_offset > 0) && (postage_stamp_offset < (DWORD)footer_offset);
|
|
703
|
+
if(hasThumbnail) {
|
|
704
|
+
io->seek_proc(handle, postage_stamp_offset, SEEK_SET);
|
|
705
|
+
thumbnail.read(io, handle, footer_offset - postage_stamp_offset);
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
// read and process the bitmap's header
|
|
711
|
+
|
|
712
|
+
TGAHEADER header;
|
|
713
|
+
|
|
714
|
+
io->seek_proc(handle, start_offset, SEEK_SET);
|
|
715
|
+
io->read_proc(&header, sizeof(tagTGAHEADER), 1, handle);
|
|
716
|
+
|
|
717
|
+
#ifdef FREEIMAGE_BIGENDIAN
|
|
718
|
+
SwapHeader(&header);
|
|
719
|
+
#endif
|
|
720
|
+
|
|
721
|
+
thumbnail.setDepth(header.is_pixel_depth);
|
|
722
|
+
|
|
723
|
+
const int line = CalculateLine(header.is_width, header.is_pixel_depth);
|
|
724
|
+
const int pixel_bits = header.is_pixel_depth;
|
|
725
|
+
const int pixel_size = pixel_bits/8;
|
|
726
|
+
|
|
727
|
+
int fliphoriz = (header.is_image_descriptor & 0x10) ? 1 : 0;
|
|
728
|
+
int flipvert = (header.is_image_descriptor & 0x20) ? 1 : 0;
|
|
729
|
+
|
|
730
|
+
// skip comment
|
|
731
|
+
io->seek_proc(handle, header.id_length, SEEK_CUR);
|
|
732
|
+
|
|
733
|
+
switch (header.is_pixel_depth) {
|
|
734
|
+
case 8 : {
|
|
735
|
+
dib = FreeImage_AllocateHeader(header_only, header.is_width, header.is_height, 8);
|
|
736
|
+
|
|
737
|
+
if (dib == NULL) {
|
|
738
|
+
throw FI_MSG_ERROR_DIB_MEMORY;
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
// read the palette (even if header only)
|
|
742
|
+
|
|
743
|
+
RGBQUAD *palette = FreeImage_GetPalette(dib);
|
|
744
|
+
|
|
745
|
+
if (header.color_map_type > 0) {
|
|
746
|
+
unsigned count, csize;
|
|
747
|
+
|
|
748
|
+
// calculate the color map size
|
|
749
|
+
csize = header.cm_length * header.cm_size / 8;
|
|
750
|
+
|
|
751
|
+
// read the color map
|
|
752
|
+
BYTE *cmap = (BYTE*)malloc(csize * sizeof(BYTE));
|
|
753
|
+
if (cmap == NULL) {
|
|
754
|
+
throw FI_MSG_ERROR_DIB_MEMORY;
|
|
755
|
+
}
|
|
756
|
+
io->read_proc(cmap, sizeof(BYTE), csize, handle);
|
|
757
|
+
|
|
758
|
+
// build the palette
|
|
759
|
+
|
|
760
|
+
switch (header.cm_size) {
|
|
761
|
+
case 16: {
|
|
762
|
+
WORD *rgb555 = (WORD*)&cmap[0];
|
|
763
|
+
unsigned start = (unsigned)header.cm_first_entry;
|
|
764
|
+
unsigned stop = MIN((unsigned)256, (unsigned)header.cm_length);
|
|
765
|
+
|
|
766
|
+
for (count = start; count < stop; count++) {
|
|
767
|
+
palette[count].rgbRed = (BYTE)((((*rgb555 & FI16_555_RED_MASK) >> FI16_555_RED_SHIFT) * 0xFF) / 0x1F);
|
|
768
|
+
palette[count].rgbGreen = (BYTE)((((*rgb555 & FI16_555_GREEN_MASK) >> FI16_555_GREEN_SHIFT) * 0xFF) / 0x1F);
|
|
769
|
+
palette[count].rgbBlue = (BYTE)((((*rgb555 & FI16_555_BLUE_MASK) >> FI16_555_BLUE_SHIFT) * 0xFF) / 0x1F);
|
|
770
|
+
rgb555++;
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
break;
|
|
774
|
+
|
|
775
|
+
case 24: {
|
|
776
|
+
FILE_BGR *bgr = (FILE_BGR*)&cmap[0];
|
|
777
|
+
unsigned start = (unsigned)header.cm_first_entry;
|
|
778
|
+
unsigned stop = MIN((unsigned)256, (unsigned)header.cm_length);
|
|
779
|
+
|
|
780
|
+
for (count = start; count < stop; count++) {
|
|
781
|
+
palette[count].rgbBlue = bgr->b;
|
|
782
|
+
palette[count].rgbGreen = bgr->g;
|
|
783
|
+
palette[count].rgbRed = bgr->r;
|
|
784
|
+
bgr++;
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
break;
|
|
788
|
+
|
|
789
|
+
case 32: {
|
|
790
|
+
BYTE trns[256];
|
|
791
|
+
|
|
792
|
+
// clear the transparency table
|
|
793
|
+
memset(trns, 0xFF, 256);
|
|
794
|
+
|
|
795
|
+
FILE_BGRA *bgra = (FILE_BGRA*)&cmap[0];
|
|
796
|
+
unsigned start = (unsigned)header.cm_first_entry;
|
|
797
|
+
unsigned stop = MIN((unsigned)256, (unsigned)header.cm_length);
|
|
798
|
+
|
|
799
|
+
for (count = start; count < stop; count++) {
|
|
800
|
+
palette[count].rgbBlue = bgra->b;
|
|
801
|
+
palette[count].rgbGreen = bgra->g;
|
|
802
|
+
palette[count].rgbRed = bgra->r;
|
|
803
|
+
// alpha
|
|
804
|
+
trns[count] = bgra->a;
|
|
805
|
+
bgra++;
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
// set the tranparency table
|
|
809
|
+
FreeImage_SetTransparencyTable(dib, trns, 256);
|
|
810
|
+
}
|
|
811
|
+
break;
|
|
812
|
+
|
|
813
|
+
} // switch(header.cm_size)
|
|
814
|
+
|
|
815
|
+
free(cmap);
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
// handle thumbnail
|
|
819
|
+
|
|
820
|
+
FIBITMAP* th = thumbnail.toFIBITMAP();
|
|
821
|
+
if(th) {
|
|
822
|
+
RGBQUAD* pal = FreeImage_GetPalette(dib);
|
|
823
|
+
RGBQUAD* dst_pal = FreeImage_GetPalette(th);
|
|
824
|
+
if(dst_pal && pal) {
|
|
825
|
+
for(unsigned i = 0; i < FreeImage_GetColorsUsed(dib); i++) {
|
|
826
|
+
dst_pal[i] = pal[i];
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
FreeImage_SetTransparencyTable(th, FreeImage_GetTransparencyTable(dib), FreeImage_GetTransparencyCount(dib));
|
|
831
|
+
|
|
832
|
+
FreeImage_SetThumbnail(dib, th);
|
|
833
|
+
FreeImage_Unload(th);
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
if(header_only) {
|
|
837
|
+
return dib;
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
// read in the bitmap bits
|
|
841
|
+
|
|
842
|
+
switch (header.image_type) {
|
|
843
|
+
case TGA_CMAP:
|
|
844
|
+
case TGA_MONO: {
|
|
845
|
+
BYTE *bits = NULL;
|
|
846
|
+
|
|
847
|
+
for (unsigned count = 0; count < header.is_height; count++) {
|
|
848
|
+
bits = FreeImage_GetScanLine(dib, count);
|
|
849
|
+
io->read_proc(bits, sizeof(BYTE), line, handle);
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
break;
|
|
853
|
+
|
|
854
|
+
case TGA_RLECMAP:
|
|
855
|
+
case TGA_RLEMONO: { //(8 bit)
|
|
856
|
+
loadRLE<8>(dib, header.is_width, header.is_height, io, handle, eof, FALSE);
|
|
857
|
+
}
|
|
858
|
+
break;
|
|
859
|
+
|
|
860
|
+
default :
|
|
861
|
+
FreeImage_Unload(dib);
|
|
862
|
+
return NULL;
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
break; // header.is_pixel_depth == 8
|
|
866
|
+
|
|
867
|
+
case 15 :
|
|
868
|
+
|
|
869
|
+
case 16 : {
|
|
870
|
+
int pixel_bits = 16;
|
|
871
|
+
|
|
872
|
+
// allocate the dib
|
|
873
|
+
|
|
874
|
+
if (TARGA_LOAD_RGB888 & flags) {
|
|
875
|
+
pixel_bits = 24;
|
|
876
|
+
dib = FreeImage_AllocateHeader(header_only, header.is_width, header.is_height, pixel_bits, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK);
|
|
877
|
+
|
|
878
|
+
} else {
|
|
879
|
+
dib = FreeImage_AllocateHeader(header_only, header.is_width, header.is_height, pixel_bits, FI16_555_RED_MASK, FI16_555_GREEN_MASK, FI16_555_BLUE_MASK);
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
if (dib == NULL) {
|
|
883
|
+
throw FI_MSG_ERROR_DIB_MEMORY;
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
// handle thumbnail
|
|
887
|
+
|
|
888
|
+
FIBITMAP* th = thumbnail.toFIBITMAP();
|
|
889
|
+
if(th) {
|
|
890
|
+
if(TARGA_LOAD_RGB888 & flags) {
|
|
891
|
+
FIBITMAP* t = FreeImage_ConvertTo24Bits(th);
|
|
892
|
+
FreeImage_Unload(th);
|
|
893
|
+
th = t;
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
FreeImage_SetThumbnail(dib, th);
|
|
897
|
+
FreeImage_Unload(th);
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
if(header_only) {
|
|
901
|
+
return dib;
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
int line = CalculateLine(header.is_width, pixel_bits);
|
|
905
|
+
|
|
906
|
+
const unsigned pixel_size = unsigned(pixel_bits) / 8;
|
|
907
|
+
const unsigned src_pixel_size = sizeof(WORD);
|
|
908
|
+
|
|
909
|
+
// note header.cm_size is a misleading name, it should be seen as header.cm_bits
|
|
910
|
+
// ignore current position in file and set filepointer explicitly from the beginning of the file
|
|
911
|
+
|
|
912
|
+
int garblen = 0;
|
|
913
|
+
|
|
914
|
+
if (header.color_map_type != 0) {
|
|
915
|
+
garblen = (int)((header.cm_size + 7) / 8) * header.cm_length; /* should byte align */
|
|
916
|
+
|
|
917
|
+
} else {
|
|
918
|
+
garblen = 0;
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
io->seek_proc(handle, start_offset, SEEK_SET);
|
|
922
|
+
io->seek_proc(handle, sizeof(tagTGAHEADER) + header.id_length + garblen, SEEK_SET);
|
|
923
|
+
|
|
924
|
+
// read in the bitmap bits
|
|
925
|
+
|
|
926
|
+
switch (header.image_type) {
|
|
927
|
+
case TGA_RGB: { //(16 bit)
|
|
928
|
+
// input line cache
|
|
929
|
+
BYTE *in_line = (BYTE*)malloc(header.is_width * sizeof(WORD));
|
|
930
|
+
|
|
931
|
+
if (!in_line)
|
|
932
|
+
throw FI_MSG_ERROR_MEMORY;
|
|
933
|
+
|
|
934
|
+
const int h = header.is_height;
|
|
935
|
+
|
|
936
|
+
for (int y = 0; y < h; y++) {
|
|
937
|
+
|
|
938
|
+
BYTE *bits = FreeImage_GetScanLine(dib, y);
|
|
939
|
+
io->read_proc(in_line, src_pixel_size, header.is_width, handle);
|
|
940
|
+
|
|
941
|
+
BYTE *val = in_line;
|
|
942
|
+
for (int x = 0; x < line; x += pixel_size) {
|
|
943
|
+
|
|
944
|
+
_assignPixel<16>(bits+x, val, TARGA_LOAD_RGB888 & flags);
|
|
945
|
+
|
|
946
|
+
val += src_pixel_size;
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
free(in_line);
|
|
951
|
+
}
|
|
952
|
+
break;
|
|
953
|
+
|
|
954
|
+
case TGA_RLERGB: { //(16 bit)
|
|
955
|
+
loadRLE<16>(dib, header.is_width, header.is_height, io, handle, eof, TARGA_LOAD_RGB888 & flags);
|
|
956
|
+
}
|
|
957
|
+
break;
|
|
958
|
+
|
|
959
|
+
default :
|
|
960
|
+
FreeImage_Unload(dib);
|
|
961
|
+
return NULL;
|
|
962
|
+
}
|
|
963
|
+
}
|
|
964
|
+
break; // header.is_pixel_depth == 15 or 16
|
|
965
|
+
|
|
966
|
+
case 24 : {
|
|
967
|
+
|
|
968
|
+
dib = FreeImage_AllocateHeader(header_only, header.is_width, header.is_height, pixel_bits, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK);
|
|
969
|
+
|
|
970
|
+
if (dib == NULL) {
|
|
971
|
+
throw FI_MSG_ERROR_DIB_MEMORY;
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
FIBITMAP* th = thumbnail.toFIBITMAP();
|
|
975
|
+
if(th) {
|
|
976
|
+
FreeImage_SetThumbnail(dib, th);
|
|
977
|
+
FreeImage_Unload(th);
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
if(header_only) {
|
|
981
|
+
return dib;
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
// read in the bitmap bits
|
|
985
|
+
|
|
986
|
+
switch (header.image_type) {
|
|
987
|
+
case TGA_RGB: { //(24 bit)
|
|
988
|
+
//uncompressed
|
|
989
|
+
loadTrueColor(dib, header.is_width, header.is_height, pixel_size,io, handle, TRUE);
|
|
990
|
+
}
|
|
991
|
+
break;
|
|
992
|
+
|
|
993
|
+
case TGA_RLERGB: { //(24 bit)
|
|
994
|
+
loadRLE<24>(dib, header.is_width, header.is_height, io, handle, eof, TRUE);
|
|
995
|
+
}
|
|
996
|
+
break;
|
|
997
|
+
|
|
998
|
+
default :
|
|
999
|
+
FreeImage_Unload(dib);
|
|
1000
|
+
return NULL;
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
break; // header.is_pixel_depth == 24
|
|
1004
|
+
|
|
1005
|
+
case 32 : {
|
|
1006
|
+
int pixel_bits = 32;
|
|
1007
|
+
|
|
1008
|
+
if (TARGA_LOAD_RGB888 & flags) {
|
|
1009
|
+
pixel_bits = 24;
|
|
1010
|
+
}
|
|
1011
|
+
|
|
1012
|
+
dib = FreeImage_AllocateHeader(header_only, header.is_width, header.is_height, pixel_bits, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK);
|
|
1013
|
+
|
|
1014
|
+
if (dib == NULL) {
|
|
1015
|
+
throw FI_MSG_ERROR_DIB_MEMORY;
|
|
1016
|
+
}
|
|
1017
|
+
|
|
1018
|
+
// handle thumbnail
|
|
1019
|
+
|
|
1020
|
+
FIBITMAP* th = thumbnail.toFIBITMAP();
|
|
1021
|
+
if(th) {
|
|
1022
|
+
if(TARGA_LOAD_RGB888 & flags) {
|
|
1023
|
+
FIBITMAP* t = FreeImage_ConvertTo24Bits(th);
|
|
1024
|
+
FreeImage_Unload(th);
|
|
1025
|
+
th = t;
|
|
1026
|
+
}
|
|
1027
|
+
FreeImage_SetThumbnail(dib, th);
|
|
1028
|
+
FreeImage_Unload(th);
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
if(header_only) {
|
|
1032
|
+
return dib;
|
|
1033
|
+
}
|
|
1034
|
+
|
|
1035
|
+
// read in the bitmap bits
|
|
1036
|
+
|
|
1037
|
+
switch (header.image_type) {
|
|
1038
|
+
case TGA_RGB: { //(32 bit)
|
|
1039
|
+
// uncompressed
|
|
1040
|
+
loadTrueColor(dib, header.is_width, header.is_height, 4 /*file_pixel_size*/, io, handle, TARGA_LOAD_RGB888 & flags);
|
|
1041
|
+
}
|
|
1042
|
+
break;
|
|
1043
|
+
|
|
1044
|
+
case TGA_RLERGB: { //(32 bit)
|
|
1045
|
+
loadRLE<32>(dib, header.is_width, header.is_height, io, handle, eof, TARGA_LOAD_RGB888 & flags);
|
|
1046
|
+
}
|
|
1047
|
+
break;
|
|
1048
|
+
|
|
1049
|
+
default :
|
|
1050
|
+
FreeImage_Unload(dib);
|
|
1051
|
+
return NULL;
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
break; // header.is_pixel_depth == 32
|
|
1055
|
+
|
|
1056
|
+
} // switch(header.is_pixel_depth)
|
|
1057
|
+
|
|
1058
|
+
if (flipvert) {
|
|
1059
|
+
FreeImage_FlipVertical(dib);
|
|
1060
|
+
}
|
|
1061
|
+
|
|
1062
|
+
if (fliphoriz) {
|
|
1063
|
+
FreeImage_FlipHorizontal(dib);
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
return dib;
|
|
1067
|
+
|
|
1068
|
+
} catch (const char *message) {
|
|
1069
|
+
if (dib) {
|
|
1070
|
+
FreeImage_Unload(dib);
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
FreeImage_OutputMessageProc(s_format_id, message);
|
|
1074
|
+
|
|
1075
|
+
return NULL;
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
1078
|
+
|
|
1079
|
+
// --------------------------------------------------------------------------
|
|
1080
|
+
|
|
1081
|
+
static BOOL
|
|
1082
|
+
hasValidThumbnail(FIBITMAP* dib) {
|
|
1083
|
+
FIBITMAP* thumbnail = FreeImage_GetThumbnail(dib);
|
|
1084
|
+
|
|
1085
|
+
return thumbnail
|
|
1086
|
+
&& SupportsExportType(FreeImage_GetImageType(thumbnail))
|
|
1087
|
+
&& SupportsExportDepth(FreeImage_GetBPP(thumbnail))
|
|
1088
|
+
// Requirements according to the specification:
|
|
1089
|
+
&& FreeImage_GetBPP(thumbnail) == FreeImage_GetBPP(dib)
|
|
1090
|
+
&& FreeImage_GetImageType(thumbnail) == FreeImage_GetImageType(dib)
|
|
1091
|
+
&& FreeImage_GetWidth(thumbnail) <= 255
|
|
1092
|
+
&& FreeImage_GetHeight(thumbnail) <= 255;
|
|
1093
|
+
}
|
|
1094
|
+
|
|
1095
|
+
/**
|
|
1096
|
+
Writes the ready RLE packet to buffer
|
|
1097
|
+
*/
|
|
1098
|
+
static inline void
|
|
1099
|
+
flushPacket(BYTE*& dest, unsigned pixel_size, BYTE* packet_begin, BYTE*& packet, BYTE& packet_count, BOOL& has_rle) {
|
|
1100
|
+
if (packet_count) {
|
|
1101
|
+
const BYTE type_bit = has_rle ? 0x80 : 0x0;
|
|
1102
|
+
const BYTE write_count = has_rle ? 1 : packet_count;
|
|
1103
|
+
|
|
1104
|
+
// build packet header: zero-based count + type bit
|
|
1105
|
+
assert(packet_count >= 1);
|
|
1106
|
+
BYTE rle = packet_count - 1;
|
|
1107
|
+
rle |= type_bit;
|
|
1108
|
+
|
|
1109
|
+
// write packet header
|
|
1110
|
+
*dest = rle;
|
|
1111
|
+
++dest;
|
|
1112
|
+
|
|
1113
|
+
// write packet data
|
|
1114
|
+
memcpy(dest, packet_begin, write_count * pixel_size);
|
|
1115
|
+
dest += write_count * pixel_size;
|
|
1116
|
+
|
|
1117
|
+
// reset state
|
|
1118
|
+
packet_count = 0;
|
|
1119
|
+
packet = packet_begin;
|
|
1120
|
+
has_rle = FALSE;
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
|
|
1124
|
+
|
|
1125
|
+
static inline void
|
|
1126
|
+
writeToPacket(BYTE* packet, BYTE* pixel, unsigned pixel_size) {
|
|
1127
|
+
// Take care of channel and byte order here, because packet will be flushed straight to the file
|
|
1128
|
+
switch (pixel_size) {
|
|
1129
|
+
case 1:
|
|
1130
|
+
*packet = *pixel;
|
|
1131
|
+
break;
|
|
1132
|
+
|
|
1133
|
+
case 2: {
|
|
1134
|
+
WORD val(*(WORD*)pixel);
|
|
1135
|
+
#ifdef FREEIMAGE_BIGENDIAN
|
|
1136
|
+
SwapShort(&val);
|
|
1137
|
+
#endif
|
|
1138
|
+
*(WORD*)packet = val;
|
|
1139
|
+
}
|
|
1140
|
+
break;
|
|
1141
|
+
|
|
1142
|
+
case 3: {
|
|
1143
|
+
packet[0] = pixel[FI_RGBA_BLUE];
|
|
1144
|
+
packet[1] = pixel[FI_RGBA_GREEN];
|
|
1145
|
+
packet[2] = pixel[FI_RGBA_RED];
|
|
1146
|
+
}
|
|
1147
|
+
break;
|
|
1148
|
+
|
|
1149
|
+
case 4: {
|
|
1150
|
+
#if FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_BGR
|
|
1151
|
+
*(reinterpret_cast<unsigned*>(packet)) = *(reinterpret_cast<unsigned*> (pixel));
|
|
1152
|
+
#else
|
|
1153
|
+
packet[0] = pixel[FI_RGBA_BLUE];
|
|
1154
|
+
packet[1] = pixel[FI_RGBA_GREEN];
|
|
1155
|
+
packet[2] = pixel[FI_RGBA_RED];
|
|
1156
|
+
packet[3] = pixel[FI_RGBA_ALPHA];
|
|
1157
|
+
#endif
|
|
1158
|
+
}
|
|
1159
|
+
break;
|
|
1160
|
+
|
|
1161
|
+
default:
|
|
1162
|
+
assert(FALSE);
|
|
1163
|
+
}
|
|
1164
|
+
}
|
|
1165
|
+
|
|
1166
|
+
static inline BOOL
|
|
1167
|
+
isEqualPixel(BYTE* lhs, BYTE* rhs, unsigned pixel_size) {
|
|
1168
|
+
switch (pixel_size) {
|
|
1169
|
+
case 1:
|
|
1170
|
+
return *lhs == *rhs;
|
|
1171
|
+
|
|
1172
|
+
case 2:
|
|
1173
|
+
return *(WORD*)lhs == *(WORD*)rhs;
|
|
1174
|
+
|
|
1175
|
+
case 3:
|
|
1176
|
+
return *(WORD*)lhs == *(WORD*)rhs && lhs[2] == rhs[2];
|
|
1177
|
+
|
|
1178
|
+
case 4:
|
|
1179
|
+
return *(unsigned*)lhs == *(unsigned*)rhs;
|
|
1180
|
+
|
|
1181
|
+
default:
|
|
1182
|
+
assert(FALSE);
|
|
1183
|
+
return FALSE;
|
|
1184
|
+
}
|
|
1185
|
+
}
|
|
1186
|
+
|
|
1187
|
+
static void
|
|
1188
|
+
saveRLE(FIBITMAP* dib, FreeImageIO* io, fi_handle handle) {
|
|
1189
|
+
// Image is compressed line by line, packets don't span multiple lines (TGA2.0 recommendation)
|
|
1190
|
+
|
|
1191
|
+
const unsigned width = FreeImage_GetWidth(dib);
|
|
1192
|
+
const unsigned height = FreeImage_GetHeight(dib);
|
|
1193
|
+
const unsigned pixel_size = FreeImage_GetBPP(dib)/8;
|
|
1194
|
+
const unsigned line_size = FreeImage_GetLine(dib);
|
|
1195
|
+
|
|
1196
|
+
const BYTE max_packet_size = 128;
|
|
1197
|
+
BYTE packet_count = 0;
|
|
1198
|
+
BOOL has_rle = FALSE;
|
|
1199
|
+
|
|
1200
|
+
// packet (compressed or not) to be written to line
|
|
1201
|
+
|
|
1202
|
+
BYTE* const packet_begin = (BYTE*)malloc(max_packet_size * pixel_size);
|
|
1203
|
+
BYTE* packet = packet_begin;
|
|
1204
|
+
|
|
1205
|
+
// line to be written to disk
|
|
1206
|
+
// Note: we need some extra bytes for anti-commpressed lines. The worst case is:
|
|
1207
|
+
// 8 bit images were every 3th pixel is different.
|
|
1208
|
+
// Rle packet becomes two pixels, but nothing is compressed: two byte pixels are transformed into byte header and byte pixel value
|
|
1209
|
+
// After every rle packet there is a non-rle packet of one pixel: an extra byte for the header will be added for it
|
|
1210
|
+
// In the end we gain no bytes from compression, but also must insert a byte at every 3th pixel
|
|
1211
|
+
|
|
1212
|
+
// add extra space for anti-commpressed lines
|
|
1213
|
+
size_t extra_space = (size_t)ceil(width / 3.0);
|
|
1214
|
+
BYTE* const line_begin = (BYTE*)malloc(width * pixel_size + extra_space);
|
|
1215
|
+
BYTE* line = line_begin;
|
|
1216
|
+
|
|
1217
|
+
BYTE *current = (BYTE*)malloc(pixel_size);
|
|
1218
|
+
BYTE *next = (BYTE*)malloc(pixel_size);
|
|
1219
|
+
|
|
1220
|
+
for(unsigned y = 0; y < height; y++) {
|
|
1221
|
+
BYTE *bits = FreeImage_GetScanLine(dib, y);
|
|
1222
|
+
|
|
1223
|
+
// rewind line pointer
|
|
1224
|
+
line = line_begin;
|
|
1225
|
+
|
|
1226
|
+
for(unsigned x = 0; x < line_size; x += pixel_size) {
|
|
1227
|
+
|
|
1228
|
+
AssignPixel(current, (bits + x), pixel_size);
|
|
1229
|
+
|
|
1230
|
+
// read next pixel from dib
|
|
1231
|
+
|
|
1232
|
+
if( x + 1*pixel_size < line_size) {
|
|
1233
|
+
AssignPixel(next, (bits + x + 1*pixel_size), pixel_size);
|
|
1234
|
+
|
|
1235
|
+
} else {
|
|
1236
|
+
// last pixel in line
|
|
1237
|
+
|
|
1238
|
+
// include current pixel and flush
|
|
1239
|
+
if(!has_rle) {
|
|
1240
|
+
|
|
1241
|
+
writeToPacket(packet, current, pixel_size);
|
|
1242
|
+
packet += pixel_size;
|
|
1243
|
+
|
|
1244
|
+
}
|
|
1245
|
+
|
|
1246
|
+
assert(packet_count < max_packet_size);
|
|
1247
|
+
|
|
1248
|
+
++packet_count;
|
|
1249
|
+
|
|
1250
|
+
flushPacket(line, pixel_size, packet_begin, packet, packet_count, has_rle);
|
|
1251
|
+
|
|
1252
|
+
// start anew on next line
|
|
1253
|
+
break;
|
|
1254
|
+
}
|
|
1255
|
+
|
|
1256
|
+
if(isEqualPixel(current, next, pixel_size)) {
|
|
1257
|
+
|
|
1258
|
+
// has rle
|
|
1259
|
+
|
|
1260
|
+
if(!has_rle) {
|
|
1261
|
+
// flush non rle packet
|
|
1262
|
+
|
|
1263
|
+
flushPacket(line, pixel_size, packet_begin, packet, packet_count, has_rle);
|
|
1264
|
+
|
|
1265
|
+
// start a rle packet
|
|
1266
|
+
|
|
1267
|
+
has_rle = TRUE;
|
|
1268
|
+
|
|
1269
|
+
writeToPacket(packet, current, pixel_size);
|
|
1270
|
+
packet += pixel_size;
|
|
1271
|
+
}
|
|
1272
|
+
|
|
1273
|
+
// otherwise do nothing. We will just increase the count at the end
|
|
1274
|
+
|
|
1275
|
+
} else {
|
|
1276
|
+
|
|
1277
|
+
// no rle
|
|
1278
|
+
|
|
1279
|
+
if(has_rle) {
|
|
1280
|
+
// flush rle packet
|
|
1281
|
+
|
|
1282
|
+
// include current pixel first
|
|
1283
|
+
assert(packet_count < max_packet_size);
|
|
1284
|
+
++packet_count;
|
|
1285
|
+
|
|
1286
|
+
flushPacket(line, pixel_size, packet_begin, packet, packet_count, has_rle);
|
|
1287
|
+
|
|
1288
|
+
// start anew on the next pixel
|
|
1289
|
+
continue;
|
|
1290
|
+
|
|
1291
|
+
} else {
|
|
1292
|
+
|
|
1293
|
+
writeToPacket(packet, current, pixel_size);
|
|
1294
|
+
packet += pixel_size;
|
|
1295
|
+
}
|
|
1296
|
+
|
|
1297
|
+
}
|
|
1298
|
+
|
|
1299
|
+
// increase counter on every pixel
|
|
1300
|
+
|
|
1301
|
+
++packet_count;
|
|
1302
|
+
|
|
1303
|
+
if(packet_count == max_packet_size) {
|
|
1304
|
+
flushPacket(line, pixel_size, packet_begin, packet, packet_count, has_rle);
|
|
1305
|
+
}
|
|
1306
|
+
|
|
1307
|
+
}//for width
|
|
1308
|
+
|
|
1309
|
+
// write line to disk
|
|
1310
|
+
io->write_proc(line_begin, 1, (unsigned)(line - line_begin), handle);
|
|
1311
|
+
|
|
1312
|
+
}//for height
|
|
1313
|
+
|
|
1314
|
+
free(line_begin);
|
|
1315
|
+
free(packet_begin);
|
|
1316
|
+
free(current);
|
|
1317
|
+
free(next);
|
|
1318
|
+
}
|
|
1319
|
+
|
|
1320
|
+
static BOOL DLL_CALLCONV
|
|
1321
|
+
Save(FreeImageIO *io, FIBITMAP *dib, fi_handle handle, int page, int flags, void *data) {
|
|
1322
|
+
if ((dib == NULL) || (handle == NULL)) {
|
|
1323
|
+
return FALSE;
|
|
1324
|
+
}
|
|
1325
|
+
|
|
1326
|
+
RGBQUAD *palette = FreeImage_GetPalette(dib);
|
|
1327
|
+
const unsigned bpp = FreeImage_GetBPP(dib);
|
|
1328
|
+
|
|
1329
|
+
// write the file header
|
|
1330
|
+
|
|
1331
|
+
TGAHEADER header;
|
|
1332
|
+
|
|
1333
|
+
header.id_length = 0;
|
|
1334
|
+
header.cm_first_entry = 0;
|
|
1335
|
+
header.is_xorigin = 0;
|
|
1336
|
+
header.is_yorigin = 0;
|
|
1337
|
+
header.is_width = (WORD)FreeImage_GetWidth(dib);
|
|
1338
|
+
header.is_height = (WORD)FreeImage_GetHeight(dib);
|
|
1339
|
+
header.is_pixel_depth = (BYTE)bpp;
|
|
1340
|
+
header.is_image_descriptor = (bpp == 32 ? 8 : 0);
|
|
1341
|
+
|
|
1342
|
+
if (palette) {
|
|
1343
|
+
header.color_map_type = 1;
|
|
1344
|
+
header.image_type = (TARGA_SAVE_RLE & flags) ? TGA_RLECMAP : TGA_CMAP;
|
|
1345
|
+
header.cm_length = (WORD)(1 << bpp);
|
|
1346
|
+
|
|
1347
|
+
if (FreeImage_IsTransparent(dib)) {
|
|
1348
|
+
header.cm_size = 32;
|
|
1349
|
+
} else {
|
|
1350
|
+
header.cm_size = 24;
|
|
1351
|
+
}
|
|
1352
|
+
|
|
1353
|
+
} else {
|
|
1354
|
+
header.color_map_type = 0;
|
|
1355
|
+
header.image_type = (TARGA_SAVE_RLE & flags) ? TGA_RLERGB : TGA_RGB;
|
|
1356
|
+
header.cm_length = 0;
|
|
1357
|
+
header.cm_size = 0;
|
|
1358
|
+
}
|
|
1359
|
+
|
|
1360
|
+
// write the header
|
|
1361
|
+
|
|
1362
|
+
#ifdef FREEIMAGE_BIGENDIAN
|
|
1363
|
+
SwapHeader(&header);
|
|
1364
|
+
#endif
|
|
1365
|
+
|
|
1366
|
+
io->write_proc(&header, sizeof(header), 1, handle);
|
|
1367
|
+
|
|
1368
|
+
#ifdef FREEIMAGE_BIGENDIAN
|
|
1369
|
+
SwapHeader(&header);
|
|
1370
|
+
#endif
|
|
1371
|
+
|
|
1372
|
+
// write the palette
|
|
1373
|
+
|
|
1374
|
+
if (palette) {
|
|
1375
|
+
if (FreeImage_IsTransparent(dib)) {
|
|
1376
|
+
FILE_BGRA *bgra_pal = (FILE_BGRA*)malloc(header.cm_length * sizeof(FILE_BGRA));
|
|
1377
|
+
|
|
1378
|
+
// get the transparency table
|
|
1379
|
+
BYTE *trns = FreeImage_GetTransparencyTable(dib);
|
|
1380
|
+
|
|
1381
|
+
for (unsigned i = 0; i < header.cm_length; i++) {
|
|
1382
|
+
bgra_pal[i].b = palette[i].rgbBlue;
|
|
1383
|
+
bgra_pal[i].g = palette[i].rgbGreen;
|
|
1384
|
+
bgra_pal[i].r = palette[i].rgbRed;
|
|
1385
|
+
bgra_pal[i].a = trns[i];
|
|
1386
|
+
}
|
|
1387
|
+
|
|
1388
|
+
io->write_proc(bgra_pal, sizeof(FILE_BGRA), header.cm_length, handle);
|
|
1389
|
+
|
|
1390
|
+
free(bgra_pal);
|
|
1391
|
+
|
|
1392
|
+
} else {
|
|
1393
|
+
FILE_BGR *bgr_pal = (FILE_BGR*)malloc(header.cm_length * sizeof(FILE_BGR));
|
|
1394
|
+
|
|
1395
|
+
for (unsigned i = 0; i < header.cm_length; i++) {
|
|
1396
|
+
bgr_pal[i].b = palette[i].rgbBlue;
|
|
1397
|
+
bgr_pal[i].g = palette[i].rgbGreen;
|
|
1398
|
+
bgr_pal[i].r = palette[i].rgbRed;
|
|
1399
|
+
}
|
|
1400
|
+
|
|
1401
|
+
io->write_proc(bgr_pal, sizeof(FILE_BGR), header.cm_length, handle);
|
|
1402
|
+
|
|
1403
|
+
free(bgr_pal);
|
|
1404
|
+
}
|
|
1405
|
+
}
|
|
1406
|
+
|
|
1407
|
+
// write the data bits
|
|
1408
|
+
|
|
1409
|
+
|
|
1410
|
+
if (TARGA_SAVE_RLE & flags) {
|
|
1411
|
+
|
|
1412
|
+
saveRLE(dib, io, handle);
|
|
1413
|
+
|
|
1414
|
+
} else {
|
|
1415
|
+
|
|
1416
|
+
// -- no rle compression --
|
|
1417
|
+
|
|
1418
|
+
const unsigned width = header.is_width;
|
|
1419
|
+
const unsigned height = header.is_height;
|
|
1420
|
+
const unsigned pixel_size = bpp/8;
|
|
1421
|
+
|
|
1422
|
+
BYTE *line, *const line_begin = (BYTE*)malloc(width * pixel_size);
|
|
1423
|
+
BYTE *line_source = line_begin;
|
|
1424
|
+
|
|
1425
|
+
for (unsigned y = 0; y < height; y++) {
|
|
1426
|
+
BYTE *scanline = FreeImage_GetScanLine(dib, y);
|
|
1427
|
+
|
|
1428
|
+
// rewind the line pointer
|
|
1429
|
+
line = line_begin;
|
|
1430
|
+
|
|
1431
|
+
switch (bpp) {
|
|
1432
|
+
case 8: {
|
|
1433
|
+
// don't copy line, read straight from dib
|
|
1434
|
+
line_source = scanline;
|
|
1435
|
+
}
|
|
1436
|
+
break;
|
|
1437
|
+
|
|
1438
|
+
case 16: {
|
|
1439
|
+
for (unsigned x = 0; x < width; x++) {
|
|
1440
|
+
WORD pixel = *(((WORD *)scanline) + x);
|
|
1441
|
+
|
|
1442
|
+
#ifdef FREEIMAGE_BIGENDIAN
|
|
1443
|
+
SwapShort(&pixel);
|
|
1444
|
+
#endif
|
|
1445
|
+
*(WORD*)line = pixel;
|
|
1446
|
+
|
|
1447
|
+
line += pixel_size;
|
|
1448
|
+
}
|
|
1449
|
+
}
|
|
1450
|
+
break;
|
|
1451
|
+
|
|
1452
|
+
case 24: {
|
|
1453
|
+
|
|
1454
|
+
#if FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_BGR
|
|
1455
|
+
line_source = scanline;
|
|
1456
|
+
#else
|
|
1457
|
+
for (unsigned x = 0; x < width; ++x) {
|
|
1458
|
+
RGBTRIPLE* trip = ((RGBTRIPLE *)scanline) + x;
|
|
1459
|
+
line[0] = trip->rgbtBlue;
|
|
1460
|
+
line[1] = trip->rgbtGreen;
|
|
1461
|
+
line[2] = trip->rgbtRed;
|
|
1462
|
+
|
|
1463
|
+
line += pixel_size;
|
|
1464
|
+
}
|
|
1465
|
+
#endif
|
|
1466
|
+
}
|
|
1467
|
+
break;
|
|
1468
|
+
|
|
1469
|
+
case 32: {
|
|
1470
|
+
|
|
1471
|
+
#if FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_BGR
|
|
1472
|
+
line_source = scanline;
|
|
1473
|
+
#else
|
|
1474
|
+
for (unsigned x = 0; x < width; ++x) {
|
|
1475
|
+
RGBQUAD* quad = ((RGBQUAD *)scanline) + x;
|
|
1476
|
+
line[0] = quad->rgbBlue;
|
|
1477
|
+
line[1] = quad->rgbGreen;
|
|
1478
|
+
line[2] = quad->rgbRed;
|
|
1479
|
+
line[3] = quad->rgbReserved;
|
|
1480
|
+
|
|
1481
|
+
line += pixel_size;
|
|
1482
|
+
}
|
|
1483
|
+
#endif
|
|
1484
|
+
}
|
|
1485
|
+
break;
|
|
1486
|
+
|
|
1487
|
+
}//switch(bpp)
|
|
1488
|
+
|
|
1489
|
+
// write line to disk
|
|
1490
|
+
|
|
1491
|
+
io->write_proc(line_source, pixel_size, width, handle);
|
|
1492
|
+
|
|
1493
|
+
}//for height
|
|
1494
|
+
|
|
1495
|
+
free(line_begin);
|
|
1496
|
+
}
|
|
1497
|
+
|
|
1498
|
+
|
|
1499
|
+
long extension_offset = 0 ;
|
|
1500
|
+
if(hasValidThumbnail(dib)) {
|
|
1501
|
+
// write extension area
|
|
1502
|
+
|
|
1503
|
+
extension_offset = io->tell_proc(handle);
|
|
1504
|
+
|
|
1505
|
+
TGAEXTENSIONAREA ex;
|
|
1506
|
+
memset(&ex, 0, sizeof(ex));
|
|
1507
|
+
|
|
1508
|
+
assert(sizeof(ex) == 495);
|
|
1509
|
+
ex.extension_size = sizeof(ex);
|
|
1510
|
+
ex.postage_stamp_offset = extension_offset + ex.extension_size + 0 /*< no Scan Line Table*/;
|
|
1511
|
+
ex.attributes_type = FreeImage_GetBPP(dib) == 32 ? 3 /*< useful Alpha channel data*/ : 0 /*< no Alpha data*/;
|
|
1512
|
+
|
|
1513
|
+
#ifdef FREEIMAGE_BIGENDIAN
|
|
1514
|
+
SwapExtensionArea(&ex);
|
|
1515
|
+
#endif
|
|
1516
|
+
|
|
1517
|
+
io->write_proc(&ex, sizeof(ex), 1, handle);
|
|
1518
|
+
|
|
1519
|
+
// (no Scan Line Table)
|
|
1520
|
+
|
|
1521
|
+
// write thumbnail
|
|
1522
|
+
|
|
1523
|
+
io->seek_proc(handle, ex.postage_stamp_offset, SEEK_SET);
|
|
1524
|
+
|
|
1525
|
+
FIBITMAP* thumbnail = FreeImage_GetThumbnail(dib);
|
|
1526
|
+
BYTE width = (BYTE)FreeImage_GetWidth(thumbnail);
|
|
1527
|
+
BYTE height = (BYTE)FreeImage_GetHeight(thumbnail);
|
|
1528
|
+
|
|
1529
|
+
io->write_proc(&width, 1, 1, handle);
|
|
1530
|
+
io->write_proc(&height, 1, 1, handle);
|
|
1531
|
+
|
|
1532
|
+
#if FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_RGB
|
|
1533
|
+
SwapRedBlue32(dib);
|
|
1534
|
+
#endif
|
|
1535
|
+
|
|
1536
|
+
#ifdef FREEIMAGE_BIGENDIAN
|
|
1537
|
+
swapShortPixels(dib);
|
|
1538
|
+
#endif
|
|
1539
|
+
|
|
1540
|
+
const unsigned line_size = FreeImage_GetLine(thumbnail);
|
|
1541
|
+
|
|
1542
|
+
for (BYTE h = 0; h < height; ++h) {
|
|
1543
|
+
BYTE* src_line = FreeImage_GetScanLine(thumbnail, height - 1 - h);
|
|
1544
|
+
io->write_proc(src_line, 1, line_size, handle);
|
|
1545
|
+
}
|
|
1546
|
+
}
|
|
1547
|
+
|
|
1548
|
+
// (no Color Correction Table)
|
|
1549
|
+
|
|
1550
|
+
// write the footer
|
|
1551
|
+
|
|
1552
|
+
TGAFOOTER footer;
|
|
1553
|
+
footer.extension_offset = extension_offset;
|
|
1554
|
+
footer.developer_offset = 0;
|
|
1555
|
+
strcpy(footer.signature, "TRUEVISION-XFILE.");
|
|
1556
|
+
|
|
1557
|
+
|
|
1558
|
+
#ifdef FREEIMAGE_BIGENDIAN
|
|
1559
|
+
SwapFooter(&footer);
|
|
1560
|
+
#endif
|
|
1561
|
+
|
|
1562
|
+
io->write_proc(&footer, sizeof(footer), 1, handle);
|
|
1563
|
+
|
|
1564
|
+
return TRUE;
|
|
1565
|
+
}
|
|
1566
|
+
|
|
1567
|
+
// ==========================================================
|
|
1568
|
+
// Init
|
|
1569
|
+
// ==========================================================
|
|
1570
|
+
|
|
1571
|
+
void DLL_CALLCONV
|
|
1572
|
+
InitTARGA(Plugin *plugin, int format_id) {
|
|
1573
|
+
s_format_id = format_id;
|
|
1574
|
+
|
|
1575
|
+
plugin->format_proc = Format;
|
|
1576
|
+
plugin->description_proc = Description;
|
|
1577
|
+
plugin->extension_proc = Extension;
|
|
1578
|
+
plugin->regexpr_proc = RegExpr;
|
|
1579
|
+
plugin->open_proc = NULL;
|
|
1580
|
+
plugin->close_proc = NULL;
|
|
1581
|
+
plugin->pagecount_proc = NULL;
|
|
1582
|
+
plugin->pagecapability_proc = NULL;
|
|
1583
|
+
plugin->load_proc = Load;
|
|
1584
|
+
plugin->save_proc = Save;
|
|
1585
|
+
plugin->validate_proc = Validate;
|
|
1586
|
+
plugin->mime_proc = MimeType;
|
|
1587
|
+
plugin->supports_export_bpp_proc = SupportsExportDepth;
|
|
1588
|
+
plugin->supports_export_type_proc = SupportsExportType;
|
|
1589
|
+
plugin->supports_icc_profiles_proc = NULL;
|
|
1590
|
+
plugin->supports_no_pixels_proc = SupportsNoPixels;
|
|
1591
|
+
}
|