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,1253 @@
|
|
|
1
|
+
// ==========================================================
|
|
2
|
+
// Metadata functions implementation
|
|
3
|
+
// Exif metadata model
|
|
4
|
+
//
|
|
5
|
+
// Design and implementation by
|
|
6
|
+
// - Herv� Drolon (drolon@infonie.fr)
|
|
7
|
+
// - Mihail Naydenov (mnaydenov@users.sourceforge.net)
|
|
8
|
+
//
|
|
9
|
+
// Based on the following implementations:
|
|
10
|
+
// - metadata-extractor : http://www.drewnoakes.com/code/exif/
|
|
11
|
+
// - jhead : http://www.sentex.net/~mwandel/jhead/
|
|
12
|
+
// - ImageMagick : http://www.imagemagick.org/
|
|
13
|
+
//
|
|
14
|
+
// This file is part of FreeImage 3
|
|
15
|
+
//
|
|
16
|
+
// COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
|
|
17
|
+
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
|
|
18
|
+
// THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
|
|
19
|
+
// OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
|
|
20
|
+
// CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
|
|
21
|
+
// THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
|
|
22
|
+
// SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
|
|
23
|
+
// PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
|
|
24
|
+
// THIS DISCLAIMER.
|
|
25
|
+
//
|
|
26
|
+
// Use at your own risk!
|
|
27
|
+
// ==========================================================
|
|
28
|
+
|
|
29
|
+
#ifdef _MSC_VER
|
|
30
|
+
#pragma warning (disable : 4786) // identifier was truncated to 'number' characters
|
|
31
|
+
#endif
|
|
32
|
+
|
|
33
|
+
#include "FreeImage.h"
|
|
34
|
+
#include "Utilities.h"
|
|
35
|
+
#include "FreeImageTag.h"
|
|
36
|
+
|
|
37
|
+
// ==========================================================
|
|
38
|
+
// Exif JPEG routines
|
|
39
|
+
// ==========================================================
|
|
40
|
+
|
|
41
|
+
#define EXIF_NUM_FORMATS 12
|
|
42
|
+
|
|
43
|
+
#define TAG_EXIF_OFFSET 0x8769 // Exif IFD Pointer
|
|
44
|
+
#define TAG_GPS_OFFSET 0x8825 // GPS Info IFD Pointer
|
|
45
|
+
#define TAG_INTEROP_OFFSET 0xA005 // Interoperability IFD Pointer
|
|
46
|
+
#define TAG_MAKER_NOTE 0x927C // Maker note
|
|
47
|
+
|
|
48
|
+
// CANON cameras have some funny bespoke fields that need further processing...
|
|
49
|
+
#define TAG_CANON_CAMERA_STATE_0x01 0x0001 // tags under tag 0x001 (CameraSettings)
|
|
50
|
+
#define TAG_CANON_CAMERA_STATE_0x02 0x0002 // tags under tag 0x002 (FocalLength)
|
|
51
|
+
#define TAG_CANON_CAMERA_STATE_0x04 0x0004 // tags under tag 0x004 (ShotInfo)
|
|
52
|
+
#define TAG_CANON_CAMERA_STATE_0x12 0x0012 // tags under tag 0x012 (AFInfo)
|
|
53
|
+
#define TAG_CANON_CAMERA_STATE_0xA0 0x00A0 // tags under tag 0x0A0 (ProcessingInfo)
|
|
54
|
+
#define TAG_CANON_CAMERA_STATE_0xE0 0x00E0 // tags under tag 0x0E0 (SensorInfo)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
// =====================================================================
|
|
58
|
+
// Reimplementation of strnicmp (it is not supported on some systems)
|
|
59
|
+
// =====================================================================
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
Compare characters of two strings without regard to case.
|
|
63
|
+
@param s1 Null-terminated string to compare.
|
|
64
|
+
@param s2 Null-terminated string to compare.
|
|
65
|
+
@param len Number of characters to compare
|
|
66
|
+
@return Returns 0 if s1 substring identical to s2 substring
|
|
67
|
+
*/
|
|
68
|
+
static int
|
|
69
|
+
FreeImage_strnicmp(const char *s1, const char *s2, size_t len) {
|
|
70
|
+
unsigned char c1, c2;
|
|
71
|
+
|
|
72
|
+
if(!s1 || !s2) return -1;
|
|
73
|
+
|
|
74
|
+
c1 = 0; c2 = 0;
|
|
75
|
+
if(len) {
|
|
76
|
+
do {
|
|
77
|
+
c1 = *s1; c2 = *s2;
|
|
78
|
+
s1++; s2++;
|
|
79
|
+
if (!c1)
|
|
80
|
+
break;
|
|
81
|
+
if (!c2)
|
|
82
|
+
break;
|
|
83
|
+
if (c1 == c2)
|
|
84
|
+
continue;
|
|
85
|
+
c1 = (BYTE)tolower(c1);
|
|
86
|
+
c2 = (BYTE)tolower(c2);
|
|
87
|
+
if (c1 != c2)
|
|
88
|
+
break;
|
|
89
|
+
} while (--len);
|
|
90
|
+
}
|
|
91
|
+
return (int)c1 - (int)c2;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
// ----------------------------------------------------------
|
|
96
|
+
// Little Endian / Big Endian io routines
|
|
97
|
+
// ----------------------------------------------------------
|
|
98
|
+
|
|
99
|
+
static short
|
|
100
|
+
ReadInt16(BOOL msb_order, const void *buffer) {
|
|
101
|
+
short value;
|
|
102
|
+
|
|
103
|
+
if(msb_order) {
|
|
104
|
+
value = (short)((((BYTE*) buffer)[0] << 8) | ((BYTE*) buffer)[1]);
|
|
105
|
+
return value;
|
|
106
|
+
}
|
|
107
|
+
value = (short)((((BYTE*) buffer)[1] << 8) | ((BYTE*) buffer)[0]);
|
|
108
|
+
return value;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
static LONG
|
|
112
|
+
ReadInt32(BOOL msb_order, const void *buffer) {
|
|
113
|
+
LONG value;
|
|
114
|
+
|
|
115
|
+
if(msb_order) {
|
|
116
|
+
value = (LONG)((((BYTE*) buffer)[0] << 24) | (((BYTE*) buffer)[1] << 16) | (((BYTE*) buffer)[2] << 8) | (((BYTE*) buffer)[3]));
|
|
117
|
+
return value;
|
|
118
|
+
}
|
|
119
|
+
value = (LONG)((((BYTE*) buffer)[3] << 24) | (((BYTE*) buffer)[2] << 16) | (((BYTE*) buffer)[1] << 8 ) | (((BYTE*) buffer)[0]));
|
|
120
|
+
return value;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
static WORD
|
|
124
|
+
ReadUint16(BOOL msb_order, const void *buffer) {
|
|
125
|
+
WORD value;
|
|
126
|
+
|
|
127
|
+
if(msb_order) {
|
|
128
|
+
value = (WORD) ((((BYTE*) buffer)[0] << 8) | ((BYTE*) buffer)[1]);
|
|
129
|
+
return value;
|
|
130
|
+
}
|
|
131
|
+
value = (WORD) ((((BYTE*) buffer)[1] << 8) | ((BYTE*) buffer)[0]);
|
|
132
|
+
return value;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
static DWORD
|
|
136
|
+
ReadUint32(BOOL msb_order, const void *buffer) {
|
|
137
|
+
return ((DWORD) ReadInt32(msb_order, buffer) & 0xFFFFFFFF);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// ----------------------------------------------------------
|
|
141
|
+
// Exif JPEG markers routines
|
|
142
|
+
// ----------------------------------------------------------
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
Process a IFD offset
|
|
146
|
+
Returns the offset and the metadata model for this tag
|
|
147
|
+
*/
|
|
148
|
+
static void
|
|
149
|
+
processIFDOffset(FITAG *tag, const char *pval, BOOL msb_order, DWORD *subdirOffset, TagLib::MDMODEL *md_model) {
|
|
150
|
+
// get the IFD offset
|
|
151
|
+
*subdirOffset = ReadUint32(msb_order, pval);
|
|
152
|
+
|
|
153
|
+
// select a tag info table
|
|
154
|
+
switch(FreeImage_GetTagID(tag)) {
|
|
155
|
+
case TAG_EXIF_OFFSET:
|
|
156
|
+
*md_model = TagLib::EXIF_EXIF;
|
|
157
|
+
break;
|
|
158
|
+
case TAG_GPS_OFFSET:
|
|
159
|
+
*md_model = TagLib::EXIF_GPS;
|
|
160
|
+
break;
|
|
161
|
+
case TAG_INTEROP_OFFSET:
|
|
162
|
+
*md_model = TagLib::EXIF_INTEROP;
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
Process a maker note IFD offset
|
|
169
|
+
Returns the offset and the metadata model for this tag
|
|
170
|
+
*/
|
|
171
|
+
static void
|
|
172
|
+
processMakerNote(FIBITMAP *dib, const char *pval, BOOL msb_order, DWORD *subdirOffset, TagLib::MDMODEL *md_model) {
|
|
173
|
+
FITAG *tagMake = NULL;
|
|
174
|
+
|
|
175
|
+
*subdirOffset = 0;
|
|
176
|
+
*md_model = TagLib::UNKNOWN;
|
|
177
|
+
|
|
178
|
+
// Determine the camera model and makernote format
|
|
179
|
+
// WARNING: note that Maker may be NULL sometimes so check its value before using it
|
|
180
|
+
// (NULL pointer checking is done by FreeImage_strnicmp)
|
|
181
|
+
FreeImage_GetMetadata(FIMD_EXIF_MAIN, dib, "Make", &tagMake);
|
|
182
|
+
const char *Maker = (char*)FreeImage_GetTagValue(tagMake);
|
|
183
|
+
|
|
184
|
+
if((memcmp("OLYMP\x00\x01", pval, 7) == 0) || (memcmp("OLYMP\x00\x02", pval, 7) == 0) || (memcmp("EPSON", pval, 5) == 0) || (memcmp("AGFA", pval, 4) == 0)) {
|
|
185
|
+
// Olympus Type 1 Makernote
|
|
186
|
+
// Epson and Agfa use Olympus maker note standard,
|
|
187
|
+
// see: http://www.ozhiker.com/electronics/pjmt/jpeg_info/
|
|
188
|
+
*md_model = TagLib::EXIF_MAKERNOTE_OLYMPUSTYPE1;
|
|
189
|
+
*subdirOffset = 8;
|
|
190
|
+
}
|
|
191
|
+
else if(memcmp("OLYMPUS\x00\x49\x49\x03\x00", pval, 12) == 0) {
|
|
192
|
+
// Olympus Type 2 Makernote
|
|
193
|
+
// !!! NOT YET SUPPORTED !!!
|
|
194
|
+
*subdirOffset = 0;
|
|
195
|
+
*md_model = TagLib::UNKNOWN;
|
|
196
|
+
}
|
|
197
|
+
else if(memcmp("Nikon", pval, 5) == 0) {
|
|
198
|
+
/* There are two scenarios here:
|
|
199
|
+
* Type 1:
|
|
200
|
+
* :0000: 4E 69 6B 6F 6E 00 01 00-05 00 02 00 02 00 06 00 Nikon...........
|
|
201
|
+
* :0010: 00 00 EC 02 00 00 03 00-03 00 01 00 00 00 06 00 ................
|
|
202
|
+
* Type 3:
|
|
203
|
+
* :0000: 4E 69 6B 6F 6E 00 02 00-00 00 4D 4D 00 2A 00 00 Nikon....MM.*...
|
|
204
|
+
* :0010: 00 08 00 1E 00 01 00 07-00 00 00 04 30 32 30 30 ............0200
|
|
205
|
+
*/
|
|
206
|
+
if (pval[6] == 1) {
|
|
207
|
+
// Nikon type 1 Makernote
|
|
208
|
+
*md_model = TagLib::EXIF_MAKERNOTE_NIKONTYPE1;
|
|
209
|
+
*subdirOffset = 8;
|
|
210
|
+
} else if (pval[6] == 2) {
|
|
211
|
+
// Nikon type 3 Makernote
|
|
212
|
+
*md_model = TagLib::EXIF_MAKERNOTE_NIKONTYPE3;
|
|
213
|
+
*subdirOffset = 18;
|
|
214
|
+
} else {
|
|
215
|
+
// Unsupported makernote data ignored
|
|
216
|
+
*subdirOffset = 0;
|
|
217
|
+
*md_model = TagLib::UNKNOWN;
|
|
218
|
+
}
|
|
219
|
+
} else if(Maker && (FreeImage_strnicmp("NIKON", Maker, 5) == 0)) {
|
|
220
|
+
// Nikon type 2 Makernote
|
|
221
|
+
*md_model = TagLib::EXIF_MAKERNOTE_NIKONTYPE2;
|
|
222
|
+
*subdirOffset = 0;
|
|
223
|
+
} else if(Maker && (FreeImage_strnicmp("Canon", Maker, 5) == 0)) {
|
|
224
|
+
// Canon Makernote
|
|
225
|
+
*md_model = TagLib::EXIF_MAKERNOTE_CANON;
|
|
226
|
+
*subdirOffset = 0;
|
|
227
|
+
} else if(Maker && (FreeImage_strnicmp("Casio", Maker, 5) == 0)) {
|
|
228
|
+
// Casio Makernote
|
|
229
|
+
if(memcmp("QVC\x00\x00\x00", pval, 6) == 0) {
|
|
230
|
+
// Casio Type 2 Makernote
|
|
231
|
+
*md_model = TagLib::EXIF_MAKERNOTE_CASIOTYPE2;
|
|
232
|
+
*subdirOffset = 6;
|
|
233
|
+
} else {
|
|
234
|
+
// Casio Type 1 Makernote
|
|
235
|
+
*md_model = TagLib::EXIF_MAKERNOTE_CASIOTYPE1;
|
|
236
|
+
*subdirOffset = 0;
|
|
237
|
+
}
|
|
238
|
+
} else if ((memcmp("FUJIFILM", pval, 8) == 0) || (Maker && (FreeImage_strnicmp("Fujifilm", Maker, 8) == 0))) {
|
|
239
|
+
// Fujifile Makernote
|
|
240
|
+
// Fujifilm's Makernote always use little-endian order altough the Exif section maybe in little-endian order or in big-endian order.
|
|
241
|
+
// If msb_order == TRUE, the Makernote won't be read:
|
|
242
|
+
// the value of ifdStart will be 0x0c000000 instead of 0x0000000c and the MakerNote section will be discarded later
|
|
243
|
+
// in jpeg_read_exif_dir because the IFD is too high
|
|
244
|
+
*md_model = TagLib::EXIF_MAKERNOTE_FUJIFILM;
|
|
245
|
+
DWORD ifdStart = ReadUint32(msb_order, pval + 8);
|
|
246
|
+
*subdirOffset = ifdStart;
|
|
247
|
+
}
|
|
248
|
+
else if(memcmp("KYOCERA\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x00\x00\x00", pval, 22) == 0) {
|
|
249
|
+
*md_model = TagLib::EXIF_MAKERNOTE_KYOCERA;
|
|
250
|
+
*subdirOffset = 22;
|
|
251
|
+
}
|
|
252
|
+
else if(Maker && (FreeImage_strnicmp("Minolta", Maker, 7) == 0)) {
|
|
253
|
+
// Minolta maker note
|
|
254
|
+
*md_model = TagLib::EXIF_MAKERNOTE_MINOLTA;
|
|
255
|
+
*subdirOffset = 0;
|
|
256
|
+
}
|
|
257
|
+
else if(memcmp("Panasonic\x00\x00\x00", pval, 12) == 0) {
|
|
258
|
+
// Panasonic maker note
|
|
259
|
+
*md_model = TagLib::EXIF_MAKERNOTE_PANASONIC;
|
|
260
|
+
*subdirOffset = 12;
|
|
261
|
+
}
|
|
262
|
+
else if(Maker && (FreeImage_strnicmp("LEICA", Maker, 5) == 0)) {
|
|
263
|
+
// Leica maker note
|
|
264
|
+
if(memcmp("LEICA\x00\x00\x00", pval, 8) == 0) {
|
|
265
|
+
// not yet supported makernote data ignored
|
|
266
|
+
*subdirOffset = 0;
|
|
267
|
+
*md_model = TagLib::UNKNOWN;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
else if(Maker && ((FreeImage_strnicmp("Pentax", Maker, 6) == 0) || (FreeImage_strnicmp("Asahi", Maker, 5) == 0))) {
|
|
271
|
+
// Pentax maker note
|
|
272
|
+
if(memcmp("AOC\x00", pval, 4) == 0) {
|
|
273
|
+
// Type 2 Pentax Makernote
|
|
274
|
+
*md_model = TagLib::EXIF_MAKERNOTE_PENTAX;
|
|
275
|
+
*subdirOffset = 6;
|
|
276
|
+
} else {
|
|
277
|
+
// Type 1 Pentax Makernote
|
|
278
|
+
*md_model = TagLib::EXIF_MAKERNOTE_ASAHI;
|
|
279
|
+
*subdirOffset = 0;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
else if((memcmp("SONY CAM\x20\x00\x00\x00", pval, 12) == 0) || (memcmp("SONY DSC\x20\x00\x00\x00", pval, 12) == 0)) {
|
|
283
|
+
*md_model = TagLib::EXIF_MAKERNOTE_SONY;
|
|
284
|
+
*subdirOffset = 12;
|
|
285
|
+
}
|
|
286
|
+
else if((memcmp("SIGMA\x00\x00\x00", pval, 8) == 0) || (memcmp("FOVEON\x00\x00", pval, 8) == 0)) {
|
|
287
|
+
FITAG *tagModel = NULL;
|
|
288
|
+
FreeImage_GetMetadata(FIMD_EXIF_MAIN, dib, "Model", &tagModel);
|
|
289
|
+
const char *Model = (char*)FreeImage_GetTagValue(tagModel);
|
|
290
|
+
if(Model && (memcmp("SIGMA SD1\x00", Model, 10) == 0)) {
|
|
291
|
+
// Sigma SD1 maker note
|
|
292
|
+
*subdirOffset = 10;
|
|
293
|
+
*md_model = TagLib::EXIF_MAKERNOTE_SIGMA_SD1;
|
|
294
|
+
} else {
|
|
295
|
+
// Sigma / Foveon makernote
|
|
296
|
+
*subdirOffset = 10;
|
|
297
|
+
*md_model = TagLib::EXIF_MAKERNOTE_SIGMA_FOVEON;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
Process a Canon maker note tag.
|
|
304
|
+
A single Canon tag may contain many other tags within.
|
|
305
|
+
*/
|
|
306
|
+
static BOOL
|
|
307
|
+
processCanonMakerNoteTag(FIBITMAP *dib, FITAG *tag) {
|
|
308
|
+
char defaultKey[16];
|
|
309
|
+
DWORD startIndex = 0;
|
|
310
|
+
TagLib& s = TagLib::instance();
|
|
311
|
+
|
|
312
|
+
WORD tag_id = FreeImage_GetTagID(tag);
|
|
313
|
+
|
|
314
|
+
int subTagTypeBase = 0;
|
|
315
|
+
|
|
316
|
+
switch(tag_id) {
|
|
317
|
+
case TAG_CANON_CAMERA_STATE_0x01:
|
|
318
|
+
subTagTypeBase = 0xC100;
|
|
319
|
+
startIndex = 1;
|
|
320
|
+
break;
|
|
321
|
+
case TAG_CANON_CAMERA_STATE_0x02:
|
|
322
|
+
subTagTypeBase = 0xC200;
|
|
323
|
+
startIndex = 0;
|
|
324
|
+
break;
|
|
325
|
+
case TAG_CANON_CAMERA_STATE_0x04:
|
|
326
|
+
subTagTypeBase = 0xC400;
|
|
327
|
+
startIndex = 1;
|
|
328
|
+
break;
|
|
329
|
+
case TAG_CANON_CAMERA_STATE_0x12:
|
|
330
|
+
subTagTypeBase = 0x1200;
|
|
331
|
+
startIndex = 0;
|
|
332
|
+
break;
|
|
333
|
+
case TAG_CANON_CAMERA_STATE_0xA0:
|
|
334
|
+
subTagTypeBase = 0xCA00;
|
|
335
|
+
startIndex = 1;
|
|
336
|
+
break;
|
|
337
|
+
case TAG_CANON_CAMERA_STATE_0xE0:
|
|
338
|
+
subTagTypeBase = 0xCE00;
|
|
339
|
+
startIndex = 1;
|
|
340
|
+
break;
|
|
341
|
+
|
|
342
|
+
default:
|
|
343
|
+
{
|
|
344
|
+
// process as a normal tag
|
|
345
|
+
|
|
346
|
+
// get the tag key and description
|
|
347
|
+
const char *key = s.getTagFieldName(TagLib::EXIF_MAKERNOTE_CANON, tag_id, defaultKey);
|
|
348
|
+
FreeImage_SetTagKey(tag, key);
|
|
349
|
+
const char *description = s.getTagDescription(TagLib::EXIF_MAKERNOTE_CANON, tag_id);
|
|
350
|
+
FreeImage_SetTagDescription(tag, description);
|
|
351
|
+
|
|
352
|
+
// store the tag
|
|
353
|
+
if(key) {
|
|
354
|
+
FreeImage_SetMetadata(FIMD_EXIF_MAKERNOTE, dib, key, tag);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
return TRUE;
|
|
358
|
+
}
|
|
359
|
+
break;
|
|
360
|
+
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
WORD *pvalue = (WORD*)FreeImage_GetTagValue(tag);
|
|
364
|
+
|
|
365
|
+
// create a tag
|
|
366
|
+
FITAG *canonTag = FreeImage_CreateTag();
|
|
367
|
+
if(!canonTag) return FALSE;
|
|
368
|
+
|
|
369
|
+
// we intentionally skip the first array member (if needed)
|
|
370
|
+
for (DWORD i = startIndex; i < FreeImage_GetTagCount(tag); i++) {
|
|
371
|
+
|
|
372
|
+
tag_id = (WORD)(subTagTypeBase + i);
|
|
373
|
+
|
|
374
|
+
FreeImage_SetTagID(canonTag, tag_id);
|
|
375
|
+
FreeImage_SetTagType(canonTag, FIDT_SHORT);
|
|
376
|
+
FreeImage_SetTagCount(canonTag, 1);
|
|
377
|
+
FreeImage_SetTagLength(canonTag, 2);
|
|
378
|
+
FreeImage_SetTagValue(canonTag, &pvalue[i]);
|
|
379
|
+
|
|
380
|
+
// get the tag key and description
|
|
381
|
+
const char *key = s.getTagFieldName(TagLib::EXIF_MAKERNOTE_CANON, tag_id, defaultKey);
|
|
382
|
+
FreeImage_SetTagKey(canonTag, key);
|
|
383
|
+
const char *description = s.getTagDescription(TagLib::EXIF_MAKERNOTE_CANON, tag_id);
|
|
384
|
+
FreeImage_SetTagDescription(canonTag, description);
|
|
385
|
+
|
|
386
|
+
// store the tag
|
|
387
|
+
if(key) {
|
|
388
|
+
FreeImage_SetMetadata(FIMD_EXIF_MAKERNOTE, dib, key, canonTag);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// delete the tag
|
|
393
|
+
FreeImage_DeleteTag(canonTag);
|
|
394
|
+
|
|
395
|
+
return TRUE;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
Process a standard Exif tag
|
|
400
|
+
*/
|
|
401
|
+
static void
|
|
402
|
+
processExifTag(FIBITMAP *dib, FITAG *tag, char *pval, BOOL msb_order, TagLib::MDMODEL md_model) {
|
|
403
|
+
char defaultKey[16];
|
|
404
|
+
int n;
|
|
405
|
+
DWORD i;
|
|
406
|
+
|
|
407
|
+
// allocate a buffer to store the tag value
|
|
408
|
+
BYTE *exif_value = (BYTE*)malloc(FreeImage_GetTagLength(tag) * sizeof(BYTE));
|
|
409
|
+
if(NULL == exif_value) {
|
|
410
|
+
// out of memory ...
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
memset(exif_value, 0, FreeImage_GetTagLength(tag) * sizeof(BYTE));
|
|
414
|
+
|
|
415
|
+
// get the tag value
|
|
416
|
+
switch(FreeImage_GetTagType(tag)) {
|
|
417
|
+
|
|
418
|
+
case FIDT_SHORT:
|
|
419
|
+
{
|
|
420
|
+
WORD *value = (WORD*)&exif_value[0];
|
|
421
|
+
for(i = 0; i < FreeImage_GetTagCount(tag); i++) {
|
|
422
|
+
value[i] = ReadUint16(msb_order, pval + i * sizeof(WORD));
|
|
423
|
+
}
|
|
424
|
+
FreeImage_SetTagValue(tag, value);
|
|
425
|
+
break;
|
|
426
|
+
}
|
|
427
|
+
case FIDT_SSHORT:
|
|
428
|
+
{
|
|
429
|
+
short *value = (short*)&exif_value[0];
|
|
430
|
+
for(i = 0; i < FreeImage_GetTagCount(tag); i++) {
|
|
431
|
+
value[i] = ReadInt16(msb_order, pval + i * sizeof(short));
|
|
432
|
+
}
|
|
433
|
+
FreeImage_SetTagValue(tag, value);
|
|
434
|
+
break;
|
|
435
|
+
}
|
|
436
|
+
case FIDT_LONG:
|
|
437
|
+
{
|
|
438
|
+
DWORD *value = (DWORD*)&exif_value[0];
|
|
439
|
+
for(i = 0; i < FreeImage_GetTagCount(tag); i++) {
|
|
440
|
+
value[i] = ReadUint32(msb_order, pval + i * sizeof(DWORD));
|
|
441
|
+
}
|
|
442
|
+
FreeImage_SetTagValue(tag, value);
|
|
443
|
+
break;
|
|
444
|
+
}
|
|
445
|
+
case FIDT_SLONG:
|
|
446
|
+
{
|
|
447
|
+
LONG *value = (LONG*)&exif_value[0];
|
|
448
|
+
for(i = 0; i < FreeImage_GetTagCount(tag); i++) {
|
|
449
|
+
value[i] = ReadInt32(msb_order, pval + i * sizeof(LONG));
|
|
450
|
+
}
|
|
451
|
+
FreeImage_SetTagValue(tag, value);
|
|
452
|
+
break;
|
|
453
|
+
}
|
|
454
|
+
case FIDT_RATIONAL:
|
|
455
|
+
{
|
|
456
|
+
n = sizeof(DWORD);
|
|
457
|
+
|
|
458
|
+
DWORD *value = (DWORD*)&exif_value[0];
|
|
459
|
+
for(i = 0; i < 2 * FreeImage_GetTagCount(tag); i++) {
|
|
460
|
+
// read a sequence of (numerator, denominator)
|
|
461
|
+
value[i] = ReadUint32(msb_order, n*i + (char*)pval);
|
|
462
|
+
}
|
|
463
|
+
FreeImage_SetTagValue(tag, value);
|
|
464
|
+
break;
|
|
465
|
+
}
|
|
466
|
+
case FIDT_SRATIONAL:
|
|
467
|
+
{
|
|
468
|
+
n = sizeof(LONG);
|
|
469
|
+
|
|
470
|
+
LONG *value = (LONG*)&exif_value[0];
|
|
471
|
+
for(i = 0; i < 2 * FreeImage_GetTagCount(tag); i++) {
|
|
472
|
+
// read a sequence of (numerator, denominator)
|
|
473
|
+
value[i] = ReadInt32(msb_order, n*i + (char*)pval);
|
|
474
|
+
}
|
|
475
|
+
FreeImage_SetTagValue(tag, value);
|
|
476
|
+
break;
|
|
477
|
+
}
|
|
478
|
+
case FIDT_BYTE:
|
|
479
|
+
case FIDT_ASCII:
|
|
480
|
+
case FIDT_SBYTE:
|
|
481
|
+
case FIDT_UNDEFINED:
|
|
482
|
+
case FIDT_FLOAT:
|
|
483
|
+
case FIDT_DOUBLE:
|
|
484
|
+
default:
|
|
485
|
+
FreeImage_SetTagValue(tag, pval);
|
|
486
|
+
break;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
if(md_model == TagLib::EXIF_MAKERNOTE_CANON) {
|
|
490
|
+
// A single Canon tag can have multiple values within
|
|
491
|
+
processCanonMakerNoteTag(dib, tag);
|
|
492
|
+
}
|
|
493
|
+
else {
|
|
494
|
+
TagLib& s = TagLib::instance();
|
|
495
|
+
|
|
496
|
+
WORD tag_id = FreeImage_GetTagID(tag);
|
|
497
|
+
|
|
498
|
+
// get the tag key and description
|
|
499
|
+
const char *key = s.getTagFieldName(md_model, tag_id, defaultKey);
|
|
500
|
+
FreeImage_SetTagKey(tag, key);
|
|
501
|
+
const char *description = s.getTagDescription(md_model, tag_id);
|
|
502
|
+
FreeImage_SetTagDescription(tag, description);
|
|
503
|
+
|
|
504
|
+
// store the tag
|
|
505
|
+
if(key) {
|
|
506
|
+
FreeImage_SetMetadata(s.getFreeImageModel(md_model), dib, key, tag);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
|
|
511
|
+
// free the temporary buffer
|
|
512
|
+
free(exif_value);
|
|
513
|
+
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
/**
|
|
517
|
+
Process Exif directory
|
|
518
|
+
|
|
519
|
+
@param dib Input FIBITMAP
|
|
520
|
+
@param tiffp Pointer to the TIFF header
|
|
521
|
+
@param dwOffsetIfd0 Offset to the 0th IFD (first IFD)
|
|
522
|
+
@param dwLength Length of the Exif file
|
|
523
|
+
@param dwProfileOffset File offset to be used when reading 'offset/value' tags
|
|
524
|
+
@param msb_order Endianness order of the Exif file (TRUE if big-endian, FALSE if little-endian)
|
|
525
|
+
@param starting_md_model Metadata model of the IFD (should be TagLib::EXIF_MAIN for a jpeg)
|
|
526
|
+
@return Returns TRUE if sucessful, returns FALSE otherwise
|
|
527
|
+
*/
|
|
528
|
+
static BOOL
|
|
529
|
+
jpeg_read_exif_dir(FIBITMAP *dib, const BYTE *tiffp, DWORD dwOffsetIfd0, DWORD dwLength, DWORD dwProfileOffset, BOOL msb_order, TagLib::MDMODEL starting_md_model) {
|
|
530
|
+
WORD de, nde;
|
|
531
|
+
|
|
532
|
+
std::stack<WORD> destack; // directory entries stack
|
|
533
|
+
std::stack<const BYTE*> ifdstack; // IFD stack
|
|
534
|
+
std::stack<TagLib::MDMODEL> modelstack; // metadata model stack
|
|
535
|
+
|
|
536
|
+
// Keep a list of already visited IFD to avoid stack overflows
|
|
537
|
+
// when recursive/cyclic directory structures exist.
|
|
538
|
+
// This kind of recursive Exif file was encountered with Kodak images coming from
|
|
539
|
+
// KODAK PROFESSIONAL DCS Photo Desk JPEG Export v3.2 W
|
|
540
|
+
std::map<DWORD, int> visitedIFD;
|
|
541
|
+
|
|
542
|
+
/*
|
|
543
|
+
"An Image File Directory (IFD) consists of a 2-byte count of the number of directory
|
|
544
|
+
entries (i.e. the number of fields), followed by a sequence of 12-byte field
|
|
545
|
+
entries, followed by a 4-byte offset of the next IFD (or 0 if none)."
|
|
546
|
+
The "next IFD" (1st IFD) is the thumbnail.
|
|
547
|
+
*/
|
|
548
|
+
#define DIR_ENTRY_ADDR(_start, _entry) (_start + 2 + (12 * _entry))
|
|
549
|
+
|
|
550
|
+
// set the metadata model to Exif
|
|
551
|
+
|
|
552
|
+
TagLib::MDMODEL md_model = starting_md_model;
|
|
553
|
+
|
|
554
|
+
// set the pointer to the first IFD (0th IFD) and follow it were it leads.
|
|
555
|
+
|
|
556
|
+
const BYTE *ifd0th = (BYTE*)tiffp + (size_t)dwOffsetIfd0;
|
|
557
|
+
|
|
558
|
+
const BYTE *ifdp = ifd0th;
|
|
559
|
+
|
|
560
|
+
de = 0;
|
|
561
|
+
|
|
562
|
+
do {
|
|
563
|
+
// if there is anything on the stack then pop it off
|
|
564
|
+
if(!destack.empty()) {
|
|
565
|
+
ifdp = ifdstack.top(); ifdstack.pop();
|
|
566
|
+
de = destack.top(); destack.pop();
|
|
567
|
+
md_model = modelstack.top(); modelstack.pop();
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
// remember that we've visited this directory and entry so that we don't visit it again later
|
|
571
|
+
DWORD visited = (DWORD)( (((size_t)ifdp & 0xFFFF) << 16) | (size_t)de );
|
|
572
|
+
if(visitedIFD.find(visited) != visitedIFD.end()) {
|
|
573
|
+
continue;
|
|
574
|
+
} else {
|
|
575
|
+
visitedIFD[visited] = 1; // processed
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
// determine how many entries there are in the current IFD
|
|
579
|
+
nde = ReadUint16(msb_order, ifdp);
|
|
580
|
+
if (((size_t)(ifdp - tiffp) + 12 * nde) > (size_t)dwLength) {
|
|
581
|
+
// suspicious IFD offset, ignore
|
|
582
|
+
continue;
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
for(; de < nde; de++) {
|
|
586
|
+
char *pde = NULL; // pointer to the directory entry
|
|
587
|
+
char *pval = NULL; // pointer to the tag value
|
|
588
|
+
|
|
589
|
+
// create a tag
|
|
590
|
+
FITAG *tag = FreeImage_CreateTag();
|
|
591
|
+
if(!tag) return FALSE;
|
|
592
|
+
|
|
593
|
+
// point to the directory entry
|
|
594
|
+
pde = (char*) DIR_ENTRY_ADDR(ifdp, de);
|
|
595
|
+
|
|
596
|
+
// get the tag ID
|
|
597
|
+
WORD tag_id = ReadUint16(msb_order, pde);
|
|
598
|
+
FreeImage_SetTagID(tag, tag_id);
|
|
599
|
+
|
|
600
|
+
// get the tag type
|
|
601
|
+
WORD tag_type = (WORD)ReadUint16(msb_order, pde + 2);
|
|
602
|
+
if((tag_type - 1) >= EXIF_NUM_FORMATS) {
|
|
603
|
+
// a problem occured : delete the tag (not free'd after)
|
|
604
|
+
FreeImage_DeleteTag(tag);
|
|
605
|
+
// break out of the for loop
|
|
606
|
+
break;
|
|
607
|
+
}
|
|
608
|
+
FreeImage_SetTagType(tag, (FREE_IMAGE_MDTYPE)tag_type);
|
|
609
|
+
|
|
610
|
+
// get number of components
|
|
611
|
+
DWORD tag_count = ReadUint32(msb_order, pde + 4);
|
|
612
|
+
FreeImage_SetTagCount(tag, tag_count);
|
|
613
|
+
|
|
614
|
+
// check that tag length (size of the tag value in bytes) will fit in a DWORD
|
|
615
|
+
unsigned tag_data_width = FreeImage_TagDataWidth(FreeImage_GetTagType(tag));
|
|
616
|
+
if (tag_data_width != 0 && FreeImage_GetTagCount(tag) > ~(DWORD)0 / tag_data_width) {
|
|
617
|
+
FreeImage_DeleteTag(tag);
|
|
618
|
+
// jump to next entry
|
|
619
|
+
continue;
|
|
620
|
+
}
|
|
621
|
+
FreeImage_SetTagLength(tag, FreeImage_GetTagCount(tag) * tag_data_width);
|
|
622
|
+
|
|
623
|
+
if(FreeImage_GetTagLength(tag) <= 4) {
|
|
624
|
+
// 4 bytes or less and value is in the dir entry itself
|
|
625
|
+
pval = pde + 8;
|
|
626
|
+
} else {
|
|
627
|
+
// if its bigger than 4 bytes, the directory entry contains an offset
|
|
628
|
+
DWORD offset_value = ReadUint32(msb_order, pde + 8);
|
|
629
|
+
// the offset can be relative to tiffp or to an external reference (see JPEG-XR)
|
|
630
|
+
if(dwProfileOffset) {
|
|
631
|
+
offset_value -= dwProfileOffset;
|
|
632
|
+
}
|
|
633
|
+
// first check if offset exceeds buffer, at this stage FreeImage_GetTagLength may return invalid data
|
|
634
|
+
if(offset_value > dwLength) {
|
|
635
|
+
// a problem occured : delete the tag (not free'd after)
|
|
636
|
+
FreeImage_DeleteTag(tag);
|
|
637
|
+
// jump to next entry
|
|
638
|
+
continue;
|
|
639
|
+
}
|
|
640
|
+
// now check that length does not exceed the buffer size
|
|
641
|
+
if(FreeImage_GetTagLength(tag) > dwLength - offset_value){
|
|
642
|
+
// a problem occured : delete the tag (not free'd after)
|
|
643
|
+
FreeImage_DeleteTag(tag);
|
|
644
|
+
// jump to next entry
|
|
645
|
+
continue;
|
|
646
|
+
}
|
|
647
|
+
pval = (char*)(tiffp + offset_value);
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
// check for a IFD offset
|
|
651
|
+
BOOL isIFDOffset = FALSE;
|
|
652
|
+
switch(FreeImage_GetTagID(tag)) {
|
|
653
|
+
case TAG_EXIF_OFFSET:
|
|
654
|
+
case TAG_GPS_OFFSET:
|
|
655
|
+
case TAG_INTEROP_OFFSET:
|
|
656
|
+
case TAG_MAKER_NOTE:
|
|
657
|
+
isIFDOffset = TRUE;
|
|
658
|
+
break;
|
|
659
|
+
}
|
|
660
|
+
if(isIFDOffset) {
|
|
661
|
+
DWORD sub_offset = 0;
|
|
662
|
+
TagLib::MDMODEL next_mdmodel = md_model;
|
|
663
|
+
const BYTE *next_ifd = ifdp;
|
|
664
|
+
|
|
665
|
+
// get offset and metadata model
|
|
666
|
+
if (FreeImage_GetTagID(tag) == TAG_MAKER_NOTE) {
|
|
667
|
+
processMakerNote(dib, pval, msb_order, &sub_offset, &next_mdmodel);
|
|
668
|
+
next_ifd = (BYTE*)pval + sub_offset;
|
|
669
|
+
} else {
|
|
670
|
+
processIFDOffset(tag, pval, msb_order, &sub_offset, &next_mdmodel);
|
|
671
|
+
next_ifd = (BYTE*)tiffp + sub_offset;
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
if((sub_offset < dwLength) && (next_mdmodel != TagLib::UNKNOWN)) {
|
|
675
|
+
// push our current directory state onto the stack
|
|
676
|
+
ifdstack.push(ifdp);
|
|
677
|
+
// jump to the next entry
|
|
678
|
+
de++;
|
|
679
|
+
destack.push(de);
|
|
680
|
+
|
|
681
|
+
// push our current metadata model
|
|
682
|
+
modelstack.push(md_model);
|
|
683
|
+
|
|
684
|
+
// push new state onto of stack to cause a jump
|
|
685
|
+
ifdstack.push(next_ifd);
|
|
686
|
+
destack.push(0);
|
|
687
|
+
|
|
688
|
+
// select a new metadata model
|
|
689
|
+
modelstack.push(next_mdmodel);
|
|
690
|
+
|
|
691
|
+
// delete the tag as it won't be stored nor deleted in the for() loop
|
|
692
|
+
FreeImage_DeleteTag(tag);
|
|
693
|
+
|
|
694
|
+
break; // break out of the for loop
|
|
695
|
+
}
|
|
696
|
+
else {
|
|
697
|
+
// unsupported camera model, canon maker tag or something unknown
|
|
698
|
+
// process as a standard tag
|
|
699
|
+
processExifTag(dib, tag, pval, msb_order, md_model);
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
} else {
|
|
703
|
+
// process as a standard tag
|
|
704
|
+
processExifTag(dib, tag, pval, msb_order, md_model);
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
// delete the tag
|
|
708
|
+
FreeImage_DeleteTag(tag);
|
|
709
|
+
|
|
710
|
+
} // for(nde)
|
|
711
|
+
|
|
712
|
+
// additional thumbnail data is skipped
|
|
713
|
+
|
|
714
|
+
} while (!destack.empty());
|
|
715
|
+
|
|
716
|
+
//
|
|
717
|
+
// --- handle thumbnail data ---
|
|
718
|
+
//
|
|
719
|
+
|
|
720
|
+
const WORD entriesCount0th = ReadUint16(msb_order, ifd0th);
|
|
721
|
+
|
|
722
|
+
DWORD next_offset = ReadUint32(msb_order, DIR_ENTRY_ADDR(ifd0th, entriesCount0th));
|
|
723
|
+
if((next_offset == 0) || (next_offset >= dwLength)) {
|
|
724
|
+
return TRUE; //< no thumbnail
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
const BYTE* const ifd1st = (BYTE*)tiffp + next_offset;
|
|
728
|
+
const WORD entriesCount1st = ReadUint16(msb_order, ifd1st);
|
|
729
|
+
|
|
730
|
+
unsigned thCompression = 0;
|
|
731
|
+
unsigned thOffset = 0;
|
|
732
|
+
unsigned thSize = 0;
|
|
733
|
+
|
|
734
|
+
for(int e = 0; e < entriesCount1st; e++) {
|
|
735
|
+
|
|
736
|
+
// point to the directory entry
|
|
737
|
+
const BYTE* base = DIR_ENTRY_ADDR(ifd1st, e);
|
|
738
|
+
|
|
739
|
+
// check for buffer overflow
|
|
740
|
+
const size_t remaining = (size_t)base + 12 - (size_t)tiffp;
|
|
741
|
+
if(remaining >= dwLength) {
|
|
742
|
+
// bad IFD1 directory, ignore it
|
|
743
|
+
return FALSE;
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
// get the tag ID
|
|
747
|
+
WORD tag = ReadUint16(msb_order, base);
|
|
748
|
+
// get the tag type
|
|
749
|
+
/*WORD type = */ReadUint16(msb_order, base + sizeof(WORD));
|
|
750
|
+
// get number of components
|
|
751
|
+
/*DWORD count = */ReadUint32(msb_order, base + sizeof(WORD) + sizeof(WORD));
|
|
752
|
+
// get the tag value
|
|
753
|
+
DWORD offset = ReadUint32(msb_order, base + sizeof(WORD) + sizeof(WORD) + sizeof(DWORD));
|
|
754
|
+
|
|
755
|
+
switch(tag) {
|
|
756
|
+
case TAG_COMPRESSION:
|
|
757
|
+
// Tiff Compression Tag (should be COMPRESSION_OJPEG (6), but is not always respected)
|
|
758
|
+
thCompression = offset;
|
|
759
|
+
break;
|
|
760
|
+
case TAG_JPEG_INTERCHANGE_FORMAT:
|
|
761
|
+
// Tiff JPEGInterchangeFormat Tag
|
|
762
|
+
thOffset = offset;
|
|
763
|
+
break;
|
|
764
|
+
case TAG_JPEG_INTERCHANGE_FORMAT_LENGTH:
|
|
765
|
+
// Tiff JPEGInterchangeFormatLength Tag
|
|
766
|
+
thSize = offset;
|
|
767
|
+
break;
|
|
768
|
+
// ### X and Y Resolution ignored, orientation ignored
|
|
769
|
+
case TAG_X_RESOLUTION: // XResolution
|
|
770
|
+
case TAG_Y_RESOLUTION: // YResolution
|
|
771
|
+
case TAG_RESOLUTION_UNIT: // ResolutionUnit
|
|
772
|
+
case TAG_ORIENTATION: // Orientation
|
|
773
|
+
break;
|
|
774
|
+
default:
|
|
775
|
+
break;
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
if(/*thCompression != 6 ||*/ thOffset == 0 || thSize == 0) {
|
|
780
|
+
return TRUE;
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
if(thOffset + thSize > dwLength) {
|
|
784
|
+
return TRUE;
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
// load the thumbnail
|
|
788
|
+
|
|
789
|
+
const BYTE *thLocation = tiffp + thOffset;
|
|
790
|
+
|
|
791
|
+
FIMEMORY* hmem = FreeImage_OpenMemory(const_cast<BYTE*>(thLocation), thSize);
|
|
792
|
+
FIBITMAP* thumbnail = FreeImage_LoadFromMemory(FIF_JPEG, hmem);
|
|
793
|
+
FreeImage_CloseMemory(hmem);
|
|
794
|
+
|
|
795
|
+
// store the thumbnail
|
|
796
|
+
FreeImage_SetThumbnail(dib, thumbnail);
|
|
797
|
+
// then delete it
|
|
798
|
+
FreeImage_Unload(thumbnail);
|
|
799
|
+
|
|
800
|
+
return TRUE;
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
// --------------------------------------------------------------------------
|
|
804
|
+
|
|
805
|
+
/**
|
|
806
|
+
Read and decode JPEG_APP1 marker (Exif profile)
|
|
807
|
+
@param dib Input FIBITMAP
|
|
808
|
+
@param data Pointer to the APP1 marker
|
|
809
|
+
@param length APP1 marker length
|
|
810
|
+
@return Returns TRUE if successful, FALSE otherwise
|
|
811
|
+
*/
|
|
812
|
+
BOOL
|
|
813
|
+
jpeg_read_exif_profile(FIBITMAP *dib, const BYTE *data, unsigned length) {
|
|
814
|
+
// marker identifying string for Exif = "Exif\0\0"
|
|
815
|
+
BYTE exif_signature[6] = { 0x45, 0x78, 0x69, 0x66, 0x00, 0x00 };
|
|
816
|
+
BYTE lsb_first[4] = { 0x49, 0x49, 0x2A, 0x00 }; // Classic TIFF signature - little-endian order
|
|
817
|
+
BYTE msb_first[4] = { 0x4D, 0x4D, 0x00, 0x2A }; // Classic TIFF signature - big-endian order
|
|
818
|
+
|
|
819
|
+
// profile size is up to 32-bit
|
|
820
|
+
DWORD dwProfileLength = (DWORD)length;
|
|
821
|
+
BYTE *pbProfile = (BYTE*)data;
|
|
822
|
+
|
|
823
|
+
// verify the identifying string
|
|
824
|
+
if(memcmp(exif_signature, pbProfile, sizeof(exif_signature)) == 0) {
|
|
825
|
+
// This is an Exif profile
|
|
826
|
+
// should contain a TIFF header with up to 2 IFDs (IFD stands for 'Image File Directory')
|
|
827
|
+
// 0th IFD : the image attributes, 1st IFD : may be used for thumbnail
|
|
828
|
+
|
|
829
|
+
pbProfile += sizeof(exif_signature);
|
|
830
|
+
dwProfileLength -= sizeof(exif_signature);
|
|
831
|
+
|
|
832
|
+
// read the TIFF header (8 bytes)
|
|
833
|
+
|
|
834
|
+
// check the endianess order
|
|
835
|
+
|
|
836
|
+
BOOL bBigEndian = TRUE;
|
|
837
|
+
|
|
838
|
+
if(memcmp(pbProfile, lsb_first, sizeof(lsb_first)) == 0) {
|
|
839
|
+
// Exif section is in little-endian order
|
|
840
|
+
bBigEndian = FALSE;
|
|
841
|
+
} else {
|
|
842
|
+
if(memcmp(pbProfile, msb_first, sizeof(msb_first)) == 0) {
|
|
843
|
+
// Exif section is in big-endian order
|
|
844
|
+
bBigEndian = TRUE;
|
|
845
|
+
} else {
|
|
846
|
+
// Invalid Exif alignment marker
|
|
847
|
+
return FALSE;
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
// this is the offset to the first IFD (Image File Directory)
|
|
852
|
+
DWORD dwFirstOffset = ReadUint32(bBigEndian, pbProfile + 4);
|
|
853
|
+
if (dwFirstOffset > dwProfileLength) {
|
|
854
|
+
// bad Exif data
|
|
855
|
+
return FALSE;
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
/*
|
|
859
|
+
Note: as FreeImage 3.14.0, this test is no longer needed for images with similar suspicious offset
|
|
860
|
+
=> tested with Pentax Optio 230, FujiFilm SP-2500 and Canon EOS 300D
|
|
861
|
+
if (dwFirstOffset < 8 || dwFirstOffset > 16) {
|
|
862
|
+
// This is usually set to 8
|
|
863
|
+
// but PENTAX Optio 230 has it set differently, and uses it as offset.
|
|
864
|
+
FreeImage_OutputMessageProc(FIF_JPEG, "Exif: Suspicious offset of first IFD value");
|
|
865
|
+
return FALSE;
|
|
866
|
+
}
|
|
867
|
+
*/
|
|
868
|
+
|
|
869
|
+
// process Exif directories, starting with Exif-TIFF IFD
|
|
870
|
+
return jpeg_read_exif_dir(dib, pbProfile, dwFirstOffset, dwProfileLength, 0, bBigEndian, TagLib::EXIF_MAIN);
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
return FALSE;
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
// ==========================================================
|
|
877
|
+
// Exif JPEG helper routines
|
|
878
|
+
// ==========================================================
|
|
879
|
+
|
|
880
|
+
/**
|
|
881
|
+
Read JPEG_APP1 marker (Exif profile)
|
|
882
|
+
@param dib Input FIBITMAP
|
|
883
|
+
@param dataptr Pointer to the APP1 marker
|
|
884
|
+
@param datalen APP1 marker length
|
|
885
|
+
@return Returns TRUE if successful, FALSE otherwise
|
|
886
|
+
*/
|
|
887
|
+
BOOL
|
|
888
|
+
jpeg_read_exif_profile_raw(FIBITMAP *dib, const BYTE *profile, unsigned length) {
|
|
889
|
+
// marker identifying string for Exif = "Exif\0\0"
|
|
890
|
+
BYTE exif_signature[6] = { 0x45, 0x78, 0x69, 0x66, 0x00, 0x00 };
|
|
891
|
+
|
|
892
|
+
// verify the identifying string
|
|
893
|
+
if(memcmp(exif_signature, profile, sizeof(exif_signature)) != 0) {
|
|
894
|
+
// not an Exif profile
|
|
895
|
+
return FALSE;
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
// create a tag
|
|
899
|
+
FITAG *tag = FreeImage_CreateTag();
|
|
900
|
+
if(tag) {
|
|
901
|
+
FreeImage_SetTagKey(tag, g_TagLib_ExifRawFieldName);
|
|
902
|
+
FreeImage_SetTagLength(tag, (DWORD)length);
|
|
903
|
+
FreeImage_SetTagCount(tag, (DWORD)length);
|
|
904
|
+
FreeImage_SetTagType(tag, FIDT_BYTE);
|
|
905
|
+
FreeImage_SetTagValue(tag, profile);
|
|
906
|
+
|
|
907
|
+
// store the tag
|
|
908
|
+
FreeImage_SetMetadata(FIMD_EXIF_RAW, dib, FreeImage_GetTagKey(tag), tag);
|
|
909
|
+
|
|
910
|
+
// destroy the tag
|
|
911
|
+
FreeImage_DeleteTag(tag);
|
|
912
|
+
|
|
913
|
+
return TRUE;
|
|
914
|
+
}
|
|
915
|
+
|
|
916
|
+
return FALSE;
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
// ==========================================================
|
|
920
|
+
// Exif JPEG-XR helper routines
|
|
921
|
+
// ==========================================================
|
|
922
|
+
|
|
923
|
+
/**
|
|
924
|
+
Read and decode JPEG-XR Exif IFD
|
|
925
|
+
@param dib Input FIBITMAP
|
|
926
|
+
@param profile Pointer to the Exif marker
|
|
927
|
+
@param length Exif marker length
|
|
928
|
+
@param file_offset Reference offset in the original file of each tag value whose length is > 4
|
|
929
|
+
@return Returns TRUE if successful, FALSE otherwise
|
|
930
|
+
*/
|
|
931
|
+
BOOL
|
|
932
|
+
jpegxr_read_exif_profile(FIBITMAP *dib, const BYTE *profile, unsigned length, unsigned file_offset) {
|
|
933
|
+
// assume Little Endian order
|
|
934
|
+
BOOL bBigEndian = FALSE;
|
|
935
|
+
|
|
936
|
+
// process Exif specific IFD
|
|
937
|
+
return jpeg_read_exif_dir(dib, profile, 0, length, file_offset, bBigEndian, TagLib::EXIF_EXIF);
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
/**
|
|
941
|
+
Read and decode JPEG-XR Exif-GPS IFD
|
|
942
|
+
@param dib Input FIBITMAP
|
|
943
|
+
@param profile Pointer to the Exif-GPS profile
|
|
944
|
+
@param length Exif-GPS profile length
|
|
945
|
+
@param file_offset Reference offset in the original file of each tag value whose length is > 4
|
|
946
|
+
@return Returns TRUE if successful, FALSE otherwise
|
|
947
|
+
*/
|
|
948
|
+
BOOL
|
|
949
|
+
jpegxr_read_exif_gps_profile(FIBITMAP *dib, const BYTE *profile, unsigned length, unsigned file_offset) {
|
|
950
|
+
// assume Little Endian order
|
|
951
|
+
BOOL bBigEndian = FALSE;
|
|
952
|
+
|
|
953
|
+
// process Exif GPS IFD
|
|
954
|
+
return jpeg_read_exif_dir(dib, profile, 0, length, file_offset, bBigEndian, TagLib::EXIF_GPS);
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
// ==========================================================
|
|
958
|
+
// Exif common helper routines
|
|
959
|
+
// ==========================================================
|
|
960
|
+
|
|
961
|
+
/**
|
|
962
|
+
Rotate a dib according to Exif info
|
|
963
|
+
@param dib Input / Output dib to rotate
|
|
964
|
+
@see PluginJPEG.cpp
|
|
965
|
+
*/
|
|
966
|
+
void
|
|
967
|
+
RotateExif(FIBITMAP **dib) {
|
|
968
|
+
// check for Exif rotation
|
|
969
|
+
if(FreeImage_GetMetadataCount(FIMD_EXIF_MAIN, *dib)) {
|
|
970
|
+
FIBITMAP *rotated = NULL;
|
|
971
|
+
// process Exif rotation
|
|
972
|
+
FITAG *tag = NULL;
|
|
973
|
+
FreeImage_GetMetadata(FIMD_EXIF_MAIN, *dib, "Orientation", &tag);
|
|
974
|
+
if((tag != NULL) && (FreeImage_GetTagID(tag) == TAG_ORIENTATION)) {
|
|
975
|
+
const WORD orientation = *((WORD *)FreeImage_GetTagValue(tag));
|
|
976
|
+
switch (orientation) {
|
|
977
|
+
case 1: // "top, left side" => 0�
|
|
978
|
+
break;
|
|
979
|
+
case 2: // "top, right side" => flip left-right
|
|
980
|
+
FreeImage_FlipHorizontal(*dib);
|
|
981
|
+
break;
|
|
982
|
+
case 3: // "bottom, right side" => -180�
|
|
983
|
+
rotated = FreeImage_Rotate(*dib, 180);
|
|
984
|
+
FreeImage_Unload(*dib);
|
|
985
|
+
*dib = rotated;
|
|
986
|
+
break;
|
|
987
|
+
case 4: // "bottom, left side" => flip up-down
|
|
988
|
+
FreeImage_FlipVertical(*dib);
|
|
989
|
+
break;
|
|
990
|
+
case 5: // "left side, top" => +90� + flip up-down
|
|
991
|
+
rotated = FreeImage_Rotate(*dib, 90);
|
|
992
|
+
FreeImage_Unload(*dib);
|
|
993
|
+
*dib = rotated;
|
|
994
|
+
FreeImage_FlipVertical(*dib);
|
|
995
|
+
break;
|
|
996
|
+
case 6: // "right side, top" => -90�
|
|
997
|
+
rotated = FreeImage_Rotate(*dib, -90);
|
|
998
|
+
FreeImage_Unload(*dib);
|
|
999
|
+
*dib = rotated;
|
|
1000
|
+
break;
|
|
1001
|
+
case 7: // "right side, bottom" => -90� + flip up-down
|
|
1002
|
+
rotated = FreeImage_Rotate(*dib, -90);
|
|
1003
|
+
FreeImage_Unload(*dib);
|
|
1004
|
+
*dib = rotated;
|
|
1005
|
+
FreeImage_FlipVertical(*dib);
|
|
1006
|
+
break;
|
|
1007
|
+
case 8: // "left side, bottom" => +90�
|
|
1008
|
+
rotated = FreeImage_Rotate(*dib, 90);
|
|
1009
|
+
FreeImage_Unload(*dib);
|
|
1010
|
+
*dib = rotated;
|
|
1011
|
+
break;
|
|
1012
|
+
default:
|
|
1013
|
+
break;
|
|
1014
|
+
}
|
|
1015
|
+
}
|
|
1016
|
+
}
|
|
1017
|
+
}
|
|
1018
|
+
|
|
1019
|
+
// ==========================================================
|
|
1020
|
+
// Exif TIFF JPEG-XR helper routines
|
|
1021
|
+
// ==========================================================
|
|
1022
|
+
|
|
1023
|
+
class PredicateTagIDCompare {
|
|
1024
|
+
public:
|
|
1025
|
+
bool operator()(FITAG *a, FITAG *b) {
|
|
1026
|
+
WORD tag_id_a = FreeImage_GetTagID(a);
|
|
1027
|
+
WORD tag_id_b = FreeImage_GetTagID(b);
|
|
1028
|
+
return (tag_id_a < tag_id_b);
|
|
1029
|
+
}
|
|
1030
|
+
};
|
|
1031
|
+
|
|
1032
|
+
/**
|
|
1033
|
+
Write a metadata model as a TIF IFD to a FIMEMORY handle.
|
|
1034
|
+
The entries in the TIF IFD are sorted in ascending order by tag id.
|
|
1035
|
+
The last entry is written as 0 (4 bytes) which means no more IFD to follow.
|
|
1036
|
+
Supported metadata models are
|
|
1037
|
+
<ul>
|
|
1038
|
+
<li>FIMD_EXIF_MAIN
|
|
1039
|
+
<li>FIMD_EXIF_EXIF
|
|
1040
|
+
<li>FIMD_EXIF_GPS
|
|
1041
|
+
<li>FIMD_EXIF_INTEROP
|
|
1042
|
+
</ul>
|
|
1043
|
+
The end of the buffer is filled with 4 bytes equal to 0 (end of IFD offset)
|
|
1044
|
+
|
|
1045
|
+
@param dib Input FIBITMAP
|
|
1046
|
+
@param md_model Metadata model to write
|
|
1047
|
+
@param hmem Memory handle
|
|
1048
|
+
@return Returns TRUE if successful, FALSE otherwise
|
|
1049
|
+
@see tiff_get_ifd_profile
|
|
1050
|
+
*/
|
|
1051
|
+
static BOOL
|
|
1052
|
+
tiff_write_ifd(FIBITMAP *dib, FREE_IMAGE_MDMODEL md_model, FIMEMORY *hmem) {
|
|
1053
|
+
FITAG *tag = NULL;
|
|
1054
|
+
FIMETADATA *mdhandle = NULL;
|
|
1055
|
+
std::vector<FITAG*> vTagList;
|
|
1056
|
+
TagLib::MDMODEL internal_md_model;
|
|
1057
|
+
|
|
1058
|
+
DWORD ifd_offset = 0; // WORD-aligned IFD value offset
|
|
1059
|
+
|
|
1060
|
+
const BYTE empty_byte = 0;
|
|
1061
|
+
|
|
1062
|
+
// start of the file
|
|
1063
|
+
const long start_of_file = FreeImage_TellMemory(hmem);
|
|
1064
|
+
|
|
1065
|
+
// get the metadata count
|
|
1066
|
+
unsigned metadata_count = FreeImage_GetMetadataCount(md_model, dib);
|
|
1067
|
+
if(metadata_count == 0) {
|
|
1068
|
+
return FALSE;
|
|
1069
|
+
}
|
|
1070
|
+
|
|
1071
|
+
TagLib& s = TagLib::instance();
|
|
1072
|
+
|
|
1073
|
+
// check for supported metadata models
|
|
1074
|
+
switch(md_model) {
|
|
1075
|
+
case FIMD_EXIF_MAIN:
|
|
1076
|
+
internal_md_model = TagLib::EXIF_MAIN;
|
|
1077
|
+
break;
|
|
1078
|
+
case FIMD_EXIF_EXIF:
|
|
1079
|
+
internal_md_model = TagLib::EXIF_EXIF;
|
|
1080
|
+
break;
|
|
1081
|
+
case FIMD_EXIF_GPS:
|
|
1082
|
+
internal_md_model = TagLib::EXIF_GPS;
|
|
1083
|
+
break;
|
|
1084
|
+
case FIMD_EXIF_INTEROP:
|
|
1085
|
+
internal_md_model = TagLib::EXIF_INTEROP;
|
|
1086
|
+
break;
|
|
1087
|
+
default:
|
|
1088
|
+
return FALSE;
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
try {
|
|
1092
|
+
// 1) according to the TIFF specifications,
|
|
1093
|
+
// the entries in a TIF IFD must be sorted in ascending order by tag id
|
|
1094
|
+
|
|
1095
|
+
// store the tags into a vector
|
|
1096
|
+
vTagList.reserve(metadata_count);
|
|
1097
|
+
mdhandle = FreeImage_FindFirstMetadata(md_model, dib, &tag);
|
|
1098
|
+
if(mdhandle) {
|
|
1099
|
+
// parse the tags and store them inside vTagList
|
|
1100
|
+
do {
|
|
1101
|
+
// rewrite the tag id using FreeImage internal database
|
|
1102
|
+
// (in case the tag id is wrong or missing)
|
|
1103
|
+
const char *key = FreeImage_GetTagKey(tag);
|
|
1104
|
+
int tag_id = s.getTagID(internal_md_model, key);
|
|
1105
|
+
if(tag_id != -1) {
|
|
1106
|
+
// this is a known tag, set the tag ID
|
|
1107
|
+
FreeImage_SetTagID(tag, (WORD)tag_id);
|
|
1108
|
+
// record the tag
|
|
1109
|
+
vTagList.push_back(tag);
|
|
1110
|
+
}
|
|
1111
|
+
// else ignore this tag
|
|
1112
|
+
} while(FreeImage_FindNextMetadata(mdhandle, &tag));
|
|
1113
|
+
|
|
1114
|
+
FreeImage_FindCloseMetadata(mdhandle);
|
|
1115
|
+
|
|
1116
|
+
// sort the vector by tag id
|
|
1117
|
+
std::sort(vTagList.begin(), vTagList.end(), PredicateTagIDCompare());
|
|
1118
|
+
|
|
1119
|
+
// update the metadata_count
|
|
1120
|
+
metadata_count = (unsigned)vTagList.size();
|
|
1121
|
+
|
|
1122
|
+
} else {
|
|
1123
|
+
throw(1);
|
|
1124
|
+
}
|
|
1125
|
+
|
|
1126
|
+
// 2) prepare the place for each IFD entries.
|
|
1127
|
+
|
|
1128
|
+
/*
|
|
1129
|
+
An Image File Directory (IFD) consists of a 2-byte count of the number of directory entries (i.e., the number of fields),
|
|
1130
|
+
followed by a sequence of 12-byte field entries,
|
|
1131
|
+
followed by a 4-byte offset of the next IFD (or 0 if none). Do not forget to write the 4 bytes of 0 after the last IFD.
|
|
1132
|
+
*/
|
|
1133
|
+
|
|
1134
|
+
{
|
|
1135
|
+
// prepare place for 2 bytes for number of entries + 12 bytes for each entry
|
|
1136
|
+
unsigned ifd_size = 2 + 12 * metadata_count;
|
|
1137
|
+
FreeImage_WriteMemory(&empty_byte, 1, ifd_size, hmem);
|
|
1138
|
+
// record the offset used to write values > 4-bytes
|
|
1139
|
+
ifd_offset = FreeImage_TellMemory(hmem);
|
|
1140
|
+
// rewind
|
|
1141
|
+
FreeImage_SeekMemory(hmem, start_of_file, SEEK_SET);
|
|
1142
|
+
}
|
|
1143
|
+
|
|
1144
|
+
// 3) write each IFD entry in tag id ascending order
|
|
1145
|
+
|
|
1146
|
+
// number of directory entries
|
|
1147
|
+
WORD nde = (WORD)metadata_count;
|
|
1148
|
+
FreeImage_WriteMemory(&nde, 1, 2, hmem);
|
|
1149
|
+
|
|
1150
|
+
// for each entry ...
|
|
1151
|
+
for(unsigned i = 0; i < metadata_count; i++) {
|
|
1152
|
+
FITAG *tag = vTagList[i];
|
|
1153
|
+
// tag id
|
|
1154
|
+
WORD tag_id = FreeImage_GetTagID(tag);
|
|
1155
|
+
FreeImage_WriteMemory(&tag_id, 1, 2, hmem);
|
|
1156
|
+
// tag type (compliant with TIFF specification)
|
|
1157
|
+
WORD tag_type = (WORD)FreeImage_GetTagType(tag);
|
|
1158
|
+
FreeImage_WriteMemory(&tag_type, 1, 2, hmem);
|
|
1159
|
+
// tag count
|
|
1160
|
+
DWORD tag_count = FreeImage_GetTagCount(tag);
|
|
1161
|
+
FreeImage_WriteMemory(&tag_count, 1, 4, hmem);
|
|
1162
|
+
// tag value or offset (results are in BYTE's units)
|
|
1163
|
+
unsigned tag_length = FreeImage_GetTagLength(tag);
|
|
1164
|
+
if(tag_length <= 4) {
|
|
1165
|
+
// 4 bytes or less, write the value (left justified)
|
|
1166
|
+
const BYTE *tag_value = (BYTE*)FreeImage_GetTagValue(tag);
|
|
1167
|
+
FreeImage_WriteMemory(tag_value, 1, tag_length, hmem);
|
|
1168
|
+
for(unsigned k = tag_length; k < 4; k++) {
|
|
1169
|
+
FreeImage_WriteMemory(&empty_byte, 1, 1, hmem);
|
|
1170
|
+
}
|
|
1171
|
+
} else {
|
|
1172
|
+
// write an offset
|
|
1173
|
+
FreeImage_WriteMemory(&ifd_offset, 1, 4, hmem);
|
|
1174
|
+
// write the value
|
|
1175
|
+
long current_position = FreeImage_TellMemory(hmem);
|
|
1176
|
+
FreeImage_SeekMemory(hmem, ifd_offset, SEEK_SET);
|
|
1177
|
+
FreeImage_WriteMemory(FreeImage_GetTagValue(tag), 1, tag_length, hmem);
|
|
1178
|
+
if(tag_length & 1) {
|
|
1179
|
+
// align to the next WORD boundary
|
|
1180
|
+
FreeImage_WriteMemory(&empty_byte, 1, 1, hmem);
|
|
1181
|
+
}
|
|
1182
|
+
// next offset to use
|
|
1183
|
+
ifd_offset = FreeImage_TellMemory(hmem);
|
|
1184
|
+
// rewind
|
|
1185
|
+
FreeImage_SeekMemory(hmem, current_position, SEEK_SET);
|
|
1186
|
+
}
|
|
1187
|
+
}
|
|
1188
|
+
|
|
1189
|
+
// end-of-IFD or next IFD (0 == none)
|
|
1190
|
+
FreeImage_SeekMemory(hmem, ifd_offset, SEEK_SET);
|
|
1191
|
+
FreeImage_WriteMemory(&empty_byte, 1, 4, hmem);
|
|
1192
|
+
|
|
1193
|
+
return TRUE;
|
|
1194
|
+
}
|
|
1195
|
+
catch(int) {
|
|
1196
|
+
return FALSE;
|
|
1197
|
+
}
|
|
1198
|
+
}
|
|
1199
|
+
|
|
1200
|
+
/**
|
|
1201
|
+
Write a metadata model as a TIF IFD, returns the IFD as a buffer.
|
|
1202
|
+
The buffer is allocated by the function and must be freed by the caller, using 'free'.
|
|
1203
|
+
@param dib Input FIBITMAP
|
|
1204
|
+
@param md_model Metadata model to write
|
|
1205
|
+
@param ppbProfile Returned buffer
|
|
1206
|
+
@param uProfileLength Returned buffer size
|
|
1207
|
+
@return Returns TRUE if successful, FALSE otherwise
|
|
1208
|
+
@see tiff_write_ifd
|
|
1209
|
+
*/
|
|
1210
|
+
BOOL
|
|
1211
|
+
tiff_get_ifd_profile(FIBITMAP *dib, FREE_IMAGE_MDMODEL md_model, BYTE **ppbProfile, unsigned *uProfileLength) {
|
|
1212
|
+
FIMEMORY *hmem = NULL;
|
|
1213
|
+
|
|
1214
|
+
try {
|
|
1215
|
+
// open a memory stream
|
|
1216
|
+
hmem = FreeImage_OpenMemory(NULL, 0);
|
|
1217
|
+
if(!hmem) {
|
|
1218
|
+
throw(1);
|
|
1219
|
+
}
|
|
1220
|
+
|
|
1221
|
+
// write the metadata model as a TIF IFD
|
|
1222
|
+
BOOL bResult = tiff_write_ifd(dib, md_model, hmem);
|
|
1223
|
+
|
|
1224
|
+
if(bResult) {
|
|
1225
|
+
BYTE *data = NULL;
|
|
1226
|
+
DWORD size_in_bytes = 0;
|
|
1227
|
+
|
|
1228
|
+
// get a pointer to the stream buffer
|
|
1229
|
+
FreeImage_AcquireMemory(hmem, &data, &size_in_bytes);
|
|
1230
|
+
|
|
1231
|
+
// (re-)allocate output buffer
|
|
1232
|
+
BYTE *pbProfile = *ppbProfile;
|
|
1233
|
+
pbProfile = (BYTE*)realloc(pbProfile, size_in_bytes);
|
|
1234
|
+
if(!pbProfile) {
|
|
1235
|
+
throw(1);
|
|
1236
|
+
} else {
|
|
1237
|
+
// copy IFD
|
|
1238
|
+
memcpy(pbProfile, data, size_in_bytes);
|
|
1239
|
+
*ppbProfile = pbProfile;
|
|
1240
|
+
*uProfileLength = size_in_bytes;
|
|
1241
|
+
}
|
|
1242
|
+
}
|
|
1243
|
+
|
|
1244
|
+
// free the memory stream
|
|
1245
|
+
FreeImage_CloseMemory(hmem);
|
|
1246
|
+
|
|
1247
|
+
return bResult;
|
|
1248
|
+
|
|
1249
|
+
} catch(int) {
|
|
1250
|
+
FreeImage_CloseMemory(hmem);
|
|
1251
|
+
return FALSE;
|
|
1252
|
+
}
|
|
1253
|
+
}
|