summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.qmake.conf2
-rw-r--r--dist/changes-5.12.1024
-rw-r--r--dist/changes-5.14.220
-rw-r--r--dist/changes-5.15.028
-rw-r--r--dist/changes-5.15.120
-rw-r--r--dist/changes-5.15.220
-rw-r--r--src/3rdparty/libtiff.pri5
-rw-r--r--src/3rdparty/libtiff/ChangeLog5219
-rw-r--r--src/3rdparty/libtiff/README61
-rw-r--r--src/3rdparty/libtiff/README.vms12
-rw-r--r--src/3rdparty/libtiff/RELEASE-DATE2
-rw-r--r--src/3rdparty/libtiff/VERSION2
-rw-r--r--src/3rdparty/libtiff/libtiff/SConstruct71
-rw-r--r--src/3rdparty/libtiff/libtiff/libtiff.def24
-rw-r--r--src/3rdparty/libtiff/libtiff/libtiff.map212
-rw-r--r--src/3rdparty/libtiff/libtiff/mkg3states.c504
-rw-r--r--src/3rdparty/libtiff/libtiff/t4.h464
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_aux.c651
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_close.c164
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_codec.c142
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_color.c421
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_compress.c428
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_config.h354
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_config.h-vms46
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_config.h.cmake.in158
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_config.h.in236
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_config.vc.h137
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_config.wince.h69
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_dir.c3538
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_dir.h459
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_dirinfo.c2343
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_dirread.c12509
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_dirwrite.c5587
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_dumpmode.c159
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_error.c148
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_extension.c62
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_fax3.c2775
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_fax3.h872
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_fax3sm.c1
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_flush.c135
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_getimage.c4898
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_hash_set.c603
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_hash_set.h100
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_jbig.c321
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_jpeg.c4202
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_jpeg_12.c90
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_lerc.c1206
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_luv.c2769
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_lzma.c796
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_lzw.c2293
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_next.c301
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_ojpeg.c4842
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_open.c1235
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_packbits.c516
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_pixarlog.c2589
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_predict.c1517
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_predict.h55
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_print.c1365
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_read.c2549
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_stream.cxx650
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_strip.c489
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_swab.c445
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_thunder.c290
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_tile.c415
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_unix.c466
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_version.c29
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_warning.c122
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_webp.c800
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_win32.c641
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_write.c1390
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_zip.c965
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_zstd.c436
-rw-r--r--src/3rdparty/libtiff/libtiff/tiff.h1369
-rw-r--r--src/3rdparty/libtiff/libtiff/tiffconf.h50
-rw-r--r--src/3rdparty/libtiff/libtiff/tiffconf.h.cmake.in (renamed from src/3rdparty/libtiff/libtiff/tiffconf.vc.h)113
-rw-r--r--src/3rdparty/libtiff/libtiff/tiffconf.h.in19
-rw-r--r--src/3rdparty/libtiff/libtiff/tiffconf.wince.h110
-rw-r--r--src/3rdparty/libtiff/libtiff/tiffio.h865
-rw-r--r--src/3rdparty/libtiff/libtiff/tiffio.hxx33
-rw-r--r--src/3rdparty/libtiff/libtiff/tiffiop.h686
-rw-r--r--src/3rdparty/libtiff/libtiff/tiffvers.h25
-rw-r--r--src/3rdparty/libtiff/libtiff/uvcode.h269
-rw-r--r--src/3rdparty/libtiff/port/dummy.c10
-rw-r--r--src/3rdparty/libtiff/port/getopt.c123
-rw-r--r--src/3rdparty/libtiff/port/lfind.c60
-rw-r--r--src/3rdparty/libtiff/port/libport.h67
-rw-r--r--src/3rdparty/libtiff/port/snprintf.c42
-rw-r--r--src/3rdparty/libtiff/port/strcasecmp.c49
-rw-r--r--src/3rdparty/libtiff/port/strtoul.c44
-rw-r--r--src/3rdparty/libtiff/port/strtoull.c44
-rw-r--r--src/3rdparty/libtiff/qt_attribution.json6
-rw-r--r--src/3rdparty/libwebp.pri16
-rw-r--r--src/3rdparty/libwebp/AUTHORS15
-rw-r--r--src/3rdparty/libwebp/ChangeLog521
-rw-r--r--src/3rdparty/libwebp/NEWS65
-rw-r--r--src/3rdparty/libwebp/README30
-rw-r--r--src/3rdparty/libwebp/patches/0001-Fix-Windows-build-for-clang-and-neon.patch38
-rw-r--r--src/3rdparty/libwebp/qt_attribution.json2
-rw-r--r--src/3rdparty/libwebp/sharpyuv/sharpyuv.c526
-rw-r--r--src/3rdparty/libwebp/sharpyuv/sharpyuv.h103
-rw-r--r--src/3rdparty/libwebp/sharpyuv/sharpyuv_cpu.c14
-rw-r--r--src/3rdparty/libwebp/sharpyuv/sharpyuv_cpu.h22
-rw-r--r--src/3rdparty/libwebp/sharpyuv/sharpyuv_csp.c110
-rw-r--r--src/3rdparty/libwebp/sharpyuv/sharpyuv_csp.h60
-rw-r--r--src/3rdparty/libwebp/sharpyuv/sharpyuv_dsp.c103
-rw-r--r--src/3rdparty/libwebp/sharpyuv/sharpyuv_dsp.h28
-rw-r--r--src/3rdparty/libwebp/sharpyuv/sharpyuv_gamma.c113
-rw-r--r--src/3rdparty/libwebp/sharpyuv/sharpyuv_gamma.h35
-rw-r--r--src/3rdparty/libwebp/sharpyuv/sharpyuv_neon.c181
-rw-r--r--src/3rdparty/libwebp/sharpyuv/sharpyuv_sse2.c201
-rw-r--r--src/3rdparty/libwebp/src/dec/alpha_dec.c2
-rw-r--r--src/3rdparty/libwebp/src/dec/buffer_dec.c10
-rw-r--r--src/3rdparty/libwebp/src/dec/frame_dec.c4
-rw-r--r--src/3rdparty/libwebp/src/dec/idec_dec.c11
-rw-r--r--src/3rdparty/libwebp/src/dec/io_dec.c151
-rw-r--r--src/3rdparty/libwebp/src/dec/vp8_dec.c16
-rw-r--r--src/3rdparty/libwebp/src/dec/vp8i_dec.h4
-rw-r--r--src/3rdparty/libwebp/src/dec/vp8l_dec.c43
-rw-r--r--src/3rdparty/libwebp/src/dec/vp8li_dec.h20
-rw-r--r--src/3rdparty/libwebp/src/dec/webp_dec.c19
-rw-r--r--src/3rdparty/libwebp/src/dec/webpi_dec.h4
-rw-r--r--src/3rdparty/libwebp/src/demux/anim_decode.c63
-rw-r--r--src/3rdparty/libwebp/src/demux/demux.c28
-rw-r--r--src/3rdparty/libwebp/src/dsp/alpha_processing.c73
-rw-r--r--src/3rdparty/libwebp/src/dsp/alpha_processing_neon.c27
-rw-r--r--src/3rdparty/libwebp/src/dsp/alpha_processing_sse2.c52
-rw-r--r--src/3rdparty/libwebp/src/dsp/alpha_processing_sse41.c8
-rw-r--r--src/3rdparty/libwebp/src/dsp/cost.c4
-rw-r--r--src/3rdparty/libwebp/src/dsp/cpu.c47
-rw-r--r--src/3rdparty/libwebp/src/dsp/cpu.h259
-rw-r--r--src/3rdparty/libwebp/src/dsp/dec.c6
-rw-r--r--src/3rdparty/libwebp/src/dsp/dec_neon.c73
-rw-r--r--src/3rdparty/libwebp/src/dsp/dec_sse2.c93
-rw-r--r--src/3rdparty/libwebp/src/dsp/dec_sse41.c2
-rw-r--r--src/3rdparty/libwebp/src/dsp/dsp.h264
-rw-r--r--src/3rdparty/libwebp/src/dsp/enc.c6
-rw-r--r--src/3rdparty/libwebp/src/dsp/enc_neon.c11
-rw-r--r--src/3rdparty/libwebp/src/dsp/enc_sse2.c67
-rw-r--r--src/3rdparty/libwebp/src/dsp/filters.c4
-rw-r--r--src/3rdparty/libwebp/src/dsp/filters_sse2.c5
-rw-r--r--src/3rdparty/libwebp/src/dsp/lossless.c119
-rw-r--r--src/3rdparty/libwebp/src/dsp/lossless.h42
-rw-r--r--src/3rdparty/libwebp/src/dsp/lossless_common.h15
-rw-r--r--src/3rdparty/libwebp/src/dsp/lossless_enc.c228
-rw-r--r--src/3rdparty/libwebp/src/dsp/lossless_enc_mips32.c22
-rw-r--r--src/3rdparty/libwebp/src/dsp/lossless_enc_sse2.c146
-rw-r--r--src/3rdparty/libwebp/src/dsp/lossless_enc_sse41.c121
-rw-r--r--src/3rdparty/libwebp/src/dsp/lossless_mips_dsp_r2.c37
-rw-r--r--src/3rdparty/libwebp/src/dsp/lossless_neon.c20
-rw-r--r--src/3rdparty/libwebp/src/dsp/lossless_sse2.c133
-rw-r--r--src/3rdparty/libwebp/src/dsp/lossless_sse41.c133
-rw-r--r--src/3rdparty/libwebp/src/dsp/msa_macro.h5
-rw-r--r--src/3rdparty/libwebp/src/dsp/neon.h7
-rw-r--r--src/3rdparty/libwebp/src/dsp/quant.h13
-rw-r--r--src/3rdparty/libwebp/src/dsp/rescaler.c11
-rw-r--r--src/3rdparty/libwebp/src/dsp/rescaler_sse2.c6
-rw-r--r--src/3rdparty/libwebp/src/dsp/ssim.c2
-rw-r--r--src/3rdparty/libwebp/src/dsp/upsampling.c10
-rw-r--r--src/3rdparty/libwebp/src/dsp/upsampling_msa.c4
-rw-r--r--src/3rdparty/libwebp/src/dsp/upsampling_neon.c14
-rw-r--r--src/3rdparty/libwebp/src/dsp/upsampling_sse2.c2
-rw-r--r--src/3rdparty/libwebp/src/dsp/yuv.c84
-rw-r--r--src/3rdparty/libwebp/src/dsp/yuv.h2
-rw-r--r--src/3rdparty/libwebp/src/dsp/yuv_neon.c108
-rw-r--r--src/3rdparty/libwebp/src/dsp/yuv_sse2.c132
-rw-r--r--src/3rdparty/libwebp/src/dsp/yuv_sse41.c6
-rw-r--r--src/3rdparty/libwebp/src/enc/alpha_enc.c10
-rw-r--r--src/3rdparty/libwebp/src/enc/analysis_enc.c68
-rw-r--r--src/3rdparty/libwebp/src/enc/backward_references_cost_enc.c75
-rw-r--r--src/3rdparty/libwebp/src/enc/backward_references_enc.c251
-rw-r--r--src/3rdparty/libwebp/src/enc/backward_references_enc.h28
-rw-r--r--src/3rdparty/libwebp/src/enc/config_enc.c5
-rw-r--r--src/3rdparty/libwebp/src/enc/frame_enc.c29
-rw-r--r--src/3rdparty/libwebp/src/enc/histogram_enc.c217
-rw-r--r--src/3rdparty/libwebp/src/enc/histogram_enc.h30
-rw-r--r--src/3rdparty/libwebp/src/enc/picture_csp_enc.c525
-rw-r--r--src/3rdparty/libwebp/src/enc/picture_enc.c44
-rw-r--r--src/3rdparty/libwebp/src/enc/picture_rescale_enc.c105
-rw-r--r--src/3rdparty/libwebp/src/enc/picture_tools_enc.c76
-rw-r--r--src/3rdparty/libwebp/src/enc/predictor_enc.c52
-rw-r--r--src/3rdparty/libwebp/src/enc/quant_enc.c120
-rw-r--r--src/3rdparty/libwebp/src/enc/syntax_enc.c2
-rw-r--r--src/3rdparty/libwebp/src/enc/vp8i_enc.h37
-rw-r--r--src/3rdparty/libwebp/src/enc/vp8l_enc.c1081
-rw-r--r--src/3rdparty/libwebp/src/enc/vp8li_enc.h30
-rw-r--r--src/3rdparty/libwebp/src/enc/webp_enc.c6
-rw-r--r--src/3rdparty/libwebp/src/mux/anim_encode.c16
-rw-r--r--src/3rdparty/libwebp/src/mux/muxedit.c3
-rw-r--r--src/3rdparty/libwebp/src/mux/muxi.h4
-rw-r--r--src/3rdparty/libwebp/src/mux/muxinternal.c9
-rw-r--r--src/3rdparty/libwebp/src/mux/muxread.c8
-rw-r--r--src/3rdparty/libwebp/src/utils/bit_reader_inl_utils.h13
-rw-r--r--src/3rdparty/libwebp/src/utils/bit_writer_utils.c4
-rw-r--r--src/3rdparty/libwebp/src/utils/color_cache_utils.c22
-rw-r--r--src/3rdparty/libwebp/src/utils/color_cache_utils.h2
-rw-r--r--src/3rdparty/libwebp/src/utils/huffman_encode_utils.c5
-rw-r--r--src/3rdparty/libwebp/src/utils/huffman_encode_utils.h2
-rw-r--r--src/3rdparty/libwebp/src/utils/huffman_utils.c2
-rw-r--r--src/3rdparty/libwebp/src/utils/quant_levels_dec_utils.c2
-rw-r--r--src/3rdparty/libwebp/src/utils/rescaler_utils.c114
-rw-r--r--src/3rdparty/libwebp/src/utils/rescaler_utils.h13
-rw-r--r--src/3rdparty/libwebp/src/utils/thread_utils.c2
-rw-r--r--src/3rdparty/libwebp/src/utils/utils.c22
-rw-r--r--src/3rdparty/libwebp/src/utils/utils.h40
-rw-r--r--src/3rdparty/libwebp/src/webp/config.h16
-rw-r--r--src/3rdparty/libwebp/src/webp/decode.h9
-rw-r--r--src/3rdparty/libwebp/src/webp/encode.h23
-rw-r--r--src/3rdparty/libwebp/src/webp/format_constants.h2
-rw-r--r--src/3rdparty/libwebp/src/webp/mux.h12
-rw-r--r--src/3rdparty/libwebp/src/webp/mux_types.h10
-rw-r--r--src/3rdparty/libwebp/src/webp/types.h24
-rw-r--r--src/imageformats/configure.json2
-rw-r--r--src/plugins/imageformats/dds/qddshandler.cpp7
-rw-r--r--src/plugins/imageformats/dds/qddshandler.h4
-rw-r--r--src/plugins/imageformats/icns/main.cpp6
-rw-r--r--src/plugins/imageformats/icns/qicnshandler.cpp31
-rw-r--r--src/plugins/imageformats/icns/qicnshandler_p.h4
-rw-r--r--src/plugins/imageformats/jp2/main.cpp6
-rw-r--r--src/plugins/imageformats/jp2/qjp2handler.cpp45
-rw-r--r--src/plugins/imageformats/jp2/qjp2handler_p.h3
-rw-r--r--src/plugins/imageformats/macheif/main.cpp8
-rw-r--r--src/plugins/imageformats/macjp2/main.cpp6
-rw-r--r--src/plugins/imageformats/macjp2/qmacjp2handler.cpp6
-rw-r--r--src/plugins/imageformats/macjp2/qmacjp2handler.h1
-rw-r--r--src/plugins/imageformats/mng/main.cpp6
-rw-r--r--src/plugins/imageformats/mng/qmnghandler.cpp6
-rw-r--r--src/plugins/imageformats/mng/qmnghandler_p.h1
-rw-r--r--src/plugins/imageformats/tga/main.cpp6
-rw-r--r--src/plugins/imageformats/tga/qtgafile.cpp15
-rw-r--r--src/plugins/imageformats/tga/qtgahandler.cpp8
-rw-r--r--src/plugins/imageformats/tga/qtgahandler.h4
-rw-r--r--src/plugins/imageformats/tiff/CMakeLists.txt100
-rw-r--r--src/plugins/imageformats/tiff/main.cpp6
-rw-r--r--src/plugins/imageformats/tiff/qtiffhandler.cpp124
-rw-r--r--src/plugins/imageformats/tiff/qtiffhandler_p.h4
-rw-r--r--src/plugins/imageformats/wbmp/main.cpp6
-rw-r--r--src/plugins/imageformats/webp/CMakeLists.txt208
-rw-r--r--src/plugins/imageformats/webp/main.cpp6
-rw-r--r--src/plugins/imageformats/webp/qwebphandler.cpp16
-rw-r--r--src/plugins/imageformats/webp/qwebphandler_p.h4
-rw-r--r--tests/auto/icns/tst_qicns.cpp24
-rw-r--r--tests/auto/tiff/tst_qtiff.cpp29
-rw-r--r--tests/shared/images/tiff.qrc4
-rw-r--r--tests/shared/images/tiff/big_16bpc.tiffbin0 -> 21548 bytes
-rw-r--r--tests/shared/images/tiff/big_grayscale.tiffbin0 -> 4581 bytes
-rw-r--r--tests/shared/images/tiff/big_rgb.tiffbin0 -> 12748 bytes
-rw-r--r--tests/shared/images/tiff/big_rgb_bigendian.tiffbin0 -> 12748 bytes
247 files changed, 52664 insertions, 37646 deletions
diff --git a/.qmake.conf b/.qmake.conf
index 35dba54..3317116 100644
--- a/.qmake.conf
+++ b/.qmake.conf
@@ -2,4 +2,4 @@ load(qt_build_config)
DEFINES += QT_NO_FOREACH QT_NO_JAVA_STYLE_ITERATORS QT_NO_LINKED_LIST
-MODULE_VERSION = 5.14.2
+MODULE_VERSION = 5.15.13
diff --git a/dist/changes-5.12.10 b/dist/changes-5.12.10
new file mode 100644
index 0000000..5c3c901
--- /dev/null
+++ b/dist/changes-5.12.10
@@ -0,0 +1,24 @@
+Qt 5.12.10 is a bug-fix release. It maintains both forward and backward
+compatibility (source and binary) with Qt 5.12.9.
+
+For more details, refer to the online documentation included in this
+distribution. The documentation is also available online:
+
+ https://doc.qt.io/qt-5.12/index.html
+
+The Qt version 5.12 series is binary compatible with the 5.11.x series.
+Applications compiled for 5.11 will continue to run with 5.12.
+
+Some of the changes listed in this file include issue tracking numbers
+corresponding to tasks in the Qt Bug Tracker:
+
+ https://bugreports.qt.io/
+
+Each of these identifiers can be entered in the bug tracker to obtain more
+information about a particular change.
+
+****************************************************************************
+* Library *
+****************************************************************************
+
+- This release contains only minor code improvements.
diff --git a/dist/changes-5.14.2 b/dist/changes-5.14.2
new file mode 100644
index 0000000..68a0051
--- /dev/null
+++ b/dist/changes-5.14.2
@@ -0,0 +1,20 @@
+Qt 5.14.2 is a bug-fix release. It maintains both forward and backward
+compatibility (source and binary) with Qt 5.14.0 through 5.14.1.
+
+For more details, refer to the online documentation included in this
+distribution. The documentation is also available online:
+
+https://doc.qt.io/qt-5/index.html
+
+The Qt version 5.14 series is binary compatible with the 5.13.x series.
+Applications compiled for 5.13 will continue to run with 5.14.
+
+Some of the changes listed in this file include issue tracking numbers
+corresponding to tasks in the Qt Bug Tracker:
+
+https://bugreports.qt.io/
+
+Each of these identifiers can be entered in the bug tracker to obtain more
+information about a particular change.
+
+ - This release contains only minor code improvements.
diff --git a/dist/changes-5.15.0 b/dist/changes-5.15.0
new file mode 100644
index 0000000..2e8a036
--- /dev/null
+++ b/dist/changes-5.15.0
@@ -0,0 +1,28 @@
+Qt 5.15 introduces many new features and improvements as well as bugfixes
+over the 5.14.x series. For more details, refer to the online documentation
+included in this distribution. The documentation is also available online:
+
+https://doc.qt.io/qt-5/index.html
+
+The Qt version 5.15 series is binary compatible with the 5.14.x series.
+Applications compiled for 5.14 will continue to run with 5.15.
+
+Some of the changes listed in this file include issue tracking numbers
+corresponding to tasks in the Qt Bug Tracker:
+
+https://bugreports.qt.io/
+
+Each of these identifiers can be entered in the bug tracker to obtain more
+information about a particular change.
+
+****************************************************************************
+* TIFF *
+****************************************************************************
+
+ - Add support for reading BigTIFF
+
+****************************************************************************
+* Third-Party Code *
+****************************************************************************
+
+ - Update bundled libwebp to version 1.1.0
diff --git a/dist/changes-5.15.1 b/dist/changes-5.15.1
new file mode 100644
index 0000000..332ee9d
--- /dev/null
+++ b/dist/changes-5.15.1
@@ -0,0 +1,20 @@
+Qt 5.15.1 is a bug-fix release. It maintains both forward and backward
+compatibility (source and binary) with Qt 5.15.0.
+
+For more details, refer to the online documentation included in this
+distribution. The documentation is also available online:
+
+https://doc.qt.io/qt-5/index.html
+
+The Qt version 5.15 series is binary compatible with the 5.14.x series.
+Applications compiled for 5.14 will continue to run with 5.15.
+
+Some of the changes listed in this file include issue tracking numbers
+corresponding to tasks in the Qt Bug Tracker:
+
+https://bugreports.qt.io/
+
+Each of these identifiers can be entered in the bug tracker to obtain more
+information about a particular change.
+
+ - This release contains only minor code improvements.
diff --git a/dist/changes-5.15.2 b/dist/changes-5.15.2
new file mode 100644
index 0000000..c8cfa78
--- /dev/null
+++ b/dist/changes-5.15.2
@@ -0,0 +1,20 @@
+Qt 5.15.2 is a bug-fix release. It maintains both forward and backward
+compatibility (source and binary) with Qt 5.15.1.
+
+For more details, refer to the online documentation included in this
+distribution. The documentation is also available online:
+
+ https://doc.qt.io/qt-5.15/index.html
+
+The Qt version 5.15 series is binary compatible with the 5.14.x series.
+Applications compiled for 5.14 will continue to run with 5.15.
+
+Some of the changes listed in this file include issue tracking numbers
+corresponding to tasks in the Qt Bug Tracker:
+
+ https://bugreports.qt.io/
+
+Each of these identifiers can be entered in the bug tracker to obtain more
+information about a particular change.
+
+ - This release contains only minor code improvements.
diff --git a/src/3rdparty/libtiff.pri b/src/3rdparty/libtiff.pri
index c57c668..6eaf09a 100644
--- a/src/3rdparty/libtiff.pri
+++ b/src/3rdparty/libtiff.pri
@@ -16,6 +16,7 @@ SOURCES += \
$$PWD/libtiff/libtiff/tif_fax3sm.c \
$$PWD/libtiff/libtiff/tif_flush.c \
$$PWD/libtiff/libtiff/tif_getimage.c \
+ $$PWD/libtiff/libtiff/tif_hash_set.c \
$$PWD/libtiff/libtiff/tif_luv.c \
$$PWD/libtiff/libtiff/tif_lzw.c \
$$PWD/libtiff/libtiff/tif_next.c \
@@ -32,11 +33,9 @@ SOURCES += \
$$PWD/libtiff/libtiff/tif_version.c \
$$PWD/libtiff/libtiff/tif_warning.c \
$$PWD/libtiff/libtiff/tif_write.c \
- $$PWD/libtiff/libtiff/tif_zip.c \
- $$PWD/libtiff/port/snprintf.c
+ $$PWD/libtiff/libtiff/tif_zip.c
win32: SOURCES += $$PWD/libtiff/libtiff/tif_win32.c
else: SOURCES += $$PWD/libtiff/libtiff/tif_unix.c
-android: SOURCES += $$PWD/libtiff/port/lfind.c
include($$PWD/zlib_dependency.pri)
diff --git a/src/3rdparty/libtiff/ChangeLog b/src/3rdparty/libtiff/ChangeLog
index 01e2182..c2e5405 100644
--- a/src/3rdparty/libtiff/ChangeLog
+++ b/src/3rdparty/libtiff/ChangeLog
@@ -1,3 +1,5144 @@
+2022-12-14 Even Rouault <even.rouault@spatialys.com>
+
+ libtiff v4.5.0rc2 preparation
+
+2022-12-14 Su_Laus <sulau@freenet.de>
+
+ tiffinfo: update curdir from uint16_t to tdir_t for more than 64k IFD handling.
+
+2022-12-13 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_502' into 'master'
+ Make TIFFSetDirectory(tiff, 65534) work again (fixes #502)
+
+ Closes #502
+
+ See merge request libtiff/libtiff!436
+
+2022-12-13 Even Rouault <even.rouault@spatialys.com>
+
+ Add tests for IFD loop detection.
+
+ Fix IFD loop detection.
+
+ Use UINT_MAX.
+
+ Make TIFF_MAX_DIR_COUNT a autoconf/CMake setting.
+
+2022-12-13 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'build-shared-by-default' into 'master'
+ Restore shared libraries by default
+
+ See merge request libtiff/libtiff!437
+
+2022-12-13 shaun walbridge <shaun.walbridge@gmail.com>
+
+ CMake: restore shared libraries by default for top-level build.
+
+2022-12-12 Even Rouault <even.rouault@spatialys.com>
+
+ Add a TIFF_MAX_DIR_COUNT public #define.
+
+ TIFFCurrentDirectory(), TIFFNumberOfDirectories(), TIFFSetDirectory(), TIFFUnlinkDirectory(): use tdir_t that is now a uint32_t, and raise limit of IFDs to 1048576
+
+ IFD loop checking: use hashmap to avoid quadratic performance.
+
+ Add a hashset/hashmap implementation (ported from GDAL's CPLHashSet)
+
+ Make TIFFSetDirectory(tiff, 65534) work again (fixes #502)
+
+2022-12-11 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'do_not_format_tiffvers_h' into 'master'
+ Revert formatting of tiffvers.h and add TIFFLIB_MAJOR_VERSION, TIFFLIB_MINOR_VERSION, TIFFLIB_MICRO_VERSION defines
+
+ See merge request libtiff/libtiff!434
+
+2022-12-11 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffcrop_exclude_some_comment_from_clang-format' into 'master'
+ tiffcrop: Exclude some comments from clang-format
+
+ See merge request libtiff/libtiff!435
+
+2022-12-11 Su Laus <sulau@freenet.de>
+
+ tiffcrop: Exclude some comments from clang-format.
+
+2022-12-11 Even Rouault <even.rouault@spatialys.com>
+
+ tiffvers.h.in: add clang-format off/on.
+
+2022-12-10 Even Rouault <even.rouault@spatialys.com>
+
+ tiffvers.h: add TIFFLIB_MAJOR_VERSION, TIFFLIB_MINOR_VERSION, TIFFLIB_MICRO_VERSION defines
+ Also add a TIFFLIB_AT_LEAST() macro
+
+ tiffvers.h: revert formatting.
+
+ Exclude reformatting of tiffvers.h which breaks version detection for FindTIFF.cmake
+
+2022-12-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'release_4_5_0' into 'master'
+ Prepare v4.5.0 release
+
+ See merge request libtiff/libtiff!433
+
+2022-12-09 Even Rouault <even.rouault@spatialys.com>
+
+ libtiff v4.5.0rc1 preparation
+
+2022-12-08 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'reformat' into 'master'
+ Whole code-base reformatting
+
+ See merge request libtiff/libtiff!431
+
+2022-12-08 Even Rouault <even.rouault@spatialys.com>
+
+ Add .git-blame-ignore-revs.
+
+ tiffcrop: remove version_id and rev_date.
+
+2022-12-08 pre-commit run by Even Rouault <even.rouault-bot@spatialys.com>
+
+ Reformatting in all other directories using 'pre-commit run'
+
+ Reformatting in test/ using 'pre-commit run'
+
+ Reformatting in tools/ using 'pre-commit run'
+
+ Reformatting in libtiff/ using 'pre-commit run'
+
+2022-12-08 Even Rouault <even.rouault@spatialys.com>
+
+ Add .clang-format, .pre-commit-config.yaml and CONTRIBUTING.md.
+
+ Remove vim/emacs formatting footers.
+
+2022-11-29 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_489' into 'master'
+ TIFFWriteRawStrip(): restore capabilities to append data in the current strip (fixes #489)
+
+ Closes #489
+
+ See merge request libtiff/libtiff!430
+
+2022-11-29 Even Rouault <even.rouault@spatialys.com>
+
+ Add test case for scenario of issue #489.
+
+ TIFFWriteRawStrip(): restore capabilities to append data in the current strip (fixes #489)
+ This fixes a regression of libtiff 4.4.0
+
+2022-11-29 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'manpage_re-entrant_error_handler' into 'master'
+ manpage update for re-entrant error handler TIFFErrorExtR(), TIFFOpenExt() and...
+
+ See merge request libtiff/libtiff!427
+
+2022-11-29 Su Laus <sulau@freenet.de>
+
+ manpage update for re-entrant error handler TIFFErrorExtR(), TIFFOpenExt() and...
+
+2022-11-27 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffcrop_fix_#169' into 'master'
+ tiffcrop: Add check if (bps != 1) in writeSingleSection() for...
+
+ Closes #169
+
+ See merge request libtiff/libtiff!429
+
+2022-11-27 Su Laus <sulau@freenet.de>
+
+ tiffcrop: Add check if (bps != 1) in writeSingleSection() for...
+
+2022-11-26 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'TIFFErrorExtR_fix_missing_calls' into 'master'
+ TIFFErrorExt() was not replaced with TIFFErrorExtR() everywhere in libtiff....
+
+ See merge request libtiff/libtiff!428
+
+2022-11-26 Su Laus <sulau@freenet.de>
+
+ TIFFErrorExt() was not replaced with TIFFErrorExtR() everywhere in libtiff....
+
+2022-11-25 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tif_jpeg_build_fix' into 'master'
+ tif_jpeg.c: fix compilation with MSVC (fixes commit 0fd1a81d3547acb8f5be50bbbc3e44bde01c014b)
+
+ See merge request libtiff/libtiff!426
+
+2022-11-25 Even Rouault <even.rouault@spatialys.com>
+
+ tif_jpeg.c: fix compilation with MSVC (fixes commit 0fd1a81d3547acb8f5be50bbbc3e44bde01c014b)
+
+2022-11-25 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_0fd1a81d3547acb8f5be50bbbc3e44bde01c014b' into 'master'
+ JPEGEncode(): fix wrong pointer data type with libjpeg-turbo 2.2dev in 12-bit mode
+
+ See merge request libtiff/libtiff!425
+
+2022-11-25 Even Rouault <even.rouault@spatialys.com>
+
+ JPEGEncode(): fix wrong pointer data type with libjpeg-turbo 2.2dev in 12-bit mode
+ (fixes commit 0fd1a81d3547acb8f5be50bbbc3e44bde01c014b)
+
+2022-11-25 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'libjpegturbo_dual' into 'master'
+ Add support for libjpeg-turbo 2.2-dev 8/12 bit dual mode
+
+ See merge request libtiff/libtiff!422
+
+2022-11-25 Even Rouault <even.rouault@spatialys.com>
+
+ Add support for libjpeg-turbo 2.2-dev 8/12 bit dual mode.
+
+2022-11-23 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'windows-fix' into 'master'
+ libtiff: Fix TIFFOpen* for the Windows platform in tif_unix.c
+
+ See merge request libtiff/libtiff!424
+
+2022-11-23 Francois Bleibel <fbleibel@gmail.com>
+
+ libtiff: Fix TIFFOpen* for the Windows platform in tif_unix.c.
+ I'm not sure where this change was made, but it must have been in a recent update. TIFFOpenWEx is now TIFFOpenWExt, and _TIFFgetMode takes additional arguments.
+
+ Verified: Tested libtiff on a local Windows build.
+
+2022-11-23 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffcrop_signed_vs_unsigned' into 'master'
+ tiffcrop.c: fix warning about signed vs unsigned comparison
+
+ See merge request libtiff/libtiff!423
+
+2022-11-23 Even Rouault <even.rouault@spatialys.com>
+
+ tiffcrop.c: fix warning about signed vs unsigned comparison.
+
+2022-11-23 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'TIFFClientOpenExt_warning_fix' into 'master'
+ TIFFClientOpenExt(): fix warning on 32-bit platforms (master only)
+
+ See merge request libtiff/libtiff!421
+
+2022-11-23 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFClientOpenExt(): fix warning on 32-bit platforms (master only)
+
+2022-11-23 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffcp_TIFFOpenOptionsFree_memleak_fix' into 'master'
+ tiffcp: fix leak of TIFFOpenOptionsAlloc() introduced in latest commit (master only)
+
+ See merge request libtiff/libtiff!420
+
+2022-11-23 Even Rouault <even.rouault@spatialys.com>
+
+ tiffcp: fix leak of TIFFOpenOptionsAlloc() introduced in latest commit (master only)
+ Fixes Coverity CID 1517032
+
+2022-11-23 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'TIFFOpenOptionsSetMaxSingleMemAlloc' into 'master'
+ Add TIFFOpenOptionsSetMaxSingleMemAlloc() to define a limit in bytes for a single memory allocation done by libtiff
+
+ See merge request libtiff/libtiff!419
+
+2022-11-23 Even Rouault <even.rouault@spatialys.com>
+
+ Emit explicit error message when tif_max_single_mem_alloc is exceeded.
+
+ test_open_options: test TIFFOpenOptionsSetMaxSingleMemAlloc()
+
+ Rename test_error_handlers to test_open_options.
+
+ tiffinfo, tiffcp, tiffcrop, tiffsplit, tiff2rgba, tiff2ps: use TIFFOpenOptionsSetMaxSingleMemAlloc()
+
+ Convert uses of _TIFFmalloc/realloc/calloc/free to the Ext functions.
+
+2022-11-22 Even Rouault <even.rouault@spatialys.com>
+
+ Add TIFFOpenOptionsSetMaxSingleMemAlloc()
+ to define a limit in bytes for a single memory allocation done by libtiff.
+
+ Also add internal functions used in replacement of the non Ext ones:
+ void* _TIFFmallocExt(TIFF* tif, tmsize_t s);
+ void* _TIFFcallocExt(TIFF* tif, tmsize_t nmemb, tmsize_t siz);
+ void* _TIFFreallocExt(TIFF* tif, void* p, tmsize_t s);
+ void _TIFFfreeExt(TIFF* tif, void* p);
+
+2022-11-22 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'TIFFOpenEx' into 'master'
+ Add TIFFOpenExt(), TIFFOpenWExt() and TIFFFdOpenExt() with re-entrant error handlers
+
+ See merge request libtiff/libtiff!413
+
+2022-11-21 Even Rouault <even.rouault@spatialys.com>
+
+ Remove TIFFSetErrorHandlerExtR() and TIFFSetWarningHandlerExtR() that were temporarily added in master
+
+ Add a _TIFFErrorEarly() function to be able to use the re-entrant error handler, even before TIFF* is valid
+
+ Rework TIFFOpenExt() and similar to use an opaque TIFFOpenOptions* opts argument, with alloc, free and setters
+
+ Document TIFFOpenExt, TIFFOpenWExt, TIFFFdOpenExt, TIFFClientOpenExt, TIFFSetErrorHandlerExtR, TIFFSetWarningHandlerExtR
+
+2022-11-21 Even Rouault <even.rouault@spatialys.com>
+
+ Add TIFFOpenExt(), TIFFOpenWExt() and TIFFFdOpenExt() with re-entrant error handlers
+ Rename TIFFClientOpenEx() to TIFFClientOpenExt()
+
+ Rework signature of the re-entrant error handlers and of
+ TIFFSetWarningHandlerExt() and TIFFSetErrorHandlerExt()
+
+ Use structures that can be extended as extra argument.
+
+ Leverages and ammends https://gitlab.com/libtiff/libtiff/-/merge_requests/409
+
+2022-11-21 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'manpage_fix485_file-descriptor_clientdata' into 'master'
+ manpage: Correct description of file handle/descriptors tif_fd and tif_clientdata. Closes #485.
+
+ Closes #485
+
+ See merge request libtiff/libtiff!418
+
+2022-11-21 Su Laus <sulau@freenet.de>
+
+ manpage: Correct description of file handle/descriptors tif_fd and tif_clientdata. Closes #485.
+
+2022-11-20 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'manpage_fix440_fix28_TIFFOpen_SubIFD_update' into 'master'
+ manpage: fix28, fix440, update TIFFOpen and SubIFD
+
+ Closes #440 et #28
+
+ See merge request libtiff/libtiff!417
+
+2022-11-20 Su Laus <sulau@freenet.de>
+
+ manpage: fix28, fix440, update TIFFOpen and SubIFD.
+
+2022-11-17 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'cmake_tiff_install_warning' into 'master'
+ CMakeLists.txt: fix warning with -Wdev
+
+ See merge request libtiff/libtiff!416
+
+2022-11-13 Even Rouault <even.rouault@spatialys.com>
+
+ CMakeLists.txt: fix warning with -Wdev.
+ ```
+ CMake Warning (dev) at CMakeLists.txt:62 (option):
+ Policy CMP0077 is not set: option() honors normal variables. Run "cmake
+ --help-policy CMP0077" for policy details. Use the cmake_policy command to
+ set the policy and suppress this warning.
+
+ For compatibility with older versions of CMake, option is clearing the
+ normal variable 'tiff-install'.
+ This warning is for project developers. Use -Wno-dev to suppress it.
+ ```
+
+2022-11-12 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_479' into 'master'
+ _TIFFReadEncodedTileAndAllocBuffer(): avoid excessive memory allocation on...
+
+ See merge request libtiff/libtiff!412
+
+2022-11-12 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'typo_fix' into 'master'
+ tif_dirread.c: fix typo in comment
+
+ See merge request libtiff/libtiff!414
+
+2022-11-12 Even Rouault <even.rouault@spatialys.com>
+
+ tif_dirread.c: fix typo in comment.
+
+2022-11-11 Even Rouault <even.rouault@spatialys.com>
+
+ _TIFFReadEncodedTileAndAllocBuffer(): avoid excessive memory allocation on broken files (fixes #479)
+
+2022-11-10 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'bugfix/tiff2pdf-stdout' into 'master'
+ tiff2pdf Don't try to seek into stdout.
+
+ See merge request libtiff/libtiff!367
+
+2022-11-10 Claus-Justus Heine <himself@claus-justus-heine.de>
+
+ tiff2pdf: Don't try to seek into stdout.
+ Fixes #441
+
+2022-11-08 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_coverity_1516759' into 'master'
+ TIFFErrorExtR(): fix Dereference after null check (CID 1516759)
+
+ See merge request libtiff/libtiff!411
+
+2022-11-08 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_ossfuzz_53137' into 'master'
+ TIFFReadRGBATileExt(): fix (unsigned) integer overflow on strips/tiles > 2 GB
+
+ See merge request libtiff/libtiff!410
+
+2022-11-08 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFErrorExtR(): fix Dereference after null check (CID 1516759)
+
+2022-11-08 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'no_sprintf' into 'master'
+ Replace sprintf calls with snprintf
+
+ See merge request libtiff/libtiff!408
+
+2022-11-08 Mark Mentovai <mark@chromium.org>
+
+ Replace sprintf calls with snprintf.
+ This makes it possible to build libtiff without warnings using the macOS
+ 13 SDK. Calls to sprintf are replaced with snprintf, passing appropriate
+ buffer sizes.
+
+ It doesn’t appear that any of the changed uses of sprintf were actually
+ unsafe, so no behavior change is expected aside from SDK compatibility.
+
+ The macOS 13 SDK deprecates sprintf as it’s difficult to use safely. The
+ deprecation warning message is visible when building C++, but it is not
+ normally visible when building plain C code due to a quirk in how
+ sprintf is declared in the SDK. However, the deprecation message is
+ visible when building plain C under Address Sanitizer
+ (-fsanitize=address). This discrepancy was discovered at
+ https://crbug.com/1381706 and reported to Apple with a copy at
+ https://openradar.appspot.com/FB11761475.
+
+ The macOS 13 SDK is packaged in Xcode 14.1, released on 2022-11-01. This
+ also affects the iOS 16 SDK and other 2022-era Apple OS SDKs packaged in
+ Xcode 14.0, released on 2022-09-12.
+
+ libtiff is visible to the Chromium build via PDFium, and this change is
+ needed to allow Chromium to move forward to the macOS 13 SDK.
+
+ This change is limited to the libtiff directory. Other uses of sprintf
+ were found in contrib, test, and tools.
+
+2022-11-08 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'reentrant' into 'master'
+ Add reentrant error functions
+
+ See merge request libtiff/libtiff!409
+
+2022-11-08 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFReadRGBATileExt(): fix (unsigned) integer overflow on strips/tiles > 2 GB
+ Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=53137
+
+2022-11-08 Laramie Leavitt <lar@google.com>
+
+ Add reentrant error functions.
+ Prior to this change, libtiff relied on global error handlers,
+ which is problematic when libtiff used by multiple independent
+ libraries from within the same process, as they may unwittingly
+ clobber the error handling, introduce race conditions when setting
+ handlers, or otherwise have unintended side effects.
+
+ This change adds error handlers to the TIFF struct, which are
+ used preferentially when available. The error handlers are invoked
+ when the re-entrant error functions are called:
+
+ void TIFFErrorExtR(TIFF*, const char* module, const char* fmt, ...)
+ void TIFFWarningExtR(TIFF*, const char* module, const char* fmt, ...)
+
+ The handlers have a similar signature to the existing extended
+ handlers, additionally returning an int:
+
+ int TIFFErrorHandlerExtR(thandle_t, const char*, const char*, va_list)
+
+ thandle_t is the userdata passed to TIFFOpen
+ When the handler returns 1, the global handlers are not called.
+
+ Custom error/warning handlers may be installed on a per-file
+ basis by calling the Set functions:
+
+ TIFF* tif = TIFFOpen(...);
+ TIFFSetErrorHandlerExtR(tif, MyErrorHandler);
+ TIFFSetWarningHandlerExtR(tif, MyWarningHandler);
+
+ Additionally, the callsites to TIFFErrorExt and TIFFWarningExt
+ have been updated to call the reentrant versions.
+
+2022-11-08 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffcrop_fix_CoverityScan_tmsize_issue' into 'master'
+ tiffcrop: should fix some Coverity Scan issues OVERFLOW_BEFORE_WIDEN
+
+ See merge request libtiff/libtiff!403
+
+2022-11-08 Su Laus <sulau@freenet.de>
+
+ tiffcrop: should fix some Coverity Scan issues OVERFLOW_BEFORE_WIDEN.
+
+2022-11-02 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'typo_fix' into 'master'
+ tif_dirread.c: fix typo in comment
+
+ See merge request libtiff/libtiff!407
+
+2022-11-02 Even Rouault <even.rouault@spatialys.com>
+
+ tif_dirread.c: fix typo in comment.
+
+2022-10-23 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffcrop_formatting_fix' into 'master'
+ tiffcrop: add casts in TIFFError() to fix compiler warnings
+
+ See merge request libtiff/libtiff!406
+
+2022-10-23 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_482' into 'master'
+ CMake: correctly set default value of 'lzma' option when liblzma is detected (fixes #482)
+
+ Closes #482
+
+ See merge request libtiff/libtiff!404
+
+2022-10-23 Even Rouault <even.rouault@spatialys.com>
+
+ tiffcrop: add casts in TIFFError() to fix compiler warnings.
+
+ CMake: correctly set default value of 'lzma' option when liblzma is detected (fixes #482)
+
+2022-10-20 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_480' into 'master'
+ Fix incorrect printf() formatters introduced in recent commits (fixes #480)
+
+ Closes #480
+
+ See merge request libtiff/libtiff!401
+
+2022-10-19 Even Rouault <even.rouault@spatialys.com>
+
+ Fix incorrect printf() formatters introduced in recent commits (fixes #480)
+
+2022-10-13 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'CLIPPATH_tags_corrected' into 'master'
+ CLIPPATH tags defined twice but differently and also wrongly (#439) - corrected
+
+ Closes #439
+
+ See merge request libtiff/libtiff!366
+
+2022-10-13 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'FIELD_IGNORE_warning-messages' into 'master'
+ Warning messages for FIELD_IGNORE tags for writing and for TIFF_SETGET_UNDEFINED for reading added. (#438)
+
+ Closes #438
+
+ See merge request libtiff/libtiff!365
+
+2022-10-13 Su Laus <sulau@freenet.de>
+
+ Warning messages for FIELD_IGNORE tags for writing and for TIFF_SETGET_UNDEFINED for reading added. (#438)
+
+2022-10-13 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tag-def_COMPRESSION_corrected' into 'master'
+ tif_dirinfo.c TIFFTAG_COMPRESSION and _BITSPERSAMPLE definition corrected
+
+ See merge request libtiff/libtiff!364
+
+2022-10-13 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_getopt_included_twice' into 'master'
+ Fix including module getopt.c twice with CMake and HAVE_GETOPT=false
+
+ See merge request libtiff/libtiff!381
+
+2022-10-13 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffcrop_CoverityScan_fix_PRINTF_ARGS' into 'master'
+ tiffcrop: fix Coverity Scan issues about PRINTF_ARGS.
+
+ See merge request libtiff/libtiff!400
+
+2022-10-13 Su_Laus <sulau@freenet.de>
+
+ tiffcrop fix Coverity Scan issues about PRINTF_ARGS.
+
+2022-10-13 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffcrop_fix_#450_too-many-mode-options' into 'master'
+ tiffcrop: fix #450 too many 'mode' options on command line.
+
+ Closes #470 et #450
+
+ See merge request libtiff/libtiff!384
+
+2022-10-13 Su Laus <sulau@freenet.de>
+
+ tiffcrop: fix #450 too many 'mode' options on command line.
+
+2022-10-13 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffcrop_fix_#435' into 'master'
+ tiffcrop subroutines require a larger buffer (fixes #271, #381, #386, #388, #389, #435)
+
+ Closes #465, #464, #435, #389, #388, #386, #381 et #271
+
+ See merge request libtiff/libtiff!382
+
+2022-10-13 Su Laus <sulau@freenet.de>
+
+ tiffcrop subroutines require a larger buffer (fixes #271, #381, #386, #388, #389, #435)
+
+2022-10-12 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'InkNames_NumberOfInks_handling_revised' into 'master'
+ Revised handling of TIFFTAG_INKNAMES and related TIFFTAG_NUMBEROFINKS value (fixes #149, #150, #152, #168, #250, #269, #398 and #456)
+
+ Closes #474, #463, #387, #456, #398, #269, #250, #168, #152, #150 et #149
+
+ See merge request libtiff/libtiff!385
+
+2022-10-12 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffcrop_fix_#411_#413' into 'master'
+ tiffcrop: disable incompatibility of -Z, -X, -Y, -z options with any PAGE_MODE_x option (fixes #411, #413 and #426)
+
+ Closes #426, #413 et #411
+
+ See merge request libtiff/libtiff!383
+
+2022-10-10 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'TIFFAdvanceDirectory_mapped_uio' into 'master'
+ TIFFAdvanceDirectory(): fix unsigned-integer-overflow in mapped case
+
+ See merge request libtiff/libtiff!398
+
+2022-10-10 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFAdvanceDirectory(): fix unsigned-integer-overflow in mapped case.
+ Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=52309
+
+2022-10-08 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffinfo_parse_SubIFDs' into 'master'
+ tiffinfo: Updated to parse through SubIFDs and show their tags.
+
+ See merge request libtiff/libtiff!396
+
+2022-10-08 Su Laus <sulau@freenet.de>
+
+ tiffinfo: Updated to parse through SubIFDs and show their tags.
+
+2022-10-07 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'master' into 'master'
+ Moved linking of CMath::CMath into CMath_LIBRARY check
+
+ See merge request libtiff/libtiff!397
+
+2022-10-07 Frei Herr <herr.frei@googlemail.com>
+
+ Moved linking of CMath::CMath into CMath_LIBRARY check.
+
+2022-10-06 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'rational_precision2double_coverity-fix' into 'master'
+ rational_precision2double.c: Fix issue from Coverity Scan.
+
+ See merge request libtiff/libtiff!395
+
+2022-10-06 Su_Laus <sulau@freenet.de>
+
+ rational_precision2double.c: Fix issue from Coverity Scan.
+
+ Fix including module getopt.c twice with CMake and HAVE_GETOPT=false.
+ The "make-files" for the tools- and test- programmes include the module getopt.c once directly as additional source and then again by including port.lib.
+ This can be avoided by including getopt.c as source in port.lib within port\CMakeLists.txt not with PUBLIC but with PRIVATE.
+
+2022-10-06 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix-455_Improved-IFD-loop-handling' into 'master'
+ Improved IFD-Loop Handling (fixes #455)
+
+ Closes #455
+
+ See merge request libtiff/libtiff!386
+
+2022-10-06 Su Laus <sulau@freenet.de>
+
+ Improved IFD-Loop Handling (fixes #455)
+ IFD infinite looping was not fixed by MR 20 (see #455).
+ An improved IFD loop handling is proposed.
+
+ Basic approach:
+
+ - The order in the entire chain must be checked, and not only whether an offset has already been read once.
+ - To do this, pairs of directory number and offset are stored and checked.
+ - The offset of a directory number can change.
+ - TIFFAdvanceDirectory() must also perform an IFD loop check.
+ - TIFFCheckDirOffset() is replaced by _TIFFCheckDirNumberAndOffset().
+
+ Rules for the check:
+
+ - If an offset is already in the list, it must have the same IFD number. Otherwise it is an IDF loop.
+ - If the offset is not in the list and the IFD number is greater than there are list entries, a new list entry is added.
+ - Otherwise, the offset of the IFD number is updated.
+
+ Reference is also made to old bugzilla bug 2772 and MR 20, which did not solve the general issue.
+ This MR closes #455
+
+2022-10-05 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'fix-cmake-subproject' into 'master'
+ Fix CMake build to be compatible with FetchContent
+
+ See merge request libtiff/libtiff!394
+
+2022-10-04 Timothy Lyanguzov <theta682@gmail.com>
+
+ Apply 9 suggestion(s) to 3 file(s)
+
+2022-10-04 Jeremy Maitin-Shepard <jbms@google.com>
+
+ Fix CMake build to be compatible with FetchContent.
+ Recent versions of CMake have improved support for including
+ dependencies, using the FetchContent module, which allows a dependency
+ to be imported as a subproject and then later found automatically by
+ calls to `find_package`.
+
+ This change makes libtiff's CMake better behaved when used as a
+ sub-project:
+
+ - CMake has a single global namespace for all target names in all
+ sub-projects. This commit renames the following CMake targets:
+
+ - port -> tiff_port
+ - mkg3states -> tiff_mkg3states
+ - faxtable -> tiff_faxtable
+ - release -> tiff_release
+
+ - When building TIFF as a sub-project, it is not normally useful to
+ create install rules for its targets. This commit adds a
+ `tiff-install` option that controls whether the install rules are
+ added and defaults to OFF when libtiff is included as a sub-project.
+
+ - Previously, libtiff set `BUILD_SHARED_LIBS` to ON by default. With
+ this commit, that default is only set if libtiff is the top-level
+ project.
+
+ - When using `find_package(TIFF)`, the targets `TIFF::TIFF` and
+ `TIFF::CXX` are defined. This commit makes libtiff itself define
+ those targets as aliases, to allow other cmake projects to use
+ either `find_package` or `FetchContent` interchangeably.
+
+ - Adds ZSTD_HAVE_DECOMPRESS_STREAM variable which may be set to bypass
+ `check_symbol_exists` call. Fixes
+ https://gitlab.com/libtiff/libtiff/-/issues/472.
+
+2022-09-27 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'getimage_overflow' into 'master'
+ Update getimage to support reading large raster images
+
+ See merge request libtiff/libtiff!389
+
+2022-09-26 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'MinGW-warnings_ipctutil' into 'master'
+ Fix #458: MinGW Windows 64: warning because 'long' is a 32 bits type in...
+
+ Closes #458
+
+ See merge request libtiff/libtiff!391
+
+2022-09-26 Su Laus <sulau@freenet.de>
+
+ Fix #458: MinGW Windows 64: warning because 'long' is a 32 bits type in...
+
+2022-09-16 Eric Siegel <siegel.eric@gmail.com>
+
+ Update getimage to support large raster images.
+
+2022-09-08 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'typo_fix' into 'master'
+ tif_lzw.c: fix typo in code comment
+
+ See merge request libtiff/libtiff!387
+
+2022-09-08 Even Rouault <even.rouault@spatialys.com>
+
+ tif_lzw.c: fix typo in code comment.
+
+2022-08-30 Su_Laus <sulau@freenet.de>
+
+ Revised handling of TIFFTAG_INKNAMES and related TIFFTAG_NUMBEROFINKS value
+ In order to solve the buffer overflow issues related to TIFFTAG_INKNAMES and related TIFFTAG_NUMBEROFINKS value, a revised handling of those tags within LibTiff is proposed:
+
+ Behaviour for writing:
+ `NumberOfInks` MUST fit to the number of inks in the `InkNames` string.
+ `NumberOfInks` is automatically set when `InkNames` is set.
+ If `NumberOfInks` is different to the number of inks within `InkNames` string, that will be corrected and a warning is issued.
+ If `NumberOfInks` is not equal to samplesperpixel only a warning will be issued.
+
+ Behaviour for reading:
+ When reading `InkNames` from a TIFF file, the `NumberOfInks` will be set automatically to the number of inks in `InkNames` string.
+ If `NumberOfInks` is different to the number of inks within `InkNames` string, that will be corrected and a warning is issued.
+ If `NumberOfInks` is not equal to samplesperpixel only a warning will be issued.
+
+ This allows the safe use of the NumberOfInks value to read out the InkNames without buffer overflow
+
+ This MR will close the following issues: #149, #150, #152, #168 (to be checked), #250, #269, #398 and #456.
+
+ It also fixes the old bug at http://bugzilla.maptools.org/show_bug.cgi?id=2599, for which the limitation of `NumberOfInks = SPP` was introduced, which is in my opinion not necessary and does not solve the general issue.
+
+2022-08-25 Su_Laus <sulau@freenet.de>
+
+ tiffcrop: disable incompatibility of -Z, -X, -Y, -z options with any PAGE_MODE_x option (fixes #411 and #413)
+ tiffcrop does not support –Z, -z, -X and –Y options together with any other PAGE_MODE_x options like -H, -V, -P, -J, -K or –S.
+
+ Code analysis:
+
+ With the options –Z, -z, the crop.selections are set to a value > 0. Within main(), this triggers the call of processCropSelections(), which copies the sections from the read_buff into seg_buffs[].
+ In the following code in main(), the only supported step, where that seg_buffs are further handled are within an if-clause with if (page.mode == PAGE_MODE_NONE) .
+
+ Execution of the else-clause often leads to buffer-overflows.
+
+ Therefore, the above option combination is not supported and will be disabled to prevent those buffer-overflows.
+
+ The MR solves issues #411 and #413.
+
+2022-08-21 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffcrop_S-option_mutually_exclusive' into 'master'
+ tiffcrop: -S option mutually exclusive (fixes #349, #414, #422, #423, #424)
+
+ Closes #424, #423, #422, #414 et #349
+
+ See merge request libtiff/libtiff!378
+
+2022-08-20 Su_Laus <sulau@freenet.de>
+
+ tiffcrop -S option: Make decision simpler.
+
+2022-08-20 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'remove_death_commented_code' into 'master'
+ Remove dead code from tif_dirread.c, tif_dirwrite.c and tif_getimage.c
+
+ See merge request libtiff/libtiff!380
+
+2022-08-20 Su Laus <sulau@freenet.de>
+
+ Remove dead code from tif_dirread.c, tif_dirwrite.c and tif_getimage.c.
+
+2022-08-16 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'coverity_fixes' into 'master'
+ Silence Coverity Scan false positive warnings about out-of-bounds access
+
+ See merge request libtiff/libtiff!379
+
+2022-08-16 Even Rouault <even.rouault@spatialys.com>
+
+ tif_zip.c: silence Coverity Scan false positive warnings about out-of-bounds access (CID 1491190, 1491197, 1491201)
+
+ tif_dirread.c: silence Coverity Scan false positive warnings about out-of-bounds access (CID 1491182, 1491186)
+
+2022-08-16 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'default_tag_values_extended' into 'master'
+ Presetting of default tag values extended (e.g. PlanarConfig). (fixes #449)
+
+ Closes #449
+
+ See merge request libtiff/libtiff!377
+
+2022-08-16 Su Laus <sulau@freenet.de>
+
+ Presetting of default tag values extended (e.g. PlanarConfig). (fixes #449)
+
+2022-08-15 Su_Laus <sulau@freenet.de>
+
+ According to Richard Nolde https://gitlab.com/libtiff/libtiff/-/issues/401#note_877637400 the tiffcrop option „-S“ is also mutually exclusive to the other crop options (-X|-Y), -Z and -z.
+ This is now checked and ends tiffcrop if those arguments are not mutually exclusive.
+
+ This MR will fix the following tiffcrop issues: #349, #414, #422, #423, #424
+
+2022-08-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'warning_fix' into 'master'
+ Fix warning about shadowing
+
+ See merge request libtiff/libtiff!376
+
+2022-08-09 Even Rouault <even.rouault@spatialys.com>
+
+ Fix warning about shadowing.
+
+2022-08-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_225' into 'master'
+ Deal with RichTIFFIPTC tag written with LONG type (fixes #225)
+
+ Closes #225
+
+ See merge request libtiff/libtiff!374
+
+2022-08-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'Writing_IFD8_to_ClassicTIFF_bugfix' into 'master'
+ Correcting defects reported by Coverity Scan for MR !369
+
+ See merge request libtiff/libtiff!375
+
+2022-08-09 Su Laus <sulau@freenet.de>
+
+ Correcting defects reported by Coverity Scan for MR !369.
+
+2022-08-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_442_Writing_IFD8_to_ClassicTIFF' into 'master'
+ TIFFSetValue(): Writing IFD8 & LONG8 tags to ClassicTIFF corrected (fixes #442)
+
+ Closes #442
+
+ See merge request libtiff/libtiff!369
+
+2022-08-09 Su Laus <sulau@freenet.de>
+
+ TIFFSetValue(): Writing IFD8 & LONG8 tags to ClassicTIFF corrected (fixes #442)
+
+2022-08-09 Even Rouault <even.rouault@spatialys.com>
+
+ Deal with RichTIFFIPTC tag written with LONG type (fixes #225)
+
+2022-08-07 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'manpage-functions-added' into 'master'
+ doc: Missing public functions added to TIFF documentation in Sphinx
+
+ See merge request libtiff/libtiff!372
+
+2022-08-07 Su Laus <sulau@freenet.de>
+
+ doc: Missing public functions added to TIFF documentation in Sphinx.
+
+2022-07-29 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tifjpeg_version_check' into 'master'
+ tif_jpeg.c: allow to pass -DEXPECTED_JPEG_LIB_VERSION=number to do optional...
+
+ See merge request libtiff/libtiff!373
+
+2022-07-29 Even Rouault <even.rouault@spatialys.com>
+
+ tif_jpeg.c: allow to pass -DEXPECTED_JPEG_LIB_VERSION=number to do optional compile-time version check
+
+2022-07-21 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'TIFFReadFromUserBuffer_fix' into 'master'
+ TIFFReadFromUserBuffer(): fix clearing of TIFF_CODERSETUP flag that could...
+
+ See merge request libtiff/libtiff!371
+
+2022-07-21 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFReadFromUserBuffer(): fix clearing of TIFF_CODERSETUP flag that could cause issues with reading JPEG compressed files
+
+2022-07-21 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'vs2022-fixes' into 'master'
+ cmake: Correct duplicate definition of _CRT_SECURE_NO_WARNINGS
+
+ Closes #443
+
+ See merge request libtiff/libtiff!370
+
+2022-07-13 Roger Leigh <rleigh@codelibre.net>
+
+ cmake: Correct duplicate definition of _CRT_SECURE_NO_WARNINGS.
+
+2022-07-13 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'vs2022-fixes' into 'master'
+ cmake: Fixes for Visual Studio 2022
+
+ See merge request libtiff/libtiff!368
+
+2022-07-13 Roger Leigh <rleigh@codelibre.net>
+
+ cmake: Fixes for Visual Studio 2022.
+
+2022-07-03 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'elf-symbol-export' into 'master'
+ Explicit export of versioned ELF symbols
+
+ Closes #437
+
+ See merge request libtiff/libtiff!361
+
+2022-07-03 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_433' into 'master'
+ _TIFFCheckFieldIsValidForCodec(): return FALSE when passed a codec-specific...
+
+ Closes #433
+
+ See merge request libtiff/libtiff!363
+
+2022-07-01 Su_Laus <sulau@freenet.de>
+
+ CLIPPATH tags defined twice but differently and also wrongly.
+ In tif_dirinfo.c the tags for clippath are wrongly defined and the tag TIFFTAG_XCLIPPATHUNITS is even different twice. Therefore, those tags cannot be written / read correctly and may even lead to buffer overflow.
+ E.g.: In the case of TIFFSetField(YCLIPPATHUNITS), a 1 byte storage space is allocated because of TIFF_SETGET_UNDEFINED, in which an int32_t value should be stored because of TIFF_SLONG type definition. Then, an int32_t value is read from that 1 byte storage location.
+
+ The current definition is:
+
+ { TIFFTAG_CLIPPATH, -1, -3, TIFF_BYTE, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ClipPath", NULL },
+ { TIFFTAG_XCLIPPATHUNITS, 1, 1, TIFF_SLONG, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "XClipPathUnits", NULL },
+ { TIFFTAG_XCLIPPATHUNITS, 1, 1, TIFF_SBYTE, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "XClipPathUnits", NULL },
+ { TIFFTAG_YCLIPPATHUNITS, 1, 1, TIFF_SLONG, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "YClipPathUnits", NULL },
+
+ Whereas the correct definition according to TIFF Specification Supplement 1 (https://www.awaresystems.be/imaging/tiff/specification/TIFFPM6.pdf) should be:
+
+ { TIFFTAG_CLIPPATH, -3, -3, TIFF_BYTE, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ClipPath", NULL },
+ { TIFFTAG_XCLIPPATHUNITS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "XClipPathUnits", NULL },
+ { TIFFTAG_YCLIPPATHUNITS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "YClipPathUnits", NULL },
+
+ Also the set_get_field of the following tag should be corrected from
+
+ { TIFFTAG_INTEROPERABILITYIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "InteroperabilityIFDOffset", NULL },
+ to
+ { TIFFTAG_INTEROPERABILITYIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "InteroperabilityIFDOffset", NULL },
+
+ However, if those tags schould not be handled by LibTiff because they are deamed as abandoned or unwanted tags, those tags need to be defined with FIELD_IGNORE instead of FIELD_CUSTOM and keeping set_field_type = TIFF_SETGET_UNDEFINED
+
+2022-07-01 Su_Laus <sulau@freenet.de>
+
+ In tif_dirinfo.c the definition for TIFFTAG_COMPRESSION has different settings of field_readcount=TIFF_VARIABLE (-1) and field_writecount=1. The tag is defined with Count=1, thus field_readcount is wrong and should also be 1. Although TIFFTAG_BITSPERSAMPLE is defined with Count:N=SamplesPerPixel, only ONE uint16_t value is passed with TIFFSetField() and TIFFGetField(). However, an array with N=SamplesPerPixel equal values is written into the TIFF file. Shouldn't field_readcount = field_writecount = 1 then? The behaviour of TiffLib does not change, because the handling is coded directly.
+
+2022-06-27 Even Rouault <even.rouault@spatialys.com>
+
+ _TIFFCheckFieldIsValidForCodec(): return FALSE when passed a codec-specific tag and the codec is not configured (fixes #433)
+ This avoids crashes when querying such tags
+
+2022-06-27 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch '16bit_cielab' into 'master'
+ add basic 16bit-cielab support
+
+ See merge request libtiff/libtiff!336
+
+2022-06-27 Caolán McNamara <caolan@skynet.ie>
+
+ Add basic 16bit-cielab support.
+ just a copy of putcontig8bitCIELab that reads 16bit vals but divide l by
+ 257, a and b by 256 before passing to TIFFCIELabToXYZ
+
+ motivation: https://bugs.documentfoundation.org/show_bug.cgi?id=131199
+ the "clavijo16bitlab.tiff" example where tiffinfo says:
+ ```
+ Image Width: 2601 Image Length: 3503
+ Resolution: 96, 96 pixels/inch
+ Bits/Sample: 16
+ Compression Scheme: AdobeDeflate
+ Photometric Interpretation: CIE L*a*b*
+ Orientation: row 0 top, col 0 lhs
+ Samples/Pixel: 3
+ Rows/Strip: 1
+ Planar Configuration: single image plane
+ DateTime: 2020:03:07 10:20:42
+ ```
+
+2022-06-24 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'manpage-fixes' into 'master'
+ Sphinx documentation fixes
+
+ See merge request libtiff/libtiff!362
+
+2022-06-24 Roger Leigh <rleigh@codelibre.net>
+
+ doc: Correct types and cross-references.
+
+ doc: Correct manual page path.
+
+ build: Make rational2double static only for automake.
+ This copies the same logic as used by CMake.
+
+ build: Update autoconf version to 4.5.0 and soname to 6.0.0.
+
+ build: Update autoconf ld-version-script default.
+
+ libtiff: Correct version script for changes since v4.4.0.
+
+ libtiff: Update version script documentation.
+
+ libtiff: Add symbol versioning of all exported symbols.
+
+2022-06-24 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'webp_mem_improvements' into 'master'
+ WEBP codec: avoid temporary buffer and memcpy() on whole tile/strip decoding
+
+ See merge request libtiff/libtiff!360
+
+2022-06-24 Roger Leigh <rleigh@codelibre.net>
+
+ build: Enable symbol versioning by default.
+
+2022-06-24 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'sphinx-manpages' into 'master'
+ doc: Add Sphinx conversion of all manpages
+
+ Closes #361
+
+ See merge request libtiff/libtiff!356
+
+2022-06-24 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'remove-wince' into 'master'
+ Remove obsolete WinCE source file
+
+ See merge request libtiff/libtiff!357
+
+2022-06-23 Even Rouault <even.rouault@spatialys.com>
+
+ WEBP codec: avoid temporary buffer and memcpy() on whole tile/strip decoding
+
+2022-06-22 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'horAcc8_fix' into 'master'
+ tif_predict.c: make horAcc8() work with icc (ICC) 2021.6.0 20220226 -O2
+
+ See merge request libtiff/libtiff!359
+
+2022-06-22 Even Rouault <even.rouault@spatialys.com>
+
+ tif_predict.c: make horAcc8() work with icc (ICC) 2021.6.0 20220226 -O2.
+ For a reason I don't understand, recent ICC generates wrong code in -O2
+ mode for the stride = 3 and 4 cases. The modified code is more
+ straightfoward, so go for it.
+
+2022-06-19 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'ci-restore-old' into 'master'
+ ci: Restore testing with Ubuntu 20.04
+
+ See merge request libtiff/libtiff!358
+
+2022-06-19 Roger Leigh <rleigh@codelibre.net>
+
+ ci: Restore testing with Ubuntu 20.04.
+
+ Remove obsolete WinCE source file.
+
+ doc: Add missing punctuation.
+
+ doc: Remove semicolon from c:function definition.
+
+ doc: Remove remaining HTML entities.
+
+ doc: Improve the build page.
+
+2022-06-18 Roger Leigh <rleigh@codelibre.net>
+
+ doc: Add Sphinx conversion of all manpages.
+
+2022-06-18 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'dist-html' into 'master'
+ build: Distribute and install HTML documentation
+
+ See merge request libtiff/libtiff!352
+
+2022-06-13 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'pkgconfig' into 'master'
+ Adding Requires.private generation
+
+ See merge request libtiff/libtiff!355
+
+2022-06-13 Yishen Miao <mys721tx@gmail.com>
+
+ Adding Requires.private generation.
+ Adds Requires.private generation so that pkg-config can correctly find
+ the dependencies of libtiff.
+
+2022-06-11 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'ci-dist' into 'master'
+ ci: Archive distribution tar and zip files
+
+ See merge request libtiff/libtiff!354
+
+2022-06-11 Roger Leigh <rleigh@codelibre.net>
+
+ ci: Archive distribution tar and zip files.
+
+2022-06-11 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'export_TIFFClampDoubleToUInt32' into 'master'
+ libtiff.def: export _TIFFClampDoubleToUInt32
+
+ See merge request libtiff/libtiff!353
+
+2022-06-11 Even Rouault <even.rouault@spatialys.com>
+
+ libtiff.def: export _TIFFClampDoubleToUInt32.
+
+2022-06-11 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-415+427+428' into 'master'
+ fix the FPE in tiffcrop (#415, #427, and #428)
+
+ Closes #428, #427 et #415
+
+ See merge request libtiff/libtiff!346
+
+2022-06-11 4ugustus <wangdw.augustus@qq.com>
+
+ fix the FPE in tiffcrop (#415, #427, and #428)
+
+2022-06-11 Roger Leigh <rleigh@codelibre.net>
+
+ build: Distribute and install HTML documentation.
+
+2022-06-10 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tif_jpeg_warning_fix' into 'master'
+ tif_jpeg.c: fix error message
+
+ See merge request libtiff/libtiff!351
+
+2022-06-10 Even Rouault <even.rouault@spatialys.com>
+
+ tif_jpeg.c: fix error message.
+
+2022-06-10 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'android_libm' into 'master'
+ Fix dependency on libm on Android
+
+ See merge request libtiff/libtiff!350
+
+2022-06-09 Matthias Kuhn <matthias@opengis.ch>
+
+ Always link to libm if available.
+
+2022-06-05 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'vasyl5-master-patch-97651' into 'master'
+ libtoolize: command not found on macOS.
+
+ See merge request libtiff/libtiff!289
+
+2022-06-05 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'rst-docs' into 'master'
+ Convert HTML documentation to Sphinx RST
+
+ See merge request libtiff/libtiff!349
+
+2022-06-05 Roger Leigh <rleigh@codelibre.net>
+
+ Merge remote-tracking branch 'origin/master' into rst-docs.
+
+2022-06-05 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'cmake-xc-faxtable' into 'master'
+ cmake: Do not build faxtable target when cross-compiling
+
+ See merge request libtiff/libtiff!342
+
+2022-06-05 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'cmake-disable-options' into 'master'
+ Add options for disabling tools, tests, contrib and docs
+
+ See merge request libtiff/libtiff!343
+
+2022-06-05 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'cmake-msvc-options' into 'master'
+ cmake: Add MSVC options when building all libraries and executables
+
+ See merge request libtiff/libtiff!344
+
+2022-06-05 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'cmake-win32-libtiffxx-static' into 'master'
+ cmake: libtiffxx is static on win32
+
+ See merge request libtiff/libtiff!338
+
+2022-06-05 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'licence-file' into 'master'
+ Rename COPYRIGHT to LICENSE.md
+
+ See merge request libtiff/libtiff!345
+
+2022-06-05 Roger Leigh <rleigh@codelibre.net>
+
+ Rename COPYRIGHT to LICENSE.md.
+
+ doc: Fix make distcheck.
+
+ doc: Update automake configuration.
+
+ doc: Do not pass srcdir and builddir to sphinx-build.
+
+ doc: Additional top-level tidying.
+
+ doc: Tidy top-level index.
+
+ doc: Move bugs to project.
+
+ doc: Move misc to project.
+
+ doc: Move all BigTIFF documentation into specification directory.
+ * Remove the BigTIFF proposal since this has long been completed
+ * Update the BigTIFF PR to note completion of the work and replace
+ present with past tense.
+
+ doc: Split release history.
+ This permits the newer releases to be included in the top-level
+ toctree without polluting it with dozens of old releases.
+
+ doc: Correct accents.
+
+ doc: BigTIFF design markup improvements.
+
+ Add doc/_static.
+
+ doc: Move TIFF specification and design notes into subdirectory.
+
+ doc: Move releases into subdirectory.
+
+ doc: Mark up TIFF tech note 2.
+
+ doc: Use sphinxdox theme.
+ The sphix_rtd_theme formats complex tables badly.
+
+ doc: Clean up HTML tags.
+
+2022-06-04 Roger Leigh <rleigh@codelibre.net>
+
+ ci: Install Sphinx manual for use by GitLab pages.
+
+ doc: Use sphinx_rtd_theme.
+
+ Convert HTML documentation to Sphinx RST.
+ * Add CMake build logic
+ * Add Autotools build logic
+ * Move from html/ to doc/
+ * Manual pages are still generated HTML for the time being
+
+ git: Ignore common IDE build files.
+
+2022-06-04 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'ci-ubuntu-22.04' into 'master'
+ ci: Update to use Ubuntu 22.04 CI images
+
+ Closes #429
+
+ See merge request libtiff/libtiff!348
+
+2022-06-04 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'opengl-option' into 'master'
+ cmake: Add tiff-opengl option
+
+ See merge request libtiff/libtiff!340
+
+2022-06-04 Roger Leigh <rleigh@codelibre.net>
+
+ tiffdump: Avoid overflow warning when reading.
+
+ ci: Update to use Ubuntu 22.04 CI images.
+
+2022-06-04 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'master' into 'master'
+ Include stdlib.h in tif_lzw.c.
+
+ See merge request libtiff/libtiff!347
+
+2022-06-04 Brian Ledger <brian.peter.ledger@gmail.com>
+
+ Merge branch 'master' of https://gitlab.com/libtiff/libtiff.
+
+2022-06-04 Brian Ledger <brian.peter.ledger@gmail.com>
+
+ Include stdlib.h in tif_lzw.c.
+ In `tif_lzw.c`, a call is made to `_byteswap_uint64`. This is declared in `stdlib.h`. `stdlib.h` is not included in `tib_lzw.c`, so a name error may occur.
+
+ This change adds `#include stdlib.h` to `tif_lzw.c`, to prevent a name error from occuring when `stdlib.h` is not included.
+
+2022-05-29 Roger Leigh <rleigh@codelibre.net>
+
+ Add options for disabling tools, tests, contrib and docs.
+
+ cmake: Add MSVC options when building all libraries and executables.
+
+ cmake: Do not build faxtable target when cross-compiling.
+
+ cmake: Use add_compile_definitions and add_compile_options.
+ It seems that some CMake versions can't export targets using PRIVATE
+ linking, even though the private target is never used.
+
+ Merge remote-tracking branch 'origin/master' into cmake-msvc-options.
+
+ Merge remote-tracking branch 'origin/master' into cmake-win32-libtiffxx-static
+
+2022-05-29 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'ci-x64' into 'master'
+ ci: Remove arm64 temporarily
+
+ See merge request libtiff/libtiff!341
+
+2022-05-29 Roger Leigh <rleigh@codelibre.net>
+
+ ci: Remove arm64 temporarily.
+
+ autoconf: Add --disable-opengl option.
+
+ cmake: Add tiff-opengl option.
+
+ cmake: Add MSVC options when building all libraries and executables.
+
+ cmake: libtiffxx is static on win32.
+
+2022-05-22 Even Rouault <even.rouault@spatialys.com>
+
+ html/Makefile.am: add v4.4.0.html to docfiles.
+
+2022-05-20 Even Rouault <even.rouault@spatialys.com>
+
+ Update HOWTO-RELEASE with .tar.xz.
+
+ Prepare for release 4.4.0.
+
+2022-05-16 Even Rouault <even.rouault@spatialys.com>
+
+ libtiff v4.4.0 released
+
+2022-05-16 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'pkgconf_abs_path' into 'master'
+ Handle absolute paths in pkg-config file
+
+ See merge request libtiff/libtiff!333
+
+2022-05-16 Miloš Komarčević <miloskomarcevic@aim.com>
+
+ Handle absolute paths in pkg-config file.
+
+2022-05-15 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix-tests-with-ro-source-dir' into 'master'
+ cmake: allow running the tests with a read-only source directory
+
+ See merge request libtiff/libtiff!332
+
+2022-05-15 Alex Richardson <alexrichardson@google.com>
+
+ cmake: allow running the tests with a read-only source directory.
+ Prior to this commit CTest would invoke all simple_tests tests with the
+ current working directory set to the source directory. However, some of
+ the tests (e.g. rewrite) will output files to the current working
+ directory and will therefore fail when run with a read-only source
+ directory. This can happen e.g. when testing a cross-compiled version of
+ libtiff where the sources are mounted read-only in the virtual machine.
+
+ Simply changing the working directory to CMAKE_CURRENT_BINARY_DIR allows
+ all but raw_decode to pass. The raw_decode test looks for files in the
+ source directory, and uses the `srcdir` environment variable to find, so
+ we also have to add a set_tests_properties() call to specify that env var.
+
+2022-05-14 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffcrop_pipeline_error' into 'master'
+ tiffcrop: Fixes complain of pipeline "cmake-ninja-arm64" about abs() on...
+
+ See merge request libtiff/libtiff!331
+
+2022-05-14 Su Laus <sulau@freenet.de>
+
+ tiffcrop: Fixes complain of pipeline "cmake-ninja-arm64" about abs() on...
+
+2022-05-14 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'TIFFField_SetGetSize_CountSize' into 'master'
+ Public functions TIFFFieldSetGetSize() and TIFFieldSetGetCountSize() added.
+
+ See merge request libtiff/libtiff!284
+
+2022-05-14 Su Laus <sulau@freenet.de>
+
+ Public functions TIFFFieldSetGetSize() and TIFFieldSetGetCountSize() added.
+
+2022-05-13 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'jondo-master-patch-87274' into 'master'
+ Replace add_compile_definitions for CMake versions before 3.12 (#238)
+
+ See merge request libtiff/libtiff!330
+
+2022-05-13 Robert Pollak <robert.pollak@posteo.net>
+
+ Replace add_compile_definitions for CMake versions before 3.12 (#238)
+
+2022-05-13 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'master' into 'master'
+ Remove incorrect assert.
+
+ See merge request libtiff/libtiff!329
+
+2022-05-13 Ben Laurie <benl@google.com>
+
+ Remove incorrect assert.
+
+2022-05-10 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'Fix_Issue#330' into 'master'
+ tiffcrop: Fix issue #330 and some more from 320 to 349
+
+ Closes #330
+
+ See merge request libtiff/libtiff!298
+
+2022-05-10 Su Laus <sulau@freenet.de>
+
+ tiffcrop: Fix issue #330 and some more from 320 to 349.
+
+2022-05-10 Even Rouault <even.rouault@spatialys.com>
+
+ test_signed_tags.c: fix CID 1504376.
+
+2022-05-10 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_#29_tiffcp_orientationTag' into 'master'
+ tiffcp: Fix incomprehensible setting of orientation tag (fixes #29)
+
+ Closes #29
+
+ See merge request libtiff/libtiff!327
+
+2022-05-10 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'palette-8bit' into 'master'
+ tiff2pdf: handle 8-bit palette colormap
+
+ See merge request libtiff/libtiff!328
+
+2022-05-09 Jay Berkenbilt <ejb@ql.org>
+
+ tiff2pdf: handle 8-bit palette colormap.
+ If all the colors in a palette are in the range [0, 255], treat the
+ palette as an 8-bit colormap. This workaround already exists elsewhere
+ in the software including in tiff2ps.
+
+2022-05-08 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_#40_ReadSignedTags' into 'master'
+ Reading of signed tags added (fixes #40)
+
+ Closes #40
+
+ See merge request libtiff/libtiff!326
+
+2022-05-08 Su Laus <sulau@freenet.de>
+
+ Reading of signed tags added (fixes #40)
+
+2022-05-08 Even Rouault <even.rouault@spatialys.com>
+
+ Fix typos in comments.
+
+2022-05-08 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_400' into 'master'
+ tiffcp: avoid buffer overflow in "mode" string (fixes #400)
+
+ Closes #400
+
+ See merge request libtiff/libtiff!323
+
+2022-05-08 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'CheckForBigTiff' into 'master'
+ TIFFIsBigTiff() function added.
+
+ See merge request libtiff/libtiff!325
+
+2022-05-08 Su Laus <sulau@freenet.de>
+
+ TIFFIsBigTiff() function added.
+
+2022-05-01 Su_Laus <sulau@freenet.de>
+
+ tiffcp: Fix incomprehensible setting of orientation tag (fixes #29)
+
+2022-04-23 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_#8_FreeAnonTag' into 'master'
+ extra flag for anonymous (unknown) tags (fixes #8)
+
+ Closes #400 et #8
+
+ See merge request libtiff/libtiff!324
+
+2022-04-22 Even Rouault <even.rouault@spatialys.com>
+
+ tif_lzw.c: fix potential out-of-bounds error when trying to read in the same tile/strip after an error has occured (fixes #410)
+
+2022-04-06 Su_Laus <sulau@freenet.de>
+
+ extra flag for anonymous (unknown) tags (fixes #8)
+
+2022-04-02 Su_Laus <sulau@freenet.de>
+
+ tiffcp: avoid buffer overflow in "mode" string (fixes #400)
+
+2022-03-21 Even Rouault <even.rouault@spatialys.com>
+
+ avoid hang in TIFFRewriteDirectory() if a classic file > 4 GB is attempted to be created
+ Fixes https://github.com/OSGeo/gdal/issues/5479
+
+2022-03-19 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'Correct_tag_auto-registration_description' into 'master'
+ Correct reading description for anonymous tag auto-registration in addingtags.html (closes 353)
+
+ Closes #353
+
+ See merge request libtiff/libtiff!320
+
+2022-03-19 Su Laus <sulau@freenet.de>
+
+ Correct reading description for anonymous tag auto-registration in addingtags.html (closes 353)
+
+2022-03-18 Even Rouault <even.rouault@spatialys.com>
+
+ tif_lzw.c: avoid harmless unsigned-integer-overflow (https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=45741)
+
+2022-03-17 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_396' into 'master'
+ tiffcp: do not try to fetch compressor-specific tags when not appropriate (fixes #396)
+
+ Closes #396
+
+ See merge request libtiff/libtiff!316
+
+2022-03-17 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'Fix_cmake_warnings' into 'master'
+ Fix some CMake warnings
+
+ See merge request libtiff/libtiff!319
+
+2022-03-17 Su Laus <sulau@freenet.de>
+
+ Fix some CMake warnings.
+
+2022-03-17 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'lzw_decode_improvements' into 'master'
+ LZWDecode(): major speed improvements
+
+ See merge request libtiff/libtiff!318
+
+2022-03-16 Even Rouault <even.rouault@spatialys.com>
+
+ LZWDecode(): major speed improvements.
+ This mostly comes from dealing specifically with codes that expand to
+ 2, 3 and 4 bytes or more to avoid branches, and dealing with longer
+ repeated sequences (e.g. lots of bytes to 0).
+
+ With the following bench.c, execution time is 32% faster on a 8000x8000
+ 4 bands uint16 predictor=2 image that has a 1.6x compression ratio. with
+ gcc 9.4.0, on x86_64
+
+ bench.c:
+ ```
+ #include "tiffio.h"
+ #include <stdlib.h>
+ #include <stdint.h>
+
+ int main(int argc, char* argv[])
+ {
+ if( argc != 2 )
+ {
+ fprintf(stderr, "Usage: ./bench my.tif\n");
+ exit(1);
+ }
+ TIFF* tif = TIFFOpen(argv[1], "r");
+ if( tif == NULL )
+ {
+ fprintf(stderr, "Cannot open %s\n", argv[1]);
+ exit(1);
+ }
+ if( !TIFFIsTiled(tif) )
+ {
+ fprintf(stderr, "Only tiled image supported\n");
+ exit(1);
+ }
+ int tilesize = (int)TIFFTileSize(tif);
+ char* c = malloc(tilesize);
+ if( c == NULL )
+ {
+ fprintf(stderr, "Out of memory\n");
+ exit(1);
+ }
+ const uint32_t numtiles = TIFFNumberOfTiles(tif);
+ //int numloops = 4 * (int)(1e9 / ((double)tilesize * numtiles));
+ //printf("Number of loops: %d\n", numloops);
+ int numloops = 1;
+ for(int i =0; i< numloops; i++)
+ {
+ for(uint32_t tileindex = 0; tileindex < numtiles; tileindex++ )
+ {
+ TIFFReadEncodedTile(tif, tileindex, c, tilesize);
+ }
+ }
+ free(c);
+ TIFFClose(tif);
+ return 0;
+ }
+ ```
+
+2022-03-16 Even Rouault <even.rouault@spatialys.com>
+
+ LZWDecode(): modest speed improvement: fetch input data by chunks of the largest natural integer of the architecture
+
+2022-03-14 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'kmilos-master-patch-45885' into 'master'
+ Correct fix for the pkgconf file relative paths
+
+ See merge request libtiff/libtiff!317
+
+2022-03-10 Even Rouault <even.rouault@spatialys.com>
+
+ tif_lzw.c: make LZW_CHECKEOS non-optional.
+
+ tiffsplit.c: fix compiler warning on 32-bit.
+
+2022-03-10 Miloš Komarčević <miloskomarcevic@aim.com>
+
+ Correct fix for the pkgconf file relative paths.
+
+2022-03-10 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-278' into 'master'
+ fix heap buffer overflow in tiffcp (#278)
+
+ Closes #278
+
+ See merge request libtiff/libtiff!311
+
+2022-03-10 4ugustus <wangdw.augustus@qq.com>
+
+ fix heap buffer overflow in tiffcp (#278)
+
+2022-03-09 Even Rouault <even.rouault@spatialys.com>
+
+ tiffcp: do not try to fetch compressor-specific tags when not appropriate (fixes #396)
+
+2022-03-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'i_am_a_unsympathetic_person' into 'master'
+ index.html: make it clear that I'm a unsympathetic person
+
+ See merge request libtiff/libtiff!315
+
+2022-03-09 Even Rouault <even.rouault@spatialys.com>
+
+ index.html: make it clear that I'm a unsympathetic person.
+
+2022-03-08 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'Fix_Issue#395' into 'master'
+ tiffcrop: fix issue #395: generation of strange section images.
+
+ Closes #395
+
+ See merge request libtiff/libtiff!312
+
+2022-03-08 Su Laus <sulau@freenet.de>
+
+ tiffcrop: fix issue #395: generation of strange section images.
+
+2022-03-08 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'Fix_Issue#380' into 'master'
+ tiffcrop: fix issue #380 and #382 heap buffer overflow in extractImageSection
+
+ Closes #382 et #380
+
+ See merge request libtiff/libtiff!307
+
+2022-03-08 Su Laus <sulau@freenet.de>
+
+ tiffcrop: fix issue #380 and #382 heap buffer overflow in extractImageSection
+
+2022-03-08 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-392' into 'master'
+ add checks for return value of limitMalloc (#392)
+
+ Closes #392
+
+ See merge request libtiff/libtiff!314
+
+2022-03-08 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-393' into 'master'
+ fix the FPE in tiffcrop (#393)
+
+ Closes #393
+
+ See merge request libtiff/libtiff!310
+
+2022-03-08 4ugustus <wangdw.augustus@qq.com>
+
+ fix the FPE in tiffcrop (#393)
+
+2022-03-08 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'kmilos-master-patch-56785' into 'master'
+ Fix pkgconf file relative paths
+
+ Closes #394
+
+ See merge request libtiff/libtiff!309
+
+2022-03-07 Augustus <wangdw.augustus@qq.com>
+
+ add checks for return value of limitMalloc (#392)
+
+2022-03-02 Miloš Komarčević <miloskomarcevic@aim.com>
+
+ Fix pkgconf file relative paths.
+
+2022-02-25 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_385' into 'master'
+ tif_jbig.c: fix crash when reading a file with multiple IFD in memory-mapped...
+
+ Closes #385
+
+ See merge request libtiff/libtiff!306
+
+2022-02-24 Even Rouault <even.rouault@spatialys.com>
+
+ tif_jbig.c: fix crash when reading a file with multiple IFD in memory-mapped mode and when bit reversal is needed (fixes #385)
+
+2022-02-24 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'string_size_limit' into 'master'
+ _TIFFVSetField(): when passing a string without explicit length, check that...
+
+ See merge request libtiff/libtiff!304
+
+2022-02-24 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'TIFFClientOpen_cleanup' into 'master'
+ TIFFClientOpen(): remove useless initializations of tif_rawcc and tif_flags...
+
+ See merge request libtiff/libtiff!303
+
+2022-02-20 Even Rouault <even.rouault@spatialys.com>
+
+ Remove extra word in comment.
+
+ TIFFPrintDirectory(): avoid potential multi-threading issue when reading the DotRange tag
+ The severity of the issue would be low (mix of values displayed) and the
+ time window where that would occur would be short.
+
+ Constify signature of _TIFFsetXXXXArray() functions, and remove unused _TIFFsetString()
+
+ _TIFFVSetField(): when passing a string without explicit length, check that the length doesn't except the 1 << 31 maximum bytes we support
+
+2022-02-19 Even Rouault <even.rouault@spatialys.com>
+
+ tiffsplit.c: fix use after free introduced in master per commit 8ed97f401552a2b4300d3c489b03dcada86a21fd (related to #290)
+
+2022-02-19 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'Fix_Issue#284' into 'master'
+ tiff2ps: In limitMalloc() check for negative size (fixes #284)
+
+ Closes #284
+
+ See merge request libtiff/libtiff!300
+
+2022-02-19 Su Laus <sulau@freenet.de>
+
+ tiff2ps: In limitMalloc() check for negative size (fixes #284)
+
+2022-02-19 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_288' into 'master'
+ tiffinfo: limit more memory allocations using -M switch (fixes #288)
+
+ Closes #288
+
+ See merge request libtiff/libtiff!299
+
+2022-02-19 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'Fix_Issue#290' into 'master'
+ tiffsplit: limitMalloc() and getopt() introduced and more error messages. (fixes #290)
+
+ Closes #290
+
+ See merge request libtiff/libtiff!301
+
+2022-02-19 Su Laus <sulau@freenet.de>
+
+ tiffsplit: limitMalloc() and getopt() introduced and more error messages. (fixes #290)
+
+2022-02-19 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'Fix_Issue#273_#275' into 'master'
+ tiffcrop: buffsize check formula in loadImage() amended (fixes #273,#275)
+
+ Closes #275 et #273
+
+ See merge request libtiff/libtiff!302
+
+2022-02-19 Su Laus <sulau@freenet.de>
+
+ tiffcrop: buffsize check formula in loadImage() amended (fixes #273,#275)
+
+2022-02-19 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFClientOpen(): remove useless initializations of tif_rawcc and tif_flags after TIFFReadDirectory()
+ Those initializations date back to the initial commit of libtiff, but I
+ strongly suspect there are no longer needed those days.
+ Setting tif_rawcc to (tmsize_t)-1 is weird. AFAICS, nowhere else in the library
+ -1 is used as a special markeri for that field. Immediately after TIFFReadDirectory()
+ returns it is set to 0, and this is the value used in tif_read.c/tif_write.c to
+ reset it.
+ And setting the TIFF_BUFFERSETUP bit of tif_flags is even more
+ suspicious as the only place where it is set otherwise is in
+ TIFFWriteBufferSetup(). I suspect this bogus setting of the flag was the
+ reason for commit dbf2339a1 where BUFFERCHECK() in addition to checking
+ the bit also checked the tif_rawdata against nullptr.
+
+ If setting those 2 fields was needed, it would mean that TIFFClientOpen() with the
+ 'h' hint to disable automatic TIFFReadDirectory() would be broken,
+ because someone issuing a manual TIFFReadDirectory() couldn't set them,
+ as being private members.
+
+ The libtiff test suite is happy with that change, and the GDAL one too.
+
+2022-02-19 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFFetchNormalTag(): speed optimization when reading a (very large) nul-terminated ASCII tag
+
+ TIFFWriteDirectoryTagData(): turn assertion on data length into a runtime check
+ For example, the assertion could actually be triggered when writing an
+ ASCII tag with more than 1 << 31 bytes.
+
+2022-02-17 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFFetchNormalTag(): avoid calling memcpy() with a null source pointer and size of zero (fixes #383)
+
+2022-02-15 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'tl/fix-cpack' into 'master'
+ Fix packaging with CPack
+
+ See merge request libtiff/libtiff!292
+
+2022-02-11 Even Rouault <even.rouault@spatialys.com>
+
+ tiffinfo: limit more memory allocations using -M switch (fixes #288)
+
+ tif_dirwrite.c: take into account COMPRESSION_JXL.
+
+2022-02-11 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'predictor_2_64bit' into 'master'
+ Predictor 2 (horizontal differenciation): support 64-bit
+
+ See merge request libtiff/libtiff!296
+
+2022-02-10 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'Fix_Issue#365' into 'master'
+ tiff2pdf: Fixes issues #365, #258 and #257 related to initializing 't2p->pdf_compressionquality'.
+
+ Closes #257, #258 et #365
+
+ See merge request libtiff/libtiff!297
+
+2022-02-10 Su Laus <sulau@freenet.de>
+
+ tiff2pdf: Fixes issues #365, #258 and #257 related to initializing 't2p->pdf_compressionquality'.
+
+2022-02-09 Even Rouault <even.rouault@spatialys.com>
+
+ Predictor 2 (horizontal differenciation): support 64-bit.
+ There's no reason not to support 64-bit. The TIFF 6 specification
+ doesn't say anything about that (and even mention 4-bit, which we don't
+ support)
+
+2022-02-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'Fix_Issue#352' into 'master'
+ tiffcrop.c: Fix issue #352 heap-buffer-overflow by correcting uint32_t underflow.
+
+ Closes #352
+
+ See merge request libtiff/libtiff!294
+
+2022-02-09 Su Laus <sulau@freenet.de>
+
+ tiffcrop.c: Fix issue #352 heap-buffer-overflow by correcting uint32_t underflow.
+
+2022-02-08 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'custom_dir_EXIF_Coverity_fixes' into 'master'
+ Fix Coverity Scan report issues for custom_dir_EXIF_231.c and test_directory.c
+
+ See merge request libtiff/libtiff!295
+
+2022-02-08 Su Laus <sulau@freenet.de>
+
+ Fix Coverity Scan report issues for custom_dir_EXIF_231.c and test_directory.c
+
+2022-02-06 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'cmake-test' into 'master'
+ Correct CMake testing
+
+ Closes #317
+
+ See merge request libtiff/libtiff!291
+
+2022-02-06 Even Rouault <even.rouault@spatialys.com>
+
+ LogLuvEncode32(): avoid undefined behaviour of left shift on a signed integer
+
+ TIFFFetchStripThing(): avoid calling memcpy() with a null source pointer and size of zero (fixes #362)
+
+2022-02-05 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFReadDirectory(): avoid calling memcpy() with a null source pointer and size of zero (fixes #362)
+
+2022-01-29 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'Jamaika1-master-patch-68264' into 'master'
+ Added stdlib.h
+
+ See merge request libtiff/libtiff!293
+
+2022-01-29 Jamaika <lukaszcz18@wp.pl>
+
+ tif_win32.c: include stdlib.h.
+
+2022-01-28 Timothy Lyanguzov <timothy.lyanguzov@sap.com>
+
+ Fix packaging with CPack.
+ Replace all CMAKE_INSTALL_FULL_<DIR> with CMAKE_INSTALL_<DIR> to allow CPack setting CMAKE_INSTALL_PREFIX
+
+2022-01-25 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'master' into 'master'
+ Fix the global-buffer-overflow in tiffset
+
+ See merge request libtiff/libtiff!287
+
+2022-01-25 4ugustus <wangdw.augustus@qq.com>
+
+ tiffset: fix global-buffer-overflow for ASCII tags where count is required (fixes #355)
+
+2022-01-23 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'autogen' into 'master'
+ Fix autogen.sh permissions issues during mv
+
+ See merge request libtiff/libtiff!290
+
+2022-01-23 Roger Leigh <rleigh@codelibre.net>
+
+ Correct CMake testing.
+ * Use functions rather than macros to avoid problems with variables in
+ conditions (since macro arguments are not variables)
+ * Conditionally add to file lists and test program lists based upon the
+ configuration options (e.g. JPEG and old-JPEG availability)
+ * Sync tests, files and option usage with current automake usage
+
+2022-01-19 Will Cohen <willcohen@users.noreply.github.com>
+
+ autogen.sh: mv -f for config.sub and config.guess.
+
+2022-01-12 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFYCbCrToRGBInit(): avoid Integer-overflow in gdal_TIFFYCbCrToRGBInit. Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=43559
+
+2022-01-10 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_TIFFFillStrip_wrong_check' into 'master'
+ Fix sanity check in TIFFFillStrip()/TIFFFillStrile()
+
+ See merge request libtiff/libtiff!288
+
+2022-01-10 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFFillStrip()/TIFFFillStrile(): remove useless test.
+
+ Fix sanity check in TIFFFillStrip()/TIFFFillStrile()
+ A sanity check comparing the compressed vs uncompressed file that was
+ originally written 'correctly' but relied on undefined behaviour was
+ changed in 1b5e3b6a23827c33acf19ad50ce5ce78f12b3773 in an incorrect way.
+ Fix that. Credits to @burn for spotting this in
+ https://gitlab.com/libtiff/libtiff/-/issues/343#note_806089714
+
+2021-12-29 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'Fix_FieldName_NULL' into 'master'
+ Fix Issue #354 Segmentation Fault due to field_name=NULL
+
+ See merge request libtiff/libtiff!285
+
+2021-12-29 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'mingw-static' into 'master'
+ build: Fix static library imports in mingw
+
+ See merge request libtiff/libtiff!286
+
+2021-12-29 Biswapriyo Nath <nathbappai@gmail.com>
+
+ build: Fix static library imports in mingw.
+ This defines LERC_STATIC while creating libtiff static library
+ in Win32 platform in presence of lerc library. Otherwise, the
+ static library import lerc APIs with dllimport attribute and
+ thus linked with shared lerc library.
+
+2021-12-28 Su_Laus <sulau@freenet.de>
+
+ Fix Issue #354 Segmentation Fault due to field_name=NULL.
+
+2021-12-17 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_342' into 'master'
+ TIFFGetField(TIFFTAG_STRIPBYTECOUNTS/TIFFTAG_STRIPOFFSETS): return error if...
+
+ Closes #342
+
+ See merge request libtiff/libtiff!283
+
+2021-12-16 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFGetField(TIFFTAG_STRIPBYTECOUNTS/TIFFTAG_STRIPOFFSETS): return error if returned pointer is NULL (fixes #342)
+
+ tiff2pdf: validate TIFFGetField(input, TIFFTAG_STRIPBYTECOUNTS, &sbc) return (fixes #342)
+
+2021-12-16 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'master' into 'master'
+ fix raw2tiff floating point exception(fixes #338)
+
+ Closes #338
+
+ See merge request libtiff/libtiff!282
+
+2021-12-16 t.feng <t.feng94@foxmail.com>
+
+ raw2tiff: check that band number if not zero to avoid floating point exception(fixes #338)
+
+2021-12-14 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_337' into 'master'
+ OJPEG: avoid assertion when using TIFFReadScanline() (fixes #337)
+
+ Closes #337
+
+ See merge request libtiff/libtiff!280
+
+2021-12-13 Even Rouault <even.rouault@spatialys.com>
+
+ OJPEG: avoid assertion when using TIFFReadScanline() (fixes #337)
+ Note: my analyis of the issue would be that the use of the scanline API
+ is currently propably broken with OJPEG.
+
+2021-12-10 Even Rouault <even.rouault@spatialys.com>
+
+ JPEG 12bit: make it easier for GDAL's RENAME_INTERNAL_LIBTIFF_SYMBOLS mode
+
+2021-12-09 Even Rouault <even.rouault@spatialys.com>
+
+ tif_lzw.c: other warning fixes.
+
+ tif_lzw.c: fix warnings of previous commit.
+
+2021-12-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'lzw_2gb_windows' into 'master'
+ LZW codec: fix support for strips/tiles > 2 GB on Windows
+
+ See merge request libtiff/libtiff!279
+
+2021-12-08 Even Rouault <even.rouault@spatialys.com>
+
+ LZW codec: fix support for strips/tiles > 2 GB on Windows.
+
+2021-12-07 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_287' into 'master'
+ tiffinfo: add a -M switch to define the maximum heap allocation, and default...
+
+ Closes #287
+
+ See merge request libtiff/libtiff!278
+
+2021-12-06 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_319' into 'master'
+ TIFFReadDirectory: fix OJPEG hack (fixes #319)
+
+ Closes #319
+
+ See merge request libtiff/libtiff!277
+
+2021-12-06 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_309' into 'master'
+ TIFFAppendToStrip(): fix rewrite-in-place logic (fixes #309)
+
+ Closes #309
+
+ See merge request libtiff/libtiff!276
+
+2021-12-05 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'b1' into 'master'
+ Fix resource leak on error path
+
+ See merge request libtiff/libtiff!263
+
+2021-12-05 bonniegong <yuanjungong96@gmail.com>
+
+ rast2tiff: Fix resource leak on error path.
+
+2021-12-05 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffsplit-leak' into 'master'
+ tiffsplit.c: Fix memleak before exit
+
+ See merge request libtiff/libtiff!270
+
+2021-12-05 Even Rouault <even.rouault@spatialys.com>
+
+ tiffinfo: add a -M switch to define the maximum heap allocation, and default it to 256 MiB (fixes #287)
+
+ tiffinfo: fix read of invalid pointer in TIFFReadRawDataTiled() (fixes #295)
+
+2021-12-05 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFReadDirectory: fix OJPEG hack (fixes #319)
+ to avoid having the size of the strip arrays inconsistent with the
+ number of strips returned by TIFFNumberOfStrips(), which may cause
+ out-ouf-bounds array read afterwards.
+
+ One of the OJPEG hack that alters SamplesPerPixel may influence the
+ number of strips. Hence compute tif_dir.td_nstrips only afterwards.
+
+2021-12-04 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFAppendToStrip(): fix rewrite-in-place logic (fixes #309)
+ Properly reset tif_curoff when writing strips/tiles
+
+2021-12-03 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFReInitJPEG_12(): avoid warning about unused variable in -DNDEBUG.
+
+2021-12-01 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_316' into 'master'
+ TIFFReadCustomDirectory(): avoid crash when reading SubjectDistance tag on a non EXIF directory
+
+ Closes #316
+
+ See merge request libtiff/libtiff!273
+
+2021-12-01 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'VisualStudio_warnings_suppress' into 'master'
+ Suppress unnecessary warnings in Visual Studio in AppVeyor test.
+
+ See merge request libtiff/libtiff!234
+
+2021-11-30 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFReadCustomDirectory(): avoid crash when reading SubjectDistance tag on a non EXIF directory
+ Fixes #316
+
+ The Valgrind trace was
+ ```
+ TIFFReadCustomDirectory: Warning, Unknown field with tag 37382 (0x9206) encountered.
+ ==3277355== Invalid read of size 1
+ ==3277355== at 0x4842B60: memmove (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
+ ==3277355== by 0x48BB799: _TIFFmemcpy (tif_unix.c:346)
+ ==3277355== by 0x485B3CB: _TIFFVSetField (tif_dir.c:647)
+ ==3277355== by 0x485C125: TIFFVSetField (tif_dir.c:890)
+ ==3277355== by 0x485BEDC: TIFFSetField (tif_dir.c:834)
+ ==3277355== by 0x486DA9A: TIFFFetchSubjectDistance (tif_dirread.c:5826)
+ ==3277355== by 0x4869E35: TIFFReadCustomDirectory (tif_dirread.c:4530)
+ ==3277355== by 0x4869F0A: TIFFReadGPSDirectory (tif_dirread.c:4564)
+ ==3277355== by 0x10AA7A: main (tiffinfo.c:171)
+ ==3277355== Address 0x3fc856aaaaaaaaab is not stack'd, malloc'd or (recently) free'd
+ ==3277355==
+ ```
+
+2021-11-29 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'add-null-check' into 'master'
+ Added missing null check.
+
+ See merge request libtiff/libtiff!274
+
+2021-11-28 Dirk Lemstra <dirk@lemstra.org>
+
+ Added missing null check.
+
+2021-11-26 Even Rouault <even.rouault@spatialys.com>
+
+ tif_print.c: remove duplicated if() in previous commit.
+
+2021-11-26 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'GPS_Print_BugFix' into 'master'
+ Fix Segmentation fault printing GPS directory if Altitude tag is present (tif_print.c/tiffinfo.c)
+
+ See merge request libtiff/libtiff!272
+
+2021-11-26 Su Laus <sulau@freenet.de>
+
+ Fix Segmentation fault printing GPS directory if Altitude tag is present (tif_print.c/tiffinfo.c)
+
+2021-11-01 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'cmake_tiffconf' into 'master'
+ Fix STRIPCHOP_DEFAULT value in CMake builds
+
+ See merge request libtiff/libtiff!271
+
+2021-11-01 Even Rouault <even.rouault@spatialys.com>
+
+ Fix STRIPCHOP_DEFAULT value in CMake builds.
+ CMake builds erroneously used value 1 instead of TIFF_STRIPCHOP, which
+ resulted in strip chopping not being enabled by default.
+
+2021-10-26 Even Rouault <even.rouault@spatialys.com>
+
+ tif_jpeg.c: typo fix.
+
+2021-10-24 Han Han <hanhanzhiyeqianke@gmail.com>
+
+ tiffsplit.c: Fix memleak before exit.
+ Details of the memleak:
+ $ valgrind --leak-check=full tiffsplit id:001763,sync:fuzzer07,src:001641,+cov
+
+ ==2090657==
+ ==2090657== HEAP SUMMARY:
+ ==2090657== in use at exit: 13,517 bytes in 17 blocks
+ ==2090657== total heap usage: 41 allocs, 24 frees, 29,351 bytes allocated
+ ==2090657==
+ ==2090657== 2,473 (1,249 direct, 1,224 indirect) bytes in 1 blocks are definitely lost in loss record 10 of 13
+ ==2090657== at 0x484086F: malloc (vg_replace_malloc.c:381)
+ ==2090657== by 0x48BF35C: TIFFClientOpen (tif_open.c:118)
+ ==2090657== by 0x48CF058: TIFFFdOpen (tif_unix.c:209)
+ ==2090657== by 0x48CF0C4: TIFFOpen (tif_unix.c:248)
+ ==2090657== by 0x10954C: main (tiffsplit.c:91)
+ ==2090657==
+ ==2090657== 11,044 (1,300 direct, 9,744 indirect) bytes in 1 blocks are definitely lost in loss record 13 of 13
+ ==2090657== at 0x484086F: malloc (vg_replace_malloc.c:381)
+ ==2090657== by 0x48BF35C: TIFFClientOpen (tif_open.c:118)
+ ==2090657== by 0x48CF058: TIFFFdOpen (tif_unix.c:209)
+ ==2090657== by 0x48CF0C4: TIFFOpen (tif_unix.c:248)
+ ==2090657== by 0x1093D9: main (tiffsplit.c:75)
+ ==2090657==
+ ==2090657== LEAK SUMMARY:
+ ==2090657== definitely lost: 2,549 bytes in 2 blocks
+ ==2090657== indirectly lost: 10,968 bytes in 15 blocks
+ ==2090657== possibly lost: 0 bytes in 0 blocks
+ ==2090657== still reachable: 0 bytes in 0 blocks
+ ==2090657== suppressed: 0 bytes in 0 blocks
+ ==2090657==
+ ==2090657== For lists of detected and suppressed errors, rerun with: -s
+ ==2090657== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
+
+2021-10-20 Even Rouault <even.rouault@spatialys.com>
+
+ tif_webp.c: add explicit cast to please MSVC verbose warnings.
+
+ tif_webp.c: white space fixing.
+
+2021-10-04 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'work/amyspark/psd-blobs' into 'master'
+ Enable writing Photoshop blobs
+
+ See merge request libtiff/libtiff!269
+
+2021-10-04 L. E. Segovia <amy@amyspark.me>
+
+ Enable writing Photoshop blobs.
+
+2021-09-29 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'remove_packbits_hack' into 'master'
+ PackBitsDecode: remove hack for when char is unsigned.
+
+ See merge request libtiff/libtiff!267
+
+2021-09-28 Even Rouault <even.rouault@spatialys.com>
+
+ PackBitsDecode: remove hack for when char is unsigned.
+ The function has a hack for platforms where char is unsigned. This is
+ better replaced by making bp a int8_t* pointer, which is guaranteed to
+ be signed.
+
+2021-09-27 Even Rouault <even.rouault@spatialys.com>
+
+ tiffcrop.c: remove useless 'set but not read' variables.
+
+2021-09-23 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_gdal_4538' into 'master'
+ TIFFAppendToStrip(): fix rewrite-in-place logic
+
+ See merge request libtiff/libtiff!266
+
+2021-09-23 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFAppendToStrip(): fix rewrite-in-place logic.
+ reproducable in particular with packbits compression.
+
+ Fixes https://github.com/OSGeo/gdal/issues/4538
+
+2021-09-17 Even Rouault <even.rouault@spatialys.com>
+
+ tif_lzw.c: silence compiler warning about set but not used variable with recent clang
+
+2021-09-07 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_cygwin' into 'master'
+ Fix build warnings on cygwin about 'argument 1 of type 'float[3]' with...
+
+ See merge request libtiff/libtiff!265
+
+2021-09-06 Even Rouault <even.rouault@spatialys.com>
+
+ test/rational_precision2double.c: add missing curly braces to fix -Werror=misleading-indentation
+
+2021-09-05 Even Rouault <even.rouault@spatialys.com>
+
+ Fix build warnings on cygwin about 'argument 1 of type 'float[3]' with mismatched bound [-Werror=array-parameter=]'
+
+2021-09-05 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'rewrite-fix' into 'master'
+ Fix TIFFRewriteDirectory discarding directories after the rewritten one
+
+ See merge request libtiff/libtiff!264
+
+2021-09-05 Facundo Tuesca <facu@tuesca.com>
+
+ tif_dirwrite.c: Fix TIFFRewriteDirectory discarding directories.
+ This fixes a bug caused by the `tif_lastdiroff` optimization when
+ rewriting directories.
+
+ Rewriting the Nth directory temporarily zeroes the pointer to it
+ (located in the N-1th directory) and relies on `TIFFLinkDirectory`
+ traversing the whole directory list to find the zeroed pointer and
+ linking the rewritten directory to it. Since `TIFFLinkDirectory` skips
+ the traversal when `tif_lastdiroff` is set, this change unsets it
+ to force the full traversal when rewriting a directory.
+
+ A test to catch this particular issue is also added.
+
+2021-09-01 Even Rouault <even.rouault@spatialys.com>
+
+ test_directory.c: fix compiler warnings.
+
+2021-09-01 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'multipage-optimization' into 'master'
+ Keep track of last directory to improve performance for large multi-page files
+
+ See merge request libtiff/libtiff!262
+
+2021-08-28 Facundo Tuesca <facu@tuesca.com>
+
+ Add field to keep track of last written directory.
+ This adds a new `tif_lastdiroff` field to the TIFF data structure
+ and uses it to store the offset of the last written directory.
+
+ Appending a new directory required traversing the whole file
+ to find the last directory. By keeping track of its offset in this
+ new field, the search is no longer necessary.
+
+ Since this offset is only stored in-memory, the first directory
+ append after opening a file will have to transverse the whole
+ directory list. Subsequent calls will have access to the last
+ offset, avoiding the transversal.
+
+2021-08-13 Even Rouault <even.rouault@spatialys.com>
+
+ tif_jpeg.c: fix memory leak on error code path for JPEG 12 bit (CID 1086702)
+
+2021-07-29 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'jpeg12' into 'master'
+ Enable JPEG 12bit support with a libjpeg that has a different ABI than the one for 8bit support
+
+ See merge request libtiff/libtiff!261
+
+2021-07-28 Even Rouault <even.rouault@spatialys.com>
+
+ Reformat tif_jpeg.c and tif_jpeg_12.c with clang-format-10.
+
+2021-07-27 Even Rouault <even.rouault@spatialys.com>
+
+ Enable JPEG 12bit support with a libjpeg that has a different ABI than the one for 8bit support
+ See https://github.com/OSGeo/gdal/pull/4139 for more details
+
+ Note: this hasn't been tested for standalone libtiff builds.
+
+2021-07-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'wip/export-targets' into 'master'
+ Export tiff targets
+
+ See merge request libtiff/libtiff!258
+
+2021-07-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'pkgconfig' into 'master'
+ Add version and requirements to pc file
+
+ See merge request libtiff/libtiff!256
+
+2021-07-09 Kai Pastor <8989969-dg0yt@users.noreply.gitlab.com>
+
+ Fix version in libtiff-4.pc.in, and CMake build: Add requirements to pc file
+
+2021-07-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'cmake' into 'master'
+ Fix build issues with CMake 3.10
+
+ See merge request libtiff/libtiff!260
+
+2021-07-04 Kai Pastor <dg0yt@darc.de>
+
+ Fix reconfiguration with cmake.
+
+ Fix build with CMake 3.10.
+
+2021-06-28 Milian Wolff <milian.wolff@kdab.com>
+
+ Export tiff targets.
+ Fixes build when including libtiff as a cmake subproject into
+ another project and then installing a target from there which
+ depends on tiff. For example we could end up with:
+
+ ```
+ CMake Error in 3rdParty/diplib/CMakeLists.txt:
+ export called with target "DIP" which requires target "tiff" that is not in
+ any export set.
+ ```
+
+2021-06-21 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'libjpeg9d_support_simplification' into 'master'
+ tif_jpeg.c: simplify libjpeg 9d support (refs #266)
+
+ See merge request libtiff/libtiff!257
+
+2021-06-20 Even Rouault <even.rouault@spatialys.com>
+
+ tif_jpeg.c: simplify libjpeg 9d support (refs #266)
+ Credits to Guido Vollbeding for the suggestion
+
+2021-06-15 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'jpeg_in_tiff_jpeg_9d' into 'master'
+ tif_jpeg.c: workaround bug of libjpeg 9d that defers Huffman table creation
+
+ Closes #266
+
+ See merge request libtiff/libtiff!255
+
+2021-06-15 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'jpeg_disable_progressive_with_mozjpeg' into 'master'
+ tif_jpeg.c: do not emit progressive scans with mozjpeg and force optimize_coding
+
+ See merge request libtiff/libtiff!254
+
+2021-06-12 Even Rouault <even.rouault@spatialys.com>
+
+ tif_jpeg.c: with mozjpeg, disable emission of Huffman tables in JpegTables tag, and use optimize_coding
+
+2021-06-10 Even Rouault <even.rouault@spatialys.com>
+
+ tif_jpeg.c: workaround bug of libjpeg 9d that defers Huffman table creation
+ Fixes #266
+
+ libjpeg-9d no longer creates default Huffman tables in
+ jpeg_set_defaults(), which make their emission in the JpegTables tag no
+ longer possible. Workaround that by borrowing code from libjpeg to
+ manually create them when they are not initialized.
+
+2021-06-10 Even Rouault <even.rouault@spatialys.com>
+
+ tif_jpeg.c: do not emit progressive scans with mozjpeg.
+ Relates to #266
+
+ - On writing, explicitly disable progressive scans, which is normally
+ not enabled, except with mozjpeg.
+ - On reading, emit a warning when encountering progressive scans.
+
+2021-06-10 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix-263' into 'master'
+ Fix memory leak in tiff2pdf
+
+ See merge request libtiff/libtiff!249
+
+2021-06-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'diizzyy-master-patch-20521' into 'master'
+ html: Add missing pages when using CMake
+
+ See merge request libtiff/libtiff!242
+
+2021-06-09 Daniel E <daniel.engberg.lists@pyret.net>
+
+ html: Add missing pages when using CMake.
+
+2021-06-07 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'ci-reenable-cygwin' into 'master'
+ ci: Re-enable cygwin builds
+
+ See merge request libtiff/libtiff!252
+
+2021-06-06 Roger Leigh <rleigh@codelibre.net>
+
+ ci: Re-enable cygwin builds.
+
+2021-06-06 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'ci-arm64' into 'master'
+ ci: Add arm64 build
+
+ See merge request libtiff/libtiff!251
+
+2021-06-06 Roger Leigh <rleigh@codelibre.net>
+
+ ci: Add arm64 build.
+
+2021-06-05 Even Rouault <even.rouault@spatialys.com>
+
+ _TIFFRewriteField(): fix when writing a IFD with a single tile that is a sparse one, on big endian hosts
+
+2021-06-02 Timothy Lyanguzov <timothy.lyanguzov@sap.com>
+
+ Fix memory leak in tiff2pdf.
+
+2021-06-01 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'lzw_cleanup' into 'master'
+ tif_lzw.c: cleanup, no functional change
+
+ See merge request libtiff/libtiff!248
+
+2021-05-31 Even Rouault <even.rouault@spatialys.com>
+
+ tif_lzw.c: cleanup, no functional change.
+
+2021-05-22 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'appveyor_disable_cygwin' into 'master'
+ .appveyor.yml: disable cygwin configs for now as they are broken
+
+ See merge request libtiff/libtiff!247
+
+2021-05-22 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'zstd_reuse_objects' into 'master'
+ ZSTD codec: reuse compressor/decompressor objects
+
+ See merge request libtiff/libtiff!246
+
+2021-05-22 Even Rouault <even.rouault@spatialys.com>
+
+ .appveyor.yml: disable cygwin configs for now as they are broken.
+
+ ZSTD codec: reuse compressor/decompressor objects.
+ No need to recreate them each time in the PreEncode/Decode functions.
+ They can be reused if already existing.
+
+2021-05-08 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'adobedeflate-fix' into 'master'
+ Fix all remaining uses of legacy Deflate compression id and warn on use
+
+ See merge request libtiff/libtiff!245
+
+2021-05-08 David Ryskalczyk <david.rysk@gmail.com>
+
+ Fix all remaining uses of legacy Deflate compression id and warn on use.
+
+2021-05-06 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'improve_tiffinfo_tiffdump_for_gdal_tags' into 'master'
+ tiffinfo/tiffdump: improve output for GDAL tags
+
+ See merge request libtiff/libtiff!244
+
+2021-05-03 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-252' into 'master'
+ Prevent adding root directory to include list
+
+ Closes #252 et #218
+
+ See merge request libtiff/libtiff!243
+
+2021-05-03 Even Rouault <even.rouault@spatialys.com>
+
+ tiffinfo/tiffdump: improve output for GDAL tags.
+
+2021-04-29 Timothy Lyanguzov <timothy.lyanguzov@sap.com>
+
+ Prevent adding root directory to include list.
+ there is a file VERSION in the root directory which clashes with C++20 standard header <version>
+ "config.h" file is created in "config" subdirectory to prevent adding "-I.." to generated Makefile
+
+ closes #218, #252
+
+2021-04-23 Laszlo Boszormenyi (GCS) <gcs@debian.org>
+
+ fix TIFFReadRawStrip man and HTML page typo.
+ From https://github.com/conda-forge/libtiff-feedstock/blob/master/recipe/patches/fix_TIFFReadRawStrip_man_page_typo.patch
+
+2021-04-20 Even Rouault <even.rouault@spatialys.com>
+
+ HOWTO-RELEASE: update.
+
+2021-04-18 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'lerc_zstd_deflate' into 'master'
+ Make LERC_SUPPORT conditional on ZLIB_SUPPORT. Make display of lerc options in tiffcp depend on actual zstd support.
+
+ See merge request libtiff/libtiff!239
+
+2021-04-18 Miguel Medalha <medalist@sapo.pt>
+
+ Make LERC_SUPPORT conditional on ZLIB_SUPPORT. Make display of lerc options in tiffcp depend on actual zstd support.
+
+2021-04-17 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'vtorri_xz' into 'master'
+ automatic creation of xz archive when running make distcheck
+
+ See merge request libtiff/libtiff!238
+
+2021-04-16 Even Rouault <even.rouault@spatialys.com>
+
+ iptcutil.c: fix bug in EOF comparison, spotted on NetBSD 9 earmv7hf-el.
+
+2021-04-16 Even Rouault <even.rouault@spatialys.com>
+
+ libtiff v4.3.0 released
+
+2021-04-15 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'libjpeg12_cmake' into 'master'
+ libtiff/tif_config.h.cmake.in: surround LIBJPEG_12_PATH by double quotes
+
+ See merge request libtiff/libtiff!237
+
+2021-04-15 Even Rouault <even.rouault@spatialys.com>
+
+ libtiff/tif_config.h.cmake.in: surround LIBJPEG_12_PATH by double quotes
+
+2021-04-14 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'lerc_api_change' into 'master'
+ tif_lerc.c: cope with API breakage in liblerc master
+
+ See merge request libtiff/libtiff!236
+
+2021-04-14 Even Rouault <even.rouault@spatialys.com>
+
+ tif_lerc.c: cope with API breakage in liblerc master.
+
+2021-04-08 Even Rouault <even.rouault@spatialys.com>
+
+ libtiff: remove remaining #ifdef WIN32 and use PRI formatting.
+
+2021-03-10 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'kmilos-master-patch-73187' into 'master'
+ tiffcp: Remove LZW help text, preset not supported
+
+ See merge request libtiff/libtiff!229
+
+2021-03-10 Miloš Komarčević <miloskomarcevic@aim.com>
+
+ tiffcp: Remove LZW help text, preset not supported.
+
+2021-03-10 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'feature/lerc' into 'master'
+ Add LERC Compression Plugin (closes: #213)
+
+ Closes #213
+
+ See merge request libtiff/libtiff!228
+
+2021-03-10 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'cmake-fixes' into 'master'
+ CMake fixes
+
+ Closes #246 et #245
+
+ See merge request libtiff/libtiff!232
+
+2021-03-09 Roger Leigh <rleigh@codelibre.net>
+
+ cmake: Correct FindCMath.
+
+ cmake: Correct ZSTD_USABLE typo.
+
+2021-03-07 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'cmake-find-lib-prefixes' into 'master'
+ cmake: Correct find lib prefixes for Deflate and JBIG
+
+ See merge request libtiff/libtiff!231
+
+2021-03-07 Roger Leigh <rleigh@codelibre.net>
+
+ cmake: FindJBIG uses lib prefix on Windows.
+
+ cmake: FindDeflate uses lib prefix on Windows.
+
+2021-03-07 Even Rouault <even.rouault@spatialys.com>
+
+ TWebPDecode(): avoid potential overflow on multiplication (CID 1472928)
+
+ TIFFReadDirEntryArrayWithLimit(): avoid false positive from Coverity Scan regarding out-of-bounds access (CID 1472927)
+
+ tif_dirwrite.c: avoid setting a variable that is not read afterwards.
+
+2021-03-07 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'coverity-fixes' into 'master'
+ Coverity fixes (high impact)
+
+ See merge request libtiff/libtiff!227
+
+2021-03-07 Roger Leigh <rleigh@codelibre.net>
+
+ Fix high-impact Coverity issues (resource leaks).
+ The issues are in the tests and tiffcrop, not the core library. Real issues, but not high risk.
+
+ Use to test if Coverity integration is performing properly on merge.
+
+2021-03-07 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_tif_fax3_encoder_regression' into 'master'
+ tif_fax3.c: fix master regression in encoder
+
+ See merge request libtiff/libtiff!230
+
+2021-03-07 Even Rouault <even.rouault@spatialys.com>
+
+ tif_fax3.c: fix master regression in encoder.
+ Fix issue introduced in 39a74eede0455ec8ee334dcddf71f5354d508d8b
+
+ Spotted by gdal's tiff_write_76 test
+
+2021-03-07 Antonio Valentino <antonio.valentino@tiscali.it>
+
+ Add LERC support in CMake.
+
+2021-03-07 Antonio Valentino <Antonio.Valentino@esa.int>
+
+ Add LERC support in configure.ac and Makefile.am.
+
+2021-03-07 Antonio Valentino <antonio.valentino@tiscali.it>
+
+ Add LERC support to tiffcp.
+
+2021-03-07 Antonio Valentino <Antonio.Valentino@esa.int>
+
+ Add LERC plugin.
+ The lerc plugin code has been copyed form GDAL.
+
+2021-03-06 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'display_tool_purpose' into 'master'
+ TIFF tools: insert a line of text summarizing each tool's purpose
+
+ See merge request libtiff/libtiff!214
+
+2021-03-06 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'cmake-update' into 'master'
+ CMake updates
+
+ See merge request libtiff/libtiff!224
+
+2021-03-06 Even Rouault <even.rouault@spatialys.com>
+
+ tiff.h: typo fix in comment.
+
+2021-02-15 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'remove-travis' into 'master'
+ ci: Remove unused Travis-CI support
+
+ See merge request libtiff/libtiff!226
+
+2021-02-14 Roger Leigh <rleigh@codelibre.net>
+
+ ci: Remove unused Travis-CI support.
+
+2021-02-14 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'ci-coverity' into 'master'
+ Enable Coverity static analysis with CI pipeline
+
+ See merge request libtiff/libtiff!225
+
+2021-02-14 Roger Leigh <rleigh@codelibre.net>
+
+ ci: Add Coverity static analysis job.
+
+ ci: Use custom libtiff CI image.
+
+2021-02-13 Roger Leigh <rleigh@codelibre.net>
+
+ cmake: Add release target.
+
+ cmake: Remove empty contrib files.
+
+ cmake: Tidy toplevel.
+
+ cmake: Move pkg-config support to PkgConfig.cmake.
+
+ cmake: Move library feature options to CXXLibraryFeatures.cmake.
+
+ cmake: Move C++ support to CXXLibrary.cmake.
+
+ cmake: Add FindCMath to handle libm linking portably.
+
+ cmake: Tidy unused includes.
+
+ cmake: Rename release date to build date.
+
+ cmake: Compute timestamp portably.
+
+ cmake: Remove remaining uses of report_values()
+
+ cmake: Move JPEG12 checks to JPEGCodec.cmake.
+
+ cmake: Move OpenGL checks to OpenGLChecks.cmake.
+
+ cmake: Move OpenGL checks to OpenGLChecks.cmake.
+
+ cmake: Move WebP codec support to WebPCodec.cmake.
+
+ cmake: Use imported targets for WebP.
+
+ cmake: Add FindWebP.
+
+ cmake: Move ZSTD codec support to ZSTDCodec.cmake.
+
+ cmake: Use imported targets for ZSTD.
+
+ cmake: Add FindZSTD.
+
+ cmake: Move LZMA codec support to LZMACodec.cmake.
+
+ cmake: Use imported targets for LibLZMA.
+
+ cmake: Move JBIG codec support to JBIGCodec.cmake.
+
+ cmake: Use imported targets for JBIG.
+
+ cmake: Add FindJBIG.
+
+ cmake: Move PixarLog codec support to PixarLogCodec.cmake.
+
+ cmake: Report system name in configuration report.
+
+ cmake: Move JPEG codec support to JPEGCodec.cmake.
+
+ cmake: Use imported targets for JPEG.
+
+ cmake: Move Deflate codec support to DeflateCodec.cmake.
+
+ cmake: Use imported targets for ZLIB and Deflate.
+
+ cmake: Add FindDeflate.
+
+ cmake: Move symbol checks to SymbolChecks.cmake.
+
+ cmake: Move include checks to IncludeChecks.cmake.
+
+ cmake: Move all autotools logic to separate files.
+
+ cmake: Move internal codec options to InternalCodecs.cmake.
+
+ cmake: Move LFS check to LargeFileSupport.cmake.
+
+ cmake: Move Win32 IO feature to WindowsIOFeature.cmake.
+
+ cmake: Move processor capability checks to ProcessorChecks.cmake.
+
+ cmake: Move type size checks to TypeSizeChecks.cmake.
+
+ cmake: Move linker checks to LinkerChecks.cmake.
+
+ cmake: Move warning options to CompilerChecks.
+
+ cmake: Move version introspection to AutotoolsVersion.cmake.
+
+ cmake: Move compiler checks to CompilerChecks.cmake.
+
+ cmake: Split into helper scripts.
+
+2021-02-08 Roger Leigh <rleigh@codelibre.net>
+
+ cmake: Use target_sources.
+
+ libport: Adjust header and library to only define and link if required.
+ * Make libport an OBJECT library when in use, otherwise a dummy
+ INTERFACE library
+ * libport.h will work if getopt is present or not present. If
+ present, will fall back to <unistd.h>, else will define
+ symbols
+ * Add generated libport_config.h to define HAVE_GETOPT and HAVE_UNISTD_H
+ * dummy.c no longer needed with CMake
+ * libtiff/libtiffxx no longer link with libport
+
+ cmake: Remove unnecessary extra_dist usage.
+ Only makes sense in the context of Automake. Was carried over
+ for reference while porting, but is not needed.
+
+ cmake: Update minimum version and policy version to 3.9.
+
+2021-02-08 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'remove-nmake' into 'master'
+ Remove NMake build support
+
+ See merge request libtiff/libtiff!223
+
+2021-02-08 Roger Leigh <rleigh@codelibre.net>
+
+ Remove NMake build support.
+ The functionality provided by the NMake build is now completely
+ superseded by the CMake build.
+
+2021-02-08 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'warning-fixes' into 'master'
+ Warning fixes
+
+ See merge request libtiff/libtiff!222
+
+2021-02-07 Miguel Medalha <medalist@sapo.pt>
+
+ Update tiffsplit.c.
+
+ Reinsert summary line lost after conflicting merge.
+
+ Merge branch 'master' into 'display_tool_purpose'
+ # Conflicts:
+ # tools/tiffsplit.c
+
+2021-02-06 Roger Leigh <rleigh@codelibre.net>
+
+ ci: Enable fatal warnings with -Werror for AppVeyor/GCC.
+
+ ci: Enable fatal warnings with -Werror for GitLab CI.
+
+ tif_zstd.c: Remove unused variable warning.
+
+ custom_dir_EXIF_231: Remove case statement fallthrough.
+
+ custom_dir_EXIF_231: Correct use of strncpy.
+
+ Correct include order.
+
+ Eliminate implict fallthrough usage.
+ Use simple loops in place of manual loop unrolling. Rely on
+ the compiler optimiser to unroll loops when appropriate.
+
+ Suppress potential unused variable warning.
+
+ Suppress warnings or avoid case statement fallthrough.
+
+2021-02-05 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'c99-ssize_t-fixes' into 'master'
+ C99 ssize_t fixes
+
+ Closes #239
+
+ See merge request libtiff/libtiff!219
+
+2021-02-05 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffsplit-too-many-args' into 'master'
+ tiffsplit.c: exit with EXIT_FAILURE if there are extra args on the command line
+
+ See merge request libtiff/libtiff!209
+
+2021-02-05 Roger Leigh <rleigh@codelibre.net>
+
+ Add additional TIFF_SSIZE_FORMAT uses.
+
+2021-02-04 Roger Leigh <rleigh@codelibre.net>
+
+ NMake fixes for size type formatting.
+
+ Add TIFF_SIZE_FORMAT for portable use of %z.
+ MinGW64 does support %z, but it issues a compiler warning.
+
+ Align Autoconf tif_config.h and CMake tif_config.cmake.in.
+
+ Use TIFF_SSIZE_FORMAT for formatting tmsize_t.
+
+2021-02-04 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'remove-lcc' into 'master'
+ Remove Makefile.lcc
+
+ See merge request libtiff/libtiff!221
+
+2021-02-04 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'remove-scons' into 'master'
+ Remove SCons build
+
+ See merge request libtiff/libtiff!220
+
+2021-02-03 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'c99-snprintf' into 'master'
+ Use C99 snprintf
+
+ See merge request libtiff/libtiff!217
+
+2021-02-03 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'tiff2ps-const' into 'master'
+ tiff2ps.c: string literals must be const char *, not char *
+
+ See merge request libtiff/libtiff!202
+
+2021-02-03 Roger Leigh <rleigh@codelibre.net>
+
+ Remove SCons build.
+ Unmaintained for 16 years.
+
+2021-02-03 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'codec_summary' into 'master'
+ Modify 'CMakeLists.txt' to produce a meaningful summary of external codecs
+
+ See merge request libtiff/libtiff!192
+
+2021-02-03 Roger Leigh <rleigh@codelibre.net>
+
+ Remove Makefile.lcc.
+ Unmaintained for 22 years.
+
+2021-02-02 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'ci-32-bit' into 'master'
+ ci: Build 32- and 64-bit MSVC variants
+
+ See merge request libtiff/libtiff!218
+
+2021-02-01 Roger Leigh <rleigh@codelibre.net>
+
+ ci: Build 32- and 64-bit MSVC variants.
+
+ Use C99 snprintf.
+
+2021-02-01 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'c99-strtol' into 'master'
+ Use C99 strtol, strtoul, strtoll and strtoull
+
+ See merge request libtiff/libtiff!216
+
+2021-01-31 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'c99-inline' into 'master'
+ Use C99 inline
+
+ See merge request libtiff/libtiff!215
+
+2021-01-31 Roger Leigh <rleigh@codelibre.net>
+
+ Use C99 strtol, strtoul, strtoll and strtoull.
+
+ tif_fax3: Use C99 inline.
+
+ Remove inline feature tests and defines.
+ Available as a standard feature with C99.
+
+2021-01-30 Miguel Medalha <medalist@sapo.pt>
+
+ Update raw2tiff.c (remove duplicate description of tool)
+
+2021-01-30 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'c99-format-strings' into 'master'
+ C99 format strings
+
+ See merge request libtiff/libtiff!211
+
+2021-01-29 Miguel Medalha <medalist@sapo.pt>
+
+ Update tiffdither.c (2 tabs caused slight misalignment of lines in usage info output)
+
+2021-01-28 Miguel Medalha <medalist@sapo.pt>
+
+ Update ppm2tiff.c (slight misalignment of lines in usage info output)
+
+ Update tiffset.c (small misalignment of lines in usage info output)
+
+2021-01-28 Medalha <medalist@sapo.pt>
+
+ Display tool purpose.
+
+2021-01-28 Thomas Bernard <miniupnp@free.fr>
+
+ tiff2ps.c: string literals must be const char *, not char *
+
+2021-01-28 Roger Leigh <rleigh@codelibre.net>
+
+ libtiff: Use PRI format flags and remove unnecessary casts.
+
+2021-01-27 Roger Leigh <rleigh@codelibre.net>
+
+ ascii_tag: Use PRI format flags and remove unnecessary casts.
+
+ check_tag: Use PRI format flags and remove unnecessary casts.
+
+ custom_dir_EXIF_231: Use PRI format flags and remove unnecessary casts.
+
+ short_tag: Use PRI format flags and remove unnecessary casts.
+
+ strip_rw: Use PRI format flags and remove unnecessary casts.
+
+ fax2tiff: Use PRI format flags and remove unnecessary casts.
+
+ ppm2tiff: Correct format strings.
+
+ raw2tiff: Use PRI format flags and remove unnecessary casts.
+
+ rgb2ycbcr: Use PRI format flags and remove unnecessary casts.
+
+ tiff2pdf: Use PRI format flags and remove unnecessary casts.
+
+ tiff2ps: Use PRI format flags and remove unnecessary casts.
+
+ tiff2rgba: Use PRI format flags and remove unnecessary casts.
+
+ tiffcmp: Use PRI format flags and remove unnecessary casts.
+
+ tiffcp: Use PRI format flags and remove unnecessary casts.
+
+ tiffcrop: Use PRI format flags and remove unnecessary casts.
+
+ tiffinfo: Use PRI format flags and remove unnecessary casts.
+
+ tiffdump: Use PRI format flags and remove unnecessary casts.
+
+2021-01-27 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'c99-require-stdtypes' into 'master'
+ Use standard C99 integer types
+
+ See merge request libtiff/libtiff!205
+
+2021-01-26 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'reserve_COMPRESSION_JXL' into 'master'
+ tiff.h: reserve COMPRESSION_JXL=50002 for JPEGXL
+
+ See merge request libtiff/libtiff!210
+
+2021-01-22 Even Rouault <even.rouault@spatialys.com>
+
+ tiff.h: reserve COMPRESSION_JXL=50002 for JPEGXL.
+
+2021-01-22 Kurt Schwehr <schwehr@google.com>
+
+ tiffsplit.c: exit with EXIT_FAILURE if there are extra args on the command line
+ e.g. tiffsplit in.tif a_prefix_ junk
+
+2021-01-22 Roger Leigh <rleigh@codelibre.net>
+
+ Add and enable TIFF_DISABLE_DEPRECATED for internal use.
+
+ Add typedef deprecations for GCC/Clang and MSVC.
+
+ Use standard C99 integer types.
+
+2021-01-20 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'ubuntu-zstd-wepb' into 'master'
+ gitlab-ci : use libzstd-dev and libwebp-dev ubuntu packages
+
+ See merge request libtiff/libtiff!208
+
+2021-01-20 Thomas Bernard <miniupnp@free.fr>
+
+ gitlab-ci : use libzstd-dev and libwebp-dev ubuntu packages.
+ should replace !206
+
+2021-01-20 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-232' into 'master'
+ tiff2ps: exit the loop in case of error
+
+ Closes #232
+
+ See merge request libtiff/libtiff!201
+
+2021-01-20 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffsplit-exit-status' into 'master'
+ tiffsplit: Exit with EXIT_FAILURE if unable to open the input file.
+
+ See merge request libtiff/libtiff!207
+
+2021-01-20 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'config-cleanup' into 'master'
+ Remove HAVE_INTTYPES_H, HAVE_LFIND & lfind, HAVE_SEARCH_H & include <search.h>
+
+ See merge request libtiff/libtiff!203
+
+2021-01-19 Kurt Schwehr <schwehr@google.com>
+
+ tiffsplit: Exit with EXIT_FAILURE if unable to open the input file.
+
+2021-01-18 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffcmp' into 'master'
+ tiffcmp: fix comparaison with pixels that are fractional number of bytes
+
+ Closes #53
+
+ See merge request libtiff/libtiff!141
+
+2021-01-15 Kurt Schwehr <schwehr@google.com>
+
+ CMakeLists.txt: Remove search for lfind.
+
+ Remove HAVE_INTTYPES_H, HAVE_LFIND & lfind, HAVE_SEARCH_H & include <search.h>
+ - HAVE_INTTYPES_H is replaced with TIFF_HAVE_INTTYPES_H
+ - tif_dirinfo.c has a static td_lfind
+
+2021-01-15 Thomas Bernard <miniupnp@free.fr>
+
+ tiffcmp: fix comparaison with pixels that are fractional number of bytes
+ For exemple : 4bits per sample + 3 samples per pixel => 1.5 bytes per pixel
+
+ tiff2ps: exit the loop in case of error.
+ fixes #232
+
+2021-01-15 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'rm-strcasecmp' into 'master'
+ Remove port/strcasecmp.c as strcasecmp is not currently used in libtiff.
+
+ Closes #235
+
+ See merge request libtiff/libtiff!199
+
+2021-01-15 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'std-int-types' into 'master'
+ Use standard C99 integer types
+
+ See merge request libtiff/libtiff!185
+
+2021-01-13 Kurt Schwehr <schwehr@google.com>
+
+ Remove port/strcasecmp.c as strcasecmp is not currently used in libtiff.
+ Fixes #235
+
+2021-01-10 Miguel Medalha <medalist@sapo.pt>
+
+ Update CMakeLists.txt. Delete unnecessary line from libdeflate codec support section
+
+2021-01-10 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'include_libport' into 'master'
+ tiff tools and libtiff/mkg3states: include 'libport.h', remove local definition of 'getopt()'
+
+ See merge request libtiff/libtiff!198
+
+2021-01-09 Miguel Medalha <medalist@sapo.pt>
+
+ Update CMakeLists.txt. Cleanup of indentation space. Removal of leading '/' from webp include dir.
+
+2021-01-09 miguel <medalist@sapo.pt>
+
+ cmake: Use target_include_directories correctly.
+
+2021-01-09 Roger Leigh <rleigh@codelibre.net>
+
+ cmake: Use target_include_directories correctly.
+
+ cmake: Drop unnecessary TOOL_INCLUDES.
+
+2021-01-07 Roger Leigh <rleigh@codelibre.net>
+
+ cmake: Use target_include_directories correctly.
+
+2021-01-07 miguel <medalist@sapo.pt>
+
+ tiff tools and libtiff/mkg3states: include 'libport.h', remove local definition of 'getopt()'
+
+2021-01-07 Miguel Medalha <medalist@sapo.pt>
+
+ Update CMakeLists.txt.
+
+2021-01-07 miguel <medalist@sapo.pt>
+
+ tiff tools: include 'libport.h', remove local definition of 'getopt()'
+
+2021-01-06 Roger Leigh <rleigh@codelibre.net>
+
+ Remove conditional use of <string.h>
+
+ cmake: Drop dlfcn.h check.
+
+ cmake: Remove duplicate line.
+
+ Use stdint.h types when available.
+
+2021-01-05 Olivier Paquet <olivier.paquet@gmail.com>
+
+ Merge branch 'iptcutil' into 'master'
+ contrib/iptcutil.c: set '#ifdef _WIN32' (was '#ifdef WIN32', which failed at build time)
+
+ See merge request libtiff/libtiff!197
+
+2021-01-05 miguel <medalist@sapo.pt>
+
+ tiff tools: include 'libport.h', remove local definition of 'getopt()'
+
+ contrib/iptcutil.c - set '#ifdef _WIN32' (was '#ifdef WIN32', which failed at build time)
+
+2021-01-04 Even Rouault <even.rouault@spatialys.com>
+
+ tools/CMakeLists.txt: add comment about rgb2ycbcr and thumbnail not to be installed
+
+2021-01-04 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'revert-5331ed49' into 'master'
+ Revert "Merge branch 'install_targets' into 'master'"
+
+ See merge request libtiff/libtiff!196
+
+2021-01-04 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'drop-wince' into 'master'
+ Remove non-functional WinCE support
+
+ See merge request libtiff/libtiff!188
+
+2021-01-04 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'drop-vms' into 'master'
+ Remove non-functional VMS support
+
+ See merge request libtiff/libtiff!187
+
+2021-01-03 Even Rouault <even.rouault@spatialys.com>
+
+ Revert "Merge branch 'install_targets' into 'master'"
+ This reverts merge request !193
+
+2021-01-03 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffcp_b_parameter' into 'master'
+ tiffcp: Remove unnecessary reference to compression from usage info for -b parameter
+
+ See merge request libtiff/libtiff!189
+
+2021-01-03 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'cmake-faxtable' into 'master'
+ cmake: Add faxtable target
+
+ See merge request libtiff/libtiff!186
+
+2021-01-03 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'install_targets' into 'master'
+ Update 'CMakeLists.txt' from 'tools'.
+
+ See merge request libtiff/libtiff!193
+
+2021-01-03 Miguel Medalha <medalist@sapo.pt>
+
+ Update 'CMakeLists.txt' from 'tools'.
+
+ Update CMakeLists.txt.
+
+2021-01-03 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'usage_info' into 'master'
+ thumbnail: Rename constant variable 'stuff' to 'usage_info'
+
+ See merge request libtiff/libtiff!190
+
+2021-01-03 Miguel Medalha <medalist@sapo.pt>
+
+ Modified 'CMakeLists.txt' to produce a meaningful summary of external codecs support.
+
+ Removed unnecessary reference to compression from usage info for -b parameter
+
+ Constant variable 'stuff' renamed to 'usage_info' for consistency with the other tools
+
+2021-01-02 Roger Leigh <rleigh@codelibre.net>
+
+ Remove non-functional VMS support.
+
+ Remove non-functional WinCE support.
+
+2021-01-02 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'codespell' into 'master'
+ Fix spelling mistakes.
+
+ See merge request libtiff/libtiff!183
+
+2021-01-02 Kurt Schwehr <schwehr@google.com>
+
+ ChangeLog: Remove extraneous character from prior commit - 00fe7828.
+
+2021-01-02 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'codespell-custom_dir_EXIF_231' into 'master'
+ custom_dir_EXIF_231.c: dos2unix and codespell
+
+ See merge request libtiff/libtiff!184
+
+2021-01-01 Roger Leigh <rleigh@codelibre.net>
+
+ mkg3states: Sync generator with current generated file content.
+
+ cmake: Add faxtable and mkg3states targets.
+
+2020-12-31 Kurt Schwehr <schwehr@google.com>
+
+ custom_dir_EXIF_231.c: dos2unix and codespell.
+ additonal, Varable, greather, alwasy
+
+2020-12-31 Kurt Schwehr <schwehr@google.com>
+
+ Fix spelling mistakes.
+ Found with:
+
+ codespell --version
+ 1.17.1
+
+2020-12-29 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'remove-some-vms-ifdef' into 'master'
+ Remove "ifdef VMS" that are no longer necessary.
+
+ See merge request libtiff/libtiff!181
+
+2020-12-29 Kurt Schwehr <schwehr@google.com>
+
+ Remove "ifdef VMS" that are no longer necessary.
+ Both sides of the if are now the same.
+
+2020-12-29 Bob Friesenhahn <bfriesen@simple.dallas.tx.us>
+
+ _TIFFBuiltinCODECS should be const.
+
+2020-12-28 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-202' into 'master'
+ tiff2pdf.c: check that tiff_datasize fits in a signed tsize_t
+
+ Closes #202
+
+ See merge request libtiff/libtiff!166
+
+2020-12-28 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'w_report-when-libdeflate-is-found' into 'master'
+ CMakeLists.txt: Report when libdeflate is found
+
+ See merge request libtiff/libtiff!175
+
+2020-12-28 Bob Friesenhahn <bfriesen@simple.dallas.tx.us>
+
+ Declare gpsFields as static const.
+
+2020-12-28 Bob Friesenhahn <bfriesen@simple.dallas.tx.us>
+
+ Merge branch 'tools-reduce-initialized-data' into 'master'
+ Reduce initialized data by making more data const and simplifying usage() implementation.
+
+ See merge request libtiff/libtiff!180
+
+2020-12-28 Bob Friesenhahn <bfriesen@simple.dallas.tx.us>
+
+ Reduce initialized data by making more data const and simplifying usage() implementation.
+
+2020-12-27 Bob Friesenhahn <bfriesen@simple.dallas.tx.us>
+
+ Merge branch 'master' into 'master'
+ tiff tools: display of compression methods is now conditional instead of hard-coded
+
+ See merge request libtiff/libtiff!176
+
+2020-12-27 Bob Friesenhahn <bfriesen@simple.dallas.tx.us>
+
+ Merge branch 'build' into 'master'
+ Fix wrong URL for fetching config.guess and config.sub
+
+ See merge request libtiff/libtiff!177
+
+2020-12-26 Chocobo1 <Chocobo1@users.noreply.github.com>
+
+ Fix wrong URL for fetching config.guess and config.sub.
+
+2020-12-25 miguel <medalist@sapo.pt>
+
+ tiff tools: made display of compression methods and their parameters conditional on their actual availability
+
+2020-12-20 Bob Friesenhahn <bfriesen@simple.dallas.tx.us>
+
+ autogen.sh now updates config.guess and config.sub from master gnulib version.
+
+2020-12-19 Bob Friesenhahn <bfriesen@simple.dallas.tx.us>
+
+ Add a https://libtiff.gitlab.io/libtiff/ link.
+
+ Remove stray character in URL area.
+
+ Changes for 4.2.0 release.
+
+ Changes for 4.2.0 release.
+
+2020-12-19 Bob Friesenhahn <bfriesen@simple.dallas.tx.us>
+
+ * libtiff 4.2.0 released.
+
+ * configure.ac: Pass tar-ustar option to AM_INIT_AUTOMAKE rather
+ than tar-pax since ustar POSIX 1003.1-1988 format is more portable
+ than PAX POSIX 1003.1-2001 format.
+
+2020-12-12 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'w_adjust-deflate_names' into 'master'
+ Set 'deflate' to DEFLATE_NAMES, instead of 'libdeflate'
+
+ See merge request libtiff/libtiff!174
+
+2020-12-12 Lemures Lemniscati <lemures.lemniscati@gmail.com>
+
+ Set 'deflate' to DEFLATE_NAMES, instead of 'libdeflate'
+ 'lib' will be automatically added as a prefix while doing find_library()
+
+2020-12-12 Even Rouault <even.rouault@spatialys.com>
+
+ DoubleToRational(): avoid casting NaN to uint32 (fixes #227)
+
+2020-12-12 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_221' into 'master'
+ tiffio.h: do not define __attribute__ but defines TIFF_ATTRIBUTE instead (fixes #221)
+
+ Closes #221
+
+ See merge request libtiff/libtiff!173
+
+2020-12-12 Even Rouault <even.rouault@spatialys.com>
+
+ tiffio.h: do not define __attribute__ but defines TIFF_ATTRIBUTE instead (fixes #221)
+
+2020-12-08 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFReadDirEntryArrayWithLimit(): properly read from offline tag value when we clamp the number of strips to 1.
+ Fixes regression of commit 7057734d986001b7fd6d2afde9667da7754ff2cc on reading
+ a file with StripByteCounts with 1 element (broken) and StripOffsets with
+ 896 elements, and where StripOffsets[0] is correct
+
+ $ tiffdump foo.tif
+ Magic: 0x4949 <little-endian> Version: 0x2a <ClassicTIFF>
+ Directory 0: offset 25725448 (0x1888a08) next 0 (0)
+ SubFileType (254) LONG (4) 1<0>
+ ImageWidth (256) LONG (4) 1<640>
+ ImageLength (257) LONG (4) 1<20098>
+ BitsPerSample (258) SHORT (3) 1<16>
+ Photometric (262) SHORT (3) 1<1>
+ SamplesPerPixel (277) SHORT (3) 1<1>
+ ResolutionUnit (296) SHORT (3) 1<2>
+ StripByteCounts (279) LONG (4) 1<1806>
+ StripOffsets (273) LONG (4) 896<8 648 1288 1928 2568 3208 3848 4488 5128 5768 6408 7048 7688 8328 8968 9608 10248 10888 11528 12168 12808 13448 14088 14728 ...>
+
+2020-12-02 Even Rouault <even.rouault@spatialys.com>
+
+ tif_jpeg.c: avoid potential harmless unsigned integer overflow on data->fileoffset in JPEGFixupTagsSubsamplingSkip() by validating earlier. Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=28200
+
+2020-11-27 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'Jamaika1-master-patch-47839' into 'master'
+ Change ULARGE_INTEGER to LARGE_INTEGER
+
+ See merge request libtiff/libtiff!170
+
+2020-11-27 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'Jamaika1-master-patch-46397' into 'master'
+ Added stdint.h
+
+ See merge request libtiff/libtiff!171
+
+2020-11-27 Jamaika <lukaszcz18@wp.pl>
+
+ Added stdint.h.
+
+ ``` tif_win32.c: In function '_tiffSizeProc': tif_win32.c:159:23: warning: passing argument 2 of 'GetFileSizeEx' from incompatible pointer type [-Wincompatible-pointer-types] 159 | if (GetFileSizeEx(fd,&m)) | ^~ | | | ULARGE_INTEGER * In file included from c:\msys1021\x86_64-w64-mingw32\include\winbase.h:18, from c:\msys1021\x86_64-w64-mingw32\include\windows.h:70, from tif_win32.c:32: c:\msys1021\x86_64-w64-mingw32\include\fileapi.h:78:73: note: expected 'PLARGE_INTEGER' {aka 'LARGE_INTEGER *'} but argument is of type 'ULARGE_INTEGER *' 78 | WINBASEAPI WINBOOL WINAPI GetFileSizeEx (HANDLE hFile, PLARGE_INTEGER lpFileSize); | ~~~~~~~~~~~~~~~^~~~~~~~~~ ```
+
+2020-11-21 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-113' into 'master'
+ tiffcrop: fix buffer overrun in extractContigSamples24bits()
+
+ Closes #113
+
+ See merge request libtiff/libtiff!169
+
+2020-11-21 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-156' into 'master'
+ tiff2pdf: Check output size before writing
+
+ Closes #156
+
+ See merge request libtiff/libtiff!168
+
+2020-11-21 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-201' into 'master'
+ tiff2pdf: enforce memory limit for tiled pictures too
+
+ Closes #201
+
+ See merge request libtiff/libtiff!167
+
+2020-11-20 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-207' into 'master'
+ enforce (configurable) memory limit in tiff2rgba
+
+ Closes #209 et #207
+
+ See merge request libtiff/libtiff!165
+
+2020-11-20 Even Rouault <even.rouault@spatialys.com>
+
+ tif_lzw.c: avoid false positive -Wnull-dereference of mingw32 gcc 7.3.
+
+2020-11-17 Thomas Bernard <miniupnp@free.fr>
+
+ tiffcrop: fix buffer overrun in extractContigSamples24bits()
+ fixes #113
+
+ tiff2pdf: Check output size before writing.
+ fixes #156
+
+ tiff2pdf: enforce memory limit for tiled pictures too.
+ fixes #201
+
+2020-11-15 Thomas Bernard <miniupnp@free.fr>
+
+ tiff2rgba.1: -M option.
+
+ enforce (configurable) memory limit in tiff2rgba.
+ fixes #207
+ fixes #209
+
+2020-11-14 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-220' into 'master'
+ tiff2pdf.c: properly calculate datasize when saving to JPEG YCbCr
+
+ Closes #220
+
+ See merge request libtiff/libtiff!159
+
+2020-11-14 Thomas Bernard <miniupnp@free.fr>
+
+ tiff2pdf.c: properly calculate datasize when saving to JPEG YCbCr.
+ fixes #220
+
+2020-11-14 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-204' into 'master'
+ avoid buffer overflow while writing jpeg end of file marker
+
+ Closes #204
+
+ See merge request libtiff/libtiff!161
+
+2020-11-14 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-193' into 'master'
+ fix buffer overflow in tiff2ps.c
+
+ Closes #193
+
+ See merge request libtiff/libtiff!162
+
+2020-11-14 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'skal65535-master-patch-91082' into 'master'
+ More overflow fixes for large widths
+
+ See merge request libtiff/libtiff!164
+
+2020-11-14 skal <pascal.massimino@gmail.com>
+
+ More overflow fixes for large width.
+ Also: use INT_MAX instead of hard-coded constants.
+
+2020-11-12 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'skal65535-master-patch-56655' into 'master'
+ Fix potential overflow in gtStripContig()
+
+ See merge request libtiff/libtiff!163
+
+2020-11-12 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-211' into 'master'
+ check for tile width overflow
+
+ Closes #211
+
+ See merge request libtiff/libtiff!160
+
+2020-11-12 skal <pascal.massimino@gmail.com>
+
+ Fix potential overflow in gtStripContig()
+ (w + w) might not fit in int32 if too large.
+
+2020-11-09 Thomas Bernard <miniupnp@free.fr>
+
+ tiff2ps.c: fix buffer overread.
+ fixes #193
+
+ fix undefined behaviour (int shifted too much to the left)
+
+ avoid buffer overflow while writing jpeg end of file marker.
+ fixes #204
+
+ gtTileContig(): check Tile width for overflow.
+ fixes #211
+
+ fix warning messages (v32 is unsigned)
+
+2020-10-26 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFStartStrip(): avoid potential crash in WebP codec when using scanline access on corrupted files. Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=26650
+
+2020-10-20 Even Rouault <even.rouault@spatialys.com>
+
+ tif_webp.c: validate tile/strip dimension to avoid unsigned integer overflow in RGBA.size computation
+
+2020-10-19 Even Rouault <even.rouault@spatialys.com>
+
+ tif_zip.c: fix typo in comment.
+
+2020-10-16 Even Rouault <even.rouault@spatialys.com>
+
+ tiff.h: remove irrelevant warning about webp related pseudo-tags not being registered: they are purely internal libtiff concepts
+
+2020-10-16 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'libdeflate' into 'master'
+ Add support for building against libdeflate for faster Zip/Deflate compression/decompression
+
+ See merge request libtiff/libtiff!158
+
+2020-10-16 Even Rouault <even.rouault@spatialys.com>
+
+ test: add testdeflatelaststripextradata.sh.
+
+2020-10-16 Even Rouault <even.rouault@spatialys.com>
+
+ Add support for optional building against libdeflate for faster Zip/Deflate compression/decompression.
+ So we can have 2 kind of builds with the Zip/Deflate codec:
+ - zlib only
+ - zlib + libdeflate
+
+ Speed improvements in the 35%-50% range can be expected when libdeflate is used.
+ Compression level up to 12 is now supported (capped to 9 when zlib is used).
+ Still requires zlib for situations where libdeflate cannot be used (that
+ is for scanline access, since libdeflate has no streaming mode)
+
+ Pseudo-tag TIFFTAG_DEFLATE_SUBCODEC=DEFLATE_SUBCODEC_ZLIB/DEFLATE_SUBCODEC_LIBDEFLATE
+ is added to control which subcodec (zlib or libdeflate) should be used (it defaults
+ of course to libdeflate, when it is available).
+ This is mostly aimed at being used on the writing side, to be able to reproduce
+ output of previous libtiff versions at a binary level, in situations where this would
+ be really needed. Or as a safety belt in case there would be unforeseen issues
+ with using libdeflate.
+ It can be used to know when libdeflate is available at runtime (DEFLATE_SUBCODEC_LIBDEFLATE
+ will be the default value in that situation).
+
+ Of course, deflate codestreams produced by libdeflate can be read by zlib, and vice-versa.
+
+2020-10-14 Even Rouault <even.rouault@spatialys.com>
+
+ tif_webp.c: fix compiler warnings with MSVC.
+
+2020-10-12 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'various_fixes' into 'master'
+ Fix compiler warnings about unused variables when assert() expands to nothing
+
+ See merge request libtiff/libtiff!157
+
+2020-10-12 Even Rouault <even.rouault@spatialys.com>
+
+ .gitignore: add entries for new files in test/
+
+ Fix compiler warnings about unused variables when assert() expands to nothing
+
+2020-10-09 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch '215-cygwin-appveyor-fail' into 'master'
+ Update Appveyor CI build to build with VS2019 image
+
+ Closes #215
+
+ See merge request libtiff/libtiff!154
+
+2020-10-09 Roger Leigh <rleigh@codelibre.net>
+
+ wip.
+
+ wip.
+
+ wip.
+
+ wip.
+
+ wip.
+
+ wip.
+
+2020-10-09 Roger Leigh <rleigh@codelibre.net>
+
+ Merge branch 'TIFF-217_m_lib_path' into 'master'
+ cmake: Do not use absolute libm path
+
+ Closes #217
+
+ See merge request libtiff/libtiff!156
+
+2020-10-09 Roger Leigh <rleigh@codelibre.net>
+
+ cmake: Do not use absolute libm path.
+
+2020-10-08 Even Rouault <even.rouault@spatialys.com>
+
+ tif_fax3.h: restore systematic calls to CLEANUP_RUNS()
+ now that SETVALUE() no longer cause overflows.
+ Those were removed per b351db8be1b4d3f712bdb9424a79d3174cc03202 and
+ 3440ac216463fcad170bbb391491e69730a59ffa.
+
+ As SETVALUE() now returns an error, this allow the decoder to exit.
+
+ Otherwise, the assert(x == lastx) in _TIFFFax3fillruns() can trigger.
+
+ Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=26201
+
+2020-10-06 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'check_TIFFFlushData1' into 'master'
+ FAX/JPEG/LZMA/PixarLog/ZIP/ZSTD codecs: make sure to check TIFFFlushData1() return value
+
+ See merge request libtiff/libtiff!155
+
+2020-10-04 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'shared-memory' into 'master'
+ Set the --shared-memory linker flag for Emscripten builds
+
+ See merge request libtiff/libtiff!153
+
+2020-10-03 Even Rouault <even.rouault@spatialys.com>
+
+ tiff2rgba.c: fix -Wold-style-declaration warning.
+
+ FAX/JPEG/LZMA/PixarLog/ZIP/ZSTD codecs: make sure to check TIFFFlushData1() return value
+
+2020-09-26 Even Rouault <even.rouault@spatialys.com>
+
+ tif_fax3.h: extra buffer overflow checks. Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=25934
+
+2020-09-25 Roger Leigh <rleigh@codelibre.net>
+
+ wip.
+
+ wip.
+
+ wip.
+
+ wip.
+
+ wip.
+
+ wip.
+
+ Update AppVeyor image.
+
+ test-appveyor.
+
+2020-09-24 Attila Oláh <atl@google.com>
+
+ Also pass --shared-memory to raw_decode.
+ This is needed when building for Emscripten with *both* WEBP and JPEG
+ support.
+
+ Set the --shared-memory linker flag for Emscripten builds.
+ This is only needed when building with WEBP support, which uses atomics,
+ therefore the linker needs the --shared-memory flag. The flag cannot be
+ added globally because not all executables link against libwebp.
+
+2020-09-22 Even Rouault <even.rouault@spatialys.com>
+
+ tif_fax3.h: return error when a buffer overflow occurs. Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=25552 and https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=25849
+
+2020-09-11 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix-float-compare' into 'master'
+ Fix comparison for max negative float value.
+
+ See merge request libtiff/libtiff!152
+
+2020-09-11 Dirk Lemstra <dirk@lemstra.org>
+
+ Fix comparison for max negative float value.
+
+2020-09-07 Even Rouault <even.rouault@spatialys.com>
+
+ Fax3PreDecode(): reset curruns and refruns state variables.
+ to avoid out-of-bounds write triggered by GDAL when repeatedly
+ reading a corrupt strip.
+
+ Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=25493
+
+2020-06-06 Thomas Bernard <miniupnp@free.fr>
+
+ Merge branch 'issue-17' into 'master'
+ normalize tools behaviour regarding -h
+
+ Closes #17
+
+ See merge request libtiff/libtiff!115
+
+2020-05-31 Even Rouault <even.rouault@spatialys.com>
+
+ TWebPSetupEncode(): fix logic problem (and instead of or) in test that checks input is 8bit unsigned data
+
+2020-05-12 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFGetConfiguredCODECs(): fix to avoid wrong structure to be returned for registered (ie non built-in) codecs
+
+2020-05-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'zstd-webp-update' into 'master'
+ gitlab-ci: use latest zstd and webp versions
+
+ See merge request libtiff/libtiff!148
+
+2020-05-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'deprecated' into 'master'
+ ojpeg: s/Depreciated/Deprecated/
+
+ See merge request libtiff/libtiff!149
+
+2020-05-09 Aaron Boxer <boxerab@gmail.com>
+
+ ojpeg: s/Depreciated/Deprecated/
+
+2020-04-27 Even Rouault <even.rouault@spatialys.com>
+
+ Fix typos.
+
+ tif_jpeg.c: avoid potential division in previous fix (master only)
+
+2020-04-26 Thomas Bernard <miniupnp@free.fr>
+
+ gitlab-ci: use latest zstd and webp versions.
+
+2020-04-26 Even Rouault <even.rouault@spatialys.com>
+
+ tiff.h: fixes to use ASCII only characters (master only)
+
+2020-04-26 Thomas Bernard <miniupnp@free.fr>
+
+ tiffsplit: use EXIT_SUCCESS / EXIT_FAILURE.
+
+ tiffset: print usage on stdout when -h is used.
+ also use EXIT_FAILURE / EXIT_SUCCESS
+ see #17
+
+ tiffmedian: shopw usage on stdout when -h is used.
+ also use EXIT_SUCCESS/EXIT_FAILURE
+ see #17
+
+ tiffinfo: print usage on stdout when -h is used.
+ also use EXIT_FAILURE / EXIT_SUCCESS
+ see #17
+
+ raw2tiff: print usage to stdout when -h is used.
+ see #17
+
+ tiff2pdf: print usage on stdout when -h is used.
+ see #17
+
+ tiffgt: output usage on stdout with -h.
+ also use EXIT_SUCCESS / EXIT_FAILURE
+
+ tiffdump: use EXIT_FAILURE / EXIT_SUCCESS.
+ see #17
+
+ tiffdither: print usage on stdout when -h is used.
+ see #17
+
+2020-04-26 Thomas Bernard <miniupnp@free.fr>
+
+ tiffcrop: -h / -v prints usage/version to stdout.
+ also uses the standard C EXIT_SUCCESS / EXIT_FAILURE
+ macros
+
+ see #17
+
+2020-04-26 Thomas Bernard <miniupnp@free.fr>
+
+ tiffcp: output usage to stdout when using -h.
+ also use EXIT_FAILURE / EXIT_SUCCESS
+ see #17
+
+ tiffcmp: match exit status for posix cmp and diff tools.
+
+ tiff2rgba: output usage to stdout when using -h.
+ also uses std C EXIT_FAILURE / EXIT_SUCCESS
+ see #17
+
+ tiff2ps: sue EXIT_FAILURE / EXIT_SUCCESS.
+ see #17
+
+ tiff2bw: output usage on stdout when using -h.
+ also uses EXIT_SUCCESS / EXIT_FAILURE
+ see #17
+
+ thumbnail: use EXIT_FAILURE / EXIT_SUCCESS.
+ the -h option was already used so it cannot be used for help/usage
+ see #17
+
+ rgb2ycbcr: use EXIT_FAILURE / EXIT_SUCCESS.
+ the -h option was already used so it cannot be used for help/usage
+ see #17
+
+ ppm2tiff: output usage to stdout when using -h option.
+ also uses std C EXIT_SUCCESS / EXIT_FAILURE
+ see #17
+
+ pal2rgb: output usage to stdout when -h is used.
+ see #17
+
+ fax2tiff.c: print usage on stdout when using -h option.
+ see #17
+
+ fax2ps: output usage to stdout when using -h option.
+ also use EXIT_SUCCESS, EXIT_FAILURE from C standard
+
+2020-04-25 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'jpeg_multiscan_dos_logic' into 'master'
+ tif_jpeg.c: revise logic to detect potential excessive memory usage when...
+
+ See merge request libtiff/libtiff!147
+
+2020-04-24 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-176' into 'master'
+ tiff2pdf: get rid of uninitialized memory content
+
+ Closes #176
+
+ See merge request libtiff/libtiff!143
+
+2020-04-24 Even Rouault <even.rouault@spatialys.com>
+
+ tif_jpeg.c: revise logic to detect potential excessive memory usage when decoding multiscan JPEG compressed images
+
+2020-04-19 Thomas Bernard <miniupnp@free.fr>
+
+ tiff2pdf: test the return code of TIFFReadRawStrip() and TIFFReadRawTile()
+
+ tiff2pdf.c: fix some whitespace problems in source.
+
+ tiff2pdf: get rid of uninitialized memory content.
+ fixes #176
+
+2020-04-19 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-18' into 'master'
+ tiffset: pass size for TIFFTAG_INKNAMES
+
+ Closes #18
+
+ See merge request libtiff/libtiff!146
+
+2020-04-18 Olivier Paquet <olivier.paquet@gmail.com>
+
+ Merge branch 'issue-80' into 'master'
+ tiffinfo: fix dump of Tiled images
+
+ Closes #80
+
+ See merge request libtiff/libtiff!144
+
+2020-04-15 Even Rouault <even.rouault@spatialys.com>
+
+ Fix wrong file size checks for memory-mapped BigTIFF files that could lead to image rejection
+
+2020-04-05 Thomas Bernard <miniupnp@free.fr>
+
+ tiffset: pass size for TIFFTAG_INKNAMES.
+ Uses TIFFFieldPassCount() to know which arguments need to be
+ passed to TiffSetField()
+
+ fixes #18
+ see http://bugzilla.maptools.org/show_bug.cgi?id=2202
+
+2020-04-04 Thomas Bernard <miniupnp@free.fr>
+
+ tiffinfo: showdata for tiled images.
+
+ tiffinfo: fix dump of Tiled images.
+ fixes #80
+
+2020-04-03 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-117' into 'master'
+ tiffcrop: enforce memory allocation limit
+
+ Closes #117
+
+ See merge request libtiff/libtiff!140
+
+2020-04-03 Thomas Bernard <miniupnp@free.fr>
+
+ tiffcrop: enforce memory allocation limit.
+ uses -k option to change limit (default to 256MiB)
+ fixes #117 / http://bugzilla.maptools.org/show_bug.cgi?id=2757
+
+2020-04-02 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-45' into 'master'
+ tiffcp: disable strip chopping when trying to convert to JBIG compression
+
+ Closes #45
+
+ See merge request libtiff/libtiff!138
+
+2020-04-02 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-124' into 'master'
+ TIFFGetFields(3tiff): TIFFTAG_*BYTECOUNTS TIFFTAG_*OFFSETS are uint64
+
+ Closes #124
+
+ See merge request libtiff/libtiff!137
+
+2020-04-02 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'aix_itrunc' into 'master'
+ Rename itrunc to fix name clash with a different itrunc in math.h on AIX. Fixes issue #189
+
+ Closes #189
+
+ See merge request libtiff/libtiff!139
+
+2020-04-01 Rob Boehne <robb@datalogics.com>
+
+ Rename itrunc to fix name clash with a different itrunc in math.h on AIX. Fixes issue #189
+
+2020-04-01 Thomas Bernard <miniupnp@free.fr>
+
+ tiffcp: disable strip chopping when trying to convert to JBIG compression
+ fixes #45
+
+2020-03-29 Thomas Bernard <miniupnp@free.fr>
+
+ TIFFGetFields(3tiff): TIFFTAG_*BYTECOUNTS TIFFTAG_*OFFSETS are uint64.
+ fixes #124 / http://bugzilla.maptools.org/show_bug.cgi?id=2774
+
+2020-03-29 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-48' into 'master'
+ tiff2pdf: fix "raw" copy of Deflate streams
+
+ Closes #48
+
+ See merge request libtiff/libtiff!136
+
+2020-03-27 Thomas Bernard <miniupnp@free.fr>
+
+ tiff2pdf: fix "raw" copy of Deflate streams.
+ The Predictor parameter was not copied from the source tiff to the PDF.
+ fixes #48 / http://bugzilla.maptools.org/show_bug.cgi?id=2442
+
+2020-03-26 Thomas Bernard <miniupnp@free.fr>
+
+ tif_fax3: quit Fax3Decode2D() when a buffer overflow occurs.
+ fixes #186
+
+2020-03-24 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-143-144' into 'master'
+ tiffdump: avoid unaligned memory access
+
+ Closes #144 et #143
+
+ See merge request libtiff/libtiff!133
+
+2020-03-24 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-133' into 'master'
+ tiff2pdf: avoid divide by 0
+
+ Closes #133
+
+ See merge request libtiff/libtiff!126
+
+2020-03-24 Thomas Bernard <miniupnp@free.fr>
+
+ tiff2pdf: normalizePoint() macro to normalize the white point.
+
+2020-03-23 Thomas Bernard <miniupnp@free.fr>
+
+ tiffdump: avoid unaligned memory access.
+ fixes #143
+ fixes #144
+
+2020-03-23 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'out-of-memory' into 'master'
+ tiffcp/tiff2pdf/tiff2ps: enforce maximum malloc size
+
+ Closes #153, #84, #116 et #115
+
+ See merge request libtiff/libtiff!130
+
+2020-03-23 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-157' into 'master'
+ tiffset: check memory allocation
+
+ Closes #157
+
+ See merge request libtiff/libtiff!132
+
+2020-03-23 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-185' into 'master'
+ tif_fax3: more buffer overflow checks in Fax3Decode2D()
+
+ Closes #185
+
+ See merge request libtiff/libtiff!131
+
+2020-03-23 Thomas Bernard <miniupnp@free.fr>
+
+ tiffset: check memory allocation.
+ fixes #157 / http://bugzilla.maptools.org/show_bug.cgi?id=2850
+
+ tif_fax3: more buffer overflow checks in Fax3Decode2D()
+ fixes #185
+
+2020-03-21 Thomas Bernard <miniupnp@free.fr>
+
+ tiff2ps: enforce memory allocation limit.
+ fixes #153 / http://bugzilla.maptools.org/show_bug.cgi?id=2845
+
+ tiff2pdf: enforce maximum data size.
+ fixes #116 / http://bugzilla.maptools.org/show_bug.cgi?id=2756
+ fixes #84 / http://bugzilla.maptools.org/show_bug.cgi?id=2683
+
+ update man page for tiffcp regarding the -m option.
+
+ tiffcp.c: _TIFFmalloc() => limitMalloc()
+
+2020-03-21 Thomas Bernard <miniupnp@free.fr>
+
+ tiffcp: enforce maximum malloc size.
+ default is 256MB. use -m option to change
+
+ fixes #115 / http://bugzilla.maptools.org/show_bug.cgi?id=2755
+
+2020-03-21 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-184' into 'master'
+ CmakeLists.txt: define WORDS_BIGENDIAN when the CPU is big endian
+
+ Closes #184
+
+ See merge request libtiff/libtiff!127
+
+2020-03-21 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-44' into 'master'
+ tiff2pdf: "" causes the relevant argument not to be written
+
+ Closes #44
+
+ See merge request libtiff/libtiff!128
+
+2020-03-21 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-56' into 'master'
+ fix man for TIFFReadEncodedStrip(), TIFFStripSize, TIFFVStripSize, TIFFRawStripSize
+
+ Closes #56
+
+ See merge request libtiff/libtiff!129
+
+2020-03-20 Thomas Bernard <miniupnp@free.fr>
+
+ fix man for TIFFReadEncodedStrip(), TIFFStripSize, TIFFVStripSize, TIFFRawStripSize
+ fixes #56
+ http://bugzilla.maptools.org/show_bug.cgi?id=2507
+
+ tiff2pdf: "" causes the relevant argument not to be written.
+ fixes #44
+
+ CmakeLists.txt: define WORDS_BIGENDIAN when the CPU is big endian.
+ fixes #184
+
+2020-03-17 Thomas Bernard <miniupnp@free.fr>
+
+ tiff2pdf: avoid divide by 0.
+ fixes #133 http://bugzilla.maptools.org/show_bug.cgi?id=2796
+
+2020-03-17 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-22' into 'master'
+ do not _tiffMapProc 0 size files
+
+ Closes #22
+
+ See merge request libtiff/libtiff!125
+
+2020-03-13 Thomas Bernard <miniupnp@free.fr>
+
+ tif_win32.c: do not _tiffMapProc() 0 sized files.
+ see #22
+
+ tif_unix.c: do not _tiffMapProc 0 size files.
+ fixes #22
+ http://bugzilla.maptools.org/show_bug.cgi?id=2249
+
+2020-03-12 Even Rouault <even.rouault@spatialys.com>
+
+ tif_fax3.c: fix warning C4018: '<': signed/unsigned mismatch introduced in past commits
+
+2020-03-11 Even Rouault <even.rouault@spatialys.com>
+
+ tiff.h: mention TIFFTAG_RPCCOEFFICIENT, TIFFTAG_TIFF_RSID, TIFFTAG_GEO_METADATA
+
+2020-03-11 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-60' into 'master'
+ added support for more private tags
+
+ Closes #60
+
+ See merge request libtiff/libtiff!124
+
+2020-03-11 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-160' into 'master'
+ Fax3SetupState(): check consistency of rowbytes and rowpixels
+
+ Closes #160
+
+ See merge request libtiff/libtiff!123
+
+2020-03-11 Thomas Bernard <miniupnp@free.fr>
+
+ added support for more private tags.
+ see https://gitlab.com/libtiff/libtiff/-/issues/60
+ bugzilla.maptools.org/show_bug.cgi?id=2525
+
+ closes #60
+
+ original author : art1@andreas-romeyke.de
+
+2020-03-11 Thomas Bernard <miniupnp@free.fr>
+
+ Fax3SetupState(): check consistency of rowbytes and rowpixels.
+ also add some parameter documentation to Fax3Decode1D()
+
+ fixes #160
+ http://bugzilla.maptools.org/show_bug.cgi?id=2854
+
+2020-03-10 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-11-const-pointers' into 'master'
+ Make pointers returned via TIFFGetField const
+
+ Closes #11
+
+ See merge request libtiff/libtiff!118
+
+2020-03-10 Even Rouault <even.rouault@spatialys.com>
+
+ tif_ojpeg.c: relax again too strict sanity checks to allow reading of valid images such as https://gitlab.com/libtiff/libtiff/-/issues/181#note_302535232. Fixes #181
+
+2020-03-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-52' into 'master'
+ contrib/win_dib/tiff2dib: fix Uninitialized variable: lpBits
+
+ Closes #52
+
+ See merge request libtiff/libtiff!121
+
+2020-03-09 Thomas Bernard <miniupnp@free.fr>
+
+ contrib/win_dib/tiff2dib: fix Uninitialized variable: lpBits.
+ fixes #52
+ http://bugzilla.maptools.org/show_bug.cgi?id=2469
+
+2020-03-08 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-58' into 'master'
+ Make TIFFTAG_CFAPATTERN variable count
+
+ Closes #58
+
+ See merge request libtiff/libtiff!120
+
+2020-03-08 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-158-no-predictor-in-webp' into 'master'
+ TIFFTAG_PREDICTOR is not supported for WebP
+
+ Closes #158
+
+ See merge request libtiff/libtiff!119
+
+2020-03-08 Sam Hasinoff <hasinoff@google.com>
+
+ Make TIFFTAG_CFAPATTERN variable count.
+ The TIFFTAG_CFAPATTERN tag (33422) from TIFF/EP, recently introduced in libtiff
+ 3363eda09d082e3e1dfffa6281f53085cac51ad3 / http://bugzilla.maptools.org/show_bug.cgi?id=2457
+ is described as having a fixed count of 4.
+ But the TIFF/EP spec says this should support a variable count (= CFARepeatRows * CFARepeatCols):
+
+ TIFF/EP, ISO 12234-2:2001
+ http://www.barrypearson.co.uk/top2009/downloads/TAG2000-22_DIS12234-2.pdf
+ page 18 and 26
+
+2020-03-08 Thomas Bernard <miniupnp@free.fr>
+
+ TIFFTAG_PREDICTOR is not supported for WebP.
+ fixes #158
+ https://gitlab.com/libtiff/libtiff/-/issues/158
+
+ this bug was introduced by 9eacd59fecc4ef593ac17689bc530ab451c8ec14
+ merge request !32
+
+2020-03-07 Adam Goode <adam@spicenitz.org>
+
+ Make the default whitepoint and ycbcrcoeffs arrays const.
+ Now that we are returning const pointers in TIFFGetFieldDefaulted,
+ we can now make these static default arrays const.
+
+ see #11
+
+2020-03-07 Adam Goode <adam@spicenitz.org>
+
+ Make pointers returned via TIFFGetField const.
+ According to http://bugzilla.maptools.org/show_bug.cgi?id=2125#c6
+ callers are not allowed to modify pointer or array values returned from
+ TIFFGetField or the like. So, make this explicit in the documentation
+ by specifying these things as const. Note that this is not an ABI
+ change, since C does not encode const in libraries. Also, this is
+ not really an API change, since the varargs call strips away all
+ the types anyway. So it really is more of a documentation change.
+
+ fixes #11
+
+2020-03-07 Even Rouault <even.rouault@spatialys.com>
+
+ CMake: Skip custom_dir_EXIF_231 test on shared builds to avoid issues on Windows
+
+2020-03-07 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'EXIF231_GPS_upgrade' into 'master'
+ EXIF 2.32 and GPS TIFF-tags and functionality upgraded.
+
+ See merge request libtiff/libtiff!91
+
+2020-03-07 Su_Laus <sulau@freenet.de>
+
+ EXIF 2.32 and GPS tags and functionality upgraded.
+ - Existing EXIF field definition of tags is upgraded to EXIF version 2.3.2
+ - EXIF-GPS structure, tags and access functions are added as special CustomDirectory (like it was done for EXIF).
+ - Test program custom_dir_EXIF_231.c added to test writing/reading of EXID IFD and GPS IFD tags
+ and to highlight some quirks of IFD-handling and peculiarities of reading/writing the different data types.
+ - Reading error for FileSource and SceneType tags corrected.
+
+ - EXIF_GPS_upgrade rebased onto c8c5309b765ef4ff097d2aaffbdb8f403db8967d (Merge branch 'Rational2DoublePrecision_correction' into 'master')
+ and adapted:
+ - tif_dirinfo.c: All rational tags set to TIFF_SETGET_FLOAT but only the GPSTAG_ tags set to TIFF_SETGET_DOUBLE.
+ - custom_dir_EXIF_231.c: Editorials amended and gcc warnings fixed.
+ - CMakeLists.txt: add_test(NAME "custom_dir_EXIF_231" COMMAND "custom_dir_EXIF_231") added.
+
+2020-03-07 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-55' into 'master'
+ ppm2tiff: support any bps value from 1 to 16
+
+ Closes #55
+
+ See merge request libtiff/libtiff!106
+
+2020-03-07 Thomas Bernard <miniupnp@free.fr>
+
+ ppm2tiff: Add test for 16bpc PPM.
+
+ ppm2tiff: remove unused argument warning.
+
+2020-03-07 Ludolf Holzheid <ludolf.holzheid@gmx.de>
+
+ ppm2tiff: support any bps value from 1 to 16.
+ fix #55
+ http://bugzilla.maptools.org/show_bug.cgi?id=2505
+
+ Patch originally submitted by Ludolf Holzheid <ludolf.holzheid@gmx.de>
+
+2020-03-06 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fax-test' into 'master'
+ add test for fax4 decoding
+
+ See merge request libtiff/libtiff!114
+
+2020-03-05 Thomas Bernard <miniupnp@free.fr>
+
+ add test for fax4 decoding.
+ This will check for regression on #46
+ https://gitlab.com/libtiff/libtiff/issues/46
+ http://bugzilla.maptools.org/show_bug.cgi?id=2434
+
+2020-03-05 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'freebsd-tests' into 'master'
+ make tests pass under FreeBSD.
+
+ See merge request libtiff/libtiff!113
+
+2020-03-05 Thomas Bernard <miniupnp@free.fr>
+
+ make tests pass under FreeBSD.
+ the -I option for the GNU diff and the FreeBSD diff
+ behaves differently regarding escaping the ( ) and |
+
+ By using two -I option, we avoid using such charracters.
+
+2020-03-05 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-31' into 'master'
+ HTML
+
+ Closes #31
+
+ See merge request libtiff/libtiff!111
+
+2020-03-05 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-179' into 'master'
+ tif_fax3.h: check for buffer overflow in EXPAND2D before "calling" CLEANUP_RUNS()
+
+ Closes #179
+
+ See merge request libtiff/libtiff!112
+
+2020-03-05 Thomas Bernard <miniupnp@free.fr>
+
+ v4.1.0.html: fix for validation.
+ long <!----------------> comments were replaced
+ because they confused some parsers
+
+ add DOCTYPE on v*.html.
+
+ fix HTML files so they are valid according to https://validator.w3.org.
+
+2020-03-05 Thomas Bernard <miniupnp@free.fr>
+
+ tif_fax3.h: check for buffer overflow in EXPAND2D before "calling" CLEANUP_RUNS()
+ fixes #179
+
+ this fixes the regression introduced in 02bb0175 / 72c4acef
+ ( merge request !110 )
+
+ It may be a better fix to do the overflow check in SETVALUE() but the
+ macro do { } while(0) construct makes it difficult to quit the loop
+ properly.
+
+2020-03-01 Thomas Bernard <miniupnp@free.fr>
+
+ index.html: fix unclosed <tt> tag.
+
+2020-03-01 Thomas Bernard <miniupnp@free.fr>
+
+ html: do not force colors (which are default anyway)
+ If needed, style should be set using CSS.
+
+ fixes #31
+ https://gitlab.com/libtiff/libtiff/issues/31
+ http://bugzilla.maptools.org/show_bug.cgi?id=2326
+
+2020-03-01 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFReadCustomDirectory(): fix potential heap buffer overflow when reading a custom directory, after a regular directory where a codec was active. Fixes https://gitlab.com/libtiff/libtiff/issues/178
+
+2020-03-01 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-46' into 'master'
+ fix decoding of fax4 images
+
+ Closes #46
+
+ See merge request libtiff/libtiff!110
+
+2020-02-29 Thomas Bernard <miniupnp@free.fr>
+
+ tif_fax3: better fix for CVE-2011-0192.
+ There are some legitimate case which were forbidden by the previous fix
+
+ tif_fax3.h: allow 0 length run in DECODE2D.
+ fixes #46
+ https://gitlab.com/libtiff/libtiff/issues/46
+ http://bugzilla.maptools.org/show_bug.cgi?id=2434
+
+2020-02-29 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'mingwlibm' into 'master'
+ Don't use libm with libtiff due to conflict with libmsvcrt
+
+ See merge request libtiff/libtiff!73
+
+2020-02-29 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'Rational2DoublePrecision_correction' into 'master'
+ tif_dirwrite.c: bugfix DoubleToSrational() for plain signed integers
+
+ See merge request libtiff/libtiff!109
+
+2020-02-29 Su_Laus <sulau@freenet.de>
+
+ tif_dirwrite.c: bugfix DoubleToSrational(), which returns plain signed integer values always as unsigned rationals. Add a test into rational_precision2double.c for "-1.0" and some editorials in tif_dirwrite.c. (code is related to 6df997c786928757caea0dd68d26ea5f098f49df changes).
+
+2020-02-29 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue-174' into 'master'
+ tif_fax3.c: check buffer overflow in Fax4Decode()
+
+ Closes #174
+
+ See merge request libtiff/libtiff!108
+
+2020-02-29 Thomas Bernard <miniupnp@free.fr>
+
+ Fax4Decode(): log error message in case of buffer overrun.
+
+ tif_fax3.c: check buffer overflow in Fax4Decode()
+ fixes #174
+
+2020-02-28 Even Rouault <even.rouault@spatialys.com>
+
+ typo fixes in code comments.
+
+ ToRationalEuclideanGCD: remove useless test that confuses Coverity Scan about a potential later modulo by zero
+
+2020-02-27 Even Rouault <even.rouault@spatialys.com>
+
+ tif_dirwrite.c: fix other warnings related to 6df997c786928757caea0dd68d26ea5f098f49df changes
+
+ rational_precision2double.c: fix many warnings, and do not build it on CMake on shared lib builds
+
+ tif_dirwrite.c: fix various warnings found when building GDAL with internal libtiff after 6df997c786928757caea0dd68d26ea5f098f49df changes
+
+ tif_dirwrite.c: qualify ToRationalEuclideanGCD() with static.
+
+2020-02-27 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'Rational2DoublePrecision' into 'master'
+ Rational with Double Precision Upgrade
+
+ See merge request libtiff/libtiff!100
+
+2020-02-27 Su_Laus <sulau@freenet.de>
+
+ Rational with Double Precision Upgrade.
+ Unfortunately, custom rational tags (TIFF_RATIONAL with field_bit=FIELD_CUSTOM) are defined as TIFF_SETGET_DOUBLE
+ but for the reading interface and LibTiff internally they are stored ALWAYS as floating point SINGLE precision.
+ Double precision custom rational tags are not supported by LibTiff.
+
+ For the GPS tags in WGS84 a higher accuracy / precision is needed.
+ Therefore, this upgrade is made, keeping the old interface for the already defined tags and allowing a double precision definition,
+ as well as calculating rationals with higher accuracy / precision.
+ This higher accuracy can be used for newly defined tags like that in EXIF/GPS.
+
+ Refer also to the very old Bugzilla issue 2542 (#69)
+
+ A test file rational_precision2double.c is added, which shows prevention of the old interface to the already defined custom rational tags
+ with the standard library as well as with the upgraded library.
+
+ Also TIFFTAG_XRESOLUTION, TIFFTAG_YRESOLUTION, TIFFTAG_XPOSITION, TIFFTAG_YPOSITION amended from TIFF_SETGET_DOUBLE to TIFF_SETGET_FLOAT and testcase inserted in rational_precision2double.c
+
+2020-02-26 Chris Degawa <ccom@randomderp.com>
+
+ mingw-w64 cmake: Don't find libm.
+ mingw-w64 will provide libm symbols by default without -lm and mingw-64's
+ libm is just a stub.
+
+ This is just to make sure that on systems with msys2 and also cygwin, cmake
+ doesn't find a libm that actually contains math functions.
+
+2020-02-26 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'division-by-zero' into 'master'
+ tools/tiffcp.c: fix potential division by zero
+
+ See merge request libtiff/libtiff!83
+
+2020-02-26 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix-unused-warning' into 'master'
+ warnings: mark conditionally used parameters
+
+ See merge request libtiff/libtiff!49
+
+2020-02-26 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'master' into 'master'
+ fix issue #78 warnings regarding RichTIFFIPTC data type
+
+ Closes #78
+
+ See merge request libtiff/libtiff!99
+
+2020-02-26 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'win64-handle-casts-warn-fix' into 'master'
+ Avoid warnings about casts between HANDLE and int in Win64 builds
+
+ Closes #2
+
+ See merge request libtiff/libtiff!93
+
+2020-02-26 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'bug2839' into 'master'
+ raw2tiff: avoid divide by 0
+
+ Closes #151
+
+ See merge request libtiff/libtiff!103
+
+2020-02-26 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'bug2669' into 'master'
+ tiff2pdf: palette bound check in t2p_sample_realize_palette()
+
+ Closes #82
+
+ See merge request libtiff/libtiff!104
+
+2020-02-26 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'int-shift' into 'master'
+ tiffcrop: fix asan runtime error caused by integer promotion
+
+ See merge request libtiff/libtiff!105
+
+2020-02-26 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'bug-2538' into 'master'
+ libtiff.html: fix function casing
+
+ Closes #68
+
+ See merge request libtiff/libtiff!107
+
+2020-02-16 Thomas Bernard <miniupnp@free.fr>
+
+ raw2tiff: avoid divide by 0.
+ fixes #151 / http://bugzilla.maptools.org/show_bug.cgi?id=2839
+
+ first memcmp() lines before computing correlation
+ and always avoid divide by 0 anyway
+
+2020-02-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'bug2855' into 'master'
+ tiff2ps: fix heap buffer read overflow in PSDataColorContig()
+
+ Closes #161
+
+ See merge request libtiff/libtiff!102
+
+2020-02-08 Thomas Bernard <miniupnp@free.fr>
+
+ libtiff.html: fix function casing.
+
+ libtiff.html: fix function casing.
+ fixes #68 / http://bugzilla.maptools.org/show_bug.cgi?id=2538
+
+2020-02-08 Thomas Bernard <miniupnp@free.fr>
+
+ tiffcrop: fix asan runtime error caused by integer promotion.
+ tiffcrop.c:4027:20: runtime error: left shift of 190 by 24 places cannot be represented in type 'int'
+
+ C treats (byte << 24) as an int expression.
+ casting explicitly to unsigned type uint32 avoids the problem.
+
+ the same issue has been fixed elsewhere with a24213691616e7cd35aa3e2805493de80c7e4fcf
+
+ I detected the bug with the test file of #86
+
+2020-02-08 Thomas Bernard <miniupnp@free.fr>
+
+ tiff2pdf: palette bound check in t2p_sample_realize_palette()
+ fixes #82
+
+2020-02-08 Thomas Bernard <miniupnp@free.fr>
+
+ tiff2ps: fix heap buffer read overflow in PSDataColorContig()
+ fixes #161 / http://bugzilla.maptools.org/show_bug.cgi?id=2855
+
+ in 05029fb7f1ecf771abaf90b5705b6cab9eb522a7 I missed that 1 extra byte is read
+ in this loop.
+
+2020-02-05 Even Rouault <even.rouault@spatialys.com>
+
+ tif_dirread.c: suppress CLang static Analyzer 9.0 false positive.
+
+2020-02-01 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFSetupStrips: enforce 2GB limitation of Strip/Tile Offsets/ByteCounts arrays
+ TIFFWriteDirectoryTagData() has an assertion that checks that the
+ arrays are not larger than 2GB. So error out earlier if in that situation.
+
+2020-01-29 Bob Friesenhahn <bfriesen@simple.dallas.tx.us>
+
+ Simplify nmake configuration for building port directory. Now there is only one boolean setting to enable building strtoll() and strtoull() port functions. The boolean setting enables the necessary port files to be built, but the remainder of the logic is via pre-processor code in the common tif_config.h, which was prepared before entering the port directory to do a build.
+
+2020-01-28 Bob Friesenhahn <bfriesen@simple.dallas.tx.us>
+
+ Make sure that tif_config.h is produced prior to entering the port directory and add an include path so that the port files can include tif_config.h. Do not actually include tif_config.h at this time since CMake and Autotools builds are not prepared for that. This issue could be handled by updating the CMake and Autotools builds or by adding a define which directs libport.h to include tif_config.h.
+
+2020-01-26 Bob Friesenhahn <bfriesen@simple.dallas.tx.us>
+
+ Fix nmake build mistakes in my last commit:
+ tif_config.vc.h:
+
+ Always define HAVE_STRTOL/HAVE_STRTOUL.
+ Define HAVE_STRTOLL/HAVE_STRTOULL if _MSC_VER >= 1900.
+
+ nmake.opt:
+
+ Provide defaults suitable for MSVC prior to 14.0.
+
+ libport.h:
+
+ The sense of the pre-processor logic was inverted from what it
+ should be. The intention is to only provide the prototype if the
+ function is missing.
+
+2020-01-25 Bob Friesenhahn <bfriesen@simple.dallas.tx.us>
+
+ Add nmake build support for manually configuring the 'port' files to be built based on MSVC features. Include tif_config.h in tools/tiffset.c.
+
+2020-01-23 Even Rouault <even.rouault@spatialys.com>
+
+ Adjust previous fix to avoid undue warning in some situations triggered by GDAL
+
+2020-01-12 Even Rouault <even.rouault@spatialys.com>
+
+ _TIFFPartialReadStripArray: bring back support for non-conformant SLONG8 data type
+ Such as in https://github.com/OSGeo/gdal/issues/2165
+
+2020-01-07 Even Rouault <even.rouault@spatialys.com>
+
+ test: add test for single-strip OJPEG file without RowsPerStrip tag (like in CR2 files)
+
+ OJPEGReadHeaderInfo: if rowsperstrip not defined, then assume one-single-strip. Complementary fix to 0356ea76bac908c61160d735f078437ace953bd3
+
+2019-12-16 Angel Sánchez <angelsanchez@inedit.com>
+
+ fix issue #78 warnings regarding RichTIFFIPTC data type.
+
+2019-12-14 Even Rouault <even.rouault@spatialys.com>
+
+ contrib/oss-fuzz/build.sh: fix broken if construct.
+
+2019-11-28 Even Rouault <even.rouault@spatialys.com>
+
+ contrib/oss-fuzz/build.sh: other attempt at fixing build failure.
+
+2019-11-20 Even Rouault <even.rouault@spatialys.com>
+
+ contrib/oss-fuzz/build.sh: install liblzma-dev for x86_64 builds.
+
+2019-11-17 Even Rouault <even.rouault@spatialys.com>
+
+ contrib/oss-fuzz/build.sh: install liblzma-dev:i386 on i386 builds.
+
+2019-11-15 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'cmake-parse' into 'master'
+ CMake: simplify parsing variables from configure
+
+ See merge request libtiff/libtiff!98
+
+2019-11-15 Rolf Eike Beer <eb@emlix.com>
+
+ CMake: simplify parsing variables from configure.
+
+2019-11-14 Even Rouault <even.rouault@spatialys.com>
+
+ contrib/oss-fuzz/build.sh: fix ossfuzz build by statically linking to lzma
+
+2019-11-12 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_ojpeg_172' into 'master'
+ OJPEG: fix broken sanity check added in 4.1.0 (#fixes 172)
+
+ See merge request libtiff/libtiff!97
+
+2019-11-11 Even Rouault <even.rouault@spatialys.com>
+
+ OJPEG: fix broken sanity check added in 4.1.0, and add two OJPEG test files
+
+ test/: add missing generated .sh files.
+
+2019-11-04 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix-missing-checks-TIFFGetField-tiffcrop' into 'master'
+ adds missing checks on TIFFGetField in tiffcrop tool
+
+ Closes #170
+
+ See merge request libtiff/libtiff!96
+
+2019-11-04 Bug Checkers <coolbugcheckers@gmail.com>
+
+ adds missing checks on TIFFGetField in tiffcrop tool (fixes #170)
+
+2019-11-04 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'adds-missing-TIFFClose-rgb2ycbcr' into 'master'
+ adds a missing TIFFClose in rgb2ycbcr tool
+
+ See merge request libtiff/libtiff!95
+
+2019-11-04 Mansour Ahmadi <mansourweb@gmail.com>
+
+ adds a missing TIFFClose in rgb2ycbcr tool.
+
2019-11-03 Bob Friesenhahn <bfriesen@simple.dallas.tx.us>
libtiff 4.1.0 released.
@@ -81,7 +5222,7 @@
2019-08-25 Even Rouault <even.rouault@spatialys.com>
- JPEG: avoid use of unintialized memory on corrupted files.
+ JPEG: avoid use of uninitialized memory on corrupted files.
Follow-up of cf3ce6fab894414a336546f62adc57f02590a22c
Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=16602
Credit to OSS Fuzz
@@ -145,7 +5286,7 @@
signed), which was especially easily triggered on 32-bit builds (with recent
enough compilers that assume that signed multiplication cannot overflow, since
this is undefined behaviour by the C standard). The original issue which lead to
- this fix was trigged from tif_fax3.c
+ this fix was triggered from tif_fax3.c
There were also unsafe (implementation defied), and broken in practice on 64bit
builds, ways of checking that a uint64 fits of a (signed) tmsize_t by doing
@@ -218,7 +5359,7 @@
- Discussion in https://gitlab.com/libtiff/libtiff/merge_requests/39
- http://bugzilla.maptools.org/show_bug.cgi?id=2540
- Comments and indention adapted.
+ Comments and indentation adapted.
Preparation to rebase onto master
@@ -238,7 +5379,7 @@
[00:02:58] -- CMAKE_HOST_SYSTEM_PROCESSOR set to AMD64
[00:02:58] -- HOST_FILLORDER set to FILLORDER_MSB2LSB
- Ther reason is that we match the "amd64.*" lowercase string whereas
+ The reason is that we match the "amd64.*" lowercase string whereas
CMAKE_HOST_SYSTEM_PROCESSOR is set to AMD64 uppercase.
2019-07-09 Even Rouault <even.rouault@spatialys.com>
@@ -248,13 +5389,13 @@
2019-07-09 Even Rouault <even.rouault@spatialys.com>
Merge branch 'fix_chromium_925269' into 'master'
- OJPEG: avoid use of unintialized memory on corrupted files
+ OJPEG: avoid use of uninitialized memory on corrupted files
See merge request libtiff/libtiff!86
2019-07-05 Even Rouault <even.rouault@spatialys.com>
- OJPEG: avoid use of unintialized memory on corrupted files.
+ OJPEG: avoid use of uninitialized memory on corrupted files.
Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=925269
Patch from Lei Zhang with little adaptations.
@@ -407,12 +5548,12 @@
arrays are only loaded when first accessed. This can speed-up the opening
of files stored on the network when just metadata retrieval is needed.
This mode has been used for years by the GDAL library when compiled with
- its embeded libtiff copy.
+ its embedded libtiff copy.
To avoid potential out-of-tree code (typically codecs) that would use
the td_stripbytecount and td_stripoffset array inconditionnaly assuming they
have been loaded, those have been suffixed with _p (for protected). The
- use of the new functions mentionned below is then recommended.
+ use of the new functions mentioned below is then recommended.
Another addition of this commit is the capability of loading only the
values of the offset/bytecount of the strile of interest instead of the
@@ -428,7 +5569,7 @@
if a strile is present or not without decompressing the data, or updating
an existing sparse file.
They will also be used to enable a future enhancement where client code can entirely
- skip bytecount loading in some situtations
+ skip bytecount loading in some situations
A new test/defer_strile_loading.c test has been added to test the above
capabilities.
@@ -699,8 +5840,8 @@
Also the values were not properly calculated. It should be
255-x, 15-x, 3-x for bps 8, 4, 2.
- But anyway it is easyer to invert all bits as 255-x = ~x, etc.
- (substracting from a binary number composed of all 1 is like inverting
+ But anyway it is easier to invert all bits as 255-x = ~x, etc.
+ (subtracting from a binary number composed of all 1 is like inverting
the bits)
2019-02-11 Thomas Bernard <miniupnp@free.fr>
@@ -1228,7 +6369,7 @@
Merge branch 'zstd'
- Add warning about COMPRESSION_ZSTD not being officialy registered.
+ Add warning about COMPRESSION_ZSTD not being officially registered.
2018-02-14 Even Rouault <even.rouault@mines-paris.org>
@@ -1458,7 +6599,7 @@
result, we end up writing past the end of the buffer.
There are also some related issues that this also fixes. For example,
- TIFFGetField can return uninitalized pointer values, and the logic to
+ TIFFGetField can return uninitialized pointer values, and the logic to
detect a N=3 vs N=1 transfer function seemed rather strange.
It is also strange that we declare the transfer functions to be of type
@@ -1873,7 +7014,7 @@
scans and not interleavedin a single one, needs to allocate memory (or
backing store) for the whole strip/tile.
See http://www.libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf
- This limitation may be overriden by setting the
+ This limitation may be overridden by setting the
LIBTIFF_ALLOW_LARGE_LIBJPEG_MEM_ALLOC environment variable, or recompiling
libtiff with a custom value of TIFF_LIBJPEG_LARGEST_MEM_ALLOC macro.
@@ -2156,7 +7297,7 @@
* libtiff/tif_jpeg.c: only run JPEGFixupTagsSubsampling() if the
YCbCrSubsampling tag is not explicitly present. This helps a bit to reduce
- the I/O amount when te tag is present (especially on cloud hosted files).
+ the I/O amount when the tag is present (especially on cloud hosted files).
2017-01-14 Even Rouault <even.rouault at spatialys.com>
@@ -2397,7 +7538,7 @@
2016-12-03 Even Rouault <even.rouault at spatialys.com>
* libtiff/tif_dirread.c: modify ChopUpSingleUncompressedStrip() to
- instanciate compute ntrips as TIFFhowmany_32(td->td_imagelength, rowsperstrip),
+ instantiate compute nstrips as TIFFhowmany_32(td->td_imagelength, rowsperstrip),
instead of a logic based on the total size of data. Which is faulty is
the total size of data is not sufficient to fill the whole image, and thus
results in reading outside of the StripByCounts/StripOffsets arrays when
@@ -2421,7 +7562,7 @@
2016-12-02 Even Rouault <even.rouault at spatialys.com>
- * tools/tiffcp.c: avoid uint32 underflow in cpDecodedStrips that
+ * tools/tiffcp.c: avoid uint32 underflow in cpDecodedStrips that
can cause various issues, such as buffer overflows in the library.
Reported by Agostino Sarubbo.
Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2598
@@ -2863,7 +8004,7 @@
* libtiff/tif_write.c: TIFFWriteEncodedStrip() and TIFFWriteEncodedTile()
should return -1 in case of failure of tif_encodestrip() as documented
* libtiff/tif_dumpmode.c: DumpModeEncode() should return 0 in case of
- failure so that the above mentionned functions detect the error.
+ failure so that the above mentioned functions detect the error.
2015-12-06 Even Rouault <even.rouault at spatialys.com>
@@ -2886,7 +8027,7 @@
2015-11-22 Even Rouault <even.rouault at spatialys.com>
* libtiff/*.c: fix typos in comments (patch by Kurt Schwehr)
-
+
2015-11-22 Even Rouault <even.rouault at spatialys.com>
* libtiff/*.c: fix MSVC warnings related to cast shortening and
@@ -3454,7 +8595,7 @@
2014-12-27 Even Rouault <even.rouault@spatialys.com>
* libtiff/tif_dir.c: in TIFFDefaultDirectory(), reset any already existing
- extented tags installed by user code through the extender mechaninm before
+ extended tags installed by user code through the extender mechanism before
calling the extender callback (GDAL #5054)
2014-12-26 Bob Friesenhahn <bfriesen@simple.dallas.tx.us>
@@ -3557,14 +8698,14 @@
cpStripToTile() (called from writeBufferToContigTiles).
Note that the resulting TIFF file would be scrambled even
if tiffcp wouldn't crash, since the output file would contain
- RGB data intepreted as subsampled YCbCr values.
+ RGB data interpreted as subsampled YCbCr values.
This patch fixes the problem by forcing RGB space on the output
TIF if the input is JPEG-encoded and output is *not* JPEG-encoded.
Author: Tomasz Buchert <tomasz.buchert@inria.fr>
2014-12-21 Even Rouault <even.rouault@spatialys.com>
- Fix various crasher bugs on fuzzed images.
+ Fix various crash bugs on fuzzed images.
* libtiff/tif_dir.c: TIFFSetField(): refuse to set negative values for
TIFFTAG_XRESOLUTION and TIFFTAG_YRESOLUTION that cause asserts when writing
the directory
@@ -3901,7 +9042,7 @@
* libtiff 4.0.2 released.
- * tools/tif2pdf.c, tools/tifdump.c: avoid unitialized variable
+ * tools/tif2pdf.c, tools/tifdump.c: avoid uninitialized variable
warnings with clang.
2012-06-15 Tom Lane <tgl@sss.pgh.pa.us>
@@ -5548,7 +10689,7 @@ btiff/tif_win32.c: Replace custom Win32 memory api with generic
Added support for a TIFF_PTRDIFF_T type to use when doing pointer arithmetic.
Added support for a TIFF_SSIZE_T in order to return memory sizes but still
allow returning -1 for errors.
- * libtiff/tiffconf.vc.h: Add porting type defintions for WIN32.
+ * libtiff/tiffconf.vc.h: Add porting type definitions for WIN32.
2007-06-25 Bob Friesenhahn <bfriesen@simple.dallas.tx.us>
@@ -5683,7 +10824,7 @@ btiff/tif_win32.c: Replace custom Win32 memory api with generic
* libtiff/tif_config.wince.h: Added configuration header for WinCE.
* libtiff/tiffconf.wince.h: Ported old configuration header for WinCE.
* libtiff/tif_wince.c: Added WinCE-specific implementation of some
- functons from tif_win32.c.
+ functions from tif_win32.c.
* libtiff/tif_win32.c: Disabled some functions already reimplemented in tif_wince.c.
* libtiff/tiffiop.h, port/lfind.c: Added conditional include of some
standard header files for Windows CE build.
@@ -5927,7 +11068,7 @@ btiff/tif_win32.c: Replace custom Win32 memory api with generic
* libtiff/tif_jpeg.c: strip size related bugfix in encode raw
- * libtiff/tif_strip.c: temporarilly added two new versions of
+ * libtiff/tif_strip.c: temporarily added two new versions of
TIFFScanlineSize
- TIFFNewScanlineSize: proposed new version, after all related
issues and side-effects are sorted out
@@ -5987,7 +11128,7 @@ btiff/tif_win32.c: Replace custom Win32 memory api with generic
2006-03-16 Andrey Kiselev <dron@ak4719.spb.edu>
- * libtiff/tiffiop.h: Added decalration for
+ * libtiff/tiffiop.h: Added declaration for
_TIFFSetDefaultCompressionState().
* libtiff/{tif_jpeg.c, tif_fax3.c, tif_zip.c, tif_pixarlog.c,
@@ -6317,7 +11458,7 @@ btiff/tif_win32.c: Replace custom Win32 memory api with generic
http://bugzilla.remotesensing.org/show_bug.cgi?id=1003
- * libtiff/tif_dirinfo.c: Correctly yse bsearch() and lfind()
+ * libtiff/tif_dirinfo.c: Correctly use bsearch() and lfind()
functions as per bug
http://bugzilla.remotesensing.org/show_bug.cgi?id=1008
@@ -6362,7 +11503,7 @@ btiff/tif_win32.c: Replace custom Win32 memory api with generic
http://bugzilla.remotesensing.org/show_bug.cgi?id=977
- * tools/tiffsplit.c: Copy fax related fields over splitted parts
+ * tools/tiffsplit.c: Copy fax related fields over split parts
as per bug
http://bugzilla.remotesensing.org/show_bug.cgi?id=983
@@ -6544,12 +11685,12 @@ btiff/tif_win32.c: Replace custom Win32 memory api with generic
2005-06-07 Andrey Kiselev <dron@ak4719.spb.edu>
* contrib/addtiffo/tif_ovrcache.c: Properly extract tile/strip size;
- use pixel sized shift in contigous case.
+ use pixel sized shift in contiguous case.
2005-06-06 Andrey Kiselev <dron@ak4719.spb.edu>
* contrib/addtiffo/{tif_overview.c, tif_ovrcache.c, tif_ovrcache.h}:
- Make overviews working for contiguos images.
+ Make overviews working for contiguous images.
2005-06-03 Andrey Kiselev <dron@ak4719.spb.edu>
@@ -6979,7 +12120,7 @@ btiff/tif_win32.c: Replace custom Win32 memory api with generic
http://bugzilla.remotesensing.org/show_bug.cgi?id=697
- * libtiff/tif_config.in.vc: Removed unneded definitions for
+ * libtiff/tif_config.in.vc: Removed unneeded definitions for
read/open/close/lseek functions to fix the
http://bugzilla.remotesensing.org/show_bug.cgi?id=680
@@ -7838,7 +12979,7 @@ btiff/tif_win32.c: Replace custom Win32 memory api with generic
* man/tiff2pdf.1: Few improvements in page layout.
* Makefile.in, /man/Makefile.in, /html/man/tiff2pdf.1.html:
- Added support fpr tiff2pdf manual page.
+ Added support for tiff2pdf manual page.
2003-11-26 Ross Finlayson <libtiff@apexinternetsoftware.com>
@@ -7847,7 +12988,7 @@ btiff/tif_win32.c: Replace custom Win32 memory api with generic
2003-11-26 Andrey Kiselev <dron@ak4719.spb.edu>
* Makefile.in, /tools/{Makefile.in, makefile.vc}:
- Added support fpr tiff2pdf utility.
+ Added support for tiff2pdf utility.
2003-11-25 Ross Finlayson <libtiff@apexinternetsoftware.com>
@@ -7890,7 +13031,7 @@ btiff/tif_win32.c: Replace custom Win32 memory api with generic
2003-11-17 Andrey Kiselev <dron@ak4719.spb.edu>
* contrib/pds/{tif_pdsdirread.c, tif_pdsdirwrite.c}: Use
- TIFFDataWidth() function insted of tiffDataWidth array.
+ TIFFDataWidth() function instead of tiffDataWidth array.
2003-11-16 Andrey Kiselev <dron@ak4719.spb.edu>
@@ -8677,7 +13818,7 @@ btiff/tif_win32.c: Replace custom Win32 memory api with generic
TIFFDataType sizes instead of working with tiffDataWidth array
directly. Should prevent out-of-borders bugs in case of unknown or
broken data types. EstimateStripByteCounts routine modified, so it
- won't work when tags with uknown sizes founded.
+ won't work when tags with unknown sizes founded.
Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=109
2002-03-13 Andrey Kiselev <dron@ak4719.spb.edu>
@@ -8879,7 +14020,7 @@ btiff/tif_win32.c: Replace custom Win32 memory api with generic
* libtiff/tif_getimage.c: relax handling of contig case where
there are extra samples that are supposed to be ignored. This
- should now work for 8bit greyscale or palletted images.
+ should now work for 8bit greyscale or paletted images.
http://bugzilla.remotesensing.org/show_bug.cgi?id=75
@@ -9109,7 +14250,7 @@ btiff/tif_win32.c: Replace custom Win32 memory api with generic
2001-02-16 Frank Warmerdam <warmerdam@pobox.com>
* libtiff/libtiff.def: Brent Roman submitted new version adding
- serveral missing entry points.
+ several missing entry points.
* libtiff/tif_dirinfo.c: don't declare tiffFieldInfo static on VMS.
Some sort of weird VMS thing.
@@ -9519,7 +14660,7 @@ Tue Nov 30 14:41:43 1999 Frank Warmerdam <warmerda@gdal.velocet.ca> *** 3.5
Tue Nov 30 14:15:32 EST 1999 Mike Welles <mike@onshore.com>
- * Added zip creation to relase makefile target
+ * Added zip creation to release makefile target
* Added html for TIFFWriteTile.3t man page.
diff --git a/src/3rdparty/libtiff/README b/src/3rdparty/libtiff/README
deleted file mode 100644
index 5f30f4e..0000000
--- a/src/3rdparty/libtiff/README
+++ /dev/null
@@ -1,61 +0,0 @@
-$Header: /cvs/maptools/cvsroot/libtiff/README,v 1.7 2012-02-18 21:53:27 bfriesen Exp $
-
-
-TIFF Software Distribution
---------------------------
-This file is just a placeholder; all the documentation is now in
-HTML in the html directory. To view the documentation point your
-favorite WWW viewer at html/index.html;
-
-e.g.
-
- firefox html/index.html
-
-If you don't have an HTML viewer then you can read the HTML source
-or fetch a PostScript version of this documentation from the directory
-
- ftp://ftp.remotesensing.org/pub/libtiff/
-
-If you can't hack either of these options then basically what you
-want to do is:
-
- % ./configure
- % make
- % su
- # make install
-
-More information, email contacts, and mailing list information can be
-found online at http://www.remotesensing.org/libtiff/.
-
-
-Use and Copyright
------------------
-Silicon Graphics has seen fit to allow us to give this work away. It
-is free. There is no support or guarantee of any sort as to its
-operations, correctness, or whatever. If you do anything useful with
-all or parts of it you need to honor the copyright notices. I would
-also be interested in knowing about it and, hopefully, be acknowledged.
-
-The legal way of saying that is:
-
-Copyright (c) 1988-1997 Sam Leffler
-Copyright (c) 1991-1997 Silicon Graphics, Inc.
-
-Permission to use, copy, modify, distribute, and sell this software and
-its documentation for any purpose is hereby granted without fee, provided
-that (i) the above copyright notices and this permission notice appear in
-all copies of the software and related documentation, and (ii) the names of
-Sam Leffler and Silicon Graphics may not be used in any advertising or
-publicity relating to the software without the specific, prior written
-permission of Sam Leffler and Silicon Graphics.
-
-THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
-EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
-WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
-
-IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
-ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
-OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
-LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
-OF THIS SOFTWARE.
diff --git a/src/3rdparty/libtiff/README.vms b/src/3rdparty/libtiff/README.vms
deleted file mode 100644
index 44d9663..0000000
--- a/src/3rdparty/libtiff/README.vms
+++ /dev/null
@@ -1,12 +0,0 @@
-Dear OpenVMS user
-to make this library, execute
-$@CONFIGURE
-$@BUILD
-
-Build process should be error and warning free. When process will be finished,
-LIBTIFF$STRATUP.COM file containing all required definitions, will be created.
-Please call it from system startup procedure or individual user procedure LOGIN.COM
-To link software with libtiff, use TIFF:LIBTIFF.OPT
-
-best regards,
-Alexey Chupahin, elvis_75@mail.ru
diff --git a/src/3rdparty/libtiff/RELEASE-DATE b/src/3rdparty/libtiff/RELEASE-DATE
index ad4fa62..349ad3e 100644
--- a/src/3rdparty/libtiff/RELEASE-DATE
+++ b/src/3rdparty/libtiff/RELEASE-DATE
@@ -1 +1 @@
-20191103
+20221213
diff --git a/src/3rdparty/libtiff/VERSION b/src/3rdparty/libtiff/VERSION
index ee74734..a84947d 100644
--- a/src/3rdparty/libtiff/VERSION
+++ b/src/3rdparty/libtiff/VERSION
@@ -1 +1 @@
-4.1.0
+4.5.0
diff --git a/src/3rdparty/libtiff/libtiff/SConstruct b/src/3rdparty/libtiff/libtiff/SConstruct
deleted file mode 100644
index af3daac..0000000
--- a/src/3rdparty/libtiff/libtiff/SConstruct
+++ /dev/null
@@ -1,71 +0,0 @@
-# Tag Image File Format (TIFF) Software
-#
-# Copyright (C) 2005, Andrey Kiselev <dron@ak4719.spb.edu>
-#
-# Permission to use, copy, modify, distribute, and sell this software and
-# its documentation for any purpose is hereby granted without fee, provided
-# that (i) the above copyright notices and this permission notice appear in
-# all copies of the software and related documentation, and (ii) the names of
-# Sam Leffler and Silicon Graphics may not be used in any advertising or
-# publicity relating to the software without the specific, prior written
-# permission of Sam Leffler and Silicon Graphics.
-#
-# THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
-# WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
-#
-# IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
-# ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
-# OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-# WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
-# LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
-# OF THIS SOFTWARE.
-
-# This file contains rules to build software with the SCons tool
-# (see the http://www.scons.org/ for details on SCons).
-
-# Import globally defined options
-Import([ 'env', 'idir_lib' ])
-
-SRCS = [ \
- 'tif_aux.c', \
- 'tif_close.c', \
- 'tif_codec.c', \
- 'tif_color.c', \
- 'tif_compress.c', \
- 'tif_dir.c', \
- 'tif_dirinfo.c', \
- 'tif_dirread.c', \
- 'tif_dirwrite.c', \
- 'tif_dumpmode.c', \
- 'tif_error.c', \
- 'tif_extension.c', \
- 'tif_fax3.c', \
- 'tif_fax3sm.c', \
- 'tif_flush.c', \
- 'tif_getimage.c', \
- 'tif_jbig.c', \
- 'tif_jpeg.c', \
- 'tif_luv.c', \
- 'tif_lzw.c', \
- 'tif_next.c', \
- 'tif_ojpeg.c', \
- 'tif_open.c', \
- 'tif_packbits.c', \
- 'tif_pixarlog.c', \
- 'tif_predict.c', \
- 'tif_print.c', \
- 'tif_read.c', \
- 'tif_strip.c', \
- 'tif_swab.c', \
- 'tif_thunder.c', \
- 'tif_tile.c', \
- 'tif_unix.c', \
- 'tif_version.c', \
- 'tif_warning.c', \
- 'tif_write.c', \
- 'tif_zip.c' ]
-
-StaticLibrary('tiff', SRCS)
-SharedLibrary('tiff', SRCS)
-
diff --git a/src/3rdparty/libtiff/libtiff/libtiff.def b/src/3rdparty/libtiff/libtiff/libtiff.def
index e34fac5..22cbb1a 100644
--- a/src/3rdparty/libtiff/libtiff/libtiff.def
+++ b/src/3rdparty/libtiff/libtiff/libtiff.def
@@ -5,6 +5,7 @@ EXPORTS TIFFAccessTagMethods
TIFFCheckpointDirectory
TIFFCleanup
TIFFClientOpen
+ TIFFClientOpenExt
TIFFClientdata
TIFFClose
TIFFComputeStrip
@@ -12,6 +13,7 @@ EXPORTS TIFFAccessTagMethods
TIFFCreateCustomDirectory
TIFFCreateDirectory
TIFFCreateEXIFDirectory
+ TIFFCreateGPSDirectory
TIFFCurrentDirOffset
TIFFCurrentDirectory
TIFFCurrentRow
@@ -23,15 +25,20 @@ EXPORTS TIFFAccessTagMethods
TIFFDeferStrileArrayWriting
TIFFError
TIFFErrorExt
+ TIFFErrorExtR
TIFFFdOpen
+ TIFFFdOpenExt
TIFFFieldDataType
TIFFFieldName
TIFFFieldPassCount
TIFFFieldReadCount
+ TIFFFieldIsAnonymous
TIFFFieldTag
TIFFFieldWithName
TIFFFieldWithTag
TIFFFieldWriteCount
+ TIFFFieldSetGetSize
+ TIFFFieldSetGetCountSize
TIFFFileName
TIFFFileno
TIFFFindCODEC
@@ -61,6 +68,7 @@ EXPORTS TIFFAccessTagMethods
TIFFGetVersion
TIFFGetWriteProc
TIFFIsBigEndian
+ TIFFIsBigTIFF
TIFFIsByteSwapped
TIFFIsCODECConfigured
TIFFIsMSB2LSB
@@ -72,7 +80,14 @@ EXPORTS TIFFAccessTagMethods
TIFFNumberOfStrips
TIFFNumberOfTiles
TIFFOpen
+ TIFFOpenExt
TIFFOpenW
+ TIFFOpenWExt
+ TIFFOpenOptionsAlloc
+ TIFFOpenOptionsFree
+ TIFFOpenOptionsSetMaxSingleMemAlloc
+ TIFFOpenOptionsSetErrorHandlerExtR
+ TIFFOpenOptionsSetWarningHandlerExtR
TIFFPrintDirectory
TIFFRGBAImageBegin
TIFFRGBAImageEnd
@@ -86,6 +101,7 @@ EXPORTS TIFFAccessTagMethods
TIFFReadCustomDirectory
TIFFReadDirectory
TIFFReadEXIFDirectory
+ TIFFReadGPSDirectory
TIFFReadEncodedStrip
TIFFReadEncodedTile
TIFFReadFromUserBuffer
@@ -149,6 +165,7 @@ EXPORTS TIFFAccessTagMethods
TIFFVTileSize64
TIFFWarning
TIFFWarningExt
+ TIFFWarningExtR
TIFFWriteBufferSetup
TIFFWriteCheck
TIFFWriteCustomDirectory
@@ -164,6 +181,7 @@ EXPORTS TIFFAccessTagMethods
TIFFYCbCrtoRGB
_TIFFCheckMalloc
_TIFFCheckRealloc
+ _TIFFClampDoubleToUInt32
_TIFFRewriteField
_TIFFfree
_TIFFmalloc
@@ -171,5 +189,7 @@ EXPORTS TIFFAccessTagMethods
_TIFFmemcpy
_TIFFmemset
_TIFFrealloc
- _TIFFMultiply32
- _TIFFMultiply64
+ _TIFFMultiply32
+ _TIFFMultiply64
+ _TIFFGetExifFields
+ _TIFFGetGpsFields
diff --git a/src/3rdparty/libtiff/libtiff/libtiff.map b/src/3rdparty/libtiff/libtiff/libtiff.map
index 2fc177f..05da6d7 100644
--- a/src/3rdparty/libtiff/libtiff/libtiff.map
+++ b/src/3rdparty/libtiff/libtiff/libtiff.map
@@ -1,4 +1,216 @@
LIBTIFF_4.0 {
global:
+ TIFFAccessTagMethods;
+ TIFFCIELabToRGBInit;
+ TIFFCIELabToXYZ;
+ TIFFCheckTile;
+ TIFFCheckpointDirectory;
+ TIFFCleanup;
+ TIFFClientOpen;
+ TIFFClientdata;
+ TIFFClose;
+ TIFFComputeStrip;
+ TIFFComputeTile;
+ TIFFCreateDirectory;
+ TIFFCurrentDirOffset;
+ TIFFCurrentDirectory;
+ TIFFCurrentRow;
+ TIFFCurrentStrip;
+ TIFFCurrentTile;
+ TIFFDataWidth;
+ TIFFDefaultStripSize;
+ TIFFDefaultTileSize;
+ TIFFError;
+ TIFFErrorExt;
+ TIFFFdOpen;
+ TIFFFieldWithName;
+ TIFFFieldWithTag;
+ TIFFFileName;
+ TIFFFileno;
+ TIFFFindCODEC;
+ TIFFFindField;
+ TIFFFlush;
+ TIFFFlushData;
+ TIFFFreeDirectory;
+ TIFFGetBitRevTable;
+ TIFFGetClientInfo;
+ TIFFGetCloseProc;
+ TIFFGetConfiguredCODECs;
+ TIFFGetField;
+ TIFFGetFieldDefaulted;
+ TIFFGetMapFileProc;
+ TIFFGetMode;
+ TIFFGetReadProc;
+ TIFFGetSeekProc;
+ TIFFGetSizeProc;
+ TIFFGetTagListCount;
+ TIFFGetTagListEntry;
+ TIFFGetUnmapFileProc;
+ TIFFGetVersion;
+ TIFFGetWriteProc;
+ TIFFIsBigEndian;
+ TIFFIsByteSwapped;
+ TIFFIsCODECConfigured;
+ TIFFIsMSB2LSB;
+ TIFFIsTiled;
+ TIFFIsUpSampled;
+ TIFFLastDirectory;
+ TIFFMergeFieldInfo;
+ TIFFNumberOfDirectories;
+ TIFFNumberOfStrips;
+ TIFFNumberOfTiles;
+ TIFFOpen;
+ TIFFOpenW;
+ TIFFPrintDirectory;
+ TIFFRGBAImageBegin;
+ TIFFRGBAImageEnd;
+ TIFFRGBAImageGet;
+ TIFFRGBAImageOK;
+ TIFFRasterScanlineSize;
+ TIFFRasterScanlineSize64;
+ TIFFRawStripSize;
+ TIFFRawStripSize64;
+ TIFFReadBufferSetup;
+ TIFFReadCustomDirectory;
+ TIFFReadDirectory;
+ TIFFReadEXIFDirectory;
+ TIFFReadEncodedStrip;
+ TIFFReadEncodedTile;
+ TIFFReadRGBAImage;
+ TIFFReadRGBAImageOriented;
+ TIFFReadRGBAStrip;
+ TIFFReadRGBATile;
+ TIFFReadRawStrip;
+ TIFFReadRawTile;
+ TIFFReadScanline;
+ TIFFReadTile;
+ TIFFRegisterCODEC;
+ TIFFReverseBits;
+ TIFFRewriteDirectory;
+ TIFFScanlineSize;
+ TIFFScanlineSize64;
+ TIFFSetClientInfo;
+ TIFFSetClientdata;
+ TIFFSetDirectory;
+ TIFFSetErrorHandler;
+ TIFFSetErrorHandlerExt;
+ TIFFSetField;
+ TIFFSetFileName;
+ TIFFSetFileno;
+ TIFFSetMode;
+ TIFFSetSubDirectory;
+ TIFFSetTagExtender;
+ TIFFSetWarningHandler;
+ TIFFSetWarningHandlerExt;
+ TIFFSetWriteOffset;
+ TIFFSetupStrips;
+ TIFFStripSize;
+ TIFFStripSize64;
+ TIFFSwabArrayOfDouble;
+ TIFFSwabArrayOfFloat;
+ TIFFSwabArrayOfLong;
+ TIFFSwabArrayOfLong8;
+ TIFFSwabArrayOfShort;
+ TIFFSwabArrayOfTriples;
+ TIFFSwabDouble;
+ TIFFSwabFloat;
+ TIFFSwabLong;
+ TIFFSwabLong8;
+ TIFFSwabShort;
+ TIFFTileRowSize;
+ TIFFTileRowSize64;
+ TIFFTileSize;
+ TIFFTileSize64;
+ TIFFUnRegisterCODEC;
+ TIFFUnlinkDirectory;
+ TIFFUnsetField;
+ TIFFVGetField;
+ TIFFVGetFieldDefaulted;
+ TIFFVSetField;
+ TIFFVStripSize;
+ TIFFVStripSize64;
+ TIFFVTileSize;
+ TIFFVTileSize64;
+ TIFFWarning;
+ TIFFWarningExt;
+ TIFFWriteBufferSetup;
+ TIFFWriteCheck;
+ TIFFWriteDirectory;
+ TIFFWriteEncodedStrip;
+ TIFFWriteEncodedTile;
+ TIFFWriteRawStrip;
+ TIFFWriteRawTile;
+ TIFFWriteScanline;
+ TIFFWriteTile;
+ TIFFXYZToRGB;
+ TIFFYCbCrToRGBInit;
+ TIFFYCbCrtoRGB;
+ _TIFFfree;
+ _TIFFmalloc;
+ _TIFFmemcmp;
+ _TIFFmemcpy;
+ _TIFFmemset;
+ _TIFFrealloc;
+
+ local:
*;
};
+
+LIBTIFF_4.1 {
+ _TIFFCheckMalloc;
+ _TIFFCheckRealloc;
+ _TIFFMultiply32;
+ _TIFFMultiply64;
+ _TIFFRewriteField;
+ TIFFCreateCustomDirectory;
+ TIFFCreateEXIFDirectory;
+ TIFFDeferStrileArrayWriting;
+ TIFFFieldDataType;
+ TIFFFieldName;
+ TIFFFieldPassCount;
+ TIFFFieldReadCount;
+ TIFFFieldTag;
+ TIFFFieldWriteCount;
+ TIFFForceStrileArrayWriting;
+ TIFFGetStrileByteCount;
+ TIFFGetStrileByteCountWithErr;
+ TIFFGetStrileOffset;
+ TIFFGetStrileOffsetWithErr;
+ TIFFReadFromUserBuffer;
+ TIFFReadRGBAStripExt;
+ TIFFReadRGBATileExt;
+ TIFFSetCompressionScheme;
+ TIFFWriteCustomDirectory;
+} LIBTIFF_4.0;
+
+LIBTIFF_4.2 {
+ TIFFCreateGPSDirectory;
+ TIFFReadGPSDirectory;
+ _TIFFGetExifFields;
+ _TIFFGetGpsFields;
+} LIBTIFF_4.1;
+
+LIBTIFF_4.3 {
+} LIBTIFF_4.2;
+
+LIBTIFF_4.4 {
+ TIFFFieldIsAnonymous;
+ TIFFFieldSetGetSize;
+ TIFFFieldSetGetCountSize;
+ TIFFIsBigTIFF;
+} LIBTIFF_4.3;
+
+LIBTIFF_4.5 {
+ _TIFFClampDoubleToUInt32;
+ TIFFClientOpenExt;
+ TIFFFdOpenExt;
+ TIFFOpenExt;
+ TIFFOpenWExt;
+ TIFFErrorExtR;
+ TIFFWarningExtR;
+ TIFFOpenOptionsAlloc;
+ TIFFOpenOptionsFree;
+ TIFFOpenOptionsSetMaxSingleMemAlloc;
+ TIFFOpenOptionsSetErrorHandlerExtR;
+ TIFFOpenOptionsSetWarningHandlerExtR;
+} LIBTIFF_4.4;
diff --git a/src/3rdparty/libtiff/libtiff/mkg3states.c b/src/3rdparty/libtiff/libtiff/mkg3states.c
index 2cb9174..f32113a 100644
--- a/src/3rdparty/libtiff/libtiff/mkg3states.c
+++ b/src/3rdparty/libtiff/libtiff/mkg3states.c
@@ -2,23 +2,23 @@
* Copyright (c) 1991-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -27,6 +27,7 @@
* in Frank Cringle's viewfax program;
* Copyright (C) 1990, 1995 Frank D. Cringle.
*/
+#include "libport.h"
#include "tif_config.h"
#include <stdio.h>
@@ -34,386 +35,206 @@
#include <string.h>
#ifdef HAVE_UNISTD_H
-# include <unistd.h>
+#include <unistd.h>
#endif
#include "tif_fax3.h"
-#ifndef HAVE_GETOPT
-extern int getopt(int argc, char * const argv[], const char *optstring);
-#endif
-
-#define streq(a,b) (strcmp(a,b) == 0)
+#define streq(a, b) (strcmp(a, b) == 0)
/* NB: can't use names in tif_fax3.h 'cuz they are declared const */
TIFFFaxTabEnt MainTable[128];
TIFFFaxTabEnt WhiteTable[4096];
TIFFFaxTabEnt BlackTable[8192];
-struct proto {
- uint16 code; /* right justified, lsb-first, zero filled */
- uint16 val; /* (pixel count)<<4 + code width */
+struct proto
+{
+ uint16_t code; /* right justified, lsb-first, zero filled */
+ uint16_t val; /* (pixel count)<<4 + code width */
};
-static struct proto Pass[] = {
-{ 0x0008, 4 },
-{ 0, 0 }
-};
+static struct proto Pass[] = {{0x0008, 4}, {0, 0}};
-static struct proto Horiz[] = {
-{ 0x0004, 3 },
-{ 0, 0 }
-};
+static struct proto Horiz[] = {{0x0004, 3}, {0, 0}};
-static struct proto V0[] = {
-{ 0x0001, 1 },
-{ 0, 0 }
-};
+static struct proto V0[] = {{0x0001, 1}, {0, 0}};
-static struct proto VR[] = {
-{ 0x0006, (1<<4)+3 },
-{ 0x0030, (2<<4)+6 },
-{ 0x0060, (3<<4)+7 },
-{ 0, 0 }
-};
+static struct proto VR[] = {{0x0006, (1 << 4) + 3},
+ {0x0030, (2 << 4) + 6},
+ {0x0060, (3 << 4) + 7},
+ {0, 0}};
-static struct proto VL[] = {
-{ 0x0002, (1<<4)+3 },
-{ 0x0010, (2<<4)+6 },
-{ 0x0020, (3<<4)+7 },
-{ 0, 0 }
-};
+static struct proto VL[] = {{0x0002, (1 << 4) + 3},
+ {0x0010, (2 << 4) + 6},
+ {0x0020, (3 << 4) + 7},
+ {0, 0}};
-static struct proto Ext[] = {
-{ 0x0040, 7 },
-{ 0, 0 }
-};
+static struct proto Ext[] = {{0x0040, 7}, {0, 0}};
-static struct proto EOLV[] = {
-{ 0x0000, 7 },
-{ 0, 0 }
-};
+static struct proto EOLV[] = {{0x0000, 7}, {0, 0}};
static struct proto MakeUpW[] = {
-{ 0x001b, 1029 },
-{ 0x0009, 2053 },
-{ 0x003a, 3078 },
-{ 0x0076, 4103 },
-{ 0x006c, 5128 },
-{ 0x00ec, 6152 },
-{ 0x0026, 7176 },
-{ 0x00a6, 8200 },
-{ 0x0016, 9224 },
-{ 0x00e6, 10248 },
-{ 0x0066, 11273 },
-{ 0x0166, 12297 },
-{ 0x0096, 13321 },
-{ 0x0196, 14345 },
-{ 0x0056, 15369 },
-{ 0x0156, 16393 },
-{ 0x00d6, 17417 },
-{ 0x01d6, 18441 },
-{ 0x0036, 19465 },
-{ 0x0136, 20489 },
-{ 0x00b6, 21513 },
-{ 0x01b6, 22537 },
-{ 0x0032, 23561 },
-{ 0x0132, 24585 },
-{ 0x00b2, 25609 },
-{ 0x0006, 26630 },
-{ 0x01b2, 27657 },
-{ 0, 0 }
-};
+ {0x001b, 1029}, {0x0009, 2053}, {0x003a, 3078}, {0x0076, 4103},
+ {0x006c, 5128}, {0x00ec, 6152}, {0x0026, 7176}, {0x00a6, 8200},
+ {0x0016, 9224}, {0x00e6, 10248}, {0x0066, 11273}, {0x0166, 12297},
+ {0x0096, 13321}, {0x0196, 14345}, {0x0056, 15369}, {0x0156, 16393},
+ {0x00d6, 17417}, {0x01d6, 18441}, {0x0036, 19465}, {0x0136, 20489},
+ {0x00b6, 21513}, {0x01b6, 22537}, {0x0032, 23561}, {0x0132, 24585},
+ {0x00b2, 25609}, {0x0006, 26630}, {0x01b2, 27657}, {0, 0}};
static struct proto MakeUpB[] = {
-{ 0x03c0, 1034 },
-{ 0x0130, 2060 },
-{ 0x0930, 3084 },
-{ 0x0da0, 4108 },
-{ 0x0cc0, 5132 },
-{ 0x02c0, 6156 },
-{ 0x0ac0, 7180 },
-{ 0x06c0, 8205 },
-{ 0x16c0, 9229 },
-{ 0x0a40, 10253 },
-{ 0x1a40, 11277 },
-{ 0x0640, 12301 },
-{ 0x1640, 13325 },
-{ 0x09c0, 14349 },
-{ 0x19c0, 15373 },
-{ 0x05c0, 16397 },
-{ 0x15c0, 17421 },
-{ 0x0dc0, 18445 },
-{ 0x1dc0, 19469 },
-{ 0x0940, 20493 },
-{ 0x1940, 21517 },
-{ 0x0540, 22541 },
-{ 0x1540, 23565 },
-{ 0x0b40, 24589 },
-{ 0x1b40, 25613 },
-{ 0x04c0, 26637 },
-{ 0x14c0, 27661 },
-{ 0, 0 }
-};
+ {0x03c0, 1034}, {0x0130, 2060}, {0x0930, 3084}, {0x0da0, 4108},
+ {0x0cc0, 5132}, {0x02c0, 6156}, {0x0ac0, 7180}, {0x06c0, 8205},
+ {0x16c0, 9229}, {0x0a40, 10253}, {0x1a40, 11277}, {0x0640, 12301},
+ {0x1640, 13325}, {0x09c0, 14349}, {0x19c0, 15373}, {0x05c0, 16397},
+ {0x15c0, 17421}, {0x0dc0, 18445}, {0x1dc0, 19469}, {0x0940, 20493},
+ {0x1940, 21517}, {0x0540, 22541}, {0x1540, 23565}, {0x0b40, 24589},
+ {0x1b40, 25613}, {0x04c0, 26637}, {0x14c0, 27661}, {0, 0}};
static struct proto MakeUp[] = {
-{ 0x0080, 28683 },
-{ 0x0180, 29707 },
-{ 0x0580, 30731 },
-{ 0x0480, 31756 },
-{ 0x0c80, 32780 },
-{ 0x0280, 33804 },
-{ 0x0a80, 34828 },
-{ 0x0680, 35852 },
-{ 0x0e80, 36876 },
-{ 0x0380, 37900 },
-{ 0x0b80, 38924 },
-{ 0x0780, 39948 },
-{ 0x0f80, 40972 },
-{ 0, 0 }
-};
+ {0x0080, 28683}, {0x0180, 29707}, {0x0580, 30731}, {0x0480, 31756},
+ {0x0c80, 32780}, {0x0280, 33804}, {0x0a80, 34828}, {0x0680, 35852},
+ {0x0e80, 36876}, {0x0380, 37900}, {0x0b80, 38924}, {0x0780, 39948},
+ {0x0f80, 40972}, {0, 0}};
static struct proto TermW[] = {
-{ 0x00ac, 8 },
-{ 0x0038, 22 },
-{ 0x000e, 36 },
-{ 0x0001, 52 },
-{ 0x000d, 68 },
-{ 0x0003, 84 },
-{ 0x0007, 100 },
-{ 0x000f, 116 },
-{ 0x0019, 133 },
-{ 0x0005, 149 },
-{ 0x001c, 165 },
-{ 0x0002, 181 },
-{ 0x0004, 198 },
-{ 0x0030, 214 },
-{ 0x000b, 230 },
-{ 0x002b, 246 },
-{ 0x0015, 262 },
-{ 0x0035, 278 },
-{ 0x0072, 295 },
-{ 0x0018, 311 },
-{ 0x0008, 327 },
-{ 0x0074, 343 },
-{ 0x0060, 359 },
-{ 0x0010, 375 },
-{ 0x000a, 391 },
-{ 0x006a, 407 },
-{ 0x0064, 423 },
-{ 0x0012, 439 },
-{ 0x000c, 455 },
-{ 0x0040, 472 },
-{ 0x00c0, 488 },
-{ 0x0058, 504 },
-{ 0x00d8, 520 },
-{ 0x0048, 536 },
-{ 0x00c8, 552 },
-{ 0x0028, 568 },
-{ 0x00a8, 584 },
-{ 0x0068, 600 },
-{ 0x00e8, 616 },
-{ 0x0014, 632 },
-{ 0x0094, 648 },
-{ 0x0054, 664 },
-{ 0x00d4, 680 },
-{ 0x0034, 696 },
-{ 0x00b4, 712 },
-{ 0x0020, 728 },
-{ 0x00a0, 744 },
-{ 0x0050, 760 },
-{ 0x00d0, 776 },
-{ 0x004a, 792 },
-{ 0x00ca, 808 },
-{ 0x002a, 824 },
-{ 0x00aa, 840 },
-{ 0x0024, 856 },
-{ 0x00a4, 872 },
-{ 0x001a, 888 },
-{ 0x009a, 904 },
-{ 0x005a, 920 },
-{ 0x00da, 936 },
-{ 0x0052, 952 },
-{ 0x00d2, 968 },
-{ 0x004c, 984 },
-{ 0x00cc, 1000 },
-{ 0x002c, 1016 },
-{ 0, 0 }
-};
+ {0x00ac, 8}, {0x0038, 22}, {0x000e, 36}, {0x0001, 52}, {0x000d, 68},
+ {0x0003, 84}, {0x0007, 100}, {0x000f, 116}, {0x0019, 133}, {0x0005, 149},
+ {0x001c, 165}, {0x0002, 181}, {0x0004, 198}, {0x0030, 214}, {0x000b, 230},
+ {0x002b, 246}, {0x0015, 262}, {0x0035, 278}, {0x0072, 295}, {0x0018, 311},
+ {0x0008, 327}, {0x0074, 343}, {0x0060, 359}, {0x0010, 375}, {0x000a, 391},
+ {0x006a, 407}, {0x0064, 423}, {0x0012, 439}, {0x000c, 455}, {0x0040, 472},
+ {0x00c0, 488}, {0x0058, 504}, {0x00d8, 520}, {0x0048, 536}, {0x00c8, 552},
+ {0x0028, 568}, {0x00a8, 584}, {0x0068, 600}, {0x00e8, 616}, {0x0014, 632},
+ {0x0094, 648}, {0x0054, 664}, {0x00d4, 680}, {0x0034, 696}, {0x00b4, 712},
+ {0x0020, 728}, {0x00a0, 744}, {0x0050, 760}, {0x00d0, 776}, {0x004a, 792},
+ {0x00ca, 808}, {0x002a, 824}, {0x00aa, 840}, {0x0024, 856}, {0x00a4, 872},
+ {0x001a, 888}, {0x009a, 904}, {0x005a, 920}, {0x00da, 936}, {0x0052, 952},
+ {0x00d2, 968}, {0x004c, 984}, {0x00cc, 1000}, {0x002c, 1016}, {0, 0}};
static struct proto TermB[] = {
-{ 0x03b0, 10 },
-{ 0x0002, 19 },
-{ 0x0003, 34 },
-{ 0x0001, 50 },
-{ 0x0006, 67 },
-{ 0x000c, 84 },
-{ 0x0004, 100 },
-{ 0x0018, 117 },
-{ 0x0028, 134 },
-{ 0x0008, 150 },
-{ 0x0010, 167 },
-{ 0x0050, 183 },
-{ 0x0070, 199 },
-{ 0x0020, 216 },
-{ 0x00e0, 232 },
-{ 0x0030, 249 },
-{ 0x03a0, 266 },
-{ 0x0060, 282 },
-{ 0x0040, 298 },
-{ 0x0730, 315 },
-{ 0x00b0, 331 },
-{ 0x01b0, 347 },
-{ 0x0760, 363 },
-{ 0x00a0, 379 },
-{ 0x0740, 395 },
-{ 0x00c0, 411 },
-{ 0x0530, 428 },
-{ 0x0d30, 444 },
-{ 0x0330, 460 },
-{ 0x0b30, 476 },
-{ 0x0160, 492 },
-{ 0x0960, 508 },
-{ 0x0560, 524 },
-{ 0x0d60, 540 },
-{ 0x04b0, 556 },
-{ 0x0cb0, 572 },
-{ 0x02b0, 588 },
-{ 0x0ab0, 604 },
-{ 0x06b0, 620 },
-{ 0x0eb0, 636 },
-{ 0x0360, 652 },
-{ 0x0b60, 668 },
-{ 0x05b0, 684 },
-{ 0x0db0, 700 },
-{ 0x02a0, 716 },
-{ 0x0aa0, 732 },
-{ 0x06a0, 748 },
-{ 0x0ea0, 764 },
-{ 0x0260, 780 },
-{ 0x0a60, 796 },
-{ 0x04a0, 812 },
-{ 0x0ca0, 828 },
-{ 0x0240, 844 },
-{ 0x0ec0, 860 },
-{ 0x01c0, 876 },
-{ 0x0e40, 892 },
-{ 0x0140, 908 },
-{ 0x01a0, 924 },
-{ 0x09a0, 940 },
-{ 0x0d40, 956 },
-{ 0x0340, 972 },
-{ 0x05a0, 988 },
-{ 0x0660, 1004 },
-{ 0x0e60, 1020 },
-{ 0, 0 }
-};
+ {0x03b0, 10}, {0x0002, 19}, {0x0003, 34}, {0x0001, 50}, {0x0006, 67},
+ {0x000c, 84}, {0x0004, 100}, {0x0018, 117}, {0x0028, 134}, {0x0008, 150},
+ {0x0010, 167}, {0x0050, 183}, {0x0070, 199}, {0x0020, 216}, {0x00e0, 232},
+ {0x0030, 249}, {0x03a0, 266}, {0x0060, 282}, {0x0040, 298}, {0x0730, 315},
+ {0x00b0, 331}, {0x01b0, 347}, {0x0760, 363}, {0x00a0, 379}, {0x0740, 395},
+ {0x00c0, 411}, {0x0530, 428}, {0x0d30, 444}, {0x0330, 460}, {0x0b30, 476},
+ {0x0160, 492}, {0x0960, 508}, {0x0560, 524}, {0x0d60, 540}, {0x04b0, 556},
+ {0x0cb0, 572}, {0x02b0, 588}, {0x0ab0, 604}, {0x06b0, 620}, {0x0eb0, 636},
+ {0x0360, 652}, {0x0b60, 668}, {0x05b0, 684}, {0x0db0, 700}, {0x02a0, 716},
+ {0x0aa0, 732}, {0x06a0, 748}, {0x0ea0, 764}, {0x0260, 780}, {0x0a60, 796},
+ {0x04a0, 812}, {0x0ca0, 828}, {0x0240, 844}, {0x0ec0, 860}, {0x01c0, 876},
+ {0x0e40, 892}, {0x0140, 908}, {0x01a0, 924}, {0x09a0, 940}, {0x0d40, 956},
+ {0x0340, 972}, {0x05a0, 988}, {0x0660, 1004}, {0x0e60, 1020}, {0, 0}};
-static struct proto EOLH[] = {
-{ 0x0000, 11 },
-{ 0, 0 }
-};
+static struct proto EOLH[] = {{0x0000, 11}, {0, 0}};
-static void
-FillTable(TIFFFaxTabEnt *T, int Size, struct proto *P, int State)
+static void FillTable(TIFFFaxTabEnt *T, int Size, struct proto *P, int State)
{
int limit = 1 << Size;
- while (P->val) {
- int width = P->val & 15;
- int param = P->val >> 4;
- int incr = 1 << width;
- int code;
- for (code = P->code; code < limit; code += incr) {
- TIFFFaxTabEnt *E = T+code;
- E->State = State;
- E->Width = width;
- E->Param = param;
- }
- P++;
+ while (P->val)
+ {
+ int width = P->val & 15;
+ int param = P->val >> 4;
+ int incr = 1 << width;
+ int code;
+ for (code = P->code; code < limit; code += incr)
+ {
+ TIFFFaxTabEnt *E = T + code;
+ E->State = State;
+ E->Width = width;
+ E->Param = param;
+ }
+ P++;
}
}
-static char* storage_class = "";
-static char* const_class = "";
-static int packoutput = 1;
-static char* prebrace = "";
-static char* postbrace = "";
+static char *storage_class = "";
+static char *const_class = "";
+static int packoutput = 1;
+static char *prebrace = "";
+static char *postbrace = "";
-void
-WriteTable(FILE* fd, const TIFFFaxTabEnt* T, int Size, const char* name)
+void WriteTable(FILE *fd, const TIFFFaxTabEnt *T, int Size, const char *name)
{
int i;
- char* sep;
+ char *sep;
- fprintf(fd, "%s %s TIFFFaxTabEnt %s[%d] = {",
- storage_class, const_class, name, Size);
- if (packoutput) {
- sep = "\n";
- for (i = 0; i < Size; i++) {
- fprintf(fd, "%s%s%d,%d,%d%s",
- sep, prebrace, T->State, T->Width, (int) T->Param, postbrace);
- if (((i+1) % 10) == 0)
- sep = ",\n";
- else
- sep = ",";
- T++;
- }
- } else {
- sep = "\n ";
- for (i = 0; i < Size; i++) {
- fprintf(fd, "%s%s%3d,%3d,%4d%s",
- sep, prebrace, T->State, T->Width, (int) T->Param, postbrace);
- if (((i+1) % 6) == 0)
- sep = ",\n ";
- else
- sep = ",";
- T++;
- }
+ fprintf(fd, "%s %s TIFFFaxTabEnt %s[%d] = {", storage_class, const_class,
+ name, Size);
+ if (packoutput)
+ {
+ sep = "\n";
+ for (i = 0; i < Size; i++)
+ {
+ fprintf(fd, "%s%s%d,%d,%d%s", sep, prebrace, T->State, T->Width,
+ (int)T->Param, postbrace);
+ if (((i + 1) % 10) == 0)
+ sep = ",\n";
+ else
+ sep = ",";
+ T++;
+ }
+ }
+ else
+ {
+ sep = "\n ";
+ for (i = 0; i < Size; i++)
+ {
+ fprintf(fd, "%s%s%3d,%3d,%4d%s", sep, prebrace, T->State, T->Width,
+ (int)T->Param, postbrace);
+ if (((i + 1) % 6) == 0)
+ sep = ",\n ";
+ else
+ sep = ",";
+ T++;
+ }
}
fprintf(fd, "\n};\n");
}
/* initialise the huffman code tables */
-int
-main(int argc, char* argv[])
+int main(int argc, char *argv[])
{
- FILE* fd;
- char* outputfile;
+ FILE *fd;
+ char *outputfile;
int c;
#if !HAVE_DECL_OPTARG
extern int optind;
- extern char* optarg;
+ extern char *optarg;
#endif
while ((c = getopt(argc, argv, "c:s:bp")) != -1)
- switch (c) {
- case 'c':
- const_class = optarg;
- break;
- case 's':
- storage_class = optarg;
- break;
- case 'p':
- packoutput = 0;
- break;
- case 'b':
- prebrace = "{";
- postbrace = "}";
- break;
- case '?':
- fprintf(stderr,
- "usage: %s [-c const] [-s storage] [-p] [-b] file\n",
- argv[0]);
- return (-1);
- }
+ switch (c)
+ {
+ case 'c':
+ const_class = optarg;
+ break;
+ case 's':
+ storage_class = optarg;
+ break;
+ case 'p':
+ packoutput = 0;
+ break;
+ case 'b':
+ prebrace = "{";
+ postbrace = "}";
+ break;
+ case '?':
+ fprintf(stderr,
+ "usage: %s [-c const] [-s storage] [-p] [-b] file\n",
+ argv[0]);
+ return (-1);
+ }
outputfile = optind < argc ? argv[optind] : "g3states.h";
fd = fopen(outputfile, "w");
- if (fd == NULL) {
- fprintf(stderr, "%s: %s: Cannot create output file.\n",
- argv[0], outputfile);
- return (-2);
+ if (fd == NULL)
+ {
+ fprintf(stderr, "%s: %s: Cannot create output file.\n", argv[0],
+ outputfile);
+ return (-2);
}
FillTable(MainTable, 7, Pass, S_Pass);
FillTable(MainTable, 7, Horiz, S_Horiz);
@@ -433,20 +254,19 @@ main(int argc, char* argv[])
fprintf(fd, "/* WARNING, this file was automatically generated by the\n");
fprintf(fd, " mkg3states program */\n");
+ fprintf(fd, "#include <stdint.h>\n");
fprintf(fd, "#include \"tiff.h\"\n");
fprintf(fd, "#include \"tif_fax3.h\"\n");
WriteTable(fd, MainTable, 128, "TIFFFaxMainTable");
WriteTable(fd, WhiteTable, 4096, "TIFFFaxWhiteTable");
WriteTable(fd, BlackTable, 8192, "TIFFFaxBlackTable");
+ fprintf(fd, "/*\n"
+ " * Local Variables:\n"
+ " * mode: c\n"
+ " * c-basic-offset: 8\n"
+ " * fill-column: 78\n"
+ " * End:\n"
+ " */\n");
fclose(fd);
return (0);
}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/t4.h b/src/3rdparty/libtiff/libtiff/t4.h
index fb0951a..f933d4a 100644
--- a/src/3rdparty/libtiff/libtiff/t4.h
+++ b/src/3rdparty/libtiff/libtiff/t4.h
@@ -23,26 +23,27 @@
*/
#ifndef _T4_
-#define _T4_
+#define _T4_
/*
* CCITT T.4 1D Huffman runlength codes and
* related definitions. Given the small sizes
* of these tables it does not seem
* worthwhile to make code & length 8 bits.
*/
-typedef struct tableentry {
- unsigned short length; /* bit length of g3 code */
- unsigned short code; /* g3 code */
- short runlen; /* run length in bits */
+typedef struct tableentry
+{
+ unsigned short length; /* bit length of g3 code */
+ unsigned short code; /* g3 code */
+ short runlen; /* run length in bits */
} tableentry;
-#define EOL 0x001 /* EOL code value - 0000 0000 0000 1 */
+#define EOL 0x001 /* EOL code value - 0000 0000 0000 1 */
/* status values returned instead of a run length */
-#define G3CODE_EOL -1 /* NB: ACT_EOL - ACT_WRUNT */
-#define G3CODE_INVALID -2 /* NB: ACT_INVALID - ACT_WRUNT */
-#define G3CODE_EOF -3 /* end of input data */
-#define G3CODE_INCOMP -4 /* incomplete run code */
+#define G3CODE_EOL -1 /* NB: ACT_EOL - ACT_WRUNT */
+#define G3CODE_INVALID -2 /* NB: ACT_INVALID - ACT_WRUNT */
+#define G3CODE_EOF -3 /* end of input data */
+#define G3CODE_INCOMP -4 /* incomplete run code */
/*
* Note that these tables are ordered such that the
@@ -54,237 +55,230 @@ typedef struct tableentry {
*/
#ifdef G3CODES
const tableentry TIFFFaxWhiteCodes[] = {
- { 8, 0x35, 0 }, /* 0011 0101 */
- { 6, 0x7, 1 }, /* 0001 11 */
- { 4, 0x7, 2 }, /* 0111 */
- { 4, 0x8, 3 }, /* 1000 */
- { 4, 0xB, 4 }, /* 1011 */
- { 4, 0xC, 5 }, /* 1100 */
- { 4, 0xE, 6 }, /* 1110 */
- { 4, 0xF, 7 }, /* 1111 */
- { 5, 0x13, 8 }, /* 1001 1 */
- { 5, 0x14, 9 }, /* 1010 0 */
- { 5, 0x7, 10 }, /* 0011 1 */
- { 5, 0x8, 11 }, /* 0100 0 */
- { 6, 0x8, 12 }, /* 0010 00 */
- { 6, 0x3, 13 }, /* 0000 11 */
- { 6, 0x34, 14 }, /* 1101 00 */
- { 6, 0x35, 15 }, /* 1101 01 */
- { 6, 0x2A, 16 }, /* 1010 10 */
- { 6, 0x2B, 17 }, /* 1010 11 */
- { 7, 0x27, 18 }, /* 0100 111 */
- { 7, 0xC, 19 }, /* 0001 100 */
- { 7, 0x8, 20 }, /* 0001 000 */
- { 7, 0x17, 21 }, /* 0010 111 */
- { 7, 0x3, 22 }, /* 0000 011 */
- { 7, 0x4, 23 }, /* 0000 100 */
- { 7, 0x28, 24 }, /* 0101 000 */
- { 7, 0x2B, 25 }, /* 0101 011 */
- { 7, 0x13, 26 }, /* 0010 011 */
- { 7, 0x24, 27 }, /* 0100 100 */
- { 7, 0x18, 28 }, /* 0011 000 */
- { 8, 0x2, 29 }, /* 0000 0010 */
- { 8, 0x3, 30 }, /* 0000 0011 */
- { 8, 0x1A, 31 }, /* 0001 1010 */
- { 8, 0x1B, 32 }, /* 0001 1011 */
- { 8, 0x12, 33 }, /* 0001 0010 */
- { 8, 0x13, 34 }, /* 0001 0011 */
- { 8, 0x14, 35 }, /* 0001 0100 */
- { 8, 0x15, 36 }, /* 0001 0101 */
- { 8, 0x16, 37 }, /* 0001 0110 */
- { 8, 0x17, 38 }, /* 0001 0111 */
- { 8, 0x28, 39 }, /* 0010 1000 */
- { 8, 0x29, 40 }, /* 0010 1001 */
- { 8, 0x2A, 41 }, /* 0010 1010 */
- { 8, 0x2B, 42 }, /* 0010 1011 */
- { 8, 0x2C, 43 }, /* 0010 1100 */
- { 8, 0x2D, 44 }, /* 0010 1101 */
- { 8, 0x4, 45 }, /* 0000 0100 */
- { 8, 0x5, 46 }, /* 0000 0101 */
- { 8, 0xA, 47 }, /* 0000 1010 */
- { 8, 0xB, 48 }, /* 0000 1011 */
- { 8, 0x52, 49 }, /* 0101 0010 */
- { 8, 0x53, 50 }, /* 0101 0011 */
- { 8, 0x54, 51 }, /* 0101 0100 */
- { 8, 0x55, 52 }, /* 0101 0101 */
- { 8, 0x24, 53 }, /* 0010 0100 */
- { 8, 0x25, 54 }, /* 0010 0101 */
- { 8, 0x58, 55 }, /* 0101 1000 */
- { 8, 0x59, 56 }, /* 0101 1001 */
- { 8, 0x5A, 57 }, /* 0101 1010 */
- { 8, 0x5B, 58 }, /* 0101 1011 */
- { 8, 0x4A, 59 }, /* 0100 1010 */
- { 8, 0x4B, 60 }, /* 0100 1011 */
- { 8, 0x32, 61 }, /* 0011 0010 */
- { 8, 0x33, 62 }, /* 0011 0011 */
- { 8, 0x34, 63 }, /* 0011 0100 */
- { 5, 0x1B, 64 }, /* 1101 1 */
- { 5, 0x12, 128 }, /* 1001 0 */
- { 6, 0x17, 192 }, /* 0101 11 */
- { 7, 0x37, 256 }, /* 0110 111 */
- { 8, 0x36, 320 }, /* 0011 0110 */
- { 8, 0x37, 384 }, /* 0011 0111 */
- { 8, 0x64, 448 }, /* 0110 0100 */
- { 8, 0x65, 512 }, /* 0110 0101 */
- { 8, 0x68, 576 }, /* 0110 1000 */
- { 8, 0x67, 640 }, /* 0110 0111 */
- { 9, 0xCC, 704 }, /* 0110 0110 0 */
- { 9, 0xCD, 768 }, /* 0110 0110 1 */
- { 9, 0xD2, 832 }, /* 0110 1001 0 */
- { 9, 0xD3, 896 }, /* 0110 1001 1 */
- { 9, 0xD4, 960 }, /* 0110 1010 0 */
- { 9, 0xD5, 1024 }, /* 0110 1010 1 */
- { 9, 0xD6, 1088 }, /* 0110 1011 0 */
- { 9, 0xD7, 1152 }, /* 0110 1011 1 */
- { 9, 0xD8, 1216 }, /* 0110 1100 0 */
- { 9, 0xD9, 1280 }, /* 0110 1100 1 */
- { 9, 0xDA, 1344 }, /* 0110 1101 0 */
- { 9, 0xDB, 1408 }, /* 0110 1101 1 */
- { 9, 0x98, 1472 }, /* 0100 1100 0 */
- { 9, 0x99, 1536 }, /* 0100 1100 1 */
- { 9, 0x9A, 1600 }, /* 0100 1101 0 */
- { 6, 0x18, 1664 }, /* 0110 00 */
- { 9, 0x9B, 1728 }, /* 0100 1101 1 */
- { 11, 0x8, 1792 }, /* 0000 0001 000 */
- { 11, 0xC, 1856 }, /* 0000 0001 100 */
- { 11, 0xD, 1920 }, /* 0000 0001 101 */
- { 12, 0x12, 1984 }, /* 0000 0001 0010 */
- { 12, 0x13, 2048 }, /* 0000 0001 0011 */
- { 12, 0x14, 2112 }, /* 0000 0001 0100 */
- { 12, 0x15, 2176 }, /* 0000 0001 0101 */
- { 12, 0x16, 2240 }, /* 0000 0001 0110 */
- { 12, 0x17, 2304 }, /* 0000 0001 0111 */
- { 12, 0x1C, 2368 }, /* 0000 0001 1100 */
- { 12, 0x1D, 2432 }, /* 0000 0001 1101 */
- { 12, 0x1E, 2496 }, /* 0000 0001 1110 */
- { 12, 0x1F, 2560 }, /* 0000 0001 1111 */
- { 12, 0x1, G3CODE_EOL }, /* 0000 0000 0001 */
- { 9, 0x1, G3CODE_INVALID }, /* 0000 0000 1 */
- { 10, 0x1, G3CODE_INVALID }, /* 0000 0000 01 */
- { 11, 0x1, G3CODE_INVALID }, /* 0000 0000 001 */
- { 12, 0x0, G3CODE_INVALID }, /* 0000 0000 0000 */
+ {8, 0x35, 0}, /* 0011 0101 */
+ {6, 0x7, 1}, /* 0001 11 */
+ {4, 0x7, 2}, /* 0111 */
+ {4, 0x8, 3}, /* 1000 */
+ {4, 0xB, 4}, /* 1011 */
+ {4, 0xC, 5}, /* 1100 */
+ {4, 0xE, 6}, /* 1110 */
+ {4, 0xF, 7}, /* 1111 */
+ {5, 0x13, 8}, /* 1001 1 */
+ {5, 0x14, 9}, /* 1010 0 */
+ {5, 0x7, 10}, /* 0011 1 */
+ {5, 0x8, 11}, /* 0100 0 */
+ {6, 0x8, 12}, /* 0010 00 */
+ {6, 0x3, 13}, /* 0000 11 */
+ {6, 0x34, 14}, /* 1101 00 */
+ {6, 0x35, 15}, /* 1101 01 */
+ {6, 0x2A, 16}, /* 1010 10 */
+ {6, 0x2B, 17}, /* 1010 11 */
+ {7, 0x27, 18}, /* 0100 111 */
+ {7, 0xC, 19}, /* 0001 100 */
+ {7, 0x8, 20}, /* 0001 000 */
+ {7, 0x17, 21}, /* 0010 111 */
+ {7, 0x3, 22}, /* 0000 011 */
+ {7, 0x4, 23}, /* 0000 100 */
+ {7, 0x28, 24}, /* 0101 000 */
+ {7, 0x2B, 25}, /* 0101 011 */
+ {7, 0x13, 26}, /* 0010 011 */
+ {7, 0x24, 27}, /* 0100 100 */
+ {7, 0x18, 28}, /* 0011 000 */
+ {8, 0x2, 29}, /* 0000 0010 */
+ {8, 0x3, 30}, /* 0000 0011 */
+ {8, 0x1A, 31}, /* 0001 1010 */
+ {8, 0x1B, 32}, /* 0001 1011 */
+ {8, 0x12, 33}, /* 0001 0010 */
+ {8, 0x13, 34}, /* 0001 0011 */
+ {8, 0x14, 35}, /* 0001 0100 */
+ {8, 0x15, 36}, /* 0001 0101 */
+ {8, 0x16, 37}, /* 0001 0110 */
+ {8, 0x17, 38}, /* 0001 0111 */
+ {8, 0x28, 39}, /* 0010 1000 */
+ {8, 0x29, 40}, /* 0010 1001 */
+ {8, 0x2A, 41}, /* 0010 1010 */
+ {8, 0x2B, 42}, /* 0010 1011 */
+ {8, 0x2C, 43}, /* 0010 1100 */
+ {8, 0x2D, 44}, /* 0010 1101 */
+ {8, 0x4, 45}, /* 0000 0100 */
+ {8, 0x5, 46}, /* 0000 0101 */
+ {8, 0xA, 47}, /* 0000 1010 */
+ {8, 0xB, 48}, /* 0000 1011 */
+ {8, 0x52, 49}, /* 0101 0010 */
+ {8, 0x53, 50}, /* 0101 0011 */
+ {8, 0x54, 51}, /* 0101 0100 */
+ {8, 0x55, 52}, /* 0101 0101 */
+ {8, 0x24, 53}, /* 0010 0100 */
+ {8, 0x25, 54}, /* 0010 0101 */
+ {8, 0x58, 55}, /* 0101 1000 */
+ {8, 0x59, 56}, /* 0101 1001 */
+ {8, 0x5A, 57}, /* 0101 1010 */
+ {8, 0x5B, 58}, /* 0101 1011 */
+ {8, 0x4A, 59}, /* 0100 1010 */
+ {8, 0x4B, 60}, /* 0100 1011 */
+ {8, 0x32, 61}, /* 0011 0010 */
+ {8, 0x33, 62}, /* 0011 0011 */
+ {8, 0x34, 63}, /* 0011 0100 */
+ {5, 0x1B, 64}, /* 1101 1 */
+ {5, 0x12, 128}, /* 1001 0 */
+ {6, 0x17, 192}, /* 0101 11 */
+ {7, 0x37, 256}, /* 0110 111 */
+ {8, 0x36, 320}, /* 0011 0110 */
+ {8, 0x37, 384}, /* 0011 0111 */
+ {8, 0x64, 448}, /* 0110 0100 */
+ {8, 0x65, 512}, /* 0110 0101 */
+ {8, 0x68, 576}, /* 0110 1000 */
+ {8, 0x67, 640}, /* 0110 0111 */
+ {9, 0xCC, 704}, /* 0110 0110 0 */
+ {9, 0xCD, 768}, /* 0110 0110 1 */
+ {9, 0xD2, 832}, /* 0110 1001 0 */
+ {9, 0xD3, 896}, /* 0110 1001 1 */
+ {9, 0xD4, 960}, /* 0110 1010 0 */
+ {9, 0xD5, 1024}, /* 0110 1010 1 */
+ {9, 0xD6, 1088}, /* 0110 1011 0 */
+ {9, 0xD7, 1152}, /* 0110 1011 1 */
+ {9, 0xD8, 1216}, /* 0110 1100 0 */
+ {9, 0xD9, 1280}, /* 0110 1100 1 */
+ {9, 0xDA, 1344}, /* 0110 1101 0 */
+ {9, 0xDB, 1408}, /* 0110 1101 1 */
+ {9, 0x98, 1472}, /* 0100 1100 0 */
+ {9, 0x99, 1536}, /* 0100 1100 1 */
+ {9, 0x9A, 1600}, /* 0100 1101 0 */
+ {6, 0x18, 1664}, /* 0110 00 */
+ {9, 0x9B, 1728}, /* 0100 1101 1 */
+ {11, 0x8, 1792}, /* 0000 0001 000 */
+ {11, 0xC, 1856}, /* 0000 0001 100 */
+ {11, 0xD, 1920}, /* 0000 0001 101 */
+ {12, 0x12, 1984}, /* 0000 0001 0010 */
+ {12, 0x13, 2048}, /* 0000 0001 0011 */
+ {12, 0x14, 2112}, /* 0000 0001 0100 */
+ {12, 0x15, 2176}, /* 0000 0001 0101 */
+ {12, 0x16, 2240}, /* 0000 0001 0110 */
+ {12, 0x17, 2304}, /* 0000 0001 0111 */
+ {12, 0x1C, 2368}, /* 0000 0001 1100 */
+ {12, 0x1D, 2432}, /* 0000 0001 1101 */
+ {12, 0x1E, 2496}, /* 0000 0001 1110 */
+ {12, 0x1F, 2560}, /* 0000 0001 1111 */
+ {12, 0x1, G3CODE_EOL}, /* 0000 0000 0001 */
+ {9, 0x1, G3CODE_INVALID}, /* 0000 0000 1 */
+ {10, 0x1, G3CODE_INVALID}, /* 0000 0000 01 */
+ {11, 0x1, G3CODE_INVALID}, /* 0000 0000 001 */
+ {12, 0x0, G3CODE_INVALID}, /* 0000 0000 0000 */
};
const tableentry TIFFFaxBlackCodes[] = {
- { 10, 0x37, 0 }, /* 0000 1101 11 */
- { 3, 0x2, 1 }, /* 010 */
- { 2, 0x3, 2 }, /* 11 */
- { 2, 0x2, 3 }, /* 10 */
- { 3, 0x3, 4 }, /* 011 */
- { 4, 0x3, 5 }, /* 0011 */
- { 4, 0x2, 6 }, /* 0010 */
- { 5, 0x3, 7 }, /* 0001 1 */
- { 6, 0x5, 8 }, /* 0001 01 */
- { 6, 0x4, 9 }, /* 0001 00 */
- { 7, 0x4, 10 }, /* 0000 100 */
- { 7, 0x5, 11 }, /* 0000 101 */
- { 7, 0x7, 12 }, /* 0000 111 */
- { 8, 0x4, 13 }, /* 0000 0100 */
- { 8, 0x7, 14 }, /* 0000 0111 */
- { 9, 0x18, 15 }, /* 0000 1100 0 */
- { 10, 0x17, 16 }, /* 0000 0101 11 */
- { 10, 0x18, 17 }, /* 0000 0110 00 */
- { 10, 0x8, 18 }, /* 0000 0010 00 */
- { 11, 0x67, 19 }, /* 0000 1100 111 */
- { 11, 0x68, 20 }, /* 0000 1101 000 */
- { 11, 0x6C, 21 }, /* 0000 1101 100 */
- { 11, 0x37, 22 }, /* 0000 0110 111 */
- { 11, 0x28, 23 }, /* 0000 0101 000 */
- { 11, 0x17, 24 }, /* 0000 0010 111 */
- { 11, 0x18, 25 }, /* 0000 0011 000 */
- { 12, 0xCA, 26 }, /* 0000 1100 1010 */
- { 12, 0xCB, 27 }, /* 0000 1100 1011 */
- { 12, 0xCC, 28 }, /* 0000 1100 1100 */
- { 12, 0xCD, 29 }, /* 0000 1100 1101 */
- { 12, 0x68, 30 }, /* 0000 0110 1000 */
- { 12, 0x69, 31 }, /* 0000 0110 1001 */
- { 12, 0x6A, 32 }, /* 0000 0110 1010 */
- { 12, 0x6B, 33 }, /* 0000 0110 1011 */
- { 12, 0xD2, 34 }, /* 0000 1101 0010 */
- { 12, 0xD3, 35 }, /* 0000 1101 0011 */
- { 12, 0xD4, 36 }, /* 0000 1101 0100 */
- { 12, 0xD5, 37 }, /* 0000 1101 0101 */
- { 12, 0xD6, 38 }, /* 0000 1101 0110 */
- { 12, 0xD7, 39 }, /* 0000 1101 0111 */
- { 12, 0x6C, 40 }, /* 0000 0110 1100 */
- { 12, 0x6D, 41 }, /* 0000 0110 1101 */
- { 12, 0xDA, 42 }, /* 0000 1101 1010 */
- { 12, 0xDB, 43 }, /* 0000 1101 1011 */
- { 12, 0x54, 44 }, /* 0000 0101 0100 */
- { 12, 0x55, 45 }, /* 0000 0101 0101 */
- { 12, 0x56, 46 }, /* 0000 0101 0110 */
- { 12, 0x57, 47 }, /* 0000 0101 0111 */
- { 12, 0x64, 48 }, /* 0000 0110 0100 */
- { 12, 0x65, 49 }, /* 0000 0110 0101 */
- { 12, 0x52, 50 }, /* 0000 0101 0010 */
- { 12, 0x53, 51 }, /* 0000 0101 0011 */
- { 12, 0x24, 52 }, /* 0000 0010 0100 */
- { 12, 0x37, 53 }, /* 0000 0011 0111 */
- { 12, 0x38, 54 }, /* 0000 0011 1000 */
- { 12, 0x27, 55 }, /* 0000 0010 0111 */
- { 12, 0x28, 56 }, /* 0000 0010 1000 */
- { 12, 0x58, 57 }, /* 0000 0101 1000 */
- { 12, 0x59, 58 }, /* 0000 0101 1001 */
- { 12, 0x2B, 59 }, /* 0000 0010 1011 */
- { 12, 0x2C, 60 }, /* 0000 0010 1100 */
- { 12, 0x5A, 61 }, /* 0000 0101 1010 */
- { 12, 0x66, 62 }, /* 0000 0110 0110 */
- { 12, 0x67, 63 }, /* 0000 0110 0111 */
- { 10, 0xF, 64 }, /* 0000 0011 11 */
- { 12, 0xC8, 128 }, /* 0000 1100 1000 */
- { 12, 0xC9, 192 }, /* 0000 1100 1001 */
- { 12, 0x5B, 256 }, /* 0000 0101 1011 */
- { 12, 0x33, 320 }, /* 0000 0011 0011 */
- { 12, 0x34, 384 }, /* 0000 0011 0100 */
- { 12, 0x35, 448 }, /* 0000 0011 0101 */
- { 13, 0x6C, 512 }, /* 0000 0011 0110 0 */
- { 13, 0x6D, 576 }, /* 0000 0011 0110 1 */
- { 13, 0x4A, 640 }, /* 0000 0010 0101 0 */
- { 13, 0x4B, 704 }, /* 0000 0010 0101 1 */
- { 13, 0x4C, 768 }, /* 0000 0010 0110 0 */
- { 13, 0x4D, 832 }, /* 0000 0010 0110 1 */
- { 13, 0x72, 896 }, /* 0000 0011 1001 0 */
- { 13, 0x73, 960 }, /* 0000 0011 1001 1 */
- { 13, 0x74, 1024 }, /* 0000 0011 1010 0 */
- { 13, 0x75, 1088 }, /* 0000 0011 1010 1 */
- { 13, 0x76, 1152 }, /* 0000 0011 1011 0 */
- { 13, 0x77, 1216 }, /* 0000 0011 1011 1 */
- { 13, 0x52, 1280 }, /* 0000 0010 1001 0 */
- { 13, 0x53, 1344 }, /* 0000 0010 1001 1 */
- { 13, 0x54, 1408 }, /* 0000 0010 1010 0 */
- { 13, 0x55, 1472 }, /* 0000 0010 1010 1 */
- { 13, 0x5A, 1536 }, /* 0000 0010 1101 0 */
- { 13, 0x5B, 1600 }, /* 0000 0010 1101 1 */
- { 13, 0x64, 1664 }, /* 0000 0011 0010 0 */
- { 13, 0x65, 1728 }, /* 0000 0011 0010 1 */
- { 11, 0x8, 1792 }, /* 0000 0001 000 */
- { 11, 0xC, 1856 }, /* 0000 0001 100 */
- { 11, 0xD, 1920 }, /* 0000 0001 101 */
- { 12, 0x12, 1984 }, /* 0000 0001 0010 */
- { 12, 0x13, 2048 }, /* 0000 0001 0011 */
- { 12, 0x14, 2112 }, /* 0000 0001 0100 */
- { 12, 0x15, 2176 }, /* 0000 0001 0101 */
- { 12, 0x16, 2240 }, /* 0000 0001 0110 */
- { 12, 0x17, 2304 }, /* 0000 0001 0111 */
- { 12, 0x1C, 2368 }, /* 0000 0001 1100 */
- { 12, 0x1D, 2432 }, /* 0000 0001 1101 */
- { 12, 0x1E, 2496 }, /* 0000 0001 1110 */
- { 12, 0x1F, 2560 }, /* 0000 0001 1111 */
- { 12, 0x1, G3CODE_EOL }, /* 0000 0000 0001 */
- { 9, 0x1, G3CODE_INVALID }, /* 0000 0000 1 */
- { 10, 0x1, G3CODE_INVALID }, /* 0000 0000 01 */
- { 11, 0x1, G3CODE_INVALID }, /* 0000 0000 001 */
- { 12, 0x0, G3CODE_INVALID }, /* 0000 0000 0000 */
+ {10, 0x37, 0}, /* 0000 1101 11 */
+ {3, 0x2, 1}, /* 010 */
+ {2, 0x3, 2}, /* 11 */
+ {2, 0x2, 3}, /* 10 */
+ {3, 0x3, 4}, /* 011 */
+ {4, 0x3, 5}, /* 0011 */
+ {4, 0x2, 6}, /* 0010 */
+ {5, 0x3, 7}, /* 0001 1 */
+ {6, 0x5, 8}, /* 0001 01 */
+ {6, 0x4, 9}, /* 0001 00 */
+ {7, 0x4, 10}, /* 0000 100 */
+ {7, 0x5, 11}, /* 0000 101 */
+ {7, 0x7, 12}, /* 0000 111 */
+ {8, 0x4, 13}, /* 0000 0100 */
+ {8, 0x7, 14}, /* 0000 0111 */
+ {9, 0x18, 15}, /* 0000 1100 0 */
+ {10, 0x17, 16}, /* 0000 0101 11 */
+ {10, 0x18, 17}, /* 0000 0110 00 */
+ {10, 0x8, 18}, /* 0000 0010 00 */
+ {11, 0x67, 19}, /* 0000 1100 111 */
+ {11, 0x68, 20}, /* 0000 1101 000 */
+ {11, 0x6C, 21}, /* 0000 1101 100 */
+ {11, 0x37, 22}, /* 0000 0110 111 */
+ {11, 0x28, 23}, /* 0000 0101 000 */
+ {11, 0x17, 24}, /* 0000 0010 111 */
+ {11, 0x18, 25}, /* 0000 0011 000 */
+ {12, 0xCA, 26}, /* 0000 1100 1010 */
+ {12, 0xCB, 27}, /* 0000 1100 1011 */
+ {12, 0xCC, 28}, /* 0000 1100 1100 */
+ {12, 0xCD, 29}, /* 0000 1100 1101 */
+ {12, 0x68, 30}, /* 0000 0110 1000 */
+ {12, 0x69, 31}, /* 0000 0110 1001 */
+ {12, 0x6A, 32}, /* 0000 0110 1010 */
+ {12, 0x6B, 33}, /* 0000 0110 1011 */
+ {12, 0xD2, 34}, /* 0000 1101 0010 */
+ {12, 0xD3, 35}, /* 0000 1101 0011 */
+ {12, 0xD4, 36}, /* 0000 1101 0100 */
+ {12, 0xD5, 37}, /* 0000 1101 0101 */
+ {12, 0xD6, 38}, /* 0000 1101 0110 */
+ {12, 0xD7, 39}, /* 0000 1101 0111 */
+ {12, 0x6C, 40}, /* 0000 0110 1100 */
+ {12, 0x6D, 41}, /* 0000 0110 1101 */
+ {12, 0xDA, 42}, /* 0000 1101 1010 */
+ {12, 0xDB, 43}, /* 0000 1101 1011 */
+ {12, 0x54, 44}, /* 0000 0101 0100 */
+ {12, 0x55, 45}, /* 0000 0101 0101 */
+ {12, 0x56, 46}, /* 0000 0101 0110 */
+ {12, 0x57, 47}, /* 0000 0101 0111 */
+ {12, 0x64, 48}, /* 0000 0110 0100 */
+ {12, 0x65, 49}, /* 0000 0110 0101 */
+ {12, 0x52, 50}, /* 0000 0101 0010 */
+ {12, 0x53, 51}, /* 0000 0101 0011 */
+ {12, 0x24, 52}, /* 0000 0010 0100 */
+ {12, 0x37, 53}, /* 0000 0011 0111 */
+ {12, 0x38, 54}, /* 0000 0011 1000 */
+ {12, 0x27, 55}, /* 0000 0010 0111 */
+ {12, 0x28, 56}, /* 0000 0010 1000 */
+ {12, 0x58, 57}, /* 0000 0101 1000 */
+ {12, 0x59, 58}, /* 0000 0101 1001 */
+ {12, 0x2B, 59}, /* 0000 0010 1011 */
+ {12, 0x2C, 60}, /* 0000 0010 1100 */
+ {12, 0x5A, 61}, /* 0000 0101 1010 */
+ {12, 0x66, 62}, /* 0000 0110 0110 */
+ {12, 0x67, 63}, /* 0000 0110 0111 */
+ {10, 0xF, 64}, /* 0000 0011 11 */
+ {12, 0xC8, 128}, /* 0000 1100 1000 */
+ {12, 0xC9, 192}, /* 0000 1100 1001 */
+ {12, 0x5B, 256}, /* 0000 0101 1011 */
+ {12, 0x33, 320}, /* 0000 0011 0011 */
+ {12, 0x34, 384}, /* 0000 0011 0100 */
+ {12, 0x35, 448}, /* 0000 0011 0101 */
+ {13, 0x6C, 512}, /* 0000 0011 0110 0 */
+ {13, 0x6D, 576}, /* 0000 0011 0110 1 */
+ {13, 0x4A, 640}, /* 0000 0010 0101 0 */
+ {13, 0x4B, 704}, /* 0000 0010 0101 1 */
+ {13, 0x4C, 768}, /* 0000 0010 0110 0 */
+ {13, 0x4D, 832}, /* 0000 0010 0110 1 */
+ {13, 0x72, 896}, /* 0000 0011 1001 0 */
+ {13, 0x73, 960}, /* 0000 0011 1001 1 */
+ {13, 0x74, 1024}, /* 0000 0011 1010 0 */
+ {13, 0x75, 1088}, /* 0000 0011 1010 1 */
+ {13, 0x76, 1152}, /* 0000 0011 1011 0 */
+ {13, 0x77, 1216}, /* 0000 0011 1011 1 */
+ {13, 0x52, 1280}, /* 0000 0010 1001 0 */
+ {13, 0x53, 1344}, /* 0000 0010 1001 1 */
+ {13, 0x54, 1408}, /* 0000 0010 1010 0 */
+ {13, 0x55, 1472}, /* 0000 0010 1010 1 */
+ {13, 0x5A, 1536}, /* 0000 0010 1101 0 */
+ {13, 0x5B, 1600}, /* 0000 0010 1101 1 */
+ {13, 0x64, 1664}, /* 0000 0011 0010 0 */
+ {13, 0x65, 1728}, /* 0000 0011 0010 1 */
+ {11, 0x8, 1792}, /* 0000 0001 000 */
+ {11, 0xC, 1856}, /* 0000 0001 100 */
+ {11, 0xD, 1920}, /* 0000 0001 101 */
+ {12, 0x12, 1984}, /* 0000 0001 0010 */
+ {12, 0x13, 2048}, /* 0000 0001 0011 */
+ {12, 0x14, 2112}, /* 0000 0001 0100 */
+ {12, 0x15, 2176}, /* 0000 0001 0101 */
+ {12, 0x16, 2240}, /* 0000 0001 0110 */
+ {12, 0x17, 2304}, /* 0000 0001 0111 */
+ {12, 0x1C, 2368}, /* 0000 0001 1100 */
+ {12, 0x1D, 2432}, /* 0000 0001 1101 */
+ {12, 0x1E, 2496}, /* 0000 0001 1110 */
+ {12, 0x1F, 2560}, /* 0000 0001 1111 */
+ {12, 0x1, G3CODE_EOL}, /* 0000 0000 0001 */
+ {9, 0x1, G3CODE_INVALID}, /* 0000 0000 1 */
+ {10, 0x1, G3CODE_INVALID}, /* 0000 0000 01 */
+ {11, 0x1, G3CODE_INVALID}, /* 0000 0000 001 */
+ {12, 0x0, G3CODE_INVALID}, /* 0000 0000 0000 */
};
#else
extern const tableentry TIFFFaxWhiteCodes[];
extern const tableentry TIFFFaxBlackCodes[];
#endif
#endif /* _T4_ */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_aux.c b/src/3rdparty/libtiff/libtiff/tif_aux.c
index 8188db5..49855bb 100644
--- a/src/3rdparty/libtiff/libtiff/tif_aux.c
+++ b/src/3rdparty/libtiff/libtiff/tif_aux.c
@@ -2,23 +2,23 @@
* Copyright (c) 1991-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -27,173 +27,180 @@
*
* Auxiliary Support Routines.
*/
-#include "tiffiop.h"
#include "tif_predict.h"
-#include <math.h>
+#include "tiffiop.h"
#include <float.h>
+#include <math.h>
-uint32
-_TIFFMultiply32(TIFF* tif, uint32 first, uint32 second, const char* where)
+uint32_t _TIFFMultiply32(TIFF *tif, uint32_t first, uint32_t second,
+ const char *where)
{
- if (second && first > TIFF_UINT32_MAX / second) {
- TIFFErrorExt(tif->tif_clientdata, where, "Integer overflow in %s", where);
- return 0;
- }
+ if (second && first > UINT32_MAX / second)
+ {
+ TIFFErrorExtR(tif, where, "Integer overflow in %s", where);
+ return 0;
+ }
- return first * second;
+ return first * second;
}
-uint64
-_TIFFMultiply64(TIFF* tif, uint64 first, uint64 second, const char* where)
+uint64_t _TIFFMultiply64(TIFF *tif, uint64_t first, uint64_t second,
+ const char *where)
{
- if (second && first > TIFF_UINT64_MAX / second) {
- TIFFErrorExt(tif->tif_clientdata, where, "Integer overflow in %s", where);
- return 0;
- }
+ if (second && first > UINT64_MAX / second)
+ {
+ TIFFErrorExtR(tif, where, "Integer overflow in %s", where);
+ return 0;
+ }
- return first * second;
+ return first * second;
}
-tmsize_t
-_TIFFMultiplySSize(TIFF* tif, tmsize_t first, tmsize_t second, const char* where)
+tmsize_t _TIFFMultiplySSize(TIFF *tif, tmsize_t first, tmsize_t second,
+ const char *where)
{
- if( first <= 0 || second <= 0 )
+ if (first <= 0 || second <= 0)
{
- if( tif != NULL && where != NULL )
+ if (tif != NULL && where != NULL)
{
- TIFFErrorExt(tif->tif_clientdata, where,
- "Invalid argument to _TIFFMultiplySSize() in %s", where);
+ TIFFErrorExtR(tif, where,
+ "Invalid argument to _TIFFMultiplySSize() in %s",
+ where);
}
return 0;
}
- if( first > TIFF_TMSIZE_T_MAX / second )
+ if (first > TIFF_TMSIZE_T_MAX / second)
{
- if( tif != NULL && where != NULL )
+ if (tif != NULL && where != NULL)
{
- TIFFErrorExt(tif->tif_clientdata, where,
- "Integer overflow in %s", where);
+ TIFFErrorExtR(tif, where, "Integer overflow in %s", where);
}
return 0;
}
return first * second;
}
-tmsize_t _TIFFCastUInt64ToSSize(TIFF* tif, uint64 val, const char* module)
+tmsize_t _TIFFCastUInt64ToSSize(TIFF *tif, uint64_t val, const char *module)
{
- if( val > (uint64)TIFF_TMSIZE_T_MAX )
+ if (val > (uint64_t)TIFF_TMSIZE_T_MAX)
{
- if( tif != NULL && module != NULL )
+ if (tif != NULL && module != NULL)
{
- TIFFErrorExt(tif->tif_clientdata,module,"Integer overflow");
+ TIFFErrorExtR(tif, module, "Integer overflow");
}
return 0;
}
return (tmsize_t)val;
}
-void*
-_TIFFCheckRealloc(TIFF* tif, void* buffer,
- tmsize_t nmemb, tmsize_t elem_size, const char* what)
+void *_TIFFCheckRealloc(TIFF *tif, void *buffer, tmsize_t nmemb,
+ tmsize_t elem_size, const char *what)
{
- void* cp = NULL;
- tmsize_t count = _TIFFMultiplySSize(tif, nmemb, elem_size, NULL);
- /*
- * Check for integer overflow.
- */
- if (count != 0)
- {
- cp = _TIFFrealloc(buffer, count);
- }
-
- if (cp == NULL) {
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "Failed to allocate memory for %s "
- "(%ld elements of %ld bytes each)",
- what,(long) nmemb, (long) elem_size);
- }
-
- return cp;
+ void *cp = NULL;
+ tmsize_t count = _TIFFMultiplySSize(tif, nmemb, elem_size, NULL);
+ /*
+ * Check for integer overflow.
+ */
+ if (count != 0)
+ {
+ cp = _TIFFreallocExt(tif, buffer, count);
+ }
+
+ if (cp == NULL)
+ {
+ TIFFErrorExtR(tif, tif->tif_name,
+ "Failed to allocate memory for %s "
+ "(%" TIFF_SSIZE_FORMAT " elements of %" TIFF_SSIZE_FORMAT
+ " bytes each)",
+ what, nmemb, elem_size);
+ }
+
+ return cp;
}
-void*
-_TIFFCheckMalloc(TIFF* tif, tmsize_t nmemb, tmsize_t elem_size, const char* what)
+void *_TIFFCheckMalloc(TIFF *tif, tmsize_t nmemb, tmsize_t elem_size,
+ const char *what)
{
- return _TIFFCheckRealloc(tif, NULL, nmemb, elem_size, what);
+ return _TIFFCheckRealloc(tif, NULL, nmemb, elem_size, what);
}
-static int
-TIFFDefaultTransferFunction(TIFFDirectory* td)
+static int TIFFDefaultTransferFunction(TIFF *tif, TIFFDirectory *td)
{
- uint16 **tf = td->td_transferfunction;
- tmsize_t i, n, nbytes;
-
- tf[0] = tf[1] = tf[2] = 0;
- if (td->td_bitspersample >= sizeof(tmsize_t) * 8 - 2)
- return 0;
-
- n = ((tmsize_t)1)<<td->td_bitspersample;
- nbytes = n * sizeof (uint16);
- tf[0] = (uint16 *)_TIFFmalloc(nbytes);
- if (tf[0] == NULL)
- return 0;
- tf[0][0] = 0;
- for (i = 1; i < n; i++) {
- double t = (double)i/((double) n-1.);
- tf[0][i] = (uint16)floor(65535.*pow(t, 2.2) + .5);
- }
-
- if (td->td_samplesperpixel - td->td_extrasamples > 1) {
- tf[1] = (uint16 *)_TIFFmalloc(nbytes);
- if(tf[1] == NULL)
- goto bad;
- _TIFFmemcpy(tf[1], tf[0], nbytes);
- tf[2] = (uint16 *)_TIFFmalloc(nbytes);
- if (tf[2] == NULL)
- goto bad;
- _TIFFmemcpy(tf[2], tf[0], nbytes);
- }
- return 1;
+ uint16_t **tf = td->td_transferfunction;
+ tmsize_t i, n, nbytes;
+
+ tf[0] = tf[1] = tf[2] = 0;
+ if (td->td_bitspersample >= sizeof(tmsize_t) * 8 - 2)
+ return 0;
+
+ n = ((tmsize_t)1) << td->td_bitspersample;
+ nbytes = n * sizeof(uint16_t);
+ tf[0] = (uint16_t *)_TIFFmallocExt(tif, nbytes);
+ if (tf[0] == NULL)
+ return 0;
+ tf[0][0] = 0;
+ for (i = 1; i < n; i++)
+ {
+ double t = (double)i / ((double)n - 1.);
+ tf[0][i] = (uint16_t)floor(65535. * pow(t, 2.2) + .5);
+ }
+
+ if (td->td_samplesperpixel - td->td_extrasamples > 1)
+ {
+ tf[1] = (uint16_t *)_TIFFmallocExt(tif, nbytes);
+ if (tf[1] == NULL)
+ goto bad;
+ _TIFFmemcpy(tf[1], tf[0], nbytes);
+ tf[2] = (uint16_t *)_TIFFmallocExt(tif, nbytes);
+ if (tf[2] == NULL)
+ goto bad;
+ _TIFFmemcpy(tf[2], tf[0], nbytes);
+ }
+ return 1;
bad:
- if (tf[0])
- _TIFFfree(tf[0]);
- if (tf[1])
- _TIFFfree(tf[1]);
- if (tf[2])
- _TIFFfree(tf[2]);
- tf[0] = tf[1] = tf[2] = 0;
- return 0;
+ if (tf[0])
+ _TIFFfreeExt(tif, tf[0]);
+ if (tf[1])
+ _TIFFfreeExt(tif, tf[1]);
+ if (tf[2])
+ _TIFFfreeExt(tif, tf[2]);
+ tf[0] = tf[1] = tf[2] = 0;
+ return 0;
}
-static int
-TIFFDefaultRefBlackWhite(TIFFDirectory* td)
+static int TIFFDefaultRefBlackWhite(TIFF *tif, TIFFDirectory *td)
{
- int i;
-
- td->td_refblackwhite = (float *)_TIFFmalloc(6*sizeof (float));
- if (td->td_refblackwhite == NULL)
- return 0;
- if (td->td_photometric == PHOTOMETRIC_YCBCR) {
- /*
- * YCbCr (Class Y) images must have the ReferenceBlackWhite
- * tag set. Fix the broken images, which lacks that tag.
- */
- td->td_refblackwhite[0] = 0.0F;
- td->td_refblackwhite[1] = td->td_refblackwhite[3] =
- td->td_refblackwhite[5] = 255.0F;
- td->td_refblackwhite[2] = td->td_refblackwhite[4] = 128.0F;
- } else {
- /*
- * Assume RGB (Class R)
- */
- for (i = 0; i < 3; i++) {
- td->td_refblackwhite[2*i+0] = 0;
- td->td_refblackwhite[2*i+1] =
- (float)((1L<<td->td_bitspersample)-1L);
- }
- }
- return 1;
+ int i;
+
+ td->td_refblackwhite = (float *)_TIFFmallocExt(tif, 6 * sizeof(float));
+ if (td->td_refblackwhite == NULL)
+ return 0;
+ if (td->td_photometric == PHOTOMETRIC_YCBCR)
+ {
+ /*
+ * YCbCr (Class Y) images must have the ReferenceBlackWhite
+ * tag set. Fix the broken images, which lacks that tag.
+ */
+ td->td_refblackwhite[0] = 0.0F;
+ td->td_refblackwhite[1] = td->td_refblackwhite[3] =
+ td->td_refblackwhite[5] = 255.0F;
+ td->td_refblackwhite[2] = td->td_refblackwhite[4] = 128.0F;
+ }
+ else
+ {
+ /*
+ * Assume RGB (Class R)
+ */
+ for (i = 0; i < 3; i++)
+ {
+ td->td_refblackwhite[2 * i + 0] = 0;
+ td->td_refblackwhite[2 * i + 1] =
+ (float)((1L << td->td_bitspersample) - 1L);
+ }
+ }
+ return 1;
}
/*
@@ -204,216 +211,248 @@ TIFFDefaultRefBlackWhite(TIFFDirectory* td)
* explicit values so that defaults exist only one
* place in the library -- in TIFFDefaultDirectory.
*/
-int
-TIFFVGetFieldDefaulted(TIFF* tif, uint32 tag, va_list ap)
+int TIFFVGetFieldDefaulted(TIFF *tif, uint32_t tag, va_list ap)
{
- TIFFDirectory *td = &tif->tif_dir;
-
- if (TIFFVGetField(tif, tag, ap))
- return (1);
- switch (tag) {
- case TIFFTAG_SUBFILETYPE:
- *va_arg(ap, uint32 *) = td->td_subfiletype;
- return (1);
- case TIFFTAG_BITSPERSAMPLE:
- *va_arg(ap, uint16 *) = td->td_bitspersample;
- return (1);
- case TIFFTAG_THRESHHOLDING:
- *va_arg(ap, uint16 *) = td->td_threshholding;
- return (1);
- case TIFFTAG_FILLORDER:
- *va_arg(ap, uint16 *) = td->td_fillorder;
- return (1);
- case TIFFTAG_ORIENTATION:
- *va_arg(ap, uint16 *) = td->td_orientation;
- return (1);
- case TIFFTAG_SAMPLESPERPIXEL:
- *va_arg(ap, uint16 *) = td->td_samplesperpixel;
- return (1);
- case TIFFTAG_ROWSPERSTRIP:
- *va_arg(ap, uint32 *) = td->td_rowsperstrip;
- return (1);
- case TIFFTAG_MINSAMPLEVALUE:
- *va_arg(ap, uint16 *) = td->td_minsamplevalue;
- return (1);
- case TIFFTAG_MAXSAMPLEVALUE:
- *va_arg(ap, uint16 *) = td->td_maxsamplevalue;
- return (1);
- case TIFFTAG_PLANARCONFIG:
- *va_arg(ap, uint16 *) = td->td_planarconfig;
- return (1);
- case TIFFTAG_RESOLUTIONUNIT:
- *va_arg(ap, uint16 *) = td->td_resolutionunit;
- return (1);
- case TIFFTAG_PREDICTOR:
+ TIFFDirectory *td = &tif->tif_dir;
+
+ if (TIFFVGetField(tif, tag, ap))
+ return (1);
+ switch (tag)
{
- TIFFPredictorState* sp = (TIFFPredictorState*) tif->tif_data;
- if( sp == NULL )
+ case TIFFTAG_SUBFILETYPE:
+ *va_arg(ap, uint32_t *) = td->td_subfiletype;
+ return (1);
+ case TIFFTAG_BITSPERSAMPLE:
+ *va_arg(ap, uint16_t *) = td->td_bitspersample;
+ return (1);
+ case TIFFTAG_THRESHHOLDING:
+ *va_arg(ap, uint16_t *) = td->td_threshholding;
+ return (1);
+ case TIFFTAG_FILLORDER:
+ *va_arg(ap, uint16_t *) = td->td_fillorder;
+ return (1);
+ case TIFFTAG_ORIENTATION:
+ *va_arg(ap, uint16_t *) = td->td_orientation;
+ return (1);
+ case TIFFTAG_SAMPLESPERPIXEL:
+ *va_arg(ap, uint16_t *) = td->td_samplesperpixel;
+ return (1);
+ case TIFFTAG_ROWSPERSTRIP:
+ *va_arg(ap, uint32_t *) = td->td_rowsperstrip;
+ return (1);
+ case TIFFTAG_MINSAMPLEVALUE:
+ *va_arg(ap, uint16_t *) = td->td_minsamplevalue;
+ return (1);
+ case TIFFTAG_MAXSAMPLEVALUE:
+ {
+ uint16_t maxsamplevalue;
+ /* td_bitspersample=1 is always set in TIFFDefaultDirectory().
+ * Therefore, td_maxsamplevalue has to be re-calculated in
+ * TIFFGetFieldDefaulted(). */
+ if (td->td_bitspersample > 0)
+ {
+ /* This shift operation into a uint16_t limits the value to
+ * 65535 even if td_bitspersamle is > 16 */
+ if (td->td_bitspersample <= 16)
+ {
+ maxsamplevalue = (1 << td->td_bitspersample) -
+ 1; /* 2**(BitsPerSample) - 1 */
+ }
+ else
+ {
+ maxsamplevalue = 65535;
+ }
+ }
+ else
+ {
+ maxsamplevalue = 0;
+ }
+ *va_arg(ap, uint16_t *) = maxsamplevalue;
+ return (1);
+ }
+ case TIFFTAG_PLANARCONFIG:
+ *va_arg(ap, uint16_t *) = td->td_planarconfig;
+ return (1);
+ case TIFFTAG_RESOLUTIONUNIT:
+ *va_arg(ap, uint16_t *) = td->td_resolutionunit;
+ return (1);
+ case TIFFTAG_PREDICTOR:
{
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "Cannot get \"Predictor\" tag as plugin is not configured");
- *va_arg(ap, uint16*) = 0;
- return 0;
+ TIFFPredictorState *sp = (TIFFPredictorState *)tif->tif_data;
+ if (sp == NULL)
+ {
+ TIFFErrorExtR(
+ tif, tif->tif_name,
+ "Cannot get \"Predictor\" tag as plugin is not configured");
+ *va_arg(ap, uint16_t *) = 0;
+ return 0;
+ }
+ *va_arg(ap, uint16_t *) = (uint16_t)sp->predictor;
+ return 1;
}
- *va_arg(ap, uint16*) = (uint16) sp->predictor;
- return 1;
+ case TIFFTAG_DOTRANGE:
+ *va_arg(ap, uint16_t *) = 0;
+ *va_arg(ap, uint16_t *) = (1 << td->td_bitspersample) - 1;
+ return (1);
+ case TIFFTAG_INKSET:
+ *va_arg(ap, uint16_t *) = INKSET_CMYK;
+ return 1;
+ case TIFFTAG_NUMBEROFINKS:
+ *va_arg(ap, uint16_t *) = 4;
+ return (1);
+ case TIFFTAG_EXTRASAMPLES:
+ *va_arg(ap, uint16_t *) = td->td_extrasamples;
+ *va_arg(ap, const uint16_t **) = td->td_sampleinfo;
+ return (1);
+ case TIFFTAG_MATTEING:
+ *va_arg(ap, uint16_t *) =
+ (td->td_extrasamples == 1 &&
+ td->td_sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA);
+ return (1);
+ case TIFFTAG_TILEDEPTH:
+ *va_arg(ap, uint32_t *) = td->td_tiledepth;
+ return (1);
+ case TIFFTAG_DATATYPE:
+ *va_arg(ap, uint16_t *) = td->td_sampleformat - 1;
+ return (1);
+ case TIFFTAG_SAMPLEFORMAT:
+ *va_arg(ap, uint16_t *) = td->td_sampleformat;
+ return (1);
+ case TIFFTAG_IMAGEDEPTH:
+ *va_arg(ap, uint32_t *) = td->td_imagedepth;
+ return (1);
+ case TIFFTAG_YCBCRCOEFFICIENTS:
+ {
+ /* defaults are from CCIR Recommendation 601-1 */
+ static const float ycbcrcoeffs[] = {0.299f, 0.587f, 0.114f};
+ *va_arg(ap, const float **) = ycbcrcoeffs;
+ return 1;
+ }
+ case TIFFTAG_YCBCRSUBSAMPLING:
+ *va_arg(ap, uint16_t *) = td->td_ycbcrsubsampling[0];
+ *va_arg(ap, uint16_t *) = td->td_ycbcrsubsampling[1];
+ return (1);
+ case TIFFTAG_YCBCRPOSITIONING:
+ *va_arg(ap, uint16_t *) = td->td_ycbcrpositioning;
+ return (1);
+ case TIFFTAG_WHITEPOINT:
+ {
+ /* TIFF 6.0 specification tells that it is no default
+ value for the WhitePoint, but AdobePhotoshop TIFF
+ Technical Note tells that it should be CIE D50. */
+ static const float whitepoint[] = {
+ D50_X0 / (D50_X0 + D50_Y0 + D50_Z0),
+ D50_Y0 / (D50_X0 + D50_Y0 + D50_Z0)};
+ *va_arg(ap, const float **) = whitepoint;
+ return 1;
+ }
+ case TIFFTAG_TRANSFERFUNCTION:
+ if (!td->td_transferfunction[0] &&
+ !TIFFDefaultTransferFunction(tif, td))
+ {
+ TIFFErrorExtR(tif, tif->tif_name,
+ "No space for \"TransferFunction\" tag");
+ return (0);
+ }
+ *va_arg(ap, const uint16_t **) = td->td_transferfunction[0];
+ if (td->td_samplesperpixel - td->td_extrasamples > 1)
+ {
+ *va_arg(ap, const uint16_t **) = td->td_transferfunction[1];
+ *va_arg(ap, const uint16_t **) = td->td_transferfunction[2];
+ }
+ return (1);
+ case TIFFTAG_REFERENCEBLACKWHITE:
+ if (!td->td_refblackwhite && !TIFFDefaultRefBlackWhite(tif, td))
+ return (0);
+ *va_arg(ap, const float **) = td->td_refblackwhite;
+ return (1);
}
- case TIFFTAG_DOTRANGE:
- *va_arg(ap, uint16 *) = 0;
- *va_arg(ap, uint16 *) = (1<<td->td_bitspersample)-1;
- return (1);
- case TIFFTAG_INKSET:
- *va_arg(ap, uint16 *) = INKSET_CMYK;
- return 1;
- case TIFFTAG_NUMBEROFINKS:
- *va_arg(ap, uint16 *) = 4;
- return (1);
- case TIFFTAG_EXTRASAMPLES:
- *va_arg(ap, uint16 *) = td->td_extrasamples;
- *va_arg(ap, uint16 **) = td->td_sampleinfo;
- return (1);
- case TIFFTAG_MATTEING:
- *va_arg(ap, uint16 *) =
- (td->td_extrasamples == 1 &&
- td->td_sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA);
- return (1);
- case TIFFTAG_TILEDEPTH:
- *va_arg(ap, uint32 *) = td->td_tiledepth;
- return (1);
- case TIFFTAG_DATATYPE:
- *va_arg(ap, uint16 *) = td->td_sampleformat-1;
- return (1);
- case TIFFTAG_SAMPLEFORMAT:
- *va_arg(ap, uint16 *) = td->td_sampleformat;
- return(1);
- case TIFFTAG_IMAGEDEPTH:
- *va_arg(ap, uint32 *) = td->td_imagedepth;
- return (1);
- case TIFFTAG_YCBCRCOEFFICIENTS:
- {
- /* defaults are from CCIR Recommendation 601-1 */
- static float ycbcrcoeffs[] = { 0.299f, 0.587f, 0.114f };
- *va_arg(ap, float **) = ycbcrcoeffs;
- return 1;
- }
- case TIFFTAG_YCBCRSUBSAMPLING:
- *va_arg(ap, uint16 *) = td->td_ycbcrsubsampling[0];
- *va_arg(ap, uint16 *) = td->td_ycbcrsubsampling[1];
- return (1);
- case TIFFTAG_YCBCRPOSITIONING:
- *va_arg(ap, uint16 *) = td->td_ycbcrpositioning;
- return (1);
- case TIFFTAG_WHITEPOINT:
- {
- static float whitepoint[2];
-
- /* TIFF 6.0 specification tells that it is no default
- value for the WhitePoint, but AdobePhotoshop TIFF
- Technical Note tells that it should be CIE D50. */
- whitepoint[0] = D50_X0 / (D50_X0 + D50_Y0 + D50_Z0);
- whitepoint[1] = D50_Y0 / (D50_X0 + D50_Y0 + D50_Z0);
- *va_arg(ap, float **) = whitepoint;
- return 1;
- }
- case TIFFTAG_TRANSFERFUNCTION:
- if (!td->td_transferfunction[0] &&
- !TIFFDefaultTransferFunction(td)) {
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "No space for \"TransferFunction\" tag");
- return (0);
- }
- *va_arg(ap, uint16 **) = td->td_transferfunction[0];
- if (td->td_samplesperpixel - td->td_extrasamples > 1) {
- *va_arg(ap, uint16 **) = td->td_transferfunction[1];
- *va_arg(ap, uint16 **) = td->td_transferfunction[2];
- }
- return (1);
- case TIFFTAG_REFERENCEBLACKWHITE:
- if (!td->td_refblackwhite && !TIFFDefaultRefBlackWhite(td))
- return (0);
- *va_arg(ap, float **) = td->td_refblackwhite;
- return (1);
- }
- return 0;
+ return 0;
}
/*
* Like TIFFGetField, but return any default
* value if the tag is not present in the directory.
*/
-int
-TIFFGetFieldDefaulted(TIFF* tif, uint32 tag, ...)
+int TIFFGetFieldDefaulted(TIFF *tif, uint32_t tag, ...)
{
- int ok;
- va_list ap;
+ int ok;
+ va_list ap;
- va_start(ap, tag);
- ok = TIFFVGetFieldDefaulted(tif, tag, ap);
- va_end(ap);
- return (ok);
+ va_start(ap, tag);
+ ok = TIFFVGetFieldDefaulted(tif, tag, ap);
+ va_end(ap);
+ return (ok);
}
-struct _Int64Parts {
- int32 low, high;
+struct _Int64Parts
+{
+ int32_t low, high;
};
-typedef union {
- struct _Int64Parts part;
- int64 value;
+typedef union
+{
+ struct _Int64Parts part;
+ int64_t value;
} _Int64;
-float
-_TIFFUInt64ToFloat(uint64 ui64)
+float _TIFFUInt64ToFloat(uint64_t ui64)
{
- _Int64 i;
-
- i.value = ui64;
- if (i.part.high >= 0) {
- return (float)i.value;
- } else {
- long double df;
- df = (long double)i.value;
- df += 18446744073709551616.0; /* adding 2**64 */
- return (float)df;
- }
+ _Int64 i;
+
+ i.value = ui64;
+ if (i.part.high >= 0)
+ {
+ return (float)i.value;
+ }
+ else
+ {
+ long double df;
+ df = (long double)i.value;
+ df += 18446744073709551616.0; /* adding 2**64 */
+ return (float)df;
+ }
}
-double
-_TIFFUInt64ToDouble(uint64 ui64)
+double _TIFFUInt64ToDouble(uint64_t ui64)
{
- _Int64 i;
-
- i.value = ui64;
- if (i.part.high >= 0) {
- return (double)i.value;
- } else {
- long double df;
- df = (long double)i.value;
- df += 18446744073709551616.0; /* adding 2**64 */
- return (double)df;
- }
+ _Int64 i;
+
+ i.value = ui64;
+ if (i.part.high >= 0)
+ {
+ return (double)i.value;
+ }
+ else
+ {
+ long double df;
+ df = (long double)i.value;
+ df += 18446744073709551616.0; /* adding 2**64 */
+ return (double)df;
+ }
}
-float _TIFFClampDoubleToFloat( double val )
+float _TIFFClampDoubleToFloat(double val)
{
- if( val > FLT_MAX )
+ if (val > FLT_MAX)
return FLT_MAX;
- if( val < -FLT_MAX )
+ if (val < -FLT_MAX)
return -FLT_MAX;
return (float)val;
}
-int _TIFFSeekOK(TIFF* tif, toff_t off)
+uint32_t _TIFFClampDoubleToUInt32(double val)
+{
+ if (val < 0)
+ return 0;
+ if (val > 0xFFFFFFFFU || val != val)
+ return 0xFFFFFFFFU;
+ return (uint32_t)val;
+}
+
+int _TIFFSeekOK(TIFF *tif, toff_t off)
{
/* Huge offsets, especially -1 / UINT64_MAX, can cause issues */
/* See http://bugzilla.maptools.org/show_bug.cgi?id=2726 */
- return off <= (~(uint64)0)/2 && TIFFSeekFile(tif,off,SEEK_SET)==off;
+ return off <= (~(uint64_t)0) / 2 && TIFFSeekFile(tif, off, SEEK_SET) == off;
}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_close.c b/src/3rdparty/libtiff/libtiff/tif_close.c
index e4228df..06aa29f 100644
--- a/src/3rdparty/libtiff/libtiff/tif_close.c
+++ b/src/3rdparty/libtiff/libtiff/tif_close.c
@@ -2,23 +2,23 @@
* Copyright (c) 1988-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -37,70 +37,81 @@
* completely freed, so you should save opened file handle and pointer
* to the close procedure in external variables before calling
* _TIFFCleanup(), if you will need these ones to close the file.
- *
+ *
* @param tif A TIFF pointer.
*/
-void
-TIFFCleanup(TIFF* tif)
+void TIFFCleanup(TIFF *tif)
{
- /*
- * Flush buffered data and directory (if dirty).
- */
- if (tif->tif_mode != O_RDONLY)
- TIFFFlush(tif);
- (*tif->tif_cleanup)(tif);
- TIFFFreeDirectory(tif);
-
- if (tif->tif_dirlist)
- _TIFFfree(tif->tif_dirlist);
-
- /*
- * Clean up client info links.
- */
- while( tif->tif_clientinfo )
- {
- TIFFClientInfoLink *psLink = tif->tif_clientinfo;
-
- tif->tif_clientinfo = psLink->next;
- _TIFFfree( psLink->name );
- _TIFFfree( psLink );
- }
-
- if (tif->tif_rawdata && (tif->tif_flags&TIFF_MYBUFFER))
- _TIFFfree(tif->tif_rawdata);
- if (isMapped(tif))
- TIFFUnmapFileContents(tif, tif->tif_base, (toff_t)tif->tif_size);
-
- /*
- * Clean up custom fields.
- */
- if (tif->tif_fields && tif->tif_nfields > 0) {
- uint32 i;
-
- for (i = 0; i < tif->tif_nfields; i++) {
- TIFFField *fld = tif->tif_fields[i];
- if (fld->field_bit == FIELD_CUSTOM &&
- strncmp("Tag ", fld->field_name, 4) == 0) {
- _TIFFfree(fld->field_name);
- _TIFFfree(fld);
- }
- }
-
- _TIFFfree(tif->tif_fields);
- }
-
- if (tif->tif_nfieldscompat > 0) {
- uint32 i;
-
- for (i = 0; i < tif->tif_nfieldscompat; i++) {
- if (tif->tif_fieldscompat[i].allocated_size)
- _TIFFfree(tif->tif_fieldscompat[i].fields);
+ /*
+ * Flush buffered data and directory (if dirty).
+ */
+ if (tif->tif_mode != O_RDONLY)
+ TIFFFlush(tif);
+ (*tif->tif_cleanup)(tif);
+ TIFFFreeDirectory(tif);
+
+ TIFFHashSetDestroy(tif->tif_map_dir_offset_to_number);
+ TIFFHashSetDestroy(tif->tif_map_dir_number_to_offset);
+
+ /*
+ * Clean up client info links.
+ */
+ while (tif->tif_clientinfo)
+ {
+ TIFFClientInfoLink *psLink = tif->tif_clientinfo;
+
+ tif->tif_clientinfo = psLink->next;
+ _TIFFfreeExt(tif, psLink->name);
+ _TIFFfreeExt(tif, psLink);
+ }
+
+ if (tif->tif_rawdata && (tif->tif_flags & TIFF_MYBUFFER))
+ _TIFFfreeExt(tif, tif->tif_rawdata);
+ if (isMapped(tif))
+ TIFFUnmapFileContents(tif, tif->tif_base, (toff_t)tif->tif_size);
+
+ /*
+ * Clean up custom fields.
+ */
+ if (tif->tif_fields && tif->tif_nfields > 0)
+ {
+ uint32_t i;
+
+ for (i = 0; i < tif->tif_nfields; i++)
+ {
+ TIFFField *fld = tif->tif_fields[i];
+ if (fld->field_name != NULL)
+ {
+ if (fld->field_bit == FIELD_CUSTOM &&
+ /* caution: tif_fields[i] must not be the beginning of a
+ * fields-array. Otherwise the following tags are also freed
+ * with the first free().
+ */
+ TIFFFieldIsAnonymous(fld))
+ {
+ _TIFFfreeExt(tif, fld->field_name);
+ _TIFFfreeExt(tif, fld);
}
- _TIFFfree(tif->tif_fieldscompat);
+ }
+ }
+
+ _TIFFfreeExt(tif, tif->tif_fields);
+ }
+
+ if (tif->tif_nfieldscompat > 0)
+ {
+ uint32_t i;
+
+ for (i = 0; i < tif->tif_nfieldscompat; i++)
+ {
+ if (tif->tif_fieldscompat[i].allocated_size)
+ _TIFFfreeExt(tif, tif->tif_fieldscompat[i].fields);
}
+ _TIFFfreeExt(tif, tif->tif_fieldscompat);
+ }
- _TIFFfree(tif);
+ _TIFFfreeExt(NULL, tif);
}
/************************************************************************/
@@ -113,26 +124,15 @@ TIFFCleanup(TIFF* tif)
* TIFFClose closes a file that was previously opened with TIFFOpen().
* Any buffered data are flushed to the file, including the contents of
* the current directory (if modified); and all resources are reclaimed.
- *
+ *
* @param tif A TIFF pointer.
*/
-void
-TIFFClose(TIFF* tif)
+void TIFFClose(TIFF *tif)
{
- TIFFCloseProc closeproc = tif->tif_closeproc;
- thandle_t fd = tif->tif_clientdata;
+ TIFFCloseProc closeproc = tif->tif_closeproc;
+ thandle_t fd = tif->tif_clientdata;
- TIFFCleanup(tif);
- (void) (*closeproc)(fd);
+ TIFFCleanup(tif);
+ (void)(*closeproc)(fd);
}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_codec.c b/src/3rdparty/libtiff/libtiff/tif_codec.c
index b6c04f0..d499b63 100644
--- a/src/3rdparty/libtiff/libtiff/tif_codec.c
+++ b/src/3rdparty/libtiff/libtiff/tif_codec.c
@@ -2,23 +2,23 @@
* Copyright (c) 1988-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -29,7 +29,7 @@
*/
#include "tiffiop.h"
-static int NotConfigured(TIFF*, int);
+static int NotConfigured(TIFF *, int);
#ifndef LZW_SUPPORT
#define TIFFInitLZW NotConfigured
@@ -67,6 +67,9 @@ static int NotConfigured(TIFF*, int);
#ifndef LOGLUV_SUPPORT
#define TIFFInitSGILog NotConfigured
#endif
+#ifndef LERC_SUPPORT
+#define TIFFInitLERC NotConfigured
+#endif
#ifndef LZMA_SUPPORT
#define TIFFInitLZMA NotConfigured
#endif
@@ -80,58 +83,53 @@ static int NotConfigured(TIFF*, int);
/*
* Compression schemes statically built into the library.
*/
-#ifdef VMS
const TIFFCodec _TIFFBuiltinCODECS[] = {
-#else
-TIFFCodec _TIFFBuiltinCODECS[] = {
-#endif
- { "None", COMPRESSION_NONE, TIFFInitDumpMode },
- { "LZW", COMPRESSION_LZW, TIFFInitLZW },
- { "PackBits", COMPRESSION_PACKBITS, TIFFInitPackBits },
- { "ThunderScan", COMPRESSION_THUNDERSCAN,TIFFInitThunderScan },
- { "NeXT", COMPRESSION_NEXT, TIFFInitNeXT },
- { "JPEG", COMPRESSION_JPEG, TIFFInitJPEG },
- { "Old-style JPEG", COMPRESSION_OJPEG, TIFFInitOJPEG },
- { "CCITT RLE", COMPRESSION_CCITTRLE, TIFFInitCCITTRLE },
- { "CCITT RLE/W", COMPRESSION_CCITTRLEW, TIFFInitCCITTRLEW },
- { "CCITT Group 3", COMPRESSION_CCITTFAX3, TIFFInitCCITTFax3 },
- { "CCITT Group 4", COMPRESSION_CCITTFAX4, TIFFInitCCITTFax4 },
- { "ISO JBIG", COMPRESSION_JBIG, TIFFInitJBIG },
- { "Deflate", COMPRESSION_DEFLATE, TIFFInitZIP },
- { "AdobeDeflate", COMPRESSION_ADOBE_DEFLATE , TIFFInitZIP },
- { "PixarLog", COMPRESSION_PIXARLOG, TIFFInitPixarLog },
- { "SGILog", COMPRESSION_SGILOG, TIFFInitSGILog },
- { "SGILog24", COMPRESSION_SGILOG24, TIFFInitSGILog },
- { "LZMA", COMPRESSION_LZMA, TIFFInitLZMA },
- { "ZSTD", COMPRESSION_ZSTD, TIFFInitZSTD },
- { "WEBP", COMPRESSION_WEBP, TIFFInitWebP },
- { NULL, 0, NULL }
-};
+ {"None", COMPRESSION_NONE, TIFFInitDumpMode},
+ {"LZW", COMPRESSION_LZW, TIFFInitLZW},
+ {"PackBits", COMPRESSION_PACKBITS, TIFFInitPackBits},
+ {"ThunderScan", COMPRESSION_THUNDERSCAN, TIFFInitThunderScan},
+ {"NeXT", COMPRESSION_NEXT, TIFFInitNeXT},
+ {"JPEG", COMPRESSION_JPEG, TIFFInitJPEG},
+ {"Old-style JPEG", COMPRESSION_OJPEG, TIFFInitOJPEG},
+ {"CCITT RLE", COMPRESSION_CCITTRLE, TIFFInitCCITTRLE},
+ {"CCITT RLE/W", COMPRESSION_CCITTRLEW, TIFFInitCCITTRLEW},
+ {"CCITT Group 3", COMPRESSION_CCITTFAX3, TIFFInitCCITTFax3},
+ {"CCITT Group 4", COMPRESSION_CCITTFAX4, TIFFInitCCITTFax4},
+ {"ISO JBIG", COMPRESSION_JBIG, TIFFInitJBIG},
+ {"Deflate", COMPRESSION_DEFLATE, TIFFInitZIP},
+ {"AdobeDeflate", COMPRESSION_ADOBE_DEFLATE, TIFFInitZIP},
+ {"PixarLog", COMPRESSION_PIXARLOG, TIFFInitPixarLog},
+ {"SGILog", COMPRESSION_SGILOG, TIFFInitSGILog},
+ {"SGILog24", COMPRESSION_SGILOG24, TIFFInitSGILog},
+ {"LZMA", COMPRESSION_LZMA, TIFFInitLZMA},
+ {"ZSTD", COMPRESSION_ZSTD, TIFFInitZSTD},
+ {"WEBP", COMPRESSION_WEBP, TIFFInitWebP},
+ {"LERC", COMPRESSION_LERC, TIFFInitLERC},
+ {NULL, 0, NULL}};
-static int
-_notConfigured(TIFF* tif)
+static int _notConfigured(TIFF *tif)
{
- const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression);
- char compression_code[20];
-
- sprintf(compression_code, "%d",tif->tif_dir.td_compression );
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "%s compression support is not configured",
- c ? c->name : compression_code );
- return (0);
+ const TIFFCodec *c = TIFFFindCODEC(tif->tif_dir.td_compression);
+ char compression_code[20];
+
+ snprintf(compression_code, sizeof(compression_code), "%" PRIu16,
+ tif->tif_dir.td_compression);
+ TIFFErrorExtR(tif, tif->tif_name,
+ "%s compression support is not configured",
+ c ? c->name : compression_code);
+ return (0);
}
-static int
-NotConfigured(TIFF* tif, int scheme)
+static int NotConfigured(TIFF *tif, int scheme)
{
- (void) scheme;
+ (void)scheme;
- tif->tif_fixuptags = _notConfigured;
- tif->tif_decodestatus = FALSE;
- tif->tif_setupdecode = _notConfigured;
- tif->tif_encodestatus = FALSE;
- tif->tif_setupencode = _notConfigured;
- return (1);
+ tif->tif_fixuptags = _notConfigured;
+ tif->tif_decodestatus = FALSE;
+ tif->tif_setupdecode = _notConfigured;
+ tif->tif_encodestatus = FALSE;
+ tif->tif_setupencode = _notConfigured;
+ return (1);
}
/************************************************************************/
@@ -145,27 +143,21 @@ NotConfigured(TIFF* tif, int scheme)
* 0 will be returned.
*/
-int
-TIFFIsCODECConfigured(uint16 scheme)
+int TIFFIsCODECConfigured(uint16_t scheme)
{
- const TIFFCodec* codec = TIFFFindCODEC(scheme);
+ const TIFFCodec *codec = TIFFFindCODEC(scheme);
- if(codec == NULL) {
- return 0;
- }
- if(codec->init == NULL) {
- return 0;
- }
- if(codec->init != NotConfigured){
- return 1;
- }
- return 0;
+ if (codec == NULL)
+ {
+ return 0;
+ }
+ if (codec->init == NULL)
+ {
+ return 0;
+ }
+ if (codec->init != NotConfigured)
+ {
+ return 1;
+ }
+ return 0;
}
-
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_color.c b/src/3rdparty/libtiff/libtiff/tif_color.c
index 8fae40e..2d7dcac 100644
--- a/src/3rdparty/libtiff/libtiff/tif_color.c
+++ b/src/3rdparty/libtiff/libtiff/tif_color.c
@@ -2,23 +2,23 @@
* Copyright (c) 1988-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -40,173 +40,191 @@
/*
* Convert color value from the CIE L*a*b* 1976 space to CIE XYZ.
*/
-void
-TIFFCIELabToXYZ(TIFFCIELabToRGB *cielab, uint32 l, int32 a, int32 b,
- float *X, float *Y, float *Z)
+void TIFFCIELabToXYZ(TIFFCIELabToRGB *cielab, uint32_t l, int32_t a, int32_t b,
+ float *X, float *Y, float *Z)
{
- float L = (float)l * 100.0F / 255.0F;
- float cby, tmp;
-
- if( L < 8.856F ) {
- *Y = (L * cielab->Y0) / 903.292F;
- cby = 7.787F * (*Y / cielab->Y0) + 16.0F / 116.0F;
- } else {
- cby = (L + 16.0F) / 116.0F;
- *Y = cielab->Y0 * cby * cby * cby;
- }
-
- tmp = (float)a / 500.0F + cby;
- if( tmp < 0.2069F )
- *X = cielab->X0 * (tmp - 0.13793F) / 7.787F;
- else
- *X = cielab->X0 * tmp * tmp * tmp;
-
- tmp = cby - (float)b / 200.0F;
- if( tmp < 0.2069F )
- *Z = cielab->Z0 * (tmp - 0.13793F) / 7.787F;
- else
- *Z = cielab->Z0 * tmp * tmp * tmp;
+ TIFFCIELab16ToXYZ(cielab, l * 257, a * 256, b * 256, X, Y, Z);
}
-#define RINT(R) ((uint32)((R)>0?((R)+0.5):((R)-0.5)))
+/*
+ * For CIELab encoded in 16 bits, L is an unsigned integer range [0,65535].
+ * The a* and b* components are signed integers range [-32768,32767]. The 16
+ * bit chrominance values are encoded as 256 times the 1976 CIE a* and b*
+ * values
+ */
+void TIFFCIELab16ToXYZ(TIFFCIELabToRGB *cielab, uint32_t l, int32_t a,
+ int32_t b, float *X, float *Y, float *Z)
+{
+ float L = (float)l * 100.0F / 65535.0F;
+ float cby, tmp;
+
+ if (L < 8.856F)
+ {
+ *Y = (L * cielab->Y0) / 903.292F;
+ cby = 7.787F * (*Y / cielab->Y0) + 16.0F / 116.0F;
+ }
+ else
+ {
+ cby = (L + 16.0F) / 116.0F;
+ *Y = cielab->Y0 * cby * cby * cby;
+ }
+
+ tmp = (float)a / 256.0F / 500.0F + cby;
+ if (tmp < 0.2069F)
+ *X = cielab->X0 * (tmp - 0.13793F) / 7.787F;
+ else
+ *X = cielab->X0 * tmp * tmp * tmp;
+
+ tmp = cby - (float)b / 256.0F / 200.0F;
+ if (tmp < 0.2069F)
+ *Z = cielab->Z0 * (tmp - 0.13793F) / 7.787F;
+ else
+ *Z = cielab->Z0 * tmp * tmp * tmp;
+}
+
+#define RINT(R) ((uint32_t)((R) > 0 ? ((R) + 0.5) : ((R)-0.5)))
/*
* Convert color value from the XYZ space to RGB.
*/
-void
-TIFFXYZToRGB(TIFFCIELabToRGB *cielab, float X, float Y, float Z,
- uint32 *r, uint32 *g, uint32 *b)
+void TIFFXYZToRGB(TIFFCIELabToRGB *cielab, float X, float Y, float Z,
+ uint32_t *r, uint32_t *g, uint32_t *b)
{
- int i;
- float Yr, Yg, Yb;
- float *matrix = &cielab->display.d_mat[0][0];
-
- /* Multiply through the matrix to get luminosity values. */
- Yr = matrix[0] * X + matrix[1] * Y + matrix[2] * Z;
- Yg = matrix[3] * X + matrix[4] * Y + matrix[5] * Z;
- Yb = matrix[6] * X + matrix[7] * Y + matrix[8] * Z;
-
- /* Clip input */
- Yr = TIFFmax(Yr, cielab->display.d_Y0R);
- Yg = TIFFmax(Yg, cielab->display.d_Y0G);
- Yb = TIFFmax(Yb, cielab->display.d_Y0B);
-
- /* Avoid overflow in case of wrong input values */
- Yr = TIFFmin(Yr, cielab->display.d_YCR);
- Yg = TIFFmin(Yg, cielab->display.d_YCG);
- Yb = TIFFmin(Yb, cielab->display.d_YCB);
-
- /* Turn luminosity to colour value. */
- i = (int)((Yr - cielab->display.d_Y0R) / cielab->rstep);
- i = TIFFmin(cielab->range, i);
- *r = RINT(cielab->Yr2r[i]);
-
- i = (int)((Yg - cielab->display.d_Y0G) / cielab->gstep);
- i = TIFFmin(cielab->range, i);
- *g = RINT(cielab->Yg2g[i]);
-
- i = (int)((Yb - cielab->display.d_Y0B) / cielab->bstep);
- i = TIFFmin(cielab->range, i);
- *b = RINT(cielab->Yb2b[i]);
-
- /* Clip output. */
- *r = TIFFmin(*r, cielab->display.d_Vrwr);
- *g = TIFFmin(*g, cielab->display.d_Vrwg);
- *b = TIFFmin(*b, cielab->display.d_Vrwb);
+ int i;
+ float Yr, Yg, Yb;
+ float *matrix = &cielab->display.d_mat[0][0];
+
+ /* Multiply through the matrix to get luminosity values. */
+ Yr = matrix[0] * X + matrix[1] * Y + matrix[2] * Z;
+ Yg = matrix[3] * X + matrix[4] * Y + matrix[5] * Z;
+ Yb = matrix[6] * X + matrix[7] * Y + matrix[8] * Z;
+
+ /* Clip input */
+ Yr = TIFFmax(Yr, cielab->display.d_Y0R);
+ Yg = TIFFmax(Yg, cielab->display.d_Y0G);
+ Yb = TIFFmax(Yb, cielab->display.d_Y0B);
+
+ /* Avoid overflow in case of wrong input values */
+ Yr = TIFFmin(Yr, cielab->display.d_YCR);
+ Yg = TIFFmin(Yg, cielab->display.d_YCG);
+ Yb = TIFFmin(Yb, cielab->display.d_YCB);
+
+ /* Turn luminosity to colour value. */
+ i = (int)((Yr - cielab->display.d_Y0R) / cielab->rstep);
+ i = TIFFmin(cielab->range, i);
+ *r = RINT(cielab->Yr2r[i]);
+
+ i = (int)((Yg - cielab->display.d_Y0G) / cielab->gstep);
+ i = TIFFmin(cielab->range, i);
+ *g = RINT(cielab->Yg2g[i]);
+
+ i = (int)((Yb - cielab->display.d_Y0B) / cielab->bstep);
+ i = TIFFmin(cielab->range, i);
+ *b = RINT(cielab->Yb2b[i]);
+
+ /* Clip output. */
+ *r = TIFFmin(*r, cielab->display.d_Vrwr);
+ *g = TIFFmin(*g, cielab->display.d_Vrwg);
+ *b = TIFFmin(*b, cielab->display.d_Vrwb);
}
#undef RINT
-/*
+/*
* Allocate conversion state structures and make look_up tables for
* the Yr,Yb,Yg <=> r,g,b conversions.
*/
-int
-TIFFCIELabToRGBInit(TIFFCIELabToRGB* cielab,
- const TIFFDisplay *display, float *refWhite)
+int TIFFCIELabToRGBInit(TIFFCIELabToRGB *cielab, const TIFFDisplay *display,
+ float *refWhite)
{
- int i;
- double dfGamma;
-
- cielab->range = CIELABTORGB_TABLE_RANGE;
-
- _TIFFmemcpy(&cielab->display, display, sizeof(TIFFDisplay));
-
- /* Red */
- dfGamma = 1.0 / cielab->display.d_gammaR ;
- cielab->rstep =
- (cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
- for(i = 0; i <= cielab->range; i++) {
- cielab->Yr2r[i] = cielab->display.d_Vrwr
- * ((float)pow((double)i / cielab->range, dfGamma));
- }
-
- /* Green */
- dfGamma = 1.0 / cielab->display.d_gammaG ;
- cielab->gstep =
- (cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
- for(i = 0; i <= cielab->range; i++) {
- cielab->Yg2g[i] = cielab->display.d_Vrwg
- * ((float)pow((double)i / cielab->range, dfGamma));
- }
-
- /* Blue */
- dfGamma = 1.0 / cielab->display.d_gammaB ;
- cielab->bstep =
- (cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
- for(i = 0; i <= cielab->range; i++) {
- cielab->Yb2b[i] = cielab->display.d_Vrwb
- * ((float)pow((double)i / cielab->range, dfGamma));
- }
-
- /* Init reference white point */
- cielab->X0 = refWhite[0];
- cielab->Y0 = refWhite[1];
- cielab->Z0 = refWhite[2];
-
- return 0;
+ int i;
+ double dfGamma;
+
+ cielab->range = CIELABTORGB_TABLE_RANGE;
+
+ _TIFFmemcpy(&cielab->display, display, sizeof(TIFFDisplay));
+
+ /* Red */
+ dfGamma = 1.0 / cielab->display.d_gammaR;
+ cielab->rstep =
+ (cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
+ for (i = 0; i <= cielab->range; i++)
+ {
+ cielab->Yr2r[i] = cielab->display.d_Vrwr *
+ ((float)pow((double)i / cielab->range, dfGamma));
+ }
+
+ /* Green */
+ dfGamma = 1.0 / cielab->display.d_gammaG;
+ cielab->gstep =
+ (cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
+ for (i = 0; i <= cielab->range; i++)
+ {
+ cielab->Yg2g[i] = cielab->display.d_Vrwg *
+ ((float)pow((double)i / cielab->range, dfGamma));
+ }
+
+ /* Blue */
+ dfGamma = 1.0 / cielab->display.d_gammaB;
+ cielab->bstep =
+ (cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
+ for (i = 0; i <= cielab->range; i++)
+ {
+ cielab->Yb2b[i] = cielab->display.d_Vrwb *
+ ((float)pow((double)i / cielab->range, dfGamma));
+ }
+
+ /* Init reference white point */
+ cielab->X0 = refWhite[0];
+ cielab->Y0 = refWhite[1];
+ cielab->Z0 = refWhite[2];
+
+ return 0;
}
-/*
+/*
* Convert color value from the YCbCr space to RGB.
* The colorspace conversion algorithm comes from the IJG v5a code;
* see below for more information on how it works.
*/
-#define SHIFT 16
-#define FIX(x) ((int32)((x) * (1L<<SHIFT) + 0.5))
-#define ONE_HALF ((int32)(1<<(SHIFT-1)))
-#define Code2V(c, RB, RW, CR) ((((c)-(int32)(RB))*(float)(CR))/(float)(((RW)-(RB)!=0) ? ((RW)-(RB)) : 1))
-#define CLAMP(f,min,max) ((f)<(min)?(min):(f)>(max)?(max):(f))
-#define HICLAMP(f,max) ((f)>(max)?(max):(f))
-
-void
-TIFFYCbCrtoRGB(TIFFYCbCrToRGB *ycbcr, uint32 Y, int32 Cb, int32 Cr,
- uint32 *r, uint32 *g, uint32 *b)
+#define SHIFT 16
+#define FIX(x) ((int32_t)((x) * (1L << SHIFT) + 0.5))
+#define ONE_HALF ((int32_t)(1 << (SHIFT - 1)))
+#define Code2V(c, RB, RW, CR) \
+ ((((c) - (int32_t)(RB)) * (float)(CR)) / \
+ (float)(((RW) - (RB) != 0) ? ((RW) - (RB)) : 1))
+/* !((f)>=(min)) written that way to deal with NaN */
+#define CLAMP(f, min, max) \
+ ((!((f) >= (min))) ? (min) : (f) > (max) ? (max) : (f))
+#define HICLAMP(f, max) ((f) > (max) ? (max) : (f))
+
+void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *ycbcr, uint32_t Y, int32_t Cb, int32_t Cr,
+ uint32_t *r, uint32_t *g, uint32_t *b)
{
- int32 i;
-
- /* XXX: Only 8-bit YCbCr input supported for now */
- Y = HICLAMP(Y, 255);
- Cb = CLAMP(Cb, 0, 255);
- Cr = CLAMP(Cr, 0, 255);
-
- i = ycbcr->Y_tab[Y] + ycbcr->Cr_r_tab[Cr];
- *r = CLAMP(i, 0, 255);
- i = ycbcr->Y_tab[Y]
- + (int)((ycbcr->Cb_g_tab[Cb] + ycbcr->Cr_g_tab[Cr]) >> SHIFT);
- *g = CLAMP(i, 0, 255);
- i = ycbcr->Y_tab[Y] + ycbcr->Cb_b_tab[Cb];
- *b = CLAMP(i, 0, 255);
+ int32_t i;
+
+ /* XXX: Only 8-bit YCbCr input supported for now */
+ Y = HICLAMP(Y, 255);
+ Cb = CLAMP(Cb, 0, 255);
+ Cr = CLAMP(Cr, 0, 255);
+
+ i = ycbcr->Y_tab[Y] + ycbcr->Cr_r_tab[Cr];
+ *r = CLAMP(i, 0, 255);
+ i = ycbcr->Y_tab[Y] +
+ (int)((ycbcr->Cb_g_tab[Cb] + ycbcr->Cr_g_tab[Cr]) >> SHIFT);
+ *g = CLAMP(i, 0, 255);
+ i = ycbcr->Y_tab[Y] + ycbcr->Cb_b_tab[Cb];
+ *b = CLAMP(i, 0, 255);
}
/* Clamp function for sanitization purposes. Normally clamping should not */
/* occur for well behaved chroma and refBlackWhite coefficients */
static float CLAMPw(float v, float vmin, float vmax)
{
- if( v < vmin )
+ if (v < vmin)
{
/* printf("%f clamped to %f\n", v, vmin); */
return vmin;
}
- if( v > vmax )
+ if (v > vmax)
{
/* printf("%f clamped to %f\n", v, vmax); */
return vmax;
@@ -230,78 +248,75 @@ static float CLAMPw(float v, float vmin, float vmax)
* pre-calculating possible values indexed by Cb and Cr (this code
* assumes conversion is being done for 8-bit samples).
*/
-int
-TIFFYCbCrToRGBInit(TIFFYCbCrToRGB* ycbcr, float *luma, float *refBlackWhite)
+int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB *ycbcr, float *luma, float *refBlackWhite)
{
- TIFFRGBValue* clamptab;
+ TIFFRGBValue *clamptab;
int i;
-
-#define LumaRed luma[0]
-#define LumaGreen luma[1]
-#define LumaBlue luma[2]
-
- clamptab = (TIFFRGBValue*)(
- (uint8*) ycbcr+TIFFroundup_32(sizeof (TIFFYCbCrToRGB), sizeof (long)));
- _TIFFmemset(clamptab, 0, 256); /* v < 0 => 0 */
+
+#define LumaRed luma[0]
+#define LumaGreen luma[1]
+#define LumaBlue luma[2]
+
+ clamptab =
+ (TIFFRGBValue *)((uint8_t *)ycbcr +
+ TIFFroundup_32(sizeof(TIFFYCbCrToRGB), sizeof(long)));
+ _TIFFmemset(clamptab, 0, 256); /* v < 0 => 0 */
ycbcr->clamptab = (clamptab += 256);
for (i = 0; i < 256; i++)
- clamptab[i] = (TIFFRGBValue) i;
- _TIFFmemset(clamptab+256, 255, 2*256); /* v > 255 => 255 */
- ycbcr->Cr_r_tab = (int*) (clamptab + 3*256);
+ clamptab[i] = (TIFFRGBValue)i;
+ _TIFFmemset(clamptab + 256, 255, 2 * 256); /* v > 255 => 255 */
+ ycbcr->Cr_r_tab = (int *)(clamptab + 3 * 256);
ycbcr->Cb_b_tab = ycbcr->Cr_r_tab + 256;
- ycbcr->Cr_g_tab = (int32*) (ycbcr->Cb_b_tab + 256);
+ ycbcr->Cr_g_tab = (int32_t *)(ycbcr->Cb_b_tab + 256);
ycbcr->Cb_g_tab = ycbcr->Cr_g_tab + 256;
ycbcr->Y_tab = ycbcr->Cb_g_tab + 256;
- { float f1 = 2-2*LumaRed; int32 D1 = FIX(CLAMP(f1,0.0F,2.0F));
- float f2 = LumaRed*f1/LumaGreen; int32 D2 = -FIX(CLAMP(f2,0.0F,2.0F));
- float f3 = 2-2*LumaBlue; int32 D3 = FIX(CLAMP(f3,0.0F,2.0F));
- float f4 = LumaBlue*f3/LumaGreen; int32 D4 = -FIX(CLAMP(f4,0.0F,2.0F));
- int x;
+ {
+ float f1 = 2 - 2 * LumaRed;
+ int32_t D1 = FIX(CLAMP(f1, 0.0F, 2.0F));
+ float f2 = LumaRed * f1 / LumaGreen;
+ int32_t D2 = -FIX(CLAMP(f2, 0.0F, 2.0F));
+ float f3 = 2 - 2 * LumaBlue;
+ int32_t D3 = FIX(CLAMP(f3, 0.0F, 2.0F));
+ float f4 = LumaBlue * f3 / LumaGreen;
+ int32_t D4 = -FIX(CLAMP(f4, 0.0F, 2.0F));
+ int x;
#undef LumaBlue
#undef LumaGreen
#undef LumaRed
-
- /*
- * i is the actual input pixel value in the range 0..255
- * Cb and Cr values are in the range -128..127 (actually
- * they are in a range defined by the ReferenceBlackWhite
- * tag) so there is some range shifting to do here when
- * constructing tables indexed by the raw pixel data.
- */
- for (i = 0, x = -128; i < 256; i++, x++) {
- int32 Cr = (int32)CLAMPw(Code2V(x, refBlackWhite[4] - 128.0F,
- refBlackWhite[5] - 128.0F, 127),
- -128.0F * 32, 128.0F * 32);
- int32 Cb = (int32)CLAMPw(Code2V(x, refBlackWhite[2] - 128.0F,
- refBlackWhite[3] - 128.0F, 127),
- -128.0F * 32, 128.0F * 32);
-
- ycbcr->Cr_r_tab[i] = (int32)((D1*Cr + ONE_HALF)>>SHIFT);
- ycbcr->Cb_b_tab[i] = (int32)((D3*Cb + ONE_HALF)>>SHIFT);
- ycbcr->Cr_g_tab[i] = D2*Cr;
- ycbcr->Cb_g_tab[i] = D4*Cb + ONE_HALF;
- ycbcr->Y_tab[i] =
- (int32)CLAMPw(Code2V(x + 128, refBlackWhite[0], refBlackWhite[1], 255),
- -128.0F * 32, 128.0F * 32);
- }
+
+ /*
+ * i is the actual input pixel value in the range 0..255
+ * Cb and Cr values are in the range -128..127 (actually
+ * they are in a range defined by the ReferenceBlackWhite
+ * tag) so there is some range shifting to do here when
+ * constructing tables indexed by the raw pixel data.
+ */
+ for (i = 0, x = -128; i < 256; i++, x++)
+ {
+ int32_t Cr = (int32_t)CLAMPw(Code2V(x, refBlackWhite[4] - 128.0F,
+ refBlackWhite[5] - 128.0F, 127),
+ -128.0F * 32, 128.0F * 32);
+ int32_t Cb = (int32_t)CLAMPw(Code2V(x, refBlackWhite[2] - 128.0F,
+ refBlackWhite[3] - 128.0F, 127),
+ -128.0F * 32, 128.0F * 32);
+
+ ycbcr->Cr_r_tab[i] = (int32_t)((D1 * Cr + ONE_HALF) >> SHIFT);
+ ycbcr->Cb_b_tab[i] = (int32_t)((D3 * Cb + ONE_HALF) >> SHIFT);
+ ycbcr->Cr_g_tab[i] = D2 * Cr;
+ ycbcr->Cb_g_tab[i] = D4 * Cb + ONE_HALF;
+ ycbcr->Y_tab[i] = (int32_t)CLAMPw(
+ Code2V(x + 128, refBlackWhite[0], refBlackWhite[1], 255),
+ -128.0F * 32, 128.0F * 32);
+ }
}
return 0;
}
-#undef HICLAMP
-#undef CLAMP
-#undef Code2V
-#undef SHIFT
-#undef ONE_HALF
-#undef FIX
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
+#undef HICLAMP
+#undef CLAMP
+#undef Code2V
+#undef SHIFT
+#undef ONE_HALF
+#undef FIX
diff --git a/src/3rdparty/libtiff/libtiff/tif_compress.c b/src/3rdparty/libtiff/libtiff/tif_compress.c
index 8130ef0..c6e17d3 100644
--- a/src/3rdparty/libtiff/libtiff/tif_compress.c
+++ b/src/3rdparty/libtiff/libtiff/tif_compress.c
@@ -2,23 +2,23 @@
* Copyright (c) 1988-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -29,145 +29,152 @@
*/
#include "tiffiop.h"
-static int
-TIFFNoEncode(TIFF* tif, const char* method)
+static int TIFFNoEncode(TIFF *tif, const char *method)
{
- const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression);
-
- if (c) {
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "%s %s encoding is not implemented",
- c->name, method);
- } else {
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "Compression scheme %u %s encoding is not implemented",
- tif->tif_dir.td_compression, method);
- }
- return (-1);
+ const TIFFCodec *c = TIFFFindCODEC(tif->tif_dir.td_compression);
+
+ if (c)
+ {
+ TIFFErrorExtR(tif, tif->tif_name, "%s %s encoding is not implemented",
+ c->name, method);
+ }
+ else
+ {
+ TIFFErrorExtR(tif, tif->tif_name,
+ "Compression scheme %" PRIu16
+ " %s encoding is not implemented",
+ tif->tif_dir.td_compression, method);
+ }
+ return (-1);
}
-int
-_TIFFNoRowEncode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s)
+int _TIFFNoRowEncode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
{
- (void) pp; (void) cc; (void) s;
- return (TIFFNoEncode(tif, "scanline"));
+ (void)pp;
+ (void)cc;
+ (void)s;
+ return (TIFFNoEncode(tif, "scanline"));
}
-int
-_TIFFNoStripEncode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s)
+int _TIFFNoStripEncode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
{
- (void) pp; (void) cc; (void) s;
- return (TIFFNoEncode(tif, "strip"));
+ (void)pp;
+ (void)cc;
+ (void)s;
+ return (TIFFNoEncode(tif, "strip"));
}
-int
-_TIFFNoTileEncode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s)
+int _TIFFNoTileEncode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
{
- (void) pp; (void) cc; (void) s;
- return (TIFFNoEncode(tif, "tile"));
+ (void)pp;
+ (void)cc;
+ (void)s;
+ return (TIFFNoEncode(tif, "tile"));
}
-static int
-TIFFNoDecode(TIFF* tif, const char* method)
+static int TIFFNoDecode(TIFF *tif, const char *method)
{
- const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression);
-
- if (c)
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "%s %s decoding is not implemented",
- c->name, method);
- else
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "Compression scheme %u %s decoding is not implemented",
- tif->tif_dir.td_compression, method);
- return (0);
+ const TIFFCodec *c = TIFFFindCODEC(tif->tif_dir.td_compression);
+
+ if (c)
+ TIFFErrorExtR(tif, tif->tif_name, "%s %s decoding is not implemented",
+ c->name, method);
+ else
+ TIFFErrorExtR(tif, tif->tif_name,
+ "Compression scheme %" PRIu16
+ " %s decoding is not implemented",
+ tif->tif_dir.td_compression, method);
+ return (0);
}
-static int
-_TIFFNoFixupTags(TIFF* tif)
+static int _TIFFNoFixupTags(TIFF *tif)
{
- (void) tif;
- return (1);
+ (void)tif;
+ return (1);
}
-int
-_TIFFNoRowDecode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s)
+int _TIFFNoRowDecode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
{
- (void) pp; (void) cc; (void) s;
- return (TIFFNoDecode(tif, "scanline"));
+ (void)pp;
+ (void)cc;
+ (void)s;
+ return (TIFFNoDecode(tif, "scanline"));
}
-int
-_TIFFNoStripDecode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s)
+int _TIFFNoStripDecode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
{
- (void) pp; (void) cc; (void) s;
- return (TIFFNoDecode(tif, "strip"));
+ (void)pp;
+ (void)cc;
+ (void)s;
+ return (TIFFNoDecode(tif, "strip"));
}
-int
-_TIFFNoTileDecode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s)
+int _TIFFNoTileDecode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
{
- (void) pp; (void) cc; (void) s;
- return (TIFFNoDecode(tif, "tile"));
+ (void)pp;
+ (void)cc;
+ (void)s;
+ return (TIFFNoDecode(tif, "tile"));
}
-int
-_TIFFNoSeek(TIFF* tif, uint32 off)
+int _TIFFNoSeek(TIFF *tif, uint32_t off)
{
- (void) off;
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "Compression algorithm does not support random access");
- return (0);
+ (void)off;
+ TIFFErrorExtR(tif, tif->tif_name,
+ "Compression algorithm does not support random access");
+ return (0);
}
-int
-_TIFFNoPreCode(TIFF* tif, uint16 s)
+int _TIFFNoPreCode(TIFF *tif, uint16_t s)
{
- (void) tif; (void) s;
- return (1);
+ (void)tif;
+ (void)s;
+ return (1);
}
-static int _TIFFtrue(TIFF* tif) { (void) tif; return (1); }
-static void _TIFFvoid(TIFF* tif) { (void) tif; }
-
-void
-_TIFFSetDefaultCompressionState(TIFF* tif)
+static int _TIFFtrue(TIFF *tif)
{
- tif->tif_fixuptags = _TIFFNoFixupTags;
- tif->tif_decodestatus = TRUE;
- tif->tif_setupdecode = _TIFFtrue;
- tif->tif_predecode = _TIFFNoPreCode;
- tif->tif_decoderow = _TIFFNoRowDecode;
- tif->tif_decodestrip = _TIFFNoStripDecode;
- tif->tif_decodetile = _TIFFNoTileDecode;
- tif->tif_encodestatus = TRUE;
- tif->tif_setupencode = _TIFFtrue;
- tif->tif_preencode = _TIFFNoPreCode;
- tif->tif_postencode = _TIFFtrue;
- tif->tif_encoderow = _TIFFNoRowEncode;
- tif->tif_encodestrip = _TIFFNoStripEncode;
- tif->tif_encodetile = _TIFFNoTileEncode;
- tif->tif_close = _TIFFvoid;
- tif->tif_seek = _TIFFNoSeek;
- tif->tif_cleanup = _TIFFvoid;
- tif->tif_defstripsize = _TIFFDefaultStripSize;
- tif->tif_deftilesize = _TIFFDefaultTileSize;
- tif->tif_flags &= ~(TIFF_NOBITREV|TIFF_NOREADRAW);
+ (void)tif;
+ return (1);
}
+static void _TIFFvoid(TIFF *tif) { (void)tif; }
-int
-TIFFSetCompressionScheme(TIFF* tif, int scheme)
+void _TIFFSetDefaultCompressionState(TIFF *tif)
{
- const TIFFCodec *c = TIFFFindCODEC((uint16) scheme);
+ tif->tif_fixuptags = _TIFFNoFixupTags;
+ tif->tif_decodestatus = TRUE;
+ tif->tif_setupdecode = _TIFFtrue;
+ tif->tif_predecode = _TIFFNoPreCode;
+ tif->tif_decoderow = _TIFFNoRowDecode;
+ tif->tif_decodestrip = _TIFFNoStripDecode;
+ tif->tif_decodetile = _TIFFNoTileDecode;
+ tif->tif_encodestatus = TRUE;
+ tif->tif_setupencode = _TIFFtrue;
+ tif->tif_preencode = _TIFFNoPreCode;
+ tif->tif_postencode = _TIFFtrue;
+ tif->tif_encoderow = _TIFFNoRowEncode;
+ tif->tif_encodestrip = _TIFFNoStripEncode;
+ tif->tif_encodetile = _TIFFNoTileEncode;
+ tif->tif_close = _TIFFvoid;
+ tif->tif_seek = _TIFFNoSeek;
+ tif->tif_cleanup = _TIFFvoid;
+ tif->tif_defstripsize = _TIFFDefaultStripSize;
+ tif->tif_deftilesize = _TIFFDefaultTileSize;
+ tif->tif_flags &= ~(TIFF_NOBITREV | TIFF_NOREADRAW);
+}
- _TIFFSetDefaultCompressionState(tif);
- /*
- * Don't treat an unknown compression scheme as an error.
- * This permits applications to open files with data that
- * the library does not have builtin support for, but which
- * may still be meaningful.
- */
- return (c ? (*c->init)(tif, scheme) : 1);
+int TIFFSetCompressionScheme(TIFF *tif, int scheme)
+{
+ const TIFFCodec *c = TIFFFindCODEC((uint16_t)scheme);
+
+ _TIFFSetDefaultCompressionState(tif);
+ /*
+ * Don't treat an unknown compression scheme as an error.
+ * This permits applications to open files with data that
+ * the library does not have builtin support for, but which
+ * may still be meaningful.
+ */
+ return (c ? (*c->init)(tif, scheme) : 1);
}
/*
@@ -175,64 +182,68 @@ TIFFSetCompressionScheme(TIFF* tif, int scheme)
* schemes can also override the builtin versions provided
* by this library.
*/
-typedef struct _codec {
- struct _codec* next;
- TIFFCodec* info;
+typedef struct _codec
+{
+ struct _codec *next;
+ TIFFCodec *info;
} codec_t;
-static codec_t* registeredCODECS = NULL;
+static codec_t *registeredCODECS = NULL;
-const TIFFCodec*
-TIFFFindCODEC(uint16 scheme)
+const TIFFCodec *TIFFFindCODEC(uint16_t scheme)
{
- const TIFFCodec* c;
- codec_t* cd;
-
- for (cd = registeredCODECS; cd; cd = cd->next)
- if (cd->info->scheme == scheme)
- return ((const TIFFCodec*) cd->info);
- for (c = _TIFFBuiltinCODECS; c->name; c++)
- if (c->scheme == scheme)
- return (c);
- return ((const TIFFCodec*) 0);
+ const TIFFCodec *c;
+ codec_t *cd;
+
+ for (cd = registeredCODECS; cd; cd = cd->next)
+ if (cd->info->scheme == scheme)
+ return ((const TIFFCodec *)cd->info);
+ for (c = _TIFFBuiltinCODECS; c->name; c++)
+ if (c->scheme == scheme)
+ return (c);
+ return ((const TIFFCodec *)0);
}
-TIFFCodec*
-TIFFRegisterCODEC(uint16 scheme, const char* name, TIFFInitMethod init)
+TIFFCodec *TIFFRegisterCODEC(uint16_t scheme, const char *name,
+ TIFFInitMethod init)
{
- codec_t* cd = (codec_t*)
- _TIFFmalloc((tmsize_t)(sizeof (codec_t) + sizeof (TIFFCodec) + strlen(name)+1));
-
- if (cd != NULL) {
- cd->info = (TIFFCodec*) ((uint8*) cd + sizeof (codec_t));
- cd->info->name = (char*)
- ((uint8*) cd->info + sizeof (TIFFCodec));
- strcpy(cd->info->name, name);
- cd->info->scheme = scheme;
- cd->info->init = init;
- cd->next = registeredCODECS;
- registeredCODECS = cd;
- } else {
- TIFFErrorExt(0, "TIFFRegisterCODEC",
- "No space to register compression scheme %s", name);
- return NULL;
- }
- return (cd->info);
+ codec_t *cd = (codec_t *)_TIFFmallocExt(
+ NULL,
+ (tmsize_t)(sizeof(codec_t) + sizeof(TIFFCodec) + strlen(name) + 1));
+
+ if (cd != NULL)
+ {
+ cd->info = (TIFFCodec *)((uint8_t *)cd + sizeof(codec_t));
+ cd->info->name = (char *)((uint8_t *)cd->info + sizeof(TIFFCodec));
+ strcpy(cd->info->name, name);
+ cd->info->scheme = scheme;
+ cd->info->init = init;
+ cd->next = registeredCODECS;
+ registeredCODECS = cd;
+ }
+ else
+ {
+ TIFFErrorExt(0, "TIFFRegisterCODEC",
+ "No space to register compression scheme %s", name);
+ return NULL;
+ }
+ return (cd->info);
}
-void
-TIFFUnRegisterCODEC(TIFFCodec* c)
+void TIFFUnRegisterCODEC(TIFFCodec *c)
{
- codec_t* cd;
- codec_t** pcd;
-
- for (pcd = &registeredCODECS; (cd = *pcd) != NULL; pcd = &cd->next)
- if (cd->info == c) {
- *pcd = cd->next;
- _TIFFfree(cd);
- return;
- }
- TIFFErrorExt(0, "TIFFUnRegisterCODEC",
- "Cannot remove compression scheme %s; not registered", c->name);
+ codec_t *cd;
+ codec_t **pcd;
+
+ for (pcd = &registeredCODECS; (cd = *pcd) != NULL; pcd = &cd->next)
+ if (cd->info == c)
+ {
+ *pcd = cd->next;
+ _TIFFfreeExt(NULL, cd);
+ return;
+ }
+ TIFFErrorExt(0, "TIFFUnRegisterCODEC",
+ "Cannot remove compression scheme %s; not registered",
+ c->name);
}
/************************************************************************/
@@ -242,61 +253,58 @@ TIFFUnRegisterCODEC(TIFFCodec* c)
/**
* Get list of configured codecs, both built-in and registered by user.
* Caller is responsible to free this structure.
- *
+ *
* @return returns array of TIFFCodec records (the last record should be NULL)
* or NULL if function failed.
*/
-TIFFCodec*
-TIFFGetConfiguredCODECs()
+TIFFCodec *TIFFGetConfiguredCODECs()
{
- int i = 1;
- codec_t *cd;
- const TIFFCodec* c;
- TIFFCodec* codecs = NULL;
- TIFFCodec* new_codecs;
-
- for (cd = registeredCODECS; cd; cd = cd->next) {
- new_codecs = (TIFFCodec *)
- _TIFFrealloc(codecs, i * sizeof(TIFFCodec));
- if (!new_codecs) {
- _TIFFfree (codecs);
- return NULL;
- }
- codecs = new_codecs;
- _TIFFmemcpy(codecs + i - 1, cd, sizeof(TIFFCodec));
- i++;
- }
- for (c = _TIFFBuiltinCODECS; c->name; c++) {
- if (TIFFIsCODECConfigured(c->scheme)) {
- new_codecs = (TIFFCodec *)
- _TIFFrealloc(codecs, i * sizeof(TIFFCodec));
- if (!new_codecs) {
- _TIFFfree (codecs);
- return NULL;
- }
- codecs = new_codecs;
- _TIFFmemcpy(codecs + i - 1, (const void*)c, sizeof(TIFFCodec));
- i++;
- }
- }
-
- new_codecs = (TIFFCodec *) _TIFFrealloc(codecs, i * sizeof(TIFFCodec));
- if (!new_codecs) {
- _TIFFfree (codecs);
- return NULL;
- }
- codecs = new_codecs;
- _TIFFmemset(codecs + i - 1, 0, sizeof(TIFFCodec));
-
- return codecs;
+ int i = 1;
+ codec_t *cd;
+ const TIFFCodec *c;
+ TIFFCodec *codecs = NULL;
+ TIFFCodec *new_codecs;
+
+ for (cd = registeredCODECS; cd; cd = cd->next)
+ {
+ new_codecs =
+ (TIFFCodec *)_TIFFreallocExt(NULL, codecs, i * sizeof(TIFFCodec));
+ if (!new_codecs)
+ {
+ _TIFFfreeExt(NULL, codecs);
+ return NULL;
+ }
+ codecs = new_codecs;
+ _TIFFmemcpy(codecs + i - 1, cd->info, sizeof(TIFFCodec));
+ i++;
+ }
+ for (c = _TIFFBuiltinCODECS; c->name; c++)
+ {
+ if (TIFFIsCODECConfigured(c->scheme))
+ {
+ new_codecs = (TIFFCodec *)_TIFFreallocExt(NULL, codecs,
+ i * sizeof(TIFFCodec));
+ if (!new_codecs)
+ {
+ _TIFFfreeExt(NULL, codecs);
+ return NULL;
+ }
+ codecs = new_codecs;
+ _TIFFmemcpy(codecs + i - 1, (const void *)c, sizeof(TIFFCodec));
+ i++;
+ }
+ }
+
+ new_codecs =
+ (TIFFCodec *)_TIFFreallocExt(NULL, codecs, i * sizeof(TIFFCodec));
+ if (!new_codecs)
+ {
+ _TIFFfreeExt(NULL, codecs);
+ return NULL;
+ }
+ codecs = new_codecs;
+ _TIFFmemset(codecs + i - 1, 0, sizeof(TIFFCodec));
+
+ return codecs;
}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_config.h b/src/3rdparty/libtiff/libtiff/tif_config.h
index 73c602f..78f6669 100644
--- a/src/3rdparty/libtiff/libtiff/tif_config.h
+++ b/src/3rdparty/libtiff/libtiff/tif_config.h
@@ -2,20 +2,18 @@
Configuration defines for Qt.
*/
-#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)
-#define _CRT_SECURE_NO_WARNINGS
-#endif
+#include "tiffconf.h"
-#include <qglobal.h>
#if defined(Q_OS_WINCE)
-# include <qfunctions_wince.h>
+#include <qfunctions_wince.h>
#endif
-/* Define if building universal (internal helper macro) */
-/* #undef AC_APPLE_UNIVERSAL_BUILD */
+#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)
+#define _CRT_SECURE_NO_WARNINGS
+#endif
/* Support CCITT Group 3 & 4 algorithms */
-/* #undef CCITT_SUPPORT */
+#define CCITT_SUPPORT 1
/* Pick up YCbCr subsampling info from the JPEG data stream to support files
lacking the tag (default enabled). */
@@ -25,12 +23,7 @@
/* #undef CHUNKY_STRIP_READ_SUPPORT */
/* Support C++ stream API (requires C++ compiler) */
-/* #undef CXX_SUPPORT */
-
-/* Treat extra sample as alpha (default enabled). The RGBA interface will
- treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many
- packages produce RGBA files but don't mark the alpha properly. */
-/* #undef DEFAULT_EXTRASAMPLE_AS_ALPHA */
+/* #undef CXX_SUPPORT 1 */
/* enable deferred strip/tile offset/size loading */
/* #undef DEFER_STRILE_LOAD */
@@ -42,17 +35,11 @@
*/
#define HAVE_DECL_OPTARG 0
-/* Define to 1 if you have the <dlfcn.h> header file. */
-/* #undef HAVE_DLFCN_H */
-
/* Define to 1 if you have the <fcntl.h> header file. */
#if !defined(Q_OS_WINCE)
#define HAVE_FCNTL_H 1
#endif
-/* Define to 1 if you have the `floor' function. */
-/* #undef HAVE_FLOOR */
-
/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
/* #undef HAVE_FSEEKO */
@@ -71,58 +58,12 @@
/* Define to 1 if you have the <GL/gl.h> header file. */
/* #undef HAVE_GL_GL_H */
-/* Define as 0 or 1 according to the floating point format suported by the
- machine */
-/* #undef HAVE_IEEEFP */
-
-/* Define to 1 if the system has the type `int16'. */
-#ifdef Q_OS_AIX
-#define HAVE_INT16 1
-#endif
-
-/* Define to 1 if the system has the type `int32'. */
-#ifdef Q_OS_AIX
-#define HAVE_INT32 1
-#endif
-
-/* Define to 1 if the system has the type `int8'. */
-#ifdef Q_OS_AIX
-#define HAVE_INT8 1
-#endif
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-/* #undef HAVE_INTTYPES_H */
-
/* Define to 1 if you have the <io.h> header file. */
/* #undef HAVE_IO_H */
-/* Define to 1 if you have the `isascii' function. */
-/* #undef HAVE_ISASCII */
-
/* Define to 1 if you have the `jbg_newlen' function. */
/* #undef HAVE_JBG_NEWLEN */
-/* Define to 1 if you have the `lfind' function. */
-/* #undef HAVE_LFIND */
-
-/* Define to 1 if you have the `c' library (-lc). */
-/* #undef HAVE_LIBC */
-
-/* Define to 1 if you have the <limits.h> header file. */
-/* #undef HAVE_LIMITS_H */
-
-/* Define to 1 if you have the <malloc.h> header file. */
-/* #undef HAVE_MALLOC_H */
-
-/* Define to 1 if you have the `memmove' function. */
-/* #undef HAVE_MEMMOVE */
-
-/* Define to 1 if you have the <memory.h> header file. */
-/* #undef HAVE_MEMORY_H */
-
-/* Define to 1 if you have the `memset' function. */
-/* #undef HAVE_MEMSET */
-
/* Define to 1 if you have the `mmap' function. */
/* #undef HAVE_MMAP */
@@ -132,67 +73,15 @@
/* Define to 1 if you have the <OpenGL/gl.h> header file. */
/* #undef HAVE_OPENGL_GL_H */
-/* Define to 1 if you have the `pow' function. */
-/* #undef HAVE_POW */
-
-/* Define if you have POSIX threads libraries and header files. */
-/* #undef HAVE_PTHREAD */
-
-/* Define to 1 if you have the <search.h> header file. */
-#if !defined(Q_OS_WINCE) && !defined(Q_OS_VXWORKS) && !defined(Q_OS_ANDROID) && !defined(Q_OS_INTEGRITY)
-#define HAVE_SEARCH_H 1
-#endif
-
/* Define to 1 if you have the `setmode' function. */
/* #undef HAVE_SETMODE */
/* Define to 1 if you have the `snprintf' function. */
-#if defined(snprintf) || (!defined(_MSC_VER) || _MSC_VER >= 1900)
-#define HAVE_SNPRINTF 1
-#endif
-
-/* Define to 1 if you have the `sqrt' function. */
-/* #undef HAVE_SQRT */
-
-/* Define to 1 if you have the <stdint.h> header file. */
-/* #undef HAVE_STDINT_H */
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-/* #undef HAVE_STDLIB_H */
-
-/* Define to 1 if you have the `strcasecmp' function. */
-/* #undef HAVE_STRCASECMP */
-
-/* Define to 1 if you have the `strchr' function. */
-/* #undef HAVE_STRCHR */
+/* #undef HAVE_SNPRINTF */
/* Define to 1 if you have the <strings.h> header file. */
/* #undef HAVE_STRINGS_H */
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the `strrchr' function. */
-/* #undef HAVE_STRRCHR */
-
-/* Define to 1 if you have the `strstr' function. */
-/* #undef HAVE_STRSTR */
-
-/* Define to 1 if you have the `strtol' function. */
-/* #undef HAVE_STRTOL */
-
-/* Define to 1 if you have the `strtoul' function. */
-/* #undef HAVE_STRTOUL */
-
-/* Define to 1 if you have the `strtoull' function. */
-/* #undef HAVE_STRTOULL */
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-/* #undef HAVE_SYS_STAT_H */
-
-/* Define to 1 if you have the <sys/time.h> header file. */
-/* #undef HAVE_SYS_TIME_H */
-
/* Define to 1 if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
@@ -201,52 +90,18 @@
#define HAVE_UNISTD_H 1
#endif
-/* Use nonstandard varargs form for the GLU tesselator callback */
-/* #undef HAVE_VARARGS_GLU_TESSCB */
-
-/* Define to 1 if you have the <windows.h> header file. */
-/* #undef HAVE_WINDOWS_H */
-
-/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian
- (Intel) */
-/* #undef HOST_BIGENDIAN */
-
-/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */
-/* #undef HOST_FILLORDER FILLORDER_LSB2MSB */
-
-/* Support ISO JBIG compression (requires JBIG-KIT library) */
-/* #undef JBIG_SUPPORT */
-
/* 8/12 bit libjpeg dual mode enabled */
/* #undef JPEG_DUAL_MODE_8_12 */
-/* Support JPEG compression (requires IJG JPEG library) */
-/* #undef JPEG_SUPPORT */
+/* Support LERC compression */
+/* #undef LERC_SUPPORT */
/* 12bit libjpeg primary include file with path */
/* #undef LIBJPEG_12_PATH */
-/* Support LogLuv high dynamic range encoding */
-/* #undef LOGLUV_SUPPORT */
-
-/* Define to the sub-directory where libtool stores uninstalled libraries. */
-/* #undef LT_OBJDIR */
-
/* Support LZMA2 compression */
/* #undef LZMA_SUPPORT */
-/* Support LZW algorithm */
-/* #undef LZW_SUPPORT */
-
-/* Support Microsoft Document Imaging format */
-/* #undef MDI_SUPPORT */
-
-/* Support NeXT 2-bit RLE algorithm */
-/* #undef NEXT_SUPPORT */
-
-/* Support Old JPEG compresson (read-only) */
-/* #undef OJPEG_SUPPORT */
-
/* Name of package */
/* #undef PACKAGE */
@@ -266,154 +121,51 @@
/* #undef PACKAGE_URL */
/* Define to the version of this package. */
-#define PACKAGE_VERSION "4.0.9"
-
-/* Support Macintosh PackBits algorithm */
-/* #undef PACKBITS_SUPPORT */
-
-/* Support Pixar log-format algorithm (requires Zlib) */
-/* #undef PIXARLOG_SUPPORT */
-
-/* Define to necessary symbol if this constant uses a non-standard name on
- your system. */
-/* #undef PTHREAD_CREATE_JOINABLE */
-
-/* The size of `signed int', as computed by sizeof. */
-/* #undef SIZEOF_SIGNED_INT */
-
-/* The size of `signed long', as computed by sizeof. */
-/* #undef SIZEOF_SIGNED_LONG */
-
-/* The size of `signed long long', as computed by sizeof. */
-/* #undef SIZEOF_SIGNED_LONG_LONG */
-
-/* The size of `signed short', as computed by sizeof. */
-/* #undef SIZEOF_SIGNED_SHORT */
+/* #undef PACKAGE_VERSION */
/* The size of `size_t', as computed by sizeof. */
-/* #undef SIZEOF_SIZE_T */
-
-/* The size of `unsigned char *', as computed by sizeof. */
-/* #undef SIZEOF_UNSIGNED_CHAR_P */
-
-/* The size of `unsigned int', as computed by sizeof. */
-/* #undef SIZEOF_UNSIGNED_INT */
-
-/* The size of `unsigned long', as computed by sizeof. */
-/* #undef SIZEOF_UNSIGNED_LONG */
-
-/* The size of `unsigned long long', as computed by sizeof. */
-/* #undef SIZEOF_UNSIGNED_LONG_LONG */
-
-/* The size of `unsigned short', as computed by sizeof. */
-/* #undef SIZEOF_UNSIGNED_SHORT */
-
-/* Define to 1 if you have the ANSI C header files. */
-/* #undef STDC_HEADERS */
-
-/* Support strip chopping (whether or not to convert single-strip uncompressed
- images to mutiple strips of specified size to reduce memory usage) */
-/* #undef STRIPCHOP_DEFAULT TIFF_STRIPCHOP */
+#if SIZE_MAX == 0xffffffff
+#define SIZEOF_SIZE_T 4
+#elif SIZE_MAX == 0xffffffffffffffff
+#define SIZEOF_SIZE_T 8
+#endif
/* Default size of the strip in bytes (when strip chopping enabled) */
/* #undef STRIP_SIZE_DEFAULT */
-/* Enable SubIFD tag (330) support */
-/* #undef SUBIFD_SUPPORT */
-
-/* Support ThunderScan 4-bit RLE algorithm */
-/* #undef THUNDER_SUPPORT */
-
-/* Signed 16-bit type */
-/* #undef TIFF_INT16_T qint16 */
-
-/* Signed 32-bit type formatter */
-#define TIFF_INT32_FORMAT "%d"
-
-/* Signed 32-bit type */
-/* #undef TIFF_INT32_T qint32 */
-
-/* Signed 64-bit type formatter */
-#define TIFF_INT64_FORMAT "%lld"
-
-/* Signed 64-bit type */
-/* #undef TIFF_INT64_T qint64 */
-
-/* Signed 8-bit type */
-/* #undef TIFF_INT8_T qint8 */
-
-/* Pointer difference type formatter */
-#define TIFF_PTRDIFF_FORMAT "%ld"
-
-/* Pointer difference type */
-#define TIFF_PTRDIFF_T ptrdiff_t
-
-/* Size type formatter */
-/* #undef TIFF_SIZE_FORMAT */
-
-/* Unsigned size type */
-/* #undef TIFF_SIZE_T */
-
-/* Signed size type formatter */
-#if QT_POINTER_SIZE == 4
-#define TIFF_SSIZE_FORMAT "%ld"
-#else
-#define TIFF_SSIZE_FORMAT "%lld"
-#endif
-
-/* Signed size type */
-/* #undef TIFF_SSIZE_T qint64 */
-
-/* Unsigned 16-bit type */
-/* #undef TIFF_UINT16_T quint16 */
-
-/* Unsigned 32-bit type formatter */
-#define TIFF_UINT32_FORMAT "%u"
-
-/* Unsigned 32-bit type */
-/* #undef TIFF_UINT32_T quint32 */
-
-/* Unsigned 64-bit type formatter */
-#define TIFF_UINT64_FORMAT "%llu"
-
-/* Unsigned 64-bit type */
-/* #undef TIFF_UINT64_T quint64 */
-
-/* Unsigned 8-bit type */
-/* #undef TIFF_UINT8_T quint8 */
-
-/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
-/* #undef TIME_WITH_SYS_TIME */
-
-/* Define to 1 if your <sys/time.h> declares `struct tm'. */
-/* #undef TM_IN_SYS_TIME */
+/* Maximum number of TIFF IFDs that libtiff can iterate through in a file. */
+/* #undef TIFF_MAX_DIR_COUNT */
/* define to use win32 IO system */
-#ifdef Q_OS_WIN
-#define USE_WIN32_FILEIO 1
-#endif
+/* #undef USE_WIN32_FILEIO */
/* Version number of package */
-/* #undef VERSION */
+#define VERSION "4.5.0"
+
+/* Support webp compression */
+/* #undef WEBP_SUPPORT */
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
significant byte first (like Motorola and SPARC, unlike Intel). */
-#if (Q_BYTE_ORDER == Q_BIG_ENDIAN)
-#define WORDS_BIGENDIAN 1
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+# define WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef WORDS_BIGENDIAN
+# if (Q_BYTE_ORDER == Q_BIG_ENDIAN)
+# define WORDS_BIGENDIAN 1
+# endif
+# endif
#endif
-/* Define to 1 if the X Window System is missing or not being used. */
-/* #undef X_DISPLAY_MISSING */
-
-/* Support Deflate compression */
-/* #undef ZIP_SUPPORT */
+/* Support zstd compression */
+/* #undef ZSTD_SUPPORT */
/* Enable large inode numbers on Mac OS X 10.5. */
-#if defined(Q_OS_MAC)
#ifndef _DARWIN_USE_64_BIT_INODE
# define _DARWIN_USE_64_BIT_INODE 1
#endif
-#endif
/* Number of bits in a file offset, on hosts where this is settable. */
/* #undef _FILE_OFFSET_BITS */
@@ -424,25 +176,19 @@
/* Define for large files, on AIX-style hosts. */
/* #undef _LARGE_FILES */
-/* Define to empty if `const' does not conform to ANSI C. */
-/* #undef const */
-
-/* Define to `__inline__' or `__inline' if that's what the C compiler
- calls it, or to nothing if 'inline' is not supported under any name. */
-#if defined(Q_CC_MSVC)
-#ifndef __cplusplus
-# ifndef inline
-# define inline __inline
-# endif
-#endif
-#endif
-
-/* Define to `long int' if <sys/types.h> does not define. */
-/* #undef off_t */
-
-/* Define to `unsigned int' if <sys/types.h> does not define. */
-/* #undef size_t */
-
-#ifdef Q_OS_WIN
-#define TIF_PLATFORM_CONSOLE
+#if !defined(__MINGW32__)
+# define TIFF_SIZE_FORMAT "zu"
+#endif
+#if SIZEOF_SIZE_T == 8
+# define TIFF_SSIZE_FORMAT "lld"
+# if defined(__MINGW32__)
+# define TIFF_SIZE_FORMAT "llu"
+# endif
+#elif SIZEOF_SIZE_T == 4
+# define TIFF_SSIZE_FORMAT "d"
+# if defined(__MINGW32__)
+# define TIFF_SIZE_FORMAT "u"
+# endif
+#else
+# error "Unsupported size_t size; please submit a bug report"
#endif
diff --git a/src/3rdparty/libtiff/libtiff/tif_config.h-vms b/src/3rdparty/libtiff/libtiff/tif_config.h-vms
deleted file mode 100644
index d653bd8..0000000
--- a/src/3rdparty/libtiff/libtiff/tif_config.h-vms
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Define to 1 if you have the <assert.h> header file. */
-#define HAVE_ASSERT_H 1
-
-/* Define to 1 if you have the <fcntl.h> header file. */
-#define HAVE_FCNTL_H 1
-
-/* Define as 0 or 1 according to the floating point format suported by the
- machine */
-#define HAVE_IEEEFP 1
-
-#define HAVE_UNISTD_H 1
-
-#define HAVE_STRING_H 1
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define to 1 if you have the <io.h> header file. */
-//#define HAVE_IO_H 1
-
-/* Define to 1 if you have the <search.h> header file. */
-//#define HAVE_SEARCH_H 1
-
-/* The size of a `int', as computed by sizeof. */
-#define SIZEOF_INT 4
-
-/* The size of a `long', as computed by sizeof. */
-#define SIZEOF_LONG 4
-
-/* Set the native cpu bit order */
-#define HOST_FILLORDER FILLORDER_LSB2MSB
-
-/* Define to 1 if your processor stores words with the most significant byte
- first (like Motorola and SPARC, unlike Intel and VAX). */
-/* #undef WORDS_BIGENDIAN */
-
-/* Define to `__inline__' or `__inline' if that's what the C compiler
- calls it, or to nothing if 'inline' is not supported under any name. */
-/*
-#ifndef __cplusplus
-# ifndef inline
-# define inline __inline
-# endif
-#endif
-*/
-
-// #define lfind _lfind
diff --git a/src/3rdparty/libtiff/libtiff/tif_config.h.cmake.in b/src/3rdparty/libtiff/libtiff/tif_config.h.cmake.in
new file mode 100644
index 0000000..570e4e1
--- /dev/null
+++ b/src/3rdparty/libtiff/libtiff/tif_config.h.cmake.in
@@ -0,0 +1,158 @@
+/* libtiff/tif_config.h.cmake.in. Not generated, but originated from autoheader. */
+/* This file must be kept up-to-date with needed substitutions from libtiff/tif_config.h.in. */
+
+#include "tiffconf.h"
+
+/* Support CCITT Group 3 & 4 algorithms */
+#cmakedefine CCITT_SUPPORT 1
+
+/* Pick up YCbCr subsampling info from the JPEG data stream to support files
+ lacking the tag (default enabled). */
+#cmakedefine CHECK_JPEG_YCBCR_SUBSAMPLING 1
+
+/* enable partial strip reading for large strips (experimental) */
+#cmakedefine CHUNKY_STRIP_READ_SUPPORT 1
+
+/* Support C++ stream API (requires C++ compiler) */
+#cmakedefine CXX_SUPPORT 1
+
+/* enable deferred strip/tile offset/size loading (experimental) */
+#cmakedefine DEFER_STRILE_LOAD 1
+
+/* Define to 1 if you have the <assert.h> header file. */
+#cmakedefine HAVE_ASSERT_H 1
+
+/* Define to 1 if you have the declaration of `optarg', and to 0 if you don't. */
+#cmakedefine HAVE_DECL_OPTARG 1
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#cmakedefine HAVE_FCNTL_H 1
+
+/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
+#cmakedefine HAVE_FSEEKO 1
+
+/* Define to 1 if you have the `getopt' function. */
+#cmakedefine HAVE_GETOPT 1
+
+/* Define to 1 if you have the <GLUT/glut.h> header file. */
+#cmakedefine HAVE_GLUT_GLUT_H 1
+
+/* Define to 1 if you have the <GL/glut.h> header file. */
+#cmakedefine HAVE_GL_GLUT_H 1
+
+/* Define to 1 if you have the <GL/glu.h> header file. */
+#cmakedefine HAVE_GL_GLU_H 1
+
+/* Define to 1 if you have the <GL/gl.h> header file. */
+#cmakedefine HAVE_GL_GL_H 1
+
+/* Define to 1 if you have the <io.h> header file. */
+#cmakedefine HAVE_IO_H 1
+
+/* Define to 1 if you have the `jbg_newlen' function. */
+#cmakedefine HAVE_JBG_NEWLEN 1
+
+/* Define to 1 if you have the `mmap' function. */
+#cmakedefine HAVE_MMAP 1
+
+/* Define to 1 if you have the <OpenGL/glu.h> header file. */
+#cmakedefine HAVE_OPENGL_GLU_H 1
+
+/* Define to 1 if you have the <OpenGL/gl.h> header file. */
+#cmakedefine HAVE_OPENGL_GL_H 1
+
+/* Define to 1 if you have the `setmode' function. */
+#cmakedefine HAVE_SETMODE 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#cmakedefine HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#cmakedefine HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#cmakedefine HAVE_UNISTD_H 1
+
+/* 8/12 bit libjpeg dual mode enabled */
+#cmakedefine JPEG_DUAL_MODE_8_12 1 1
+
+/* Support LERC compression */
+#cmakedefine LERC_SUPPORT 1
+
+/* 12bit libjpeg primary include file with path */
+#define LIBJPEG_12_PATH "@LIBJPEG_12_PATH@"
+
+/* Support LZMA2 compression */
+#cmakedefine LZMA_SUPPORT 1
+
+/* Name of package */
+#define PACKAGE "@PACKAGE_NAME@"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "@PACKAGE_BUGREPORT@"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "@PACKAGE_NAME@"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "@PACKAGE_STRING@"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "@PACKAGE_TARNAME@"
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL "@PACKAGE_URL@"
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "@PACKAGE_VERSION@"
+
+/* Size of size_t */
+#define SIZEOF_SIZE_T @SIZEOF_SIZE_T@
+
+/* Default size of the strip in bytes (when strip chopping enabled) */
+#define STRIP_SIZE_DEFAULT @STRIP_SIZE_DEFAULT@
+
+/** Maximum number of TIFF IFDs that libtiff can iterate through in a file. */
+#define TIFF_MAX_DIR_COUNT @TIFF_MAX_DIR_COUNT@
+
+/* define to use win32 IO system */
+#cmakedefine USE_WIN32_FILEIO 1
+
+/* Version number of package */
+#define VERSION "@PACKAGE_VERSION@"
+
+/* Support WEBP compression */
+#cmakedefine WEBP_SUPPORT 1
+
+/* Support ZSTD compression */
+#cmakedefine ZSTD_SUPPORT 1
+
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+ significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+# define WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef WORDS_BIGENDIAN
+# undef WORDS_BIGENDIAN
+# endif
+#endif
+
+#if !defined(__MINGW32__)
+# define TIFF_SIZE_FORMAT "zu"
+#endif
+#if SIZEOF_SIZE_T == 8
+# define TIFF_SSIZE_FORMAT PRId64
+# if defined(__MINGW32__)
+# define TIFF_SIZE_FORMAT PRIu64
+# endif
+#elif SIZEOF_SIZE_T == 4
+# define TIFF_SSIZE_FORMAT PRId32
+# if defined(__MINGW32__)
+# define TIFF_SIZE_FORMAT PRIu32
+# endif
+#else
+# error "Unsupported size_t size; please submit a bug report"
+#endif
diff --git a/src/3rdparty/libtiff/libtiff/tif_config.h.in b/src/3rdparty/libtiff/libtiff/tif_config.h.in
index 523da3e..8fb78c3 100644
--- a/src/3rdparty/libtiff/libtiff/tif_config.h.in
+++ b/src/3rdparty/libtiff/libtiff/tif_config.h.in
@@ -1,7 +1,6 @@
-/* libtiff/tif_config.h.in. Generated from configure.ac by autoheader. */
+/* libtiff/tif_config.h.in. Not generated, but originated from autoheader. */
-/* Define if building universal (internal helper macro) */
-#undef AC_APPLE_UNIVERSAL_BUILD
+#include "tiffconf.h"
/* Support CCITT Group 3 & 4 algorithms */
#undef CCITT_SUPPORT
@@ -16,11 +15,6 @@
/* Support C++ stream API (requires C++ compiler) */
#undef CXX_SUPPORT
-/* Treat extra sample as alpha (default enabled). The RGBA interface will
- treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many
- packages produce RGBA files but don't mark the alpha properly. */
-#undef DEFAULT_EXTRASAMPLE_AS_ALPHA
-
/* enable deferred strip/tile offset/size loading */
#undef DEFER_STRILE_LOAD
@@ -31,9 +25,6 @@
*/
#undef HAVE_DECL_OPTARG
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#undef HAVE_DLFCN_H
-
/* Define to 1 if you have the <fcntl.h> header file. */
#undef HAVE_FCNTL_H
@@ -55,25 +46,12 @@
/* Define to 1 if you have the <GL/gl.h> header file. */
#undef HAVE_GL_GL_H
-/* Define as 0 or 1 according to the floating point format suported by the
- machine */
-#undef HAVE_IEEEFP
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
/* Define to 1 if you have the <io.h> header file. */
#undef HAVE_IO_H
/* Define to 1 if you have the `jbg_newlen' function. */
#undef HAVE_JBG_NEWLEN
-/* Define to 1 if you have the `lfind' function. */
-#undef HAVE_LFIND
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
/* Define to 1 if you have the `mmap' function. */
#undef HAVE_MMAP
@@ -83,100 +61,33 @@
/* Define to 1 if you have the <OpenGL/gl.h> header file. */
#undef HAVE_OPENGL_GL_H
-/* Define if you have POSIX threads libraries and header files. */
-#undef HAVE_PTHREAD
-
-/* Define to 1 if you have the <search.h> header file. */
-#undef HAVE_SEARCH_H
-
/* Define to 1 if you have the `setmode' function. */
#undef HAVE_SETMODE
/* Define to 1 if you have the `snprintf' function. */
#undef HAVE_SNPRINTF
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_H
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#undef HAVE_STDLIB_H
-
-/* Define to 1 if you have the `strcasecmp' function. */
-#undef HAVE_STRCASECMP
-
/* Define to 1 if you have the <strings.h> header file. */
#undef HAVE_STRINGS_H
-/* Define to 1 if you have the <string.h> header file. */
-#undef HAVE_STRING_H
-
-/* Define to 1 if you have the `strtol' function. */
-#undef HAVE_STRTOL
-
-/* Define to 1 if you have the `strtoll' function. */
-#undef HAVE_STRTOLL
-
-/* Define to 1 if you have the `strtoul' function. */
-#undef HAVE_STRTOUL
-
-/* Define to 1 if you have the `strtoull' function. */
-#undef HAVE_STRTOULL
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
/* Define to 1 if you have the <sys/types.h> header file. */
#undef HAVE_SYS_TYPES_H
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
-/* Use nonstandard varargs form for the GLU tesselator callback */
-#undef HAVE_VARARGS_GLU_TESSCB
-
-/* Define to 1 if you have the <windows.h> header file. */
-#undef HAVE_WINDOWS_H
-
-/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian
- (Intel) */
-#undef HOST_BIGENDIAN
-
-/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */
-#undef HOST_FILLORDER
-
-/* Support ISO JBIG compression (requires JBIG-KIT library) */
-#undef JBIG_SUPPORT
-
/* 8/12 bit libjpeg dual mode enabled */
#undef JPEG_DUAL_MODE_8_12
-/* Support JPEG compression (requires IJG JPEG library) */
-#undef JPEG_SUPPORT
+/* Support LERC compression */
+#undef LERC_SUPPORT
/* 12bit libjpeg primary include file with path */
#undef LIBJPEG_12_PATH
-/* Support LogLuv high dynamic range encoding */
-#undef LOGLUV_SUPPORT
-
-/* Define to the sub-directory where libtool stores uninstalled libraries. */
-#undef LT_OBJDIR
-
/* Support LZMA2 compression */
#undef LZMA_SUPPORT
-/* Support LZW algorithm */
-#undef LZW_SUPPORT
-
-/* Support Microsoft Document Imaging format */
-#undef MDI_SUPPORT
-
-/* Support NeXT 2-bit RLE algorithm */
-#undef NEXT_SUPPORT
-
-/* Support Old JPEG compresson (read-only) */
-#undef OJPEG_SUPPORT
-
/* Name of package */
#undef PACKAGE
@@ -198,115 +109,14 @@
/* Define to the version of this package. */
#undef PACKAGE_VERSION
-/* Support Macintosh PackBits algorithm */
-#undef PACKBITS_SUPPORT
-
-/* Support Pixar log-format algorithm (requires Zlib) */
-#undef PIXARLOG_SUPPORT
-
-/* Define to necessary symbol if this constant uses a non-standard name on
- your system. */
-#undef PTHREAD_CREATE_JOINABLE
-
-/* The size of `signed int', as computed by sizeof. */
-#undef SIZEOF_SIGNED_INT
-
-/* The size of `signed long', as computed by sizeof. */
-#undef SIZEOF_SIGNED_LONG
-
-/* The size of `signed long long', as computed by sizeof. */
-#undef SIZEOF_SIGNED_LONG_LONG
-
/* The size of `size_t', as computed by sizeof. */
#undef SIZEOF_SIZE_T
-/* The size of `unsigned char *', as computed by sizeof. */
-#undef SIZEOF_UNSIGNED_CHAR_P
-
-/* The size of `unsigned int', as computed by sizeof. */
-#undef SIZEOF_UNSIGNED_INT
-
-/* The size of `unsigned long', as computed by sizeof. */
-#undef SIZEOF_UNSIGNED_LONG
-
-/* The size of `unsigned long long', as computed by sizeof. */
-#undef SIZEOF_UNSIGNED_LONG_LONG
-
-/* Define to 1 if you have the ANSI C header files. */
-#undef STDC_HEADERS
-
-/* Support strip chopping (whether or not to convert single-strip uncompressed
- images to mutiple strips of specified size to reduce memory usage) */
-#undef STRIPCHOP_DEFAULT
-
/* Default size of the strip in bytes (when strip chopping enabled) */
#undef STRIP_SIZE_DEFAULT
-/* Enable SubIFD tag (330) support */
-#undef SUBIFD_SUPPORT
-
-/* Support ThunderScan 4-bit RLE algorithm */
-#undef THUNDER_SUPPORT
-
-/* Signed 16-bit type */
-#undef TIFF_INT16_T
-
-/* Signed 32-bit type formatter */
-#undef TIFF_INT32_FORMAT
-
-/* Signed 32-bit type */
-#undef TIFF_INT32_T
-
-/* Signed 64-bit type formatter */
-#undef TIFF_INT64_FORMAT
-
-/* Signed 64-bit type */
-#undef TIFF_INT64_T
-
-/* Signed 8-bit type */
-#undef TIFF_INT8_T
-
-/* Pointer difference type formatter */
-#undef TIFF_PTRDIFF_FORMAT
-
-/* Pointer difference type */
-#undef TIFF_PTRDIFF_T
-
-/* Size type formatter */
-#undef TIFF_SIZE_FORMAT
-
-/* Unsigned size type */
-#undef TIFF_SIZE_T
-
-/* Signed size type formatter */
-#undef TIFF_SSIZE_FORMAT
-
-/* Signed size type */
-#undef TIFF_SSIZE_T
-
-/* Unsigned 16-bit type */
-#undef TIFF_UINT16_T
-
-/* Unsigned 32-bit type formatter */
-#undef TIFF_UINT32_FORMAT
-
-/* Unsigned 32-bit type */
-#undef TIFF_UINT32_T
-
-/* Unsigned 64-bit type formatter */
-#undef TIFF_UINT64_FORMAT
-
-/* Unsigned 64-bit type */
-#undef TIFF_UINT64_T
-
-/* Unsigned 8-bit type */
-#undef TIFF_UINT8_T
-
-/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
-#undef TIME_WITH_SYS_TIME
-
-/* Define to 1 if your <sys/time.h> declares `struct tm'. */
-#undef TM_IN_SYS_TIME
+/* Maximum number of TIFF IFDs that libtiff can iterate through in a file. */
+#undef TIFF_MAX_DIR_COUNT
/* define to use win32 IO system */
#undef USE_WIN32_FILEIO
@@ -329,12 +139,6 @@
# endif
#endif
-/* Define to 1 if the X Window System is missing or not being used. */
-#undef X_DISPLAY_MISSING
-
-/* Support Deflate compression */
-#undef ZIP_SUPPORT
-
/* Support zstd compression */
#undef ZSTD_SUPPORT
@@ -352,17 +156,19 @@
/* Define for large files, on AIX-style hosts. */
#undef _LARGE_FILES
-/* Define to empty if `const' does not conform to ANSI C. */
-#undef const
-
-/* Define to `__inline__' or `__inline' if that's what the C compiler
- calls it, or to nothing if 'inline' is not supported under any name. */
-#ifndef __cplusplus
-#undef inline
+#if !defined(__MINGW32__)
+# define TIFF_SIZE_FORMAT "zu"
+#endif
+#if SIZEOF_SIZE_T == 8
+# define TIFF_SSIZE_FORMAT PRId64
+# if defined(__MINGW32__)
+# define TIFF_SIZE_FORMAT PRIu64
+# endif
+#elif SIZEOF_SIZE_T == 4
+# define TIFF_SSIZE_FORMAT PRId32
+# if defined(__MINGW32__)
+# define TIFF_SIZE_FORMAT PRIu32
+# endif
+#else
+# error "Unsupported size_t size; please submit a bug report"
#endif
-
-/* Define to `long int' if <sys/types.h> does not define. */
-#undef off_t
-
-/* Define to `unsigned int' if <sys/types.h> does not define. */
-#undef size_t
diff --git a/src/3rdparty/libtiff/libtiff/tif_config.vc.h b/src/3rdparty/libtiff/libtiff/tif_config.vc.h
deleted file mode 100644
index 5cebfa0..0000000
--- a/src/3rdparty/libtiff/libtiff/tif_config.vc.h
+++ /dev/null
@@ -1,137 +0,0 @@
-#ifndef _TIF_CONFIG_H_
-#define _TIF_CONFIG_H_
-
-/* Define to 1 if you have the <assert.h> header file. */
-#define HAVE_ASSERT_H 1
-
-/* Define to 1 if you have the <fcntl.h> header file. */
-#define HAVE_FCNTL_H 1
-
-/* Define as 0 or 1 according to the floating point format suported by the
- machine */
-#define HAVE_IEEEFP 1
-
-/* Define to 1 if you have the `jbg_newlen' function. */
-#define HAVE_JBG_NEWLEN 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define to 1 if you have the <io.h> header file. */
-#define HAVE_IO_H 1
-
-/* Define to 1 if you have the <search.h> header file. */
-#define HAVE_SEARCH_H 1
-
-/* Define to 1 if you have the `setmode' function. */
-#define HAVE_SETMODE 1
-
-/* Define to 1 if you have the declaration of `optarg', and to 0 if you don't. */
-#define HAVE_DECL_OPTARG 0
-
-/* The size of a `int', as computed by sizeof. */
-#define SIZEOF_INT 4
-
-/* The size of a `long', as computed by sizeof. */
-#define SIZEOF_LONG 4
-
-/* Signed 64-bit type formatter */
-#define TIFF_INT64_FORMAT "%I64d"
-
-/* Signed 64-bit type */
-#define TIFF_INT64_T signed __int64
-
-/* Unsigned 64-bit type formatter */
-#define TIFF_UINT64_FORMAT "%I64u"
-
-/* Unsigned 64-bit type */
-#define TIFF_UINT64_T unsigned __int64
-
-#if _WIN64
-/*
- Windows 64-bit build
-*/
-
-/* Pointer difference type */
-# define TIFF_PTRDIFF_T TIFF_INT64_T
-
-/* The size of `size_t', as computed by sizeof. */
-# define SIZEOF_SIZE_T 8
-
-/* Size type formatter */
-# define TIFF_SIZE_FORMAT TIFF_INT64_FORMAT
-
-/* Unsigned size type */
-# define TIFF_SIZE_T TIFF_UINT64_T
-
-/* Signed size type formatter */
-# define TIFF_SSIZE_FORMAT TIFF_INT64_FORMAT
-
-/* Signed size type */
-# define TIFF_SSIZE_T TIFF_INT64_T
-
-#else
-/*
- Windows 32-bit build
-*/
-
-/* Pointer difference type */
-# define TIFF_PTRDIFF_T signed int
-
-/* The size of `size_t', as computed by sizeof. */
-# define SIZEOF_SIZE_T 4
-
-/* Size type formatter */
-# define TIFF_SIZE_FORMAT "%u"
-
-/* Size type formatter */
-# define TIFF_SIZE_FORMAT "%u"
-
-/* Unsigned size type */
-# define TIFF_SIZE_T unsigned int
-
-/* Signed size type formatter */
-# define TIFF_SSIZE_FORMAT "%d"
-
-/* Signed size type */
-# define TIFF_SSIZE_T signed int
-
-#endif
-
-/* Set the native cpu bit order */
-#define HOST_FILLORDER FILLORDER_LSB2MSB
-
-/* Visual Studio 2015 / VC 14 / MSVC 19.00 finally has snprintf() */
-#if defined(_MSC_VER) && _MSC_VER < 1900
-#define snprintf _snprintf
-#else
-#define HAVE_SNPRINTF 1
-#endif
-
-/* Define to 1 if your processor stores words with the most significant byte
- first (like Motorola and SPARC, unlike Intel and VAX). */
-/* #undef WORDS_BIGENDIAN */
-
-/* Define to `__inline__' or `__inline' if that's what the C compiler
- calls it, or to nothing if 'inline' is not supported under any name. */
-#ifndef __cplusplus
-# ifndef inline
-# define inline __inline
-# endif
-#endif
-
-#define lfind _lfind
-
-#pragma warning(disable : 4996) /* function deprecation warnings */
-
-#endif /* _TIF_CONFIG_H_ */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_config.wince.h b/src/3rdparty/libtiff/libtiff/tif_config.wince.h
deleted file mode 100644
index e85e2e6..0000000
--- a/src/3rdparty/libtiff/libtiff/tif_config.wince.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * TIFF library configuration header for Windows CE platform.
- */
-#ifndef _WIN32_WCE
-# error This version of tif_config.h header is dedicated for Windows CE platform!
-#endif
-
-/* Define to 1 if you have the <assert.h> header file. */
-#define HAVE_ASSERT_H 1
-
-/* Define to 1 if you have the <fcntl.h> header file. */
-#define HAVE_FCNTL_H 1
-
-/* Define as 0 or 1 according to the floating point format suported by the
- machine */
-#define HAVE_IEEEFP 1
-
-/* Define to 1 if you have the `jbg_newlen' function. */
-#define HAVE_JBG_NEWLEN 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#undef HAVE_SYS_TYPES_H
-
-/* Define to 1 if you have the <io.h> header file. */
-#define HAVE_IO_H 1
-
-/* Define to 1 if you have the <search.h> header file. */
-#define HAVE_SEARCH_H 1
-
-/* Define to 1 if you have the `setmode' function. */
-#define HAVE_SETMODE 1
-
-/* Define to 1 if you have the `bsearch' function. */
-#define HAVE_BSEARCH 1
-#define bsearch wceex_bsearch
-
-/* Define to 1 if you have the `lfind' function. */
-#define HAVE_LFIND 1
-#define lfind wceex_lfind
-
-/* The size of a `int', as computed by sizeof. */
-#define SIZEOF_INT 4
-
-/* Set the native cpu bit order */
-#define HOST_FILLORDER FILLORDER_LSB2MSB
-
-/* Define to 1 if your processor stores words with the most significant byte
- first (like Motorola and SPARC, unlike Intel and VAX). */
-/* #undef WORDS_BIGENDIAN */
-
-/* Define to `__inline__' or `__inline' if that's what the C compiler
- calls it, or to nothing if 'inline' is not supported under any name. */
-#ifndef __cplusplus
-# ifndef inline
-# define inline __inline
-# endif
-#endif
-
-
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_dir.c b/src/3rdparty/libtiff/libtiff/tif_dir.c
index 1e0a76c..4a36654 100644
--- a/src/3rdparty/libtiff/libtiff/tif_dir.c
+++ b/src/3rdparty/libtiff/libtiff/tif_dir.c
@@ -2,23 +2,23 @@
* Copyright (c) 1988-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -29,737 +29,1077 @@
* (and also some miscellaneous stuff)
*/
#include "tiffiop.h"
+#include <float.h> /*--: for Rational2Double */
+#include <limits.h>
/*
* These are used in the backwards compatibility code...
*/
-#define DATATYPE_VOID 0 /* !untyped data */
-#define DATATYPE_INT 1 /* !signed integer data */
-#define DATATYPE_UINT 2 /* !unsigned integer data */
-#define DATATYPE_IEEEFP 3 /* !IEEE floating point data */
+#define DATATYPE_VOID 0 /* !untyped data */
+#define DATATYPE_INT 1 /* !signed integer data */
+#define DATATYPE_UINT 2 /* !unsigned integer data */
+#define DATATYPE_IEEEFP 3 /* !IEEE floating point data */
+
+static void setByteArray(TIFF *tif, void **vpp, const void *vp, size_t nmemb,
+ size_t elem_size)
+{
+ if (*vpp)
+ {
+ _TIFFfreeExt(tif, *vpp);
+ *vpp = 0;
+ }
+ if (vp)
+ {
+ tmsize_t bytes = _TIFFMultiplySSize(NULL, nmemb, elem_size, NULL);
+ if (bytes)
+ *vpp = (void *)_TIFFmallocExt(tif, bytes);
+ if (*vpp)
+ _TIFFmemcpy(*vpp, vp, bytes);
+ }
+}
+void _TIFFsetByteArray(void **vpp, const void *vp, uint32_t n)
+{
+ setByteArray(NULL, vpp, vp, n, 1);
+}
+void _TIFFsetByteArrayExt(TIFF *tif, void **vpp, const void *vp, uint32_t n)
+{
+ setByteArray(tif, vpp, vp, n, 1);
+}
+
+static void _TIFFsetNString(TIFF *tif, char **cpp, const char *cp, uint32_t n)
+{
+ setByteArray(tif, (void **)cpp, cp, n, 1);
+}
+
+void _TIFFsetShortArray(uint16_t **wpp, const uint16_t *wp, uint32_t n)
+{
+ setByteArray(NULL, (void **)wpp, wp, n, sizeof(uint16_t));
+}
+void _TIFFsetShortArrayExt(TIFF *tif, uint16_t **wpp, const uint16_t *wp,
+ uint32_t n)
+{
+ setByteArray(tif, (void **)wpp, wp, n, sizeof(uint16_t));
+}
-static void
-setByteArray(void** vpp, void* vp, size_t nmemb, size_t elem_size)
+void _TIFFsetLongArray(uint32_t **lpp, const uint32_t *lp, uint32_t n)
{
- if (*vpp) {
- _TIFFfree(*vpp);
- *vpp = 0;
- }
- if (vp) {
- tmsize_t bytes = _TIFFMultiplySSize(NULL, nmemb, elem_size, NULL);
- if (bytes)
- *vpp = (void*) _TIFFmalloc(bytes);
- if (*vpp)
- _TIFFmemcpy(*vpp, vp, bytes);
- }
+ setByteArray(NULL, (void **)lpp, lp, n, sizeof(uint32_t));
}
-void _TIFFsetByteArray(void** vpp, void* vp, uint32 n)
- { setByteArray(vpp, vp, n, 1); }
-void _TIFFsetString(char** cpp, char* cp)
- { setByteArray((void**) cpp, (void*) cp, strlen(cp)+1, 1); }
-static void _TIFFsetNString(char** cpp, char* cp, uint32 n)
- { setByteArray((void**) cpp, (void*) cp, n, 1); }
-void _TIFFsetShortArray(uint16** wpp, uint16* wp, uint32 n)
- { setByteArray((void**) wpp, (void*) wp, n, sizeof (uint16)); }
-void _TIFFsetLongArray(uint32** lpp, uint32* lp, uint32 n)
- { setByteArray((void**) lpp, (void*) lp, n, sizeof (uint32)); }
-static void _TIFFsetLong8Array(uint64** lpp, uint64* lp, uint32 n)
- { setByteArray((void**) lpp, (void*) lp, n, sizeof (uint64)); }
-void _TIFFsetFloatArray(float** fpp, float* fp, uint32 n)
- { setByteArray((void**) fpp, (void*) fp, n, sizeof (float)); }
-void _TIFFsetDoubleArray(double** dpp, double* dp, uint32 n)
- { setByteArray((void**) dpp, (void*) dp, n, sizeof (double)); }
-
-static void
-setDoubleArrayOneValue(double** vpp, double value, size_t nmemb)
+void _TIFFsetLongArrayExt(TIFF *tif, uint32_t **lpp, const uint32_t *lp,
+ uint32_t n)
{
- if (*vpp)
- _TIFFfree(*vpp);
- *vpp = _TIFFmalloc(nmemb*sizeof(double));
- if (*vpp)
- {
- while (nmemb--)
- ((double*)*vpp)[nmemb] = value;
- }
+ setByteArray(tif, (void **)lpp, lp, n, sizeof(uint32_t));
+}
+
+static void _TIFFsetLong8Array(TIFF *tif, uint64_t **lpp, const uint64_t *lp,
+ uint32_t n)
+{
+ setByteArray(tif, (void **)lpp, lp, n, sizeof(uint64_t));
+}
+
+void _TIFFsetFloatArray(float **fpp, const float *fp, uint32_t n)
+{
+ setByteArray(NULL, (void **)fpp, fp, n, sizeof(float));
+}
+void _TIFFsetFloatArrayExt(TIFF *tif, float **fpp, const float *fp, uint32_t n)
+{
+ setByteArray(tif, (void **)fpp, fp, n, sizeof(float));
+}
+
+void _TIFFsetDoubleArray(double **dpp, const double *dp, uint32_t n)
+{
+ setByteArray(NULL, (void **)dpp, dp, n, sizeof(double));
+}
+void _TIFFsetDoubleArrayExt(TIFF *tif, double **dpp, const double *dp,
+ uint32_t n)
+{
+ setByteArray(tif, (void **)dpp, dp, n, sizeof(double));
+}
+
+static void setDoubleArrayOneValue(TIFF *tif, double **vpp, double value,
+ size_t nmemb)
+{
+ if (*vpp)
+ _TIFFfreeExt(tif, *vpp);
+ *vpp = _TIFFmallocExt(tif, nmemb * sizeof(double));
+ if (*vpp)
+ {
+ while (nmemb--)
+ ((double *)*vpp)[nmemb] = value;
+ }
}
/*
* Install extra samples information.
*/
-static int
-setExtraSamples(TIFF* tif, va_list ap, uint32* v)
+static int setExtraSamples(TIFF *tif, va_list ap, uint32_t *v)
{
/* XXX: Unassociated alpha data == 999 is a known Corel Draw bug, see below */
-#define EXTRASAMPLE_COREL_UNASSALPHA 999
-
- uint16* va;
- uint32 i;
- TIFFDirectory* td = &tif->tif_dir;
- static const char module[] = "setExtraSamples";
-
- *v = (uint16) va_arg(ap, uint16_vap);
- if ((uint16) *v > td->td_samplesperpixel)
- return 0;
- va = va_arg(ap, uint16*);
- if (*v > 0 && va == NULL) /* typically missing param */
- return 0;
- for (i = 0; i < *v; i++) {
- if (va[i] > EXTRASAMPLE_UNASSALPHA) {
- /*
- * XXX: Corel Draw is known to produce incorrect
- * ExtraSamples tags which must be patched here if we
- * want to be able to open some of the damaged TIFF
- * files:
- */
- if (va[i] == EXTRASAMPLE_COREL_UNASSALPHA)
- va[i] = EXTRASAMPLE_UNASSALPHA;
- else
- return 0;
- }
- }
-
- if ( td->td_transferfunction[0] != NULL && (td->td_samplesperpixel - *v > 1) &&
- !(td->td_samplesperpixel - td->td_extrasamples > 1))
+#define EXTRASAMPLE_COREL_UNASSALPHA 999
+
+ uint16_t *va;
+ uint32_t i;
+ TIFFDirectory *td = &tif->tif_dir;
+ static const char module[] = "setExtraSamples";
+
+ *v = (uint16_t)va_arg(ap, uint16_vap);
+ if ((uint16_t)*v > td->td_samplesperpixel)
+ return 0;
+ va = va_arg(ap, uint16_t *);
+ if (*v > 0 && va == NULL) /* typically missing param */
+ return 0;
+ for (i = 0; i < *v; i++)
+ {
+ if (va[i] > EXTRASAMPLE_UNASSALPHA)
{
- TIFFWarningExt(tif->tif_clientdata,module,
- "ExtraSamples tag value is changing, "
- "but TransferFunction was read with a different value. Cancelling it");
- TIFFClrFieldBit(tif,FIELD_TRANSFERFUNCTION);
- _TIFFfree(td->td_transferfunction[0]);
- td->td_transferfunction[0] = NULL;
+ /*
+ * XXX: Corel Draw is known to produce incorrect
+ * ExtraSamples tags which must be patched here if we
+ * want to be able to open some of the damaged TIFF
+ * files:
+ */
+ if (va[i] == EXTRASAMPLE_COREL_UNASSALPHA)
+ va[i] = EXTRASAMPLE_UNASSALPHA;
+ else
+ return 0;
}
+ }
+
+ if (td->td_transferfunction[0] != NULL &&
+ (td->td_samplesperpixel - *v > 1) &&
+ !(td->td_samplesperpixel - td->td_extrasamples > 1))
+ {
+ TIFFWarningExtR(tif, module,
+ "ExtraSamples tag value is changing, "
+ "but TransferFunction was read with a different value. "
+ "Canceling it");
+ TIFFClrFieldBit(tif, FIELD_TRANSFERFUNCTION);
+ _TIFFfreeExt(tif, td->td_transferfunction[0]);
+ td->td_transferfunction[0] = NULL;
+ }
- td->td_extrasamples = (uint16) *v;
- _TIFFsetShortArray(&td->td_sampleinfo, va, td->td_extrasamples);
- return 1;
+ td->td_extrasamples = (uint16_t)*v;
+ _TIFFsetShortArrayExt(tif, &td->td_sampleinfo, va, td->td_extrasamples);
+ return 1;
#undef EXTRASAMPLE_COREL_UNASSALPHA
}
/*
- * Confirm we have "samplesperpixel" ink names separated by \0. Returns
+ * Count ink names separated by \0. Returns
* zero if the ink names are not as expected.
*/
-static uint32
-checkInkNamesString(TIFF* tif, uint32 slen, const char* s)
+static uint16_t countInkNamesString(TIFF *tif, uint32_t slen, const char *s)
{
- TIFFDirectory* td = &tif->tif_dir;
- uint16 i = td->td_samplesperpixel;
-
- if (slen > 0) {
- const char* ep = s+slen;
- const char* cp = s;
- for (; i > 0; i--) {
- for (; cp < ep && *cp != '\0'; cp++) {}
- if (cp >= ep)
- goto bad;
- cp++; /* skip \0 */
- }
- return ((uint32)(cp-s));
- }
+ uint16_t i = 0;
+ const char *ep = s + slen;
+ const char *cp = s;
+
+ if (slen > 0)
+ {
+ do
+ {
+ for (; cp < ep && *cp != '\0'; cp++)
+ {
+ }
+ if (cp >= ep)
+ goto bad;
+ cp++; /* skip \0 */
+ i++;
+ } while (cp < ep);
+ return (i);
+ }
bad:
- TIFFErrorExt(tif->tif_clientdata, "TIFFSetField",
- "%s: Invalid InkNames value; expecting %d names, found %d",
- tif->tif_name,
- td->td_samplesperpixel,
- td->td_samplesperpixel-i);
- return (0);
+ TIFFErrorExtR(tif, "TIFFSetField",
+ "%s: Invalid InkNames value; no NUL at given buffer end "
+ "location %" PRIu32 ", after %" PRIu16 " ink",
+ tif->tif_name, slen, i);
+ return (0);
}
-static int
-_TIFFVSetField(TIFF* tif, uint32 tag, va_list ap)
+static int _TIFFVSetField(TIFF *tif, uint32_t tag, va_list ap)
{
- static const char module[] = "_TIFFVSetField";
+ static const char module[] = "_TIFFVSetField";
- TIFFDirectory* td = &tif->tif_dir;
- int status = 1;
- uint32 v32, i, v;
+ TIFFDirectory *td = &tif->tif_dir;
+ int status = 1;
+ uint32_t v32, v;
double dblval;
- char* s;
- const TIFFField *fip = TIFFFindField(tif, tag, TIFF_ANY);
- uint32 standard_tag = tag;
- if( fip == NULL ) /* cannot happen since OkToChangeTag() already checks it */
- return 0;
- /*
- * We want to force the custom code to be used for custom
- * fields even if the tag happens to match a well known
- * one - important for reinterpreted handling of standard
- * tag values in custom directories (i.e. EXIF)
- */
- if (fip->field_bit == FIELD_CUSTOM) {
- standard_tag = 0;
- }
-
- switch (standard_tag) {
- case TIFFTAG_SUBFILETYPE:
- td->td_subfiletype = (uint32) va_arg(ap, uint32);
- break;
- case TIFFTAG_IMAGEWIDTH:
- td->td_imagewidth = (uint32) va_arg(ap, uint32);
- break;
- case TIFFTAG_IMAGELENGTH:
- td->td_imagelength = (uint32) va_arg(ap, uint32);
- break;
- case TIFFTAG_BITSPERSAMPLE:
- td->td_bitspersample = (uint16) va_arg(ap, uint16_vap);
- /*
- * If the data require post-decoding processing to byte-swap
- * samples, set it up here. Note that since tags are required
- * to be ordered, compression code can override this behaviour
- * in the setup method if it wants to roll the post decoding
- * work in with its normal work.
- */
- if (tif->tif_flags & TIFF_SWAB) {
- if (td->td_bitspersample == 8)
- tif->tif_postdecode = _TIFFNoPostDecode;
- else if (td->td_bitspersample == 16)
- tif->tif_postdecode = _TIFFSwab16BitData;
- else if (td->td_bitspersample == 24)
- tif->tif_postdecode = _TIFFSwab24BitData;
- else if (td->td_bitspersample == 32)
- tif->tif_postdecode = _TIFFSwab32BitData;
- else if (td->td_bitspersample == 64)
- tif->tif_postdecode = _TIFFSwab64BitData;
- else if (td->td_bitspersample == 128) /* two 64's */
- tif->tif_postdecode = _TIFFSwab64BitData;
- }
- break;
- case TIFFTAG_COMPRESSION:
- v = (uint16) va_arg(ap, uint16_vap);
- /*
- * If we're changing the compression scheme, the notify the
- * previous module so that it can cleanup any state it's
- * setup.
- */
- if (TIFFFieldSet(tif, FIELD_COMPRESSION)) {
- if ((uint32)td->td_compression == v)
- break;
- (*tif->tif_cleanup)(tif);
- tif->tif_flags &= ~TIFF_CODERSETUP;
- }
- /*
- * Setup new compression routine state.
- */
- if( (status = TIFFSetCompressionScheme(tif, v)) != 0 )
- td->td_compression = (uint16) v;
- else
- status = 0;
- break;
- case TIFFTAG_PHOTOMETRIC:
- td->td_photometric = (uint16) va_arg(ap, uint16_vap);
- break;
- case TIFFTAG_THRESHHOLDING:
- td->td_threshholding = (uint16) va_arg(ap, uint16_vap);
- break;
- case TIFFTAG_FILLORDER:
- v = (uint16) va_arg(ap, uint16_vap);
- if (v != FILLORDER_LSB2MSB && v != FILLORDER_MSB2LSB)
- goto badvalue;
- td->td_fillorder = (uint16) v;
- break;
- case TIFFTAG_ORIENTATION:
- v = (uint16) va_arg(ap, uint16_vap);
- if (v < ORIENTATION_TOPLEFT || ORIENTATION_LEFTBOT < v)
- goto badvalue;
- else
- td->td_orientation = (uint16) v;
- break;
- case TIFFTAG_SAMPLESPERPIXEL:
- v = (uint16) va_arg(ap, uint16_vap);
- if (v == 0)
- goto badvalue;
- if( v != td->td_samplesperpixel )
- {
- /* See http://bugzilla.maptools.org/show_bug.cgi?id=2500 */
- if( td->td_sminsamplevalue != NULL )
+ char *s;
+ const TIFFField *fip = TIFFFindField(tif, tag, TIFF_ANY);
+ uint32_t standard_tag = tag;
+ if (fip == NULL) /* cannot happen since OkToChangeTag() already checks it */
+ return 0;
+ /*
+ * We want to force the custom code to be used for custom
+ * fields even if the tag happens to match a well known
+ * one - important for reinterpreted handling of standard
+ * tag values in custom directories (i.e. EXIF)
+ */
+ if (fip->field_bit == FIELD_CUSTOM)
+ {
+ standard_tag = 0;
+ }
+
+ switch (standard_tag)
+ {
+ case TIFFTAG_SUBFILETYPE:
+ td->td_subfiletype = (uint32_t)va_arg(ap, uint32_t);
+ break;
+ case TIFFTAG_IMAGEWIDTH:
+ td->td_imagewidth = (uint32_t)va_arg(ap, uint32_t);
+ break;
+ case TIFFTAG_IMAGELENGTH:
+ td->td_imagelength = (uint32_t)va_arg(ap, uint32_t);
+ break;
+ case TIFFTAG_BITSPERSAMPLE:
+ td->td_bitspersample = (uint16_t)va_arg(ap, uint16_vap);
+ /*
+ * If the data require post-decoding processing to byte-swap
+ * samples, set it up here. Note that since tags are required
+ * to be ordered, compression code can override this behavior
+ * in the setup method if it wants to roll the post decoding
+ * work in with its normal work.
+ */
+ if (tif->tif_flags & TIFF_SWAB)
{
- TIFFWarningExt(tif->tif_clientdata,module,
- "SamplesPerPixel tag value is changing, "
- "but SMinSampleValue tag was read with a different value. Cancelling it");
- TIFFClrFieldBit(tif,FIELD_SMINSAMPLEVALUE);
- _TIFFfree(td->td_sminsamplevalue);
- td->td_sminsamplevalue = NULL;
+ if (td->td_bitspersample == 8)
+ tif->tif_postdecode = _TIFFNoPostDecode;
+ else if (td->td_bitspersample == 16)
+ tif->tif_postdecode = _TIFFSwab16BitData;
+ else if (td->td_bitspersample == 24)
+ tif->tif_postdecode = _TIFFSwab24BitData;
+ else if (td->td_bitspersample == 32)
+ tif->tif_postdecode = _TIFFSwab32BitData;
+ else if (td->td_bitspersample == 64)
+ tif->tif_postdecode = _TIFFSwab64BitData;
+ else if (td->td_bitspersample == 128) /* two 64's */
+ tif->tif_postdecode = _TIFFSwab64BitData;
}
- if( td->td_smaxsamplevalue != NULL )
+ break;
+ case TIFFTAG_COMPRESSION:
+ v = (uint16_t)va_arg(ap, uint16_vap);
+ /*
+ * If we're changing the compression scheme, notify the
+ * previous module so that it can cleanup any state it's
+ * setup.
+ */
+ if (TIFFFieldSet(tif, FIELD_COMPRESSION))
{
- TIFFWarningExt(tif->tif_clientdata,module,
- "SamplesPerPixel tag value is changing, "
- "but SMaxSampleValue tag was read with a different value. Cancelling it");
- TIFFClrFieldBit(tif,FIELD_SMAXSAMPLEVALUE);
- _TIFFfree(td->td_smaxsamplevalue);
- td->td_smaxsamplevalue = NULL;
+ if ((uint32_t)td->td_compression == v)
+ break;
+ (*tif->tif_cleanup)(tif);
+ tif->tif_flags &= ~TIFF_CODERSETUP;
}
- /* Test if 3 transfer functions instead of just one are now needed
- See http://bugzilla.maptools.org/show_bug.cgi?id=2820 */
- if( td->td_transferfunction[0] != NULL && (v - td->td_extrasamples > 1) &&
- !(td->td_samplesperpixel - td->td_extrasamples > 1))
+ /*
+ * Setup new compression routine state.
+ */
+ if ((status = TIFFSetCompressionScheme(tif, v)) != 0)
+ td->td_compression = (uint16_t)v;
+ else
+ status = 0;
+ break;
+ case TIFFTAG_PHOTOMETRIC:
+ td->td_photometric = (uint16_t)va_arg(ap, uint16_vap);
+ break;
+ case TIFFTAG_THRESHHOLDING:
+ td->td_threshholding = (uint16_t)va_arg(ap, uint16_vap);
+ break;
+ case TIFFTAG_FILLORDER:
+ v = (uint16_t)va_arg(ap, uint16_vap);
+ if (v != FILLORDER_LSB2MSB && v != FILLORDER_MSB2LSB)
+ goto badvalue;
+ td->td_fillorder = (uint16_t)v;
+ break;
+ case TIFFTAG_ORIENTATION:
+ v = (uint16_t)va_arg(ap, uint16_vap);
+ if (v < ORIENTATION_TOPLEFT || ORIENTATION_LEFTBOT < v)
+ goto badvalue;
+ else
+ td->td_orientation = (uint16_t)v;
+ break;
+ case TIFFTAG_SAMPLESPERPIXEL:
+ v = (uint16_t)va_arg(ap, uint16_vap);
+ if (v == 0)
+ goto badvalue;
+ if (v != td->td_samplesperpixel)
{
- TIFFWarningExt(tif->tif_clientdata,module,
- "SamplesPerPixel tag value is changing, "
- "but TransferFunction was read with a different value. Cancelling it");
- TIFFClrFieldBit(tif,FIELD_TRANSFERFUNCTION);
- _TIFFfree(td->td_transferfunction[0]);
+ /* See http://bugzilla.maptools.org/show_bug.cgi?id=2500 */
+ if (td->td_sminsamplevalue != NULL)
+ {
+ TIFFWarningExtR(tif, module,
+ "SamplesPerPixel tag value is changing, "
+ "but SMinSampleValue tag was read with a "
+ "different value. Canceling it");
+ TIFFClrFieldBit(tif, FIELD_SMINSAMPLEVALUE);
+ _TIFFfreeExt(tif, td->td_sminsamplevalue);
+ td->td_sminsamplevalue = NULL;
+ }
+ if (td->td_smaxsamplevalue != NULL)
+ {
+ TIFFWarningExtR(tif, module,
+ "SamplesPerPixel tag value is changing, "
+ "but SMaxSampleValue tag was read with a "
+ "different value. Canceling it");
+ TIFFClrFieldBit(tif, FIELD_SMAXSAMPLEVALUE);
+ _TIFFfreeExt(tif, td->td_smaxsamplevalue);
+ td->td_smaxsamplevalue = NULL;
+ }
+ /* Test if 3 transfer functions instead of just one are now
+ needed See http://bugzilla.maptools.org/show_bug.cgi?id=2820
+ */
+ if (td->td_transferfunction[0] != NULL &&
+ (v - td->td_extrasamples > 1) &&
+ !(td->td_samplesperpixel - td->td_extrasamples > 1))
+ {
+ TIFFWarningExtR(tif, module,
+ "SamplesPerPixel tag value is changing, "
+ "but TransferFunction was read with a "
+ "different value. Canceling it");
+ TIFFClrFieldBit(tif, FIELD_TRANSFERFUNCTION);
+ _TIFFfreeExt(tif, td->td_transferfunction[0]);
td->td_transferfunction[0] = NULL;
+ }
+ }
+ td->td_samplesperpixel = (uint16_t)v;
+ break;
+ case TIFFTAG_ROWSPERSTRIP:
+ v32 = (uint32_t)va_arg(ap, uint32_t);
+ if (v32 == 0)
+ goto badvalue32;
+ td->td_rowsperstrip = v32;
+ if (!TIFFFieldSet(tif, FIELD_TILEDIMENSIONS))
+ {
+ td->td_tilelength = v32;
+ td->td_tilewidth = td->td_imagewidth;
+ }
+ break;
+ case TIFFTAG_MINSAMPLEVALUE:
+ td->td_minsamplevalue = (uint16_t)va_arg(ap, uint16_vap);
+ break;
+ case TIFFTAG_MAXSAMPLEVALUE:
+ td->td_maxsamplevalue = (uint16_t)va_arg(ap, uint16_vap);
+ break;
+ case TIFFTAG_SMINSAMPLEVALUE:
+ if (tif->tif_flags & TIFF_PERSAMPLE)
+ _TIFFsetDoubleArrayExt(tif, &td->td_sminsamplevalue,
+ va_arg(ap, double *),
+ td->td_samplesperpixel);
+ else
+ setDoubleArrayOneValue(tif, &td->td_sminsamplevalue,
+ va_arg(ap, double),
+ td->td_samplesperpixel);
+ break;
+ case TIFFTAG_SMAXSAMPLEVALUE:
+ if (tif->tif_flags & TIFF_PERSAMPLE)
+ _TIFFsetDoubleArrayExt(tif, &td->td_smaxsamplevalue,
+ va_arg(ap, double *),
+ td->td_samplesperpixel);
+ else
+ setDoubleArrayOneValue(tif, &td->td_smaxsamplevalue,
+ va_arg(ap, double),
+ td->td_samplesperpixel);
+ break;
+ case TIFFTAG_XRESOLUTION:
+ dblval = va_arg(ap, double);
+ if (dblval != dblval || dblval < 0)
+ goto badvaluedouble;
+ td->td_xresolution = _TIFFClampDoubleToFloat(dblval);
+ break;
+ case TIFFTAG_YRESOLUTION:
+ dblval = va_arg(ap, double);
+ if (dblval != dblval || dblval < 0)
+ goto badvaluedouble;
+ td->td_yresolution = _TIFFClampDoubleToFloat(dblval);
+ break;
+ case TIFFTAG_PLANARCONFIG:
+ v = (uint16_t)va_arg(ap, uint16_vap);
+ if (v != PLANARCONFIG_CONTIG && v != PLANARCONFIG_SEPARATE)
+ goto badvalue;
+ td->td_planarconfig = (uint16_t)v;
+ break;
+ case TIFFTAG_XPOSITION:
+ td->td_xposition = _TIFFClampDoubleToFloat(va_arg(ap, double));
+ break;
+ case TIFFTAG_YPOSITION:
+ td->td_yposition = _TIFFClampDoubleToFloat(va_arg(ap, double));
+ break;
+ case TIFFTAG_RESOLUTIONUNIT:
+ v = (uint16_t)va_arg(ap, uint16_vap);
+ if (v < RESUNIT_NONE || RESUNIT_CENTIMETER < v)
+ goto badvalue;
+ td->td_resolutionunit = (uint16_t)v;
+ break;
+ case TIFFTAG_PAGENUMBER:
+ td->td_pagenumber[0] = (uint16_t)va_arg(ap, uint16_vap);
+ td->td_pagenumber[1] = (uint16_t)va_arg(ap, uint16_vap);
+ break;
+ case TIFFTAG_HALFTONEHINTS:
+ td->td_halftonehints[0] = (uint16_t)va_arg(ap, uint16_vap);
+ td->td_halftonehints[1] = (uint16_t)va_arg(ap, uint16_vap);
+ break;
+ case TIFFTAG_COLORMAP:
+ v32 = (uint32_t)(1L << td->td_bitspersample);
+ _TIFFsetShortArrayExt(tif, &td->td_colormap[0],
+ va_arg(ap, uint16_t *), v32);
+ _TIFFsetShortArrayExt(tif, &td->td_colormap[1],
+ va_arg(ap, uint16_t *), v32);
+ _TIFFsetShortArrayExt(tif, &td->td_colormap[2],
+ va_arg(ap, uint16_t *), v32);
+ break;
+ case TIFFTAG_EXTRASAMPLES:
+ if (!setExtraSamples(tif, ap, &v))
+ goto badvalue;
+ break;
+ case TIFFTAG_MATTEING:
+ td->td_extrasamples = (((uint16_t)va_arg(ap, uint16_vap)) != 0);
+ if (td->td_extrasamples)
+ {
+ uint16_t sv = EXTRASAMPLE_ASSOCALPHA;
+ _TIFFsetShortArrayExt(tif, &td->td_sampleinfo, &sv, 1);
+ }
+ break;
+ case TIFFTAG_TILEWIDTH:
+ v32 = (uint32_t)va_arg(ap, uint32_t);
+ if (v32 % 16)
+ {
+ if (tif->tif_mode != O_RDONLY)
+ goto badvalue32;
+ TIFFWarningExtR(
+ tif, tif->tif_name,
+ "Nonstandard tile width %" PRIu32 ", convert file", v32);
+ }
+ td->td_tilewidth = v32;
+ tif->tif_flags |= TIFF_ISTILED;
+ break;
+ case TIFFTAG_TILELENGTH:
+ v32 = (uint32_t)va_arg(ap, uint32_t);
+ if (v32 % 16)
+ {
+ if (tif->tif_mode != O_RDONLY)
+ goto badvalue32;
+ TIFFWarningExtR(
+ tif, tif->tif_name,
+ "Nonstandard tile length %" PRIu32 ", convert file", v32);
+ }
+ td->td_tilelength = v32;
+ tif->tif_flags |= TIFF_ISTILED;
+ break;
+ case TIFFTAG_TILEDEPTH:
+ v32 = (uint32_t)va_arg(ap, uint32_t);
+ if (v32 == 0)
+ goto badvalue32;
+ td->td_tiledepth = v32;
+ break;
+ case TIFFTAG_DATATYPE:
+ v = (uint16_t)va_arg(ap, uint16_vap);
+ switch (v)
+ {
+ case DATATYPE_VOID:
+ v = SAMPLEFORMAT_VOID;
+ break;
+ case DATATYPE_INT:
+ v = SAMPLEFORMAT_INT;
+ break;
+ case DATATYPE_UINT:
+ v = SAMPLEFORMAT_UINT;
+ break;
+ case DATATYPE_IEEEFP:
+ v = SAMPLEFORMAT_IEEEFP;
+ break;
+ default:
+ goto badvalue;
+ }
+ td->td_sampleformat = (uint16_t)v;
+ break;
+ case TIFFTAG_SAMPLEFORMAT:
+ v = (uint16_t)va_arg(ap, uint16_vap);
+ if (v < SAMPLEFORMAT_UINT || SAMPLEFORMAT_COMPLEXIEEEFP < v)
+ goto badvalue;
+ td->td_sampleformat = (uint16_t)v;
+
+ /* Try to fix up the SWAB function for complex data. */
+ if (td->td_sampleformat == SAMPLEFORMAT_COMPLEXINT &&
+ td->td_bitspersample == 32 &&
+ tif->tif_postdecode == _TIFFSwab32BitData)
+ tif->tif_postdecode = _TIFFSwab16BitData;
+ else if ((td->td_sampleformat == SAMPLEFORMAT_COMPLEXINT ||
+ td->td_sampleformat == SAMPLEFORMAT_COMPLEXIEEEFP) &&
+ td->td_bitspersample == 64 &&
+ tif->tif_postdecode == _TIFFSwab64BitData)
+ tif->tif_postdecode = _TIFFSwab32BitData;
+ break;
+ case TIFFTAG_IMAGEDEPTH:
+ td->td_imagedepth = (uint32_t)va_arg(ap, uint32_t);
+ break;
+ case TIFFTAG_SUBIFD:
+ if ((tif->tif_flags & TIFF_INSUBIFD) == 0)
+ {
+ td->td_nsubifd = (uint16_t)va_arg(ap, uint16_vap);
+ _TIFFsetLong8Array(tif, &td->td_subifd,
+ (uint64_t *)va_arg(ap, uint64_t *),
+ (uint32_t)td->td_nsubifd);
+ }
+ else
+ {
+ TIFFErrorExtR(tif, module, "%s: Sorry, cannot nest SubIFDs",
+ tif->tif_name);
+ status = 0;
+ }
+ break;
+ case TIFFTAG_YCBCRPOSITIONING:
+ td->td_ycbcrpositioning = (uint16_t)va_arg(ap, uint16_vap);
+ break;
+ case TIFFTAG_YCBCRSUBSAMPLING:
+ td->td_ycbcrsubsampling[0] = (uint16_t)va_arg(ap, uint16_vap);
+ td->td_ycbcrsubsampling[1] = (uint16_t)va_arg(ap, uint16_vap);
+ break;
+ case TIFFTAG_TRANSFERFUNCTION:
+ {
+ uint32_t i;
+ v = (td->td_samplesperpixel - td->td_extrasamples) > 1 ? 3 : 1;
+ for (i = 0; i < v; i++)
+ _TIFFsetShortArrayExt(tif, &td->td_transferfunction[i],
+ va_arg(ap, uint16_t *),
+ 1U << td->td_bitspersample);
+ break;
+ }
+ case TIFFTAG_REFERENCEBLACKWHITE:
+ /* XXX should check for null range */
+ _TIFFsetFloatArrayExt(tif, &td->td_refblackwhite,
+ va_arg(ap, float *), 6);
+ break;
+ case TIFFTAG_INKNAMES:
+ {
+ v = (uint16_t)va_arg(ap, uint16_vap);
+ s = va_arg(ap, char *);
+ uint16_t ninksinstring;
+ ninksinstring = countInkNamesString(tif, v, s);
+ status = ninksinstring > 0;
+ if (ninksinstring > 0)
+ {
+ _TIFFsetNString(tif, &td->td_inknames, s, v);
+ td->td_inknameslen = v;
+ /* Set NumberOfInks to the value ninksinstring */
+ if (TIFFFieldSet(tif, FIELD_NUMBEROFINKS))
+ {
+ if (td->td_numberofinks != ninksinstring)
+ {
+ TIFFErrorExtR(
+ tif, module,
+ "Warning %s; Tag %s:\n Value %" PRIu16
+ " of NumberOfInks is different from the number of "
+ "inks %" PRIu16
+ ".\n -> NumberOfInks value adapted to %" PRIu16 "",
+ tif->tif_name, fip->field_name, td->td_numberofinks,
+ ninksinstring, ninksinstring);
+ td->td_numberofinks = ninksinstring;
+ }
+ }
+ else
+ {
+ td->td_numberofinks = ninksinstring;
+ TIFFSetFieldBit(tif, FIELD_NUMBEROFINKS);
+ }
+ if (TIFFFieldSet(tif, FIELD_SAMPLESPERPIXEL))
+ {
+ if (td->td_numberofinks != td->td_samplesperpixel)
+ {
+ TIFFErrorExtR(tif, module,
+ "Warning %s; Tag %s:\n Value %" PRIu16
+ " of NumberOfInks is different from the "
+ "SamplesPerPixel value %" PRIu16 "",
+ tif->tif_name, fip->field_name,
+ td->td_numberofinks,
+ td->td_samplesperpixel);
+ }
+ }
}
}
- td->td_samplesperpixel = (uint16) v;
- break;
- case TIFFTAG_ROWSPERSTRIP:
- v32 = (uint32) va_arg(ap, uint32);
- if (v32 == 0)
- goto badvalue32;
- td->td_rowsperstrip = v32;
- if (!TIFFFieldSet(tif, FIELD_TILEDIMENSIONS)) {
- td->td_tilelength = v32;
- td->td_tilewidth = td->td_imagewidth;
- }
- break;
- case TIFFTAG_MINSAMPLEVALUE:
- td->td_minsamplevalue = (uint16) va_arg(ap, uint16_vap);
- break;
- case TIFFTAG_MAXSAMPLEVALUE:
- td->td_maxsamplevalue = (uint16) va_arg(ap, uint16_vap);
- break;
- case TIFFTAG_SMINSAMPLEVALUE:
- if (tif->tif_flags & TIFF_PERSAMPLE)
- _TIFFsetDoubleArray(&td->td_sminsamplevalue, va_arg(ap, double*), td->td_samplesperpixel);
- else
- setDoubleArrayOneValue(&td->td_sminsamplevalue, va_arg(ap, double), td->td_samplesperpixel);
- break;
- case TIFFTAG_SMAXSAMPLEVALUE:
- if (tif->tif_flags & TIFF_PERSAMPLE)
- _TIFFsetDoubleArray(&td->td_smaxsamplevalue, va_arg(ap, double*), td->td_samplesperpixel);
- else
- setDoubleArrayOneValue(&td->td_smaxsamplevalue, va_arg(ap, double), td->td_samplesperpixel);
- break;
- case TIFFTAG_XRESOLUTION:
- dblval = va_arg(ap, double);
- if( dblval < 0 )
- goto badvaluedouble;
- td->td_xresolution = _TIFFClampDoubleToFloat( dblval );
- break;
- case TIFFTAG_YRESOLUTION:
- dblval = va_arg(ap, double);
- if( dblval < 0 )
- goto badvaluedouble;
- td->td_yresolution = _TIFFClampDoubleToFloat( dblval );
- break;
- case TIFFTAG_PLANARCONFIG:
- v = (uint16) va_arg(ap, uint16_vap);
- if (v != PLANARCONFIG_CONTIG && v != PLANARCONFIG_SEPARATE)
- goto badvalue;
- td->td_planarconfig = (uint16) v;
- break;
- case TIFFTAG_XPOSITION:
- td->td_xposition = _TIFFClampDoubleToFloat( va_arg(ap, double) );
- break;
- case TIFFTAG_YPOSITION:
- td->td_yposition = _TIFFClampDoubleToFloat( va_arg(ap, double) );
- break;
- case TIFFTAG_RESOLUTIONUNIT:
- v = (uint16) va_arg(ap, uint16_vap);
- if (v < RESUNIT_NONE || RESUNIT_CENTIMETER < v)
- goto badvalue;
- td->td_resolutionunit = (uint16) v;
- break;
- case TIFFTAG_PAGENUMBER:
- td->td_pagenumber[0] = (uint16) va_arg(ap, uint16_vap);
- td->td_pagenumber[1] = (uint16) va_arg(ap, uint16_vap);
- break;
- case TIFFTAG_HALFTONEHINTS:
- td->td_halftonehints[0] = (uint16) va_arg(ap, uint16_vap);
- td->td_halftonehints[1] = (uint16) va_arg(ap, uint16_vap);
- break;
- case TIFFTAG_COLORMAP:
- v32 = (uint32)(1L<<td->td_bitspersample);
- _TIFFsetShortArray(&td->td_colormap[0], va_arg(ap, uint16*), v32);
- _TIFFsetShortArray(&td->td_colormap[1], va_arg(ap, uint16*), v32);
- _TIFFsetShortArray(&td->td_colormap[2], va_arg(ap, uint16*), v32);
- break;
- case TIFFTAG_EXTRASAMPLES:
- if (!setExtraSamples(tif, ap, &v))
- goto badvalue;
- break;
- case TIFFTAG_MATTEING:
- td->td_extrasamples = (((uint16) va_arg(ap, uint16_vap)) != 0);
- if (td->td_extrasamples) {
- uint16 sv = EXTRASAMPLE_ASSOCALPHA;
- _TIFFsetShortArray(&td->td_sampleinfo, &sv, 1);
- }
- break;
- case TIFFTAG_TILEWIDTH:
- v32 = (uint32) va_arg(ap, uint32);
- if (v32 % 16) {
- if (tif->tif_mode != O_RDONLY)
- goto badvalue32;
- TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
- "Nonstandard tile width %d, convert file", v32);
- }
- td->td_tilewidth = v32;
- tif->tif_flags |= TIFF_ISTILED;
- break;
- case TIFFTAG_TILELENGTH:
- v32 = (uint32) va_arg(ap, uint32);
- if (v32 % 16) {
- if (tif->tif_mode != O_RDONLY)
- goto badvalue32;
- TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
- "Nonstandard tile length %d, convert file", v32);
- }
- td->td_tilelength = v32;
- tif->tif_flags |= TIFF_ISTILED;
- break;
- case TIFFTAG_TILEDEPTH:
- v32 = (uint32) va_arg(ap, uint32);
- if (v32 == 0)
- goto badvalue32;
- td->td_tiledepth = v32;
- break;
- case TIFFTAG_DATATYPE:
- v = (uint16) va_arg(ap, uint16_vap);
- switch (v) {
- case DATATYPE_VOID: v = SAMPLEFORMAT_VOID; break;
- case DATATYPE_INT: v = SAMPLEFORMAT_INT; break;
- case DATATYPE_UINT: v = SAMPLEFORMAT_UINT; break;
- case DATATYPE_IEEEFP: v = SAMPLEFORMAT_IEEEFP;break;
- default: goto badvalue;
- }
- td->td_sampleformat = (uint16) v;
- break;
- case TIFFTAG_SAMPLEFORMAT:
- v = (uint16) va_arg(ap, uint16_vap);
- if (v < SAMPLEFORMAT_UINT || SAMPLEFORMAT_COMPLEXIEEEFP < v)
- goto badvalue;
- td->td_sampleformat = (uint16) v;
-
- /* Try to fix up the SWAB function for complex data. */
- if( td->td_sampleformat == SAMPLEFORMAT_COMPLEXINT
- && td->td_bitspersample == 32
- && tif->tif_postdecode == _TIFFSwab32BitData )
- tif->tif_postdecode = _TIFFSwab16BitData;
- else if( (td->td_sampleformat == SAMPLEFORMAT_COMPLEXINT
- || td->td_sampleformat == SAMPLEFORMAT_COMPLEXIEEEFP)
- && td->td_bitspersample == 64
- && tif->tif_postdecode == _TIFFSwab64BitData )
- tif->tif_postdecode = _TIFFSwab32BitData;
- break;
- case TIFFTAG_IMAGEDEPTH:
- td->td_imagedepth = (uint32) va_arg(ap, uint32);
- break;
- case TIFFTAG_SUBIFD:
- if ((tif->tif_flags & TIFF_INSUBIFD) == 0) {
- td->td_nsubifd = (uint16) va_arg(ap, uint16_vap);
- _TIFFsetLong8Array(&td->td_subifd, (uint64*) va_arg(ap, uint64*),
- (uint32) td->td_nsubifd);
- } else {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Sorry, cannot nest SubIFDs",
- tif->tif_name);
- status = 0;
- }
- break;
- case TIFFTAG_YCBCRPOSITIONING:
- td->td_ycbcrpositioning = (uint16) va_arg(ap, uint16_vap);
- break;
- case TIFFTAG_YCBCRSUBSAMPLING:
- td->td_ycbcrsubsampling[0] = (uint16) va_arg(ap, uint16_vap);
- td->td_ycbcrsubsampling[1] = (uint16) va_arg(ap, uint16_vap);
- break;
- case TIFFTAG_TRANSFERFUNCTION:
- v = (td->td_samplesperpixel - td->td_extrasamples) > 1 ? 3 : 1;
- for (i = 0; i < v; i++)
- _TIFFsetShortArray(&td->td_transferfunction[i],
- va_arg(ap, uint16*), 1U<<td->td_bitspersample);
- break;
- case TIFFTAG_REFERENCEBLACKWHITE:
- /* XXX should check for null range */
- _TIFFsetFloatArray(&td->td_refblackwhite, va_arg(ap, float*), 6);
- break;
- case TIFFTAG_INKNAMES:
- v = (uint16) va_arg(ap, uint16_vap);
- s = va_arg(ap, char*);
- v = checkInkNamesString(tif, v, s);
- status = v > 0;
- if( v > 0 ) {
- _TIFFsetNString(&td->td_inknames, s, v);
- td->td_inknameslen = v;
- }
- break;
- case TIFFTAG_PERSAMPLE:
- v = (uint16) va_arg(ap, uint16_vap);
- if( v == PERSAMPLE_MULTI )
- tif->tif_flags |= TIFF_PERSAMPLE;
- else
- tif->tif_flags &= ~TIFF_PERSAMPLE;
- break;
- default: {
- TIFFTagValue *tv;
- int tv_size, iCustom;
-
- /*
- * This can happen if multiple images are open with different
- * codecs which have private tags. The global tag information
- * table may then have tags that are valid for one file but not
- * the other. If the client tries to set a tag that is not valid
- * for the image's codec then we'll arrive here. This
- * happens, for example, when tiffcp is used to convert between
- * compression schemes and codec-specific tags are blindly copied.
- */
- if(fip->field_bit != FIELD_CUSTOM) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Invalid %stag \"%s\" (not supported by codec)",
- tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "",
- fip->field_name);
- status = 0;
- break;
- }
-
- /*
- * Find the existing entry for this custom value.
- */
- tv = NULL;
- for (iCustom = 0; iCustom < td->td_customValueCount; iCustom++) {
- if (td->td_customValues[iCustom].info->field_tag == tag) {
- tv = td->td_customValues + iCustom;
- if (tv->value != NULL) {
- _TIFFfree(tv->value);
- tv->value = NULL;
- }
- break;
- }
- }
-
- /*
- * Grow the custom list if the entry was not found.
- */
- if(tv == NULL) {
- TIFFTagValue *new_customValues;
-
- td->td_customValueCount++;
- new_customValues = (TIFFTagValue *)
- _TIFFrealloc(td->td_customValues,
- sizeof(TIFFTagValue) * td->td_customValueCount);
- if (!new_customValues) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Failed to allocate space for list of custom values",
- tif->tif_name);
- status = 0;
- goto end;
- }
-
- td->td_customValues = new_customValues;
-
- tv = td->td_customValues + (td->td_customValueCount - 1);
- tv->info = fip;
- tv->value = NULL;
- tv->count = 0;
- }
-
- /*
- * Set custom value ... save a copy of the custom tag value.
- */
- tv_size = _TIFFDataSize(fip->field_type);
- if (tv_size == 0) {
- status = 0;
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Bad field type %d for \"%s\"",
- tif->tif_name, fip->field_type,
- fip->field_name);
- goto end;
- }
-
- if (fip->field_type == TIFF_ASCII)
- {
- uint32 ma;
- char* mb;
- if (fip->field_passcount)
- {
- assert(fip->field_writecount==TIFF_VARIABLE2);
- ma=(uint32)va_arg(ap,uint32);
- mb=(char*)va_arg(ap,char*);
- }
- else
- {
- mb=(char*)va_arg(ap,char*);
- ma=(uint32)(strlen(mb)+1);
- }
- tv->count=ma;
- setByteArray(&tv->value,mb,ma,1);
- }
- else
- {
- if (fip->field_passcount) {
- if (fip->field_writecount == TIFF_VARIABLE2)
- tv->count = (uint32) va_arg(ap, uint32);
- else
- tv->count = (int) va_arg(ap, int);
- } else if (fip->field_writecount == TIFF_VARIABLE
- || fip->field_writecount == TIFF_VARIABLE2)
- tv->count = 1;
- else if (fip->field_writecount == TIFF_SPP)
- tv->count = td->td_samplesperpixel;
- else
- tv->count = fip->field_writecount;
-
- if (tv->count == 0) {
- status = 0;
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Null count for \"%s\" (type "
- "%d, writecount %d, passcount %d)",
- tif->tif_name,
- fip->field_name,
- fip->field_type,
- fip->field_writecount,
- fip->field_passcount);
- goto end;
- }
-
- tv->value = _TIFFCheckMalloc(tif, tv->count, tv_size,
- "custom tag binary object");
- if (!tv->value) {
- status = 0;
- goto end;
- }
-
- if (fip->field_tag == TIFFTAG_DOTRANGE
- && strcmp(fip->field_name,"DotRange") == 0) {
- /* TODO: This is an evil exception and should not have been
- handled this way ... likely best if we move it into
- the directory structure with an explicit field in
- libtiff 4.1 and assign it a FIELD_ value */
- uint16 v2[2];
- v2[0] = (uint16)va_arg(ap, int);
- v2[1] = (uint16)va_arg(ap, int);
- _TIFFmemcpy(tv->value, &v2, 4);
- }
-
- else if (fip->field_passcount
- || fip->field_writecount == TIFF_VARIABLE
- || fip->field_writecount == TIFF_VARIABLE2
- || fip->field_writecount == TIFF_SPP
- || tv->count > 1) {
- _TIFFmemcpy(tv->value, va_arg(ap, void *),
- tv->count * tv_size);
- } else {
- char *val = (char *)tv->value;
- assert( tv->count == 1 );
-
- switch (fip->field_type) {
- case TIFF_BYTE:
- case TIFF_UNDEFINED:
- {
- uint8 v2 = (uint8)va_arg(ap, int);
- _TIFFmemcpy(val, &v2, tv_size);
- }
- break;
- case TIFF_SBYTE:
- {
- int8 v2 = (int8)va_arg(ap, int);
- _TIFFmemcpy(val, &v2, tv_size);
- }
- break;
- case TIFF_SHORT:
- {
- uint16 v2 = (uint16)va_arg(ap, int);
- _TIFFmemcpy(val, &v2, tv_size);
- }
- break;
- case TIFF_SSHORT:
- {
- int16 v2 = (int16)va_arg(ap, int);
- _TIFFmemcpy(val, &v2, tv_size);
- }
- break;
- case TIFF_LONG:
- case TIFF_IFD:
- {
- uint32 v2 = va_arg(ap, uint32);
- _TIFFmemcpy(val, &v2, tv_size);
- }
- break;
- case TIFF_SLONG:
- {
- int32 v2 = va_arg(ap, int32);
- _TIFFmemcpy(val, &v2, tv_size);
- }
- break;
- case TIFF_LONG8:
- case TIFF_IFD8:
- {
- uint64 v2 = va_arg(ap, uint64);
- _TIFFmemcpy(val, &v2, tv_size);
- }
- break;
- case TIFF_SLONG8:
- {
- int64 v2 = va_arg(ap, int64);
- _TIFFmemcpy(val, &v2, tv_size);
- }
- break;
- case TIFF_RATIONAL:
- case TIFF_SRATIONAL:
- case TIFF_FLOAT:
- {
- float v2 = _TIFFClampDoubleToFloat(va_arg(ap, double));
- _TIFFmemcpy(val, &v2, tv_size);
- }
- break;
- case TIFF_DOUBLE:
- {
- double v2 = va_arg(ap, double);
- _TIFFmemcpy(val, &v2, tv_size);
- }
- break;
- default:
- _TIFFmemset(val, 0, tv_size);
- status = 0;
- break;
- }
- }
- }
- }
- }
- if (status) {
- const TIFFField* fip2=TIFFFieldWithTag(tif,tag);
- if (fip2)
- TIFFSetFieldBit(tif, fip2->field_bit);
- tif->tif_flags |= TIFF_DIRTYDIRECT;
- }
+ break;
+ case TIFFTAG_NUMBEROFINKS:
+ v = (uint16_t)va_arg(ap, uint16_vap);
+ /* If InkNames already set also NumberOfInks is set accordingly and
+ * should be equal */
+ if (TIFFFieldSet(tif, FIELD_INKNAMES))
+ {
+ if (v != td->td_numberofinks)
+ {
+ TIFFErrorExtR(
+ tif, module,
+ "Error %s; Tag %s:\n It is not possible to set the "
+ "value %" PRIu32
+ " for NumberOfInks\n which is different from the "
+ "number of inks in the InkNames tag (%" PRIu16 ")",
+ tif->tif_name, fip->field_name, v, td->td_numberofinks);
+ /* Do not set / overwrite number of inks already set by
+ * InkNames case accordingly. */
+ status = 0;
+ }
+ }
+ else
+ {
+ td->td_numberofinks = (uint16_t)v;
+ if (TIFFFieldSet(tif, FIELD_SAMPLESPERPIXEL))
+ {
+ if (td->td_numberofinks != td->td_samplesperpixel)
+ {
+ TIFFErrorExtR(tif, module,
+ "Warning %s; Tag %s:\n Value %" PRIu32
+ " of NumberOfInks is different from the "
+ "SamplesPerPixel value %" PRIu16 "",
+ tif->tif_name, fip->field_name, v,
+ td->td_samplesperpixel);
+ }
+ }
+ }
+ break;
+ case TIFFTAG_PERSAMPLE:
+ v = (uint16_t)va_arg(ap, uint16_vap);
+ if (v == PERSAMPLE_MULTI)
+ tif->tif_flags |= TIFF_PERSAMPLE;
+ else
+ tif->tif_flags &= ~TIFF_PERSAMPLE;
+ break;
+ default:
+ {
+ TIFFTagValue *tv;
+ int tv_size, iCustom;
+
+ /*
+ * This can happen if multiple images are open with different
+ * codecs which have private tags. The global tag information
+ * table may then have tags that are valid for one file but not
+ * the other. If the client tries to set a tag that is not valid
+ * for the image's codec then we'll arrive here. This
+ * happens, for example, when tiffcp is used to convert between
+ * compression schemes and codec-specific tags are blindly copied.
+ *
+ * This also happens when a FIELD_IGNORE tag is written.
+ */
+ if (fip->field_bit == FIELD_IGNORE)
+ {
+ TIFFErrorExtR(
+ tif, module,
+ "%s: Ignored %stag \"%s\" (not supported by libtiff)",
+ tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "",
+ fip->field_name);
+ status = 0;
+ break;
+ }
+ if (fip->field_bit != FIELD_CUSTOM)
+ {
+ TIFFErrorExtR(
+ tif, module,
+ "%s: Invalid %stag \"%s\" (not supported by codec)",
+ tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "",
+ fip->field_name);
+ status = 0;
+ break;
+ }
+
+ /*
+ * Find the existing entry for this custom value.
+ */
+ tv = NULL;
+ for (iCustom = 0; iCustom < td->td_customValueCount; iCustom++)
+ {
+ if (td->td_customValues[iCustom].info->field_tag == tag)
+ {
+ tv = td->td_customValues + iCustom;
+ if (tv->value != NULL)
+ {
+ _TIFFfreeExt(tif, tv->value);
+ tv->value = NULL;
+ }
+ break;
+ }
+ }
+
+ /*
+ * Grow the custom list if the entry was not found.
+ */
+ if (tv == NULL)
+ {
+ TIFFTagValue *new_customValues;
+
+ td->td_customValueCount++;
+ new_customValues = (TIFFTagValue *)_TIFFreallocExt(
+ tif, td->td_customValues,
+ sizeof(TIFFTagValue) * td->td_customValueCount);
+ if (!new_customValues)
+ {
+ TIFFErrorExtR(tif, module,
+ "%s: Failed to allocate space for list of "
+ "custom values",
+ tif->tif_name);
+ status = 0;
+ goto end;
+ }
+
+ td->td_customValues = new_customValues;
+
+ tv = td->td_customValues + (td->td_customValueCount - 1);
+ tv->info = fip;
+ tv->value = NULL;
+ tv->count = 0;
+ }
+
+ /*
+ * Set custom value ... save a copy of the custom tag value.
+ */
+ /*--: Rational2Double: For Rationals evaluate "set_field_type" to
+ * determine internal storage size. */
+ tv_size = TIFFFieldSetGetSize(fip);
+ if (tv_size == 0)
+ {
+ status = 0;
+ TIFFErrorExtR(tif, module, "%s: Bad field type %d for \"%s\"",
+ tif->tif_name, fip->field_type, fip->field_name);
+ goto end;
+ }
+
+ if (fip->field_type == TIFF_ASCII)
+ {
+ uint32_t ma;
+ const char *mb;
+ if (fip->field_passcount)
+ {
+ assert(fip->field_writecount == TIFF_VARIABLE2);
+ ma = (uint32_t)va_arg(ap, uint32_t);
+ mb = (const char *)va_arg(ap, const char *);
+ }
+ else
+ {
+ mb = (const char *)va_arg(ap, const char *);
+ size_t len = strlen(mb) + 1;
+ if (len >= 0x80000000U)
+ {
+ status = 0;
+ TIFFErrorExtR(tif, module,
+ "%s: Too long string value for \"%s\". "
+ "Maximum supported is 2147483647 bytes",
+ tif->tif_name, fip->field_name);
+ goto end;
+ }
+ ma = (uint32_t)len;
+ }
+ tv->count = ma;
+ setByteArray(tif, &tv->value, mb, ma, 1);
+ }
+ else
+ {
+ if (fip->field_passcount)
+ {
+ if (fip->field_writecount == TIFF_VARIABLE2)
+ tv->count = (uint32_t)va_arg(ap, uint32_t);
+ else
+ tv->count = (int)va_arg(ap, int);
+ }
+ else if (fip->field_writecount == TIFF_VARIABLE ||
+ fip->field_writecount == TIFF_VARIABLE2)
+ tv->count = 1;
+ else if (fip->field_writecount == TIFF_SPP)
+ tv->count = td->td_samplesperpixel;
+ else
+ tv->count = fip->field_writecount;
+
+ if (tv->count == 0)
+ {
+ status = 0;
+ TIFFErrorExtR(tif, module,
+ "%s: Null count for \"%s\" (type "
+ "%d, writecount %d, passcount %d)",
+ tif->tif_name, fip->field_name,
+ fip->field_type, fip->field_writecount,
+ fip->field_passcount);
+ goto end;
+ }
+
+ tv->value = _TIFFCheckMalloc(tif, tv->count, tv_size,
+ "custom tag binary object");
+ if (!tv->value)
+ {
+ status = 0;
+ goto end;
+ }
+
+ if (fip->field_tag == TIFFTAG_DOTRANGE &&
+ strcmp(fip->field_name, "DotRange") == 0)
+ {
+ /* TODO: This is an evil exception and should not have been
+ handled this way ... likely best if we move it into
+ the directory structure with an explicit field in
+ libtiff 4.1 and assign it a FIELD_ value */
+ uint16_t v2[2];
+ v2[0] = (uint16_t)va_arg(ap, int);
+ v2[1] = (uint16_t)va_arg(ap, int);
+ _TIFFmemcpy(tv->value, &v2, 4);
+ }
+
+ else if (fip->field_passcount ||
+ fip->field_writecount == TIFF_VARIABLE ||
+ fip->field_writecount == TIFF_VARIABLE2 ||
+ fip->field_writecount == TIFF_SPP || tv->count > 1)
+ {
+ /*--: Rational2Double: For Rationals tv_size is set above to
+ * 4 or 8 according to fip->set_field_type! */
+ _TIFFmemcpy(tv->value, va_arg(ap, void *),
+ tv->count * tv_size);
+ /* Test here for too big values for LONG8, SLONG8 in
+ * ClassicTIFF and delete custom field from custom list */
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ if (tv->info->field_type == TIFF_LONG8)
+ {
+ uint64_t *pui64 = (uint64_t *)tv->value;
+ for (int i = 0; i < tv->count; i++)
+ {
+ if (pui64[i] > 0xffffffffu)
+ {
+ TIFFErrorExtR(
+ tif, module,
+ "%s: Bad LONG8 value %" PRIu64
+ " at %d. array position for \"%s\" tag "
+ "%d in ClassicTIFF. Tag won't be "
+ "written to file",
+ tif->tif_name, pui64[i], i,
+ fip->field_name, tag);
+ goto badvalueifd8long8;
+ }
+ }
+ }
+ else if (tv->info->field_type == TIFF_SLONG8)
+ {
+ int64_t *pi64 = (int64_t *)tv->value;
+ for (int i = 0; i < tv->count; i++)
+ {
+ if (pi64[i] > 2147483647 ||
+ pi64[i] < (-2147483647 - 1))
+ {
+ TIFFErrorExtR(
+ tif, module,
+ "%s: Bad SLONG8 value %" PRIi64
+ " at %d. array position for \"%s\" tag "
+ "%d in ClassicTIFF. Tag won't be "
+ "written to file",
+ tif->tif_name, pi64[i], i,
+ fip->field_name, tag);
+ goto badvalueifd8long8;
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ char *val = (char *)tv->value;
+ assert(tv->count == 1);
+
+ switch (fip->field_type)
+ {
+ case TIFF_BYTE:
+ case TIFF_UNDEFINED:
+ {
+ uint8_t v2 = (uint8_t)va_arg(ap, int);
+ _TIFFmemcpy(val, &v2, tv_size);
+ }
+ break;
+ case TIFF_SBYTE:
+ {
+ int8_t v2 = (int8_t)va_arg(ap, int);
+ _TIFFmemcpy(val, &v2, tv_size);
+ }
+ break;
+ case TIFF_SHORT:
+ {
+ uint16_t v2 = (uint16_t)va_arg(ap, int);
+ _TIFFmemcpy(val, &v2, tv_size);
+ }
+ break;
+ case TIFF_SSHORT:
+ {
+ int16_t v2 = (int16_t)va_arg(ap, int);
+ _TIFFmemcpy(val, &v2, tv_size);
+ }
+ break;
+ case TIFF_LONG:
+ case TIFF_IFD:
+ {
+ uint32_t v2 = va_arg(ap, uint32_t);
+ _TIFFmemcpy(val, &v2, tv_size);
+ }
+ break;
+ case TIFF_SLONG:
+ {
+ int32_t v2 = va_arg(ap, int32_t);
+ _TIFFmemcpy(val, &v2, tv_size);
+ }
+ break;
+ case TIFF_LONG8:
+ case TIFF_IFD8:
+ {
+ uint64_t v2 = va_arg(ap, uint64_t);
+ _TIFFmemcpy(val, &v2, tv_size);
+ /* Test here for too big values for ClassicTIFF and
+ * delete custom field from custom list */
+ if (!(tif->tif_flags & TIFF_BIGTIFF) &&
+ (v2 > 0xffffffffu))
+ {
+ TIFFErrorExtR(
+ tif, module,
+ "%s: Bad LONG8 or IFD8 value %" PRIu64
+ " for \"%s\" tag %d in ClassicTIFF. Tag "
+ "won't be written to file",
+ tif->tif_name, v2, fip->field_name, tag);
+ goto badvalueifd8long8;
+ }
+ }
+ break;
+ case TIFF_SLONG8:
+ {
+ int64_t v2 = va_arg(ap, int64_t);
+ _TIFFmemcpy(val, &v2, tv_size);
+ /* Test here for too big values for ClassicTIFF and
+ * delete custom field from custom list */
+ if (!(tif->tif_flags & TIFF_BIGTIFF) &&
+ ((v2 > 2147483647) || (v2 < (-2147483647 - 1))))
+ {
+ TIFFErrorExtR(
+ tif, module,
+ "%s: Bad SLONG8 value %" PRIi64
+ " for \"%s\" tag %d in ClassicTIFF. Tag "
+ "won't be written to file",
+ tif->tif_name, v2, fip->field_name, tag);
+ goto badvalueifd8long8;
+ }
+ }
+ break;
+ case TIFF_RATIONAL:
+ case TIFF_SRATIONAL:
+ /*-- Rational2Double: For Rationals tv_size is set
+ * above to 4 or 8 according to fip->set_field_type!
+ */
+ {
+ if (tv_size == 8)
+ {
+ double v2 = va_arg(ap, double);
+ _TIFFmemcpy(val, &v2, tv_size);
+ }
+ else
+ {
+ /*-- default should be tv_size == 4 */
+ float v3 = (float)va_arg(ap, double);
+ _TIFFmemcpy(val, &v3, tv_size);
+ /*-- ToDo: After Testing, this should be
+ * removed and tv_size==4 should be set as
+ * default. */
+ if (tv_size != 4)
+ {
+ TIFFErrorExtR(
+ tif, module,
+ "Rational2Double: .set_field_type "
+ "in not 4 but %d",
+ tv_size);
+ }
+ }
+ }
+ break;
+ case TIFF_FLOAT:
+ {
+ float v2 =
+ _TIFFClampDoubleToFloat(va_arg(ap, double));
+ _TIFFmemcpy(val, &v2, tv_size);
+ }
+ break;
+ case TIFF_DOUBLE:
+ {
+ double v2 = va_arg(ap, double);
+ _TIFFmemcpy(val, &v2, tv_size);
+ }
+ break;
+ default:
+ _TIFFmemset(val, 0, tv_size);
+ status = 0;
+ break;
+ }
+ }
+ }
+ }
+ }
+ if (status)
+ {
+ const TIFFField *fip2 = TIFFFieldWithTag(tif, tag);
+ if (fip2)
+ TIFFSetFieldBit(tif, fip2->field_bit);
+ tif->tif_flags |= TIFF_DIRTYDIRECT;
+ }
end:
- va_end(ap);
- return (status);
+ va_end(ap);
+ return (status);
badvalue:
+{
+ const TIFFField *fip2 = TIFFFieldWithTag(tif, tag);
+ TIFFErrorExtR(tif, module, "%s: Bad value %" PRIu32 " for \"%s\" tag",
+ tif->tif_name, v, fip2 ? fip2->field_name : "Unknown");
+ va_end(ap);
+}
+ return (0);
+badvalue32:
+{
+ const TIFFField *fip2 = TIFFFieldWithTag(tif, tag);
+ TIFFErrorExtR(tif, module, "%s: Bad value %" PRIu32 " for \"%s\" tag",
+ tif->tif_name, v32, fip2 ? fip2->field_name : "Unknown");
+ va_end(ap);
+}
+ return (0);
+badvaluedouble:
+{
+ const TIFFField *fip2 = TIFFFieldWithTag(tif, tag);
+ TIFFErrorExtR(tif, module, "%s: Bad value %f for \"%s\" tag", tif->tif_name,
+ dblval, fip2 ? fip2->field_name : "Unknown");
+ va_end(ap);
+}
+ return (0);
+badvalueifd8long8:
+{
+ /* Error message issued already above. */
+ TIFFTagValue *tv2 = NULL;
+ int iCustom2, iC2;
+ /* Find the existing entry for this custom value. */
+ for (iCustom2 = 0; iCustom2 < td->td_customValueCount; iCustom2++)
+ {
+ if (td->td_customValues[iCustom2].info->field_tag == tag)
{
- const TIFFField* fip2=TIFFFieldWithTag(tif,tag);
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Bad value %u for \"%s\" tag",
- tif->tif_name, v,
- fip2 ? fip2->field_name : "Unknown");
- va_end(ap);
+ tv2 = td->td_customValues + (iCustom2);
+ break;
}
- return (0);
-badvalue32:
+ }
+ if (tv2 != NULL)
+ {
+ /* Remove custom field from custom list */
+ if (tv2->value != NULL)
{
- const TIFFField* fip2=TIFFFieldWithTag(tif,tag);
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Bad value %u for \"%s\" tag",
- tif->tif_name, v32,
- fip2 ? fip2->field_name : "Unknown");
- va_end(ap);
+ _TIFFfreeExt(tif, tv2->value);
+ tv2->value = NULL;
}
- return (0);
-badvaluedouble:
+ /* Shorten list and close gap in customValues list.
+ * Re-allocation of td_customValues not necessary here. */
+ td->td_customValueCount--;
+ for (iC2 = iCustom2; iC2 < td->td_customValueCount; iC2++)
{
- const TIFFField* fip2=TIFFFieldWithTag(tif,tag);
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Bad value %f for \"%s\" tag",
- tif->tif_name, dblval,
- fip2 ? fip2->field_name : "Unknown");
- va_end(ap);
+ td->td_customValues[iC2] = td->td_customValues[iC2 + 1];
}
- return (0);
+ }
+ else
+ {
+ assert(0);
+ }
+ va_end(ap);
}
+ return (0);
+} /*-- _TIFFVSetField() --*/
/*
* Return 1/0 according to whether or not
@@ -770,29 +1110,30 @@ badvaluedouble:
* has commenced, unless its value has no effect
* on the format of the data that is written.
*/
-static int
-OkToChangeTag(TIFF* tif, uint32 tag)
+static int OkToChangeTag(TIFF *tif, uint32_t tag)
{
- const TIFFField* fip = TIFFFindField(tif, tag, TIFF_ANY);
- if (!fip) { /* unknown tag */
- TIFFErrorExt(tif->tif_clientdata, "TIFFSetField", "%s: Unknown %stag %u",
- tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "", tag);
- return (0);
- }
- if (tag != TIFFTAG_IMAGELENGTH && (tif->tif_flags & TIFF_BEENWRITING) &&
- !fip->field_oktochange) {
- /*
- * Consult info table to see if tag can be changed
- * after we've started writing. We only allow changes
- * to those tags that don't/shouldn't affect the
- * compression and/or format of the data.
- */
- TIFFErrorExt(tif->tif_clientdata, "TIFFSetField",
- "%s: Cannot modify tag \"%s\" while writing",
- tif->tif_name, fip->field_name);
- return (0);
- }
- return (1);
+ const TIFFField *fip = TIFFFindField(tif, tag, TIFF_ANY);
+ if (!fip)
+ { /* unknown tag */
+ TIFFErrorExtR(tif, "TIFFSetField", "%s: Unknown %stag %" PRIu32,
+ tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "", tag);
+ return (0);
+ }
+ if (tag != TIFFTAG_IMAGELENGTH && (tif->tif_flags & TIFF_BEENWRITING) &&
+ !fip->field_oktochange)
+ {
+ /*
+ * Consult info table to see if tag can be changed
+ * after we've started writing. We only allow changes
+ * to those tags that don't/shouldn't affect the
+ * compression and/or format of the data.
+ */
+ TIFFErrorExtR(tif, "TIFFSetField",
+ "%s: Cannot modify tag \"%s\" while writing",
+ tif->tif_name, fip->field_name);
+ return (0);
+ }
+ return (1);
}
/*
@@ -802,54 +1143,54 @@ OkToChangeTag(TIFF* tif, uint32 tag)
* when/if the directory structure is
* updated.
*/
-int
-TIFFSetField(TIFF* tif, uint32 tag, ...)
+int TIFFSetField(TIFF *tif, uint32_t tag, ...)
{
- va_list ap;
- int status;
+ va_list ap;
+ int status;
- va_start(ap, tag);
- status = TIFFVSetField(tif, tag, ap);
- va_end(ap);
- return (status);
+ va_start(ap, tag);
+ status = TIFFVSetField(tif, tag, ap);
+ va_end(ap);
+ return (status);
}
/*
* Clear the contents of the field in the internal structure.
*/
-int
-TIFFUnsetField(TIFF* tif, uint32 tag)
+int TIFFUnsetField(TIFF *tif, uint32_t tag)
{
- const TIFFField *fip = TIFFFieldWithTag(tif, tag);
- TIFFDirectory* td = &tif->tif_dir;
+ const TIFFField *fip = TIFFFieldWithTag(tif, tag);
+ TIFFDirectory *td = &tif->tif_dir;
- if( !fip )
+ if (!fip)
return 0;
- if( fip->field_bit != FIELD_CUSTOM )
+ if (fip->field_bit != FIELD_CUSTOM)
TIFFClrFieldBit(tif, fip->field_bit);
else
{
TIFFTagValue *tv = NULL;
int i;
- for (i = 0; i < td->td_customValueCount; i++) {
-
+ for (i = 0; i < td->td_customValueCount; i++)
+ {
+
tv = td->td_customValues + i;
- if( tv->info->field_tag == tag )
+ if (tv->info->field_tag == tag)
break;
}
- if( i < td->td_customValueCount )
+ if (i < td->td_customValueCount)
{
- _TIFFfree(tv->value);
- for( ; i < td->td_customValueCount-1; i++) {
- td->td_customValues[i] = td->td_customValues[i+1];
+ _TIFFfreeExt(tif, tv->value);
+ for (; i < td->td_customValueCount - 1; i++)
+ {
+ td->td_customValues[i] = td->td_customValues[i + 1];
}
td->td_customValueCount--;
}
}
-
+
tif->tif_flags |= TIFF_DIRTYDIRECT;
return (1);
@@ -861,382 +1202,392 @@ TIFFUnsetField(TIFF* tif, uint32 tag)
* for building higher-level interfaces on
* top of the library.
*/
-int
-TIFFVSetField(TIFF* tif, uint32 tag, va_list ap)
+int TIFFVSetField(TIFF *tif, uint32_t tag, va_list ap)
{
- return OkToChangeTag(tif, tag) ?
- (*tif->tif_tagmethods.vsetfield)(tif, tag, ap) : 0;
+ return OkToChangeTag(tif, tag)
+ ? (*tif->tif_tagmethods.vsetfield)(tif, tag, ap)
+ : 0;
}
-static int
-_TIFFVGetField(TIFF* tif, uint32 tag, va_list ap)
+static int _TIFFVGetField(TIFF *tif, uint32_t tag, va_list ap)
{
- TIFFDirectory* td = &tif->tif_dir;
- int ret_val = 1;
- uint32 standard_tag = tag;
- const TIFFField* fip = TIFFFindField(tif, tag, TIFF_ANY);
- if( fip == NULL ) /* cannot happen since TIFFGetField() already checks it */
- return 0;
-
- /*
- * We want to force the custom code to be used for custom
- * fields even if the tag happens to match a well known
- * one - important for reinterpreted handling of standard
- * tag values in custom directories (i.e. EXIF)
- */
- if (fip->field_bit == FIELD_CUSTOM) {
- standard_tag = 0;
- }
-
- if( standard_tag == TIFFTAG_NUMBEROFINKS )
+ TIFFDirectory *td = &tif->tif_dir;
+ int ret_val = 1;
+ uint32_t standard_tag = tag;
+ const TIFFField *fip = TIFFFindField(tif, tag, TIFF_ANY);
+ if (fip == NULL) /* cannot happen since TIFFGetField() already checks it */
+ return 0;
+
+ /*
+ * We want to force the custom code to be used for custom
+ * fields even if the tag happens to match a well known
+ * one - important for reinterpreted handling of standard
+ * tag values in custom directories (i.e. EXIF)
+ */
+ if (fip->field_bit == FIELD_CUSTOM)
+ {
+ standard_tag = 0;
+ }
+
+ switch (standard_tag)
+ {
+ case TIFFTAG_SUBFILETYPE:
+ *va_arg(ap, uint32_t *) = td->td_subfiletype;
+ break;
+ case TIFFTAG_IMAGEWIDTH:
+ *va_arg(ap, uint32_t *) = td->td_imagewidth;
+ break;
+ case TIFFTAG_IMAGELENGTH:
+ *va_arg(ap, uint32_t *) = td->td_imagelength;
+ break;
+ case TIFFTAG_BITSPERSAMPLE:
+ *va_arg(ap, uint16_t *) = td->td_bitspersample;
+ break;
+ case TIFFTAG_COMPRESSION:
+ *va_arg(ap, uint16_t *) = td->td_compression;
+ break;
+ case TIFFTAG_PHOTOMETRIC:
+ *va_arg(ap, uint16_t *) = td->td_photometric;
+ break;
+ case TIFFTAG_THRESHHOLDING:
+ *va_arg(ap, uint16_t *) = td->td_threshholding;
+ break;
+ case TIFFTAG_FILLORDER:
+ *va_arg(ap, uint16_t *) = td->td_fillorder;
+ break;
+ case TIFFTAG_ORIENTATION:
+ *va_arg(ap, uint16_t *) = td->td_orientation;
+ break;
+ case TIFFTAG_SAMPLESPERPIXEL:
+ *va_arg(ap, uint16_t *) = td->td_samplesperpixel;
+ break;
+ case TIFFTAG_ROWSPERSTRIP:
+ *va_arg(ap, uint32_t *) = td->td_rowsperstrip;
+ break;
+ case TIFFTAG_MINSAMPLEVALUE:
+ *va_arg(ap, uint16_t *) = td->td_minsamplevalue;
+ break;
+ case TIFFTAG_MAXSAMPLEVALUE:
+ *va_arg(ap, uint16_t *) = td->td_maxsamplevalue;
+ break;
+ case TIFFTAG_SMINSAMPLEVALUE:
+ if (tif->tif_flags & TIFF_PERSAMPLE)
+ *va_arg(ap, double **) = td->td_sminsamplevalue;
+ else
+ {
+ /* libtiff historically treats this as a single value. */
+ uint16_t i;
+ double v = td->td_sminsamplevalue[0];
+ for (i = 1; i < td->td_samplesperpixel; ++i)
+ if (td->td_sminsamplevalue[i] < v)
+ v = td->td_sminsamplevalue[i];
+ *va_arg(ap, double *) = v;
+ }
+ break;
+ case TIFFTAG_SMAXSAMPLEVALUE:
+ if (tif->tif_flags & TIFF_PERSAMPLE)
+ *va_arg(ap, double **) = td->td_smaxsamplevalue;
+ else
+ {
+ /* libtiff historically treats this as a single value. */
+ uint16_t i;
+ double v = td->td_smaxsamplevalue[0];
+ for (i = 1; i < td->td_samplesperpixel; ++i)
+ if (td->td_smaxsamplevalue[i] > v)
+ v = td->td_smaxsamplevalue[i];
+ *va_arg(ap, double *) = v;
+ }
+ break;
+ case TIFFTAG_XRESOLUTION:
+ *va_arg(ap, float *) = td->td_xresolution;
+ break;
+ case TIFFTAG_YRESOLUTION:
+ *va_arg(ap, float *) = td->td_yresolution;
+ break;
+ case TIFFTAG_PLANARCONFIG:
+ *va_arg(ap, uint16_t *) = td->td_planarconfig;
+ break;
+ case TIFFTAG_XPOSITION:
+ *va_arg(ap, float *) = td->td_xposition;
+ break;
+ case TIFFTAG_YPOSITION:
+ *va_arg(ap, float *) = td->td_yposition;
+ break;
+ case TIFFTAG_RESOLUTIONUNIT:
+ *va_arg(ap, uint16_t *) = td->td_resolutionunit;
+ break;
+ case TIFFTAG_PAGENUMBER:
+ *va_arg(ap, uint16_t *) = td->td_pagenumber[0];
+ *va_arg(ap, uint16_t *) = td->td_pagenumber[1];
+ break;
+ case TIFFTAG_HALFTONEHINTS:
+ *va_arg(ap, uint16_t *) = td->td_halftonehints[0];
+ *va_arg(ap, uint16_t *) = td->td_halftonehints[1];
+ break;
+ case TIFFTAG_COLORMAP:
+ *va_arg(ap, const uint16_t **) = td->td_colormap[0];
+ *va_arg(ap, const uint16_t **) = td->td_colormap[1];
+ *va_arg(ap, const uint16_t **) = td->td_colormap[2];
+ break;
+ case TIFFTAG_STRIPOFFSETS:
+ case TIFFTAG_TILEOFFSETS:
+ _TIFFFillStriles(tif);
+ *va_arg(ap, const uint64_t **) = td->td_stripoffset_p;
+ if (td->td_stripoffset_p == NULL)
+ ret_val = 0;
+ break;
+ case TIFFTAG_STRIPBYTECOUNTS:
+ case TIFFTAG_TILEBYTECOUNTS:
+ _TIFFFillStriles(tif);
+ *va_arg(ap, const uint64_t **) = td->td_stripbytecount_p;
+ if (td->td_stripbytecount_p == NULL)
+ ret_val = 0;
+ break;
+ case TIFFTAG_MATTEING:
+ *va_arg(ap, uint16_t *) =
+ (td->td_extrasamples == 1 &&
+ td->td_sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA);
+ break;
+ case TIFFTAG_EXTRASAMPLES:
+ *va_arg(ap, uint16_t *) = td->td_extrasamples;
+ *va_arg(ap, const uint16_t **) = td->td_sampleinfo;
+ break;
+ case TIFFTAG_TILEWIDTH:
+ *va_arg(ap, uint32_t *) = td->td_tilewidth;
+ break;
+ case TIFFTAG_TILELENGTH:
+ *va_arg(ap, uint32_t *) = td->td_tilelength;
+ break;
+ case TIFFTAG_TILEDEPTH:
+ *va_arg(ap, uint32_t *) = td->td_tiledepth;
+ break;
+ case TIFFTAG_DATATYPE:
+ switch (td->td_sampleformat)
+ {
+ case SAMPLEFORMAT_UINT:
+ *va_arg(ap, uint16_t *) = DATATYPE_UINT;
+ break;
+ case SAMPLEFORMAT_INT:
+ *va_arg(ap, uint16_t *) = DATATYPE_INT;
+ break;
+ case SAMPLEFORMAT_IEEEFP:
+ *va_arg(ap, uint16_t *) = DATATYPE_IEEEFP;
+ break;
+ case SAMPLEFORMAT_VOID:
+ *va_arg(ap, uint16_t *) = DATATYPE_VOID;
+ break;
+ }
+ break;
+ case TIFFTAG_SAMPLEFORMAT:
+ *va_arg(ap, uint16_t *) = td->td_sampleformat;
+ break;
+ case TIFFTAG_IMAGEDEPTH:
+ *va_arg(ap, uint32_t *) = td->td_imagedepth;
+ break;
+ case TIFFTAG_SUBIFD:
+ *va_arg(ap, uint16_t *) = td->td_nsubifd;
+ *va_arg(ap, const uint64_t **) = td->td_subifd;
+ break;
+ case TIFFTAG_YCBCRPOSITIONING:
+ *va_arg(ap, uint16_t *) = td->td_ycbcrpositioning;
+ break;
+ case TIFFTAG_YCBCRSUBSAMPLING:
+ *va_arg(ap, uint16_t *) = td->td_ycbcrsubsampling[0];
+ *va_arg(ap, uint16_t *) = td->td_ycbcrsubsampling[1];
+ break;
+ case TIFFTAG_TRANSFERFUNCTION:
+ *va_arg(ap, const uint16_t **) = td->td_transferfunction[0];
+ if (td->td_samplesperpixel - td->td_extrasamples > 1)
+ {
+ *va_arg(ap, const uint16_t **) = td->td_transferfunction[1];
+ *va_arg(ap, const uint16_t **) = td->td_transferfunction[2];
+ }
+ else
+ {
+ *va_arg(ap, const uint16_t **) = NULL;
+ *va_arg(ap, const uint16_t **) = NULL;
+ }
+ break;
+ case TIFFTAG_REFERENCEBLACKWHITE:
+ *va_arg(ap, const float **) = td->td_refblackwhite;
+ break;
+ case TIFFTAG_INKNAMES:
+ *va_arg(ap, const char **) = td->td_inknames;
+ break;
+ case TIFFTAG_NUMBEROFINKS:
+ *va_arg(ap, uint16_t *) = td->td_numberofinks;
+ break;
+ default:
{
int i;
- for (i = 0; i < td->td_customValueCount; i++) {
- uint16 val;
+
+ /*
+ * This can happen if multiple images are open
+ * with different codecs which have private
+ * tags. The global tag information table may
+ * then have tags that are valid for one file
+ * but not the other. If the client tries to
+ * get a tag that is not valid for the image's
+ * codec then we'll arrive here.
+ */
+ if (fip->field_bit != FIELD_CUSTOM)
+ {
+ TIFFErrorExtR(tif, "_TIFFVGetField",
+ "%s: Invalid %stag \"%s\" "
+ "(not supported by codec)",
+ tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "",
+ fip->field_name);
+ ret_val = 0;
+ break;
+ }
+
+ /*
+ * Do we have a custom value?
+ */
+ ret_val = 0;
+ for (i = 0; i < td->td_customValueCount; i++)
+ {
TIFFTagValue *tv = td->td_customValues + i;
- if (tv->info->field_tag != standard_tag)
+
+ if (tv->info->field_tag != tag)
continue;
- if( tv->value == NULL )
- return 0;
- val = *(uint16 *)tv->value;
- /* Truncate to SamplesPerPixel, since the */
- /* setting code for INKNAMES assume that there are SamplesPerPixel */
- /* inknames. */
- /* Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2599 */
- if( val > td->td_samplesperpixel )
+
+ if (fip->field_passcount)
+ {
+ if (fip->field_readcount == TIFF_VARIABLE2)
+ *va_arg(ap, uint32_t *) = (uint32_t)tv->count;
+ else /* Assume TIFF_VARIABLE */
+ *va_arg(ap, uint16_t *) = (uint16_t)tv->count;
+ *va_arg(ap, const void **) = tv->value;
+ ret_val = 1;
+ }
+ else if (fip->field_tag == TIFFTAG_DOTRANGE &&
+ strcmp(fip->field_name, "DotRange") == 0)
{
- TIFFWarningExt(tif->tif_clientdata,"_TIFFVGetField",
- "Truncating NumberOfInks from %u to %u",
- val, td->td_samplesperpixel);
- val = td->td_samplesperpixel;
+ /* TODO: This is an evil exception and should not have been
+ handled this way ... likely best if we move it into
+ the directory structure with an explicit field in
+ libtiff 4.1 and assign it a FIELD_ value */
+ *va_arg(ap, uint16_t *) = ((uint16_t *)tv->value)[0];
+ *va_arg(ap, uint16_t *) = ((uint16_t *)tv->value)[1];
+ ret_val = 1;
}
- *va_arg(ap, uint16*) = val;
- return 1;
+ else
+ {
+ if (fip->field_type == TIFF_ASCII ||
+ fip->field_readcount == TIFF_VARIABLE ||
+ fip->field_readcount == TIFF_VARIABLE2 ||
+ fip->field_readcount == TIFF_SPP || tv->count > 1)
+ {
+ *va_arg(ap, void **) = tv->value;
+ ret_val = 1;
+ }
+ else
+ {
+ char *val = (char *)tv->value;
+ assert(tv->count == 1);
+ switch (fip->field_type)
+ {
+ case TIFF_BYTE:
+ case TIFF_UNDEFINED:
+ *va_arg(ap, uint8_t *) = *(uint8_t *)val;
+ ret_val = 1;
+ break;
+ case TIFF_SBYTE:
+ *va_arg(ap, int8_t *) = *(int8_t *)val;
+ ret_val = 1;
+ break;
+ case TIFF_SHORT:
+ *va_arg(ap, uint16_t *) = *(uint16_t *)val;
+ ret_val = 1;
+ break;
+ case TIFF_SSHORT:
+ *va_arg(ap, int16_t *) = *(int16_t *)val;
+ ret_val = 1;
+ break;
+ case TIFF_LONG:
+ case TIFF_IFD:
+ *va_arg(ap, uint32_t *) = *(uint32_t *)val;
+ ret_val = 1;
+ break;
+ case TIFF_SLONG:
+ *va_arg(ap, int32_t *) = *(int32_t *)val;
+ ret_val = 1;
+ break;
+ case TIFF_LONG8:
+ case TIFF_IFD8:
+ *va_arg(ap, uint64_t *) = *(uint64_t *)val;
+ ret_val = 1;
+ break;
+ case TIFF_SLONG8:
+ *va_arg(ap, int64_t *) = *(int64_t *)val;
+ ret_val = 1;
+ break;
+ case TIFF_RATIONAL:
+ case TIFF_SRATIONAL:
+ {
+ /*-- Rational2Double: For Rationals evaluate
+ * "set_field_type" to determine internal
+ * storage size and return value size. */
+ int tv_size = TIFFFieldSetGetSize(fip);
+ if (tv_size == 8)
+ {
+ *va_arg(ap, double *) = *(double *)val;
+ ret_val = 1;
+ }
+ else
+ {
+ /*-- default should be tv_size == 4 */
+ *va_arg(ap, float *) = *(float *)val;
+ ret_val = 1;
+ /*-- ToDo: After Testing, this should be
+ * removed and tv_size==4 should be set as
+ * default. */
+ if (tv_size != 4)
+ {
+ TIFFErrorExtR(
+ tif, "_TIFFVGetField",
+ "Rational2Double: .set_field_type "
+ "in not 4 but %d",
+ tv_size);
+ }
+ }
+ }
+ break;
+ case TIFF_FLOAT:
+ *va_arg(ap, float *) = *(float *)val;
+ ret_val = 1;
+ break;
+ case TIFF_DOUBLE:
+ *va_arg(ap, double *) = *(double *)val;
+ ret_val = 1;
+ break;
+ default:
+ ret_val = 0;
+ break;
+ }
+ }
+ }
+ break;
}
- return 0;
}
-
- switch (standard_tag) {
- case TIFFTAG_SUBFILETYPE:
- *va_arg(ap, uint32*) = td->td_subfiletype;
- break;
- case TIFFTAG_IMAGEWIDTH:
- *va_arg(ap, uint32*) = td->td_imagewidth;
- break;
- case TIFFTAG_IMAGELENGTH:
- *va_arg(ap, uint32*) = td->td_imagelength;
- break;
- case TIFFTAG_BITSPERSAMPLE:
- *va_arg(ap, uint16*) = td->td_bitspersample;
- break;
- case TIFFTAG_COMPRESSION:
- *va_arg(ap, uint16*) = td->td_compression;
- break;
- case TIFFTAG_PHOTOMETRIC:
- *va_arg(ap, uint16*) = td->td_photometric;
- break;
- case TIFFTAG_THRESHHOLDING:
- *va_arg(ap, uint16*) = td->td_threshholding;
- break;
- case TIFFTAG_FILLORDER:
- *va_arg(ap, uint16*) = td->td_fillorder;
- break;
- case TIFFTAG_ORIENTATION:
- *va_arg(ap, uint16*) = td->td_orientation;
- break;
- case TIFFTAG_SAMPLESPERPIXEL:
- *va_arg(ap, uint16*) = td->td_samplesperpixel;
- break;
- case TIFFTAG_ROWSPERSTRIP:
- *va_arg(ap, uint32*) = td->td_rowsperstrip;
- break;
- case TIFFTAG_MINSAMPLEVALUE:
- *va_arg(ap, uint16*) = td->td_minsamplevalue;
- break;
- case TIFFTAG_MAXSAMPLEVALUE:
- *va_arg(ap, uint16*) = td->td_maxsamplevalue;
- break;
- case TIFFTAG_SMINSAMPLEVALUE:
- if (tif->tif_flags & TIFF_PERSAMPLE)
- *va_arg(ap, double**) = td->td_sminsamplevalue;
- else
- {
- /* libtiff historically treats this as a single value. */
- uint16 i;
- double v = td->td_sminsamplevalue[0];
- for (i=1; i < td->td_samplesperpixel; ++i)
- if( td->td_sminsamplevalue[i] < v )
- v = td->td_sminsamplevalue[i];
- *va_arg(ap, double*) = v;
- }
- break;
- case TIFFTAG_SMAXSAMPLEVALUE:
- if (tif->tif_flags & TIFF_PERSAMPLE)
- *va_arg(ap, double**) = td->td_smaxsamplevalue;
- else
- {
- /* libtiff historically treats this as a single value. */
- uint16 i;
- double v = td->td_smaxsamplevalue[0];
- for (i=1; i < td->td_samplesperpixel; ++i)
- if( td->td_smaxsamplevalue[i] > v )
- v = td->td_smaxsamplevalue[i];
- *va_arg(ap, double*) = v;
- }
- break;
- case TIFFTAG_XRESOLUTION:
- *va_arg(ap, float*) = td->td_xresolution;
- break;
- case TIFFTAG_YRESOLUTION:
- *va_arg(ap, float*) = td->td_yresolution;
- break;
- case TIFFTAG_PLANARCONFIG:
- *va_arg(ap, uint16*) = td->td_planarconfig;
- break;
- case TIFFTAG_XPOSITION:
- *va_arg(ap, float*) = td->td_xposition;
- break;
- case TIFFTAG_YPOSITION:
- *va_arg(ap, float*) = td->td_yposition;
- break;
- case TIFFTAG_RESOLUTIONUNIT:
- *va_arg(ap, uint16*) = td->td_resolutionunit;
- break;
- case TIFFTAG_PAGENUMBER:
- *va_arg(ap, uint16*) = td->td_pagenumber[0];
- *va_arg(ap, uint16*) = td->td_pagenumber[1];
- break;
- case TIFFTAG_HALFTONEHINTS:
- *va_arg(ap, uint16*) = td->td_halftonehints[0];
- *va_arg(ap, uint16*) = td->td_halftonehints[1];
- break;
- case TIFFTAG_COLORMAP:
- *va_arg(ap, uint16**) = td->td_colormap[0];
- *va_arg(ap, uint16**) = td->td_colormap[1];
- *va_arg(ap, uint16**) = td->td_colormap[2];
- break;
- case TIFFTAG_STRIPOFFSETS:
- case TIFFTAG_TILEOFFSETS:
- _TIFFFillStriles( tif );
- *va_arg(ap, uint64**) = td->td_stripoffset_p;
- break;
- case TIFFTAG_STRIPBYTECOUNTS:
- case TIFFTAG_TILEBYTECOUNTS:
- _TIFFFillStriles( tif );
- *va_arg(ap, uint64**) = td->td_stripbytecount_p;
- break;
- case TIFFTAG_MATTEING:
- *va_arg(ap, uint16*) =
- (td->td_extrasamples == 1 &&
- td->td_sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA);
- break;
- case TIFFTAG_EXTRASAMPLES:
- *va_arg(ap, uint16*) = td->td_extrasamples;
- *va_arg(ap, uint16**) = td->td_sampleinfo;
- break;
- case TIFFTAG_TILEWIDTH:
- *va_arg(ap, uint32*) = td->td_tilewidth;
- break;
- case TIFFTAG_TILELENGTH:
- *va_arg(ap, uint32*) = td->td_tilelength;
- break;
- case TIFFTAG_TILEDEPTH:
- *va_arg(ap, uint32*) = td->td_tiledepth;
- break;
- case TIFFTAG_DATATYPE:
- switch (td->td_sampleformat) {
- case SAMPLEFORMAT_UINT:
- *va_arg(ap, uint16*) = DATATYPE_UINT;
- break;
- case SAMPLEFORMAT_INT:
- *va_arg(ap, uint16*) = DATATYPE_INT;
- break;
- case SAMPLEFORMAT_IEEEFP:
- *va_arg(ap, uint16*) = DATATYPE_IEEEFP;
- break;
- case SAMPLEFORMAT_VOID:
- *va_arg(ap, uint16*) = DATATYPE_VOID;
- break;
- }
- break;
- case TIFFTAG_SAMPLEFORMAT:
- *va_arg(ap, uint16*) = td->td_sampleformat;
- break;
- case TIFFTAG_IMAGEDEPTH:
- *va_arg(ap, uint32*) = td->td_imagedepth;
- break;
- case TIFFTAG_SUBIFD:
- *va_arg(ap, uint16*) = td->td_nsubifd;
- *va_arg(ap, uint64**) = td->td_subifd;
- break;
- case TIFFTAG_YCBCRPOSITIONING:
- *va_arg(ap, uint16*) = td->td_ycbcrpositioning;
- break;
- case TIFFTAG_YCBCRSUBSAMPLING:
- *va_arg(ap, uint16*) = td->td_ycbcrsubsampling[0];
- *va_arg(ap, uint16*) = td->td_ycbcrsubsampling[1];
- break;
- case TIFFTAG_TRANSFERFUNCTION:
- *va_arg(ap, uint16**) = td->td_transferfunction[0];
- if (td->td_samplesperpixel - td->td_extrasamples > 1) {
- *va_arg(ap, uint16**) = td->td_transferfunction[1];
- *va_arg(ap, uint16**) = td->td_transferfunction[2];
- } else {
- *va_arg(ap, uint16**) = NULL;
- *va_arg(ap, uint16**) = NULL;
- }
- break;
- case TIFFTAG_REFERENCEBLACKWHITE:
- *va_arg(ap, float**) = td->td_refblackwhite;
- break;
- case TIFFTAG_INKNAMES:
- *va_arg(ap, char**) = td->td_inknames;
- break;
- default:
- {
- int i;
-
- /*
- * This can happen if multiple images are open
- * with different codecs which have private
- * tags. The global tag information table may
- * then have tags that are valid for one file
- * but not the other. If the client tries to
- * get a tag that is not valid for the image's
- * codec then we'll arrive here.
- */
- if( fip->field_bit != FIELD_CUSTOM )
- {
- TIFFErrorExt(tif->tif_clientdata, "_TIFFVGetField",
- "%s: Invalid %stag \"%s\" "
- "(not supported by codec)",
- tif->tif_name,
- isPseudoTag(tag) ? "pseudo-" : "",
- fip->field_name);
- ret_val = 0;
- break;
- }
-
- /*
- * Do we have a custom value?
- */
- ret_val = 0;
- for (i = 0; i < td->td_customValueCount; i++) {
- TIFFTagValue *tv = td->td_customValues + i;
-
- if (tv->info->field_tag != tag)
- continue;
-
- if (fip->field_passcount) {
- if (fip->field_readcount == TIFF_VARIABLE2)
- *va_arg(ap, uint32*) = (uint32)tv->count;
- else /* Assume TIFF_VARIABLE */
- *va_arg(ap, uint16*) = (uint16)tv->count;
- *va_arg(ap, void **) = tv->value;
- ret_val = 1;
- } else if (fip->field_tag == TIFFTAG_DOTRANGE
- && strcmp(fip->field_name,"DotRange") == 0) {
- /* TODO: This is an evil exception and should not have been
- handled this way ... likely best if we move it into
- the directory structure with an explicit field in
- libtiff 4.1 and assign it a FIELD_ value */
- *va_arg(ap, uint16*) = ((uint16 *)tv->value)[0];
- *va_arg(ap, uint16*) = ((uint16 *)tv->value)[1];
- ret_val = 1;
- } else {
- if (fip->field_type == TIFF_ASCII
- || fip->field_readcount == TIFF_VARIABLE
- || fip->field_readcount == TIFF_VARIABLE2
- || fip->field_readcount == TIFF_SPP
- || tv->count > 1) {
- *va_arg(ap, void **) = tv->value;
- ret_val = 1;
- } else {
- char *val = (char *)tv->value;
- assert( tv->count == 1 );
- switch (fip->field_type) {
- case TIFF_BYTE:
- case TIFF_UNDEFINED:
- *va_arg(ap, uint8*) =
- *(uint8 *)val;
- ret_val = 1;
- break;
- case TIFF_SBYTE:
- *va_arg(ap, int8*) =
- *(int8 *)val;
- ret_val = 1;
- break;
- case TIFF_SHORT:
- *va_arg(ap, uint16*) =
- *(uint16 *)val;
- ret_val = 1;
- break;
- case TIFF_SSHORT:
- *va_arg(ap, int16*) =
- *(int16 *)val;
- ret_val = 1;
- break;
- case TIFF_LONG:
- case TIFF_IFD:
- *va_arg(ap, uint32*) =
- *(uint32 *)val;
- ret_val = 1;
- break;
- case TIFF_SLONG:
- *va_arg(ap, int32*) =
- *(int32 *)val;
- ret_val = 1;
- break;
- case TIFF_LONG8:
- case TIFF_IFD8:
- *va_arg(ap, uint64*) =
- *(uint64 *)val;
- ret_val = 1;
- break;
- case TIFF_SLONG8:
- *va_arg(ap, int64*) =
- *(int64 *)val;
- ret_val = 1;
- break;
- case TIFF_RATIONAL:
- case TIFF_SRATIONAL:
- case TIFF_FLOAT:
- *va_arg(ap, float*) =
- *(float *)val;
- ret_val = 1;
- break;
- case TIFF_DOUBLE:
- *va_arg(ap, double*) =
- *(double *)val;
- ret_val = 1;
- break;
- default:
- ret_val = 0;
- break;
- }
- }
- }
- break;
- }
- }
- }
- return(ret_val);
+ }
+ return (ret_val);
}
/*
* Return the value of a field in the
* internal directory structure.
*/
-int
-TIFFGetField(TIFF* tif, uint32 tag, ...)
+int TIFFGetField(TIFF *tif, uint32_t tag, ...)
{
- int status;
- va_list ap;
+ int status;
+ va_list ap;
- va_start(ap, tag);
- status = TIFFVGetField(tif, tag, ap);
- va_end(ap);
- return (status);
+ va_start(ap, tag);
+ status = TIFFVGetField(tif, tag, ap);
+ va_end(ap);
+ return (status);
}
/*
@@ -1245,74 +1596,75 @@ TIFFGetField(TIFF* tif, uint32 tag, ...)
* for building higher-level interfaces on
* top of the library.
*/
-int
-TIFFVGetField(TIFF* tif, uint32 tag, va_list ap)
+int TIFFVGetField(TIFF *tif, uint32_t tag, va_list ap)
{
- const TIFFField* fip = TIFFFindField(tif, tag, TIFF_ANY);
- return (fip && (isPseudoTag(tag) || TIFFFieldSet(tif, fip->field_bit)) ?
- (*tif->tif_tagmethods.vgetfield)(tif, tag, ap) : 0);
+ const TIFFField *fip = TIFFFindField(tif, tag, TIFF_ANY);
+ return (fip && (isPseudoTag(tag) || TIFFFieldSet(tif, fip->field_bit))
+ ? (*tif->tif_tagmethods.vgetfield)(tif, tag, ap)
+ : 0);
}
-#define CleanupField(member) { \
- if (td->member) { \
- _TIFFfree(td->member); \
- td->member = 0; \
- } \
-}
+#define CleanupField(member) \
+ { \
+ if (td->member) \
+ { \
+ _TIFFfreeExt(tif, td->member); \
+ td->member = 0; \
+ } \
+ }
/*
* Release storage associated with a directory.
*/
-void
-TIFFFreeDirectory(TIFF* tif)
+void TIFFFreeDirectory(TIFF *tif)
{
- TIFFDirectory *td = &tif->tif_dir;
- int i;
-
- _TIFFmemset(td->td_fieldsset, 0, FIELD_SETLONGS);
- CleanupField(td_sminsamplevalue);
- CleanupField(td_smaxsamplevalue);
- CleanupField(td_colormap[0]);
- CleanupField(td_colormap[1]);
- CleanupField(td_colormap[2]);
- CleanupField(td_sampleinfo);
- CleanupField(td_subifd);
- CleanupField(td_inknames);
- CleanupField(td_refblackwhite);
- CleanupField(td_transferfunction[0]);
- CleanupField(td_transferfunction[1]);
- CleanupField(td_transferfunction[2]);
- CleanupField(td_stripoffset_p);
- CleanupField(td_stripbytecount_p);
- td->td_stripoffsetbyteallocsize = 0;
- TIFFClrFieldBit(tif, FIELD_YCBCRSUBSAMPLING);
- TIFFClrFieldBit(tif, FIELD_YCBCRPOSITIONING);
-
- /* Cleanup custom tag values */
- for( i = 0; i < td->td_customValueCount; i++ ) {
- if (td->td_customValues[i].value)
- _TIFFfree(td->td_customValues[i].value);
- }
-
- td->td_customValueCount = 0;
- CleanupField(td_customValues);
-
- _TIFFmemset( &(td->td_stripoffset_entry), 0, sizeof(TIFFDirEntry));
- _TIFFmemset( &(td->td_stripbytecount_entry), 0, sizeof(TIFFDirEntry));
+ TIFFDirectory *td = &tif->tif_dir;
+ int i;
+
+ _TIFFmemset(td->td_fieldsset, 0, FIELD_SETLONGS);
+ CleanupField(td_sminsamplevalue);
+ CleanupField(td_smaxsamplevalue);
+ CleanupField(td_colormap[0]);
+ CleanupField(td_colormap[1]);
+ CleanupField(td_colormap[2]);
+ CleanupField(td_sampleinfo);
+ CleanupField(td_subifd);
+ CleanupField(td_inknames);
+ CleanupField(td_refblackwhite);
+ CleanupField(td_transferfunction[0]);
+ CleanupField(td_transferfunction[1]);
+ CleanupField(td_transferfunction[2]);
+ CleanupField(td_stripoffset_p);
+ CleanupField(td_stripbytecount_p);
+ td->td_stripoffsetbyteallocsize = 0;
+ TIFFClrFieldBit(tif, FIELD_YCBCRSUBSAMPLING);
+ TIFFClrFieldBit(tif, FIELD_YCBCRPOSITIONING);
+
+ /* Cleanup custom tag values */
+ for (i = 0; i < td->td_customValueCount; i++)
+ {
+ if (td->td_customValues[i].value)
+ _TIFFfreeExt(tif, td->td_customValues[i].value);
+ }
+
+ td->td_customValueCount = 0;
+ CleanupField(td_customValues);
+
+ _TIFFmemset(&(td->td_stripoffset_entry), 0, sizeof(TIFFDirEntry));
+ _TIFFmemset(&(td->td_stripbytecount_entry), 0, sizeof(TIFFDirEntry));
}
#undef CleanupField
/*
* Client Tag extension support (from Niles Ritter).
*/
-static TIFFExtendProc _TIFFextender = (TIFFExtendProc) NULL;
+static TIFFExtendProc _TIFFextender = (TIFFExtendProc)NULL;
-TIFFExtendProc
-TIFFSetTagExtender(TIFFExtendProc extender)
+TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc extender)
{
- TIFFExtendProc prev = _TIFFextender;
- _TIFFextender = extender;
- return (prev);
+ TIFFExtendProc prev = _TIFFextender;
+ _TIFFextender = extender;
+ return (prev);
}
/*
@@ -1322,322 +1674,378 @@ TIFFSetTagExtender(TIFFExtendProc extender)
* The newly created directory will not exist on the file till
* TIFFWriteDirectory(), TIFFFlush() or TIFFClose() is called.
*/
-int
-TIFFCreateDirectory(TIFF* tif)
+int TIFFCreateDirectory(TIFF *tif)
{
- TIFFDefaultDirectory(tif);
- tif->tif_diroff = 0;
- tif->tif_nextdiroff = 0;
- tif->tif_curoff = 0;
- tif->tif_row = (uint32) -1;
- tif->tif_curstrip = (uint32) -1;
-
- return 0;
+ TIFFDefaultDirectory(tif);
+ tif->tif_diroff = 0;
+ tif->tif_nextdiroff = 0;
+ tif->tif_curoff = 0;
+ tif->tif_row = (uint32_t)-1;
+ tif->tif_curstrip = (uint32_t)-1;
+
+ return 0;
}
-int
-TIFFCreateCustomDirectory(TIFF* tif, const TIFFFieldArray* infoarray)
+int TIFFCreateCustomDirectory(TIFF *tif, const TIFFFieldArray *infoarray)
{
- TIFFDefaultDirectory(tif);
-
- /*
- * Reset the field definitions to match the application provided list.
- * Hopefully TIFFDefaultDirectory() won't have done anything irreversable
- * based on it's assumption this is an image directory.
- */
- _TIFFSetupFields(tif, infoarray);
-
- tif->tif_diroff = 0;
- tif->tif_nextdiroff = 0;
- tif->tif_curoff = 0;
- tif->tif_row = (uint32) -1;
- tif->tif_curstrip = (uint32) -1;
-
- return 0;
+ TIFFDefaultDirectory(tif);
+
+ /*
+ * Reset the field definitions to match the application provided list.
+ * Hopefully TIFFDefaultDirectory() won't have done anything irreversible
+ * based on it's assumption this is an image directory.
+ */
+ _TIFFSetupFields(tif, infoarray);
+
+ tif->tif_diroff = 0;
+ tif->tif_nextdiroff = 0;
+ tif->tif_curoff = 0;
+ tif->tif_row = (uint32_t)-1;
+ tif->tif_curstrip = (uint32_t)-1;
+
+ return 0;
}
-int
-TIFFCreateEXIFDirectory(TIFF* tif)
+int TIFFCreateEXIFDirectory(TIFF *tif)
{
- const TIFFFieldArray* exifFieldArray;
- exifFieldArray = _TIFFGetExifFields();
- return TIFFCreateCustomDirectory(tif, exifFieldArray);
+ const TIFFFieldArray *exifFieldArray;
+ exifFieldArray = _TIFFGetExifFields();
+ return TIFFCreateCustomDirectory(tif, exifFieldArray);
+}
+
+/*
+ * Creates the EXIF GPS custom directory
+ */
+int TIFFCreateGPSDirectory(TIFF *tif)
+{
+ const TIFFFieldArray *gpsFieldArray;
+ gpsFieldArray = _TIFFGetGpsFields();
+ return TIFFCreateCustomDirectory(tif, gpsFieldArray);
}
/*
* Setup a default directory structure.
*/
-int
-TIFFDefaultDirectory(TIFF* tif)
+int TIFFDefaultDirectory(TIFF *tif)
{
- register TIFFDirectory* td = &tif->tif_dir;
- const TIFFFieldArray* tiffFieldArray;
-
- tiffFieldArray = _TIFFGetFields();
- _TIFFSetupFields(tif, tiffFieldArray);
-
- _TIFFmemset(td, 0, sizeof (*td));
- td->td_fillorder = FILLORDER_MSB2LSB;
- td->td_bitspersample = 1;
- td->td_threshholding = THRESHHOLD_BILEVEL;
- td->td_orientation = ORIENTATION_TOPLEFT;
- td->td_samplesperpixel = 1;
- td->td_rowsperstrip = (uint32) -1;
- td->td_tilewidth = 0;
- td->td_tilelength = 0;
- td->td_tiledepth = 1;
+ register TIFFDirectory *td = &tif->tif_dir;
+ const TIFFFieldArray *tiffFieldArray;
+
+ tiffFieldArray = _TIFFGetFields();
+ _TIFFSetupFields(tif, tiffFieldArray);
+
+ _TIFFmemset(td, 0, sizeof(*td));
+ td->td_fillorder = FILLORDER_MSB2LSB;
+ td->td_bitspersample = 1;
+ td->td_threshholding = THRESHHOLD_BILEVEL;
+ td->td_orientation = ORIENTATION_TOPLEFT;
+ td->td_samplesperpixel = 1;
+ td->td_rowsperstrip = (uint32_t)-1;
+ td->td_tilewidth = 0;
+ td->td_tilelength = 0;
+ td->td_tiledepth = 1;
#ifdef STRIPBYTECOUNTSORTED_UNUSED
- td->td_stripbytecountsorted = 1; /* Our own arrays always sorted. */
+ td->td_stripbytecountsorted = 1; /* Our own arrays always sorted. */
#endif
- td->td_resolutionunit = RESUNIT_INCH;
- td->td_sampleformat = SAMPLEFORMAT_UINT;
- td->td_imagedepth = 1;
- td->td_ycbcrsubsampling[0] = 2;
- td->td_ycbcrsubsampling[1] = 2;
- td->td_ycbcrpositioning = YCBCRPOSITION_CENTERED;
- tif->tif_postdecode = _TIFFNoPostDecode;
- tif->tif_foundfield = NULL;
- tif->tif_tagmethods.vsetfield = _TIFFVSetField;
- tif->tif_tagmethods.vgetfield = _TIFFVGetField;
- tif->tif_tagmethods.printdir = NULL;
- /*
- * Give client code a chance to install their own
- * tag extensions & methods, prior to compression overloads,
- * but do some prior cleanup first. (http://trac.osgeo.org/gdal/ticket/5054)
- */
- if (tif->tif_nfieldscompat > 0) {
- uint32 i;
-
- for (i = 0; i < tif->tif_nfieldscompat; i++) {
- if (tif->tif_fieldscompat[i].allocated_size)
- _TIFFfree(tif->tif_fieldscompat[i].fields);
- }
- _TIFFfree(tif->tif_fieldscompat);
- tif->tif_nfieldscompat = 0;
- tif->tif_fieldscompat = NULL;
- }
- if (_TIFFextender)
- (*_TIFFextender)(tif);
- (void) TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
- /*
- * NB: The directory is marked dirty as a result of setting
- * up the default compression scheme. However, this really
- * isn't correct -- we want TIFF_DIRTYDIRECT to be set only
- * if the user does something. We could just do the setup
- * by hand, but it seems better to use the normal mechanism
- * (i.e. TIFFSetField).
- */
- tif->tif_flags &= ~TIFF_DIRTYDIRECT;
-
- /*
- * As per http://bugzilla.remotesensing.org/show_bug.cgi?id=19
- * we clear the ISTILED flag when setting up a new directory.
- * Should we also be clearing stuff like INSUBIFD?
- */
- tif->tif_flags &= ~TIFF_ISTILED;
-
- return (1);
+ td->td_resolutionunit = RESUNIT_INCH;
+ td->td_sampleformat = SAMPLEFORMAT_UINT;
+ td->td_imagedepth = 1;
+ td->td_ycbcrsubsampling[0] = 2;
+ td->td_ycbcrsubsampling[1] = 2;
+ td->td_ycbcrpositioning = YCBCRPOSITION_CENTERED;
+ tif->tif_postdecode = _TIFFNoPostDecode;
+ tif->tif_foundfield = NULL;
+ tif->tif_tagmethods.vsetfield = _TIFFVSetField;
+ tif->tif_tagmethods.vgetfield = _TIFFVGetField;
+ tif->tif_tagmethods.printdir = NULL;
+ /* additional default values */
+ td->td_planarconfig = PLANARCONFIG_CONTIG;
+ td->td_compression = COMPRESSION_NONE;
+ td->td_subfiletype = 0;
+ td->td_minsamplevalue = 0;
+ /* td_bitspersample=1 is always set in TIFFDefaultDirectory().
+ * Therefore, td_maxsamplevalue has to be re-calculated in
+ * TIFFGetFieldDefaulted(). */
+ td->td_maxsamplevalue = 1; /* Default for td_bitspersample=1 */
+ td->td_extrasamples = 0;
+ td->td_sampleinfo = NULL;
+
+ /*
+ * Give client code a chance to install their own
+ * tag extensions & methods, prior to compression overloads,
+ * but do some prior cleanup first.
+ * (http://trac.osgeo.org/gdal/ticket/5054)
+ */
+ if (tif->tif_nfieldscompat > 0)
+ {
+ uint32_t i;
+
+ for (i = 0; i < tif->tif_nfieldscompat; i++)
+ {
+ if (tif->tif_fieldscompat[i].allocated_size)
+ _TIFFfreeExt(tif, tif->tif_fieldscompat[i].fields);
+ }
+ _TIFFfreeExt(tif, tif->tif_fieldscompat);
+ tif->tif_nfieldscompat = 0;
+ tif->tif_fieldscompat = NULL;
+ }
+ if (_TIFFextender)
+ (*_TIFFextender)(tif);
+ (void)TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
+ /*
+ * NB: The directory is marked dirty as a result of setting
+ * up the default compression scheme. However, this really
+ * isn't correct -- we want TIFF_DIRTYDIRECT to be set only
+ * if the user does something. We could just do the setup
+ * by hand, but it seems better to use the normal mechanism
+ * (i.e. TIFFSetField).
+ */
+ tif->tif_flags &= ~TIFF_DIRTYDIRECT;
+
+ /*
+ * As per http://bugzilla.remotesensing.org/show_bug.cgi?id=19
+ * we clear the ISTILED flag when setting up a new directory.
+ * Should we also be clearing stuff like INSUBIFD?
+ */
+ tif->tif_flags &= ~TIFF_ISTILED;
+
+ return (1);
}
-static int
-TIFFAdvanceDirectory(TIFF* tif, uint64* nextdir, uint64* off)
+static int TIFFAdvanceDirectory(TIFF *tif, uint64_t *nextdiroff, uint64_t *off,
+ tdir_t *nextdirnum)
{
- static const char module[] = "TIFFAdvanceDirectory";
- if (isMapped(tif))
- {
- uint64 poff=*nextdir;
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- tmsize_t poffa,poffb,poffc,poffd;
- uint16 dircount;
- uint32 nextdir32;
- poffa=(tmsize_t)poff;
- poffb=poffa+sizeof(uint16);
- if (((uint64)poffa!=poff)||(poffb<poffa)||(poffb<(tmsize_t)sizeof(uint16))||(poffb>tif->tif_size))
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Error fetching directory count");
- *nextdir=0;
- return(0);
- }
- _TIFFmemcpy(&dircount,tif->tif_base+poffa,sizeof(uint16));
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort(&dircount);
- poffc=poffb+dircount*12;
- poffd=poffc+sizeof(uint32);
- if ((poffc<poffb)||(poffc<dircount*12)||(poffd<poffc)||(poffd<(tmsize_t)sizeof(uint32))||(poffd>tif->tif_size))
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Error fetching directory link");
- return(0);
- }
- if (off!=NULL)
- *off=(uint64)poffc;
- _TIFFmemcpy(&nextdir32,tif->tif_base+poffc,sizeof(uint32));
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(&nextdir32);
- *nextdir=nextdir32;
- }
- else
- {
- tmsize_t poffa,poffb,poffc,poffd;
- uint64 dircount64;
- uint16 dircount16;
- poffa=(tmsize_t)poff;
- poffb=poffa+sizeof(uint64);
- if (((uint64)poffa!=poff)||(poffb<poffa)||(poffb<(tmsize_t)sizeof(uint64))||(poffb>tif->tif_size))
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Error fetching directory count");
- return(0);
- }
- _TIFFmemcpy(&dircount64,tif->tif_base+poffa,sizeof(uint64));
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8(&dircount64);
- if (dircount64>0xFFFF)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Sanity check on directory count failed");
- return(0);
- }
- dircount16=(uint16)dircount64;
- poffc=poffb+dircount16*20;
- poffd=poffc+sizeof(uint64);
- if ((poffc<poffb)||(poffc<dircount16*20)||(poffd<poffc)||(poffd<(tmsize_t)sizeof(uint64))||(poffd>tif->tif_size))
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Error fetching directory link");
- return(0);
- }
- if (off!=NULL)
- *off=(uint64)poffc;
- _TIFFmemcpy(nextdir,tif->tif_base+poffc,sizeof(uint64));
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8(nextdir);
- }
- return(1);
- }
- else
- {
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- uint16 dircount;
- uint32 nextdir32;
- if (!SeekOK(tif, *nextdir) ||
- !ReadOK(tif, &dircount, sizeof (uint16))) {
- TIFFErrorExt(tif->tif_clientdata, module, "%s: Error fetching directory count",
- tif->tif_name);
- return (0);
- }
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabShort(&dircount);
- if (off != NULL)
- *off = TIFFSeekFile(tif,
- dircount*12, SEEK_CUR);
- else
- (void) TIFFSeekFile(tif,
- dircount*12, SEEK_CUR);
- if (!ReadOK(tif, &nextdir32, sizeof (uint32))) {
- TIFFErrorExt(tif->tif_clientdata, module, "%s: Error fetching directory link",
- tif->tif_name);
- return (0);
- }
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong(&nextdir32);
- *nextdir=nextdir32;
- }
- else
- {
- uint64 dircount64;
- uint16 dircount16;
- if (!SeekOK(tif, *nextdir) ||
- !ReadOK(tif, &dircount64, sizeof (uint64))) {
- TIFFErrorExt(tif->tif_clientdata, module, "%s: Error fetching directory count",
- tif->tif_name);
- return (0);
- }
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong8(&dircount64);
- if (dircount64>0xFFFF)
- {
- TIFFErrorExt(tif->tif_clientdata, module, "Error fetching directory count");
- return(0);
- }
- dircount16 = (uint16)dircount64;
- if (off != NULL)
- *off = TIFFSeekFile(tif,
- dircount16*20, SEEK_CUR);
- else
- (void) TIFFSeekFile(tif,
- dircount16*20, SEEK_CUR);
- if (!ReadOK(tif, nextdir, sizeof (uint64))) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Error fetching directory link",
- tif->tif_name);
- return (0);
- }
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong8(nextdir);
- }
- return (1);
- }
+ static const char module[] = "TIFFAdvanceDirectory";
+
+ /* Add this directory to the directory list, if not already in. */
+ if (!_TIFFCheckDirNumberAndOffset(tif, *nextdirnum, *nextdiroff))
+ {
+ TIFFErrorExtR(tif, module,
+ "Starting directory %u at offset 0x%" PRIx64 " (%" PRIu64
+ ") might cause an IFD loop",
+ *nextdirnum, *nextdiroff, *nextdiroff);
+ *nextdiroff = 0;
+ *nextdirnum = 0;
+ return (0);
+ }
+
+ if (isMapped(tif))
+ {
+ uint64_t poff = *nextdiroff;
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ tmsize_t poffa, poffb, poffc, poffd;
+ uint16_t dircount;
+ uint32_t nextdir32;
+ poffa = (tmsize_t)poff;
+ poffb = poffa + sizeof(uint16_t);
+ if (((uint64_t)poffa != poff) || (poffb < poffa) ||
+ (poffb < (tmsize_t)sizeof(uint16_t)) || (poffb > tif->tif_size))
+ {
+ TIFFErrorExtR(tif, module, "Error fetching directory count");
+ *nextdiroff = 0;
+ return (0);
+ }
+ _TIFFmemcpy(&dircount, tif->tif_base + poffa, sizeof(uint16_t));
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(&dircount);
+ poffc = poffb + dircount * 12;
+ poffd = poffc + sizeof(uint32_t);
+ if ((poffc < poffb) || (poffc < dircount * 12) || (poffd < poffc) ||
+ (poffd < (tmsize_t)sizeof(uint32_t)) || (poffd > tif->tif_size))
+ {
+ TIFFErrorExtR(tif, module, "Error fetching directory link");
+ return (0);
+ }
+ if (off != NULL)
+ *off = (uint64_t)poffc;
+ _TIFFmemcpy(&nextdir32, tif->tif_base + poffc, sizeof(uint32_t));
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&nextdir32);
+ *nextdiroff = nextdir32;
+ }
+ else
+ {
+ tmsize_t poffa, poffb, poffc, poffd;
+ uint64_t dircount64;
+ uint16_t dircount16;
+ if (poff > (uint64_t)TIFF_TMSIZE_T_MAX - sizeof(uint64_t))
+ {
+ TIFFErrorExtR(tif, module, "Error fetching directory count");
+ return (0);
+ }
+ poffa = (tmsize_t)poff;
+ poffb = poffa + sizeof(uint64_t);
+ if (poffb > tif->tif_size)
+ {
+ TIFFErrorExtR(tif, module, "Error fetching directory count");
+ return (0);
+ }
+ _TIFFmemcpy(&dircount64, tif->tif_base + poffa, sizeof(uint64_t));
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(&dircount64);
+ if (dircount64 > 0xFFFF)
+ {
+ TIFFErrorExtR(tif, module,
+ "Sanity check on directory count failed");
+ return (0);
+ }
+ dircount16 = (uint16_t)dircount64;
+ if (poffb > TIFF_TMSIZE_T_MAX - (tmsize_t)(dircount16 * 20) -
+ (tmsize_t)sizeof(uint64_t))
+ {
+ TIFFErrorExtR(tif, module, "Error fetching directory link");
+ return (0);
+ }
+ poffc = poffb + dircount16 * 20;
+ poffd = poffc + sizeof(uint64_t);
+ if (poffd > tif->tif_size)
+ {
+ TIFFErrorExtR(tif, module, "Error fetching directory link");
+ return (0);
+ }
+ if (off != NULL)
+ *off = (uint64_t)poffc;
+ _TIFFmemcpy(nextdiroff, tif->tif_base + poffc, sizeof(uint64_t));
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(nextdiroff);
+ }
+ }
+ else
+ {
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ uint16_t dircount;
+ uint32_t nextdir32;
+ if (!SeekOK(tif, *nextdiroff) ||
+ !ReadOK(tif, &dircount, sizeof(uint16_t)))
+ {
+ TIFFErrorExtR(tif, module, "%s: Error fetching directory count",
+ tif->tif_name);
+ return (0);
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(&dircount);
+ if (off != NULL)
+ *off = TIFFSeekFile(tif, dircount * 12, SEEK_CUR);
+ else
+ (void)TIFFSeekFile(tif, dircount * 12, SEEK_CUR);
+ if (!ReadOK(tif, &nextdir32, sizeof(uint32_t)))
+ {
+ TIFFErrorExtR(tif, module, "%s: Error fetching directory link",
+ tif->tif_name);
+ return (0);
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&nextdir32);
+ *nextdiroff = nextdir32;
+ }
+ else
+ {
+ uint64_t dircount64;
+ uint16_t dircount16;
+ if (!SeekOK(tif, *nextdiroff) ||
+ !ReadOK(tif, &dircount64, sizeof(uint64_t)))
+ {
+ TIFFErrorExtR(tif, module, "%s: Error fetching directory count",
+ tif->tif_name);
+ return (0);
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(&dircount64);
+ if (dircount64 > 0xFFFF)
+ {
+ TIFFErrorExtR(tif, module, "Error fetching directory count");
+ return (0);
+ }
+ dircount16 = (uint16_t)dircount64;
+ if (off != NULL)
+ *off = TIFFSeekFile(tif, dircount16 * 20, SEEK_CUR);
+ else
+ (void)TIFFSeekFile(tif, dircount16 * 20, SEEK_CUR);
+ if (!ReadOK(tif, nextdiroff, sizeof(uint64_t)))
+ {
+ TIFFErrorExtR(tif, module, "%s: Error fetching directory link",
+ tif->tif_name);
+ return (0);
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(nextdiroff);
+ }
+ }
+ if (*nextdiroff != 0)
+ {
+ (*nextdirnum)++;
+ /* Check next directory for IFD looping and if so, set it as last
+ * directory. */
+ if (!_TIFFCheckDirNumberAndOffset(tif, *nextdirnum, *nextdiroff))
+ {
+ TIFFWarningExtR(
+ tif, module,
+ "the next directory %u at offset 0x%" PRIx64 " (%" PRIu64
+ ") might be an IFD loop. Treating directory %d as "
+ "last directory",
+ *nextdirnum, *nextdiroff, *nextdiroff, (int)(*nextdirnum) - 1);
+ *nextdiroff = 0;
+ (*nextdirnum)--;
+ }
+ }
+ return (1);
}
/*
* Count the number of directories in a file.
*/
-uint16
-TIFFNumberOfDirectories(TIFF* tif)
+tdir_t TIFFNumberOfDirectories(TIFF *tif)
{
- static const char module[] = "TIFFNumberOfDirectories";
- uint64 nextdir;
- uint16 n;
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- nextdir = tif->tif_header.classic.tiff_diroff;
- else
- nextdir = tif->tif_header.big.tiff_diroff;
- n = 0;
- while (nextdir != 0 && TIFFAdvanceDirectory(tif, &nextdir, NULL))
- {
- if (n != 65535) {
- ++n;
- }
- else
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Directory count exceeded 65535 limit,"
- " giving up on counting.");
- return (65535);
- }
- }
- return (n);
+ uint64_t nextdiroff;
+ tdir_t nextdirnum;
+ tdir_t n;
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ nextdiroff = tif->tif_header.classic.tiff_diroff;
+ else
+ nextdiroff = tif->tif_header.big.tiff_diroff;
+ nextdirnum = 0;
+ n = 0;
+ while (nextdiroff != 0 &&
+ TIFFAdvanceDirectory(tif, &nextdiroff, NULL, &nextdirnum))
+ {
+ ++n;
+ }
+ return (n);
}
/*
* Set the n-th directory as the current directory.
* NB: Directories are numbered starting at 0.
*/
-int
-TIFFSetDirectory(TIFF* tif, uint16 dirn)
+int TIFFSetDirectory(TIFF *tif, tdir_t dirn)
{
- uint64 nextdir;
- uint16 n;
-
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- nextdir = tif->tif_header.classic.tiff_diroff;
- else
- nextdir = tif->tif_header.big.tiff_diroff;
- for (n = dirn; n > 0 && nextdir != 0; n--)
- if (!TIFFAdvanceDirectory(tif, &nextdir, NULL))
- return (0);
- tif->tif_nextdiroff = nextdir;
- /*
- * Set curdir to the actual directory index. The
- * -1 is because TIFFReadDirectory will increment
- * tif_curdir after successfully reading the directory.
- */
- tif->tif_curdir = (dirn - n) - 1;
- /*
- * Reset tif_dirnumber counter and start new list of seen directories.
- * We need this to prevent IFD loops.
- */
- tif->tif_dirnumber = 0;
- return (TIFFReadDirectory(tif));
+ uint64_t nextdiroff;
+ tdir_t nextdirnum;
+ tdir_t n;
+
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ nextdiroff = tif->tif_header.classic.tiff_diroff;
+ else
+ nextdiroff = tif->tif_header.big.tiff_diroff;
+ nextdirnum = 0;
+ for (n = dirn; n > 0 && nextdiroff != 0; n--)
+ if (!TIFFAdvanceDirectory(tif, &nextdiroff, NULL, &nextdirnum))
+ return (0);
+ /* If the n-th directory could not be reached (does not exist),
+ * return here without touching anything further. */
+ if (nextdiroff == 0 || n > 0)
+ return (0);
+
+ tif->tif_nextdiroff = nextdiroff;
+ /*
+ * Set curdir to the actual directory index. The
+ * -1 is because TIFFReadDirectory will increment
+ * tif_curdir after successfully reading the directory.
+ */
+ tif->tif_curdir = (dirn - n) - 1;
+ return (TIFFReadDirectory(tif));
}
/*
@@ -1646,140 +2054,178 @@ TIFFSetDirectory(TIFF* tif, uint16 dirn)
* is used mainly to access directories linked with
* the SubIFD tag (e.g. thumbnail images).
*/
-int
-TIFFSetSubDirectory(TIFF* tif, uint64 diroff)
+int TIFFSetSubDirectory(TIFF *tif, uint64_t diroff)
{
- tif->tif_nextdiroff = diroff;
- /*
- * Reset tif_dirnumber counter and start new list of seen directories.
- * We need this to prevent IFD loops.
- */
- tif->tif_dirnumber = 0;
- return (TIFFReadDirectory(tif));
+ /* Match nextdiroff and curdir for consistent IFD-loop checking.
+ * Only with TIFFSetSubDirectory() the IFD list can be corrupted with
+ * invalid offsets within the main IFD tree. In the case of several subIFDs
+ * of a main image, there are two possibilities that are not even mutually
+ * exclusive. a.) The subIFD tag contains an array with all offsets of the
+ * subIFDs. b.) The SubIFDs are concatenated with their NextIFD parameters.
+ * (refer to
+ * https://www.awaresystems.be/imaging/tiff/specification/TIFFPM6.pdf.)
+ */
+ int retval;
+ uint32_t curdir = 0;
+ int8_t probablySubIFD = 0;
+ if (diroff == 0)
+ {
+ /* Special case to invalidate the tif_lastdiroff member. */
+ tif->tif_curdir = TIFF_NON_EXISTENT_DIR_NUMBER;
+ }
+ else
+ {
+ if (!_TIFFGetDirNumberFromOffset(tif, diroff, &curdir))
+ {
+ /* Non-existing offsets might point to a SubIFD or invalid IFD.*/
+ probablySubIFD = 1;
+ }
+ /* -1 because TIFFReadDirectory() will increment tif_curdir. */
+ tif->tif_curdir =
+ curdir == 0 ? TIFF_NON_EXISTENT_DIR_NUMBER : curdir - 1;
+ }
+
+ tif->tif_nextdiroff = diroff;
+ retval = TIFFReadDirectory(tif);
+ /* If failed, curdir was not incremented in TIFFReadDirectory(), so set it
+ * back. */
+ if (!retval)
+ {
+ if (tif->tif_curdir == TIFF_NON_EXISTENT_DIR_NUMBER)
+ tif->tif_curdir = 0;
+ else
+ tif->tif_curdir++;
+ }
+ if (retval && probablySubIFD)
+ {
+ /* Reset IFD list to start new one for SubIFD chain and also start
+ * SubIFD chain with tif_curdir=0. */
+ tif->tif_dirnumber = 0;
+ tif->tif_curdir = 0; /* first directory of new chain */
+ /* add this offset to new IFD list */
+ _TIFFCheckDirNumberAndOffset(tif, tif->tif_curdir, diroff);
+ }
+ return (retval);
}
/*
* Return file offset of the current directory.
*/
-uint64
-TIFFCurrentDirOffset(TIFF* tif)
-{
- return (tif->tif_diroff);
-}
+uint64_t TIFFCurrentDirOffset(TIFF *tif) { return (tif->tif_diroff); }
/*
* Return an indication of whether or not we are
* at the last directory in the file.
*/
-int
-TIFFLastDirectory(TIFF* tif)
-{
- return (tif->tif_nextdiroff == 0);
-}
+int TIFFLastDirectory(TIFF *tif) { return (tif->tif_nextdiroff == 0); }
/*
* Unlink the specified directory from the directory chain.
+ * Note: First directory starts with number dirn=1.
+ * This is different to TIFFSetDirectory() where the first directory starts with
+ * zero.
*/
-int
-TIFFUnlinkDirectory(TIFF* tif, uint16 dirn)
+int TIFFUnlinkDirectory(TIFF *tif, tdir_t dirn)
{
- static const char module[] = "TIFFUnlinkDirectory";
- uint64 nextdir;
- uint64 off;
- uint16 n;
-
- if (tif->tif_mode == O_RDONLY) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Can not unlink directory in read-only file");
- return (0);
- }
- /*
- * Go to the directory before the one we want
- * to unlink and nab the offset of the link
- * field we'll need to patch.
- */
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- nextdir = tif->tif_header.classic.tiff_diroff;
- off = 4;
- }
- else
- {
- nextdir = tif->tif_header.big.tiff_diroff;
- off = 8;
- }
- for (n = dirn-1; n > 0; n--) {
- if (nextdir == 0) {
- TIFFErrorExt(tif->tif_clientdata, module, "Directory %d does not exist", dirn);
- return (0);
- }
- if (!TIFFAdvanceDirectory(tif, &nextdir, &off))
- return (0);
- }
- /*
- * Advance to the directory to be unlinked and fetch
- * the offset of the directory that follows.
- */
- if (!TIFFAdvanceDirectory(tif, &nextdir, NULL))
- return (0);
- /*
- * Go back and patch the link field of the preceding
- * directory to point to the offset of the directory
- * that follows.
- */
- (void) TIFFSeekFile(tif, off, SEEK_SET);
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- uint32 nextdir32;
- nextdir32=(uint32)nextdir;
- assert((uint64)nextdir32==nextdir);
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong(&nextdir32);
- if (!WriteOK(tif, &nextdir32, sizeof (uint32))) {
- TIFFErrorExt(tif->tif_clientdata, module, "Error writing directory link");
- return (0);
- }
- }
- else
- {
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong8(&nextdir);
- if (!WriteOK(tif, &nextdir, sizeof (uint64))) {
- TIFFErrorExt(tif->tif_clientdata, module, "Error writing directory link");
- return (0);
- }
- }
- /*
- * Leave directory state setup safely. We don't have
- * facilities for doing inserting and removing directories,
- * so it's safest to just invalidate everything. This
- * means that the caller can only append to the directory
- * chain.
- */
- (*tif->tif_cleanup)(tif);
- if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) {
- _TIFFfree(tif->tif_rawdata);
- tif->tif_rawdata = NULL;
- tif->tif_rawcc = 0;
- tif->tif_rawdataoff = 0;
- tif->tif_rawdataloaded = 0;
- }
- tif->tif_flags &= ~(TIFF_BEENWRITING|TIFF_BUFFERSETUP|TIFF_POSTENCODE|TIFF_BUF4WRITE);
- TIFFFreeDirectory(tif);
- TIFFDefaultDirectory(tif);
- tif->tif_diroff = 0; /* force link on next write */
- tif->tif_nextdiroff = 0; /* next write must be at end */
- tif->tif_curoff = 0;
- tif->tif_row = (uint32) -1;
- tif->tif_curstrip = (uint32) -1;
- return (1);
-}
+ static const char module[] = "TIFFUnlinkDirectory";
+ uint64_t nextdir;
+ tdir_t nextdirnum;
+ uint64_t off;
+ tdir_t n;
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
+ if (tif->tif_mode == O_RDONLY)
+ {
+ TIFFErrorExtR(tif, module,
+ "Can not unlink directory in read-only file");
+ return (0);
+ }
+ /*
+ * Go to the directory before the one we want
+ * to unlink and nab the offset of the link
+ * field we'll need to patch.
+ */
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ nextdir = tif->tif_header.classic.tiff_diroff;
+ off = 4;
+ }
+ else
+ {
+ nextdir = tif->tif_header.big.tiff_diroff;
+ off = 8;
+ }
+ nextdirnum = 0; /* First directory is dirn=0 */
+
+ for (n = dirn - 1; n > 0; n--)
+ {
+ if (nextdir == 0)
+ {
+ TIFFErrorExtR(tif, module, "Directory %u does not exist", dirn);
+ return (0);
+ }
+ if (!TIFFAdvanceDirectory(tif, &nextdir, &off, &nextdirnum))
+ return (0);
+ }
+ /*
+ * Advance to the directory to be unlinked and fetch
+ * the offset of the directory that follows.
+ */
+ if (!TIFFAdvanceDirectory(tif, &nextdir, NULL, &nextdirnum))
+ return (0);
+ /*
+ * Go back and patch the link field of the preceding
+ * directory to point to the offset of the directory
+ * that follows.
+ */
+ (void)TIFFSeekFile(tif, off, SEEK_SET);
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ uint32_t nextdir32;
+ nextdir32 = (uint32_t)nextdir;
+ assert((uint64_t)nextdir32 == nextdir);
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&nextdir32);
+ if (!WriteOK(tif, &nextdir32, sizeof(uint32_t)))
+ {
+ TIFFErrorExtR(tif, module, "Error writing directory link");
+ return (0);
+ }
+ }
+ else
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(&nextdir);
+ if (!WriteOK(tif, &nextdir, sizeof(uint64_t)))
+ {
+ TIFFErrorExtR(tif, module, "Error writing directory link");
+ return (0);
+ }
+ }
+ /*
+ * Leave directory state setup safely. We don't have
+ * facilities for doing inserting and removing directories,
+ * so it's safest to just invalidate everything. This
+ * means that the caller can only append to the directory
+ * chain.
+ */
+ (*tif->tif_cleanup)(tif);
+ if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata)
+ {
+ _TIFFfreeExt(tif, tif->tif_rawdata);
+ tif->tif_rawdata = NULL;
+ tif->tif_rawcc = 0;
+ tif->tif_rawdataoff = 0;
+ tif->tif_rawdataloaded = 0;
+ }
+ tif->tif_flags &= ~(TIFF_BEENWRITING | TIFF_BUFFERSETUP | TIFF_POSTENCODE |
+ TIFF_BUF4WRITE);
+ TIFFFreeDirectory(tif);
+ TIFFDefaultDirectory(tif);
+ tif->tif_diroff = 0; /* force link on next write */
+ tif->tif_nextdiroff = 0; /* next write must be at end */
+ tif->tif_lastdiroff = 0; /* will be updated on next link */
+ tif->tif_curoff = 0;
+ tif->tif_row = (uint32_t)-1;
+ tif->tif_curstrip = (uint32_t)-1;
+ return (1);
+}
diff --git a/src/3rdparty/libtiff/libtiff/tif_dir.h b/src/3rdparty/libtiff/libtiff/tif_dir.h
index e7f0667..fad1eb0 100644
--- a/src/3rdparty/libtiff/libtiff/tif_dir.h
+++ b/src/3rdparty/libtiff/libtiff/tif_dir.h
@@ -2,28 +2,28 @@
* Copyright (c) 1988-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
#ifndef _TIFFDIR_
-#define _TIFFDIR_
+#define _TIFFDIR_
#include "tiff.h"
#include "tiffio.h"
@@ -32,10 +32,11 @@
* ``Library-private'' Directory-related Definitions.
*/
-typedef struct {
- const TIFFField *info;
- int count;
- void *value;
+typedef struct
+{
+ const TIFFField *info;
+ int count;
+ void *value;
} TIFFTagValue;
/*
@@ -49,79 +50,91 @@ typedef struct {
* BigTIFF, then it is placed in the offset field to save space. If so,
* it is left-justified in the offset field.
*/
-typedef struct {
- uint16 tdir_tag; /* see below */
- uint16 tdir_type; /* data type; see below */
- uint64 tdir_count; /* number of items; length in spec */
- union {
- uint16 toff_short;
- uint32 toff_long;
- uint64 toff_long8;
- } tdir_offset; /* either offset or the data itself if fits */
- uint8 tdir_ignore; /* flag status to ignore tag when parsing tags in tif_dirread.c */
+typedef struct
+{
+ uint16_t tdir_tag; /* see below */
+ uint16_t tdir_type; /* data type; see below */
+ uint64_t tdir_count; /* number of items; length in spec */
+ union
+ {
+ uint16_t toff_short;
+ uint32_t toff_long;
+ uint64_t toff_long8;
+ } tdir_offset; /* either offset or the data itself if fits */
+ uint8_t tdir_ignore; /* flag status to ignore tag when parsing tags in
+ tif_dirread.c */
} TIFFDirEntry;
/*
* Internal format of a TIFF directory entry.
*/
-typedef struct {
+typedef struct
+{
#define FIELD_SETLONGS 4
- /* bit vector of fields that are set */
- unsigned long td_fieldsset[FIELD_SETLONGS];
+ /* bit vector of fields that are set */
+ unsigned long td_fieldsset[FIELD_SETLONGS];
- uint32 td_imagewidth, td_imagelength, td_imagedepth;
- uint32 td_tilewidth, td_tilelength, td_tiledepth;
- uint32 td_subfiletype;
- uint16 td_bitspersample;
- uint16 td_sampleformat;
- uint16 td_compression;
- uint16 td_photometric;
- uint16 td_threshholding;
- uint16 td_fillorder;
- uint16 td_orientation;
- uint16 td_samplesperpixel;
- uint32 td_rowsperstrip;
- uint16 td_minsamplevalue, td_maxsamplevalue;
- double* td_sminsamplevalue;
- double* td_smaxsamplevalue;
- float td_xresolution, td_yresolution;
- uint16 td_resolutionunit;
- uint16 td_planarconfig;
- float td_xposition, td_yposition;
- uint16 td_pagenumber[2];
- uint16* td_colormap[3];
- uint16 td_halftonehints[2];
- uint16 td_extrasamples;
- uint16* td_sampleinfo;
- /* even though the name is misleading, td_stripsperimage is the number
- * of striles (=strips or tiles) per plane, and td_nstrips the total
- * number of striles */
- uint32 td_stripsperimage;
- uint32 td_nstrips; /* size of offset & bytecount arrays */
- uint64* td_stripoffset_p; /* should be accessed with TIFFGetStrileOffset */
- uint64* td_stripbytecount_p; /* should be accessed with TIFFGetStrileByteCount */
- uint32 td_stripoffsetbyteallocsize; /* number of elements currently allocated for td_stripoffset/td_stripbytecount. Only used if TIFF_LAZYSTRILELOAD is set */
+ uint32_t td_imagewidth, td_imagelength, td_imagedepth;
+ uint32_t td_tilewidth, td_tilelength, td_tiledepth;
+ uint32_t td_subfiletype;
+ uint16_t td_bitspersample;
+ uint16_t td_sampleformat;
+ uint16_t td_compression;
+ uint16_t td_photometric;
+ uint16_t td_threshholding;
+ uint16_t td_fillorder;
+ uint16_t td_orientation;
+ uint16_t td_samplesperpixel;
+ uint32_t td_rowsperstrip;
+ uint16_t td_minsamplevalue, td_maxsamplevalue;
+ double *td_sminsamplevalue;
+ double *td_smaxsamplevalue;
+ float td_xresolution, td_yresolution;
+ uint16_t td_resolutionunit;
+ uint16_t td_planarconfig;
+ float td_xposition, td_yposition;
+ uint16_t td_pagenumber[2];
+ uint16_t *td_colormap[3];
+ uint16_t td_halftonehints[2];
+ uint16_t td_extrasamples;
+ uint16_t *td_sampleinfo;
+ /* even though the name is misleading, td_stripsperimage is the number
+ * of striles (=strips or tiles) per plane, and td_nstrips the total
+ * number of striles */
+ uint32_t td_stripsperimage;
+ uint32_t td_nstrips; /* size of offset & bytecount arrays */
+ uint64_t
+ *td_stripoffset_p; /* should be accessed with TIFFGetStrileOffset */
+ uint64_t *td_stripbytecount_p; /* should be accessed with
+ TIFFGetStrileByteCount */
+ uint32_t
+ td_stripoffsetbyteallocsize; /* number of elements currently allocated
+ for td_stripoffset/td_stripbytecount.
+ Only used if TIFF_LAZYSTRILELOAD is set
+ */
#ifdef STRIPBYTECOUNTSORTED_UNUSED
- int td_stripbytecountsorted; /* is the bytecount array sorted ascending? */
+ int td_stripbytecountsorted; /* is the bytecount array sorted ascending? */
#endif
- TIFFDirEntry td_stripoffset_entry; /* for deferred loading */
- TIFFDirEntry td_stripbytecount_entry; /* for deferred loading */
- uint16 td_nsubifd;
- uint64* td_subifd;
- /* YCbCr parameters */
- uint16 td_ycbcrsubsampling[2];
- uint16 td_ycbcrpositioning;
- /* Colorimetry parameters */
- uint16* td_transferfunction[3];
- float* td_refblackwhite;
- /* CMYK parameters */
- int td_inknameslen;
- char* td_inknames;
+ TIFFDirEntry td_stripoffset_entry; /* for deferred loading */
+ TIFFDirEntry td_stripbytecount_entry; /* for deferred loading */
+ uint16_t td_nsubifd;
+ uint64_t *td_subifd;
+ /* YCbCr parameters */
+ uint16_t td_ycbcrsubsampling[2];
+ uint16_t td_ycbcrpositioning;
+ /* Colorimetry parameters */
+ uint16_t *td_transferfunction[3];
+ float *td_refblackwhite;
+ /* CMYK parameters */
+ int td_inknameslen;
+ char *td_inknames;
+ uint16_t td_numberofinks; /* number of inks in InkNames string */
- int td_customValueCount;
- TIFFTagValue *td_customValues;
+ int td_customValueCount;
+ TIFFTagValue *td_customValues;
- unsigned char td_deferstrilearraywriting; /* see TIFFDeferStrileArrayWriting() */
+ unsigned char
+ td_deferstrilearraywriting; /* see TIFFDeferStrileArrayWriting() */
} TIFFDirectory;
/*
@@ -135,49 +148,49 @@ typedef struct {
* Note that a bit *is* allocated for ignored tags; this is understood by the
* directory reading logic which uses this fact to avoid special-case handling
*/
-#define FIELD_IGNORE 0
+#define FIELD_IGNORE 0
/* multi-item fields */
-#define FIELD_IMAGEDIMENSIONS 1
-#define FIELD_TILEDIMENSIONS 2
-#define FIELD_RESOLUTION 3
-#define FIELD_POSITION 4
+#define FIELD_IMAGEDIMENSIONS 1
+#define FIELD_TILEDIMENSIONS 2
+#define FIELD_RESOLUTION 3
+#define FIELD_POSITION 4
/* single-item fields */
-#define FIELD_SUBFILETYPE 5
-#define FIELD_BITSPERSAMPLE 6
-#define FIELD_COMPRESSION 7
-#define FIELD_PHOTOMETRIC 8
-#define FIELD_THRESHHOLDING 9
-#define FIELD_FILLORDER 10
-#define FIELD_ORIENTATION 15
-#define FIELD_SAMPLESPERPIXEL 16
-#define FIELD_ROWSPERSTRIP 17
-#define FIELD_MINSAMPLEVALUE 18
-#define FIELD_MAXSAMPLEVALUE 19
-#define FIELD_PLANARCONFIG 20
-#define FIELD_RESOLUTIONUNIT 22
-#define FIELD_PAGENUMBER 23
-#define FIELD_STRIPBYTECOUNTS 24
-#define FIELD_STRIPOFFSETS 25
-#define FIELD_COLORMAP 26
-#define FIELD_EXTRASAMPLES 31
-#define FIELD_SAMPLEFORMAT 32
-#define FIELD_SMINSAMPLEVALUE 33
-#define FIELD_SMAXSAMPLEVALUE 34
-#define FIELD_IMAGEDEPTH 35
-#define FIELD_TILEDEPTH 36
-#define FIELD_HALFTONEHINTS 37
-#define FIELD_YCBCRSUBSAMPLING 39
-#define FIELD_YCBCRPOSITIONING 40
-#define FIELD_REFBLACKWHITE 41
-#define FIELD_TRANSFERFUNCTION 44
-#define FIELD_INKNAMES 46
-#define FIELD_SUBIFD 49
+#define FIELD_SUBFILETYPE 5
+#define FIELD_BITSPERSAMPLE 6
+#define FIELD_COMPRESSION 7
+#define FIELD_PHOTOMETRIC 8
+#define FIELD_THRESHHOLDING 9
+#define FIELD_FILLORDER 10
+#define FIELD_ORIENTATION 15
+#define FIELD_SAMPLESPERPIXEL 16
+#define FIELD_ROWSPERSTRIP 17
+#define FIELD_MINSAMPLEVALUE 18
+#define FIELD_MAXSAMPLEVALUE 19
+#define FIELD_PLANARCONFIG 20
+#define FIELD_RESOLUTIONUNIT 22
+#define FIELD_PAGENUMBER 23
+#define FIELD_STRIPBYTECOUNTS 24
+#define FIELD_STRIPOFFSETS 25
+#define FIELD_COLORMAP 26
+#define FIELD_EXTRASAMPLES 31
+#define FIELD_SAMPLEFORMAT 32
+#define FIELD_SMINSAMPLEVALUE 33
+#define FIELD_SMAXSAMPLEVALUE 34
+#define FIELD_IMAGEDEPTH 35
+#define FIELD_TILEDEPTH 36
+#define FIELD_HALFTONEHINTS 37
+#define FIELD_YCBCRSUBSAMPLING 39
+#define FIELD_YCBCRPOSITIONING 40
+#define FIELD_REFBLACKWHITE 41
+#define FIELD_TRANSFERFUNCTION 44
+#define FIELD_INKNAMES 46
+#define FIELD_SUBIFD 49
+#define FIELD_NUMBEROFINKS 50
/* FIELD_CUSTOM (see tiffio.h) 65 */
/* end of support for well-known tags; codec-private tags follow */
-#define FIELD_CODEC 66 /* base of codec-private tags */
-
+#define FIELD_CODEC 66 /* base of codec-private tags */
/*
* Pseudo-tags don't normally need field bits since they are not written to an
@@ -187,129 +200,137 @@ typedef struct {
* or ``unset'' then it can do using internal state flags without polluting
* the field bit space defined for real tags.
*/
-#define FIELD_PSEUDO 0
+#define FIELD_PSEUDO 0
-#define FIELD_LAST (32*FIELD_SETLONGS-1)
+#define FIELD_LAST (32 * FIELD_SETLONGS - 1)
-#define BITn(n) (((unsigned long)1L)<<((n)&0x1f))
-#define BITFIELDn(tif, n) ((tif)->tif_dir.td_fieldsset[(n)/32])
-#define TIFFFieldSet(tif, field) (BITFIELDn(tif, field) & BITn(field))
-#define TIFFSetFieldBit(tif, field) (BITFIELDn(tif, field) |= BITn(field))
-#define TIFFClrFieldBit(tif, field) (BITFIELDn(tif, field) &= ~BITn(field))
+#define BITn(n) (((unsigned long)1L) << ((n)&0x1f))
+#define BITFIELDn(tif, n) ((tif)->tif_dir.td_fieldsset[(n) / 32])
+#define TIFFFieldSet(tif, field) (BITFIELDn(tif, field) & BITn(field))
+#define TIFFSetFieldBit(tif, field) (BITFIELDn(tif, field) |= BITn(field))
+#define TIFFClrFieldBit(tif, field) (BITFIELDn(tif, field) &= ~BITn(field))
-#define FieldSet(fields, f) (fields[(f)/32] & BITn(f))
-#define ResetFieldBit(fields, f) (fields[(f)/32] &= ~BITn(f))
+#define FieldSet(fields, f) (fields[(f) / 32] & BITn(f))
+#define ResetFieldBit(fields, f) (fields[(f) / 32] &= ~BITn(f))
-typedef enum {
- TIFF_SETGET_UNDEFINED = 0,
- TIFF_SETGET_ASCII = 1,
- TIFF_SETGET_UINT8 = 2,
- TIFF_SETGET_SINT8 = 3,
- TIFF_SETGET_UINT16 = 4,
- TIFF_SETGET_SINT16 = 5,
- TIFF_SETGET_UINT32 = 6,
- TIFF_SETGET_SINT32 = 7,
- TIFF_SETGET_UINT64 = 8,
- TIFF_SETGET_SINT64 = 9,
- TIFF_SETGET_FLOAT = 10,
- TIFF_SETGET_DOUBLE = 11,
- TIFF_SETGET_IFD8 = 12,
- TIFF_SETGET_INT = 13,
- TIFF_SETGET_UINT16_PAIR = 14,
- TIFF_SETGET_C0_ASCII = 15,
- TIFF_SETGET_C0_UINT8 = 16,
- TIFF_SETGET_C0_SINT8 = 17,
- TIFF_SETGET_C0_UINT16 = 18,
- TIFF_SETGET_C0_SINT16 = 19,
- TIFF_SETGET_C0_UINT32 = 20,
- TIFF_SETGET_C0_SINT32 = 21,
- TIFF_SETGET_C0_UINT64 = 22,
- TIFF_SETGET_C0_SINT64 = 23,
- TIFF_SETGET_C0_FLOAT = 24,
- TIFF_SETGET_C0_DOUBLE = 25,
- TIFF_SETGET_C0_IFD8 = 26,
- TIFF_SETGET_C16_ASCII = 27,
- TIFF_SETGET_C16_UINT8 = 28,
- TIFF_SETGET_C16_SINT8 = 29,
- TIFF_SETGET_C16_UINT16 = 30,
- TIFF_SETGET_C16_SINT16 = 31,
- TIFF_SETGET_C16_UINT32 = 32,
- TIFF_SETGET_C16_SINT32 = 33,
- TIFF_SETGET_C16_UINT64 = 34,
- TIFF_SETGET_C16_SINT64 = 35,
- TIFF_SETGET_C16_FLOAT = 36,
- TIFF_SETGET_C16_DOUBLE = 37,
- TIFF_SETGET_C16_IFD8 = 38,
- TIFF_SETGET_C32_ASCII = 39,
- TIFF_SETGET_C32_UINT8 = 40,
- TIFF_SETGET_C32_SINT8 = 41,
- TIFF_SETGET_C32_UINT16 = 42,
- TIFF_SETGET_C32_SINT16 = 43,
- TIFF_SETGET_C32_UINT32 = 44,
- TIFF_SETGET_C32_SINT32 = 45,
- TIFF_SETGET_C32_UINT64 = 46,
- TIFF_SETGET_C32_SINT64 = 47,
- TIFF_SETGET_C32_FLOAT = 48,
- TIFF_SETGET_C32_DOUBLE = 49,
- TIFF_SETGET_C32_IFD8 = 50,
- TIFF_SETGET_OTHER = 51
+typedef enum
+{
+ TIFF_SETGET_UNDEFINED = 0,
+ TIFF_SETGET_ASCII = 1,
+ TIFF_SETGET_UINT8 = 2,
+ TIFF_SETGET_SINT8 = 3,
+ TIFF_SETGET_UINT16 = 4,
+ TIFF_SETGET_SINT16 = 5,
+ TIFF_SETGET_UINT32 = 6,
+ TIFF_SETGET_SINT32 = 7,
+ TIFF_SETGET_UINT64 = 8,
+ TIFF_SETGET_SINT64 = 9,
+ TIFF_SETGET_FLOAT = 10,
+ TIFF_SETGET_DOUBLE = 11,
+ TIFF_SETGET_IFD8 = 12,
+ TIFF_SETGET_INT = 13,
+ TIFF_SETGET_UINT16_PAIR = 14,
+ TIFF_SETGET_C0_ASCII = 15,
+ TIFF_SETGET_C0_UINT8 = 16,
+ TIFF_SETGET_C0_SINT8 = 17,
+ TIFF_SETGET_C0_UINT16 = 18,
+ TIFF_SETGET_C0_SINT16 = 19,
+ TIFF_SETGET_C0_UINT32 = 20,
+ TIFF_SETGET_C0_SINT32 = 21,
+ TIFF_SETGET_C0_UINT64 = 22,
+ TIFF_SETGET_C0_SINT64 = 23,
+ TIFF_SETGET_C0_FLOAT = 24,
+ TIFF_SETGET_C0_DOUBLE = 25,
+ TIFF_SETGET_C0_IFD8 = 26,
+ TIFF_SETGET_C16_ASCII = 27,
+ TIFF_SETGET_C16_UINT8 = 28,
+ TIFF_SETGET_C16_SINT8 = 29,
+ TIFF_SETGET_C16_UINT16 = 30,
+ TIFF_SETGET_C16_SINT16 = 31,
+ TIFF_SETGET_C16_UINT32 = 32,
+ TIFF_SETGET_C16_SINT32 = 33,
+ TIFF_SETGET_C16_UINT64 = 34,
+ TIFF_SETGET_C16_SINT64 = 35,
+ TIFF_SETGET_C16_FLOAT = 36,
+ TIFF_SETGET_C16_DOUBLE = 37,
+ TIFF_SETGET_C16_IFD8 = 38,
+ TIFF_SETGET_C32_ASCII = 39,
+ TIFF_SETGET_C32_UINT8 = 40,
+ TIFF_SETGET_C32_SINT8 = 41,
+ TIFF_SETGET_C32_UINT16 = 42,
+ TIFF_SETGET_C32_SINT16 = 43,
+ TIFF_SETGET_C32_UINT32 = 44,
+ TIFF_SETGET_C32_SINT32 = 45,
+ TIFF_SETGET_C32_UINT64 = 46,
+ TIFF_SETGET_C32_SINT64 = 47,
+ TIFF_SETGET_C32_FLOAT = 48,
+ TIFF_SETGET_C32_DOUBLE = 49,
+ TIFF_SETGET_C32_IFD8 = 50,
+ TIFF_SETGET_OTHER = 51
} TIFFSetGetFieldType;
#if defined(__cplusplus)
-extern "C" {
+extern "C"
+{
#endif
-extern const TIFFFieldArray* _TIFFGetFields(void);
-extern const TIFFFieldArray* _TIFFGetExifFields(void);
-extern void _TIFFSetupFields(TIFF* tif, const TIFFFieldArray* infoarray);
-extern void _TIFFPrintFieldInfo(TIFF*, FILE*);
+ extern const TIFFFieldArray *_TIFFGetFields(void);
+ extern const TIFFFieldArray *_TIFFGetExifFields(void);
+ extern const TIFFFieldArray *_TIFFGetGpsFields(void);
+ extern void _TIFFSetupFields(TIFF *tif, const TIFFFieldArray *infoarray);
+ extern void _TIFFPrintFieldInfo(TIFF *, FILE *);
-extern int _TIFFFillStriles(TIFF*);
+ extern int _TIFFFillStriles(TIFF *);
-typedef enum {
- tfiatImage,
- tfiatExif,
- tfiatOther
-} TIFFFieldArrayType;
+ typedef enum
+ {
+ tfiatImage,
+ tfiatExif,
+ tfiatGps, /* EXIF-GPS fields array type */
+ tfiatOther
+ } TIFFFieldArrayType;
-struct _TIFFFieldArray {
- TIFFFieldArrayType type; /* array type, will be used to determine if IFD is image and such */
- uint32 allocated_size; /* 0 if array is constant, other if modified by future definition extension support */
- uint32 count; /* number of elements in fields array */
- TIFFField* fields; /* actual field info */
-};
+ struct _TIFFFieldArray
+ {
+ TIFFFieldArrayType type; /* array type, will be used to determine if IFD
+ is image and such */
+ uint32_t allocated_size; /* 0 if array is constant, other if modified by
+ future definition extension support */
+ uint32_t count; /* number of elements in fields array */
+ TIFFField *fields; /* actual field info */
+ };
-struct _TIFFField {
- uint32 field_tag; /* field's tag */
- short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */
- short field_writecount; /* write count/TIFF_VARIABLE */
- TIFFDataType field_type; /* type of associated data */
- uint32 reserved; /* reserved for future extension */
- TIFFSetGetFieldType set_field_type; /* type to be passed to TIFFSetField */
- TIFFSetGetFieldType get_field_type; /* type to be passed to TIFFGetField */
- unsigned short field_bit; /* bit in fieldsset bit vector */
- unsigned char field_oktochange; /* if true, can change while writing */
- unsigned char field_passcount; /* if true, pass dir count on set */
- char* field_name; /* ASCII name */
- TIFFFieldArray* field_subfields; /* if field points to child ifds, child ifd field definition array */
-};
+ struct _TIFFField
+ {
+ uint32_t field_tag; /* field's tag */
+ short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */
+ short field_writecount; /* write count/TIFF_VARIABLE */
+ TIFFDataType field_type; /* type of associated data */
+ uint32_t
+ field_anonymous; /* if true, this is a unknown / anonymous tag */
+ TIFFSetGetFieldType
+ set_field_type; /* type to be passed to TIFFSetField */
+ TIFFSetGetFieldType
+ get_field_type; /* type to be passed to TIFFGetField */
+ unsigned short field_bit; /* bit in fieldsset bit vector */
+ unsigned char field_oktochange; /* if true, can change while writing */
+ unsigned char field_passcount; /* if true, pass dir count on set */
+ char *field_name; /* ASCII name */
+ TIFFFieldArray *field_subfields; /* if field points to child ifds, child
+ ifd field definition array */
+ };
-extern int _TIFFMergeFields(TIFF*, const TIFFField[], uint32);
-extern const TIFFField* _TIFFFindOrRegisterField(TIFF *, uint32, TIFFDataType);
-extern TIFFField* _TIFFCreateAnonField(TIFF *, uint32, TIFFDataType);
-extern int _TIFFCheckFieldIsValidForCodec(TIFF *tif, ttag_t tag);
+ extern int _TIFFMergeFields(TIFF *, const TIFFField[], uint32_t);
+ extern const TIFFField *_TIFFFindOrRegisterField(TIFF *, uint32_t,
+ TIFFDataType);
+ extern TIFFField *_TIFFCreateAnonField(TIFF *, uint32_t, TIFFDataType);
+ extern int _TIFFCheckFieldIsValidForCodec(TIFF *tif, ttag_t tag);
+ extern int _TIFFCheckDirNumberAndOffset(TIFF *tif, tdir_t dirn,
+ uint64_t diroff);
+ extern int _TIFFGetDirNumberFromOffset(TIFF *tif, uint64_t diroff,
+ tdir_t *dirn);
#if defined(__cplusplus)
}
#endif
#endif /* _TIFFDIR_ */
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_dirinfo.c b/src/3rdparty/libtiff/libtiff/tif_dirinfo.c
index e1f6b23..6a15c76 100644
--- a/src/3rdparty/libtiff/libtiff/tif_dirinfo.c
+++ b/src/3rdparty/libtiff/libtiff/tif_dirinfo.c
@@ -42,686 +42,1147 @@
/* const object should be initialized */
#ifdef _MSC_VER
-#pragma warning( push )
-#pragma warning( disable : 4132 )
+#pragma warning(push)
+#pragma warning(disable : 4132)
#endif
static const TIFFFieldArray tiffFieldArray;
static const TIFFFieldArray exifFieldArray;
+static const TIFFFieldArray gpsFieldArray;
#ifdef _MSC_VER
-#pragma warning( pop )
+#pragma warning(pop)
#endif
+/*--: Rational2Double: --
+ * The Rational2Double upgraded libtiff functionality allows the definition and
+ * achievement of true double-precision accuracy for TIFF tags of RATIONAL type
+ * and field_bit=FIELD_CUSTOM using the set_field_type = TIFF_SETGET_DOUBLE.
+ * Unfortunately, that changes the old implemented interface for TIFFGetField().
+ * In order to keep the old TIFFGetField() interface behavior those tags have to
+ * be redefined with set_field_type = TIFF_SETGET_FLOAT!
+ *
+ * Rational custom arrays are already defined as _Cxx_FLOAT, thus can stay.
+ *
+ */
-static const TIFFField
-tiffFields[] = {
- { TIFFTAG_SUBFILETYPE, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_SUBFILETYPE, 1, 0, "SubfileType", NULL },
- { TIFFTAG_OSUBFILETYPE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_SUBFILETYPE, 1, 0, "OldSubfileType", NULL },
- { TIFFTAG_IMAGEWIDTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_IMAGEDIMENSIONS, 0, 0, "ImageWidth", NULL },
- { TIFFTAG_IMAGELENGTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_IMAGEDIMENSIONS, 1, 0, "ImageLength", NULL },
- { TIFFTAG_BITSPERSAMPLE, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_BITSPERSAMPLE, 0, 0, "BitsPerSample", NULL },
- { TIFFTAG_COMPRESSION, -1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_COMPRESSION, 0, 0, "Compression", NULL },
- { TIFFTAG_PHOTOMETRIC, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_PHOTOMETRIC, 0, 0, "PhotometricInterpretation", NULL },
- { TIFFTAG_THRESHHOLDING, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_THRESHHOLDING, 1, 0, "Threshholding", NULL },
- { TIFFTAG_CELLWIDTH, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "CellWidth", NULL },
- { TIFFTAG_CELLLENGTH, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "CellLength", NULL },
- { TIFFTAG_FILLORDER, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_FILLORDER, 0, 0, "FillOrder", NULL },
- { TIFFTAG_DOCUMENTNAME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DocumentName", NULL },
- { TIFFTAG_IMAGEDESCRIPTION, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImageDescription", NULL },
- { TIFFTAG_MAKE, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Make", NULL },
- { TIFFTAG_MODEL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Model", NULL },
- { TIFFTAG_STRIPOFFSETS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_STRIPOFFSETS, 0, 0, "StripOffsets", NULL },
- { TIFFTAG_ORIENTATION, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_ORIENTATION, 0, 0, "Orientation", NULL },
- { TIFFTAG_SAMPLESPERPIXEL, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_SAMPLESPERPIXEL, 0, 0, "SamplesPerPixel", NULL },
- { TIFFTAG_ROWSPERSTRIP, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_ROWSPERSTRIP, 0, 0, "RowsPerStrip", NULL },
- { TIFFTAG_STRIPBYTECOUNTS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_STRIPBYTECOUNTS, 0, 0, "StripByteCounts", NULL },
- { TIFFTAG_MINSAMPLEVALUE, -2, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_MINSAMPLEVALUE, 1, 0, "MinSampleValue", NULL },
- { TIFFTAG_MAXSAMPLEVALUE, -2, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_MAXSAMPLEVALUE, 1, 0, "MaxSampleValue", NULL },
- { TIFFTAG_XRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_RESOLUTION, 1, 0, "XResolution", NULL },
- { TIFFTAG_YRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_RESOLUTION, 1, 0, "YResolution", NULL },
- { TIFFTAG_PLANARCONFIG, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_PLANARCONFIG, 0, 0, "PlanarConfiguration", NULL },
- { TIFFTAG_PAGENAME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PageName", NULL },
- { TIFFTAG_XPOSITION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_POSITION, 1, 0, "XPosition", NULL },
- { TIFFTAG_YPOSITION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_POSITION, 1, 0, "YPosition", NULL },
- { TIFFTAG_FREEOFFSETS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 0, 0, "FreeOffsets", NULL },
- { TIFFTAG_FREEBYTECOUNTS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 0, 0, "FreeByteCounts", NULL },
- { TIFFTAG_GRAYRESPONSEUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "GrayResponseUnit", NULL },
- { TIFFTAG_GRAYRESPONSECURVE, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "GrayResponseCurve", NULL },
- { TIFFTAG_RESOLUTIONUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_RESOLUTIONUNIT, 1, 0, "ResolutionUnit", NULL },
- { TIFFTAG_PAGENUMBER, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_UINT16_PAIR, TIFF_SETGET_UNDEFINED, FIELD_PAGENUMBER, 1, 0, "PageNumber", NULL },
- { TIFFTAG_COLORRESPONSEUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "ColorResponseUnit", NULL },
- { TIFFTAG_TRANSFERFUNCTION, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_OTHER, TIFF_SETGET_UNDEFINED, FIELD_TRANSFERFUNCTION, 1, 0, "TransferFunction", NULL },
- { TIFFTAG_SOFTWARE, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Software", NULL },
- { TIFFTAG_DATETIME, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DateTime", NULL },
- { TIFFTAG_ARTIST, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Artist", NULL },
- { TIFFTAG_HOSTCOMPUTER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "HostComputer", NULL },
- { TIFFTAG_WHITEPOINT, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "WhitePoint", NULL },
- { TIFFTAG_PRIMARYCHROMATICITIES, 6, 6, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PrimaryChromaticities", NULL },
- { TIFFTAG_COLORMAP, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_OTHER, TIFF_SETGET_UNDEFINED, FIELD_COLORMAP, 1, 0, "ColorMap", NULL },
- { TIFFTAG_HALFTONEHINTS, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_UINT16_PAIR, TIFF_SETGET_UNDEFINED, FIELD_HALFTONEHINTS, 1, 0, "HalftoneHints", NULL },
- { TIFFTAG_TILEWIDTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_TILEDIMENSIONS, 0, 0, "TileWidth", NULL },
- { TIFFTAG_TILELENGTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_TILEDIMENSIONS, 0, 0, "TileLength", NULL },
- { TIFFTAG_TILEOFFSETS, -1, 1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_STRIPOFFSETS, 0, 0, "TileOffsets", NULL },
- { TIFFTAG_TILEBYTECOUNTS, -1, 1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_STRIPBYTECOUNTS, 0, 0, "TileByteCounts", NULL },
- { TIFFTAG_SUBIFD, -1, -1, TIFF_IFD8, 0, TIFF_SETGET_C16_IFD8, TIFF_SETGET_UNDEFINED, FIELD_SUBIFD, 1, 1, "SubIFD", (TIFFFieldArray*) &tiffFieldArray },
- { TIFFTAG_INKSET, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "InkSet", NULL },
- { TIFFTAG_INKNAMES, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_C16_ASCII, TIFF_SETGET_UNDEFINED, FIELD_INKNAMES, 1, 1, "InkNames", NULL },
- { TIFFTAG_NUMBEROFINKS, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "NumberOfInks", NULL },
- { TIFFTAG_DOTRANGE, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_UINT16_PAIR, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DotRange", NULL },
- { TIFFTAG_TARGETPRINTER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "TargetPrinter", NULL },
- { TIFFTAG_EXTRASAMPLES, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_EXTRASAMPLES, 0, 1, "ExtraSamples", NULL },
- { TIFFTAG_SAMPLEFORMAT, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_SAMPLEFORMAT, 0, 0, "SampleFormat", NULL },
- { TIFFTAG_SMINSAMPLEVALUE, -2, -1, TIFF_ANY, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_SMINSAMPLEVALUE, 1, 0, "SMinSampleValue", NULL },
- { TIFFTAG_SMAXSAMPLEVALUE, -2, -1, TIFF_ANY, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_SMAXSAMPLEVALUE, 1, 0, "SMaxSampleValue", NULL },
- { TIFFTAG_CLIPPATH, -1, -3, TIFF_BYTE, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ClipPath", NULL },
- { TIFFTAG_XCLIPPATHUNITS, 1, 1, TIFF_SLONG, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "XClipPathUnits", NULL },
- { TIFFTAG_XCLIPPATHUNITS, 1, 1, TIFF_SBYTE, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "XClipPathUnits", NULL },
- { TIFFTAG_YCLIPPATHUNITS, 1, 1, TIFF_SLONG, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "YClipPathUnits", NULL },
- { TIFFTAG_YCBCRCOEFFICIENTS, 3, 3, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "YCbCrCoefficients", NULL },
- { TIFFTAG_YCBCRSUBSAMPLING, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_UINT16_PAIR, TIFF_SETGET_UNDEFINED, FIELD_YCBCRSUBSAMPLING, 0, 0, "YCbCrSubsampling", NULL },
- { TIFFTAG_YCBCRPOSITIONING, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_YCBCRPOSITIONING, 0, 0, "YCbCrPositioning", NULL },
- { TIFFTAG_REFERENCEBLACKWHITE, 6, 6, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_REFBLACKWHITE, 1, 0, "ReferenceBlackWhite", NULL },
- { TIFFTAG_XMLPACKET, -3, -3, TIFF_BYTE, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "XMLPacket", NULL },
- /* begin SGI tags */
- { TIFFTAG_MATTEING, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_EXTRASAMPLES, 0, 0, "Matteing", NULL },
- { TIFFTAG_DATATYPE, -2, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_SAMPLEFORMAT, 0, 0, "DataType", NULL },
- { TIFFTAG_IMAGEDEPTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_IMAGEDEPTH, 0, 0, "ImageDepth", NULL },
- { TIFFTAG_TILEDEPTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_TILEDEPTH, 0, 0, "TileDepth", NULL },
- /* end SGI tags */
- /* begin Pixar tags */
- { TIFFTAG_PIXAR_IMAGEFULLWIDTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImageFullWidth", NULL },
- { TIFFTAG_PIXAR_IMAGEFULLLENGTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImageFullLength", NULL },
- { TIFFTAG_PIXAR_TEXTUREFORMAT, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "TextureFormat", NULL },
- { TIFFTAG_PIXAR_WRAPMODES, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "TextureWrapModes", NULL },
- { TIFFTAG_PIXAR_FOVCOT, 1, 1, TIFF_FLOAT, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FieldOfViewCotangent", NULL },
- { TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN, 16, 16, TIFF_FLOAT, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MatrixWorldToScreen", NULL },
- { TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA, 16, 16, TIFF_FLOAT, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MatrixWorldToCamera", NULL },
- { TIFFTAG_CFAREPEATPATTERNDIM, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CFARepeatPatternDim", NULL },
- { TIFFTAG_CFAPATTERN, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CFAPattern" , NULL},
- { TIFFTAG_COPYRIGHT, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Copyright", NULL },
- /* end Pixar tags */
- { TIFFTAG_RICHTIFFIPTC, -3, -3, TIFF_LONG, 0, TIFF_SETGET_C32_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "RichTIFFIPTC", NULL },
- { TIFFTAG_PHOTOSHOP, -3, -3, TIFF_BYTE, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "Photoshop", NULL },
- { TIFFTAG_EXIFIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "EXIFIFDOffset", (TIFFFieldArray*) &exifFieldArray },
- { TIFFTAG_ICCPROFILE, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ICC Profile", NULL },
- { TIFFTAG_GPSIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "GPSIFDOffset", NULL },
- { TIFFTAG_FAXRECVPARAMS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_CUSTOM, TRUE, FALSE, "FaxRecvParams", NULL },
- { TIFFTAG_FAXSUBADDRESS, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_ASCII, FIELD_CUSTOM, TRUE, FALSE, "FaxSubAddress", NULL },
- { TIFFTAG_FAXRECVTIME, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_CUSTOM, TRUE, FALSE, "FaxRecvTime", NULL },
- { TIFFTAG_FAXDCS, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_ASCII, FIELD_CUSTOM, TRUE, FALSE, "FaxDcs", NULL },
- { TIFFTAG_STONITS, 1, 1, TIFF_DOUBLE, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "StoNits", NULL },
- { TIFFTAG_INTEROPERABILITYIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "InteroperabilityIFDOffset", NULL },
- /* begin DNG tags */
- { TIFFTAG_DNGVERSION, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DNGVersion", NULL },
- { TIFFTAG_DNGBACKWARDVERSION, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DNGBackwardVersion", NULL },
- { TIFFTAG_UNIQUECAMERAMODEL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "UniqueCameraModel", NULL },
- { TIFFTAG_LOCALIZEDCAMERAMODEL, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "LocalizedCameraModel", NULL },
- { TIFFTAG_CFAPLANECOLOR, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "CFAPlaneColor", NULL },
- { TIFFTAG_CFALAYOUT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CFALayout", NULL },
- { TIFFTAG_LINEARIZATIONTABLE, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "LinearizationTable", NULL },
- { TIFFTAG_BLACKLEVELREPEATDIM, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BlackLevelRepeatDim", NULL },
- { TIFFTAG_BLACKLEVEL, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "BlackLevel", NULL },
- { TIFFTAG_BLACKLEVELDELTAH, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "BlackLevelDeltaH", NULL },
- { TIFFTAG_BLACKLEVELDELTAV, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "BlackLevelDeltaV", NULL },
- { TIFFTAG_WHITELEVEL, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "WhiteLevel", NULL },
- { TIFFTAG_DEFAULTSCALE, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DefaultScale", NULL },
- { TIFFTAG_BESTQUALITYSCALE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BestQualityScale", NULL },
- { TIFFTAG_DEFAULTCROPORIGIN, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DefaultCropOrigin", NULL },
- { TIFFTAG_DEFAULTCROPSIZE, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DefaultCropSize", NULL },
- { TIFFTAG_COLORMATRIX1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ColorMatrix1", NULL },
- { TIFFTAG_COLORMATRIX2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ColorMatrix2", NULL },
- { TIFFTAG_CAMERACALIBRATION1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "CameraCalibration1", NULL },
- { TIFFTAG_CAMERACALIBRATION2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "CameraCalibration2", NULL },
- { TIFFTAG_REDUCTIONMATRIX1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ReductionMatrix1", NULL },
- { TIFFTAG_REDUCTIONMATRIX2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ReductionMatrix2", NULL },
- { TIFFTAG_ANALOGBALANCE, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "AnalogBalance", NULL },
- { TIFFTAG_ASSHOTNEUTRAL, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "AsShotNeutral", NULL },
- { TIFFTAG_ASSHOTWHITEXY, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "AsShotWhiteXY", NULL },
- { TIFFTAG_BASELINEEXPOSURE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BaselineExposure", NULL },
- { TIFFTAG_BASELINENOISE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BaselineNoise", NULL },
- { TIFFTAG_BASELINESHARPNESS, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BaselineSharpness", NULL },
- { TIFFTAG_BAYERGREENSPLIT, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BayerGreenSplit", NULL },
- { TIFFTAG_LINEARRESPONSELIMIT, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "LinearResponseLimit", NULL },
- { TIFFTAG_CAMERASERIALNUMBER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CameraSerialNumber", NULL },
- { TIFFTAG_LENSINFO, 4, 4, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "LensInfo", NULL },
- { TIFFTAG_CHROMABLURRADIUS, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ChromaBlurRadius", NULL },
- { TIFFTAG_ANTIALIASSTRENGTH, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "AntiAliasStrength", NULL },
- { TIFFTAG_SHADOWSCALE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ShadowScale", NULL },
- { TIFFTAG_DNGPRIVATEDATA, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "DNGPrivateData", NULL },
- { TIFFTAG_MAKERNOTESAFETY, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "MakerNoteSafety", NULL },
- { TIFFTAG_CALIBRATIONILLUMINANT1, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CalibrationIlluminant1", NULL },
- { TIFFTAG_CALIBRATIONILLUMINANT2, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CalibrationIlluminant2", NULL },
- { TIFFTAG_RAWDATAUNIQUEID, 16, 16, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "RawDataUniqueID", NULL },
- { TIFFTAG_ORIGINALRAWFILENAME, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "OriginalRawFileName", NULL },
- { TIFFTAG_ORIGINALRAWFILEDATA, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "OriginalRawFileData", NULL },
- { TIFFTAG_ACTIVEAREA, 4, 4, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ActiveArea", NULL },
- { TIFFTAG_MASKEDAREAS, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "MaskedAreas", NULL },
- { TIFFTAG_ASSHOTICCPROFILE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "AsShotICCProfile", NULL },
- { TIFFTAG_ASSHOTPREPROFILEMATRIX, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "AsShotPreProfileMatrix", NULL },
- { TIFFTAG_CURRENTICCPROFILE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "CurrentICCProfile", NULL },
- { TIFFTAG_CURRENTPREPROFILEMATRIX, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "CurrentPreProfileMatrix", NULL },
- { TIFFTAG_PERSAMPLE, 0, 0, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "PerSample", NULL},
- /* end DNG tags */
- /* begin TIFF/FX tags */
- { TIFFTAG_INDEXED, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "Indexed", NULL },
- { TIFFTAG_GLOBALPARAMETERSIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "GlobalParametersIFD", NULL },
- { TIFFTAG_PROFILETYPE, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ProfileType", NULL },
- { TIFFTAG_FAXPROFILE, 1, 1, TIFF_BYTE, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "FaxProfile", NULL },
- { TIFFTAG_CODINGMETHODS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CodingMethods", NULL },
- { TIFFTAG_VERSIONYEAR, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "VersionYear", NULL },
- { TIFFTAG_MODENUMBER, 1, 1, TIFF_BYTE, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ModeNumber", NULL },
- { TIFFTAG_DECODE, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "Decode", NULL },
- { TIFFTAG_IMAGEBASECOLOR, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ImageBaseColor", NULL },
- { TIFFTAG_T82OPTIONS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "T82Options", NULL },
- { TIFFTAG_STRIPROWCOUNTS, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "StripRowCounts", NULL },
- { TIFFTAG_IMAGELAYER, 2, 2, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ImageLayer", NULL },
- /* end TIFF/FX tags */
- /* begin pseudo tags */
+static const TIFFField tiffFields[] = {
+ {TIFFTAG_SUBFILETYPE, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_SUBFILETYPE, 1, 0, "SubfileType", NULL},
+ {TIFFTAG_OSUBFILETYPE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED,
+ TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "OldSubfileType", NULL},
+ {TIFFTAG_IMAGEWIDTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_IMAGEDIMENSIONS, 0, 0, "ImageWidth", NULL},
+ {TIFFTAG_IMAGELENGTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_IMAGEDIMENSIONS, 1, 0, "ImageLength", NULL},
+ {TIFFTAG_BITSPERSAMPLE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_BITSPERSAMPLE, 0, 0, "BitsPerSample", NULL},
+ {TIFFTAG_COMPRESSION, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_COMPRESSION, 0, 0, "Compression", NULL},
+ {TIFFTAG_PHOTOMETRIC, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_PHOTOMETRIC, 0, 0,
+ "PhotometricInterpretation", NULL},
+ {TIFFTAG_THRESHHOLDING, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_THRESHHOLDING, 1, 0, "Threshholding", NULL},
+ {TIFFTAG_CELLWIDTH, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CellWidth", NULL},
+ {TIFFTAG_CELLLENGTH, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CellLength", NULL},
+ {TIFFTAG_FILLORDER, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_FILLORDER, 0, 0, "FillOrder", NULL},
+ {TIFFTAG_DOCUMENTNAME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DocumentName", NULL},
+ {TIFFTAG_IMAGEDESCRIPTION, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImageDescription", NULL},
+ {TIFFTAG_MAKE, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Make", NULL},
+ {TIFFTAG_MODEL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Model", NULL},
+ {TIFFTAG_STRIPOFFSETS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED,
+ TIFF_SETGET_UNDEFINED, FIELD_STRIPOFFSETS, 0, 0, "StripOffsets", NULL},
+ {TIFFTAG_ORIENTATION, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_ORIENTATION, 0, 0, "Orientation", NULL},
+ {TIFFTAG_SAMPLESPERPIXEL, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_SAMPLESPERPIXEL, 0, 0, "SamplesPerPixel",
+ NULL},
+ {TIFFTAG_ROWSPERSTRIP, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_ROWSPERSTRIP, 0, 0, "RowsPerStrip", NULL},
+ {TIFFTAG_STRIPBYTECOUNTS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED,
+ TIFF_SETGET_UNDEFINED, FIELD_STRIPBYTECOUNTS, 0, 0, "StripByteCounts",
+ NULL},
+ {TIFFTAG_MINSAMPLEVALUE, -2, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_MINSAMPLEVALUE, 1, 0, "MinSampleValue", NULL},
+ {TIFFTAG_MAXSAMPLEVALUE, -2, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_MAXSAMPLEVALUE, 1, 0, "MaxSampleValue", NULL},
+ {TIFFTAG_XRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_RESOLUTION, 1, 0, "XResolution", NULL},
+ {TIFFTAG_YRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_RESOLUTION, 1, 0, "YResolution", NULL},
+ {TIFFTAG_PLANARCONFIG, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_PLANARCONFIG, 0, 0, "PlanarConfiguration",
+ NULL},
+ {TIFFTAG_PAGENAME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PageName", NULL},
+ {TIFFTAG_XPOSITION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_POSITION, 1, 0, "XPosition", NULL},
+ {TIFFTAG_YPOSITION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_POSITION, 1, 0, "YPosition", NULL},
+ {TIFFTAG_FREEOFFSETS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED,
+ TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 0, 0, "FreeOffsets", NULL},
+ {TIFFTAG_FREEBYTECOUNTS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED,
+ TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 0, 0, "FreeByteCounts", NULL},
+ {TIFFTAG_GRAYRESPONSEUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED,
+ TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "GrayResponseUnit", NULL},
+ {TIFFTAG_GRAYRESPONSECURVE, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED,
+ TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "GrayResponseCurve", NULL},
+ {TIFFTAG_RESOLUTIONUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_RESOLUTIONUNIT, 1, 0, "ResolutionUnit", NULL},
+ {TIFFTAG_PAGENUMBER, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_UINT16_PAIR,
+ TIFF_SETGET_UNDEFINED, FIELD_PAGENUMBER, 1, 0, "PageNumber", NULL},
+ {TIFFTAG_COLORRESPONSEUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED,
+ TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "ColorResponseUnit", NULL},
+ {TIFFTAG_TRANSFERFUNCTION, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_OTHER,
+ TIFF_SETGET_UNDEFINED, FIELD_TRANSFERFUNCTION, 1, 0, "TransferFunction",
+ NULL},
+ {TIFFTAG_SOFTWARE, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Software", NULL},
+ {TIFFTAG_DATETIME, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DateTime", NULL},
+ {TIFFTAG_ARTIST, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Artist", NULL},
+ {TIFFTAG_HOSTCOMPUTER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "HostComputer", NULL},
+ {TIFFTAG_WHITEPOINT, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "WhitePoint", NULL},
+ {TIFFTAG_PRIMARYCHROMATICITIES, 6, 6, TIFF_RATIONAL, 0,
+ TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0,
+ "PrimaryChromaticities", NULL},
+ {TIFFTAG_COLORMAP, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_OTHER,
+ TIFF_SETGET_UNDEFINED, FIELD_COLORMAP, 1, 0, "ColorMap", NULL},
+ {TIFFTAG_HALFTONEHINTS, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_UINT16_PAIR,
+ TIFF_SETGET_UNDEFINED, FIELD_HALFTONEHINTS, 1, 0, "HalftoneHints", NULL},
+ {TIFFTAG_TILEWIDTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_TILEDIMENSIONS, 0, 0, "TileWidth", NULL},
+ {TIFFTAG_TILELENGTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_TILEDIMENSIONS, 0, 0, "TileLength", NULL},
+ {TIFFTAG_TILEOFFSETS, -1, 1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED,
+ TIFF_SETGET_UNDEFINED, FIELD_STRIPOFFSETS, 0, 0, "TileOffsets", NULL},
+ {TIFFTAG_TILEBYTECOUNTS, -1, 1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED,
+ TIFF_SETGET_UNDEFINED, FIELD_STRIPBYTECOUNTS, 0, 0, "TileByteCounts",
+ NULL},
+ {TIFFTAG_SUBIFD, -1, -1, TIFF_IFD8, 0, TIFF_SETGET_C16_IFD8,
+ TIFF_SETGET_UNDEFINED, FIELD_SUBIFD, 1, 1, "SubIFD",
+ (TIFFFieldArray *)&tiffFieldArray},
+ {TIFFTAG_INKSET, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "InkSet", NULL},
+ {TIFFTAG_INKNAMES, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_C16_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_INKNAMES, 1, 1, "InkNames", NULL},
+ {TIFFTAG_NUMBEROFINKS, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_NUMBEROFINKS, 1, 0, "NumberOfInks", NULL},
+ {TIFFTAG_DOTRANGE, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_UINT16_PAIR,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DotRange", NULL},
+ {TIFFTAG_TARGETPRINTER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "TargetPrinter", NULL},
+ {TIFFTAG_EXTRASAMPLES, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_EXTRASAMPLES, 0, 1, "ExtraSamples", NULL},
+ {TIFFTAG_SAMPLEFORMAT, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_SAMPLEFORMAT, 0, 0, "SampleFormat", NULL},
+ {TIFFTAG_SMINSAMPLEVALUE, -2, -1, TIFF_ANY, 0, TIFF_SETGET_DOUBLE,
+ TIFF_SETGET_UNDEFINED, FIELD_SMINSAMPLEVALUE, 1, 0, "SMinSampleValue",
+ NULL},
+ {TIFFTAG_SMAXSAMPLEVALUE, -2, -1, TIFF_ANY, 0, TIFF_SETGET_DOUBLE,
+ TIFF_SETGET_UNDEFINED, FIELD_SMAXSAMPLEVALUE, 1, 0, "SMaxSampleValue",
+ NULL},
+ {TIFFTAG_CLIPPATH, -3, -3, TIFF_BYTE, 0, TIFF_SETGET_C32_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ClipPath", NULL},
+ {TIFFTAG_XCLIPPATHUNITS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "XClipPathUnits", NULL},
+ {TIFFTAG_YCLIPPATHUNITS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "YClipPathUnits", NULL},
+ {TIFFTAG_YCBCRCOEFFICIENTS, 3, 3, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "YCbCrCoefficients", NULL},
+ {TIFFTAG_YCBCRSUBSAMPLING, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_UINT16_PAIR,
+ TIFF_SETGET_UNDEFINED, FIELD_YCBCRSUBSAMPLING, 0, 0, "YCbCrSubsampling",
+ NULL},
+ {TIFFTAG_YCBCRPOSITIONING, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_YCBCRPOSITIONING, 0, 0, "YCbCrPositioning",
+ NULL},
+ {TIFFTAG_REFERENCEBLACKWHITE, 6, 6, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_REFBLACKWHITE, 1, 0, "ReferenceBlackWhite",
+ NULL},
+ {TIFFTAG_XMLPACKET, -3, -3, TIFF_BYTE, 0, TIFF_SETGET_C32_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "XMLPacket", NULL},
+ /* begin SGI tags */
+ {TIFFTAG_MATTEING, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_EXTRASAMPLES, 0, 0, "Matteing", NULL},
+ {TIFFTAG_DATATYPE, -2, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_SAMPLEFORMAT, 0, 0, "DataType", NULL},
+ {TIFFTAG_IMAGEDEPTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_IMAGEDEPTH, 0, 0, "ImageDepth", NULL},
+ {TIFFTAG_TILEDEPTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_TILEDEPTH, 0, 0, "TileDepth", NULL},
+ /* end SGI tags */
+ /* begin Pixar tags */
+ {TIFFTAG_PIXAR_IMAGEFULLWIDTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImageFullWidth", NULL},
+ {TIFFTAG_PIXAR_IMAGEFULLLENGTH, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImageFullLength", NULL},
+ {TIFFTAG_PIXAR_TEXTUREFORMAT, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "TextureFormat", NULL},
+ {TIFFTAG_PIXAR_WRAPMODES, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "TextureWrapModes", NULL},
+ {TIFFTAG_PIXAR_FOVCOT, 1, 1, TIFF_FLOAT, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FieldOfViewCotangent", NULL},
+ {TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN, 16, 16, TIFF_FLOAT, 0,
+ TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0,
+ "MatrixWorldToScreen", NULL},
+ {TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA, 16, 16, TIFF_FLOAT, 0,
+ TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0,
+ "MatrixWorldToCamera", NULL},
+ {TIFFTAG_CFAREPEATPATTERNDIM, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CFARepeatPatternDim", NULL},
+ {TIFFTAG_CFAPATTERN, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "CFAPattern", NULL},
+ {TIFFTAG_COPYRIGHT, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Copyright", NULL},
+ /* end Pixar tags */
+ {TIFFTAG_RICHTIFFIPTC, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "RichTIFFIPTC", NULL},
+ {TIFFTAG_PHOTOSHOP, -3, -3, TIFF_BYTE, 0, TIFF_SETGET_C32_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "Photoshop", NULL},
+ /*--: EXIFIFD and GPSIFD specified as TIFF_LONG by Aware-Systems and not
+ * TIFF_IFD8 as in original LibTiff. However, for IFD-like tags, libtiff
+ * uses the data type TIFF_IFD8 in tiffFields[]-tag definition combined with
+ * a special handling procedure in order to write either a 32-bit value
+ * and the TIFF_IFD type-id into ClassicTIFF files or a 64-bit value and the
+ * TIFF_IFD8 type-id into BigTIFF files. */
+ {TIFFTAG_EXIFIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EXIFIFDOffset",
+ (TIFFFieldArray *)&exifFieldArray},
+ {TIFFTAG_ICCPROFILE, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ICC Profile", NULL},
+ {TIFFTAG_GPSIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "GPSIFDOffset",
+ (TIFFFieldArray *)&gpsFieldArray},
+ {TIFFTAG_FAXRECVPARAMS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UINT32, FIELD_CUSTOM, TRUE, FALSE, "FaxRecvParams", NULL},
+ {TIFFTAG_FAXSUBADDRESS, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_ASCII, FIELD_CUSTOM, TRUE, FALSE, "FaxSubAddress", NULL},
+ {TIFFTAG_FAXRECVTIME, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UINT32, FIELD_CUSTOM, TRUE, FALSE, "FaxRecvTime", NULL},
+ {TIFFTAG_FAXDCS, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_ASCII, FIELD_CUSTOM, TRUE, FALSE, "FaxDcs", NULL},
+ {TIFFTAG_STONITS, 1, 1, TIFF_DOUBLE, 0, TIFF_SETGET_DOUBLE,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "StoNits", NULL},
+ {TIFFTAG_IMAGESOURCEDATA, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1,
+ "Adobe Photoshop Document Data Block", NULL},
+ {TIFFTAG_INTEROPERABILITYIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "InteroperabilityIFDOffset",
+ NULL},
+ /* begin DNG tags */
+ {TIFFTAG_DNGVERSION, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DNGVersion", NULL},
+ {TIFFTAG_DNGBACKWARDVERSION, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DNGBackwardVersion", NULL},
+ {TIFFTAG_UNIQUECAMERAMODEL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "UniqueCameraModel", NULL},
+ {TIFFTAG_LOCALIZEDCAMERAMODEL, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "LocalizedCameraModel", NULL},
+ {TIFFTAG_CFAPLANECOLOR, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "CFAPlaneColor", NULL},
+ {TIFFTAG_CFALAYOUT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CFALayout", NULL},
+ {TIFFTAG_LINEARIZATIONTABLE, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "LinearizationTable", NULL},
+ {TIFFTAG_BLACKLEVELREPEATDIM, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BlackLevelRepeatDim", NULL},
+ {TIFFTAG_BLACKLEVEL, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "BlackLevel", NULL},
+ {TIFFTAG_BLACKLEVELDELTAH, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "BlackLevelDeltaH", NULL},
+ {TIFFTAG_BLACKLEVELDELTAV, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "BlackLevelDeltaV", NULL},
+ {TIFFTAG_WHITELEVEL, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "WhiteLevel", NULL},
+ {TIFFTAG_DEFAULTSCALE, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DefaultScale", NULL},
+ {TIFFTAG_BESTQUALITYSCALE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BestQualityScale", NULL},
+ {TIFFTAG_DEFAULTCROPORIGIN, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DefaultCropOrigin", NULL},
+ {TIFFTAG_DEFAULTCROPSIZE, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DefaultCropSize", NULL},
+ {TIFFTAG_COLORMATRIX1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ColorMatrix1", NULL},
+ {TIFFTAG_COLORMATRIX2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ColorMatrix2", NULL},
+ {TIFFTAG_CAMERACALIBRATION1, -1, -1, TIFF_SRATIONAL, 0,
+ TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1,
+ "CameraCalibration1", NULL},
+ {TIFFTAG_CAMERACALIBRATION2, -1, -1, TIFF_SRATIONAL, 0,
+ TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1,
+ "CameraCalibration2", NULL},
+ {TIFFTAG_REDUCTIONMATRIX1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ReductionMatrix1", NULL},
+ {TIFFTAG_REDUCTIONMATRIX2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ReductionMatrix2", NULL},
+ {TIFFTAG_ANALOGBALANCE, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "AnalogBalance", NULL},
+ {TIFFTAG_ASSHOTNEUTRAL, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "AsShotNeutral", NULL},
+ {TIFFTAG_ASSHOTWHITEXY, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "AsShotWhiteXY", NULL},
+ {TIFFTAG_BASELINEEXPOSURE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BaselineExposure", NULL},
+ {TIFFTAG_BASELINENOISE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BaselineNoise", NULL},
+ {TIFFTAG_BASELINESHARPNESS, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BaselineSharpness", NULL},
+ {TIFFTAG_BAYERGREENSPLIT, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BayerGreenSplit", NULL},
+ {TIFFTAG_LINEARRESPONSELIMIT, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "LinearResponseLimit", NULL},
+ {TIFFTAG_CAMERASERIALNUMBER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CameraSerialNumber", NULL},
+ {TIFFTAG_LENSINFO, 4, 4, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "LensInfo", NULL},
+ {TIFFTAG_CHROMABLURRADIUS, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ChromaBlurRadius", NULL},
+ {TIFFTAG_ANTIALIASSTRENGTH, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "AntiAliasStrength", NULL},
+ {TIFFTAG_SHADOWSCALE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ShadowScale", NULL},
+ {TIFFTAG_DNGPRIVATEDATA, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "DNGPrivateData", NULL},
+ {TIFFTAG_MAKERNOTESAFETY, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "MakerNoteSafety", NULL},
+ {TIFFTAG_CALIBRATIONILLUMINANT1, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CalibrationIlluminant1", NULL},
+ {TIFFTAG_CALIBRATIONILLUMINANT2, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CalibrationIlluminant2", NULL},
+ {TIFFTAG_RAWDATAUNIQUEID, 16, 16, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "RawDataUniqueID", NULL},
+ {TIFFTAG_ORIGINALRAWFILENAME, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "OriginalRawFileName", NULL},
+ {TIFFTAG_ORIGINALRAWFILEDATA, -1, -1, TIFF_UNDEFINED, 0,
+ TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1,
+ "OriginalRawFileData", NULL},
+ {TIFFTAG_ACTIVEAREA, 4, 4, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ActiveArea", NULL},
+ {TIFFTAG_MASKEDAREAS, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "MaskedAreas", NULL},
+ {TIFFTAG_ASSHOTICCPROFILE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "AsShotICCProfile", NULL},
+ {TIFFTAG_ASSHOTPREPROFILEMATRIX, -1, -1, TIFF_SRATIONAL, 0,
+ TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1,
+ "AsShotPreProfileMatrix", NULL},
+ {TIFFTAG_CURRENTICCPROFILE, -1, -1, TIFF_UNDEFINED, 0,
+ TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1,
+ "CurrentICCProfile", NULL},
+ {TIFFTAG_CURRENTPREPROFILEMATRIX, -1, -1, TIFF_SRATIONAL, 0,
+ TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1,
+ "CurrentPreProfileMatrix", NULL},
+ {TIFFTAG_PERSAMPLE, 0, 0, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED,
+ TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "PerSample", NULL},
+ /* end DNG tags */
+ /* begin TIFF/FX tags */
+ {TIFFTAG_INDEXED, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "Indexed", NULL},
+ {TIFFTAG_GLOBALPARAMETERSIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "GlobalParametersIFD", NULL},
+ {TIFFTAG_PROFILETYPE, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ProfileType", NULL},
+ {TIFFTAG_FAXPROFILE, 1, 1, TIFF_BYTE, 0, TIFF_SETGET_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "FaxProfile", NULL},
+ {TIFFTAG_CODINGMETHODS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CodingMethods", NULL},
+ {TIFFTAG_VERSIONYEAR, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "VersionYear", NULL},
+ {TIFFTAG_MODENUMBER, 1, 1, TIFF_BYTE, 0, TIFF_SETGET_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ModeNumber", NULL},
+ {TIFFTAG_DECODE, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "Decode", NULL},
+ {TIFFTAG_IMAGEBASECOLOR, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ImageBaseColor", NULL},
+ {TIFFTAG_T82OPTIONS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "T82Options", NULL},
+ {TIFFTAG_STRIPROWCOUNTS, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "StripRowCounts", NULL},
+ {TIFFTAG_IMAGELAYER, 2, 2, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ImageLayer", NULL},
+ /* end TIFF/FX tags */
+ /* begin pseudo tags */
};
-static const TIFFField
-exifFields[] = {
- { EXIFTAG_EXPOSURETIME, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureTime", NULL },
- { EXIFTAG_FNUMBER, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FNumber", NULL },
- { EXIFTAG_EXPOSUREPROGRAM, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureProgram", NULL },
- { EXIFTAG_SPECTRALSENSITIVITY, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SpectralSensitivity", NULL },
- { EXIFTAG_ISOSPEEDRATINGS, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ISOSpeedRatings", NULL },
- { EXIFTAG_OECF, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "OptoelectricConversionFactor", NULL },
- { EXIFTAG_EXIFVERSION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExifVersion", NULL },
- { EXIFTAG_DATETIMEORIGINAL, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DateTimeOriginal", NULL },
- { EXIFTAG_DATETIMEDIGITIZED, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DateTimeDigitized", NULL },
- { EXIFTAG_COMPONENTSCONFIGURATION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ComponentsConfiguration", NULL },
- { EXIFTAG_COMPRESSEDBITSPERPIXEL, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CompressedBitsPerPixel", NULL },
- { EXIFTAG_SHUTTERSPEEDVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ShutterSpeedValue", NULL },
- { EXIFTAG_APERTUREVALUE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ApertureValue", NULL },
- { EXIFTAG_BRIGHTNESSVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "BrightnessValue", NULL },
- { EXIFTAG_EXPOSUREBIASVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureBiasValue", NULL },
- { EXIFTAG_MAXAPERTUREVALUE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MaxApertureValue", NULL },
- { EXIFTAG_SUBJECTDISTANCE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubjectDistance", NULL },
- { EXIFTAG_METERINGMODE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MeteringMode", NULL },
- { EXIFTAG_LIGHTSOURCE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LightSource", NULL },
- { EXIFTAG_FLASH, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Flash", NULL },
- { EXIFTAG_FOCALLENGTH, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalLength", NULL },
- { EXIFTAG_SUBJECTAREA, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "SubjectArea", NULL },
- { EXIFTAG_MAKERNOTE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "MakerNote", NULL },
- { EXIFTAG_USERCOMMENT, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "UserComment", NULL },
- { EXIFTAG_SUBSECTIME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubSecTime", NULL },
- { EXIFTAG_SUBSECTIMEORIGINAL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubSecTimeOriginal", NULL },
- { EXIFTAG_SUBSECTIMEDIGITIZED, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubSecTimeDigitized", NULL },
- { EXIFTAG_FLASHPIXVERSION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FlashpixVersion", NULL },
- { EXIFTAG_COLORSPACE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ColorSpace", NULL },
- { EXIFTAG_PIXELXDIMENSION, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PixelXDimension", NULL },
- { EXIFTAG_PIXELYDIMENSION, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PixelYDimension", NULL },
- { EXIFTAG_RELATEDSOUNDFILE, 13, 13, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "RelatedSoundFile", NULL },
- { EXIFTAG_FLASHENERGY, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FlashEnergy", NULL },
- { EXIFTAG_SPATIALFREQUENCYRESPONSE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "SpatialFrequencyResponse", NULL },
- { EXIFTAG_FOCALPLANEXRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalPlaneXResolution", NULL },
- { EXIFTAG_FOCALPLANEYRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalPlaneYResolution", NULL },
- { EXIFTAG_FOCALPLANERESOLUTIONUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalPlaneResolutionUnit", NULL },
- { EXIFTAG_SUBJECTLOCATION, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubjectLocation", NULL },
- { EXIFTAG_EXPOSUREINDEX, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureIndex", NULL },
- { EXIFTAG_SENSINGMETHOD, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SensingMethod", NULL },
- { EXIFTAG_FILESOURCE, 1, 1, TIFF_UNDEFINED, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FileSource", NULL },
- { EXIFTAG_SCENETYPE, 1, 1, TIFF_UNDEFINED, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SceneType", NULL },
- { EXIFTAG_CFAPATTERN, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "CFAPattern", NULL },
- { EXIFTAG_CUSTOMRENDERED, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CustomRendered", NULL },
- { EXIFTAG_EXPOSUREMODE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureMode", NULL },
- { EXIFTAG_WHITEBALANCE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "WhiteBalance", NULL },
- { EXIFTAG_DIGITALZOOMRATIO, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DigitalZoomRatio", NULL },
- { EXIFTAG_FOCALLENGTHIN35MMFILM, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalLengthIn35mmFilm", NULL },
- { EXIFTAG_SCENECAPTURETYPE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SceneCaptureType", NULL },
- { EXIFTAG_GAINCONTROL, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "GainControl", NULL },
- { EXIFTAG_CONTRAST, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Contrast", NULL },
- { EXIFTAG_SATURATION, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Saturation", NULL },
- { EXIFTAG_SHARPNESS, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Sharpness", NULL },
- { EXIFTAG_DEVICESETTINGDESCRIPTION, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "DeviceSettingDescription", NULL },
- { EXIFTAG_SUBJECTDISTANCERANGE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubjectDistanceRange", NULL },
- { EXIFTAG_IMAGEUNIQUEID, 33, 33, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImageUniqueID", NULL }
-};
+/*
+ * EXIF tags (Version 2.31, July 2016 plus version 2.32 May 2019)
+ */
+static const TIFFField exifFields[] = {
+ {EXIFTAG_EXPOSURETIME, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureTime", NULL},
+ {EXIFTAG_FNUMBER, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FNumber", NULL},
+ {EXIFTAG_EXPOSUREPROGRAM, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureProgram", NULL},
+ {EXIFTAG_SPECTRALSENSITIVITY, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SpectralSensitivity", NULL},
+ {EXIFTAG_ISOSPEEDRATINGS, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ISOSpeedRatings", NULL},
+ {EXIFTAG_OECF, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "OptoelectricConversionFactor",
+ NULL},
+ {EXIFTAG_SENSITIVITYTYPE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SensitivityType", NULL},
+ {EXIFTAG_STANDARDOUTPUTSENSITIVITY, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "StandardOutputSensitivity",
+ NULL},
+ {EXIFTAG_RECOMMENDEDEXPOSUREINDEX, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "RecommendedExposureIndex",
+ NULL},
+ {EXIFTAG_ISOSPEED, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ISOSpeed", NULL},
+ {EXIFTAG_ISOSPEEDLATITUDEYYY, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ISOSpeedLatitudeyyy", NULL},
+ {EXIFTAG_ISOSPEEDLATITUDEZZZ, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ISOSpeedLatitudezzz", NULL},
+ {EXIFTAG_EXIFVERSION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExifVersion", NULL},
+ {EXIFTAG_DATETIMEORIGINAL, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DateTimeOriginal", NULL},
+ {EXIFTAG_DATETIMEDIGITIZED, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DateTimeDigitized", NULL},
+ {EXIFTAG_OFFSETTIME, 7, 7, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "OffsetTime", NULL},
+ {EXIFTAG_OFFSETTIMEORIGINAL, 7, 7, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "OffsetTimeOriginal", NULL},
+ {EXIFTAG_OFFSETTIMEDIGITIZED, 7, 7, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "OffsetTimeDigitized", NULL},
+ {EXIFTAG_COMPONENTSCONFIGURATION, 4, 4, TIFF_UNDEFINED, 0,
+ TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0,
+ "ComponentsConfiguration", NULL},
+ {EXIFTAG_COMPRESSEDBITSPERPIXEL, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CompressedBitsPerPixel", NULL},
+ {EXIFTAG_SHUTTERSPEEDVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ShutterSpeedValue", NULL},
+ {EXIFTAG_APERTUREVALUE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ApertureValue", NULL},
+ {EXIFTAG_BRIGHTNESSVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "BrightnessValue", NULL},
+ {EXIFTAG_EXPOSUREBIASVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureBiasValue", NULL},
+ {EXIFTAG_MAXAPERTUREVALUE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MaxApertureValue", NULL},
+ /*--: EXIFTAG_SUBJECTDISTANCE: LibTiff returns value of "-1" if numerator
+ * equals 4294967295 (0xFFFFFFFF) to indicate infinite distance! However,
+ * there are two other EXIF tags where numerator indicates a special value
+ * and six other cases where the denominator indicates special values, which
+ * are not treated within LibTiff!! */
+ {EXIFTAG_SUBJECTDISTANCE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubjectDistance", NULL},
+ {EXIFTAG_METERINGMODE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MeteringMode", NULL},
+ {EXIFTAG_LIGHTSOURCE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LightSource", NULL},
+ {EXIFTAG_FLASH, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Flash", NULL},
+ {EXIFTAG_FOCALLENGTH, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalLength", NULL},
+ {EXIFTAG_SUBJECTAREA, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "SubjectArea", NULL},
+ {EXIFTAG_MAKERNOTE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "MakerNote", NULL},
+ {EXIFTAG_USERCOMMENT, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "UserComment", NULL},
+ {EXIFTAG_SUBSECTIME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubSecTime", NULL},
+ {EXIFTAG_SUBSECTIMEORIGINAL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubSecTimeOriginal", NULL},
+ {EXIFTAG_SUBSECTIMEDIGITIZED, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubSecTimeDigitized", NULL},
+ {EXIFTAG_TEMPERATURE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Temperature", NULL},
+ {EXIFTAG_HUMIDITY, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Humidity", NULL},
+ {EXIFTAG_PRESSURE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Pressure", NULL},
+ {EXIFTAG_WATERDEPTH, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "WaterDepth", NULL},
+ {EXIFTAG_ACCELERATION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Acceleration", NULL},
+ {EXIFTAG_CAMERAELEVATIONANGLE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CameraElevationAngle", NULL},
+ {EXIFTAG_FLASHPIXVERSION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FlashpixVersion", NULL},
+ {EXIFTAG_COLORSPACE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ColorSpace", NULL},
+ {EXIFTAG_PIXELXDIMENSION, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PixelXDimension", NULL},
+ {EXIFTAG_PIXELYDIMENSION, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PixelYDimension", NULL},
+ {EXIFTAG_RELATEDSOUNDFILE, 13, 13, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "RelatedSoundFile", NULL},
+ {EXIFTAG_FLASHENERGY, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FlashEnergy", NULL},
+ {EXIFTAG_SPATIALFREQUENCYRESPONSE, -1, -1, TIFF_UNDEFINED, 0,
+ TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1,
+ "SpatialFrequencyResponse", NULL},
+ {EXIFTAG_FOCALPLANEXRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalPlaneXResolution", NULL},
+ {EXIFTAG_FOCALPLANEYRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalPlaneYResolution", NULL},
+ {EXIFTAG_FOCALPLANERESOLUTIONUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalPlaneResolutionUnit",
+ NULL},
+ {EXIFTAG_SUBJECTLOCATION, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubjectLocation", NULL},
+ {EXIFTAG_EXPOSUREINDEX, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureIndex", NULL},
+ {EXIFTAG_SENSINGMETHOD, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SensingMethod", NULL},
+ {EXIFTAG_FILESOURCE, 1, 1, TIFF_UNDEFINED, 0, TIFF_SETGET_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FileSource", NULL},
+ {EXIFTAG_SCENETYPE, 1, 1, TIFF_UNDEFINED, 0, TIFF_SETGET_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SceneType", NULL},
+ {EXIFTAG_CFAPATTERN, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "CFAPattern", NULL},
+ {EXIFTAG_CUSTOMRENDERED, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CustomRendered", NULL},
+ {EXIFTAG_EXPOSUREMODE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureMode", NULL},
+ {EXIFTAG_WHITEBALANCE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "WhiteBalance", NULL},
+ {EXIFTAG_DIGITALZOOMRATIO, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DigitalZoomRatio", NULL},
+ {EXIFTAG_FOCALLENGTHIN35MMFILM, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalLengthIn35mmFilm", NULL},
+ {EXIFTAG_SCENECAPTURETYPE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SceneCaptureType", NULL},
+ {EXIFTAG_GAINCONTROL, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "GainControl", NULL},
+ {EXIFTAG_CONTRAST, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Contrast", NULL},
+ {EXIFTAG_SATURATION, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Saturation", NULL},
+ {EXIFTAG_SHARPNESS, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Sharpness", NULL},
+ {EXIFTAG_DEVICESETTINGDESCRIPTION, -1, -1, TIFF_UNDEFINED, 0,
+ TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1,
+ "DeviceSettingDescription", NULL},
+ {EXIFTAG_SUBJECTDISTANCERANGE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubjectDistanceRange", NULL},
+ {EXIFTAG_IMAGEUNIQUEID, 33, 33, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImageUniqueID", NULL},
+ {EXIFTAG_CAMERAOWNERNAME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CameraOwnerName", NULL},
+ {EXIFTAG_BODYSERIALNUMBER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "BodySerialNumber", NULL},
+ {EXIFTAG_LENSSPECIFICATION, 4, 4, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LensSpecification", NULL},
+ {EXIFTAG_LENSMAKE, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LensMake", NULL},
+ {EXIFTAG_LENSMODEL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LensModel", NULL},
+ {EXIFTAG_LENSSERIALNUMBER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LensSerialNumber", NULL},
+ {EXIFTAG_GAMMA, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Gamma", NULL},
+ {EXIFTAG_COMPOSITEIMAGE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CompositeImage", NULL},
+ {EXIFTAG_SOURCEIMAGENUMBEROFCOMPOSITEIMAGE, 2, 2, TIFF_SHORT, 0,
+ TIFF_SETGET_C0_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0,
+ "SourceImageNumberOfCompositeImage", NULL},
+ {EXIFTAG_SOURCEEXPOSURETIMESOFCOMPOSITEIMAGE, -1, -1, TIFF_UNDEFINED, 0,
+ TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1,
+ "SourceExposureTimesOfCompositeImage", NULL}};
+/*
+ * EXIF-GPS tags (Version 2.31, July 2016; nothing changed for version 2.32 May
+ * 2019)
+ */
-static const TIFFFieldArray
-tiffFieldArray = { tfiatImage, 0, TIFFArrayCount(tiffFields), (TIFFField*) tiffFields };
-static const TIFFFieldArray
-exifFieldArray = { tfiatExif, 0, TIFFArrayCount(exifFields), (TIFFField*) exifFields };
+static const TIFFField gpsFields[] = {
+ /* For the GPS tag definitions in gpsFields[] the standard definition for
+ *Rationals is TIFF_SETGET_DOUBLE and TIFF_SETGET_C0_FLOAT.
+ *-- ATTENTION: After the upgrade with Rational2Double, the GPSTAG values
+ *can now be written and also read in double precision! In order to achieve
+ *double precision for GPS tags: Standard definitions for GPSTAG is kept to
+ *TIFF_SETGET_DOUBLE and TIFF_SETGET_C0_FLOAT is changed to
+ *TIFF_SETGET_C0_DOUBLE.
+ */
+ {GPSTAG_VERSIONID, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8,
+ TIFF_SETGET_UINT8, FIELD_CUSTOM, 1, 0, "VersionID", NULL},
+ {GPSTAG_LATITUDEREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LatitudeRef", NULL},
+ {GPSTAG_LATITUDE, 3, 3, TIFF_RATIONAL, 0, TIFF_SETGET_C0_DOUBLE,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Latitude", NULL},
+ {GPSTAG_LONGITUDEREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LongitudeRef", NULL},
+ {GPSTAG_LONGITUDE, 3, 3, TIFF_RATIONAL, 0, TIFF_SETGET_C0_DOUBLE,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Longitude", NULL},
+ {GPSTAG_ALTITUDEREF, 1, 1, TIFF_BYTE, 0, TIFF_SETGET_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "AltitudeRef", NULL},
+ {GPSTAG_ALTITUDE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Altitude", NULL},
+ {GPSTAG_TIMESTAMP, 3, 3, TIFF_RATIONAL, 0, TIFF_SETGET_C0_DOUBLE,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "TimeStamp", NULL},
+ {GPSTAG_SATELLITES, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Satellites", NULL},
+ {GPSTAG_STATUS, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Status", NULL},
+ {GPSTAG_MEASUREMODE, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MeasureMode", NULL},
+ {GPSTAG_DOP, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DOP", NULL},
+ {GPSTAG_SPEEDREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SpeedRef", NULL},
+ {GPSTAG_SPEED, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Speed", NULL},
+ {GPSTAG_TRACKREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "TrackRef", NULL},
+ {GPSTAG_TRACK, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Track", NULL},
+ {GPSTAG_IMGDIRECTIONREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImgDirectionRef", NULL},
+ {GPSTAG_IMGDIRECTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImgDirection", NULL},
+ {GPSTAG_MAPDATUM, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MapDatum", NULL},
+ {GPSTAG_DESTLATITUDEREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DestLatitudeRef", NULL},
+ {GPSTAG_DESTLATITUDE, 3, 3, TIFF_RATIONAL, 0, TIFF_SETGET_C0_DOUBLE,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DestLatitude", NULL},
+ {GPSTAG_DESTLONGITUDEREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DestLongitudeRef", NULL},
+ {GPSTAG_DESTLONGITUDE, 3, 3, TIFF_RATIONAL, 0, TIFF_SETGET_C0_DOUBLE,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DestLongitude", NULL},
+ {GPSTAG_DESTBEARINGREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DestBearingRef", NULL},
+ {GPSTAG_DESTBEARING, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DestBearing", NULL},
+ {GPSTAG_DESTDISTANCEREF, 2, 2, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DestDistanceRef", NULL},
+ {GPSTAG_DESTDISTANCE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DestDistance", NULL},
+ {GPSTAG_PROCESSINGMETHOD, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ProcessingMethod", NULL},
+ {GPSTAG_AREAINFORMATION, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "AreaInformation", NULL},
+ {GPSTAG_DATESTAMP, 11, 11, TIFF_ASCII, 0, TIFF_SETGET_ASCII,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DateStamp", NULL},
+ {GPSTAG_DIFFERENTIAL, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Differential", NULL},
+ {GPSTAG_GPSHPOSITIONINGERROR, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE,
+ TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "HorizontalPositioningError",
+ NULL}};
+
+static const TIFFFieldArray tiffFieldArray = {
+ tfiatImage, 0, TIFFArrayCount(tiffFields), (TIFFField *)tiffFields};
+static const TIFFFieldArray exifFieldArray = {
+ tfiatExif, 0, TIFFArrayCount(exifFields), (TIFFField *)exifFields};
+static const TIFFFieldArray gpsFieldArray = {
+ tfiatGps, 0, TIFFArrayCount(gpsFields), (TIFFField *)gpsFields};
/*
* We have our own local lfind() equivalent to avoid subtle differences
- * in types passed to lfind() on different systems.
+ * in types passed to lfind() on different systems.
*/
-static void *
-td_lfind(const void *key, const void *base, size_t *nmemb, size_t size,
- int(*compar)(const void *, const void *))
+static void *td_lfind(const void *key, const void *base, size_t *nmemb,
+ size_t size, int (*compar)(const void *, const void *))
{
char *element, *end;
end = (char *)base + *nmemb * size;
for (element = (char *)base; element < end; element += size)
- if (!compar(key, element)) /* key found */
+ if (!compar(key, element)) /* key found */
return element;
return NULL;
}
-const TIFFFieldArray*
-_TIFFGetFields(void)
-{
- return(&tiffFieldArray);
-}
+const TIFFFieldArray *_TIFFGetFields(void) { return (&tiffFieldArray); }
-const TIFFFieldArray*
-_TIFFGetExifFields(void)
-{
- return(&exifFieldArray);
-}
+const TIFFFieldArray *_TIFFGetExifFields(void) { return (&exifFieldArray); }
+
+const TIFFFieldArray *_TIFFGetGpsFields(void) { return (&gpsFieldArray); }
-void
-_TIFFSetupFields(TIFF* tif, const TIFFFieldArray* fieldarray)
+void _TIFFSetupFields(TIFF *tif, const TIFFFieldArray *fieldarray)
{
- if (tif->tif_fields && tif->tif_nfields > 0) {
- uint32 i;
-
- for (i = 0; i < tif->tif_nfields; i++) {
- TIFFField *fld = tif->tif_fields[i];
- if (fld->field_bit == FIELD_CUSTOM &&
- strncmp("Tag ", fld->field_name, 4) == 0) {
- _TIFFfree(fld->field_name);
- _TIFFfree(fld);
- }
- }
-
- _TIFFfree(tif->tif_fields);
- tif->tif_fields = NULL;
- tif->tif_nfields = 0;
- }
- if (!_TIFFMergeFields(tif, fieldarray->fields, fieldarray->count)) {
- TIFFErrorExt(tif->tif_clientdata, "_TIFFSetupFields",
- "Setting up field info failed");
- }
+ if (tif->tif_fields && tif->tif_nfields > 0)
+ {
+ uint32_t i;
+
+ for (i = 0; i < tif->tif_nfields; i++)
+ {
+ TIFFField *fld = tif->tif_fields[i];
+ if (fld->field_name != NULL)
+ {
+ if (fld->field_bit == FIELD_CUSTOM && TIFFFieldIsAnonymous(fld))
+ {
+ _TIFFfreeExt(tif, fld->field_name);
+ /* caution: tif_fields[i] must not be the beginning of a
+ * fields-array. Otherwise the following tags are also freed
+ * with the first free().
+ */
+ _TIFFfreeExt(tif, fld);
+ }
+ }
+ }
+
+ _TIFFfreeExt(tif, tif->tif_fields);
+ tif->tif_fields = NULL;
+ tif->tif_nfields = 0;
+ }
+ if (!_TIFFMergeFields(tif, fieldarray->fields, fieldarray->count))
+ {
+ TIFFErrorExtR(tif, "_TIFFSetupFields", "Setting up field info failed");
+ }
}
-static int
-tagCompare(const void* a, const void* b)
+static int tagCompare(const void *a, const void *b)
{
- const TIFFField* ta = *(const TIFFField**) a;
- const TIFFField* tb = *(const TIFFField**) b;
- /* NB: be careful of return values for 16-bit platforms */
- if (ta->field_tag != tb->field_tag)
- return (int)ta->field_tag - (int)tb->field_tag;
- else
- return (ta->field_type == TIFF_ANY) ?
- 0 : ((int)tb->field_type - (int)ta->field_type);
+ const TIFFField *ta = *(const TIFFField **)a;
+ const TIFFField *tb = *(const TIFFField **)b;
+ /* NB: be careful of return values for 16-bit platforms */
+ if (ta->field_tag != tb->field_tag)
+ return (int)ta->field_tag - (int)tb->field_tag;
+ else
+ return (ta->field_type == TIFF_ANY)
+ ? 0
+ : ((int)tb->field_type - (int)ta->field_type);
}
-static int
-tagNameCompare(const void* a, const void* b)
+static int tagNameCompare(const void *a, const void *b)
{
- const TIFFField* ta = *(const TIFFField**) a;
- const TIFFField* tb = *(const TIFFField**) b;
- int ret = strcmp(ta->field_name, tb->field_name);
-
- if (ret)
- return ret;
- else
- return (ta->field_type == TIFF_ANY) ?
- 0 : ((int)tb->field_type - (int)ta->field_type);
+ const TIFFField *ta = *(const TIFFField **)a;
+ const TIFFField *tb = *(const TIFFField **)b;
+ int ret = strcmp(ta->field_name, tb->field_name);
+
+ if (ret)
+ return ret;
+ else
+ return (ta->field_type == TIFF_ANY)
+ ? 0
+ : ((int)tb->field_type - (int)ta->field_type);
}
-int
-_TIFFMergeFields(TIFF* tif, const TIFFField info[], uint32 n)
+int _TIFFMergeFields(TIFF *tif, const TIFFField info[], uint32_t n)
{
- static const char module[] = "_TIFFMergeFields";
- static const char reason[] = "for fields array";
- /* TIFFField** tp; */
- uint32 i;
-
- tif->tif_foundfield = NULL;
-
- if (tif->tif_fields && tif->tif_nfields > 0) {
- tif->tif_fields = (TIFFField**)
- _TIFFCheckRealloc(tif, tif->tif_fields,
- (tif->tif_nfields + n),
- sizeof(TIFFField *), reason);
- } else {
- tif->tif_fields = (TIFFField **)
- _TIFFCheckMalloc(tif, n, sizeof(TIFFField *),
- reason);
- }
- if (!tif->tif_fields) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Failed to allocate fields array");
- return 0;
- }
-
- /* tp = tif->tif_fields + tif->tif_nfields; */
- for (i = 0; i < n; i++) {
- const TIFFField *fip =
- TIFFFindField(tif, info[i].field_tag, TIFF_ANY);
-
- /* only add definitions that aren't already present */
- if (!fip) {
- tif->tif_fields[tif->tif_nfields] = (TIFFField *) (info+i);
- tif->tif_nfields++;
- }
- }
-
- /* Sort the field info by tag number */
- qsort(tif->tif_fields, tif->tif_nfields,
- sizeof(TIFFField *), tagCompare);
-
- return n;
+ static const char module[] = "_TIFFMergeFields";
+ static const char reason[] = "for fields array";
+ /* TIFFField** tp; */
+ uint32_t i;
+
+ tif->tif_foundfield = NULL;
+
+ if (tif->tif_fields && tif->tif_nfields > 0)
+ {
+ tif->tif_fields = (TIFFField **)_TIFFCheckRealloc(
+ tif, tif->tif_fields, (tif->tif_nfields + n), sizeof(TIFFField *),
+ reason);
+ }
+ else
+ {
+ tif->tif_fields =
+ (TIFFField **)_TIFFCheckMalloc(tif, n, sizeof(TIFFField *), reason);
+ }
+ if (!tif->tif_fields)
+ {
+ TIFFErrorExtR(tif, module, "Failed to allocate fields array");
+ return 0;
+ }
+
+ /* tp = tif->tif_fields + tif->tif_nfields; */
+ for (i = 0; i < n; i++)
+ {
+ const TIFFField *fip = TIFFFindField(tif, info[i].field_tag, TIFF_ANY);
+
+ /* only add definitions that aren't already present */
+ if (!fip)
+ {
+ tif->tif_fields[tif->tif_nfields] = (TIFFField *)(info + i);
+ tif->tif_nfields++;
+ }
+ }
+
+ /* Sort the field info by tag number */
+ qsort(tif->tif_fields, tif->tif_nfields, sizeof(TIFFField *), tagCompare);
+
+ return n;
}
-void
-_TIFFPrintFieldInfo(TIFF* tif, FILE* fd)
+void _TIFFPrintFieldInfo(TIFF *tif, FILE *fd)
{
- uint32 i;
-
- fprintf(fd, "%s: \n", tif->tif_name);
- for (i = 0; i < tif->tif_nfields; i++) {
- const TIFFField* fip = tif->tif_fields[i];
- fprintf(fd, "field[%2d] %5lu, %2d, %2d, %d, %2d, %5s, %5s, %s\n"
- , (int)i
- , (unsigned long) fip->field_tag
- , fip->field_readcount, fip->field_writecount
- , fip->field_type
- , fip->field_bit
- , fip->field_oktochange ? "TRUE" : "FALSE"
- , fip->field_passcount ? "TRUE" : "FALSE"
- , fip->field_name
- );
- }
+ uint32_t i;
+
+ fprintf(fd, "%s: \n", tif->tif_name);
+ for (i = 0; i < tif->tif_nfields; i++)
+ {
+ const TIFFField *fip = tif->tif_fields[i];
+ fprintf(fd, "field[%2d] %5lu, %2d, %2d, %d, %2d, %5s, %5s, %s\n",
+ (int)i, (unsigned long)fip->field_tag, fip->field_readcount,
+ fip->field_writecount, fip->field_type, fip->field_bit,
+ fip->field_oktochange ? "TRUE" : "FALSE",
+ fip->field_passcount ? "TRUE" : "FALSE", fip->field_name);
+ }
}
/*
- * Return size of TIFFDataType in bytes
+ * Return size of TIFFDataType within TIFF-file in bytes
*/
-int
-TIFFDataWidth(TIFFDataType type)
+int TIFFDataWidth(TIFFDataType type)
{
- switch(type)
- {
- case 0: /* nothing */
- case TIFF_BYTE:
- case TIFF_ASCII:
- case TIFF_SBYTE:
- case TIFF_UNDEFINED:
- return 1;
- case TIFF_SHORT:
- case TIFF_SSHORT:
- return 2;
- case TIFF_LONG:
- case TIFF_SLONG:
- case TIFF_FLOAT:
- case TIFF_IFD:
- return 4;
- case TIFF_RATIONAL:
- case TIFF_SRATIONAL:
- case TIFF_DOUBLE:
- case TIFF_LONG8:
- case TIFF_SLONG8:
- case TIFF_IFD8:
- return 8;
- default:
- return 0; /* will return 0 for unknown types */
- }
+ switch (type)
+ {
+ case 0: /* nothing */
+ case TIFF_BYTE:
+ case TIFF_ASCII:
+ case TIFF_SBYTE:
+ case TIFF_UNDEFINED:
+ return 1;
+ case TIFF_SHORT:
+ case TIFF_SSHORT:
+ return 2;
+ case TIFF_LONG:
+ case TIFF_SLONG:
+ case TIFF_FLOAT:
+ case TIFF_IFD:
+ return 4;
+ case TIFF_RATIONAL:
+ case TIFF_SRATIONAL:
+ case TIFF_DOUBLE:
+ case TIFF_LONG8:
+ case TIFF_SLONG8:
+ case TIFF_IFD8:
+ return 8;
+ default:
+ return 0; /* will return 0 for unknown types */
+ }
}
/*
- * Return size of TIFFDataType in bytes.
- *
- * XXX: We need a separate function to determine the space needed
- * to store the value. For TIFF_RATIONAL values TIFFDataWidth() returns 8,
- * but we use 4-byte float to represent rationals.
+ * Return internal storage size of TIFFSetGetFieldType in bytes.
+ * TIFFSetField() and TIFFGetField() have to provide the parameter accordingly.
+ * Replaces internal functions _TIFFDataSize() and _TIFFSetGetFieldSize()
+ * with now extern available function TIFFFieldSetGetSize().
*/
-int
-_TIFFDataSize(TIFFDataType type)
+int TIFFFieldSetGetSize(const TIFFField *fip)
{
- switch (type)
- {
- case TIFF_BYTE:
- case TIFF_SBYTE:
- case TIFF_ASCII:
- case TIFF_UNDEFINED:
- return 1;
- case TIFF_SHORT:
- case TIFF_SSHORT:
- return 2;
- case TIFF_LONG:
- case TIFF_SLONG:
- case TIFF_FLOAT:
- case TIFF_IFD:
- case TIFF_RATIONAL:
- case TIFF_SRATIONAL:
- return 4;
- case TIFF_DOUBLE:
- case TIFF_LONG8:
- case TIFF_SLONG8:
- case TIFF_IFD8:
- return 8;
- default:
- return 0;
- }
-}
+ /*
+ * TIFFSetField() and TIFFGetField() must provide the parameter accordingly
+ * to the definition of "set_field_type" of the tag definition in
+ * dir_info.c. This function returns the data size for that purpose.
+ *
+ * Furthermore, this data size is also used for the internal storage,
+ * even for TIFF_RATIONAL values for FIELD_CUSTOM, which are stored
+ * internally as 4-byte float, but some of them should be stored internally
+ * as 8-byte double, depending on the "set_field_type" _FLOAT_ or _DOUBLE_.
+ */
+ if (fip == NULL)
+ return 0;
+
+ switch (fip->set_field_type)
+ {
+ case TIFF_SETGET_UNDEFINED:
+ case TIFF_SETGET_ASCII:
+ case TIFF_SETGET_C0_ASCII:
+ case TIFF_SETGET_C16_ASCII:
+ case TIFF_SETGET_C32_ASCII:
+ case TIFF_SETGET_OTHER:
+ return 1;
+ case TIFF_SETGET_UINT8:
+ case TIFF_SETGET_SINT8:
+ case TIFF_SETGET_C0_UINT8:
+ case TIFF_SETGET_C0_SINT8:
+ case TIFF_SETGET_C16_UINT8:
+ case TIFF_SETGET_C16_SINT8:
+ case TIFF_SETGET_C32_UINT8:
+ case TIFF_SETGET_C32_SINT8:
+ return 1;
+ case TIFF_SETGET_UINT16:
+ case TIFF_SETGET_SINT16:
+ case TIFF_SETGET_C0_UINT16:
+ case TIFF_SETGET_C0_SINT16:
+ case TIFF_SETGET_C16_UINT16:
+ case TIFF_SETGET_C16_SINT16:
+ case TIFF_SETGET_C32_UINT16:
+ case TIFF_SETGET_C32_SINT16:
+ return 2;
+ case TIFF_SETGET_INT:
+ case TIFF_SETGET_UINT32:
+ case TIFF_SETGET_SINT32:
+ case TIFF_SETGET_FLOAT:
+ case TIFF_SETGET_UINT16_PAIR:
+ case TIFF_SETGET_C0_UINT32:
+ case TIFF_SETGET_C0_SINT32:
+ case TIFF_SETGET_C0_FLOAT:
+ case TIFF_SETGET_C16_UINT32:
+ case TIFF_SETGET_C16_SINT32:
+ case TIFF_SETGET_C16_FLOAT:
+ case TIFF_SETGET_C32_UINT32:
+ case TIFF_SETGET_C32_SINT32:
+ case TIFF_SETGET_C32_FLOAT:
+ return 4;
+ case TIFF_SETGET_UINT64:
+ case TIFF_SETGET_SINT64:
+ case TIFF_SETGET_DOUBLE:
+ case TIFF_SETGET_IFD8:
+ case TIFF_SETGET_C0_UINT64:
+ case TIFF_SETGET_C0_SINT64:
+ case TIFF_SETGET_C0_DOUBLE:
+ case TIFF_SETGET_C0_IFD8:
+ case TIFF_SETGET_C16_UINT64:
+ case TIFF_SETGET_C16_SINT64:
+ case TIFF_SETGET_C16_DOUBLE:
+ case TIFF_SETGET_C16_IFD8:
+ case TIFF_SETGET_C32_UINT64:
+ case TIFF_SETGET_C32_SINT64:
+ case TIFF_SETGET_C32_DOUBLE:
+ case TIFF_SETGET_C32_IFD8:
+ return 8;
+ default:
+ return 0;
+ }
+} /*-- TIFFFieldSetGetSize() --- */
-const TIFFField*
-TIFFFindField(TIFF* tif, uint32 tag, TIFFDataType dt)
+/*
+ * Return size of count parameter of TIFFSetField() and TIFFGetField()
+ * and also if it is required: 0=none, 2=uint16_t, 4=uint32_t
+ */
+int TIFFFieldSetGetCountSize(const TIFFField *fip)
+{
+ if (fip == NULL)
+ return 0;
+
+ switch (fip->set_field_type)
+ {
+ case TIFF_SETGET_C16_ASCII:
+ case TIFF_SETGET_C16_UINT8:
+ case TIFF_SETGET_C16_SINT8:
+ case TIFF_SETGET_C16_UINT16:
+ case TIFF_SETGET_C16_SINT16:
+ case TIFF_SETGET_C16_UINT32:
+ case TIFF_SETGET_C16_SINT32:
+ case TIFF_SETGET_C16_FLOAT:
+ case TIFF_SETGET_C16_UINT64:
+ case TIFF_SETGET_C16_SINT64:
+ case TIFF_SETGET_C16_DOUBLE:
+ case TIFF_SETGET_C16_IFD8:
+ return 2;
+ case TIFF_SETGET_C32_ASCII:
+ case TIFF_SETGET_C32_UINT8:
+ case TIFF_SETGET_C32_SINT8:
+ case TIFF_SETGET_C32_UINT16:
+ case TIFF_SETGET_C32_SINT16:
+ case TIFF_SETGET_C32_UINT32:
+ case TIFF_SETGET_C32_SINT32:
+ case TIFF_SETGET_C32_FLOAT:
+ case TIFF_SETGET_C32_UINT64:
+ case TIFF_SETGET_C32_SINT64:
+ case TIFF_SETGET_C32_DOUBLE:
+ case TIFF_SETGET_C32_IFD8:
+ return 4;
+ default:
+ return 0;
+ }
+} /*-- TIFFFieldSetGetCountSize() --- */
+
+const TIFFField *TIFFFindField(TIFF *tif, uint32_t tag, TIFFDataType dt)
{
- TIFFField key = {0, 0, 0, TIFF_NOTYPE, 0, 0, 0, 0, 0, 0, NULL, NULL};
- TIFFField* pkey = &key;
- const TIFFField **ret;
- if (tif->tif_foundfield && tif->tif_foundfield->field_tag == tag &&
- (dt == TIFF_ANY || dt == tif->tif_foundfield->field_type))
- return tif->tif_foundfield;
-
- /* If we are invoked with no field information, then just return. */
- if (!tif->tif_fields)
- return NULL;
-
- /* NB: use sorted search (e.g. binary search) */
-
- key.field_tag = tag;
- key.field_type = dt;
-
- ret = (const TIFFField **) bsearch(&pkey, tif->tif_fields,
- tif->tif_nfields,
- sizeof(TIFFField *), tagCompare);
- return tif->tif_foundfield = (ret ? *ret : NULL);
+ TIFFField key = {0, 0, 0, TIFF_NOTYPE, 0, 0, 0, 0, 0, 0, NULL, NULL};
+ TIFFField *pkey = &key;
+ const TIFFField **ret;
+ if (tif->tif_foundfield && tif->tif_foundfield->field_tag == tag &&
+ (dt == TIFF_ANY || dt == tif->tif_foundfield->field_type))
+ return tif->tif_foundfield;
+
+ /* If we are invoked with no field information, then just return. */
+ if (!tif->tif_fields)
+ return NULL;
+
+ /* NB: use sorted search (e.g. binary search) */
+
+ key.field_tag = tag;
+ key.field_type = dt;
+
+ ret = (const TIFFField **)bsearch(&pkey, tif->tif_fields, tif->tif_nfields,
+ sizeof(TIFFField *), tagCompare);
+ return tif->tif_foundfield = (ret ? *ret : NULL);
}
-static const TIFFField*
-_TIFFFindFieldByName(TIFF* tif, const char *field_name, TIFFDataType dt)
+static const TIFFField *_TIFFFindFieldByName(TIFF *tif, const char *field_name,
+ TIFFDataType dt)
{
- TIFFField key = {0, 0, 0, TIFF_NOTYPE, 0, 0, 0, 0, 0, 0, NULL, NULL};
- TIFFField* pkey = &key;
- const TIFFField **ret;
- if (tif->tif_foundfield
- && streq(tif->tif_foundfield->field_name, field_name)
- && (dt == TIFF_ANY || dt == tif->tif_foundfield->field_type))
- return (tif->tif_foundfield);
+ TIFFField key = {0, 0, 0, TIFF_NOTYPE, 0, 0, 0, 0, 0, 0, NULL, NULL};
+ TIFFField *pkey = &key;
+ const TIFFField **ret;
+ if (tif->tif_foundfield &&
+ streq(tif->tif_foundfield->field_name, field_name) &&
+ (dt == TIFF_ANY || dt == tif->tif_foundfield->field_type))
+ return (tif->tif_foundfield);
- /* If we are invoked with no field information, then just return. */
- if (!tif->tif_fields)
- return NULL;
+ /* If we are invoked with no field information, then just return. */
+ if (!tif->tif_fields)
+ return NULL;
- /* NB: use linear search since list is sorted by key#, not name */
+ /* NB: use linear search since list is sorted by key#, not name */
- key.field_name = (char *)field_name;
- key.field_type = dt;
+ key.field_name = (char *)field_name;
+ key.field_type = dt;
- ret = (const TIFFField **)
- td_lfind(&pkey, tif->tif_fields, &tif->tif_nfields,
- sizeof(TIFFField *), tagNameCompare);
+ ret =
+ (const TIFFField **)td_lfind(&pkey, tif->tif_fields, &tif->tif_nfields,
+ sizeof(TIFFField *), tagNameCompare);
- return tif->tif_foundfield = (ret ? *ret : NULL);
+ return tif->tif_foundfield = (ret ? *ret : NULL);
}
-const TIFFField*
-TIFFFieldWithTag(TIFF* tif, uint32 tag)
+const TIFFField *TIFFFieldWithTag(TIFF *tif, uint32_t tag)
{
- const TIFFField* fip = TIFFFindField(tif, tag, TIFF_ANY);
- if (!fip) {
- TIFFErrorExt(tif->tif_clientdata, "TIFFFieldWithTag",
- "Internal error, unknown tag 0x%x",
- (unsigned int) tag);
- }
- return (fip);
+ const TIFFField *fip = TIFFFindField(tif, tag, TIFF_ANY);
+ if (!fip)
+ {
+ TIFFErrorExtR(tif, "TIFFFieldWithTag",
+ "Internal error, unknown tag 0x%x", (unsigned int)tag);
+ }
+ return (fip);
}
-const TIFFField*
-TIFFFieldWithName(TIFF* tif, const char *field_name)
+const TIFFField *TIFFFieldWithName(TIFF *tif, const char *field_name)
{
- const TIFFField* fip =
- _TIFFFindFieldByName(tif, field_name, TIFF_ANY);
- if (!fip) {
- TIFFErrorExt(tif->tif_clientdata, "TIFFFieldWithName",
- "Internal error, unknown tag %s", field_name);
- }
- return (fip);
+ const TIFFField *fip = _TIFFFindFieldByName(tif, field_name, TIFF_ANY);
+ if (!fip)
+ {
+ TIFFErrorExtR(tif, "TIFFFieldWithName",
+ "Internal error, unknown tag %s", field_name);
+ }
+ return (fip);
}
-uint32
-TIFFFieldTag(const TIFFField* fip)
-{
- return fip->field_tag;
-}
+uint32_t TIFFFieldTag(const TIFFField *fip) { return fip->field_tag; }
-const char *
-TIFFFieldName(const TIFFField* fip)
-{
- return fip->field_name;
-}
+const char *TIFFFieldName(const TIFFField *fip) { return fip->field_name; }
-TIFFDataType
-TIFFFieldDataType(const TIFFField* fip)
-{
- return fip->field_type;
-}
+TIFFDataType TIFFFieldDataType(const TIFFField *fip) { return fip->field_type; }
-int
-TIFFFieldPassCount(const TIFFField* fip)
-{
- return fip->field_passcount;
-}
+int TIFFFieldPassCount(const TIFFField *fip) { return fip->field_passcount; }
-int
-TIFFFieldReadCount(const TIFFField* fip)
-{
- return fip->field_readcount;
-}
+int TIFFFieldReadCount(const TIFFField *fip) { return fip->field_readcount; }
-int
-TIFFFieldWriteCount(const TIFFField* fip)
-{
- return fip->field_writecount;
-}
+int TIFFFieldWriteCount(const TIFFField *fip) { return fip->field_writecount; }
-const TIFFField*
-_TIFFFindOrRegisterField(TIFF *tif, uint32 tag, TIFFDataType dt)
+int TIFFFieldIsAnonymous(const TIFFField *fip) { return fip->field_anonymous; }
+
+const TIFFField *_TIFFFindOrRegisterField(TIFF *tif, uint32_t tag,
+ TIFFDataType dt)
{
- const TIFFField *fld;
+ const TIFFField *fld;
- fld = TIFFFindField(tif, tag, dt);
- if (fld == NULL) {
- fld = _TIFFCreateAnonField(tif, tag, dt);
- if (!_TIFFMergeFields(tif, fld, 1))
- return NULL;
- }
+ fld = TIFFFindField(tif, tag, dt);
+ if (fld == NULL)
+ {
+ fld = _TIFFCreateAnonField(tif, tag, dt);
+ if (!_TIFFMergeFields(tif, fld, 1))
+ return NULL;
+ }
- return fld;
+ return fld;
}
-TIFFField*
-_TIFFCreateAnonField(TIFF *tif, uint32 tag, TIFFDataType field_type)
+TIFFField *_TIFFCreateAnonField(TIFF *tif, uint32_t tag,
+ TIFFDataType field_type)
{
- TIFFField *fld;
- (void) tif;
-
- fld = (TIFFField *) _TIFFmalloc(sizeof (TIFFField));
- if (fld == NULL)
- return NULL;
- _TIFFmemset(fld, 0, sizeof(TIFFField));
-
- fld->field_tag = tag;
- fld->field_readcount = TIFF_VARIABLE2;
- fld->field_writecount = TIFF_VARIABLE2;
- fld->field_type = field_type;
- fld->reserved = 0;
- switch (field_type)
- {
- case TIFF_BYTE:
- case TIFF_UNDEFINED:
- fld->set_field_type = TIFF_SETGET_C32_UINT8;
- fld->get_field_type = TIFF_SETGET_C32_UINT8;
- break;
- case TIFF_ASCII:
- fld->set_field_type = TIFF_SETGET_C32_ASCII;
- fld->get_field_type = TIFF_SETGET_C32_ASCII;
- break;
- case TIFF_SHORT:
- fld->set_field_type = TIFF_SETGET_C32_UINT16;
- fld->get_field_type = TIFF_SETGET_C32_UINT16;
- break;
- case TIFF_LONG:
- fld->set_field_type = TIFF_SETGET_C32_UINT32;
- fld->get_field_type = TIFF_SETGET_C32_UINT32;
- break;
- case TIFF_RATIONAL:
- case TIFF_SRATIONAL:
- case TIFF_FLOAT:
- fld->set_field_type = TIFF_SETGET_C32_FLOAT;
- fld->get_field_type = TIFF_SETGET_C32_FLOAT;
- break;
- case TIFF_SBYTE:
- fld->set_field_type = TIFF_SETGET_C32_SINT8;
- fld->get_field_type = TIFF_SETGET_C32_SINT8;
- break;
- case TIFF_SSHORT:
- fld->set_field_type = TIFF_SETGET_C32_SINT16;
- fld->get_field_type = TIFF_SETGET_C32_SINT16;
- break;
- case TIFF_SLONG:
- fld->set_field_type = TIFF_SETGET_C32_SINT32;
- fld->get_field_type = TIFF_SETGET_C32_SINT32;
- break;
- case TIFF_DOUBLE:
- fld->set_field_type = TIFF_SETGET_C32_DOUBLE;
- fld->get_field_type = TIFF_SETGET_C32_DOUBLE;
- break;
- case TIFF_IFD:
- case TIFF_IFD8:
- fld->set_field_type = TIFF_SETGET_C32_IFD8;
- fld->get_field_type = TIFF_SETGET_C32_IFD8;
- break;
- case TIFF_LONG8:
- fld->set_field_type = TIFF_SETGET_C32_UINT64;
- fld->get_field_type = TIFF_SETGET_C32_UINT64;
- break;
- case TIFF_SLONG8:
- fld->set_field_type = TIFF_SETGET_C32_SINT64;
- fld->get_field_type = TIFF_SETGET_C32_SINT64;
- break;
- default:
- fld->set_field_type = TIFF_SETGET_UNDEFINED;
- fld->get_field_type = TIFF_SETGET_UNDEFINED;
- break;
- }
- fld->field_bit = FIELD_CUSTOM;
- fld->field_oktochange = TRUE;
- fld->field_passcount = TRUE;
- fld->field_name = (char *) _TIFFmalloc(32);
- if (fld->field_name == NULL) {
- _TIFFfree(fld);
- return NULL;
- }
- fld->field_subfields = NULL;
-
- /*
- * note that this name is a special sign to TIFFClose() and
- * _TIFFSetupFields() to free the field
- */
- (void) snprintf(fld->field_name, 32, "Tag %d", (int) tag);
-
- return fld;
+ TIFFField *fld;
+ (void)tif;
+
+ fld = (TIFFField *)_TIFFmallocExt(tif, sizeof(TIFFField));
+ if (fld == NULL)
+ return NULL;
+ _TIFFmemset(fld, 0, sizeof(TIFFField));
+
+ fld->field_tag = tag;
+ fld->field_readcount = TIFF_VARIABLE2;
+ fld->field_writecount = TIFF_VARIABLE2;
+ fld->field_type = field_type;
+ fld->field_anonymous =
+ 1; /* indicate that this is an anonymous / unknown tag */
+ switch (field_type)
+ {
+ case TIFF_BYTE:
+ case TIFF_UNDEFINED:
+ fld->set_field_type = TIFF_SETGET_C32_UINT8;
+ fld->get_field_type = TIFF_SETGET_C32_UINT8;
+ break;
+ case TIFF_ASCII:
+ fld->set_field_type = TIFF_SETGET_C32_ASCII;
+ fld->get_field_type = TIFF_SETGET_C32_ASCII;
+ break;
+ case TIFF_SHORT:
+ fld->set_field_type = TIFF_SETGET_C32_UINT16;
+ fld->get_field_type = TIFF_SETGET_C32_UINT16;
+ break;
+ case TIFF_LONG:
+ fld->set_field_type = TIFF_SETGET_C32_UINT32;
+ fld->get_field_type = TIFF_SETGET_C32_UINT32;
+ break;
+ case TIFF_RATIONAL:
+ case TIFF_SRATIONAL:
+ case TIFF_FLOAT:
+ fld->set_field_type = TIFF_SETGET_C32_FLOAT;
+ fld->get_field_type = TIFF_SETGET_C32_FLOAT;
+ break;
+ case TIFF_SBYTE:
+ fld->set_field_type = TIFF_SETGET_C32_SINT8;
+ fld->get_field_type = TIFF_SETGET_C32_SINT8;
+ break;
+ case TIFF_SSHORT:
+ fld->set_field_type = TIFF_SETGET_C32_SINT16;
+ fld->get_field_type = TIFF_SETGET_C32_SINT16;
+ break;
+ case TIFF_SLONG:
+ fld->set_field_type = TIFF_SETGET_C32_SINT32;
+ fld->get_field_type = TIFF_SETGET_C32_SINT32;
+ break;
+ case TIFF_DOUBLE:
+ fld->set_field_type = TIFF_SETGET_C32_DOUBLE;
+ fld->get_field_type = TIFF_SETGET_C32_DOUBLE;
+ break;
+ case TIFF_IFD:
+ case TIFF_IFD8:
+ fld->set_field_type = TIFF_SETGET_C32_IFD8;
+ fld->get_field_type = TIFF_SETGET_C32_IFD8;
+ break;
+ case TIFF_LONG8:
+ fld->set_field_type = TIFF_SETGET_C32_UINT64;
+ fld->get_field_type = TIFF_SETGET_C32_UINT64;
+ break;
+ case TIFF_SLONG8:
+ fld->set_field_type = TIFF_SETGET_C32_SINT64;
+ fld->get_field_type = TIFF_SETGET_C32_SINT64;
+ break;
+ default:
+ fld->set_field_type = TIFF_SETGET_UNDEFINED;
+ fld->get_field_type = TIFF_SETGET_UNDEFINED;
+ break;
+ }
+ fld->field_bit = FIELD_CUSTOM;
+ fld->field_oktochange = TRUE;
+ fld->field_passcount = TRUE;
+ fld->field_name = (char *)_TIFFmallocExt(tif, 32);
+ if (fld->field_name == NULL)
+ {
+ _TIFFfreeExt(tif, fld);
+ return NULL;
+ }
+ fld->field_subfields = NULL;
+
+ /*
+ * note that this name is a special sign to TIFFClose() and
+ * _TIFFSetupFields() to free the field
+ * Update:
+ * This special sign is replaced by fld->field_anonymous flag.
+ */
+ (void)snprintf(fld->field_name, 32, "Tag %d", (int)tag);
+
+ return fld;
}
/****************************************************************************
@@ -731,351 +1192,353 @@ _TIFFCreateAnonField(TIFF *tif, uint32 tag, TIFFDataType field_type)
* libtiff versions.
****************************************************************************/
-static TIFFSetGetFieldType
-_TIFFSetGetType(TIFFDataType type, short count, unsigned char passcount)
+static TIFFSetGetFieldType _TIFFSetGetType(TIFFDataType type, short count,
+ unsigned char passcount)
{
- if (type == TIFF_ASCII && count == TIFF_VARIABLE && passcount == 0)
- return TIFF_SETGET_ASCII;
-
- else if (count == 1 && passcount == 0) {
- switch (type)
- {
- case TIFF_BYTE:
- case TIFF_UNDEFINED:
- return TIFF_SETGET_UINT8;
- case TIFF_ASCII:
- return TIFF_SETGET_ASCII;
- case TIFF_SHORT:
- return TIFF_SETGET_UINT16;
- case TIFF_LONG:
- return TIFF_SETGET_UINT32;
- case TIFF_RATIONAL:
- case TIFF_SRATIONAL:
- case TIFF_FLOAT:
- return TIFF_SETGET_FLOAT;
- case TIFF_SBYTE:
- return TIFF_SETGET_SINT8;
- case TIFF_SSHORT:
- return TIFF_SETGET_SINT16;
- case TIFF_SLONG:
- return TIFF_SETGET_SINT32;
- case TIFF_DOUBLE:
- return TIFF_SETGET_DOUBLE;
- case TIFF_IFD:
- case TIFF_IFD8:
- return TIFF_SETGET_IFD8;
- case TIFF_LONG8:
- return TIFF_SETGET_UINT64;
- case TIFF_SLONG8:
- return TIFF_SETGET_SINT64;
- default:
- return TIFF_SETGET_UNDEFINED;
- }
- }
-
- else if (count >= 1 && passcount == 0) {
- switch (type)
- {
- case TIFF_BYTE:
- case TIFF_UNDEFINED:
- return TIFF_SETGET_C0_UINT8;
- case TIFF_ASCII:
- return TIFF_SETGET_C0_ASCII;
- case TIFF_SHORT:
- return TIFF_SETGET_C0_UINT16;
- case TIFF_LONG:
- return TIFF_SETGET_C0_UINT32;
- case TIFF_RATIONAL:
- case TIFF_SRATIONAL:
- case TIFF_FLOAT:
- return TIFF_SETGET_C0_FLOAT;
- case TIFF_SBYTE:
- return TIFF_SETGET_C0_SINT8;
- case TIFF_SSHORT:
- return TIFF_SETGET_C0_SINT16;
- case TIFF_SLONG:
- return TIFF_SETGET_C0_SINT32;
- case TIFF_DOUBLE:
- return TIFF_SETGET_C0_DOUBLE;
- case TIFF_IFD:
- case TIFF_IFD8:
- return TIFF_SETGET_C0_IFD8;
- case TIFF_LONG8:
- return TIFF_SETGET_C0_UINT64;
- case TIFF_SLONG8:
- return TIFF_SETGET_C0_SINT64;
- default:
- return TIFF_SETGET_UNDEFINED;
- }
- }
-
- else if (count == TIFF_VARIABLE && passcount == 1) {
- switch (type)
- {
- case TIFF_BYTE:
- case TIFF_UNDEFINED:
- return TIFF_SETGET_C16_UINT8;
- case TIFF_ASCII:
- return TIFF_SETGET_C16_ASCII;
- case TIFF_SHORT:
- return TIFF_SETGET_C16_UINT16;
- case TIFF_LONG:
- return TIFF_SETGET_C16_UINT32;
- case TIFF_RATIONAL:
- case TIFF_SRATIONAL:
- case TIFF_FLOAT:
- return TIFF_SETGET_C16_FLOAT;
- case TIFF_SBYTE:
- return TIFF_SETGET_C16_SINT8;
- case TIFF_SSHORT:
- return TIFF_SETGET_C16_SINT16;
- case TIFF_SLONG:
- return TIFF_SETGET_C16_SINT32;
- case TIFF_DOUBLE:
- return TIFF_SETGET_C16_DOUBLE;
- case TIFF_IFD:
- case TIFF_IFD8:
- return TIFF_SETGET_C16_IFD8;
- case TIFF_LONG8:
- return TIFF_SETGET_C16_UINT64;
- case TIFF_SLONG8:
- return TIFF_SETGET_C16_SINT64;
- default:
- return TIFF_SETGET_UNDEFINED;
- }
- }
-
- else if (count == TIFF_VARIABLE2 && passcount == 1) {
- switch (type)
- {
- case TIFF_BYTE:
- case TIFF_UNDEFINED:
- return TIFF_SETGET_C32_UINT8;
- case TIFF_ASCII:
- return TIFF_SETGET_C32_ASCII;
- case TIFF_SHORT:
- return TIFF_SETGET_C32_UINT16;
- case TIFF_LONG:
- return TIFF_SETGET_C32_UINT32;
- case TIFF_RATIONAL:
- case TIFF_SRATIONAL:
- case TIFF_FLOAT:
- return TIFF_SETGET_C32_FLOAT;
- case TIFF_SBYTE:
- return TIFF_SETGET_C32_SINT8;
- case TIFF_SSHORT:
- return TIFF_SETGET_C32_SINT16;
- case TIFF_SLONG:
- return TIFF_SETGET_C32_SINT32;
- case TIFF_DOUBLE:
- return TIFF_SETGET_C32_DOUBLE;
- case TIFF_IFD:
- case TIFF_IFD8:
- return TIFF_SETGET_C32_IFD8;
- case TIFF_LONG8:
- return TIFF_SETGET_C32_UINT64;
- case TIFF_SLONG8:
- return TIFF_SETGET_C32_SINT64;
- default:
- return TIFF_SETGET_UNDEFINED;
- }
- }
-
- return TIFF_SETGET_UNDEFINED;
+ if (type == TIFF_ASCII && count == TIFF_VARIABLE && passcount == 0)
+ return TIFF_SETGET_ASCII;
+
+ else if (count == 1 && passcount == 0)
+ {
+ switch (type)
+ {
+ case TIFF_BYTE:
+ case TIFF_UNDEFINED:
+ return TIFF_SETGET_UINT8;
+ case TIFF_ASCII:
+ return TIFF_SETGET_ASCII;
+ case TIFF_SHORT:
+ return TIFF_SETGET_UINT16;
+ case TIFF_LONG:
+ return TIFF_SETGET_UINT32;
+ case TIFF_RATIONAL:
+ case TIFF_SRATIONAL:
+ case TIFF_FLOAT:
+ return TIFF_SETGET_FLOAT;
+ case TIFF_SBYTE:
+ return TIFF_SETGET_SINT8;
+ case TIFF_SSHORT:
+ return TIFF_SETGET_SINT16;
+ case TIFF_SLONG:
+ return TIFF_SETGET_SINT32;
+ case TIFF_DOUBLE:
+ return TIFF_SETGET_DOUBLE;
+ case TIFF_IFD:
+ case TIFF_IFD8:
+ return TIFF_SETGET_IFD8;
+ case TIFF_LONG8:
+ return TIFF_SETGET_UINT64;
+ case TIFF_SLONG8:
+ return TIFF_SETGET_SINT64;
+ default:
+ return TIFF_SETGET_UNDEFINED;
+ }
+ }
+
+ else if (count >= 1 && passcount == 0)
+ {
+ switch (type)
+ {
+ case TIFF_BYTE:
+ case TIFF_UNDEFINED:
+ return TIFF_SETGET_C0_UINT8;
+ case TIFF_ASCII:
+ return TIFF_SETGET_C0_ASCII;
+ case TIFF_SHORT:
+ return TIFF_SETGET_C0_UINT16;
+ case TIFF_LONG:
+ return TIFF_SETGET_C0_UINT32;
+ case TIFF_RATIONAL:
+ case TIFF_SRATIONAL:
+ case TIFF_FLOAT:
+ return TIFF_SETGET_C0_FLOAT;
+ case TIFF_SBYTE:
+ return TIFF_SETGET_C0_SINT8;
+ case TIFF_SSHORT:
+ return TIFF_SETGET_C0_SINT16;
+ case TIFF_SLONG:
+ return TIFF_SETGET_C0_SINT32;
+ case TIFF_DOUBLE:
+ return TIFF_SETGET_C0_DOUBLE;
+ case TIFF_IFD:
+ case TIFF_IFD8:
+ return TIFF_SETGET_C0_IFD8;
+ case TIFF_LONG8:
+ return TIFF_SETGET_C0_UINT64;
+ case TIFF_SLONG8:
+ return TIFF_SETGET_C0_SINT64;
+ default:
+ return TIFF_SETGET_UNDEFINED;
+ }
+ }
+
+ else if (count == TIFF_VARIABLE && passcount == 1)
+ {
+ switch (type)
+ {
+ case TIFF_BYTE:
+ case TIFF_UNDEFINED:
+ return TIFF_SETGET_C16_UINT8;
+ case TIFF_ASCII:
+ return TIFF_SETGET_C16_ASCII;
+ case TIFF_SHORT:
+ return TIFF_SETGET_C16_UINT16;
+ case TIFF_LONG:
+ return TIFF_SETGET_C16_UINT32;
+ case TIFF_RATIONAL:
+ case TIFF_SRATIONAL:
+ case TIFF_FLOAT:
+ return TIFF_SETGET_C16_FLOAT;
+ case TIFF_SBYTE:
+ return TIFF_SETGET_C16_SINT8;
+ case TIFF_SSHORT:
+ return TIFF_SETGET_C16_SINT16;
+ case TIFF_SLONG:
+ return TIFF_SETGET_C16_SINT32;
+ case TIFF_DOUBLE:
+ return TIFF_SETGET_C16_DOUBLE;
+ case TIFF_IFD:
+ case TIFF_IFD8:
+ return TIFF_SETGET_C16_IFD8;
+ case TIFF_LONG8:
+ return TIFF_SETGET_C16_UINT64;
+ case TIFF_SLONG8:
+ return TIFF_SETGET_C16_SINT64;
+ default:
+ return TIFF_SETGET_UNDEFINED;
+ }
+ }
+
+ else if (count == TIFF_VARIABLE2 && passcount == 1)
+ {
+ switch (type)
+ {
+ case TIFF_BYTE:
+ case TIFF_UNDEFINED:
+ return TIFF_SETGET_C32_UINT8;
+ case TIFF_ASCII:
+ return TIFF_SETGET_C32_ASCII;
+ case TIFF_SHORT:
+ return TIFF_SETGET_C32_UINT16;
+ case TIFF_LONG:
+ return TIFF_SETGET_C32_UINT32;
+ case TIFF_RATIONAL:
+ case TIFF_SRATIONAL:
+ case TIFF_FLOAT:
+ return TIFF_SETGET_C32_FLOAT;
+ case TIFF_SBYTE:
+ return TIFF_SETGET_C32_SINT8;
+ case TIFF_SSHORT:
+ return TIFF_SETGET_C32_SINT16;
+ case TIFF_SLONG:
+ return TIFF_SETGET_C32_SINT32;
+ case TIFF_DOUBLE:
+ return TIFF_SETGET_C32_DOUBLE;
+ case TIFF_IFD:
+ case TIFF_IFD8:
+ return TIFF_SETGET_C32_IFD8;
+ case TIFF_LONG8:
+ return TIFF_SETGET_C32_UINT64;
+ case TIFF_SLONG8:
+ return TIFF_SETGET_C32_SINT64;
+ default:
+ return TIFF_SETGET_UNDEFINED;
+ }
+ }
+
+ return TIFF_SETGET_UNDEFINED;
}
-int
-TIFFMergeFieldInfo(TIFF* tif, const TIFFFieldInfo info[], uint32 n)
+int TIFFMergeFieldInfo(TIFF *tif, const TIFFFieldInfo info[], uint32_t n)
{
- static const char module[] = "TIFFMergeFieldInfo";
- static const char reason[] = "for fields array";
- TIFFField *tp;
- size_t nfields;
- uint32 i;
-
- if (tif->tif_nfieldscompat > 0) {
- tif->tif_fieldscompat = (TIFFFieldArray *)
- _TIFFCheckRealloc(tif, tif->tif_fieldscompat,
- tif->tif_nfieldscompat + 1,
- sizeof(TIFFFieldArray), reason);
- } else {
- tif->tif_fieldscompat = (TIFFFieldArray *)
- _TIFFCheckMalloc(tif, 1, sizeof(TIFFFieldArray),
- reason);
- }
- if (!tif->tif_fieldscompat) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Failed to allocate fields array");
- return -1;
- }
- nfields = tif->tif_nfieldscompat++;
-
- tif->tif_fieldscompat[nfields].type = tfiatOther;
- tif->tif_fieldscompat[nfields].allocated_size = n;
- tif->tif_fieldscompat[nfields].count = n;
- tif->tif_fieldscompat[nfields].fields =
- (TIFFField *)_TIFFCheckMalloc(tif, n, sizeof(TIFFField),
- reason);
- if (!tif->tif_fieldscompat[nfields].fields) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Failed to allocate fields array");
- return -1;
- }
-
- tp = tif->tif_fieldscompat[nfields].fields;
- for (i = 0; i < n; i++) {
- tp->field_tag = info[i].field_tag;
- tp->field_readcount = info[i].field_readcount;
- tp->field_writecount = info[i].field_writecount;
- tp->field_type = info[i].field_type;
- tp->reserved = 0;
- tp->set_field_type =
- _TIFFSetGetType(info[i].field_type,
- info[i].field_readcount,
- info[i].field_passcount);
- tp->get_field_type =
- _TIFFSetGetType(info[i].field_type,
- info[i].field_readcount,
- info[i].field_passcount);
- tp->field_bit = info[i].field_bit;
- tp->field_oktochange = info[i].field_oktochange;
- tp->field_passcount = info[i].field_passcount;
- tp->field_name = info[i].field_name;
- tp->field_subfields = NULL;
- tp++;
- }
-
- if (!_TIFFMergeFields(tif, tif->tif_fieldscompat[nfields].fields, n)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Setting up field info failed");
- return -1;
- }
-
- return 0;
+ static const char module[] = "TIFFMergeFieldInfo";
+ static const char reason[] = "for fields array";
+ TIFFField *tp;
+ size_t nfields;
+ uint32_t i;
+
+ if (tif->tif_nfieldscompat > 0)
+ {
+ tif->tif_fieldscompat = (TIFFFieldArray *)_TIFFCheckRealloc(
+ tif, tif->tif_fieldscompat, tif->tif_nfieldscompat + 1,
+ sizeof(TIFFFieldArray), reason);
+ }
+ else
+ {
+ tif->tif_fieldscompat = (TIFFFieldArray *)_TIFFCheckMalloc(
+ tif, 1, sizeof(TIFFFieldArray), reason);
+ }
+ if (!tif->tif_fieldscompat)
+ {
+ TIFFErrorExtR(tif, module, "Failed to allocate fields array");
+ return -1;
+ }
+ nfields = tif->tif_nfieldscompat++;
+
+ tif->tif_fieldscompat[nfields].type = tfiatOther;
+ tif->tif_fieldscompat[nfields].allocated_size = n;
+ tif->tif_fieldscompat[nfields].count = n;
+ tif->tif_fieldscompat[nfields].fields =
+ (TIFFField *)_TIFFCheckMalloc(tif, n, sizeof(TIFFField), reason);
+ if (!tif->tif_fieldscompat[nfields].fields)
+ {
+ TIFFErrorExtR(tif, module, "Failed to allocate fields array");
+ return -1;
+ }
+
+ tp = tif->tif_fieldscompat[nfields].fields;
+ for (i = 0; i < n; i++)
+ {
+ tp->field_tag = info[i].field_tag;
+ tp->field_readcount = info[i].field_readcount;
+ tp->field_writecount = info[i].field_writecount;
+ tp->field_type = info[i].field_type;
+ tp->field_anonymous = 0;
+ tp->set_field_type =
+ _TIFFSetGetType(info[i].field_type, info[i].field_readcount,
+ info[i].field_passcount);
+ tp->get_field_type =
+ _TIFFSetGetType(info[i].field_type, info[i].field_readcount,
+ info[i].field_passcount);
+ tp->field_bit = info[i].field_bit;
+ tp->field_oktochange = info[i].field_oktochange;
+ tp->field_passcount = info[i].field_passcount;
+ if (info[i].field_name == NULL)
+ {
+ TIFFErrorExtR(tif, module,
+ "Field_name of %d.th allocation tag %d is NULL", i,
+ info[i].field_tag);
+ return -1;
+ }
+ tp->field_name = info[i].field_name;
+ tp->field_subfields = NULL;
+ tp++;
+ }
+
+ if (!_TIFFMergeFields(tif, tif->tif_fieldscompat[nfields].fields, n))
+ {
+ TIFFErrorExtR(tif, module, "Setting up field info failed");
+ return -1;
+ }
+
+ return 0;
}
-int
-_TIFFCheckFieldIsValidForCodec(TIFF *tif, ttag_t tag)
+int _TIFFCheckFieldIsValidForCodec(TIFF *tif, ttag_t tag)
{
- /* Filter out non-codec specific tags */
- switch (tag) {
- /* Shared tags */
- case TIFFTAG_PREDICTOR:
- /* JPEG tags */
- case TIFFTAG_JPEGTABLES:
- /* OJPEG tags */
- case TIFFTAG_JPEGIFOFFSET:
- case TIFFTAG_JPEGIFBYTECOUNT:
- case TIFFTAG_JPEGQTABLES:
- case TIFFTAG_JPEGDCTABLES:
- case TIFFTAG_JPEGACTABLES:
- case TIFFTAG_JPEGPROC:
- case TIFFTAG_JPEGRESTARTINTERVAL:
- /* CCITT* */
- case TIFFTAG_BADFAXLINES:
- case TIFFTAG_CLEANFAXDATA:
- case TIFFTAG_CONSECUTIVEBADFAXLINES:
- case TIFFTAG_GROUP3OPTIONS:
- case TIFFTAG_GROUP4OPTIONS:
- /* LERC */
- case TIFFTAG_LERC_PARAMETERS:
- break;
- default:
- return 1;
- }
- /* Check if codec specific tags are allowed for the current
- * compression scheme (codec) */
- switch (tif->tif_dir.td_compression) {
- case COMPRESSION_LZW:
- if (tag == TIFFTAG_PREDICTOR)
- return 1;
- break;
- case COMPRESSION_PACKBITS:
- /* No codec-specific tags */
- break;
- case COMPRESSION_THUNDERSCAN:
- /* No codec-specific tags */
- break;
- case COMPRESSION_NEXT:
- /* No codec-specific tags */
- break;
- case COMPRESSION_JPEG:
- if (tag == TIFFTAG_JPEGTABLES)
- return 1;
- break;
- case COMPRESSION_OJPEG:
- switch (tag) {
- case TIFFTAG_JPEGIFOFFSET:
- case TIFFTAG_JPEGIFBYTECOUNT:
- case TIFFTAG_JPEGQTABLES:
- case TIFFTAG_JPEGDCTABLES:
- case TIFFTAG_JPEGACTABLES:
- case TIFFTAG_JPEGPROC:
- case TIFFTAG_JPEGRESTARTINTERVAL:
- return 1;
- }
- break;
- case COMPRESSION_CCITTRLE:
- case COMPRESSION_CCITTRLEW:
- case COMPRESSION_CCITTFAX3:
- case COMPRESSION_CCITTFAX4:
- switch (tag) {
- case TIFFTAG_BADFAXLINES:
- case TIFFTAG_CLEANFAXDATA:
- case TIFFTAG_CONSECUTIVEBADFAXLINES:
- return 1;
- case TIFFTAG_GROUP3OPTIONS:
- if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX3)
- return 1;
- break;
- case TIFFTAG_GROUP4OPTIONS:
- if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX4)
- return 1;
- break;
- }
- break;
- case COMPRESSION_JBIG:
- /* No codec-specific tags */
- break;
- case COMPRESSION_DEFLATE:
- case COMPRESSION_ADOBE_DEFLATE:
- if (tag == TIFFTAG_PREDICTOR)
- return 1;
- break;
- case COMPRESSION_PIXARLOG:
- if (tag == TIFFTAG_PREDICTOR)
- return 1;
- break;
- case COMPRESSION_SGILOG:
- case COMPRESSION_SGILOG24:
- /* No codec-specific tags */
- break;
- case COMPRESSION_LZMA:
- if (tag == TIFFTAG_PREDICTOR)
- return 1;
- break;
- case COMPRESSION_ZSTD:
- if (tag == TIFFTAG_PREDICTOR)
- return 1;
- break;
- case COMPRESSION_LERC:
- if (tag == TIFFTAG_LERC_PARAMETERS)
- return 1;
- break;
- case COMPRESSION_WEBP:
- if (tag == TIFFTAG_PREDICTOR)
- return 1;
- break;
- }
- return 0;
+ /* Filter out non-codec specific tags */
+ switch (tag)
+ {
+ /* Shared tags */
+ case TIFFTAG_PREDICTOR:
+ /* JPEG tags */
+ case TIFFTAG_JPEGTABLES:
+ /* OJPEG tags */
+ case TIFFTAG_JPEGIFOFFSET:
+ case TIFFTAG_JPEGIFBYTECOUNT:
+ case TIFFTAG_JPEGQTABLES:
+ case TIFFTAG_JPEGDCTABLES:
+ case TIFFTAG_JPEGACTABLES:
+ case TIFFTAG_JPEGPROC:
+ case TIFFTAG_JPEGRESTARTINTERVAL:
+ /* CCITT* */
+ case TIFFTAG_BADFAXLINES:
+ case TIFFTAG_CLEANFAXDATA:
+ case TIFFTAG_CONSECUTIVEBADFAXLINES:
+ case TIFFTAG_GROUP3OPTIONS:
+ case TIFFTAG_GROUP4OPTIONS:
+ /* LERC */
+ case TIFFTAG_LERC_PARAMETERS:
+ break;
+ default:
+ return 1;
+ }
+ if (!TIFFIsCODECConfigured(tif->tif_dir.td_compression))
+ {
+ return 0;
+ }
+ /* Check if codec specific tags are allowed for the current
+ * compression scheme (codec) */
+ switch (tif->tif_dir.td_compression)
+ {
+ case COMPRESSION_LZW:
+ if (tag == TIFFTAG_PREDICTOR)
+ return 1;
+ break;
+ case COMPRESSION_PACKBITS:
+ /* No codec-specific tags */
+ break;
+ case COMPRESSION_THUNDERSCAN:
+ /* No codec-specific tags */
+ break;
+ case COMPRESSION_NEXT:
+ /* No codec-specific tags */
+ break;
+ case COMPRESSION_JPEG:
+ if (tag == TIFFTAG_JPEGTABLES)
+ return 1;
+ break;
+ case COMPRESSION_OJPEG:
+ switch (tag)
+ {
+ case TIFFTAG_JPEGIFOFFSET:
+ case TIFFTAG_JPEGIFBYTECOUNT:
+ case TIFFTAG_JPEGQTABLES:
+ case TIFFTAG_JPEGDCTABLES:
+ case TIFFTAG_JPEGACTABLES:
+ case TIFFTAG_JPEGPROC:
+ case TIFFTAG_JPEGRESTARTINTERVAL:
+ return 1;
+ }
+ break;
+ case COMPRESSION_CCITTRLE:
+ case COMPRESSION_CCITTRLEW:
+ case COMPRESSION_CCITTFAX3:
+ case COMPRESSION_CCITTFAX4:
+ switch (tag)
+ {
+ case TIFFTAG_BADFAXLINES:
+ case TIFFTAG_CLEANFAXDATA:
+ case TIFFTAG_CONSECUTIVEBADFAXLINES:
+ return 1;
+ case TIFFTAG_GROUP3OPTIONS:
+ if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX3)
+ return 1;
+ break;
+ case TIFFTAG_GROUP4OPTIONS:
+ if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX4)
+ return 1;
+ break;
+ }
+ break;
+ case COMPRESSION_JBIG:
+ /* No codec-specific tags */
+ break;
+ case COMPRESSION_DEFLATE:
+ case COMPRESSION_ADOBE_DEFLATE:
+ if (tag == TIFFTAG_PREDICTOR)
+ return 1;
+ break;
+ case COMPRESSION_PIXARLOG:
+ if (tag == TIFFTAG_PREDICTOR)
+ return 1;
+ break;
+ case COMPRESSION_SGILOG:
+ case COMPRESSION_SGILOG24:
+ /* No codec-specific tags */
+ break;
+ case COMPRESSION_LZMA:
+ if (tag == TIFFTAG_PREDICTOR)
+ return 1;
+ break;
+ case COMPRESSION_ZSTD:
+ if (tag == TIFFTAG_PREDICTOR)
+ return 1;
+ break;
+ case COMPRESSION_LERC:
+ if (tag == TIFFTAG_LERC_PARAMETERS)
+ return 1;
+ break;
+ }
+ return 0;
}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_dirread.c b/src/3rdparty/libtiff/libtiff/tif_dirread.c
index 6f90941..35425b4 100644
--- a/src/3rdparty/libtiff/libtiff/tif_dirread.c
+++ b/src/3rdparty/libtiff/libtiff/tif_dirread.c
@@ -34,3464 +34,3946 @@
* TIFFReadDirectory, so as to eliminate current possibly repetitive lookup.
*/
+#include "tiffconf.h"
#include "tiffiop.h"
#include <float.h>
+#include <limits.h>
#include <stdlib.h>
+#include <string.h>
-#define FAILED_FII ((uint32) -1)
-
-/*
- * Largest 64-bit signed integer value.
- */
-#define TIFF_INT64_MAX ((int64)(TIFF_UINT64_MAX >> 1))
+#define FAILED_FII ((uint32_t)-1)
#ifdef HAVE_IEEEFP
-# define TIFFCvtIEEEFloatToNative(tif, n, fp)
-# define TIFFCvtIEEEDoubleToNative(tif, n, dp)
+#define TIFFCvtIEEEFloatToNative(tif, n, fp)
+#define TIFFCvtIEEEDoubleToNative(tif, n, dp)
#else
-extern void TIFFCvtIEEEFloatToNative(TIFF*, uint32, float*);
-extern void TIFFCvtIEEEDoubleToNative(TIFF*, uint32, double*);
+extern void TIFFCvtIEEEFloatToNative(TIFF *, uint32_t, float *);
+extern void TIFFCvtIEEEDoubleToNative(TIFF *, uint32_t, double *);
#endif
-enum TIFFReadDirEntryErr {
- TIFFReadDirEntryErrOk = 0,
- TIFFReadDirEntryErrCount = 1,
- TIFFReadDirEntryErrType = 2,
- TIFFReadDirEntryErrIo = 3,
- TIFFReadDirEntryErrRange = 4,
- TIFFReadDirEntryErrPsdif = 5,
- TIFFReadDirEntryErrSizesan = 6,
- TIFFReadDirEntryErrAlloc = 7,
+enum TIFFReadDirEntryErr
+{
+ TIFFReadDirEntryErrOk = 0,
+ TIFFReadDirEntryErrCount = 1,
+ TIFFReadDirEntryErrType = 2,
+ TIFFReadDirEntryErrIo = 3,
+ TIFFReadDirEntryErrRange = 4,
+ TIFFReadDirEntryErrPsdif = 5,
+ TIFFReadDirEntryErrSizesan = 6,
+ TIFFReadDirEntryErrAlloc = 7,
};
-static enum TIFFReadDirEntryErr TIFFReadDirEntryByte(TIFF* tif, TIFFDirEntry* direntry, uint8* value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryLong(TIFF* tif, TIFFDirEntry* direntry, uint32* value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryLong8(TIFF* tif, TIFFDirEntry* direntry, uint64* value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryFloat(TIFF* tif, TIFFDirEntry* direntry, float* value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryDouble(TIFF* tif, TIFFDirEntry* direntry, double* value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryIfd8(TIFF* tif, TIFFDirEntry* direntry, uint64* value);
-
-static enum TIFFReadDirEntryErr TIFFReadDirEntryArray(TIFF* tif, TIFFDirEntry* direntry, uint32* count, uint32 desttypesize, void** value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryByteArray(TIFF* tif, TIFFDirEntry* direntry, uint8** value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntrySbyteArray(TIFF* tif, TIFFDirEntry* direntry, int8** value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryShortArray(TIFF* tif, TIFFDirEntry* direntry, uint16** value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntrySshortArray(TIFF* tif, TIFFDirEntry* direntry, int16** value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryLongArray(TIFF* tif, TIFFDirEntry* direntry, uint32** value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntrySlongArray(TIFF* tif, TIFFDirEntry* direntry, int32** value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryLong8Array(TIFF* tif, TIFFDirEntry* direntry, uint64** value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntrySlong8Array(TIFF* tif, TIFFDirEntry* direntry, int64** value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryFloatArray(TIFF* tif, TIFFDirEntry* direntry, float** value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryDoubleArray(TIFF* tif, TIFFDirEntry* direntry, double** value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryIfd8Array(TIFF* tif, TIFFDirEntry* direntry, uint64** value);
-
-static enum TIFFReadDirEntryErr TIFFReadDirEntryPersampleShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value);
-#if 0
-static enum TIFFReadDirEntryErr TIFFReadDirEntryPersampleDouble(TIFF* tif, TIFFDirEntry* direntry, double* value);
-#endif
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryByte(TIFF *tif, TIFFDirEntry *direntry, uint8_t *value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntrySbyte(TIFF *tif, TIFFDirEntry *direntry, int8_t *value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryShort(TIFF *tif, TIFFDirEntry *direntry, uint16_t *value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntrySshort(TIFF *tif, TIFFDirEntry *direntry, int16_t *value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryLong(TIFF *tif, TIFFDirEntry *direntry, uint32_t *value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntrySlong(TIFF *tif, TIFFDirEntry *direntry, int32_t *value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryLong8(TIFF *tif, TIFFDirEntry *direntry, uint64_t *value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntrySlong8(TIFF *tif, TIFFDirEntry *direntry, int64_t *value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryFloat(TIFF *tif, TIFFDirEntry *direntry, float *value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryDouble(TIFF *tif, TIFFDirEntry *direntry, double *value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryIfd8(TIFF *tif, TIFFDirEntry *direntry, uint64_t *value);
+
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryArray(TIFF *tif, TIFFDirEntry *direntry, uint32_t *count,
+ uint32_t desttypesize, void **value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryByteArray(TIFF *tif, TIFFDirEntry *direntry, uint8_t **value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntrySbyteArray(TIFF *tif, TIFFDirEntry *direntry, int8_t **value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryShortArray(TIFF *tif, TIFFDirEntry *direntry, uint16_t **value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntrySshortArray(TIFF *tif, TIFFDirEntry *direntry, int16_t **value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryLongArray(TIFF *tif, TIFFDirEntry *direntry, uint32_t **value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntrySlongArray(TIFF *tif, TIFFDirEntry *direntry, int32_t **value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryLong8Array(TIFF *tif, TIFFDirEntry *direntry, uint64_t **value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntrySlong8Array(TIFF *tif, TIFFDirEntry *direntry, int64_t **value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryFloatArray(TIFF *tif, TIFFDirEntry *direntry, float **value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryDoubleArray(TIFF *tif, TIFFDirEntry *direntry, double **value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryIfd8Array(TIFF *tif, TIFFDirEntry *direntry, uint64_t **value);
+
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryPersampleShort(TIFF *tif, TIFFDirEntry *direntry,
+ uint16_t *value);
+
+static void TIFFReadDirEntryCheckedByte(TIFF *tif, TIFFDirEntry *direntry,
+ uint8_t *value);
+static void TIFFReadDirEntryCheckedSbyte(TIFF *tif, TIFFDirEntry *direntry,
+ int8_t *value);
+static void TIFFReadDirEntryCheckedShort(TIFF *tif, TIFFDirEntry *direntry,
+ uint16_t *value);
+static void TIFFReadDirEntryCheckedSshort(TIFF *tif, TIFFDirEntry *direntry,
+ int16_t *value);
+static void TIFFReadDirEntryCheckedLong(TIFF *tif, TIFFDirEntry *direntry,
+ uint32_t *value);
+static void TIFFReadDirEntryCheckedSlong(TIFF *tif, TIFFDirEntry *direntry,
+ int32_t *value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckedLong8(TIFF *tif, TIFFDirEntry *direntry,
+ uint64_t *value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckedSlong8(TIFF *tif, TIFFDirEntry *direntry,
+ int64_t *value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckedRational(TIFF *tif, TIFFDirEntry *direntry,
+ double *value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckedSrational(TIFF *tif, TIFFDirEntry *direntry,
+ double *value);
+static void TIFFReadDirEntryCheckedFloat(TIFF *tif, TIFFDirEntry *direntry,
+ float *value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckedDouble(TIFF *tif, TIFFDirEntry *direntry, double *value);
+
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeByteSbyte(int8_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeByteShort(uint16_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeByteSshort(int16_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeByteLong(uint32_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeByteSlong(int32_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeByteLong8(uint64_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeByteSlong8(int64_t value);
-static void TIFFReadDirEntryCheckedByte(TIFF* tif, TIFFDirEntry* direntry, uint8* value);
-static void TIFFReadDirEntryCheckedSbyte(TIFF* tif, TIFFDirEntry* direntry, int8* value);
-static void TIFFReadDirEntryCheckedShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value);
-static void TIFFReadDirEntryCheckedSshort(TIFF* tif, TIFFDirEntry* direntry, int16* value);
-static void TIFFReadDirEntryCheckedLong(TIFF* tif, TIFFDirEntry* direntry, uint32* value);
-static void TIFFReadDirEntryCheckedSlong(TIFF* tif, TIFFDirEntry* direntry, int32* value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedLong8(TIFF* tif, TIFFDirEntry* direntry, uint64* value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedSlong8(TIFF* tif, TIFFDirEntry* direntry, int64* value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedRational(TIFF* tif, TIFFDirEntry* direntry, double* value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedSrational(TIFF* tif, TIFFDirEntry* direntry, double* value);
-static void TIFFReadDirEntryCheckedFloat(TIFF* tif, TIFFDirEntry* direntry, float* value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedDouble(TIFF* tif, TIFFDirEntry* direntry, double* value);
-
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSbyte(int8 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteShort(uint16 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSshort(int16 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteLong(uint32 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSlong(int32 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteLong8(uint64 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSlong8(int64 value);
-
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteByte(uint8 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteShort(uint16 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSshort(int16 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteLong(uint32 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSlong(int32 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteLong8(uint64 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSlong8(int64 value);
-
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSbyte(int8 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSshort(int16 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortLong(uint32 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSlong(int32 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortLong8(uint64 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSlong8(int64 value);
-
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortShort(uint16 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortLong(uint32 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortSlong(int32 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortLong8(uint64 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortSlong8(int64 value);
-
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSbyte(int8 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSshort(int16 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSlong(int32 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongLong8(uint64 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSlong8(int64 value);
-
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlongLong(uint32 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlongLong8(uint64 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlongSlong8(int64 value);
-
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLong8Sbyte(int8 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLong8Sshort(int16 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLong8Slong(int32 value);
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLong8Slong8(int64 value);
-
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlong8Long8(uint64 value);
-
-static enum TIFFReadDirEntryErr TIFFReadDirEntryData(TIFF* tif, uint64 offset, tmsize_t size, void* dest);
-static void TIFFReadDirEntryOutputErr(TIFF* tif, enum TIFFReadDirEntryErr err, const char* module, const char* tagname, int recover);
-
-static void TIFFReadDirectoryCheckOrder(TIFF* tif, TIFFDirEntry* dir, uint16 dircount);
-static TIFFDirEntry* TIFFReadDirectoryFindEntry(TIFF* tif, TIFFDirEntry* dir, uint16 dircount, uint16 tagid);
-static void TIFFReadDirectoryFindFieldInfo(TIFF* tif, uint16 tagid, uint32* fii);
-
-static int EstimateStripByteCounts(TIFF* tif, TIFFDirEntry* dir, uint16 dircount);
-static void MissingRequired(TIFF*, const char*);
-static int TIFFCheckDirOffset(TIFF* tif, uint64 diroff);
-static int CheckDirCount(TIFF*, TIFFDirEntry*, uint32);
-static uint16 TIFFFetchDirectory(TIFF* tif, uint64 diroff, TIFFDirEntry** pdir, uint64* nextdiroff);
-static int TIFFFetchNormalTag(TIFF*, TIFFDirEntry*, int recover);
-static int TIFFFetchStripThing(TIFF* tif, TIFFDirEntry* dir, uint32 nstrips, uint64** lpp);
-static int TIFFFetchSubjectDistance(TIFF*, TIFFDirEntry*);
-static void ChopUpSingleUncompressedStrip(TIFF*);
-static void TryChopUpUncompressedBigTiff(TIFF*);
-static uint64 TIFFReadUInt64(const uint8 *value);
-static int _TIFFGetMaxColorChannels(uint16 photometric);
-
-static int _TIFFFillStrilesInternal( TIFF *tif, int loadStripByteCount );
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSbyteByte(uint8_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSbyteShort(uint16_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSbyteSshort(int16_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSbyteLong(uint32_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSbyteSlong(int32_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSbyteLong8(uint64_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSbyteSlong8(int64_t value);
+
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeShortSbyte(int8_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeShortSshort(int16_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeShortLong(uint32_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeShortSlong(int32_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeShortLong8(uint64_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeShortSlong8(int64_t value);
+
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSshortShort(uint16_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSshortLong(uint32_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSshortSlong(int32_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSshortLong8(uint64_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSshortSlong8(int64_t value);
+
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeLongSbyte(int8_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeLongSshort(int16_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeLongSlong(int32_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeLongLong8(uint64_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeLongSlong8(int64_t value);
+
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSlongLong(uint32_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSlongLong8(uint64_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSlongSlong8(int64_t value);
+
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeLong8Sbyte(int8_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeLong8Sshort(int16_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeLong8Slong(int32_t value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeLong8Slong8(int64_t value);
+
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSlong8Long8(uint64_t value);
+
+static enum TIFFReadDirEntryErr TIFFReadDirEntryData(TIFF *tif, uint64_t offset,
+ tmsize_t size, void *dest);
+static void TIFFReadDirEntryOutputErr(TIFF *tif, enum TIFFReadDirEntryErr err,
+ const char *module, const char *tagname,
+ int recover);
+
+static void TIFFReadDirectoryCheckOrder(TIFF *tif, TIFFDirEntry *dir,
+ uint16_t dircount);
+static TIFFDirEntry *TIFFReadDirectoryFindEntry(TIFF *tif, TIFFDirEntry *dir,
+ uint16_t dircount,
+ uint16_t tagid);
+static void TIFFReadDirectoryFindFieldInfo(TIFF *tif, uint16_t tagid,
+ uint32_t *fii);
+
+static int EstimateStripByteCounts(TIFF *tif, TIFFDirEntry *dir,
+ uint16_t dircount);
+static void MissingRequired(TIFF *, const char *);
+static int CheckDirCount(TIFF *, TIFFDirEntry *, uint32_t);
+static uint16_t TIFFFetchDirectory(TIFF *tif, uint64_t diroff,
+ TIFFDirEntry **pdir, uint64_t *nextdiroff);
+static int TIFFFetchNormalTag(TIFF *, TIFFDirEntry *, int recover);
+static int TIFFFetchStripThing(TIFF *tif, TIFFDirEntry *dir, uint32_t nstrips,
+ uint64_t **lpp);
+static int TIFFFetchSubjectDistance(TIFF *, TIFFDirEntry *);
+static void ChopUpSingleUncompressedStrip(TIFF *);
+static void TryChopUpUncompressedBigTiff(TIFF *);
+static uint64_t TIFFReadUInt64(const uint8_t *value);
+static int _TIFFGetMaxColorChannels(uint16_t photometric);
+
+static int _TIFFFillStrilesInternal(TIFF *tif, int loadStripByteCount);
typedef union _UInt64Aligned_t
{
- double d;
- uint64 l;
- uint32 i[2];
- uint16 s[4];
- uint8 c[8];
+ double d;
+ uint64_t l;
+ uint32_t i[2];
+ uint16_t s[4];
+ uint8_t c[8];
} UInt64Aligned_t;
/*
- Unaligned safe copy of a uint64 value from an octet array.
+ Unaligned safe copy of a uint64_t value from an octet array.
*/
-static uint64 TIFFReadUInt64(const uint8 *value)
+static uint64_t TIFFReadUInt64(const uint8_t *value)
{
- UInt64Aligned_t result;
-
- result.c[0]=value[0];
- result.c[1]=value[1];
- result.c[2]=value[2];
- result.c[3]=value[3];
- result.c[4]=value[4];
- result.c[5]=value[5];
- result.c[6]=value[6];
- result.c[7]=value[7];
-
- return result.l;
+ UInt64Aligned_t result;
+
+ result.c[0] = value[0];
+ result.c[1] = value[1];
+ result.c[2] = value[2];
+ result.c[3] = value[3];
+ result.c[4] = value[4];
+ result.c[5] = value[5];
+ result.c[6] = value[6];
+ result.c[7] = value[7];
+
+ return result.l;
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryByte(TIFF* tif, TIFFDirEntry* direntry, uint8* value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryByte(TIFF *tif, TIFFDirEntry *direntry, uint8_t *value)
{
- enum TIFFReadDirEntryErr err;
- if (direntry->tdir_count!=1)
- return(TIFFReadDirEntryErrCount);
- switch (direntry->tdir_type)
- {
- case TIFF_BYTE:
- case TIFF_UNDEFINED: /* Support to read TIFF_UNDEFINED with field_readcount==1 */
- TIFFReadDirEntryCheckedByte(tif,direntry,value);
- return(TIFFReadDirEntryErrOk);
- case TIFF_SBYTE:
- {
- int8 m;
- TIFFReadDirEntryCheckedSbyte(tif,direntry,&m);
- err=TIFFReadDirEntryCheckRangeByteSbyte(m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(uint8)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SHORT:
- {
- uint16 m;
- TIFFReadDirEntryCheckedShort(tif,direntry,&m);
- err=TIFFReadDirEntryCheckRangeByteShort(m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(uint8)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SSHORT:
- {
- int16 m;
- TIFFReadDirEntryCheckedSshort(tif,direntry,&m);
- err=TIFFReadDirEntryCheckRangeByteSshort(m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(uint8)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_LONG:
- {
- uint32 m;
- TIFFReadDirEntryCheckedLong(tif,direntry,&m);
- err=TIFFReadDirEntryCheckRangeByteLong(m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(uint8)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SLONG:
- {
- int32 m;
- TIFFReadDirEntryCheckedSlong(tif,direntry,&m);
- err=TIFFReadDirEntryCheckRangeByteSlong(m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(uint8)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_LONG8:
- {
- uint64 m;
- err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- err=TIFFReadDirEntryCheckRangeByteLong8(m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(uint8)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SLONG8:
- {
- int64 m;
- err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- err=TIFFReadDirEntryCheckRangeByteSlong8(m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(uint8)m;
- return(TIFFReadDirEntryErrOk);
- }
- default:
- return(TIFFReadDirEntryErrType);
- }
+ enum TIFFReadDirEntryErr err;
+ if (direntry->tdir_count != 1)
+ return (TIFFReadDirEntryErrCount);
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ case TIFF_UNDEFINED: /* Support to read TIFF_UNDEFINED with
+ field_readcount==1 */
+ TIFFReadDirEntryCheckedByte(tif, direntry, value);
+ return (TIFFReadDirEntryErrOk);
+ case TIFF_SBYTE:
+ {
+ int8_t m;
+ TIFFReadDirEntryCheckedSbyte(tif, direntry, &m);
+ err = TIFFReadDirEntryCheckRangeByteSbyte(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (uint8_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SHORT:
+ {
+ uint16_t m;
+ TIFFReadDirEntryCheckedShort(tif, direntry, &m);
+ err = TIFFReadDirEntryCheckRangeByteShort(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (uint8_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SSHORT:
+ {
+ int16_t m;
+ TIFFReadDirEntryCheckedSshort(tif, direntry, &m);
+ err = TIFFReadDirEntryCheckRangeByteSshort(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (uint8_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_LONG:
+ {
+ uint32_t m;
+ TIFFReadDirEntryCheckedLong(tif, direntry, &m);
+ err = TIFFReadDirEntryCheckRangeByteLong(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (uint8_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SLONG:
+ {
+ int32_t m;
+ TIFFReadDirEntryCheckedSlong(tif, direntry, &m);
+ err = TIFFReadDirEntryCheckRangeByteSlong(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (uint8_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_LONG8:
+ {
+ uint64_t m;
+ err = TIFFReadDirEntryCheckedLong8(tif, direntry, &m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ err = TIFFReadDirEntryCheckRangeByteLong8(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (uint8_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SLONG8:
+ {
+ int64_t m;
+ err = TIFFReadDirEntryCheckedSlong8(tif, direntry, &m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ err = TIFFReadDirEntryCheckRangeByteSlong8(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (uint8_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ default:
+ return (TIFFReadDirEntryErrType);
+ }
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntrySbyte(TIFF *tif, TIFFDirEntry *direntry, int8_t *value)
{
- enum TIFFReadDirEntryErr err;
- if (direntry->tdir_count!=1)
- return(TIFFReadDirEntryErrCount);
- switch (direntry->tdir_type)
- {
- case TIFF_BYTE:
- {
- uint8 m;
- TIFFReadDirEntryCheckedByte(tif,direntry,&m);
- *value=(uint16)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SBYTE:
- {
- int8 m;
- TIFFReadDirEntryCheckedSbyte(tif,direntry,&m);
- err=TIFFReadDirEntryCheckRangeShortSbyte(m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(uint16)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SHORT:
- TIFFReadDirEntryCheckedShort(tif,direntry,value);
- return(TIFFReadDirEntryErrOk);
- case TIFF_SSHORT:
- {
- int16 m;
- TIFFReadDirEntryCheckedSshort(tif,direntry,&m);
- err=TIFFReadDirEntryCheckRangeShortSshort(m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(uint16)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_LONG:
- {
- uint32 m;
- TIFFReadDirEntryCheckedLong(tif,direntry,&m);
- err=TIFFReadDirEntryCheckRangeShortLong(m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(uint16)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SLONG:
- {
- int32 m;
- TIFFReadDirEntryCheckedSlong(tif,direntry,&m);
- err=TIFFReadDirEntryCheckRangeShortSlong(m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(uint16)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_LONG8:
- {
- uint64 m;
- err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- err=TIFFReadDirEntryCheckRangeShortLong8(m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(uint16)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SLONG8:
- {
- int64 m;
- err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- err=TIFFReadDirEntryCheckRangeShortSlong8(m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(uint16)m;
- return(TIFFReadDirEntryErrOk);
- }
- default:
- return(TIFFReadDirEntryErrType);
- }
-}
+ enum TIFFReadDirEntryErr err;
+ if (direntry->tdir_count != 1)
+ return (TIFFReadDirEntryErrCount);
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ case TIFF_UNDEFINED: /* Support to read TIFF_UNDEFINED with
+ field_readcount==1 */
+ {
+ uint8_t m;
+ TIFFReadDirEntryCheckedByte(tif, direntry, &m);
+ err = TIFFReadDirEntryCheckRangeSbyteByte(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (int8_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SBYTE:
+ {
+ TIFFReadDirEntryCheckedSbyte(tif, direntry, value);
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SHORT:
+ {
+ uint16_t m;
+ TIFFReadDirEntryCheckedShort(tif, direntry, &m);
+ err = TIFFReadDirEntryCheckRangeSbyteShort(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (int8_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SSHORT:
+ {
+ int16_t m;
+ TIFFReadDirEntryCheckedSshort(tif, direntry, &m);
+ err = TIFFReadDirEntryCheckRangeSbyteSshort(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (int8_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_LONG:
+ {
+ uint32_t m;
+ TIFFReadDirEntryCheckedLong(tif, direntry, &m);
+ err = TIFFReadDirEntryCheckRangeSbyteLong(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (int8_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SLONG:
+ {
+ int32_t m;
+ TIFFReadDirEntryCheckedSlong(tif, direntry, &m);
+ err = TIFFReadDirEntryCheckRangeSbyteSlong(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (int8_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_LONG8:
+ {
+ uint64_t m;
+ err = TIFFReadDirEntryCheckedLong8(tif, direntry, &m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ err = TIFFReadDirEntryCheckRangeSbyteLong8(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (int8_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SLONG8:
+ {
+ int64_t m;
+ err = TIFFReadDirEntryCheckedSlong8(tif, direntry, &m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ err = TIFFReadDirEntryCheckRangeSbyteSlong8(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (int8_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ default:
+ return (TIFFReadDirEntryErrType);
+ }
+} /*-- TIFFReadDirEntrySbyte() --*/
-static enum TIFFReadDirEntryErr TIFFReadDirEntryLong(TIFF* tif, TIFFDirEntry* direntry, uint32* value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryShort(TIFF *tif, TIFFDirEntry *direntry, uint16_t *value)
{
- enum TIFFReadDirEntryErr err;
- if (direntry->tdir_count!=1)
- return(TIFFReadDirEntryErrCount);
- switch (direntry->tdir_type)
- {
- case TIFF_BYTE:
- {
- uint8 m;
- TIFFReadDirEntryCheckedByte(tif,direntry,&m);
- *value=(uint32)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SBYTE:
- {
- int8 m;
- TIFFReadDirEntryCheckedSbyte(tif,direntry,&m);
- err=TIFFReadDirEntryCheckRangeLongSbyte(m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(uint32)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SHORT:
- {
- uint16 m;
- TIFFReadDirEntryCheckedShort(tif,direntry,&m);
- *value=(uint32)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SSHORT:
- {
- int16 m;
- TIFFReadDirEntryCheckedSshort(tif,direntry,&m);
- err=TIFFReadDirEntryCheckRangeLongSshort(m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(uint32)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_LONG:
- TIFFReadDirEntryCheckedLong(tif,direntry,value);
- return(TIFFReadDirEntryErrOk);
- case TIFF_SLONG:
- {
- int32 m;
- TIFFReadDirEntryCheckedSlong(tif,direntry,&m);
- err=TIFFReadDirEntryCheckRangeLongSlong(m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(uint32)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_LONG8:
- {
- uint64 m;
- err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- err=TIFFReadDirEntryCheckRangeLongLong8(m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(uint32)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SLONG8:
- {
- int64 m;
- err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- err=TIFFReadDirEntryCheckRangeLongSlong8(m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(uint32)m;
- return(TIFFReadDirEntryErrOk);
- }
- default:
- return(TIFFReadDirEntryErrType);
- }
-}
+ enum TIFFReadDirEntryErr err;
+ if (direntry->tdir_count != 1)
+ return (TIFFReadDirEntryErrCount);
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ {
+ uint8_t m;
+ TIFFReadDirEntryCheckedByte(tif, direntry, &m);
+ *value = (uint16_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SBYTE:
+ {
+ int8_t m;
+ TIFFReadDirEntryCheckedSbyte(tif, direntry, &m);
+ err = TIFFReadDirEntryCheckRangeShortSbyte(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (uint16_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SHORT:
+ TIFFReadDirEntryCheckedShort(tif, direntry, value);
+ return (TIFFReadDirEntryErrOk);
+ case TIFF_SSHORT:
+ {
+ int16_t m;
+ TIFFReadDirEntryCheckedSshort(tif, direntry, &m);
+ err = TIFFReadDirEntryCheckRangeShortSshort(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (uint16_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_LONG:
+ {
+ uint32_t m;
+ TIFFReadDirEntryCheckedLong(tif, direntry, &m);
+ err = TIFFReadDirEntryCheckRangeShortLong(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (uint16_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SLONG:
+ {
+ int32_t m;
+ TIFFReadDirEntryCheckedSlong(tif, direntry, &m);
+ err = TIFFReadDirEntryCheckRangeShortSlong(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (uint16_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_LONG8:
+ {
+ uint64_t m;
+ err = TIFFReadDirEntryCheckedLong8(tif, direntry, &m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ err = TIFFReadDirEntryCheckRangeShortLong8(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (uint16_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SLONG8:
+ {
+ int64_t m;
+ err = TIFFReadDirEntryCheckedSlong8(tif, direntry, &m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ err = TIFFReadDirEntryCheckRangeShortSlong8(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (uint16_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ default:
+ return (TIFFReadDirEntryErrType);
+ }
+} /*-- TIFFReadDirEntryShort() --*/
-static enum TIFFReadDirEntryErr TIFFReadDirEntryLong8(TIFF* tif, TIFFDirEntry* direntry, uint64* value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntrySshort(TIFF *tif, TIFFDirEntry *direntry, int16_t *value)
{
- enum TIFFReadDirEntryErr err;
- if (direntry->tdir_count!=1)
- return(TIFFReadDirEntryErrCount);
- switch (direntry->tdir_type)
- {
- case TIFF_BYTE:
- {
- uint8 m;
- TIFFReadDirEntryCheckedByte(tif,direntry,&m);
- *value=(uint64)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SBYTE:
- {
- int8 m;
- TIFFReadDirEntryCheckedSbyte(tif,direntry,&m);
- err=TIFFReadDirEntryCheckRangeLong8Sbyte(m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(uint64)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SHORT:
- {
- uint16 m;
- TIFFReadDirEntryCheckedShort(tif,direntry,&m);
- *value=(uint64)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SSHORT:
- {
- int16 m;
- TIFFReadDirEntryCheckedSshort(tif,direntry,&m);
- err=TIFFReadDirEntryCheckRangeLong8Sshort(m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(uint64)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_LONG:
- {
- uint32 m;
- TIFFReadDirEntryCheckedLong(tif,direntry,&m);
- *value=(uint64)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SLONG:
- {
- int32 m;
- TIFFReadDirEntryCheckedSlong(tif,direntry,&m);
- err=TIFFReadDirEntryCheckRangeLong8Slong(m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(uint64)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_LONG8:
- err=TIFFReadDirEntryCheckedLong8(tif,direntry,value);
- return(err);
- case TIFF_SLONG8:
- {
- int64 m;
- err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- err=TIFFReadDirEntryCheckRangeLong8Slong8(m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(uint64)m;
- return(TIFFReadDirEntryErrOk);
- }
- default:
- return(TIFFReadDirEntryErrType);
- }
-}
+ enum TIFFReadDirEntryErr err;
+ if (direntry->tdir_count != 1)
+ return (TIFFReadDirEntryErrCount);
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ {
+ uint8_t m;
+ TIFFReadDirEntryCheckedByte(tif, direntry, &m);
+ *value = (int16_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SBYTE:
+ {
+ int8_t m;
+ TIFFReadDirEntryCheckedSbyte(tif, direntry, &m);
+ *value = (int16_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SHORT:
+ {
+ uint16_t m;
+ TIFFReadDirEntryCheckedShort(tif, direntry, &m);
+ err = TIFFReadDirEntryCheckRangeSshortShort(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (uint16_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SSHORT:
+ TIFFReadDirEntryCheckedSshort(tif, direntry, value);
+ return (TIFFReadDirEntryErrOk);
+ case TIFF_LONG:
+ {
+ uint32_t m;
+ TIFFReadDirEntryCheckedLong(tif, direntry, &m);
+ err = TIFFReadDirEntryCheckRangeSshortLong(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (int16_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SLONG:
+ {
+ int32_t m;
+ TIFFReadDirEntryCheckedSlong(tif, direntry, &m);
+ err = TIFFReadDirEntryCheckRangeSshortSlong(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (int16_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_LONG8:
+ {
+ uint64_t m;
+ err = TIFFReadDirEntryCheckedLong8(tif, direntry, &m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ err = TIFFReadDirEntryCheckRangeSshortLong8(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (int16_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SLONG8:
+ {
+ int64_t m;
+ err = TIFFReadDirEntryCheckedSlong8(tif, direntry, &m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ err = TIFFReadDirEntryCheckRangeSshortSlong8(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (int16_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ default:
+ return (TIFFReadDirEntryErrType);
+ }
+} /*-- TIFFReadDirEntrySshort() --*/
+
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryLong(TIFF *tif, TIFFDirEntry *direntry, uint32_t *value)
+{
+ enum TIFFReadDirEntryErr err;
+ if (direntry->tdir_count != 1)
+ return (TIFFReadDirEntryErrCount);
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ {
+ uint8_t m;
+ TIFFReadDirEntryCheckedByte(tif, direntry, &m);
+ *value = (uint32_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SBYTE:
+ {
+ int8_t m;
+ TIFFReadDirEntryCheckedSbyte(tif, direntry, &m);
+ err = TIFFReadDirEntryCheckRangeLongSbyte(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (uint32_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SHORT:
+ {
+ uint16_t m;
+ TIFFReadDirEntryCheckedShort(tif, direntry, &m);
+ *value = (uint32_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SSHORT:
+ {
+ int16_t m;
+ TIFFReadDirEntryCheckedSshort(tif, direntry, &m);
+ err = TIFFReadDirEntryCheckRangeLongSshort(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (uint32_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_LONG:
+ TIFFReadDirEntryCheckedLong(tif, direntry, value);
+ return (TIFFReadDirEntryErrOk);
+ case TIFF_SLONG:
+ {
+ int32_t m;
+ TIFFReadDirEntryCheckedSlong(tif, direntry, &m);
+ err = TIFFReadDirEntryCheckRangeLongSlong(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (uint32_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_LONG8:
+ {
+ uint64_t m;
+ err = TIFFReadDirEntryCheckedLong8(tif, direntry, &m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ err = TIFFReadDirEntryCheckRangeLongLong8(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (uint32_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SLONG8:
+ {
+ int64_t m;
+ err = TIFFReadDirEntryCheckedSlong8(tif, direntry, &m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ err = TIFFReadDirEntryCheckRangeLongSlong8(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (uint32_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ default:
+ return (TIFFReadDirEntryErrType);
+ }
+} /*-- TIFFReadDirEntryLong() --*/
+
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntrySlong(TIFF *tif, TIFFDirEntry *direntry, int32_t *value)
+{
+ enum TIFFReadDirEntryErr err;
+ if (direntry->tdir_count != 1)
+ return (TIFFReadDirEntryErrCount);
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ {
+ uint8_t m;
+ TIFFReadDirEntryCheckedByte(tif, direntry, &m);
+ *value = (int32_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SBYTE:
+ {
+ int8_t m;
+ TIFFReadDirEntryCheckedSbyte(tif, direntry, &m);
+ *value = (int32_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SHORT:
+ {
+ uint16_t m;
+ TIFFReadDirEntryCheckedShort(tif, direntry, &m);
+ *value = (int32_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SSHORT:
+ {
+ int16_t m;
+ TIFFReadDirEntryCheckedSshort(tif, direntry, &m);
+ *value = (int32_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_LONG:
+ {
+ uint32_t m;
+ TIFFReadDirEntryCheckedLong(tif, direntry, &m);
+ err = TIFFReadDirEntryCheckRangeSlongLong(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (int32_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SLONG:
+ TIFFReadDirEntryCheckedSlong(tif, direntry, value);
+ return (TIFFReadDirEntryErrOk);
+ case TIFF_LONG8:
+ {
+ uint64_t m;
+ err = TIFFReadDirEntryCheckedLong8(tif, direntry, &m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ err = TIFFReadDirEntryCheckRangeSlongLong8(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (int32_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SLONG8:
+ {
+ int64_t m;
+ err = TIFFReadDirEntryCheckedSlong8(tif, direntry, &m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ err = TIFFReadDirEntryCheckRangeSlongSlong8(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (int32_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ default:
+ return (TIFFReadDirEntryErrType);
+ }
+} /*-- TIFFReadDirEntrySlong() --*/
-static enum TIFFReadDirEntryErr TIFFReadDirEntryFloat(TIFF* tif, TIFFDirEntry* direntry, float* value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryLong8(TIFF *tif, TIFFDirEntry *direntry, uint64_t *value)
{
- enum TIFFReadDirEntryErr err;
- if (direntry->tdir_count!=1)
- return(TIFFReadDirEntryErrCount);
- switch (direntry->tdir_type)
- {
- case TIFF_BYTE:
- {
- uint8 m;
- TIFFReadDirEntryCheckedByte(tif,direntry,&m);
- *value=(float)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SBYTE:
- {
- int8 m;
- TIFFReadDirEntryCheckedSbyte(tif,direntry,&m);
- *value=(float)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SHORT:
- {
- uint16 m;
- TIFFReadDirEntryCheckedShort(tif,direntry,&m);
- *value=(float)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SSHORT:
- {
- int16 m;
- TIFFReadDirEntryCheckedSshort(tif,direntry,&m);
- *value=(float)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_LONG:
- {
- uint32 m;
- TIFFReadDirEntryCheckedLong(tif,direntry,&m);
- *value=(float)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SLONG:
- {
- int32 m;
- TIFFReadDirEntryCheckedSlong(tif,direntry,&m);
- *value=(float)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_LONG8:
- {
- uint64 m;
- err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
+ enum TIFFReadDirEntryErr err;
+ if (direntry->tdir_count != 1)
+ return (TIFFReadDirEntryErrCount);
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ {
+ uint8_t m;
+ TIFFReadDirEntryCheckedByte(tif, direntry, &m);
+ *value = (uint64_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SBYTE:
+ {
+ int8_t m;
+ TIFFReadDirEntryCheckedSbyte(tif, direntry, &m);
+ err = TIFFReadDirEntryCheckRangeLong8Sbyte(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (uint64_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SHORT:
+ {
+ uint16_t m;
+ TIFFReadDirEntryCheckedShort(tif, direntry, &m);
+ *value = (uint64_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SSHORT:
+ {
+ int16_t m;
+ TIFFReadDirEntryCheckedSshort(tif, direntry, &m);
+ err = TIFFReadDirEntryCheckRangeLong8Sshort(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (uint64_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_LONG:
+ {
+ uint32_t m;
+ TIFFReadDirEntryCheckedLong(tif, direntry, &m);
+ *value = (uint64_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SLONG:
+ {
+ int32_t m;
+ TIFFReadDirEntryCheckedSlong(tif, direntry, &m);
+ err = TIFFReadDirEntryCheckRangeLong8Slong(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (uint64_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_LONG8:
+ err = TIFFReadDirEntryCheckedLong8(tif, direntry, value);
+ return (err);
+ case TIFF_SLONG8:
+ {
+ int64_t m;
+ err = TIFFReadDirEntryCheckedSlong8(tif, direntry, &m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ err = TIFFReadDirEntryCheckRangeLong8Slong8(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (uint64_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ default:
+ return (TIFFReadDirEntryErrType);
+ }
+} /*-- TIFFReadDirEntryLong8() --*/
+
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntrySlong8(TIFF *tif, TIFFDirEntry *direntry, int64_t *value)
+{
+ enum TIFFReadDirEntryErr err;
+ if (direntry->tdir_count != 1)
+ return (TIFFReadDirEntryErrCount);
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ {
+ uint8_t m;
+ TIFFReadDirEntryCheckedByte(tif, direntry, &m);
+ *value = (int64_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SBYTE:
+ {
+ int8_t m;
+ TIFFReadDirEntryCheckedSbyte(tif, direntry, &m);
+ *value = (int64_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SHORT:
+ {
+ uint16_t m;
+ TIFFReadDirEntryCheckedShort(tif, direntry, &m);
+ *value = (int64_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SSHORT:
+ {
+ int16_t m;
+ TIFFReadDirEntryCheckedSshort(tif, direntry, &m);
+ *value = (int64_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_LONG:
+ {
+ uint32_t m;
+ TIFFReadDirEntryCheckedLong(tif, direntry, &m);
+ *value = (int64_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SLONG:
+ {
+ int32_t m;
+ TIFFReadDirEntryCheckedSlong(tif, direntry, &m);
+ *value = (int64_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_LONG8:
+ {
+ uint64_t m;
+ err = TIFFReadDirEntryCheckedLong8(tif, direntry, &m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ err = TIFFReadDirEntryCheckRangeSlong8Long8(m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (int64_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SLONG8:
+ err = TIFFReadDirEntryCheckedSlong8(tif, direntry, value);
+ return (err);
+ default:
+ return (TIFFReadDirEntryErrType);
+ }
+} /*-- TIFFReadDirEntrySlong8() --*/
+
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryFloat(TIFF *tif, TIFFDirEntry *direntry, float *value)
+{
+ enum TIFFReadDirEntryErr err;
+ if (direntry->tdir_count != 1)
+ return (TIFFReadDirEntryErrCount);
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ {
+ uint8_t m;
+ TIFFReadDirEntryCheckedByte(tif, direntry, &m);
+ *value = (float)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SBYTE:
+ {
+ int8_t m;
+ TIFFReadDirEntryCheckedSbyte(tif, direntry, &m);
+ *value = (float)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SHORT:
+ {
+ uint16_t m;
+ TIFFReadDirEntryCheckedShort(tif, direntry, &m);
+ *value = (float)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SSHORT:
+ {
+ int16_t m;
+ TIFFReadDirEntryCheckedSshort(tif, direntry, &m);
+ *value = (float)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_LONG:
+ {
+ uint32_t m;
+ TIFFReadDirEntryCheckedLong(tif, direntry, &m);
+ *value = (float)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SLONG:
+ {
+ int32_t m;
+ TIFFReadDirEntryCheckedSlong(tif, direntry, &m);
+ *value = (float)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_LONG8:
+ {
+ uint64_t m;
+ err = TIFFReadDirEntryCheckedLong8(tif, direntry, &m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
#if defined(__WIN32__) && (_MSC_VER < 1500)
- /*
- * XXX: MSVC 6.0 does not support conversion
- * of 64-bit integers into floating point
- * values.
- */
- *value = _TIFFUInt64ToFloat(m);
+ /*
+ * XXX: MSVC 6.0 does not support conversion
+ * of 64-bit integers into floating point
+ * values.
+ */
+ *value = _TIFFUInt64ToFloat(m);
#else
- *value=(float)m;
+ *value = (float)m;
#endif
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SLONG8:
- {
- int64 m;
- err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(float)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_RATIONAL:
- {
- double m;
- err=TIFFReadDirEntryCheckedRational(tif,direntry,&m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(float)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SRATIONAL:
- {
- double m;
- err=TIFFReadDirEntryCheckedSrational(tif,direntry,&m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(float)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_FLOAT:
- TIFFReadDirEntryCheckedFloat(tif,direntry,value);
- return(TIFFReadDirEntryErrOk);
- case TIFF_DOUBLE:
- {
- double m;
- err=TIFFReadDirEntryCheckedDouble(tif,direntry,&m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- if ((m > FLT_MAX) || (m < FLT_MIN))
- return(TIFFReadDirEntryErrRange);
- *value=(float)m;
- return(TIFFReadDirEntryErrOk);
- }
- default:
- return(TIFFReadDirEntryErrType);
- }
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SLONG8:
+ {
+ int64_t m;
+ err = TIFFReadDirEntryCheckedSlong8(tif, direntry, &m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (float)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_RATIONAL:
+ {
+ double m;
+ err = TIFFReadDirEntryCheckedRational(tif, direntry, &m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (float)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SRATIONAL:
+ {
+ double m;
+ err = TIFFReadDirEntryCheckedSrational(tif, direntry, &m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (float)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_FLOAT:
+ TIFFReadDirEntryCheckedFloat(tif, direntry, value);
+ return (TIFFReadDirEntryErrOk);
+ case TIFF_DOUBLE:
+ {
+ double m;
+ err = TIFFReadDirEntryCheckedDouble(tif, direntry, &m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ if ((m > FLT_MAX) || (m < -FLT_MAX))
+ return (TIFFReadDirEntryErrRange);
+ *value = (float)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ default:
+ return (TIFFReadDirEntryErrType);
+ }
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryDouble(TIFF* tif, TIFFDirEntry* direntry, double* value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryDouble(TIFF *tif, TIFFDirEntry *direntry, double *value)
{
- enum TIFFReadDirEntryErr err;
- if (direntry->tdir_count!=1)
- return(TIFFReadDirEntryErrCount);
- switch (direntry->tdir_type)
- {
- case TIFF_BYTE:
- {
- uint8 m;
- TIFFReadDirEntryCheckedByte(tif,direntry,&m);
- *value=(double)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SBYTE:
- {
- int8 m;
- TIFFReadDirEntryCheckedSbyte(tif,direntry,&m);
- *value=(double)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SHORT:
- {
- uint16 m;
- TIFFReadDirEntryCheckedShort(tif,direntry,&m);
- *value=(double)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SSHORT:
- {
- int16 m;
- TIFFReadDirEntryCheckedSshort(tif,direntry,&m);
- *value=(double)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_LONG:
- {
- uint32 m;
- TIFFReadDirEntryCheckedLong(tif,direntry,&m);
- *value=(double)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SLONG:
- {
- int32 m;
- TIFFReadDirEntryCheckedSlong(tif,direntry,&m);
- *value=(double)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_LONG8:
- {
- uint64 m;
- err=TIFFReadDirEntryCheckedLong8(tif,direntry,&m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
+ enum TIFFReadDirEntryErr err;
+ if (direntry->tdir_count != 1)
+ return (TIFFReadDirEntryErrCount);
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ {
+ uint8_t m;
+ TIFFReadDirEntryCheckedByte(tif, direntry, &m);
+ *value = (double)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SBYTE:
+ {
+ int8_t m;
+ TIFFReadDirEntryCheckedSbyte(tif, direntry, &m);
+ *value = (double)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SHORT:
+ {
+ uint16_t m;
+ TIFFReadDirEntryCheckedShort(tif, direntry, &m);
+ *value = (double)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SSHORT:
+ {
+ int16_t m;
+ TIFFReadDirEntryCheckedSshort(tif, direntry, &m);
+ *value = (double)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_LONG:
+ {
+ uint32_t m;
+ TIFFReadDirEntryCheckedLong(tif, direntry, &m);
+ *value = (double)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SLONG:
+ {
+ int32_t m;
+ TIFFReadDirEntryCheckedSlong(tif, direntry, &m);
+ *value = (double)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_LONG8:
+ {
+ uint64_t m;
+ err = TIFFReadDirEntryCheckedLong8(tif, direntry, &m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
#if defined(__WIN32__) && (_MSC_VER < 1500)
- /*
- * XXX: MSVC 6.0 does not support conversion
- * of 64-bit integers into floating point
- * values.
- */
- *value = _TIFFUInt64ToDouble(m);
+ /*
+ * XXX: MSVC 6.0 does not support conversion
+ * of 64-bit integers into floating point
+ * values.
+ */
+ *value = _TIFFUInt64ToDouble(m);
#else
- *value = (double)m;
+ *value = (double)m;
#endif
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SLONG8:
- {
- int64 m;
- err=TIFFReadDirEntryCheckedSlong8(tif,direntry,&m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- *value=(double)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_RATIONAL:
- err=TIFFReadDirEntryCheckedRational(tif,direntry,value);
- return(err);
- case TIFF_SRATIONAL:
- err=TIFFReadDirEntryCheckedSrational(tif,direntry,value);
- return(err);
- case TIFF_FLOAT:
- {
- float m;
- TIFFReadDirEntryCheckedFloat(tif,direntry,&m);
- *value=(double)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_DOUBLE:
- err=TIFFReadDirEntryCheckedDouble(tif,direntry,value);
- return(err);
- default:
- return(TIFFReadDirEntryErrType);
- }
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SLONG8:
+ {
+ int64_t m;
+ err = TIFFReadDirEntryCheckedSlong8(tif, direntry, &m);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ *value = (double)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_RATIONAL:
+ err = TIFFReadDirEntryCheckedRational(tif, direntry, value);
+ return (err);
+ case TIFF_SRATIONAL:
+ err = TIFFReadDirEntryCheckedSrational(tif, direntry, value);
+ return (err);
+ case TIFF_FLOAT:
+ {
+ float m;
+ TIFFReadDirEntryCheckedFloat(tif, direntry, &m);
+ *value = (double)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_DOUBLE:
+ err = TIFFReadDirEntryCheckedDouble(tif, direntry, value);
+ return (err);
+ default:
+ return (TIFFReadDirEntryErrType);
+ }
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryIfd8(TIFF* tif, TIFFDirEntry* direntry, uint64* value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryIfd8(TIFF *tif, TIFFDirEntry *direntry, uint64_t *value)
{
- enum TIFFReadDirEntryErr err;
- if (direntry->tdir_count!=1)
- return(TIFFReadDirEntryErrCount);
- switch (direntry->tdir_type)
- {
- case TIFF_LONG:
- case TIFF_IFD:
- {
- uint32 m;
- TIFFReadDirEntryCheckedLong(tif,direntry,&m);
- *value=(uint64)m;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_LONG8:
- case TIFF_IFD8:
- err=TIFFReadDirEntryCheckedLong8(tif,direntry,value);
- return(err);
- default:
- return(TIFFReadDirEntryErrType);
- }
+ enum TIFFReadDirEntryErr err;
+ if (direntry->tdir_count != 1)
+ return (TIFFReadDirEntryErrCount);
+ switch (direntry->tdir_type)
+ {
+ case TIFF_LONG:
+ case TIFF_IFD:
+ {
+ uint32_t m;
+ TIFFReadDirEntryCheckedLong(tif, direntry, &m);
+ *value = (uint64_t)m;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_LONG8:
+ case TIFF_IFD8:
+ err = TIFFReadDirEntryCheckedLong8(tif, direntry, value);
+ return (err);
+ default:
+ return (TIFFReadDirEntryErrType);
+ }
}
-
#define INITIAL_THRESHOLD (1024 * 1024)
#define THRESHOLD_MULTIPLIER 10
-#define MAX_THRESHOLD (THRESHOLD_MULTIPLIER * THRESHOLD_MULTIPLIER * THRESHOLD_MULTIPLIER * INITIAL_THRESHOLD)
-
-static enum TIFFReadDirEntryErr TIFFReadDirEntryDataAndRealloc(
- TIFF* tif, uint64 offset, tmsize_t size, void** pdest)
+#define MAX_THRESHOLD \
+ (THRESHOLD_MULTIPLIER * THRESHOLD_MULTIPLIER * THRESHOLD_MULTIPLIER * \
+ INITIAL_THRESHOLD)
+
+static enum TIFFReadDirEntryErr TIFFReadDirEntryDataAndRealloc(TIFF *tif,
+ uint64_t offset,
+ tmsize_t size,
+ void **pdest)
{
#if SIZEOF_SIZE_T == 8
- tmsize_t threshold = INITIAL_THRESHOLD;
+ tmsize_t threshold = INITIAL_THRESHOLD;
#endif
- tmsize_t already_read = 0;
+ tmsize_t already_read = 0;
- assert( !isMapped(tif) );
+ assert(!isMapped(tif));
- if (!SeekOK(tif,offset))
- return(TIFFReadDirEntryErrIo);
+ if (!SeekOK(tif, offset))
+ return (TIFFReadDirEntryErrIo);
- /* On 64 bit processes, read first a maximum of 1 MB, then 10 MB, etc */
- /* so as to avoid allocating too much memory in case the file is too */
- /* short. We could ask for the file size, but this might be */
- /* expensive with some I/O layers (think of reading a gzipped file) */
- /* Restrict to 64 bit processes, so as to avoid reallocs() */
- /* on 32 bit processes where virtual memory is scarce. */
- while( already_read < size )
- {
- void* new_dest;
- tmsize_t bytes_read;
- tmsize_t to_read = size - already_read;
+ /* On 64 bit processes, read first a maximum of 1 MB, then 10 MB, etc */
+ /* so as to avoid allocating too much memory in case the file is too */
+ /* short. We could ask for the file size, but this might be */
+ /* expensive with some I/O layers (think of reading a gzipped file) */
+ /* Restrict to 64 bit processes, so as to avoid reallocs() */
+ /* on 32 bit processes where virtual memory is scarce. */
+ while (already_read < size)
+ {
+ void *new_dest;
+ tmsize_t bytes_read;
+ tmsize_t to_read = size - already_read;
#if SIZEOF_SIZE_T == 8
- if( to_read >= threshold && threshold < MAX_THRESHOLD )
- {
- to_read = threshold;
- threshold *= THRESHOLD_MULTIPLIER;
- }
+ if (to_read >= threshold && threshold < MAX_THRESHOLD)
+ {
+ to_read = threshold;
+ threshold *= THRESHOLD_MULTIPLIER;
+ }
#endif
- new_dest = (uint8*) _TIFFrealloc(
- *pdest, already_read + to_read);
- if( new_dest == NULL )
- {
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "Failed to allocate memory for %s "
- "(%ld elements of %ld bytes each)",
- "TIFFReadDirEntryArray",
- (long) 1, (long) (already_read + to_read));
- return TIFFReadDirEntryErrAlloc;
- }
- *pdest = new_dest;
+ new_dest =
+ (uint8_t *)_TIFFreallocExt(tif, *pdest, already_read + to_read);
+ if (new_dest == NULL)
+ {
+ TIFFErrorExtR(tif, tif->tif_name,
+ "Failed to allocate memory for %s "
+ "(%" TIFF_SSIZE_FORMAT
+ " elements of %" TIFF_SSIZE_FORMAT " bytes each)",
+ "TIFFReadDirEntryArray", (tmsize_t)1,
+ already_read + to_read);
+ return TIFFReadDirEntryErrAlloc;
+ }
+ *pdest = new_dest;
- bytes_read = TIFFReadFile(tif,
- (char*)*pdest + already_read, to_read);
- already_read += bytes_read;
- if (bytes_read != to_read) {
- return TIFFReadDirEntryErrIo;
- }
+ bytes_read = TIFFReadFile(tif, (char *)*pdest + already_read, to_read);
+ already_read += bytes_read;
+ if (bytes_read != to_read)
+ {
+ return TIFFReadDirEntryErrIo;
}
- return TIFFReadDirEntryErrOk;
+ }
+ return TIFFReadDirEntryErrOk;
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryArrayWithLimit(
- TIFF* tif, TIFFDirEntry* direntry, uint32* count, uint32 desttypesize,
- void** value, uint64 maxcount)
+/* Caution: if raising that value, make sure int32 / uint32 overflows can't
+ * occur elsewhere */
+#define MAX_SIZE_TAG_DATA 2147483647U
+
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryArrayWithLimit(TIFF *tif, TIFFDirEntry *direntry,
+ uint32_t *count, uint32_t desttypesize,
+ void **value, uint64_t maxcount)
{
- int typesize;
- uint32 datasize;
- void* data;
- uint64 target_count64;
- typesize=TIFFDataWidth(direntry->tdir_type);
-
- target_count64 = (direntry->tdir_count > maxcount) ?
- maxcount : direntry->tdir_count;
-
- if ((target_count64==0)||(typesize==0))
- {
- *value=0;
- return(TIFFReadDirEntryErrOk);
- }
- (void) desttypesize;
-
- /*
- * As a sanity check, make sure we have no more than a 2GB tag array
- * in either the current data type or the dest data type. This also
- * avoids problems with overflow of tmsize_t on 32bit systems.
- */
- if ((uint64)(2147483647/typesize)<target_count64)
- return(TIFFReadDirEntryErrSizesan);
- if ((uint64)(2147483647/desttypesize)<target_count64)
- return(TIFFReadDirEntryErrSizesan);
-
- *count=(uint32)target_count64;
- datasize=(*count)*typesize;
- assert((tmsize_t)datasize>0);
-
- if( isMapped(tif) && datasize > (uint32)tif->tif_size )
- return TIFFReadDirEntryErrIo;
-
- if( !isMapped(tif) &&
- (((tif->tif_flags&TIFF_BIGTIFF) && datasize > 8) ||
- (!(tif->tif_flags&TIFF_BIGTIFF) && datasize > 4)) )
- {
- data = NULL;
- }
- else
- {
- data=_TIFFCheckMalloc(tif, *count, typesize, "ReadDirEntryArray");
- if (data==0)
- return(TIFFReadDirEntryErrAlloc);
- }
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- if (datasize<=4)
- _TIFFmemcpy(data,&direntry->tdir_offset,datasize);
- else
- {
- enum TIFFReadDirEntryErr err;
- uint32 offset = direntry->tdir_offset.toff_long;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(&offset);
- if( isMapped(tif) )
- err=TIFFReadDirEntryData(tif,(uint64)offset,(tmsize_t)datasize,data);
- else
- err=TIFFReadDirEntryDataAndRealloc(tif,(uint64)offset,(tmsize_t)datasize,&data);
- if (err!=TIFFReadDirEntryErrOk)
- {
- _TIFFfree(data);
- return(err);
- }
- }
- }
- else
- {
- if (datasize<=8)
- _TIFFmemcpy(data,&direntry->tdir_offset,datasize);
- else
- {
- enum TIFFReadDirEntryErr err;
- uint64 offset = direntry->tdir_offset.toff_long8;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8(&offset);
- if( isMapped(tif) )
- err=TIFFReadDirEntryData(tif,(uint64)offset,(tmsize_t)datasize,data);
- else
- err=TIFFReadDirEntryDataAndRealloc(tif,(uint64)offset,(tmsize_t)datasize,&data);
- if (err!=TIFFReadDirEntryErrOk)
- {
- _TIFFfree(data);
- return(err);
- }
- }
- }
- *value=data;
- return(TIFFReadDirEntryErrOk);
+ int typesize;
+ uint32_t datasize;
+ void *data;
+ uint64_t target_count64;
+ int original_datasize_clamped;
+ typesize = TIFFDataWidth(direntry->tdir_type);
+
+ target_count64 =
+ (direntry->tdir_count > maxcount) ? maxcount : direntry->tdir_count;
+
+ if ((target_count64 == 0) || (typesize == 0))
+ {
+ *value = 0;
+ return (TIFFReadDirEntryErrOk);
+ }
+ (void)desttypesize;
+
+ /* We just want to know if the original tag size is more than 4 bytes
+ * (classic TIFF) or 8 bytes (BigTIFF)
+ */
+ original_datasize_clamped =
+ ((direntry->tdir_count > 10) ? 10 : (int)direntry->tdir_count) *
+ typesize;
+
+ /*
+ * As a sanity check, make sure we have no more than a 2GB tag array
+ * in either the current data type or the dest data type. This also
+ * avoids problems with overflow of tmsize_t on 32bit systems.
+ */
+ if ((uint64_t)(MAX_SIZE_TAG_DATA / typesize) < target_count64)
+ return (TIFFReadDirEntryErrSizesan);
+ if ((uint64_t)(MAX_SIZE_TAG_DATA / desttypesize) < target_count64)
+ return (TIFFReadDirEntryErrSizesan);
+
+ *count = (uint32_t)target_count64;
+ datasize = (*count) * typesize;
+ assert((tmsize_t)datasize > 0);
+
+ if (isMapped(tif) && datasize > (uint64_t)tif->tif_size)
+ return TIFFReadDirEntryErrIo;
+
+ if (!isMapped(tif) && (((tif->tif_flags & TIFF_BIGTIFF) && datasize > 8) ||
+ (!(tif->tif_flags & TIFF_BIGTIFF) && datasize > 4)))
+ {
+ data = NULL;
+ }
+ else
+ {
+ data = _TIFFCheckMalloc(tif, *count, typesize, "ReadDirEntryArray");
+ if (data == 0)
+ return (TIFFReadDirEntryErrAlloc);
+ }
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ /* Only the condition on original_datasize_clamped. The second
+ * one is implied, but Coverity Scan cannot see it. */
+ if (original_datasize_clamped <= 4 && datasize <= 4)
+ _TIFFmemcpy(data, &direntry->tdir_offset, datasize);
+ else
+ {
+ enum TIFFReadDirEntryErr err;
+ uint32_t offset = direntry->tdir_offset.toff_long;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&offset);
+ if (isMapped(tif))
+ err = TIFFReadDirEntryData(tif, (uint64_t)offset,
+ (tmsize_t)datasize, data);
+ else
+ err = TIFFReadDirEntryDataAndRealloc(tif, (uint64_t)offset,
+ (tmsize_t)datasize, &data);
+ if (err != TIFFReadDirEntryErrOk)
+ {
+ _TIFFfreeExt(tif, data);
+ return (err);
+ }
+ }
+ }
+ else
+ {
+ /* See above comment for the Classic TIFF case */
+ if (original_datasize_clamped <= 8 && datasize <= 8)
+ _TIFFmemcpy(data, &direntry->tdir_offset, datasize);
+ else
+ {
+ enum TIFFReadDirEntryErr err;
+ uint64_t offset = direntry->tdir_offset.toff_long8;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(&offset);
+ if (isMapped(tif))
+ err = TIFFReadDirEntryData(tif, (uint64_t)offset,
+ (tmsize_t)datasize, data);
+ else
+ err = TIFFReadDirEntryDataAndRealloc(tif, (uint64_t)offset,
+ (tmsize_t)datasize, &data);
+ if (err != TIFFReadDirEntryErrOk)
+ {
+ _TIFFfreeExt(tif, data);
+ return (err);
+ }
+ }
+ }
+ *value = data;
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryArray(TIFF* tif, TIFFDirEntry* direntry, uint32* count, uint32 desttypesize, void** value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryArray(TIFF *tif, TIFFDirEntry *direntry, uint32_t *count,
+ uint32_t desttypesize, void **value)
{
- return TIFFReadDirEntryArrayWithLimit(tif, direntry, count,
- desttypesize, value, ~((uint64)0));
+ return TIFFReadDirEntryArrayWithLimit(tif, direntry, count, desttypesize,
+ value, ~((uint64_t)0));
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryByteArray(TIFF* tif, TIFFDirEntry* direntry, uint8** value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryByteArray(TIFF *tif, TIFFDirEntry *direntry, uint8_t **value)
{
- enum TIFFReadDirEntryErr err;
- uint32 count;
- void* origdata;
- uint8* data;
- switch (direntry->tdir_type)
- {
- case TIFF_ASCII:
- case TIFF_UNDEFINED:
- case TIFF_BYTE:
- case TIFF_SBYTE:
- case TIFF_SHORT:
- case TIFF_SSHORT:
- case TIFF_LONG:
- case TIFF_SLONG:
- case TIFF_LONG8:
- case TIFF_SLONG8:
- break;
- default:
- return(TIFFReadDirEntryErrType);
- }
- err=TIFFReadDirEntryArray(tif,direntry,&count,1,&origdata);
- if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
- {
- *value=0;
- return(err);
- }
- switch (direntry->tdir_type)
- {
- case TIFF_ASCII:
- case TIFF_UNDEFINED:
- case TIFF_BYTE:
- *value=(uint8*)origdata;
- return(TIFFReadDirEntryErrOk);
- case TIFF_SBYTE:
- {
- int8* m;
- uint32 n;
- m=(int8*)origdata;
- for (n=0; n<count; n++)
- {
- err=TIFFReadDirEntryCheckRangeByteSbyte(*m);
- if (err!=TIFFReadDirEntryErrOk)
- {
- _TIFFfree(origdata);
- return(err);
- }
- m++;
- }
- *value=(uint8*)origdata;
- return(TIFFReadDirEntryErrOk);
- }
- }
- data=(uint8*)_TIFFmalloc(count);
- if (data==0)
- {
- _TIFFfree(origdata);
- return(TIFFReadDirEntryErrAlloc);
- }
- switch (direntry->tdir_type)
- {
- case TIFF_SHORT:
- {
- uint16* ma;
- uint8* mb;
- uint32 n;
- ma=(uint16*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort(ma);
- err=TIFFReadDirEntryCheckRangeByteShort(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(uint8)(*ma++);
- }
- }
- break;
- case TIFF_SSHORT:
- {
- int16* ma;
- uint8* mb;
- uint32 n;
- ma=(int16*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort((uint16*)ma);
- err=TIFFReadDirEntryCheckRangeByteSshort(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(uint8)(*ma++);
- }
- }
- break;
- case TIFF_LONG:
- {
- uint32* ma;
- uint8* mb;
- uint32 n;
- ma=(uint32*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(ma);
- err=TIFFReadDirEntryCheckRangeByteLong(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(uint8)(*ma++);
- }
- }
- break;
- case TIFF_SLONG:
- {
- int32* ma;
- uint8* mb;
- uint32 n;
- ma=(int32*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong((uint32*)ma);
- err=TIFFReadDirEntryCheckRangeByteSlong(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(uint8)(*ma++);
- }
- }
- break;
- case TIFF_LONG8:
- {
- uint64* ma;
- uint8* mb;
- uint32 n;
- ma=(uint64*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8(ma);
- err=TIFFReadDirEntryCheckRangeByteLong8(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(uint8)(*ma++);
- }
- }
- break;
- case TIFF_SLONG8:
- {
- int64* ma;
- uint8* mb;
- uint32 n;
- ma=(int64*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8((uint64*)ma);
- err=TIFFReadDirEntryCheckRangeByteSlong8(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(uint8)(*ma++);
- }
- }
- break;
- }
- _TIFFfree(origdata);
- if (err!=TIFFReadDirEntryErrOk)
- {
- _TIFFfree(data);
- return(err);
- }
- *value=data;
- return(TIFFReadDirEntryErrOk);
+ enum TIFFReadDirEntryErr err;
+ uint32_t count;
+ void *origdata;
+ uint8_t *data;
+ switch (direntry->tdir_type)
+ {
+ case TIFF_ASCII:
+ case TIFF_UNDEFINED:
+ case TIFF_BYTE:
+ case TIFF_SBYTE:
+ case TIFF_SHORT:
+ case TIFF_SSHORT:
+ case TIFF_LONG:
+ case TIFF_SLONG:
+ case TIFF_LONG8:
+ case TIFF_SLONG8:
+ break;
+ default:
+ return (TIFFReadDirEntryErrType);
+ }
+ err = TIFFReadDirEntryArray(tif, direntry, &count, 1, &origdata);
+ if ((err != TIFFReadDirEntryErrOk) || (origdata == 0))
+ {
+ *value = 0;
+ return (err);
+ }
+ switch (direntry->tdir_type)
+ {
+ case TIFF_ASCII:
+ case TIFF_UNDEFINED:
+ case TIFF_BYTE:
+ *value = (uint8_t *)origdata;
+ return (TIFFReadDirEntryErrOk);
+ case TIFF_SBYTE:
+ {
+ int8_t *m;
+ uint32_t n;
+ m = (int8_t *)origdata;
+ for (n = 0; n < count; n++)
+ {
+ err = TIFFReadDirEntryCheckRangeByteSbyte(*m);
+ if (err != TIFFReadDirEntryErrOk)
+ {
+ _TIFFfreeExt(tif, origdata);
+ return (err);
+ }
+ m++;
+ }
+ *value = (uint8_t *)origdata;
+ return (TIFFReadDirEntryErrOk);
+ }
+ }
+ data = (uint8_t *)_TIFFmallocExt(tif, count);
+ if (data == 0)
+ {
+ _TIFFfreeExt(tif, origdata);
+ return (TIFFReadDirEntryErrAlloc);
+ }
+ switch (direntry->tdir_type)
+ {
+ case TIFF_SHORT:
+ {
+ uint16_t *ma;
+ uint8_t *mb;
+ uint32_t n;
+ ma = (uint16_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(ma);
+ err = TIFFReadDirEntryCheckRangeByteShort(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (uint8_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_SSHORT:
+ {
+ int16_t *ma;
+ uint8_t *mb;
+ uint32_t n;
+ ma = (int16_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort((uint16_t *)ma);
+ err = TIFFReadDirEntryCheckRangeByteSshort(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (uint8_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_LONG:
+ {
+ uint32_t *ma;
+ uint8_t *mb;
+ uint32_t n;
+ ma = (uint32_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(ma);
+ err = TIFFReadDirEntryCheckRangeByteLong(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (uint8_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_SLONG:
+ {
+ int32_t *ma;
+ uint8_t *mb;
+ uint32_t n;
+ ma = (int32_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong((uint32_t *)ma);
+ err = TIFFReadDirEntryCheckRangeByteSlong(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (uint8_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_LONG8:
+ {
+ uint64_t *ma;
+ uint8_t *mb;
+ uint32_t n;
+ ma = (uint64_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(ma);
+ err = TIFFReadDirEntryCheckRangeByteLong8(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (uint8_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_SLONG8:
+ {
+ int64_t *ma;
+ uint8_t *mb;
+ uint32_t n;
+ ma = (int64_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8((uint64_t *)ma);
+ err = TIFFReadDirEntryCheckRangeByteSlong8(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (uint8_t)(*ma++);
+ }
+ }
+ break;
+ }
+ _TIFFfreeExt(tif, origdata);
+ if (err != TIFFReadDirEntryErrOk)
+ {
+ _TIFFfreeExt(tif, data);
+ return (err);
+ }
+ *value = data;
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntrySbyteArray(TIFF* tif, TIFFDirEntry* direntry, int8** value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntrySbyteArray(TIFF *tif, TIFFDirEntry *direntry, int8_t **value)
{
- enum TIFFReadDirEntryErr err;
- uint32 count;
- void* origdata;
- int8* data;
- switch (direntry->tdir_type)
- {
- case TIFF_UNDEFINED:
- case TIFF_BYTE:
- case TIFF_SBYTE:
- case TIFF_SHORT:
- case TIFF_SSHORT:
- case TIFF_LONG:
- case TIFF_SLONG:
- case TIFF_LONG8:
- case TIFF_SLONG8:
- break;
- default:
- return(TIFFReadDirEntryErrType);
- }
- err=TIFFReadDirEntryArray(tif,direntry,&count,1,&origdata);
- if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
- {
- *value=0;
- return(err);
- }
- switch (direntry->tdir_type)
- {
- case TIFF_UNDEFINED:
- case TIFF_BYTE:
- {
- uint8* m;
- uint32 n;
- m=(uint8*)origdata;
- for (n=0; n<count; n++)
- {
- err=TIFFReadDirEntryCheckRangeSbyteByte(*m);
- if (err!=TIFFReadDirEntryErrOk)
- {
- _TIFFfree(origdata);
- return(err);
- }
- m++;
- }
- *value=(int8*)origdata;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SBYTE:
- *value=(int8*)origdata;
- return(TIFFReadDirEntryErrOk);
- }
- data=(int8*)_TIFFmalloc(count);
- if (data==0)
- {
- _TIFFfree(origdata);
- return(TIFFReadDirEntryErrAlloc);
- }
- switch (direntry->tdir_type)
- {
- case TIFF_SHORT:
- {
- uint16* ma;
- int8* mb;
- uint32 n;
- ma=(uint16*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort(ma);
- err=TIFFReadDirEntryCheckRangeSbyteShort(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(int8)(*ma++);
- }
- }
- break;
- case TIFF_SSHORT:
- {
- int16* ma;
- int8* mb;
- uint32 n;
- ma=(int16*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort((uint16*)ma);
- err=TIFFReadDirEntryCheckRangeSbyteSshort(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(int8)(*ma++);
- }
- }
- break;
- case TIFF_LONG:
- {
- uint32* ma;
- int8* mb;
- uint32 n;
- ma=(uint32*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(ma);
- err=TIFFReadDirEntryCheckRangeSbyteLong(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(int8)(*ma++);
- }
- }
- break;
- case TIFF_SLONG:
- {
- int32* ma;
- int8* mb;
- uint32 n;
- ma=(int32*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong((uint32*)ma);
- err=TIFFReadDirEntryCheckRangeSbyteSlong(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(int8)(*ma++);
- }
- }
- break;
- case TIFF_LONG8:
- {
- uint64* ma;
- int8* mb;
- uint32 n;
- ma=(uint64*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8(ma);
- err=TIFFReadDirEntryCheckRangeSbyteLong8(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(int8)(*ma++);
- }
- }
- break;
- case TIFF_SLONG8:
- {
- int64* ma;
- int8* mb;
- uint32 n;
- ma=(int64*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8((uint64*)ma);
- err=TIFFReadDirEntryCheckRangeSbyteSlong8(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(int8)(*ma++);
- }
- }
- break;
- }
- _TIFFfree(origdata);
- if (err!=TIFFReadDirEntryErrOk)
- {
- _TIFFfree(data);
- return(err);
- }
- *value=data;
- return(TIFFReadDirEntryErrOk);
+ enum TIFFReadDirEntryErr err;
+ uint32_t count;
+ void *origdata;
+ int8_t *data;
+ switch (direntry->tdir_type)
+ {
+ case TIFF_UNDEFINED:
+ case TIFF_BYTE:
+ case TIFF_SBYTE:
+ case TIFF_SHORT:
+ case TIFF_SSHORT:
+ case TIFF_LONG:
+ case TIFF_SLONG:
+ case TIFF_LONG8:
+ case TIFF_SLONG8:
+ break;
+ default:
+ return (TIFFReadDirEntryErrType);
+ }
+ err = TIFFReadDirEntryArray(tif, direntry, &count, 1, &origdata);
+ if ((err != TIFFReadDirEntryErrOk) || (origdata == 0))
+ {
+ *value = 0;
+ return (err);
+ }
+ switch (direntry->tdir_type)
+ {
+ case TIFF_UNDEFINED:
+ case TIFF_BYTE:
+ {
+ uint8_t *m;
+ uint32_t n;
+ m = (uint8_t *)origdata;
+ for (n = 0; n < count; n++)
+ {
+ err = TIFFReadDirEntryCheckRangeSbyteByte(*m);
+ if (err != TIFFReadDirEntryErrOk)
+ {
+ _TIFFfreeExt(tif, origdata);
+ return (err);
+ }
+ m++;
+ }
+ *value = (int8_t *)origdata;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SBYTE:
+ *value = (int8_t *)origdata;
+ return (TIFFReadDirEntryErrOk);
+ }
+ data = (int8_t *)_TIFFmallocExt(tif, count);
+ if (data == 0)
+ {
+ _TIFFfreeExt(tif, origdata);
+ return (TIFFReadDirEntryErrAlloc);
+ }
+ switch (direntry->tdir_type)
+ {
+ case TIFF_SHORT:
+ {
+ uint16_t *ma;
+ int8_t *mb;
+ uint32_t n;
+ ma = (uint16_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(ma);
+ err = TIFFReadDirEntryCheckRangeSbyteShort(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (int8_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_SSHORT:
+ {
+ int16_t *ma;
+ int8_t *mb;
+ uint32_t n;
+ ma = (int16_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort((uint16_t *)ma);
+ err = TIFFReadDirEntryCheckRangeSbyteSshort(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (int8_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_LONG:
+ {
+ uint32_t *ma;
+ int8_t *mb;
+ uint32_t n;
+ ma = (uint32_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(ma);
+ err = TIFFReadDirEntryCheckRangeSbyteLong(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (int8_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_SLONG:
+ {
+ int32_t *ma;
+ int8_t *mb;
+ uint32_t n;
+ ma = (int32_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong((uint32_t *)ma);
+ err = TIFFReadDirEntryCheckRangeSbyteSlong(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (int8_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_LONG8:
+ {
+ uint64_t *ma;
+ int8_t *mb;
+ uint32_t n;
+ ma = (uint64_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(ma);
+ err = TIFFReadDirEntryCheckRangeSbyteLong8(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (int8_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_SLONG8:
+ {
+ int64_t *ma;
+ int8_t *mb;
+ uint32_t n;
+ ma = (int64_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8((uint64_t *)ma);
+ err = TIFFReadDirEntryCheckRangeSbyteSlong8(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (int8_t)(*ma++);
+ }
+ }
+ break;
+ }
+ _TIFFfreeExt(tif, origdata);
+ if (err != TIFFReadDirEntryErrOk)
+ {
+ _TIFFfreeExt(tif, data);
+ return (err);
+ }
+ *value = data;
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryShortArray(TIFF* tif, TIFFDirEntry* direntry, uint16** value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryShortArray(TIFF *tif, TIFFDirEntry *direntry, uint16_t **value)
{
- enum TIFFReadDirEntryErr err;
- uint32 count;
- void* origdata;
- uint16* data;
- switch (direntry->tdir_type)
- {
- case TIFF_BYTE:
- case TIFF_SBYTE:
- case TIFF_SHORT:
- case TIFF_SSHORT:
- case TIFF_LONG:
- case TIFF_SLONG:
- case TIFF_LONG8:
- case TIFF_SLONG8:
- break;
- default:
- return(TIFFReadDirEntryErrType);
- }
- err=TIFFReadDirEntryArray(tif,direntry,&count,2,&origdata);
- if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
- {
- *value=0;
- return(err);
- }
- switch (direntry->tdir_type)
- {
- case TIFF_SHORT:
- *value=(uint16*)origdata;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfShort(*value,count);
- return(TIFFReadDirEntryErrOk);
- case TIFF_SSHORT:
- {
- int16* m;
- uint32 n;
- m=(int16*)origdata;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort((uint16*)m);
- err=TIFFReadDirEntryCheckRangeShortSshort(*m);
- if (err!=TIFFReadDirEntryErrOk)
- {
- _TIFFfree(origdata);
- return(err);
- }
- m++;
- }
- *value=(uint16*)origdata;
- return(TIFFReadDirEntryErrOk);
- }
- }
- data=(uint16*)_TIFFmalloc(count*2);
- if (data==0)
- {
- _TIFFfree(origdata);
- return(TIFFReadDirEntryErrAlloc);
- }
- switch (direntry->tdir_type)
- {
- case TIFF_BYTE:
- {
- uint8* ma;
- uint16* mb;
- uint32 n;
- ma=(uint8*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- *mb++=(uint16)(*ma++);
- }
- break;
- case TIFF_SBYTE:
- {
- int8* ma;
- uint16* mb;
- uint32 n;
- ma=(int8*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- err=TIFFReadDirEntryCheckRangeShortSbyte(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(uint16)(*ma++);
- }
- }
- break;
- case TIFF_LONG:
- {
- uint32* ma;
- uint16* mb;
- uint32 n;
- ma=(uint32*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(ma);
- err=TIFFReadDirEntryCheckRangeShortLong(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(uint16)(*ma++);
- }
- }
- break;
- case TIFF_SLONG:
- {
- int32* ma;
- uint16* mb;
- uint32 n;
- ma=(int32*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong((uint32*)ma);
- err=TIFFReadDirEntryCheckRangeShortSlong(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(uint16)(*ma++);
- }
- }
- break;
- case TIFF_LONG8:
- {
- uint64* ma;
- uint16* mb;
- uint32 n;
- ma=(uint64*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8(ma);
- err=TIFFReadDirEntryCheckRangeShortLong8(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(uint16)(*ma++);
- }
- }
- break;
- case TIFF_SLONG8:
- {
- int64* ma;
- uint16* mb;
- uint32 n;
- ma=(int64*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8((uint64*)ma);
- err=TIFFReadDirEntryCheckRangeShortSlong8(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(uint16)(*ma++);
- }
- }
- break;
- }
- _TIFFfree(origdata);
- if (err!=TIFFReadDirEntryErrOk)
- {
- _TIFFfree(data);
- return(err);
- }
- *value=data;
- return(TIFFReadDirEntryErrOk);
+ enum TIFFReadDirEntryErr err;
+ uint32_t count;
+ void *origdata;
+ uint16_t *data;
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ case TIFF_SBYTE:
+ case TIFF_SHORT:
+ case TIFF_SSHORT:
+ case TIFF_LONG:
+ case TIFF_SLONG:
+ case TIFF_LONG8:
+ case TIFF_SLONG8:
+ break;
+ default:
+ return (TIFFReadDirEntryErrType);
+ }
+ err = TIFFReadDirEntryArray(tif, direntry, &count, 2, &origdata);
+ if ((err != TIFFReadDirEntryErrOk) || (origdata == 0))
+ {
+ *value = 0;
+ return (err);
+ }
+ switch (direntry->tdir_type)
+ {
+ case TIFF_SHORT:
+ *value = (uint16_t *)origdata;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfShort(*value, count);
+ return (TIFFReadDirEntryErrOk);
+ case TIFF_SSHORT:
+ {
+ int16_t *m;
+ uint32_t n;
+ m = (int16_t *)origdata;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort((uint16_t *)m);
+ err = TIFFReadDirEntryCheckRangeShortSshort(*m);
+ if (err != TIFFReadDirEntryErrOk)
+ {
+ _TIFFfreeExt(tif, origdata);
+ return (err);
+ }
+ m++;
+ }
+ *value = (uint16_t *)origdata;
+ return (TIFFReadDirEntryErrOk);
+ }
+ }
+ data = (uint16_t *)_TIFFmallocExt(tif, count * 2);
+ if (data == 0)
+ {
+ _TIFFfreeExt(tif, origdata);
+ return (TIFFReadDirEntryErrAlloc);
+ }
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ {
+ uint8_t *ma;
+ uint16_t *mb;
+ uint32_t n;
+ ma = (uint8_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ *mb++ = (uint16_t)(*ma++);
+ }
+ break;
+ case TIFF_SBYTE:
+ {
+ int8_t *ma;
+ uint16_t *mb;
+ uint32_t n;
+ ma = (int8_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ err = TIFFReadDirEntryCheckRangeShortSbyte(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (uint16_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_LONG:
+ {
+ uint32_t *ma;
+ uint16_t *mb;
+ uint32_t n;
+ ma = (uint32_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(ma);
+ err = TIFFReadDirEntryCheckRangeShortLong(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (uint16_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_SLONG:
+ {
+ int32_t *ma;
+ uint16_t *mb;
+ uint32_t n;
+ ma = (int32_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong((uint32_t *)ma);
+ err = TIFFReadDirEntryCheckRangeShortSlong(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (uint16_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_LONG8:
+ {
+ uint64_t *ma;
+ uint16_t *mb;
+ uint32_t n;
+ ma = (uint64_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(ma);
+ err = TIFFReadDirEntryCheckRangeShortLong8(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (uint16_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_SLONG8:
+ {
+ int64_t *ma;
+ uint16_t *mb;
+ uint32_t n;
+ ma = (int64_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8((uint64_t *)ma);
+ err = TIFFReadDirEntryCheckRangeShortSlong8(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (uint16_t)(*ma++);
+ }
+ }
+ break;
+ }
+ _TIFFfreeExt(tif, origdata);
+ if (err != TIFFReadDirEntryErrOk)
+ {
+ _TIFFfreeExt(tif, data);
+ return (err);
+ }
+ *value = data;
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntrySshortArray(TIFF* tif, TIFFDirEntry* direntry, int16** value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntrySshortArray(TIFF *tif, TIFFDirEntry *direntry, int16_t **value)
{
- enum TIFFReadDirEntryErr err;
- uint32 count;
- void* origdata;
- int16* data;
- switch (direntry->tdir_type)
- {
- case TIFF_BYTE:
- case TIFF_SBYTE:
- case TIFF_SHORT:
- case TIFF_SSHORT:
- case TIFF_LONG:
- case TIFF_SLONG:
- case TIFF_LONG8:
- case TIFF_SLONG8:
- break;
- default:
- return(TIFFReadDirEntryErrType);
- }
- err=TIFFReadDirEntryArray(tif,direntry,&count,2,&origdata);
- if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
- {
- *value=0;
- return(err);
- }
- switch (direntry->tdir_type)
- {
- case TIFF_SHORT:
- {
- uint16* m;
- uint32 n;
- m=(uint16*)origdata;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort(m);
- err=TIFFReadDirEntryCheckRangeSshortShort(*m);
- if (err!=TIFFReadDirEntryErrOk)
- {
- _TIFFfree(origdata);
- return(err);
- }
- m++;
- }
- *value=(int16*)origdata;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SSHORT:
- *value=(int16*)origdata;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfShort((uint16*)(*value),count);
- return(TIFFReadDirEntryErrOk);
- }
- data=(int16*)_TIFFmalloc(count*2);
- if (data==0)
- {
- _TIFFfree(origdata);
- return(TIFFReadDirEntryErrAlloc);
- }
- switch (direntry->tdir_type)
- {
- case TIFF_BYTE:
- {
- uint8* ma;
- int16* mb;
- uint32 n;
- ma=(uint8*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- *mb++=(int16)(*ma++);
- }
- break;
- case TIFF_SBYTE:
- {
- int8* ma;
- int16* mb;
- uint32 n;
- ma=(int8*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- *mb++=(int16)(*ma++);
- }
- break;
- case TIFF_LONG:
- {
- uint32* ma;
- int16* mb;
- uint32 n;
- ma=(uint32*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(ma);
- err=TIFFReadDirEntryCheckRangeSshortLong(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(int16)(*ma++);
- }
- }
- break;
- case TIFF_SLONG:
- {
- int32* ma;
- int16* mb;
- uint32 n;
- ma=(int32*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong((uint32*)ma);
- err=TIFFReadDirEntryCheckRangeSshortSlong(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(int16)(*ma++);
- }
- }
- break;
- case TIFF_LONG8:
- {
- uint64* ma;
- int16* mb;
- uint32 n;
- ma=(uint64*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8(ma);
- err=TIFFReadDirEntryCheckRangeSshortLong8(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(int16)(*ma++);
- }
- }
- break;
- case TIFF_SLONG8:
- {
- int64* ma;
- int16* mb;
- uint32 n;
- ma=(int64*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8((uint64*)ma);
- err=TIFFReadDirEntryCheckRangeSshortSlong8(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(int16)(*ma++);
- }
- }
- break;
- }
- _TIFFfree(origdata);
- if (err!=TIFFReadDirEntryErrOk)
- {
- _TIFFfree(data);
- return(err);
- }
- *value=data;
- return(TIFFReadDirEntryErrOk);
+ enum TIFFReadDirEntryErr err;
+ uint32_t count;
+ void *origdata;
+ int16_t *data;
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ case TIFF_SBYTE:
+ case TIFF_SHORT:
+ case TIFF_SSHORT:
+ case TIFF_LONG:
+ case TIFF_SLONG:
+ case TIFF_LONG8:
+ case TIFF_SLONG8:
+ break;
+ default:
+ return (TIFFReadDirEntryErrType);
+ }
+ err = TIFFReadDirEntryArray(tif, direntry, &count, 2, &origdata);
+ if ((err != TIFFReadDirEntryErrOk) || (origdata == 0))
+ {
+ *value = 0;
+ return (err);
+ }
+ switch (direntry->tdir_type)
+ {
+ case TIFF_SHORT:
+ {
+ uint16_t *m;
+ uint32_t n;
+ m = (uint16_t *)origdata;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(m);
+ err = TIFFReadDirEntryCheckRangeSshortShort(*m);
+ if (err != TIFFReadDirEntryErrOk)
+ {
+ _TIFFfreeExt(tif, origdata);
+ return (err);
+ }
+ m++;
+ }
+ *value = (int16_t *)origdata;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SSHORT:
+ *value = (int16_t *)origdata;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfShort((uint16_t *)(*value), count);
+ return (TIFFReadDirEntryErrOk);
+ }
+ data = (int16_t *)_TIFFmallocExt(tif, count * 2);
+ if (data == 0)
+ {
+ _TIFFfreeExt(tif, origdata);
+ return (TIFFReadDirEntryErrAlloc);
+ }
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ {
+ uint8_t *ma;
+ int16_t *mb;
+ uint32_t n;
+ ma = (uint8_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ *mb++ = (int16_t)(*ma++);
+ }
+ break;
+ case TIFF_SBYTE:
+ {
+ int8_t *ma;
+ int16_t *mb;
+ uint32_t n;
+ ma = (int8_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ *mb++ = (int16_t)(*ma++);
+ }
+ break;
+ case TIFF_LONG:
+ {
+ uint32_t *ma;
+ int16_t *mb;
+ uint32_t n;
+ ma = (uint32_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(ma);
+ err = TIFFReadDirEntryCheckRangeSshortLong(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (int16_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_SLONG:
+ {
+ int32_t *ma;
+ int16_t *mb;
+ uint32_t n;
+ ma = (int32_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong((uint32_t *)ma);
+ err = TIFFReadDirEntryCheckRangeSshortSlong(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (int16_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_LONG8:
+ {
+ uint64_t *ma;
+ int16_t *mb;
+ uint32_t n;
+ ma = (uint64_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(ma);
+ err = TIFFReadDirEntryCheckRangeSshortLong8(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (int16_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_SLONG8:
+ {
+ int64_t *ma;
+ int16_t *mb;
+ uint32_t n;
+ ma = (int64_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8((uint64_t *)ma);
+ err = TIFFReadDirEntryCheckRangeSshortSlong8(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (int16_t)(*ma++);
+ }
+ }
+ break;
+ }
+ _TIFFfreeExt(tif, origdata);
+ if (err != TIFFReadDirEntryErrOk)
+ {
+ _TIFFfreeExt(tif, data);
+ return (err);
+ }
+ *value = data;
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryLongArray(TIFF* tif, TIFFDirEntry* direntry, uint32** value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryLongArray(TIFF *tif, TIFFDirEntry *direntry, uint32_t **value)
{
- enum TIFFReadDirEntryErr err;
- uint32 count;
- void* origdata;
- uint32* data;
- switch (direntry->tdir_type)
- {
- case TIFF_BYTE:
- case TIFF_SBYTE:
- case TIFF_SHORT:
- case TIFF_SSHORT:
- case TIFF_LONG:
- case TIFF_SLONG:
- case TIFF_LONG8:
- case TIFF_SLONG8:
- break;
- default:
- return(TIFFReadDirEntryErrType);
- }
- err=TIFFReadDirEntryArray(tif,direntry,&count,4,&origdata);
- if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
- {
- *value=0;
- return(err);
- }
- switch (direntry->tdir_type)
- {
- case TIFF_LONG:
- *value=(uint32*)origdata;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong(*value,count);
- return(TIFFReadDirEntryErrOk);
- case TIFF_SLONG:
- {
- int32* m;
- uint32 n;
- m=(int32*)origdata;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong((uint32*)m);
- err=TIFFReadDirEntryCheckRangeLongSlong(*m);
- if (err!=TIFFReadDirEntryErrOk)
- {
- _TIFFfree(origdata);
- return(err);
- }
- m++;
- }
- *value=(uint32*)origdata;
- return(TIFFReadDirEntryErrOk);
- }
- }
- data=(uint32*)_TIFFmalloc(count*4);
- if (data==0)
- {
- _TIFFfree(origdata);
- return(TIFFReadDirEntryErrAlloc);
- }
- switch (direntry->tdir_type)
- {
- case TIFF_BYTE:
- {
- uint8* ma;
- uint32* mb;
- uint32 n;
- ma=(uint8*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- *mb++=(uint32)(*ma++);
- }
- break;
- case TIFF_SBYTE:
- {
- int8* ma;
- uint32* mb;
- uint32 n;
- ma=(int8*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- err=TIFFReadDirEntryCheckRangeLongSbyte(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(uint32)(*ma++);
- }
- }
- break;
- case TIFF_SHORT:
- {
- uint16* ma;
- uint32* mb;
- uint32 n;
- ma=(uint16*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort(ma);
- *mb++=(uint32)(*ma++);
- }
- }
- break;
- case TIFF_SSHORT:
- {
- int16* ma;
- uint32* mb;
- uint32 n;
- ma=(int16*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort((uint16*)ma);
- err=TIFFReadDirEntryCheckRangeLongSshort(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(uint32)(*ma++);
- }
- }
- break;
- case TIFF_LONG8:
- {
- uint64* ma;
- uint32* mb;
- uint32 n;
- ma=(uint64*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8(ma);
- err=TIFFReadDirEntryCheckRangeLongLong8(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(uint32)(*ma++);
- }
- }
- break;
- case TIFF_SLONG8:
- {
- int64* ma;
- uint32* mb;
- uint32 n;
- ma=(int64*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8((uint64*)ma);
- err=TIFFReadDirEntryCheckRangeLongSlong8(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(uint32)(*ma++);
- }
- }
- break;
- }
- _TIFFfree(origdata);
- if (err!=TIFFReadDirEntryErrOk)
- {
- _TIFFfree(data);
- return(err);
- }
- *value=data;
- return(TIFFReadDirEntryErrOk);
+ enum TIFFReadDirEntryErr err;
+ uint32_t count;
+ void *origdata;
+ uint32_t *data;
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ case TIFF_SBYTE:
+ case TIFF_SHORT:
+ case TIFF_SSHORT:
+ case TIFF_LONG:
+ case TIFF_SLONG:
+ case TIFF_LONG8:
+ case TIFF_SLONG8:
+ break;
+ default:
+ return (TIFFReadDirEntryErrType);
+ }
+ err = TIFFReadDirEntryArray(tif, direntry, &count, 4, &origdata);
+ if ((err != TIFFReadDirEntryErrOk) || (origdata == 0))
+ {
+ *value = 0;
+ return (err);
+ }
+ switch (direntry->tdir_type)
+ {
+ case TIFF_LONG:
+ *value = (uint32_t *)origdata;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfLong(*value, count);
+ return (TIFFReadDirEntryErrOk);
+ case TIFF_SLONG:
+ {
+ int32_t *m;
+ uint32_t n;
+ m = (int32_t *)origdata;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong((uint32_t *)m);
+ err = TIFFReadDirEntryCheckRangeLongSlong(*m);
+ if (err != TIFFReadDirEntryErrOk)
+ {
+ _TIFFfreeExt(tif, origdata);
+ return (err);
+ }
+ m++;
+ }
+ *value = (uint32_t *)origdata;
+ return (TIFFReadDirEntryErrOk);
+ }
+ }
+ data = (uint32_t *)_TIFFmallocExt(tif, count * 4);
+ if (data == 0)
+ {
+ _TIFFfreeExt(tif, origdata);
+ return (TIFFReadDirEntryErrAlloc);
+ }
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ {
+ uint8_t *ma;
+ uint32_t *mb;
+ uint32_t n;
+ ma = (uint8_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ *mb++ = (uint32_t)(*ma++);
+ }
+ break;
+ case TIFF_SBYTE:
+ {
+ int8_t *ma;
+ uint32_t *mb;
+ uint32_t n;
+ ma = (int8_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ err = TIFFReadDirEntryCheckRangeLongSbyte(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (uint32_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_SHORT:
+ {
+ uint16_t *ma;
+ uint32_t *mb;
+ uint32_t n;
+ ma = (uint16_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(ma);
+ *mb++ = (uint32_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_SSHORT:
+ {
+ int16_t *ma;
+ uint32_t *mb;
+ uint32_t n;
+ ma = (int16_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort((uint16_t *)ma);
+ err = TIFFReadDirEntryCheckRangeLongSshort(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (uint32_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_LONG8:
+ {
+ uint64_t *ma;
+ uint32_t *mb;
+ uint32_t n;
+ ma = (uint64_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(ma);
+ err = TIFFReadDirEntryCheckRangeLongLong8(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (uint32_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_SLONG8:
+ {
+ int64_t *ma;
+ uint32_t *mb;
+ uint32_t n;
+ ma = (int64_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8((uint64_t *)ma);
+ err = TIFFReadDirEntryCheckRangeLongSlong8(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (uint32_t)(*ma++);
+ }
+ }
+ break;
+ }
+ _TIFFfreeExt(tif, origdata);
+ if (err != TIFFReadDirEntryErrOk)
+ {
+ _TIFFfreeExt(tif, data);
+ return (err);
+ }
+ *value = data;
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntrySlongArray(TIFF* tif, TIFFDirEntry* direntry, int32** value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntrySlongArray(TIFF *tif, TIFFDirEntry *direntry, int32_t **value)
{
- enum TIFFReadDirEntryErr err;
- uint32 count;
- void* origdata;
- int32* data;
- switch (direntry->tdir_type)
- {
- case TIFF_BYTE:
- case TIFF_SBYTE:
- case TIFF_SHORT:
- case TIFF_SSHORT:
- case TIFF_LONG:
- case TIFF_SLONG:
- case TIFF_LONG8:
- case TIFF_SLONG8:
- break;
- default:
- return(TIFFReadDirEntryErrType);
- }
- err=TIFFReadDirEntryArray(tif,direntry,&count,4,&origdata);
- if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
- {
- *value=0;
- return(err);
- }
- switch (direntry->tdir_type)
- {
- case TIFF_LONG:
- {
- uint32* m;
- uint32 n;
- m=(uint32*)origdata;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong((uint32*)m);
- err=TIFFReadDirEntryCheckRangeSlongLong(*m);
- if (err!=TIFFReadDirEntryErrOk)
- {
- _TIFFfree(origdata);
- return(err);
- }
- m++;
- }
- *value=(int32*)origdata;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SLONG:
- *value=(int32*)origdata;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong((uint32*)(*value),count);
- return(TIFFReadDirEntryErrOk);
- }
- data=(int32*)_TIFFmalloc(count*4);
- if (data==0)
- {
- _TIFFfree(origdata);
- return(TIFFReadDirEntryErrAlloc);
- }
- switch (direntry->tdir_type)
- {
- case TIFF_BYTE:
- {
- uint8* ma;
- int32* mb;
- uint32 n;
- ma=(uint8*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- *mb++=(int32)(*ma++);
- }
- break;
- case TIFF_SBYTE:
- {
- int8* ma;
- int32* mb;
- uint32 n;
- ma=(int8*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- *mb++=(int32)(*ma++);
- }
- break;
- case TIFF_SHORT:
- {
- uint16* ma;
- int32* mb;
- uint32 n;
- ma=(uint16*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort(ma);
- *mb++=(int32)(*ma++);
- }
- }
- break;
- case TIFF_SSHORT:
- {
- int16* ma;
- int32* mb;
- uint32 n;
- ma=(int16*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort((uint16*)ma);
- *mb++=(int32)(*ma++);
- }
- }
- break;
- case TIFF_LONG8:
- {
- uint64* ma;
- int32* mb;
- uint32 n;
- ma=(uint64*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8(ma);
- err=TIFFReadDirEntryCheckRangeSlongLong8(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(int32)(*ma++);
- }
- }
- break;
- case TIFF_SLONG8:
- {
- int64* ma;
- int32* mb;
- uint32 n;
- ma=(int64*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8((uint64*)ma);
- err=TIFFReadDirEntryCheckRangeSlongSlong8(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(int32)(*ma++);
- }
- }
- break;
- }
- _TIFFfree(origdata);
- if (err!=TIFFReadDirEntryErrOk)
- {
- _TIFFfree(data);
- return(err);
- }
- *value=data;
- return(TIFFReadDirEntryErrOk);
+ enum TIFFReadDirEntryErr err;
+ uint32_t count;
+ void *origdata;
+ int32_t *data;
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ case TIFF_SBYTE:
+ case TIFF_SHORT:
+ case TIFF_SSHORT:
+ case TIFF_LONG:
+ case TIFF_SLONG:
+ case TIFF_LONG8:
+ case TIFF_SLONG8:
+ break;
+ default:
+ return (TIFFReadDirEntryErrType);
+ }
+ err = TIFFReadDirEntryArray(tif, direntry, &count, 4, &origdata);
+ if ((err != TIFFReadDirEntryErrOk) || (origdata == 0))
+ {
+ *value = 0;
+ return (err);
+ }
+ switch (direntry->tdir_type)
+ {
+ case TIFF_LONG:
+ {
+ uint32_t *m;
+ uint32_t n;
+ m = (uint32_t *)origdata;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong((uint32_t *)m);
+ err = TIFFReadDirEntryCheckRangeSlongLong(*m);
+ if (err != TIFFReadDirEntryErrOk)
+ {
+ _TIFFfreeExt(tif, origdata);
+ return (err);
+ }
+ m++;
+ }
+ *value = (int32_t *)origdata;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SLONG:
+ *value = (int32_t *)origdata;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfLong((uint32_t *)(*value), count);
+ return (TIFFReadDirEntryErrOk);
+ }
+ data = (int32_t *)_TIFFmallocExt(tif, count * 4);
+ if (data == 0)
+ {
+ _TIFFfreeExt(tif, origdata);
+ return (TIFFReadDirEntryErrAlloc);
+ }
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ {
+ uint8_t *ma;
+ int32_t *mb;
+ uint32_t n;
+ ma = (uint8_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ *mb++ = (int32_t)(*ma++);
+ }
+ break;
+ case TIFF_SBYTE:
+ {
+ int8_t *ma;
+ int32_t *mb;
+ uint32_t n;
+ ma = (int8_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ *mb++ = (int32_t)(*ma++);
+ }
+ break;
+ case TIFF_SHORT:
+ {
+ uint16_t *ma;
+ int32_t *mb;
+ uint32_t n;
+ ma = (uint16_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(ma);
+ *mb++ = (int32_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_SSHORT:
+ {
+ int16_t *ma;
+ int32_t *mb;
+ uint32_t n;
+ ma = (int16_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort((uint16_t *)ma);
+ *mb++ = (int32_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_LONG8:
+ {
+ uint64_t *ma;
+ int32_t *mb;
+ uint32_t n;
+ ma = (uint64_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(ma);
+ err = TIFFReadDirEntryCheckRangeSlongLong8(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (int32_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_SLONG8:
+ {
+ int64_t *ma;
+ int32_t *mb;
+ uint32_t n;
+ ma = (int64_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8((uint64_t *)ma);
+ err = TIFFReadDirEntryCheckRangeSlongSlong8(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (int32_t)(*ma++);
+ }
+ }
+ break;
+ }
+ _TIFFfreeExt(tif, origdata);
+ if (err != TIFFReadDirEntryErrOk)
+ {
+ _TIFFfreeExt(tif, data);
+ return (err);
+ }
+ *value = data;
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryLong8ArrayWithLimit(
- TIFF* tif, TIFFDirEntry* direntry, uint64** value, uint64 maxcount)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryLong8ArrayWithLimit(TIFF *tif, TIFFDirEntry *direntry,
+ uint64_t **value, uint64_t maxcount)
{
- enum TIFFReadDirEntryErr err;
- uint32 count;
- void* origdata;
- uint64* data;
- switch (direntry->tdir_type)
- {
- case TIFF_BYTE:
- case TIFF_SBYTE:
- case TIFF_SHORT:
- case TIFF_SSHORT:
- case TIFF_LONG:
- case TIFF_SLONG:
- case TIFF_LONG8:
- case TIFF_SLONG8:
- break;
- default:
- return(TIFFReadDirEntryErrType);
- }
- err=TIFFReadDirEntryArrayWithLimit(tif,direntry,&count,8,&origdata,maxcount);
- if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
- {
- *value=0;
- return(err);
- }
- switch (direntry->tdir_type)
- {
- case TIFF_LONG8:
- *value=(uint64*)origdata;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong8(*value,count);
- return(TIFFReadDirEntryErrOk);
- case TIFF_SLONG8:
- {
- int64* m;
- uint32 n;
- m=(int64*)origdata;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8((uint64*)m);
- err=TIFFReadDirEntryCheckRangeLong8Slong8(*m);
- if (err!=TIFFReadDirEntryErrOk)
- {
- _TIFFfree(origdata);
- return(err);
- }
- m++;
- }
- *value=(uint64*)origdata;
- return(TIFFReadDirEntryErrOk);
- }
- }
- data=(uint64*)_TIFFmalloc(count*8);
- if (data==0)
- {
- _TIFFfree(origdata);
- return(TIFFReadDirEntryErrAlloc);
- }
- switch (direntry->tdir_type)
- {
- case TIFF_BYTE:
- {
- uint8* ma;
- uint64* mb;
- uint32 n;
- ma=(uint8*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- *mb++=(uint64)(*ma++);
- }
- break;
- case TIFF_SBYTE:
- {
- int8* ma;
- uint64* mb;
- uint32 n;
- ma=(int8*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- err=TIFFReadDirEntryCheckRangeLong8Sbyte(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(uint64)(*ma++);
- }
- }
- break;
- case TIFF_SHORT:
- {
- uint16* ma;
- uint64* mb;
- uint32 n;
- ma=(uint16*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort(ma);
- *mb++=(uint64)(*ma++);
- }
- }
- break;
- case TIFF_SSHORT:
- {
- int16* ma;
- uint64* mb;
- uint32 n;
- ma=(int16*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort((uint16*)ma);
- err=TIFFReadDirEntryCheckRangeLong8Sshort(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(uint64)(*ma++);
- }
- }
- break;
- case TIFF_LONG:
- {
- uint32* ma;
- uint64* mb;
- uint32 n;
- ma=(uint32*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(ma);
- *mb++=(uint64)(*ma++);
- }
- }
- break;
- case TIFF_SLONG:
- {
- int32* ma;
- uint64* mb;
- uint32 n;
- ma=(int32*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong((uint32*)ma);
- err=TIFFReadDirEntryCheckRangeLong8Slong(*ma);
- if (err!=TIFFReadDirEntryErrOk)
- break;
- *mb++=(uint64)(*ma++);
- }
- }
- break;
- }
- _TIFFfree(origdata);
- if (err!=TIFFReadDirEntryErrOk)
- {
- _TIFFfree(data);
- return(err);
- }
- *value=data;
- return(TIFFReadDirEntryErrOk);
+ enum TIFFReadDirEntryErr err;
+ uint32_t count;
+ void *origdata;
+ uint64_t *data;
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ case TIFF_SBYTE:
+ case TIFF_SHORT:
+ case TIFF_SSHORT:
+ case TIFF_LONG:
+ case TIFF_SLONG:
+ case TIFF_LONG8:
+ case TIFF_SLONG8:
+ break;
+ default:
+ return (TIFFReadDirEntryErrType);
+ }
+ err = TIFFReadDirEntryArrayWithLimit(tif, direntry, &count, 8, &origdata,
+ maxcount);
+ if ((err != TIFFReadDirEntryErrOk) || (origdata == 0))
+ {
+ *value = 0;
+ return (err);
+ }
+ switch (direntry->tdir_type)
+ {
+ case TIFF_LONG8:
+ *value = (uint64_t *)origdata;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfLong8(*value, count);
+ return (TIFFReadDirEntryErrOk);
+ case TIFF_SLONG8:
+ {
+ int64_t *m;
+ uint32_t n;
+ m = (int64_t *)origdata;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8((uint64_t *)m);
+ err = TIFFReadDirEntryCheckRangeLong8Slong8(*m);
+ if (err != TIFFReadDirEntryErrOk)
+ {
+ _TIFFfreeExt(tif, origdata);
+ return (err);
+ }
+ m++;
+ }
+ *value = (uint64_t *)origdata;
+ return (TIFFReadDirEntryErrOk);
+ }
+ }
+ data = (uint64_t *)_TIFFmallocExt(tif, count * 8);
+ if (data == 0)
+ {
+ _TIFFfreeExt(tif, origdata);
+ return (TIFFReadDirEntryErrAlloc);
+ }
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ {
+ uint8_t *ma;
+ uint64_t *mb;
+ uint32_t n;
+ ma = (uint8_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ *mb++ = (uint64_t)(*ma++);
+ }
+ break;
+ case TIFF_SBYTE:
+ {
+ int8_t *ma;
+ uint64_t *mb;
+ uint32_t n;
+ ma = (int8_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ err = TIFFReadDirEntryCheckRangeLong8Sbyte(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (uint64_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_SHORT:
+ {
+ uint16_t *ma;
+ uint64_t *mb;
+ uint32_t n;
+ ma = (uint16_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(ma);
+ *mb++ = (uint64_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_SSHORT:
+ {
+ int16_t *ma;
+ uint64_t *mb;
+ uint32_t n;
+ ma = (int16_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort((uint16_t *)ma);
+ err = TIFFReadDirEntryCheckRangeLong8Sshort(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (uint64_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_LONG:
+ {
+ uint32_t *ma;
+ uint64_t *mb;
+ uint32_t n;
+ ma = (uint32_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(ma);
+ *mb++ = (uint64_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_SLONG:
+ {
+ int32_t *ma;
+ uint64_t *mb;
+ uint32_t n;
+ ma = (int32_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong((uint32_t *)ma);
+ err = TIFFReadDirEntryCheckRangeLong8Slong(*ma);
+ if (err != TIFFReadDirEntryErrOk)
+ break;
+ *mb++ = (uint64_t)(*ma++);
+ }
+ }
+ break;
+ }
+ _TIFFfreeExt(tif, origdata);
+ if (err != TIFFReadDirEntryErrOk)
+ {
+ _TIFFfreeExt(tif, data);
+ return (err);
+ }
+ *value = data;
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryLong8Array(TIFF* tif, TIFFDirEntry* direntry, uint64** value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryLong8Array(TIFF *tif, TIFFDirEntry *direntry, uint64_t **value)
{
- return TIFFReadDirEntryLong8ArrayWithLimit(tif, direntry, value, ~((uint64)0));
+ return TIFFReadDirEntryLong8ArrayWithLimit(tif, direntry, value,
+ ~((uint64_t)0));
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntrySlong8Array(TIFF* tif, TIFFDirEntry* direntry, int64** value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntrySlong8Array(TIFF *tif, TIFFDirEntry *direntry, int64_t **value)
{
- enum TIFFReadDirEntryErr err;
- uint32 count;
- void* origdata;
- int64* data;
- switch (direntry->tdir_type)
- {
- case TIFF_BYTE:
- case TIFF_SBYTE:
- case TIFF_SHORT:
- case TIFF_SSHORT:
- case TIFF_LONG:
- case TIFF_SLONG:
- case TIFF_LONG8:
- case TIFF_SLONG8:
- break;
- default:
- return(TIFFReadDirEntryErrType);
- }
- err=TIFFReadDirEntryArray(tif,direntry,&count,8,&origdata);
- if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
- {
- *value=0;
- return(err);
- }
- switch (direntry->tdir_type)
- {
- case TIFF_LONG8:
- {
- uint64* m;
- uint32 n;
- m=(uint64*)origdata;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8(m);
- err=TIFFReadDirEntryCheckRangeSlong8Long8(*m);
- if (err!=TIFFReadDirEntryErrOk)
- {
- _TIFFfree(origdata);
- return(err);
- }
- m++;
- }
- *value=(int64*)origdata;
- return(TIFFReadDirEntryErrOk);
- }
- case TIFF_SLONG8:
- *value=(int64*)origdata;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong8((uint64*)(*value),count);
- return(TIFFReadDirEntryErrOk);
- }
- data=(int64*)_TIFFmalloc(count*8);
- if (data==0)
- {
- _TIFFfree(origdata);
- return(TIFFReadDirEntryErrAlloc);
- }
- switch (direntry->tdir_type)
- {
- case TIFF_BYTE:
- {
- uint8* ma;
- int64* mb;
- uint32 n;
- ma=(uint8*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- *mb++=(int64)(*ma++);
- }
- break;
- case TIFF_SBYTE:
- {
- int8* ma;
- int64* mb;
- uint32 n;
- ma=(int8*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- *mb++=(int64)(*ma++);
- }
- break;
- case TIFF_SHORT:
- {
- uint16* ma;
- int64* mb;
- uint32 n;
- ma=(uint16*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort(ma);
- *mb++=(int64)(*ma++);
- }
- }
- break;
- case TIFF_SSHORT:
- {
- int16* ma;
- int64* mb;
- uint32 n;
- ma=(int16*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort((uint16*)ma);
- *mb++=(int64)(*ma++);
- }
- }
- break;
- case TIFF_LONG:
- {
- uint32* ma;
- int64* mb;
- uint32 n;
- ma=(uint32*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(ma);
- *mb++=(int64)(*ma++);
- }
- }
- break;
- case TIFF_SLONG:
- {
- int32* ma;
- int64* mb;
- uint32 n;
- ma=(int32*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong((uint32*)ma);
- *mb++=(int64)(*ma++);
- }
- }
- break;
- }
- _TIFFfree(origdata);
- *value=data;
- return(TIFFReadDirEntryErrOk);
+ enum TIFFReadDirEntryErr err;
+ uint32_t count;
+ void *origdata;
+ int64_t *data;
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ case TIFF_SBYTE:
+ case TIFF_SHORT:
+ case TIFF_SSHORT:
+ case TIFF_LONG:
+ case TIFF_SLONG:
+ case TIFF_LONG8:
+ case TIFF_SLONG8:
+ break;
+ default:
+ return (TIFFReadDirEntryErrType);
+ }
+ err = TIFFReadDirEntryArray(tif, direntry, &count, 8, &origdata);
+ if ((err != TIFFReadDirEntryErrOk) || (origdata == 0))
+ {
+ *value = 0;
+ return (err);
+ }
+ switch (direntry->tdir_type)
+ {
+ case TIFF_LONG8:
+ {
+ uint64_t *m;
+ uint32_t n;
+ m = (uint64_t *)origdata;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(m);
+ err = TIFFReadDirEntryCheckRangeSlong8Long8(*m);
+ if (err != TIFFReadDirEntryErrOk)
+ {
+ _TIFFfreeExt(tif, origdata);
+ return (err);
+ }
+ m++;
+ }
+ *value = (int64_t *)origdata;
+ return (TIFFReadDirEntryErrOk);
+ }
+ case TIFF_SLONG8:
+ *value = (int64_t *)origdata;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfLong8((uint64_t *)(*value), count);
+ return (TIFFReadDirEntryErrOk);
+ }
+ data = (int64_t *)_TIFFmallocExt(tif, count * 8);
+ if (data == 0)
+ {
+ _TIFFfreeExt(tif, origdata);
+ return (TIFFReadDirEntryErrAlloc);
+ }
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ {
+ uint8_t *ma;
+ int64_t *mb;
+ uint32_t n;
+ ma = (uint8_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ *mb++ = (int64_t)(*ma++);
+ }
+ break;
+ case TIFF_SBYTE:
+ {
+ int8_t *ma;
+ int64_t *mb;
+ uint32_t n;
+ ma = (int8_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ *mb++ = (int64_t)(*ma++);
+ }
+ break;
+ case TIFF_SHORT:
+ {
+ uint16_t *ma;
+ int64_t *mb;
+ uint32_t n;
+ ma = (uint16_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(ma);
+ *mb++ = (int64_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_SSHORT:
+ {
+ int16_t *ma;
+ int64_t *mb;
+ uint32_t n;
+ ma = (int16_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort((uint16_t *)ma);
+ *mb++ = (int64_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_LONG:
+ {
+ uint32_t *ma;
+ int64_t *mb;
+ uint32_t n;
+ ma = (uint32_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(ma);
+ *mb++ = (int64_t)(*ma++);
+ }
+ }
+ break;
+ case TIFF_SLONG:
+ {
+ int32_t *ma;
+ int64_t *mb;
+ uint32_t n;
+ ma = (int32_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong((uint32_t *)ma);
+ *mb++ = (int64_t)(*ma++);
+ }
+ }
+ break;
+ }
+ _TIFFfreeExt(tif, origdata);
+ *value = data;
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryFloatArray(TIFF* tif, TIFFDirEntry* direntry, float** value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryFloatArray(TIFF *tif, TIFFDirEntry *direntry, float **value)
{
- enum TIFFReadDirEntryErr err;
- uint32 count;
- void* origdata;
- float* data;
- switch (direntry->tdir_type)
- {
- case TIFF_BYTE:
- case TIFF_SBYTE:
- case TIFF_SHORT:
- case TIFF_SSHORT:
- case TIFF_LONG:
- case TIFF_SLONG:
- case TIFF_LONG8:
- case TIFF_SLONG8:
- case TIFF_RATIONAL:
- case TIFF_SRATIONAL:
- case TIFF_FLOAT:
- case TIFF_DOUBLE:
- break;
- default:
- return(TIFFReadDirEntryErrType);
- }
- err=TIFFReadDirEntryArray(tif,direntry,&count,4,&origdata);
- if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
- {
- *value=0;
- return(err);
- }
- switch (direntry->tdir_type)
- {
- case TIFF_FLOAT:
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong((uint32*)origdata,count);
- TIFFCvtIEEEDoubleToNative(tif,count,(float*)origdata);
- *value=(float*)origdata;
- return(TIFFReadDirEntryErrOk);
- }
- data=(float*)_TIFFmalloc(count*sizeof(float));
- if (data==0)
- {
- _TIFFfree(origdata);
- return(TIFFReadDirEntryErrAlloc);
- }
- switch (direntry->tdir_type)
- {
- case TIFF_BYTE:
- {
- uint8* ma;
- float* mb;
- uint32 n;
- ma=(uint8*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- *mb++=(float)(*ma++);
- }
- break;
- case TIFF_SBYTE:
- {
- int8* ma;
- float* mb;
- uint32 n;
- ma=(int8*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- *mb++=(float)(*ma++);
- }
- break;
- case TIFF_SHORT:
- {
- uint16* ma;
- float* mb;
- uint32 n;
- ma=(uint16*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort(ma);
- *mb++=(float)(*ma++);
- }
- }
- break;
- case TIFF_SSHORT:
- {
- int16* ma;
- float* mb;
- uint32 n;
- ma=(int16*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort((uint16*)ma);
- *mb++=(float)(*ma++);
- }
- }
- break;
- case TIFF_LONG:
- {
- uint32* ma;
- float* mb;
- uint32 n;
- ma=(uint32*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(ma);
- *mb++=(float)(*ma++);
- }
- }
- break;
- case TIFF_SLONG:
- {
- int32* ma;
- float* mb;
- uint32 n;
- ma=(int32*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong((uint32*)ma);
- *mb++=(float)(*ma++);
- }
- }
- break;
- case TIFF_LONG8:
- {
- uint64* ma;
- float* mb;
- uint32 n;
- ma=(uint64*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8(ma);
+ enum TIFFReadDirEntryErr err;
+ uint32_t count;
+ void *origdata;
+ float *data;
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ case TIFF_SBYTE:
+ case TIFF_SHORT:
+ case TIFF_SSHORT:
+ case TIFF_LONG:
+ case TIFF_SLONG:
+ case TIFF_LONG8:
+ case TIFF_SLONG8:
+ case TIFF_RATIONAL:
+ case TIFF_SRATIONAL:
+ case TIFF_FLOAT:
+ case TIFF_DOUBLE:
+ break;
+ default:
+ return (TIFFReadDirEntryErrType);
+ }
+ err = TIFFReadDirEntryArray(tif, direntry, &count, 4, &origdata);
+ if ((err != TIFFReadDirEntryErrOk) || (origdata == 0))
+ {
+ *value = 0;
+ return (err);
+ }
+ switch (direntry->tdir_type)
+ {
+ case TIFF_FLOAT:
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfLong((uint32_t *)origdata, count);
+ TIFFCvtIEEEDoubleToNative(tif, count, (float *)origdata);
+ *value = (float *)origdata;
+ return (TIFFReadDirEntryErrOk);
+ }
+ data = (float *)_TIFFmallocExt(tif, count * sizeof(float));
+ if (data == 0)
+ {
+ _TIFFfreeExt(tif, origdata);
+ return (TIFFReadDirEntryErrAlloc);
+ }
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ {
+ uint8_t *ma;
+ float *mb;
+ uint32_t n;
+ ma = (uint8_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ *mb++ = (float)(*ma++);
+ }
+ break;
+ case TIFF_SBYTE:
+ {
+ int8_t *ma;
+ float *mb;
+ uint32_t n;
+ ma = (int8_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ *mb++ = (float)(*ma++);
+ }
+ break;
+ case TIFF_SHORT:
+ {
+ uint16_t *ma;
+ float *mb;
+ uint32_t n;
+ ma = (uint16_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(ma);
+ *mb++ = (float)(*ma++);
+ }
+ }
+ break;
+ case TIFF_SSHORT:
+ {
+ int16_t *ma;
+ float *mb;
+ uint32_t n;
+ ma = (int16_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort((uint16_t *)ma);
+ *mb++ = (float)(*ma++);
+ }
+ }
+ break;
+ case TIFF_LONG:
+ {
+ uint32_t *ma;
+ float *mb;
+ uint32_t n;
+ ma = (uint32_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(ma);
+ *mb++ = (float)(*ma++);
+ }
+ }
+ break;
+ case TIFF_SLONG:
+ {
+ int32_t *ma;
+ float *mb;
+ uint32_t n;
+ ma = (int32_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong((uint32_t *)ma);
+ *mb++ = (float)(*ma++);
+ }
+ }
+ break;
+ case TIFF_LONG8:
+ {
+ uint64_t *ma;
+ float *mb;
+ uint32_t n;
+ ma = (uint64_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(ma);
#if defined(__WIN32__) && (_MSC_VER < 1500)
- /*
- * XXX: MSVC 6.0 does not support
- * conversion of 64-bit integers into
- * floating point values.
- */
- *mb++ = _TIFFUInt64ToFloat(*ma++);
+ /*
+ * XXX: MSVC 6.0 does not support
+ * conversion of 64-bit integers into
+ * floating point values.
+ */
+ *mb++ = _TIFFUInt64ToFloat(*ma++);
#else
- *mb++ = (float)(*ma++);
+ *mb++ = (float)(*ma++);
#endif
- }
- }
- break;
- case TIFF_SLONG8:
- {
- int64* ma;
- float* mb;
- uint32 n;
- ma=(int64*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8((uint64*)ma);
- *mb++=(float)(*ma++);
- }
- }
- break;
- case TIFF_RATIONAL:
- {
- uint32* ma;
- uint32 maa;
- uint32 mab;
- float* mb;
- uint32 n;
- ma=(uint32*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(ma);
- maa=*ma++;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(ma);
- mab=*ma++;
- if (mab==0)
- *mb++=0.0;
- else
- *mb++=(float)maa/(float)mab;
- }
- }
- break;
- case TIFF_SRATIONAL:
- {
- uint32* ma;
- int32 maa;
- uint32 mab;
- float* mb;
- uint32 n;
- ma=(uint32*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(ma);
- maa=*(int32*)ma;
- ma++;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(ma);
- mab=*ma++;
- if (mab==0)
- *mb++=0.0;
- else
- *mb++=(float)maa/(float)mab;
- }
- }
- break;
- case TIFF_DOUBLE:
- {
- double* ma;
- float* mb;
- uint32 n;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong8((uint64*)origdata,count);
- TIFFCvtIEEEDoubleToNative(tif,count,(double*)origdata);
- ma=(double*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- double val = *ma++;
- if( val > FLT_MAX )
- val = FLT_MAX;
- else if( val < -FLT_MAX )
- val = -FLT_MAX;
- *mb++=(float)val;
- }
- }
- break;
- }
- _TIFFfree(origdata);
- *value=data;
- return(TIFFReadDirEntryErrOk);
+ }
+ }
+ break;
+ case TIFF_SLONG8:
+ {
+ int64_t *ma;
+ float *mb;
+ uint32_t n;
+ ma = (int64_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8((uint64_t *)ma);
+ *mb++ = (float)(*ma++);
+ }
+ }
+ break;
+ case TIFF_RATIONAL:
+ {
+ uint32_t *ma;
+ uint32_t maa;
+ uint32_t mab;
+ float *mb;
+ uint32_t n;
+ ma = (uint32_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(ma);
+ maa = *ma++;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(ma);
+ mab = *ma++;
+ if (mab == 0)
+ *mb++ = 0.0;
+ else
+ *mb++ = (float)maa / (float)mab;
+ }
+ }
+ break;
+ case TIFF_SRATIONAL:
+ {
+ uint32_t *ma;
+ int32_t maa;
+ uint32_t mab;
+ float *mb;
+ uint32_t n;
+ ma = (uint32_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(ma);
+ maa = *(int32_t *)ma;
+ ma++;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(ma);
+ mab = *ma++;
+ if (mab == 0)
+ *mb++ = 0.0;
+ else
+ *mb++ = (float)maa / (float)mab;
+ }
+ }
+ break;
+ case TIFF_DOUBLE:
+ {
+ double *ma;
+ float *mb;
+ uint32_t n;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfLong8((uint64_t *)origdata, count);
+ TIFFCvtIEEEDoubleToNative(tif, count, (double *)origdata);
+ ma = (double *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ double val = *ma++;
+ if (val > FLT_MAX)
+ val = FLT_MAX;
+ else if (val < -FLT_MAX)
+ val = -FLT_MAX;
+ *mb++ = (float)val;
+ }
+ }
+ break;
+ }
+ _TIFFfreeExt(tif, origdata);
+ *value = data;
+ return (TIFFReadDirEntryErrOk);
}
static enum TIFFReadDirEntryErr
-TIFFReadDirEntryDoubleArray(TIFF* tif, TIFFDirEntry* direntry, double** value)
+TIFFReadDirEntryDoubleArray(TIFF *tif, TIFFDirEntry *direntry, double **value)
{
- enum TIFFReadDirEntryErr err;
- uint32 count;
- void* origdata;
- double* data;
- switch (direntry->tdir_type)
- {
- case TIFF_BYTE:
- case TIFF_SBYTE:
- case TIFF_SHORT:
- case TIFF_SSHORT:
- case TIFF_LONG:
- case TIFF_SLONG:
- case TIFF_LONG8:
- case TIFF_SLONG8:
- case TIFF_RATIONAL:
- case TIFF_SRATIONAL:
- case TIFF_FLOAT:
- case TIFF_DOUBLE:
- break;
- default:
- return(TIFFReadDirEntryErrType);
- }
- err=TIFFReadDirEntryArray(tif,direntry,&count,8,&origdata);
- if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
- {
- *value=0;
- return(err);
- }
- switch (direntry->tdir_type)
- {
- case TIFF_DOUBLE:
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong8((uint64*)origdata,count);
- TIFFCvtIEEEDoubleToNative(tif,count,(double*)origdata);
- *value=(double*)origdata;
- return(TIFFReadDirEntryErrOk);
- }
- data=(double*)_TIFFmalloc(count*sizeof(double));
- if (data==0)
- {
- _TIFFfree(origdata);
- return(TIFFReadDirEntryErrAlloc);
- }
- switch (direntry->tdir_type)
- {
- case TIFF_BYTE:
- {
- uint8* ma;
- double* mb;
- uint32 n;
- ma=(uint8*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- *mb++=(double)(*ma++);
- }
- break;
- case TIFF_SBYTE:
- {
- int8* ma;
- double* mb;
- uint32 n;
- ma=(int8*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- *mb++=(double)(*ma++);
- }
- break;
- case TIFF_SHORT:
- {
- uint16* ma;
- double* mb;
- uint32 n;
- ma=(uint16*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort(ma);
- *mb++=(double)(*ma++);
- }
- }
- break;
- case TIFF_SSHORT:
- {
- int16* ma;
- double* mb;
- uint32 n;
- ma=(int16*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort((uint16*)ma);
- *mb++=(double)(*ma++);
- }
- }
- break;
- case TIFF_LONG:
- {
- uint32* ma;
- double* mb;
- uint32 n;
- ma=(uint32*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(ma);
- *mb++=(double)(*ma++);
- }
- }
- break;
- case TIFF_SLONG:
- {
- int32* ma;
- double* mb;
- uint32 n;
- ma=(int32*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong((uint32*)ma);
- *mb++=(double)(*ma++);
- }
- }
- break;
- case TIFF_LONG8:
- {
- uint64* ma;
- double* mb;
- uint32 n;
- ma=(uint64*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8(ma);
+ enum TIFFReadDirEntryErr err;
+ uint32_t count;
+ void *origdata;
+ double *data;
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ case TIFF_SBYTE:
+ case TIFF_SHORT:
+ case TIFF_SSHORT:
+ case TIFF_LONG:
+ case TIFF_SLONG:
+ case TIFF_LONG8:
+ case TIFF_SLONG8:
+ case TIFF_RATIONAL:
+ case TIFF_SRATIONAL:
+ case TIFF_FLOAT:
+ case TIFF_DOUBLE:
+ break;
+ default:
+ return (TIFFReadDirEntryErrType);
+ }
+ err = TIFFReadDirEntryArray(tif, direntry, &count, 8, &origdata);
+ if ((err != TIFFReadDirEntryErrOk) || (origdata == 0))
+ {
+ *value = 0;
+ return (err);
+ }
+ switch (direntry->tdir_type)
+ {
+ case TIFF_DOUBLE:
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfLong8((uint64_t *)origdata, count);
+ TIFFCvtIEEEDoubleToNative(tif, count, (double *)origdata);
+ *value = (double *)origdata;
+ return (TIFFReadDirEntryErrOk);
+ }
+ data = (double *)_TIFFmallocExt(tif, count * sizeof(double));
+ if (data == 0)
+ {
+ _TIFFfreeExt(tif, origdata);
+ return (TIFFReadDirEntryErrAlloc);
+ }
+ switch (direntry->tdir_type)
+ {
+ case TIFF_BYTE:
+ {
+ uint8_t *ma;
+ double *mb;
+ uint32_t n;
+ ma = (uint8_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ *mb++ = (double)(*ma++);
+ }
+ break;
+ case TIFF_SBYTE:
+ {
+ int8_t *ma;
+ double *mb;
+ uint32_t n;
+ ma = (int8_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ *mb++ = (double)(*ma++);
+ }
+ break;
+ case TIFF_SHORT:
+ {
+ uint16_t *ma;
+ double *mb;
+ uint32_t n;
+ ma = (uint16_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(ma);
+ *mb++ = (double)(*ma++);
+ }
+ }
+ break;
+ case TIFF_SSHORT:
+ {
+ int16_t *ma;
+ double *mb;
+ uint32_t n;
+ ma = (int16_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort((uint16_t *)ma);
+ *mb++ = (double)(*ma++);
+ }
+ }
+ break;
+ case TIFF_LONG:
+ {
+ uint32_t *ma;
+ double *mb;
+ uint32_t n;
+ ma = (uint32_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(ma);
+ *mb++ = (double)(*ma++);
+ }
+ }
+ break;
+ case TIFF_SLONG:
+ {
+ int32_t *ma;
+ double *mb;
+ uint32_t n;
+ ma = (int32_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong((uint32_t *)ma);
+ *mb++ = (double)(*ma++);
+ }
+ }
+ break;
+ case TIFF_LONG8:
+ {
+ uint64_t *ma;
+ double *mb;
+ uint32_t n;
+ ma = (uint64_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(ma);
#if defined(__WIN32__) && (_MSC_VER < 1500)
- /*
- * XXX: MSVC 6.0 does not support
- * conversion of 64-bit integers into
- * floating point values.
- */
- *mb++ = _TIFFUInt64ToDouble(*ma++);
+ /*
+ * XXX: MSVC 6.0 does not support
+ * conversion of 64-bit integers into
+ * floating point values.
+ */
+ *mb++ = _TIFFUInt64ToDouble(*ma++);
#else
- *mb++ = (double)(*ma++);
+ *mb++ = (double)(*ma++);
#endif
- }
- }
- break;
- case TIFF_SLONG8:
- {
- int64* ma;
- double* mb;
- uint32 n;
- ma=(int64*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8((uint64*)ma);
- *mb++=(double)(*ma++);
- }
- }
- break;
- case TIFF_RATIONAL:
- {
- uint32* ma;
- uint32 maa;
- uint32 mab;
- double* mb;
- uint32 n;
- ma=(uint32*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(ma);
- maa=*ma++;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(ma);
- mab=*ma++;
- if (mab==0)
- *mb++=0.0;
- else
- *mb++=(double)maa/(double)mab;
- }
- }
- break;
- case TIFF_SRATIONAL:
- {
- uint32* ma;
- int32 maa;
- uint32 mab;
- double* mb;
- uint32 n;
- ma=(uint32*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(ma);
- maa=*(int32*)ma;
- ma++;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(ma);
- mab=*ma++;
- if (mab==0)
- *mb++=0.0;
- else
- *mb++=(double)maa/(double)mab;
- }
- }
- break;
- case TIFF_FLOAT:
- {
- float* ma;
- double* mb;
- uint32 n;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong((uint32*)origdata,count);
- TIFFCvtIEEEFloatToNative(tif,count,(float*)origdata);
- ma=(float*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- *mb++=(double)(*ma++);
- }
- break;
- }
- _TIFFfree(origdata);
- *value=data;
- return(TIFFReadDirEntryErrOk);
+ }
+ }
+ break;
+ case TIFF_SLONG8:
+ {
+ int64_t *ma;
+ double *mb;
+ uint32_t n;
+ ma = (int64_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8((uint64_t *)ma);
+ *mb++ = (double)(*ma++);
+ }
+ }
+ break;
+ case TIFF_RATIONAL:
+ {
+ uint32_t *ma;
+ uint32_t maa;
+ uint32_t mab;
+ double *mb;
+ uint32_t n;
+ ma = (uint32_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(ma);
+ maa = *ma++;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(ma);
+ mab = *ma++;
+ if (mab == 0)
+ *mb++ = 0.0;
+ else
+ *mb++ = (double)maa / (double)mab;
+ }
+ }
+ break;
+ case TIFF_SRATIONAL:
+ {
+ uint32_t *ma;
+ int32_t maa;
+ uint32_t mab;
+ double *mb;
+ uint32_t n;
+ ma = (uint32_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(ma);
+ maa = *(int32_t *)ma;
+ ma++;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(ma);
+ mab = *ma++;
+ if (mab == 0)
+ *mb++ = 0.0;
+ else
+ *mb++ = (double)maa / (double)mab;
+ }
+ }
+ break;
+ case TIFF_FLOAT:
+ {
+ float *ma;
+ double *mb;
+ uint32_t n;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfLong((uint32_t *)origdata, count);
+ TIFFCvtIEEEFloatToNative(tif, count, (float *)origdata);
+ ma = (float *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ *mb++ = (double)(*ma++);
+ }
+ break;
+ }
+ _TIFFfreeExt(tif, origdata);
+ *value = data;
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryIfd8Array(TIFF* tif, TIFFDirEntry* direntry, uint64** value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryIfd8Array(TIFF *tif, TIFFDirEntry *direntry, uint64_t **value)
{
- enum TIFFReadDirEntryErr err;
- uint32 count;
- void* origdata;
- uint64* data;
- switch (direntry->tdir_type)
- {
- case TIFF_LONG:
- case TIFF_LONG8:
- case TIFF_IFD:
- case TIFF_IFD8:
- break;
- default:
- return(TIFFReadDirEntryErrType);
- }
- err=TIFFReadDirEntryArray(tif,direntry,&count,8,&origdata);
- if ((err!=TIFFReadDirEntryErrOk)||(origdata==0))
- {
- *value=0;
- return(err);
- }
- switch (direntry->tdir_type)
- {
- case TIFF_LONG8:
- case TIFF_IFD8:
- *value=(uint64*)origdata;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong8(*value,count);
- return(TIFFReadDirEntryErrOk);
- }
- data=(uint64*)_TIFFmalloc(count*8);
- if (data==0)
- {
- _TIFFfree(origdata);
- return(TIFFReadDirEntryErrAlloc);
- }
- switch (direntry->tdir_type)
- {
- case TIFF_LONG:
- case TIFF_IFD:
- {
- uint32* ma;
- uint64* mb;
- uint32 n;
- ma=(uint32*)origdata;
- mb=data;
- for (n=0; n<count; n++)
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(ma);
- *mb++=(uint64)(*ma++);
- }
- }
- break;
- }
- _TIFFfree(origdata);
- *value=data;
- return(TIFFReadDirEntryErrOk);
+ enum TIFFReadDirEntryErr err;
+ uint32_t count;
+ void *origdata;
+ uint64_t *data;
+ switch (direntry->tdir_type)
+ {
+ case TIFF_LONG:
+ case TIFF_LONG8:
+ case TIFF_IFD:
+ case TIFF_IFD8:
+ break;
+ default:
+ return (TIFFReadDirEntryErrType);
+ }
+ err = TIFFReadDirEntryArray(tif, direntry, &count, 8, &origdata);
+ if ((err != TIFFReadDirEntryErrOk) || (origdata == 0))
+ {
+ *value = 0;
+ return (err);
+ }
+ switch (direntry->tdir_type)
+ {
+ case TIFF_LONG8:
+ case TIFF_IFD8:
+ *value = (uint64_t *)origdata;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfLong8(*value, count);
+ return (TIFFReadDirEntryErrOk);
+ }
+ data = (uint64_t *)_TIFFmallocExt(tif, count * 8);
+ if (data == 0)
+ {
+ _TIFFfreeExt(tif, origdata);
+ return (TIFFReadDirEntryErrAlloc);
+ }
+ switch (direntry->tdir_type)
+ {
+ case TIFF_LONG:
+ case TIFF_IFD:
+ {
+ uint32_t *ma;
+ uint64_t *mb;
+ uint32_t n;
+ ma = (uint32_t *)origdata;
+ mb = data;
+ for (n = 0; n < count; n++)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(ma);
+ *mb++ = (uint64_t)(*ma++);
+ }
+ }
+ break;
+ }
+ _TIFFfreeExt(tif, origdata);
+ *value = data;
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryPersampleShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryPersampleShort(TIFF *tif, TIFFDirEntry *direntry,
+ uint16_t *value)
{
- enum TIFFReadDirEntryErr err;
- uint16* m;
- uint16* na;
- uint16 nb;
- if (direntry->tdir_count<(uint64)tif->tif_dir.td_samplesperpixel)
- return(TIFFReadDirEntryErrCount);
- err=TIFFReadDirEntryShortArray(tif,direntry,&m);
- if (err!=TIFFReadDirEntryErrOk || m == NULL)
- return(err);
- na=m;
- nb=tif->tif_dir.td_samplesperpixel;
- *value=*na++;
- nb--;
- while (nb>0)
- {
- if (*na++!=*value)
- {
- err=TIFFReadDirEntryErrPsdif;
- break;
- }
- nb--;
- }
- _TIFFfree(m);
- return(err);
+ enum TIFFReadDirEntryErr err;
+ uint16_t *m;
+ uint16_t *na;
+ uint16_t nb;
+ if (direntry->tdir_count < (uint64_t)tif->tif_dir.td_samplesperpixel)
+ return (TIFFReadDirEntryErrCount);
+ err = TIFFReadDirEntryShortArray(tif, direntry, &m);
+ if (err != TIFFReadDirEntryErrOk || m == NULL)
+ return (err);
+ na = m;
+ nb = tif->tif_dir.td_samplesperpixel;
+ *value = *na++;
+ nb--;
+ while (nb > 0)
+ {
+ if (*na++ != *value)
+ {
+ err = TIFFReadDirEntryErrPsdif;
+ break;
+ }
+ nb--;
+ }
+ _TIFFfreeExt(tif, m);
+ return (err);
}
-#if 0
-static enum TIFFReadDirEntryErr TIFFReadDirEntryPersampleDouble(TIFF* tif, TIFFDirEntry* direntry, double* value)
+static void TIFFReadDirEntryCheckedByte(TIFF *tif, TIFFDirEntry *direntry,
+ uint8_t *value)
{
- enum TIFFReadDirEntryErr err;
- double* m;
- double* na;
- uint16 nb;
- if (direntry->tdir_count<(uint64)tif->tif_dir.td_samplesperpixel)
- return(TIFFReadDirEntryErrCount);
- err=TIFFReadDirEntryDoubleArray(tif,direntry,&m);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- na=m;
- nb=tif->tif_dir.td_samplesperpixel;
- *value=*na++;
- nb--;
- while (nb>0)
- {
- if (*na++!=*value)
- {
- err=TIFFReadDirEntryErrPsdif;
- break;
- }
- nb--;
- }
- _TIFFfree(m);
- return(err);
+ (void)tif;
+ *value = *(uint8_t *)(&direntry->tdir_offset);
}
-#endif
-static void TIFFReadDirEntryCheckedByte(TIFF* tif, TIFFDirEntry* direntry, uint8* value)
+static void TIFFReadDirEntryCheckedSbyte(TIFF *tif, TIFFDirEntry *direntry,
+ int8_t *value)
{
- (void) tif;
- *value=*(uint8*)(&direntry->tdir_offset);
+ (void)tif;
+ *value = *(int8_t *)(&direntry->tdir_offset);
}
-static void TIFFReadDirEntryCheckedSbyte(TIFF* tif, TIFFDirEntry* direntry, int8* value)
+static void TIFFReadDirEntryCheckedShort(TIFF *tif, TIFFDirEntry *direntry,
+ uint16_t *value)
{
- (void) tif;
- *value=*(int8*)(&direntry->tdir_offset);
+ *value = direntry->tdir_offset.toff_short;
+ /* *value=*(uint16_t*)(&direntry->tdir_offset); */
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(value);
}
-static void TIFFReadDirEntryCheckedShort(TIFF* tif, TIFFDirEntry* direntry, uint16* value)
+static void TIFFReadDirEntryCheckedSshort(TIFF *tif, TIFFDirEntry *direntry,
+ int16_t *value)
{
- *value = direntry->tdir_offset.toff_short;
- /* *value=*(uint16*)(&direntry->tdir_offset); */
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort(value);
+ *value = *(int16_t *)(&direntry->tdir_offset);
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort((uint16_t *)value);
}
-static void TIFFReadDirEntryCheckedSshort(TIFF* tif, TIFFDirEntry* direntry, int16* value)
+static void TIFFReadDirEntryCheckedLong(TIFF *tif, TIFFDirEntry *direntry,
+ uint32_t *value)
{
- *value=*(int16*)(&direntry->tdir_offset);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort((uint16*)value);
+ *value = *(uint32_t *)(&direntry->tdir_offset);
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(value);
}
-static void TIFFReadDirEntryCheckedLong(TIFF* tif, TIFFDirEntry* direntry, uint32* value)
+static void TIFFReadDirEntryCheckedSlong(TIFF *tif, TIFFDirEntry *direntry,
+ int32_t *value)
{
- *value=*(uint32*)(&direntry->tdir_offset);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(value);
+ *value = *(int32_t *)(&direntry->tdir_offset);
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong((uint32_t *)value);
}
-static void TIFFReadDirEntryCheckedSlong(TIFF* tif, TIFFDirEntry* direntry, int32* value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckedLong8(TIFF *tif, TIFFDirEntry *direntry, uint64_t *value)
{
- *value=*(int32*)(&direntry->tdir_offset);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong((uint32*)value);
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ enum TIFFReadDirEntryErr err;
+ uint32_t offset = direntry->tdir_offset.toff_long;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&offset);
+ err = TIFFReadDirEntryData(tif, offset, 8, value);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ }
+ else
+ *value = direntry->tdir_offset.toff_long8;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(value);
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedLong8(TIFF* tif, TIFFDirEntry* direntry, uint64* value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckedSlong8(TIFF *tif, TIFFDirEntry *direntry, int64_t *value)
{
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- enum TIFFReadDirEntryErr err;
- uint32 offset = direntry->tdir_offset.toff_long;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(&offset);
- err=TIFFReadDirEntryData(tif,offset,8,value);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- }
- else
- *value = direntry->tdir_offset.toff_long8;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8(value);
- return(TIFFReadDirEntryErrOk);
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ enum TIFFReadDirEntryErr err;
+ uint32_t offset = direntry->tdir_offset.toff_long;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&offset);
+ err = TIFFReadDirEntryData(tif, offset, 8, value);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ }
+ else
+ *value = *(int64_t *)(&direntry->tdir_offset);
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8((uint64_t *)value);
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedSlong8(TIFF* tif, TIFFDirEntry* direntry, int64* value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckedRational(TIFF *tif, TIFFDirEntry *direntry,
+ double *value)
{
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- enum TIFFReadDirEntryErr err;
- uint32 offset = direntry->tdir_offset.toff_long;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(&offset);
- err=TIFFReadDirEntryData(tif,offset,8,value);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- }
- else
- *value=*(int64*)(&direntry->tdir_offset);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8((uint64*)value);
- return(TIFFReadDirEntryErrOk);
-}
+ UInt64Aligned_t m;
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedRational(TIFF* tif, TIFFDirEntry* direntry, double* value)
-{
- UInt64Aligned_t m;
-
- assert(sizeof(double)==8);
- assert(sizeof(uint64)==8);
- assert(sizeof(uint32)==4);
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- enum TIFFReadDirEntryErr err;
- uint32 offset = direntry->tdir_offset.toff_long;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(&offset);
- err=TIFFReadDirEntryData(tif,offset,8,m.i);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- }
- else
- m.l = direntry->tdir_offset.toff_long8;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong(m.i,2);
- /* Not completely sure what we should do when m.i[1]==0, but some */
- /* sanitizers do not like division by 0.0: */
- /* http://bugzilla.maptools.org/show_bug.cgi?id=2644 */
- if (m.i[0]==0 || m.i[1]==0)
- *value=0.0;
- else
- *value=(double)m.i[0]/(double)m.i[1];
- return(TIFFReadDirEntryErrOk);
+ assert(sizeof(double) == 8);
+ assert(sizeof(uint64_t) == 8);
+ assert(sizeof(uint32_t) == 4);
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ enum TIFFReadDirEntryErr err;
+ uint32_t offset = direntry->tdir_offset.toff_long;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&offset);
+ err = TIFFReadDirEntryData(tif, offset, 8, m.i);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ }
+ else
+ m.l = direntry->tdir_offset.toff_long8;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfLong(m.i, 2);
+ /* Not completely sure what we should do when m.i[1]==0, but some */
+ /* sanitizers do not like division by 0.0: */
+ /* http://bugzilla.maptools.org/show_bug.cgi?id=2644 */
+ if (m.i[0] == 0 || m.i[1] == 0)
+ *value = 0.0;
+ else
+ *value = (double)m.i[0] / (double)m.i[1];
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedSrational(TIFF* tif, TIFFDirEntry* direntry, double* value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckedSrational(TIFF *tif, TIFFDirEntry *direntry,
+ double *value)
{
- UInt64Aligned_t m;
- assert(sizeof(double)==8);
- assert(sizeof(uint64)==8);
- assert(sizeof(int32)==4);
- assert(sizeof(uint32)==4);
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- enum TIFFReadDirEntryErr err;
- uint32 offset = direntry->tdir_offset.toff_long;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(&offset);
- err=TIFFReadDirEntryData(tif,offset,8,m.i);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- }
- else
- m.l=direntry->tdir_offset.toff_long8;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong(m.i,2);
- /* Not completely sure what we should do when m.i[1]==0, but some */
- /* sanitizers do not like division by 0.0: */
- /* http://bugzilla.maptools.org/show_bug.cgi?id=2644 */
- if ((int32)m.i[0]==0 || m.i[1]==0)
- *value=0.0;
- else
- *value=(double)((int32)m.i[0])/(double)m.i[1];
- return(TIFFReadDirEntryErrOk);
+ UInt64Aligned_t m;
+ assert(sizeof(double) == 8);
+ assert(sizeof(uint64_t) == 8);
+ assert(sizeof(int32_t) == 4);
+ assert(sizeof(uint32_t) == 4);
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ enum TIFFReadDirEntryErr err;
+ uint32_t offset = direntry->tdir_offset.toff_long;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&offset);
+ err = TIFFReadDirEntryData(tif, offset, 8, m.i);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ }
+ else
+ m.l = direntry->tdir_offset.toff_long8;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfLong(m.i, 2);
+ /* Not completely sure what we should do when m.i[1]==0, but some */
+ /* sanitizers do not like division by 0.0: */
+ /* http://bugzilla.maptools.org/show_bug.cgi?id=2644 */
+ if ((int32_t)m.i[0] == 0 || m.i[1] == 0)
+ *value = 0.0;
+ else
+ *value = (double)((int32_t)m.i[0]) / (double)m.i[1];
+ return (TIFFReadDirEntryErrOk);
}
-static void TIFFReadDirEntryCheckedFloat(TIFF* tif, TIFFDirEntry* direntry, float* value)
+static void TIFFReadDirEntryCheckedFloat(TIFF *tif, TIFFDirEntry *direntry,
+ float *value)
{
- union
- {
- float f;
- uint32 i;
- } float_union;
- assert(sizeof(float)==4);
- assert(sizeof(uint32)==4);
- assert(sizeof(float_union)==4);
- float_union.i=*(uint32*)(&direntry->tdir_offset);
- *value=float_union.f;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong((uint32*)value);
+ union
+ {
+ float f;
+ uint32_t i;
+ } float_union;
+ assert(sizeof(float) == 4);
+ assert(sizeof(uint32_t) == 4);
+ assert(sizeof(float_union) == 4);
+ float_union.i = *(uint32_t *)(&direntry->tdir_offset);
+ *value = float_union.f;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong((uint32_t *)value);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckedDouble(TIFF* tif, TIFFDirEntry* direntry, double* value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckedDouble(TIFF *tif, TIFFDirEntry *direntry, double *value)
{
- assert(sizeof(double)==8);
- assert(sizeof(uint64)==8);
- assert(sizeof(UInt64Aligned_t)==8);
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- enum TIFFReadDirEntryErr err;
- uint32 offset = direntry->tdir_offset.toff_long;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(&offset);
- err=TIFFReadDirEntryData(tif,offset,8,value);
- if (err!=TIFFReadDirEntryErrOk)
- return(err);
- }
- else
- {
- UInt64Aligned_t uint64_union;
- uint64_union.l=direntry->tdir_offset.toff_long8;
- *value=uint64_union.d;
- }
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8((uint64*)value);
- return(TIFFReadDirEntryErrOk);
+ assert(sizeof(double) == 8);
+ assert(sizeof(uint64_t) == 8);
+ assert(sizeof(UInt64Aligned_t) == 8);
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ enum TIFFReadDirEntryErr err;
+ uint32_t offset = direntry->tdir_offset.toff_long;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&offset);
+ err = TIFFReadDirEntryData(tif, offset, 8, value);
+ if (err != TIFFReadDirEntryErrOk)
+ return (err);
+ }
+ else
+ {
+ UInt64Aligned_t uint64_union;
+ uint64_union.l = direntry->tdir_offset.toff_long8;
+ *value = uint64_union.d;
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8((uint64_t *)value);
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSbyte(int8 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeByteSbyte(int8_t value)
{
- if (value<0)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value < 0)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteShort(uint16 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeByteShort(uint16_t value)
{
- if (value>0xFF)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value > 0xFF)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSshort(int16 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeByteSshort(int16_t value)
{
- if ((value<0)||(value>0xFF))
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if ((value < 0) || (value > 0xFF))
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteLong(uint32 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeByteLong(uint32_t value)
{
- if (value>0xFF)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value > 0xFF)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSlong(int32 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeByteSlong(int32_t value)
{
- if ((value<0)||(value>0xFF))
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if ((value < 0) || (value > 0xFF))
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteLong8(uint64 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeByteLong8(uint64_t value)
{
- if (value>0xFF)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value > 0xFF)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeByteSlong8(int64 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeByteSlong8(int64_t value)
{
- if ((value<0)||(value>0xFF))
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if ((value < 0) || (value > 0xFF))
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteByte(uint8 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSbyteByte(uint8_t value)
{
- if (value>0x7F)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value > 0x7F)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteShort(uint16 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSbyteShort(uint16_t value)
{
- if (value>0x7F)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value > 0x7F)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSshort(int16 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSbyteSshort(int16_t value)
{
- if ((value<-0x80)||(value>0x7F))
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if ((value < -0x80) || (value > 0x7F))
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteLong(uint32 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSbyteLong(uint32_t value)
{
- if (value>0x7F)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value > 0x7F)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSlong(int32 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSbyteSlong(int32_t value)
{
- if ((value<-0x80)||(value>0x7F))
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if ((value < -0x80) || (value > 0x7F))
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteLong8(uint64 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSbyteLong8(uint64_t value)
{
- if (value>0x7F)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value > 0x7F)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSbyteSlong8(int64 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSbyteSlong8(int64_t value)
{
- if ((value<-0x80)||(value>0x7F))
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if ((value < -0x80) || (value > 0x7F))
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSbyte(int8 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeShortSbyte(int8_t value)
{
- if (value<0)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value < 0)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSshort(int16 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeShortSshort(int16_t value)
{
- if (value<0)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value < 0)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortLong(uint32 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeShortLong(uint32_t value)
{
- if (value>0xFFFF)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value > 0xFFFF)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSlong(int32 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeShortSlong(int32_t value)
{
- if ((value<0)||(value>0xFFFF))
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if ((value < 0) || (value > 0xFFFF))
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortLong8(uint64 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeShortLong8(uint64_t value)
{
- if (value>0xFFFF)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value > 0xFFFF)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeShortSlong8(int64 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeShortSlong8(int64_t value)
{
- if ((value<0)||(value>0xFFFF))
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if ((value < 0) || (value > 0xFFFF))
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortShort(uint16 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSshortShort(uint16_t value)
{
- if (value>0x7FFF)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value > 0x7FFF)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortLong(uint32 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSshortLong(uint32_t value)
{
- if (value>0x7FFF)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value > 0x7FFF)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortSlong(int32 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSshortSlong(int32_t value)
{
- if ((value<-0x8000)||(value>0x7FFF))
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if ((value < -0x8000) || (value > 0x7FFF))
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortLong8(uint64 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSshortLong8(uint64_t value)
{
- if (value>0x7FFF)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value > 0x7FFF)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSshortSlong8(int64 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeSshortSlong8(int64_t value)
{
- if ((value<-0x8000)||(value>0x7FFF))
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if ((value < -0x8000) || (value > 0x7FFF))
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSbyte(int8 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeLongSbyte(int8_t value)
{
- if (value<0)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value < 0)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSshort(int16 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeLongSshort(int16_t value)
{
- if (value<0)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value < 0)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSlong(int32 value)
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckRangeLongSlong(int32_t value)
{
- if (value<0)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value < 0)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
static enum TIFFReadDirEntryErr
-TIFFReadDirEntryCheckRangeLongLong8(uint64 value)
+TIFFReadDirEntryCheckRangeLongLong8(uint64_t value)
{
- if (value > TIFF_UINT32_MAX)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value > UINT32_MAX)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
static enum TIFFReadDirEntryErr
-TIFFReadDirEntryCheckRangeLongSlong8(int64 value)
+TIFFReadDirEntryCheckRangeLongSlong8(int64_t value)
{
- if ((value < 0) || (value > (int64) TIFF_UINT32_MAX))
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if ((value < 0) || (value > (int64_t)UINT32_MAX))
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
static enum TIFFReadDirEntryErr
-TIFFReadDirEntryCheckRangeSlongLong(uint32 value)
+TIFFReadDirEntryCheckRangeSlongLong(uint32_t value)
{
- if (value > 0x7FFFFFFFUL)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value > 0x7FFFFFFFUL)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
/* Check that the 8-byte unsigned value can fit in a 4-byte unsigned range */
static enum TIFFReadDirEntryErr
-TIFFReadDirEntryCheckRangeSlongLong8(uint64 value)
+TIFFReadDirEntryCheckRangeSlongLong8(uint64_t value)
{
- if (value > 0x7FFFFFFF)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value > 0x7FFFFFFF)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
/* Check that the 8-byte signed value can fit in a 4-byte signed range */
static enum TIFFReadDirEntryErr
-TIFFReadDirEntryCheckRangeSlongSlong8(int64 value)
+TIFFReadDirEntryCheckRangeSlongSlong8(int64_t value)
{
- if ((value < 0-((int64) 0x7FFFFFFF+1)) || (value > 0x7FFFFFFF))
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if ((value < 0 - ((int64_t)0x7FFFFFFF + 1)) || (value > 0x7FFFFFFF))
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
static enum TIFFReadDirEntryErr
-TIFFReadDirEntryCheckRangeLong8Sbyte(int8 value)
+TIFFReadDirEntryCheckRangeLong8Sbyte(int8_t value)
{
- if (value < 0)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value < 0)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
static enum TIFFReadDirEntryErr
-TIFFReadDirEntryCheckRangeLong8Sshort(int16 value)
+TIFFReadDirEntryCheckRangeLong8Sshort(int16_t value)
{
- if (value < 0)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value < 0)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
static enum TIFFReadDirEntryErr
-TIFFReadDirEntryCheckRangeLong8Slong(int32 value)
+TIFFReadDirEntryCheckRangeLong8Slong(int32_t value)
{
- if (value < 0)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value < 0)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
static enum TIFFReadDirEntryErr
-TIFFReadDirEntryCheckRangeLong8Slong8(int64 value)
+TIFFReadDirEntryCheckRangeLong8Slong8(int64_t value)
{
- if (value < 0)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value < 0)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
static enum TIFFReadDirEntryErr
-TIFFReadDirEntryCheckRangeSlong8Long8(uint64 value)
+TIFFReadDirEntryCheckRangeSlong8Long8(uint64_t value)
{
- if (value > TIFF_INT64_MAX)
- return(TIFFReadDirEntryErrRange);
- else
- return(TIFFReadDirEntryErrOk);
+ if (value > INT64_MAX)
+ return (TIFFReadDirEntryErrRange);
+ else
+ return (TIFFReadDirEntryErrOk);
}
-static enum TIFFReadDirEntryErr
-TIFFReadDirEntryData(TIFF* tif, uint64 offset, tmsize_t size, void* dest)
+static enum TIFFReadDirEntryErr TIFFReadDirEntryData(TIFF *tif, uint64_t offset,
+ tmsize_t size, void *dest)
{
- assert(size>0);
- if (!isMapped(tif)) {
- if (!SeekOK(tif,offset))
- return(TIFFReadDirEntryErrIo);
- if (!ReadOK(tif,dest,size))
- return(TIFFReadDirEntryErrIo);
- } else {
- size_t ma,mb;
- ma=(size_t)offset;
- if( (uint64)ma!=offset ||
- ma > (~(size_t)0) - (size_t)size )
- {
- return TIFFReadDirEntryErrIo;
- }
- mb=ma+size;
- if (mb > (size_t)tif->tif_size)
- return(TIFFReadDirEntryErrIo);
- _TIFFmemcpy(dest,tif->tif_base+ma,size);
- }
- return(TIFFReadDirEntryErrOk);
+ assert(size > 0);
+ if (!isMapped(tif))
+ {
+ if (!SeekOK(tif, offset))
+ return (TIFFReadDirEntryErrIo);
+ if (!ReadOK(tif, dest, size))
+ return (TIFFReadDirEntryErrIo);
+ }
+ else
+ {
+ size_t ma, mb;
+ ma = (size_t)offset;
+ if ((uint64_t)ma != offset || ma > (~(size_t)0) - (size_t)size)
+ {
+ return TIFFReadDirEntryErrIo;
+ }
+ mb = ma + size;
+ if (mb > (uint64_t)tif->tif_size)
+ return (TIFFReadDirEntryErrIo);
+ _TIFFmemcpy(dest, tif->tif_base + ma, size);
+ }
+ return (TIFFReadDirEntryErrOk);
}
-static void TIFFReadDirEntryOutputErr(TIFF* tif, enum TIFFReadDirEntryErr err, const char* module, const char* tagname, int recover)
+static void TIFFReadDirEntryOutputErr(TIFF *tif, enum TIFFReadDirEntryErr err,
+ const char *module, const char *tagname,
+ int recover)
{
- if (!recover) {
- switch (err) {
- case TIFFReadDirEntryErrCount:
- TIFFErrorExt(tif->tif_clientdata, module,
- "Incorrect count for \"%s\"",
- tagname);
- break;
- case TIFFReadDirEntryErrType:
- TIFFErrorExt(tif->tif_clientdata, module,
- "Incompatible type for \"%s\"",
- tagname);
- break;
- case TIFFReadDirEntryErrIo:
- TIFFErrorExt(tif->tif_clientdata, module,
- "IO error during reading of \"%s\"",
- tagname);
- break;
- case TIFFReadDirEntryErrRange:
- TIFFErrorExt(tif->tif_clientdata, module,
- "Incorrect value for \"%s\"",
- tagname);
- break;
- case TIFFReadDirEntryErrPsdif:
- TIFFErrorExt(tif->tif_clientdata, module,
- "Cannot handle different values per sample for \"%s\"",
- tagname);
- break;
- case TIFFReadDirEntryErrSizesan:
- TIFFErrorExt(tif->tif_clientdata, module,
- "Sanity check on size of \"%s\" value failed",
- tagname);
- break;
- case TIFFReadDirEntryErrAlloc:
- TIFFErrorExt(tif->tif_clientdata, module,
- "Out of memory reading of \"%s\"",
- tagname);
- break;
- default:
- assert(0); /* we should never get here */
- break;
- }
- } else {
- switch (err) {
- case TIFFReadDirEntryErrCount:
- TIFFWarningExt(tif->tif_clientdata, module,
- "Incorrect count for \"%s\"; tag ignored",
- tagname);
- break;
- case TIFFReadDirEntryErrType:
- TIFFWarningExt(tif->tif_clientdata, module,
- "Incompatible type for \"%s\"; tag ignored",
- tagname);
- break;
- case TIFFReadDirEntryErrIo:
- TIFFWarningExt(tif->tif_clientdata, module,
- "IO error during reading of \"%s\"; tag ignored",
- tagname);
- break;
- case TIFFReadDirEntryErrRange:
- TIFFWarningExt(tif->tif_clientdata, module,
- "Incorrect value for \"%s\"; tag ignored",
- tagname);
- break;
- case TIFFReadDirEntryErrPsdif:
- TIFFWarningExt(tif->tif_clientdata, module,
- "Cannot handle different values per sample for \"%s\"; tag ignored",
- tagname);
- break;
- case TIFFReadDirEntryErrSizesan:
- TIFFWarningExt(tif->tif_clientdata, module,
- "Sanity check on size of \"%s\" value failed; tag ignored",
- tagname);
- break;
- case TIFFReadDirEntryErrAlloc:
- TIFFWarningExt(tif->tif_clientdata, module,
- "Out of memory reading of \"%s\"; tag ignored",
- tagname);
- break;
- default:
- assert(0); /* we should never get here */
- break;
- }
- }
+ if (!recover)
+ {
+ switch (err)
+ {
+ case TIFFReadDirEntryErrCount:
+ TIFFErrorExtR(tif, module, "Incorrect count for \"%s\"",
+ tagname);
+ break;
+ case TIFFReadDirEntryErrType:
+ TIFFErrorExtR(tif, module, "Incompatible type for \"%s\"",
+ tagname);
+ break;
+ case TIFFReadDirEntryErrIo:
+ TIFFErrorExtR(tif, module, "IO error during reading of \"%s\"",
+ tagname);
+ break;
+ case TIFFReadDirEntryErrRange:
+ TIFFErrorExtR(tif, module, "Incorrect value for \"%s\"",
+ tagname);
+ break;
+ case TIFFReadDirEntryErrPsdif:
+ TIFFErrorExtR(
+ tif, module,
+ "Cannot handle different values per sample for \"%s\"",
+ tagname);
+ break;
+ case TIFFReadDirEntryErrSizesan:
+ TIFFErrorExtR(tif, module,
+ "Sanity check on size of \"%s\" value failed",
+ tagname);
+ break;
+ case TIFFReadDirEntryErrAlloc:
+ TIFFErrorExtR(tif, module, "Out of memory reading of \"%s\"",
+ tagname);
+ break;
+ default:
+ assert(0); /* we should never get here */
+ break;
+ }
+ }
+ else
+ {
+ switch (err)
+ {
+ case TIFFReadDirEntryErrCount:
+ TIFFWarningExtR(tif, module,
+ "Incorrect count for \"%s\"; tag ignored",
+ tagname);
+ break;
+ case TIFFReadDirEntryErrType:
+ TIFFWarningExtR(tif, module,
+ "Incompatible type for \"%s\"; tag ignored",
+ tagname);
+ break;
+ case TIFFReadDirEntryErrIo:
+ TIFFWarningExtR(
+ tif, module,
+ "IO error during reading of \"%s\"; tag ignored", tagname);
+ break;
+ case TIFFReadDirEntryErrRange:
+ TIFFWarningExtR(tif, module,
+ "Incorrect value for \"%s\"; tag ignored",
+ tagname);
+ break;
+ case TIFFReadDirEntryErrPsdif:
+ TIFFWarningExtR(tif, module,
+ "Cannot handle different values per sample for "
+ "\"%s\"; tag ignored",
+ tagname);
+ break;
+ case TIFFReadDirEntryErrSizesan:
+ TIFFWarningExtR(
+ tif, module,
+ "Sanity check on size of \"%s\" value failed; tag ignored",
+ tagname);
+ break;
+ case TIFFReadDirEntryErrAlloc:
+ TIFFWarningExtR(tif, module,
+ "Out of memory reading of \"%s\"; tag ignored",
+ tagname);
+ break;
+ default:
+ assert(0); /* we should never get here */
+ break;
+ }
+ }
}
/*
@@ -3499,1202 +3981,1590 @@ static void TIFFReadDirEntryOutputErr(TIFF* tif, enum TIFFReadDirEntryErr err, c
* type. 0 is returned if photometric type isn't supported or no default value
* is defined by the specification.
*/
-static int _TIFFGetMaxColorChannels( uint16 photometric )
+static int _TIFFGetMaxColorChannels(uint16_t photometric)
{
- switch (photometric) {
- case PHOTOMETRIC_PALETTE:
- case PHOTOMETRIC_MINISWHITE:
- case PHOTOMETRIC_MINISBLACK:
+ switch (photometric)
+ {
+ case PHOTOMETRIC_PALETTE:
+ case PHOTOMETRIC_MINISWHITE:
+ case PHOTOMETRIC_MINISBLACK:
return 1;
- case PHOTOMETRIC_YCBCR:
- case PHOTOMETRIC_RGB:
- case PHOTOMETRIC_CIELAB:
- case PHOTOMETRIC_LOGLUV:
- case PHOTOMETRIC_ITULAB:
- case PHOTOMETRIC_ICCLAB:
+ case PHOTOMETRIC_YCBCR:
+ case PHOTOMETRIC_RGB:
+ case PHOTOMETRIC_CIELAB:
+ case PHOTOMETRIC_LOGLUV:
+ case PHOTOMETRIC_ITULAB:
+ case PHOTOMETRIC_ICCLAB:
return 3;
- case PHOTOMETRIC_SEPARATED:
- case PHOTOMETRIC_MASK:
+ case PHOTOMETRIC_SEPARATED:
+ case PHOTOMETRIC_MASK:
return 4;
- case PHOTOMETRIC_LOGL:
- case PHOTOMETRIC_CFA:
- default:
+ case PHOTOMETRIC_LOGL:
+ case PHOTOMETRIC_CFA:
+ default:
return 0;
}
}
-static int ByteCountLooksBad(TIFF* tif)
+static int ByteCountLooksBad(TIFF *tif)
{
/*
- * Assume we have wrong StripByteCount value (in case
- * of single strip) in following cases:
- * - it is equal to zero along with StripOffset;
- * - it is larger than file itself (in case of uncompressed
- * image);
- * - it is smaller than the size of the bytes per row
- * multiplied on the number of rows. The last case should
- * not be checked in the case of writing new image,
- * because we may do not know the exact strip size
- * until the whole image will be written and directory
- * dumped out.
- */
- uint64 bytecount = TIFFGetStrileByteCount(tif, 0);
- uint64 offset = TIFFGetStrileOffset(tif, 0);
- uint64 filesize;
-
- if( offset == 0 )
+ * Assume we have wrong StripByteCount value (in case
+ * of single strip) in following cases:
+ * - it is equal to zero along with StripOffset;
+ * - it is larger than file itself (in case of uncompressed
+ * image);
+ * - it is smaller than the size of the bytes per row
+ * multiplied on the number of rows. The last case should
+ * not be checked in the case of writing new image,
+ * because we may do not know the exact strip size
+ * until the whole image will be written and directory
+ * dumped out.
+ */
+ uint64_t bytecount = TIFFGetStrileByteCount(tif, 0);
+ uint64_t offset = TIFFGetStrileOffset(tif, 0);
+ uint64_t filesize;
+
+ if (offset == 0)
return 0;
if (bytecount == 0)
return 1;
- if ( tif->tif_dir.td_compression != COMPRESSION_NONE )
+ if (tif->tif_dir.td_compression != COMPRESSION_NONE)
return 0;
filesize = TIFFGetFileSize(tif);
- if( offset <= filesize && bytecount > filesize - offset )
+ if (offset <= filesize && bytecount > filesize - offset)
return 1;
- if( tif->tif_mode == O_RDONLY )
+ if (tif->tif_mode == O_RDONLY)
{
- uint64 scanlinesize = TIFFScanlineSize64(tif);
- if( tif->tif_dir.td_imagelength > 0 &&
- scanlinesize > TIFF_UINT64_MAX / tif->tif_dir.td_imagelength )
+ uint64_t scanlinesize = TIFFScanlineSize64(tif);
+ if (tif->tif_dir.td_imagelength > 0 &&
+ scanlinesize > UINT64_MAX / tif->tif_dir.td_imagelength)
{
return 1;
}
- if( bytecount < scanlinesize * tif->tif_dir.td_imagelength)
+ if (bytecount < scanlinesize * tif->tif_dir.td_imagelength)
return 1;
}
return 0;
}
-
/*
* Read the next TIFF directory from a file and convert it to the internal
* format. We read directories sequentially.
*/
-int
-TIFFReadDirectory(TIFF* tif)
+int TIFFReadDirectory(TIFF *tif)
{
- static const char module[] = "TIFFReadDirectory";
- TIFFDirEntry* dir;
- uint16 dircount;
- TIFFDirEntry* dp;
- uint16 di;
- const TIFFField* fip;
- uint32 fii=FAILED_FII;
- toff_t nextdiroff;
+ static const char module[] = "TIFFReadDirectory";
+ TIFFDirEntry *dir;
+ uint16_t dircount;
+ TIFFDirEntry *dp;
+ uint16_t di;
+ const TIFFField *fip;
+ uint32_t fii = FAILED_FII;
+ toff_t nextdiroff;
int bitspersample_read = FALSE;
- int color_channels;
-
- tif->tif_diroff=tif->tif_nextdiroff;
- if (!TIFFCheckDirOffset(tif,tif->tif_nextdiroff))
- return 0; /* last offset or bad offset (IFD looping) */
- (*tif->tif_cleanup)(tif); /* cleanup any previous compression state */
- tif->tif_curdir++;
- nextdiroff = tif->tif_nextdiroff;
- dircount=TIFFFetchDirectory(tif,nextdiroff,&dir,&tif->tif_nextdiroff);
- if (!dircount)
- {
- TIFFErrorExt(tif->tif_clientdata,module,
- "Failed to read directory at offset " TIFF_UINT64_FORMAT,nextdiroff);
- return 0;
- }
- TIFFReadDirectoryCheckOrder(tif,dir,dircount);
+ int color_channels;
+ if (tif->tif_nextdiroff == 0)
+ {
+ /* In this special case, tif_diroff needs also to be set to 0. */
+ tif->tif_diroff = tif->tif_nextdiroff;
+ return 0; /* last offset, thus no checking necessary */
+ }
+
+ nextdiroff = tif->tif_nextdiroff;
+ /* tif_curdir++ and tif_nextdiroff should only be updated after SUCCESSFUL
+ * reading of the directory. Otherwise, invalid IFD offsets could corrupt
+ * the IFD list. */
+ if (!_TIFFCheckDirNumberAndOffset(tif,
+ tif->tif_curdir ==
+ TIFF_NON_EXISTENT_DIR_NUMBER
+ ? 0
+ : tif->tif_curdir + 1,
+ nextdiroff))
+ {
+ return 0; /* bad offset (IFD looping or more than TIFF_MAX_DIR_COUNT
+ IFDs) */
+ }
+ dircount = TIFFFetchDirectory(tif, nextdiroff, &dir, &tif->tif_nextdiroff);
+ if (!dircount)
+ {
+ TIFFErrorExtR(tif, module,
+ "Failed to read directory at offset %" PRIu64,
+ nextdiroff);
+ return 0;
+ }
+ /* Set global values after a valid directory has been fetched.
+ * tif_diroff is already set to nextdiroff in TIFFFetchDirectory() in the
+ * beginning. */
+ if (tif->tif_curdir == TIFF_NON_EXISTENT_DIR_NUMBER)
+ tif->tif_curdir = 0;
+ else
+ tif->tif_curdir++;
+ (*tif->tif_cleanup)(tif); /* cleanup any previous compression state */
+
+ TIFFReadDirectoryCheckOrder(tif, dir, dircount);
+
+ /*
+ * Mark duplicates of any tag to be ignored (bugzilla 1994)
+ * to avoid certain pathological problems.
+ */
+ {
+ TIFFDirEntry *ma;
+ uint16_t mb;
+ for (ma = dir, mb = 0; mb < dircount; ma++, mb++)
+ {
+ TIFFDirEntry *na;
+ uint16_t nb;
+ for (na = ma + 1, nb = mb + 1; nb < dircount; na++, nb++)
+ {
+ if (ma->tdir_tag == na->tdir_tag)
+ {
+ na->tdir_ignore = TRUE;
+ }
+ }
+ }
+ }
+
+ tif->tif_flags &= ~TIFF_BEENWRITING; /* reset before new dir */
+ tif->tif_flags &= ~TIFF_BUF4WRITE; /* reset before new dir */
+ tif->tif_flags &= ~TIFF_CHOPPEDUPARRAYS;
+
+ /* free any old stuff and reinit */
+ TIFFFreeDirectory(tif);
+ TIFFDefaultDirectory(tif);
+ /*
+ * Electronic Arts writes gray-scale TIFF files
+ * without a PlanarConfiguration directory entry.
+ * Thus we setup a default value here, even though
+ * the TIFF spec says there is no default value.
+ * After PlanarConfiguration is preset in TIFFDefaultDirectory()
+ * the following setting is not needed, but does not harm either.
+ */
+ TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
+ /*
+ * Setup default value and then make a pass over
+ * the fields to check type and tag information,
+ * and to extract info required to size data
+ * structures. A second pass is made afterwards
+ * to read in everything not taken in the first pass.
+ * But we must process the Compression tag first
+ * in order to merge in codec-private tag definitions (otherwise
+ * we may get complaints about unknown tags). However, the
+ * Compression tag may be dependent on the SamplesPerPixel
+ * tag value because older TIFF specs permitted Compression
+ * to be written as a SamplesPerPixel-count tag entry.
+ * Thus if we don't first figure out the correct SamplesPerPixel
+ * tag value then we may end up ignoring the Compression tag
+ * value because it has an incorrect count value (if the
+ * true value of SamplesPerPixel is not 1).
+ */
+ dp =
+ TIFFReadDirectoryFindEntry(tif, dir, dircount, TIFFTAG_SAMPLESPERPIXEL);
+ if (dp)
+ {
+ if (!TIFFFetchNormalTag(tif, dp, 0))
+ goto bad;
+ dp->tdir_ignore = TRUE;
+ }
+ dp = TIFFReadDirectoryFindEntry(tif, dir, dircount, TIFFTAG_COMPRESSION);
+ if (dp)
+ {
/*
- * Mark duplicates of any tag to be ignored (bugzilla 1994)
- * to avoid certain pathological problems.
+ * The 5.0 spec says the Compression tag has one value, while
+ * earlier specs say it has one value per sample. Because of
+ * this, we accept the tag if one value is supplied with either
+ * count.
*/
- {
- TIFFDirEntry* ma;
- uint16 mb;
- for (ma=dir, mb=0; mb<dircount; ma++, mb++)
- {
- TIFFDirEntry* na;
- uint16 nb;
- for (na=ma+1, nb=mb+1; nb<dircount; na++, nb++)
- {
- if (ma->tdir_tag == na->tdir_tag) {
- na->tdir_ignore = TRUE;
- }
- }
- }
- }
-
- tif->tif_flags &= ~TIFF_BEENWRITING; /* reset before new dir */
- tif->tif_flags &= ~TIFF_BUF4WRITE; /* reset before new dir */
- tif->tif_flags &= ~TIFF_CHOPPEDUPARRAYS;
-
- /* free any old stuff and reinit */
- TIFFFreeDirectory(tif);
- TIFFDefaultDirectory(tif);
- /*
- * Electronic Arts writes gray-scale TIFF files
- * without a PlanarConfiguration directory entry.
- * Thus we setup a default value here, even though
- * the TIFF spec says there is no default value.
- */
- TIFFSetField(tif,TIFFTAG_PLANARCONFIG,PLANARCONFIG_CONTIG);
- /*
- * Setup default value and then make a pass over
- * the fields to check type and tag information,
- * and to extract info required to size data
- * structures. A second pass is made afterwards
- * to read in everything not taken in the first pass.
- * But we must process the Compression tag first
- * in order to merge in codec-private tag definitions (otherwise
- * we may get complaints about unknown tags). However, the
- * Compression tag may be dependent on the SamplesPerPixel
- * tag value because older TIFF specs permitted Compression
- * to be written as a SamplesPerPixel-count tag entry.
- * Thus if we don't first figure out the correct SamplesPerPixel
- * tag value then we may end up ignoring the Compression tag
- * value because it has an incorrect count value (if the
- * true value of SamplesPerPixel is not 1).
- */
- dp=TIFFReadDirectoryFindEntry(tif,dir,dircount,TIFFTAG_SAMPLESPERPIXEL);
- if (dp)
- {
- if (!TIFFFetchNormalTag(tif,dp,0))
- goto bad;
- dp->tdir_ignore = TRUE;
- }
- dp=TIFFReadDirectoryFindEntry(tif,dir,dircount,TIFFTAG_COMPRESSION);
- if (dp)
- {
- /*
- * The 5.0 spec says the Compression tag has one value, while
- * earlier specs say it has one value per sample. Because of
- * this, we accept the tag if one value is supplied with either
- * count.
- */
- uint16 value;
- enum TIFFReadDirEntryErr err;
- err=TIFFReadDirEntryShort(tif,dp,&value);
- if (err==TIFFReadDirEntryErrCount)
- err=TIFFReadDirEntryPersampleShort(tif,dp,&value);
- if (err!=TIFFReadDirEntryErrOk)
- {
- TIFFReadDirEntryOutputErr(tif,err,module,"Compression",0);
- goto bad;
- }
- if (!TIFFSetField(tif,TIFFTAG_COMPRESSION,value))
- goto bad;
- dp->tdir_ignore = TRUE;
- }
- else
- {
- if (!TIFFSetField(tif,TIFFTAG_COMPRESSION,COMPRESSION_NONE))
- goto bad;
- }
- /*
- * First real pass over the directory.
- */
- for (di=0, dp=dir; di<dircount; di++, dp++)
- {
- if (!dp->tdir_ignore)
- {
- TIFFReadDirectoryFindFieldInfo(tif,dp->tdir_tag,&fii);
- if (fii == FAILED_FII)
- {
- TIFFWarningExt(tif->tif_clientdata, module,
- "Unknown field with tag %d (0x%x) encountered",
- dp->tdir_tag,dp->tdir_tag);
- /* the following knowingly leaks the
- anonymous field structure */
- if (!_TIFFMergeFields(tif,
- _TIFFCreateAnonField(tif,
- dp->tdir_tag,
- (TIFFDataType) dp->tdir_type),
- 1)) {
- TIFFWarningExt(tif->tif_clientdata,
- module,
- "Registering anonymous field with tag %d (0x%x) failed",
- dp->tdir_tag,
- dp->tdir_tag);
- dp->tdir_ignore = TRUE;
- } else {
- TIFFReadDirectoryFindFieldInfo(tif,dp->tdir_tag,&fii);
- assert(fii != FAILED_FII);
- }
- }
- }
- if (!dp->tdir_ignore)
- {
- fip=tif->tif_fields[fii];
- if (fip->field_bit==FIELD_IGNORE)
- dp->tdir_ignore = TRUE;
- else
- {
- switch (dp->tdir_tag)
- {
- case TIFFTAG_STRIPOFFSETS:
- case TIFFTAG_STRIPBYTECOUNTS:
- case TIFFTAG_TILEOFFSETS:
- case TIFFTAG_TILEBYTECOUNTS:
- TIFFSetFieldBit(tif,fip->field_bit);
- break;
- case TIFFTAG_IMAGEWIDTH:
- case TIFFTAG_IMAGELENGTH:
- case TIFFTAG_IMAGEDEPTH:
- case TIFFTAG_TILELENGTH:
- case TIFFTAG_TILEWIDTH:
- case TIFFTAG_TILEDEPTH:
- case TIFFTAG_PLANARCONFIG:
- case TIFFTAG_ROWSPERSTRIP:
- case TIFFTAG_EXTRASAMPLES:
- if (!TIFFFetchNormalTag(tif,dp,0))
- goto bad;
- dp->tdir_ignore = TRUE;
- break;
- default:
- if( !_TIFFCheckFieldIsValidForCodec(tif, dp->tdir_tag) )
- dp->tdir_ignore = TRUE;
- break;
- }
- }
- }
- }
- /*
- * XXX: OJPEG hack.
- * If a) compression is OJPEG, b) planarconfig tag says it's separate,
- * c) strip offsets/bytecounts tag are both present and
- * d) both contain exactly one value, then we consistently find
- * that the buggy implementation of the buggy compression scheme
- * matches contig planarconfig best. So we 'fix-up' the tag here
- */
- if ((tif->tif_dir.td_compression==COMPRESSION_OJPEG)&&
- (tif->tif_dir.td_planarconfig==PLANARCONFIG_SEPARATE))
- {
- if (!_TIFFFillStriles(tif))
- goto bad;
- dp=TIFFReadDirectoryFindEntry(tif,dir,dircount,TIFFTAG_STRIPOFFSETS);
- if ((dp!=0)&&(dp->tdir_count==1))
- {
- dp=TIFFReadDirectoryFindEntry(tif,dir,dircount,
- TIFFTAG_STRIPBYTECOUNTS);
- if ((dp!=0)&&(dp->tdir_count==1))
- {
- tif->tif_dir.td_planarconfig=PLANARCONFIG_CONTIG;
- TIFFWarningExt(tif->tif_clientdata,module,
- "Planarconfig tag value assumed incorrect, "
- "assuming data is contig instead of chunky");
- }
- }
- }
- /*
- * Allocate directory structure and setup defaults.
- */
- if (!TIFFFieldSet(tif,FIELD_IMAGEDIMENSIONS))
- {
- MissingRequired(tif,"ImageLength");
- goto bad;
- }
- /*
- * Setup appropriate structures (by strip or by tile)
- */
- if (!TIFFFieldSet(tif, FIELD_TILEDIMENSIONS)) {
- tif->tif_dir.td_nstrips = TIFFNumberOfStrips(tif);
- tif->tif_dir.td_tilewidth = tif->tif_dir.td_imagewidth;
- tif->tif_dir.td_tilelength = tif->tif_dir.td_rowsperstrip;
- tif->tif_dir.td_tiledepth = tif->tif_dir.td_imagedepth;
- tif->tif_flags &= ~TIFF_ISTILED;
- } else {
- tif->tif_dir.td_nstrips = TIFFNumberOfTiles(tif);
- tif->tif_flags |= TIFF_ISTILED;
- }
- if (!tif->tif_dir.td_nstrips) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Cannot handle zero number of %s",
- isTiled(tif) ? "tiles" : "strips");
- goto bad;
- }
- tif->tif_dir.td_stripsperimage = tif->tif_dir.td_nstrips;
- if (tif->tif_dir.td_planarconfig == PLANARCONFIG_SEPARATE)
- tif->tif_dir.td_stripsperimage /= tif->tif_dir.td_samplesperpixel;
- if (!TIFFFieldSet(tif, FIELD_STRIPOFFSETS)) {
-#ifdef OJPEG_SUPPORT
- if ((tif->tif_dir.td_compression==COMPRESSION_OJPEG) &&
- (isTiled(tif)==0) &&
- (tif->tif_dir.td_nstrips==1)) {
- /*
- * XXX: OJPEG hack.
- * If a) compression is OJPEG, b) it's not a tiled TIFF,
- * and c) the number of strips is 1,
- * then we tolerate the absence of stripoffsets tag,
- * because, presumably, all required data is in the
- * JpegInterchangeFormat stream.
- */
- TIFFSetFieldBit(tif, FIELD_STRIPOFFSETS);
- } else
-#endif
+ uint16_t value;
+ enum TIFFReadDirEntryErr err;
+ err = TIFFReadDirEntryShort(tif, dp, &value);
+ if (err == TIFFReadDirEntryErrCount)
+ err = TIFFReadDirEntryPersampleShort(tif, dp, &value);
+ if (err != TIFFReadDirEntryErrOk)
+ {
+ TIFFReadDirEntryOutputErr(tif, err, module, "Compression", 0);
+ goto bad;
+ }
+ if (!TIFFSetField(tif, TIFFTAG_COMPRESSION, value))
+ goto bad;
+ dp->tdir_ignore = TRUE;
+ }
+ else
+ {
+ if (!TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE))
+ goto bad;
+ }
+ /*
+ * First real pass over the directory.
+ */
+ for (di = 0, dp = dir; di < dircount; di++, dp++)
+ {
+ if (!dp->tdir_ignore)
{
- MissingRequired(tif,
- isTiled(tif) ? "TileOffsets" : "StripOffsets");
- goto bad;
- }
- }
- /*
- * Second pass: extract other information.
- */
- for (di=0, dp=dir; di<dircount; di++, dp++)
- {
- if (!dp->tdir_ignore) {
- switch (dp->tdir_tag)
- {
- case TIFFTAG_MINSAMPLEVALUE:
- case TIFFTAG_MAXSAMPLEVALUE:
- case TIFFTAG_BITSPERSAMPLE:
- case TIFFTAG_DATATYPE:
- case TIFFTAG_SAMPLEFORMAT:
- /*
- * The MinSampleValue, MaxSampleValue, BitsPerSample
- * DataType and SampleFormat tags are supposed to be
- * written as one value/sample, but some vendors
- * incorrectly write one value only -- so we accept
- * that as well (yuck). Other vendors write correct
- * value for NumberOfSamples, but incorrect one for
- * BitsPerSample and friends, and we will read this
- * too.
- */
- {
- uint16 value;
- enum TIFFReadDirEntryErr err;
- err=TIFFReadDirEntryShort(tif,dp,&value);
- if (err==TIFFReadDirEntryErrCount)
- err=TIFFReadDirEntryPersampleShort(tif,dp,&value);
- if (err!=TIFFReadDirEntryErrOk)
- {
- fip = TIFFFieldWithTag(tif,dp->tdir_tag);
- TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",0);
- goto bad;
- }
- if (!TIFFSetField(tif,dp->tdir_tag,value))
- goto bad;
- if( dp->tdir_tag == TIFFTAG_BITSPERSAMPLE )
- bitspersample_read = TRUE;
- }
- break;
- case TIFFTAG_SMINSAMPLEVALUE:
- case TIFFTAG_SMAXSAMPLEVALUE:
- {
-
- double *data = NULL;
- enum TIFFReadDirEntryErr err;
- uint32 saved_flags;
- int m;
- if (dp->tdir_count != (uint64)tif->tif_dir.td_samplesperpixel)
- err = TIFFReadDirEntryErrCount;
- else
- err = TIFFReadDirEntryDoubleArray(tif, dp, &data);
- if (err!=TIFFReadDirEntryErrOk)
- {
- fip = TIFFFieldWithTag(tif,dp->tdir_tag);
- TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",0);
- goto bad;
- }
- saved_flags = tif->tif_flags;
- tif->tif_flags |= TIFF_PERSAMPLE;
- m = TIFFSetField(tif,dp->tdir_tag,data);
- tif->tif_flags = saved_flags;
- _TIFFfree(data);
- if (!m)
- goto bad;
- }
- break;
- case TIFFTAG_STRIPOFFSETS:
- case TIFFTAG_TILEOFFSETS:
- _TIFFmemcpy( &(tif->tif_dir.td_stripoffset_entry),
- dp, sizeof(TIFFDirEntry) );
- break;
- case TIFFTAG_STRIPBYTECOUNTS:
- case TIFFTAG_TILEBYTECOUNTS:
- _TIFFmemcpy( &(tif->tif_dir.td_stripbytecount_entry),
- dp, sizeof(TIFFDirEntry) );
- break;
- case TIFFTAG_COLORMAP:
- case TIFFTAG_TRANSFERFUNCTION:
- {
- enum TIFFReadDirEntryErr err;
- uint32 countpersample;
- uint32 countrequired;
- uint32 incrementpersample;
- uint16* value=NULL;
- /* It would be dangerous to instantiate those tag values */
- /* since if td_bitspersample has not yet been read (due to */
- /* unordered tags), it could be read afterwards with a */
- /* values greater than the default one (1), which may cause */
- /* crashes in user code */
- if( !bitspersample_read )
- {
- fip = TIFFFieldWithTag(tif,dp->tdir_tag);
- TIFFWarningExt(tif->tif_clientdata,module,
- "Ignoring %s since BitsPerSample tag not found",
- fip ? fip->field_name : "unknown tagname");
- continue;
- }
- /* ColorMap or TransferFunction for high bit */
- /* depths do not make much sense and could be */
- /* used as a denial of service vector */
- if (tif->tif_dir.td_bitspersample > 24)
- {
- fip = TIFFFieldWithTag(tif,dp->tdir_tag);
- TIFFWarningExt(tif->tif_clientdata,module,
- "Ignoring %s because BitsPerSample=%d>24",
- fip ? fip->field_name : "unknown tagname",
- tif->tif_dir.td_bitspersample);
- continue;
- }
- countpersample=(1U<<tif->tif_dir.td_bitspersample);
- if ((dp->tdir_tag==TIFFTAG_TRANSFERFUNCTION)&&(dp->tdir_count==(uint64)countpersample))
- {
- countrequired=countpersample;
- incrementpersample=0;
- }
- else
- {
- countrequired=3*countpersample;
- incrementpersample=countpersample;
- }
- if (dp->tdir_count!=(uint64)countrequired)
- err=TIFFReadDirEntryErrCount;
- else
- err=TIFFReadDirEntryShortArray(tif,dp,&value);
- if (err!=TIFFReadDirEntryErrOk)
- {
- fip = TIFFFieldWithTag(tif,dp->tdir_tag);
- TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",1);
- }
- else
- {
- TIFFSetField(tif,dp->tdir_tag,value,value+incrementpersample,value+2*incrementpersample);
- _TIFFfree(value);
- }
- }
- break;
-/* BEGIN REV 4.0 COMPATIBILITY */
- case TIFFTAG_OSUBFILETYPE:
- {
- uint16 valueo;
- uint32 value;
- if (TIFFReadDirEntryShort(tif,dp,&valueo)==TIFFReadDirEntryErrOk)
- {
- switch (valueo)
- {
- case OFILETYPE_REDUCEDIMAGE: value=FILETYPE_REDUCEDIMAGE; break;
- case OFILETYPE_PAGE: value=FILETYPE_PAGE; break;
- default: value=0; break;
- }
- if (value!=0)
- TIFFSetField(tif,TIFFTAG_SUBFILETYPE,value);
- }
- }
- break;
-/* END REV 4.0 COMPATIBILITY */
- default:
- (void) TIFFFetchNormalTag(tif, dp, TRUE);
- break;
- }
- } /* -- if (!dp->tdir_ignore) */
- } /* -- for-loop -- */
-
- if( tif->tif_mode == O_RDWR &&
- tif->tif_dir.td_stripoffset_entry.tdir_tag != 0 &&
- tif->tif_dir.td_stripoffset_entry.tdir_count == 0 &&
- tif->tif_dir.td_stripoffset_entry.tdir_type == 0 &&
- tif->tif_dir.td_stripoffset_entry.tdir_offset.toff_long8 == 0 &&
- tif->tif_dir.td_stripbytecount_entry.tdir_tag != 0 &&
- tif->tif_dir.td_stripbytecount_entry.tdir_count == 0 &&
- tif->tif_dir.td_stripbytecount_entry.tdir_type == 0 &&
- tif->tif_dir.td_stripbytecount_entry.tdir_offset.toff_long8 == 0 )
- {
- /* Directory typically created with TIFFDeferStrileArrayWriting() */
- TIFFSetupStrips(tif);
- }
- else if( !(tif->tif_flags&TIFF_DEFERSTRILELOAD) )
- {
- if( tif->tif_dir.td_stripoffset_entry.tdir_tag != 0 )
- {
- if (!TIFFFetchStripThing(tif,&(tif->tif_dir.td_stripoffset_entry),
- tif->tif_dir.td_nstrips,
- &tif->tif_dir.td_stripoffset_p))
+ TIFFReadDirectoryFindFieldInfo(tif, dp->tdir_tag, &fii);
+ if (fii == FAILED_FII)
+ {
+ TIFFWarningExtR(tif, module,
+ "Unknown field with tag %" PRIu16 " (0x%" PRIx16
+ ") encountered",
+ dp->tdir_tag, dp->tdir_tag);
+ /* the following knowingly leaks the
+ anonymous field structure */
+ if (!_TIFFMergeFields(
+ tif,
+ _TIFFCreateAnonField(tif, dp->tdir_tag,
+ (TIFFDataType)dp->tdir_type),
+ 1))
{
- goto bad;
+ TIFFWarningExtR(
+ tif, module,
+ "Registering anonymous field with tag %" PRIu16
+ " (0x%" PRIx16 ") failed",
+ dp->tdir_tag, dp->tdir_tag);
+ dp->tdir_ignore = TRUE;
+ }
+ else
+ {
+ TIFFReadDirectoryFindFieldInfo(tif, dp->tdir_tag, &fii);
+ assert(fii != FAILED_FII);
}
}
- if( tif->tif_dir.td_stripbytecount_entry.tdir_tag != 0 )
+ }
+ if (!dp->tdir_ignore)
+ {
+ fip = tif->tif_fields[fii];
+ if (fip->field_bit == FIELD_IGNORE)
+ dp->tdir_ignore = TRUE;
+ else
{
- if (!TIFFFetchStripThing(tif,&(tif->tif_dir.td_stripbytecount_entry),
- tif->tif_dir.td_nstrips,
- &tif->tif_dir.td_stripbytecount_p))
+ switch (dp->tdir_tag)
{
- goto bad;
+ case TIFFTAG_STRIPOFFSETS:
+ case TIFFTAG_STRIPBYTECOUNTS:
+ case TIFFTAG_TILEOFFSETS:
+ case TIFFTAG_TILEBYTECOUNTS:
+ TIFFSetFieldBit(tif, fip->field_bit);
+ break;
+ case TIFFTAG_IMAGEWIDTH:
+ case TIFFTAG_IMAGELENGTH:
+ case TIFFTAG_IMAGEDEPTH:
+ case TIFFTAG_TILELENGTH:
+ case TIFFTAG_TILEWIDTH:
+ case TIFFTAG_TILEDEPTH:
+ case TIFFTAG_PLANARCONFIG:
+ case TIFFTAG_ROWSPERSTRIP:
+ case TIFFTAG_EXTRASAMPLES:
+ if (!TIFFFetchNormalTag(tif, dp, 0))
+ goto bad;
+ dp->tdir_ignore = TRUE;
+ break;
+ default:
+ if (!_TIFFCheckFieldIsValidForCodec(tif, dp->tdir_tag))
+ dp->tdir_ignore = TRUE;
+ break;
}
}
}
+ }
+ /*
+ * XXX: OJPEG hack.
+ * If a) compression is OJPEG, b) planarconfig tag says it's separate,
+ * c) strip offsets/bytecounts tag are both present and
+ * d) both contain exactly one value, then we consistently find
+ * that the buggy implementation of the buggy compression scheme
+ * matches contig planarconfig best. So we 'fix-up' the tag here
+ */
+ if ((tif->tif_dir.td_compression == COMPRESSION_OJPEG) &&
+ (tif->tif_dir.td_planarconfig == PLANARCONFIG_SEPARATE))
+ {
+ if (!_TIFFFillStriles(tif))
+ goto bad;
+ dp = TIFFReadDirectoryFindEntry(tif, dir, dircount,
+ TIFFTAG_STRIPOFFSETS);
+ if ((dp != 0) && (dp->tdir_count == 1))
+ {
+ dp = TIFFReadDirectoryFindEntry(tif, dir, dircount,
+ TIFFTAG_STRIPBYTECOUNTS);
+ if ((dp != 0) && (dp->tdir_count == 1))
+ {
+ tif->tif_dir.td_planarconfig = PLANARCONFIG_CONTIG;
+ TIFFWarningExtR(tif, module,
+ "Planarconfig tag value assumed incorrect, "
+ "assuming data is contig instead of chunky");
+ }
+ }
+ }
+ /*
+ * Allocate directory structure and setup defaults.
+ */
+ if (!TIFFFieldSet(tif, FIELD_IMAGEDIMENSIONS))
+ {
+ MissingRequired(tif, "ImageLength");
+ goto bad;
+ }
- /*
- * OJPEG hack:
- * - If a) compression is OJPEG, and b) photometric tag is missing,
- * then we consistently find that photometric should be YCbCr
- * - If a) compression is OJPEG, and b) photometric tag says it's RGB,
- * then we consistently find that the buggy implementation of the
- * buggy compression scheme matches photometric YCbCr instead.
- * - If a) compression is OJPEG, and b) bitspersample tag is missing,
- * then we consistently find bitspersample should be 8.
- * - If a) compression is OJPEG, b) samplesperpixel tag is missing,
- * and c) photometric is RGB or YCbCr, then we consistently find
- * samplesperpixel should be 3
- * - If a) compression is OJPEG, b) samplesperpixel tag is missing,
- * and c) photometric is MINISWHITE or MINISBLACK, then we consistently
- * find samplesperpixel should be 3
- */
- if (tif->tif_dir.td_compression==COMPRESSION_OJPEG)
- {
- if (!TIFFFieldSet(tif,FIELD_PHOTOMETRIC))
- {
- TIFFWarningExt(tif->tif_clientdata, module,
- "Photometric tag is missing, assuming data is YCbCr");
- if (!TIFFSetField(tif,TIFFTAG_PHOTOMETRIC,PHOTOMETRIC_YCBCR))
- goto bad;
- }
- else if (tif->tif_dir.td_photometric==PHOTOMETRIC_RGB)
- {
- tif->tif_dir.td_photometric=PHOTOMETRIC_YCBCR;
- TIFFWarningExt(tif->tif_clientdata, module,
- "Photometric tag value assumed incorrect, "
- "assuming data is YCbCr instead of RGB");
- }
- if (!TIFFFieldSet(tif,FIELD_BITSPERSAMPLE))
- {
- TIFFWarningExt(tif->tif_clientdata,module,
- "BitsPerSample tag is missing, assuming 8 bits per sample");
- if (!TIFFSetField(tif,TIFFTAG_BITSPERSAMPLE,8))
- goto bad;
- }
- if (!TIFFFieldSet(tif,FIELD_SAMPLESPERPIXEL))
- {
- if (tif->tif_dir.td_photometric==PHOTOMETRIC_RGB)
- {
- TIFFWarningExt(tif->tif_clientdata,module,
- "SamplesPerPixel tag is missing, "
- "assuming correct SamplesPerPixel value is 3");
- if (!TIFFSetField(tif,TIFFTAG_SAMPLESPERPIXEL,3))
- goto bad;
- }
- if (tif->tif_dir.td_photometric==PHOTOMETRIC_YCBCR)
- {
- TIFFWarningExt(tif->tif_clientdata,module,
- "SamplesPerPixel tag is missing, "
- "applying correct SamplesPerPixel value of 3");
- if (!TIFFSetField(tif,TIFFTAG_SAMPLESPERPIXEL,3))
- goto bad;
- }
- else if ((tif->tif_dir.td_photometric==PHOTOMETRIC_MINISWHITE)
- || (tif->tif_dir.td_photometric==PHOTOMETRIC_MINISBLACK))
- {
- /*
- * SamplesPerPixel tag is missing, but is not required
- * by spec. Assume correct SamplesPerPixel value of 1.
- */
- if (!TIFFSetField(tif,TIFFTAG_SAMPLESPERPIXEL,1))
- goto bad;
- }
- }
- }
-
- /*
- * Make sure all non-color channels are extrasamples.
- * If it's not the case, define them as such.
- */
- color_channels = _TIFFGetMaxColorChannels(tif->tif_dir.td_photometric);
- if (color_channels && tif->tif_dir.td_samplesperpixel - tif->tif_dir.td_extrasamples > color_channels) {
- uint16 old_extrasamples;
- uint16 *new_sampleinfo;
-
- TIFFWarningExt(tif->tif_clientdata,module, "Sum of Photometric type-related "
- "color channels and ExtraSamples doesn't match SamplesPerPixel. "
- "Defining non-color channels as ExtraSamples.");
-
- old_extrasamples = tif->tif_dir.td_extrasamples;
- tif->tif_dir.td_extrasamples = (uint16) (tif->tif_dir.td_samplesperpixel - color_channels);
-
- // sampleinfo should contain information relative to these new extra samples
- new_sampleinfo = (uint16*) _TIFFcalloc(tif->tif_dir.td_extrasamples, sizeof(uint16));
- if (!new_sampleinfo) {
- TIFFErrorExt(tif->tif_clientdata, module, "Failed to allocate memory for "
- "temporary new sampleinfo array (%d 16 bit elements)",
- tif->tif_dir.td_extrasamples);
- goto bad;
+ /*
+ * Second pass: extract other information.
+ */
+ for (di = 0, dp = dir; di < dircount; di++, dp++)
+ {
+ if (!dp->tdir_ignore)
+ {
+ switch (dp->tdir_tag)
+ {
+ case TIFFTAG_MINSAMPLEVALUE:
+ case TIFFTAG_MAXSAMPLEVALUE:
+ case TIFFTAG_BITSPERSAMPLE:
+ case TIFFTAG_DATATYPE:
+ case TIFFTAG_SAMPLEFORMAT:
+ /*
+ * The MinSampleValue, MaxSampleValue, BitsPerSample
+ * DataType and SampleFormat tags are supposed to be
+ * written as one value/sample, but some vendors
+ * incorrectly write one value only -- so we accept
+ * that as well (yuck). Other vendors write correct
+ * value for NumberOfSamples, but incorrect one for
+ * BitsPerSample and friends, and we will read this
+ * too.
+ */
+ {
+ uint16_t value;
+ enum TIFFReadDirEntryErr err;
+ err = TIFFReadDirEntryShort(tif, dp, &value);
+ if (err == TIFFReadDirEntryErrCount)
+ err =
+ TIFFReadDirEntryPersampleShort(tif, dp, &value);
+ if (err != TIFFReadDirEntryErrOk)
+ {
+ fip = TIFFFieldWithTag(tif, dp->tdir_tag);
+ TIFFReadDirEntryOutputErr(
+ tif, err, module,
+ fip ? fip->field_name : "unknown tagname", 0);
+ goto bad;
+ }
+ if (!TIFFSetField(tif, dp->tdir_tag, value))
+ goto bad;
+ if (dp->tdir_tag == TIFFTAG_BITSPERSAMPLE)
+ bitspersample_read = TRUE;
+ }
+ break;
+ case TIFFTAG_SMINSAMPLEVALUE:
+ case TIFFTAG_SMAXSAMPLEVALUE:
+ {
+
+ double *data = NULL;
+ enum TIFFReadDirEntryErr err;
+ uint32_t saved_flags;
+ int m;
+ if (dp->tdir_count !=
+ (uint64_t)tif->tif_dir.td_samplesperpixel)
+ err = TIFFReadDirEntryErrCount;
+ else
+ err = TIFFReadDirEntryDoubleArray(tif, dp, &data);
+ if (err != TIFFReadDirEntryErrOk)
+ {
+ fip = TIFFFieldWithTag(tif, dp->tdir_tag);
+ TIFFReadDirEntryOutputErr(
+ tif, err, module,
+ fip ? fip->field_name : "unknown tagname", 0);
+ goto bad;
+ }
+ saved_flags = tif->tif_flags;
+ tif->tif_flags |= TIFF_PERSAMPLE;
+ m = TIFFSetField(tif, dp->tdir_tag, data);
+ tif->tif_flags = saved_flags;
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ goto bad;
+ }
+ break;
+ case TIFFTAG_STRIPOFFSETS:
+ case TIFFTAG_TILEOFFSETS:
+ switch (dp->tdir_type)
+ {
+ case TIFF_SHORT:
+ case TIFF_LONG:
+ case TIFF_LONG8:
+ break;
+ default:
+ /* Warn except if directory typically created with
+ * TIFFDeferStrileArrayWriting() */
+ if (!(tif->tif_mode == O_RDWR &&
+ dp->tdir_count == 0 && dp->tdir_type == 0 &&
+ dp->tdir_offset.toff_long8 == 0))
+ {
+ fip = TIFFFieldWithTag(tif, dp->tdir_tag);
+ TIFFWarningExtR(
+ tif, module, "Invalid data type for tag %s",
+ fip ? fip->field_name : "unknown tagname");
+ }
+ break;
+ }
+ _TIFFmemcpy(&(tif->tif_dir.td_stripoffset_entry), dp,
+ sizeof(TIFFDirEntry));
+ break;
+ case TIFFTAG_STRIPBYTECOUNTS:
+ case TIFFTAG_TILEBYTECOUNTS:
+ switch (dp->tdir_type)
+ {
+ case TIFF_SHORT:
+ case TIFF_LONG:
+ case TIFF_LONG8:
+ break;
+ default:
+ /* Warn except if directory typically created with
+ * TIFFDeferStrileArrayWriting() */
+ if (!(tif->tif_mode == O_RDWR &&
+ dp->tdir_count == 0 && dp->tdir_type == 0 &&
+ dp->tdir_offset.toff_long8 == 0))
+ {
+ fip = TIFFFieldWithTag(tif, dp->tdir_tag);
+ TIFFWarningExtR(
+ tif, module, "Invalid data type for tag %s",
+ fip ? fip->field_name : "unknown tagname");
+ }
+ break;
+ }
+ _TIFFmemcpy(&(tif->tif_dir.td_stripbytecount_entry), dp,
+ sizeof(TIFFDirEntry));
+ break;
+ case TIFFTAG_COLORMAP:
+ case TIFFTAG_TRANSFERFUNCTION:
+ {
+ enum TIFFReadDirEntryErr err;
+ uint32_t countpersample;
+ uint32_t countrequired;
+ uint32_t incrementpersample;
+ uint16_t *value = NULL;
+ /* It would be dangerous to instantiate those tag values */
+ /* since if td_bitspersample has not yet been read (due to
+ */
+ /* unordered tags), it could be read afterwards with a */
+ /* values greater than the default one (1), which may cause
+ */
+ /* crashes in user code */
+ if (!bitspersample_read)
+ {
+ fip = TIFFFieldWithTag(tif, dp->tdir_tag);
+ TIFFWarningExtR(
+ tif, module,
+ "Ignoring %s since BitsPerSample tag not found",
+ fip ? fip->field_name : "unknown tagname");
+ continue;
+ }
+ /* ColorMap or TransferFunction for high bit */
+ /* depths do not make much sense and could be */
+ /* used as a denial of service vector */
+ if (tif->tif_dir.td_bitspersample > 24)
+ {
+ fip = TIFFFieldWithTag(tif, dp->tdir_tag);
+ TIFFWarningExtR(
+ tif, module,
+ "Ignoring %s because BitsPerSample=%" PRIu16 ">24",
+ fip ? fip->field_name : "unknown tagname",
+ tif->tif_dir.td_bitspersample);
+ continue;
+ }
+ countpersample = (1U << tif->tif_dir.td_bitspersample);
+ if ((dp->tdir_tag == TIFFTAG_TRANSFERFUNCTION) &&
+ (dp->tdir_count == (uint64_t)countpersample))
+ {
+ countrequired = countpersample;
+ incrementpersample = 0;
+ }
+ else
+ {
+ countrequired = 3 * countpersample;
+ incrementpersample = countpersample;
+ }
+ if (dp->tdir_count != (uint64_t)countrequired)
+ err = TIFFReadDirEntryErrCount;
+ else
+ err = TIFFReadDirEntryShortArray(tif, dp, &value);
+ if (err != TIFFReadDirEntryErrOk)
+ {
+ fip = TIFFFieldWithTag(tif, dp->tdir_tag);
+ TIFFReadDirEntryOutputErr(
+ tif, err, module,
+ fip ? fip->field_name : "unknown tagname", 1);
+ }
+ else
+ {
+ TIFFSetField(tif, dp->tdir_tag, value,
+ value + incrementpersample,
+ value + 2 * incrementpersample);
+ _TIFFfreeExt(tif, value);
+ }
+ }
+ break;
+ /* BEGIN REV 4.0 COMPATIBILITY */
+ case TIFFTAG_OSUBFILETYPE:
+ {
+ uint16_t valueo;
+ uint32_t value;
+ if (TIFFReadDirEntryShort(tif, dp, &valueo) ==
+ TIFFReadDirEntryErrOk)
+ {
+ switch (valueo)
+ {
+ case OFILETYPE_REDUCEDIMAGE:
+ value = FILETYPE_REDUCEDIMAGE;
+ break;
+ case OFILETYPE_PAGE:
+ value = FILETYPE_PAGE;
+ break;
+ default:
+ value = 0;
+ break;
+ }
+ if (value != 0)
+ TIFFSetField(tif, TIFFTAG_SUBFILETYPE, value);
+ }
}
+ break;
+ /* END REV 4.0 COMPATIBILITY */
+ default:
+ (void)TIFFFetchNormalTag(tif, dp, TRUE);
+ break;
+ }
+ } /* -- if (!dp->tdir_ignore) */
+ } /* -- for-loop -- */
- memcpy(new_sampleinfo, tif->tif_dir.td_sampleinfo, old_extrasamples * sizeof(uint16));
- _TIFFsetShortArray(&tif->tif_dir.td_sampleinfo, new_sampleinfo, tif->tif_dir.td_extrasamples);
- _TIFFfree(new_sampleinfo);
- }
-
- /*
- * Verify Palette image has a Colormap.
- */
- if (tif->tif_dir.td_photometric == PHOTOMETRIC_PALETTE &&
- !TIFFFieldSet(tif, FIELD_COLORMAP)) {
- if ( tif->tif_dir.td_bitspersample>=8 && tif->tif_dir.td_samplesperpixel==3)
- tif->tif_dir.td_photometric = PHOTOMETRIC_RGB;
- else if (tif->tif_dir.td_bitspersample>=8)
- tif->tif_dir.td_photometric = PHOTOMETRIC_MINISBLACK;
- else {
- MissingRequired(tif, "Colormap");
- goto bad;
- }
- }
- /*
- * OJPEG hack:
- * We do no further messing with strip/tile offsets/bytecounts in OJPEG
- * TIFFs
- */
- if (tif->tif_dir.td_compression!=COMPRESSION_OJPEG)
- {
- /*
- * Attempt to deal with a missing StripByteCounts tag.
- */
- if (!TIFFFieldSet(tif, FIELD_STRIPBYTECOUNTS)) {
- /*
- * Some manufacturers violate the spec by not giving
- * the size of the strips. In this case, assume there
- * is one uncompressed strip of data.
- */
- if ((tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG &&
- tif->tif_dir.td_nstrips > 1) ||
- (tif->tif_dir.td_planarconfig == PLANARCONFIG_SEPARATE &&
- tif->tif_dir.td_nstrips != (uint32)tif->tif_dir.td_samplesperpixel)) {
- MissingRequired(tif, "StripByteCounts");
- goto bad;
- }
- TIFFWarningExt(tif->tif_clientdata, module,
- "TIFF directory is missing required "
- "\"StripByteCounts\" field, calculating from imagelength");
- if (EstimateStripByteCounts(tif, dir, dircount) < 0)
- goto bad;
-
- } else if (tif->tif_dir.td_nstrips == 1
- && !(tif->tif_flags&TIFF_ISTILED)
- && ByteCountLooksBad(tif)) {
- /*
- * XXX: Plexus (and others) sometimes give a value of
- * zero for a tag when they don't know what the
- * correct value is! Try and handle the simple case
- * of estimating the size of a one strip image.
- */
- TIFFWarningExt(tif->tif_clientdata, module,
- "Bogus \"StripByteCounts\" field, ignoring and calculating from imagelength");
- if(EstimateStripByteCounts(tif, dir, dircount) < 0)
- goto bad;
-
- } else if (!(tif->tif_flags&TIFF_DEFERSTRILELOAD)
- && tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG
- && tif->tif_dir.td_nstrips > 2
- && tif->tif_dir.td_compression == COMPRESSION_NONE
- && TIFFGetStrileByteCount(tif, 0) != TIFFGetStrileByteCount(tif, 1)
- && TIFFGetStrileByteCount(tif, 0) != 0
- && TIFFGetStrileByteCount(tif, 1) != 0 ) {
- /*
- * XXX: Some vendors fill StripByteCount array with
- * absolutely wrong values (it can be equal to
- * StripOffset array, for example). Catch this case
- * here.
- *
- * We avoid this check if deferring strile loading
- * as it would always force us to load the strip/tile
- * information.
- */
- TIFFWarningExt(tif->tif_clientdata, module,
- "Wrong \"StripByteCounts\" field, ignoring and calculating from imagelength");
- if (EstimateStripByteCounts(tif, dir, dircount) < 0)
- goto bad;
- }
- }
- if (dir)
- {
- _TIFFfree(dir);
- dir=NULL;
- }
- if (!TIFFFieldSet(tif, FIELD_MAXSAMPLEVALUE))
- {
- if (tif->tif_dir.td_bitspersample>=16)
- tif->tif_dir.td_maxsamplevalue=0xFFFF;
- else
- tif->tif_dir.td_maxsamplevalue = (uint16)((1L<<tif->tif_dir.td_bitspersample)-1);
- }
+ /*
+ * OJPEG hack:
+ * - If a) compression is OJPEG, and b) photometric tag is missing,
+ * then we consistently find that photometric should be YCbCr
+ * - If a) compression is OJPEG, and b) photometric tag says it's RGB,
+ * then we consistently find that the buggy implementation of the
+ * buggy compression scheme matches photometric YCbCr instead.
+ * - If a) compression is OJPEG, and b) bitspersample tag is missing,
+ * then we consistently find bitspersample should be 8.
+ * - If a) compression is OJPEG, b) samplesperpixel tag is missing,
+ * and c) photometric is RGB or YCbCr, then we consistently find
+ * samplesperpixel should be 3
+ * - If a) compression is OJPEG, b) samplesperpixel tag is missing,
+ * and c) photometric is MINISWHITE or MINISBLACK, then we consistently
+ * find samplesperpixel should be 3
+ */
+ if (tif->tif_dir.td_compression == COMPRESSION_OJPEG)
+ {
+ if (!TIFFFieldSet(tif, FIELD_PHOTOMETRIC))
+ {
+ TIFFWarningExtR(
+ tif, module,
+ "Photometric tag is missing, assuming data is YCbCr");
+ if (!TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_YCBCR))
+ goto bad;
+ }
+ else if (tif->tif_dir.td_photometric == PHOTOMETRIC_RGB)
+ {
+ tif->tif_dir.td_photometric = PHOTOMETRIC_YCBCR;
+ TIFFWarningExtR(tif, module,
+ "Photometric tag value assumed incorrect, "
+ "assuming data is YCbCr instead of RGB");
+ }
+ if (!TIFFFieldSet(tif, FIELD_BITSPERSAMPLE))
+ {
+ TIFFWarningExtR(
+ tif, module,
+ "BitsPerSample tag is missing, assuming 8 bits per sample");
+ if (!TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8))
+ goto bad;
+ }
+ if (!TIFFFieldSet(tif, FIELD_SAMPLESPERPIXEL))
+ {
+ if (tif->tif_dir.td_photometric == PHOTOMETRIC_RGB)
+ {
+ TIFFWarningExtR(tif, module,
+ "SamplesPerPixel tag is missing, "
+ "assuming correct SamplesPerPixel value is 3");
+ if (!TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 3))
+ goto bad;
+ }
+ if (tif->tif_dir.td_photometric == PHOTOMETRIC_YCBCR)
+ {
+ TIFFWarningExtR(tif, module,
+ "SamplesPerPixel tag is missing, "
+ "applying correct SamplesPerPixel value of 3");
+ if (!TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 3))
+ goto bad;
+ }
+ else if ((tif->tif_dir.td_photometric == PHOTOMETRIC_MINISWHITE) ||
+ (tif->tif_dir.td_photometric == PHOTOMETRIC_MINISBLACK))
+ {
+ /*
+ * SamplesPerPixel tag is missing, but is not required
+ * by spec. Assume correct SamplesPerPixel value of 1.
+ */
+ if (!TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1))
+ goto bad;
+ }
+ }
+ }
-#ifdef STRIPBYTECOUNTSORTED_UNUSED
- /*
- * XXX: We can optimize checking for the strip bounds using the sorted
- * bytecounts array. See also comments for TIFFAppendToStrip()
- * function in tif_write.c.
- */
- if (!(tif->tif_flags&TIFF_DEFERSTRILELOAD) && tif->tif_dir.td_nstrips > 1) {
- uint32 strip;
-
- tif->tif_dir.td_stripbytecountsorted = 1;
- for (strip = 1; strip < tif->tif_dir.td_nstrips; strip++) {
- if (TIFFGetStrileOffset(tif, strip - 1) >
- TIFFGetStrileOffset(tif, strip)) {
- tif->tif_dir.td_stripbytecountsorted = 0;
- break;
- }
- }
- }
+ /*
+ * Setup appropriate structures (by strip or by tile)
+ * We do that only after the above OJPEG hack which alters SamplesPerPixel
+ * and thus influences the number of strips in the separate planarconfig.
+ */
+ if (!TIFFFieldSet(tif, FIELD_TILEDIMENSIONS))
+ {
+ tif->tif_dir.td_nstrips = TIFFNumberOfStrips(tif);
+ tif->tif_dir.td_tilewidth = tif->tif_dir.td_imagewidth;
+ tif->tif_dir.td_tilelength = tif->tif_dir.td_rowsperstrip;
+ tif->tif_dir.td_tiledepth = tif->tif_dir.td_imagedepth;
+ tif->tif_flags &= ~TIFF_ISTILED;
+ }
+ else
+ {
+ tif->tif_dir.td_nstrips = TIFFNumberOfTiles(tif);
+ tif->tif_flags |= TIFF_ISTILED;
+ }
+ if (!tif->tif_dir.td_nstrips)
+ {
+ TIFFErrorExtR(tif, module, "Cannot handle zero number of %s",
+ isTiled(tif) ? "tiles" : "strips");
+ goto bad;
+ }
+ tif->tif_dir.td_stripsperimage = tif->tif_dir.td_nstrips;
+ if (tif->tif_dir.td_planarconfig == PLANARCONFIG_SEPARATE)
+ tif->tif_dir.td_stripsperimage /= tif->tif_dir.td_samplesperpixel;
+ if (!TIFFFieldSet(tif, FIELD_STRIPOFFSETS))
+ {
+#ifdef OJPEG_SUPPORT
+ if ((tif->tif_dir.td_compression == COMPRESSION_OJPEG) &&
+ (isTiled(tif) == 0) && (tif->tif_dir.td_nstrips == 1))
+ {
+ /*
+ * XXX: OJPEG hack.
+ * If a) compression is OJPEG, b) it's not a tiled TIFF,
+ * and c) the number of strips is 1,
+ * then we tolerate the absence of stripoffsets tag,
+ * because, presumably, all required data is in the
+ * JpegInterchangeFormat stream.
+ */
+ TIFFSetFieldBit(tif, FIELD_STRIPOFFSETS);
+ }
+ else
#endif
+ {
+ MissingRequired(tif, isTiled(tif) ? "TileOffsets" : "StripOffsets");
+ goto bad;
+ }
+ }
- /*
- * An opportunity for compression mode dependent tag fixup
- */
- (*tif->tif_fixuptags)(tif);
-
- /*
- * Some manufacturers make life difficult by writing
- * large amounts of uncompressed data as a single strip.
- * This is contrary to the recommendations of the spec.
- * The following makes an attempt at breaking such images
- * into strips closer to the recommended 8k bytes. A
- * side effect, however, is that the RowsPerStrip tag
- * value may be changed.
- */
- if ((tif->tif_dir.td_planarconfig==PLANARCONFIG_CONTIG)&&
- (tif->tif_dir.td_nstrips==1)&&
- (tif->tif_dir.td_compression==COMPRESSION_NONE)&&
- ((tif->tif_flags&(TIFF_STRIPCHOP|TIFF_ISTILED))==TIFF_STRIPCHOP))
+ if (tif->tif_mode == O_RDWR &&
+ tif->tif_dir.td_stripoffset_entry.tdir_tag != 0 &&
+ tif->tif_dir.td_stripoffset_entry.tdir_count == 0 &&
+ tif->tif_dir.td_stripoffset_entry.tdir_type == 0 &&
+ tif->tif_dir.td_stripoffset_entry.tdir_offset.toff_long8 == 0 &&
+ tif->tif_dir.td_stripbytecount_entry.tdir_tag != 0 &&
+ tif->tif_dir.td_stripbytecount_entry.tdir_count == 0 &&
+ tif->tif_dir.td_stripbytecount_entry.tdir_type == 0 &&
+ tif->tif_dir.td_stripbytecount_entry.tdir_offset.toff_long8 == 0)
+ {
+ /* Directory typically created with TIFFDeferStrileArrayWriting() */
+ TIFFSetupStrips(tif);
+ }
+ else if (!(tif->tif_flags & TIFF_DEFERSTRILELOAD))
+ {
+ if (tif->tif_dir.td_stripoffset_entry.tdir_tag != 0)
{
- ChopUpSingleUncompressedStrip(tif);
+ if (!TIFFFetchStripThing(tif, &(tif->tif_dir.td_stripoffset_entry),
+ tif->tif_dir.td_nstrips,
+ &tif->tif_dir.td_stripoffset_p))
+ {
+ goto bad;
+ }
}
+ if (tif->tif_dir.td_stripbytecount_entry.tdir_tag != 0)
+ {
+ if (!TIFFFetchStripThing(
+ tif, &(tif->tif_dir.td_stripbytecount_entry),
+ tif->tif_dir.td_nstrips, &tif->tif_dir.td_stripbytecount_p))
+ {
+ goto bad;
+ }
+ }
+ }
- /* There are also uncompressed striped files with strips larger than */
- /* 2 GB, which make them unfriendly with a lot of code. If possible, */
- /* try to expose smaller "virtual" strips. */
- if( tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG &&
- tif->tif_dir.td_compression == COMPRESSION_NONE &&
- (tif->tif_flags&(TIFF_STRIPCHOP|TIFF_ISTILED)) == TIFF_STRIPCHOP &&
- TIFFStripSize64(tif) > 0x7FFFFFFFUL )
+ /*
+ * Make sure all non-color channels are extrasamples.
+ * If it's not the case, define them as such.
+ */
+ color_channels = _TIFFGetMaxColorChannels(tif->tif_dir.td_photometric);
+ if (color_channels &&
+ tif->tif_dir.td_samplesperpixel - tif->tif_dir.td_extrasamples >
+ color_channels)
+ {
+ uint16_t old_extrasamples;
+ uint16_t *new_sampleinfo;
+
+ TIFFWarningExtR(
+ tif, module,
+ "Sum of Photometric type-related "
+ "color channels and ExtraSamples doesn't match SamplesPerPixel. "
+ "Defining non-color channels as ExtraSamples.");
+
+ old_extrasamples = tif->tif_dir.td_extrasamples;
+ tif->tif_dir.td_extrasamples =
+ (uint16_t)(tif->tif_dir.td_samplesperpixel - color_channels);
+
+ // sampleinfo should contain information relative to these new extra
+ // samples
+ new_sampleinfo = (uint16_t *)_TIFFcallocExt(
+ tif, tif->tif_dir.td_extrasamples, sizeof(uint16_t));
+ if (!new_sampleinfo)
{
- TryChopUpUncompressedBigTiff(tif);
+ TIFFErrorExtR(tif, module,
+ "Failed to allocate memory for "
+ "temporary new sampleinfo array "
+ "(%" PRIu16 " 16 bit elements)",
+ tif->tif_dir.td_extrasamples);
+ goto bad;
}
+ if (old_extrasamples > 0)
+ memcpy(new_sampleinfo, tif->tif_dir.td_sampleinfo,
+ old_extrasamples * sizeof(uint16_t));
+ _TIFFsetShortArrayExt(tif, &tif->tif_dir.td_sampleinfo, new_sampleinfo,
+ tif->tif_dir.td_extrasamples);
+ _TIFFfreeExt(tif, new_sampleinfo);
+ }
+
+ /*
+ * Verify Palette image has a Colormap.
+ */
+ if (tif->tif_dir.td_photometric == PHOTOMETRIC_PALETTE &&
+ !TIFFFieldSet(tif, FIELD_COLORMAP))
+ {
+ if (tif->tif_dir.td_bitspersample >= 8 &&
+ tif->tif_dir.td_samplesperpixel == 3)
+ tif->tif_dir.td_photometric = PHOTOMETRIC_RGB;
+ else if (tif->tif_dir.td_bitspersample >= 8)
+ tif->tif_dir.td_photometric = PHOTOMETRIC_MINISBLACK;
+ else
+ {
+ MissingRequired(tif, "Colormap");
+ goto bad;
+ }
+ }
+ /*
+ * OJPEG hack:
+ * We do no further messing with strip/tile offsets/bytecounts in OJPEG
+ * TIFFs
+ */
+ if (tif->tif_dir.td_compression != COMPRESSION_OJPEG)
+ {
/*
- * Clear the dirty directory flag.
+ * Attempt to deal with a missing StripByteCounts tag.
*/
- tif->tif_flags &= ~TIFF_DIRTYDIRECT;
- tif->tif_flags &= ~TIFF_DIRTYSTRIP;
-
- /*
- * Reinitialize i/o since we are starting on a new directory.
- */
- tif->tif_row = (uint32) -1;
- tif->tif_curstrip = (uint32) -1;
- tif->tif_col = (uint32) -1;
- tif->tif_curtile = (uint32) -1;
- tif->tif_tilesize = (tmsize_t) -1;
-
- tif->tif_scanlinesize = TIFFScanlineSize(tif);
- if (!tif->tif_scanlinesize) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Cannot handle zero scanline size");
- return (0);
- }
-
- if (isTiled(tif)) {
- tif->tif_tilesize = TIFFTileSize(tif);
- if (!tif->tif_tilesize) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Cannot handle zero tile size");
- return (0);
- }
- } else {
- if (!TIFFStripSize(tif)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Cannot handle zero strip size");
- return (0);
- }
- }
- return (1);
+ if (!TIFFFieldSet(tif, FIELD_STRIPBYTECOUNTS))
+ {
+ /*
+ * Some manufacturers violate the spec by not giving
+ * the size of the strips. In this case, assume there
+ * is one uncompressed strip of data.
+ */
+ if ((tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG &&
+ tif->tif_dir.td_nstrips > 1) ||
+ (tif->tif_dir.td_planarconfig == PLANARCONFIG_SEPARATE &&
+ tif->tif_dir.td_nstrips !=
+ (uint32_t)tif->tif_dir.td_samplesperpixel))
+ {
+ MissingRequired(tif, "StripByteCounts");
+ goto bad;
+ }
+ TIFFWarningExtR(
+ tif, module,
+ "TIFF directory is missing required "
+ "\"StripByteCounts\" field, calculating from imagelength");
+ if (EstimateStripByteCounts(tif, dir, dircount) < 0)
+ goto bad;
+ }
+ else if (tif->tif_dir.td_nstrips == 1 &&
+ !(tif->tif_flags & TIFF_ISTILED) && ByteCountLooksBad(tif))
+ {
+ /*
+ * XXX: Plexus (and others) sometimes give a value of
+ * zero for a tag when they don't know what the
+ * correct value is! Try and handle the simple case
+ * of estimating the size of a one strip image.
+ */
+ TIFFWarningExtR(tif, module,
+ "Bogus \"StripByteCounts\" field, ignoring and "
+ "calculating from imagelength");
+ if (EstimateStripByteCounts(tif, dir, dircount) < 0)
+ goto bad;
+ }
+ else if (!(tif->tif_flags & TIFF_DEFERSTRILELOAD) &&
+ tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG &&
+ tif->tif_dir.td_nstrips > 2 &&
+ tif->tif_dir.td_compression == COMPRESSION_NONE &&
+ TIFFGetStrileByteCount(tif, 0) !=
+ TIFFGetStrileByteCount(tif, 1) &&
+ TIFFGetStrileByteCount(tif, 0) != 0 &&
+ TIFFGetStrileByteCount(tif, 1) != 0)
+ {
+ /*
+ * XXX: Some vendors fill StripByteCount array with
+ * absolutely wrong values (it can be equal to
+ * StripOffset array, for example). Catch this case
+ * here.
+ *
+ * We avoid this check if deferring strile loading
+ * as it would always force us to load the strip/tile
+ * information.
+ */
+ TIFFWarningExtR(tif, module,
+ "Wrong \"StripByteCounts\" field, ignoring and "
+ "calculating from imagelength");
+ if (EstimateStripByteCounts(tif, dir, dircount) < 0)
+ goto bad;
+ }
+ }
+ if (dir)
+ {
+ _TIFFfreeExt(tif, dir);
+ dir = NULL;
+ }
+ if (!TIFFFieldSet(tif, FIELD_MAXSAMPLEVALUE))
+ {
+ if (tif->tif_dir.td_bitspersample >= 16)
+ tif->tif_dir.td_maxsamplevalue = 0xFFFF;
+ else
+ tif->tif_dir.td_maxsamplevalue =
+ (uint16_t)((1L << tif->tif_dir.td_bitspersample) - 1);
+ }
+
+#ifdef STRIPBYTECOUNTSORTED_UNUSED
+ /*
+ * XXX: We can optimize checking for the strip bounds using the sorted
+ * bytecounts array. See also comments for TIFFAppendToStrip()
+ * function in tif_write.c.
+ */
+ if (!(tif->tif_flags & TIFF_DEFERSTRILELOAD) && tif->tif_dir.td_nstrips > 1)
+ {
+ uint32_t strip;
+
+ tif->tif_dir.td_stripbytecountsorted = 1;
+ for (strip = 1; strip < tif->tif_dir.td_nstrips; strip++)
+ {
+ if (TIFFGetStrileOffset(tif, strip - 1) >
+ TIFFGetStrileOffset(tif, strip))
+ {
+ tif->tif_dir.td_stripbytecountsorted = 0;
+ break;
+ }
+ }
+ }
+#endif
+
+ /*
+ * An opportunity for compression mode dependent tag fixup
+ */
+ (*tif->tif_fixuptags)(tif);
+
+ /*
+ * Some manufacturers make life difficult by writing
+ * large amounts of uncompressed data as a single strip.
+ * This is contrary to the recommendations of the spec.
+ * The following makes an attempt at breaking such images
+ * into strips closer to the recommended 8k bytes. A
+ * side effect, however, is that the RowsPerStrip tag
+ * value may be changed.
+ */
+ if ((tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG) &&
+ (tif->tif_dir.td_nstrips == 1) &&
+ (tif->tif_dir.td_compression == COMPRESSION_NONE) &&
+ ((tif->tif_flags & (TIFF_STRIPCHOP | TIFF_ISTILED)) == TIFF_STRIPCHOP))
+ {
+ ChopUpSingleUncompressedStrip(tif);
+ }
+
+ /* There are also uncompressed striped files with strips larger than */
+ /* 2 GB, which make them unfriendly with a lot of code. If possible, */
+ /* try to expose smaller "virtual" strips. */
+ if (tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG &&
+ tif->tif_dir.td_compression == COMPRESSION_NONE &&
+ (tif->tif_flags & (TIFF_STRIPCHOP | TIFF_ISTILED)) == TIFF_STRIPCHOP &&
+ TIFFStripSize64(tif) > 0x7FFFFFFFUL)
+ {
+ TryChopUpUncompressedBigTiff(tif);
+ }
+
+ /*
+ * Clear the dirty directory flag.
+ */
+ tif->tif_flags &= ~TIFF_DIRTYDIRECT;
+ tif->tif_flags &= ~TIFF_DIRTYSTRIP;
+
+ /*
+ * Reinitialize i/o since we are starting on a new directory.
+ */
+ tif->tif_row = (uint32_t)-1;
+ tif->tif_curstrip = (uint32_t)-1;
+ tif->tif_col = (uint32_t)-1;
+ tif->tif_curtile = (uint32_t)-1;
+ tif->tif_tilesize = (tmsize_t)-1;
+
+ tif->tif_scanlinesize = TIFFScanlineSize(tif);
+ if (!tif->tif_scanlinesize)
+ {
+ TIFFErrorExtR(tif, module, "Cannot handle zero scanline size");
+ return (0);
+ }
+
+ if (isTiled(tif))
+ {
+ tif->tif_tilesize = TIFFTileSize(tif);
+ if (!tif->tif_tilesize)
+ {
+ TIFFErrorExtR(tif, module, "Cannot handle zero tile size");
+ return (0);
+ }
+ }
+ else
+ {
+ if (!TIFFStripSize(tif))
+ {
+ TIFFErrorExtR(tif, module, "Cannot handle zero strip size");
+ return (0);
+ }
+ }
+ return (1);
bad:
- if (dir)
- _TIFFfree(dir);
- return (0);
+ if (dir)
+ _TIFFfreeExt(tif, dir);
+ return (0);
}
-static void
-TIFFReadDirectoryCheckOrder(TIFF* tif, TIFFDirEntry* dir, uint16 dircount)
+static void TIFFReadDirectoryCheckOrder(TIFF *tif, TIFFDirEntry *dir,
+ uint16_t dircount)
{
- static const char module[] = "TIFFReadDirectoryCheckOrder";
- uint16 m;
- uint16 n;
- TIFFDirEntry* o;
- m=0;
- for (n=0, o=dir; n<dircount; n++, o++)
- {
- if (o->tdir_tag<m)
- {
- TIFFWarningExt(tif->tif_clientdata,module,
- "Invalid TIFF directory; tags are not sorted in ascending order");
- break;
- }
- m=o->tdir_tag+1;
- }
+ static const char module[] = "TIFFReadDirectoryCheckOrder";
+ uint16_t m;
+ uint16_t n;
+ TIFFDirEntry *o;
+ m = 0;
+ for (n = 0, o = dir; n < dircount; n++, o++)
+ {
+ if (o->tdir_tag < m)
+ {
+ TIFFWarningExtR(tif, module,
+ "Invalid TIFF directory; tags are not sorted in "
+ "ascending order");
+ break;
+ }
+ m = o->tdir_tag + 1;
+ }
}
-static TIFFDirEntry*
-TIFFReadDirectoryFindEntry(TIFF* tif, TIFFDirEntry* dir, uint16 dircount, uint16 tagid)
+static TIFFDirEntry *TIFFReadDirectoryFindEntry(TIFF *tif, TIFFDirEntry *dir,
+ uint16_t dircount,
+ uint16_t tagid)
{
- TIFFDirEntry* m;
- uint16 n;
- (void) tif;
- for (m=dir, n=0; n<dircount; m++, n++)
- {
- if (m->tdir_tag==tagid)
- return(m);
- }
- return(0);
+ TIFFDirEntry *m;
+ uint16_t n;
+ (void)tif;
+ for (m = dir, n = 0; n < dircount; m++, n++)
+ {
+ if (m->tdir_tag == tagid)
+ return (m);
+ }
+ return (0);
}
-static void
-TIFFReadDirectoryFindFieldInfo(TIFF* tif, uint16 tagid, uint32* fii)
+static void TIFFReadDirectoryFindFieldInfo(TIFF *tif, uint16_t tagid,
+ uint32_t *fii)
{
- int32 ma,mb,mc;
- ma=-1;
- mc=(int32)tif->tif_nfields;
- while (1)
- {
- if (ma+1==mc)
- {
- *fii = FAILED_FII;
- return;
- }
- mb=(ma+mc)/2;
- if (tif->tif_fields[mb]->field_tag==(uint32)tagid)
- break;
- if (tif->tif_fields[mb]->field_tag<(uint32)tagid)
- ma=mb;
- else
- mc=mb;
- }
- while (1)
- {
- if (mb==0)
- break;
- if (tif->tif_fields[mb-1]->field_tag!=(uint32)tagid)
- break;
- mb--;
- }
- *fii=mb;
+ int32_t ma, mb, mc;
+ ma = -1;
+ mc = (int32_t)tif->tif_nfields;
+ while (1)
+ {
+ if (ma + 1 == mc)
+ {
+ *fii = FAILED_FII;
+ return;
+ }
+ mb = (ma + mc) / 2;
+ if (tif->tif_fields[mb]->field_tag == (uint32_t)tagid)
+ break;
+ if (tif->tif_fields[mb]->field_tag < (uint32_t)tagid)
+ ma = mb;
+ else
+ mc = mb;
+ }
+ while (1)
+ {
+ if (mb == 0)
+ break;
+ if (tif->tif_fields[mb - 1]->field_tag != (uint32_t)tagid)
+ break;
+ mb--;
+ }
+ *fii = mb;
}
/*
* Read custom directory from the arbitrary offset.
* The code is very similar to TIFFReadDirectory().
*/
-int
-TIFFReadCustomDirectory(TIFF* tif, toff_t diroff,
- const TIFFFieldArray* infoarray)
+int TIFFReadCustomDirectory(TIFF *tif, toff_t diroff,
+ const TIFFFieldArray *infoarray)
{
- static const char module[] = "TIFFReadCustomDirectory";
- TIFFDirEntry* dir;
- uint16 dircount;
- TIFFDirEntry* dp;
- uint16 di;
- const TIFFField* fip;
- uint32 fii;
- _TIFFSetupFields(tif, infoarray);
- dircount=TIFFFetchDirectory(tif,diroff,&dir,NULL);
- if (!dircount)
- {
- TIFFErrorExt(tif->tif_clientdata,module,
- "Failed to read custom directory at offset " TIFF_UINT64_FORMAT,diroff);
- return 0;
- }
- TIFFFreeDirectory(tif);
- _TIFFmemset(&tif->tif_dir, 0, sizeof(TIFFDirectory));
- TIFFReadDirectoryCheckOrder(tif,dir,dircount);
- for (di=0, dp=dir; di<dircount; di++, dp++)
- {
- TIFFReadDirectoryFindFieldInfo(tif,dp->tdir_tag,&fii);
- if (fii == FAILED_FII)
- {
- TIFFWarningExt(tif->tif_clientdata, module,
- "Unknown field with tag %d (0x%x) encountered",
- dp->tdir_tag, dp->tdir_tag);
- if (!_TIFFMergeFields(tif, _TIFFCreateAnonField(tif,
- dp->tdir_tag,
- (TIFFDataType) dp->tdir_type),
- 1)) {
- TIFFWarningExt(tif->tif_clientdata, module,
- "Registering anonymous field with tag %d (0x%x) failed",
- dp->tdir_tag, dp->tdir_tag);
- dp->tdir_ignore = TRUE;
- } else {
- TIFFReadDirectoryFindFieldInfo(tif,dp->tdir_tag,&fii);
- assert( fii != FAILED_FII );
- }
- }
- if (!dp->tdir_ignore)
- {
- fip=tif->tif_fields[fii];
- if (fip->field_bit==FIELD_IGNORE)
- dp->tdir_ignore = TRUE;
- else
- {
- /* check data type */
- while ((fip->field_type!=TIFF_ANY)&&(fip->field_type!=dp->tdir_type))
- {
- fii++;
- if ((fii==tif->tif_nfields)||
- (tif->tif_fields[fii]->field_tag!=(uint32)dp->tdir_tag))
- {
- fii=0xFFFF;
- break;
- }
- fip=tif->tif_fields[fii];
- }
- if (fii==0xFFFF)
- {
- TIFFWarningExt(tif->tif_clientdata, module,
- "Wrong data type %d for \"%s\"; tag ignored",
- dp->tdir_type,fip->field_name);
- dp->tdir_ignore = TRUE;
- }
- else
- {
- /* check count if known in advance */
- if ((fip->field_readcount!=TIFF_VARIABLE)&&
- (fip->field_readcount!=TIFF_VARIABLE2))
- {
- uint32 expected;
- if (fip->field_readcount==TIFF_SPP)
- expected=(uint32)tif->tif_dir.td_samplesperpixel;
- else
- expected=(uint32)fip->field_readcount;
- if (!CheckDirCount(tif,dp,expected))
- dp->tdir_ignore = TRUE;
- }
- }
- }
- if (!dp->tdir_ignore) {
- switch (dp->tdir_tag)
- {
- case EXIFTAG_SUBJECTDISTANCE:
- (void)TIFFFetchSubjectDistance(tif, dp);
- break;
- default:
- (void)TIFFFetchNormalTag(tif, dp, TRUE);
- break;
- }
- } /*-- if (!dp->tdir_ignore) */
- }
- }
- if (dir)
- _TIFFfree(dir);
- return 1;
+ static const char module[] = "TIFFReadCustomDirectory";
+ TIFFDirEntry *dir;
+ uint16_t dircount;
+ TIFFDirEntry *dp;
+ uint16_t di;
+ const TIFFField *fip;
+ uint32_t fii;
+ (*tif->tif_cleanup)(tif); /* cleanup any previous compression state */
+ _TIFFSetupFields(tif, infoarray);
+ dircount = TIFFFetchDirectory(tif, diroff, &dir, NULL);
+ if (!dircount)
+ {
+ TIFFErrorExtR(tif, module,
+ "Failed to read custom directory at offset %" PRIu64,
+ diroff);
+ return 0;
+ }
+ TIFFFreeDirectory(tif);
+ _TIFFmemset(&tif->tif_dir, 0, sizeof(TIFFDirectory));
+ TIFFReadDirectoryCheckOrder(tif, dir, dircount);
+ for (di = 0, dp = dir; di < dircount; di++, dp++)
+ {
+ TIFFReadDirectoryFindFieldInfo(tif, dp->tdir_tag, &fii);
+ if (fii == FAILED_FII)
+ {
+ TIFFWarningExtR(tif, module,
+ "Unknown field with tag %" PRIu16 " (0x%" PRIx16
+ ") encountered",
+ dp->tdir_tag, dp->tdir_tag);
+ if (!_TIFFMergeFields(
+ tif,
+ _TIFFCreateAnonField(tif, dp->tdir_tag,
+ (TIFFDataType)dp->tdir_type),
+ 1))
+ {
+ TIFFWarningExtR(tif, module,
+ "Registering anonymous field with tag %" PRIu16
+ " (0x%" PRIx16 ") failed",
+ dp->tdir_tag, dp->tdir_tag);
+ dp->tdir_ignore = TRUE;
+ }
+ else
+ {
+ TIFFReadDirectoryFindFieldInfo(tif, dp->tdir_tag, &fii);
+ assert(fii != FAILED_FII);
+ }
+ }
+ if (!dp->tdir_ignore)
+ {
+ fip = tif->tif_fields[fii];
+ if (fip->field_bit == FIELD_IGNORE)
+ dp->tdir_ignore = TRUE;
+ else
+ {
+ /* check data type */
+ while ((fip->field_type != TIFF_ANY) &&
+ (fip->field_type != dp->tdir_type))
+ {
+ fii++;
+ if ((fii == tif->tif_nfields) ||
+ (tif->tif_fields[fii]->field_tag !=
+ (uint32_t)dp->tdir_tag))
+ {
+ fii = 0xFFFF;
+ break;
+ }
+ fip = tif->tif_fields[fii];
+ }
+ if (fii == 0xFFFF)
+ {
+ TIFFWarningExtR(tif, module,
+ "Wrong data type %" PRIu16
+ " for \"%s\"; tag ignored",
+ dp->tdir_type, fip->field_name);
+ dp->tdir_ignore = TRUE;
+ }
+ else
+ {
+ /* check count if known in advance */
+ if ((fip->field_readcount != TIFF_VARIABLE) &&
+ (fip->field_readcount != TIFF_VARIABLE2))
+ {
+ uint32_t expected;
+ if (fip->field_readcount == TIFF_SPP)
+ expected =
+ (uint32_t)tif->tif_dir.td_samplesperpixel;
+ else
+ expected = (uint32_t)fip->field_readcount;
+ if (!CheckDirCount(tif, dp, expected))
+ dp->tdir_ignore = TRUE;
+ }
+ }
+ }
+ if (!dp->tdir_ignore)
+ {
+ switch (dp->tdir_tag)
+ {
+ case EXIFTAG_SUBJECTDISTANCE:
+ if (!TIFFFieldIsAnonymous(fip))
+ {
+ /* should only be called on a Exif directory */
+ /* when exifFields[] is active */
+ (void)TIFFFetchSubjectDistance(tif, dp);
+ }
+ else
+ {
+ (void)TIFFFetchNormalTag(tif, dp, TRUE);
+ }
+ break;
+ default:
+ (void)TIFFFetchNormalTag(tif, dp, TRUE);
+ break;
+ }
+ } /*-- if (!dp->tdir_ignore) */
+ }
+ }
+ if (dir)
+ _TIFFfreeExt(tif, dir);
+ return 1;
}
/*
* EXIF is important special case of custom IFD, so we have a special
* function to read it.
*/
-int
-TIFFReadEXIFDirectory(TIFF* tif, toff_t diroff)
+int TIFFReadEXIFDirectory(TIFF *tif, toff_t diroff)
+{
+ const TIFFFieldArray *exifFieldArray;
+ exifFieldArray = _TIFFGetExifFields();
+ return TIFFReadCustomDirectory(tif, diroff, exifFieldArray);
+}
+
+/*
+ *--: EXIF-GPS custom directory reading as another special case of custom IFD.
+ */
+int TIFFReadGPSDirectory(TIFF *tif, toff_t diroff)
{
- const TIFFFieldArray* exifFieldArray;
- exifFieldArray = _TIFFGetExifFields();
- return TIFFReadCustomDirectory(tif, diroff, exifFieldArray);
+ const TIFFFieldArray *gpsFieldArray;
+ gpsFieldArray = _TIFFGetGpsFields();
+ return TIFFReadCustomDirectory(tif, diroff, gpsFieldArray);
}
-static int
-EstimateStripByteCounts(TIFF* tif, TIFFDirEntry* dir, uint16 dircount)
+static int EstimateStripByteCounts(TIFF *tif, TIFFDirEntry *dir,
+ uint16_t dircount)
{
- static const char module[] = "EstimateStripByteCounts";
+ static const char module[] = "EstimateStripByteCounts";
- TIFFDirEntry *dp;
- TIFFDirectory *td = &tif->tif_dir;
- uint32 strip;
+ TIFFDirEntry *dp;
+ TIFFDirectory *td = &tif->tif_dir;
+ uint32_t strip;
/* Do not try to load stripbytecount as we will compute it */
- if( !_TIFFFillStrilesInternal( tif, 0 ) )
- return -1;
+ if (!_TIFFFillStrilesInternal(tif, 0))
+ return -1;
+
+ if (td->td_stripbytecount_p)
+ _TIFFfreeExt(tif, td->td_stripbytecount_p);
+ td->td_stripbytecount_p = (uint64_t *)_TIFFCheckMalloc(
+ tif, td->td_nstrips, sizeof(uint64_t), "for \"StripByteCounts\" array");
+ if (td->td_stripbytecount_p == NULL)
+ return -1;
- if (td->td_stripbytecount_p)
- _TIFFfree(td->td_stripbytecount_p);
- td->td_stripbytecount_p = (uint64*)
- _TIFFCheckMalloc(tif, td->td_nstrips, sizeof (uint64),
- "for \"StripByteCounts\" array");
- if( td->td_stripbytecount_p == NULL )
+ if (td->td_compression != COMPRESSION_NONE)
+ {
+ uint64_t space;
+ uint64_t filesize;
+ uint16_t n;
+ filesize = TIFFGetFileSize(tif);
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ space = sizeof(TIFFHeaderClassic) + 2 + dircount * 12 + 4;
+ else
+ space = sizeof(TIFFHeaderBig) + 8 + dircount * 20 + 8;
+ /* calculate amount of space used by indirect values */
+ for (dp = dir, n = dircount; n > 0; n--, dp++)
+ {
+ uint32_t typewidth;
+ uint64_t datasize;
+ typewidth = TIFFDataWidth((TIFFDataType)dp->tdir_type);
+ if (typewidth == 0)
+ {
+ TIFFErrorExtR(
+ tif, module,
+ "Cannot determine size of unknown tag type %" PRIu16,
+ dp->tdir_type);
+ return -1;
+ }
+ if (dp->tdir_count > UINT64_MAX / typewidth)
+ return -1;
+ datasize = (uint64_t)typewidth * dp->tdir_count;
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ if (datasize <= 4)
+ datasize = 0;
+ }
+ else
+ {
+ if (datasize <= 8)
+ datasize = 0;
+ }
+ if (space > UINT64_MAX - datasize)
+ return -1;
+ space += datasize;
+ }
+ if (filesize < space)
+ /* we should perhaps return in error ? */
+ space = filesize;
+ else
+ space = filesize - space;
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
+ space /= td->td_samplesperpixel;
+ for (strip = 0; strip < td->td_nstrips; strip++)
+ td->td_stripbytecount_p[strip] = space;
+ /*
+ * This gross hack handles the case were the offset to
+ * the last strip is past the place where we think the strip
+ * should begin. Since a strip of data must be contiguous,
+ * it's safe to assume that we've overestimated the amount
+ * of data in the strip and trim this number back accordingly.
+ */
+ strip--;
+ if (td->td_stripoffset_p[strip] >
+ UINT64_MAX - td->td_stripbytecount_p[strip])
return -1;
+ if (td->td_stripoffset_p[strip] + td->td_stripbytecount_p[strip] >
+ filesize)
+ {
+ if (td->td_stripoffset_p[strip] >= filesize)
+ {
+ /* Not sure what we should in that case... */
+ td->td_stripbytecount_p[strip] = 0;
+ }
+ else
+ {
+ td->td_stripbytecount_p[strip] =
+ filesize - td->td_stripoffset_p[strip];
+ }
+ }
+ }
+ else if (isTiled(tif))
+ {
+ uint64_t bytespertile = TIFFTileSize64(tif);
- if (td->td_compression != COMPRESSION_NONE) {
- uint64 space;
- uint64 filesize;
- uint16 n;
- filesize = TIFFGetFileSize(tif);
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- space=sizeof(TIFFHeaderClassic)+2+dircount*12+4;
- else
- space=sizeof(TIFFHeaderBig)+8+dircount*20+8;
- /* calculate amount of space used by indirect values */
- for (dp = dir, n = dircount; n > 0; n--, dp++)
- {
- uint32 typewidth;
- uint64 datasize;
- typewidth = TIFFDataWidth((TIFFDataType) dp->tdir_type);
- if (typewidth == 0) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Cannot determine size of unknown tag type %d",
- dp->tdir_type);
- return -1;
- }
- if( dp->tdir_count > TIFF_UINT64_MAX / typewidth )
- return -1;
- datasize=(uint64)typewidth*dp->tdir_count;
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- if (datasize<=4)
- datasize=0;
- }
- else
- {
- if (datasize<=8)
- datasize=0;
- }
- if( space > TIFF_UINT64_MAX - datasize )
- return -1;
- space+=datasize;
- }
- if( filesize < space )
- /* we should perhaps return in error ? */
- space = filesize;
- else
- space = filesize - space;
- if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
- space /= td->td_samplesperpixel;
- for (strip = 0; strip < td->td_nstrips; strip++)
- td->td_stripbytecount_p[strip] = space;
- /*
- * This gross hack handles the case were the offset to
- * the last strip is past the place where we think the strip
- * should begin. Since a strip of data must be contiguous,
- * it's safe to assume that we've overestimated the amount
- * of data in the strip and trim this number back accordingly.
- */
- strip--;
- if (td->td_stripoffset_p[strip] > TIFF_UINT64_MAX - td->td_stripbytecount_p[strip])
- return -1;
- if (td->td_stripoffset_p[strip]+td->td_stripbytecount_p[strip] > filesize) {
- if( td->td_stripoffset_p[strip] >= filesize ) {
- /* Not sure what we should in that case... */
- td->td_stripbytecount_p[strip] = 0;
- } else {
- td->td_stripbytecount_p[strip] = filesize - td->td_stripoffset_p[strip];
- }
- }
- } else if (isTiled(tif)) {
- uint64 bytespertile = TIFFTileSize64(tif);
-
- for (strip = 0; strip < td->td_nstrips; strip++)
- td->td_stripbytecount_p[strip] = bytespertile;
- } else {
- uint64 rowbytes = TIFFScanlineSize64(tif);
- uint32 rowsperstrip = td->td_imagelength/td->td_stripsperimage;
- for (strip = 0; strip < td->td_nstrips; strip++)
- {
- if( rowbytes > 0 && rowsperstrip > TIFF_UINT64_MAX / rowbytes )
- return -1;
- td->td_stripbytecount_p[strip] = rowbytes * rowsperstrip;
- }
- }
- TIFFSetFieldBit(tif, FIELD_STRIPBYTECOUNTS);
- if (!TIFFFieldSet(tif, FIELD_ROWSPERSTRIP))
- td->td_rowsperstrip = td->td_imagelength;
- return 1;
+ for (strip = 0; strip < td->td_nstrips; strip++)
+ td->td_stripbytecount_p[strip] = bytespertile;
+ }
+ else
+ {
+ uint64_t rowbytes = TIFFScanlineSize64(tif);
+ uint32_t rowsperstrip = td->td_imagelength / td->td_stripsperimage;
+ for (strip = 0; strip < td->td_nstrips; strip++)
+ {
+ if (rowbytes > 0 && rowsperstrip > UINT64_MAX / rowbytes)
+ return -1;
+ td->td_stripbytecount_p[strip] = rowbytes * rowsperstrip;
+ }
+ }
+ TIFFSetFieldBit(tif, FIELD_STRIPBYTECOUNTS);
+ if (!TIFFFieldSet(tif, FIELD_ROWSPERSTRIP))
+ td->td_rowsperstrip = td->td_imagelength;
+ return 1;
}
-static void
-MissingRequired(TIFF* tif, const char* tagname)
+static void MissingRequired(TIFF *tif, const char *tagname)
{
- static const char module[] = "MissingRequired";
+ static const char module[] = "MissingRequired";
- TIFFErrorExt(tif->tif_clientdata, module,
- "TIFF directory is missing required \"%s\" field",
- tagname);
+ TIFFErrorExtR(tif, module,
+ "TIFF directory is missing required \"%s\" field", tagname);
+}
+
+static unsigned long hashFuncOffsetToNumber(const void *elt)
+{
+ const TIFFOffsetAndDirNumber *offsetAndDirNumber =
+ (const TIFFOffsetAndDirNumber *)elt;
+ const uint32_t hash = (uint32_t)(offsetAndDirNumber->offset >> 32) ^
+ ((uint32_t)offsetAndDirNumber->offset & 0xFFFFFFFFU);
+ return hash;
+}
+
+static bool equalFuncOffsetToNumber(const void *elt1, const void *elt2)
+{
+ const TIFFOffsetAndDirNumber *offsetAndDirNumber1 =
+ (const TIFFOffsetAndDirNumber *)elt1;
+ const TIFFOffsetAndDirNumber *offsetAndDirNumber2 =
+ (const TIFFOffsetAndDirNumber *)elt2;
+ return offsetAndDirNumber1->offset == offsetAndDirNumber2->offset;
+}
+
+static unsigned long hashFuncNumberToOffset(const void *elt)
+{
+ const TIFFOffsetAndDirNumber *offsetAndDirNumber =
+ (const TIFFOffsetAndDirNumber *)elt;
+ return offsetAndDirNumber->dirNumber;
+}
+
+static bool equalFuncNumberToOffset(const void *elt1, const void *elt2)
+{
+ const TIFFOffsetAndDirNumber *offsetAndDirNumber1 =
+ (const TIFFOffsetAndDirNumber *)elt1;
+ const TIFFOffsetAndDirNumber *offsetAndDirNumber2 =
+ (const TIFFOffsetAndDirNumber *)elt2;
+ return offsetAndDirNumber1->dirNumber == offsetAndDirNumber2->dirNumber;
}
/*
- * Check the directory offset against the list of already seen directory
- * offsets. This is a trick to prevent IFD looping. The one can create TIFF
- * file with looped directory pointers. We will maintain a list of already
- * seen directories and check every IFD offset against that list.
+ * Check the directory number and offset against the list of already seen
+ * directory numbers and offsets. This is a trick to prevent IFD looping.
+ * The one can create TIFF file with looped directory pointers. We will
+ * maintain a list of already seen directories and check every IFD offset
+ * and its IFD number against that list. However, the offset of an IFD number
+ * can change - e.g. when writing updates to file.
+ * Returns 1 if all is ok; 0 if last directory or IFD loop is encountered,
+ * or an error has occurred.
*/
-static int
-TIFFCheckDirOffset(TIFF* tif, uint64 diroff)
+int _TIFFCheckDirNumberAndOffset(TIFF *tif, tdir_t dirn, uint64_t diroff)
{
- uint16 n;
-
- if (diroff == 0) /* no more directories */
- return 0;
- if (tif->tif_dirnumber == 65535) {
- TIFFErrorExt(tif->tif_clientdata, "TIFFCheckDirOffset",
- "Cannot handle more than 65535 TIFF directories");
- return 0;
- }
-
- for (n = 0; n < tif->tif_dirnumber && tif->tif_dirlist; n++) {
- if (tif->tif_dirlist[n] == diroff)
- return 0;
- }
-
- tif->tif_dirnumber++;
-
- if (tif->tif_dirlist == NULL || tif->tif_dirnumber > tif->tif_dirlistsize) {
- uint64* new_dirlist;
-
- /*
- * XXX: Reduce memory allocation granularity of the dirlist
- * array.
- */
- new_dirlist = (uint64*)_TIFFCheckRealloc(tif, tif->tif_dirlist,
- tif->tif_dirnumber, 2 * sizeof(uint64), "for IFD list");
- if (!new_dirlist)
- return 0;
- if( tif->tif_dirnumber >= 32768 )
- tif->tif_dirlistsize = 65535;
- else
- tif->tif_dirlistsize = 2 * tif->tif_dirnumber;
- tif->tif_dirlist = new_dirlist;
- }
-
- tif->tif_dirlist[tif->tif_dirnumber - 1] = diroff;
-
- return 1;
-}
+ if (diroff == 0) /* no more directories */
+ return 0;
+
+ if (tif->tif_map_dir_offset_to_number == NULL)
+ {
+ tif->tif_map_dir_offset_to_number = TIFFHashSetNew(
+ hashFuncOffsetToNumber, equalFuncOffsetToNumber, free);
+ if (tif->tif_map_dir_offset_to_number == NULL)
+ {
+ TIFFErrorExtR(tif, "_TIFFCheckDirNumberAndOffset",
+ "Not enough memory");
+ return 1;
+ }
+ }
+
+ if (tif->tif_map_dir_number_to_offset == NULL)
+ {
+ /* No free callback for this map, as it shares the same items as
+ * tif->tif_map_dir_offset_to_number. */
+ tif->tif_map_dir_number_to_offset = TIFFHashSetNew(
+ hashFuncNumberToOffset, equalFuncNumberToOffset, NULL);
+ if (tif->tif_map_dir_number_to_offset == NULL)
+ {
+ TIFFErrorExtR(tif, "_TIFFCheckDirNumberAndOffset",
+ "Not enough memory");
+ return 1;
+ }
+ }
+
+ /* Check if offset is already in the list:
+ * - yes: check, if offset is at the same IFD number - if not, it is an IFD
+ * loop
+ * - no: add to list or update offset at that IFD number
+ */
+ TIFFOffsetAndDirNumber entry;
+ entry.offset = diroff;
+ entry.dirNumber = dirn;
+
+ TIFFOffsetAndDirNumber *foundEntry =
+ (TIFFOffsetAndDirNumber *)TIFFHashSetLookup(
+ tif->tif_map_dir_offset_to_number, &entry);
+ if (foundEntry)
+ {
+ if (foundEntry->dirNumber == dirn)
+ {
+ return 1;
+ }
+ else
+ {
+ TIFFWarningExtR(tif, "_TIFFCheckDirNumberAndOffset",
+ "TIFF directory %d has IFD looping to directory %u "
+ "at offset 0x%" PRIx64 " (%" PRIu64 ")",
+ (int)dirn - 1, foundEntry->dirNumber, diroff,
+ diroff);
+ return 0;
+ }
+ }
+
+ /* Check if offset of an IFD has been changed and update offset of that IFD
+ * number. */
+ foundEntry = (TIFFOffsetAndDirNumber *)TIFFHashSetLookup(
+ tif->tif_map_dir_number_to_offset, &entry);
+ if (foundEntry)
+ {
+ if (foundEntry->offset != diroff)
+ {
+ TIFFOffsetAndDirNumber entryOld;
+ entryOld.offset = foundEntry->offset;
+ entryOld.dirNumber = dirn;
+ /* We must remove first from tif_map_dir_number_to_offset as the */
+ /* entry is owned (and thus freed) by */
+ /* tif_map_dir_offset_to_number */
+ TIFFOffsetAndDirNumber *foundEntryOld =
+ (TIFFOffsetAndDirNumber *)TIFFHashSetLookup(
+ tif->tif_map_dir_number_to_offset, &entryOld);
+ if (foundEntryOld)
+ {
+ TIFFHashSetRemove(tif->tif_map_dir_number_to_offset,
+ foundEntryOld);
+ }
+ foundEntryOld = (TIFFOffsetAndDirNumber *)TIFFHashSetLookup(
+ tif->tif_map_dir_offset_to_number, &entryOld);
+ if (foundEntryOld)
+ {
+ TIFFHashSetRemove(tif->tif_map_dir_offset_to_number,
+ foundEntryOld);
+ }
+
+ TIFFOffsetAndDirNumber *entryPtr = (TIFFOffsetAndDirNumber *)malloc(
+ sizeof(TIFFOffsetAndDirNumber));
+ if (entryPtr == NULL)
+ {
+ return 0;
+ }
+
+ /* Add IFD offset and dirn to IFD directory list */
+ *entryPtr = entry;
+
+ if (!TIFFHashSetInsert(tif->tif_map_dir_offset_to_number, entryPtr))
+ {
+ TIFFErrorExtR(
+ tif, "_TIFFCheckDirNumberAndOffset",
+ "Insertion in tif_map_dir_offset_to_number failed");
+ return 0;
+ }
+ if (!TIFFHashSetInsert(tif->tif_map_dir_number_to_offset, entryPtr))
+ {
+ TIFFErrorExtR(
+ tif, "_TIFFCheckDirNumberAndOffset",
+ "Insertion in tif_map_dir_number_to_offset failed");
+ return 0;
+ }
+ }
+ return 1;
+ }
+
+ /* Arbitrary (hopefully big enough) limit */
+ if (tif->tif_dirnumber >= TIFF_MAX_DIR_COUNT)
+ {
+ TIFFErrorExtR(tif, "_TIFFCheckDirNumberAndOffset",
+ "Cannot handle more than %u TIFF directories",
+ TIFF_MAX_DIR_COUNT);
+ return 0;
+ }
+
+ TIFFOffsetAndDirNumber *entryPtr =
+ (TIFFOffsetAndDirNumber *)malloc(sizeof(TIFFOffsetAndDirNumber));
+ if (entryPtr == NULL)
+ {
+ TIFFErrorExtR(tif, "_TIFFCheckDirNumberAndOffset",
+ "malloc(sizeof(TIFFOffsetAndDirNumber)) failed");
+ return 0;
+ }
+
+ /* Add IFD offset and dirn to IFD directory list */
+ *entryPtr = entry;
+
+ if (!TIFFHashSetInsert(tif->tif_map_dir_offset_to_number, entryPtr))
+ {
+ TIFFErrorExtR(tif, "_TIFFCheckDirNumberAndOffset",
+ "Insertion in tif_map_dir_offset_to_number failed");
+ return 0;
+ }
+ if (!TIFFHashSetInsert(tif->tif_map_dir_number_to_offset, entryPtr))
+ {
+ TIFFErrorExtR(tif, "_TIFFCheckDirNumberAndOffset",
+ "Insertion in tif_map_dir_number_to_offset failed");
+ return 0;
+ }
+
+ tif->tif_dirnumber++;
+
+ return 1;
+} /* --- _TIFFCheckDirNumberAndOffset() ---*/
+
+/*
+ * Retrieve the matching IFD directory number of a given IFD offset
+ * from the list of directories already seen.
+ * Returns 1 if the offset was in the list and the directory number
+ * can be returned.
+ * Otherwise returns 0 or if an error occurred.
+ */
+int _TIFFGetDirNumberFromOffset(TIFF *tif, uint64_t diroff, tdir_t *dirn)
+{
+ if (diroff == 0) /* no more directories */
+ return 0;
+ if (tif->tif_dirnumber >= TIFF_MAX_DIR_COUNT)
+ {
+ TIFFErrorExtR(tif, "_TIFFGetDirNumberFromOffset",
+ "Cannot handle more than %u TIFF directories",
+ TIFF_MAX_DIR_COUNT);
+ return 0;
+ }
+
+ /* Check if offset is already in the list and return matching directory
+ * number. Otherwise update IFD list using TIFFNumberOfDirectories() and
+ * search again in IFD list.
+ */
+ if (tif->tif_map_dir_offset_to_number == NULL)
+ return 0;
+ TIFFOffsetAndDirNumber entry;
+ entry.offset = diroff;
+ entry.dirNumber = 0; /* not used */
+
+ TIFFOffsetAndDirNumber *foundEntry =
+ (TIFFOffsetAndDirNumber *)TIFFHashSetLookup(
+ tif->tif_map_dir_offset_to_number, &entry);
+ if (foundEntry)
+ {
+ *dirn = foundEntry->dirNumber;
+ return 1;
+ }
+
+ TIFFNumberOfDirectories(tif);
+
+ foundEntry = (TIFFOffsetAndDirNumber *)TIFFHashSetLookup(
+ tif->tif_map_dir_offset_to_number, &entry);
+ if (foundEntry)
+ {
+ *dirn = foundEntry->dirNumber;
+ return 1;
+ }
+
+ return 0;
+} /*--- _TIFFGetDirNumberFromOffset() ---*/
/*
* Check the count field of a directory entry against a known value. The
* caller is expected to skip/ignore the tag if there is a mismatch.
*/
-static int
-CheckDirCount(TIFF* tif, TIFFDirEntry* dir, uint32 count)
+static int CheckDirCount(TIFF *tif, TIFFDirEntry *dir, uint32_t count)
{
- if ((uint64)count > dir->tdir_count) {
- const TIFFField* fip = TIFFFieldWithTag(tif, dir->tdir_tag);
- TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
- "incorrect count for field \"%s\" (" TIFF_UINT64_FORMAT ", expecting %u); tag ignored",
- fip ? fip->field_name : "unknown tagname",
- dir->tdir_count, count);
- return (0);
- } else if ((uint64)count < dir->tdir_count) {
- const TIFFField* fip = TIFFFieldWithTag(tif, dir->tdir_tag);
- TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
- "incorrect count for field \"%s\" (" TIFF_UINT64_FORMAT ", expecting %u); tag trimmed",
- fip ? fip->field_name : "unknown tagname",
- dir->tdir_count, count);
- dir->tdir_count = count;
- return (1);
- }
- return (1);
+ if ((uint64_t)count > dir->tdir_count)
+ {
+ const TIFFField *fip = TIFFFieldWithTag(tif, dir->tdir_tag);
+ TIFFWarningExtR(tif, tif->tif_name,
+ "incorrect count for field \"%s\" (%" PRIu64
+ ", expecting %" PRIu32 "); tag ignored",
+ fip ? fip->field_name : "unknown tagname",
+ dir->tdir_count, count);
+ return (0);
+ }
+ else if ((uint64_t)count < dir->tdir_count)
+ {
+ const TIFFField *fip = TIFFFieldWithTag(tif, dir->tdir_tag);
+ TIFFWarningExtR(tif, tif->tif_name,
+ "incorrect count for field \"%s\" (%" PRIu64
+ ", expecting %" PRIu32 "); tag trimmed",
+ fip ? fip->field_name : "unknown tagname",
+ dir->tdir_count, count);
+ dir->tdir_count = count;
+ return (1);
+ }
+ return (1);
}
/*
@@ -4702,1088 +5572,1546 @@ CheckDirCount(TIFF* tif, TIFFDirEntry* dir, uint32 count)
* nextdiroff variable has been specified, read it too. Function returns a
* number of fields in the directory or 0 if failed.
*/
-static uint16
-TIFFFetchDirectory(TIFF* tif, uint64 diroff, TIFFDirEntry** pdir,
- uint64 *nextdiroff)
+static uint16_t TIFFFetchDirectory(TIFF *tif, uint64_t diroff,
+ TIFFDirEntry **pdir, uint64_t *nextdiroff)
{
- static const char module[] = "TIFFFetchDirectory";
-
- void* origdir;
- uint16 dircount16;
- uint32 dirsize;
- TIFFDirEntry* dir;
- uint8* ma;
- TIFFDirEntry* mb;
- uint16 n;
-
- assert(pdir);
-
- tif->tif_diroff = diroff;
- if (nextdiroff)
- *nextdiroff = 0;
- if (!isMapped(tif)) {
- if (!SeekOK(tif, tif->tif_diroff)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Seek error accessing TIFF directory",
- tif->tif_name);
- return 0;
- }
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- if (!ReadOK(tif, &dircount16, sizeof (uint16))) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Can not read TIFF directory count",
- tif->tif_name);
- return 0;
- }
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabShort(&dircount16);
- if (dircount16>4096)
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Sanity check on directory count failed, this is probably not a valid IFD offset");
- return 0;
- }
- dirsize = 12;
- } else {
- uint64 dircount64;
- if (!ReadOK(tif, &dircount64, sizeof (uint64))) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Can not read TIFF directory count",
- tif->tif_name);
- return 0;
- }
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong8(&dircount64);
- if (dircount64>4096)
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Sanity check on directory count failed, this is probably not a valid IFD offset");
- return 0;
- }
- dircount16 = (uint16)dircount64;
- dirsize = 20;
- }
- origdir = _TIFFCheckMalloc(tif, dircount16,
- dirsize, "to read TIFF directory");
- if (origdir == NULL)
- return 0;
- if (!ReadOK(tif, origdir, (tmsize_t)(dircount16*dirsize))) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%.100s: Can not read TIFF directory",
- tif->tif_name);
- _TIFFfree(origdir);
- return 0;
- }
- /*
- * Read offset to next directory for sequential scans if
- * needed.
- */
- if (nextdiroff)
- {
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- uint32 nextdiroff32;
- if (!ReadOK(tif, &nextdiroff32, sizeof(uint32)))
- nextdiroff32 = 0;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(&nextdiroff32);
- *nextdiroff=nextdiroff32;
- } else {
- if (!ReadOK(tif, nextdiroff, sizeof(uint64)))
- *nextdiroff = 0;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8(nextdiroff);
- }
- }
- } else {
- tmsize_t m;
- tmsize_t off;
- if (tif->tif_diroff > (uint64)TIFF_INT64_MAX)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Can not read TIFF directory count");
- return(0);
- }
- off = (tmsize_t) tif->tif_diroff;
-
- /*
- * Check for integer overflow when validating the dir_off,
- * otherwise a very high offset may cause an OOB read and
- * crash the client. Make two comparisons instead of
- *
- * off + sizeof(uint16) > tif->tif_size
- *
- * to avoid overflow.
- */
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- m=off+sizeof(uint16);
- if ((m<off)||(m<(tmsize_t)sizeof(uint16))||(m>tif->tif_size)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Can not read TIFF directory count");
- return 0;
- } else {
- _TIFFmemcpy(&dircount16, tif->tif_base + off,
- sizeof(uint16));
- }
- off += sizeof (uint16);
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabShort(&dircount16);
- if (dircount16>4096)
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Sanity check on directory count failed, this is probably not a valid IFD offset");
- return 0;
- }
- dirsize = 12;
- }
- else
- {
- uint64 dircount64;
- m=off+sizeof(uint64);
- if ((m<off)||(m<(tmsize_t)sizeof(uint64))||(m>tif->tif_size)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Can not read TIFF directory count");
- return 0;
- } else {
- _TIFFmemcpy(&dircount64, tif->tif_base + off,
- sizeof(uint64));
- }
- off += sizeof (uint64);
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong8(&dircount64);
- if (dircount64>4096)
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Sanity check on directory count failed, this is probably not a valid IFD offset");
- return 0;
- }
- dircount16 = (uint16)dircount64;
- dirsize = 20;
- }
- if (dircount16 == 0 )
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Sanity check on directory count failed, zero tag directories not supported");
- return 0;
- }
- origdir = _TIFFCheckMalloc(tif, dircount16,
- dirsize,
- "to read TIFF directory");
- if (origdir == NULL)
- return 0;
- m=off+dircount16*dirsize;
- if ((m<off)||(m<(tmsize_t)(dircount16*dirsize))||(m>tif->tif_size)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Can not read TIFF directory");
- _TIFFfree(origdir);
- return 0;
- } else {
- _TIFFmemcpy(origdir, tif->tif_base + off,
- dircount16 * dirsize);
- }
- if (nextdiroff) {
- off += dircount16 * dirsize;
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- uint32 nextdiroff32;
- m=off+sizeof(uint32);
- if ((m<off)||(m<(tmsize_t)sizeof(uint32))||(m>tif->tif_size))
- nextdiroff32 = 0;
- else
- _TIFFmemcpy(&nextdiroff32, tif->tif_base + off,
- sizeof (uint32));
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(&nextdiroff32);
- *nextdiroff = nextdiroff32;
- }
- else
- {
- m=off+sizeof(uint64);
- if ((m<off)||(m<(tmsize_t)sizeof(uint64))||(m>tif->tif_size))
- *nextdiroff = 0;
- else
- _TIFFmemcpy(nextdiroff, tif->tif_base + off,
- sizeof (uint64));
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8(nextdiroff);
- }
- }
- }
- dir = (TIFFDirEntry*)_TIFFCheckMalloc(tif, dircount16,
- sizeof(TIFFDirEntry),
- "to read TIFF directory");
- if (dir==0)
- {
- _TIFFfree(origdir);
- return 0;
- }
- ma=(uint8*)origdir;
- mb=dir;
- for (n=0; n<dircount16; n++)
- {
- mb->tdir_ignore = FALSE;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort((uint16*)ma);
- mb->tdir_tag=*(uint16*)ma;
- ma+=sizeof(uint16);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort((uint16*)ma);
- mb->tdir_type=*(uint16*)ma;
- ma+=sizeof(uint16);
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong((uint32*)ma);
- mb->tdir_count=(uint64)(*(uint32*)ma);
- ma+=sizeof(uint32);
- mb->tdir_offset.toff_long8=0;
- *(uint32*)(&mb->tdir_offset)=*(uint32*)ma;
- ma+=sizeof(uint32);
- }
- else
- {
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8((uint64*)ma);
- mb->tdir_count=TIFFReadUInt64(ma);
- ma+=sizeof(uint64);
- mb->tdir_offset.toff_long8=TIFFReadUInt64(ma);
- ma+=sizeof(uint64);
- }
- mb++;
- }
- _TIFFfree(origdir);
- *pdir = dir;
- return dircount16;
+ static const char module[] = "TIFFFetchDirectory";
+
+ void *origdir;
+ uint16_t dircount16;
+ uint32_t dirsize;
+ TIFFDirEntry *dir;
+ uint8_t *ma;
+ TIFFDirEntry *mb;
+ uint16_t n;
+
+ assert(pdir);
+
+ tif->tif_diroff = diroff;
+ if (nextdiroff)
+ *nextdiroff = 0;
+ if (!isMapped(tif))
+ {
+ if (!SeekOK(tif, tif->tif_diroff))
+ {
+ TIFFErrorExtR(tif, module,
+ "%s: Seek error accessing TIFF directory",
+ tif->tif_name);
+ return 0;
+ }
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ if (!ReadOK(tif, &dircount16, sizeof(uint16_t)))
+ {
+ TIFFErrorExtR(tif, module,
+ "%s: Can not read TIFF directory count",
+ tif->tif_name);
+ return 0;
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(&dircount16);
+ if (dircount16 > 4096)
+ {
+ TIFFErrorExtR(tif, module,
+ "Sanity check on directory count failed, this is "
+ "probably not a valid IFD offset");
+ return 0;
+ }
+ dirsize = 12;
+ }
+ else
+ {
+ uint64_t dircount64;
+ if (!ReadOK(tif, &dircount64, sizeof(uint64_t)))
+ {
+ TIFFErrorExtR(tif, module,
+ "%s: Can not read TIFF directory count",
+ tif->tif_name);
+ return 0;
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(&dircount64);
+ if (dircount64 > 4096)
+ {
+ TIFFErrorExtR(tif, module,
+ "Sanity check on directory count failed, this is "
+ "probably not a valid IFD offset");
+ return 0;
+ }
+ dircount16 = (uint16_t)dircount64;
+ dirsize = 20;
+ }
+ origdir = _TIFFCheckMalloc(tif, dircount16, dirsize,
+ "to read TIFF directory");
+ if (origdir == NULL)
+ return 0;
+ if (!ReadOK(tif, origdir, (tmsize_t)(dircount16 * dirsize)))
+ {
+ TIFFErrorExtR(tif, module, "%.100s: Can not read TIFF directory",
+ tif->tif_name);
+ _TIFFfreeExt(tif, origdir);
+ return 0;
+ }
+ /*
+ * Read offset to next directory for sequential scans if
+ * needed.
+ */
+ if (nextdiroff)
+ {
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ uint32_t nextdiroff32;
+ if (!ReadOK(tif, &nextdiroff32, sizeof(uint32_t)))
+ nextdiroff32 = 0;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&nextdiroff32);
+ *nextdiroff = nextdiroff32;
+ }
+ else
+ {
+ if (!ReadOK(tif, nextdiroff, sizeof(uint64_t)))
+ *nextdiroff = 0;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(nextdiroff);
+ }
+ }
+ }
+ else
+ {
+ tmsize_t m;
+ tmsize_t off;
+ if (tif->tif_diroff > (uint64_t)INT64_MAX)
+ {
+ TIFFErrorExtR(tif, module, "Can not read TIFF directory count");
+ return (0);
+ }
+ off = (tmsize_t)tif->tif_diroff;
+
+ /*
+ * Check for integer overflow when validating the dir_off,
+ * otherwise a very high offset may cause an OOB read and
+ * crash the client. Make two comparisons instead of
+ *
+ * off + sizeof(uint16_t) > tif->tif_size
+ *
+ * to avoid overflow.
+ */
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ m = off + sizeof(uint16_t);
+ if ((m < off) || (m < (tmsize_t)sizeof(uint16_t)) ||
+ (m > tif->tif_size))
+ {
+ TIFFErrorExtR(tif, module, "Can not read TIFF directory count");
+ return 0;
+ }
+ else
+ {
+ _TIFFmemcpy(&dircount16, tif->tif_base + off, sizeof(uint16_t));
+ }
+ off += sizeof(uint16_t);
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(&dircount16);
+ if (dircount16 > 4096)
+ {
+ TIFFErrorExtR(tif, module,
+ "Sanity check on directory count failed, this is "
+ "probably not a valid IFD offset");
+ return 0;
+ }
+ dirsize = 12;
+ }
+ else
+ {
+ uint64_t dircount64;
+ m = off + sizeof(uint64_t);
+ if ((m < off) || (m < (tmsize_t)sizeof(uint64_t)) ||
+ (m > tif->tif_size))
+ {
+ TIFFErrorExtR(tif, module, "Can not read TIFF directory count");
+ return 0;
+ }
+ else
+ {
+ _TIFFmemcpy(&dircount64, tif->tif_base + off, sizeof(uint64_t));
+ }
+ off += sizeof(uint64_t);
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(&dircount64);
+ if (dircount64 > 4096)
+ {
+ TIFFErrorExtR(tif, module,
+ "Sanity check on directory count failed, this is "
+ "probably not a valid IFD offset");
+ return 0;
+ }
+ dircount16 = (uint16_t)dircount64;
+ dirsize = 20;
+ }
+ if (dircount16 == 0)
+ {
+ TIFFErrorExtR(tif, module,
+ "Sanity check on directory count failed, zero tag "
+ "directories not supported");
+ return 0;
+ }
+ origdir = _TIFFCheckMalloc(tif, dircount16, dirsize,
+ "to read TIFF directory");
+ if (origdir == NULL)
+ return 0;
+ m = off + dircount16 * dirsize;
+ if ((m < off) || (m < (tmsize_t)(dircount16 * dirsize)) ||
+ (m > tif->tif_size))
+ {
+ TIFFErrorExtR(tif, module, "Can not read TIFF directory");
+ _TIFFfreeExt(tif, origdir);
+ return 0;
+ }
+ else
+ {
+ _TIFFmemcpy(origdir, tif->tif_base + off, dircount16 * dirsize);
+ }
+ if (nextdiroff)
+ {
+ off += dircount16 * dirsize;
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ uint32_t nextdiroff32;
+ m = off + sizeof(uint32_t);
+ if ((m < off) || (m < (tmsize_t)sizeof(uint32_t)) ||
+ (m > tif->tif_size))
+ nextdiroff32 = 0;
+ else
+ _TIFFmemcpy(&nextdiroff32, tif->tif_base + off,
+ sizeof(uint32_t));
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&nextdiroff32);
+ *nextdiroff = nextdiroff32;
+ }
+ else
+ {
+ m = off + sizeof(uint64_t);
+ if ((m < off) || (m < (tmsize_t)sizeof(uint64_t)) ||
+ (m > tif->tif_size))
+ *nextdiroff = 0;
+ else
+ _TIFFmemcpy(nextdiroff, tif->tif_base + off,
+ sizeof(uint64_t));
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(nextdiroff);
+ }
+ }
+ }
+ dir = (TIFFDirEntry *)_TIFFCheckMalloc(
+ tif, dircount16, sizeof(TIFFDirEntry), "to read TIFF directory");
+ if (dir == 0)
+ {
+ _TIFFfreeExt(tif, origdir);
+ return 0;
+ }
+ ma = (uint8_t *)origdir;
+ mb = dir;
+ for (n = 0; n < dircount16; n++)
+ {
+ mb->tdir_ignore = FALSE;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort((uint16_t *)ma);
+ mb->tdir_tag = *(uint16_t *)ma;
+ ma += sizeof(uint16_t);
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort((uint16_t *)ma);
+ mb->tdir_type = *(uint16_t *)ma;
+ ma += sizeof(uint16_t);
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong((uint32_t *)ma);
+ mb->tdir_count = (uint64_t)(*(uint32_t *)ma);
+ ma += sizeof(uint32_t);
+ mb->tdir_offset.toff_long8 = 0;
+ *(uint32_t *)(&mb->tdir_offset) = *(uint32_t *)ma;
+ ma += sizeof(uint32_t);
+ }
+ else
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8((uint64_t *)ma);
+ mb->tdir_count = TIFFReadUInt64(ma);
+ ma += sizeof(uint64_t);
+ mb->tdir_offset.toff_long8 = TIFFReadUInt64(ma);
+ ma += sizeof(uint64_t);
+ }
+ mb++;
+ }
+ _TIFFfreeExt(tif, origdir);
+ *pdir = dir;
+ return dircount16;
}
/*
* Fetch a tag that is not handled by special case code.
*/
-static int
-TIFFFetchNormalTag(TIFF* tif, TIFFDirEntry* dp, int recover)
+static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
{
- static const char module[] = "TIFFFetchNormalTag";
- enum TIFFReadDirEntryErr err;
- uint32 fii;
- const TIFFField* fip = NULL;
- TIFFReadDirectoryFindFieldInfo(tif,dp->tdir_tag,&fii);
- if( fii == FAILED_FII )
- {
- TIFFErrorExt(tif->tif_clientdata, "TIFFFetchNormalTag",
- "No definition found for tag %d",
- dp->tdir_tag);
- return 0;
+ static const char module[] = "TIFFFetchNormalTag";
+ enum TIFFReadDirEntryErr err;
+ uint32_t fii;
+ const TIFFField *fip = NULL;
+ TIFFReadDirectoryFindFieldInfo(tif, dp->tdir_tag, &fii);
+ if (fii == FAILED_FII)
+ {
+ TIFFErrorExtR(tif, "TIFFFetchNormalTag",
+ "No definition found for tag %" PRIu16, dp->tdir_tag);
+ return 0;
+ }
+ fip = tif->tif_fields[fii];
+ assert(fip != NULL); /* should not happen */
+ assert(fip->set_field_type !=
+ TIFF_SETGET_OTHER); /* if so, we shouldn't arrive here but deal with
+ this in specialized code */
+ assert(fip->set_field_type !=
+ TIFF_SETGET_INT); /* if so, we shouldn't arrive here as this is only
+ the case for pseudo-tags */
+ err = TIFFReadDirEntryErrOk;
+ switch (fip->set_field_type)
+ {
+ case TIFF_SETGET_UNDEFINED:
+ TIFFErrorExtR(
+ tif, "TIFFFetchNormalTag",
+ "Defined set_field_type of custom tag %u (%s) is "
+ "TIFF_SETGET_UNDEFINED and thus tag is not read from file",
+ fip->field_tag, fip->field_name);
+ break;
+ case TIFF_SETGET_ASCII:
+ {
+ uint8_t *data;
+ assert(fip->field_passcount == 0);
+ err = TIFFReadDirEntryByteArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ size_t mb = 0;
+ int n;
+ if (data != NULL)
+ {
+ if (dp->tdir_count > 0 && data[dp->tdir_count - 1] == 0)
+ {
+ /* optimization: if data is known to be 0 terminated, we
+ * can use strlen() */
+ mb = strlen((const char *)data);
+ }
+ else
+ {
+ /* general case. equivalent to non-portable */
+ /* mb = strnlen((const char*)data,
+ * (uint32_t)dp->tdir_count); */
+ uint8_t *ma = data;
+ while (mb < (uint32_t)dp->tdir_count)
+ {
+ if (*ma == 0)
+ break;
+ ma++;
+ mb++;
+ }
+ }
+ }
+ if (mb + 1 < (uint32_t)dp->tdir_count)
+ TIFFWarningExtR(
+ tif, module,
+ "ASCII value for tag \"%s\" contains null byte in "
+ "value; value incorrectly truncated during reading due "
+ "to implementation limitations",
+ fip->field_name);
+ else if (mb + 1 > (uint32_t)dp->tdir_count)
+ {
+ uint8_t *o;
+ TIFFWarningExtR(
+ tif, module,
+ "ASCII value for tag \"%s\" does not end in null byte",
+ fip->field_name);
+ /* TIFFReadDirEntryArrayWithLimit() ensures this can't be
+ * larger than MAX_SIZE_TAG_DATA */
+ assert((uint32_t)dp->tdir_count + 1 == dp->tdir_count + 1);
+ o = _TIFFmallocExt(tif, (uint32_t)dp->tdir_count + 1);
+ if (o == NULL)
+ {
+ if (data != NULL)
+ _TIFFfreeExt(tif, data);
+ return (0);
+ }
+ if (dp->tdir_count > 0)
+ {
+ _TIFFmemcpy(o, data, (uint32_t)dp->tdir_count);
+ }
+ o[(uint32_t)dp->tdir_count] = 0;
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ data = o;
+ }
+ n = TIFFSetField(tif, dp->tdir_tag, data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!n)
+ return (0);
+ }
+ }
+ break;
+ case TIFF_SETGET_UINT8:
+ {
+ uint8_t data = 0;
+ assert(fip->field_readcount == 1);
+ assert(fip->field_passcount == 0);
+ err = TIFFReadDirEntryByte(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ if (!TIFFSetField(tif, dp->tdir_tag, data))
+ return (0);
+ }
+ }
+ break;
+ case TIFF_SETGET_SINT8:
+ {
+ int8_t data = 0;
+ assert(fip->field_readcount == 1);
+ assert(fip->field_passcount == 0);
+ err = TIFFReadDirEntrySbyte(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ if (!TIFFSetField(tif, dp->tdir_tag, data))
+ return (0);
+ }
+ }
+ break;
+ case TIFF_SETGET_UINT16:
+ {
+ uint16_t data;
+ assert(fip->field_readcount == 1);
+ assert(fip->field_passcount == 0);
+ err = TIFFReadDirEntryShort(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ if (!TIFFSetField(tif, dp->tdir_tag, data))
+ return (0);
+ }
+ }
+ break;
+ case TIFF_SETGET_SINT16:
+ {
+ int16_t data;
+ assert(fip->field_readcount == 1);
+ assert(fip->field_passcount == 0);
+ err = TIFFReadDirEntrySshort(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ if (!TIFFSetField(tif, dp->tdir_tag, data))
+ return (0);
+ }
+ }
+ break;
+ case TIFF_SETGET_UINT32:
+ {
+ uint32_t data;
+ assert(fip->field_readcount == 1);
+ assert(fip->field_passcount == 0);
+ err = TIFFReadDirEntryLong(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ if (!TIFFSetField(tif, dp->tdir_tag, data))
+ return (0);
+ }
+ }
+ break;
+ case TIFF_SETGET_SINT32:
+ {
+ int32_t data;
+ assert(fip->field_readcount == 1);
+ assert(fip->field_passcount == 0);
+ err = TIFFReadDirEntrySlong(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ if (!TIFFSetField(tif, dp->tdir_tag, data))
+ return (0);
+ }
+ }
+ break;
+ case TIFF_SETGET_UINT64:
+ {
+ uint64_t data;
+ assert(fip->field_readcount == 1);
+ assert(fip->field_passcount == 0);
+ err = TIFFReadDirEntryLong8(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ if (!TIFFSetField(tif, dp->tdir_tag, data))
+ return (0);
+ }
+ }
+ break;
+ case TIFF_SETGET_SINT64:
+ {
+ int64_t data;
+ assert(fip->field_readcount == 1);
+ assert(fip->field_passcount == 0);
+ err = TIFFReadDirEntrySlong8(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ if (!TIFFSetField(tif, dp->tdir_tag, data))
+ return (0);
+ }
+ }
+ break;
+ case TIFF_SETGET_FLOAT:
+ {
+ float data;
+ assert(fip->field_readcount == 1);
+ assert(fip->field_passcount == 0);
+ err = TIFFReadDirEntryFloat(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ if (!TIFFSetField(tif, dp->tdir_tag, data))
+ return (0);
+ }
+ }
+ break;
+ case TIFF_SETGET_DOUBLE:
+ {
+ double data;
+ assert(fip->field_readcount == 1);
+ assert(fip->field_passcount == 0);
+ err = TIFFReadDirEntryDouble(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ if (!TIFFSetField(tif, dp->tdir_tag, data))
+ return (0);
+ }
+ }
+ break;
+ case TIFF_SETGET_IFD8:
+ {
+ uint64_t data;
+ assert(fip->field_readcount == 1);
+ assert(fip->field_passcount == 0);
+ err = TIFFReadDirEntryIfd8(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ if (!TIFFSetField(tif, dp->tdir_tag, data))
+ return (0);
+ }
+ }
+ break;
+ case TIFF_SETGET_UINT16_PAIR:
+ {
+ uint16_t *data;
+ assert(fip->field_readcount == 2);
+ assert(fip->field_passcount == 0);
+ if (dp->tdir_count != 2)
+ {
+ TIFFWarningExtR(tif, module,
+ "incorrect count for field \"%s\", expected 2, "
+ "got %" PRIu64,
+ fip->field_name, dp->tdir_count);
+ return (0);
+ }
+ err = TIFFReadDirEntryShortArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ assert(data); /* avoid CLang static Analyzer false positive */
+ m = TIFFSetField(tif, dp->tdir_tag, data[0], data[1]);
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ break;
+ case TIFF_SETGET_C0_UINT8:
+ {
+ uint8_t *data;
+ assert(fip->field_readcount >= 1);
+ assert(fip->field_passcount == 0);
+ if (dp->tdir_count != (uint64_t)fip->field_readcount)
+ {
+ TIFFWarningExtR(tif, module,
+ "incorrect count for field \"%s\", expected "
+ "%d, got %" PRIu64,
+ fip->field_name, (int)fip->field_readcount,
+ dp->tdir_count);
+ return (0);
+ }
+ else
+ {
+ err = TIFFReadDirEntryByteArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag, data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ }
+ break;
+ case TIFF_SETGET_C0_SINT8:
+ {
+ int8_t *data;
+ assert(fip->field_readcount >= 1);
+ assert(fip->field_passcount == 0);
+ if (dp->tdir_count != (uint64_t)fip->field_readcount)
+ {
+ TIFFWarningExtR(tif, module,
+ "incorrect count for field \"%s\", expected "
+ "%d, got %" PRIu64,
+ fip->field_name, (int)fip->field_readcount,
+ dp->tdir_count);
+ return (0);
+ }
+ else
+ {
+ err = TIFFReadDirEntrySbyteArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag, data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ }
+ break;
+ case TIFF_SETGET_C0_UINT16:
+ {
+ uint16_t *data;
+ assert(fip->field_readcount >= 1);
+ assert(fip->field_passcount == 0);
+ if (dp->tdir_count != (uint64_t)fip->field_readcount)
+ {
+ TIFFWarningExtR(tif, module,
+ "incorrect count for field \"%s\", expected "
+ "%d, got %" PRIu64,
+ fip->field_name, (int)fip->field_readcount,
+ dp->tdir_count);
+ return (0);
+ }
+ else
+ {
+ err = TIFFReadDirEntryShortArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag, data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ }
+ break;
+ case TIFF_SETGET_C0_SINT16:
+ {
+ int16_t *data;
+ assert(fip->field_readcount >= 1);
+ assert(fip->field_passcount == 0);
+ if (dp->tdir_count != (uint64_t)fip->field_readcount)
+ {
+ TIFFWarningExtR(tif, module,
+ "incorrect count for field \"%s\", expected "
+ "%d, got %" PRIu64,
+ fip->field_name, (int)fip->field_readcount,
+ dp->tdir_count);
+ return (0);
+ }
+ else
+ {
+ err = TIFFReadDirEntrySshortArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag, data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ }
+ break;
+ case TIFF_SETGET_C0_UINT32:
+ {
+ uint32_t *data;
+ assert(fip->field_readcount >= 1);
+ assert(fip->field_passcount == 0);
+ if (dp->tdir_count != (uint64_t)fip->field_readcount)
+ {
+ TIFFWarningExtR(tif, module,
+ "incorrect count for field \"%s\", expected "
+ "%d, got %" PRIu64,
+ fip->field_name, (int)fip->field_readcount,
+ dp->tdir_count);
+ return (0);
+ }
+ else
+ {
+ err = TIFFReadDirEntryLongArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag, data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ }
+ break;
+ case TIFF_SETGET_C0_SINT32:
+ {
+ int32_t *data;
+ assert(fip->field_readcount >= 1);
+ assert(fip->field_passcount == 0);
+ if (dp->tdir_count != (uint64_t)fip->field_readcount)
+ {
+ TIFFWarningExtR(tif, module,
+ "incorrect count for field \"%s\", expected "
+ "%d, got %" PRIu64,
+ fip->field_name, (int)fip->field_readcount,
+ dp->tdir_count);
+ return (0);
+ }
+ else
+ {
+ err = TIFFReadDirEntrySlongArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag, data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ }
+ break;
+ case TIFF_SETGET_C0_UINT64:
+ {
+ uint64_t *data;
+ assert(fip->field_readcount >= 1);
+ assert(fip->field_passcount == 0);
+ if (dp->tdir_count != (uint64_t)fip->field_readcount)
+ {
+ TIFFWarningExtR(tif, module,
+ "incorrect count for field \"%s\", expected "
+ "%d, got %" PRIu64,
+ fip->field_name, (int)fip->field_readcount,
+ dp->tdir_count);
+ return (0);
+ }
+ else
+ {
+ err = TIFFReadDirEntryLong8Array(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag, data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ }
+ break;
+ case TIFF_SETGET_C0_SINT64:
+ {
+ int64_t *data;
+ assert(fip->field_readcount >= 1);
+ assert(fip->field_passcount == 0);
+ if (dp->tdir_count != (uint64_t)fip->field_readcount)
+ {
+ TIFFWarningExtR(tif, module,
+ "incorrect count for field \"%s\", expected "
+ "%d, got %" PRIu64,
+ fip->field_name, (int)fip->field_readcount,
+ dp->tdir_count);
+ return (0);
+ }
+ else
+ {
+ err = TIFFReadDirEntrySlong8Array(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag, data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ }
+ break;
+ case TIFF_SETGET_C0_FLOAT:
+ {
+ float *data;
+ assert(fip->field_readcount >= 1);
+ assert(fip->field_passcount == 0);
+ if (dp->tdir_count != (uint64_t)fip->field_readcount)
+ {
+ TIFFWarningExtR(tif, module,
+ "incorrect count for field \"%s\", expected "
+ "%d, got %" PRIu64,
+ fip->field_name, (int)fip->field_readcount,
+ dp->tdir_count);
+ return (0);
+ }
+ else
+ {
+ err = TIFFReadDirEntryFloatArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag, data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ }
+ break;
+ /*--: Rational2Double: Extend for Double Arrays and Rational-Arrays read
+ * into Double-Arrays. */
+ case TIFF_SETGET_C0_DOUBLE:
+ {
+ double *data;
+ assert(fip->field_readcount >= 1);
+ assert(fip->field_passcount == 0);
+ if (dp->tdir_count != (uint64_t)fip->field_readcount)
+ {
+ TIFFWarningExtR(tif, module,
+ "incorrect count for field \"%s\", expected "
+ "%d, got %" PRIu64,
+ fip->field_name, (int)fip->field_readcount,
+ dp->tdir_count);
+ return (0);
+ }
+ else
+ {
+ err = TIFFReadDirEntryDoubleArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag, data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ }
+ break;
+ case TIFF_SETGET_C16_ASCII:
+ {
+ uint8_t *data;
+ assert(fip->field_readcount == TIFF_VARIABLE);
+ assert(fip->field_passcount == 1);
+ if (dp->tdir_count > 0xFFFF)
+ err = TIFFReadDirEntryErrCount;
+ else
+ {
+ err = TIFFReadDirEntryByteArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ if (data != 0 && dp->tdir_count > 0 &&
+ data[dp->tdir_count - 1] != '\0')
+ {
+ TIFFWarningExtR(
+ tif, module,
+ "ASCII value for tag \"%s\" does not end in null "
+ "byte. Forcing it to be null",
+ fip->field_name);
+ data[dp->tdir_count - 1] = '\0';
+ }
+ m = TIFFSetField(tif, dp->tdir_tag,
+ (uint16_t)(dp->tdir_count), data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ }
+ break;
+ case TIFF_SETGET_C16_UINT8:
+ {
+ uint8_t *data;
+ assert(fip->field_readcount == TIFF_VARIABLE);
+ assert(fip->field_passcount == 1);
+ if (dp->tdir_count > 0xFFFF)
+ err = TIFFReadDirEntryErrCount;
+ else
+ {
+ err = TIFFReadDirEntryByteArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag,
+ (uint16_t)(dp->tdir_count), data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ }
+ break;
+ case TIFF_SETGET_C16_SINT8:
+ {
+ int8_t *data;
+ assert(fip->field_readcount == TIFF_VARIABLE);
+ assert(fip->field_passcount == 1);
+ if (dp->tdir_count > 0xFFFF)
+ err = TIFFReadDirEntryErrCount;
+ else
+ {
+ err = TIFFReadDirEntrySbyteArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag,
+ (uint16_t)(dp->tdir_count), data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ }
+ break;
+ case TIFF_SETGET_C16_UINT16:
+ {
+ uint16_t *data;
+ assert(fip->field_readcount == TIFF_VARIABLE);
+ assert(fip->field_passcount == 1);
+ if (dp->tdir_count > 0xFFFF)
+ err = TIFFReadDirEntryErrCount;
+ else
+ {
+ err = TIFFReadDirEntryShortArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag,
+ (uint16_t)(dp->tdir_count), data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ }
+ break;
+ case TIFF_SETGET_C16_SINT16:
+ {
+ int16_t *data;
+ assert(fip->field_readcount == TIFF_VARIABLE);
+ assert(fip->field_passcount == 1);
+ if (dp->tdir_count > 0xFFFF)
+ err = TIFFReadDirEntryErrCount;
+ else
+ {
+ err = TIFFReadDirEntrySshortArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag,
+ (uint16_t)(dp->tdir_count), data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ }
+ break;
+ case TIFF_SETGET_C16_UINT32:
+ {
+ uint32_t *data;
+ assert(fip->field_readcount == TIFF_VARIABLE);
+ assert(fip->field_passcount == 1);
+ if (dp->tdir_count > 0xFFFF)
+ err = TIFFReadDirEntryErrCount;
+ else
+ {
+ err = TIFFReadDirEntryLongArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag,
+ (uint16_t)(dp->tdir_count), data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ }
+ break;
+ case TIFF_SETGET_C16_SINT32:
+ {
+ int32_t *data;
+ assert(fip->field_readcount == TIFF_VARIABLE);
+ assert(fip->field_passcount == 1);
+ if (dp->tdir_count > 0xFFFF)
+ err = TIFFReadDirEntryErrCount;
+ else
+ {
+ err = TIFFReadDirEntrySlongArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag,
+ (uint16_t)(dp->tdir_count), data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ }
+ break;
+ case TIFF_SETGET_C16_UINT64:
+ {
+ uint64_t *data;
+ assert(fip->field_readcount == TIFF_VARIABLE);
+ assert(fip->field_passcount == 1);
+ if (dp->tdir_count > 0xFFFF)
+ err = TIFFReadDirEntryErrCount;
+ else
+ {
+ err = TIFFReadDirEntryLong8Array(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag,
+ (uint16_t)(dp->tdir_count), data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ }
+ break;
+ case TIFF_SETGET_C16_SINT64:
+ {
+ int64_t *data;
+ assert(fip->field_readcount == TIFF_VARIABLE);
+ assert(fip->field_passcount == 1);
+ if (dp->tdir_count > 0xFFFF)
+ err = TIFFReadDirEntryErrCount;
+ else
+ {
+ err = TIFFReadDirEntrySlong8Array(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag,
+ (uint16_t)(dp->tdir_count), data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ }
+ break;
+ case TIFF_SETGET_C16_FLOAT:
+ {
+ float *data;
+ assert(fip->field_readcount == TIFF_VARIABLE);
+ assert(fip->field_passcount == 1);
+ if (dp->tdir_count > 0xFFFF)
+ err = TIFFReadDirEntryErrCount;
+ else
+ {
+ err = TIFFReadDirEntryFloatArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag,
+ (uint16_t)(dp->tdir_count), data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ }
+ break;
+ case TIFF_SETGET_C16_DOUBLE:
+ {
+ double *data;
+ assert(fip->field_readcount == TIFF_VARIABLE);
+ assert(fip->field_passcount == 1);
+ if (dp->tdir_count > 0xFFFF)
+ err = TIFFReadDirEntryErrCount;
+ else
+ {
+ err = TIFFReadDirEntryDoubleArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag,
+ (uint16_t)(dp->tdir_count), data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ }
+ break;
+ case TIFF_SETGET_C16_IFD8:
+ {
+ uint64_t *data;
+ assert(fip->field_readcount == TIFF_VARIABLE);
+ assert(fip->field_passcount == 1);
+ if (dp->tdir_count > 0xFFFF)
+ err = TIFFReadDirEntryErrCount;
+ else
+ {
+ err = TIFFReadDirEntryIfd8Array(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag,
+ (uint16_t)(dp->tdir_count), data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ }
+ break;
+ case TIFF_SETGET_C32_ASCII:
+ {
+ uint8_t *data;
+ assert(fip->field_readcount == TIFF_VARIABLE2);
+ assert(fip->field_passcount == 1);
+ err = TIFFReadDirEntryByteArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ if (data != 0 && dp->tdir_count > 0 &&
+ data[dp->tdir_count - 1] != '\0')
+ {
+ TIFFWarningExtR(tif, module,
+ "ASCII value for tag \"%s\" does not end "
+ "in null byte. Forcing it to be null",
+ fip->field_name);
+ data[dp->tdir_count - 1] = '\0';
+ }
+ m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
+ data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ break;
+ case TIFF_SETGET_C32_UINT8:
+ {
+ uint8_t *data;
+ uint32_t count = 0;
+ assert(fip->field_readcount == TIFF_VARIABLE2);
+ assert(fip->field_passcount == 1);
+ if (fip->field_tag == TIFFTAG_RICHTIFFIPTC &&
+ dp->tdir_type == TIFF_LONG)
+ {
+ /* Adobe's software (wrongly) writes RichTIFFIPTC tag with
+ * data type LONG instead of UNDEFINED. Work around this
+ * frequently found issue */
+ void *origdata;
+ err = TIFFReadDirEntryArray(tif, dp, &count, 4, &origdata);
+ if ((err != TIFFReadDirEntryErrOk) || (origdata == 0))
+ {
+ data = NULL;
+ }
+ else
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfLong((uint32_t *)origdata, count);
+ data = (uint8_t *)origdata;
+ count = (uint32_t)(count * 4);
+ }
+ }
+ else
+ {
+ err = TIFFReadDirEntryByteArray(tif, dp, &data);
+ count = (uint32_t)(dp->tdir_count);
+ }
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag, count, data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ break;
+ case TIFF_SETGET_C32_SINT8:
+ {
+ int8_t *data = NULL;
+ assert(fip->field_readcount == TIFF_VARIABLE2);
+ assert(fip->field_passcount == 1);
+ err = TIFFReadDirEntrySbyteArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
+ data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ break;
+ case TIFF_SETGET_C32_UINT16:
+ {
+ uint16_t *data;
+ assert(fip->field_readcount == TIFF_VARIABLE2);
+ assert(fip->field_passcount == 1);
+ err = TIFFReadDirEntryShortArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
+ data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ break;
+ case TIFF_SETGET_C32_SINT16:
+ {
+ int16_t *data = NULL;
+ assert(fip->field_readcount == TIFF_VARIABLE2);
+ assert(fip->field_passcount == 1);
+ err = TIFFReadDirEntrySshortArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
+ data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ break;
+ case TIFF_SETGET_C32_UINT32:
+ {
+ uint32_t *data;
+ assert(fip->field_readcount == TIFF_VARIABLE2);
+ assert(fip->field_passcount == 1);
+ err = TIFFReadDirEntryLongArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
+ data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ break;
+ case TIFF_SETGET_C32_SINT32:
+ {
+ int32_t *data = NULL;
+ assert(fip->field_readcount == TIFF_VARIABLE2);
+ assert(fip->field_passcount == 1);
+ err = TIFFReadDirEntrySlongArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
+ data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ break;
+ case TIFF_SETGET_C32_UINT64:
+ {
+ uint64_t *data;
+ assert(fip->field_readcount == TIFF_VARIABLE2);
+ assert(fip->field_passcount == 1);
+ err = TIFFReadDirEntryLong8Array(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
+ data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
}
- fip=tif->tif_fields[fii];
- assert(fip != NULL); /* should not happen */
- assert(fip->set_field_type!=TIFF_SETGET_OTHER); /* if so, we shouldn't arrive here but deal with this in specialized code */
- assert(fip->set_field_type!=TIFF_SETGET_INT); /* if so, we shouldn't arrive here as this is only the case for pseudo-tags */
- err=TIFFReadDirEntryErrOk;
- switch (fip->set_field_type)
- {
- case TIFF_SETGET_UNDEFINED:
- break;
- case TIFF_SETGET_ASCII:
- {
- uint8* data;
- assert(fip->field_passcount==0);
- err=TIFFReadDirEntryByteArray(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- uint32 mb = 0;
- int n;
- if (data != NULL)
- {
- uint8* ma = data;
- while (mb<(uint32)dp->tdir_count)
- {
- if (*ma==0)
- break;
- ma++;
- mb++;
- }
- }
- if (mb+1<(uint32)dp->tdir_count)
- TIFFWarningExt(tif->tif_clientdata,module,"ASCII value for tag \"%s\" contains null byte in value; value incorrectly truncated during reading due to implementation limitations",fip->field_name);
- else if (mb+1>(uint32)dp->tdir_count)
- {
- uint8* o;
- TIFFWarningExt(tif->tif_clientdata,module,"ASCII value for tag \"%s\" does not end in null byte",fip->field_name);
- if ((uint32)dp->tdir_count+1!=dp->tdir_count+1)
- o=NULL;
- else
- o=_TIFFmalloc((uint32)dp->tdir_count+1);
- if (o==NULL)
- {
- if (data!=NULL)
- _TIFFfree(data);
- return(0);
- }
- _TIFFmemcpy(o,data,(uint32)dp->tdir_count);
- o[(uint32)dp->tdir_count]=0;
- if (data!=0)
- _TIFFfree(data);
- data=o;
- }
- n=TIFFSetField(tif,dp->tdir_tag,data);
- if (data!=0)
- _TIFFfree(data);
- if (!n)
- return(0);
- }
- }
- break;
- case TIFF_SETGET_UINT8:
- {
- uint8 data=0;
- assert(fip->field_readcount==1);
- assert(fip->field_passcount==0);
- err=TIFFReadDirEntryByte(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- if (!TIFFSetField(tif,dp->tdir_tag,data))
- return(0);
- }
- }
- break;
- case TIFF_SETGET_UINT16:
- {
- uint16 data;
- assert(fip->field_readcount==1);
- assert(fip->field_passcount==0);
- err=TIFFReadDirEntryShort(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- if (!TIFFSetField(tif,dp->tdir_tag,data))
- return(0);
- }
- }
- break;
- case TIFF_SETGET_UINT32:
- {
- uint32 data;
- assert(fip->field_readcount==1);
- assert(fip->field_passcount==0);
- err=TIFFReadDirEntryLong(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- if (!TIFFSetField(tif,dp->tdir_tag,data))
- return(0);
- }
- }
- break;
- case TIFF_SETGET_UINT64:
- {
- uint64 data;
- assert(fip->field_readcount==1);
- assert(fip->field_passcount==0);
- err=TIFFReadDirEntryLong8(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- if (!TIFFSetField(tif,dp->tdir_tag,data))
- return(0);
- }
- }
- break;
- case TIFF_SETGET_FLOAT:
- {
- float data;
- assert(fip->field_readcount==1);
- assert(fip->field_passcount==0);
- err=TIFFReadDirEntryFloat(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- if (!TIFFSetField(tif,dp->tdir_tag,data))
- return(0);
- }
- }
- break;
- case TIFF_SETGET_DOUBLE:
- {
- double data;
- assert(fip->field_readcount==1);
- assert(fip->field_passcount==0);
- err=TIFFReadDirEntryDouble(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- if (!TIFFSetField(tif,dp->tdir_tag,data))
- return(0);
- }
- }
- break;
- case TIFF_SETGET_IFD8:
- {
- uint64 data;
- assert(fip->field_readcount==1);
- assert(fip->field_passcount==0);
- err=TIFFReadDirEntryIfd8(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- if (!TIFFSetField(tif,dp->tdir_tag,data))
- return(0);
- }
- }
- break;
- case TIFF_SETGET_UINT16_PAIR:
- {
- uint16* data;
- assert(fip->field_readcount==2);
- assert(fip->field_passcount==0);
- if (dp->tdir_count!=2) {
- TIFFWarningExt(tif->tif_clientdata,module,
- "incorrect count for field \"%s\", expected 2, got %d",
- fip->field_name,(int)dp->tdir_count);
- return(0);
- }
- err=TIFFReadDirEntryShortArray(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- int m;
- m=TIFFSetField(tif,dp->tdir_tag,data[0],data[1]);
- _TIFFfree(data);
- if (!m)
- return(0);
- }
- }
- break;
- case TIFF_SETGET_C0_UINT8:
- {
- uint8* data;
- assert(fip->field_readcount>=1);
- assert(fip->field_passcount==0);
- if (dp->tdir_count!=(uint64)fip->field_readcount) {
- TIFFWarningExt(tif->tif_clientdata,module,
- "incorrect count for field \"%s\", expected %d, got %d",
- fip->field_name,(int) fip->field_readcount, (int)dp->tdir_count);
- return 0;
- }
- else
- {
- err=TIFFReadDirEntryByteArray(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- int m;
- m=TIFFSetField(tif,dp->tdir_tag,data);
- if (data!=0)
- _TIFFfree(data);
- if (!m)
- return(0);
- }
- }
- }
- break;
- case TIFF_SETGET_C0_UINT16:
- {
- uint16* data;
- assert(fip->field_readcount>=1);
- assert(fip->field_passcount==0);
- if (dp->tdir_count!=(uint64)fip->field_readcount)
- /* corrupt file */;
- else
- {
- err=TIFFReadDirEntryShortArray(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- int m;
- m=TIFFSetField(tif,dp->tdir_tag,data);
- if (data!=0)
- _TIFFfree(data);
- if (!m)
- return(0);
- }
- }
- }
- break;
- case TIFF_SETGET_C0_UINT32:
- {
- uint32* data;
- assert(fip->field_readcount>=1);
- assert(fip->field_passcount==0);
- if (dp->tdir_count!=(uint64)fip->field_readcount)
- /* corrupt file */;
- else
- {
- err=TIFFReadDirEntryLongArray(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- int m;
- m=TIFFSetField(tif,dp->tdir_tag,data);
- if (data!=0)
- _TIFFfree(data);
- if (!m)
- return(0);
- }
- }
- }
- break;
- case TIFF_SETGET_C0_FLOAT:
- {
- float* data;
- assert(fip->field_readcount>=1);
- assert(fip->field_passcount==0);
- if (dp->tdir_count!=(uint64)fip->field_readcount)
- /* corrupt file */;
- else
- {
- err=TIFFReadDirEntryFloatArray(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- int m;
- m=TIFFSetField(tif,dp->tdir_tag,data);
- if (data!=0)
- _TIFFfree(data);
- if (!m)
- return(0);
- }
- }
- }
- break;
- case TIFF_SETGET_C16_ASCII:
- {
- uint8* data;
- assert(fip->field_readcount==TIFF_VARIABLE);
- assert(fip->field_passcount==1);
- if (dp->tdir_count>0xFFFF)
- err=TIFFReadDirEntryErrCount;
- else
- {
- err=TIFFReadDirEntryByteArray(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- int m;
- if( data != 0 && dp->tdir_count > 0 && data[dp->tdir_count-1] != '\0' )
- {
- TIFFWarningExt(tif->tif_clientdata,module,"ASCII value for tag \"%s\" does not end in null byte. Forcing it to be null",fip->field_name);
- data[dp->tdir_count-1] = '\0';
- }
- m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
- if (data!=0)
- _TIFFfree(data);
- if (!m)
- return(0);
- }
- }
- }
- break;
- case TIFF_SETGET_C16_UINT8:
- {
- uint8* data;
- assert(fip->field_readcount==TIFF_VARIABLE);
- assert(fip->field_passcount==1);
- if (dp->tdir_count>0xFFFF)
- err=TIFFReadDirEntryErrCount;
- else
- {
- err=TIFFReadDirEntryByteArray(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- int m;
- m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
- if (data!=0)
- _TIFFfree(data);
- if (!m)
- return(0);
- }
- }
- }
- break;
- case TIFF_SETGET_C16_UINT16:
- {
- uint16* data;
- assert(fip->field_readcount==TIFF_VARIABLE);
- assert(fip->field_passcount==1);
- if (dp->tdir_count>0xFFFF)
- err=TIFFReadDirEntryErrCount;
- else
- {
- err=TIFFReadDirEntryShortArray(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- int m;
- m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
- if (data!=0)
- _TIFFfree(data);
- if (!m)
- return(0);
- }
- }
- }
- break;
- case TIFF_SETGET_C16_UINT32:
- {
- uint32* data;
- assert(fip->field_readcount==TIFF_VARIABLE);
- assert(fip->field_passcount==1);
- if (dp->tdir_count>0xFFFF)
- err=TIFFReadDirEntryErrCount;
- else
- {
- err=TIFFReadDirEntryLongArray(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- int m;
- m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
- if (data!=0)
- _TIFFfree(data);
- if (!m)
- return(0);
- }
- }
- }
- break;
- case TIFF_SETGET_C16_UINT64:
- {
- uint64* data;
- assert(fip->field_readcount==TIFF_VARIABLE);
- assert(fip->field_passcount==1);
- if (dp->tdir_count>0xFFFF)
- err=TIFFReadDirEntryErrCount;
- else
- {
- err=TIFFReadDirEntryLong8Array(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- int m;
- m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
- if (data!=0)
- _TIFFfree(data);
- if (!m)
- return(0);
- }
- }
- }
- break;
- case TIFF_SETGET_C16_FLOAT:
- {
- float* data;
- assert(fip->field_readcount==TIFF_VARIABLE);
- assert(fip->field_passcount==1);
- if (dp->tdir_count>0xFFFF)
- err=TIFFReadDirEntryErrCount;
- else
- {
- err=TIFFReadDirEntryFloatArray(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- int m;
- m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
- if (data!=0)
- _TIFFfree(data);
- if (!m)
- return(0);
- }
- }
- }
- break;
- case TIFF_SETGET_C16_DOUBLE:
- {
- double* data;
- assert(fip->field_readcount==TIFF_VARIABLE);
- assert(fip->field_passcount==1);
- if (dp->tdir_count>0xFFFF)
- err=TIFFReadDirEntryErrCount;
- else
- {
- err=TIFFReadDirEntryDoubleArray(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- int m;
- m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
- if (data!=0)
- _TIFFfree(data);
- if (!m)
- return(0);
- }
- }
- }
- break;
- case TIFF_SETGET_C16_IFD8:
- {
- uint64* data;
- assert(fip->field_readcount==TIFF_VARIABLE);
- assert(fip->field_passcount==1);
- if (dp->tdir_count>0xFFFF)
- err=TIFFReadDirEntryErrCount;
- else
- {
- err=TIFFReadDirEntryIfd8Array(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- int m;
- m=TIFFSetField(tif,dp->tdir_tag,(uint16)(dp->tdir_count),data);
- if (data!=0)
- _TIFFfree(data);
- if (!m)
- return(0);
- }
- }
- }
- break;
- case TIFF_SETGET_C32_ASCII:
- {
- uint8* data;
- assert(fip->field_readcount==TIFF_VARIABLE2);
- assert(fip->field_passcount==1);
- err=TIFFReadDirEntryByteArray(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- int m;
- if( data != 0 && dp->tdir_count > 0 && data[dp->tdir_count-1] != '\0' )
- {
- TIFFWarningExt(tif->tif_clientdata,module,"ASCII value for tag \"%s\" does not end in null byte. Forcing it to be null",fip->field_name);
- data[dp->tdir_count-1] = '\0';
- }
- m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
- if (data!=0)
- _TIFFfree(data);
- if (!m)
- return(0);
- }
- }
- break;
- case TIFF_SETGET_C32_UINT8:
- {
- uint8* data;
- assert(fip->field_readcount==TIFF_VARIABLE2);
- assert(fip->field_passcount==1);
- err=TIFFReadDirEntryByteArray(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- int m;
- m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
- if (data!=0)
- _TIFFfree(data);
- if (!m)
- return(0);
- }
- }
- break;
- case TIFF_SETGET_C32_SINT8:
- {
- int8* data = NULL;
- assert(fip->field_readcount==TIFF_VARIABLE2);
- assert(fip->field_passcount==1);
- err=TIFFReadDirEntrySbyteArray(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- int m;
- m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
- if (data!=0)
- _TIFFfree(data);
- if (!m)
- return(0);
- }
- }
- break;
- case TIFF_SETGET_C32_UINT16:
- {
- uint16* data;
- assert(fip->field_readcount==TIFF_VARIABLE2);
- assert(fip->field_passcount==1);
- err=TIFFReadDirEntryShortArray(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- int m;
- m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
- if (data!=0)
- _TIFFfree(data);
- if (!m)
- return(0);
- }
- }
- break;
- case TIFF_SETGET_C32_SINT16:
- {
- int16* data = NULL;
- assert(fip->field_readcount==TIFF_VARIABLE2);
- assert(fip->field_passcount==1);
- err=TIFFReadDirEntrySshortArray(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- int m;
- m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
- if (data!=0)
- _TIFFfree(data);
- if (!m)
- return(0);
- }
- }
- break;
- case TIFF_SETGET_C32_UINT32:
- {
- uint32* data;
- assert(fip->field_readcount==TIFF_VARIABLE2);
- assert(fip->field_passcount==1);
- err=TIFFReadDirEntryLongArray(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- int m;
- m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
- if (data!=0)
- _TIFFfree(data);
- if (!m)
- return(0);
- }
- }
- break;
- case TIFF_SETGET_C32_SINT32:
- {
- int32* data = NULL;
- assert(fip->field_readcount==TIFF_VARIABLE2);
- assert(fip->field_passcount==1);
- err=TIFFReadDirEntrySlongArray(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- int m;
- m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
- if (data!=0)
- _TIFFfree(data);
- if (!m)
- return(0);
- }
- }
- break;
- case TIFF_SETGET_C32_UINT64:
- {
- uint64* data;
- assert(fip->field_readcount==TIFF_VARIABLE2);
- assert(fip->field_passcount==1);
- err=TIFFReadDirEntryLong8Array(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- int m;
- m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
- if (data!=0)
- _TIFFfree(data);
- if (!m)
- return(0);
- }
- }
- break;
- case TIFF_SETGET_C32_SINT64:
- {
- int64* data = NULL;
- assert(fip->field_readcount==TIFF_VARIABLE2);
- assert(fip->field_passcount==1);
- err=TIFFReadDirEntrySlong8Array(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- int m;
- m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
- if (data!=0)
- _TIFFfree(data);
- if (!m)
- return(0);
- }
- }
- break;
- case TIFF_SETGET_C32_FLOAT:
- {
- float* data;
- assert(fip->field_readcount==TIFF_VARIABLE2);
- assert(fip->field_passcount==1);
- err=TIFFReadDirEntryFloatArray(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- int m;
- m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
- if (data!=0)
- _TIFFfree(data);
- if (!m)
- return(0);
- }
- }
- break;
- case TIFF_SETGET_C32_DOUBLE:
- {
- double* data;
- assert(fip->field_readcount==TIFF_VARIABLE2);
- assert(fip->field_passcount==1);
- err=TIFFReadDirEntryDoubleArray(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- int m;
- m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
- if (data!=0)
- _TIFFfree(data);
- if (!m)
- return(0);
- }
- }
- break;
- case TIFF_SETGET_C32_IFD8:
- {
- uint64* data;
- assert(fip->field_readcount==TIFF_VARIABLE2);
- assert(fip->field_passcount==1);
- err=TIFFReadDirEntryIfd8Array(tif,dp,&data);
- if (err==TIFFReadDirEntryErrOk)
- {
- int m;
- m=TIFFSetField(tif,dp->tdir_tag,(uint32)(dp->tdir_count),data);
- if (data!=0)
- _TIFFfree(data);
- if (!m)
- return(0);
- }
- }
- break;
- default:
- assert(0); /* we should never get here */
- break;
- }
- if (err!=TIFFReadDirEntryErrOk)
- {
- TIFFReadDirEntryOutputErr(tif,err,module,fip->field_name,recover);
- return(0);
- }
- return(1);
+ break;
+ case TIFF_SETGET_C32_SINT64:
+ {
+ int64_t *data = NULL;
+ assert(fip->field_readcount == TIFF_VARIABLE2);
+ assert(fip->field_passcount == 1);
+ err = TIFFReadDirEntrySlong8Array(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
+ data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ break;
+ case TIFF_SETGET_C32_FLOAT:
+ {
+ float *data;
+ assert(fip->field_readcount == TIFF_VARIABLE2);
+ assert(fip->field_passcount == 1);
+ err = TIFFReadDirEntryFloatArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
+ data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ break;
+ case TIFF_SETGET_C32_DOUBLE:
+ {
+ double *data;
+ assert(fip->field_readcount == TIFF_VARIABLE2);
+ assert(fip->field_passcount == 1);
+ err = TIFFReadDirEntryDoubleArray(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
+ data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ break;
+ case TIFF_SETGET_C32_IFD8:
+ {
+ uint64_t *data;
+ assert(fip->field_readcount == TIFF_VARIABLE2);
+ assert(fip->field_passcount == 1);
+ err = TIFFReadDirEntryIfd8Array(tif, dp, &data);
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ int m;
+ m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
+ data);
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ if (!m)
+ return (0);
+ }
+ }
+ break;
+ default:
+ assert(0); /* we should never get here */
+ break;
+ }
+ if (err != TIFFReadDirEntryErrOk)
+ {
+ TIFFReadDirEntryOutputErr(tif, err, module, fip->field_name, recover);
+ return (0);
+ }
+ return (1);
}
/*
* Fetch a set of offsets or lengths.
* While this routine says "strips", in fact it's also used for tiles.
*/
-static int
-TIFFFetchStripThing(TIFF* tif, TIFFDirEntry* dir, uint32 nstrips, uint64** lpp)
+static int TIFFFetchStripThing(TIFF *tif, TIFFDirEntry *dir, uint32_t nstrips,
+ uint64_t **lpp)
{
- static const char module[] = "TIFFFetchStripThing";
- enum TIFFReadDirEntryErr err;
- uint64* data;
- err=TIFFReadDirEntryLong8ArrayWithLimit(tif,dir,&data,nstrips);
- if (err!=TIFFReadDirEntryErrOk)
- {
- const TIFFField* fip = TIFFFieldWithTag(tif,dir->tdir_tag);
- TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",0);
- return(0);
- }
- if (dir->tdir_count<(uint64)nstrips)
- {
- uint64* resizeddata;
- const TIFFField* fip = TIFFFieldWithTag(tif,dir->tdir_tag);
- const char* pszMax = getenv("LIBTIFF_STRILE_ARRAY_MAX_RESIZE_COUNT");
- uint32 max_nstrips = 1000000;
- if( pszMax )
- max_nstrips = (uint32) atoi(pszMax);
- TIFFReadDirEntryOutputErr(tif,TIFFReadDirEntryErrCount,
- module,
- fip ? fip->field_name : "unknown tagname",
- ( nstrips <= max_nstrips ) );
-
- if( nstrips > max_nstrips )
- {
- _TIFFfree(data);
- return(0);
- }
-
- resizeddata=(uint64*)_TIFFCheckMalloc(tif,nstrips,sizeof(uint64),"for strip array");
- if (resizeddata==0) {
- _TIFFfree(data);
- return(0);
- }
- _TIFFmemcpy(resizeddata,data,(uint32)dir->tdir_count*sizeof(uint64));
- _TIFFmemset(resizeddata+(uint32)dir->tdir_count,0,(nstrips-(uint32)dir->tdir_count)*sizeof(uint64));
- _TIFFfree(data);
- data=resizeddata;
- }
- *lpp=data;
- return(1);
+ static const char module[] = "TIFFFetchStripThing";
+ enum TIFFReadDirEntryErr err;
+ uint64_t *data;
+ err = TIFFReadDirEntryLong8ArrayWithLimit(tif, dir, &data, nstrips);
+ if (err != TIFFReadDirEntryErrOk)
+ {
+ const TIFFField *fip = TIFFFieldWithTag(tif, dir->tdir_tag);
+ TIFFReadDirEntryOutputErr(tif, err, module,
+ fip ? fip->field_name : "unknown tagname", 0);
+ return (0);
+ }
+ if (dir->tdir_count < (uint64_t)nstrips)
+ {
+ uint64_t *resizeddata;
+ const TIFFField *fip = TIFFFieldWithTag(tif, dir->tdir_tag);
+ const char *pszMax = getenv("LIBTIFF_STRILE_ARRAY_MAX_RESIZE_COUNT");
+ uint32_t max_nstrips = 1000000;
+ if (pszMax)
+ max_nstrips = (uint32_t)atoi(pszMax);
+ TIFFReadDirEntryOutputErr(tif, TIFFReadDirEntryErrCount, module,
+ fip ? fip->field_name : "unknown tagname",
+ (nstrips <= max_nstrips));
+
+ if (nstrips > max_nstrips)
+ {
+ _TIFFfreeExt(tif, data);
+ return (0);
+ }
+
+ resizeddata = (uint64_t *)_TIFFCheckMalloc(
+ tif, nstrips, sizeof(uint64_t), "for strip array");
+ if (resizeddata == 0)
+ {
+ _TIFFfreeExt(tif, data);
+ return (0);
+ }
+ if (dir->tdir_count)
+ _TIFFmemcpy(resizeddata, data,
+ (uint32_t)dir->tdir_count * sizeof(uint64_t));
+ _TIFFmemset(resizeddata + (uint32_t)dir->tdir_count, 0,
+ (nstrips - (uint32_t)dir->tdir_count) * sizeof(uint64_t));
+ _TIFFfreeExt(tif, data);
+ data = resizeddata;
+ }
+ *lpp = data;
+ return (1);
}
/*
* Fetch and set the SubjectDistance EXIF tag.
*/
-static int
-TIFFFetchSubjectDistance(TIFF* tif, TIFFDirEntry* dir)
+static int TIFFFetchSubjectDistance(TIFF *tif, TIFFDirEntry *dir)
{
- static const char module[] = "TIFFFetchSubjectDistance";
- enum TIFFReadDirEntryErr err;
- UInt64Aligned_t m;
- m.l=0;
- assert(sizeof(double)==8);
- assert(sizeof(uint64)==8);
- assert(sizeof(uint32)==4);
- if (dir->tdir_count!=1)
- err=TIFFReadDirEntryErrCount;
- else if (dir->tdir_type!=TIFF_RATIONAL)
- err=TIFFReadDirEntryErrType;
- else
- {
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- uint32 offset;
- offset=*(uint32*)(&dir->tdir_offset);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(&offset);
- err=TIFFReadDirEntryData(tif,offset,8,m.i);
- }
- else
- {
- m.l=dir->tdir_offset.toff_long8;
- err=TIFFReadDirEntryErrOk;
- }
- }
- if (err==TIFFReadDirEntryErrOk)
- {
- double n;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong(m.i,2);
- if (m.i[0]==0)
- n=0.0;
- else if (m.i[0]==0xFFFFFFFF || m.i[1]==0)
- /*
- * XXX: Numerator 0xFFFFFFFF means that we have infinite
- * distance. Indicate that with a negative floating point
- * SubjectDistance value.
- */
- n=-1.0;
- else
- n=(double)m.i[0]/(double)m.i[1];
- return(TIFFSetField(tif,dir->tdir_tag,n));
- }
- else
- {
- TIFFReadDirEntryOutputErr(tif,err,module,"SubjectDistance",TRUE);
- return(0);
- }
+ static const char module[] = "TIFFFetchSubjectDistance";
+ enum TIFFReadDirEntryErr err;
+ UInt64Aligned_t m;
+ m.l = 0;
+ assert(sizeof(double) == 8);
+ assert(sizeof(uint64_t) == 8);
+ assert(sizeof(uint32_t) == 4);
+ if (dir->tdir_count != 1)
+ err = TIFFReadDirEntryErrCount;
+ else if (dir->tdir_type != TIFF_RATIONAL)
+ err = TIFFReadDirEntryErrType;
+ else
+ {
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ uint32_t offset;
+ offset = *(uint32_t *)(&dir->tdir_offset);
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&offset);
+ err = TIFFReadDirEntryData(tif, offset, 8, m.i);
+ }
+ else
+ {
+ m.l = dir->tdir_offset.toff_long8;
+ err = TIFFReadDirEntryErrOk;
+ }
+ }
+ if (err == TIFFReadDirEntryErrOk)
+ {
+ double n;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfLong(m.i, 2);
+ if (m.i[0] == 0)
+ n = 0.0;
+ else if (m.i[0] == 0xFFFFFFFF || m.i[1] == 0)
+ /*
+ * XXX: Numerator 0xFFFFFFFF means that we have infinite
+ * distance. Indicate that with a negative floating point
+ * SubjectDistance value.
+ */
+ n = -1.0;
+ else
+ n = (double)m.i[0] / (double)m.i[1];
+ return (TIFFSetField(tif, dir->tdir_tag, n));
+ }
+ else
+ {
+ TIFFReadDirEntryOutputErr(tif, err, module, "SubjectDistance", TRUE);
+ return (0);
+ }
}
-static void allocChoppedUpStripArrays(TIFF* tif, uint32 nstrips,
- uint64 stripbytes, uint32 rowsperstrip)
+static void allocChoppedUpStripArrays(TIFF *tif, uint32_t nstrips,
+ uint64_t stripbytes,
+ uint32_t rowsperstrip)
{
TIFFDirectory *td = &tif->tif_dir;
- uint64 bytecount;
- uint64 offset;
- uint64 last_offset;
- uint64 last_bytecount;
- uint32 i;
- uint64 *newcounts;
- uint64 *newoffsets;
+ uint64_t bytecount;
+ uint64_t offset;
+ uint64_t last_offset;
+ uint64_t last_bytecount;
+ uint32_t i;
+ uint64_t *newcounts;
+ uint64_t *newoffsets;
offset = TIFFGetStrileOffset(tif, 0);
- last_offset = TIFFGetStrileOffset(tif, td->td_nstrips-1);
- last_bytecount = TIFFGetStrileByteCount(tif, td->td_nstrips-1);
- if( last_offset > TIFF_UINT64_MAX - last_bytecount ||
- last_offset + last_bytecount < offset )
+ last_offset = TIFFGetStrileOffset(tif, td->td_nstrips - 1);
+ last_bytecount = TIFFGetStrileByteCount(tif, td->td_nstrips - 1);
+ if (last_offset > UINT64_MAX - last_bytecount ||
+ last_offset + last_bytecount < offset)
{
return;
}
bytecount = last_offset + last_bytecount - offset;
- newcounts = (uint64*) _TIFFCheckMalloc(tif, nstrips, sizeof (uint64),
- "for chopped \"StripByteCounts\" array");
- newoffsets = (uint64*) _TIFFCheckMalloc(tif, nstrips, sizeof (uint64),
- "for chopped \"StripOffsets\" array");
- if (newcounts == NULL || newoffsets == NULL) {
+ newcounts =
+ (uint64_t *)_TIFFCheckMalloc(tif, nstrips, sizeof(uint64_t),
+ "for chopped \"StripByteCounts\" array");
+ newoffsets = (uint64_t *)_TIFFCheckMalloc(
+ tif, nstrips, sizeof(uint64_t), "for chopped \"StripOffsets\" array");
+ if (newcounts == NULL || newoffsets == NULL)
+ {
/*
- * Unable to allocate new strip information, give up and use
- * the original one strip information.
- */
+ * Unable to allocate new strip information, give up and use
+ * the original one strip information.
+ */
if (newcounts != NULL)
- _TIFFfree(newcounts);
+ _TIFFfreeExt(tif, newcounts);
if (newoffsets != NULL)
- _TIFFfree(newoffsets);
+ _TIFFfreeExt(tif, newoffsets);
return;
}
@@ -5807,8 +7135,8 @@ static void allocChoppedUpStripArrays(TIFF* tif, uint32 nstrips,
td->td_stripsperimage = td->td_nstrips = nstrips;
TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, rowsperstrip);
- _TIFFfree(td->td_stripbytecount_p);
- _TIFFfree(td->td_stripoffset_p);
+ _TIFFfreeExt(tif, td->td_stripbytecount_p);
+ _TIFFfreeExt(tif, td->td_stripoffset_p);
td->td_stripbytecount_p = newcounts;
td->td_stripoffset_p = newoffsets;
#ifdef STRIPBYTECOUNTSORTED_UNUSED
@@ -5817,77 +7145,75 @@ static void allocChoppedUpStripArrays(TIFF* tif, uint32 nstrips,
tif->tif_flags |= TIFF_CHOPPEDUPARRAYS;
}
-
/*
* Replace a single strip (tile) of uncompressed data by multiple strips
* (tiles), each approximately STRIP_SIZE_DEFAULT bytes. This is useful for
* dealing with large images or for dealing with machines with a limited
* amount memory.
*/
-static void
-ChopUpSingleUncompressedStrip(TIFF* tif)
+static void ChopUpSingleUncompressedStrip(TIFF *tif)
{
- register TIFFDirectory *td = &tif->tif_dir;
- uint64 bytecount;
- uint64 offset;
- uint32 rowblock;
- uint64 rowblockbytes;
- uint64 stripbytes;
- uint32 nstrips;
- uint32 rowsperstrip;
-
- bytecount = TIFFGetStrileByteCount(tif, 0);
- /* On a newly created file, just re-opened to be filled, we */
- /* don't want strip chop to trigger as it is going to cause issues */
- /* later ( StripOffsets and StripByteCounts improperly filled) . */
- if( bytecount == 0 && tif->tif_mode != O_RDONLY )
- return;
- offset = TIFFGetStrileByteCount(tif, 0);
- assert(td->td_planarconfig == PLANARCONFIG_CONTIG);
- if ((td->td_photometric == PHOTOMETRIC_YCBCR)&&
- (!isUpSampled(tif)))
- rowblock = td->td_ycbcrsubsampling[1];
- else
- rowblock = 1;
- rowblockbytes = TIFFVTileSize64(tif, rowblock);
- /*
- * Make the rows hold at least one scanline, but fill specified amount
- * of data if possible.
- */
- if (rowblockbytes > STRIP_SIZE_DEFAULT) {
- stripbytes = rowblockbytes;
- rowsperstrip = rowblock;
- } else if (rowblockbytes > 0 ) {
- uint32 rowblocksperstrip;
- rowblocksperstrip = (uint32) (STRIP_SIZE_DEFAULT / rowblockbytes);
- rowsperstrip = rowblocksperstrip * rowblock;
- stripbytes = rowblocksperstrip * rowblockbytes;
- }
- else
- return;
-
- /*
- * never increase the number of rows per strip
- */
- if (rowsperstrip >= td->td_rowsperstrip)
- return;
- nstrips = TIFFhowmany_32(td->td_imagelength, rowsperstrip);
- if( nstrips == 0 )
- return;
+ register TIFFDirectory *td = &tif->tif_dir;
+ uint64_t bytecount;
+ uint64_t offset;
+ uint32_t rowblock;
+ uint64_t rowblockbytes;
+ uint64_t stripbytes;
+ uint32_t nstrips;
+ uint32_t rowsperstrip;
+
+ bytecount = TIFFGetStrileByteCount(tif, 0);
+ /* On a newly created file, just re-opened to be filled, we */
+ /* don't want strip chop to trigger as it is going to cause issues */
+ /* later ( StripOffsets and StripByteCounts improperly filled) . */
+ if (bytecount == 0 && tif->tif_mode != O_RDONLY)
+ return;
+ offset = TIFFGetStrileByteCount(tif, 0);
+ assert(td->td_planarconfig == PLANARCONFIG_CONTIG);
+ if ((td->td_photometric == PHOTOMETRIC_YCBCR) && (!isUpSampled(tif)))
+ rowblock = td->td_ycbcrsubsampling[1];
+ else
+ rowblock = 1;
+ rowblockbytes = TIFFVTileSize64(tif, rowblock);
+ /*
+ * Make the rows hold at least one scanline, but fill specified amount
+ * of data if possible.
+ */
+ if (rowblockbytes > STRIP_SIZE_DEFAULT)
+ {
+ stripbytes = rowblockbytes;
+ rowsperstrip = rowblock;
+ }
+ else if (rowblockbytes > 0)
+ {
+ uint32_t rowblocksperstrip;
+ rowblocksperstrip = (uint32_t)(STRIP_SIZE_DEFAULT / rowblockbytes);
+ rowsperstrip = rowblocksperstrip * rowblock;
+ stripbytes = rowblocksperstrip * rowblockbytes;
+ }
+ else
+ return;
- /* If we are going to allocate a lot of memory, make sure that the */
- /* file is as big as needed */
- if( tif->tif_mode == O_RDONLY &&
- nstrips > 1000000 &&
- (offset >= TIFFGetFileSize(tif) ||
- stripbytes > (TIFFGetFileSize(tif) - offset) / (nstrips - 1)) )
- {
- return;
- }
+ /*
+ * never increase the number of rows per strip
+ */
+ if (rowsperstrip >= td->td_rowsperstrip)
+ return;
+ nstrips = TIFFhowmany_32(td->td_imagelength, rowsperstrip);
+ if (nstrips == 0)
+ return;
- allocChoppedUpStripArrays(tif, nstrips, stripbytes, rowsperstrip);
-}
+ /* If we are going to allocate a lot of memory, make sure that the */
+ /* file is as big as needed */
+ if (tif->tif_mode == O_RDONLY && nstrips > 1000000 &&
+ (offset >= TIFFGetFileSize(tif) ||
+ stripbytes > (TIFFGetFileSize(tif) - offset) / (nstrips - 1)))
+ {
+ return;
+ }
+ allocChoppedUpStripArrays(tif, nstrips, stripbytes, rowsperstrip);
+}
/*
* Replace a file with contiguous strips > 2 GB of uncompressed data by
@@ -5895,62 +7221,64 @@ ChopUpSingleUncompressedStrip(TIFF* tif)
* dealing with large images or for dealing with machines with a limited
* amount memory.
*/
-static void TryChopUpUncompressedBigTiff( TIFF* tif )
+static void TryChopUpUncompressedBigTiff(TIFF *tif)
{
TIFFDirectory *td = &tif->tif_dir;
- uint32 rowblock;
- uint64 rowblockbytes;
- uint32 i;
- uint64 stripsize;
- uint32 rowblocksperstrip;
- uint32 rowsperstrip;
- uint64 stripbytes;
- uint32 nstrips;
+ uint32_t rowblock;
+ uint64_t rowblockbytes;
+ uint32_t i;
+ uint64_t stripsize;
+ uint32_t rowblocksperstrip;
+ uint32_t rowsperstrip;
+ uint64_t stripbytes;
+ uint32_t nstrips;
stripsize = TIFFStripSize64(tif);
- assert( tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG );
- assert( tif->tif_dir.td_compression == COMPRESSION_NONE );
- assert( (tif->tif_flags&(TIFF_STRIPCHOP|TIFF_ISTILED)) == TIFF_STRIPCHOP );
- assert( stripsize > 0x7FFFFFFFUL );
+ assert(tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG);
+ assert(tif->tif_dir.td_compression == COMPRESSION_NONE);
+ assert((tif->tif_flags & (TIFF_STRIPCHOP | TIFF_ISTILED)) ==
+ TIFF_STRIPCHOP);
+ assert(stripsize > 0x7FFFFFFFUL);
/* On a newly created file, just re-opened to be filled, we */
/* don't want strip chop to trigger as it is going to cause issues */
/* later ( StripOffsets and StripByteCounts improperly filled) . */
- if( TIFFGetStrileByteCount(tif, 0) == 0 && tif->tif_mode != O_RDONLY )
+ if (TIFFGetStrileByteCount(tif, 0) == 0 && tif->tif_mode != O_RDONLY)
return;
- if ((td->td_photometric == PHOTOMETRIC_YCBCR)&&
- (!isUpSampled(tif)))
+ if ((td->td_photometric == PHOTOMETRIC_YCBCR) && (!isUpSampled(tif)))
rowblock = td->td_ycbcrsubsampling[1];
else
rowblock = 1;
rowblockbytes = TIFFVStripSize64(tif, rowblock);
- if( rowblockbytes == 0 || rowblockbytes > 0x7FFFFFFFUL )
+ if (rowblockbytes == 0 || rowblockbytes > 0x7FFFFFFFUL)
{
/* In case of file with gigantic width */
return;
}
/* Check that the strips are contiguous and of the expected size */
- for( i = 0; i < td->td_nstrips; i++ )
+ for (i = 0; i < td->td_nstrips; i++)
{
- if( i == td->td_nstrips - 1 )
+ if (i == td->td_nstrips - 1)
{
- if( TIFFGetStrileByteCount(tif, i) < TIFFVStripSize64(
- tif, td->td_imagelength - i * td->td_rowsperstrip ) )
+ if (TIFFGetStrileByteCount(tif, i) <
+ TIFFVStripSize64(tif,
+ td->td_imagelength - i * td->td_rowsperstrip))
{
return;
}
}
else
{
- if( TIFFGetStrileByteCount(tif, i) != stripsize )
+ if (TIFFGetStrileByteCount(tif, i) != stripsize)
{
return;
}
- if( i > 0 && TIFFGetStrileOffset(tif, i) !=
- TIFFGetStrileOffset(tif, i-1) + TIFFGetStrileByteCount(tif, i-1) )
+ if (i > 0 && TIFFGetStrileOffset(tif, i) !=
+ TIFFGetStrileOffset(tif, i - 1) +
+ TIFFGetStrileByteCount(tif, i - 1))
{
return;
}
@@ -5958,27 +7286,26 @@ static void TryChopUpUncompressedBigTiff( TIFF* tif )
}
/* Aim for 512 MB strips (that will still be manageable by 32 bit builds */
- rowblocksperstrip = (uint32) (512 * 1024 * 1024 / rowblockbytes);
- if( rowblocksperstrip == 0 )
+ rowblocksperstrip = (uint32_t)(512 * 1024 * 1024 / rowblockbytes);
+ if (rowblocksperstrip == 0)
rowblocksperstrip = 1;
rowsperstrip = rowblocksperstrip * rowblock;
stripbytes = rowblocksperstrip * rowblockbytes;
- assert( stripbytes <= 0x7FFFFFFFUL );
+ assert(stripbytes <= 0x7FFFFFFFUL);
nstrips = TIFFhowmany_32(td->td_imagelength, rowsperstrip);
- if( nstrips == 0 )
+ if (nstrips == 0)
return;
/* If we are going to allocate a lot of memory, make sure that the */
/* file is as big as needed */
- if( tif->tif_mode == O_RDONLY &&
- nstrips > 1000000 )
+ if (tif->tif_mode == O_RDONLY && nstrips > 1000000)
{
- uint64 last_offset = TIFFGetStrileOffset(tif, td->td_nstrips-1);
- uint64 filesize = TIFFGetFileSize(tif);
- uint64 last_bytecount = TIFFGetStrileByteCount(tif, td->td_nstrips-1);
- if( last_offset > filesize ||
- last_bytecount > filesize - last_offset )
+ uint64_t last_offset = TIFFGetStrileOffset(tif, td->td_nstrips - 1);
+ uint64_t filesize = TIFFGetFileSize(tif);
+ uint64_t last_bytecount =
+ TIFFGetStrileByteCount(tif, td->td_nstrips - 1);
+ if (last_offset > filesize || last_bytecount > filesize - last_offset)
{
return;
}
@@ -5987,9 +7314,8 @@ static void TryChopUpUncompressedBigTiff( TIFF* tif )
allocChoppedUpStripArrays(tif, nstrips, stripbytes, rowsperstrip);
}
-
TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
-static uint64 _TIFFUnsanitizedAddUInt64AndInt(uint64 a, int b)
+static uint64_t _TIFFUnsanitizedAddUInt64AndInt(uint64_t a, int b)
{
return a + b;
}
@@ -5998,9 +7324,8 @@ static uint64 _TIFFUnsanitizedAddUInt64AndInt(uint64 a, int b)
* strip/tile of number strile. Also fetch the neighbouring values using a
* 4096 byte page size.
*/
-static
-int _TIFFPartialReadStripArray( TIFF* tif, TIFFDirEntry* dirent,
- int strile, uint64* panVals )
+static int _TIFFPartialReadStripArray(TIFF *tif, TIFFDirEntry *dirent,
+ int strile, uint64_t *panVals)
{
static const char module[] = "_TIFFPartialReadStripArray";
#define IO_CACHE_PAGE_SIZE 4096
@@ -6008,83 +7333,88 @@ int _TIFFPartialReadStripArray( TIFF* tif, TIFFDirEntry* dirent,
size_t sizeofval;
const int bSwab = (tif->tif_flags & TIFF_SWAB) != 0;
int sizeofvalint;
- uint64 nBaseOffset;
- uint64 nOffset;
- uint64 nOffsetStartPage;
- uint64 nOffsetEndPage;
+ uint64_t nBaseOffset;
+ uint64_t nOffset;
+ uint64_t nOffsetStartPage;
+ uint64_t nOffsetEndPage;
tmsize_t nToRead;
tmsize_t nRead;
- uint64 nLastStripOffset;
+ uint64_t nLastStripOffset;
int iStartBefore;
int i;
- const uint32 arraySize = tif->tif_dir.td_stripoffsetbyteallocsize;
+ const uint32_t arraySize = tif->tif_dir.td_stripoffsetbyteallocsize;
unsigned char buffer[2 * IO_CACHE_PAGE_SIZE];
- assert( dirent->tdir_count > 4 );
+ assert(dirent->tdir_count > 4);
- if( dirent->tdir_type == TIFF_SHORT )
+ if (dirent->tdir_type == TIFF_SHORT)
{
- sizeofval = sizeof(uint16);
+ sizeofval = sizeof(uint16_t);
}
- else if( dirent->tdir_type == TIFF_LONG )
+ else if (dirent->tdir_type == TIFF_LONG)
{
- sizeofval = sizeof(uint32);
+ sizeofval = sizeof(uint32_t);
}
- else if( dirent->tdir_type == TIFF_LONG8 )
+ else if (dirent->tdir_type == TIFF_LONG8)
{
- sizeofval = sizeof(uint64);
+ sizeofval = sizeof(uint64_t);
+ }
+ else if (dirent->tdir_type == TIFF_SLONG8)
+ {
+ /* Non conformant but used by some images as in */
+ /* https://github.com/OSGeo/gdal/issues/2165 */
+ sizeofval = sizeof(int64_t);
}
else
{
- TIFFErrorExt(tif->tif_clientdata, module,
- "Invalid type for [Strip|Tile][Offset/ByteCount] tag");
+ TIFFErrorExtR(tif, module,
+ "Invalid type for [Strip|Tile][Offset/ByteCount] tag");
panVals[strile] = 0;
return 0;
}
sizeofvalint = (int)(sizeofval);
- if( tif->tif_flags&TIFF_BIGTIFF )
+ if (tif->tif_flags & TIFF_BIGTIFF)
{
- uint64 offset = dirent->tdir_offset.toff_long8;
- if( bSwab )
+ uint64_t offset = dirent->tdir_offset.toff_long8;
+ if (bSwab)
TIFFSwabLong8(&offset);
nBaseOffset = offset;
}
else
{
- uint32 offset = dirent->tdir_offset.toff_long;
- if( bSwab )
+ uint32_t offset = dirent->tdir_offset.toff_long;
+ if (bSwab)
TIFFSwabLong(&offset);
nBaseOffset = offset;
}
/* To avoid later unsigned integer overflows */
- if( nBaseOffset > (uint64)TIFF_INT64_MAX )
+ if (nBaseOffset > (uint64_t)INT64_MAX)
{
- TIFFErrorExt(tif->tif_clientdata, module,
- "Cannot read offset/size for strile %d", strile);
+ TIFFErrorExtR(tif, module, "Cannot read offset/size for strile %d",
+ strile);
panVals[strile] = 0;
return 0;
}
nOffset = nBaseOffset + sizeofval * strile;
- nOffsetStartPage =
- (nOffset / IO_CACHE_PAGE_SIZE) * IO_CACHE_PAGE_SIZE;
+ nOffsetStartPage = (nOffset / IO_CACHE_PAGE_SIZE) * IO_CACHE_PAGE_SIZE;
nOffsetEndPage = nOffsetStartPage + IO_CACHE_PAGE_SIZE;
- if( nOffset + sizeofval > nOffsetEndPage )
+ if (nOffset + sizeofval > nOffsetEndPage)
nOffsetEndPage += IO_CACHE_PAGE_SIZE;
#undef IO_CACHE_PAGE_SIZE
nLastStripOffset = nBaseOffset + arraySize * sizeofval;
- if( nLastStripOffset < nOffsetEndPage )
+ if (nLastStripOffset < nOffsetEndPage)
nOffsetEndPage = nLastStripOffset;
- if( nOffsetStartPage >= nOffsetEndPage )
+ if (nOffsetStartPage >= nOffsetEndPage)
{
- TIFFErrorExt(tif->tif_clientdata, module,
- "Cannot read offset/size for strile %d", strile);
+ TIFFErrorExtR(tif, module, "Cannot read offset/size for strile %d",
+ strile);
panVals[strile] = 0;
return 0;
}
- if (!SeekOK(tif,nOffsetStartPage))
+ if (!SeekOK(tif, nOffsetStartPage))
{
panVals[strile] = 0;
return 0;
@@ -6092,148 +7422,160 @@ int _TIFFPartialReadStripArray( TIFF* tif, TIFFDirEntry* dirent,
nToRead = (tmsize_t)(nOffsetEndPage - nOffsetStartPage);
nRead = TIFFReadFile(tif, buffer, nToRead);
- if( nRead < nToRead )
+ if (nRead < nToRead)
{
- TIFFErrorExt(tif->tif_clientdata, module,
- "Cannot read offset/size for strile around ~%d", strile);
+ TIFFErrorExtR(tif, module,
+ "Cannot read offset/size for strile around ~%d", strile);
return 0;
}
iStartBefore = -(int)((nOffset - nOffsetStartPage) / sizeofval);
- if( strile + iStartBefore < 0 )
+ if (strile + iStartBefore < 0)
iStartBefore = -strile;
- for( i = iStartBefore;
- (uint32)(strile + i) < arraySize &&
- _TIFFUnsanitizedAddUInt64AndInt(nOffset, (i + 1) * sizeofvalint) <= nOffsetEndPage;
- ++i )
+ for (i = iStartBefore;
+ (uint32_t)(strile + i) < arraySize &&
+ _TIFFUnsanitizedAddUInt64AndInt(nOffset, (i + 1) * sizeofvalint) <=
+ nOffsetEndPage;
+ ++i)
{
- if( sizeofval == sizeof(uint16) )
+ if (dirent->tdir_type == TIFF_SHORT)
{
- uint16 val;
+ uint16_t val;
memcpy(&val,
buffer + (nOffset - nOffsetStartPage) + i * sizeofvalint,
sizeof(val));
- if( bSwab )
+ if (bSwab)
TIFFSwabShort(&val);
panVals[strile + i] = val;
}
- else if( sizeofval == sizeof(uint32) )
+ else if (dirent->tdir_type == TIFF_LONG)
{
- uint32 val;
+ uint32_t val;
memcpy(&val,
buffer + (nOffset - nOffsetStartPage) + i * sizeofvalint,
sizeof(val));
- if( bSwab )
+ if (bSwab)
TIFFSwabLong(&val);
panVals[strile + i] = val;
}
- else
+ else if (dirent->tdir_type == TIFF_LONG8)
{
- uint64 val;
+ uint64_t val;
memcpy(&val,
buffer + (nOffset - nOffsetStartPage) + i * sizeofvalint,
sizeof(val));
- if( bSwab )
+ if (bSwab)
TIFFSwabLong8(&val);
panVals[strile + i] = val;
}
+ else /* if( dirent->tdir_type == TIFF_SLONG8 ) */
+ {
+ /* Non conformant data type */
+ int64_t val;
+ memcpy(&val,
+ buffer + (nOffset - nOffsetStartPage) + i * sizeofvalint,
+ sizeof(val));
+ if (bSwab)
+ TIFFSwabLong8((uint64_t *)&val);
+ panVals[strile + i] = (uint64_t)val;
+ }
}
return 1;
}
-static int _TIFFFetchStrileValue(TIFF* tif,
- uint32 strile,
- TIFFDirEntry* dirent,
- uint64** parray)
+static int _TIFFFetchStrileValue(TIFF *tif, uint32_t strile,
+ TIFFDirEntry *dirent, uint64_t **parray)
{
static const char module[] = "_TIFFFetchStrileValue";
TIFFDirectory *td = &tif->tif_dir;
- if( strile >= dirent->tdir_count )
+ if (strile >= dirent->tdir_count)
{
return 0;
}
- if( strile >= td->td_stripoffsetbyteallocsize )
+ if (strile >= td->td_stripoffsetbyteallocsize)
{
- uint32 nStripArrayAllocBefore = td->td_stripoffsetbyteallocsize;
- uint32 nStripArrayAllocNew;
- uint64 nArraySize64;
+ uint32_t nStripArrayAllocBefore = td->td_stripoffsetbyteallocsize;
+ uint32_t nStripArrayAllocNew;
+ uint64_t nArraySize64;
size_t nArraySize;
- uint64* offsetArray;
- uint64* bytecountArray;
+ uint64_t *offsetArray;
+ uint64_t *bytecountArray;
- if( strile > 1000000 )
+ if (strile > 1000000)
{
- uint64 filesize = TIFFGetFileSize(tif);
+ uint64_t filesize = TIFFGetFileSize(tif);
/* Avoid excessive memory allocation attempt */
/* For such a big blockid we need at least a TIFF_LONG per strile */
/* for the offset array. */
- if( strile > filesize / sizeof(uint32) )
+ if (strile > filesize / sizeof(uint32_t))
{
- TIFFErrorExt(tif->tif_clientdata, module, "File too short");
+ TIFFErrorExtR(tif, module, "File too short");
return 0;
}
}
- if( td->td_stripoffsetbyteallocsize == 0 &&
- td->td_nstrips < 1024 * 1024 )
+ if (td->td_stripoffsetbyteallocsize == 0 &&
+ td->td_nstrips < 1024 * 1024)
{
nStripArrayAllocNew = td->td_nstrips;
}
else
{
-#define TIFF_MAX(a,b) (((a)>(b)) ? (a) : (b))
-#define TIFF_MIN(a,b) (((a)<(b)) ? (a) : (b))
- nStripArrayAllocNew = TIFF_MAX(strile + 1, 1024U * 512U );
- if( nStripArrayAllocNew < 0xFFFFFFFFU / 2 )
+#define TIFF_MAX(a, b) (((a) > (b)) ? (a) : (b))
+#define TIFF_MIN(a, b) (((a) < (b)) ? (a) : (b))
+ nStripArrayAllocNew = TIFF_MAX(strile + 1, 1024U * 512U);
+ if (nStripArrayAllocNew < 0xFFFFFFFFU / 2)
nStripArrayAllocNew *= 2;
nStripArrayAllocNew = TIFF_MIN(nStripArrayAllocNew, td->td_nstrips);
}
- assert( strile < nStripArrayAllocNew );
- nArraySize64 = (uint64)sizeof(uint64) * nStripArrayAllocNew;
+ assert(strile < nStripArrayAllocNew);
+ nArraySize64 = (uint64_t)sizeof(uint64_t) * nStripArrayAllocNew;
nArraySize = (size_t)(nArraySize64);
#if SIZEOF_SIZE_T == 4
- if( nArraySize != nArraySize64 )
+ if (nArraySize != nArraySize64)
{
- TIFFErrorExt(tif->tif_clientdata, module,
- "Cannot allocate strip offset and bytecount arrays");
+ TIFFErrorExtR(tif, module,
+ "Cannot allocate strip offset and bytecount arrays");
return 0;
}
#endif
- offsetArray = (uint64*)(
- _TIFFrealloc( td->td_stripoffset_p, nArraySize ) );
- bytecountArray = (uint64*)(
- _TIFFrealloc( td->td_stripbytecount_p, nArraySize ) );
- if( offsetArray )
+ offsetArray = (uint64_t *)(_TIFFreallocExt(tif, td->td_stripoffset_p,
+ nArraySize));
+ bytecountArray = (uint64_t *)(_TIFFreallocExt(
+ tif, td->td_stripbytecount_p, nArraySize));
+ if (offsetArray)
td->td_stripoffset_p = offsetArray;
- if( bytecountArray )
+ if (bytecountArray)
td->td_stripbytecount_p = bytecountArray;
- if( offsetArray && bytecountArray )
+ if (offsetArray && bytecountArray)
{
td->td_stripoffsetbyteallocsize = nStripArrayAllocNew;
/* Initialize new entries to ~0 / -1 */
- memset(td->td_stripoffset_p + nStripArrayAllocBefore,
- 0xFF,
- (td->td_stripoffsetbyteallocsize - nStripArrayAllocBefore) * sizeof(uint64) );
- memset(td->td_stripbytecount_p + nStripArrayAllocBefore,
- 0xFF,
- (td->td_stripoffsetbyteallocsize - nStripArrayAllocBefore) * sizeof(uint64) );
+ /* coverity[overrun-buffer-arg] */
+ memset(td->td_stripoffset_p + nStripArrayAllocBefore, 0xFF,
+ (td->td_stripoffsetbyteallocsize - nStripArrayAllocBefore) *
+ sizeof(uint64_t));
+ /* coverity[overrun-buffer-arg] */
+ memset(td->td_stripbytecount_p + nStripArrayAllocBefore, 0xFF,
+ (td->td_stripoffsetbyteallocsize - nStripArrayAllocBefore) *
+ sizeof(uint64_t));
}
else
{
- TIFFErrorExt(tif->tif_clientdata, module,
- "Cannot allocate strip offset and bytecount arrays");
- _TIFFfree(td->td_stripoffset_p);
+ TIFFErrorExtR(tif, module,
+ "Cannot allocate strip offset and bytecount arrays");
+ _TIFFfreeExt(tif, td->td_stripoffset_p);
td->td_stripoffset_p = NULL;
- _TIFFfree(td->td_stripbytecount_p);
+ _TIFFfreeExt(tif, td->td_stripbytecount_p);
td->td_stripbytecount_p = NULL;
td->td_stripoffsetbyteallocsize = 0;
}
}
- if( *parray == NULL || strile >= td->td_stripoffsetbyteallocsize )
+ if (*parray == NULL || strile >= td->td_stripoffsetbyteallocsize)
return 0;
- if( ~((*parray)[strile]) == 0 )
+ if (~((*parray)[strile]) == 0)
{
- if( !_TIFFPartialReadStripArray( tif, dirent, strile, *parray ) )
+ if (!_TIFFPartialReadStripArray(tif, dirent, strile, *parray))
{
(*parray)[strile] = 0;
return 0;
@@ -6243,24 +7585,25 @@ static int _TIFFFetchStrileValue(TIFF* tif,
return 1;
}
-static uint64 _TIFFGetStrileOffsetOrByteCountValue(TIFF *tif, uint32 strile,
- TIFFDirEntry* dirent,
- uint64** parray,
- int *pbErr)
+static uint64_t _TIFFGetStrileOffsetOrByteCountValue(TIFF *tif, uint32_t strile,
+ TIFFDirEntry *dirent,
+ uint64_t **parray,
+ int *pbErr)
{
TIFFDirectory *td = &tif->tif_dir;
- if( pbErr )
+ if (pbErr)
*pbErr = 0;
- if( (tif->tif_flags&TIFF_DEFERSTRILELOAD) && !(tif->tif_flags&TIFF_CHOPPEDUPARRAYS) )
+ if ((tif->tif_flags & TIFF_DEFERSTRILELOAD) &&
+ !(tif->tif_flags & TIFF_CHOPPEDUPARRAYS))
{
- if( !(tif->tif_flags&TIFF_LAZYSTRILELOAD) ||
+ if (!(tif->tif_flags & TIFF_LAZYSTRILELOAD) ||
/* If the values may fit in the toff_long/toff_long8 member */
/* then use _TIFFFillStriles to simplify _TIFFFetchStrileValue */
- dirent->tdir_count <= 4 )
+ dirent->tdir_count <= 4)
{
- if( !_TIFFFillStriles(tif) )
+ if (!_TIFFFillStriles(tif))
{
- if( pbErr )
+ if (pbErr)
*pbErr = 1;
/* Do not return, as we want this function to always */
/* return the same value if called several times with */
@@ -6269,73 +7612,74 @@ static uint64 _TIFFGetStrileOffsetOrByteCountValue(TIFF *tif, uint32 strile,
}
else
{
- if( !_TIFFFetchStrileValue(tif, strile, dirent, parray) )
- {
- if( pbErr )
+ if (!_TIFFFetchStrileValue(tif, strile, dirent, parray))
+ {
+ if (pbErr)
*pbErr = 1;
- return 0;
- }
+ return 0;
+ }
}
}
- if( *parray == NULL || strile >= td->td_nstrips )
+ if (*parray == NULL || strile >= td->td_nstrips)
{
- if( pbErr )
+ if (pbErr)
*pbErr = 1;
return 0;
}
return (*parray)[strile];
}
-/* Return the value of the TileOffsets/StripOffsets array for the specified tile/strile */
-uint64 TIFFGetStrileOffset(TIFF *tif, uint32 strile)
+/* Return the value of the TileOffsets/StripOffsets array for the specified
+ * tile/strile */
+uint64_t TIFFGetStrileOffset(TIFF *tif, uint32_t strile)
{
return TIFFGetStrileOffsetWithErr(tif, strile, NULL);
}
-/* Return the value of the TileOffsets/StripOffsets array for the specified tile/strile */
-uint64 TIFFGetStrileOffsetWithErr(TIFF *tif, uint32 strile, int *pbErr)
+/* Return the value of the TileOffsets/StripOffsets array for the specified
+ * tile/strile */
+uint64_t TIFFGetStrileOffsetWithErr(TIFF *tif, uint32_t strile, int *pbErr)
{
TIFFDirectory *td = &tif->tif_dir;
return _TIFFGetStrileOffsetOrByteCountValue(tif, strile,
- &(td->td_stripoffset_entry),
- &(td->td_stripoffset_p), pbErr);
+ &(td->td_stripoffset_entry),
+ &(td->td_stripoffset_p), pbErr);
}
-/* Return the value of the TileByteCounts/StripByteCounts array for the specified tile/strile */
-uint64 TIFFGetStrileByteCount(TIFF *tif, uint32 strile)
+/* Return the value of the TileByteCounts/StripByteCounts array for the
+ * specified tile/strile */
+uint64_t TIFFGetStrileByteCount(TIFF *tif, uint32_t strile)
{
return TIFFGetStrileByteCountWithErr(tif, strile, NULL);
}
-/* Return the value of the TileByteCounts/StripByteCounts array for the specified tile/strile */
-uint64 TIFFGetStrileByteCountWithErr(TIFF *tif, uint32 strile, int *pbErr)
+/* Return the value of the TileByteCounts/StripByteCounts array for the
+ * specified tile/strile */
+uint64_t TIFFGetStrileByteCountWithErr(TIFF *tif, uint32_t strile, int *pbErr)
{
TIFFDirectory *td = &tif->tif_dir;
- return _TIFFGetStrileOffsetOrByteCountValue(tif, strile,
- &(td->td_stripbytecount_entry),
- &(td->td_stripbytecount_p), pbErr);
+ return _TIFFGetStrileOffsetOrByteCountValue(
+ tif, strile, &(td->td_stripbytecount_entry), &(td->td_stripbytecount_p),
+ pbErr);
}
+int _TIFFFillStriles(TIFF *tif) { return _TIFFFillStrilesInternal(tif, 1); }
-int _TIFFFillStriles( TIFF *tif )
-{
- return _TIFFFillStrilesInternal( tif, 1 );
-}
-
-static int _TIFFFillStrilesInternal( TIFF *tif, int loadStripByteCount )
+static int _TIFFFillStrilesInternal(TIFF *tif, int loadStripByteCount)
{
register TIFFDirectory *td = &tif->tif_dir;
int return_value = 1;
/* Do not do anything if TIFF_DEFERSTRILELOAD is not set */
- if( !(tif->tif_flags&TIFF_DEFERSTRILELOAD) || (tif->tif_flags&TIFF_CHOPPEDUPARRAYS) != 0 )
+ if (!(tif->tif_flags & TIFF_DEFERSTRILELOAD) ||
+ (tif->tif_flags & TIFF_CHOPPEDUPARRAYS) != 0)
return 1;
- if( tif->tif_flags&TIFF_LAZYSTRILELOAD )
+ if (tif->tif_flags & TIFF_LAZYSTRILELOAD)
{
/* In case of lazy loading, reload completely the arrays */
- _TIFFfree(td->td_stripoffset_p);
- _TIFFfree(td->td_stripbytecount_p);
+ _TIFFfreeExt(tif, td->td_stripoffset_p);
+ _TIFFfreeExt(tif, td->td_stripbytecount_p);
td->td_stripoffset_p = NULL;
td->td_stripbytecount_p = NULL;
td->td_stripoffsetbyteallocsize = 0;
@@ -6343,53 +7687,46 @@ static int _TIFFFillStrilesInternal( TIFF *tif, int loadStripByteCount )
}
/* If stripoffset array is already loaded, exit with success */
- if( td->td_stripoffset_p != NULL )
- return 1;
+ if (td->td_stripoffset_p != NULL)
+ return 1;
- /* If tdir_count was cancelled, then we already got there, but in error */
- if( td->td_stripoffset_entry.tdir_count == 0 )
- return 0;
+ /* If tdir_count was canceled, then we already got there, but in error */
+ if (td->td_stripoffset_entry.tdir_count == 0)
+ return 0;
- if (!TIFFFetchStripThing(tif,&(td->td_stripoffset_entry),
- td->td_nstrips,&td->td_stripoffset_p))
+ if (!TIFFFetchStripThing(tif, &(td->td_stripoffset_entry), td->td_nstrips,
+ &td->td_stripoffset_p))
{
- return_value = 0;
+ return_value = 0;
}
if (loadStripByteCount &&
- !TIFFFetchStripThing(tif,&(td->td_stripbytecount_entry),
- td->td_nstrips,&td->td_stripbytecount_p))
+ !TIFFFetchStripThing(tif, &(td->td_stripbytecount_entry),
+ td->td_nstrips, &td->td_stripbytecount_p))
{
- return_value = 0;
+ return_value = 0;
}
- _TIFFmemset( &(td->td_stripoffset_entry), 0, sizeof(TIFFDirEntry));
- _TIFFmemset( &(td->td_stripbytecount_entry), 0, sizeof(TIFFDirEntry));
+ _TIFFmemset(&(td->td_stripoffset_entry), 0, sizeof(TIFFDirEntry));
+ _TIFFmemset(&(td->td_stripbytecount_entry), 0, sizeof(TIFFDirEntry));
#ifdef STRIPBYTECOUNTSORTED_UNUSED
- if (tif->tif_dir.td_nstrips > 1 && return_value == 1 ) {
- uint32 strip;
-
- tif->tif_dir.td_stripbytecountsorted = 1;
- for (strip = 1; strip < tif->tif_dir.td_nstrips; strip++) {
- if (tif->tif_dir.td_stripoffset_p[strip - 1] >
- tif->tif_dir.td_stripoffset_p[strip]) {
- tif->tif_dir.td_stripbytecountsorted = 0;
- break;
- }
+ if (tif->tif_dir.td_nstrips > 1 && return_value == 1)
+ {
+ uint32_t strip;
+
+ tif->tif_dir.td_stripbytecountsorted = 1;
+ for (strip = 1; strip < tif->tif_dir.td_nstrips; strip++)
+ {
+ if (tif->tif_dir.td_stripoffset_p[strip - 1] >
+ tif->tif_dir.td_stripoffset_p[strip])
+ {
+ tif->tif_dir.td_stripbytecountsorted = 0;
+ break;
}
+ }
}
#endif
return return_value;
}
-
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_dirwrite.c b/src/3rdparty/libtiff/libtiff/tif_dirwrite.c
index 9e4d306..beebd11 100644
--- a/src/3rdparty/libtiff/libtiff/tif_dirwrite.c
+++ b/src/3rdparty/libtiff/libtiff/tif_dirwrite.c
@@ -28,146 +28,203 @@
* Directory Write Support Routines.
*/
#include "tiffiop.h"
+#include <float.h> /*--: for Rational2Double */
+#include <math.h> /*--: for Rational2Double */
#ifdef HAVE_IEEEFP
#define TIFFCvtNativeToIEEEFloat(tif, n, fp)
#define TIFFCvtNativeToIEEEDouble(tif, n, dp)
#else
-extern void TIFFCvtNativeToIEEEFloat(TIFF* tif, uint32 n, float* fp);
-extern void TIFFCvtNativeToIEEEDouble(TIFF* tif, uint32 n, double* dp);
+extern void TIFFCvtNativeToIEEEFloat(TIFF *tif, uint32_t n, float *fp);
+extern void TIFFCvtNativeToIEEEDouble(TIFF *tif, uint32_t n, double *dp);
#endif
-static int TIFFWriteDirectorySec(TIFF* tif, int isimage, int imagedone, uint64* pdiroff);
-
-static int TIFFWriteDirectoryTagSampleformatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value);
-#if 0
-static int TIFFWriteDirectoryTagSampleformatPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
-#endif
-
-static int TIFFWriteDirectoryTagAscii(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, char* value);
-static int TIFFWriteDirectoryTagUndefinedArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value);
-#ifdef notdef
-static int TIFFWriteDirectoryTagByte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value);
-#endif
-static int TIFFWriteDirectoryTagByteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value);
-#if 0
-static int TIFFWriteDirectoryTagBytePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value);
-#endif
-#ifdef notdef
-static int TIFFWriteDirectoryTagSbyte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value);
-#endif
-static int TIFFWriteDirectoryTagSbyteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int8* value);
-#if 0
-static int TIFFWriteDirectoryTagSbytePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value);
-#endif
-static int TIFFWriteDirectoryTagShort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value);
-static int TIFFWriteDirectoryTagShortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint16* value);
-static int TIFFWriteDirectoryTagShortPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value);
-#ifdef notdef
-static int TIFFWriteDirectoryTagSshort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value);
-#endif
-static int TIFFWriteDirectoryTagSshortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int16* value);
-#if 0
-static int TIFFWriteDirectoryTagSshortPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value);
-#endif
-static int TIFFWriteDirectoryTagLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value);
-static int TIFFWriteDirectoryTagLongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value);
-#if 0
-static int TIFFWriteDirectoryTagLongPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value);
-#endif
-#ifdef notdef
-static int TIFFWriteDirectoryTagSlong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value);
-#endif
-static int TIFFWriteDirectoryTagSlongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int32* value);
-#if 0
-static int TIFFWriteDirectoryTagSlongPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value);
-#endif
-#ifdef notdef
-static int TIFFWriteDirectoryTagLong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint64 value);
-#endif
-static int TIFFWriteDirectoryTagLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
-#ifdef notdef
-static int TIFFWriteDirectoryTagSlong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int64 value);
-#endif
-static int TIFFWriteDirectoryTagSlong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int64* value);
-static int TIFFWriteDirectoryTagRational(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
-static int TIFFWriteDirectoryTagRationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
-static int TIFFWriteDirectoryTagSrationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
-#ifdef notdef
-static int TIFFWriteDirectoryTagFloat(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value);
-#endif
-static int TIFFWriteDirectoryTagFloatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
-#if 0
-static int TIFFWriteDirectoryTagFloatPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value);
-#endif
-#ifdef notdef
-static int TIFFWriteDirectoryTagDouble(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
-#endif
-static int TIFFWriteDirectoryTagDoubleArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value);
-#if 0
-static int TIFFWriteDirectoryTagDoublePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
-#endif
-static int TIFFWriteDirectoryTagIfdArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value);
-#ifdef notdef
-static int TIFFWriteDirectoryTagIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
-#endif
-static int TIFFWriteDirectoryTagShortLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value);
-static int TIFFWriteDirectoryTagLongLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
-static int TIFFWriteDirectoryTagIfdIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
-#ifdef notdef
-static int TIFFWriteDirectoryTagShortLongLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
-#endif
-static int TIFFWriteDirectoryTagColormap(TIFF* tif, uint32* ndir, TIFFDirEntry* dir);
-static int TIFFWriteDirectoryTagTransferfunction(TIFF* tif, uint32* ndir, TIFFDirEntry* dir);
-static int TIFFWriteDirectoryTagSubifd(TIFF* tif, uint32* ndir, TIFFDirEntry* dir);
-
-static int TIFFWriteDirectoryTagCheckedAscii(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, char* value);
-static int TIFFWriteDirectoryTagCheckedUndefinedArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value);
-#ifdef notdef
-static int TIFFWriteDirectoryTagCheckedByte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value);
-#endif
-static int TIFFWriteDirectoryTagCheckedByteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value);
-#ifdef notdef
-static int TIFFWriteDirectoryTagCheckedSbyte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value);
-#endif
-static int TIFFWriteDirectoryTagCheckedSbyteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int8* value);
-static int TIFFWriteDirectoryTagCheckedShort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value);
-static int TIFFWriteDirectoryTagCheckedShortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint16* value);
-#ifdef notdef
-static int TIFFWriteDirectoryTagCheckedSshort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value);
-#endif
-static int TIFFWriteDirectoryTagCheckedSshortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int16* value);
-static int TIFFWriteDirectoryTagCheckedLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value);
-static int TIFFWriteDirectoryTagCheckedLongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value);
-#ifdef notdef
-static int TIFFWriteDirectoryTagCheckedSlong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value);
-#endif
-static int TIFFWriteDirectoryTagCheckedSlongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int32* value);
-#ifdef notdef
-static int TIFFWriteDirectoryTagCheckedLong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint64 value);
-#endif
-static int TIFFWriteDirectoryTagCheckedLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
-#ifdef notdef
-static int TIFFWriteDirectoryTagCheckedSlong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int64 value);
-#endif
-static int TIFFWriteDirectoryTagCheckedSlong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int64* value);
-static int TIFFWriteDirectoryTagCheckedRational(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
-static int TIFFWriteDirectoryTagCheckedRationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
-static int TIFFWriteDirectoryTagCheckedSrationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
-#ifdef notdef
-static int TIFFWriteDirectoryTagCheckedFloat(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value);
-#endif
-static int TIFFWriteDirectoryTagCheckedFloatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
-#ifdef notdef
-static int TIFFWriteDirectoryTagCheckedDouble(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
-#endif
-static int TIFFWriteDirectoryTagCheckedDoubleArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value);
-static int TIFFWriteDirectoryTagCheckedIfdArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value);
-static int TIFFWriteDirectoryTagCheckedIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
-
-static int TIFFWriteDirectoryTagData(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 datatype, uint32 count, uint32 datalength, void* data);
-
-static int TIFFLinkDirectory(TIFF*);
+static int TIFFWriteDirectorySec(TIFF *tif, int isimage, int imagedone,
+ uint64_t *pdiroff);
+
+static int TIFFWriteDirectoryTagSampleformatArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag, uint32_t count,
+ double *value);
+
+static int TIFFWriteDirectoryTagAscii(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, char *value);
+static int TIFFWriteDirectoryTagUndefinedArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, uint8_t *value);
+static int TIFFWriteDirectoryTagByteArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, uint8_t *value);
+static int TIFFWriteDirectoryTagSbyteArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, int8_t *value);
+static int TIFFWriteDirectoryTagShort(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint16_t value);
+static int TIFFWriteDirectoryTagShortArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, uint16_t *value);
+static int TIFFWriteDirectoryTagShortPerSample(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint16_t value);
+static int TIFFWriteDirectoryTagSshortArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, int16_t *value);
+static int TIFFWriteDirectoryTagLong(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t value);
+static int TIFFWriteDirectoryTagLongArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, uint32_t *value);
+static int TIFFWriteDirectoryTagSlongArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, int32_t *value);
+static int TIFFWriteDirectoryTagLong8Array(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, uint64_t *value);
+static int TIFFWriteDirectoryTagSlong8Array(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, int64_t *value);
+static int TIFFWriteDirectoryTagRational(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ double value);
+static int TIFFWriteDirectoryTagRationalArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, float *value);
+static int TIFFWriteDirectoryTagSrationalArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, float *value);
+static int TIFFWriteDirectoryTagFloatArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, float *value);
+static int TIFFWriteDirectoryTagDoubleArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, double *value);
+static int TIFFWriteDirectoryTagIfdArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, uint32_t *value);
+static int TIFFWriteDirectoryTagShortLong(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t value);
+static int TIFFWriteDirectoryTagLongLong8Array(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, uint64_t *value);
+static int TIFFWriteDirectoryTagIfdIfd8Array(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, uint64_t *value);
+static int TIFFWriteDirectoryTagColormap(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir);
+static int TIFFWriteDirectoryTagTransferfunction(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir);
+static int TIFFWriteDirectoryTagSubifd(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir);
+
+static int TIFFWriteDirectoryTagCheckedAscii(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, char *value);
+static int TIFFWriteDirectoryTagCheckedUndefinedArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag,
+ uint32_t count,
+ uint8_t *value);
+static int TIFFWriteDirectoryTagCheckedByteArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag, uint32_t count,
+ uint8_t *value);
+static int TIFFWriteDirectoryTagCheckedSbyteArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag, uint32_t count,
+ int8_t *value);
+static int TIFFWriteDirectoryTagCheckedShort(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint16_t value);
+static int TIFFWriteDirectoryTagCheckedShortArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag, uint32_t count,
+ uint16_t *value);
+static int TIFFWriteDirectoryTagCheckedSshortArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag, uint32_t count,
+ int16_t *value);
+static int TIFFWriteDirectoryTagCheckedLong(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t value);
+static int TIFFWriteDirectoryTagCheckedLongArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag, uint32_t count,
+ uint32_t *value);
+static int TIFFWriteDirectoryTagCheckedSlongArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag, uint32_t count,
+ int32_t *value);
+static int TIFFWriteDirectoryTagCheckedLong8Array(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag, uint32_t count,
+ uint64_t *value);
+static int TIFFWriteDirectoryTagCheckedSlong8Array(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag, uint32_t count,
+ int64_t *value);
+static int TIFFWriteDirectoryTagCheckedRational(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ double value);
+static int TIFFWriteDirectoryTagCheckedRationalArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag,
+ uint32_t count,
+ float *value);
+static int TIFFWriteDirectoryTagCheckedSrationalArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag,
+ uint32_t count,
+ float *value);
+
+/*--: Rational2Double: New functions to support true double-precision for custom
+ * rational tag types. */
+static int TIFFWriteDirectoryTagRationalDoubleArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag,
+ uint32_t count,
+ double *value);
+static int TIFFWriteDirectoryTagSrationalDoubleArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag,
+ uint32_t count,
+ double *value);
+static int
+TIFFWriteDirectoryTagCheckedRationalDoubleArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, double *value);
+static int TIFFWriteDirectoryTagCheckedSrationalDoubleArray(
+ TIFF *tif, uint32_t *ndir, TIFFDirEntry *dir, uint16_t tag, uint32_t count,
+ double *value);
+static void DoubleToRational(double value, uint32_t *num, uint32_t *denom);
+static void DoubleToSrational(double value, int32_t *num, int32_t *denom);
+
+static int TIFFWriteDirectoryTagCheckedFloatArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag, uint32_t count,
+ float *value);
+static int TIFFWriteDirectoryTagCheckedDoubleArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag, uint32_t count,
+ double *value);
+static int TIFFWriteDirectoryTagCheckedIfdArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count,
+ uint32_t *value);
+static int TIFFWriteDirectoryTagCheckedIfd8Array(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag, uint32_t count,
+ uint64_t *value);
+
+static int TIFFWriteDirectoryTagData(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint16_t datatype, uint32_t count,
+ uint32_t datalength, void *data);
+
+static int TIFFLinkDirectory(TIFF *);
/*
* Write the contents of the current directory
@@ -175,10 +232,9 @@ static int TIFFLinkDirectory(TIFF*);
* handle overwriting a directory with auxiliary
* storage that's been changed.
*/
-int
-TIFFWriteDirectory(TIFF* tif)
+int TIFFWriteDirectory(TIFF *tif)
{
- return TIFFWriteDirectorySec(tif,TRUE,TRUE,NULL);
+ return TIFFWriteDirectorySec(tif, TRUE, TRUE, NULL);
}
/*
@@ -206,19 +262,17 @@ TIFFWriteDirectory(TIFF* tif)
*
* Returns 1 in case of success, 0 otherwise.
*/
-int TIFFDeferStrileArrayWriting(TIFF* tif)
+int TIFFDeferStrileArrayWriting(TIFF *tif)
{
static const char module[] = "TIFFDeferStrileArrayWriting";
if (tif->tif_mode == O_RDONLY)
{
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "File opened in read-only mode");
+ TIFFErrorExtR(tif, tif->tif_name, "File opened in read-only mode");
return 0;
}
- if( tif->tif_diroff != 0 )
+ if (tif->tif_diroff != 0)
{
- TIFFErrorExt(tif->tif_clientdata, module,
- "Directory has already been written");
+ TIFFErrorExtR(tif, module, "Directory has already been written");
return 0;
}
@@ -232,359 +286,425 @@ int TIFFDeferStrileArrayWriting(TIFF* tif)
* written again. This will make a partially written TIFF file
* readable before it is successfully completed/closed.
*/
-int
-TIFFCheckpointDirectory(TIFF* tif)
+int TIFFCheckpointDirectory(TIFF *tif)
{
- int rc;
- /* Setup the strips arrays, if they haven't already been. */
- if (tif->tif_dir.td_stripoffset_p == NULL)
- (void) TIFFSetupStrips(tif);
- rc = TIFFWriteDirectorySec(tif,TRUE,FALSE,NULL);
- (void) TIFFSetWriteOffset(tif, TIFFSeekFile(tif, 0, SEEK_END));
- return rc;
+ int rc;
+ /* Setup the strips arrays, if they haven't already been. */
+ if (tif->tif_dir.td_stripoffset_p == NULL)
+ (void)TIFFSetupStrips(tif);
+ rc = TIFFWriteDirectorySec(tif, TRUE, FALSE, NULL);
+ (void)TIFFSetWriteOffset(tif, TIFFSeekFile(tif, 0, SEEK_END));
+ return rc;
}
-int
-TIFFWriteCustomDirectory(TIFF* tif, uint64* pdiroff)
+int TIFFWriteCustomDirectory(TIFF *tif, uint64_t *pdiroff)
{
- return TIFFWriteDirectorySec(tif,FALSE,FALSE,pdiroff);
+ return TIFFWriteDirectorySec(tif, FALSE, FALSE, pdiroff);
}
/*
* Similar to TIFFWriteDirectory(), but if the directory has already
* been written once, it is relocated to the end of the file, in case it
* has changed in size. Note that this will result in the loss of the
- * previously used directory space.
- */
-int
-TIFFRewriteDirectory( TIFF *tif )
-{
- static const char module[] = "TIFFRewriteDirectory";
-
- /* We don't need to do anything special if it hasn't been written. */
- if( tif->tif_diroff == 0 )
- return TIFFWriteDirectory( tif );
-
- /*
- * Find and zero the pointer to this directory, so that TIFFLinkDirectory
- * will cause it to be added after this directories current pre-link.
- */
-
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- if (tif->tif_header.classic.tiff_diroff == tif->tif_diroff)
- {
- tif->tif_header.classic.tiff_diroff = 0;
- tif->tif_diroff = 0;
-
- TIFFSeekFile(tif,4,SEEK_SET);
- if (!WriteOK(tif, &(tif->tif_header.classic.tiff_diroff),4))
- {
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "Error updating TIFF header");
- return (0);
- }
- }
- else
- {
- uint32 nextdir;
- nextdir = tif->tif_header.classic.tiff_diroff;
- while(1) {
- uint16 dircount;
- uint32 nextnextdir;
-
- if (!SeekOK(tif, nextdir) ||
- !ReadOK(tif, &dircount, 2)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error fetching directory count");
- return (0);
- }
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabShort(&dircount);
- (void) TIFFSeekFile(tif,
- nextdir+2+dircount*12, SEEK_SET);
- if (!ReadOK(tif, &nextnextdir, 4)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error fetching directory link");
- return (0);
- }
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong(&nextnextdir);
- if (nextnextdir==tif->tif_diroff)
- {
- uint32 m;
- m=0;
- (void) TIFFSeekFile(tif,
- nextdir+2+dircount*12, SEEK_SET);
- if (!WriteOK(tif, &m, 4)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error writing directory link");
- return (0);
- }
- tif->tif_diroff=0;
- break;
- }
- nextdir=nextnextdir;
- }
- }
- }
- else
- {
- if (tif->tif_header.big.tiff_diroff == tif->tif_diroff)
- {
- tif->tif_header.big.tiff_diroff = 0;
- tif->tif_diroff = 0;
-
- TIFFSeekFile(tif,8,SEEK_SET);
- if (!WriteOK(tif, &(tif->tif_header.big.tiff_diroff),8))
- {
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "Error updating TIFF header");
- return (0);
- }
- }
- else
- {
- uint64 nextdir;
- nextdir = tif->tif_header.big.tiff_diroff;
- while(1) {
- uint64 dircount64;
- uint16 dircount;
- uint64 nextnextdir;
-
- if (!SeekOK(tif, nextdir) ||
- !ReadOK(tif, &dircount64, 8)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error fetching directory count");
- return (0);
- }
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong8(&dircount64);
- if (dircount64>0xFFFF)
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Sanity check on tag count failed, likely corrupt TIFF");
- return (0);
- }
- dircount=(uint16)dircount64;
- (void) TIFFSeekFile(tif,
- nextdir+8+dircount*20, SEEK_SET);
- if (!ReadOK(tif, &nextnextdir, 8)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error fetching directory link");
- return (0);
- }
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong8(&nextnextdir);
- if (nextnextdir==tif->tif_diroff)
- {
- uint64 m;
- m=0;
- (void) TIFFSeekFile(tif,
- nextdir+8+dircount*20, SEEK_SET);
- if (!WriteOK(tif, &m, 8)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error writing directory link");
- return (0);
- }
- tif->tif_diroff=0;
- break;
- }
- nextdir=nextnextdir;
- }
- }
- }
-
- /*
- * Now use TIFFWriteDirectory() normally.
- */
-
- return TIFFWriteDirectory( tif );
-}
+ * previously used directory space.
+ */
+int TIFFRewriteDirectory(TIFF *tif)
+{
+ static const char module[] = "TIFFRewriteDirectory";
-static int
-TIFFWriteDirectorySec(TIFF* tif, int isimage, int imagedone, uint64* pdiroff)
-{
- static const char module[] = "TIFFWriteDirectorySec";
- uint32 ndir;
- TIFFDirEntry* dir;
- uint32 dirsize;
- void* dirmem;
- uint32 m;
- if (tif->tif_mode == O_RDONLY)
- return (1);
-
- _TIFFFillStriles( tif );
-
- /*
- * Clear write state so that subsequent images with
- * different characteristics get the right buffers
- * setup for them.
- */
- if (imagedone)
- {
- if (tif->tif_flags & TIFF_POSTENCODE)
- {
- tif->tif_flags &= ~TIFF_POSTENCODE;
- if (!(*tif->tif_postencode)(tif))
- {
- TIFFErrorExt(tif->tif_clientdata,module,
- "Error post-encoding before directory write");
- return (0);
- }
- }
- (*tif->tif_close)(tif); /* shutdown encoder */
- /*
- * Flush any data that might have been written
- * by the compression close+cleanup routines. But
- * be careful not to write stuff if we didn't add data
- * in the previous steps as the "rawcc" data may well be
- * a previously read tile/strip in mixed read/write mode.
- */
- if (tif->tif_rawcc > 0
- && (tif->tif_flags & TIFF_BEENWRITING) != 0 )
- {
- if( !TIFFFlushData1(tif) )
+ /* We don't need to do anything special if it hasn't been written. */
+ if (tif->tif_diroff == 0)
+ return TIFFWriteDirectory(tif);
+
+ /*
+ * Find and zero the pointer to this directory, so that TIFFLinkDirectory
+ * will cause it to be added after this directories current pre-link.
+ */
+
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ if (tif->tif_header.classic.tiff_diroff == tif->tif_diroff)
+ {
+ tif->tif_header.classic.tiff_diroff = 0;
+ tif->tif_diroff = 0;
+
+ TIFFSeekFile(tif, 4, SEEK_SET);
+ if (!WriteOK(tif, &(tif->tif_header.classic.tiff_diroff), 4))
+ {
+ TIFFErrorExtR(tif, tif->tif_name, "Error updating TIFF header");
+ return (0);
+ }
+ }
+ else if (tif->tif_diroff > 0xFFFFFFFFU)
+ {
+ TIFFErrorExtR(tif, module,
+ "tif->tif_diroff exceeds 32 bit range allowed for "
+ "Classic TIFF");
+ return (0);
+ }
+ else
+ {
+ uint32_t nextdir;
+ nextdir = tif->tif_header.classic.tiff_diroff;
+ while (1)
+ {
+ uint16_t dircount;
+ uint32_t nextnextdir;
+
+ if (!SeekOK(tif, nextdir) || !ReadOK(tif, &dircount, 2))
+ {
+ TIFFErrorExtR(tif, module,
+ "Error fetching directory count");
+ return (0);
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(&dircount);
+ (void)TIFFSeekFile(tif, nextdir + 2 + dircount * 12, SEEK_SET);
+ if (!ReadOK(tif, &nextnextdir, 4))
+ {
+ TIFFErrorExtR(tif, module, "Error fetching directory link");
+ return (0);
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&nextnextdir);
+ if (nextnextdir == tif->tif_diroff)
+ {
+ uint32_t m;
+ m = 0;
+ (void)TIFFSeekFile(tif, nextdir + 2 + dircount * 12,
+ SEEK_SET);
+ if (!WriteOK(tif, &m, 4))
{
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error flushing data before directory write");
- return (0);
+ TIFFErrorExtR(tif, module,
+ "Error writing directory link");
+ return (0);
}
- }
- if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata)
- {
- _TIFFfree(tif->tif_rawdata);
- tif->tif_rawdata = NULL;
- tif->tif_rawcc = 0;
- tif->tif_rawdatasize = 0;
- tif->tif_rawdataoff = 0;
- tif->tif_rawdataloaded = 0;
- }
- tif->tif_flags &= ~(TIFF_BEENWRITING|TIFF_BUFFERSETUP);
- }
- dir=NULL;
- dirmem=NULL;
- dirsize=0;
- while (1)
- {
- ndir=0;
- if (isimage)
- {
- if (TIFFFieldSet(tif,FIELD_IMAGEDIMENSIONS))
- {
- if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_IMAGEWIDTH,tif->tif_dir.td_imagewidth))
- goto bad;
- if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_IMAGELENGTH,tif->tif_dir.td_imagelength))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_TILEDIMENSIONS))
- {
- if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_TILEWIDTH,tif->tif_dir.td_tilewidth))
- goto bad;
- if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_TILELENGTH,tif->tif_dir.td_tilelength))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_RESOLUTION))
- {
- if (!TIFFWriteDirectoryTagRational(tif,&ndir,dir,TIFFTAG_XRESOLUTION,tif->tif_dir.td_xresolution))
- goto bad;
- if (!TIFFWriteDirectoryTagRational(tif,&ndir,dir,TIFFTAG_YRESOLUTION,tif->tif_dir.td_yresolution))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_POSITION))
- {
- if (!TIFFWriteDirectoryTagRational(tif,&ndir,dir,TIFFTAG_XPOSITION,tif->tif_dir.td_xposition))
- goto bad;
- if (!TIFFWriteDirectoryTagRational(tif,&ndir,dir,TIFFTAG_YPOSITION,tif->tif_dir.td_yposition))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_SUBFILETYPE))
- {
- if (!TIFFWriteDirectoryTagLong(tif,&ndir,dir,TIFFTAG_SUBFILETYPE,tif->tif_dir.td_subfiletype))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_BITSPERSAMPLE))
- {
- if (!TIFFWriteDirectoryTagShortPerSample(tif,&ndir,dir,TIFFTAG_BITSPERSAMPLE,tif->tif_dir.td_bitspersample))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_COMPRESSION))
- {
- if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_COMPRESSION,tif->tif_dir.td_compression))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_PHOTOMETRIC))
- {
- if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_PHOTOMETRIC,tif->tif_dir.td_photometric))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_THRESHHOLDING))
- {
- if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_THRESHHOLDING,tif->tif_dir.td_threshholding))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_FILLORDER))
- {
- if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_FILLORDER,tif->tif_dir.td_fillorder))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_ORIENTATION))
- {
- if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_ORIENTATION,tif->tif_dir.td_orientation))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_SAMPLESPERPIXEL))
- {
- if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_SAMPLESPERPIXEL,tif->tif_dir.td_samplesperpixel))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_ROWSPERSTRIP))
- {
- if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_ROWSPERSTRIP,tif->tif_dir.td_rowsperstrip))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_MINSAMPLEVALUE))
- {
- if (!TIFFWriteDirectoryTagShortPerSample(tif,&ndir,dir,TIFFTAG_MINSAMPLEVALUE,tif->tif_dir.td_minsamplevalue))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_MAXSAMPLEVALUE))
- {
- if (!TIFFWriteDirectoryTagShortPerSample(tif,&ndir,dir,TIFFTAG_MAXSAMPLEVALUE,tif->tif_dir.td_maxsamplevalue))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_PLANARCONFIG))
- {
- if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_PLANARCONFIG,tif->tif_dir.td_planarconfig))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_RESOLUTIONUNIT))
- {
- if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_RESOLUTIONUNIT,tif->tif_dir.td_resolutionunit))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_PAGENUMBER))
- {
- if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,TIFFTAG_PAGENUMBER,2,&tif->tif_dir.td_pagenumber[0]))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_STRIPBYTECOUNTS))
- {
- if (!isTiled(tif))
- {
- if (!TIFFWriteDirectoryTagLongLong8Array(tif,&ndir,dir,TIFFTAG_STRIPBYTECOUNTS,tif->tif_dir.td_nstrips,tif->tif_dir.td_stripbytecount_p))
- goto bad;
- }
- else
- {
- if (!TIFFWriteDirectoryTagLongLong8Array(tif,&ndir,dir,TIFFTAG_TILEBYTECOUNTS,tif->tif_dir.td_nstrips,tif->tif_dir.td_stripbytecount_p))
- goto bad;
- }
- }
- if (TIFFFieldSet(tif,FIELD_STRIPOFFSETS))
- {
- if (!isTiled(tif))
- {
+ tif->tif_diroff = 0;
+ /* Force a full-traversal to reach the zeroed pointer */
+ tif->tif_lastdiroff = 0;
+ break;
+ }
+ nextdir = nextnextdir;
+ }
+ }
+ }
+ else
+ {
+ if (tif->tif_header.big.tiff_diroff == tif->tif_diroff)
+ {
+ tif->tif_header.big.tiff_diroff = 0;
+ tif->tif_diroff = 0;
+
+ TIFFSeekFile(tif, 8, SEEK_SET);
+ if (!WriteOK(tif, &(tif->tif_header.big.tiff_diroff), 8))
+ {
+ TIFFErrorExtR(tif, tif->tif_name, "Error updating TIFF header");
+ return (0);
+ }
+ }
+ else
+ {
+ uint64_t nextdir;
+ nextdir = tif->tif_header.big.tiff_diroff;
+ while (1)
+ {
+ uint64_t dircount64;
+ uint16_t dircount;
+ uint64_t nextnextdir;
+
+ if (!SeekOK(tif, nextdir) || !ReadOK(tif, &dircount64, 8))
+ {
+ TIFFErrorExtR(tif, module,
+ "Error fetching directory count");
+ return (0);
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(&dircount64);
+ if (dircount64 > 0xFFFF)
+ {
+ TIFFErrorExtR(tif, module,
+ "Sanity check on tag count failed, likely "
+ "corrupt TIFF");
+ return (0);
+ }
+ dircount = (uint16_t)dircount64;
+ (void)TIFFSeekFile(tif, nextdir + 8 + dircount * 20, SEEK_SET);
+ if (!ReadOK(tif, &nextnextdir, 8))
+ {
+ TIFFErrorExtR(tif, module, "Error fetching directory link");
+ return (0);
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(&nextnextdir);
+ if (nextnextdir == tif->tif_diroff)
+ {
+ uint64_t m;
+ m = 0;
+ (void)TIFFSeekFile(tif, nextdir + 8 + dircount * 20,
+ SEEK_SET);
+ if (!WriteOK(tif, &m, 8))
+ {
+ TIFFErrorExtR(tif, module,
+ "Error writing directory link");
+ return (0);
+ }
+ tif->tif_diroff = 0;
+ /* Force a full-traversal to reach the zeroed pointer */
+ tif->tif_lastdiroff = 0;
+ break;
+ }
+ nextdir = nextnextdir;
+ }
+ }
+ }
+
+ /*
+ * Now use TIFFWriteDirectory() normally.
+ */
+
+ return TIFFWriteDirectory(tif);
+}
+
+static int TIFFWriteDirectorySec(TIFF *tif, int isimage, int imagedone,
+ uint64_t *pdiroff)
+{
+ static const char module[] = "TIFFWriteDirectorySec";
+ uint32_t ndir;
+ TIFFDirEntry *dir;
+ uint32_t dirsize;
+ void *dirmem;
+ uint32_t m;
+ if (tif->tif_mode == O_RDONLY)
+ return (1);
+
+ _TIFFFillStriles(tif);
+
+ /*
+ * Clear write state so that subsequent images with
+ * different characteristics get the right buffers
+ * setup for them.
+ */
+ if (imagedone)
+ {
+ if (tif->tif_flags & TIFF_POSTENCODE)
+ {
+ tif->tif_flags &= ~TIFF_POSTENCODE;
+ if (!(*tif->tif_postencode)(tif))
+ {
+ TIFFErrorExtR(tif, module,
+ "Error post-encoding before directory write");
+ return (0);
+ }
+ }
+ (*tif->tif_close)(tif); /* shutdown encoder */
+ /*
+ * Flush any data that might have been written
+ * by the compression close+cleanup routines. But
+ * be careful not to write stuff if we didn't add data
+ * in the previous steps as the "rawcc" data may well be
+ * a previously read tile/strip in mixed read/write mode.
+ */
+ if (tif->tif_rawcc > 0 && (tif->tif_flags & TIFF_BEENWRITING) != 0)
+ {
+ if (!TIFFFlushData1(tif))
+ {
+ TIFFErrorExtR(tif, module,
+ "Error flushing data before directory write");
+ return (0);
+ }
+ }
+ if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata)
+ {
+ _TIFFfreeExt(tif, tif->tif_rawdata);
+ tif->tif_rawdata = NULL;
+ tif->tif_rawcc = 0;
+ tif->tif_rawdatasize = 0;
+ tif->tif_rawdataoff = 0;
+ tif->tif_rawdataloaded = 0;
+ }
+ tif->tif_flags &= ~(TIFF_BEENWRITING | TIFF_BUFFERSETUP);
+ }
+
+ if (TIFFFieldSet(tif, FIELD_COMPRESSION) &&
+ (tif->tif_dir.td_compression == COMPRESSION_DEFLATE))
+ {
+ TIFFWarningExtR(tif, module,
+ "Creating TIFF with legacy Deflate codec identifier, "
+ "COMPRESSION_ADOBE_DEFLATE is more widely supported");
+ }
+ dir = NULL;
+ dirmem = NULL;
+ dirsize = 0;
+ while (1)
+ {
+ ndir = 0;
+ if (isimage)
+ {
+ if (TIFFFieldSet(tif, FIELD_IMAGEDIMENSIONS))
+ {
+ if (!TIFFWriteDirectoryTagShortLong(tif, &ndir, dir,
+ TIFFTAG_IMAGEWIDTH,
+ tif->tif_dir.td_imagewidth))
+ goto bad;
+ if (!TIFFWriteDirectoryTagShortLong(
+ tif, &ndir, dir, TIFFTAG_IMAGELENGTH,
+ tif->tif_dir.td_imagelength))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_TILEDIMENSIONS))
+ {
+ if (!TIFFWriteDirectoryTagShortLong(tif, &ndir, dir,
+ TIFFTAG_TILEWIDTH,
+ tif->tif_dir.td_tilewidth))
+ goto bad;
+ if (!TIFFWriteDirectoryTagShortLong(tif, &ndir, dir,
+ TIFFTAG_TILELENGTH,
+ tif->tif_dir.td_tilelength))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_RESOLUTION))
+ {
+ if (!TIFFWriteDirectoryTagRational(tif, &ndir, dir,
+ TIFFTAG_XRESOLUTION,
+ tif->tif_dir.td_xresolution))
+ goto bad;
+ if (!TIFFWriteDirectoryTagRational(tif, &ndir, dir,
+ TIFFTAG_YRESOLUTION,
+ tif->tif_dir.td_yresolution))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_POSITION))
+ {
+ if (!TIFFWriteDirectoryTagRational(tif, &ndir, dir,
+ TIFFTAG_XPOSITION,
+ tif->tif_dir.td_xposition))
+ goto bad;
+ if (!TIFFWriteDirectoryTagRational(tif, &ndir, dir,
+ TIFFTAG_YPOSITION,
+ tif->tif_dir.td_yposition))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_SUBFILETYPE))
+ {
+ if (!TIFFWriteDirectoryTagLong(tif, &ndir, dir,
+ TIFFTAG_SUBFILETYPE,
+ tif->tif_dir.td_subfiletype))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_BITSPERSAMPLE))
+ {
+ if (!TIFFWriteDirectoryTagShortPerSample(
+ tif, &ndir, dir, TIFFTAG_BITSPERSAMPLE,
+ tif->tif_dir.td_bitspersample))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_COMPRESSION))
+ {
+ if (!TIFFWriteDirectoryTagShort(tif, &ndir, dir,
+ TIFFTAG_COMPRESSION,
+ tif->tif_dir.td_compression))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_PHOTOMETRIC))
+ {
+ if (!TIFFWriteDirectoryTagShort(tif, &ndir, dir,
+ TIFFTAG_PHOTOMETRIC,
+ tif->tif_dir.td_photometric))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_THRESHHOLDING))
+ {
+ if (!TIFFWriteDirectoryTagShort(tif, &ndir, dir,
+ TIFFTAG_THRESHHOLDING,
+ tif->tif_dir.td_threshholding))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_FILLORDER))
+ {
+ if (!TIFFWriteDirectoryTagShort(tif, &ndir, dir,
+ TIFFTAG_FILLORDER,
+ tif->tif_dir.td_fillorder))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_ORIENTATION))
+ {
+ if (!TIFFWriteDirectoryTagShort(tif, &ndir, dir,
+ TIFFTAG_ORIENTATION,
+ tif->tif_dir.td_orientation))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_SAMPLESPERPIXEL))
+ {
+ if (!TIFFWriteDirectoryTagShort(
+ tif, &ndir, dir, TIFFTAG_SAMPLESPERPIXEL,
+ tif->tif_dir.td_samplesperpixel))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_ROWSPERSTRIP))
+ {
+ if (!TIFFWriteDirectoryTagShortLong(
+ tif, &ndir, dir, TIFFTAG_ROWSPERSTRIP,
+ tif->tif_dir.td_rowsperstrip))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_MINSAMPLEVALUE))
+ {
+ if (!TIFFWriteDirectoryTagShortPerSample(
+ tif, &ndir, dir, TIFFTAG_MINSAMPLEVALUE,
+ tif->tif_dir.td_minsamplevalue))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_MAXSAMPLEVALUE))
+ {
+ if (!TIFFWriteDirectoryTagShortPerSample(
+ tif, &ndir, dir, TIFFTAG_MAXSAMPLEVALUE,
+ tif->tif_dir.td_maxsamplevalue))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_PLANARCONFIG))
+ {
+ if (!TIFFWriteDirectoryTagShort(tif, &ndir, dir,
+ TIFFTAG_PLANARCONFIG,
+ tif->tif_dir.td_planarconfig))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_RESOLUTIONUNIT))
+ {
+ if (!TIFFWriteDirectoryTagShort(tif, &ndir, dir,
+ TIFFTAG_RESOLUTIONUNIT,
+ tif->tif_dir.td_resolutionunit))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_PAGENUMBER))
+ {
+ if (!TIFFWriteDirectoryTagShortArray(
+ tif, &ndir, dir, TIFFTAG_PAGENUMBER, 2,
+ &tif->tif_dir.td_pagenumber[0]))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_STRIPBYTECOUNTS))
+ {
+ if (!isTiled(tif))
+ {
+ if (!TIFFWriteDirectoryTagLongLong8Array(
+ tif, &ndir, dir, TIFFTAG_STRIPBYTECOUNTS,
+ tif->tif_dir.td_nstrips,
+ tif->tif_dir.td_stripbytecount_p))
+ goto bad;
+ }
+ else
+ {
+ if (!TIFFWriteDirectoryTagLongLong8Array(
+ tif, &ndir, dir, TIFFTAG_TILEBYTECOUNTS,
+ tif->tif_dir.td_nstrips,
+ tif->tif_dir.td_stripbytecount_p))
+ goto bad;
+ }
+ }
+ if (TIFFFieldSet(tif, FIELD_STRIPOFFSETS))
+ {
+ if (!isTiled(tif))
+ {
/* td_stripoffset_p might be NULL in an odd OJPEG case. See
* tif_dirread.c around line 3634.
* XXX: OJPEG hack.
@@ -595,1121 +715,1103 @@ TIFFWriteDirectorySec(TIFF* tif, int isimage, int imagedone, uint64* pdiroff)
* JpegInterchangeFormat stream.
* We can get here when using tiffset on such a file.
* See http://bugzilla.maptools.org/show_bug.cgi?id=2500
- */
+ */
if (tif->tif_dir.td_stripoffset_p != NULL &&
- !TIFFWriteDirectoryTagLongLong8Array(tif,&ndir,dir,TIFFTAG_STRIPOFFSETS,tif->tif_dir.td_nstrips,tif->tif_dir.td_stripoffset_p))
+ !TIFFWriteDirectoryTagLongLong8Array(
+ tif, &ndir, dir, TIFFTAG_STRIPOFFSETS,
+ tif->tif_dir.td_nstrips,
+ tif->tif_dir.td_stripoffset_p))
+ goto bad;
+ }
+ else
+ {
+ if (!TIFFWriteDirectoryTagLongLong8Array(
+ tif, &ndir, dir, TIFFTAG_TILEOFFSETS,
+ tif->tif_dir.td_nstrips,
+ tif->tif_dir.td_stripoffset_p))
+ goto bad;
+ }
+ }
+ if (TIFFFieldSet(tif, FIELD_COLORMAP))
+ {
+ if (!TIFFWriteDirectoryTagColormap(tif, &ndir, dir))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_EXTRASAMPLES))
+ {
+ if (tif->tif_dir.td_extrasamples)
+ {
+ uint16_t na;
+ uint16_t *nb;
+ TIFFGetFieldDefaulted(tif, TIFFTAG_EXTRASAMPLES, &na, &nb);
+ if (!TIFFWriteDirectoryTagShortArray(
+ tif, &ndir, dir, TIFFTAG_EXTRASAMPLES, na, nb))
goto bad;
- }
- else
- {
- if (!TIFFWriteDirectoryTagLongLong8Array(tif,&ndir,dir,TIFFTAG_TILEOFFSETS,tif->tif_dir.td_nstrips,tif->tif_dir.td_stripoffset_p))
- goto bad;
- }
- }
- if (TIFFFieldSet(tif,FIELD_COLORMAP))
- {
- if (!TIFFWriteDirectoryTagColormap(tif,&ndir,dir))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_EXTRASAMPLES))
- {
- if (tif->tif_dir.td_extrasamples)
- {
- uint16 na;
- uint16* nb;
- TIFFGetFieldDefaulted(tif,TIFFTAG_EXTRASAMPLES,&na,&nb);
- if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,TIFFTAG_EXTRASAMPLES,na,nb))
- goto bad;
- }
- }
- if (TIFFFieldSet(tif,FIELD_SAMPLEFORMAT))
- {
- if (!TIFFWriteDirectoryTagShortPerSample(tif,&ndir,dir,TIFFTAG_SAMPLEFORMAT,tif->tif_dir.td_sampleformat))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_SMINSAMPLEVALUE))
- {
- if (!TIFFWriteDirectoryTagSampleformatArray(tif,&ndir,dir,TIFFTAG_SMINSAMPLEVALUE,tif->tif_dir.td_samplesperpixel,tif->tif_dir.td_sminsamplevalue))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_SMAXSAMPLEVALUE))
- {
- if (!TIFFWriteDirectoryTagSampleformatArray(tif,&ndir,dir,TIFFTAG_SMAXSAMPLEVALUE,tif->tif_dir.td_samplesperpixel,tif->tif_dir.td_smaxsamplevalue))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_IMAGEDEPTH))
- {
- if (!TIFFWriteDirectoryTagLong(tif,&ndir,dir,TIFFTAG_IMAGEDEPTH,tif->tif_dir.td_imagedepth))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_TILEDEPTH))
- {
- if (!TIFFWriteDirectoryTagLong(tif,&ndir,dir,TIFFTAG_TILEDEPTH,tif->tif_dir.td_tiledepth))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_HALFTONEHINTS))
- {
- if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,TIFFTAG_HALFTONEHINTS,2,&tif->tif_dir.td_halftonehints[0]))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_YCBCRSUBSAMPLING))
- {
- if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,TIFFTAG_YCBCRSUBSAMPLING,2,&tif->tif_dir.td_ycbcrsubsampling[0]))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_YCBCRPOSITIONING))
- {
- if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_YCBCRPOSITIONING,tif->tif_dir.td_ycbcrpositioning))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_REFBLACKWHITE))
- {
- if (!TIFFWriteDirectoryTagRationalArray(tif,&ndir,dir,TIFFTAG_REFERENCEBLACKWHITE,6,tif->tif_dir.td_refblackwhite))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_TRANSFERFUNCTION))
- {
- if (!TIFFWriteDirectoryTagTransferfunction(tif,&ndir,dir))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_INKNAMES))
- {
- if (!TIFFWriteDirectoryTagAscii(tif,&ndir,dir,TIFFTAG_INKNAMES,tif->tif_dir.td_inknameslen,tif->tif_dir.td_inknames))
- goto bad;
- }
- if (TIFFFieldSet(tif,FIELD_SUBIFD))
- {
- if (!TIFFWriteDirectoryTagSubifd(tif,&ndir,dir))
- goto bad;
- }
- {
- uint32 n;
- for (n=0; n<tif->tif_nfields; n++) {
- const TIFFField* o;
- o = tif->tif_fields[n];
- if ((o->field_bit>=FIELD_CODEC)&&(TIFFFieldSet(tif,o->field_bit)))
- {
- switch (o->get_field_type)
- {
- case TIFF_SETGET_ASCII:
- {
- uint32 pa;
- char* pb;
- assert(o->field_type==TIFF_ASCII);
- assert(o->field_readcount==TIFF_VARIABLE);
- assert(o->field_passcount==0);
- TIFFGetField(tif,o->field_tag,&pb);
- pa=(uint32)(strlen(pb));
- if (!TIFFWriteDirectoryTagAscii(tif,&ndir,dir,(uint16)o->field_tag,pa,pb))
- goto bad;
- }
- break;
- case TIFF_SETGET_UINT16:
- {
- uint16 p;
- assert(o->field_type==TIFF_SHORT);
- assert(o->field_readcount==1);
- assert(o->field_passcount==0);
- TIFFGetField(tif,o->field_tag,&p);
- if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,(uint16)o->field_tag,p))
- goto bad;
- }
- break;
- case TIFF_SETGET_UINT32:
- {
- uint32 p;
- assert(o->field_type==TIFF_LONG);
- assert(o->field_readcount==1);
- assert(o->field_passcount==0);
- TIFFGetField(tif,o->field_tag,&p);
- if (!TIFFWriteDirectoryTagLong(tif,&ndir,dir,(uint16)o->field_tag,p))
- goto bad;
- }
- break;
- case TIFF_SETGET_C32_UINT8:
- {
- uint32 pa;
- void* pb;
- assert(o->field_type==TIFF_UNDEFINED);
- assert(o->field_readcount==TIFF_VARIABLE2);
- assert(o->field_passcount==1);
- TIFFGetField(tif,o->field_tag,&pa,&pb);
- if (!TIFFWriteDirectoryTagUndefinedArray(tif,&ndir,dir,(uint16)o->field_tag,pa,pb))
- goto bad;
- }
- break;
- default:
- TIFFErrorExt(tif->tif_clientdata,module,
- "Cannot write tag %d (%s)",
- TIFFFieldTag(o),
- o->field_name ? o->field_name : "unknown");
- goto bad;
- }
- }
- }
- }
- }
- for (m=0; m<(uint32)(tif->tif_dir.td_customValueCount); m++)
- {
- uint16 tag = (uint16)tif->tif_dir.td_customValues[m].info->field_tag;
- uint32 count = tif->tif_dir.td_customValues[m].count;
- switch (tif->tif_dir.td_customValues[m].info->field_type)
- {
- case TIFF_ASCII:
- if (!TIFFWriteDirectoryTagAscii(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_UNDEFINED:
- if (!TIFFWriteDirectoryTagUndefinedArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_BYTE:
- if (!TIFFWriteDirectoryTagByteArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_SBYTE:
- if (!TIFFWriteDirectoryTagSbyteArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_SHORT:
- if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_SSHORT:
- if (!TIFFWriteDirectoryTagSshortArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_LONG:
- if (!TIFFWriteDirectoryTagLongArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_SLONG:
- if (!TIFFWriteDirectoryTagSlongArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_LONG8:
- if (!TIFFWriteDirectoryTagLong8Array(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_SLONG8:
- if (!TIFFWriteDirectoryTagSlong8Array(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_RATIONAL:
- if (!TIFFWriteDirectoryTagRationalArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_SRATIONAL:
- if (!TIFFWriteDirectoryTagSrationalArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_FLOAT:
- if (!TIFFWriteDirectoryTagFloatArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_DOUBLE:
- if (!TIFFWriteDirectoryTagDoubleArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_IFD:
- if (!TIFFWriteDirectoryTagIfdArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- case TIFF_IFD8:
- if (!TIFFWriteDirectoryTagIfdIfd8Array(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
- goto bad;
- break;
- default:
- assert(0); /* we should never get here */
- break;
- }
- }
- if (dir!=NULL)
- break;
- dir=_TIFFmalloc(ndir*sizeof(TIFFDirEntry));
- if (dir==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- goto bad;
- }
- if (isimage)
- {
- if ((tif->tif_diroff==0)&&(!TIFFLinkDirectory(tif)))
- goto bad;
- }
- else
- tif->tif_diroff=(TIFFSeekFile(tif,0,SEEK_END)+1)&(~((toff_t)1));
- if (pdiroff!=NULL)
- *pdiroff=tif->tif_diroff;
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- dirsize=2+ndir*12+4;
- else
- dirsize=8+ndir*20+8;
- tif->tif_dataoff=tif->tif_diroff+dirsize;
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- tif->tif_dataoff=(uint32)tif->tif_dataoff;
- if ((tif->tif_dataoff<tif->tif_diroff)||(tif->tif_dataoff<(uint64)dirsize))
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Maximum TIFF file size exceeded");
- goto bad;
- }
- if (tif->tif_dataoff&1)
- tif->tif_dataoff++;
- if (isimage)
- tif->tif_curdir++;
- }
- if (isimage)
- {
- if (TIFFFieldSet(tif,FIELD_SUBIFD)&&(tif->tif_subifdoff==0))
- {
- uint32 na;
- TIFFDirEntry* nb;
- for (na=0, nb=dir; ; na++, nb++)
- {
- if( na == ndir )
- {
- TIFFErrorExt(tif->tif_clientdata,module,
- "Cannot find SubIFD tag");
+ }
+ }
+ if (TIFFFieldSet(tif, FIELD_SAMPLEFORMAT))
+ {
+ if (!TIFFWriteDirectoryTagShortPerSample(
+ tif, &ndir, dir, TIFFTAG_SAMPLEFORMAT,
+ tif->tif_dir.td_sampleformat))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_SMINSAMPLEVALUE))
+ {
+ if (!TIFFWriteDirectoryTagSampleformatArray(
+ tif, &ndir, dir, TIFFTAG_SMINSAMPLEVALUE,
+ tif->tif_dir.td_samplesperpixel,
+ tif->tif_dir.td_sminsamplevalue))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_SMAXSAMPLEVALUE))
+ {
+ if (!TIFFWriteDirectoryTagSampleformatArray(
+ tif, &ndir, dir, TIFFTAG_SMAXSAMPLEVALUE,
+ tif->tif_dir.td_samplesperpixel,
+ tif->tif_dir.td_smaxsamplevalue))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_IMAGEDEPTH))
+ {
+ if (!TIFFWriteDirectoryTagLong(tif, &ndir, dir,
+ TIFFTAG_IMAGEDEPTH,
+ tif->tif_dir.td_imagedepth))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_TILEDEPTH))
+ {
+ if (!TIFFWriteDirectoryTagLong(tif, &ndir, dir,
+ TIFFTAG_TILEDEPTH,
+ tif->tif_dir.td_tiledepth))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_HALFTONEHINTS))
+ {
+ if (!TIFFWriteDirectoryTagShortArray(
+ tif, &ndir, dir, TIFFTAG_HALFTONEHINTS, 2,
+ &tif->tif_dir.td_halftonehints[0]))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_YCBCRSUBSAMPLING))
+ {
+ if (!TIFFWriteDirectoryTagShortArray(
+ tif, &ndir, dir, TIFFTAG_YCBCRSUBSAMPLING, 2,
+ &tif->tif_dir.td_ycbcrsubsampling[0]))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_YCBCRPOSITIONING))
+ {
+ if (!TIFFWriteDirectoryTagShort(
+ tif, &ndir, dir, TIFFTAG_YCBCRPOSITIONING,
+ tif->tif_dir.td_ycbcrpositioning))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_REFBLACKWHITE))
+ {
+ if (!TIFFWriteDirectoryTagRationalArray(
+ tif, &ndir, dir, TIFFTAG_REFERENCEBLACKWHITE, 6,
+ tif->tif_dir.td_refblackwhite))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_TRANSFERFUNCTION))
+ {
+ if (!TIFFWriteDirectoryTagTransferfunction(tif, &ndir, dir))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_INKNAMES))
+ {
+ if (!TIFFWriteDirectoryTagAscii(
+ tif, &ndir, dir, TIFFTAG_INKNAMES,
+ tif->tif_dir.td_inknameslen, tif->tif_dir.td_inknames))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_NUMBEROFINKS))
+ {
+ if (!TIFFWriteDirectoryTagShort(tif, &ndir, dir,
+ TIFFTAG_NUMBEROFINKS,
+ tif->tif_dir.td_numberofinks))
+ goto bad;
+ }
+ if (TIFFFieldSet(tif, FIELD_SUBIFD))
+ {
+ if (!TIFFWriteDirectoryTagSubifd(tif, &ndir, dir))
+ goto bad;
+ }
+ {
+ uint32_t n;
+ for (n = 0; n < tif->tif_nfields; n++)
+ {
+ const TIFFField *o;
+ o = tif->tif_fields[n];
+ if ((o->field_bit >= FIELD_CODEC) &&
+ (TIFFFieldSet(tif, o->field_bit)))
+ {
+ switch (o->get_field_type)
+ {
+ case TIFF_SETGET_ASCII:
+ {
+ uint32_t pa;
+ char *pb;
+ assert(o->field_type == TIFF_ASCII);
+ assert(o->field_readcount == TIFF_VARIABLE);
+ assert(o->field_passcount == 0);
+ TIFFGetField(tif, o->field_tag, &pb);
+ pa = (uint32_t)(strlen(pb));
+ if (!TIFFWriteDirectoryTagAscii(
+ tif, &ndir, dir, (uint16_t)o->field_tag,
+ pa, pb))
+ goto bad;
+ }
+ break;
+ case TIFF_SETGET_UINT16:
+ {
+ uint16_t p;
+ assert(o->field_type == TIFF_SHORT);
+ assert(o->field_readcount == 1);
+ assert(o->field_passcount == 0);
+ TIFFGetField(tif, o->field_tag, &p);
+ if (!TIFFWriteDirectoryTagShort(
+ tif, &ndir, dir, (uint16_t)o->field_tag,
+ p))
goto bad;
- }
- if (nb->tdir_tag==TIFFTAG_SUBIFD)
- break;
- }
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- tif->tif_subifdoff=tif->tif_diroff+2+na*12+8;
- else
- tif->tif_subifdoff=tif->tif_diroff+8+na*20+12;
- }
- }
- dirmem=_TIFFmalloc(dirsize);
- if (dirmem==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- goto bad;
- }
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- uint8* n;
- uint32 nTmp;
- TIFFDirEntry* o;
- n=dirmem;
- *(uint16*)n=(uint16)ndir;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort((uint16*)n);
- n+=2;
- o=dir;
- for (m=0; m<ndir; m++)
- {
- *(uint16*)n=o->tdir_tag;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort((uint16*)n);
- n+=2;
- *(uint16*)n=o->tdir_type;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort((uint16*)n);
- n+=2;
- nTmp = (uint32)o->tdir_count;
- _TIFFmemcpy(n,&nTmp,4);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong((uint32*)n);
- n+=4;
- /* This is correct. The data has been */
- /* swabbed previously in TIFFWriteDirectoryTagData */
- _TIFFmemcpy(n,&o->tdir_offset,4);
- n+=4;
- o++;
- }
- nTmp = (uint32)tif->tif_nextdiroff;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(&nTmp);
- _TIFFmemcpy(n,&nTmp,4);
- }
- else
- {
- uint8* n;
- TIFFDirEntry* o;
- n=dirmem;
- *(uint64*)n=ndir;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8((uint64*)n);
- n+=8;
- o=dir;
- for (m=0; m<ndir; m++)
- {
- *(uint16*)n=o->tdir_tag;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort((uint16*)n);
- n+=2;
- *(uint16*)n=o->tdir_type;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort((uint16*)n);
- n+=2;
- _TIFFmemcpy(n,&o->tdir_count,8);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8((uint64*)n);
- n+=8;
- _TIFFmemcpy(n,&o->tdir_offset,8);
- n+=8;
- o++;
- }
- _TIFFmemcpy(n,&tif->tif_nextdiroff,8);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8((uint64*)n);
- }
- _TIFFfree(dir);
- dir=NULL;
- if (!SeekOK(tif,tif->tif_diroff))
- {
- TIFFErrorExt(tif->tif_clientdata,module,"IO error writing directory");
- goto bad;
- }
- if (!WriteOK(tif,dirmem,(tmsize_t)dirsize))
- {
- TIFFErrorExt(tif->tif_clientdata,module,"IO error writing directory");
- goto bad;
- }
- _TIFFfree(dirmem);
- if (imagedone)
- {
- TIFFFreeDirectory(tif);
- tif->tif_flags &= ~TIFF_DIRTYDIRECT;
- tif->tif_flags &= ~TIFF_DIRTYSTRIP;
- (*tif->tif_cleanup)(tif);
- /*
- * Reset directory-related state for subsequent
- * directories.
- */
- TIFFCreateDirectory(tif);
- }
- return(1);
+ }
+ break;
+ case TIFF_SETGET_UINT32:
+ {
+ uint32_t p;
+ assert(o->field_type == TIFF_LONG);
+ assert(o->field_readcount == 1);
+ assert(o->field_passcount == 0);
+ TIFFGetField(tif, o->field_tag, &p);
+ if (!TIFFWriteDirectoryTagLong(
+ tif, &ndir, dir, (uint16_t)o->field_tag,
+ p))
+ goto bad;
+ }
+ break;
+ case TIFF_SETGET_C32_UINT8:
+ {
+ uint32_t pa;
+ void *pb;
+ assert(o->field_type == TIFF_UNDEFINED);
+ assert(o->field_readcount == TIFF_VARIABLE2);
+ assert(o->field_passcount == 1);
+ TIFFGetField(tif, o->field_tag, &pa, &pb);
+ if (!TIFFWriteDirectoryTagUndefinedArray(
+ tif, &ndir, dir, (uint16_t)o->field_tag,
+ pa, pb))
+ goto bad;
+ }
+ break;
+ default:
+ TIFFErrorExtR(
+ tif, module,
+ "Cannot write tag %" PRIu32 " (%s)",
+ TIFFFieldTag(o),
+ o->field_name ? o->field_name : "unknown");
+ goto bad;
+ }
+ }
+ }
+ }
+ }
+ for (m = 0; m < (uint32_t)(tif->tif_dir.td_customValueCount); m++)
+ {
+ uint16_t tag =
+ (uint16_t)tif->tif_dir.td_customValues[m].info->field_tag;
+ uint32_t count = tif->tif_dir.td_customValues[m].count;
+ switch (tif->tif_dir.td_customValues[m].info->field_type)
+ {
+ case TIFF_ASCII:
+ if (!TIFFWriteDirectoryTagAscii(
+ tif, &ndir, dir, tag, count,
+ tif->tif_dir.td_customValues[m].value))
+ goto bad;
+ break;
+ case TIFF_UNDEFINED:
+ if (!TIFFWriteDirectoryTagUndefinedArray(
+ tif, &ndir, dir, tag, count,
+ tif->tif_dir.td_customValues[m].value))
+ goto bad;
+ break;
+ case TIFF_BYTE:
+ if (!TIFFWriteDirectoryTagByteArray(
+ tif, &ndir, dir, tag, count,
+ tif->tif_dir.td_customValues[m].value))
+ goto bad;
+ break;
+ case TIFF_SBYTE:
+ if (!TIFFWriteDirectoryTagSbyteArray(
+ tif, &ndir, dir, tag, count,
+ tif->tif_dir.td_customValues[m].value))
+ goto bad;
+ break;
+ case TIFF_SHORT:
+ if (!TIFFWriteDirectoryTagShortArray(
+ tif, &ndir, dir, tag, count,
+ tif->tif_dir.td_customValues[m].value))
+ goto bad;
+ break;
+ case TIFF_SSHORT:
+ if (!TIFFWriteDirectoryTagSshortArray(
+ tif, &ndir, dir, tag, count,
+ tif->tif_dir.td_customValues[m].value))
+ goto bad;
+ break;
+ case TIFF_LONG:
+ if (!TIFFWriteDirectoryTagLongArray(
+ tif, &ndir, dir, tag, count,
+ tif->tif_dir.td_customValues[m].value))
+ goto bad;
+ break;
+ case TIFF_SLONG:
+ if (!TIFFWriteDirectoryTagSlongArray(
+ tif, &ndir, dir, tag, count,
+ tif->tif_dir.td_customValues[m].value))
+ goto bad;
+ break;
+ case TIFF_LONG8:
+ if (!TIFFWriteDirectoryTagLong8Array(
+ tif, &ndir, dir, tag, count,
+ tif->tif_dir.td_customValues[m].value))
+ goto bad;
+ break;
+ case TIFF_SLONG8:
+ if (!TIFFWriteDirectoryTagSlong8Array(
+ tif, &ndir, dir, tag, count,
+ tif->tif_dir.td_customValues[m].value))
+ goto bad;
+ break;
+ case TIFF_RATIONAL:
+ {
+ /*-- Rational2Double: For Rationals evaluate
+ * "set_field_type" to determine internal storage size. */
+ int tv_size;
+ tv_size = TIFFFieldSetGetSize(
+ tif->tif_dir.td_customValues[m].info);
+ if (tv_size == 8)
+ {
+ if (!TIFFWriteDirectoryTagRationalDoubleArray(
+ tif, &ndir, dir, tag, count,
+ tif->tif_dir.td_customValues[m].value))
+ goto bad;
+ }
+ else
+ {
+ /*-- default should be tv_size == 4 */
+ if (!TIFFWriteDirectoryTagRationalArray(
+ tif, &ndir, dir, tag, count,
+ tif->tif_dir.td_customValues[m].value))
+ goto bad;
+ /*-- ToDo: After Testing, this should be removed and
+ * tv_size==4 should be set as default. */
+ if (tv_size != 4)
+ {
+ TIFFErrorExtR(tif,
+ "TIFFLib: _TIFFWriteDirectorySec()",
+ "Rational2Double: .set_field_type is "
+ "not 4 but %d",
+ tv_size);
+ }
+ }
+ }
+ break;
+ case TIFF_SRATIONAL:
+ {
+ /*-- Rational2Double: For Rationals evaluate
+ * "set_field_type" to determine internal storage size. */
+ int tv_size;
+ tv_size = TIFFFieldSetGetSize(
+ tif->tif_dir.td_customValues[m].info);
+ if (tv_size == 8)
+ {
+ if (!TIFFWriteDirectoryTagSrationalDoubleArray(
+ tif, &ndir, dir, tag, count,
+ tif->tif_dir.td_customValues[m].value))
+ goto bad;
+ }
+ else
+ {
+ /*-- default should be tv_size == 4 */
+ if (!TIFFWriteDirectoryTagSrationalArray(
+ tif, &ndir, dir, tag, count,
+ tif->tif_dir.td_customValues[m].value))
+ goto bad;
+ /*-- ToDo: After Testing, this should be removed and
+ * tv_size==4 should be set as default. */
+ if (tv_size != 4)
+ {
+ TIFFErrorExtR(tif,
+ "TIFFLib: _TIFFWriteDirectorySec()",
+ "Rational2Double: .set_field_type is "
+ "not 4 but %d",
+ tv_size);
+ }
+ }
+ }
+ break;
+ case TIFF_FLOAT:
+ if (!TIFFWriteDirectoryTagFloatArray(
+ tif, &ndir, dir, tag, count,
+ tif->tif_dir.td_customValues[m].value))
+ goto bad;
+ break;
+ case TIFF_DOUBLE:
+ if (!TIFFWriteDirectoryTagDoubleArray(
+ tif, &ndir, dir, tag, count,
+ tif->tif_dir.td_customValues[m].value))
+ goto bad;
+ break;
+ case TIFF_IFD:
+ if (!TIFFWriteDirectoryTagIfdArray(
+ tif, &ndir, dir, tag, count,
+ tif->tif_dir.td_customValues[m].value))
+ goto bad;
+ break;
+ case TIFF_IFD8:
+ if (!TIFFWriteDirectoryTagIfdIfd8Array(
+ tif, &ndir, dir, tag, count,
+ tif->tif_dir.td_customValues[m].value))
+ goto bad;
+ break;
+ default:
+ assert(0); /* we should never get here */
+ break;
+ }
+ }
+ if (dir != NULL)
+ break;
+ dir = _TIFFmallocExt(tif, ndir * sizeof(TIFFDirEntry));
+ if (dir == NULL)
+ {
+ TIFFErrorExtR(tif, module, "Out of memory");
+ goto bad;
+ }
+ if (isimage)
+ {
+ if ((tif->tif_diroff == 0) && (!TIFFLinkDirectory(tif)))
+ goto bad;
+ }
+ else
+ tif->tif_diroff =
+ (TIFFSeekFile(tif, 0, SEEK_END) + 1) & (~((toff_t)1));
+ if (pdiroff != NULL)
+ *pdiroff = tif->tif_diroff;
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ dirsize = 2 + ndir * 12 + 4;
+ else
+ dirsize = 8 + ndir * 20 + 8;
+ tif->tif_dataoff = tif->tif_diroff + dirsize;
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ tif->tif_dataoff = (uint32_t)tif->tif_dataoff;
+ if ((tif->tif_dataoff < tif->tif_diroff) ||
+ (tif->tif_dataoff < (uint64_t)dirsize))
+ {
+ TIFFErrorExtR(tif, module, "Maximum TIFF file size exceeded");
+ goto bad;
+ }
+ if (tif->tif_dataoff & 1)
+ tif->tif_dataoff++;
+ if (isimage)
+ tif->tif_curdir++;
+ }
+ if (isimage)
+ {
+ if (TIFFFieldSet(tif, FIELD_SUBIFD) && (tif->tif_subifdoff == 0))
+ {
+ uint32_t na;
+ TIFFDirEntry *nb;
+ for (na = 0, nb = dir;; na++, nb++)
+ {
+ if (na == ndir)
+ {
+ TIFFErrorExtR(tif, module, "Cannot find SubIFD tag");
+ goto bad;
+ }
+ if (nb->tdir_tag == TIFFTAG_SUBIFD)
+ break;
+ }
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ tif->tif_subifdoff = tif->tif_diroff + 2 + na * 12 + 8;
+ else
+ tif->tif_subifdoff = tif->tif_diroff + 8 + na * 20 + 12;
+ }
+ }
+ dirmem = _TIFFmallocExt(tif, dirsize);
+ if (dirmem == NULL)
+ {
+ TIFFErrorExtR(tif, module, "Out of memory");
+ goto bad;
+ }
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ uint8_t *n;
+ uint32_t nTmp;
+ TIFFDirEntry *o;
+ n = dirmem;
+ *(uint16_t *)n = (uint16_t)ndir;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort((uint16_t *)n);
+ n += 2;
+ o = dir;
+ for (m = 0; m < ndir; m++)
+ {
+ *(uint16_t *)n = o->tdir_tag;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort((uint16_t *)n);
+ n += 2;
+ *(uint16_t *)n = o->tdir_type;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort((uint16_t *)n);
+ n += 2;
+ nTmp = (uint32_t)o->tdir_count;
+ _TIFFmemcpy(n, &nTmp, 4);
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong((uint32_t *)n);
+ n += 4;
+ /* This is correct. The data has been */
+ /* swabbed previously in TIFFWriteDirectoryTagData */
+ _TIFFmemcpy(n, &o->tdir_offset, 4);
+ n += 4;
+ o++;
+ }
+ nTmp = (uint32_t)tif->tif_nextdiroff;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&nTmp);
+ _TIFFmemcpy(n, &nTmp, 4);
+ }
+ else
+ {
+ uint8_t *n;
+ TIFFDirEntry *o;
+ n = dirmem;
+ *(uint64_t *)n = ndir;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8((uint64_t *)n);
+ n += 8;
+ o = dir;
+ for (m = 0; m < ndir; m++)
+ {
+ *(uint16_t *)n = o->tdir_tag;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort((uint16_t *)n);
+ n += 2;
+ *(uint16_t *)n = o->tdir_type;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort((uint16_t *)n);
+ n += 2;
+ _TIFFmemcpy(n, &o->tdir_count, 8);
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8((uint64_t *)n);
+ n += 8;
+ _TIFFmemcpy(n, &o->tdir_offset, 8);
+ n += 8;
+ o++;
+ }
+ _TIFFmemcpy(n, &tif->tif_nextdiroff, 8);
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8((uint64_t *)n);
+ }
+ _TIFFfreeExt(tif, dir);
+ dir = NULL;
+ if (!SeekOK(tif, tif->tif_diroff))
+ {
+ TIFFErrorExtR(tif, module, "IO error writing directory");
+ goto bad;
+ }
+ if (!WriteOK(tif, dirmem, (tmsize_t)dirsize))
+ {
+ TIFFErrorExtR(tif, module, "IO error writing directory");
+ goto bad;
+ }
+ _TIFFfreeExt(tif, dirmem);
+ if (imagedone)
+ {
+ TIFFFreeDirectory(tif);
+ tif->tif_flags &= ~TIFF_DIRTYDIRECT;
+ tif->tif_flags &= ~TIFF_DIRTYSTRIP;
+ (*tif->tif_cleanup)(tif);
+ /*
+ * Reset directory-related state for subsequent
+ * directories.
+ */
+ TIFFCreateDirectory(tif);
+ }
+ return (1);
bad:
- if (dir!=NULL)
- _TIFFfree(dir);
- if (dirmem!=NULL)
- _TIFFfree(dirmem);
- return(0);
+ if (dir != NULL)
+ _TIFFfreeExt(tif, dir);
+ if (dirmem != NULL)
+ _TIFFfreeExt(tif, dirmem);
+ return (0);
}
-static int8 TIFFClampDoubleToInt8( double val )
+static int8_t TIFFClampDoubleToInt8(double val)
{
- if( val > 127 )
+ if (val > 127)
return 127;
- if( val < -128 || val != val )
+ if (val < -128 || val != val)
return -128;
- return (int8)val;
+ return (int8_t)val;
}
-static int16 TIFFClampDoubleToInt16( double val )
+static int16_t TIFFClampDoubleToInt16(double val)
{
- if( val > 32767 )
+ if (val > 32767)
return 32767;
- if( val < -32768 || val != val )
+ if (val < -32768 || val != val)
return -32768;
- return (int16)val;
+ return (int16_t)val;
}
-static int32 TIFFClampDoubleToInt32( double val )
+static int32_t TIFFClampDoubleToInt32(double val)
{
- if( val > 0x7FFFFFFF )
+ if (val > 0x7FFFFFFF)
return 0x7FFFFFFF;
- if( val < -0x7FFFFFFF-1 || val != val )
- return -0x7FFFFFFF-1;
- return (int32)val;
+ if (val < -0x7FFFFFFF - 1 || val != val)
+ return -0x7FFFFFFF - 1;
+ return (int32_t)val;
}
-static uint8 TIFFClampDoubleToUInt8( double val )
+static uint8_t TIFFClampDoubleToUInt8(double val)
{
- if( val < 0 )
+ if (val < 0)
return 0;
- if( val > 255 || val != val )
+ if (val > 255 || val != val)
return 255;
- return (uint8)val;
+ return (uint8_t)val;
}
-static uint16 TIFFClampDoubleToUInt16( double val )
+static uint16_t TIFFClampDoubleToUInt16(double val)
{
- if( val < 0 )
+ if (val < 0)
return 0;
- if( val > 65535 || val != val )
+ if (val > 65535 || val != val)
return 65535;
- return (uint16)val;
+ return (uint16_t)val;
}
-static uint32 TIFFClampDoubleToUInt32( double val )
+static uint32_t TIFFClampDoubleToUInt32(double val)
{
- if( val < 0 )
+ if (val < 0)
return 0;
- if( val > 0xFFFFFFFFU || val != val )
+ if (val > 0xFFFFFFFFU || val != val)
return 0xFFFFFFFFU;
- return (uint32)val;
+ return (uint32_t)val;
}
-static int
-TIFFWriteDirectoryTagSampleformatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value)
-{
- static const char module[] = "TIFFWriteDirectoryTagSampleformatArray";
- void* conv;
- uint32 i;
- int ok;
- conv = _TIFFmalloc(count*sizeof(double));
- if (conv == NULL)
- {
- TIFFErrorExt(tif->tif_clientdata, module, "Out of memory");
- return (0);
- }
-
- switch (tif->tif_dir.td_sampleformat)
- {
- case SAMPLEFORMAT_IEEEFP:
- if (tif->tif_dir.td_bitspersample<=32)
- {
- for (i = 0; i < count; ++i)
- ((float*)conv)[i] = _TIFFClampDoubleToFloat(value[i]);
- ok = TIFFWriteDirectoryTagFloatArray(tif,ndir,dir,tag,count,(float*)conv);
- }
- else
- {
- ok = TIFFWriteDirectoryTagDoubleArray(tif,ndir,dir,tag,count,value);
- }
- break;
- case SAMPLEFORMAT_INT:
- if (tif->tif_dir.td_bitspersample<=8)
- {
- for (i = 0; i < count; ++i)
- ((int8*)conv)[i] = TIFFClampDoubleToInt8(value[i]);
- ok = TIFFWriteDirectoryTagSbyteArray(tif,ndir,dir,tag,count,(int8*)conv);
- }
- else if (tif->tif_dir.td_bitspersample<=16)
- {
- for (i = 0; i < count; ++i)
- ((int16*)conv)[i] = TIFFClampDoubleToInt16(value[i]);
- ok = TIFFWriteDirectoryTagSshortArray(tif,ndir,dir,tag,count,(int16*)conv);
- }
- else
- {
- for (i = 0; i < count; ++i)
- ((int32*)conv)[i] = TIFFClampDoubleToInt32(value[i]);
- ok = TIFFWriteDirectoryTagSlongArray(tif,ndir,dir,tag,count,(int32*)conv);
- }
- break;
- case SAMPLEFORMAT_UINT:
- if (tif->tif_dir.td_bitspersample<=8)
- {
- for (i = 0; i < count; ++i)
- ((uint8*)conv)[i] = TIFFClampDoubleToUInt8(value[i]);
- ok = TIFFWriteDirectoryTagByteArray(tif,ndir,dir,tag,count,(uint8*)conv);
- }
- else if (tif->tif_dir.td_bitspersample<=16)
- {
- for (i = 0; i < count; ++i)
- ((uint16*)conv)[i] = TIFFClampDoubleToUInt16(value[i]);
- ok = TIFFWriteDirectoryTagShortArray(tif,ndir,dir,tag,count,(uint16*)conv);
- }
- else
- {
- for (i = 0; i < count; ++i)
- ((uint32*)conv)[i] = TIFFClampDoubleToUInt32(value[i]);
- ok = TIFFWriteDirectoryTagLongArray(tif,ndir,dir,tag,count,(uint32*)conv);
- }
- break;
- default:
- ok = 0;
- }
-
- _TIFFfree(conv);
- return (ok);
-}
-
-#if 0
-static int
-TIFFWriteDirectoryTagSampleformatPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
-{
- switch (tif->tif_dir.td_sampleformat)
- {
- case SAMPLEFORMAT_IEEEFP:
- if (tif->tif_dir.td_bitspersample<=32)
- return(TIFFWriteDirectoryTagFloatPerSample(tif,ndir,dir,tag,(float)value));
- else
- return(TIFFWriteDirectoryTagDoublePerSample(tif,ndir,dir,tag,value));
- case SAMPLEFORMAT_INT:
- if (tif->tif_dir.td_bitspersample<=8)
- return(TIFFWriteDirectoryTagSbytePerSample(tif,ndir,dir,tag,(int8)value));
- else if (tif->tif_dir.td_bitspersample<=16)
- return(TIFFWriteDirectoryTagSshortPerSample(tif,ndir,dir,tag,(int16)value));
- else
- return(TIFFWriteDirectoryTagSlongPerSample(tif,ndir,dir,tag,(int32)value));
- case SAMPLEFORMAT_UINT:
- if (tif->tif_dir.td_bitspersample<=8)
- return(TIFFWriteDirectoryTagBytePerSample(tif,ndir,dir,tag,(uint8)value));
- else if (tif->tif_dir.td_bitspersample<=16)
- return(TIFFWriteDirectoryTagShortPerSample(tif,ndir,dir,tag,(uint16)value));
- else
- return(TIFFWriteDirectoryTagLongPerSample(tif,ndir,dir,tag,(uint32)value));
- default:
- return(1);
- }
-}
-#endif
-
-static int
-TIFFWriteDirectoryTagAscii(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, char* value)
+static int TIFFWriteDirectoryTagSampleformatArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag, uint32_t count,
+ double *value)
{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedAscii(tif,ndir,dir,tag,count,value));
+ static const char module[] = "TIFFWriteDirectoryTagSampleformatArray";
+ void *conv;
+ uint32_t i;
+ int ok;
+ conv = _TIFFmallocExt(tif, count * sizeof(double));
+ if (conv == NULL)
+ {
+ TIFFErrorExtR(tif, module, "Out of memory");
+ return (0);
+ }
+
+ switch (tif->tif_dir.td_sampleformat)
+ {
+ case SAMPLEFORMAT_IEEEFP:
+ if (tif->tif_dir.td_bitspersample <= 32)
+ {
+ for (i = 0; i < count; ++i)
+ ((float *)conv)[i] = _TIFFClampDoubleToFloat(value[i]);
+ ok = TIFFWriteDirectoryTagFloatArray(tif, ndir, dir, tag, count,
+ (float *)conv);
+ }
+ else
+ {
+ ok = TIFFWriteDirectoryTagDoubleArray(tif, ndir, dir, tag,
+ count, value);
+ }
+ break;
+ case SAMPLEFORMAT_INT:
+ if (tif->tif_dir.td_bitspersample <= 8)
+ {
+ for (i = 0; i < count; ++i)
+ ((int8_t *)conv)[i] = TIFFClampDoubleToInt8(value[i]);
+ ok = TIFFWriteDirectoryTagSbyteArray(tif, ndir, dir, tag, count,
+ (int8_t *)conv);
+ }
+ else if (tif->tif_dir.td_bitspersample <= 16)
+ {
+ for (i = 0; i < count; ++i)
+ ((int16_t *)conv)[i] = TIFFClampDoubleToInt16(value[i]);
+ ok = TIFFWriteDirectoryTagSshortArray(tif, ndir, dir, tag,
+ count, (int16_t *)conv);
+ }
+ else
+ {
+ for (i = 0; i < count; ++i)
+ ((int32_t *)conv)[i] = TIFFClampDoubleToInt32(value[i]);
+ ok = TIFFWriteDirectoryTagSlongArray(tif, ndir, dir, tag, count,
+ (int32_t *)conv);
+ }
+ break;
+ case SAMPLEFORMAT_UINT:
+ if (tif->tif_dir.td_bitspersample <= 8)
+ {
+ for (i = 0; i < count; ++i)
+ ((uint8_t *)conv)[i] = TIFFClampDoubleToUInt8(value[i]);
+ ok = TIFFWriteDirectoryTagByteArray(tif, ndir, dir, tag, count,
+ (uint8_t *)conv);
+ }
+ else if (tif->tif_dir.td_bitspersample <= 16)
+ {
+ for (i = 0; i < count; ++i)
+ ((uint16_t *)conv)[i] = TIFFClampDoubleToUInt16(value[i]);
+ ok = TIFFWriteDirectoryTagShortArray(tif, ndir, dir, tag, count,
+ (uint16_t *)conv);
+ }
+ else
+ {
+ for (i = 0; i < count; ++i)
+ ((uint32_t *)conv)[i] = TIFFClampDoubleToUInt32(value[i]);
+ ok = TIFFWriteDirectoryTagLongArray(tif, ndir, dir, tag, count,
+ (uint32_t *)conv);
+ }
+ break;
+ default:
+ ok = 0;
+ }
+
+ _TIFFfreeExt(tif, conv);
+ return (ok);
}
-static int
-TIFFWriteDirectoryTagUndefinedArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value)
+static int TIFFWriteDirectoryTagAscii(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, char *value)
{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedUndefinedArray(tif,ndir,dir,tag,count,value));
+ if (dir == NULL)
+ {
+ (*ndir)++;
+ return (1);
+ }
+ return (
+ TIFFWriteDirectoryTagCheckedAscii(tif, ndir, dir, tag, count, value));
}
-#ifdef notdef
-static int
-TIFFWriteDirectoryTagByte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value)
+static int TIFFWriteDirectoryTagUndefinedArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, uint8_t *value)
{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedByte(tif,ndir,dir,tag,value));
+ if (dir == NULL)
+ {
+ (*ndir)++;
+ return (1);
+ }
+ return (TIFFWriteDirectoryTagCheckedUndefinedArray(tif, ndir, dir, tag,
+ count, value));
}
-#endif
-static int
-TIFFWriteDirectoryTagByteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value)
+static int TIFFWriteDirectoryTagByteArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, uint8_t *value)
{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedByteArray(tif,ndir,dir,tag,count,value));
+ if (dir == NULL)
+ {
+ (*ndir)++;
+ return (1);
+ }
+ return (TIFFWriteDirectoryTagCheckedByteArray(tif, ndir, dir, tag, count,
+ value));
}
-#if 0
-static int
-TIFFWriteDirectoryTagBytePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value)
-{
- static const char module[] = "TIFFWriteDirectoryTagBytePerSample";
- uint8* m;
- uint8* na;
- uint16 nb;
- int o;
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(uint8));
- if (m==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
- *na=value;
- o=TIFFWriteDirectoryTagCheckedByteArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
- _TIFFfree(m);
- return(o);
+static int TIFFWriteDirectoryTagSbyteArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, int8_t *value)
+{
+ if (dir == NULL)
+ {
+ (*ndir)++;
+ return (1);
+ }
+ return (TIFFWriteDirectoryTagCheckedSbyteArray(tif, ndir, dir, tag, count,
+ value));
}
-#endif
-#ifdef notdef
-static int
-TIFFWriteDirectoryTagSbyte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value)
+static int TIFFWriteDirectoryTagShort(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint16_t value)
{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedSbyte(tif,ndir,dir,tag,value));
+ if (dir == NULL)
+ {
+ (*ndir)++;
+ return (1);
+ }
+ return (TIFFWriteDirectoryTagCheckedShort(tif, ndir, dir, tag, value));
}
-#endif
-static int
-TIFFWriteDirectoryTagSbyteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int8* value)
+static int TIFFWriteDirectoryTagShortArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, uint16_t *value)
{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedSbyteArray(tif,ndir,dir,tag,count,value));
+ if (dir == NULL)
+ {
+ (*ndir)++;
+ return (1);
+ }
+ return (TIFFWriteDirectoryTagCheckedShortArray(tif, ndir, dir, tag, count,
+ value));
}
-#if 0
-static int
-TIFFWriteDirectoryTagSbytePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value)
-{
- static const char module[] = "TIFFWriteDirectoryTagSbytePerSample";
- int8* m;
- int8* na;
- uint16 nb;
- int o;
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(int8));
- if (m==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
- *na=value;
- o=TIFFWriteDirectoryTagCheckedSbyteArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
- _TIFFfree(m);
- return(o);
+static int TIFFWriteDirectoryTagShortPerSample(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint16_t value)
+{
+ static const char module[] = "TIFFWriteDirectoryTagShortPerSample";
+ uint16_t *m;
+ uint16_t *na;
+ uint16_t nb;
+ int o;
+ if (dir == NULL)
+ {
+ (*ndir)++;
+ return (1);
+ }
+ m = _TIFFmallocExt(tif, tif->tif_dir.td_samplesperpixel * sizeof(uint16_t));
+ if (m == NULL)
+ {
+ TIFFErrorExtR(tif, module, "Out of memory");
+ return (0);
+ }
+ for (na = m, nb = 0; nb < tif->tif_dir.td_samplesperpixel; na++, nb++)
+ *na = value;
+ o = TIFFWriteDirectoryTagCheckedShortArray(
+ tif, ndir, dir, tag, tif->tif_dir.td_samplesperpixel, m);
+ _TIFFfreeExt(tif, m);
+ return (o);
}
-#endif
-static int
-TIFFWriteDirectoryTagShort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value)
+static int TIFFWriteDirectoryTagSshortArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, int16_t *value)
{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedShort(tif,ndir,dir,tag,value));
+ if (dir == NULL)
+ {
+ (*ndir)++;
+ return (1);
+ }
+ return (TIFFWriteDirectoryTagCheckedSshortArray(tif, ndir, dir, tag, count,
+ value));
}
-static int
-TIFFWriteDirectoryTagShortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint16* value)
+static int TIFFWriteDirectoryTagLong(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t value)
{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,tag,count,value));
+ if (dir == NULL)
+ {
+ (*ndir)++;
+ return (1);
+ }
+ return (TIFFWriteDirectoryTagCheckedLong(tif, ndir, dir, tag, value));
}
-static int
-TIFFWriteDirectoryTagShortPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value)
-{
- static const char module[] = "TIFFWriteDirectoryTagShortPerSample";
- uint16* m;
- uint16* na;
- uint16 nb;
- int o;
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(uint16));
- if (m==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
- *na=value;
- o=TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
- _TIFFfree(m);
- return(o);
-}
-
-#ifdef notdef
-static int
-TIFFWriteDirectoryTagSshort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value)
+static int TIFFWriteDirectoryTagLongArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, uint32_t *value)
{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedSshort(tif,ndir,dir,tag,value));
+ if (dir == NULL)
+ {
+ (*ndir)++;
+ return (1);
+ }
+ return (TIFFWriteDirectoryTagCheckedLongArray(tif, ndir, dir, tag, count,
+ value));
}
-#endif
-static int
-TIFFWriteDirectoryTagSshortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int16* value)
+static int TIFFWriteDirectoryTagSlongArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, int32_t *value)
{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedSshortArray(tif,ndir,dir,tag,count,value));
+ if (dir == NULL)
+ {
+ (*ndir)++;
+ return (1);
+ }
+ return (TIFFWriteDirectoryTagCheckedSlongArray(tif, ndir, dir, tag, count,
+ value));
}
-#if 0
-static int
-TIFFWriteDirectoryTagSshortPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value)
-{
- static const char module[] = "TIFFWriteDirectoryTagSshortPerSample";
- int16* m;
- int16* na;
- uint16 nb;
- int o;
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(int16));
- if (m==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
- *na=value;
- o=TIFFWriteDirectoryTagCheckedSshortArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
- _TIFFfree(m);
- return(o);
-}
-#endif
+/************************************************************************/
+/* TIFFWriteDirectoryTagLong8Array() */
+/* */
+/* Write either Long8 or Long array depending on file type. */
+/************************************************************************/
+static int TIFFWriteDirectoryTagLong8Array(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, uint64_t *value)
+{
+ static const char module[] = "TIFFWriteDirectoryTagLong8Array";
+ uint64_t *ma;
+ uint32_t mb;
+ uint32_t *p;
+ uint32_t *q;
+ int o;
-static int
-TIFFWriteDirectoryTagLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value)
-{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedLong(tif,ndir,dir,tag,value));
-}
+ /* is this just a counting pass? */
+ if (dir == NULL)
+ {
+ (*ndir)++;
+ return (1);
+ }
-static int
-TIFFWriteDirectoryTagLongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value)
-{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedLongArray(tif,ndir,dir,tag,count,value));
-}
+ /* We always write Long8 for BigTIFF, no checking needed. */
+ if (tif->tif_flags & TIFF_BIGTIFF)
+ return (TIFFWriteDirectoryTagCheckedLong8Array(tif, ndir, dir, tag,
+ count, value));
-#if 0
-static int
-TIFFWriteDirectoryTagLongPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value)
-{
- static const char module[] = "TIFFWriteDirectoryTagLongPerSample";
- uint32* m;
- uint32* na;
- uint16 nb;
- int o;
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(uint32));
- if (m==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
- *na=value;
- o=TIFFWriteDirectoryTagCheckedLongArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
- _TIFFfree(m);
- return(o);
-}
-#endif
+ /*
+ ** For classic tiff we want to verify everything is in range for long
+ ** and convert to long format.
+ */
+ p = _TIFFmallocExt(tif, count * sizeof(uint32_t));
+ if (p == NULL)
+ {
+ TIFFErrorExtR(tif, module, "Out of memory");
+ return (0);
+ }
-#ifdef notdef
-static int
-TIFFWriteDirectoryTagSlong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value)
-{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedSlong(tif,ndir,dir,tag,value));
-}
-#endif
+ for (q = p, ma = value, mb = 0; mb < count; ma++, mb++, q++)
+ {
+ if (*ma > 0xFFFFFFFF)
+ {
+ TIFFErrorExtR(tif, module,
+ "Attempt to write unsigned long value %" PRIu64
+ " larger than 0xFFFFFFFF for tag %d in Classic TIFF "
+ "file. TIFF file writing aborted",
+ *ma, tag);
+ _TIFFfreeExt(tif, p);
+ return (0);
+ }
+ *q = (uint32_t)(*ma);
+ }
-static int
-TIFFWriteDirectoryTagSlongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int32* value)
-{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedSlongArray(tif,ndir,dir,tag,count,value));
-}
+ o = TIFFWriteDirectoryTagCheckedLongArray(tif, ndir, dir, tag, count, p);
+ _TIFFfreeExt(tif, p);
-#if 0
-static int
-TIFFWriteDirectoryTagSlongPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value)
-{
- static const char module[] = "TIFFWriteDirectoryTagSlongPerSample";
- int32* m;
- int32* na;
- uint16 nb;
- int o;
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(int32));
- if (m==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
- *na=value;
- o=TIFFWriteDirectoryTagCheckedSlongArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
- _TIFFfree(m);
- return(o);
+ return (o);
}
-#endif
-#ifdef notdef
-static int
-TIFFWriteDirectoryTagLong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint64 value)
-{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedLong8(tif,ndir,dir,tag,value));
-}
-#endif
+/************************************************************************/
+/* TIFFWriteDirectoryTagSlong8Array() */
+/* */
+/* Write either SLong8 or SLong array depending on file type. */
+/************************************************************************/
+static int TIFFWriteDirectoryTagSlong8Array(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, int64_t *value)
+{
+ static const char module[] = "TIFFWriteDirectoryTagSlong8Array";
+ int64_t *ma;
+ uint32_t mb;
+ int32_t *p;
+ int32_t *q;
+ int o;
-static int
-TIFFWriteDirectoryTagLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
-{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedLong8Array(tif,ndir,dir,tag,count,value));
-}
+ /* is this just a counting pass? */
+ if (dir == NULL)
+ {
+ (*ndir)++;
+ return (1);
+ }
+ /* We always write SLong8 for BigTIFF, no checking needed. */
+ if (tif->tif_flags & TIFF_BIGTIFF)
+ return (TIFFWriteDirectoryTagCheckedSlong8Array(tif, ndir, dir, tag,
+ count, value));
-#ifdef notdef
-static int
-TIFFWriteDirectoryTagSlong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int64 value)
-{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedSlong8(tif,ndir,dir,tag,value));
-}
-#endif
+ /*
+ ** For classic tiff we want to verify everything is in range for signed-long
+ ** and convert to signed-long format.
+ */
+ p = _TIFFmallocExt(tif, count * sizeof(uint32_t));
+ if (p == NULL)
+ {
+ TIFFErrorExtR(tif, module, "Out of memory");
+ return (0);
+ }
-static int
-TIFFWriteDirectoryTagSlong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int64* value)
-{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedSlong8Array(tif,ndir,dir,tag,count,value));
-}
+ for (q = p, ma = value, mb = 0; mb < count; ma++, mb++, q++)
+ {
+ if (*ma > (2147483647))
+ {
+ TIFFErrorExtR(tif, module,
+ "Attempt to write signed long value %" PRIi64
+ " larger than 0x7FFFFFFF (2147483647) for tag %d in "
+ "Classic TIFF file. TIFF writing to file aborted",
+ *ma, tag);
+ _TIFFfreeExt(tif, p);
+ return (0);
+ }
+ else if (*ma < (-2147483647 - 1))
+ {
+ TIFFErrorExtR(tif, module,
+ "Attempt to write signed long value %" PRIi64
+ " smaller than 0x80000000 (-2147483648) for tag %d "
+ "in Classic TIFF file. TIFF writing to file aborted",
+ *ma, tag);
+ _TIFFfreeExt(tif, p);
+ return (0);
+ }
+ *q = (int32_t)(*ma);
+ }
-static int
-TIFFWriteDirectoryTagRational(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
-{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedRational(tif,ndir,dir,tag,value));
+ o = TIFFWriteDirectoryTagCheckedSlongArray(tif, ndir, dir, tag, count, p);
+ _TIFFfreeExt(tif, p);
+
+ return (o);
}
-static int
-TIFFWriteDirectoryTagRationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
+static int TIFFWriteDirectoryTagRational(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ double value)
{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedRationalArray(tif,ndir,dir,tag,count,value));
+ if (dir == NULL)
+ {
+ (*ndir)++;
+ return (1);
+ }
+ return (TIFFWriteDirectoryTagCheckedRational(tif, ndir, dir, tag, value));
}
-static int
-TIFFWriteDirectoryTagSrationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
+static int TIFFWriteDirectoryTagRationalArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, float *value)
{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedSrationalArray(tif,ndir,dir,tag,count,value));
+ if (dir == NULL)
+ {
+ (*ndir)++;
+ return (1);
+ }
+ return (TIFFWriteDirectoryTagCheckedRationalArray(tif, ndir, dir, tag,
+ count, value));
}
-#ifdef notdef
-static int TIFFWriteDirectoryTagFloat(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value)
+static int TIFFWriteDirectoryTagSrationalArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, float *value)
{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedFloat(tif,ndir,dir,tag,value));
+ if (dir == NULL)
+ {
+ (*ndir)++;
+ return (1);
+ }
+ return (TIFFWriteDirectoryTagCheckedSrationalArray(tif, ndir, dir, tag,
+ count, value));
}
-#endif
-static int TIFFWriteDirectoryTagFloatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
-{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedFloatArray(tif,ndir,dir,tag,count,value));
-}
-
-#if 0
-static int TIFFWriteDirectoryTagFloatPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value)
-{
- static const char module[] = "TIFFWriteDirectoryTagFloatPerSample";
- float* m;
- float* na;
- uint16 nb;
- int o;
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(float));
- if (m==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
- *na=value;
- o=TIFFWriteDirectoryTagCheckedFloatArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
- _TIFFfree(m);
- return(o);
+/*-- Rational2Double: additional write functions */
+static int TIFFWriteDirectoryTagRationalDoubleArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag,
+ uint32_t count,
+ double *value)
+{
+ if (dir == NULL)
+ {
+ (*ndir)++;
+ return (1);
+ }
+ return (TIFFWriteDirectoryTagCheckedRationalDoubleArray(tif, ndir, dir, tag,
+ count, value));
}
-#endif
-#ifdef notdef
-static int TIFFWriteDirectoryTagDouble(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
+static int TIFFWriteDirectoryTagSrationalDoubleArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag,
+ uint32_t count,
+ double *value)
{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedDouble(tif,ndir,dir,tag,value));
+ if (dir == NULL)
+ {
+ (*ndir)++;
+ return (1);
+ }
+ return (TIFFWriteDirectoryTagCheckedSrationalDoubleArray(
+ tif, ndir, dir, tag, count, value));
}
-#endif
-static int TIFFWriteDirectoryTagDoubleArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value)
-{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedDoubleArray(tif,ndir,dir,tag,count,value));
-}
-
-#if 0
-static int TIFFWriteDirectoryTagDoublePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
-{
- static const char module[] = "TIFFWriteDirectoryTagDoublePerSample";
- double* m;
- double* na;
- uint16 nb;
- int o;
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(double));
- if (m==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
- *na=value;
- o=TIFFWriteDirectoryTagCheckedDoubleArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
- _TIFFfree(m);
- return(o);
+static int TIFFWriteDirectoryTagFloatArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, float *value)
+{
+ if (dir == NULL)
+ {
+ (*ndir)++;
+ return (1);
+ }
+ return (TIFFWriteDirectoryTagCheckedFloatArray(tif, ndir, dir, tag, count,
+ value));
}
-#endif
-static int
-TIFFWriteDirectoryTagIfdArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value)
+static int TIFFWriteDirectoryTagDoubleArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, double *value)
{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedIfdArray(tif,ndir,dir,tag,count,value));
+ if (dir == NULL)
+ {
+ (*ndir)++;
+ return (1);
+ }
+ return (TIFFWriteDirectoryTagCheckedDoubleArray(tif, ndir, dir, tag, count,
+ value));
}
-#ifdef notdef
-static int
-TIFFWriteDirectoryTagIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
+static int TIFFWriteDirectoryTagIfdArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, uint32_t *value)
{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- return(TIFFWriteDirectoryTagCheckedIfd8Array(tif,ndir,dir,tag,count,value));
+ if (dir == NULL)
+ {
+ (*ndir)++;
+ return (1);
+ }
+ return (TIFFWriteDirectoryTagCheckedIfdArray(tif, ndir, dir, tag, count,
+ value));
}
-#endif
-static int
-TIFFWriteDirectoryTagShortLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value)
+static int TIFFWriteDirectoryTagShortLong(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t value)
{
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- if (value<=0xFFFF)
- return(TIFFWriteDirectoryTagCheckedShort(tif,ndir,dir,tag,(uint16)value));
- else
- return(TIFFWriteDirectoryTagCheckedLong(tif,ndir,dir,tag,value));
+ if (dir == NULL)
+ {
+ (*ndir)++;
+ return (1);
+ }
+ if (value <= 0xFFFF)
+ return (TIFFWriteDirectoryTagCheckedShort(tif, ndir, dir, tag,
+ (uint16_t)value));
+ else
+ return (TIFFWriteDirectoryTagCheckedLong(tif, ndir, dir, tag, value));
}
-static int _WriteAsType(TIFF* tif, uint64 strile_size, uint64 uncompressed_threshold)
+static int _WriteAsType(TIFF *tif, uint64_t strile_size,
+ uint64_t uncompressed_threshold)
{
- const uint16 compression = tif->tif_dir.td_compression;
- if ( compression == COMPRESSION_NONE )
+ const uint16_t compression = tif->tif_dir.td_compression;
+ if (compression == COMPRESSION_NONE)
{
return strile_size > uncompressed_threshold;
}
- else if ( compression == COMPRESSION_JPEG ||
- compression == COMPRESSION_LZW ||
- compression == COMPRESSION_ADOBE_DEFLATE ||
- compression == COMPRESSION_LZMA ||
- compression == COMPRESSION_LERC ||
- compression == COMPRESSION_ZSTD ||
- compression == COMPRESSION_WEBP )
+ else if (compression == COMPRESSION_JPEG ||
+ compression == COMPRESSION_LZW ||
+ compression == COMPRESSION_ADOBE_DEFLATE ||
+ compression == COMPRESSION_DEFLATE ||
+ compression == COMPRESSION_LZMA ||
+ compression == COMPRESSION_LERC ||
+ compression == COMPRESSION_ZSTD ||
+ compression == COMPRESSION_WEBP || compression == COMPRESSION_JXL)
{
/* For a few select compression types, we assume that in the worst */
/* case the compressed size will be 10 times the uncompressed size */
@@ -1719,12 +1821,12 @@ static int _WriteAsType(TIFF* tif, uint64 strile_size, uint64 uncompressed_thres
return 1;
}
-static int WriteAsLong8(TIFF* tif, uint64 strile_size)
+static int WriteAsLong8(TIFF *tif, uint64_t strile_size)
{
return _WriteAsType(tif, strile_size, 0xFFFFFFFFU);
}
-static int WriteAsLong4(TIFF* tif, uint64 strile_size)
+static int WriteAsLong4(TIFF *tif, uint64_t strile_size)
{
return _WriteAsType(tif, strile_size, 0xFFFFU);
}
@@ -1736,121 +1838,128 @@ static int WriteAsLong4(TIFF* tif, uint64 strile_size)
/* on strile size and Classic/BigTIFF mode. */
/************************************************************************/
-static int
-TIFFWriteDirectoryTagLongLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
+static int TIFFWriteDirectoryTagLongLong8Array(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, uint64_t *value)
{
static const char module[] = "TIFFWriteDirectoryTagLongLong8Array";
int o;
int write_aslong4;
/* is this just a counting pass? */
- if (dir==NULL)
+ if (dir == NULL)
{
(*ndir)++;
- return(1);
+ return (1);
}
- if( tif->tif_dir.td_deferstrilearraywriting )
+ if (tif->tif_dir.td_deferstrilearraywriting)
{
- return TIFFWriteDirectoryTagData(tif, ndir, dir, tag, TIFF_NOTYPE, 0, 0, NULL);
+ return TIFFWriteDirectoryTagData(tif, ndir, dir, tag, TIFF_NOTYPE, 0, 0,
+ NULL);
}
- if( tif->tif_flags&TIFF_BIGTIFF )
+ if (tif->tif_flags & TIFF_BIGTIFF)
{
int write_aslong8 = 1;
/* In the case of ByteCounts array, we may be able to write them on */
/* LONG if the strip/tilesize is not too big. */
- /* Also do that for count > 1 in the case someone would want to create */
+ /* Also do that for count > 1 in the case someone would want to create
+ */
/* a single-strip file with a growing height, in which case using */
/* LONG8 will be safer. */
- if( count > 1 && tag == TIFFTAG_STRIPBYTECOUNTS )
+ if (count > 1 && tag == TIFFTAG_STRIPBYTECOUNTS)
{
write_aslong8 = WriteAsLong8(tif, TIFFStripSize64(tif));
}
- else if( count > 1 && tag == TIFFTAG_TILEBYTECOUNTS )
+ else if (count > 1 && tag == TIFFTAG_TILEBYTECOUNTS)
{
write_aslong8 = WriteAsLong8(tif, TIFFTileSize64(tif));
}
- if( write_aslong8 )
+ if (write_aslong8)
{
- return TIFFWriteDirectoryTagCheckedLong8Array(tif,ndir,dir,
- tag,count,value);
+ return TIFFWriteDirectoryTagCheckedLong8Array(tif, ndir, dir, tag,
+ count, value);
}
}
write_aslong4 = 1;
- if( count > 1 && tag == TIFFTAG_STRIPBYTECOUNTS )
+ if (count > 1 && tag == TIFFTAG_STRIPBYTECOUNTS)
{
write_aslong4 = WriteAsLong4(tif, TIFFStripSize64(tif));
}
- else if( count > 1 && tag == TIFFTAG_TILEBYTECOUNTS )
+ else if (count > 1 && tag == TIFFTAG_TILEBYTECOUNTS)
{
write_aslong4 = WriteAsLong4(tif, TIFFTileSize64(tif));
}
- if( write_aslong4 )
+ if (write_aslong4)
{
/*
** For classic tiff we want to verify everything is in range for LONG
** and convert to long format.
*/
- uint32* p = _TIFFmalloc(count*sizeof(uint32));
- uint32* q;
- uint64* ma;
- uint32 mb;
+ uint32_t *p = _TIFFmallocExt(tif, count * sizeof(uint32_t));
+ uint32_t *q;
+ uint64_t *ma;
+ uint32_t mb;
- if (p==NULL)
+ if (p == NULL)
{
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
+ TIFFErrorExtR(tif, module, "Out of memory");
+ return (0);
}
- for (q=p, ma=value, mb=0; mb<count; ma++, mb++, q++)
+ for (q = p, ma = value, mb = 0; mb < count; ma++, mb++, q++)
{
- if (*ma>0xFFFFFFFF)
+ if (*ma > 0xFFFFFFFF)
{
- TIFFErrorExt(tif->tif_clientdata,module,
- "Attempt to write value larger than 0xFFFFFFFF in LONG array.");
- _TIFFfree(p);
- return(0);
+ TIFFErrorExtR(tif, module,
+ "Attempt to write value larger than 0xFFFFFFFF "
+ "in LONG array.");
+ _TIFFfreeExt(tif, p);
+ return (0);
}
- *q= (uint32)(*ma);
+ *q = (uint32_t)(*ma);
}
- o=TIFFWriteDirectoryTagCheckedLongArray(tif,ndir,dir,tag,count,p);
- _TIFFfree(p);
+ o = TIFFWriteDirectoryTagCheckedLongArray(tif, ndir, dir, tag, count,
+ p);
+ _TIFFfreeExt(tif, p);
}
else
{
- uint16* p = _TIFFmalloc(count*sizeof(uint16));
- uint16* q;
- uint64* ma;
- uint32 mb;
+ uint16_t *p = _TIFFmallocExt(tif, count * sizeof(uint16_t));
+ uint16_t *q;
+ uint64_t *ma;
+ uint32_t mb;
- if (p==NULL)
+ if (p == NULL)
{
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
+ TIFFErrorExtR(tif, module, "Out of memory");
+ return (0);
}
- for (q=p, ma=value, mb=0; mb<count; ma++, mb++, q++)
+ for (q = p, ma = value, mb = 0; mb < count; ma++, mb++, q++)
{
- if (*ma>0xFFFF)
+ if (*ma > 0xFFFF)
{
/* Should not happen normally given the check we did before */
- TIFFErrorExt(tif->tif_clientdata,module,
- "Attempt to write value larger than 0xFFFF in SHORT array.");
- _TIFFfree(p);
- return(0);
+ TIFFErrorExtR(tif, module,
+ "Attempt to write value larger than 0xFFFF in "
+ "SHORT array.");
+ _TIFFfreeExt(tif, p);
+ return (0);
}
- *q= (uint16)(*ma);
+ *q = (uint16_t)(*ma);
}
- o=TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,tag,count,p);
- _TIFFfree(p);
+ o = TIFFWriteDirectoryTagCheckedShortArray(tif, ndir, dir, tag, count,
+ p);
+ _TIFFfreeExt(tif, p);
}
- return(o);
+ return (o);
}
/************************************************************************/
@@ -1859,951 +1968,1176 @@ TIFFWriteDirectoryTagLongLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir,
/* Write either IFD8 or IFD array depending on file type. */
/************************************************************************/
-static int
-TIFFWriteDirectoryTagIfdIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
+static int TIFFWriteDirectoryTagIfdIfd8Array(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, uint64_t *value)
{
static const char module[] = "TIFFWriteDirectoryTagIfdIfd8Array";
- uint64* ma;
- uint32 mb;
- uint32* p;
- uint32* q;
+ uint64_t *ma;
+ uint32_t mb;
+ uint32_t *p;
+ uint32_t *q;
int o;
/* is this just a counting pass? */
- if (dir==NULL)
+ if (dir == NULL)
{
(*ndir)++;
- return(1);
+ return (1);
}
/* We always write IFD8 for BigTIFF, no checking needed. */
- if( tif->tif_flags&TIFF_BIGTIFF )
- return TIFFWriteDirectoryTagCheckedIfd8Array(tif,ndir,dir,
- tag,count,value);
+ if (tif->tif_flags & TIFF_BIGTIFF)
+ return TIFFWriteDirectoryTagCheckedIfd8Array(tif, ndir, dir, tag, count,
+ value);
/*
** For classic tiff we want to verify everything is in range for IFD
** and convert to long format.
*/
- p = _TIFFmalloc(count*sizeof(uint32));
- if (p==NULL)
+ p = _TIFFmallocExt(tif, count * sizeof(uint32_t));
+ if (p == NULL)
{
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
+ TIFFErrorExtR(tif, module, "Out of memory");
+ return (0);
}
- for (q=p, ma=value, mb=0; mb<count; ma++, mb++, q++)
+ for (q = p, ma = value, mb = 0; mb < count; ma++, mb++, q++)
{
- if (*ma>0xFFFFFFFF)
+ if (*ma > 0xFFFFFFFF)
{
- TIFFErrorExt(tif->tif_clientdata,module,
- "Attempt to write value larger than 0xFFFFFFFF in Classic TIFF file.");
- _TIFFfree(p);
- return(0);
+ TIFFErrorExtR(tif, module,
+ "Attempt to write value larger than 0xFFFFFFFF in "
+ "Classic TIFF file.");
+ _TIFFfreeExt(tif, p);
+ return (0);
}
- *q= (uint32)(*ma);
+ *q = (uint32_t)(*ma);
}
- o=TIFFWriteDirectoryTagCheckedIfdArray(tif,ndir,dir,tag,count,p);
- _TIFFfree(p);
+ o = TIFFWriteDirectoryTagCheckedIfdArray(tif, ndir, dir, tag, count, p);
+ _TIFFfreeExt(tif, p);
- return(o);
-}
-
-#ifdef notdef
-static int
-TIFFWriteDirectoryTagShortLongLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
-{
- static const char module[] = "TIFFWriteDirectoryTagShortLongLong8Array";
- uint64* ma;
- uint32 mb;
- uint8 n;
- int o;
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- n=0;
- for (ma=value, mb=0; mb<count; ma++, mb++)
- {
- if ((n==0)&&(*ma>0xFFFF))
- n=1;
- if ((n==1)&&(*ma>0xFFFFFFFF))
- {
- n=2;
- break;
- }
- }
- if (n==0)
- {
- uint16* p;
- uint16* q;
- p=_TIFFmalloc(count*sizeof(uint16));
- if (p==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (ma=value, mb=0, q=p; mb<count; ma++, mb++, q++)
- *q=(uint16)(*ma);
- o=TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,tag,count,p);
- _TIFFfree(p);
- }
- else if (n==1)
- {
- uint32* p;
- uint32* q;
- p=_TIFFmalloc(count*sizeof(uint32));
- if (p==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (ma=value, mb=0, q=p; mb<count; ma++, mb++, q++)
- *q=(uint32)(*ma);
- o=TIFFWriteDirectoryTagCheckedLongArray(tif,ndir,dir,tag,count,p);
- _TIFFfree(p);
- }
- else
- {
- assert(n==2);
- o=TIFFWriteDirectoryTagCheckedLong8Array(tif,ndir,dir,tag,count,value);
- }
- return(o);
-}
-#endif
-static int
-TIFFWriteDirectoryTagColormap(TIFF* tif, uint32* ndir, TIFFDirEntry* dir)
-{
- static const char module[] = "TIFFWriteDirectoryTagColormap";
- uint32 m;
- uint16* n;
- int o;
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- m=(1<<tif->tif_dir.td_bitspersample);
- n=_TIFFmalloc(3*m*sizeof(uint16));
- if (n==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- _TIFFmemcpy(&n[0],tif->tif_dir.td_colormap[0],m*sizeof(uint16));
- _TIFFmemcpy(&n[m],tif->tif_dir.td_colormap[1],m*sizeof(uint16));
- _TIFFmemcpy(&n[2*m],tif->tif_dir.td_colormap[2],m*sizeof(uint16));
- o=TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,TIFFTAG_COLORMAP,3*m,n);
- _TIFFfree(n);
- return(o);
+ return (o);
}
-static int
-TIFFWriteDirectoryTagTransferfunction(TIFF* tif, uint32* ndir, TIFFDirEntry* dir)
-{
- static const char module[] = "TIFFWriteDirectoryTagTransferfunction";
- uint32 m;
- uint16 n;
- uint16* o;
- int p;
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- m=(1<<tif->tif_dir.td_bitspersample);
- n=tif->tif_dir.td_samplesperpixel-tif->tif_dir.td_extrasamples;
- /*
- * Check if the table can be written as a single column,
- * or if it must be written as 3 columns. Note that we
- * write a 3-column tag if there are 2 samples/pixel and
- * a single column of data won't suffice--hmm.
- */
- if (n>3)
- n=3;
- if (n==3)
- {
- if (tif->tif_dir.td_transferfunction[2] == NULL ||
- !_TIFFmemcmp(tif->tif_dir.td_transferfunction[0],tif->tif_dir.td_transferfunction[2],m*sizeof(uint16)))
- n=2;
- }
- if (n==2)
- {
- if (tif->tif_dir.td_transferfunction[1] == NULL ||
- !_TIFFmemcmp(tif->tif_dir.td_transferfunction[0],tif->tif_dir.td_transferfunction[1],m*sizeof(uint16)))
- n=1;
- }
- if (n==0)
- n=1;
- o=_TIFFmalloc(n*m*sizeof(uint16));
- if (o==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- _TIFFmemcpy(&o[0],tif->tif_dir.td_transferfunction[0],m*sizeof(uint16));
- if (n>1)
- _TIFFmemcpy(&o[m],tif->tif_dir.td_transferfunction[1],m*sizeof(uint16));
- if (n>2)
- _TIFFmemcpy(&o[2*m],tif->tif_dir.td_transferfunction[2],m*sizeof(uint16));
- p=TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,TIFFTAG_TRANSFERFUNCTION,n*m,o);
- _TIFFfree(o);
- return(p);
-}
-
-static int
-TIFFWriteDirectoryTagSubifd(TIFF* tif, uint32* ndir, TIFFDirEntry* dir)
-{
- static const char module[] = "TIFFWriteDirectoryTagSubifd";
- uint64 m;
- int n;
- if (tif->tif_dir.td_nsubifd==0)
- return(1);
- if (dir==NULL)
- {
- (*ndir)++;
- return(1);
- }
- m=tif->tif_dataoff;
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- uint32* o;
- uint64* pa;
- uint32* pb;
- uint16 p;
- o=_TIFFmalloc(tif->tif_dir.td_nsubifd*sizeof(uint32));
- if (o==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- pa=tif->tif_dir.td_subifd;
- pb=o;
- for (p=0; p < tif->tif_dir.td_nsubifd; p++)
- {
- assert(pa != 0);
-
- /* Could happen if an classicTIFF has a SubIFD of type LONG8 (which is illegal) */
- if( *pa > 0xFFFFFFFFUL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Illegal value for SubIFD tag");
- _TIFFfree(o);
- return(0);
- }
- *pb++=(uint32)(*pa++);
- }
- n=TIFFWriteDirectoryTagCheckedIfdArray(tif,ndir,dir,TIFFTAG_SUBIFD,tif->tif_dir.td_nsubifd,o);
- _TIFFfree(o);
- }
- else
- n=TIFFWriteDirectoryTagCheckedIfd8Array(tif,ndir,dir,TIFFTAG_SUBIFD,tif->tif_dir.td_nsubifd,tif->tif_dir.td_subifd);
- if (!n)
- return(0);
- /*
- * Total hack: if this directory includes a SubIFD
- * tag then force the next <n> directories to be
- * written as ``sub directories'' of this one. This
- * is used to write things like thumbnails and
- * image masks that one wants to keep out of the
- * normal directory linkage access mechanism.
- */
- tif->tif_flags|=TIFF_INSUBIFD;
- tif->tif_nsubifd=tif->tif_dir.td_nsubifd;
- if (tif->tif_dir.td_nsubifd==1)
- tif->tif_subifdoff=0;
- else
- tif->tif_subifdoff=m;
- return(1);
-}
-
-static int
-TIFFWriteDirectoryTagCheckedAscii(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, char* value)
+static int TIFFWriteDirectoryTagColormap(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir)
{
- assert(sizeof(char)==1);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_ASCII,count,count,value));
-}
+ static const char module[] = "TIFFWriteDirectoryTagColormap";
+ uint32_t m;
+ uint16_t *n;
+ int o;
+ if (dir == NULL)
+ {
+ (*ndir)++;
+ return (1);
+ }
+ m = (1 << tif->tif_dir.td_bitspersample);
+ n = _TIFFmallocExt(tif, 3 * m * sizeof(uint16_t));
+ if (n == NULL)
+ {
+ TIFFErrorExtR(tif, module, "Out of memory");
+ return (0);
+ }
+ _TIFFmemcpy(&n[0], tif->tif_dir.td_colormap[0], m * sizeof(uint16_t));
+ _TIFFmemcpy(&n[m], tif->tif_dir.td_colormap[1], m * sizeof(uint16_t));
+ _TIFFmemcpy(&n[2 * m], tif->tif_dir.td_colormap[2], m * sizeof(uint16_t));
+ o = TIFFWriteDirectoryTagCheckedShortArray(tif, ndir, dir, TIFFTAG_COLORMAP,
+ 3 * m, n);
+ _TIFFfreeExt(tif, n);
+ return (o);
+}
+
+static int TIFFWriteDirectoryTagTransferfunction(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir)
+{
+ static const char module[] = "TIFFWriteDirectoryTagTransferfunction";
+ uint32_t m;
+ uint16_t n;
+ uint16_t *o;
+ int p;
+ if (dir == NULL)
+ {
+ (*ndir)++;
+ return (1);
+ }
+ m = (1 << tif->tif_dir.td_bitspersample);
+ n = tif->tif_dir.td_samplesperpixel - tif->tif_dir.td_extrasamples;
+ /*
+ * Check if the table can be written as a single column,
+ * or if it must be written as 3 columns. Note that we
+ * write a 3-column tag if there are 2 samples/pixel and
+ * a single column of data won't suffice--hmm.
+ */
+ if (n > 3)
+ n = 3;
+ if (n == 3)
+ {
+ if (tif->tif_dir.td_transferfunction[2] == NULL ||
+ !_TIFFmemcmp(tif->tif_dir.td_transferfunction[0],
+ tif->tif_dir.td_transferfunction[2],
+ m * sizeof(uint16_t)))
+ n = 2;
+ }
+ if (n == 2)
+ {
+ if (tif->tif_dir.td_transferfunction[1] == NULL ||
+ !_TIFFmemcmp(tif->tif_dir.td_transferfunction[0],
+ tif->tif_dir.td_transferfunction[1],
+ m * sizeof(uint16_t)))
+ n = 1;
+ }
+ if (n == 0)
+ n = 1;
+ o = _TIFFmallocExt(tif, n * m * sizeof(uint16_t));
+ if (o == NULL)
+ {
+ TIFFErrorExtR(tif, module, "Out of memory");
+ return (0);
+ }
+ _TIFFmemcpy(&o[0], tif->tif_dir.td_transferfunction[0],
+ m * sizeof(uint16_t));
+ if (n > 1)
+ _TIFFmemcpy(&o[m], tif->tif_dir.td_transferfunction[1],
+ m * sizeof(uint16_t));
+ if (n > 2)
+ _TIFFmemcpy(&o[2 * m], tif->tif_dir.td_transferfunction[2],
+ m * sizeof(uint16_t));
+ p = TIFFWriteDirectoryTagCheckedShortArray(
+ tif, ndir, dir, TIFFTAG_TRANSFERFUNCTION, n * m, o);
+ _TIFFfreeExt(tif, o);
+ return (p);
+}
+
+static int TIFFWriteDirectoryTagSubifd(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir)
+{
+ static const char module[] = "TIFFWriteDirectoryTagSubifd";
+ uint64_t m;
+ int n;
+ if (tif->tif_dir.td_nsubifd == 0)
+ return (1);
+ if (dir == NULL)
+ {
+ (*ndir)++;
+ return (1);
+ }
+ m = tif->tif_dataoff;
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ uint32_t *o;
+ uint64_t *pa;
+ uint32_t *pb;
+ uint16_t p;
+ o = _TIFFmallocExt(tif, tif->tif_dir.td_nsubifd * sizeof(uint32_t));
+ if (o == NULL)
+ {
+ TIFFErrorExtR(tif, module, "Out of memory");
+ return (0);
+ }
+ pa = tif->tif_dir.td_subifd;
+ pb = o;
+ for (p = 0; p < tif->tif_dir.td_nsubifd; p++)
+ {
+ assert(pa != 0);
-static int
-TIFFWriteDirectoryTagCheckedUndefinedArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value)
-{
- assert(sizeof(uint8)==1);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_UNDEFINED,count,count,value));
+ /* Could happen if an classicTIFF has a SubIFD of type LONG8 (which
+ * is illegal) */
+ if (*pa > 0xFFFFFFFFUL)
+ {
+ TIFFErrorExtR(tif, module, "Illegal value for SubIFD tag");
+ _TIFFfreeExt(tif, o);
+ return (0);
+ }
+ *pb++ = (uint32_t)(*pa++);
+ }
+ n = TIFFWriteDirectoryTagCheckedIfdArray(tif, ndir, dir, TIFFTAG_SUBIFD,
+ tif->tif_dir.td_nsubifd, o);
+ _TIFFfreeExt(tif, o);
+ }
+ else
+ n = TIFFWriteDirectoryTagCheckedIfd8Array(
+ tif, ndir, dir, TIFFTAG_SUBIFD, tif->tif_dir.td_nsubifd,
+ tif->tif_dir.td_subifd);
+ if (!n)
+ return (0);
+ /*
+ * Total hack: if this directory includes a SubIFD
+ * tag then force the next <n> directories to be
+ * written as ``sub directories'' of this one. This
+ * is used to write things like thumbnails and
+ * image masks that one wants to keep out of the
+ * normal directory linkage access mechanism.
+ */
+ tif->tif_flags |= TIFF_INSUBIFD;
+ tif->tif_nsubifd = tif->tif_dir.td_nsubifd;
+ if (tif->tif_dir.td_nsubifd == 1)
+ tif->tif_subifdoff = 0;
+ else
+ tif->tif_subifdoff = m;
+ return (1);
}
-#ifdef notdef
-static int
-TIFFWriteDirectoryTagCheckedByte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value)
+static int TIFFWriteDirectoryTagCheckedAscii(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, char *value)
{
- assert(sizeof(uint8)==1);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_BYTE,1,1,&value));
+ assert(sizeof(char) == 1);
+ return (TIFFWriteDirectoryTagData(tif, ndir, dir, tag, TIFF_ASCII, count,
+ count, value));
}
-#endif
-static int
-TIFFWriteDirectoryTagCheckedByteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value)
+static int TIFFWriteDirectoryTagCheckedUndefinedArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag,
+ uint32_t count,
+ uint8_t *value)
{
- assert(sizeof(uint8)==1);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_BYTE,count,count,value));
+ assert(sizeof(uint8_t) == 1);
+ return (TIFFWriteDirectoryTagData(tif, ndir, dir, tag, TIFF_UNDEFINED,
+ count, count, value));
}
-#ifdef notdef
-static int
-TIFFWriteDirectoryTagCheckedSbyte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value)
+static int TIFFWriteDirectoryTagCheckedByteArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag, uint32_t count,
+ uint8_t *value)
{
- assert(sizeof(int8)==1);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SBYTE,1,1,&value));
+ assert(sizeof(uint8_t) == 1);
+ return (TIFFWriteDirectoryTagData(tif, ndir, dir, tag, TIFF_BYTE, count,
+ count, value));
}
-#endif
-static int
-TIFFWriteDirectoryTagCheckedSbyteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int8* value)
+static int TIFFWriteDirectoryTagCheckedSbyteArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag, uint32_t count,
+ int8_t *value)
{
- assert(sizeof(int8)==1);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SBYTE,count,count,value));
+ assert(sizeof(int8_t) == 1);
+ return (TIFFWriteDirectoryTagData(tif, ndir, dir, tag, TIFF_SBYTE, count,
+ count, value));
}
-static int
-TIFFWriteDirectoryTagCheckedShort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value)
+static int TIFFWriteDirectoryTagCheckedShort(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint16_t value)
{
- uint16 m;
- assert(sizeof(uint16)==2);
- m=value;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort(&m);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SHORT,1,2,&m));
+ uint16_t m;
+ assert(sizeof(uint16_t) == 2);
+ m = value;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(&m);
+ return (
+ TIFFWriteDirectoryTagData(tif, ndir, dir, tag, TIFF_SHORT, 1, 2, &m));
}
-static int
-TIFFWriteDirectoryTagCheckedShortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint16* value)
+static int TIFFWriteDirectoryTagCheckedShortArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag, uint32_t count,
+ uint16_t *value)
{
- assert(count<0x80000000);
- assert(sizeof(uint16)==2);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfShort(value,count);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SHORT,count,count*2,value));
+ assert(count < 0x80000000);
+ assert(sizeof(uint16_t) == 2);
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfShort(value, count);
+ return (TIFFWriteDirectoryTagData(tif, ndir, dir, tag, TIFF_SHORT, count,
+ count * 2, value));
}
-#ifdef notdef
-static int
-TIFFWriteDirectoryTagCheckedSshort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value)
+static int TIFFWriteDirectoryTagCheckedSshortArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag, uint32_t count,
+ int16_t *value)
{
- int16 m;
- assert(sizeof(int16)==2);
- m=value;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort((uint16*)(&m));
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SSHORT,1,2,&m));
+ assert(count < 0x80000000);
+ assert(sizeof(int16_t) == 2);
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfShort((uint16_t *)value, count);
+ return (TIFFWriteDirectoryTagData(tif, ndir, dir, tag, TIFF_SSHORT, count,
+ count * 2, value));
}
-#endif
-static int
-TIFFWriteDirectoryTagCheckedSshortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int16* value)
+static int TIFFWriteDirectoryTagCheckedLong(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t value)
{
- assert(count<0x80000000);
- assert(sizeof(int16)==2);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfShort((uint16*)value,count);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SSHORT,count,count*2,value));
+ uint32_t m;
+ assert(sizeof(uint32_t) == 4);
+ m = value;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&m);
+ return (
+ TIFFWriteDirectoryTagData(tif, ndir, dir, tag, TIFF_LONG, 1, 4, &m));
}
-static int
-TIFFWriteDirectoryTagCheckedLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value)
+static int TIFFWriteDirectoryTagCheckedLongArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag, uint32_t count,
+ uint32_t *value)
{
- uint32 m;
- assert(sizeof(uint32)==4);
- m=value;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(&m);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_LONG,1,4,&m));
+ assert(count < 0x40000000);
+ assert(sizeof(uint32_t) == 4);
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfLong(value, count);
+ return (TIFFWriteDirectoryTagData(tif, ndir, dir, tag, TIFF_LONG, count,
+ count * 4, value));
}
-static int
-TIFFWriteDirectoryTagCheckedLongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value)
-{
- assert(count<0x40000000);
- assert(sizeof(uint32)==4);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong(value,count);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_LONG,count,count*4,value));
+static int TIFFWriteDirectoryTagCheckedSlongArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag, uint32_t count,
+ int32_t *value)
+{
+ assert(count < 0x40000000);
+ assert(sizeof(int32_t) == 4);
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfLong((uint32_t *)value, count);
+ return (TIFFWriteDirectoryTagData(tif, ndir, dir, tag, TIFF_SLONG, count,
+ count * 4, value));
}
-#ifdef notdef
-static int
-TIFFWriteDirectoryTagCheckedSlong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value)
-{
- int32 m;
- assert(sizeof(int32)==4);
- m=value;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong((uint32*)(&m));
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SLONG,1,4,&m));
+static int TIFFWriteDirectoryTagCheckedLong8Array(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag, uint32_t count,
+ uint64_t *value)
+{
+ assert(count < 0x20000000);
+ assert(sizeof(uint64_t) == 8);
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ TIFFErrorExtR(tif, "TIFFWriteDirectoryTagCheckedLong8Array",
+ "LONG8 not allowed for ClassicTIFF");
+ return (0);
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfLong8(value, count);
+ return (TIFFWriteDirectoryTagData(tif, ndir, dir, tag, TIFF_LONG8, count,
+ count * 8, value));
}
-#endif
-static int
-TIFFWriteDirectoryTagCheckedSlongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int32* value)
+static int TIFFWriteDirectoryTagCheckedSlong8Array(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag, uint32_t count,
+ int64_t *value)
{
- assert(count<0x40000000);
- assert(sizeof(int32)==4);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong((uint32*)value,count);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SLONG,count,count*4,value));
-}
-
-#ifdef notdef
-static int
-TIFFWriteDirectoryTagCheckedLong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint64 value)
-{
- uint64 m;
- assert(sizeof(uint64)==8);
- if( !(tif->tif_flags&TIFF_BIGTIFF) ) {
- TIFFErrorExt(tif->tif_clientdata,"TIFFWriteDirectoryTagCheckedLong8","LONG8 not allowed for ClassicTIFF");
- return(0);
- }
- m=value;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8(&m);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_LONG8,1,8,&m));
+ assert(count < 0x20000000);
+ assert(sizeof(int64_t) == 8);
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ TIFFErrorExtR(tif, "TIFFWriteDirectoryTagCheckedSlong8Array",
+ "SLONG8 not allowed for ClassicTIFF");
+ return (0);
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfLong8((uint64_t *)value, count);
+ return (TIFFWriteDirectoryTagData(tif, ndir, dir, tag, TIFF_SLONG8, count,
+ count * 8, value));
}
-#endif
-static int
-TIFFWriteDirectoryTagCheckedLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
+static int TIFFWriteDirectoryTagCheckedRational(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ double value)
{
- assert(count<0x20000000);
- assert(sizeof(uint64)==8);
- if( !(tif->tif_flags&TIFF_BIGTIFF) ) {
- TIFFErrorExt(tif->tif_clientdata,"TIFFWriteDirectoryTagCheckedLong8Array","LONG8 not allowed for ClassicTIFF");
- return(0);
- }
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong8(value,count);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_LONG8,count,count*8,value));
-}
+ static const char module[] = "TIFFWriteDirectoryTagCheckedRational";
+ uint32_t m[2];
+ assert(sizeof(uint32_t) == 4);
+ if (value < 0)
+ {
+ TIFFErrorExtR(tif, module, "Negative value is illegal");
+ return 0;
+ }
+ else if (value != value)
+ {
+ TIFFErrorExtR(tif, module, "Not-a-number value is illegal");
+ return 0;
+ }
+ /*--Rational2Double: New function also used for non-custom rational tags.
+ * However, could be omitted here, because
+ * TIFFWriteDirectoryTagCheckedRational() is not used by code for custom
+ * tags, only by code for named-tiff-tags like FIELD_RESOLUTION and
+ * FIELD_POSITION */
+ else
+ {
+ DoubleToRational(value, &m[0], &m[1]);
+ }
-#ifdef notdef
-static int
-TIFFWriteDirectoryTagCheckedSlong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int64 value)
-{
- int64 m;
- assert(sizeof(int64)==8);
- if( !(tif->tif_flags&TIFF_BIGTIFF) ) {
- TIFFErrorExt(tif->tif_clientdata,"TIFFWriteDirectoryTagCheckedSlong8","SLONG8 not allowed for ClassicTIFF");
- return(0);
- }
- m=value;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8((uint64*)(&m));
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SLONG8,1,8,&m));
+ if (tif->tif_flags & TIFF_SWAB)
+ {
+ TIFFSwabLong(&m[0]);
+ TIFFSwabLong(&m[1]);
+ }
+ return (TIFFWriteDirectoryTagData(tif, ndir, dir, tag, TIFF_RATIONAL, 1, 8,
+ &m[0]));
}
-#endif
-static int
-TIFFWriteDirectoryTagCheckedSlong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int64* value)
+static int TIFFWriteDirectoryTagCheckedRationalArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag,
+ uint32_t count,
+ float *value)
{
- assert(count<0x20000000);
- assert(sizeof(int64)==8);
- if( !(tif->tif_flags&TIFF_BIGTIFF) ) {
- TIFFErrorExt(tif->tif_clientdata,"TIFFWriteDirectoryTagCheckedSlong8Array","SLONG8 not allowed for ClassicTIFF");
- return(0);
- }
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong8((uint64*)value,count);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SLONG8,count,count*8,value));
-}
+ static const char module[] = "TIFFWriteDirectoryTagCheckedRationalArray";
+ uint32_t *m;
+ float *na;
+ uint32_t *nb;
+ uint32_t nc;
+ int o;
+ assert(sizeof(uint32_t) == 4);
+ m = _TIFFmallocExt(tif, count * 2 * sizeof(uint32_t));
+ if (m == NULL)
+ {
+ TIFFErrorExtR(tif, module, "Out of memory");
+ return (0);
+ }
+ for (na = value, nb = m, nc = 0; nc < count; na++, nb += 2, nc++)
+ {
+ DoubleToRational(*na, &nb[0], &nb[1]);
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfLong(m, count * 2);
+ o = TIFFWriteDirectoryTagData(tif, ndir, dir, tag, TIFF_RATIONAL, count,
+ count * 8, &m[0]);
+ _TIFFfreeExt(tif, m);
+ return (o);
+}
+
+static int TIFFWriteDirectoryTagCheckedSrationalArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag,
+ uint32_t count,
+ float *value)
+{
+ static const char module[] = "TIFFWriteDirectoryTagCheckedSrationalArray";
+ int32_t *m;
+ float *na;
+ int32_t *nb;
+ uint32_t nc;
+ int o;
+ assert(sizeof(int32_t) == 4);
+ m = _TIFFmallocExt(tif, count * 2 * sizeof(int32_t));
+ if (m == NULL)
+ {
+ TIFFErrorExtR(tif, module, "Out of memory");
+ return (0);
+ }
+ for (na = value, nb = m, nc = 0; nc < count; na++, nb += 2, nc++)
+ {
+ DoubleToSrational(*na, &nb[0], &nb[1]);
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfLong((uint32_t *)m, count * 2);
+ o = TIFFWriteDirectoryTagData(tif, ndir, dir, tag, TIFF_SRATIONAL, count,
+ count * 8, &m[0]);
+ _TIFFfreeExt(tif, m);
+ return (o);
+}
+
+/*-- Rational2Double: additional write functions for double arrays */
+static int
+TIFFWriteDirectoryTagCheckedRationalDoubleArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, double *value)
+{
+ static const char module[] =
+ "TIFFWriteDirectoryTagCheckedRationalDoubleArray";
+ uint32_t *m;
+ double *na;
+ uint32_t *nb;
+ uint32_t nc;
+ int o;
+ assert(sizeof(uint32_t) == 4);
+ m = _TIFFmallocExt(tif, count * 2 * sizeof(uint32_t));
+ if (m == NULL)
+ {
+ TIFFErrorExtR(tif, module, "Out of memory");
+ return (0);
+ }
+ for (na = value, nb = m, nc = 0; nc < count; na++, nb += 2, nc++)
+ {
+ DoubleToRational(*na, &nb[0], &nb[1]);
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfLong(m, count * 2);
+ o = TIFFWriteDirectoryTagData(tif, ndir, dir, tag, TIFF_RATIONAL, count,
+ count * 8, &m[0]);
+ _TIFFfreeExt(tif, m);
+ return (o);
+} /*-- TIFFWriteDirectoryTagCheckedRationalDoubleArray() ------- */
+
+static int TIFFWriteDirectoryTagCheckedSrationalDoubleArray(
+ TIFF *tif, uint32_t *ndir, TIFFDirEntry *dir, uint16_t tag, uint32_t count,
+ double *value)
+{
+ static const char module[] =
+ "TIFFWriteDirectoryTagCheckedSrationalDoubleArray";
+ int32_t *m;
+ double *na;
+ int32_t *nb;
+ uint32_t nc;
+ int o;
+ assert(sizeof(int32_t) == 4);
+ m = _TIFFmallocExt(tif, count * 2 * sizeof(int32_t));
+ if (m == NULL)
+ {
+ TIFFErrorExtR(tif, module, "Out of memory");
+ return (0);
+ }
+ for (na = value, nb = m, nc = 0; nc < count; na++, nb += 2, nc++)
+ {
+ DoubleToSrational(*na, &nb[0], &nb[1]);
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfLong((uint32_t *)m, count * 2);
+ o = TIFFWriteDirectoryTagData(tif, ndir, dir, tag, TIFF_SRATIONAL, count,
+ count * 8, &m[0]);
+ _TIFFfreeExt(tif, m);
+ return (o);
+} /*--- TIFFWriteDirectoryTagCheckedSrationalDoubleArray() -------- */
+
+/** ----- Rational2Double: Double To Rational Conversion
+----------------------------------------------------------
+* There is a mathematical theorem to convert real numbers into a rational
+(integer fraction) number.
+* This is called "continuous fraction" which uses the Euclidean algorithm to
+find the greatest common divisor (GCD).
+* (ref. e.g. https://de.wikipedia.org/wiki/Kettenbruch or
+https://en.wikipedia.org/wiki/Continued_fraction
+* https://en.wikipedia.org/wiki/Euclidean_algorithm)
+* The following functions implement the
+* - ToRationalEuclideanGCD() auxiliary function which mainly
+implements euclidean GCD
+* - DoubleToRational() conversion function for un-signed
+rationals
+* - DoubleToSrational() conversion function for signed rationals
+------------------------------------------------------------------------------------------------------------------*/
+
+/**---- ToRationalEuclideanGCD() -----------------------------------------
+* Calculates the rational fractional of a double input value
+* using the Euclidean algorithm to find the greatest common divisor (GCD)
+------------------------------------------------------------------------*/
+static void ToRationalEuclideanGCD(double value, int blnUseSignedRange,
+ int blnUseSmallRange, uint64_t *ullNum,
+ uint64_t *ullDenom)
+{
+ /* Internally, the integer variables can be bigger than the external ones,
+ * as long as the result will fit into the external variable size.
+ */
+ uint64_t numSum[3] = {0, 1, 0}, denomSum[3] = {1, 0, 0};
+ uint64_t aux, bigNum, bigDenom;
+ uint64_t returnLimit;
+ int i;
+ uint64_t nMax;
+ double fMax;
+ unsigned long maxDenom;
+ /*-- nMax and fMax defines the initial accuracy of the starting fractional,
+ * or better, the highest used integer numbers used within the starting
+ * fractional (bigNum/bigDenom). There are two approaches, which can
+ * accidentally lead to different accuracies just depending on the value.
+ * Therefore, blnUseSmallRange steers this behavior.
+ * For long long nMax = ((9223372036854775807-1)/2); for long nMax =
+ * ((2147483647-1)/2);
+ */
+ if (blnUseSmallRange)
+ {
+ nMax = (uint64_t)((2147483647 - 1) / 2); /* for ULONG range */
+ }
+ else
+ {
+ nMax = ((9223372036854775807 - 1) / 2); /* for ULLONG range */
+ }
+ fMax = (double)nMax;
+
+ /*-- For the Euclidean GCD define the denominator range, so that it stays
+ * within size of unsigned long variables. maxDenom should be LONG_MAX for
+ * negative values and ULONG_MAX for positive ones. Also the final returned
+ * value of ullNum and ullDenom is limited according to signed- or
+ * unsigned-range.
+ */
+ if (blnUseSignedRange)
+ {
+ maxDenom = 2147483647UL; /*LONG_MAX = 0x7FFFFFFFUL*/
+ returnLimit = maxDenom;
+ }
+ else
+ {
+ maxDenom = 0xFFFFFFFFUL; /*ULONG_MAX = 0xFFFFFFFFUL*/
+ returnLimit = maxDenom;
+ }
-static int
-TIFFWriteDirectoryTagCheckedRational(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
-{
- static const char module[] = "TIFFWriteDirectoryTagCheckedRational";
- uint32 m[2];
- assert(sizeof(uint32)==4);
- if( value < 0 )
+ /*-- First generate a rational fraction (bigNum/bigDenom) which represents
+ *the value as a rational number with the highest accuracy. Therefore,
+ *uint64_t (uint64_t) is needed. This rational fraction is then reduced
+ *using the Euclidean algorithm to find the greatest common divisor (GCD).
+ * bigNum = big numinator of value without fraction (or cut residual
+ *fraction) bigDenom = big denominator of value
+ *-- Break-criteria so that uint64_t cast to "bigNum" introduces no error
+ *and bigDenom has no overflow, and stop with enlargement of fraction when
+ *the double-value of it reaches an integer number without fractional part.
+ */
+ bigDenom = 1;
+ while ((value != floor(value)) && (value < fMax) && (bigDenom < nMax))
+ {
+ bigDenom <<= 1;
+ value *= 2;
+ }
+ bigNum = (uint64_t)value;
+
+ /*-- Start Euclidean algorithm to find the greatest common divisor (GCD) --
+ */
+#define MAX_ITERATIONS 64
+ for (i = 0; i < MAX_ITERATIONS; i++)
+ {
+ uint64_t val;
+ /* if bigDenom is not zero, calculate integer part of fraction. */
+ if (bigDenom == 0)
{
- TIFFErrorExt(tif->tif_clientdata,module,"Negative value is illegal");
- return 0;
+ break;
}
- else if( value != value )
+ val = bigNum / bigDenom;
+
+ /* Set bigDenom to reminder of bigNum/bigDenom and bigNum to previous
+ * denominator bigDenom. */
+ aux = bigNum;
+ bigNum = bigDenom;
+ bigDenom = aux % bigDenom;
+
+ /* calculate next denominator and check for its given maximum */
+ aux = val;
+ if (denomSum[1] * val + denomSum[0] >= maxDenom)
{
- TIFFErrorExt(tif->tif_clientdata,module,"Not-a-number value is illegal");
- return 0;
+ aux = (maxDenom - denomSum[0]) / denomSum[1];
+ if (aux * 2 >= val || denomSum[1] >= maxDenom)
+ i = (MAX_ITERATIONS +
+ 1); /* exit but execute rest of for-loop */
+ else
+ break;
}
- else if (value==0.0)
- {
- m[0]=0;
- m[1]=1;
- }
- else if (value <= 0xFFFFFFFFU && value==(double)(uint32)value)
- {
- m[0]=(uint32)value;
- m[1]=1;
- }
- else if (value<1.0)
- {
- m[0]=(uint32)(value*0xFFFFFFFF);
- m[1]=0xFFFFFFFF;
- }
- else
- {
- m[0]=0xFFFFFFFF;
- m[1]=(uint32)(0xFFFFFFFF/value);
- }
- if (tif->tif_flags&TIFF_SWAB)
- {
- TIFFSwabLong(&m[0]);
- TIFFSwabLong(&m[1]);
- }
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_RATIONAL,1,8,&m[0]));
-}
+ /* calculate next numerator to numSum2 and save previous one to numSum0;
+ * numSum1 just copy of numSum2. */
+ numSum[2] = aux * numSum[1] + numSum[0];
+ numSum[0] = numSum[1];
+ numSum[1] = numSum[2];
+ /* calculate next denominator to denomSum2 and save previous one to
+ * denomSum0; denomSum1 just copy of denomSum2. */
+ denomSum[2] = aux * denomSum[1] + denomSum[0];
+ denomSum[0] = denomSum[1];
+ denomSum[1] = denomSum[2];
+ }
-static int
-TIFFWriteDirectoryTagCheckedRationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
-{
- static const char module[] = "TIFFWriteDirectoryTagCheckedRationalArray";
- uint32* m;
- float* na;
- uint32* nb;
- uint32 nc;
- int o;
- assert(sizeof(uint32)==4);
- m=_TIFFmalloc(count*2*sizeof(uint32));
- if (m==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (na=value, nb=m, nc=0; nc<count; na++, nb+=2, nc++)
- {
- if (*na<=0.0 || *na != *na)
- {
- nb[0]=0;
- nb[1]=1;
- }
- else if (*na >= 0 && *na <= (float)0xFFFFFFFFU &&
- *na==(float)(uint32)(*na))
- {
- nb[0]=(uint32)(*na);
- nb[1]=1;
- }
- else if (*na<1.0)
- {
- nb[0]=(uint32)((double)(*na)*0xFFFFFFFF);
- nb[1]=0xFFFFFFFF;
- }
- else
- {
- nb[0]=0xFFFFFFFF;
- nb[1]=(uint32)((double)0xFFFFFFFF/(*na));
- }
- }
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong(m,count*2);
- o=TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_RATIONAL,count,count*8,&m[0]);
- _TIFFfree(m);
- return(o);
-}
+ /*-- Check and adapt for final variable size and return values; reduces
+ * internal accuracy; denominator is kept in ULONG-range with maxDenom -- */
+ while (numSum[1] > returnLimit || denomSum[1] > returnLimit)
+ {
+ numSum[1] = numSum[1] / 2;
+ denomSum[1] = denomSum[1] / 2;
+ }
-static int
-TIFFWriteDirectoryTagCheckedSrationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
-{
- static const char module[] = "TIFFWriteDirectoryTagCheckedSrationalArray";
- int32* m;
- float* na;
- int32* nb;
- uint32 nc;
- int o;
- assert(sizeof(int32)==4);
- m=_TIFFmalloc(count*2*sizeof(int32));
- if (m==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- for (na=value, nb=m, nc=0; nc<count; na++, nb+=2, nc++)
- {
- if (*na<0.0)
- {
- if (*na==(int32)(*na))
- {
- nb[0]=(int32)(*na);
- nb[1]=1;
- }
- else if (*na>-1.0)
- {
- nb[0]=-(int32)((double)(-*na)*0x7FFFFFFF);
- nb[1]=0x7FFFFFFF;
- }
- else
- {
- nb[0]=-0x7FFFFFFF;
- nb[1]=(int32)((double)0x7FFFFFFF/(-*na));
- }
- }
- else
- {
- if (*na==(int32)(*na))
- {
- nb[0]=(int32)(*na);
- nb[1]=1;
- }
- else if (*na<1.0)
- {
- nb[0]=(int32)((double)(*na)*0x7FFFFFFF);
- nb[1]=0x7FFFFFFF;
- }
- else
- {
- nb[0]=0x7FFFFFFF;
- nb[1]=(int32)((double)0x7FFFFFFF/(*na));
- }
- }
- }
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong((uint32*)m,count*2);
- o=TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SRATIONAL,count,count*8,&m[0]);
- _TIFFfree(m);
- return(o);
-}
-
-#ifdef notdef
-static int
-TIFFWriteDirectoryTagCheckedFloat(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value)
-{
- float m;
- assert(sizeof(float)==4);
- m=value;
- TIFFCvtNativeToIEEEFloat(tif,1,&m);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabFloat(&m);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_FLOAT,1,4,&m));
-}
-#endif
+ /* return values */
+ *ullNum = numSum[1];
+ *ullDenom = denomSum[1];
-static int
-TIFFWriteDirectoryTagCheckedFloatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
-{
- assert(count<0x40000000);
- assert(sizeof(float)==4);
- TIFFCvtNativeToIEEEFloat(tif,count,&value);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfFloat(value,count);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_FLOAT,count,count*4,value));
-}
+} /*-- ToRationalEuclideanGCD() -------------- */
-#ifdef notdef
-static int
-TIFFWriteDirectoryTagCheckedDouble(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
+/**---- DoubleToRational() -----------------------------------------------
+* Calculates the rational fractional of a double input value
+* for UN-SIGNED rationals,
+* using the Euclidean algorithm to find the greatest common divisor (GCD)
+------------------------------------------------------------------------*/
+static void DoubleToRational(double value, uint32_t *num, uint32_t *denom)
{
- double m;
- assert(sizeof(double)==8);
- m=value;
- TIFFCvtNativeToIEEEDouble(tif,1,&m);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabDouble(&m);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_DOUBLE,1,8,&m));
-}
-#endif
+ /*---- UN-SIGNED RATIONAL ---- */
+ double dblDiff, dblDiff2;
+ uint64_t ullNum, ullDenom, ullNum2, ullDenom2;
-static int
-TIFFWriteDirectoryTagCheckedDoubleArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value)
-{
- assert(count<0x20000000);
- assert(sizeof(double)==8);
- TIFFCvtNativeToIEEEDouble(tif,count,&value);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfDouble(value,count);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_DOUBLE,count,count*8,value));
-}
+ /*-- Check for negative values. If so it is an error. */
+ /* Test written that way to catch NaN */
+ if (!(value >= 0))
+ {
+ *num = *denom = 0;
+ TIFFErrorExt(0, "TIFFLib: DoubleToRational()",
+ " Negative Value for Unsigned Rational given.");
+ return;
+ }
-static int
-TIFFWriteDirectoryTagCheckedIfdArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value)
-{
- assert(count<0x40000000);
- assert(sizeof(uint32)==4);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong(value,count);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_IFD,count,count*4,value));
-}
+ /*-- Check for too big numbers (> ULONG_MAX) -- */
+ if (value > 0xFFFFFFFFUL)
+ {
+ *num = 0xFFFFFFFFU;
+ *denom = 0;
+ return;
+ }
+ /*-- Check for easy integer numbers -- */
+ if (value == (uint32_t)(value))
+ {
+ *num = (uint32_t)value;
+ *denom = 1;
+ return;
+ }
+ /*-- Check for too small numbers for "unsigned long" type rationals -- */
+ if (value < 1.0 / (double)0xFFFFFFFFUL)
+ {
+ *num = 0;
+ *denom = 0xFFFFFFFFU;
+ return;
+ }
-static int
-TIFFWriteDirectoryTagCheckedIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
-{
- assert(count<0x20000000);
- assert(sizeof(uint64)==8);
- assert(tif->tif_flags&TIFF_BIGTIFF);
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabArrayOfLong8(value,count);
- return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_IFD8,count,count*8,value));
-}
+ /*-- There are two approaches using the Euclidean algorithm,
+ * which can accidentally lead to different accuracies just depending on
+ * the value. Try both and define which one was better.
+ */
+ ToRationalEuclideanGCD(value, FALSE, FALSE, &ullNum, &ullDenom);
+ ToRationalEuclideanGCD(value, FALSE, TRUE, &ullNum2, &ullDenom2);
+ /*-- Double-Check, that returned values fit into ULONG :*/
+ if (ullNum > 0xFFFFFFFFUL || ullDenom > 0xFFFFFFFFUL ||
+ ullNum2 > 0xFFFFFFFFUL || ullDenom2 > 0xFFFFFFFFUL)
+ {
+ TIFFErrorExt(0, "TIFFLib: DoubleToRational()",
+ " Num or Denom exceeds ULONG: val=%14.6f, num=%12" PRIu64
+ ", denom=%12" PRIu64 " | num2=%12" PRIu64
+ ", denom2=%12" PRIu64 "",
+ value, ullNum, ullDenom, ullNum2, ullDenom2);
+ assert(0);
+ }
-static int
-TIFFWriteDirectoryTagData(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 datatype, uint32 count, uint32 datalength, void* data)
-{
- static const char module[] = "TIFFWriteDirectoryTagData";
- uint32 m;
- m=0;
- while (m<(*ndir))
- {
- assert(dir[m].tdir_tag!=tag);
- if (dir[m].tdir_tag>tag)
- break;
- m++;
- }
- if (m<(*ndir))
- {
- uint32 n;
- for (n=*ndir; n>m; n--)
- dir[n]=dir[n-1];
- }
- dir[m].tdir_tag=tag;
- dir[m].tdir_type=datatype;
- dir[m].tdir_count=count;
- dir[m].tdir_offset.toff_long8 = 0;
- if (datalength<=((tif->tif_flags&TIFF_BIGTIFF)?0x8U:0x4U))
+ /* Check, which one has higher accuracy and take that. */
+ dblDiff = fabs(value - ((double)ullNum / (double)ullDenom));
+ dblDiff2 = fabs(value - ((double)ullNum2 / (double)ullDenom2));
+ if (dblDiff < dblDiff2)
+ {
+ *num = (uint32_t)ullNum;
+ *denom = (uint32_t)ullDenom;
+ }
+ else
+ {
+ *num = (uint32_t)ullNum2;
+ *denom = (uint32_t)ullDenom2;
+ }
+} /*-- DoubleToRational() -------------- */
+
+/**---- DoubleToSrational() -----------------------------------------------
+* Calculates the rational fractional of a double input value
+* for SIGNED rationals,
+* using the Euclidean algorithm to find the greatest common divisor (GCD)
+------------------------------------------------------------------------*/
+static void DoubleToSrational(double value, int32_t *num, int32_t *denom)
+{
+ /*---- SIGNED RATIONAL ----*/
+ int neg = 1;
+ double dblDiff, dblDiff2;
+ uint64_t ullNum, ullDenom, ullNum2, ullDenom2;
+
+ /*-- Check for negative values and use then the positive one for internal
+ * calculations, but take the sign into account before returning. */
+ if (value < 0)
+ {
+ neg = -1;
+ value = -value;
+ }
+
+ /*-- Check for too big numbers (> LONG_MAX) -- */
+ if (value > 0x7FFFFFFFL)
+ {
+ *num = 0x7FFFFFFFL;
+ *denom = 0;
+ return;
+ }
+ /*-- Check for easy numbers -- */
+ if (value == (int32_t)(value))
+ {
+ *num = (int32_t)(neg * value);
+ *denom = 1;
+ return;
+ }
+ /*-- Check for too small numbers for "long" type rationals -- */
+ if (value < 1.0 / (double)0x7FFFFFFFL)
+ {
+ *num = 0;
+ *denom = 0x7FFFFFFFL;
+ return;
+ }
+
+ /*-- There are two approaches using the Euclidean algorithm,
+ * which can accidentally lead to different accuracies just depending on
+ * the value. Try both and define which one was better. Furthermore, set
+ * behavior of ToRationalEuclideanGCD() to the range of signed-long.
+ */
+ ToRationalEuclideanGCD(value, TRUE, FALSE, &ullNum, &ullDenom);
+ ToRationalEuclideanGCD(value, TRUE, TRUE, &ullNum2, &ullDenom2);
+ /*-- Double-Check, that returned values fit into LONG :*/
+ if (ullNum > 0x7FFFFFFFL || ullDenom > 0x7FFFFFFFL ||
+ ullNum2 > 0x7FFFFFFFL || ullDenom2 > 0x7FFFFFFFL)
+ {
+ TIFFErrorExt(0, "TIFFLib: DoubleToSrational()",
+ " Num or Denom exceeds LONG: val=%14.6f, num=%12" PRIu64
+ ", denom=%12" PRIu64 " | num2=%12" PRIu64
+ ", denom2=%12" PRIu64 "",
+ neg * value, ullNum, ullDenom, ullNum2, ullDenom2);
+ assert(0);
+ }
+
+ /* Check, which one has higher accuracy and take that. */
+ dblDiff = fabs(value - ((double)ullNum / (double)ullDenom));
+ dblDiff2 = fabs(value - ((double)ullNum2 / (double)ullDenom2));
+ if (dblDiff < dblDiff2)
+ {
+ *num = (int32_t)(neg * (long)ullNum);
+ *denom = (int32_t)ullDenom;
+ }
+ else
+ {
+ *num = (int32_t)(neg * (long)ullNum2);
+ *denom = (int32_t)ullDenom2;
+ }
+} /*-- DoubleToSrational() --------------*/
+
+static int TIFFWriteDirectoryTagCheckedFloatArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag, uint32_t count,
+ float *value)
+{
+ assert(count < 0x40000000);
+ assert(sizeof(float) == 4);
+ TIFFCvtNativeToIEEEFloat(tif, count, &value);
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfFloat(value, count);
+ return (TIFFWriteDirectoryTagData(tif, ndir, dir, tag, TIFF_FLOAT, count,
+ count * 4, value));
+}
+
+static int TIFFWriteDirectoryTagCheckedDoubleArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag, uint32_t count,
+ double *value)
+{
+ assert(count < 0x20000000);
+ assert(sizeof(double) == 8);
+ TIFFCvtNativeToIEEEDouble(tif, count, &value);
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfDouble(value, count);
+ return (TIFFWriteDirectoryTagData(tif, ndir, dir, tag, TIFF_DOUBLE, count,
+ count * 8, value));
+}
+
+static int TIFFWriteDirectoryTagCheckedIfdArray(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint32_t count, uint32_t *value)
+{
+ assert(count < 0x40000000);
+ assert(sizeof(uint32_t) == 4);
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfLong(value, count);
+ return (TIFFWriteDirectoryTagData(tif, ndir, dir, tag, TIFF_IFD, count,
+ count * 4, value));
+}
+
+static int TIFFWriteDirectoryTagCheckedIfd8Array(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir,
+ uint16_t tag, uint32_t count,
+ uint64_t *value)
+{
+ assert(count < 0x20000000);
+ assert(sizeof(uint64_t) == 8);
+ assert(tif->tif_flags & TIFF_BIGTIFF);
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfLong8(value, count);
+ return (TIFFWriteDirectoryTagData(tif, ndir, dir, tag, TIFF_IFD8, count,
+ count * 8, value));
+}
+
+static int TIFFWriteDirectoryTagData(TIFF *tif, uint32_t *ndir,
+ TIFFDirEntry *dir, uint16_t tag,
+ uint16_t datatype, uint32_t count,
+ uint32_t datalength, void *data)
+{
+ static const char module[] = "TIFFWriteDirectoryTagData";
+ uint32_t m;
+ m = 0;
+ while (m < (*ndir))
+ {
+ assert(dir[m].tdir_tag != tag);
+ if (dir[m].tdir_tag > tag)
+ break;
+ m++;
+ }
+ if (m < (*ndir))
+ {
+ uint32_t n;
+ for (n = *ndir; n > m; n--)
+ dir[n] = dir[n - 1];
+ }
+ dir[m].tdir_tag = tag;
+ dir[m].tdir_type = datatype;
+ dir[m].tdir_count = count;
+ dir[m].tdir_offset.toff_long8 = 0;
+ if (datalength <= ((tif->tif_flags & TIFF_BIGTIFF) ? 0x8U : 0x4U))
+ {
+ if (data && datalength)
{
- if( data && datalength )
- {
- _TIFFmemcpy(&dir[m].tdir_offset,data,datalength);
- }
+ _TIFFmemcpy(&dir[m].tdir_offset, data, datalength);
+ }
+ }
+ else
+ {
+ uint64_t na, nb;
+ na = tif->tif_dataoff;
+ nb = na + datalength;
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ nb = (uint32_t)nb;
+ if ((nb < na) || (nb < datalength))
+ {
+ TIFFErrorExtR(tif, module, "Maximum TIFF file size exceeded");
+ return (0);
+ }
+ if (!SeekOK(tif, na))
+ {
+ TIFFErrorExtR(tif, module, "IO error writing tag data");
+ return (0);
+ }
+ if (datalength >= 0x80000000UL)
+ {
+ TIFFErrorExtR(tif, module,
+ "libtiff does not allow writing more than 2147483647 "
+ "bytes in a tag");
+ return (0);
+ }
+ if (!WriteOK(tif, data, (tmsize_t)datalength))
+ {
+ TIFFErrorExtR(tif, module, "IO error writing tag data");
+ return (0);
+ }
+ tif->tif_dataoff = nb;
+ if (tif->tif_dataoff & 1)
+ tif->tif_dataoff++;
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ uint32_t o;
+ o = (uint32_t)na;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&o);
+ _TIFFmemcpy(&dir[m].tdir_offset, &o, 4);
+ }
+ else
+ {
+ dir[m].tdir_offset.toff_long8 = na;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(&dir[m].tdir_offset.toff_long8);
}
- else
- {
- uint64 na,nb;
- na=tif->tif_dataoff;
- nb=na+datalength;
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- nb=(uint32)nb;
- if ((nb<na)||(nb<datalength))
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Maximum TIFF file size exceeded");
- return(0);
- }
- if (!SeekOK(tif,na))
- {
- TIFFErrorExt(tif->tif_clientdata,module,"IO error writing tag data");
- return(0);
- }
- assert(datalength<0x80000000UL);
- if (!WriteOK(tif,data,(tmsize_t)datalength))
- {
- TIFFErrorExt(tif->tif_clientdata,module,"IO error writing tag data");
- return(0);
- }
- tif->tif_dataoff=nb;
- if (tif->tif_dataoff&1)
- tif->tif_dataoff++;
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- uint32 o;
- o=(uint32)na;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong(&o);
- _TIFFmemcpy(&dir[m].tdir_offset,&o,4);
- }
- else
- {
- dir[m].tdir_offset.toff_long8 = na;
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8(&dir[m].tdir_offset.toff_long8);
- }
- }
- (*ndir)++;
- return(1);
+ }
+ (*ndir)++;
+ return (1);
}
/*
* Link the current directory into the directory chain for the file.
*/
-static int
-TIFFLinkDirectory(TIFF* tif)
-{
- static const char module[] = "TIFFLinkDirectory";
-
- tif->tif_diroff = (TIFFSeekFile(tif,0,SEEK_END)+1) & (~((toff_t)1));
-
- /*
- * Handle SubIFDs
- */
- if (tif->tif_flags & TIFF_INSUBIFD)
- {
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- uint32 m;
- m = (uint32)tif->tif_diroff;
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong(&m);
- (void) TIFFSeekFile(tif, tif->tif_subifdoff, SEEK_SET);
- if (!WriteOK(tif, &m, 4)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error writing SubIFD directory link");
- return (0);
- }
- /*
- * Advance to the next SubIFD or, if this is
- * the last one configured, revert back to the
- * normal directory linkage.
- */
- if (--tif->tif_nsubifd)
- tif->tif_subifdoff += 4;
- else
- tif->tif_flags &= ~TIFF_INSUBIFD;
- return (1);
- }
- else
- {
- uint64 m;
- m = tif->tif_diroff;
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong8(&m);
- (void) TIFFSeekFile(tif, tif->tif_subifdoff, SEEK_SET);
- if (!WriteOK(tif, &m, 8)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error writing SubIFD directory link");
- return (0);
- }
- /*
- * Advance to the next SubIFD or, if this is
- * the last one configured, revert back to the
- * normal directory linkage.
- */
- if (--tif->tif_nsubifd)
- tif->tif_subifdoff += 8;
- else
- tif->tif_flags &= ~TIFF_INSUBIFD;
- return (1);
- }
- }
-
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- uint32 m;
- uint32 nextdir;
- m = (uint32)(tif->tif_diroff);
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong(&m);
- if (tif->tif_header.classic.tiff_diroff == 0) {
- /*
- * First directory, overwrite offset in header.
- */
- tif->tif_header.classic.tiff_diroff = (uint32) tif->tif_diroff;
- (void) TIFFSeekFile(tif,4, SEEK_SET);
- if (!WriteOK(tif, &m, 4)) {
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "Error writing TIFF header");
- return (0);
- }
- return (1);
- }
- /*
- * Not the first directory, search to the last and append.
- */
- nextdir = tif->tif_header.classic.tiff_diroff;
- while(1) {
- uint16 dircount;
- uint32 nextnextdir;
-
- if (!SeekOK(tif, nextdir) ||
- !ReadOK(tif, &dircount, 2)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error fetching directory count");
- return (0);
- }
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabShort(&dircount);
- (void) TIFFSeekFile(tif,
- nextdir+2+dircount*12, SEEK_SET);
- if (!ReadOK(tif, &nextnextdir, 4)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error fetching directory link");
- return (0);
- }
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong(&nextnextdir);
- if (nextnextdir==0)
- {
- (void) TIFFSeekFile(tif,
- nextdir+2+dircount*12, SEEK_SET);
- if (!WriteOK(tif, &m, 4)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error writing directory link");
- return (0);
- }
- break;
- }
- nextdir=nextnextdir;
- }
- }
- else
- {
- uint64 m;
- uint64 nextdir;
- m = tif->tif_diroff;
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong8(&m);
- if (tif->tif_header.big.tiff_diroff == 0) {
- /*
- * First directory, overwrite offset in header.
- */
- tif->tif_header.big.tiff_diroff = tif->tif_diroff;
- (void) TIFFSeekFile(tif,8, SEEK_SET);
- if (!WriteOK(tif, &m, 8)) {
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "Error writing TIFF header");
- return (0);
- }
- return (1);
- }
- /*
- * Not the first directory, search to the last and append.
- */
- nextdir = tif->tif_header.big.tiff_diroff;
- while(1) {
- uint64 dircount64;
- uint16 dircount;
- uint64 nextnextdir;
-
- if (!SeekOK(tif, nextdir) ||
- !ReadOK(tif, &dircount64, 8)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error fetching directory count");
- return (0);
- }
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong8(&dircount64);
- if (dircount64>0xFFFF)
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Sanity check on tag count failed, likely corrupt TIFF");
- return (0);
- }
- dircount=(uint16)dircount64;
- (void) TIFFSeekFile(tif,
- nextdir+8+dircount*20, SEEK_SET);
- if (!ReadOK(tif, &nextnextdir, 8)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error fetching directory link");
- return (0);
- }
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong8(&nextnextdir);
- if (nextnextdir==0)
- {
- (void) TIFFSeekFile(tif,
- nextdir+8+dircount*20, SEEK_SET);
- if (!WriteOK(tif, &m, 8)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error writing directory link");
- return (0);
- }
- break;
- }
- nextdir=nextnextdir;
- }
- }
- return (1);
+static int TIFFLinkDirectory(TIFF *tif)
+{
+ static const char module[] = "TIFFLinkDirectory";
+
+ tif->tif_diroff = (TIFFSeekFile(tif, 0, SEEK_END) + 1) & (~((toff_t)1));
+
+ /*
+ * Handle SubIFDs
+ */
+ if (tif->tif_flags & TIFF_INSUBIFD)
+ {
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ uint32_t m;
+ m = (uint32_t)tif->tif_diroff;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&m);
+ (void)TIFFSeekFile(tif, tif->tif_subifdoff, SEEK_SET);
+ if (!WriteOK(tif, &m, 4))
+ {
+ TIFFErrorExtR(tif, module,
+ "Error writing SubIFD directory link");
+ return (0);
+ }
+ /*
+ * Advance to the next SubIFD or, if this is
+ * the last one configured, revert back to the
+ * normal directory linkage.
+ */
+ if (--tif->tif_nsubifd)
+ tif->tif_subifdoff += 4;
+ else
+ tif->tif_flags &= ~TIFF_INSUBIFD;
+ return (1);
+ }
+ else
+ {
+ uint64_t m;
+ m = tif->tif_diroff;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(&m);
+ (void)TIFFSeekFile(tif, tif->tif_subifdoff, SEEK_SET);
+ if (!WriteOK(tif, &m, 8))
+ {
+ TIFFErrorExtR(tif, module,
+ "Error writing SubIFD directory link");
+ return (0);
+ }
+ /*
+ * Advance to the next SubIFD or, if this is
+ * the last one configured, revert back to the
+ * normal directory linkage.
+ */
+ if (--tif->tif_nsubifd)
+ tif->tif_subifdoff += 8;
+ else
+ tif->tif_flags &= ~TIFF_INSUBIFD;
+ return (1);
+ }
+ }
+
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ uint32_t m;
+ uint32_t nextdir;
+ m = (uint32_t)(tif->tif_diroff);
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&m);
+ if (tif->tif_header.classic.tiff_diroff == 0)
+ {
+ /*
+ * First directory, overwrite offset in header.
+ */
+ tif->tif_header.classic.tiff_diroff = (uint32_t)tif->tif_diroff;
+ tif->tif_lastdiroff = tif->tif_diroff;
+ (void)TIFFSeekFile(tif, 4, SEEK_SET);
+ if (!WriteOK(tif, &m, 4))
+ {
+ TIFFErrorExtR(tif, tif->tif_name, "Error writing TIFF header");
+ return (0);
+ }
+ return (1);
+ }
+ /*
+ * Not the first directory, search to the last and append.
+ */
+ if (tif->tif_lastdiroff != 0)
+ {
+ nextdir = (uint32_t)tif->tif_lastdiroff;
+ }
+ else
+ {
+ nextdir = tif->tif_header.classic.tiff_diroff;
+ }
+
+ while (1)
+ {
+ uint16_t dircount;
+ uint32_t nextnextdir;
+
+ if (!SeekOK(tif, nextdir) || !ReadOK(tif, &dircount, 2))
+ {
+ TIFFErrorExtR(tif, module, "Error fetching directory count");
+ return (0);
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(&dircount);
+ (void)TIFFSeekFile(tif, nextdir + 2 + dircount * 12, SEEK_SET);
+ if (!ReadOK(tif, &nextnextdir, 4))
+ {
+ TIFFErrorExtR(tif, module, "Error fetching directory link");
+ return (0);
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&nextnextdir);
+ if (nextnextdir == 0)
+ {
+ (void)TIFFSeekFile(tif, nextdir + 2 + dircount * 12, SEEK_SET);
+ if (!WriteOK(tif, &m, 4))
+ {
+ TIFFErrorExtR(tif, module, "Error writing directory link");
+ return (0);
+ }
+ tif->tif_lastdiroff = tif->tif_diroff;
+ break;
+ }
+ nextdir = nextnextdir;
+ }
+ }
+ else
+ {
+ uint64_t m;
+ uint64_t nextdir;
+ m = tif->tif_diroff;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(&m);
+ if (tif->tif_header.big.tiff_diroff == 0)
+ {
+ /*
+ * First directory, overwrite offset in header.
+ */
+ tif->tif_header.big.tiff_diroff = tif->tif_diroff;
+ tif->tif_lastdiroff = tif->tif_diroff;
+ (void)TIFFSeekFile(tif, 8, SEEK_SET);
+ if (!WriteOK(tif, &m, 8))
+ {
+ TIFFErrorExtR(tif, tif->tif_name, "Error writing TIFF header");
+ return (0);
+ }
+ return (1);
+ }
+ /*
+ * Not the first directory, search to the last and append.
+ */
+ if (tif->tif_lastdiroff != 0)
+ {
+ nextdir = tif->tif_lastdiroff;
+ }
+ else
+ {
+ nextdir = tif->tif_header.big.tiff_diroff;
+ }
+ while (1)
+ {
+ uint64_t dircount64;
+ uint16_t dircount;
+ uint64_t nextnextdir;
+
+ if (!SeekOK(tif, nextdir) || !ReadOK(tif, &dircount64, 8))
+ {
+ TIFFErrorExtR(tif, module, "Error fetching directory count");
+ return (0);
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(&dircount64);
+ if (dircount64 > 0xFFFF)
+ {
+ TIFFErrorExtR(
+ tif, module,
+ "Sanity check on tag count failed, likely corrupt TIFF");
+ return (0);
+ }
+ dircount = (uint16_t)dircount64;
+ (void)TIFFSeekFile(tif, nextdir + 8 + dircount * 20, SEEK_SET);
+ if (!ReadOK(tif, &nextnextdir, 8))
+ {
+ TIFFErrorExtR(tif, module, "Error fetching directory link");
+ return (0);
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(&nextnextdir);
+ if (nextnextdir == 0)
+ {
+ (void)TIFFSeekFile(tif, nextdir + 8 + dircount * 20, SEEK_SET);
+ if (!WriteOK(tif, &m, 8))
+ {
+ TIFFErrorExtR(tif, module, "Error writing directory link");
+ return (0);
+ }
+ tif->tif_lastdiroff = tif->tif_diroff;
+ break;
+ }
+ nextdir = nextnextdir;
+ }
+ }
+ return (1);
}
/************************************************************************/
@@ -2819,183 +3153,186 @@ TIFFLinkDirectory(TIFF* tif)
/* Returns zero on failure, and one on success. */
/************************************************************************/
-int
-_TIFFRewriteField(TIFF* tif, uint16 tag, TIFFDataType in_datatype,
- tmsize_t count, void* data)
+int _TIFFRewriteField(TIFF *tif, uint16_t tag, TIFFDataType in_datatype,
+ tmsize_t count, void *data)
{
static const char module[] = "TIFFResetField";
/* const TIFFField* fip = NULL; */
- uint16 dircount;
+ uint16_t dircount;
tmsize_t dirsize;
- uint8 direntry_raw[20];
- uint16 entry_tag = 0;
- uint16 entry_type = 0;
- uint64 entry_count = 0;
- uint64 entry_offset = 0;
- int value_in_entry = 0;
- uint64 read_offset;
- uint8 *buf_to_write = NULL;
+ uint8_t direntry_raw[20];
+ uint16_t entry_tag = 0;
+ uint16_t entry_type = 0;
+ uint64_t entry_count = 0;
+ uint64_t entry_offset = 0;
+ int value_in_entry = 0;
+ uint64_t read_offset;
+ uint8_t *buf_to_write = NULL;
TIFFDataType datatype;
-/* -------------------------------------------------------------------- */
-/* Find field definition. */
-/* -------------------------------------------------------------------- */
- /*fip =*/ TIFFFindField(tif, tag, TIFF_ANY);
+ /* -------------------------------------------------------------------- */
+ /* Find field definition. */
+ /* -------------------------------------------------------------------- */
+ /*fip =*/TIFFFindField(tif, tag, TIFF_ANY);
-/* -------------------------------------------------------------------- */
-/* Do some checking this is a straight forward case. */
-/* -------------------------------------------------------------------- */
- if( isMapped(tif) )
+ /* -------------------------------------------------------------------- */
+ /* Do some checking this is a straight forward case. */
+ /* -------------------------------------------------------------------- */
+ if (isMapped(tif))
{
- TIFFErrorExt( tif->tif_clientdata, module,
- "Memory mapped files not currently supported for this operation." );
+ TIFFErrorExtR(
+ tif, module,
+ "Memory mapped files not currently supported for this operation.");
return 0;
}
- if( tif->tif_diroff == 0 )
+ if (tif->tif_diroff == 0)
{
- TIFFErrorExt( tif->tif_clientdata, module,
- "Attempt to reset field on directory not already on disk." );
+ TIFFErrorExtR(
+ tif, module,
+ "Attempt to reset field on directory not already on disk.");
return 0;
}
-/* -------------------------------------------------------------------- */
-/* Read the directory entry count. */
-/* -------------------------------------------------------------------- */
- if (!SeekOK(tif, tif->tif_diroff)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Seek error accessing TIFF directory",
- tif->tif_name);
+ /* -------------------------------------------------------------------- */
+ /* Read the directory entry count. */
+ /* -------------------------------------------------------------------- */
+ if (!SeekOK(tif, tif->tif_diroff))
+ {
+ TIFFErrorExtR(tif, module, "%s: Seek error accessing TIFF directory",
+ tif->tif_name);
return 0;
}
read_offset = tif->tif_diroff;
- if (!(tif->tif_flags&TIFF_BIGTIFF))
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
{
- if (!ReadOK(tif, &dircount, sizeof (uint16))) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Can not read TIFF directory count",
- tif->tif_name);
+ if (!ReadOK(tif, &dircount, sizeof(uint16_t)))
+ {
+ TIFFErrorExtR(tif, module, "%s: Can not read TIFF directory count",
+ tif->tif_name);
return 0;
}
if (tif->tif_flags & TIFF_SWAB)
TIFFSwabShort(&dircount);
dirsize = 12;
read_offset += 2;
- } else {
- uint64 dircount64;
- if (!ReadOK(tif, &dircount64, sizeof (uint64))) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Can not read TIFF directory count",
- tif->tif_name);
+ }
+ else
+ {
+ uint64_t dircount64;
+ if (!ReadOK(tif, &dircount64, sizeof(uint64_t)))
+ {
+ TIFFErrorExtR(tif, module, "%s: Can not read TIFF directory count",
+ tif->tif_name);
return 0;
}
if (tif->tif_flags & TIFF_SWAB)
TIFFSwabLong8(&dircount64);
- dircount = (uint16)dircount64;
+ dircount = (uint16_t)dircount64;
dirsize = 20;
read_offset += 8;
}
-/* -------------------------------------------------------------------- */
-/* Read through directory to find target tag. */
-/* -------------------------------------------------------------------- */
- while( dircount > 0 )
+ /* -------------------------------------------------------------------- */
+ /* Read through directory to find target tag. */
+ /* -------------------------------------------------------------------- */
+ while (dircount > 0)
{
- if (!ReadOK(tif, direntry_raw, dirsize)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Can not read TIFF directory entry.",
- tif->tif_name);
+ if (!ReadOK(tif, direntry_raw, dirsize))
+ {
+ TIFFErrorExtR(tif, module, "%s: Can not read TIFF directory entry.",
+ tif->tif_name);
return 0;
}
- memcpy( &entry_tag, direntry_raw + 0, sizeof(uint16) );
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort( &entry_tag );
+ memcpy(&entry_tag, direntry_raw + 0, sizeof(uint16_t));
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(&entry_tag);
- if( entry_tag == tag )
+ if (entry_tag == tag)
break;
read_offset += dirsize;
}
- if( entry_tag != tag )
+ if (entry_tag != tag)
{
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Could not find tag %d.",
- tif->tif_name, tag );
+ TIFFErrorExtR(tif, module, "%s: Could not find tag %" PRIu16 ".",
+ tif->tif_name, tag);
return 0;
}
-/* -------------------------------------------------------------------- */
-/* Extract the type, count and offset for this entry. */
-/* -------------------------------------------------------------------- */
- memcpy( &entry_type, direntry_raw + 2, sizeof(uint16) );
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort( &entry_type );
+ /* -------------------------------------------------------------------- */
+ /* Extract the type, count and offset for this entry. */
+ /* -------------------------------------------------------------------- */
+ memcpy(&entry_type, direntry_raw + 2, sizeof(uint16_t));
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(&entry_type);
- if (!(tif->tif_flags&TIFF_BIGTIFF))
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
{
- uint32 value;
-
- memcpy( &value, direntry_raw + 4, sizeof(uint32) );
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong( &value );
+ uint32_t value;
+
+ memcpy(&value, direntry_raw + 4, sizeof(uint32_t));
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&value);
entry_count = value;
- memcpy( &value, direntry_raw + 8, sizeof(uint32) );
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong( &value );
+ memcpy(&value, direntry_raw + 8, sizeof(uint32_t));
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&value);
entry_offset = value;
}
else
{
- memcpy( &entry_count, direntry_raw + 4, sizeof(uint64) );
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8( &entry_count );
+ memcpy(&entry_count, direntry_raw + 4, sizeof(uint64_t));
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(&entry_count);
- memcpy( &entry_offset, direntry_raw + 12, sizeof(uint64) );
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8( &entry_offset );
+ memcpy(&entry_offset, direntry_raw + 12, sizeof(uint64_t));
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8(&entry_offset);
}
-/* -------------------------------------------------------------------- */
-/* When a dummy tag was written due to TIFFDeferStrileArrayWriting() */
-/* -------------------------------------------------------------------- */
- if( entry_offset == 0 && entry_count == 0 && entry_type == 0 )
+ /* -------------------------------------------------------------------- */
+ /* When a dummy tag was written due to TIFFDeferStrileArrayWriting() */
+ /* -------------------------------------------------------------------- */
+ if (entry_offset == 0 && entry_count == 0 && entry_type == 0)
{
- if( tag == TIFFTAG_TILEOFFSETS || tag == TIFFTAG_STRIPOFFSETS )
+ if (tag == TIFFTAG_TILEOFFSETS || tag == TIFFTAG_STRIPOFFSETS)
{
- entry_type = (tif->tif_flags&TIFF_BIGTIFF) ? TIFF_LONG8 : TIFF_LONG;
+ entry_type =
+ (tif->tif_flags & TIFF_BIGTIFF) ? TIFF_LONG8 : TIFF_LONG;
}
else
{
int write_aslong8 = 1;
- if( count > 1 && tag == TIFFTAG_STRIPBYTECOUNTS )
+ if (count > 1 && tag == TIFFTAG_STRIPBYTECOUNTS)
{
write_aslong8 = WriteAsLong8(tif, TIFFStripSize64(tif));
}
- else if( count > 1 && tag == TIFFTAG_TILEBYTECOUNTS )
+ else if (count > 1 && tag == TIFFTAG_TILEBYTECOUNTS)
{
write_aslong8 = WriteAsLong8(tif, TIFFTileSize64(tif));
}
- if( write_aslong8 )
+ if (write_aslong8)
{
entry_type = TIFF_LONG8;
}
else
{
int write_aslong4 = 1;
- if( count > 1 && tag == TIFFTAG_STRIPBYTECOUNTS )
+ if (count > 1 && tag == TIFFTAG_STRIPBYTECOUNTS)
{
write_aslong4 = WriteAsLong4(tif, TIFFStripSize64(tif));
}
- else if( count > 1 && tag == TIFFTAG_TILEBYTECOUNTS )
+ else if (count > 1 && tag == TIFFTAG_TILEBYTECOUNTS)
{
write_aslong4 = WriteAsLong4(tif, TIFFTileSize64(tif));
}
- if( write_aslong4 )
+ if (write_aslong4)
{
entry_type = TIFF_LONG;
}
@@ -3007,123 +3344,120 @@ _TIFFRewriteField(TIFF* tif, uint16 tag, TIFFDataType in_datatype,
}
}
-/* -------------------------------------------------------------------- */
-/* What data type do we want to write this as? */
-/* -------------------------------------------------------------------- */
- if( TIFFDataWidth(in_datatype) == 8 && !(tif->tif_flags&TIFF_BIGTIFF) )
+ /* -------------------------------------------------------------------- */
+ /* What data type do we want to write this as? */
+ /* -------------------------------------------------------------------- */
+ if (TIFFDataWidth(in_datatype) == 8 && !(tif->tif_flags & TIFF_BIGTIFF))
{
- if( in_datatype == TIFF_LONG8 )
+ if (in_datatype == TIFF_LONG8)
datatype = entry_type == TIFF_SHORT ? TIFF_SHORT : TIFF_LONG;
- else if( in_datatype == TIFF_SLONG8 )
+ else if (in_datatype == TIFF_SLONG8)
datatype = TIFF_SLONG;
- else if( in_datatype == TIFF_IFD8 )
+ else if (in_datatype == TIFF_IFD8)
datatype = TIFF_IFD;
else
datatype = in_datatype;
}
else
{
- if( in_datatype == TIFF_LONG8 &&
+ if (in_datatype == TIFF_LONG8 &&
(entry_type == TIFF_SHORT || entry_type == TIFF_LONG ||
- entry_type == TIFF_LONG8 ) )
+ entry_type == TIFF_LONG8))
datatype = entry_type;
- else if( in_datatype == TIFF_SLONG8 &&
- (entry_type == TIFF_SLONG || entry_type == TIFF_SLONG8 ) )
+ else if (in_datatype == TIFF_SLONG8 &&
+ (entry_type == TIFF_SLONG || entry_type == TIFF_SLONG8))
datatype = entry_type;
- else if( in_datatype == TIFF_IFD8 &&
- (entry_type == TIFF_IFD || entry_type == TIFF_IFD8 ) )
+ else if (in_datatype == TIFF_IFD8 &&
+ (entry_type == TIFF_IFD || entry_type == TIFF_IFD8))
datatype = entry_type;
else
datatype = in_datatype;
}
-/* -------------------------------------------------------------------- */
-/* Prepare buffer of actual data to write. This includes */
-/* swabbing as needed. */
-/* -------------------------------------------------------------------- */
- buf_to_write =
- (uint8 *)_TIFFCheckMalloc(tif, count, TIFFDataWidth(datatype),
- "for field buffer.");
+ /* -------------------------------------------------------------------- */
+ /* Prepare buffer of actual data to write. This includes */
+ /* swabbing as needed. */
+ /* -------------------------------------------------------------------- */
+ buf_to_write = (uint8_t *)_TIFFCheckMalloc(
+ tif, count, TIFFDataWidth(datatype), "for field buffer.");
if (!buf_to_write)
return 0;
- if( datatype == in_datatype )
- memcpy( buf_to_write, data, count * TIFFDataWidth(datatype) );
- else if( datatype == TIFF_SLONG && in_datatype == TIFF_SLONG8 )
+ if (datatype == in_datatype)
+ memcpy(buf_to_write, data, count * TIFFDataWidth(datatype));
+ else if (datatype == TIFF_SLONG && in_datatype == TIFF_SLONG8)
{
- tmsize_t i;
+ tmsize_t i;
- for( i = 0; i < count; i++ )
+ for (i = 0; i < count; i++)
{
- ((int32 *) buf_to_write)[i] =
- (int32) ((int64 *) data)[i];
- if( (int64) ((int32 *) buf_to_write)[i] != ((int64 *) data)[i] )
+ ((int32_t *)buf_to_write)[i] = (int32_t)((int64_t *)data)[i];
+ if ((int64_t)((int32_t *)buf_to_write)[i] != ((int64_t *)data)[i])
{
- _TIFFfree( buf_to_write );
- TIFFErrorExt( tif->tif_clientdata, module,
- "Value exceeds 32bit range of output type." );
+ _TIFFfreeExt(tif, buf_to_write);
+ TIFFErrorExtR(tif, module,
+ "Value exceeds 32bit range of output type.");
return 0;
}
}
}
- else if( (datatype == TIFF_LONG && in_datatype == TIFF_LONG8)
- || (datatype == TIFF_IFD && in_datatype == TIFF_IFD8) )
+ else if ((datatype == TIFF_LONG && in_datatype == TIFF_LONG8) ||
+ (datatype == TIFF_IFD && in_datatype == TIFF_IFD8))
{
- tmsize_t i;
+ tmsize_t i;
- for( i = 0; i < count; i++ )
+ for (i = 0; i < count; i++)
{
- ((uint32 *) buf_to_write)[i] =
- (uint32) ((uint64 *) data)[i];
- if( (uint64) ((uint32 *) buf_to_write)[i] != ((uint64 *) data)[i] )
+ ((uint32_t *)buf_to_write)[i] = (uint32_t)((uint64_t *)data)[i];
+ if ((uint64_t)((uint32_t *)buf_to_write)[i] !=
+ ((uint64_t *)data)[i])
{
- _TIFFfree( buf_to_write );
- TIFFErrorExt( tif->tif_clientdata, module,
- "Value exceeds 32bit range of output type." );
+ _TIFFfreeExt(tif, buf_to_write);
+ TIFFErrorExtR(tif, module,
+ "Value exceeds 32bit range of output type.");
return 0;
}
}
}
- else if( datatype == TIFF_SHORT && in_datatype == TIFF_LONG8 )
+ else if (datatype == TIFF_SHORT && in_datatype == TIFF_LONG8)
{
- tmsize_t i;
+ tmsize_t i;
- for( i = 0; i < count; i++ )
+ for (i = 0; i < count; i++)
{
- ((uint16 *) buf_to_write)[i] =
- (uint16) ((uint64 *) data)[i];
- if( (uint64) ((uint16 *) buf_to_write)[i] != ((uint64 *) data)[i] )
+ ((uint16_t *)buf_to_write)[i] = (uint16_t)((uint64_t *)data)[i];
+ if ((uint64_t)((uint16_t *)buf_to_write)[i] !=
+ ((uint64_t *)data)[i])
{
- _TIFFfree( buf_to_write );
- TIFFErrorExt( tif->tif_clientdata, module,
- "Value exceeds 16bit range of output type." );
+ _TIFFfreeExt(tif, buf_to_write);
+ TIFFErrorExtR(tif, module,
+ "Value exceeds 16bit range of output type.");
return 0;
}
}
}
else
{
- TIFFErrorExt( tif->tif_clientdata, module,
- "Unhandled type conversion." );
+ TIFFErrorExtR(tif, module, "Unhandled type conversion.");
return 0;
}
- if( TIFFDataWidth(datatype) > 1 && (tif->tif_flags&TIFF_SWAB) )
+ if (TIFFDataWidth(datatype) > 1 && (tif->tif_flags & TIFF_SWAB))
{
- if( TIFFDataWidth(datatype) == 2 )
- TIFFSwabArrayOfShort( (uint16 *) buf_to_write, count );
- else if( TIFFDataWidth(datatype) == 4 )
- TIFFSwabArrayOfLong( (uint32 *) buf_to_write, count );
- else if( TIFFDataWidth(datatype) == 8 )
- TIFFSwabArrayOfLong8( (uint64 *) buf_to_write, count );
+ if (TIFFDataWidth(datatype) == 2)
+ TIFFSwabArrayOfShort((uint16_t *)buf_to_write, count);
+ else if (TIFFDataWidth(datatype) == 4)
+ TIFFSwabArrayOfLong((uint32_t *)buf_to_write, count);
+ else if (TIFFDataWidth(datatype) == 8)
+ TIFFSwabArrayOfLong8((uint64_t *)buf_to_write, count);
}
-/* -------------------------------------------------------------------- */
-/* Is this a value that fits into the directory entry? */
-/* -------------------------------------------------------------------- */
- if (!(tif->tif_flags&TIFF_BIGTIFF))
+ /* -------------------------------------------------------------------- */
+ /* Is this a value that fits into the directory entry? */
+ /* -------------------------------------------------------------------- */
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
{
- if( TIFFDataWidth(datatype) * count <= 4 )
+ if (TIFFDataWidth(datatype) * count <= 4)
{
entry_offset = read_offset + 8;
value_in_entry = 1;
@@ -3131,136 +3465,139 @@ _TIFFRewriteField(TIFF* tif, uint16 tag, TIFFDataType in_datatype,
}
else
{
- if( TIFFDataWidth(datatype) * count <= 8 )
+ if (TIFFDataWidth(datatype) * count <= 8)
{
entry_offset = read_offset + 12;
value_in_entry = 1;
}
}
- if( (tag == TIFFTAG_TILEOFFSETS || tag == TIFFTAG_STRIPOFFSETS) &&
+ if ((tag == TIFFTAG_TILEOFFSETS || tag == TIFFTAG_STRIPOFFSETS) &&
tif->tif_dir.td_stripoffset_entry.tdir_count == 0 &&
tif->tif_dir.td_stripoffset_entry.tdir_type == 0 &&
- tif->tif_dir.td_stripoffset_entry.tdir_offset.toff_long8 == 0 )
+ tif->tif_dir.td_stripoffset_entry.tdir_offset.toff_long8 == 0)
{
tif->tif_dir.td_stripoffset_entry.tdir_type = datatype;
tif->tif_dir.td_stripoffset_entry.tdir_count = count;
}
- else if( (tag == TIFFTAG_TILEBYTECOUNTS || tag == TIFFTAG_STRIPBYTECOUNTS) &&
- tif->tif_dir.td_stripbytecount_entry.tdir_count == 0 &&
- tif->tif_dir.td_stripbytecount_entry.tdir_type == 0 &&
- tif->tif_dir.td_stripbytecount_entry.tdir_offset.toff_long8 == 0 )
+ else if ((tag == TIFFTAG_TILEBYTECOUNTS ||
+ tag == TIFFTAG_STRIPBYTECOUNTS) &&
+ tif->tif_dir.td_stripbytecount_entry.tdir_count == 0 &&
+ tif->tif_dir.td_stripbytecount_entry.tdir_type == 0 &&
+ tif->tif_dir.td_stripbytecount_entry.tdir_offset.toff_long8 == 0)
{
tif->tif_dir.td_stripbytecount_entry.tdir_type = datatype;
tif->tif_dir.td_stripbytecount_entry.tdir_count = count;
}
-/* -------------------------------------------------------------------- */
-/* If the tag type, and count match, then we just write it out */
-/* over the old values without altering the directory entry at */
-/* all. */
-/* -------------------------------------------------------------------- */
- if( entry_count == (uint64)count && entry_type == (uint16) datatype )
+ /* -------------------------------------------------------------------- */
+ /* If the tag type, and count match, then we just write it out */
+ /* over the old values without altering the directory entry at */
+ /* all. */
+ /* -------------------------------------------------------------------- */
+ if (entry_count == (uint64_t)count && entry_type == (uint16_t)datatype)
{
- if (!SeekOK(tif, entry_offset)) {
- _TIFFfree( buf_to_write );
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Seek error accessing TIFF directory",
- tif->tif_name);
+ if (!SeekOK(tif, entry_offset))
+ {
+ _TIFFfreeExt(tif, buf_to_write);
+ TIFFErrorExtR(tif, module,
+ "%s: Seek error accessing TIFF directory",
+ tif->tif_name);
return 0;
}
- if (!WriteOK(tif, buf_to_write, count*TIFFDataWidth(datatype))) {
- _TIFFfree( buf_to_write );
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error writing directory link");
+ if (!WriteOK(tif, buf_to_write, count * TIFFDataWidth(datatype)))
+ {
+ _TIFFfreeExt(tif, buf_to_write);
+ TIFFErrorExtR(tif, module, "Error writing directory link");
return (0);
}
- _TIFFfree( buf_to_write );
+ _TIFFfreeExt(tif, buf_to_write);
return 1;
}
-/* -------------------------------------------------------------------- */
-/* Otherwise, we write the new tag data at the end of the file. */
-/* -------------------------------------------------------------------- */
- if( !value_in_entry )
+ /* -------------------------------------------------------------------- */
+ /* Otherwise, we write the new tag data at the end of the file. */
+ /* -------------------------------------------------------------------- */
+ if (!value_in_entry)
{
- entry_offset = TIFFSeekFile(tif,0,SEEK_END);
-
- if (!WriteOK(tif, buf_to_write, count*TIFFDataWidth(datatype))) {
- _TIFFfree( buf_to_write );
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error writing directory link");
+ entry_offset = TIFFSeekFile(tif, 0, SEEK_END);
+
+ if (!WriteOK(tif, buf_to_write, count * TIFFDataWidth(datatype)))
+ {
+ _TIFFfreeExt(tif, buf_to_write);
+ TIFFErrorExtR(tif, module, "Error writing directory link");
return (0);
}
}
else
{
- memcpy( &entry_offset, buf_to_write, count*TIFFDataWidth(datatype));
+ if (count * TIFFDataWidth(datatype) == 4)
+ {
+ uint32_t value;
+ memcpy(&value, buf_to_write, count * TIFFDataWidth(datatype));
+ entry_offset = value;
+ }
+ else
+ {
+ memcpy(&entry_offset, buf_to_write,
+ count * TIFFDataWidth(datatype));
+ }
}
- _TIFFfree( buf_to_write );
+ _TIFFfreeExt(tif, buf_to_write);
buf_to_write = 0;
-/* -------------------------------------------------------------------- */
-/* Adjust the directory entry. */
-/* -------------------------------------------------------------------- */
+ /* -------------------------------------------------------------------- */
+ /* Adjust the directory entry. */
+ /* -------------------------------------------------------------------- */
entry_type = datatype;
- entry_count = (uint64)count;
- memcpy( direntry_raw + 2, &entry_type, sizeof(uint16) );
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabShort( (uint16 *) (direntry_raw + 2) );
+ entry_count = (uint64_t)count;
+ memcpy(direntry_raw + 2, &entry_type, sizeof(uint16_t));
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort((uint16_t *)(direntry_raw + 2));
- if (!(tif->tif_flags&TIFF_BIGTIFF))
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
{
- uint32 value;
+ uint32_t value;
- value = (uint32) entry_count;
- memcpy( direntry_raw + 4, &value, sizeof(uint32) );
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong( (uint32 *) (direntry_raw + 4) );
+ value = (uint32_t)entry_count;
+ memcpy(direntry_raw + 4, &value, sizeof(uint32_t));
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong((uint32_t *)(direntry_raw + 4));
- value = (uint32) entry_offset;
- memcpy( direntry_raw + 8, &value, sizeof(uint32) );
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong( (uint32 *) (direntry_raw + 8) );
+ value = (uint32_t)entry_offset;
+ memcpy(direntry_raw + 8, &value, sizeof(uint32_t));
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong((uint32_t *)(direntry_raw + 8));
}
else
{
- memcpy( direntry_raw + 4, &entry_count, sizeof(uint64) );
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8( (uint64 *) (direntry_raw + 4) );
+ memcpy(direntry_raw + 4, &entry_count, sizeof(uint64_t));
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8((uint64_t *)(direntry_raw + 4));
- memcpy( direntry_raw + 12, &entry_offset, sizeof(uint64) );
- if (tif->tif_flags&TIFF_SWAB)
- TIFFSwabLong8( (uint64 *) (direntry_raw + 12) );
+ memcpy(direntry_raw + 12, &entry_offset, sizeof(uint64_t));
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong8((uint64_t *)(direntry_raw + 12));
}
-/* -------------------------------------------------------------------- */
-/* Write the directory entry out to disk. */
-/* -------------------------------------------------------------------- */
- if (!SeekOK(tif, read_offset )) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Seek error accessing TIFF directory",
- tif->tif_name);
+ /* -------------------------------------------------------------------- */
+ /* Write the directory entry out to disk. */
+ /* -------------------------------------------------------------------- */
+ if (!SeekOK(tif, read_offset))
+ {
+ TIFFErrorExtR(tif, module, "%s: Seek error accessing TIFF directory",
+ tif->tif_name);
return 0;
}
- if (!WriteOK(tif, direntry_raw,dirsize))
+ if (!WriteOK(tif, direntry_raw, dirsize))
{
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: Can not write TIFF directory entry.",
- tif->tif_name);
+ TIFFErrorExtR(tif, module, "%s: Can not write TIFF directory entry.",
+ tif->tif_name);
return 0;
}
-
+
return 1;
}
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_dumpmode.c b/src/3rdparty/libtiff/libtiff/tif_dumpmode.c
index 4a0b07f..267d5d2 100644
--- a/src/3rdparty/libtiff/libtiff/tif_dumpmode.c
+++ b/src/3rdparty/libtiff/libtiff/tif_dumpmode.c
@@ -2,23 +2,23 @@
* Copyright (c) 1988-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -29,113 +29,94 @@
*/
#include "tiffiop.h"
-static int
-DumpFixupTags(TIFF* tif)
+static int DumpFixupTags(TIFF *tif)
{
- (void) tif;
- return (1);
+ (void)tif;
+ return (1);
}
/*
* Encode a hunk of pixels.
*/
-static int
-DumpModeEncode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s)
+static int DumpModeEncode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
{
- (void) s;
- while (cc > 0) {
- tmsize_t n;
+ (void)s;
+ while (cc > 0)
+ {
+ tmsize_t n;
- n = cc;
- if (tif->tif_rawcc + n > tif->tif_rawdatasize)
- n = tif->tif_rawdatasize - tif->tif_rawcc;
+ n = cc;
+ if (tif->tif_rawcc + n > tif->tif_rawdatasize)
+ n = tif->tif_rawdatasize - tif->tif_rawcc;
- assert( n > 0 );
+ assert(n > 0);
- /*
- * Avoid copy if client has setup raw
- * data buffer to avoid extra copy.
- */
- if (tif->tif_rawcp != pp)
- _TIFFmemcpy(tif->tif_rawcp, pp, n);
- tif->tif_rawcp += n;
- tif->tif_rawcc += n;
- pp += n;
- cc -= n;
- if (tif->tif_rawcc >= tif->tif_rawdatasize &&
- !TIFFFlushData1(tif))
- return (0);
- }
- return (1);
+ /*
+ * Avoid copy if client has setup raw
+ * data buffer to avoid extra copy.
+ */
+ if (tif->tif_rawcp != pp)
+ _TIFFmemcpy(tif->tif_rawcp, pp, n);
+ tif->tif_rawcp += n;
+ tif->tif_rawcc += n;
+ pp += n;
+ cc -= n;
+ if (tif->tif_rawcc >= tif->tif_rawdatasize && !TIFFFlushData1(tif))
+ return (0);
+ }
+ return (1);
}
/*
* Decode a hunk of pixels.
*/
-static int
-DumpModeDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
+static int DumpModeDecode(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s)
{
- static const char module[] = "DumpModeDecode";
- (void) s;
- if (tif->tif_rawcc < cc) {
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- TIFFErrorExt(tif->tif_clientdata, module,
-"Not enough data for scanline %lu, expected a request for at most %I64d bytes, got a request for %I64d bytes",
- (unsigned long) tif->tif_row,
- (signed __int64) tif->tif_rawcc,
- (signed __int64) cc);
-#else
- TIFFErrorExt(tif->tif_clientdata, module,
-"Not enough data for scanline %lu, expected a request for at most %lld bytes, got a request for %lld bytes",
- (unsigned long) tif->tif_row,
- (signed long long) tif->tif_rawcc,
- (signed long long) cc);
-#endif
- return (0);
- }
- /*
- * Avoid copy if client has setup raw
- * data buffer to avoid extra copy.
- */
- if (tif->tif_rawcp != buf)
- _TIFFmemcpy(buf, tif->tif_rawcp, cc);
- tif->tif_rawcp += cc;
- tif->tif_rawcc -= cc;
- return (1);
+ static const char module[] = "DumpModeDecode";
+ (void)s;
+ if (tif->tif_rawcc < cc)
+ {
+ TIFFErrorExtR(tif, module,
+ "Not enough data for scanline %" PRIu32
+ ", expected a request for at most %" TIFF_SSIZE_FORMAT
+ " bytes, got a request for %" TIFF_SSIZE_FORMAT " bytes",
+ tif->tif_row, tif->tif_rawcc, cc);
+ return (0);
+ }
+ /*
+ * Avoid copy if client has setup raw
+ * data buffer to avoid extra copy.
+ */
+ if (tif->tif_rawcp != buf)
+ _TIFFmemcpy(buf, tif->tif_rawcp, cc);
+ tif->tif_rawcp += cc;
+ tif->tif_rawcc -= cc;
+ return (1);
}
/*
* Seek forwards nrows in the current strip.
*/
-static int
-DumpModeSeek(TIFF* tif, uint32 nrows)
+static int DumpModeSeek(TIFF *tif, uint32_t nrows)
{
- tif->tif_rawcp += nrows * tif->tif_scanlinesize;
- tif->tif_rawcc -= nrows * tif->tif_scanlinesize;
- return (1);
+ tif->tif_rawcp += nrows * tif->tif_scanlinesize;
+ tif->tif_rawcc -= nrows * tif->tif_scanlinesize;
+ return (1);
}
/*
* Initialize dump mode.
*/
-int
-TIFFInitDumpMode(TIFF* tif, int scheme)
+int TIFFInitDumpMode(TIFF *tif, int scheme)
{
- (void) scheme;
- tif->tif_fixuptags = DumpFixupTags;
- tif->tif_decoderow = DumpModeDecode;
- tif->tif_decodestrip = DumpModeDecode;
- tif->tif_decodetile = DumpModeDecode;
- tif->tif_encoderow = DumpModeEncode;
- tif->tif_encodestrip = DumpModeEncode;
- tif->tif_encodetile = DumpModeEncode;
- tif->tif_seek = DumpModeSeek;
- return (1);
+ (void)scheme;
+ tif->tif_fixuptags = DumpFixupTags;
+ tif->tif_decoderow = DumpModeDecode;
+ tif->tif_decodestrip = DumpModeDecode;
+ tif->tif_decodetile = DumpModeDecode;
+ tif->tif_encoderow = DumpModeEncode;
+ tif->tif_encodestrip = DumpModeEncode;
+ tif->tif_encodetile = DumpModeEncode;
+ tif->tif_seek = DumpModeSeek;
+ return (1);
}
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_error.c b/src/3rdparty/libtiff/libtiff/tif_error.c
index 651168f..ac0b9c3 100644
--- a/src/3rdparty/libtiff/libtiff/tif_error.c
+++ b/src/3rdparty/libtiff/libtiff/tif_error.c
@@ -2,23 +2,23 @@
* Copyright (c) 1988-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -29,58 +29,104 @@
TIFFErrorHandlerExt _TIFFerrorHandlerExt = NULL;
-TIFFErrorHandler
-TIFFSetErrorHandler(TIFFErrorHandler handler)
+TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler handler)
{
- TIFFErrorHandler prev = _TIFFerrorHandler;
- _TIFFerrorHandler = handler;
- return (prev);
+ TIFFErrorHandler prev = _TIFFerrorHandler;
+ _TIFFerrorHandler = handler;
+ return (prev);
}
-TIFFErrorHandlerExt
-TIFFSetErrorHandlerExt(TIFFErrorHandlerExt handler)
+TIFFErrorHandlerExt TIFFSetErrorHandlerExt(TIFFErrorHandlerExt handler)
{
- TIFFErrorHandlerExt prev = _TIFFerrorHandlerExt;
- _TIFFerrorHandlerExt = handler;
- return (prev);
+ TIFFErrorHandlerExt prev = _TIFFerrorHandlerExt;
+ _TIFFerrorHandlerExt = handler;
+ return (prev);
}
-void
-TIFFError(const char* module, const char* fmt, ...)
+void TIFFError(const char *module, const char *fmt, ...)
{
- va_list ap;
- if (_TIFFerrorHandler) {
- va_start(ap, fmt);
- (*_TIFFerrorHandler)(module, fmt, ap);
- va_end(ap);
- }
- if (_TIFFerrorHandlerExt) {
- va_start(ap, fmt);
- (*_TIFFerrorHandlerExt)(0, module, fmt, ap);
- va_end(ap);
- }
+ va_list ap;
+ if (_TIFFerrorHandler)
+ {
+ va_start(ap, fmt);
+ (*_TIFFerrorHandler)(module, fmt, ap);
+ va_end(ap);
+ }
+ if (_TIFFerrorHandlerExt)
+ {
+ va_start(ap, fmt);
+ (*_TIFFerrorHandlerExt)(0, module, fmt, ap);
+ va_end(ap);
+ }
}
-void
-TIFFErrorExt(thandle_t fd, const char* module, const char* fmt, ...)
+void TIFFErrorExt(thandle_t fd, const char *module, const char *fmt, ...)
{
- va_list ap;
- if (_TIFFerrorHandler) {
- va_start(ap, fmt);
- (*_TIFFerrorHandler)(module, fmt, ap);
- va_end(ap);
- }
- if (_TIFFerrorHandlerExt) {
- va_start(ap, fmt);
- (*_TIFFerrorHandlerExt)(fd, module, fmt, ap);
- va_end(ap);
- }
+ va_list ap;
+ if (_TIFFerrorHandler)
+ {
+ va_start(ap, fmt);
+ (*_TIFFerrorHandler)(module, fmt, ap);
+ va_end(ap);
+ }
+ if (_TIFFerrorHandlerExt)
+ {
+ va_start(ap, fmt);
+ (*_TIFFerrorHandlerExt)(fd, module, fmt, ap);
+ va_end(ap);
+ }
}
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
+void _TIFFErrorEarly(TIFFOpenOptions *opts, thandle_t clientdata,
+ const char *module, const char *fmt, ...)
+{
+ va_list ap;
+ if (opts && opts->errorhandler)
+ {
+ va_start(ap, fmt);
+ int stop = opts->errorhandler(NULL, opts->errorhandler_user_data,
+ module, fmt, ap);
+ va_end(ap);
+ if (stop)
+ return;
+ }
+ if (_TIFFerrorHandler)
+ {
+ va_start(ap, fmt);
+ (*_TIFFerrorHandler)(module, fmt, ap);
+ va_end(ap);
+ }
+ if (_TIFFerrorHandlerExt)
+ {
+ va_start(ap, fmt);
+ (*_TIFFerrorHandlerExt)(clientdata, module, fmt, ap);
+ va_end(ap);
+ }
+}
+
+void TIFFErrorExtR(TIFF *tif, const char *module, const char *fmt, ...)
+{
+ va_list ap;
+ if (tif && tif->tif_errorhandler)
+ {
+ va_start(ap, fmt);
+ int stop = (*tif->tif_errorhandler)(
+ tif, tif->tif_errorhandler_user_data, module, fmt, ap);
+ va_end(ap);
+ if (stop)
+ return;
+ }
+ if (_TIFFerrorHandler)
+ {
+ va_start(ap, fmt);
+ (*_TIFFerrorHandler)(module, fmt, ap);
+ va_end(ap);
+ }
+ if (_TIFFerrorHandlerExt)
+ {
+ va_start(ap, fmt);
+ (*_TIFFerrorHandlerExt)(tif ? tif->tif_clientdata : NULL, module, fmt,
+ ap);
+ va_end(ap);
+ }
+}
diff --git a/src/3rdparty/libtiff/libtiff/tif_extension.c b/src/3rdparty/libtiff/libtiff/tif_extension.c
index 87d3cfc..1a09e98 100644
--- a/src/3rdparty/libtiff/libtiff/tif_extension.c
+++ b/src/3rdparty/libtiff/libtiff/tif_extension.c
@@ -2,23 +2,23 @@
* Copyright (c) 1988-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -26,26 +26,26 @@
* TIFF Library.
*
* Various routines support external extension of the tag set, and other
- * application extension capabilities.
+ * application extension capabilities.
*/
#include "tiffiop.h"
-int TIFFGetTagListCount( TIFF *tif )
+int TIFFGetTagListCount(TIFF *tif)
{
- TIFFDirectory* td = &tif->tif_dir;
-
+ TIFFDirectory *td = &tif->tif_dir;
+
return td->td_customValueCount;
}
-uint32 TIFFGetTagListEntry( TIFF *tif, int tag_index )
+uint32_t TIFFGetTagListEntry(TIFF *tif, int tag_index)
{
- TIFFDirectory* td = &tif->tif_dir;
+ TIFFDirectory *td = &tif->tif_dir;
- if( tag_index < 0 || tag_index >= td->td_customValueCount )
- return (uint32)(-1);
+ if (tag_index < 0 || tag_index >= td->td_customValueCount)
+ return (uint32_t)(-1);
else
return td->td_customValues[tag_index].info->field_tag;
}
@@ -55,27 +55,27 @@ uint32 TIFFGetTagListEntry( TIFF *tif, int tag_index )
** structure to application code without giving access to the private
** TIFF structure.
*/
-TIFFTagMethods *TIFFAccessTagMethods( TIFF *tif )
+TIFFTagMethods *TIFFAccessTagMethods(TIFF *tif)
{
return &(tif->tif_tagmethods);
}
-void *TIFFGetClientInfo( TIFF *tif, const char *name )
+void *TIFFGetClientInfo(TIFF *tif, const char *name)
{
TIFFClientInfoLink *psLink = tif->tif_clientinfo;
- while( psLink != NULL && strcmp(psLink->name,name) != 0 )
+ while (psLink != NULL && strcmp(psLink->name, name) != 0)
psLink = psLink->next;
- if( psLink != NULL )
+ if (psLink != NULL)
return psLink->data;
else
return NULL;
}
-void TIFFSetClientInfo( TIFF *tif, void *data, const char *name )
+void TIFFSetClientInfo(TIFF *tif, void *data, const char *name)
{
TIFFClientInfoLink *psLink = tif->tif_clientinfo;
@@ -84,10 +84,10 @@ void TIFFSetClientInfo( TIFF *tif, void *data, const char *name )
** Do we have an existing link with this name? If so, just
** set it.
*/
- while( psLink != NULL && strcmp(psLink->name,name) != 0 )
+ while (psLink != NULL && strcmp(psLink->name, name) != 0)
psLink = psLink->next;
- if( psLink != NULL )
+ if (psLink != NULL)
{
psLink->data = data;
return;
@@ -97,20 +97,14 @@ void TIFFSetClientInfo( TIFF *tif, void *data, const char *name )
** Create a new link.
*/
- psLink = (TIFFClientInfoLink *) _TIFFmalloc(sizeof(TIFFClientInfoLink));
- assert (psLink != NULL);
+ psLink =
+ (TIFFClientInfoLink *)_TIFFmallocExt(tif, sizeof(TIFFClientInfoLink));
+ assert(psLink != NULL);
psLink->next = tif->tif_clientinfo;
- psLink->name = (char *) _TIFFmalloc((tmsize_t)(strlen(name)+1));
- assert (psLink->name != NULL);
+ psLink->name = (char *)_TIFFmallocExt(tif, (tmsize_t)(strlen(name) + 1));
+ assert(psLink->name != NULL);
strcpy(psLink->name, name);
psLink->data = data;
tif->tif_clientinfo = psLink;
}
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_fax3.c b/src/3rdparty/libtiff/libtiff/tif_fax3.c
index d11c968..7428544 100644
--- a/src/3rdparty/libtiff/libtiff/tif_fax3.c
+++ b/src/3rdparty/libtiff/libtiff/tif_fax3.c
@@ -2,23 +2,23 @@
* Copyright (c) 1990-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -37,7 +37,7 @@
* Copyright (C) 1990, 1995 Frank D. Cringle.
*/
#include "tif_fax3.h"
-#define G3CODES
+#define G3CODES
#include "t4.h"
#include <stdio.h>
@@ -45,50 +45,57 @@
* Compression+decompression state blocks are
* derived from this ``base state'' block.
*/
-typedef struct {
- int rw_mode; /* O_RDONLY for decode, else encode */
- int mode; /* operating mode */
- tmsize_t rowbytes; /* bytes in a decoded scanline */
- uint32 rowpixels; /* pixels in a scanline */
-
- uint16 cleanfaxdata; /* CleanFaxData tag */
- uint32 badfaxrun; /* BadFaxRun tag */
- uint32 badfaxlines; /* BadFaxLines tag */
- uint32 groupoptions; /* Group 3/4 options tag */
-
- TIFFVGetMethod vgetparent; /* super-class method */
- TIFFVSetMethod vsetparent; /* super-class method */
- TIFFPrintMethod printdir; /* super-class method */
+typedef struct
+{
+ int rw_mode; /* O_RDONLY for decode, else encode */
+ int mode; /* operating mode */
+ tmsize_t rowbytes; /* bytes in a decoded scanline */
+ uint32_t rowpixels; /* pixels in a scanline */
+
+ uint16_t cleanfaxdata; /* CleanFaxData tag */
+ uint32_t badfaxrun; /* BadFaxRun tag */
+ uint32_t badfaxlines; /* BadFaxLines tag */
+ uint32_t groupoptions; /* Group 3/4 options tag */
+
+ TIFFVGetMethod vgetparent; /* super-class method */
+ TIFFVSetMethod vsetparent; /* super-class method */
+ TIFFPrintMethod printdir; /* super-class method */
} Fax3BaseState;
-#define Fax3State(tif) ((Fax3BaseState*) (tif)->tif_data)
-
-typedef enum { G3_1D, G3_2D } Ttag;
-typedef struct {
- Fax3BaseState b;
-
- /* Decoder state info */
- const unsigned char* bitmap; /* bit reversal table */
- uint32 data; /* current i/o byte/word */
- int bit; /* current i/o bit in byte */
- int EOLcnt; /* count of EOL codes recognized */
- TIFFFaxFillFunc fill; /* fill routine */
- uint32* runs; /* b&w runs for current/previous row */
- uint32* refruns; /* runs for reference line */
- uint32* curruns; /* runs for current line */
-
- /* Encoder state info */
- Ttag tag; /* encoding state */
- unsigned char* refline; /* reference line for 2d decoding */
- int k; /* #rows left that can be 2d encoded */
- int maxk; /* max #rows that can be 2d encoded */
-
- int line;
+#define Fax3State(tif) ((Fax3BaseState *)(tif)->tif_data)
+
+typedef enum
+{
+ G3_1D,
+ G3_2D
+} Ttag;
+typedef struct
+{
+ Fax3BaseState b;
+
+ /* Decoder state info */
+ const unsigned char *bitmap; /* bit reversal table */
+ uint32_t data; /* current i/o byte/word */
+ int bit; /* current i/o bit in byte */
+ int EOLcnt; /* count of EOL codes recognized */
+ TIFFFaxFillFunc fill; /* fill routine */
+ uint32_t *runs; /* b&w runs for current/previous row */
+ uint32_t nruns; /* size of the refruns / curruns arrays */
+ uint32_t *refruns; /* runs for reference line */
+ uint32_t *curruns; /* runs for current line */
+
+ /* Encoder state info */
+ Ttag tag; /* encoding state */
+ unsigned char *refline; /* reference line for 2d decoding */
+ int k; /* #rows left that can be 2d encoded */
+ int maxk; /* max #rows that can be 2d encoded */
+
+ int line;
} Fax3CodecState;
-#define DecoderState(tif) ((Fax3CodecState*) Fax3State(tif))
-#define EncoderState(tif) ((Fax3CodecState*) Fax3State(tif))
+#define DecoderState(tif) ((Fax3CodecState *)Fax3State(tif))
+#define EncoderState(tif) ((Fax3CodecState *)Fax3State(tif))
#define is2DEncoding(sp) (sp->b.groupoptions & GROUP3OPT_2DENCODING)
-#define isAligned(p,t) ((((size_t)(p)) & (sizeof (t)-1)) == 0)
+#define isAligned(p, t) ((((size_t)(p)) & (sizeof(t) - 1)) == 0)
/*
* Group 3 and Group 4 Decoding.
@@ -98,74 +105,81 @@ typedef struct {
* These macros glue the TIFF library state to
* the state expected by Frank's decoder.
*/
-#define DECLARE_STATE(tif, sp, mod) \
- static const char module[] = mod; \
- Fax3CodecState* sp = DecoderState(tif); \
- int a0; /* reference element */ \
- int lastx = sp->b.rowpixels; /* last element in row */ \
- uint32 BitAcc; /* bit accumulator */ \
- int BitsAvail; /* # valid bits in BitAcc */ \
- int RunLength; /* length of current run */ \
- unsigned char* cp; /* next byte of input data */ \
- unsigned char* ep; /* end of input data */ \
- uint32* pa; /* place to stuff next run */ \
- uint32* thisrun; /* current row's run array */ \
- int EOLcnt; /* # EOL codes recognized */ \
- const unsigned char* bitmap = sp->bitmap; /* input data bit reverser */ \
- const TIFFFaxTabEnt* TabEnt
-#define DECLARE_STATE_2D(tif, sp, mod) \
- DECLARE_STATE(tif, sp, mod); \
- int b1; /* next change on prev line */ \
- uint32* pb /* next run in reference line */\
-/*
- * Load any state that may be changed during decoding.
- */
-#define CACHE_STATE(tif, sp) do { \
- BitAcc = sp->data; \
- BitsAvail = sp->bit; \
- EOLcnt = sp->EOLcnt; \
- cp = (unsigned char*) tif->tif_rawcp; \
- ep = cp + tif->tif_rawcc; \
-} while (0)
+#define DECLARE_STATE(tif, sp, mod) \
+ static const char module[] = mod; \
+ Fax3CodecState *sp = DecoderState(tif); \
+ int a0; /* reference element */ \
+ int lastx = sp->b.rowpixels; /* last element in row */ \
+ uint32_t BitAcc; /* bit accumulator */ \
+ int BitsAvail; /* # valid bits in BitAcc */ \
+ int RunLength; /* length of current run */ \
+ unsigned char *cp; /* next byte of input data */ \
+ unsigned char *ep; /* end of input data */ \
+ uint32_t *pa; /* place to stuff next run */ \
+ uint32_t *thisrun; /* current row's run array */ \
+ int EOLcnt; /* # EOL codes recognized */ \
+ const unsigned char *bitmap = sp->bitmap; /* input data bit reverser */ \
+ const TIFFFaxTabEnt *TabEnt
+#define DECLARE_STATE_2D(tif, sp, mod) \
+ DECLARE_STATE(tif, sp, mod); \
+ int b1; /* next change on prev line */ \
+ uint32_t \
+ *pb /* next run in reference line */ /* \
+ * Load any state that may be \
+ * changed during decoding. \
+ */
+#define CACHE_STATE(tif, sp) \
+ do \
+ { \
+ BitAcc = sp->data; \
+ BitsAvail = sp->bit; \
+ EOLcnt = sp->EOLcnt; \
+ cp = (unsigned char *)tif->tif_rawcp; \
+ ep = cp + tif->tif_rawcc; \
+ } while (0)
/*
* Save state possibly changed during decoding.
*/
-#define UNCACHE_STATE(tif, sp) do { \
- sp->bit = BitsAvail; \
- sp->data = BitAcc; \
- sp->EOLcnt = EOLcnt; \
- tif->tif_rawcc -= (tmsize_t)((uint8*) cp - tif->tif_rawcp); \
- tif->tif_rawcp = (uint8*) cp; \
-} while (0)
+#define UNCACHE_STATE(tif, sp) \
+ do \
+ { \
+ sp->bit = BitsAvail; \
+ sp->data = BitAcc; \
+ sp->EOLcnt = EOLcnt; \
+ tif->tif_rawcc -= (tmsize_t)((uint8_t *)cp - tif->tif_rawcp); \
+ tif->tif_rawcp = (uint8_t *)cp; \
+ } while (0)
/*
* Setup state for decoding a strip.
*/
-static int
-Fax3PreDecode(TIFF* tif, uint16 s)
+static int Fax3PreDecode(TIFF *tif, uint16_t s)
{
- Fax3CodecState* sp = DecoderState(tif);
-
- (void) s;
- assert(sp != NULL);
- sp->bit = 0; /* force initial read */
- sp->data = 0;
- sp->EOLcnt = 0; /* force initial scan for EOL */
- /*
- * Decoder assumes lsb-to-msb bit order. Note that we select
- * this here rather than in Fax3SetupState so that viewers can
- * hold the image open, fiddle with the FillOrder tag value,
- * and then re-decode the image. Otherwise they'd need to close
- * and open the image to get the state reset.
- */
- sp->bitmap =
- TIFFGetBitRevTable(tif->tif_dir.td_fillorder != FILLORDER_LSB2MSB);
- if (sp->refruns) { /* init reference line to white */
- sp->refruns[0] = (uint32) sp->b.rowpixels;
- sp->refruns[1] = 0;
- }
- sp->line = 0;
- return (1);
+ Fax3CodecState *sp = DecoderState(tif);
+
+ (void)s;
+ assert(sp != NULL);
+ sp->bit = 0; /* force initial read */
+ sp->data = 0;
+ sp->EOLcnt = 0; /* force initial scan for EOL */
+ /*
+ * Decoder assumes lsb-to-msb bit order. Note that we select
+ * this here rather than in Fax3SetupState so that viewers can
+ * hold the image open, fiddle with the FillOrder tag value,
+ * and then re-decode the image. Otherwise they'd need to close
+ * and open the image to get the state reset.
+ */
+ sp->bitmap =
+ TIFFGetBitRevTable(tif->tif_dir.td_fillorder != FILLORDER_LSB2MSB);
+ sp->curruns = sp->runs;
+ if (sp->refruns)
+ { /* init reference line to white */
+ sp->refruns = sp->runs + sp->nruns;
+ sp->refruns[0] = (uint32_t)sp->b.rowpixels;
+ sp->refruns[1] = 0;
+ }
+ sp->line = 0;
+ return (1);
}
/*
@@ -174,320 +188,299 @@ Fax3PreDecode(TIFF* tif, uint16 s)
* overriding the definitions used by the decoder.
*/
-static void
-Fax3Unexpected(const char* module, TIFF* tif, uint32 line, uint32 a0)
+static void Fax3Unexpected(const char *module, TIFF *tif, uint32_t line,
+ uint32_t a0)
{
- TIFFErrorExt(tif->tif_clientdata, module, "Bad code word at line %u of %s %u (x %u)",
- line, isTiled(tif) ? "tile" : "strip",
- (isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip),
- a0);
+ TIFFErrorExtR(tif, module,
+ "Bad code word at line %" PRIu32 " of %s %" PRIu32
+ " (x %" PRIu32 ")",
+ line, isTiled(tif) ? "tile" : "strip",
+ (isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip), a0);
}
-#define unexpected(table, a0) Fax3Unexpected(module, tif, sp->line, a0)
+#define unexpected(table, a0) Fax3Unexpected(module, tif, sp->line, a0)
-static void
-Fax3Extension(const char* module, TIFF* tif, uint32 line, uint32 a0)
+static void Fax3Extension(const char *module, TIFF *tif, uint32_t line,
+ uint32_t a0)
{
- TIFFErrorExt(tif->tif_clientdata, module,
- "Uncompressed data (not supported) at line %u of %s %u (x %u)",
- line, isTiled(tif) ? "tile" : "strip",
- (isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip),
- a0);
+ TIFFErrorExtR(tif, module,
+ "Uncompressed data (not supported) at line %" PRIu32
+ " of %s %" PRIu32 " (x %" PRIu32 ")",
+ line, isTiled(tif) ? "tile" : "strip",
+ (isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip), a0);
}
-#define extension(a0) Fax3Extension(module, tif, sp->line, a0)
+#define extension(a0) Fax3Extension(module, tif, sp->line, a0)
-static void
-Fax3BadLength(const char* module, TIFF* tif, uint32 line, uint32 a0, uint32 lastx)
+static void Fax3BadLength(const char *module, TIFF *tif, uint32_t line,
+ uint32_t a0, uint32_t lastx)
{
- TIFFWarningExt(tif->tif_clientdata, module, "%s at line %u of %s %u (got %u, expected %u)",
- a0 < lastx ? "Premature EOL" : "Line length mismatch",
- line, isTiled(tif) ? "tile" : "strip",
- (isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip),
- a0, lastx);
+ TIFFWarningExtR(tif, module,
+ "%s at line %" PRIu32 " of %s %" PRIu32 " (got %" PRIu32
+ ", expected %" PRIu32 ")",
+ a0 < lastx ? "Premature EOL" : "Line length mismatch", line,
+ isTiled(tif) ? "tile" : "strip",
+ (isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip), a0,
+ lastx);
}
-#define badlength(a0,lastx) Fax3BadLength(module, tif, sp->line, a0, lastx)
+#define badlength(a0, lastx) Fax3BadLength(module, tif, sp->line, a0, lastx)
-static void
-Fax3PrematureEOF(const char* module, TIFF* tif, uint32 line, uint32 a0)
+static void Fax3PrematureEOF(const char *module, TIFF *tif, uint32_t line,
+ uint32_t a0)
{
- TIFFWarningExt(tif->tif_clientdata, module, "Premature EOF at line %u of %s %u (x %u)",
- line, isTiled(tif) ? "tile" : "strip",
- (isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip),
- a0);
+ TIFFWarningExtR(tif, module,
+ "Premature EOF at line %" PRIu32 " of %s %" PRIu32
+ " (x %" PRIu32 ")",
+ line, isTiled(tif) ? "tile" : "strip",
+ (isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip), a0);
}
-#define prematureEOF(a0) Fax3PrematureEOF(module, tif, sp->line, a0)
+#define prematureEOF(a0) Fax3PrematureEOF(module, tif, sp->line, a0)
-#define Nop
+#define Nop
-/*
+/**
* Decode the requested amount of G3 1D-encoded data.
+ * @param buf destination buffer
+ * @param occ available bytes in destination buffer
+ * @param s number of planes (ignored)
+ * @returns 1 for success, -1 in case of error
*/
-static int
-Fax3Decode1D(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s)
+static int Fax3Decode1D(TIFF *tif, uint8_t *buf, tmsize_t occ, uint16_t s)
{
- DECLARE_STATE(tif, sp, "Fax3Decode1D");
- (void) s;
- if (occ % sp->b.rowbytes)
- {
- TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be read");
- return (-1);
- }
- CACHE_STATE(tif, sp);
- thisrun = sp->curruns;
- while (occ > 0) {
- a0 = 0;
- RunLength = 0;
- pa = thisrun;
+ DECLARE_STATE(tif, sp, "Fax3Decode1D");
+ (void)s;
+ if (occ % sp->b.rowbytes)
+ {
+ TIFFErrorExtR(tif, module, "Fractional scanlines cannot be read");
+ return (-1);
+ }
+ CACHE_STATE(tif, sp);
+ thisrun = sp->curruns;
+ while (occ > 0)
+ {
+ a0 = 0;
+ RunLength = 0;
+ pa = thisrun;
#ifdef FAX3_DEBUG
- printf("\nBitAcc=%08X, BitsAvail = %d\n", BitAcc, BitsAvail);
- printf("-------------------- %d\n", tif->tif_row);
- fflush(stdout);
+ printf("\nBitAcc=%08" PRIX32 ", BitsAvail = %d\n", BitAcc, BitsAvail);
+ printf("-------------------- %" PRIu32 "\n", tif->tif_row);
+ fflush(stdout);
#endif
- SYNC_EOL(EOF1D);
- EXPAND1D(EOF1Da);
- (*sp->fill)(buf, thisrun, pa, lastx);
- buf += sp->b.rowbytes;
- occ -= sp->b.rowbytes;
- sp->line++;
- continue;
- EOF1D: /* premature EOF */
- CLEANUP_RUNS();
- EOF1Da: /* premature EOF */
- (*sp->fill)(buf, thisrun, pa, lastx);
- UNCACHE_STATE(tif, sp);
- return (-1);
- }
- UNCACHE_STATE(tif, sp);
- return (1);
+ SYNC_EOL(EOF1D);
+ EXPAND1D(EOF1Da);
+ (*sp->fill)(buf, thisrun, pa, lastx);
+ buf += sp->b.rowbytes;
+ occ -= sp->b.rowbytes;
+ sp->line++;
+ continue;
+ EOF1D: /* premature EOF */
+ CLEANUP_RUNS();
+ EOF1Da: /* premature EOF */
+ (*sp->fill)(buf, thisrun, pa, lastx);
+ UNCACHE_STATE(tif, sp);
+ return (-1);
+ }
+ UNCACHE_STATE(tif, sp);
+ return (1);
}
-#define SWAP(t,a,b) { t x; x = (a); (a) = (b); (b) = x; }
+#define SWAP(t, a, b) \
+ { \
+ t x; \
+ x = (a); \
+ (a) = (b); \
+ (b) = x; \
+ }
/*
* Decode the requested amount of G3 2D-encoded data.
*/
-static int
-Fax3Decode2D(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s)
+static int Fax3Decode2D(TIFF *tif, uint8_t *buf, tmsize_t occ, uint16_t s)
{
- DECLARE_STATE_2D(tif, sp, "Fax3Decode2D");
- int is1D; /* current line is 1d/2d-encoded */
- (void) s;
- if (occ % sp->b.rowbytes)
- {
- TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be read");
- return (-1);
- }
- CACHE_STATE(tif, sp);
- while (occ > 0) {
- a0 = 0;
- RunLength = 0;
- pa = thisrun = sp->curruns;
+ DECLARE_STATE_2D(tif, sp, "Fax3Decode2D");
+ int is1D; /* current line is 1d/2d-encoded */
+ (void)s;
+ if (occ % sp->b.rowbytes)
+ {
+ TIFFErrorExtR(tif, module, "Fractional scanlines cannot be read");
+ return (-1);
+ }
+ CACHE_STATE(tif, sp);
+ while (occ > 0)
+ {
+ a0 = 0;
+ RunLength = 0;
+ pa = thisrun = sp->curruns;
#ifdef FAX3_DEBUG
- printf("\nBitAcc=%08X, BitsAvail = %d EOLcnt = %d",
- BitAcc, BitsAvail, EOLcnt);
+ printf("\nBitAcc=%08" PRIX32 ", BitsAvail = %d EOLcnt = %d", BitAcc,
+ BitsAvail, EOLcnt);
#endif
- SYNC_EOL(EOF2D);
- NeedBits8(1, EOF2D);
- is1D = GetBits(1); /* 1D/2D-encoding tag bit */
- ClrBits(1);
+ SYNC_EOL(EOF2D);
+ NeedBits8(1, EOF2D);
+ is1D = GetBits(1); /* 1D/2D-encoding tag bit */
+ ClrBits(1);
#ifdef FAX3_DEBUG
- printf(" %s\n-------------------- %d\n",
- is1D ? "1D" : "2D", tif->tif_row);
- fflush(stdout);
+ printf(" %s\n-------------------- %" PRIu32 "\n", is1D ? "1D" : "2D",
+ tif->tif_row);
+ fflush(stdout);
#endif
- pb = sp->refruns;
- b1 = *pb++;
- if (is1D)
- EXPAND1D(EOF2Da);
- else
- EXPAND2D(EOF2Da);
- (*sp->fill)(buf, thisrun, pa, lastx);
- SETVALUE(0); /* imaginary change for reference */
- SWAP(uint32*, sp->curruns, sp->refruns);
- buf += sp->b.rowbytes;
- occ -= sp->b.rowbytes;
- sp->line++;
- continue;
- EOF2D: /* premature EOF */
- CLEANUP_RUNS();
- EOF2Da: /* premature EOF */
- (*sp->fill)(buf, thisrun, pa, lastx);
- UNCACHE_STATE(tif, sp);
- return (-1);
- }
- UNCACHE_STATE(tif, sp);
- return (1);
+ pb = sp->refruns;
+ b1 = *pb++;
+ if (is1D)
+ EXPAND1D(EOF2Da);
+ else
+ EXPAND2D(EOF2Da);
+ (*sp->fill)(buf, thisrun, pa, lastx);
+ if (pa < thisrun + sp->nruns)
+ {
+ SETVALUE(0); /* imaginary change for reference */
+ }
+ SWAP(uint32_t *, sp->curruns, sp->refruns);
+ buf += sp->b.rowbytes;
+ occ -= sp->b.rowbytes;
+ sp->line++;
+ continue;
+ EOF2D: /* premature EOF */
+ CLEANUP_RUNS();
+ EOF2Da: /* premature EOF */
+ (*sp->fill)(buf, thisrun, pa, lastx);
+ UNCACHE_STATE(tif, sp);
+ return (-1);
+ }
+ UNCACHE_STATE(tif, sp);
+ return (1);
}
#undef SWAP
-/*
- * The ZERO & FILL macros must handle spans < 2*sizeof(long) bytes.
- * For machines with 64-bit longs this is <16 bytes; otherwise
- * this is <8 bytes. We optimize the code here to reflect the
- * machine characteristics.
- */
-#if SIZEOF_UNSIGNED_LONG == 8
-# define FILL(n, cp) \
- switch (n) { \
- case 15:(cp)[14] = 0xff; /*-fallthrough*/ \
- case 14:(cp)[13] = 0xff; /*-fallthrough*/ \
- case 13:(cp)[12] = 0xff; /*-fallthrough*/ \
- case 12:(cp)[11] = 0xff; /*-fallthrough*/ \
- case 11:(cp)[10] = 0xff; /*-fallthrough*/ \
- case 10: (cp)[9] = 0xff; /*-fallthrough*/ \
- case 9: (cp)[8] = 0xff; /*-fallthrough*/ \
- case 8: (cp)[7] = 0xff; /*-fallthrough*/ \
- case 7: (cp)[6] = 0xff; /*-fallthrough*/ \
- case 6: (cp)[5] = 0xff; /*-fallthrough*/ \
- case 5: (cp)[4] = 0xff; /*-fallthrough*/ \
- case 4: (cp)[3] = 0xff; /*-fallthrough*/ \
- case 3: (cp)[2] = 0xff; /*-fallthrough*/ \
- case 2: (cp)[1] = 0xff; /*-fallthrough*/ \
- case 1: (cp)[0] = 0xff; (cp) += (n); /*-fallthrough*/ \
- case 0: ; \
- }
-# define ZERO(n, cp) \
- switch (n) { \
- case 15:(cp)[14] = 0; /*-fallthrough*/ \
- case 14:(cp)[13] = 0; /*-fallthrough*/ \
- case 13:(cp)[12] = 0; /*-fallthrough*/ \
- case 12:(cp)[11] = 0; /*-fallthrough*/ \
- case 11:(cp)[10] = 0; /*-fallthrough*/ \
- case 10: (cp)[9] = 0; /*-fallthrough*/ \
- case 9: (cp)[8] = 0; /*-fallthrough*/ \
- case 8: (cp)[7] = 0; /*-fallthrough*/ \
- case 7: (cp)[6] = 0; /*-fallthrough*/ \
- case 6: (cp)[5] = 0; /*-fallthrough*/ \
- case 5: (cp)[4] = 0; /*-fallthrough*/ \
- case 4: (cp)[3] = 0; /*-fallthrough*/ \
- case 3: (cp)[2] = 0; /*-fallthrough*/ \
- case 2: (cp)[1] = 0; /*-fallthrough*/ \
- case 1: (cp)[0] = 0; (cp) += (n); /*-fallthrough*/ \
- case 0: ; \
- }
-#else
-# define FILL(n, cp) \
- switch (n) { \
- case 7: (cp)[6] = 0xff; /*-fallthrough*/ \
- case 6: (cp)[5] = 0xff; /*-fallthrough*/ \
- case 5: (cp)[4] = 0xff; /*-fallthrough*/ \
- case 4: (cp)[3] = 0xff; /*-fallthrough*/ \
- case 3: (cp)[2] = 0xff; /*-fallthrough*/ \
- case 2: (cp)[1] = 0xff; /*-fallthrough*/ \
- case 1: (cp)[0] = 0xff; (cp) += (n); /*-fallthrough*/ \
- case 0: ; \
- }
-# define ZERO(n, cp) \
- switch (n) { \
- case 7: (cp)[6] = 0; /*-fallthrough*/ \
- case 6: (cp)[5] = 0; /*-fallthrough*/ \
- case 5: (cp)[4] = 0; /*-fallthrough*/ \
- case 4: (cp)[3] = 0; /*-fallthrough*/ \
- case 3: (cp)[2] = 0; /*-fallthrough*/ \
- case 2: (cp)[1] = 0; /*-fallthrough*/ \
- case 1: (cp)[0] = 0; (cp) += (n); /*-fallthrough*/ \
- case 0: ; \
- }
-#endif
+# define FILL(n, cp) { \
+ int32_t ifill; \
+ for (ifill = 0; ifill < (n); ++ifill) \
+ { \
+ (cp)[ifill] = 0xff; \
+ } \
+ (cp) += (n); \
+}
+
+# define ZERO(n, cp) { \
+ int32_t izero; \
+ for (izero = 0; izero < (n); ++izero) \
+ { \
+ (cp)[izero] = 0; \
+ } \
+ (cp) += (n); \
+}
/*
* Bit-fill a row according to the white/black
* runs generated during G3/G4 decoding.
*/
-void
-_TIFFFax3fillruns(unsigned char* buf, uint32* runs, uint32* erun, uint32 lastx)
+void _TIFFFax3fillruns(unsigned char *buf, uint32_t *runs, uint32_t *erun,
+ uint32_t lastx)
{
- static const unsigned char _fillmasks[] =
- { 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff };
- unsigned char* cp;
- uint32 x, bx, run;
- int32 n, nw;
- long* lp;
-
- if ((erun-runs)&1)
- *erun++ = 0;
- x = 0;
- for (; runs < erun; runs += 2) {
- run = runs[0];
- if (x+run > lastx || run > lastx )
- run = runs[0] = (uint32) (lastx - x);
- if (run) {
- cp = buf + (x>>3);
- bx = x&7;
- if (run > 8-bx) {
- if (bx) { /* align to byte boundary */
- *cp++ &= 0xff << (8-bx);
- run -= 8-bx;
- }
- if( (n = run >> 3) != 0 ) { /* multiple bytes to fill */
- if ((n/sizeof (long)) > 1) {
- /*
- * Align to longword boundary and fill.
- */
- for (; n && !isAligned(cp, long); n--)
- *cp++ = 0x00;
- lp = (long*) cp;
- nw = (int32)(n / sizeof (long));
- n -= nw * sizeof (long);
- do {
- *lp++ = 0L;
- } while (--nw);
- cp = (unsigned char*) lp;
- }
- ZERO(n, cp);
- run &= 7;
- }
- if (run)
- cp[0] &= 0xff >> run;
- } else
- cp[0] &= ~(_fillmasks[run]>>bx);
- x += runs[0];
- }
- run = runs[1];
- if (x+run > lastx || run > lastx )
- run = runs[1] = lastx - x;
- if (run) {
- cp = buf + (x>>3);
- bx = x&7;
- if (run > 8-bx) {
- if (bx) { /* align to byte boundary */
- *cp++ |= 0xff >> bx;
- run -= 8-bx;
- }
- if( (n = run>>3) != 0 ) { /* multiple bytes to fill */
- if ((n/sizeof (long)) > 1) {
- /*
- * Align to longword boundary and fill.
- */
- for (; n && !isAligned(cp, long); n--)
- *cp++ = 0xff;
- lp = (long*) cp;
- nw = (int32)(n / sizeof (long));
- n -= nw * sizeof (long);
- do {
- *lp++ = -1L;
- } while (--nw);
- cp = (unsigned char*) lp;
- }
- FILL(n, cp);
- run &= 7;
- }
- /* Explicit 0xff masking to make icc -check=conversions happy */
- if (run)
- cp[0] = (unsigned char)((cp[0] | (0xff00 >> run))&0xff);
- } else
- cp[0] |= _fillmasks[run]>>bx;
- x += runs[1];
- }
- }
- assert(x == lastx);
+ static const unsigned char _fillmasks[] = {0x00, 0x80, 0xc0, 0xe0, 0xf0,
+ 0xf8, 0xfc, 0xfe, 0xff};
+ unsigned char *cp;
+ uint32_t x, bx, run;
+ int32_t n, nw;
+ int64_t *lp;
+
+ if ((erun - runs) & 1)
+ *erun++ = 0;
+ x = 0;
+ for (; runs < erun; runs += 2)
+ {
+ run = runs[0];
+ if (x + run > lastx || run > lastx)
+ run = runs[0] = (uint32_t)(lastx - x);
+ if (run)
+ {
+ cp = buf + (x >> 3);
+ bx = x & 7;
+ if (run > 8 - bx)
+ {
+ if (bx)
+ { /* align to byte boundary */
+ *cp++ &= 0xff << (8 - bx);
+ run -= 8 - bx;
+ }
+ if ((n = run >> 3) != 0)
+ { /* multiple bytes to fill */
+ if ((n / sizeof(int64_t)) > 1)
+ {
+ /*
+ * Align to int64_tword boundary and fill.
+ */
+ for (; n && !isAligned(cp, int64_t); n--)
+ *cp++ = 0x00;
+ lp = (int64_t *)cp;
+ nw = (int32_t)(n / sizeof(int64_t));
+ n -= nw * sizeof(int64_t);
+ do
+ {
+ *lp++ = 0L;
+ } while (--nw);
+ cp = (unsigned char *)lp;
+ }
+ ZERO(n, cp);
+ run &= 7;
+ }
+ if (run)
+ cp[0] &= 0xff >> run;
+ }
+ else
+ cp[0] &= ~(_fillmasks[run] >> bx);
+ x += runs[0];
+ }
+ run = runs[1];
+ if (x + run > lastx || run > lastx)
+ run = runs[1] = lastx - x;
+ if (run)
+ {
+ cp = buf + (x >> 3);
+ bx = x & 7;
+ if (run > 8 - bx)
+ {
+ if (bx)
+ { /* align to byte boundary */
+ *cp++ |= 0xff >> bx;
+ run -= 8 - bx;
+ }
+ if ((n = run >> 3) != 0)
+ { /* multiple bytes to fill */
+ if ((n / sizeof(int64_t)) > 1)
+ {
+ /*
+ * Align to int64_t boundary and fill.
+ */
+ for (; n && !isAligned(cp, int64_t); n--)
+ *cp++ = 0xff;
+ lp = (int64_t *)cp;
+ nw = (int32_t)(n / sizeof(int64_t));
+ n -= nw * sizeof(int64_t);
+ do
+ {
+ *lp++ = -1L;
+ } while (--nw);
+ cp = (unsigned char *)lp;
+ }
+ FILL(n, cp);
+ run &= 7;
+ }
+ /* Explicit 0xff masking to make icc -check=conversions happy */
+ if (run)
+ cp[0] = (unsigned char)((cp[0] | (0xff00 >> run)) & 0xff);
+ }
+ else
+ cp[0] |= _fillmasks[run] >> bx;
+ x += runs[1];
+ }
+ }
+ assert(x == lastx);
}
-#undef ZERO
-#undef FILL
+#undef ZERO
+#undef FILL
-static int
-Fax3FixupTags(TIFF* tif)
+static int Fax3FixupTags(TIFF *tif)
{
- (void) tif;
- return (1);
+ (void)tif;
+ return (1);
}
/*
@@ -497,163 +490,188 @@ Fax3FixupTags(TIFF* tif)
* or not decoding or encoding is being done and whether
* 1D- or 2D-encoded data is involved.
*/
-static int
-Fax3SetupState(TIFF* tif)
+static int Fax3SetupState(TIFF *tif)
{
- static const char module[] = "Fax3SetupState";
- TIFFDirectory* td = &tif->tif_dir;
- Fax3BaseState* sp = Fax3State(tif);
- int needsRefLine;
- Fax3CodecState* dsp = (Fax3CodecState*) Fax3State(tif);
- tmsize_t rowbytes;
- uint32 rowpixels, nruns;
-
- if (td->td_bitspersample != 1) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Bits/sample must be 1 for Group 3/4 encoding/decoding");
- return (0);
- }
- /*
- * Calculate the scanline/tile widths.
- */
- if (isTiled(tif)) {
- rowbytes = TIFFTileRowSize(tif);
- rowpixels = td->td_tilewidth;
- } else {
- rowbytes = TIFFScanlineSize(tif);
- rowpixels = td->td_imagewidth;
- }
- sp->rowbytes = rowbytes;
- sp->rowpixels = rowpixels;
- /*
- * Allocate any additional space required for decoding/encoding.
- */
- needsRefLine = (
- (sp->groupoptions & GROUP3OPT_2DENCODING) ||
- td->td_compression == COMPRESSION_CCITTFAX4
- );
-
- /*
- Assure that allocation computations do not overflow.
-
- TIFFroundup and TIFFSafeMultiply return zero on integer overflow
- */
- dsp->runs=(uint32*) NULL;
- nruns = TIFFroundup_32(rowpixels,32);
- if (needsRefLine) {
- nruns = TIFFSafeMultiply(uint32,nruns,2);
- }
- if ((nruns == 0) || (TIFFSafeMultiply(uint32,nruns,2) == 0)) {
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "Row pixels integer overflow (rowpixels %u)",
- rowpixels);
- return (0);
- }
- dsp->runs = (uint32*) _TIFFCheckMalloc(tif,
- TIFFSafeMultiply(uint32,nruns,2),
- sizeof (uint32),
- "for Group 3/4 run arrays");
- if (dsp->runs == NULL)
- return (0);
- memset( dsp->runs, 0, TIFFSafeMultiply(uint32,nruns,2)*sizeof(uint32));
- dsp->curruns = dsp->runs;
- if (needsRefLine)
- dsp->refruns = dsp->runs + nruns;
- else
- dsp->refruns = NULL;
- if (td->td_compression == COMPRESSION_CCITTFAX3
- && is2DEncoding(dsp)) { /* NB: default is 1D routine */
- tif->tif_decoderow = Fax3Decode2D;
- tif->tif_decodestrip = Fax3Decode2D;
- tif->tif_decodetile = Fax3Decode2D;
- }
-
- if (needsRefLine) { /* 2d encoding */
- Fax3CodecState* esp = EncoderState(tif);
- /*
- * 2d encoding requires a scanline
- * buffer for the ``reference line''; the
- * scanline against which delta encoding
- * is referenced. The reference line must
- * be initialized to be ``white'' (done elsewhere).
- */
- esp->refline = (unsigned char*) _TIFFmalloc(rowbytes);
- if (esp->refline == NULL) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "No space for Group 3/4 reference line");
- return (0);
- }
- } else /* 1d encoding */
- EncoderState(tif)->refline = NULL;
-
- return (1);
+ static const char module[] = "Fax3SetupState";
+ TIFFDirectory *td = &tif->tif_dir;
+ Fax3BaseState *sp = Fax3State(tif);
+ int needsRefLine;
+ Fax3CodecState *dsp = (Fax3CodecState *)Fax3State(tif);
+ tmsize_t rowbytes;
+ uint32_t rowpixels;
+
+ if (td->td_bitspersample != 1)
+ {
+ TIFFErrorExtR(tif, module,
+ "Bits/sample must be 1 for Group 3/4 encoding/decoding");
+ return (0);
+ }
+ /*
+ * Calculate the scanline/tile widths.
+ */
+ if (isTiled(tif))
+ {
+ rowbytes = TIFFTileRowSize(tif);
+ rowpixels = td->td_tilewidth;
+ }
+ else
+ {
+ rowbytes = TIFFScanlineSize(tif);
+ rowpixels = td->td_imagewidth;
+ }
+ if ((int64_t)rowbytes < ((int64_t)rowpixels + 7) / 8)
+ {
+ TIFFErrorExtR(tif, module,
+ "Inconsistent number of bytes per row : rowbytes=%" PRId64
+ " rowpixels=%" PRIu32,
+ (int64_t)rowbytes, rowpixels);
+ return (0);
+ }
+ sp->rowbytes = rowbytes;
+ sp->rowpixels = rowpixels;
+ /*
+ * Allocate any additional space required for decoding/encoding.
+ */
+ needsRefLine = ((sp->groupoptions & GROUP3OPT_2DENCODING) ||
+ td->td_compression == COMPRESSION_CCITTFAX4);
+
+ /*
+ Assure that allocation computations do not overflow.
+
+ TIFFroundup and TIFFSafeMultiply return zero on integer overflow
+ */
+ dsp->runs = (uint32_t *)NULL;
+ dsp->nruns = TIFFroundup_32(rowpixels, 32);
+ if (needsRefLine)
+ {
+ dsp->nruns = TIFFSafeMultiply(uint32_t, dsp->nruns, 2);
+ }
+ if ((dsp->nruns == 0) || (TIFFSafeMultiply(uint32_t, dsp->nruns, 2) == 0))
+ {
+ TIFFErrorExtR(tif, tif->tif_name,
+ "Row pixels integer overflow (rowpixels %" PRIu32 ")",
+ rowpixels);
+ return (0);
+ }
+ dsp->runs = (uint32_t *)_TIFFCheckMalloc(
+ tif, TIFFSafeMultiply(uint32_t, dsp->nruns, 2), sizeof(uint32_t),
+ "for Group 3/4 run arrays");
+ if (dsp->runs == NULL)
+ return (0);
+ memset(dsp->runs, 0,
+ TIFFSafeMultiply(uint32_t, dsp->nruns, 2) * sizeof(uint32_t));
+ dsp->curruns = dsp->runs;
+ if (needsRefLine)
+ dsp->refruns = dsp->runs + dsp->nruns;
+ else
+ dsp->refruns = NULL;
+ if (td->td_compression == COMPRESSION_CCITTFAX3 && is2DEncoding(dsp))
+ { /* NB: default is 1D routine */
+ tif->tif_decoderow = Fax3Decode2D;
+ tif->tif_decodestrip = Fax3Decode2D;
+ tif->tif_decodetile = Fax3Decode2D;
+ }
+
+ if (needsRefLine)
+ { /* 2d encoding */
+ Fax3CodecState *esp = EncoderState(tif);
+ /*
+ * 2d encoding requires a scanline
+ * buffer for the ``reference line''; the
+ * scanline against which delta encoding
+ * is referenced. The reference line must
+ * be initialized to be ``white'' (done elsewhere).
+ */
+ esp->refline = (unsigned char *)_TIFFmallocExt(tif, rowbytes);
+ if (esp->refline == NULL)
+ {
+ TIFFErrorExtR(tif, module, "No space for Group 3/4 reference line");
+ return (0);
+ }
+ }
+ else /* 1d encoding */
+ EncoderState(tif)->refline = NULL;
+
+ return (1);
}
/*
* CCITT Group 3 FAX Encoding.
*/
-#define Fax3FlushBits(tif, sp) { \
- if ((tif)->tif_rawcc >= (tif)->tif_rawdatasize) \
- (void) TIFFFlushData1(tif); \
- *(tif)->tif_rawcp++ = (uint8) (sp)->data; \
- (tif)->tif_rawcc++; \
- (sp)->data = 0, (sp)->bit = 8; \
-}
-#define _FlushBits(tif) { \
- if ((tif)->tif_rawcc >= (tif)->tif_rawdatasize) \
- (void) TIFFFlushData1(tif); \
- *(tif)->tif_rawcp++ = (uint8) data; \
- (tif)->tif_rawcc++; \
- data = 0, bit = 8; \
-}
-static const int _msbmask[9] =
- { 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff };
-#define _PutBits(tif, bits, length) { \
- while (length > bit) { \
- data |= bits >> (length - bit); \
- length -= bit; \
- _FlushBits(tif); \
- } \
- assert( length < 9 ); \
- data |= (bits & _msbmask[length]) << (bit - length); \
- bit -= length; \
- if (bit == 0) \
- _FlushBits(tif); \
-}
-
+#define Fax3FlushBits(tif, sp) \
+ { \
+ if ((tif)->tif_rawcc >= (tif)->tif_rawdatasize) \
+ { \
+ if (!TIFFFlushData1(tif)) \
+ return 0; \
+ } \
+ *(tif)->tif_rawcp++ = (uint8_t)(sp)->data; \
+ (tif)->tif_rawcc++; \
+ (sp)->data = 0, (sp)->bit = 8; \
+ }
+#define _FlushBits(tif) \
+ { \
+ if ((tif)->tif_rawcc >= (tif)->tif_rawdatasize) \
+ { \
+ if (!TIFFFlushData1(tif)) \
+ return 0; \
+ } \
+ *(tif)->tif_rawcp++ = (uint8_t)data; \
+ (tif)->tif_rawcc++; \
+ data = 0, bit = 8; \
+ }
+static const int _msbmask[9] = {0x00, 0x01, 0x03, 0x07, 0x0f,
+ 0x1f, 0x3f, 0x7f, 0xff};
+#define _PutBits(tif, bits, length) \
+ { \
+ while (length > bit) \
+ { \
+ data |= bits >> (length - bit); \
+ length -= bit; \
+ _FlushBits(tif); \
+ } \
+ assert(length < 9); \
+ data |= (bits & _msbmask[length]) << (bit - length); \
+ bit -= length; \
+ if (bit == 0) \
+ _FlushBits(tif); \
+ }
+
/*
* Write a variable-length bit-value to
* the output stream. Values are
* assumed to be at most 16 bits.
*/
-static void
-Fax3PutBits(TIFF* tif, unsigned int bits, unsigned int length)
+static int Fax3PutBits(TIFF *tif, unsigned int bits, unsigned int length)
{
- Fax3CodecState* sp = EncoderState(tif);
- unsigned int bit = sp->bit;
- int data = sp->data;
+ Fax3CodecState *sp = EncoderState(tif);
+ unsigned int bit = sp->bit;
+ int data = sp->data;
- _PutBits(tif, bits, length);
+ _PutBits(tif, bits, length);
- sp->data = data;
- sp->bit = bit;
+ sp->data = data;
+ sp->bit = bit;
+ return 1;
}
/*
* Write a code to the output stream.
*/
-#define putcode(tif, te) Fax3PutBits(tif, (te)->code, (te)->length)
+#define putcode(tif, te) Fax3PutBits(tif, (te)->code, (te)->length)
#ifdef FAX3_DEBUG
-#define DEBUG_COLOR(w) (tab == TIFFFaxWhiteCodes ? w "W" : w "B")
-#define DEBUG_PRINT(what,len) { \
- int t; \
- printf("%08X/%-2d: %s%5d\t", data, bit, DEBUG_COLOR(what), len); \
- for (t = length-1; t >= 0; t--) \
- putchar(code & (1<<t) ? '1' : '0'); \
- putchar('\n'); \
-}
+#define DEBUG_COLOR(w) (tab == TIFFFaxWhiteCodes ? w "W" : w "B")
+#define DEBUG_PRINT(what, len) \
+ { \
+ int t; \
+ printf("%08" PRIX32 "/%-2d: %s%5d\t", data, bit, DEBUG_COLOR(what), \
+ len); \
+ for (t = length - 1; t >= 0; t--) \
+ putchar(code & (1 << t) ? '1' : '0'); \
+ putchar('\n'); \
+ }
#endif
/*
@@ -662,44 +680,47 @@ Fax3PutBits(TIFF* tif, unsigned int bits, unsigned int length)
* appropriate table that holds the make-up and
* terminating codes is supplied.
*/
-static void
-putspan(TIFF* tif, int32 span, const tableentry* tab)
+static int putspan(TIFF *tif, int32_t span, const tableentry *tab)
{
- Fax3CodecState* sp = EncoderState(tif);
- unsigned int bit = sp->bit;
- int data = sp->data;
- unsigned int code, length;
-
- while (span >= 2624) {
- const tableentry* te = &tab[63 + (2560>>6)];
- code = te->code;
- length = te->length;
+ Fax3CodecState *sp = EncoderState(tif);
+ unsigned int bit = sp->bit;
+ int data = sp->data;
+ unsigned int code, length;
+
+ while (span >= 2624)
+ {
+ const tableentry *te = &tab[63 + (2560 >> 6)];
+ code = te->code;
+ length = te->length;
#ifdef FAX3_DEBUG
- DEBUG_PRINT("MakeUp", te->runlen);
+ DEBUG_PRINT("MakeUp", te->runlen);
#endif
- _PutBits(tif, code, length);
- span -= te->runlen;
- }
- if (span >= 64) {
- const tableentry* te = &tab[63 + (span>>6)];
- assert(te->runlen == 64*(span>>6));
- code = te->code;
- length = te->length;
+ _PutBits(tif, code, length);
+ span -= te->runlen;
+ }
+ if (span >= 64)
+ {
+ const tableentry *te = &tab[63 + (span >> 6)];
+ assert(te->runlen == 64 * (span >> 6));
+ code = te->code;
+ length = te->length;
#ifdef FAX3_DEBUG
- DEBUG_PRINT("MakeUp", te->runlen);
+ DEBUG_PRINT("MakeUp", te->runlen);
#endif
- _PutBits(tif, code, length);
- span -= te->runlen;
- }
- code = tab[span].code;
- length = tab[span].length;
+ _PutBits(tif, code, length);
+ span -= te->runlen;
+ }
+ code = tab[span].code;
+ length = tab[span].length;
#ifdef FAX3_DEBUG
- DEBUG_PRINT(" Term", tab[span].runlen);
+ DEBUG_PRINT(" Term", tab[span].runlen);
#endif
- _PutBits(tif, code, length);
+ _PutBits(tif, code, length);
- sp->data = data;
- sp->bit = bit;
+ sp->data = data;
+ sp->bit = bit;
+
+ return 1;
}
/*
@@ -708,258 +729,266 @@ putspan(TIFF* tif, int32 span, const tableentry* tab)
* here. We also handle writing the tag bit for the next
* scanline when doing 2d encoding.
*/
-static void
-Fax3PutEOL(TIFF* tif)
+static int Fax3PutEOL(TIFF *tif)
{
- Fax3CodecState* sp = EncoderState(tif);
- unsigned int bit = sp->bit;
- int data = sp->data;
- unsigned int code, length, tparm;
-
- if (sp->b.groupoptions & GROUP3OPT_FILLBITS) {
- /*
- * Force bit alignment so EOL will terminate on
- * a byte boundary. That is, force the bit alignment
- * to 16-12 = 4 before putting out the EOL code.
- */
- int align = 8 - 4;
- if (align != sp->bit) {
- if (align > sp->bit)
- align = sp->bit + (8 - align);
- else
- align = sp->bit - align;
- tparm=align;
- _PutBits(tif, 0, tparm);
- }
- }
- code = EOL;
- length = 12;
- if (is2DEncoding(sp)) {
- code = (code<<1) | (sp->tag == G3_1D);
- length++;
- }
- _PutBits(tif, code, length);
-
- sp->data = data;
- sp->bit = bit;
+ Fax3CodecState *sp = EncoderState(tif);
+ unsigned int bit = sp->bit;
+ int data = sp->data;
+ unsigned int code, length, tparm;
+
+ if (sp->b.groupoptions & GROUP3OPT_FILLBITS)
+ {
+ /*
+ * Force bit alignment so EOL will terminate on
+ * a byte boundary. That is, force the bit alignment
+ * to 16-12 = 4 before putting out the EOL code.
+ */
+ int align = 8 - 4;
+ if (align != sp->bit)
+ {
+ if (align > sp->bit)
+ align = sp->bit + (8 - align);
+ else
+ align = sp->bit - align;
+ tparm = align;
+ _PutBits(tif, 0, tparm);
+ }
+ }
+ code = EOL;
+ length = 12;
+ if (is2DEncoding(sp))
+ {
+ code = (code << 1) | (sp->tag == G3_1D);
+ length++;
+ }
+ _PutBits(tif, code, length);
+
+ sp->data = data;
+ sp->bit = bit;
+
+ return 1;
}
/*
* Reset encoding state at the start of a strip.
*/
-static int
-Fax3PreEncode(TIFF* tif, uint16 s)
+static int Fax3PreEncode(TIFF *tif, uint16_t s)
{
- Fax3CodecState* sp = EncoderState(tif);
-
- (void) s;
- assert(sp != NULL);
- sp->bit = 8;
- sp->data = 0;
- sp->tag = G3_1D;
- /*
- * This is necessary for Group 4; otherwise it isn't
- * needed because the first scanline of each strip ends
- * up being copied into the refline.
- */
- if (sp->refline)
- _TIFFmemset(sp->refline, 0x00, sp->b.rowbytes);
- if (is2DEncoding(sp)) {
- float res = tif->tif_dir.td_yresolution;
- /*
- * The CCITT spec says that when doing 2d encoding, you
- * should only do it on K consecutive scanlines, where K
- * depends on the resolution of the image being encoded
- * (2 for <= 200 lpi, 4 for > 200 lpi). Since the directory
- * code initializes td_yresolution to 0, this code will
- * select a K of 2 unless the YResolution tag is set
- * appropriately. (Note also that we fudge a little here
- * and use 150 lpi to avoid problems with units conversion.)
- */
- if (tif->tif_dir.td_resolutionunit == RESUNIT_CENTIMETER)
- res *= 2.54f; /* convert to inches */
- sp->maxk = (res > 150 ? 4 : 2);
- sp->k = sp->maxk-1;
- } else
- sp->k = sp->maxk = 0;
- sp->line = 0;
- return (1);
+ Fax3CodecState *sp = EncoderState(tif);
+
+ (void)s;
+ assert(sp != NULL);
+ sp->bit = 8;
+ sp->data = 0;
+ sp->tag = G3_1D;
+ /*
+ * This is necessary for Group 4; otherwise it isn't
+ * needed because the first scanline of each strip ends
+ * up being copied into the refline.
+ */
+ if (sp->refline)
+ _TIFFmemset(sp->refline, 0x00, sp->b.rowbytes);
+ if (is2DEncoding(sp))
+ {
+ float res = tif->tif_dir.td_yresolution;
+ /*
+ * The CCITT spec says that when doing 2d encoding, you
+ * should only do it on K consecutive scanlines, where K
+ * depends on the resolution of the image being encoded
+ * (2 for <= 200 lpi, 4 for > 200 lpi). Since the directory
+ * code initializes td_yresolution to 0, this code will
+ * select a K of 2 unless the YResolution tag is set
+ * appropriately. (Note also that we fudge a little here
+ * and use 150 lpi to avoid problems with units conversion.)
+ */
+ if (tif->tif_dir.td_resolutionunit == RESUNIT_CENTIMETER)
+ res *= 2.54f; /* convert to inches */
+ sp->maxk = (res > 150 ? 4 : 2);
+ sp->k = sp->maxk - 1;
+ }
+ else
+ sp->k = sp->maxk = 0;
+ sp->line = 0;
+ return (1);
}
static const unsigned char zeroruns[256] = {
- 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, /* 0x00 - 0x0f */
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0x10 - 0x1f */
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0x20 - 0x2f */
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0x30 - 0x3f */
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x40 - 0x4f */
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x50 - 0x5f */
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x60 - 0x6f */
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x70 - 0x7f */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 - 0x8f */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 - 0x9f */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0 - 0xaf */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0 - 0xbf */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0 - 0xcf */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0 - 0xdf */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0 - 0xef */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xf0 - 0xff */
+ 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, /* 0x00 - 0x0f */
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0x10 - 0x1f */
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0x20 - 0x2f */
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0x30 - 0x3f */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x40 - 0x4f */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x50 - 0x5f */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x60 - 0x6f */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x70 - 0x7f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 - 0x8f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 - 0x9f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0 - 0xaf */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0 - 0xbf */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0 - 0xcf */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0 - 0xdf */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0 - 0xef */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xf0 - 0xff */
};
static const unsigned char oneruns[256] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 - 0x0f */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 - 0x1f */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 - 0x2f */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 - 0x3f */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 - 0x4f */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 - 0x5f */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 - 0x6f */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 - 0x7f */
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x80 - 0x8f */
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x90 - 0x9f */
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xa0 - 0xaf */
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xb0 - 0xbf */
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0xc0 - 0xcf */
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0xd0 - 0xdf */
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0xe0 - 0xef */
- 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8, /* 0xf0 - 0xff */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 - 0x0f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 - 0x1f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 - 0x2f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 - 0x3f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 - 0x4f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 - 0x5f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 - 0x6f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 - 0x7f */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x80 - 0x8f */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x90 - 0x9f */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xa0 - 0xaf */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xb0 - 0xbf */
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0xc0 - 0xcf */
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0xd0 - 0xdf */
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0xe0 - 0xef */
+ 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8, /* 0xf0 - 0xff */
};
/*
- * On certain systems it pays to inline
- * the routines that find pixel spans.
- */
-#ifdef VAXC
-static int32 find0span(unsigned char*, int32, int32);
-static int32 find1span(unsigned char*, int32, int32);
-#pragma inline(find0span,find1span)
-#endif
-
-/*
* Find a span of ones or zeros using the supplied
* table. The ``base'' of the bit string is supplied
* along with the start+end bit indices.
*/
-inline static int32
-find0span(unsigned char* bp, int32 bs, int32 be)
+static inline int32_t find0span(unsigned char *bp, int32_t bs, int32_t be)
{
- int32 bits = be - bs;
- int32 n, span;
-
- bp += bs>>3;
- /*
- * Check partial byte on lhs.
- */
- if (bits > 0 && (n = (bs & 7)) != 0) {
- span = zeroruns[(*bp << n) & 0xff];
- if (span > 8-n) /* table value too generous */
- span = 8-n;
- if (span > bits) /* constrain span to bit range */
- span = bits;
- if (n+span < 8) /* doesn't extend to edge of byte */
- return (span);
- bits -= span;
- bp++;
- } else
- span = 0;
- if (bits >= (int32)(2 * 8 * sizeof(long))) {
- long* lp;
- /*
- * Align to longword boundary and check longwords.
- */
- while (!isAligned(bp, long)) {
- if (*bp != 0x00)
- return (span + zeroruns[*bp]);
- span += 8;
- bits -= 8;
- bp++;
- }
- lp = (long*) bp;
- while ((bits >= (int32)(8 * sizeof(long))) && (0 == *lp)) {
- span += 8*sizeof (long);
- bits -= 8*sizeof (long);
- lp++;
- }
- bp = (unsigned char*) lp;
- }
- /*
- * Scan full bytes for all 0's.
- */
- while (bits >= 8) {
- if (*bp != 0x00) /* end of run */
- return (span + zeroruns[*bp]);
- span += 8;
- bits -= 8;
- bp++;
- }
- /*
- * Check partial byte on rhs.
- */
- if (bits > 0) {
- n = zeroruns[*bp];
- span += (n > bits ? bits : n);
- }
- return (span);
+ int32_t bits = be - bs;
+ int32_t n, span;
+
+ bp += bs >> 3;
+ /*
+ * Check partial byte on lhs.
+ */
+ if (bits > 0 && (n = (bs & 7)) != 0)
+ {
+ span = zeroruns[(*bp << n) & 0xff];
+ if (span > 8 - n) /* table value too generous */
+ span = 8 - n;
+ if (span > bits) /* constrain span to bit range */
+ span = bits;
+ if (n + span < 8) /* doesn't extend to edge of byte */
+ return (span);
+ bits -= span;
+ bp++;
+ }
+ else
+ span = 0;
+ if (bits >= (int32_t)(2 * 8 * sizeof(int64_t)))
+ {
+ int64_t *lp;
+ /*
+ * Align to int64_t boundary and check int64_t words.
+ */
+ while (!isAligned(bp, int64_t))
+ {
+ if (*bp != 0x00)
+ return (span + zeroruns[*bp]);
+ span += 8;
+ bits -= 8;
+ bp++;
+ }
+ lp = (int64_t *)bp;
+ while ((bits >= (int32_t)(8 * sizeof(int64_t))) && (0 == *lp))
+ {
+ span += 8 * sizeof(int64_t);
+ bits -= 8 * sizeof(int64_t);
+ lp++;
+ }
+ bp = (unsigned char *)lp;
+ }
+ /*
+ * Scan full bytes for all 0's.
+ */
+ while (bits >= 8)
+ {
+ if (*bp != 0x00) /* end of run */
+ return (span + zeroruns[*bp]);
+ span += 8;
+ bits -= 8;
+ bp++;
+ }
+ /*
+ * Check partial byte on rhs.
+ */
+ if (bits > 0)
+ {
+ n = zeroruns[*bp];
+ span += (n > bits ? bits : n);
+ }
+ return (span);
}
-inline static int32
-find1span(unsigned char* bp, int32 bs, int32 be)
+static inline int32_t find1span(unsigned char *bp, int32_t bs, int32_t be)
{
- int32 bits = be - bs;
- int32 n, span;
-
- bp += bs>>3;
- /*
- * Check partial byte on lhs.
- */
- if (bits > 0 && (n = (bs & 7)) != 0) {
- span = oneruns[(*bp << n) & 0xff];
- if (span > 8-n) /* table value too generous */
- span = 8-n;
- if (span > bits) /* constrain span to bit range */
- span = bits;
- if (n+span < 8) /* doesn't extend to edge of byte */
- return (span);
- bits -= span;
- bp++;
- } else
- span = 0;
- if (bits >= (int32)(2 * 8 * sizeof(long))) {
- long* lp;
- /*
- * Align to longword boundary and check longwords.
- */
- while (!isAligned(bp, long)) {
- if (*bp != 0xff)
- return (span + oneruns[*bp]);
- span += 8;
- bits -= 8;
- bp++;
- }
- lp = (long*) bp;
- while ((bits >= (int32)(8 * sizeof(long))) && (~0 == *lp)) {
- span += 8*sizeof (long);
- bits -= 8*sizeof (long);
- lp++;
- }
- bp = (unsigned char*) lp;
- }
- /*
- * Scan full bytes for all 1's.
- */
- while (bits >= 8) {
- if (*bp != 0xff) /* end of run */
- return (span + oneruns[*bp]);
- span += 8;
- bits -= 8;
- bp++;
- }
- /*
- * Check partial byte on rhs.
- */
- if (bits > 0) {
- n = oneruns[*bp];
- span += (n > bits ? bits : n);
- }
- return (span);
+ int32_t bits = be - bs;
+ int32_t n, span;
+
+ bp += bs >> 3;
+ /*
+ * Check partial byte on lhs.
+ */
+ if (bits > 0 && (n = (bs & 7)) != 0)
+ {
+ span = oneruns[(*bp << n) & 0xff];
+ if (span > 8 - n) /* table value too generous */
+ span = 8 - n;
+ if (span > bits) /* constrain span to bit range */
+ span = bits;
+ if (n + span < 8) /* doesn't extend to edge of byte */
+ return (span);
+ bits -= span;
+ bp++;
+ }
+ else
+ span = 0;
+ if (bits >= (int32_t)(2 * 8 * sizeof(int64_t)))
+ {
+ int64_t *lp;
+ /*
+ * Align to int64_t boundary and check int64_t words.
+ */
+ while (!isAligned(bp, int64_t))
+ {
+ if (*bp != 0xff)
+ return (span + oneruns[*bp]);
+ span += 8;
+ bits -= 8;
+ bp++;
+ }
+ lp = (int64_t *)bp;
+ while ((bits >= (int32_t)(8 * sizeof(int64_t))) &&
+ (~((uint64_t)0) == (uint64_t)*lp))
+ {
+ span += 8 * sizeof(int64_t);
+ bits -= 8 * sizeof(int64_t);
+ lp++;
+ }
+ bp = (unsigned char *)lp;
+ }
+ /*
+ * Scan full bytes for all 1's.
+ */
+ while (bits >= 8)
+ {
+ if (*bp != 0xff) /* end of run */
+ return (span + oneruns[*bp]);
+ span += 8;
+ bits -= 8;
+ bp++;
+ }
+ /*
+ * Check partial byte on rhs.
+ */
+ if (bits > 0)
+ {
+ n = oneruns[*bp];
+ span += (n > bits ? bits : n);
+ }
+ return (span);
}
/*
@@ -968,455 +997,501 @@ find1span(unsigned char* bp, int32 bs, int32 be)
* color. The end, be, is returned if no such bit
* exists.
*/
-#define finddiff(_cp, _bs, _be, _color) \
- (_bs + (_color ? find1span(_cp,_bs,_be) : find0span(_cp,_bs,_be)))
+#define finddiff(_cp, _bs, _be, _color) \
+ (_bs + (_color ? find1span(_cp, _bs, _be) : find0span(_cp, _bs, _be)))
/*
* Like finddiff, but also check the starting bit
* against the end in case start > end.
*/
-#define finddiff2(_cp, _bs, _be, _color) \
- (_bs < _be ? finddiff(_cp,_bs,_be,_color) : _be)
+#define finddiff2(_cp, _bs, _be, _color) \
+ (_bs < _be ? finddiff(_cp, _bs, _be, _color) : _be)
/*
* 1d-encode a row of pixels. The encoding is
* a sequence of all-white or all-black spans
* of pixels encoded with Huffman codes.
*/
-static int
-Fax3Encode1DRow(TIFF* tif, unsigned char* bp, uint32 bits)
+static int Fax3Encode1DRow(TIFF *tif, unsigned char *bp, uint32_t bits)
{
- Fax3CodecState* sp = EncoderState(tif);
- int32 span;
- uint32 bs = 0;
-
- for (;;) {
- span = find0span(bp, bs, bits); /* white span */
- putspan(tif, span, TIFFFaxWhiteCodes);
- bs += span;
- if (bs >= bits)
- break;
- span = find1span(bp, bs, bits); /* black span */
- putspan(tif, span, TIFFFaxBlackCodes);
- bs += span;
- if (bs >= bits)
- break;
- }
- if (sp->b.mode & (FAXMODE_BYTEALIGN|FAXMODE_WORDALIGN)) {
- if (sp->bit != 8) /* byte-align */
- Fax3FlushBits(tif, sp);
- if ((sp->b.mode&FAXMODE_WORDALIGN) &&
- !isAligned(tif->tif_rawcp, uint16))
- Fax3FlushBits(tif, sp);
- }
- return (1);
+ Fax3CodecState *sp = EncoderState(tif);
+ int32_t span;
+ uint32_t bs = 0;
+
+ for (;;)
+ {
+ span = find0span(bp, bs, bits); /* white span */
+ if (!putspan(tif, span, TIFFFaxWhiteCodes))
+ return 0;
+ bs += span;
+ if (bs >= bits)
+ break;
+ span = find1span(bp, bs, bits); /* black span */
+ if (!putspan(tif, span, TIFFFaxBlackCodes))
+ return 0;
+ bs += span;
+ if (bs >= bits)
+ break;
+ }
+ if (sp->b.mode & (FAXMODE_BYTEALIGN | FAXMODE_WORDALIGN))
+ {
+ if (sp->bit != 8) /* byte-align */
+ Fax3FlushBits(tif, sp);
+ if ((sp->b.mode & FAXMODE_WORDALIGN) &&
+ !isAligned(tif->tif_rawcp, uint16_t))
+ Fax3FlushBits(tif, sp);
+ }
+ return (1);
}
-static const tableentry horizcode =
- { 3, 0x1, 0 }; /* 001 */
-static const tableentry passcode =
- { 4, 0x1, 0 }; /* 0001 */
+static const tableentry horizcode = {3, 0x1, 0}; /* 001 */
+static const tableentry passcode = {4, 0x1, 0}; /* 0001 */
static const tableentry vcodes[7] = {
- { 7, 0x03, 0 }, /* 0000 011 */
- { 6, 0x03, 0 }, /* 0000 11 */
- { 3, 0x03, 0 }, /* 011 */
- { 1, 0x1, 0 }, /* 1 */
- { 3, 0x2, 0 }, /* 010 */
- { 6, 0x02, 0 }, /* 0000 10 */
- { 7, 0x02, 0 } /* 0000 010 */
+ {7, 0x03, 0}, /* 0000 011 */
+ {6, 0x03, 0}, /* 0000 11 */
+ {3, 0x03, 0}, /* 011 */
+ {1, 0x1, 0}, /* 1 */
+ {3, 0x2, 0}, /* 010 */
+ {6, 0x02, 0}, /* 0000 10 */
+ {7, 0x02, 0} /* 0000 010 */
};
/*
* 2d-encode a row of pixels. Consult the CCITT
* documentation for the algorithm.
*/
-static int
-Fax3Encode2DRow(TIFF* tif, unsigned char* bp, unsigned char* rp, uint32 bits)
+static int Fax3Encode2DRow(TIFF *tif, unsigned char *bp, unsigned char *rp,
+ uint32_t bits)
{
-#define PIXEL(buf,ix) ((((buf)[(ix)>>3]) >> (7-((ix)&7))) & 1)
- uint32 a0 = 0;
- uint32 a1 = (PIXEL(bp, 0) != 0 ? 0 : finddiff(bp, 0, bits, 0));
- uint32 b1 = (PIXEL(rp, 0) != 0 ? 0 : finddiff(rp, 0, bits, 0));
- uint32 a2, b2;
-
- for (;;) {
- b2 = finddiff2(rp, b1, bits, PIXEL(rp,b1));
- if (b2 >= a1) {
- /* Naive computation triggers -fsanitize=undefined,unsigned-integer-overflow */
- /* although it is correct unless the difference between both is < 31 bit */
- /* int32 d = b1 - a1; */
- int32 d = (b1 >= a1 && b1 - a1 <= 3U) ? (int32)(b1 - a1):
- (b1 < a1 && a1 - b1 <= 3U) ? -(int32)(a1 - b1) : 0x7FFFFFFF;
- if (!(-3 <= d && d <= 3)) { /* horizontal mode */
- a2 = finddiff2(bp, a1, bits, PIXEL(bp,a1));
- putcode(tif, &horizcode);
- if (a0+a1 == 0 || PIXEL(bp, a0) == 0) {
- putspan(tif, a1-a0, TIFFFaxWhiteCodes);
- putspan(tif, a2-a1, TIFFFaxBlackCodes);
- } else {
- putspan(tif, a1-a0, TIFFFaxBlackCodes);
- putspan(tif, a2-a1, TIFFFaxWhiteCodes);
- }
- a0 = a2;
- } else { /* vertical mode */
- putcode(tif, &vcodes[d+3]);
- a0 = a1;
- }
- } else { /* pass mode */
- putcode(tif, &passcode);
- a0 = b2;
- }
- if (a0 >= bits)
- break;
- a1 = finddiff(bp, a0, bits, PIXEL(bp,a0));
- b1 = finddiff(rp, a0, bits, !PIXEL(bp,a0));
- b1 = finddiff(rp, b1, bits, PIXEL(bp,a0));
- }
- return (1);
+#define PIXEL(buf, ix) ((((buf)[(ix) >> 3]) >> (7 - ((ix)&7))) & 1)
+ uint32_t a0 = 0;
+ uint32_t a1 = (PIXEL(bp, 0) != 0 ? 0 : finddiff(bp, 0, bits, 0));
+ uint32_t b1 = (PIXEL(rp, 0) != 0 ? 0 : finddiff(rp, 0, bits, 0));
+ uint32_t a2, b2;
+
+ for (;;)
+ {
+ b2 = finddiff2(rp, b1, bits, PIXEL(rp, b1));
+ if (b2 >= a1)
+ {
+ /* Naive computation triggers
+ * -fsanitize=undefined,unsigned-integer-overflow */
+ /* although it is correct unless the difference between both is < 31
+ * bit */
+ /* int32_t d = b1 - a1; */
+ int32_t d = (b1 >= a1 && b1 - a1 <= 3U) ? (int32_t)(b1 - a1)
+ : (b1 < a1 && a1 - b1 <= 3U) ? -(int32_t)(a1 - b1)
+ : 0x7FFFFFFF;
+ if (!(-3 <= d && d <= 3))
+ { /* horizontal mode */
+ a2 = finddiff2(bp, a1, bits, PIXEL(bp, a1));
+ if (!putcode(tif, &horizcode))
+ return 0;
+ if (a0 + a1 == 0 || PIXEL(bp, a0) == 0)
+ {
+ if (!putspan(tif, a1 - a0, TIFFFaxWhiteCodes))
+ return 0;
+ if (!putspan(tif, a2 - a1, TIFFFaxBlackCodes))
+ return 0;
+ }
+ else
+ {
+ if (!putspan(tif, a1 - a0, TIFFFaxBlackCodes))
+ return 0;
+ if (!putspan(tif, a2 - a1, TIFFFaxWhiteCodes))
+ return 0;
+ }
+ a0 = a2;
+ }
+ else
+ { /* vertical mode */
+ if (!putcode(tif, &vcodes[d + 3]))
+ return 0;
+ a0 = a1;
+ }
+ }
+ else
+ { /* pass mode */
+ if (!putcode(tif, &passcode))
+ return 0;
+ a0 = b2;
+ }
+ if (a0 >= bits)
+ break;
+ a1 = finddiff(bp, a0, bits, PIXEL(bp, a0));
+ b1 = finddiff(rp, a0, bits, !PIXEL(bp, a0));
+ b1 = finddiff(rp, b1, bits, PIXEL(bp, a0));
+ }
+ return (1);
#undef PIXEL
}
/*
* Encode a buffer of pixels.
*/
-static int
-Fax3Encode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
+static int Fax3Encode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
{
- static const char module[] = "Fax3Encode";
- Fax3CodecState* sp = EncoderState(tif);
- (void) s;
- if (cc % sp->b.rowbytes)
- {
- TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be written");
- return (0);
- }
- while (cc > 0) {
- if ((sp->b.mode & FAXMODE_NOEOL) == 0)
- Fax3PutEOL(tif);
- if (is2DEncoding(sp)) {
- if (sp->tag == G3_1D) {
- if (!Fax3Encode1DRow(tif, bp, sp->b.rowpixels))
- return (0);
- sp->tag = G3_2D;
- } else {
- if (!Fax3Encode2DRow(tif, bp, sp->refline,
- sp->b.rowpixels))
- return (0);
- sp->k--;
- }
- if (sp->k == 0) {
- sp->tag = G3_1D;
- sp->k = sp->maxk-1;
- } else
- _TIFFmemcpy(sp->refline, bp, sp->b.rowbytes);
- } else {
- if (!Fax3Encode1DRow(tif, bp, sp->b.rowpixels))
- return (0);
- }
- bp += sp->b.rowbytes;
- cc -= sp->b.rowbytes;
- }
- return (1);
+ static const char module[] = "Fax3Encode";
+ Fax3CodecState *sp = EncoderState(tif);
+ (void)s;
+ if (cc % sp->b.rowbytes)
+ {
+ TIFFErrorExtR(tif, module, "Fractional scanlines cannot be written");
+ return (0);
+ }
+ while (cc > 0)
+ {
+ if ((sp->b.mode & FAXMODE_NOEOL) == 0)
+ {
+ if (!Fax3PutEOL(tif))
+ return 0;
+ }
+ if (is2DEncoding(sp))
+ {
+ if (sp->tag == G3_1D)
+ {
+ if (!Fax3Encode1DRow(tif, bp, sp->b.rowpixels))
+ return (0);
+ sp->tag = G3_2D;
+ }
+ else
+ {
+ if (!Fax3Encode2DRow(tif, bp, sp->refline, sp->b.rowpixels))
+ return (0);
+ sp->k--;
+ }
+ if (sp->k == 0)
+ {
+ sp->tag = G3_1D;
+ sp->k = sp->maxk - 1;
+ }
+ else
+ _TIFFmemcpy(sp->refline, bp, sp->b.rowbytes);
+ }
+ else
+ {
+ if (!Fax3Encode1DRow(tif, bp, sp->b.rowpixels))
+ return (0);
+ }
+ bp += sp->b.rowbytes;
+ cc -= sp->b.rowbytes;
+ }
+ return (1);
}
-static int
-Fax3PostEncode(TIFF* tif)
+static int Fax3PostEncode(TIFF *tif)
{
- Fax3CodecState* sp = EncoderState(tif);
+ Fax3CodecState *sp = EncoderState(tif);
- if (sp->bit != 8)
- Fax3FlushBits(tif, sp);
- return (1);
+ if (sp->bit != 8)
+ Fax3FlushBits(tif, sp);
+ return (1);
}
-static void
-Fax3Close(TIFF* tif)
+static int _Fax3Close(TIFF *tif)
{
- if ((Fax3State(tif)->mode & FAXMODE_NORTC) == 0 && tif->tif_rawcp) {
- Fax3CodecState* sp = EncoderState(tif);
- unsigned int code = EOL;
- unsigned int length = 12;
- int i;
-
- if (is2DEncoding(sp)) {
- code = (code<<1) | (sp->tag == G3_1D);
- length++;
- }
- for (i = 0; i < 6; i++)
- Fax3PutBits(tif, code, length);
- Fax3FlushBits(tif, sp);
- }
+ if ((Fax3State(tif)->mode & FAXMODE_NORTC) == 0 && tif->tif_rawcp)
+ {
+ Fax3CodecState *sp = EncoderState(tif);
+ unsigned int code = EOL;
+ unsigned int length = 12;
+ int i;
+
+ if (is2DEncoding(sp))
+ {
+ code = (code << 1) | (sp->tag == G3_1D);
+ length++;
+ }
+ for (i = 0; i < 6; i++)
+ Fax3PutBits(tif, code, length);
+ Fax3FlushBits(tif, sp);
+ }
+ return 1;
}
-static void
-Fax3Cleanup(TIFF* tif)
+static void Fax3Close(TIFF *tif) { _Fax3Close(tif); }
+
+static void Fax3Cleanup(TIFF *tif)
{
- Fax3CodecState* sp = DecoderState(tif);
-
- assert(sp != 0);
+ Fax3CodecState *sp = DecoderState(tif);
- tif->tif_tagmethods.vgetfield = sp->b.vgetparent;
- tif->tif_tagmethods.vsetfield = sp->b.vsetparent;
- tif->tif_tagmethods.printdir = sp->b.printdir;
+ assert(sp != 0);
- if (sp->runs)
- _TIFFfree(sp->runs);
- if (sp->refline)
- _TIFFfree(sp->refline);
+ tif->tif_tagmethods.vgetfield = sp->b.vgetparent;
+ tif->tif_tagmethods.vsetfield = sp->b.vsetparent;
+ tif->tif_tagmethods.printdir = sp->b.printdir;
- _TIFFfree(tif->tif_data);
- tif->tif_data = NULL;
+ if (sp->runs)
+ _TIFFfreeExt(tif, sp->runs);
+ if (sp->refline)
+ _TIFFfreeExt(tif, sp->refline);
- _TIFFSetDefaultCompressionState(tif);
+ _TIFFfreeExt(tif, tif->tif_data);
+ tif->tif_data = NULL;
+
+ _TIFFSetDefaultCompressionState(tif);
}
-#define FIELD_BADFAXLINES (FIELD_CODEC+0)
-#define FIELD_CLEANFAXDATA (FIELD_CODEC+1)
-#define FIELD_BADFAXRUN (FIELD_CODEC+2)
+#define FIELD_BADFAXLINES (FIELD_CODEC + 0)
+#define FIELD_CLEANFAXDATA (FIELD_CODEC + 1)
+#define FIELD_BADFAXRUN (FIELD_CODEC + 2)
-#define FIELD_OPTIONS (FIELD_CODEC+7)
+#define FIELD_OPTIONS (FIELD_CODEC + 7)
static const TIFFField faxFields[] = {
- { TIFFTAG_FAXMODE, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "FaxMode", NULL },
- { TIFFTAG_FAXFILLFUNC, 0, 0, TIFF_ANY, 0, TIFF_SETGET_OTHER, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "FaxFillFunc", NULL },
- { TIFFTAG_BADFAXLINES, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_BADFAXLINES, TRUE, FALSE, "BadFaxLines", NULL },
- { TIFFTAG_CLEANFAXDATA, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UINT16, FIELD_CLEANFAXDATA, TRUE, FALSE, "CleanFaxData", NULL },
- { TIFFTAG_CONSECUTIVEBADFAXLINES, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_BADFAXRUN, TRUE, FALSE, "ConsecutiveBadFaxLines", NULL }};
+ {TIFFTAG_FAXMODE, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED,
+ FIELD_PSEUDO, FALSE, FALSE, "FaxMode", NULL},
+ {TIFFTAG_FAXFILLFUNC, 0, 0, TIFF_ANY, 0, TIFF_SETGET_OTHER,
+ TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "FaxFillFunc", NULL},
+ {TIFFTAG_BADFAXLINES, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UINT32, FIELD_BADFAXLINES, TRUE, FALSE, "BadFaxLines", NULL},
+ {TIFFTAG_CLEANFAXDATA, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UINT16, FIELD_CLEANFAXDATA, TRUE, FALSE, "CleanFaxData", NULL},
+ {TIFFTAG_CONSECUTIVEBADFAXLINES, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UINT32, FIELD_BADFAXRUN, TRUE, FALSE, "ConsecutiveBadFaxLines",
+ NULL}};
static const TIFFField fax3Fields[] = {
- { TIFFTAG_GROUP3OPTIONS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_OPTIONS, FALSE, FALSE, "Group3Options", NULL },
+ {TIFFTAG_GROUP3OPTIONS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UINT32, FIELD_OPTIONS, FALSE, FALSE, "Group3Options", NULL},
};
static const TIFFField fax4Fields[] = {
- { TIFFTAG_GROUP4OPTIONS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_OPTIONS, FALSE, FALSE, "Group4Options", NULL },
+ {TIFFTAG_GROUP4OPTIONS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UINT32, FIELD_OPTIONS, FALSE, FALSE, "Group4Options", NULL},
};
-static int
-Fax3VSetField(TIFF* tif, uint32 tag, va_list ap)
+static int Fax3VSetField(TIFF *tif, uint32_t tag, va_list ap)
{
- Fax3BaseState* sp = Fax3State(tif);
- const TIFFField* fip;
-
- assert(sp != 0);
- assert(sp->vsetparent != 0);
-
- switch (tag) {
- case TIFFTAG_FAXMODE:
- sp->mode = (int) va_arg(ap, int);
- return 1; /* NB: pseudo tag */
- case TIFFTAG_FAXFILLFUNC:
- DecoderState(tif)->fill = va_arg(ap, TIFFFaxFillFunc);
- return 1; /* NB: pseudo tag */
- case TIFFTAG_GROUP3OPTIONS:
- /* XXX: avoid reading options if compression mismatches. */
- if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX3)
- sp->groupoptions = (uint32) va_arg(ap, uint32);
- break;
- case TIFFTAG_GROUP4OPTIONS:
- /* XXX: avoid reading options if compression mismatches. */
- if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX4)
- sp->groupoptions = (uint32) va_arg(ap, uint32);
- break;
- case TIFFTAG_BADFAXLINES:
- sp->badfaxlines = (uint32) va_arg(ap, uint32);
- break;
- case TIFFTAG_CLEANFAXDATA:
- sp->cleanfaxdata = (uint16) va_arg(ap, uint16_vap);
- break;
- case TIFFTAG_CONSECUTIVEBADFAXLINES:
- sp->badfaxrun = (uint32) va_arg(ap, uint32);
- break;
- default:
- return (*sp->vsetparent)(tif, tag, ap);
- }
-
- if ((fip = TIFFFieldWithTag(tif, tag)) != NULL)
- TIFFSetFieldBit(tif, fip->field_bit);
- else
- return 0;
-
- tif->tif_flags |= TIFF_DIRTYDIRECT;
- return 1;
+ Fax3BaseState *sp = Fax3State(tif);
+ const TIFFField *fip;
+
+ assert(sp != 0);
+ assert(sp->vsetparent != 0);
+
+ switch (tag)
+ {
+ case TIFFTAG_FAXMODE:
+ sp->mode = (int)va_arg(ap, int);
+ return 1; /* NB: pseudo tag */
+ case TIFFTAG_FAXFILLFUNC:
+ DecoderState(tif)->fill = va_arg(ap, TIFFFaxFillFunc);
+ return 1; /* NB: pseudo tag */
+ case TIFFTAG_GROUP3OPTIONS:
+ /* XXX: avoid reading options if compression mismatches. */
+ if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX3)
+ sp->groupoptions = (uint32_t)va_arg(ap, uint32_t);
+ break;
+ case TIFFTAG_GROUP4OPTIONS:
+ /* XXX: avoid reading options if compression mismatches. */
+ if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX4)
+ sp->groupoptions = (uint32_t)va_arg(ap, uint32_t);
+ break;
+ case TIFFTAG_BADFAXLINES:
+ sp->badfaxlines = (uint32_t)va_arg(ap, uint32_t);
+ break;
+ case TIFFTAG_CLEANFAXDATA:
+ sp->cleanfaxdata = (uint16_t)va_arg(ap, uint16_vap);
+ break;
+ case TIFFTAG_CONSECUTIVEBADFAXLINES:
+ sp->badfaxrun = (uint32_t)va_arg(ap, uint32_t);
+ break;
+ default:
+ return (*sp->vsetparent)(tif, tag, ap);
+ }
+
+ if ((fip = TIFFFieldWithTag(tif, tag)) != NULL)
+ TIFFSetFieldBit(tif, fip->field_bit);
+ else
+ return 0;
+
+ tif->tif_flags |= TIFF_DIRTYDIRECT;
+ return 1;
}
-static int
-Fax3VGetField(TIFF* tif, uint32 tag, va_list ap)
+static int Fax3VGetField(TIFF *tif, uint32_t tag, va_list ap)
{
- Fax3BaseState* sp = Fax3State(tif);
-
- assert(sp != 0);
-
- switch (tag) {
- case TIFFTAG_FAXMODE:
- *va_arg(ap, int*) = sp->mode;
- break;
- case TIFFTAG_FAXFILLFUNC:
- *va_arg(ap, TIFFFaxFillFunc*) = DecoderState(tif)->fill;
- break;
- case TIFFTAG_GROUP3OPTIONS:
- case TIFFTAG_GROUP4OPTIONS:
- *va_arg(ap, uint32*) = sp->groupoptions;
- break;
- case TIFFTAG_BADFAXLINES:
- *va_arg(ap, uint32*) = sp->badfaxlines;
- break;
- case TIFFTAG_CLEANFAXDATA:
- *va_arg(ap, uint16*) = sp->cleanfaxdata;
- break;
- case TIFFTAG_CONSECUTIVEBADFAXLINES:
- *va_arg(ap, uint32*) = sp->badfaxrun;
- break;
- default:
- return (*sp->vgetparent)(tif, tag, ap);
- }
- return (1);
+ Fax3BaseState *sp = Fax3State(tif);
+
+ assert(sp != 0);
+
+ switch (tag)
+ {
+ case TIFFTAG_FAXMODE:
+ *va_arg(ap, int *) = sp->mode;
+ break;
+ case TIFFTAG_FAXFILLFUNC:
+ *va_arg(ap, TIFFFaxFillFunc *) = DecoderState(tif)->fill;
+ break;
+ case TIFFTAG_GROUP3OPTIONS:
+ case TIFFTAG_GROUP4OPTIONS:
+ *va_arg(ap, uint32_t *) = sp->groupoptions;
+ break;
+ case TIFFTAG_BADFAXLINES:
+ *va_arg(ap, uint32_t *) = sp->badfaxlines;
+ break;
+ case TIFFTAG_CLEANFAXDATA:
+ *va_arg(ap, uint16_t *) = sp->cleanfaxdata;
+ break;
+ case TIFFTAG_CONSECUTIVEBADFAXLINES:
+ *va_arg(ap, uint32_t *) = sp->badfaxrun;
+ break;
+ default:
+ return (*sp->vgetparent)(tif, tag, ap);
+ }
+ return (1);
}
-static void
-Fax3PrintDir(TIFF* tif, FILE* fd, long flags)
+static void Fax3PrintDir(TIFF *tif, FILE *fd, long flags)
{
- Fax3BaseState* sp = Fax3State(tif);
-
- assert(sp != 0);
-
- (void) flags;
- if (TIFFFieldSet(tif,FIELD_OPTIONS)) {
- const char* sep = " ";
- if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX4) {
- fprintf(fd, " Group 4 Options:");
- if (sp->groupoptions & GROUP4OPT_UNCOMPRESSED)
- fprintf(fd, "%suncompressed data", sep);
- } else {
-
- fprintf(fd, " Group 3 Options:");
- if (sp->groupoptions & GROUP3OPT_2DENCODING) {
- fprintf(fd, "%s2-d encoding", sep);
- sep = "+";
- }
- if (sp->groupoptions & GROUP3OPT_FILLBITS) {
- fprintf(fd, "%sEOL padding", sep);
- sep = "+";
- }
- if (sp->groupoptions & GROUP3OPT_UNCOMPRESSED)
- fprintf(fd, "%suncompressed data", sep);
- }
- fprintf(fd, " (%lu = 0x%lx)\n",
- (unsigned long) sp->groupoptions,
- (unsigned long) sp->groupoptions);
- }
- if (TIFFFieldSet(tif,FIELD_CLEANFAXDATA)) {
- fprintf(fd, " Fax Data:");
- switch (sp->cleanfaxdata) {
- case CLEANFAXDATA_CLEAN:
- fprintf(fd, " clean");
- break;
- case CLEANFAXDATA_REGENERATED:
- fprintf(fd, " receiver regenerated");
- break;
- case CLEANFAXDATA_UNCLEAN:
- fprintf(fd, " uncorrected errors");
- break;
- }
- fprintf(fd, " (%u = 0x%x)\n",
- sp->cleanfaxdata, sp->cleanfaxdata);
- }
- if (TIFFFieldSet(tif,FIELD_BADFAXLINES))
- fprintf(fd, " Bad Fax Lines: %lu\n",
- (unsigned long) sp->badfaxlines);
- if (TIFFFieldSet(tif,FIELD_BADFAXRUN))
- fprintf(fd, " Consecutive Bad Fax Lines: %lu\n",
- (unsigned long) sp->badfaxrun);
- if (sp->printdir)
- (*sp->printdir)(tif, fd, flags);
+ Fax3BaseState *sp = Fax3State(tif);
+
+ assert(sp != 0);
+
+ (void)flags;
+ if (TIFFFieldSet(tif, FIELD_OPTIONS))
+ {
+ const char *sep = " ";
+ if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX4)
+ {
+ fprintf(fd, " Group 4 Options:");
+ if (sp->groupoptions & GROUP4OPT_UNCOMPRESSED)
+ fprintf(fd, "%suncompressed data", sep);
+ }
+ else
+ {
+
+ fprintf(fd, " Group 3 Options:");
+ if (sp->groupoptions & GROUP3OPT_2DENCODING)
+ {
+ fprintf(fd, "%s2-d encoding", sep);
+ sep = "+";
+ }
+ if (sp->groupoptions & GROUP3OPT_FILLBITS)
+ {
+ fprintf(fd, "%sEOL padding", sep);
+ sep = "+";
+ }
+ if (sp->groupoptions & GROUP3OPT_UNCOMPRESSED)
+ fprintf(fd, "%suncompressed data", sep);
+ }
+ fprintf(fd, " (%" PRIu32 " = 0x%" PRIx32 ")\n", sp->groupoptions,
+ sp->groupoptions);
+ }
+ if (TIFFFieldSet(tif, FIELD_CLEANFAXDATA))
+ {
+ fprintf(fd, " Fax Data:");
+ switch (sp->cleanfaxdata)
+ {
+ case CLEANFAXDATA_CLEAN:
+ fprintf(fd, " clean");
+ break;
+ case CLEANFAXDATA_REGENERATED:
+ fprintf(fd, " receiver regenerated");
+ break;
+ case CLEANFAXDATA_UNCLEAN:
+ fprintf(fd, " uncorrected errors");
+ break;
+ }
+ fprintf(fd, " (%" PRIu16 " = 0x%" PRIx16 ")\n", sp->cleanfaxdata,
+ sp->cleanfaxdata);
+ }
+ if (TIFFFieldSet(tif, FIELD_BADFAXLINES))
+ fprintf(fd, " Bad Fax Lines: %" PRIu32 "\n", sp->badfaxlines);
+ if (TIFFFieldSet(tif, FIELD_BADFAXRUN))
+ fprintf(fd, " Consecutive Bad Fax Lines: %" PRIu32 "\n",
+ sp->badfaxrun);
+ if (sp->printdir)
+ (*sp->printdir)(tif, fd, flags);
}
-static int
-InitCCITTFax3(TIFF* tif)
+static int InitCCITTFax3(TIFF *tif)
{
- static const char module[] = "InitCCITTFax3";
- Fax3BaseState* sp;
-
- /*
- * Merge codec-specific tag information.
- */
- if (!_TIFFMergeFields(tif, faxFields, TIFFArrayCount(faxFields))) {
- TIFFErrorExt(tif->tif_clientdata, "InitCCITTFax3",
- "Merging common CCITT Fax codec-specific tags failed");
- return 0;
- }
-
- /*
- * Allocate state block so tag methods have storage to record values.
- */
- tif->tif_data = (uint8*)
- _TIFFmalloc(sizeof (Fax3CodecState));
-
- if (tif->tif_data == NULL) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "No space for state block");
- return (0);
- }
- _TIFFmemset(tif->tif_data, 0, sizeof (Fax3CodecState));
-
- sp = Fax3State(tif);
- sp->rw_mode = tif->tif_mode;
-
- /*
- * Override parent get/set field methods.
- */
- sp->vgetparent = tif->tif_tagmethods.vgetfield;
- tif->tif_tagmethods.vgetfield = Fax3VGetField; /* hook for codec tags */
- sp->vsetparent = tif->tif_tagmethods.vsetfield;
- tif->tif_tagmethods.vsetfield = Fax3VSetField; /* hook for codec tags */
- sp->printdir = tif->tif_tagmethods.printdir;
- tif->tif_tagmethods.printdir = Fax3PrintDir; /* hook for codec tags */
- sp->groupoptions = 0;
-
- if (sp->rw_mode == O_RDONLY) /* FIXME: improve for in place update */
- tif->tif_flags |= TIFF_NOBITREV; /* decoder does bit reversal */
- DecoderState(tif)->runs = NULL;
- TIFFSetField(tif, TIFFTAG_FAXFILLFUNC, _TIFFFax3fillruns);
- EncoderState(tif)->refline = NULL;
-
- /*
- * Install codec methods.
- */
- tif->tif_fixuptags = Fax3FixupTags;
- tif->tif_setupdecode = Fax3SetupState;
- tif->tif_predecode = Fax3PreDecode;
- tif->tif_decoderow = Fax3Decode1D;
- tif->tif_decodestrip = Fax3Decode1D;
- tif->tif_decodetile = Fax3Decode1D;
- tif->tif_setupencode = Fax3SetupState;
- tif->tif_preencode = Fax3PreEncode;
- tif->tif_postencode = Fax3PostEncode;
- tif->tif_encoderow = Fax3Encode;
- tif->tif_encodestrip = Fax3Encode;
- tif->tif_encodetile = Fax3Encode;
- tif->tif_close = Fax3Close;
- tif->tif_cleanup = Fax3Cleanup;
-
- return (1);
+ static const char module[] = "InitCCITTFax3";
+ Fax3BaseState *sp;
+
+ /*
+ * Merge codec-specific tag information.
+ */
+ if (!_TIFFMergeFields(tif, faxFields, TIFFArrayCount(faxFields)))
+ {
+ TIFFErrorExtR(tif, "InitCCITTFax3",
+ "Merging common CCITT Fax codec-specific tags failed");
+ return 0;
+ }
+
+ /*
+ * Allocate state block so tag methods have storage to record values.
+ */
+ tif->tif_data = (uint8_t *)_TIFFmallocExt(tif, sizeof(Fax3CodecState));
+
+ if (tif->tif_data == NULL)
+ {
+ TIFFErrorExtR(tif, module, "No space for state block");
+ return (0);
+ }
+ _TIFFmemset(tif->tif_data, 0, sizeof(Fax3CodecState));
+
+ sp = Fax3State(tif);
+ sp->rw_mode = tif->tif_mode;
+
+ /*
+ * Override parent get/set field methods.
+ */
+ sp->vgetparent = tif->tif_tagmethods.vgetfield;
+ tif->tif_tagmethods.vgetfield = Fax3VGetField; /* hook for codec tags */
+ sp->vsetparent = tif->tif_tagmethods.vsetfield;
+ tif->tif_tagmethods.vsetfield = Fax3VSetField; /* hook for codec tags */
+ sp->printdir = tif->tif_tagmethods.printdir;
+ tif->tif_tagmethods.printdir = Fax3PrintDir; /* hook for codec tags */
+ sp->groupoptions = 0;
+
+ if (sp->rw_mode == O_RDONLY) /* FIXME: improve for in place update */
+ tif->tif_flags |= TIFF_NOBITREV; /* decoder does bit reversal */
+ DecoderState(tif)->runs = NULL;
+ TIFFSetField(tif, TIFFTAG_FAXFILLFUNC, _TIFFFax3fillruns);
+ EncoderState(tif)->refline = NULL;
+
+ /*
+ * Install codec methods.
+ */
+ tif->tif_fixuptags = Fax3FixupTags;
+ tif->tif_setupdecode = Fax3SetupState;
+ tif->tif_predecode = Fax3PreDecode;
+ tif->tif_decoderow = Fax3Decode1D;
+ tif->tif_decodestrip = Fax3Decode1D;
+ tif->tif_decodetile = Fax3Decode1D;
+ tif->tif_setupencode = Fax3SetupState;
+ tif->tif_preencode = Fax3PreEncode;
+ tif->tif_postencode = Fax3PostEncode;
+ tif->tif_encoderow = Fax3Encode;
+ tif->tif_encodestrip = Fax3Encode;
+ tif->tif_encodetile = Fax3Encode;
+ tif->tif_close = Fax3Close;
+ tif->tif_cleanup = Fax3Cleanup;
+
+ return (1);
}
-int
-TIFFInitCCITTFax3(TIFF* tif, int scheme)
+int TIFFInitCCITTFax3(TIFF *tif, int scheme)
{
- (void) scheme;
- if (InitCCITTFax3(tif)) {
- /*
- * Merge codec-specific tag information.
- */
- if (!_TIFFMergeFields(tif, fax3Fields,
- TIFFArrayCount(fax3Fields))) {
- TIFFErrorExt(tif->tif_clientdata, "TIFFInitCCITTFax3",
- "Merging CCITT Fax 3 codec-specific tags failed");
- return 0;
- }
-
- /*
- * The default format is Class/F-style w/o RTC.
- */
- return TIFFSetField(tif, TIFFTAG_FAXMODE, FAXMODE_CLASSF);
- } else
- return 01;
+ (void)scheme;
+ if (InitCCITTFax3(tif))
+ {
+ /*
+ * Merge codec-specific tag information.
+ */
+ if (!_TIFFMergeFields(tif, fax3Fields, TIFFArrayCount(fax3Fields)))
+ {
+ TIFFErrorExtR(tif, "TIFFInitCCITTFax3",
+ "Merging CCITT Fax 3 codec-specific tags failed");
+ return 0;
+ }
+
+ /*
+ * The default format is Class/F-style w/o RTC.
+ */
+ return TIFFSetField(tif, TIFFTAG_FAXMODE, FAXMODE_CLASSF);
+ }
+ else
+ return 01;
}
/*
@@ -1424,124 +1499,146 @@ TIFFInitCCITTFax3(TIFF* tif, int scheme)
* Compression Scheme Support.
*/
-#define SWAP(t,a,b) { t x; x = (a); (a) = (b); (b) = x; }
+#define SWAP(t, a, b) \
+ { \
+ t x; \
+ x = (a); \
+ (a) = (b); \
+ (b) = x; \
+ }
/*
* Decode the requested amount of G4-encoded data.
*/
-static int
-Fax4Decode(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s)
+static int Fax4Decode(TIFF *tif, uint8_t *buf, tmsize_t occ, uint16_t s)
{
- DECLARE_STATE_2D(tif, sp, "Fax4Decode");
- (void) s;
- if (occ % sp->b.rowbytes)
- {
- TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be read");
- return (-1);
- }
- CACHE_STATE(tif, sp);
- while (occ > 0) {
- a0 = 0;
- RunLength = 0;
- pa = thisrun = sp->curruns;
- pb = sp->refruns;
- b1 = *pb++;
+ DECLARE_STATE_2D(tif, sp, "Fax4Decode");
+ (void)s;
+ if (occ % sp->b.rowbytes)
+ {
+ TIFFErrorExtR(tif, module, "Fractional scanlines cannot be read");
+ return (-1);
+ }
+ CACHE_STATE(tif, sp);
+ while (occ > 0)
+ {
+ a0 = 0;
+ RunLength = 0;
+ pa = thisrun = sp->curruns;
+ pb = sp->refruns;
+ b1 = *pb++;
#ifdef FAX3_DEBUG
- printf("\nBitAcc=%08X, BitsAvail = %d\n", BitAcc, BitsAvail);
- printf("-------------------- %d\n", tif->tif_row);
- fflush(stdout);
+ printf("\nBitAcc=%08" PRIX32 ", BitsAvail = %d\n", BitAcc, BitsAvail);
+ printf("-------------------- %d\n", tif->tif_row);
+ fflush(stdout);
#endif
- EXPAND2D(EOFG4);
- if (EOLcnt)
- goto EOFG4;
- (*sp->fill)(buf, thisrun, pa, lastx);
- SETVALUE(0); /* imaginary change for reference */
- SWAP(uint32*, sp->curruns, sp->refruns);
- buf += sp->b.rowbytes;
- occ -= sp->b.rowbytes;
- sp->line++;
- continue;
- EOFG4:
- NeedBits16( 13, BADG4 );
- BADG4:
+ EXPAND2D(EOFG4);
+ if (EOLcnt)
+ goto EOFG4;
+ if (((lastx + 7) >> 3) > (int)occ) /* check for buffer overrun */
+ {
+ TIFFErrorExtR(tif, module,
+ "Buffer overrun detected : %" TIFF_SSIZE_FORMAT
+ " bytes available, %d bits needed",
+ occ, lastx);
+ return -1;
+ }
+ (*sp->fill)(buf, thisrun, pa, lastx);
+ SETVALUE(0); /* imaginary change for reference */
+ SWAP(uint32_t *, sp->curruns, sp->refruns);
+ buf += sp->b.rowbytes;
+ occ -= sp->b.rowbytes;
+ sp->line++;
+ continue;
+ EOFG4:
+ NeedBits16(13, BADG4);
+ BADG4:
#ifdef FAX3_DEBUG
- if( GetBits(13) != 0x1001 )
- fputs( "Bad EOFB\n", stderr );
-#endif
- ClrBits( 13 );
- (*sp->fill)(buf, thisrun, pa, lastx);
- UNCACHE_STATE(tif, sp);
- return ( sp->line ? 1 : -1); /* don't error on badly-terminated strips */
- }
- UNCACHE_STATE(tif, sp);
- return (1);
+ if (GetBits(13) != 0x1001)
+ fputs("Bad EOFB\n", stderr);
+#endif
+ ClrBits(13);
+ if (((lastx + 7) >> 3) > (int)occ) /* check for buffer overrun */
+ {
+ TIFFErrorExtR(tif, module,
+ "Buffer overrun detected : %" TIFF_SSIZE_FORMAT
+ " bytes available, %d bits needed",
+ occ, lastx);
+ return -1;
+ }
+ (*sp->fill)(buf, thisrun, pa, lastx);
+ UNCACHE_STATE(tif, sp);
+ return (sp->line ? 1 : -1); /* don't error on badly-terminated strips */
+ }
+ UNCACHE_STATE(tif, sp);
+ return (1);
}
-#undef SWAP
+#undef SWAP
/*
* Encode the requested amount of data.
*/
-static int
-Fax4Encode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
+static int Fax4Encode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
{
- static const char module[] = "Fax4Encode";
- Fax3CodecState *sp = EncoderState(tif);
- (void) s;
- if (cc % sp->b.rowbytes)
- {
- TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be written");
- return (0);
- }
- while (cc > 0) {
- if (!Fax3Encode2DRow(tif, bp, sp->refline, sp->b.rowpixels))
- return (0);
- _TIFFmemcpy(sp->refline, bp, sp->b.rowbytes);
- bp += sp->b.rowbytes;
- cc -= sp->b.rowbytes;
- }
- return (1);
+ static const char module[] = "Fax4Encode";
+ Fax3CodecState *sp = EncoderState(tif);
+ (void)s;
+ if (cc % sp->b.rowbytes)
+ {
+ TIFFErrorExtR(tif, module, "Fractional scanlines cannot be written");
+ return (0);
+ }
+ while (cc > 0)
+ {
+ if (!Fax3Encode2DRow(tif, bp, sp->refline, sp->b.rowpixels))
+ return (0);
+ _TIFFmemcpy(sp->refline, bp, sp->b.rowbytes);
+ bp += sp->b.rowbytes;
+ cc -= sp->b.rowbytes;
+ }
+ return (1);
}
-static int
-Fax4PostEncode(TIFF* tif)
+static int Fax4PostEncode(TIFF *tif)
{
- Fax3CodecState *sp = EncoderState(tif);
-
- /* terminate strip w/ EOFB */
- Fax3PutBits(tif, EOL, 12);
- Fax3PutBits(tif, EOL, 12);
- if (sp->bit != 8)
- Fax3FlushBits(tif, sp);
- return (1);
+ Fax3CodecState *sp = EncoderState(tif);
+
+ /* terminate strip w/ EOFB */
+ Fax3PutBits(tif, EOL, 12);
+ Fax3PutBits(tif, EOL, 12);
+ if (sp->bit != 8)
+ Fax3FlushBits(tif, sp);
+ return (1);
}
-int
-TIFFInitCCITTFax4(TIFF* tif, int scheme)
+int TIFFInitCCITTFax4(TIFF *tif, int scheme)
{
- (void) scheme;
- if (InitCCITTFax3(tif)) { /* reuse G3 support */
- /*
- * Merge codec-specific tag information.
- */
- if (!_TIFFMergeFields(tif, fax4Fields,
- TIFFArrayCount(fax4Fields))) {
- TIFFErrorExt(tif->tif_clientdata, "TIFFInitCCITTFax4",
- "Merging CCITT Fax 4 codec-specific tags failed");
- return 0;
- }
-
- tif->tif_decoderow = Fax4Decode;
- tif->tif_decodestrip = Fax4Decode;
- tif->tif_decodetile = Fax4Decode;
- tif->tif_encoderow = Fax4Encode;
- tif->tif_encodestrip = Fax4Encode;
- tif->tif_encodetile = Fax4Encode;
- tif->tif_postencode = Fax4PostEncode;
- /*
- * Suppress RTC at the end of each strip.
- */
- return TIFFSetField(tif, TIFFTAG_FAXMODE, FAXMODE_NORTC);
- } else
- return (0);
+ (void)scheme;
+ if (InitCCITTFax3(tif))
+ { /* reuse G3 support */
+ /*
+ * Merge codec-specific tag information.
+ */
+ if (!_TIFFMergeFields(tif, fax4Fields, TIFFArrayCount(fax4Fields)))
+ {
+ TIFFErrorExtR(tif, "TIFFInitCCITTFax4",
+ "Merging CCITT Fax 4 codec-specific tags failed");
+ return 0;
+ }
+
+ tif->tif_decoderow = Fax4Decode;
+ tif->tif_decodestrip = Fax4Decode;
+ tif->tif_decodetile = Fax4Decode;
+ tif->tif_encoderow = Fax4Encode;
+ tif->tif_encodestrip = Fax4Encode;
+ tif->tif_encodetile = Fax4Encode;
+ tif->tif_postencode = Fax4PostEncode;
+ /*
+ * Suppress RTC at the end of each strip.
+ */
+ return TIFFSetField(tif, TIFFTAG_FAXMODE, FAXMODE_NORTC);
+ }
+ else
+ return (0);
}
/*
@@ -1552,95 +1649,91 @@ TIFFInitCCITTFax4(TIFF* tif, int scheme)
/*
* Decode the requested amount of RLE-encoded data.
*/
-static int
-Fax3DecodeRLE(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s)
+static int Fax3DecodeRLE(TIFF *tif, uint8_t *buf, tmsize_t occ, uint16_t s)
{
- DECLARE_STATE(tif, sp, "Fax3DecodeRLE");
- int mode = sp->b.mode;
- (void) s;
- if (occ % sp->b.rowbytes)
- {
- TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be read");
- return (-1);
- }
- CACHE_STATE(tif, sp);
- thisrun = sp->curruns;
- while (occ > 0) {
- a0 = 0;
- RunLength = 0;
- pa = thisrun;
+ DECLARE_STATE(tif, sp, "Fax3DecodeRLE");
+ int mode = sp->b.mode;
+ (void)s;
+ if (occ % sp->b.rowbytes)
+ {
+ TIFFErrorExtR(tif, module, "Fractional scanlines cannot be read");
+ return (-1);
+ }
+ CACHE_STATE(tif, sp);
+ thisrun = sp->curruns;
+ while (occ > 0)
+ {
+ a0 = 0;
+ RunLength = 0;
+ pa = thisrun;
#ifdef FAX3_DEBUG
- printf("\nBitAcc=%08X, BitsAvail = %d\n", BitAcc, BitsAvail);
- printf("-------------------- %d\n", tif->tif_row);
- fflush(stdout);
+ printf("\nBitAcc=%08" PRIX32 ", BitsAvail = %d\n", BitAcc, BitsAvail);
+ printf("-------------------- %" PRIu32 "\n", tif->tif_row);
+ fflush(stdout);
#endif
- EXPAND1D(EOFRLE);
- (*sp->fill)(buf, thisrun, pa, lastx);
- /*
- * Cleanup at the end of the row.
- */
- if (mode & FAXMODE_BYTEALIGN) {
- int n = BitsAvail - (BitsAvail &~ 7);
- ClrBits(n);
- } else if (mode & FAXMODE_WORDALIGN) {
- int n = BitsAvail - (BitsAvail &~ 15);
- ClrBits(n);
- if (BitsAvail == 0 && !isAligned(cp, uint16))
- cp++;
- }
- buf += sp->b.rowbytes;
- occ -= sp->b.rowbytes;
- sp->line++;
- continue;
- EOFRLE: /* premature EOF */
- (*sp->fill)(buf, thisrun, pa, lastx);
- UNCACHE_STATE(tif, sp);
- return (-1);
- }
- UNCACHE_STATE(tif, sp);
- return (1);
+ EXPAND1D(EOFRLE);
+ (*sp->fill)(buf, thisrun, pa, lastx);
+ /*
+ * Cleanup at the end of the row.
+ */
+ if (mode & FAXMODE_BYTEALIGN)
+ {
+ int n = BitsAvail - (BitsAvail & ~7);
+ ClrBits(n);
+ }
+ else if (mode & FAXMODE_WORDALIGN)
+ {
+ int n = BitsAvail - (BitsAvail & ~15);
+ ClrBits(n);
+ if (BitsAvail == 0 && !isAligned(cp, uint16_t))
+ cp++;
+ }
+ buf += sp->b.rowbytes;
+ occ -= sp->b.rowbytes;
+ sp->line++;
+ continue;
+ EOFRLE: /* premature EOF */
+ (*sp->fill)(buf, thisrun, pa, lastx);
+ UNCACHE_STATE(tif, sp);
+ return (-1);
+ }
+ UNCACHE_STATE(tif, sp);
+ return (1);
}
-int
-TIFFInitCCITTRLE(TIFF* tif, int scheme)
+int TIFFInitCCITTRLE(TIFF *tif, int scheme)
{
- (void) scheme;
- if (InitCCITTFax3(tif)) { /* reuse G3 support */
- tif->tif_decoderow = Fax3DecodeRLE;
- tif->tif_decodestrip = Fax3DecodeRLE;
- tif->tif_decodetile = Fax3DecodeRLE;
- /*
- * Suppress RTC+EOLs when encoding and byte-align data.
- */
- return TIFFSetField(tif, TIFFTAG_FAXMODE,
- FAXMODE_NORTC|FAXMODE_NOEOL|FAXMODE_BYTEALIGN);
- } else
- return (0);
+ (void)scheme;
+ if (InitCCITTFax3(tif))
+ { /* reuse G3 support */
+ tif->tif_decoderow = Fax3DecodeRLE;
+ tif->tif_decodestrip = Fax3DecodeRLE;
+ tif->tif_decodetile = Fax3DecodeRLE;
+ /*
+ * Suppress RTC+EOLs when encoding and byte-align data.
+ */
+ return TIFFSetField(tif, TIFFTAG_FAXMODE,
+ FAXMODE_NORTC | FAXMODE_NOEOL | FAXMODE_BYTEALIGN);
+ }
+ else
+ return (0);
}
-int
-TIFFInitCCITTRLEW(TIFF* tif, int scheme)
+int TIFFInitCCITTRLEW(TIFF *tif, int scheme)
{
- (void) scheme;
- if (InitCCITTFax3(tif)) { /* reuse G3 support */
- tif->tif_decoderow = Fax3DecodeRLE;
- tif->tif_decodestrip = Fax3DecodeRLE;
- tif->tif_decodetile = Fax3DecodeRLE;
- /*
- * Suppress RTC+EOLs when encoding and word-align data.
- */
- return TIFFSetField(tif, TIFFTAG_FAXMODE,
- FAXMODE_NORTC|FAXMODE_NOEOL|FAXMODE_WORDALIGN);
- } else
- return (0);
+ (void)scheme;
+ if (InitCCITTFax3(tif))
+ { /* reuse G3 support */
+ tif->tif_decoderow = Fax3DecodeRLE;
+ tif->tif_decodestrip = Fax3DecodeRLE;
+ tif->tif_decodetile = Fax3DecodeRLE;
+ /*
+ * Suppress RTC+EOLs when encoding and word-align data.
+ */
+ return TIFFSetField(tif, TIFFTAG_FAXMODE,
+ FAXMODE_NORTC | FAXMODE_NOEOL | FAXMODE_WORDALIGN);
+ }
+ else
+ return (0);
}
#endif /* CCITT_SUPPORT */
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_fax3.h b/src/3rdparty/libtiff/libtiff/tif_fax3.h
index abadcd9..e095009 100644
--- a/src/3rdparty/libtiff/libtiff/tif_fax3.h
+++ b/src/3rdparty/libtiff/libtiff/tif_fax3.h
@@ -2,28 +2,28 @@
* Copyright (c) 1990-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
#ifndef _FAX3_
-#define _FAX3_
+#define _FAX3_
/*
* TIFF Library.
*
@@ -41,7 +41,7 @@
* The routine must have the type signature given below;
* for example:
*
- * fillruns(unsigned char* buf, uint32* runs, uint32* erun, uint32 lastx)
+ * fillruns(unsigned char* buf, uint32_t* runs, uint32_t* erun, uint32_t lastx)
*
* where buf is place to set the bits, runs is the array of b&w run
* lengths (white then black), erun is the last run in the array, and
@@ -50,41 +50,47 @@
* data in the run array as needed (e.g. to append zero runs to bring
* the count up to a nice multiple).
*/
-typedef void (*TIFFFaxFillFunc)(unsigned char*, uint32*, uint32*, uint32);
+typedef void (*TIFFFaxFillFunc)(unsigned char *, uint32_t *, uint32_t *,
+ uint32_t);
/*
* The default run filler; made external for other decoders.
*/
#if defined(__cplusplus)
-extern "C" {
+extern "C"
+{
#endif
-extern void _TIFFFax3fillruns(unsigned char*, uint32*, uint32*, uint32);
+ extern void _TIFFFax3fillruns(unsigned char *, uint32_t *, uint32_t *,
+ uint32_t);
#if defined(__cplusplus)
}
#endif
-
/* finite state machine codes */
-#define S_Null 0
-#define S_Pass 1
-#define S_Horiz 2
-#define S_V0 3
-#define S_VR 4
-#define S_VL 5
-#define S_Ext 6
-#define S_TermW 7
-#define S_TermB 8
-#define S_MakeUpW 9
-#define S_MakeUpB 10
-#define S_MakeUp 11
-#define S_EOL 12
+#define S_Null 0
+#define S_Pass 1
+#define S_Horiz 2
+#define S_V0 3
+#define S_VR 4
+#define S_VL 5
+#define S_Ext 6
+#define S_TermW 7
+#define S_TermB 8
+#define S_MakeUpW 9
+#define S_MakeUpB 10
+#define S_MakeUp 11
+#define S_EOL 12
-/* WARNING: do not change the layout of this structure as the HylaFAX software */
-/* really depends on it. See http://bugzilla.maptools.org/show_bug.cgi?id=2636 */
-typedef struct { /* state table entry */
- unsigned char State; /* see above */
- unsigned char Width; /* width of code in bits */
- uint32 Param; /* unsigned 32-bit run length in bits (holds on 16 bit actually, but cannot be changed. See above warning) */
+/* WARNING: do not change the layout of this structure as the HylaFAX software
+ */
+/* really depends on it. See http://bugzilla.maptools.org/show_bug.cgi?id=2636
+ */
+typedef struct
+{ /* state table entry */
+ unsigned char State; /* see above */
+ unsigned char Width; /* width of code in bits */
+ uint32_t Param; /* unsigned 32-bit run length in bits (holds on 16 bit
+ actually, but cannot be changed. See above warning) */
} TIFFFaxTabEnt;
extern const TIFFFaxTabEnt TIFFFaxMainTable[];
@@ -108,7 +114,7 @@ extern const TIFFFaxTabEnt TIFFFaxBlackTable[];
*/
#ifndef EndOfData
-#define EndOfData() (cp >= ep)
+#define EndOfData() (cp >= ep)
#endif
/*
* Need <=8 or <=16 bits of input data. Unlike viewfax we
@@ -134,116 +140,143 @@ extern const TIFFFaxTabEnt TIFFFaxBlackTable[];
* otherwise we should get the right answer.
*/
#ifndef NeedBits8
-#define NeedBits8(n,eoflab) do { \
- if (BitsAvail < (n)) { \
- if (EndOfData()) { \
- if (BitsAvail == 0) /* no valid bits */ \
- goto eoflab; \
- BitsAvail = (n); /* pad with zeros */ \
- } else { \
- BitAcc |= ((uint32) bitmap[*cp++])<<BitsAvail; \
- BitsAvail += 8; \
- } \
- } \
-} while (0)
+#define NeedBits8(n, eoflab) \
+ do \
+ { \
+ if (BitsAvail < (n)) \
+ { \
+ if (EndOfData()) \
+ { \
+ if (BitsAvail == 0) /* no valid bits */ \
+ goto eoflab; \
+ BitsAvail = (n); /* pad with zeros */ \
+ } \
+ else \
+ { \
+ BitAcc |= ((uint32_t)bitmap[*cp++]) << BitsAvail; \
+ BitsAvail += 8; \
+ } \
+ } \
+ } while (0)
#endif
#ifndef NeedBits16
-#define NeedBits16(n,eoflab) do { \
- if (BitsAvail < (n)) { \
- if (EndOfData()) { \
- if (BitsAvail == 0) /* no valid bits */ \
- goto eoflab; \
- BitsAvail = (n); /* pad with zeros */ \
- } else { \
- BitAcc |= ((uint32) bitmap[*cp++])<<BitsAvail; \
- if ((BitsAvail += 8) < (n)) { \
- if (EndOfData()) { \
- /* NB: we know BitsAvail is non-zero here */ \
- BitsAvail = (n); /* pad with zeros */ \
- } else { \
- BitAcc |= ((uint32) bitmap[*cp++])<<BitsAvail; \
- BitsAvail += 8; \
- } \
- } \
- } \
- } \
-} while (0)
+#define NeedBits16(n, eoflab) \
+ do \
+ { \
+ if (BitsAvail < (n)) \
+ { \
+ if (EndOfData()) \
+ { \
+ if (BitsAvail == 0) /* no valid bits */ \
+ goto eoflab; \
+ BitsAvail = (n); /* pad with zeros */ \
+ } \
+ else \
+ { \
+ BitAcc |= ((uint32_t)bitmap[*cp++]) << BitsAvail; \
+ if ((BitsAvail += 8) < (n)) \
+ { \
+ if (EndOfData()) \
+ { \
+ /* NB: we know BitsAvail is non-zero here */ \
+ BitsAvail = (n); /* pad with zeros */ \
+ } \
+ else \
+ { \
+ BitAcc |= ((uint32_t)bitmap[*cp++]) << BitsAvail; \
+ BitsAvail += 8; \
+ } \
+ } \
+ } \
+ } \
+ } while (0)
#endif
-#define GetBits(n) (BitAcc & ((1<<(n))-1))
-#define ClrBits(n) do { \
- BitsAvail -= (n); \
- BitAcc >>= (n); \
-} while (0)
+#define GetBits(n) (BitAcc & ((1 << (n)) - 1))
+#define ClrBits(n) \
+ do \
+ { \
+ BitsAvail -= (n); \
+ BitAcc >>= (n); \
+ } while (0)
#ifdef FAX3_DEBUG
-static const char* StateNames[] = {
- "Null ",
- "Pass ",
- "Horiz ",
- "V0 ",
- "VR ",
- "VL ",
- "Ext ",
- "TermW ",
- "TermB ",
- "MakeUpW",
- "MakeUpB",
- "MakeUp ",
- "EOL ",
+static const char *StateNames[] = {
+ "Null ", "Pass ", "Horiz ", "V0 ", "VR ", "VL ", "Ext ",
+ "TermW ", "TermB ", "MakeUpW", "MakeUpB", "MakeUp ", "EOL ",
};
#define DEBUG_SHOW putchar(BitAcc & (1 << t) ? '1' : '0')
-#define LOOKUP8(wid,tab,eoflab) do { \
- int t; \
- NeedBits8(wid,eoflab); \
- TabEnt = tab + GetBits(wid); \
- printf("%08lX/%d: %s%5d\t", (long) BitAcc, BitsAvail, \
- StateNames[TabEnt->State], TabEnt->Param); \
- for (t = 0; t < TabEnt->Width; t++) \
- DEBUG_SHOW; \
- putchar('\n'); \
- fflush(stdout); \
- ClrBits(TabEnt->Width); \
-} while (0)
-#define LOOKUP16(wid,tab,eoflab) do { \
- int t; \
- NeedBits16(wid,eoflab); \
- TabEnt = tab + GetBits(wid); \
- printf("%08lX/%d: %s%5d\t", (long) BitAcc, BitsAvail, \
- StateNames[TabEnt->State], TabEnt->Param); \
- for (t = 0; t < TabEnt->Width; t++) \
- DEBUG_SHOW; \
- putchar('\n'); \
- fflush(stdout); \
- ClrBits(TabEnt->Width); \
-} while (0)
+#define LOOKUP8(wid, tab, eoflab) \
+ do \
+ { \
+ int t; \
+ NeedBits8(wid, eoflab); \
+ TabEnt = tab + GetBits(wid); \
+ printf("%08lX/%d: %s%5d\t", (long)BitAcc, BitsAvail, \
+ StateNames[TabEnt->State], TabEnt->Param); \
+ for (t = 0; t < TabEnt->Width; t++) \
+ DEBUG_SHOW; \
+ putchar('\n'); \
+ fflush(stdout); \
+ ClrBits(TabEnt->Width); \
+ } while (0)
+#define LOOKUP16(wid, tab, eoflab) \
+ do \
+ { \
+ int t; \
+ NeedBits16(wid, eoflab); \
+ TabEnt = tab + GetBits(wid); \
+ printf("%08lX/%d: %s%5d\t", (long)BitAcc, BitsAvail, \
+ StateNames[TabEnt->State], TabEnt->Param); \
+ for (t = 0; t < TabEnt->Width; t++) \
+ DEBUG_SHOW; \
+ putchar('\n'); \
+ fflush(stdout); \
+ ClrBits(TabEnt->Width); \
+ } while (0)
-#define SETVALUE(x) do { \
- *pa++ = RunLength + (x); \
- printf("SETVALUE: %d\t%d\n", RunLength + (x), a0); \
- a0 += x; \
- RunLength = 0; \
-} while (0)
+#define SETVALUE(x) \
+ do \
+ { \
+ *pa++ = RunLength + (x); \
+ printf("SETVALUE: %d\t%d\n", RunLength + (x), a0); \
+ a0 += x; \
+ RunLength = 0; \
+ } while (0)
#else
-#define LOOKUP8(wid,tab,eoflab) do { \
- NeedBits8(wid,eoflab); \
- TabEnt = tab + GetBits(wid); \
- ClrBits(TabEnt->Width); \
-} while (0)
-#define LOOKUP16(wid,tab,eoflab) do { \
- NeedBits16(wid,eoflab); \
- TabEnt = tab + GetBits(wid); \
- ClrBits(TabEnt->Width); \
-} while (0)
+#define LOOKUP8(wid, tab, eoflab) \
+ do \
+ { \
+ NeedBits8(wid, eoflab); \
+ TabEnt = tab + GetBits(wid); \
+ ClrBits(TabEnt->Width); \
+ } while (0)
+#define LOOKUP16(wid, tab, eoflab) \
+ do \
+ { \
+ NeedBits16(wid, eoflab); \
+ TabEnt = tab + GetBits(wid); \
+ ClrBits(TabEnt->Width); \
+ } while (0)
/*
* Append a run to the run length array for the
* current row and reset decoding state.
*/
-#define SETVALUE(x) do { \
- *pa++ = RunLength + (x); \
- a0 += (x); \
- RunLength = 0; \
-} while (0)
+#define SETVALUE(x) \
+ do \
+ { \
+ if (pa >= thisrun + sp->nruns) \
+ { \
+ TIFFErrorExtR(tif, module, "Buffer overflow at line %u of %s %u", \
+ sp->line, isTiled(tif) ? "tile" : "strip", \
+ isTiled(tif) ? tif->tif_curtile \
+ : tif->tif_curstrip); \
+ return (-1); \
+ } \
+ *pa++ = RunLength + (x); \
+ a0 += (x); \
+ RunLength = 0; \
+ } while (0)
#endif
/*
@@ -256,51 +289,62 @@ static const char* StateNames[] = {
* is non-zero then we still need to scan for the final flag
* bit that is part of the EOL code.
*/
-#define SYNC_EOL(eoflab) do { \
- if (EOLcnt == 0) { \
- for (;;) { \
- NeedBits16(11,eoflab); \
- if (GetBits(11) == 0) \
- break; \
- ClrBits(1); \
- } \
- } \
- for (;;) { \
- NeedBits8(8,eoflab); \
- if (GetBits(8)) \
- break; \
- ClrBits(8); \
- } \
- while (GetBits(1) == 0) \
- ClrBits(1); \
- ClrBits(1); /* EOL bit */ \
- EOLcnt = 0; /* reset EOL counter/flag */ \
-} while (0)
+#define SYNC_EOL(eoflab) \
+ do \
+ { \
+ if (EOLcnt == 0) \
+ { \
+ for (;;) \
+ { \
+ NeedBits16(11, eoflab); \
+ if (GetBits(11) == 0) \
+ break; \
+ ClrBits(1); \
+ } \
+ } \
+ for (;;) \
+ { \
+ NeedBits8(8, eoflab); \
+ if (GetBits(8)) \
+ break; \
+ ClrBits(8); \
+ } \
+ while (GetBits(1) == 0) \
+ ClrBits(1); \
+ ClrBits(1); /* EOL bit */ \
+ EOLcnt = 0; /* reset EOL counter/flag */ \
+ } while (0)
/*
* Cleanup the array of runs after decoding a row.
* We adjust final runs to insure the user buffer is not
* overwritten and/or undecoded area is white filled.
*/
-#define CLEANUP_RUNS() do { \
- if (RunLength) \
- SETVALUE(0); \
- if (a0 != lastx) { \
- badlength(a0, lastx); \
- while (a0 > lastx && pa > thisrun) \
- a0 -= *--pa; \
- if (a0 < lastx) { \
- if (a0 < 0) \
- a0 = 0; \
- if ((pa-thisrun)&1) \
- SETVALUE(0); \
- SETVALUE(lastx - a0); \
- } else if (a0 > lastx) { \
- SETVALUE(lastx); \
- SETVALUE(0); \
- } \
- } \
-} while (0)
+#define CLEANUP_RUNS() \
+ do \
+ { \
+ if (RunLength) \
+ SETVALUE(0); \
+ if (a0 != lastx) \
+ { \
+ badlength(a0, lastx); \
+ while (a0 > lastx && pa > thisrun) \
+ a0 -= *--pa; \
+ if (a0 < lastx) \
+ { \
+ if (a0 < 0) \
+ a0 = 0; \
+ if ((pa - thisrun) & 1) \
+ SETVALUE(0); \
+ SETVALUE(lastx - a0); \
+ } \
+ else if (a0 > lastx) \
+ { \
+ SETVALUE(lastx); \
+ SETVALUE(0); \
+ } \
+ } \
+ } while (0)
/*
* Decode a line of 1D-encoded data.
@@ -314,225 +358,291 @@ static const char* StateNames[] = {
* the original code depended on the input data being zero-padded to
* insure the decoder recognized an EOL before running out of data.
*/
-#define EXPAND1D(eoflab) do { \
- for (;;) { \
- for (;;) { \
- LOOKUP16(12, TIFFFaxWhiteTable, eof1d); \
- switch (TabEnt->State) { \
- case S_EOL: \
- EOLcnt = 1; \
- goto done1d; \
- case S_TermW: \
- SETVALUE(TabEnt->Param); \
- goto doneWhite1d; \
- case S_MakeUpW: \
- case S_MakeUp: \
- a0 += TabEnt->Param; \
- RunLength += TabEnt->Param; \
- break; \
- default: \
- unexpected("WhiteTable", a0); \
- goto done1d; \
- } \
- } \
- doneWhite1d: \
- if (a0 >= lastx) \
- goto done1d; \
- for (;;) { \
- LOOKUP16(13, TIFFFaxBlackTable, eof1d); \
- switch (TabEnt->State) { \
- case S_EOL: \
- EOLcnt = 1; \
- goto done1d; \
- case S_TermB: \
- SETVALUE(TabEnt->Param); \
- goto doneBlack1d; \
- case S_MakeUpB: \
- case S_MakeUp: \
- a0 += TabEnt->Param; \
- RunLength += TabEnt->Param; \
- break; \
- default: \
- unexpected("BlackTable", a0); \
- goto done1d; \
- } \
- } \
- doneBlack1d: \
- if (a0 >= lastx) \
- goto done1d; \
- if( *(pa-1) == 0 && *(pa-2) == 0 ) \
- pa -= 2; \
- } \
-eof1d: \
- prematureEOF(a0); \
- CLEANUP_RUNS(); \
- goto eoflab; \
-done1d: \
- CLEANUP_RUNS(); \
-} while (0)
+#define EXPAND1D(eoflab) \
+ do \
+ { \
+ for (;;) \
+ { \
+ for (;;) \
+ { \
+ LOOKUP16(12, TIFFFaxWhiteTable, eof1d); \
+ switch (TabEnt->State) \
+ { \
+ case S_EOL: \
+ EOLcnt = 1; \
+ goto done1d; \
+ case S_TermW: \
+ SETVALUE(TabEnt->Param); \
+ goto doneWhite1d; \
+ case S_MakeUpW: \
+ case S_MakeUp: \
+ a0 += TabEnt->Param; \
+ RunLength += TabEnt->Param; \
+ break; \
+ default: \
+ unexpected("WhiteTable", a0); \
+ goto done1d; \
+ } \
+ } \
+ doneWhite1d: \
+ if (a0 >= lastx) \
+ goto done1d; \
+ for (;;) \
+ { \
+ LOOKUP16(13, TIFFFaxBlackTable, eof1d); \
+ switch (TabEnt->State) \
+ { \
+ case S_EOL: \
+ EOLcnt = 1; \
+ goto done1d; \
+ case S_TermB: \
+ SETVALUE(TabEnt->Param); \
+ goto doneBlack1d; \
+ case S_MakeUpB: \
+ case S_MakeUp: \
+ a0 += TabEnt->Param; \
+ RunLength += TabEnt->Param; \
+ break; \
+ default: \
+ unexpected("BlackTable", a0); \
+ goto done1d; \
+ } \
+ } \
+ doneBlack1d: \
+ if (a0 >= lastx) \
+ goto done1d; \
+ if (*(pa - 1) == 0 && *(pa - 2) == 0) \
+ pa -= 2; \
+ } \
+ eof1d: \
+ prematureEOF(a0); \
+ CLEANUP_RUNS(); \
+ goto eoflab; \
+ done1d: \
+ CLEANUP_RUNS(); \
+ } while (0)
/*
* Update the value of b1 using the array
* of runs for the reference line.
*/
-#define CHECK_b1 do { \
- if (pa != thisrun) while (b1 <= a0 && b1 < lastx) { \
- b1 += pb[0] + pb[1]; \
- pb += 2; \
- } \
-} while (0)
+#define CHECK_b1 \
+ do \
+ { \
+ if (pa != thisrun) \
+ while (b1 <= a0 && b1 < lastx) \
+ { \
+ if (pb + 1 >= sp->refruns + sp->nruns) \
+ { \
+ TIFFErrorExtR( \
+ tif, module, "Buffer overflow at line %u of %s %u", \
+ sp->line, isTiled(tif) ? "tile" : "strip", \
+ isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip); \
+ return (-1); \
+ } \
+ b1 += pb[0] + pb[1]; \
+ pb += 2; \
+ } \
+ } while (0)
/*
* Expand a row of 2D-encoded data.
*/
-#define EXPAND2D(eoflab) do { \
- while (a0 < lastx) { \
- LOOKUP8(7, TIFFFaxMainTable, eof2d); \
- switch (TabEnt->State) { \
- case S_Pass: \
- CHECK_b1; \
- b1 += *pb++; \
- RunLength += b1 - a0; \
- a0 = b1; \
- b1 += *pb++; \
- break; \
- case S_Horiz: \
- if ((pa-thisrun)&1) { \
- for (;;) { /* black first */ \
- LOOKUP16(13, TIFFFaxBlackTable, eof2d); \
- switch (TabEnt->State) { \
- case S_TermB: \
- SETVALUE(TabEnt->Param); \
- goto doneWhite2da; \
- case S_MakeUpB: \
- case S_MakeUp: \
- a0 += TabEnt->Param; \
- RunLength += TabEnt->Param; \
- break; \
- default: \
- goto badBlack2d; \
- } \
- } \
- doneWhite2da:; \
- for (;;) { /* then white */ \
- LOOKUP16(12, TIFFFaxWhiteTable, eof2d); \
- switch (TabEnt->State) { \
- case S_TermW: \
- SETVALUE(TabEnt->Param); \
- goto doneBlack2da; \
- case S_MakeUpW: \
- case S_MakeUp: \
- a0 += TabEnt->Param; \
- RunLength += TabEnt->Param; \
- break; \
- default: \
- goto badWhite2d; \
- } \
- } \
- doneBlack2da:; \
- } else { \
- for (;;) { /* white first */ \
- LOOKUP16(12, TIFFFaxWhiteTable, eof2d); \
- switch (TabEnt->State) { \
- case S_TermW: \
- SETVALUE(TabEnt->Param); \
- goto doneWhite2db; \
- case S_MakeUpW: \
- case S_MakeUp: \
- a0 += TabEnt->Param; \
- RunLength += TabEnt->Param; \
- break; \
- default: \
- goto badWhite2d; \
- } \
- } \
- doneWhite2db:; \
- for (;;) { /* then black */ \
- LOOKUP16(13, TIFFFaxBlackTable, eof2d); \
- switch (TabEnt->State) { \
- case S_TermB: \
- SETVALUE(TabEnt->Param); \
- goto doneBlack2db; \
- case S_MakeUpB: \
- case S_MakeUp: \
- a0 += TabEnt->Param; \
- RunLength += TabEnt->Param; \
- break; \
- default: \
- goto badBlack2d; \
- } \
- } \
- doneBlack2db:; \
- } \
- CHECK_b1; \
- break; \
- case S_V0: \
- CHECK_b1; \
- SETVALUE(b1 - a0); \
- b1 += *pb++; \
- break; \
- case S_VR: \
- CHECK_b1; \
- SETVALUE(b1 - a0 + TabEnt->Param); \
- b1 += *pb++; \
- break; \
- case S_VL: \
- CHECK_b1; \
- if (b1 <= (int) (a0 + TabEnt->Param)) { \
- if (b1 < (int) (a0 + TabEnt->Param) || pa != thisrun) { \
- unexpected("VL", a0); \
- goto eol2d; \
- } \
- } \
- SETVALUE(b1 - a0 - TabEnt->Param); \
- b1 -= *--pb; \
- break; \
- case S_Ext: \
- *pa++ = lastx - a0; \
- extension(a0); \
- goto eol2d; \
- case S_EOL: \
- *pa++ = lastx - a0; \
- NeedBits8(4,eof2d); \
- if (GetBits(4)) \
- unexpected("EOL", a0); \
- ClrBits(4); \
- EOLcnt = 1; \
- goto eol2d; \
- default: \
- badMain2d: \
- unexpected("MainTable", a0); \
- goto eol2d; \
- badBlack2d: \
- unexpected("BlackTable", a0); \
- goto eol2d; \
- badWhite2d: \
- unexpected("WhiteTable", a0); \
- goto eol2d; \
- eof2d: \
- prematureEOF(a0); \
- CLEANUP_RUNS(); \
- goto eoflab; \
- } \
- } \
- if (RunLength) { \
- if (RunLength + a0 < lastx) { \
- /* expect a final V0 */ \
- NeedBits8(1,eof2d); \
- if (!GetBits(1)) \
- goto badMain2d; \
- ClrBits(1); \
- } \
- SETVALUE(0); \
- } \
-eol2d: \
- CLEANUP_RUNS(); \
-} while (0)
+#define EXPAND2D(eoflab) \
+ do \
+ { \
+ while (a0 < lastx) \
+ { \
+ if (pa >= thisrun + sp->nruns) \
+ { \
+ TIFFErrorExtR( \
+ tif, module, "Buffer overflow at line %u of %s %u", \
+ sp->line, isTiled(tif) ? "tile" : "strip", \
+ isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip); \
+ return (-1); \
+ } \
+ LOOKUP8(7, TIFFFaxMainTable, eof2d); \
+ switch (TabEnt->State) \
+ { \
+ case S_Pass: \
+ CHECK_b1; \
+ if (pb + 1 >= sp->refruns + sp->nruns) \
+ { \
+ TIFFErrorExtR(tif, module, \
+ "Buffer overflow at line %u of %s %u", \
+ sp->line, \
+ isTiled(tif) ? "tile" : "strip", \
+ isTiled(tif) ? tif->tif_curtile \
+ : tif->tif_curstrip); \
+ return (-1); \
+ } \
+ b1 += *pb++; \
+ RunLength += b1 - a0; \
+ a0 = b1; \
+ b1 += *pb++; \
+ break; \
+ case S_Horiz: \
+ if ((pa - thisrun) & 1) \
+ { \
+ for (;;) \
+ { /* black first */ \
+ LOOKUP16(13, TIFFFaxBlackTable, eof2d); \
+ switch (TabEnt->State) \
+ { \
+ case S_TermB: \
+ SETVALUE(TabEnt->Param); \
+ goto doneWhite2da; \
+ case S_MakeUpB: \
+ case S_MakeUp: \
+ a0 += TabEnt->Param; \
+ RunLength += TabEnt->Param; \
+ break; \
+ default: \
+ goto badBlack2d; \
+ } \
+ } \
+ doneWhite2da:; \
+ for (;;) \
+ { /* then white */ \
+ LOOKUP16(12, TIFFFaxWhiteTable, eof2d); \
+ switch (TabEnt->State) \
+ { \
+ case S_TermW: \
+ SETVALUE(TabEnt->Param); \
+ goto doneBlack2da; \
+ case S_MakeUpW: \
+ case S_MakeUp: \
+ a0 += TabEnt->Param; \
+ RunLength += TabEnt->Param; \
+ break; \
+ default: \
+ goto badWhite2d; \
+ } \
+ } \
+ doneBlack2da:; \
+ } \
+ else \
+ { \
+ for (;;) \
+ { /* white first */ \
+ LOOKUP16(12, TIFFFaxWhiteTable, eof2d); \
+ switch (TabEnt->State) \
+ { \
+ case S_TermW: \
+ SETVALUE(TabEnt->Param); \
+ goto doneWhite2db; \
+ case S_MakeUpW: \
+ case S_MakeUp: \
+ a0 += TabEnt->Param; \
+ RunLength += TabEnt->Param; \
+ break; \
+ default: \
+ goto badWhite2d; \
+ } \
+ } \
+ doneWhite2db:; \
+ for (;;) \
+ { /* then black */ \
+ LOOKUP16(13, TIFFFaxBlackTable, eof2d); \
+ switch (TabEnt->State) \
+ { \
+ case S_TermB: \
+ SETVALUE(TabEnt->Param); \
+ goto doneBlack2db; \
+ case S_MakeUpB: \
+ case S_MakeUp: \
+ a0 += TabEnt->Param; \
+ RunLength += TabEnt->Param; \
+ break; \
+ default: \
+ goto badBlack2d; \
+ } \
+ } \
+ doneBlack2db:; \
+ } \
+ CHECK_b1; \
+ break; \
+ case S_V0: \
+ CHECK_b1; \
+ SETVALUE(b1 - a0); \
+ if (pb >= sp->refruns + sp->nruns) \
+ { \
+ TIFFErrorExtR(tif, module, \
+ "Buffer overflow at line %u of %s %u", \
+ sp->line, \
+ isTiled(tif) ? "tile" : "strip", \
+ isTiled(tif) ? tif->tif_curtile \
+ : tif->tif_curstrip); \
+ return (-1); \
+ } \
+ b1 += *pb++; \
+ break; \
+ case S_VR: \
+ CHECK_b1; \
+ SETVALUE(b1 - a0 + TabEnt->Param); \
+ if (pb >= sp->refruns + sp->nruns) \
+ { \
+ TIFFErrorExtR(tif, module, \
+ "Buffer overflow at line %u of %s %u", \
+ sp->line, \
+ isTiled(tif) ? "tile" : "strip", \
+ isTiled(tif) ? tif->tif_curtile \
+ : tif->tif_curstrip); \
+ return (-1); \
+ } \
+ b1 += *pb++; \
+ break; \
+ case S_VL: \
+ CHECK_b1; \
+ if (b1 < (int)(a0 + TabEnt->Param)) \
+ { \
+ unexpected("VL", a0); \
+ goto eol2d; \
+ } \
+ SETVALUE(b1 - a0 - TabEnt->Param); \
+ b1 -= *--pb; \
+ break; \
+ case S_Ext: \
+ *pa++ = lastx - a0; \
+ extension(a0); \
+ goto eol2d; \
+ case S_EOL: \
+ *pa++ = lastx - a0; \
+ NeedBits8(4, eof2d); \
+ if (GetBits(4)) \
+ unexpected("EOL", a0); \
+ ClrBits(4); \
+ EOLcnt = 1; \
+ goto eol2d; \
+ default: \
+ badMain2d: \
+ unexpected("MainTable", a0); \
+ goto eol2d; \
+ badBlack2d: \
+ unexpected("BlackTable", a0); \
+ goto eol2d; \
+ badWhite2d: \
+ unexpected("WhiteTable", a0); \
+ goto eol2d; \
+ eof2d: \
+ prematureEOF(a0); \
+ CLEANUP_RUNS(); \
+ goto eoflab; \
+ } \
+ } \
+ if (RunLength) \
+ { \
+ if (RunLength + a0 < lastx) \
+ { \
+ /* expect a final V0 */ \
+ NeedBits8(1, eof2d); \
+ if (!GetBits(1)) \
+ goto badMain2d; \
+ ClrBits(1); \
+ } \
+ SETVALUE(0); \
+ } \
+ eol2d: \
+ CLEANUP_RUNS(); \
+ } while (0)
#endif /* _FAX3_ */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_fax3sm.c b/src/3rdparty/libtiff/libtiff/tif_fax3sm.c
index 822191e..ba2fc53 100644
--- a/src/3rdparty/libtiff/libtiff/tif_fax3sm.c
+++ b/src/3rdparty/libtiff/libtiff/tif_fax3sm.c
@@ -1,5 +1,6 @@
/* WARNING, this file was automatically generated by the
mkg3states program */
+#include <stdint.h>
#include "tiff.h"
#include "tif_fax3.h"
const TIFFFaxTabEnt TIFFFaxMainTable[128] = {
diff --git a/src/3rdparty/libtiff/libtiff/tif_flush.c b/src/3rdparty/libtiff/libtiff/tif_flush.c
index f7fa207..ff9c1e2 100644
--- a/src/3rdparty/libtiff/libtiff/tif_flush.c
+++ b/src/3rdparty/libtiff/libtiff/tif_flush.c
@@ -2,23 +2,23 @@
* Copyright (c) 1988-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -27,30 +27,28 @@
*/
#include "tiffiop.h"
-int
-TIFFFlush(TIFF* tif)
+int TIFFFlush(TIFF *tif)
{
- if( tif->tif_mode == O_RDONLY )
+ if (tif->tif_mode == O_RDONLY)
return 1;
if (!TIFFFlushData(tif))
return (0);
-
- /* In update (r+) mode we try to detect the case where
- only the strip/tile map has been altered, and we try to
- rewrite only that portion of the directory without
+
+ /* In update (r+) mode we try to detect the case where
+ only the strip/tile map has been altered, and we try to
+ rewrite only that portion of the directory without
making any other changes */
-
- if( (tif->tif_flags & TIFF_DIRTYSTRIP)
- && !(tif->tif_flags & TIFF_DIRTYDIRECT)
- && tif->tif_mode == O_RDWR )
+
+ if ((tif->tif_flags & TIFF_DIRTYSTRIP) &&
+ !(tif->tif_flags & TIFF_DIRTYDIRECT) && tif->tif_mode == O_RDWR)
{
- if( TIFFForceStrileArrayWriting(tif) )
+ if (TIFFForceStrileArrayWriting(tif))
return 1;
}
- if ((tif->tif_flags & (TIFF_DIRTYDIRECT|TIFF_DIRTYSTRIP))
- && !TIFFRewriteDirectory(tif))
+ if ((tif->tif_flags & (TIFF_DIRTYDIRECT | TIFF_DIRTYSTRIP)) &&
+ !TIFFRewriteDirectory(tif))
return (0);
return (1);
@@ -75,45 +73,43 @@ TIFFFlush(TIFF* tif)
*
* Returns 1 in case of success, 0 otherwise.
*/
-int TIFFForceStrileArrayWriting(TIFF* tif)
+int TIFFForceStrileArrayWriting(TIFF *tif)
{
static const char module[] = "TIFFForceStrileArrayWriting";
const int isTiled = TIFFIsTiled(tif);
if (tif->tif_mode == O_RDONLY)
{
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "File opened in read-only mode");
+ TIFFErrorExtR(tif, tif->tif_name, "File opened in read-only mode");
return 0;
}
- if( tif->tif_diroff == 0 )
+ if (tif->tif_diroff == 0)
{
- TIFFErrorExt(tif->tif_clientdata, module,
- "Directory has not yet been written");
+ TIFFErrorExtR(tif, module, "Directory has not yet been written");
return 0;
}
- if( (tif->tif_flags & TIFF_DIRTYDIRECT) != 0 )
+ if ((tif->tif_flags & TIFF_DIRTYDIRECT) != 0)
{
- TIFFErrorExt(tif->tif_clientdata, module,
- "Directory has changes other than the strile arrays. "
- "TIFFRewriteDirectory() should be called instead");
+ TIFFErrorExtR(tif, module,
+ "Directory has changes other than the strile arrays. "
+ "TIFFRewriteDirectory() should be called instead");
return 0;
}
- if( !(tif->tif_flags & TIFF_DIRTYSTRIP) )
+ if (!(tif->tif_flags & TIFF_DIRTYSTRIP))
{
- if( !(tif->tif_dir.td_stripoffset_entry.tdir_tag != 0 &&
- tif->tif_dir.td_stripoffset_entry.tdir_count == 0 &&
- tif->tif_dir.td_stripoffset_entry.tdir_type == 0 &&
- tif->tif_dir.td_stripoffset_entry.tdir_offset.toff_long8 == 0 &&
- tif->tif_dir.td_stripbytecount_entry.tdir_tag != 0 &&
- tif->tif_dir.td_stripbytecount_entry.tdir_count == 0 &&
- tif->tif_dir.td_stripbytecount_entry.tdir_type == 0 &&
- tif->tif_dir.td_stripbytecount_entry.tdir_offset.toff_long8 == 0) )
+ if (!(tif->tif_dir.td_stripoffset_entry.tdir_tag != 0 &&
+ tif->tif_dir.td_stripoffset_entry.tdir_count == 0 &&
+ tif->tif_dir.td_stripoffset_entry.tdir_type == 0 &&
+ tif->tif_dir.td_stripoffset_entry.tdir_offset.toff_long8 == 0 &&
+ tif->tif_dir.td_stripbytecount_entry.tdir_tag != 0 &&
+ tif->tif_dir.td_stripbytecount_entry.tdir_count == 0 &&
+ tif->tif_dir.td_stripbytecount_entry.tdir_type == 0 &&
+ tif->tif_dir.td_stripbytecount_entry.tdir_offset.toff_long8 == 0))
{
- TIFFErrorExt(tif->tif_clientdata, module,
- "Function not called together with "
- "TIFFDeferStrileArrayWriting()");
+ TIFFErrorExtR(tif, module,
+ "Function not called together with "
+ "TIFFDeferStrileArrayWriting()");
return 0;
}
@@ -121,18 +117,14 @@ int TIFFForceStrileArrayWriting(TIFF* tif)
return 0;
}
- if( _TIFFRewriteField( tif,
- isTiled ? TIFFTAG_TILEOFFSETS :
- TIFFTAG_STRIPOFFSETS,
- TIFF_LONG8,
- tif->tif_dir.td_nstrips,
- tif->tif_dir.td_stripoffset_p )
- && _TIFFRewriteField( tif,
- isTiled ? TIFFTAG_TILEBYTECOUNTS :
- TIFFTAG_STRIPBYTECOUNTS,
- TIFF_LONG8,
- tif->tif_dir.td_nstrips,
- tif->tif_dir.td_stripbytecount_p ) )
+ if (_TIFFRewriteField(tif,
+ isTiled ? TIFFTAG_TILEOFFSETS : TIFFTAG_STRIPOFFSETS,
+ TIFF_LONG8, tif->tif_dir.td_nstrips,
+ tif->tif_dir.td_stripoffset_p) &&
+ _TIFFRewriteField(
+ tif, isTiled ? TIFFTAG_TILEBYTECOUNTS : TIFFTAG_STRIPBYTECOUNTS,
+ TIFF_LONG8, tif->tif_dir.td_nstrips,
+ tif->tif_dir.td_stripbytecount_p))
{
tif->tif_flags &= ~TIFF_DIRTYSTRIP;
tif->tif_flags &= ~TIFF_BEENWRITING;
@@ -149,26 +141,17 @@ int TIFFForceStrileArrayWriting(TIFF* tif)
* is not set, so that TIFFFlush() will proceed to write out the directory.
* The documentation says returning 1 is an error indicator, but not having
* been writing isn't exactly a an error. Hopefully this doesn't cause
- * problems for other people.
+ * problems for other people.
*/
-int
-TIFFFlushData(TIFF* tif)
+int TIFFFlushData(TIFF *tif)
{
- if ((tif->tif_flags & TIFF_BEENWRITING) == 0)
- return (1);
- if (tif->tif_flags & TIFF_POSTENCODE) {
- tif->tif_flags &= ~TIFF_POSTENCODE;
- if (!(*tif->tif_postencode)(tif))
- return (0);
- }
- return (TIFFFlushData1(tif));
+ if ((tif->tif_flags & TIFF_BEENWRITING) == 0)
+ return (1);
+ if (tif->tif_flags & TIFF_POSTENCODE)
+ {
+ tif->tif_flags &= ~TIFF_POSTENCODE;
+ if (!(*tif->tif_postencode)(tif))
+ return (0);
+ }
+ return (TIFFFlushData1(tif));
}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_getimage.c b/src/3rdparty/libtiff/libtiff/tif_getimage.c
index 4da785d..41f7dfd 100644
--- a/src/3rdparty/libtiff/libtiff/tif_getimage.c
+++ b/src/3rdparty/libtiff/libtiff/tif_getimage.c
@@ -2,23 +2,23 @@
* Copyright (c) 1991-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -28,40 +28,50 @@
* Read and return a packed RGBA image.
*/
#include "tiffiop.h"
+#include <limits.h>
#include <stdio.h>
-static int gtTileContig(TIFFRGBAImage*, uint32*, uint32, uint32);
-static int gtTileSeparate(TIFFRGBAImage*, uint32*, uint32, uint32);
-static int gtStripContig(TIFFRGBAImage*, uint32*, uint32, uint32);
-static int gtStripSeparate(TIFFRGBAImage*, uint32*, uint32, uint32);
-static int PickContigCase(TIFFRGBAImage*);
-static int PickSeparateCase(TIFFRGBAImage*);
+static int gtTileContig(TIFFRGBAImage *, uint32_t *, uint32_t, uint32_t);
+static int gtTileSeparate(TIFFRGBAImage *, uint32_t *, uint32_t, uint32_t);
+static int gtStripContig(TIFFRGBAImage *, uint32_t *, uint32_t, uint32_t);
+static int gtStripSeparate(TIFFRGBAImage *, uint32_t *, uint32_t, uint32_t);
+static int PickContigCase(TIFFRGBAImage *);
+static int PickSeparateCase(TIFFRGBAImage *);
-static int BuildMapUaToAa(TIFFRGBAImage* img);
-static int BuildMapBitdepth16To8(TIFFRGBAImage* img);
+static int BuildMapUaToAa(TIFFRGBAImage *img);
+static int BuildMapBitdepth16To8(TIFFRGBAImage *img);
static const char photoTag[] = "PhotometricInterpretation";
-/*
+/*
* Helper constants used in Orientation tag handling
*/
#define FLIP_VERTICALLY 0x01
#define FLIP_HORIZONTALLY 0x02
+#define EMSG_BUF_SIZE 1024
+
/*
* Color conversion constants. We will define display types here.
*/
static const TIFFDisplay display_sRGB = {
- { /* XYZ -> luminance matrix */
- { 3.2410F, -1.5374F, -0.4986F },
- { -0.9692F, 1.8760F, 0.0416F },
- { 0.0556F, -0.2040F, 1.0570F }
- },
- 100.0F, 100.0F, 100.0F, /* Light o/p for reference white */
- 255, 255, 255, /* Pixel values for ref. white */
- 1.0F, 1.0F, 1.0F, /* Residual light o/p for black pixel */
- 2.4F, 2.4F, 2.4F, /* Gamma values for the three guns */
+ {/* XYZ -> luminance matrix */
+ {3.2410F, -1.5374F, -0.4986F},
+ {-0.9692F, 1.8760F, 0.0416F},
+ {0.0556F, -0.2040F, 1.0570F}},
+ 100.0F,
+ 100.0F,
+ 100.0F, /* Light o/p for reference white */
+ 255,
+ 255,
+ 255, /* Pixel values for ref. white */
+ 1.0F,
+ 1.0F,
+ 1.0F, /* Residual light o/p for black pixel */
+ 2.4F,
+ 2.4F,
+ 2.4F, /* Gamma values for the three guns */
};
/*
@@ -70,443 +80,525 @@ static const TIFFDisplay display_sRGB = {
* be handled. If 0 is returned, emsg contains the reason
* why it is being rejected.
*/
-int
-TIFFRGBAImageOK(TIFF* tif, char emsg[1024])
-{
- TIFFDirectory* td = &tif->tif_dir;
- uint16 photometric;
- int colorchannels;
-
- if (!tif->tif_decodestatus) {
- sprintf(emsg, "Sorry, requested compression method is not configured");
- return (0);
- }
- switch (td->td_bitspersample) {
- case 1:
- case 2:
- case 4:
- case 8:
- case 16:
- break;
- default:
- sprintf(emsg, "Sorry, can not handle images with %d-bit samples",
- td->td_bitspersample);
- return (0);
- }
- if (td->td_sampleformat == SAMPLEFORMAT_IEEEFP) {
- sprintf(emsg, "Sorry, can not handle images with IEEE floating-point samples");
+int TIFFRGBAImageOK(TIFF *tif, char emsg[EMSG_BUF_SIZE])
+{
+ TIFFDirectory *td = &tif->tif_dir;
+ uint16_t photometric;
+ int colorchannels;
+
+ if (!tif->tif_decodestatus)
+ {
+ snprintf(emsg, EMSG_BUF_SIZE,
+ "Sorry, requested compression method is not configured");
+ return (0);
+ }
+ switch (td->td_bitspersample)
+ {
+ case 1:
+ case 2:
+ case 4:
+ case 8:
+ case 16:
+ break;
+ default:
+ snprintf(emsg, EMSG_BUF_SIZE,
+ "Sorry, can not handle images with %" PRIu16
+ "-bit samples",
+ td->td_bitspersample);
+ return (0);
+ }
+ if (td->td_sampleformat == SAMPLEFORMAT_IEEEFP)
+ {
+ snprintf(
+ emsg, EMSG_BUF_SIZE,
+ "Sorry, can not handle images with IEEE floating-point samples");
+ return (0);
+ }
+ colorchannels = td->td_samplesperpixel - td->td_extrasamples;
+ if (!TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &photometric))
+ {
+ switch (colorchannels)
+ {
+ case 1:
+ photometric = PHOTOMETRIC_MINISBLACK;
+ break;
+ case 3:
+ photometric = PHOTOMETRIC_RGB;
+ break;
+ default:
+ snprintf(emsg, EMSG_BUF_SIZE, "Missing needed %s tag",
+ photoTag);
+ return (0);
+ }
+ }
+ switch (photometric)
+ {
+ case PHOTOMETRIC_MINISWHITE:
+ case PHOTOMETRIC_MINISBLACK:
+ case PHOTOMETRIC_PALETTE:
+ if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
+ td->td_samplesperpixel != 1 && td->td_bitspersample < 8)
+ {
+ snprintf(
+ emsg, EMSG_BUF_SIZE,
+ "Sorry, can not handle contiguous data with %s=%" PRIu16
+ ", "
+ "and %s=%" PRIu16 " and Bits/Sample=%" PRIu16 "",
+ photoTag, photometric, "Samples/pixel",
+ td->td_samplesperpixel, td->td_bitspersample);
+ return (0);
+ }
+ /*
+ * We should likely validate that any extra samples are either
+ * to be ignored, or are alpha, and if alpha we should try to use
+ * them. But for now we won't bother with this.
+ */
+ break;
+ case PHOTOMETRIC_YCBCR:
+ /*
+ * TODO: if at all meaningful and useful, make more complete
+ * support check here, or better still, refactor to let supporting
+ * code decide whether there is support and what meaningful
+ * error to return
+ */
+ break;
+ case PHOTOMETRIC_RGB:
+ if (colorchannels < 3)
+ {
+ snprintf(emsg, EMSG_BUF_SIZE,
+ "Sorry, can not handle RGB image with %s=%d",
+ "Color channels", colorchannels);
return (0);
+ }
+ break;
+ case PHOTOMETRIC_SEPARATED:
+ {
+ uint16_t inkset;
+ TIFFGetFieldDefaulted(tif, TIFFTAG_INKSET, &inkset);
+ if (inkset != INKSET_CMYK)
+ {
+ snprintf(emsg, EMSG_BUF_SIZE,
+ "Sorry, can not handle separated image with %s=%d",
+ "InkSet", inkset);
+ return 0;
+ }
+ if (td->td_samplesperpixel < 4)
+ {
+ snprintf(
+ emsg, EMSG_BUF_SIZE,
+ "Sorry, can not handle separated image with %s=%" PRIu16,
+ "Samples/pixel", td->td_samplesperpixel);
+ return 0;
+ }
+ break;
}
- colorchannels = td->td_samplesperpixel - td->td_extrasamples;
- if (!TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &photometric)) {
- switch (colorchannels) {
- case 1:
- photometric = PHOTOMETRIC_MINISBLACK;
- break;
- case 3:
- photometric = PHOTOMETRIC_RGB;
- break;
- default:
- sprintf(emsg, "Missing needed %s tag", photoTag);
- return (0);
- }
- }
- switch (photometric) {
- case PHOTOMETRIC_MINISWHITE:
- case PHOTOMETRIC_MINISBLACK:
- case PHOTOMETRIC_PALETTE:
- if (td->td_planarconfig == PLANARCONFIG_CONTIG
- && td->td_samplesperpixel != 1
- && td->td_bitspersample < 8 ) {
- sprintf(emsg,
- "Sorry, can not handle contiguous data with %s=%d, "
- "and %s=%d and Bits/Sample=%d",
- photoTag, photometric,
- "Samples/pixel", td->td_samplesperpixel,
- td->td_bitspersample);
- return (0);
- }
- /*
- * We should likely validate that any extra samples are either
- * to be ignored, or are alpha, and if alpha we should try to use
- * them. But for now we won't bother with this.
- */
- break;
- case PHOTOMETRIC_YCBCR:
- /*
- * TODO: if at all meaningful and useful, make more complete
- * support check here, or better still, refactor to let supporting
- * code decide whether there is support and what meaningful
- * error to return
- */
- break;
- case PHOTOMETRIC_RGB:
- if (colorchannels < 3) {
- sprintf(emsg, "Sorry, can not handle RGB image with %s=%d",
- "Color channels", colorchannels);
- return (0);
- }
- break;
- case PHOTOMETRIC_SEPARATED:
- {
- uint16 inkset;
- TIFFGetFieldDefaulted(tif, TIFFTAG_INKSET, &inkset);
- if (inkset != INKSET_CMYK) {
- sprintf(emsg,
- "Sorry, can not handle separated image with %s=%d",
- "InkSet", inkset);
- return 0;
- }
- if (td->td_samplesperpixel < 4) {
- sprintf(emsg,
- "Sorry, can not handle separated image with %s=%d",
- "Samples/pixel", td->td_samplesperpixel);
- return 0;
- }
- break;
- }
- case PHOTOMETRIC_LOGL:
- if (td->td_compression != COMPRESSION_SGILOG) {
- sprintf(emsg, "Sorry, LogL data must have %s=%d",
- "Compression", COMPRESSION_SGILOG);
- return (0);
- }
- break;
- case PHOTOMETRIC_LOGLUV:
- if (td->td_compression != COMPRESSION_SGILOG &&
- td->td_compression != COMPRESSION_SGILOG24) {
- sprintf(emsg, "Sorry, LogLuv data must have %s=%d or %d",
- "Compression", COMPRESSION_SGILOG, COMPRESSION_SGILOG24);
- return (0);
- }
- if (td->td_planarconfig != PLANARCONFIG_CONTIG) {
- sprintf(emsg, "Sorry, can not handle LogLuv images with %s=%d",
- "Planarconfiguration", td->td_planarconfig);
- return (0);
- }
- if ( td->td_samplesperpixel != 3 || colorchannels != 3 ) {
- sprintf(emsg,
- "Sorry, can not handle image with %s=%d, %s=%d",
- "Samples/pixel", td->td_samplesperpixel,
- "colorchannels", colorchannels);
- return 0;
- }
- break;
- case PHOTOMETRIC_CIELAB:
- if ( td->td_samplesperpixel != 3 || colorchannels != 3 || td->td_bitspersample != 8 ) {
- sprintf(emsg,
- "Sorry, can not handle image with %s=%d, %s=%d and %s=%d",
- "Samples/pixel", td->td_samplesperpixel,
- "colorchannels", colorchannels,
- "Bits/sample", td->td_bitspersample);
- return 0;
- }
- break;
- default:
- sprintf(emsg, "Sorry, can not handle image with %s=%d",
- photoTag, photometric);
- return (0);
- }
- return (1);
-}
-
-void
-TIFFRGBAImageEnd(TIFFRGBAImage* img)
-{
- if (img->Map) {
- _TIFFfree(img->Map);
- img->Map = NULL;
- }
- if (img->BWmap) {
- _TIFFfree(img->BWmap);
- img->BWmap = NULL;
- }
- if (img->PALmap) {
- _TIFFfree(img->PALmap);
- img->PALmap = NULL;
- }
- if (img->ycbcr) {
- _TIFFfree(img->ycbcr);
- img->ycbcr = NULL;
- }
- if (img->cielab) {
- _TIFFfree(img->cielab);
- img->cielab = NULL;
- }
- if (img->UaToAa) {
- _TIFFfree(img->UaToAa);
- img->UaToAa = NULL;
- }
- if (img->Bitdepth16To8) {
- _TIFFfree(img->Bitdepth16To8);
- img->Bitdepth16To8 = NULL;
- }
-
- if( img->redcmap ) {
- _TIFFfree( img->redcmap );
- _TIFFfree( img->greencmap );
- _TIFFfree( img->bluecmap );
- img->redcmap = img->greencmap = img->bluecmap = NULL;
- }
-}
-
-static int
-isCCITTCompression(TIFF* tif)
-{
- uint16 compress;
+ case PHOTOMETRIC_LOGL:
+ if (td->td_compression != COMPRESSION_SGILOG)
+ {
+ snprintf(emsg, EMSG_BUF_SIZE,
+ "Sorry, LogL data must have %s=%d", "Compression",
+ COMPRESSION_SGILOG);
+ return (0);
+ }
+ break;
+ case PHOTOMETRIC_LOGLUV:
+ if (td->td_compression != COMPRESSION_SGILOG &&
+ td->td_compression != COMPRESSION_SGILOG24)
+ {
+ snprintf(emsg, EMSG_BUF_SIZE,
+ "Sorry, LogLuv data must have %s=%d or %d",
+ "Compression", COMPRESSION_SGILOG,
+ COMPRESSION_SGILOG24);
+ return (0);
+ }
+ if (td->td_planarconfig != PLANARCONFIG_CONTIG)
+ {
+ snprintf(emsg, EMSG_BUF_SIZE,
+ "Sorry, can not handle LogLuv images with %s=%" PRIu16,
+ "Planarconfiguration", td->td_planarconfig);
+ return (0);
+ }
+ if (td->td_samplesperpixel != 3 || colorchannels != 3)
+ {
+ snprintf(emsg, EMSG_BUF_SIZE,
+ "Sorry, can not handle image with %s=%" PRIu16
+ ", %s=%d",
+ "Samples/pixel", td->td_samplesperpixel,
+ "colorchannels", colorchannels);
+ return 0;
+ }
+ break;
+ case PHOTOMETRIC_CIELAB:
+ if (td->td_samplesperpixel != 3 || colorchannels != 3 ||
+ (td->td_bitspersample != 8 && td->td_bitspersample != 16))
+ {
+ snprintf(emsg, EMSG_BUF_SIZE,
+ "Sorry, can not handle image with %s=%" PRIu16
+ ", %s=%d and %s=%" PRIu16,
+ "Samples/pixel", td->td_samplesperpixel,
+ "colorchannels", colorchannels, "Bits/sample",
+ td->td_bitspersample);
+ return 0;
+ }
+ break;
+ default:
+ snprintf(emsg, EMSG_BUF_SIZE,
+ "Sorry, can not handle image with %s=%" PRIu16, photoTag,
+ photometric);
+ return (0);
+ }
+ return (1);
+}
+
+void TIFFRGBAImageEnd(TIFFRGBAImage *img)
+{
+ if (img->Map)
+ {
+ _TIFFfreeExt(img->tif, img->Map);
+ img->Map = NULL;
+ }
+ if (img->BWmap)
+ {
+ _TIFFfreeExt(img->tif, img->BWmap);
+ img->BWmap = NULL;
+ }
+ if (img->PALmap)
+ {
+ _TIFFfreeExt(img->tif, img->PALmap);
+ img->PALmap = NULL;
+ }
+ if (img->ycbcr)
+ {
+ _TIFFfreeExt(img->tif, img->ycbcr);
+ img->ycbcr = NULL;
+ }
+ if (img->cielab)
+ {
+ _TIFFfreeExt(img->tif, img->cielab);
+ img->cielab = NULL;
+ }
+ if (img->UaToAa)
+ {
+ _TIFFfreeExt(img->tif, img->UaToAa);
+ img->UaToAa = NULL;
+ }
+ if (img->Bitdepth16To8)
+ {
+ _TIFFfreeExt(img->tif, img->Bitdepth16To8);
+ img->Bitdepth16To8 = NULL;
+ }
+
+ if (img->redcmap)
+ {
+ _TIFFfreeExt(img->tif, img->redcmap);
+ _TIFFfreeExt(img->tif, img->greencmap);
+ _TIFFfreeExt(img->tif, img->bluecmap);
+ img->redcmap = img->greencmap = img->bluecmap = NULL;
+ }
+}
+
+static int isCCITTCompression(TIFF *tif)
+{
+ uint16_t compress;
TIFFGetField(tif, TIFFTAG_COMPRESSION, &compress);
return (compress == COMPRESSION_CCITTFAX3 ||
- compress == COMPRESSION_CCITTFAX4 ||
- compress == COMPRESSION_CCITTRLE ||
- compress == COMPRESSION_CCITTRLEW);
-}
-
-int
-TIFFRGBAImageBegin(TIFFRGBAImage* img, TIFF* tif, int stop, char emsg[1024])
-{
- uint16* sampleinfo;
- uint16 extrasamples;
- uint16 planarconfig;
- uint16 compress;
- int colorchannels;
- uint16 *red_orig, *green_orig, *blue_orig;
- int n_color;
-
- if( !TIFFRGBAImageOK(tif, emsg) )
- return 0;
-
- /* Initialize to normal values */
- img->row_offset = 0;
- img->col_offset = 0;
- img->redcmap = NULL;
- img->greencmap = NULL;
- img->bluecmap = NULL;
- img->Map = NULL;
- img->BWmap = NULL;
- img->PALmap = NULL;
- img->ycbcr = NULL;
- img->cielab = NULL;
- img->UaToAa = NULL;
- img->Bitdepth16To8 = NULL;
- img->req_orientation = ORIENTATION_BOTLEFT; /* It is the default */
-
- img->tif = tif;
- img->stoponerr = stop;
- TIFFGetFieldDefaulted(tif, TIFFTAG_BITSPERSAMPLE, &img->bitspersample);
- switch (img->bitspersample) {
- case 1:
- case 2:
- case 4:
- case 8:
- case 16:
- break;
- default:
- sprintf(emsg, "Sorry, can not handle images with %d-bit samples",
- img->bitspersample);
- goto fail_return;
- }
- img->alpha = 0;
- TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLESPERPIXEL, &img->samplesperpixel);
- TIFFGetFieldDefaulted(tif, TIFFTAG_EXTRASAMPLES,
- &extrasamples, &sampleinfo);
- if (extrasamples >= 1)
- {
- switch (sampleinfo[0]) {
- case EXTRASAMPLE_UNSPECIFIED: /* Workaround for some images without */
- if (img->samplesperpixel > 3) /* correct info about alpha channel */
- img->alpha = EXTRASAMPLE_ASSOCALPHA;
- break;
- case EXTRASAMPLE_ASSOCALPHA: /* data is pre-multiplied */
- case EXTRASAMPLE_UNASSALPHA: /* data is not pre-multiplied */
- img->alpha = sampleinfo[0];
- break;
- }
- }
+ compress == COMPRESSION_CCITTFAX4 ||
+ compress == COMPRESSION_CCITTRLE ||
+ compress == COMPRESSION_CCITTRLEW);
+}
+
+int TIFFRGBAImageBegin(TIFFRGBAImage *img, TIFF *tif, int stop,
+ char emsg[EMSG_BUF_SIZE])
+{
+ uint16_t *sampleinfo;
+ uint16_t extrasamples;
+ uint16_t planarconfig;
+ uint16_t compress;
+ int colorchannels;
+ uint16_t *red_orig, *green_orig, *blue_orig;
+ int n_color;
+
+ if (!TIFFRGBAImageOK(tif, emsg))
+ return 0;
+
+ /* Initialize to normal values */
+ img->row_offset = 0;
+ img->col_offset = 0;
+ img->redcmap = NULL;
+ img->greencmap = NULL;
+ img->bluecmap = NULL;
+ img->Map = NULL;
+ img->BWmap = NULL;
+ img->PALmap = NULL;
+ img->ycbcr = NULL;
+ img->cielab = NULL;
+ img->UaToAa = NULL;
+ img->Bitdepth16To8 = NULL;
+ img->req_orientation = ORIENTATION_BOTLEFT; /* It is the default */
+
+ img->tif = tif;
+ img->stoponerr = stop;
+ TIFFGetFieldDefaulted(tif, TIFFTAG_BITSPERSAMPLE, &img->bitspersample);
+ switch (img->bitspersample)
+ {
+ case 1:
+ case 2:
+ case 4:
+ case 8:
+ case 16:
+ break;
+ default:
+ snprintf(emsg, EMSG_BUF_SIZE,
+ "Sorry, can not handle images with %" PRIu16
+ "-bit samples",
+ img->bitspersample);
+ goto fail_return;
+ }
+ img->alpha = 0;
+ TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLESPERPIXEL, &img->samplesperpixel);
+ TIFFGetFieldDefaulted(tif, TIFFTAG_EXTRASAMPLES, &extrasamples,
+ &sampleinfo);
+ if (extrasamples >= 1)
+ {
+ switch (sampleinfo[0])
+ {
+ case EXTRASAMPLE_UNSPECIFIED: /* Workaround for some images without
+ */
+ if (img->samplesperpixel >
+ 3) /* correct info about alpha channel */
+ img->alpha = EXTRASAMPLE_ASSOCALPHA;
+ break;
+ case EXTRASAMPLE_ASSOCALPHA: /* data is pre-multiplied */
+ case EXTRASAMPLE_UNASSALPHA: /* data is not pre-multiplied */
+ img->alpha = sampleinfo[0];
+ break;
+ }
+ }
#ifdef DEFAULT_EXTRASAMPLE_AS_ALPHA
- if( !TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &img->photometric))
- img->photometric = PHOTOMETRIC_MINISWHITE;
-
- if( extrasamples == 0
- && img->samplesperpixel == 4
- && img->photometric == PHOTOMETRIC_RGB )
- {
- img->alpha = EXTRASAMPLE_ASSOCALPHA;
- extrasamples = 1;
- }
+ if (!TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &img->photometric))
+ img->photometric = PHOTOMETRIC_MINISWHITE;
+
+ if (extrasamples == 0 && img->samplesperpixel == 4 &&
+ img->photometric == PHOTOMETRIC_RGB)
+ {
+ img->alpha = EXTRASAMPLE_ASSOCALPHA;
+ extrasamples = 1;
+ }
#endif
- colorchannels = img->samplesperpixel - extrasamples;
- TIFFGetFieldDefaulted(tif, TIFFTAG_COMPRESSION, &compress);
- TIFFGetFieldDefaulted(tif, TIFFTAG_PLANARCONFIG, &planarconfig);
- if (!TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &img->photometric)) {
- switch (colorchannels) {
- case 1:
- if (isCCITTCompression(tif))
- img->photometric = PHOTOMETRIC_MINISWHITE;
- else
- img->photometric = PHOTOMETRIC_MINISBLACK;
- break;
- case 3:
- img->photometric = PHOTOMETRIC_RGB;
- break;
- default:
- sprintf(emsg, "Missing needed %s tag", photoTag);
- goto fail_return;
- }
- }
- switch (img->photometric) {
- case PHOTOMETRIC_PALETTE:
- if (!TIFFGetField(tif, TIFFTAG_COLORMAP,
- &red_orig, &green_orig, &blue_orig)) {
- sprintf(emsg, "Missing required \"Colormap\" tag");
- goto fail_return;
- }
-
- /* copy the colormaps so we can modify them */
- n_color = (1U << img->bitspersample);
- img->redcmap = (uint16 *) _TIFFmalloc(sizeof(uint16)*n_color);
- img->greencmap = (uint16 *) _TIFFmalloc(sizeof(uint16)*n_color);
- img->bluecmap = (uint16 *) _TIFFmalloc(sizeof(uint16)*n_color);
- if( !img->redcmap || !img->greencmap || !img->bluecmap ) {
- sprintf(emsg, "Out of memory for colormap copy");
- goto fail_return;
- }
-
- _TIFFmemcpy( img->redcmap, red_orig, n_color * 2 );
- _TIFFmemcpy( img->greencmap, green_orig, n_color * 2 );
- _TIFFmemcpy( img->bluecmap, blue_orig, n_color * 2 );
-
- /* fall through... */
- case PHOTOMETRIC_MINISWHITE:
- case PHOTOMETRIC_MINISBLACK:
- if (planarconfig == PLANARCONFIG_CONTIG
- && img->samplesperpixel != 1
- && img->bitspersample < 8 ) {
- sprintf(emsg,
- "Sorry, can not handle contiguous data with %s=%d, "
- "and %s=%d and Bits/Sample=%d",
- photoTag, img->photometric,
- "Samples/pixel", img->samplesperpixel,
- img->bitspersample);
- goto fail_return;
- }
- break;
- case PHOTOMETRIC_YCBCR:
- /* It would probably be nice to have a reality check here. */
- if (planarconfig == PLANARCONFIG_CONTIG)
- /* can rely on libjpeg to convert to RGB */
- /* XXX should restore current state on exit */
- switch (compress) {
- case COMPRESSION_JPEG:
- /*
- * TODO: when complete tests verify complete desubsampling
- * and YCbCr handling, remove use of TIFFTAG_JPEGCOLORMODE in
- * favor of tif_getimage.c native handling
- */
- TIFFSetField(tif, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB);
- img->photometric = PHOTOMETRIC_RGB;
- break;
- default:
- /* do nothing */;
- break;
- }
- /*
- * TODO: if at all meaningful and useful, make more complete
- * support check here, or better still, refactor to let supporting
- * code decide whether there is support and what meaningful
- * error to return
- */
- break;
- case PHOTOMETRIC_RGB:
- if (colorchannels < 3) {
- sprintf(emsg, "Sorry, can not handle RGB image with %s=%d",
- "Color channels", colorchannels);
- goto fail_return;
- }
- break;
- case PHOTOMETRIC_SEPARATED:
- {
- uint16 inkset;
- TIFFGetFieldDefaulted(tif, TIFFTAG_INKSET, &inkset);
- if (inkset != INKSET_CMYK) {
- sprintf(emsg, "Sorry, can not handle separated image with %s=%d",
- "InkSet", inkset);
- goto fail_return;
- }
- if (img->samplesperpixel < 4) {
- sprintf(emsg, "Sorry, can not handle separated image with %s=%d",
- "Samples/pixel", img->samplesperpixel);
- goto fail_return;
- }
- }
- break;
- case PHOTOMETRIC_LOGL:
- if (compress != COMPRESSION_SGILOG) {
- sprintf(emsg, "Sorry, LogL data must have %s=%d",
- "Compression", COMPRESSION_SGILOG);
- goto fail_return;
- }
- TIFFSetField(tif, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_8BIT);
- img->photometric = PHOTOMETRIC_MINISBLACK; /* little white lie */
- img->bitspersample = 8;
- break;
- case PHOTOMETRIC_LOGLUV:
- if (compress != COMPRESSION_SGILOG && compress != COMPRESSION_SGILOG24) {
- sprintf(emsg, "Sorry, LogLuv data must have %s=%d or %d",
- "Compression", COMPRESSION_SGILOG, COMPRESSION_SGILOG24);
- goto fail_return;
- }
- if (planarconfig != PLANARCONFIG_CONTIG) {
- sprintf(emsg, "Sorry, can not handle LogLuv images with %s=%d",
- "Planarconfiguration", planarconfig);
- return (0);
- }
- TIFFSetField(tif, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_8BIT);
- img->photometric = PHOTOMETRIC_RGB; /* little white lie */
- img->bitspersample = 8;
- break;
- case PHOTOMETRIC_CIELAB:
- break;
- default:
- sprintf(emsg, "Sorry, can not handle image with %s=%d",
- photoTag, img->photometric);
- goto fail_return;
- }
- TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &img->width);
- TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &img->height);
- TIFFGetFieldDefaulted(tif, TIFFTAG_ORIENTATION, &img->orientation);
- img->isContig =
- !(planarconfig == PLANARCONFIG_SEPARATE && img->samplesperpixel > 1);
- if (img->isContig) {
- if (!PickContigCase(img)) {
- sprintf(emsg, "Sorry, can not handle image");
- goto fail_return;
- }
- } else {
- if (!PickSeparateCase(img)) {
- sprintf(emsg, "Sorry, can not handle image");
- goto fail_return;
- }
- }
- return 1;
-
- fail_return:
- TIFFRGBAImageEnd( img );
- return 0;
+ colorchannels = img->samplesperpixel - extrasamples;
+ TIFFGetFieldDefaulted(tif, TIFFTAG_COMPRESSION, &compress);
+ TIFFGetFieldDefaulted(tif, TIFFTAG_PLANARCONFIG, &planarconfig);
+ if (!TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &img->photometric))
+ {
+ switch (colorchannels)
+ {
+ case 1:
+ if (isCCITTCompression(tif))
+ img->photometric = PHOTOMETRIC_MINISWHITE;
+ else
+ img->photometric = PHOTOMETRIC_MINISBLACK;
+ break;
+ case 3:
+ img->photometric = PHOTOMETRIC_RGB;
+ break;
+ default:
+ snprintf(emsg, EMSG_BUF_SIZE, "Missing needed %s tag",
+ photoTag);
+ goto fail_return;
+ }
+ }
+ switch (img->photometric)
+ {
+ case PHOTOMETRIC_PALETTE:
+ if (!TIFFGetField(tif, TIFFTAG_COLORMAP, &red_orig, &green_orig,
+ &blue_orig))
+ {
+ snprintf(emsg, EMSG_BUF_SIZE,
+ "Missing required \"Colormap\" tag");
+ goto fail_return;
+ }
+
+ /* copy the colormaps so we can modify them */
+ n_color = (1U << img->bitspersample);
+ img->redcmap =
+ (uint16_t *)_TIFFmallocExt(tif, sizeof(uint16_t) * n_color);
+ img->greencmap =
+ (uint16_t *)_TIFFmallocExt(tif, sizeof(uint16_t) * n_color);
+ img->bluecmap =
+ (uint16_t *)_TIFFmallocExt(tif, sizeof(uint16_t) * n_color);
+ if (!img->redcmap || !img->greencmap || !img->bluecmap)
+ {
+ snprintf(emsg, EMSG_BUF_SIZE,
+ "Out of memory for colormap copy");
+ goto fail_return;
+ }
+
+ _TIFFmemcpy(img->redcmap, red_orig, n_color * 2);
+ _TIFFmemcpy(img->greencmap, green_orig, n_color * 2);
+ _TIFFmemcpy(img->bluecmap, blue_orig, n_color * 2);
+
+ /* fall through... */
+ case PHOTOMETRIC_MINISWHITE:
+ case PHOTOMETRIC_MINISBLACK:
+ if (planarconfig == PLANARCONFIG_CONTIG &&
+ img->samplesperpixel != 1 && img->bitspersample < 8)
+ {
+ snprintf(
+ emsg, EMSG_BUF_SIZE,
+ "Sorry, can not handle contiguous data with %s=%" PRIu16
+ ", "
+ "and %s=%" PRIu16 " and Bits/Sample=%" PRIu16,
+ photoTag, img->photometric, "Samples/pixel",
+ img->samplesperpixel, img->bitspersample);
+ goto fail_return;
+ }
+ break;
+ case PHOTOMETRIC_YCBCR:
+ /* It would probably be nice to have a reality check here. */
+ if (planarconfig == PLANARCONFIG_CONTIG)
+ /* can rely on libjpeg to convert to RGB */
+ /* XXX should restore current state on exit */
+ switch (compress)
+ {
+ case COMPRESSION_JPEG:
+ /*
+ * TODO: when complete tests verify complete
+ * desubsampling and YCbCr handling, remove use of
+ * TIFFTAG_JPEGCOLORMODE in favor of tif_getimage.c
+ * native handling
+ */
+ TIFFSetField(tif, TIFFTAG_JPEGCOLORMODE,
+ JPEGCOLORMODE_RGB);
+ img->photometric = PHOTOMETRIC_RGB;
+ break;
+ default:
+ /* do nothing */;
+ break;
+ }
+ /*
+ * TODO: if at all meaningful and useful, make more complete
+ * support check here, or better still, refactor to let supporting
+ * code decide whether there is support and what meaningful
+ * error to return
+ */
+ break;
+ case PHOTOMETRIC_RGB:
+ if (colorchannels < 3)
+ {
+ snprintf(emsg, EMSG_BUF_SIZE,
+ "Sorry, can not handle RGB image with %s=%d",
+ "Color channels", colorchannels);
+ goto fail_return;
+ }
+ break;
+ case PHOTOMETRIC_SEPARATED:
+ {
+ uint16_t inkset;
+ TIFFGetFieldDefaulted(tif, TIFFTAG_INKSET, &inkset);
+ if (inkset != INKSET_CMYK)
+ {
+ snprintf(
+ emsg, EMSG_BUF_SIZE,
+ "Sorry, can not handle separated image with %s=%" PRIu16,
+ "InkSet", inkset);
+ goto fail_return;
+ }
+ if (img->samplesperpixel < 4)
+ {
+ snprintf(
+ emsg, EMSG_BUF_SIZE,
+ "Sorry, can not handle separated image with %s=%" PRIu16,
+ "Samples/pixel", img->samplesperpixel);
+ goto fail_return;
+ }
+ }
+ break;
+ case PHOTOMETRIC_LOGL:
+ if (compress != COMPRESSION_SGILOG)
+ {
+ snprintf(emsg, EMSG_BUF_SIZE,
+ "Sorry, LogL data must have %s=%d", "Compression",
+ COMPRESSION_SGILOG);
+ goto fail_return;
+ }
+ TIFFSetField(tif, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_8BIT);
+ img->photometric = PHOTOMETRIC_MINISBLACK; /* little white lie */
+ img->bitspersample = 8;
+ break;
+ case PHOTOMETRIC_LOGLUV:
+ if (compress != COMPRESSION_SGILOG &&
+ compress != COMPRESSION_SGILOG24)
+ {
+ snprintf(emsg, EMSG_BUF_SIZE,
+ "Sorry, LogLuv data must have %s=%d or %d",
+ "Compression", COMPRESSION_SGILOG,
+ COMPRESSION_SGILOG24);
+ goto fail_return;
+ }
+ if (planarconfig != PLANARCONFIG_CONTIG)
+ {
+ snprintf(emsg, EMSG_BUF_SIZE,
+ "Sorry, can not handle LogLuv images with %s=%" PRIu16,
+ "Planarconfiguration", planarconfig);
+ return (0);
+ }
+ TIFFSetField(tif, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_8BIT);
+ img->photometric = PHOTOMETRIC_RGB; /* little white lie */
+ img->bitspersample = 8;
+ break;
+ case PHOTOMETRIC_CIELAB:
+ break;
+ default:
+ snprintf(emsg, EMSG_BUF_SIZE,
+ "Sorry, can not handle image with %s=%" PRIu16, photoTag,
+ img->photometric);
+ goto fail_return;
+ }
+ TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &img->width);
+ TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &img->height);
+ TIFFGetFieldDefaulted(tif, TIFFTAG_ORIENTATION, &img->orientation);
+ img->isContig =
+ !(planarconfig == PLANARCONFIG_SEPARATE && img->samplesperpixel > 1);
+ if (img->isContig)
+ {
+ if (!PickContigCase(img))
+ {
+ snprintf(emsg, EMSG_BUF_SIZE, "Sorry, can not handle image");
+ goto fail_return;
+ }
+ }
+ else
+ {
+ if (!PickSeparateCase(img))
+ {
+ snprintf(emsg, EMSG_BUF_SIZE, "Sorry, can not handle image");
+ goto fail_return;
+ }
+ }
+ return 1;
+
+fail_return:
+ TIFFRGBAImageEnd(img);
+ return 0;
}
-int
-TIFFRGBAImageGet(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
+int TIFFRGBAImageGet(TIFFRGBAImage *img, uint32_t *raster, uint32_t w,
+ uint32_t h)
{
- if (img->get == NULL) {
- TIFFErrorExt(img->tif->tif_clientdata, TIFFFileName(img->tif), "No \"get\" routine setup");
- return (0);
- }
- if (img->put.any == NULL) {
- TIFFErrorExt(img->tif->tif_clientdata, TIFFFileName(img->tif),
- "No \"put\" routine setupl; probably can not handle image format");
- return (0);
+ if (img->get == NULL)
+ {
+ TIFFErrorExtR(img->tif, TIFFFileName(img->tif),
+ "No \"get\" routine setup");
+ return (0);
+ }
+ if (img->put.any == NULL)
+ {
+ TIFFErrorExtR(
+ img->tif, TIFFFileName(img->tif),
+ "No \"put\" routine setupl; probably can not handle image format");
+ return (0);
}
return (*img->get)(img, raster, w, h);
}
@@ -515,24 +607,25 @@ TIFFRGBAImageGet(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
* Read the specified image into an ABGR-format rastertaking in account
* specified orientation.
*/
-int
-TIFFReadRGBAImageOriented(TIFF* tif,
- uint32 rwidth, uint32 rheight, uint32* raster,
- int orientation, int stop)
+int TIFFReadRGBAImageOriented(TIFF *tif, uint32_t rwidth, uint32_t rheight,
+ uint32_t *raster, int orientation, int stop)
{
- char emsg[1024] = "";
+ char emsg[EMSG_BUF_SIZE] = "";
TIFFRGBAImage img;
int ok;
- if (TIFFRGBAImageOK(tif, emsg) && TIFFRGBAImageBegin(&img, tif, stop, emsg)) {
- img.req_orientation = (uint16)orientation;
- /* XXX verify rwidth and rheight against width and height */
- ok = TIFFRGBAImageGet(&img, raster+(rheight-img.height)*rwidth,
- rwidth, img.height);
- TIFFRGBAImageEnd(&img);
- } else {
- TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "%s", emsg);
- ok = 0;
+ if (TIFFRGBAImageOK(tif, emsg) && TIFFRGBAImageBegin(&img, tif, stop, emsg))
+ {
+ img.req_orientation = (uint16_t)orientation;
+ /* XXX verify rwidth and rheight against width and height */
+ ok = TIFFRGBAImageGet(&img, raster + (rheight - img.height) * rwidth,
+ rwidth, img.height);
+ TIFFRGBAImageEnd(&img);
+ }
+ else
+ {
+ TIFFErrorExtR(tif, TIFFFileName(tif), "%s", emsg);
+ ok = 0;
}
return (ok);
}
@@ -541,73 +634,72 @@ TIFFReadRGBAImageOriented(TIFF* tif,
* Read the specified image into an ABGR-format raster. Use bottom left
* origin for raster by default.
*/
-int
-TIFFReadRGBAImage(TIFF* tif,
- uint32 rwidth, uint32 rheight, uint32* raster, int stop)
-{
- return TIFFReadRGBAImageOriented(tif, rwidth, rheight, raster,
- ORIENTATION_BOTLEFT, stop);
-}
-
-static int
-setorientation(TIFFRGBAImage* img)
-{
- switch (img->orientation) {
- case ORIENTATION_TOPLEFT:
- case ORIENTATION_LEFTTOP:
- if (img->req_orientation == ORIENTATION_TOPRIGHT ||
- img->req_orientation == ORIENTATION_RIGHTTOP)
- return FLIP_HORIZONTALLY;
- else if (img->req_orientation == ORIENTATION_BOTRIGHT ||
- img->req_orientation == ORIENTATION_RIGHTBOT)
- return FLIP_HORIZONTALLY | FLIP_VERTICALLY;
- else if (img->req_orientation == ORIENTATION_BOTLEFT ||
- img->req_orientation == ORIENTATION_LEFTBOT)
- return FLIP_VERTICALLY;
- else
- return 0;
- case ORIENTATION_TOPRIGHT:
- case ORIENTATION_RIGHTTOP:
- if (img->req_orientation == ORIENTATION_TOPLEFT ||
- img->req_orientation == ORIENTATION_LEFTTOP)
- return FLIP_HORIZONTALLY;
- else if (img->req_orientation == ORIENTATION_BOTRIGHT ||
- img->req_orientation == ORIENTATION_RIGHTBOT)
- return FLIP_VERTICALLY;
- else if (img->req_orientation == ORIENTATION_BOTLEFT ||
- img->req_orientation == ORIENTATION_LEFTBOT)
- return FLIP_HORIZONTALLY | FLIP_VERTICALLY;
- else
- return 0;
- case ORIENTATION_BOTRIGHT:
- case ORIENTATION_RIGHTBOT:
- if (img->req_orientation == ORIENTATION_TOPLEFT ||
- img->req_orientation == ORIENTATION_LEFTTOP)
- return FLIP_HORIZONTALLY | FLIP_VERTICALLY;
- else if (img->req_orientation == ORIENTATION_TOPRIGHT ||
- img->req_orientation == ORIENTATION_RIGHTTOP)
- return FLIP_VERTICALLY;
- else if (img->req_orientation == ORIENTATION_BOTLEFT ||
- img->req_orientation == ORIENTATION_LEFTBOT)
- return FLIP_HORIZONTALLY;
- else
- return 0;
- case ORIENTATION_BOTLEFT:
- case ORIENTATION_LEFTBOT:
- if (img->req_orientation == ORIENTATION_TOPLEFT ||
- img->req_orientation == ORIENTATION_LEFTTOP)
- return FLIP_VERTICALLY;
- else if (img->req_orientation == ORIENTATION_TOPRIGHT ||
- img->req_orientation == ORIENTATION_RIGHTTOP)
- return FLIP_HORIZONTALLY | FLIP_VERTICALLY;
- else if (img->req_orientation == ORIENTATION_BOTRIGHT ||
- img->req_orientation == ORIENTATION_RIGHTBOT)
- return FLIP_HORIZONTALLY;
- else
- return 0;
- default: /* NOTREACHED */
- return 0;
- }
+int TIFFReadRGBAImage(TIFF *tif, uint32_t rwidth, uint32_t rheight,
+ uint32_t *raster, int stop)
+{
+ return TIFFReadRGBAImageOriented(tif, rwidth, rheight, raster,
+ ORIENTATION_BOTLEFT, stop);
+}
+
+static int setorientation(TIFFRGBAImage *img)
+{
+ switch (img->orientation)
+ {
+ case ORIENTATION_TOPLEFT:
+ case ORIENTATION_LEFTTOP:
+ if (img->req_orientation == ORIENTATION_TOPRIGHT ||
+ img->req_orientation == ORIENTATION_RIGHTTOP)
+ return FLIP_HORIZONTALLY;
+ else if (img->req_orientation == ORIENTATION_BOTRIGHT ||
+ img->req_orientation == ORIENTATION_RIGHTBOT)
+ return FLIP_HORIZONTALLY | FLIP_VERTICALLY;
+ else if (img->req_orientation == ORIENTATION_BOTLEFT ||
+ img->req_orientation == ORIENTATION_LEFTBOT)
+ return FLIP_VERTICALLY;
+ else
+ return 0;
+ case ORIENTATION_TOPRIGHT:
+ case ORIENTATION_RIGHTTOP:
+ if (img->req_orientation == ORIENTATION_TOPLEFT ||
+ img->req_orientation == ORIENTATION_LEFTTOP)
+ return FLIP_HORIZONTALLY;
+ else if (img->req_orientation == ORIENTATION_BOTRIGHT ||
+ img->req_orientation == ORIENTATION_RIGHTBOT)
+ return FLIP_VERTICALLY;
+ else if (img->req_orientation == ORIENTATION_BOTLEFT ||
+ img->req_orientation == ORIENTATION_LEFTBOT)
+ return FLIP_HORIZONTALLY | FLIP_VERTICALLY;
+ else
+ return 0;
+ case ORIENTATION_BOTRIGHT:
+ case ORIENTATION_RIGHTBOT:
+ if (img->req_orientation == ORIENTATION_TOPLEFT ||
+ img->req_orientation == ORIENTATION_LEFTTOP)
+ return FLIP_HORIZONTALLY | FLIP_VERTICALLY;
+ else if (img->req_orientation == ORIENTATION_TOPRIGHT ||
+ img->req_orientation == ORIENTATION_RIGHTTOP)
+ return FLIP_VERTICALLY;
+ else if (img->req_orientation == ORIENTATION_BOTLEFT ||
+ img->req_orientation == ORIENTATION_LEFTBOT)
+ return FLIP_HORIZONTALLY;
+ else
+ return 0;
+ case ORIENTATION_BOTLEFT:
+ case ORIENTATION_LEFTBOT:
+ if (img->req_orientation == ORIENTATION_TOPLEFT ||
+ img->req_orientation == ORIENTATION_LEFTTOP)
+ return FLIP_VERTICALLY;
+ else if (img->req_orientation == ORIENTATION_TOPRIGHT ||
+ img->req_orientation == ORIENTATION_RIGHTTOP)
+ return FLIP_HORIZONTALLY | FLIP_VERTICALLY;
+ else if (img->req_orientation == ORIENTATION_BOTRIGHT ||
+ img->req_orientation == ORIENTATION_RIGHTBOT)
+ return FLIP_HORIZONTALLY;
+ else
+ return 0;
+ default: /* NOTREACHED */
+ return 0;
+ }
}
/*
@@ -615,28 +707,29 @@ setorientation(TIFFRGBAImage* img)
* PlanarConfiguration contiguous if SamplesPerPixel > 1
* or
* SamplesPerPixel == 1
- */
-static int
-gtTileContig(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
+ */
+static int gtTileContig(TIFFRGBAImage *img, uint32_t *raster, uint32_t w,
+ uint32_t h)
{
- TIFF* tif = img->tif;
+ TIFF *tif = img->tif;
tileContigRoutine put = img->put.contig;
- uint32 col, row, y, rowstoread;
+ uint32_t col, row, y, rowstoread;
tmsize_t pos;
- uint32 tw, th;
- unsigned char* buf = NULL;
- int32 fromskew, toskew;
- uint32 nrow;
+ uint32_t tw, th;
+ unsigned char *buf = NULL;
+ int32_t fromskew, toskew;
+ uint32_t nrow;
int ret = 1, flip;
- uint32 this_tw, tocol;
- int32 this_toskew, leftmost_toskew;
- int32 leftmost_fromskew;
- uint32 leftmost_tw;
+ uint32_t this_tw, tocol;
+ int32_t this_toskew, leftmost_toskew;
+ int32_t leftmost_fromskew;
+ uint32_t leftmost_tw;
tmsize_t bufsize;
bufsize = TIFFTileSize(tif);
- if (bufsize == 0) {
- TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "%s", "No space for tile buffer");
+ if (bufsize == 0)
+ {
+ TIFFErrorExtR(tif, TIFFFileName(tif), "%s", "No space for tile buffer");
return (0);
}
@@ -644,15 +737,29 @@ gtTileContig(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
TIFFGetField(tif, TIFFTAG_TILELENGTH, &th);
flip = setorientation(img);
- if (flip & FLIP_VERTICALLY) {
- y = h - 1;
- toskew = -(int32)(tw + w);
+ if (flip & FLIP_VERTICALLY)
+ {
+ if ((tw + w) > INT_MAX)
+ {
+ TIFFErrorExtR(tif, TIFFFileName(tif), "%s",
+ "unsupported tile size (too wide)");
+ return (0);
+ }
+ y = h - 1;
+ toskew = -(int32_t)(tw + w);
}
- else {
- y = 0;
- toskew = -(int32)(tw - w);
+ else
+ {
+ if (tw > (INT_MAX + w))
+ {
+ TIFFErrorExtR(tif, TIFFFileName(tif), "%s",
+ "unsupported tile size (too wide)");
+ return (0);
+ }
+ y = 0;
+ toskew = -(int32_t)(tw - w);
}
-
+
/*
* Leftmost tile is clipped on left side if col_offset > 0.
*/
@@ -662,62 +769,69 @@ gtTileContig(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
for (row = 0; ret != 0 && row < h; row += nrow)
{
rowstoread = th - (row + img->row_offset) % th;
- nrow = (row + rowstoread > h ? h - row : rowstoread);
- fromskew = leftmost_fromskew;
- this_tw = leftmost_tw;
- this_toskew = leftmost_toskew;
- tocol = 0;
- col = img->col_offset;
- while (tocol < w)
+ nrow = (row + rowstoread > h ? h - row : rowstoread);
+ fromskew = leftmost_fromskew;
+ this_tw = leftmost_tw;
+ this_toskew = leftmost_toskew;
+ tocol = 0;
+ col = img->col_offset;
+ while (tocol < w)
{
- if (_TIFFReadTileAndAllocBuffer(tif, (void**) &buf, bufsize, col,
- row+img->row_offset, 0, 0)==(tmsize_t)(-1) &&
+ if (_TIFFReadTileAndAllocBuffer(tif, (void **)&buf, bufsize, col,
+ row + img->row_offset, 0,
+ 0) == (tmsize_t)(-1) &&
(buf == NULL || img->stoponerr))
{
ret = 0;
break;
}
- pos = ((row+img->row_offset) % th) * TIFFTileRowSize(tif) + \
- ((tmsize_t) fromskew * img->samplesperpixel);
- if (tocol + this_tw > w)
- {
- /*
- * Rightmost tile is clipped on right side.
- */
- fromskew = tw - (w - tocol);
- this_tw = tw - fromskew;
- this_toskew = toskew + fromskew;
- }
- (*put)(img, raster+y*w+tocol, tocol, y, this_tw, nrow, fromskew, this_toskew, buf + pos);
- tocol += this_tw;
- col += this_tw;
- /*
- * After the leftmost tile, tiles are no longer clipped on left side.
- */
- fromskew = 0;
- this_tw = tw;
- this_toskew = toskew;
- }
-
- y += ((flip & FLIP_VERTICALLY) ? -(int32) nrow : (int32) nrow);
- }
- _TIFFfree(buf);
-
- if (flip & FLIP_HORIZONTALLY) {
- uint32 line;
-
- for (line = 0; line < h; line++) {
- uint32 *left = raster + (line * w);
- uint32 *right = left + w - 1;
-
- while ( left < right ) {
- uint32 temp = *left;
- *left = *right;
- *right = temp;
- left++;
- right--;
- }
- }
+ pos = ((row + img->row_offset) % th) * TIFFTileRowSize(tif) +
+ ((tmsize_t)fromskew * img->samplesperpixel);
+ if (tocol + this_tw > w)
+ {
+ /*
+ * Rightmost tile is clipped on right side.
+ */
+ fromskew = tw - (w - tocol);
+ this_tw = tw - fromskew;
+ this_toskew = toskew + fromskew;
+ }
+ tmsize_t roffset = (tmsize_t)y * w + tocol;
+ (*put)(img, raster + roffset, tocol, y, this_tw, nrow, fromskew,
+ this_toskew, buf + pos);
+ tocol += this_tw;
+ col += this_tw;
+ /*
+ * After the leftmost tile, tiles are no longer clipped on left
+ * side.
+ */
+ fromskew = 0;
+ this_tw = tw;
+ this_toskew = toskew;
+ }
+
+ y += ((flip & FLIP_VERTICALLY) ? -(int32_t)nrow : (int32_t)nrow);
+ }
+ _TIFFfreeExt(img->tif, buf);
+
+ if (flip & FLIP_HORIZONTALLY)
+ {
+ uint32_t line;
+
+ for (line = 0; line < h; line++)
+ {
+ uint32_t *left = raster + (line * w);
+ uint32_t *right = left + w - 1;
+
+ while (left < right)
+ {
+ uint32_t temp = *left;
+ *left = *right;
+ *right = temp;
+ left++;
+ right--;
+ }
+ }
}
return (ret);
@@ -728,180 +842,203 @@ gtTileContig(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
* SamplesPerPixel > 1
* PlanarConfiguration separated
* We assume that all such images are RGB.
- */
-static int
-gtTileSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
-{
- TIFF* tif = img->tif;
- tileSeparateRoutine put = img->put.separate;
- uint32 col, row, y, rowstoread;
- tmsize_t pos;
- uint32 tw, th;
- unsigned char* buf = NULL;
- unsigned char* p0 = NULL;
- unsigned char* p1 = NULL;
- unsigned char* p2 = NULL;
- unsigned char* pa = NULL;
- tmsize_t tilesize;
- tmsize_t bufsize;
- int32 fromskew, toskew;
- int alpha = img->alpha;
- uint32 nrow;
- int ret = 1, flip;
- uint16 colorchannels;
- uint32 this_tw, tocol;
- int32 this_toskew, leftmost_toskew;
- int32 leftmost_fromskew;
- uint32 leftmost_tw;
-
- tilesize = TIFFTileSize(tif);
- bufsize = _TIFFMultiplySSize(tif, alpha?4:3,tilesize, "gtTileSeparate");
- if (bufsize == 0) {
- return (0);
- }
-
- TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw);
- TIFFGetField(tif, TIFFTAG_TILELENGTH, &th);
-
- flip = setorientation(img);
- if (flip & FLIP_VERTICALLY) {
- y = h - 1;
- toskew = -(int32)(tw + w);
- }
- else {
- y = 0;
- toskew = -(int32)(tw - w);
- }
-
- switch( img->photometric )
+ */
+static int gtTileSeparate(TIFFRGBAImage *img, uint32_t *raster, uint32_t w,
+ uint32_t h)
+{
+ TIFF *tif = img->tif;
+ tileSeparateRoutine put = img->put.separate;
+ uint32_t col, row, y, rowstoread;
+ tmsize_t pos;
+ uint32_t tw, th;
+ unsigned char *buf = NULL;
+ unsigned char *p0 = NULL;
+ unsigned char *p1 = NULL;
+ unsigned char *p2 = NULL;
+ unsigned char *pa = NULL;
+ tmsize_t tilesize;
+ tmsize_t bufsize;
+ int32_t fromskew, toskew;
+ int alpha = img->alpha;
+ uint32_t nrow;
+ int ret = 1, flip;
+ uint16_t colorchannels;
+ uint32_t this_tw, tocol;
+ int32_t this_toskew, leftmost_toskew;
+ int32_t leftmost_fromskew;
+ uint32_t leftmost_tw;
+
+ tilesize = TIFFTileSize(tif);
+ bufsize =
+ _TIFFMultiplySSize(tif, alpha ? 4 : 3, tilesize, "gtTileSeparate");
+ if (bufsize == 0)
+ {
+ return (0);
+ }
+
+ TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw);
+ TIFFGetField(tif, TIFFTAG_TILELENGTH, &th);
+
+ flip = setorientation(img);
+ if (flip & FLIP_VERTICALLY)
+ {
+ if ((tw + w) > INT_MAX)
+ {
+ TIFFErrorExtR(tif, TIFFFileName(tif), "%s",
+ "unsupported tile size (too wide)");
+ return (0);
+ }
+ y = h - 1;
+ toskew = -(int32_t)(tw + w);
+ }
+ else
+ {
+ if (tw > (INT_MAX + w))
{
- case PHOTOMETRIC_MINISWHITE:
- case PHOTOMETRIC_MINISBLACK:
- case PHOTOMETRIC_PALETTE:
+ TIFFErrorExtR(tif, TIFFFileName(tif), "%s",
+ "unsupported tile size (too wide)");
+ return (0);
+ }
+ y = 0;
+ toskew = -(int32_t)(tw - w);
+ }
+
+ switch (img->photometric)
+ {
+ case PHOTOMETRIC_MINISWHITE:
+ case PHOTOMETRIC_MINISBLACK:
+ case PHOTOMETRIC_PALETTE:
colorchannels = 1;
break;
- default:
+ default:
colorchannels = 3;
break;
+ }
+
+ /*
+ * Leftmost tile is clipped on left side if col_offset > 0.
+ */
+ leftmost_fromskew = img->col_offset % tw;
+ leftmost_tw = tw - leftmost_fromskew;
+ leftmost_toskew = toskew + leftmost_fromskew;
+ for (row = 0; ret != 0 && row < h; row += nrow)
+ {
+ rowstoread = th - (row + img->row_offset) % th;
+ nrow = (row + rowstoread > h ? h - row : rowstoread);
+ fromskew = leftmost_fromskew;
+ this_tw = leftmost_tw;
+ this_toskew = leftmost_toskew;
+ tocol = 0;
+ col = img->col_offset;
+ while (tocol < w)
+ {
+ if (buf == NULL)
+ {
+ if (_TIFFReadTileAndAllocBuffer(tif, (void **)&buf, bufsize,
+ col, row + img->row_offset, 0,
+ 0) == (tmsize_t)(-1) &&
+ (buf == NULL || img->stoponerr))
+ {
+ ret = 0;
+ break;
+ }
+ p0 = buf;
+ if (colorchannels == 1)
+ {
+ p2 = p1 = p0;
+ pa = (alpha ? (p0 + 3 * tilesize) : NULL);
+ }
+ else
+ {
+ p1 = p0 + tilesize;
+ p2 = p1 + tilesize;
+ pa = (alpha ? (p2 + tilesize) : NULL);
+ }
+ }
+ else if (TIFFReadTile(tif, p0, col, row + img->row_offset, 0, 0) ==
+ (tmsize_t)(-1) &&
+ img->stoponerr)
+ {
+ ret = 0;
+ break;
+ }
+ if (colorchannels > 1 &&
+ TIFFReadTile(tif, p1, col, row + img->row_offset, 0, 1) ==
+ (tmsize_t)(-1) &&
+ img->stoponerr)
+ {
+ ret = 0;
+ break;
+ }
+ if (colorchannels > 1 &&
+ TIFFReadTile(tif, p2, col, row + img->row_offset, 0, 2) ==
+ (tmsize_t)(-1) &&
+ img->stoponerr)
+ {
+ ret = 0;
+ break;
+ }
+ if (alpha &&
+ TIFFReadTile(tif, pa, col, row + img->row_offset, 0,
+ colorchannels) == (tmsize_t)(-1) &&
+ img->stoponerr)
+ {
+ ret = 0;
+ break;
+ }
+
+ pos = ((row + img->row_offset) % th) * TIFFTileRowSize(tif) +
+ ((tmsize_t)fromskew * img->samplesperpixel);
+ if (tocol + this_tw > w)
+ {
+ /*
+ * Rightmost tile is clipped on right side.
+ */
+ fromskew = tw - (w - tocol);
+ this_tw = tw - fromskew;
+ this_toskew = toskew + fromskew;
+ }
+ tmsize_t roffset = (tmsize_t)y * w + tocol;
+ (*put)(img, raster + roffset, tocol, y, this_tw, nrow, fromskew,
+ this_toskew, p0 + pos, p1 + pos, p2 + pos,
+ (alpha ? (pa + pos) : NULL));
+ tocol += this_tw;
+ col += this_tw;
+ /*
+ * After the leftmost tile, tiles are no longer clipped on left
+ * side.
+ */
+ fromskew = 0;
+ this_tw = tw;
+ this_toskew = toskew;
}
- /*
- * Leftmost tile is clipped on left side if col_offset > 0.
- */
- leftmost_fromskew = img->col_offset % tw;
- leftmost_tw = tw - leftmost_fromskew;
- leftmost_toskew = toskew + leftmost_fromskew;
- for (row = 0; ret != 0 && row < h; row += nrow)
- {
- rowstoread = th - (row + img->row_offset) % th;
- nrow = (row + rowstoread > h ? h - row : rowstoread);
- fromskew = leftmost_fromskew;
- this_tw = leftmost_tw;
- this_toskew = leftmost_toskew;
- tocol = 0;
- col = img->col_offset;
- while (tocol < w)
- {
- if( buf == NULL )
- {
- if (_TIFFReadTileAndAllocBuffer(
- tif, (void**) &buf, bufsize, col,
- row+img->row_offset,0,0)==(tmsize_t)(-1)
- && (buf == NULL || img->stoponerr))
- {
- ret = 0;
- break;
- }
- p0 = buf;
- if( colorchannels == 1 )
- {
- p2 = p1 = p0;
- pa = (alpha?(p0+3*tilesize):NULL);
- }
- else
- {
- p1 = p0 + tilesize;
- p2 = p1 + tilesize;
- pa = (alpha?(p2+tilesize):NULL);
- }
- }
- else if (TIFFReadTile(tif, p0, col,
- row+img->row_offset,0,0)==(tmsize_t)(-1) && img->stoponerr)
- {
- ret = 0;
- break;
- }
- if (colorchannels > 1
- && TIFFReadTile(tif, p1, col,
- row+img->row_offset,0,1) == (tmsize_t)(-1)
- && img->stoponerr)
- {
- ret = 0;
- break;
- }
- if (colorchannels > 1
- && TIFFReadTile(tif, p2, col,
- row+img->row_offset,0,2) == (tmsize_t)(-1)
- && img->stoponerr)
- {
- ret = 0;
- break;
- }
- if (alpha
- && TIFFReadTile(tif,pa,col,
- row+img->row_offset,0,colorchannels) == (tmsize_t)(-1)
- && img->stoponerr)
- {
- ret = 0;
- break;
- }
-
- pos = ((row+img->row_offset) % th) * TIFFTileRowSize(tif) + \
- ((tmsize_t) fromskew * img->samplesperpixel);
- if (tocol + this_tw > w)
- {
- /*
- * Rightmost tile is clipped on right side.
- */
- fromskew = tw - (w - tocol);
- this_tw = tw - fromskew;
- this_toskew = toskew + fromskew;
- }
- (*put)(img, raster+y*w+tocol, tocol, y, this_tw, nrow, fromskew, this_toskew, \
- p0 + pos, p1 + pos, p2 + pos, (alpha?(pa+pos):NULL));
- tocol += this_tw;
- col += this_tw;
- /*
- * After the leftmost tile, tiles are no longer clipped on left side.
- */
- fromskew = 0;
- this_tw = tw;
- this_toskew = toskew;
- }
-
- y += ((flip & FLIP_VERTICALLY) ?-(int32) nrow : (int32) nrow);
- }
-
- if (flip & FLIP_HORIZONTALLY) {
- uint32 line;
-
- for (line = 0; line < h; line++) {
- uint32 *left = raster + (line * w);
- uint32 *right = left + w - 1;
-
- while ( left < right ) {
- uint32 temp = *left;
- *left = *right;
- *right = temp;
- left++;
- right--;
- }
- }
- }
-
- _TIFFfree(buf);
- return (ret);
+ y += ((flip & FLIP_VERTICALLY) ? -(int32_t)nrow : (int32_t)nrow);
+ }
+
+ if (flip & FLIP_HORIZONTALLY)
+ {
+ uint32_t line;
+
+ for (line = 0; line < h; line++)
+ {
+ uint32_t *left = raster + (line * w);
+ uint32_t *right = left + w - 1;
+
+ while (left < right)
+ {
+ uint32_t temp = *left;
+ *left = *right;
+ *right = temp;
+ left++;
+ right--;
+ }
+ }
+ }
+
+ _TIFFfreeExt(img->tif, buf);
+ return (ret);
}
/*
@@ -909,94 +1046,110 @@ gtTileSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
* PlanarConfiguration contiguous if SamplesPerPixel > 1
* or
* SamplesPerPixel == 1
- */
-static int
-gtStripContig(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
-{
- TIFF* tif = img->tif;
- tileContigRoutine put = img->put.contig;
- uint32 row, y, nrow, nrowsub, rowstoread;
- tmsize_t pos;
- unsigned char* buf = NULL;
- uint32 rowsperstrip;
- uint16 subsamplinghor,subsamplingver;
- uint32 imagewidth = img->width;
- tmsize_t scanline;
- int32 fromskew, toskew;
- int ret = 1, flip;
- tmsize_t maxstripsize;
-
- TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRSUBSAMPLING, &subsamplinghor, &subsamplingver);
- if( subsamplingver == 0 ) {
- TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "Invalid vertical YCbCr subsampling");
- return (0);
- }
-
- maxstripsize = TIFFStripSize(tif);
-
- flip = setorientation(img);
- if (flip & FLIP_VERTICALLY) {
- y = h - 1;
- toskew = -(int32)(w + w);
- } else {
- y = 0;
- toskew = -(int32)(w - w);
- }
-
- TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
-
- scanline = TIFFScanlineSize(tif);
- fromskew = (w < imagewidth ? imagewidth - w : 0);
- for (row = 0; row < h; row += nrow)
- {
- uint32 temp;
- rowstoread = rowsperstrip - (row + img->row_offset) % rowsperstrip;
- nrow = (row + rowstoread > h ? h - row : rowstoread);
- nrowsub = nrow;
- if ((nrowsub%subsamplingver)!=0)
- nrowsub+=subsamplingver-nrowsub%subsamplingver;
- temp = (row + img->row_offset)%rowsperstrip + nrowsub;
- if( scanline > 0 && temp > (size_t)(TIFF_TMSIZE_T_MAX / scanline) )
- {
- TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "Integer overflow in gtStripContig");
- return 0;
- }
- if (_TIFFReadEncodedStripAndAllocBuffer(tif,
- TIFFComputeStrip(tif,row+img->row_offset, 0),
- (void**)(&buf),
- maxstripsize,
- temp * scanline)==(tmsize_t)(-1)
- && (buf == NULL || img->stoponerr))
- {
- ret = 0;
- break;
- }
-
- pos = ((row + img->row_offset) % rowsperstrip) * scanline + \
- ((tmsize_t) img->col_offset * img->samplesperpixel);
- (*put)(img, raster+y*w, 0, y, w, nrow, fromskew, toskew, buf + pos);
- y += ((flip & FLIP_VERTICALLY) ? -(int32) nrow : (int32) nrow);
- }
-
- if (flip & FLIP_HORIZONTALLY) {
- uint32 line;
-
- for (line = 0; line < h; line++) {
- uint32 *left = raster + (line * w);
- uint32 *right = left + w - 1;
-
- while ( left < right ) {
- uint32 temp = *left;
- *left = *right;
- *right = temp;
- left++;
- right--;
- }
- }
- }
-
- _TIFFfree(buf);
- return (ret);
+ */
+static int gtStripContig(TIFFRGBAImage *img, uint32_t *raster, uint32_t w,
+ uint32_t h)
+{
+ TIFF *tif = img->tif;
+ tileContigRoutine put = img->put.contig;
+ uint32_t row, y, nrow, nrowsub, rowstoread;
+ tmsize_t pos;
+ unsigned char *buf = NULL;
+ uint32_t rowsperstrip;
+ uint16_t subsamplinghor, subsamplingver;
+ uint32_t imagewidth = img->width;
+ tmsize_t scanline;
+ int32_t fromskew, toskew;
+ int ret = 1, flip;
+ tmsize_t maxstripsize;
+
+ TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRSUBSAMPLING, &subsamplinghor,
+ &subsamplingver);
+ if (subsamplingver == 0)
+ {
+ TIFFErrorExtR(tif, TIFFFileName(tif),
+ "Invalid vertical YCbCr subsampling");
+ return (0);
+ }
+
+ maxstripsize = TIFFStripSize(tif);
+
+ flip = setorientation(img);
+ if (flip & FLIP_VERTICALLY)
+ {
+ if (w > INT_MAX)
+ {
+ TIFFErrorExtR(tif, TIFFFileName(tif), "Width overflow");
+ return (0);
+ }
+ y = h - 1;
+ toskew = -(int32_t)(w + w);
+ }
+ else
+ {
+ y = 0;
+ toskew = -(int32_t)(w - w);
+ }
+
+ TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
+
+ scanline = TIFFScanlineSize(tif);
+ fromskew = (w < imagewidth ? imagewidth - w : 0);
+ for (row = 0; row < h; row += nrow)
+ {
+ uint32_t temp;
+ rowstoread = rowsperstrip - (row + img->row_offset) % rowsperstrip;
+ nrow = (row + rowstoread > h ? h - row : rowstoread);
+ nrowsub = nrow;
+ if ((nrowsub % subsamplingver) != 0)
+ nrowsub += subsamplingver - nrowsub % subsamplingver;
+ temp = (row + img->row_offset) % rowsperstrip + nrowsub;
+ if (scanline > 0 && temp > (size_t)(TIFF_TMSIZE_T_MAX / scanline))
+ {
+ TIFFErrorExtR(tif, TIFFFileName(tif),
+ "Integer overflow in gtStripContig");
+ return 0;
+ }
+ if (_TIFFReadEncodedStripAndAllocBuffer(
+ tif, TIFFComputeStrip(tif, row + img->row_offset, 0),
+ (void **)(&buf), maxstripsize,
+ temp * scanline) == (tmsize_t)(-1) &&
+ (buf == NULL || img->stoponerr))
+ {
+ ret = 0;
+ break;
+ }
+
+ pos = ((row + img->row_offset) % rowsperstrip) * scanline +
+ ((tmsize_t)img->col_offset * img->samplesperpixel);
+ tmsize_t roffset = (tmsize_t)y * w;
+ (*put)(img, raster + roffset, 0, y, w, nrow, fromskew, toskew,
+ buf + pos);
+ y += ((flip & FLIP_VERTICALLY) ? -(int32_t)nrow : (int32_t)nrow);
+ }
+
+ if (flip & FLIP_HORIZONTALLY)
+ {
+ uint32_t line;
+
+ for (line = 0; line < h; line++)
+ {
+ uint32_t *left = raster + (line * w);
+ uint32_t *right = left + w - 1;
+
+ while (left < right)
+ {
+ uint32_t temp = *left;
+ *left = *right;
+ *right = temp;
+ left++;
+ right--;
+ }
+ }
+ }
+
+ _TIFFfreeExt(img->tif, buf);
+ return (ret);
}
/*
@@ -1005,153 +1158,167 @@ gtStripContig(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
* PlanarConfiguration separated
* We assume that all such images are RGB.
*/
-static int
-gtStripSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
-{
- TIFF* tif = img->tif;
- tileSeparateRoutine put = img->put.separate;
- unsigned char *buf = NULL;
- unsigned char *p0 = NULL, *p1 = NULL, *p2 = NULL, *pa = NULL;
- uint32 row, y, nrow, rowstoread;
- tmsize_t pos;
- tmsize_t scanline;
- uint32 rowsperstrip, offset_row;
- uint32 imagewidth = img->width;
- tmsize_t stripsize;
- tmsize_t bufsize;
- int32 fromskew, toskew;
- int alpha = img->alpha;
- int ret = 1, flip;
- uint16 colorchannels;
-
- stripsize = TIFFStripSize(tif);
- bufsize = _TIFFMultiplySSize(tif,alpha?4:3,stripsize, "gtStripSeparate");
- if (bufsize == 0) {
- return (0);
- }
-
- flip = setorientation(img);
- if (flip & FLIP_VERTICALLY) {
- y = h - 1;
- toskew = -(int32)(w + w);
- }
- else {
- y = 0;
- toskew = -(int32)(w - w);
- }
-
- switch( img->photometric )
+static int gtStripSeparate(TIFFRGBAImage *img, uint32_t *raster, uint32_t w,
+ uint32_t h)
+{
+ TIFF *tif = img->tif;
+ tileSeparateRoutine put = img->put.separate;
+ unsigned char *buf = NULL;
+ unsigned char *p0 = NULL, *p1 = NULL, *p2 = NULL, *pa = NULL;
+ uint32_t row, y, nrow, rowstoread;
+ tmsize_t pos;
+ tmsize_t scanline;
+ uint32_t rowsperstrip, offset_row;
+ uint32_t imagewidth = img->width;
+ tmsize_t stripsize;
+ tmsize_t bufsize;
+ int32_t fromskew, toskew;
+ int alpha = img->alpha;
+ int ret = 1, flip;
+ uint16_t colorchannels;
+
+ stripsize = TIFFStripSize(tif);
+ bufsize =
+ _TIFFMultiplySSize(tif, alpha ? 4 : 3, stripsize, "gtStripSeparate");
+ if (bufsize == 0)
+ {
+ return (0);
+ }
+
+ flip = setorientation(img);
+ if (flip & FLIP_VERTICALLY)
+ {
+ if (w > INT_MAX)
{
- case PHOTOMETRIC_MINISWHITE:
- case PHOTOMETRIC_MINISBLACK:
- case PHOTOMETRIC_PALETTE:
+ TIFFErrorExtR(tif, TIFFFileName(tif), "Width overflow");
+ return (0);
+ }
+ y = h - 1;
+ toskew = -(int32_t)(w + w);
+ }
+ else
+ {
+ y = 0;
+ toskew = -(int32_t)(w - w);
+ }
+
+ switch (img->photometric)
+ {
+ case PHOTOMETRIC_MINISWHITE:
+ case PHOTOMETRIC_MINISBLACK:
+ case PHOTOMETRIC_PALETTE:
colorchannels = 1;
break;
- default:
+ default:
colorchannels = 3;
break;
+ }
+
+ TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
+ scanline = TIFFScanlineSize(tif);
+ fromskew = (w < imagewidth ? imagewidth - w : 0);
+ for (row = 0; row < h; row += nrow)
+ {
+ uint32_t temp;
+ rowstoread = rowsperstrip - (row + img->row_offset) % rowsperstrip;
+ nrow = (row + rowstoread > h ? h - row : rowstoread);
+ offset_row = row + img->row_offset;
+ temp = (row + img->row_offset) % rowsperstrip + nrow;
+ if (scanline > 0 && temp > (size_t)(TIFF_TMSIZE_T_MAX / scanline))
+ {
+ TIFFErrorExtR(tif, TIFFFileName(tif),
+ "Integer overflow in gtStripSeparate");
+ return 0;
+ }
+ if (buf == NULL)
+ {
+ if (_TIFFReadEncodedStripAndAllocBuffer(
+ tif, TIFFComputeStrip(tif, offset_row, 0), (void **)&buf,
+ bufsize, temp * scanline) == (tmsize_t)(-1) &&
+ (buf == NULL || img->stoponerr))
+ {
+ ret = 0;
+ break;
+ }
+ p0 = buf;
+ if (colorchannels == 1)
+ {
+ p2 = p1 = p0;
+ pa = (alpha ? (p0 + 3 * stripsize) : NULL);
+ }
+ else
+ {
+ p1 = p0 + stripsize;
+ p2 = p1 + stripsize;
+ pa = (alpha ? (p2 + stripsize) : NULL);
+ }
+ }
+ else if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, 0),
+ p0, temp * scanline) == (tmsize_t)(-1) &&
+ img->stoponerr)
+ {
+ ret = 0;
+ break;
+ }
+ if (colorchannels > 1 &&
+ TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, 1), p1,
+ temp * scanline) == (tmsize_t)(-1) &&
+ img->stoponerr)
+ {
+ ret = 0;
+ break;
+ }
+ if (colorchannels > 1 &&
+ TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, 2), p2,
+ temp * scanline) == (tmsize_t)(-1) &&
+ img->stoponerr)
+ {
+ ret = 0;
+ break;
+ }
+ if (alpha)
+ {
+ if (TIFFReadEncodedStrip(
+ tif, TIFFComputeStrip(tif, offset_row, colorchannels), pa,
+ temp * scanline) == (tmsize_t)(-1) &&
+ img->stoponerr)
+ {
+ ret = 0;
+ break;
+ }
}
- TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
- scanline = TIFFScanlineSize(tif);
- fromskew = (w < imagewidth ? imagewidth - w : 0);
- for (row = 0; row < h; row += nrow)
- {
- uint32 temp;
- rowstoread = rowsperstrip - (row + img->row_offset) % rowsperstrip;
- nrow = (row + rowstoread > h ? h - row : rowstoread);
- offset_row = row + img->row_offset;
- temp = (row + img->row_offset)%rowsperstrip + nrow;
- if( scanline > 0 && temp > (size_t)(TIFF_TMSIZE_T_MAX / scanline) )
- {
- TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "Integer overflow in gtStripSeparate");
- return 0;
- }
- if( buf == NULL )
- {
- if (_TIFFReadEncodedStripAndAllocBuffer(
- tif, TIFFComputeStrip(tif, offset_row, 0),
- (void**) &buf, bufsize,
- temp * scanline)==(tmsize_t)(-1)
- && (buf == NULL || img->stoponerr))
- {
- ret = 0;
- break;
- }
- p0 = buf;
- if( colorchannels == 1 )
- {
- p2 = p1 = p0;
- pa = (alpha?(p0+3*stripsize):NULL);
- }
- else
- {
- p1 = p0 + stripsize;
- p2 = p1 + stripsize;
- pa = (alpha?(p2+stripsize):NULL);
- }
- }
- else if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, 0),
- p0, temp * scanline)==(tmsize_t)(-1)
- && img->stoponerr)
- {
- ret = 0;
- break;
- }
- if (colorchannels > 1
- && TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, 1),
- p1, temp * scanline) == (tmsize_t)(-1)
- && img->stoponerr)
- {
- ret = 0;
- break;
- }
- if (colorchannels > 1
- && TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, 2),
- p2, temp * scanline) == (tmsize_t)(-1)
- && img->stoponerr)
- {
- ret = 0;
- break;
- }
- if (alpha)
- {
- if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, colorchannels),
- pa, temp * scanline)==(tmsize_t)(-1)
- && img->stoponerr)
- {
- ret = 0;
- break;
- }
- }
-
- pos = ((row + img->row_offset) % rowsperstrip) * scanline + \
- ((tmsize_t) img->col_offset * img->samplesperpixel);
- (*put)(img, raster+y*w, 0, y, w, nrow, fromskew, toskew, p0 + pos, p1 + pos,
- p2 + pos, (alpha?(pa+pos):NULL));
- y += ((flip & FLIP_VERTICALLY) ? -(int32) nrow : (int32) nrow);
- }
-
- if (flip & FLIP_HORIZONTALLY) {
- uint32 line;
-
- for (line = 0; line < h; line++) {
- uint32 *left = raster + (line * w);
- uint32 *right = left + w - 1;
-
- while ( left < right ) {
- uint32 temp = *left;
- *left = *right;
- *right = temp;
- left++;
- right--;
- }
- }
- }
-
- _TIFFfree(buf);
- return (ret);
+ pos = ((row + img->row_offset) % rowsperstrip) * scanline +
+ ((tmsize_t)img->col_offset * img->samplesperpixel);
+ tmsize_t roffset = (tmsize_t)y * w;
+ (*put)(img, raster + roffset, 0, y, w, nrow, fromskew, toskew, p0 + pos,
+ p1 + pos, p2 + pos, (alpha ? (pa + pos) : NULL));
+ y += ((flip & FLIP_VERTICALLY) ? -(int32_t)nrow : (int32_t)nrow);
+ }
+
+ if (flip & FLIP_HORIZONTALLY)
+ {
+ uint32_t line;
+
+ for (line = 0; line < h; line++)
+ {
+ uint32_t *left = raster + (line * w);
+ uint32_t *right = left + w - 1;
+
+ while (left < right)
+ {
+ uint32_t temp = *left;
+ *left = *right;
+ *right = temp;
+ left++;
+ right--;
+ }
+ }
+ }
+
+ _TIFFfreeExt(img->tif, buf);
+ return (ret);
}
/*
@@ -1164,98 +1331,139 @@ gtStripSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
* PickSeparateCase analyze the parameters and select
* the appropriate "get" and "put" routine to use.
*/
-#define REPEAT8(op) REPEAT4(op); REPEAT4(op)
-#define REPEAT4(op) REPEAT2(op); REPEAT2(op)
-#define REPEAT2(op) op; op
-#define CASE8(x,op) \
- switch (x) { \
- case 7: op; /*-fallthrough*/ \
- case 6: op; /*-fallthrough*/ \
- case 5: op; /*-fallthrough*/ \
- case 4: op; /*-fallthrough*/ \
- case 3: op; /*-fallthrough*/ \
- case 2: op; /*-fallthrough*/ \
- case 1: op; \
- }
-#define CASE4(x,op) switch (x) { case 3: op; /*-fallthrough*/ case 2: op; /*-fallthrough*/ case 1: op; }
-#define NOP
-
-#define UNROLL8(w, op1, op2) { \
- uint32 _x; \
- for (_x = w; _x >= 8; _x -= 8) { \
- op1; \
- REPEAT8(op2); \
- } \
- if (_x > 0) { \
- op1; \
- CASE8(_x,op2); \
- } \
-}
-#define UNROLL4(w, op1, op2) { \
- uint32 _x; \
- for (_x = w; _x >= 4; _x -= 4) { \
- op1; \
- REPEAT4(op2); \
- } \
- if (_x > 0) { \
- op1; \
- CASE4(_x,op2); \
- } \
-}
-#define UNROLL2(w, op1, op2) { \
- uint32 _x; \
- for (_x = w; _x >= 2; _x -= 2) { \
- op1; \
- REPEAT2(op2); \
- } \
- if (_x) { \
- op1; \
- op2; \
- } \
-}
-
-#define SKEW(r,g,b,skew) { r += skew; g += skew; b += skew; }
-#define SKEW4(r,g,b,a,skew) { r += skew; g += skew; b += skew; a+= skew; }
-
-#define A1 (((uint32)0xffL)<<24)
-#define PACK(r,g,b) \
- ((uint32)(r)|((uint32)(g)<<8)|((uint32)(b)<<16)|A1)
-#define PACK4(r,g,b,a) \
- ((uint32)(r)|((uint32)(g)<<8)|((uint32)(b)<<16)|((uint32)(a)<<24))
-#define W2B(v) (((v)>>8)&0xff)
+#define REPEAT8(op) \
+ REPEAT4(op); \
+ REPEAT4(op)
+#define REPEAT4(op) \
+ REPEAT2(op); \
+ REPEAT2(op)
+#define REPEAT2(op) \
+ op; \
+ op
+#define CASE8(x, op) \
+ switch (x) \
+ { \
+ case 7: \
+ op; /*-fallthrough*/ \
+ case 6: \
+ op; /*-fallthrough*/ \
+ case 5: \
+ op; /*-fallthrough*/ \
+ case 4: \
+ op; /*-fallthrough*/ \
+ case 3: \
+ op; /*-fallthrough*/ \
+ case 2: \
+ op; /*-fallthrough*/ \
+ case 1: \
+ op; \
+ }
+#define CASE4(x, op) \
+ switch (x) \
+ { \
+ case 3: \
+ op; /*-fallthrough*/ \
+ case 2: \
+ op; /*-fallthrough*/ \
+ case 1: \
+ op; \
+ }
+#define NOP
+
+#define UNROLL8(w, op1, op2) \
+ { \
+ uint32_t _x; \
+ for (_x = w; _x >= 8; _x -= 8) \
+ { \
+ op1; \
+ REPEAT8(op2); \
+ } \
+ if (_x > 0) \
+ { \
+ op1; \
+ CASE8(_x, op2); \
+ } \
+ }
+#define UNROLL4(w, op1, op2) \
+ { \
+ uint32_t _x; \
+ for (_x = w; _x >= 4; _x -= 4) \
+ { \
+ op1; \
+ REPEAT4(op2); \
+ } \
+ if (_x > 0) \
+ { \
+ op1; \
+ CASE4(_x, op2); \
+ } \
+ }
+#define UNROLL2(w, op1, op2) \
+ { \
+ uint32_t _x; \
+ for (_x = w; _x >= 2; _x -= 2) \
+ { \
+ op1; \
+ REPEAT2(op2); \
+ } \
+ if (_x) \
+ { \
+ op1; \
+ op2; \
+ } \
+ }
+
+#define SKEW(r, g, b, skew) \
+ { \
+ r += skew; \
+ g += skew; \
+ b += skew; \
+ }
+#define SKEW4(r, g, b, a, skew) \
+ { \
+ r += skew; \
+ g += skew; \
+ b += skew; \
+ a += skew; \
+ }
+
+#define A1 (((uint32_t)0xffL) << 24)
+#define PACK(r, g, b) \
+ ((uint32_t)(r) | ((uint32_t)(g) << 8) | ((uint32_t)(b) << 16) | A1)
+#define PACK4(r, g, b, a) \
+ ((uint32_t)(r) | ((uint32_t)(g) << 8) | ((uint32_t)(b) << 16) | \
+ ((uint32_t)(a) << 24))
+#define W2B(v) (((v) >> 8) & 0xff)
/* TODO: PACKW should have be made redundant in favor of Bitdepth16To8 LUT */
-#define PACKW(r,g,b) \
- ((uint32)W2B(r)|((uint32)W2B(g)<<8)|((uint32)W2B(b)<<16)|A1)
-#define PACKW4(r,g,b,a) \
- ((uint32)W2B(r)|((uint32)W2B(g)<<8)|((uint32)W2B(b)<<16)|((uint32)W2B(a)<<24))
-
-#define DECLAREContigPutFunc(name) \
-static void name(\
- TIFFRGBAImage* img, \
- uint32* cp, \
- uint32 x, uint32 y, \
- uint32 w, uint32 h, \
- int32 fromskew, int32 toskew, \
- unsigned char* pp \
-)
+#define PACKW(r, g, b) \
+ ((uint32_t)W2B(r) | ((uint32_t)W2B(g) << 8) | ((uint32_t)W2B(b) << 16) | A1)
+#define PACKW4(r, g, b, a) \
+ ((uint32_t)W2B(r) | ((uint32_t)W2B(g) << 8) | ((uint32_t)W2B(b) << 16) | \
+ ((uint32_t)W2B(a) << 24))
+
+#define DECLAREContigPutFunc(name) \
+ static void name(TIFFRGBAImage *img, uint32_t *cp, uint32_t x, uint32_t y, \
+ uint32_t w, uint32_t h, int32_t fromskew, int32_t toskew, \
+ unsigned char *pp)
/*
* 8-bit palette => colormap/RGB
*/
DECLAREContigPutFunc(put8bitcmaptile)
{
- uint32** PALmap = img->PALmap;
+ uint32_t **PALmap = img->PALmap;
int samplesperpixel = img->samplesperpixel;
- (void) y;
- for( ; h > 0; --h) {
- for (x = w; x > 0; --x)
+ (void)y;
+ for (; h > 0; --h)
+ {
+ for (x = w; x > 0; --x)
{
- *cp++ = PALmap[*pp][0];
+ *cp++ = PALmap[*pp][0];
pp += samplesperpixel;
}
- cp += toskew;
- pp += fromskew;
+ cp += toskew;
+ pp += fromskew;
}
}
@@ -1264,15 +1472,17 @@ DECLAREContigPutFunc(put8bitcmaptile)
*/
DECLAREContigPutFunc(put4bitcmaptile)
{
- uint32** PALmap = img->PALmap;
+ uint32_t **PALmap = img->PALmap;
- (void) x; (void) y;
+ (void)x;
+ (void)y;
fromskew /= 2;
- for( ; h > 0; --h) {
- uint32* bw;
- UNROLL2(w, bw = PALmap[*pp++], *cp++ = *bw++);
- cp += toskew;
- pp += fromskew;
+ for (; h > 0; --h)
+ {
+ uint32_t *bw;
+ UNROLL2(w, bw = PALmap[*pp++], *cp++ = *bw++);
+ cp += toskew;
+ pp += fromskew;
}
}
@@ -1281,15 +1491,17 @@ DECLAREContigPutFunc(put4bitcmaptile)
*/
DECLAREContigPutFunc(put2bitcmaptile)
{
- uint32** PALmap = img->PALmap;
+ uint32_t **PALmap = img->PALmap;
- (void) x; (void) y;
+ (void)x;
+ (void)y;
fromskew /= 4;
- for( ; h > 0; --h) {
- uint32* bw;
- UNROLL4(w, bw = PALmap[*pp++], *cp++ = *bw++);
- cp += toskew;
- pp += fromskew;
+ for (; h > 0; --h)
+ {
+ uint32_t *bw;
+ UNROLL4(w, bw = PALmap[*pp++], *cp++ = *bw++);
+ cp += toskew;
+ pp += fromskew;
}
}
@@ -1298,15 +1510,17 @@ DECLAREContigPutFunc(put2bitcmaptile)
*/
DECLAREContigPutFunc(put1bitcmaptile)
{
- uint32** PALmap = img->PALmap;
+ uint32_t **PALmap = img->PALmap;
- (void) x; (void) y;
+ (void)x;
+ (void)y;
fromskew /= 8;
- for( ; h > 0; --h) {
- uint32* bw;
- UNROLL8(w, bw = PALmap[*pp++], *cp++ = *bw++);
- cp += toskew;
- pp += fromskew;
+ for (; h > 0; --h)
+ {
+ uint32_t *bw;
+ UNROLL8(w, bw = PALmap[*pp++], *cp++ = *bw++);
+ cp += toskew;
+ pp += fromskew;
}
}
@@ -1316,17 +1530,18 @@ DECLAREContigPutFunc(put1bitcmaptile)
DECLAREContigPutFunc(putgreytile)
{
int samplesperpixel = img->samplesperpixel;
- uint32** BWmap = img->BWmap;
+ uint32_t **BWmap = img->BWmap;
- (void) y;
- for( ; h > 0; --h) {
- for (x = w; x > 0; --x)
+ (void)y;
+ for (; h > 0; --h)
+ {
+ for (x = w; x > 0; --x)
{
- *cp++ = BWmap[*pp][0];
+ *cp++ = BWmap[*pp][0];
pp += samplesperpixel;
}
- cp += toskew;
- pp += fromskew;
+ cp += toskew;
+ pp += fromskew;
}
}
@@ -1336,17 +1551,18 @@ DECLAREContigPutFunc(putgreytile)
DECLAREContigPutFunc(putagreytile)
{
int samplesperpixel = img->samplesperpixel;
- uint32** BWmap = img->BWmap;
+ uint32_t **BWmap = img->BWmap;
- (void) y;
- for( ; h > 0; --h) {
- for (x = w; x > 0; --x)
+ (void)y;
+ for (; h > 0; --h)
+ {
+ for (x = w; x > 0; --x)
{
- *cp++ = BWmap[*pp][0] & ((uint32)*(pp+1) << 24 | ~A1);
+ *cp++ = BWmap[*pp][0] & ((uint32_t) * (pp + 1) << 24 | ~A1);
pp += samplesperpixel;
}
- cp += toskew;
- pp += fromskew;
+ cp += toskew;
+ pp += fromskew;
}
}
@@ -1356,22 +1572,23 @@ DECLAREContigPutFunc(putagreytile)
DECLAREContigPutFunc(put16bitbwtile)
{
int samplesperpixel = img->samplesperpixel;
- uint32** BWmap = img->BWmap;
+ uint32_t **BWmap = img->BWmap;
- (void) y;
- for( ; h > 0; --h) {
- uint16 *wp = (uint16 *) pp;
+ (void)y;
+ for (; h > 0; --h)
+ {
+ uint16_t *wp = (uint16_t *)pp;
- for (x = w; x > 0; --x)
+ for (x = w; x > 0; --x)
{
/* use high order byte of 16bit value */
- *cp++ = BWmap[*wp >> 8][0];
+ *cp++ = BWmap[*wp >> 8][0];
pp += 2 * samplesperpixel;
wp += samplesperpixel;
}
- cp += toskew;
- pp += fromskew;
+ cp += toskew;
+ pp += fromskew;
}
}
@@ -1380,15 +1597,17 @@ DECLAREContigPutFunc(put16bitbwtile)
*/
DECLAREContigPutFunc(put1bitbwtile)
{
- uint32** BWmap = img->BWmap;
+ uint32_t **BWmap = img->BWmap;
- (void) x; (void) y;
+ (void)x;
+ (void)y;
fromskew /= 8;
- for( ; h > 0; --h) {
- uint32* bw;
- UNROLL8(w, bw = BWmap[*pp++], *cp++ = *bw++);
- cp += toskew;
- pp += fromskew;
+ for (; h > 0; --h)
+ {
+ uint32_t *bw;
+ UNROLL8(w, bw = BWmap[*pp++], *cp++ = *bw++);
+ cp += toskew;
+ pp += fromskew;
}
}
@@ -1397,15 +1616,17 @@ DECLAREContigPutFunc(put1bitbwtile)
*/
DECLAREContigPutFunc(put2bitbwtile)
{
- uint32** BWmap = img->BWmap;
+ uint32_t **BWmap = img->BWmap;
- (void) x; (void) y;
+ (void)x;
+ (void)y;
fromskew /= 4;
- for( ; h > 0; --h) {
- uint32* bw;
- UNROLL4(w, bw = BWmap[*pp++], *cp++ = *bw++);
- cp += toskew;
- pp += fromskew;
+ for (; h > 0; --h)
+ {
+ uint32_t *bw;
+ UNROLL4(w, bw = BWmap[*pp++], *cp++ = *bw++);
+ cp += toskew;
+ pp += fromskew;
}
}
@@ -1414,15 +1635,17 @@ DECLAREContigPutFunc(put2bitbwtile)
*/
DECLAREContigPutFunc(put4bitbwtile)
{
- uint32** BWmap = img->BWmap;
+ uint32_t **BWmap = img->BWmap;
- (void) x; (void) y;
+ (void)x;
+ (void)y;
fromskew /= 2;
- for( ; h > 0; --h) {
- uint32* bw;
- UNROLL2(w, bw = BWmap[*pp++], *cp++ = *bw++);
- cp += toskew;
- pp += fromskew;
+ for (; h > 0; --h)
+ {
+ uint32_t *bw;
+ UNROLL2(w, bw = BWmap[*pp++], *cp++ = *bw++);
+ cp += toskew;
+ pp += fromskew;
}
}
@@ -1433,14 +1656,15 @@ DECLAREContigPutFunc(putRGBcontig8bittile)
{
int samplesperpixel = img->samplesperpixel;
- (void) x; (void) y;
+ (void)x;
+ (void)y;
fromskew *= samplesperpixel;
- for( ; h > 0; --h) {
- UNROLL8(w, NOP,
- *cp++ = PACK(pp[0], pp[1], pp[2]);
- pp += samplesperpixel);
- cp += toskew;
- pp += fromskew;
+ for (; h > 0; --h)
+ {
+ UNROLL8(w, NOP, *cp++ = PACK(pp[0], pp[1], pp[2]);
+ pp += samplesperpixel);
+ cp += toskew;
+ pp += fromskew;
}
}
@@ -1452,14 +1676,15 @@ DECLAREContigPutFunc(putRGBAAcontig8bittile)
{
int samplesperpixel = img->samplesperpixel;
- (void) x; (void) y;
+ (void)x;
+ (void)y;
fromskew *= samplesperpixel;
- for( ; h > 0; --h) {
- UNROLL8(w, NOP,
- *cp++ = PACK4(pp[0], pp[1], pp[2], pp[3]);
- pp += samplesperpixel);
- cp += toskew;
- pp += fromskew;
+ for (; h > 0; --h)
+ {
+ UNROLL8(w, NOP, *cp++ = PACK4(pp[0], pp[1], pp[2], pp[3]);
+ pp += samplesperpixel);
+ cp += toskew;
+ pp += fromskew;
}
}
@@ -1469,24 +1694,26 @@ DECLAREContigPutFunc(putRGBAAcontig8bittile)
*/
DECLAREContigPutFunc(putRGBUAcontig8bittile)
{
- int samplesperpixel = img->samplesperpixel;
- (void) y;
- fromskew *= samplesperpixel;
- for( ; h > 0; --h) {
- uint32 r, g, b, a;
- uint8* m;
- for (x = w; x > 0; --x) {
- a = pp[3];
- m = img->UaToAa+((size_t) a<<8);
- r = m[pp[0]];
- g = m[pp[1]];
- b = m[pp[2]];
- *cp++ = PACK4(r,g,b,a);
- pp += samplesperpixel;
- }
- cp += toskew;
- pp += fromskew;
- }
+ int samplesperpixel = img->samplesperpixel;
+ (void)y;
+ fromskew *= samplesperpixel;
+ for (; h > 0; --h)
+ {
+ uint32_t r, g, b, a;
+ uint8_t *m;
+ for (x = w; x > 0; --x)
+ {
+ a = pp[3];
+ m = img->UaToAa + ((size_t)a << 8);
+ r = m[pp[0]];
+ g = m[pp[1]];
+ b = m[pp[2]];
+ *cp++ = PACK4(r, g, b, a);
+ pp += samplesperpixel;
+ }
+ cp += toskew;
+ pp += fromskew;
+ }
}
/*
@@ -1494,20 +1721,21 @@ DECLAREContigPutFunc(putRGBUAcontig8bittile)
*/
DECLAREContigPutFunc(putRGBcontig16bittile)
{
- int samplesperpixel = img->samplesperpixel;
- uint16 *wp = (uint16 *)pp;
- (void) y;
- fromskew *= samplesperpixel;
- for( ; h > 0; --h) {
- for (x = w; x > 0; --x) {
- *cp++ = PACK(img->Bitdepth16To8[wp[0]],
- img->Bitdepth16To8[wp[1]],
- img->Bitdepth16To8[wp[2]]);
- wp += samplesperpixel;
- }
- cp += toskew;
- wp += fromskew;
- }
+ int samplesperpixel = img->samplesperpixel;
+ uint16_t *wp = (uint16_t *)pp;
+ (void)y;
+ fromskew *= samplesperpixel;
+ for (; h > 0; --h)
+ {
+ for (x = w; x > 0; --x)
+ {
+ *cp++ = PACK(img->Bitdepth16To8[wp[0]], img->Bitdepth16To8[wp[1]],
+ img->Bitdepth16To8[wp[2]]);
+ wp += samplesperpixel;
+ }
+ cp += toskew;
+ wp += fromskew;
+ }
}
/*
@@ -1516,21 +1744,21 @@ DECLAREContigPutFunc(putRGBcontig16bittile)
*/
DECLAREContigPutFunc(putRGBAAcontig16bittile)
{
- int samplesperpixel = img->samplesperpixel;
- uint16 *wp = (uint16 *)pp;
- (void) y;
- fromskew *= samplesperpixel;
- for( ; h > 0; --h) {
- for (x = w; x > 0; --x) {
- *cp++ = PACK4(img->Bitdepth16To8[wp[0]],
- img->Bitdepth16To8[wp[1]],
- img->Bitdepth16To8[wp[2]],
- img->Bitdepth16To8[wp[3]]);
- wp += samplesperpixel;
- }
- cp += toskew;
- wp += fromskew;
- }
+ int samplesperpixel = img->samplesperpixel;
+ uint16_t *wp = (uint16_t *)pp;
+ (void)y;
+ fromskew *= samplesperpixel;
+ for (; h > 0; --h)
+ {
+ for (x = w; x > 0; --x)
+ {
+ *cp++ = PACK4(img->Bitdepth16To8[wp[0]], img->Bitdepth16To8[wp[1]],
+ img->Bitdepth16To8[wp[2]], img->Bitdepth16To8[wp[3]]);
+ wp += samplesperpixel;
+ }
+ cp += toskew;
+ wp += fromskew;
+ }
}
/*
@@ -1539,25 +1767,27 @@ DECLAREContigPutFunc(putRGBAAcontig16bittile)
*/
DECLAREContigPutFunc(putRGBUAcontig16bittile)
{
- int samplesperpixel = img->samplesperpixel;
- uint16 *wp = (uint16 *)pp;
- (void) y;
- fromskew *= samplesperpixel;
- for( ; h > 0; --h) {
- uint32 r,g,b,a;
- uint8* m;
- for (x = w; x > 0; --x) {
- a = img->Bitdepth16To8[wp[3]];
- m = img->UaToAa+((size_t) a<<8);
- r = m[img->Bitdepth16To8[wp[0]]];
- g = m[img->Bitdepth16To8[wp[1]]];
- b = m[img->Bitdepth16To8[wp[2]]];
- *cp++ = PACK4(r,g,b,a);
- wp += samplesperpixel;
- }
- cp += toskew;
- wp += fromskew;
- }
+ int samplesperpixel = img->samplesperpixel;
+ uint16_t *wp = (uint16_t *)pp;
+ (void)y;
+ fromskew *= samplesperpixel;
+ for (; h > 0; --h)
+ {
+ uint32_t r, g, b, a;
+ uint8_t *m;
+ for (x = w; x > 0; --x)
+ {
+ a = img->Bitdepth16To8[wp[3]];
+ m = img->UaToAa + ((size_t)a << 8);
+ r = m[img->Bitdepth16To8[wp[0]]];
+ g = m[img->Bitdepth16To8[wp[1]]];
+ b = m[img->Bitdepth16To8[wp[2]]];
+ *cp++ = PACK4(r, g, b, a);
+ wp += samplesperpixel;
+ }
+ cp += toskew;
+ wp += fromskew;
+ }
}
/*
@@ -1568,20 +1798,18 @@ DECLAREContigPutFunc(putRGBUAcontig16bittile)
DECLAREContigPutFunc(putRGBcontig8bitCMYKtile)
{
int samplesperpixel = img->samplesperpixel;
- uint16 r, g, b, k;
+ uint16_t r, g, b, k;
- (void) x; (void) y;
+ (void)x;
+ (void)y;
fromskew *= samplesperpixel;
- for( ; h > 0; --h) {
- UNROLL8(w, NOP,
- k = 255 - pp[3];
- r = (k*(255-pp[0]))/255;
- g = (k*(255-pp[1]))/255;
- b = (k*(255-pp[2]))/255;
- *cp++ = PACK(r, g, b);
- pp += samplesperpixel);
- cp += toskew;
- pp += fromskew;
+ for (; h > 0; --h)
+ {
+ UNROLL8(w, NOP, k = 255 - pp[3]; r = (k * (255 - pp[0])) / 255;
+ g = (k * (255 - pp[1])) / 255; b = (k * (255 - pp[2])) / 255;
+ *cp++ = PACK(r, g, b); pp += samplesperpixel);
+ cp += toskew;
+ pp += fromskew;
}
}
@@ -1593,45 +1821,47 @@ DECLAREContigPutFunc(putRGBcontig8bitCMYKtile)
DECLAREContigPutFunc(putRGBcontig8bitCMYKMaptile)
{
int samplesperpixel = img->samplesperpixel;
- TIFFRGBValue* Map = img->Map;
- uint16 r, g, b, k;
+ TIFFRGBValue *Map = img->Map;
+ uint16_t r, g, b, k;
- (void) y;
+ (void)y;
fromskew *= samplesperpixel;
- for( ; h > 0; --h) {
- for (x = w; x > 0; --x) {
- k = 255 - pp[3];
- r = (k*(255-pp[0]))/255;
- g = (k*(255-pp[1]))/255;
- b = (k*(255-pp[2]))/255;
- *cp++ = PACK(Map[r], Map[g], Map[b]);
- pp += samplesperpixel;
- }
- pp += fromskew;
- cp += toskew;
- }
-}
-
-#define DECLARESepPutFunc(name) \
-static void name(\
- TIFFRGBAImage* img,\
- uint32* cp,\
- uint32 x, uint32 y, \
- uint32 w, uint32 h,\
- int32 fromskew, int32 toskew,\
- unsigned char* r, unsigned char* g, unsigned char* b, unsigned char* a\
-)
+ for (; h > 0; --h)
+ {
+ for (x = w; x > 0; --x)
+ {
+ k = 255 - pp[3];
+ r = (k * (255 - pp[0])) / 255;
+ g = (k * (255 - pp[1])) / 255;
+ b = (k * (255 - pp[2])) / 255;
+ *cp++ = PACK(Map[r], Map[g], Map[b]);
+ pp += samplesperpixel;
+ }
+ pp += fromskew;
+ cp += toskew;
+ }
+}
+
+#define DECLARESepPutFunc(name) \
+ static void name(TIFFRGBAImage *img, uint32_t *cp, uint32_t x, uint32_t y, \
+ uint32_t w, uint32_t h, int32_t fromskew, int32_t toskew, \
+ unsigned char *r, unsigned char *g, unsigned char *b, \
+ unsigned char *a)
/*
* 8-bit unpacked samples => RGB
*/
DECLARESepPutFunc(putRGBseparate8bittile)
{
- (void) img; (void) x; (void) y; (void) a;
- for( ; h > 0; --h) {
- UNROLL8(w, NOP, *cp++ = PACK(*r++, *g++, *b++));
- SKEW(r, g, b, fromskew);
- cp += toskew;
+ (void)img;
+ (void)x;
+ (void)y;
+ (void)a;
+ for (; h > 0; --h)
+ {
+ UNROLL8(w, NOP, *cp++ = PACK(*r++, *g++, *b++));
+ SKEW(r, g, b, fromskew);
+ cp += toskew;
}
}
@@ -1640,12 +1870,15 @@ DECLARESepPutFunc(putRGBseparate8bittile)
*/
DECLARESepPutFunc(putRGBAAseparate8bittile)
{
- (void) img; (void) x; (void) y;
- for( ; h > 0; --h) {
- UNROLL8(w, NOP, *cp++ = PACK4(*r++, *g++, *b++, *a++));
- SKEW4(r, g, b, a, fromskew);
- cp += toskew;
- }
+ (void)img;
+ (void)x;
+ (void)y;
+ for (; h > 0; --h)
+ {
+ UNROLL8(w, NOP, *cp++ = PACK4(*r++, *g++, *b++, *a++));
+ SKEW4(r, g, b, a, fromskew);
+ cp += toskew;
+ }
}
/*
@@ -1653,19 +1886,22 @@ DECLARESepPutFunc(putRGBAAseparate8bittile)
*/
DECLARESepPutFunc(putCMYKseparate8bittile)
{
- (void) img; (void) y;
- for( ; h > 0; --h) {
- uint32 rv, gv, bv, kv;
- for (x = w; x > 0; --x) {
- kv = 255 - *a++;
- rv = (kv*(255-*r++))/255;
- gv = (kv*(255-*g++))/255;
- bv = (kv*(255-*b++))/255;
- *cp++ = PACK4(rv,gv,bv,255);
- }
- SKEW4(r, g, b, a, fromskew);
- cp += toskew;
- }
+ (void)img;
+ (void)y;
+ for (; h > 0; --h)
+ {
+ uint32_t rv, gv, bv, kv;
+ for (x = w; x > 0; --x)
+ {
+ kv = 255 - *a++;
+ rv = (kv * (255 - *r++)) / 255;
+ gv = (kv * (255 - *g++)) / 255;
+ bv = (kv * (255 - *b++)) / 255;
+ *cp++ = PACK4(rv, gv, bv, 255);
+ }
+ SKEW4(r, g, b, a, fromskew);
+ cp += toskew;
+ }
}
/*
@@ -1673,21 +1909,24 @@ DECLARESepPutFunc(putCMYKseparate8bittile)
*/
DECLARESepPutFunc(putRGBUAseparate8bittile)
{
- (void) img; (void) y;
- for( ; h > 0; --h) {
- uint32 rv, gv, bv, av;
- uint8* m;
- for (x = w; x > 0; --x) {
- av = *a++;
- m = img->UaToAa+((size_t) av<<8);
- rv = m[*r++];
- gv = m[*g++];
- bv = m[*b++];
- *cp++ = PACK4(rv,gv,bv,av);
- }
- SKEW4(r, g, b, a, fromskew);
- cp += toskew;
- }
+ (void)img;
+ (void)y;
+ for (; h > 0; --h)
+ {
+ uint32_t rv, gv, bv, av;
+ uint8_t *m;
+ for (x = w; x > 0; --x)
+ {
+ av = *a++;
+ m = img->UaToAa + ((size_t)av << 8);
+ rv = m[*r++];
+ gv = m[*g++];
+ bv = m[*b++];
+ *cp++ = PACK4(rv, gv, bv, av);
+ }
+ SKEW4(r, g, b, a, fromskew);
+ cp += toskew;
+ }
}
/*
@@ -1695,18 +1934,20 @@ DECLARESepPutFunc(putRGBUAseparate8bittile)
*/
DECLARESepPutFunc(putRGBseparate16bittile)
{
- uint16 *wr = (uint16*) r;
- uint16 *wg = (uint16*) g;
- uint16 *wb = (uint16*) b;
- (void) img; (void) y; (void) a;
- for( ; h > 0; --h) {
- for (x = 0; x < w; x++)
- *cp++ = PACK(img->Bitdepth16To8[*wr++],
- img->Bitdepth16To8[*wg++],
- img->Bitdepth16To8[*wb++]);
- SKEW(wr, wg, wb, fromskew);
- cp += toskew;
- }
+ uint16_t *wr = (uint16_t *)r;
+ uint16_t *wg = (uint16_t *)g;
+ uint16_t *wb = (uint16_t *)b;
+ (void)img;
+ (void)y;
+ (void)a;
+ for (; h > 0; --h)
+ {
+ for (x = 0; x < w; x++)
+ *cp++ = PACK(img->Bitdepth16To8[*wr++], img->Bitdepth16To8[*wg++],
+ img->Bitdepth16To8[*wb++]);
+ SKEW(wr, wg, wb, fromskew);
+ cp += toskew;
+ }
}
/*
@@ -1714,20 +1955,20 @@ DECLARESepPutFunc(putRGBseparate16bittile)
*/
DECLARESepPutFunc(putRGBAAseparate16bittile)
{
- uint16 *wr = (uint16*) r;
- uint16 *wg = (uint16*) g;
- uint16 *wb = (uint16*) b;
- uint16 *wa = (uint16*) a;
- (void) img; (void) y;
- for( ; h > 0; --h) {
- for (x = 0; x < w; x++)
- *cp++ = PACK4(img->Bitdepth16To8[*wr++],
- img->Bitdepth16To8[*wg++],
- img->Bitdepth16To8[*wb++],
- img->Bitdepth16To8[*wa++]);
- SKEW4(wr, wg, wb, wa, fromskew);
- cp += toskew;
- }
+ uint16_t *wr = (uint16_t *)r;
+ uint16_t *wg = (uint16_t *)g;
+ uint16_t *wb = (uint16_t *)b;
+ uint16_t *wa = (uint16_t *)a;
+ (void)img;
+ (void)y;
+ for (; h > 0; --h)
+ {
+ for (x = 0; x < w; x++)
+ *cp++ = PACK4(img->Bitdepth16To8[*wr++], img->Bitdepth16To8[*wg++],
+ img->Bitdepth16To8[*wb++], img->Bitdepth16To8[*wa++]);
+ SKEW4(wr, wg, wb, wa, fromskew);
+ cp += toskew;
+ }
}
/*
@@ -1735,168 +1976,123 @@ DECLARESepPutFunc(putRGBAAseparate16bittile)
*/
DECLARESepPutFunc(putRGBUAseparate16bittile)
{
- uint16 *wr = (uint16*) r;
- uint16 *wg = (uint16*) g;
- uint16 *wb = (uint16*) b;
- uint16 *wa = (uint16*) a;
- (void) img; (void) y;
- for( ; h > 0; --h) {
- uint32 r2,g2,b2,a2;
- uint8* m;
- for (x = w; x > 0; --x) {
- a2 = img->Bitdepth16To8[*wa++];
- m = img->UaToAa+((size_t) a2<<8);
- r2 = m[img->Bitdepth16To8[*wr++]];
- g2 = m[img->Bitdepth16To8[*wg++]];
- b2 = m[img->Bitdepth16To8[*wb++]];
- *cp++ = PACK4(r2,g2,b2,a2);
- }
- SKEW4(wr, wg, wb, wa, fromskew);
- cp += toskew;
- }
+ uint16_t *wr = (uint16_t *)r;
+ uint16_t *wg = (uint16_t *)g;
+ uint16_t *wb = (uint16_t *)b;
+ uint16_t *wa = (uint16_t *)a;
+ (void)img;
+ (void)y;
+ for (; h > 0; --h)
+ {
+ uint32_t r2, g2, b2, a2;
+ uint8_t *m;
+ for (x = w; x > 0; --x)
+ {
+ a2 = img->Bitdepth16To8[*wa++];
+ m = img->UaToAa + ((size_t)a2 << 8);
+ r2 = m[img->Bitdepth16To8[*wr++]];
+ g2 = m[img->Bitdepth16To8[*wg++]];
+ b2 = m[img->Bitdepth16To8[*wb++]];
+ *cp++ = PACK4(r2, g2, b2, a2);
+ }
+ SKEW4(wr, wg, wb, wa, fromskew);
+ cp += toskew;
+ }
}
/*
* 8-bit packed CIE L*a*b 1976 samples => RGB
*/
-DECLAREContigPutFunc(putcontig8bitCIELab)
-{
- float X, Y, Z;
- uint32 r, g, b;
- (void) y;
- fromskew *= 3;
- for( ; h > 0; --h) {
- for (x = w; x > 0; --x) {
- TIFFCIELabToXYZ(img->cielab,
- (unsigned char)pp[0],
- (signed char)pp[1],
- (signed char)pp[2],
- &X, &Y, &Z);
- TIFFXYZToRGB(img->cielab, X, Y, Z, &r, &g, &b);
- *cp++ = PACK(r, g, b);
- pp += 3;
- }
- cp += toskew;
- pp += fromskew;
- }
+DECLAREContigPutFunc(putcontig8bitCIELab8)
+{
+ float X, Y, Z;
+ uint32_t r, g, b;
+ (void)y;
+ fromskew *= 3;
+ for (; h > 0; --h)
+ {
+ for (x = w; x > 0; --x)
+ {
+ TIFFCIELabToXYZ(img->cielab, (unsigned char)pp[0],
+ (signed char)pp[1], (signed char)pp[2], &X, &Y, &Z);
+ TIFFXYZToRGB(img->cielab, X, Y, Z, &r, &g, &b);
+ *cp++ = PACK(r, g, b);
+ pp += 3;
+ }
+ cp += toskew;
+ pp += fromskew;
+ }
}
/*
- * YCbCr -> RGB conversion and packing routines.
+ * 16-bit packed CIE L*a*b 1976 samples => RGB
*/
-
-#define YCbCrtoRGB(dst, Y) { \
- uint32 r, g, b; \
- TIFFYCbCrtoRGB(img->ycbcr, (Y), Cb, Cr, &r, &g, &b); \
- dst = PACK(r, g, b); \
+DECLAREContigPutFunc(putcontig8bitCIELab16)
+{
+ float X, Y, Z;
+ uint32_t r, g, b;
+ uint16_t *wp = (uint16_t *)pp;
+ (void)y;
+ fromskew *= 3;
+ for (; h > 0; --h)
+ {
+ for (x = w; x > 0; --x)
+ {
+ TIFFCIELab16ToXYZ(img->cielab, (uint16_t)wp[0], (int16_t)wp[1],
+ (int16_t)wp[2], &X, &Y, &Z);
+ TIFFXYZToRGB(img->cielab, X, Y, Z, &r, &g, &b);
+ *cp++ = PACK(r, g, b);
+ wp += 3;
+ }
+ cp += toskew;
+ wp += fromskew;
+ }
}
/*
- * 8-bit packed YCbCr samples => RGB
- * This function is generic for different sampling sizes,
- * and can handle blocks sizes that aren't multiples of the
- * sampling size. However, it is substantially less optimized
- * than the specific sampling cases. It is used as a fallback
- * for difficult blocks.
+ * YCbCr -> RGB conversion and packing routines.
*/
-#ifdef notdef
-static void putcontig8bitYCbCrGenericTile(
- TIFFRGBAImage* img,
- uint32* cp,
- uint32 x, uint32 y,
- uint32 w, uint32 h,
- int32 fromskew, int32 toskew,
- unsigned char* pp,
- int h_group,
- int v_group )
-
-{
- uint32* cp1 = cp+w+toskew;
- uint32* cp2 = cp1+w+toskew;
- uint32* cp3 = cp2+w+toskew;
- int32 incr = 3*w+4*toskew;
- int32 Cb, Cr;
- int group_size = v_group * h_group + 2;
-
- (void) y;
- fromskew = (fromskew * group_size) / h_group;
-
- for( yy = 0; yy < h; yy++ )
- {
- unsigned char *pp_line;
- int y_line_group = yy / v_group;
- int y_remainder = yy - y_line_group * v_group;
-
- pp_line = pp + v_line_group *
-
-
- for( xx = 0; xx < w; xx++ )
- {
- Cb = pp
- }
- }
- for (; h >= 4; h -= 4) {
- x = w>>2;
- do {
- Cb = pp[16];
- Cr = pp[17];
-
- YCbCrtoRGB(cp [0], pp[ 0]);
- YCbCrtoRGB(cp [1], pp[ 1]);
- YCbCrtoRGB(cp [2], pp[ 2]);
- YCbCrtoRGB(cp [3], pp[ 3]);
- YCbCrtoRGB(cp1[0], pp[ 4]);
- YCbCrtoRGB(cp1[1], pp[ 5]);
- YCbCrtoRGB(cp1[2], pp[ 6]);
- YCbCrtoRGB(cp1[3], pp[ 7]);
- YCbCrtoRGB(cp2[0], pp[ 8]);
- YCbCrtoRGB(cp2[1], pp[ 9]);
- YCbCrtoRGB(cp2[2], pp[10]);
- YCbCrtoRGB(cp2[3], pp[11]);
- YCbCrtoRGB(cp3[0], pp[12]);
- YCbCrtoRGB(cp3[1], pp[13]);
- YCbCrtoRGB(cp3[2], pp[14]);
- YCbCrtoRGB(cp3[3], pp[15]);
-
- cp += 4, cp1 += 4, cp2 += 4, cp3 += 4;
- pp += 18;
- } while (--x);
- cp += incr, cp1 += incr, cp2 += incr, cp3 += incr;
- pp += fromskew;
+
+#define YCbCrtoRGB(dst, Y) \
+ { \
+ uint32_t r, g, b; \
+ TIFFYCbCrtoRGB(img->ycbcr, (Y), Cb, Cr, &r, &g, &b); \
+ dst = PACK(r, g, b); \
}
-}
-#endif
/*
* 8-bit packed YCbCr samples w/ 4,4 subsampling => RGB
*/
DECLAREContigPutFunc(putcontig8bitYCbCr44tile)
{
- uint32* cp1 = cp+w+toskew;
- uint32* cp2 = cp1+w+toskew;
- uint32* cp3 = cp2+w+toskew;
- int32 incr = 3*w+4*toskew;
+ uint32_t *cp1 = cp + w + toskew;
+ uint32_t *cp2 = cp1 + w + toskew;
+ uint32_t *cp3 = cp2 + w + toskew;
+ int32_t incr = 3 * w + 4 * toskew;
- (void) y;
+ (void)y;
/* adjust fromskew */
- fromskew = (fromskew / 4) * (4*2+2);
- if ((h & 3) == 0 && (w & 3) == 0) {
- for (; h >= 4; h -= 4) {
- x = w>>2;
- do {
- int32 Cb = pp[16];
- int32 Cr = pp[17];
-
- YCbCrtoRGB(cp [0], pp[ 0]);
- YCbCrtoRGB(cp [1], pp[ 1]);
- YCbCrtoRGB(cp [2], pp[ 2]);
- YCbCrtoRGB(cp [3], pp[ 3]);
- YCbCrtoRGB(cp1[0], pp[ 4]);
- YCbCrtoRGB(cp1[1], pp[ 5]);
- YCbCrtoRGB(cp1[2], pp[ 6]);
- YCbCrtoRGB(cp1[3], pp[ 7]);
- YCbCrtoRGB(cp2[0], pp[ 8]);
- YCbCrtoRGB(cp2[1], pp[ 9]);
+ fromskew = (fromskew / 4) * (4 * 2 + 2);
+ if ((h & 3) == 0 && (w & 3) == 0)
+ {
+ for (; h >= 4; h -= 4)
+ {
+ x = w >> 2;
+ do
+ {
+ int32_t Cb = pp[16];
+ int32_t Cr = pp[17];
+
+ YCbCrtoRGB(cp[0], pp[0]);
+ YCbCrtoRGB(cp[1], pp[1]);
+ YCbCrtoRGB(cp[2], pp[2]);
+ YCbCrtoRGB(cp[3], pp[3]);
+ YCbCrtoRGB(cp1[0], pp[4]);
+ YCbCrtoRGB(cp1[1], pp[5]);
+ YCbCrtoRGB(cp1[2], pp[6]);
+ YCbCrtoRGB(cp1[3], pp[7]);
+ YCbCrtoRGB(cp2[0], pp[8]);
+ YCbCrtoRGB(cp2[1], pp[9]);
YCbCrtoRGB(cp2[2], pp[10]);
YCbCrtoRGB(cp2[3], pp[11]);
YCbCrtoRGB(cp3[0], pp[12]);
@@ -1916,47 +2112,80 @@ DECLAREContigPutFunc(putcontig8bitYCbCr44tile)
cp3 += incr;
pp += fromskew;
}
- } else {
- while (h > 0) {
- for (x = w; x > 0;) {
- int32 Cb = pp[16];
- int32 Cr = pp[17];
- switch (x) {
- default:
- switch (h) {
- default: YCbCrtoRGB(cp3[3], pp[15]); /* FALLTHROUGH */
- case 3: YCbCrtoRGB(cp2[3], pp[11]); /* FALLTHROUGH */
- case 2: YCbCrtoRGB(cp1[3], pp[ 7]); /* FALLTHROUGH */
- case 1: YCbCrtoRGB(cp [3], pp[ 3]); /* FALLTHROUGH */
- } /* FALLTHROUGH */
- case 3:
- switch (h) {
- default: YCbCrtoRGB(cp3[2], pp[14]); /* FALLTHROUGH */
- case 3: YCbCrtoRGB(cp2[2], pp[10]); /* FALLTHROUGH */
- case 2: YCbCrtoRGB(cp1[2], pp[ 6]); /* FALLTHROUGH */
- case 1: YCbCrtoRGB(cp [2], pp[ 2]); /* FALLTHROUGH */
- } /* FALLTHROUGH */
- case 2:
- switch (h) {
- default: YCbCrtoRGB(cp3[1], pp[13]); /* FALLTHROUGH */
- case 3: YCbCrtoRGB(cp2[1], pp[ 9]); /* FALLTHROUGH */
- case 2: YCbCrtoRGB(cp1[1], pp[ 5]); /* FALLTHROUGH */
- case 1: YCbCrtoRGB(cp [1], pp[ 1]); /* FALLTHROUGH */
- } /* FALLTHROUGH */
- case 1:
- switch (h) {
- default: YCbCrtoRGB(cp3[0], pp[12]); /* FALLTHROUGH */
- case 3: YCbCrtoRGB(cp2[0], pp[ 8]); /* FALLTHROUGH */
- case 2: YCbCrtoRGB(cp1[0], pp[ 4]); /* FALLTHROUGH */
- case 1: YCbCrtoRGB(cp [0], pp[ 0]); /* FALLTHROUGH */
- } /* FALLTHROUGH */
+ }
+ else
+ {
+ while (h > 0)
+ {
+ for (x = w; x > 0;)
+ {
+ int32_t Cb = pp[16];
+ int32_t Cr = pp[17];
+ switch (x)
+ {
+ default:
+ switch (h)
+ {
+ default:
+ YCbCrtoRGB(cp3[3], pp[15]); /* FALLTHROUGH */
+ case 3:
+ YCbCrtoRGB(cp2[3], pp[11]); /* FALLTHROUGH */
+ case 2:
+ YCbCrtoRGB(cp1[3], pp[7]); /* FALLTHROUGH */
+ case 1:
+ YCbCrtoRGB(cp[3], pp[3]); /* FALLTHROUGH */
+ } /* FALLTHROUGH */
+ case 3:
+ switch (h)
+ {
+ default:
+ YCbCrtoRGB(cp3[2], pp[14]); /* FALLTHROUGH */
+ case 3:
+ YCbCrtoRGB(cp2[2], pp[10]); /* FALLTHROUGH */
+ case 2:
+ YCbCrtoRGB(cp1[2], pp[6]); /* FALLTHROUGH */
+ case 1:
+ YCbCrtoRGB(cp[2], pp[2]); /* FALLTHROUGH */
+ } /* FALLTHROUGH */
+ case 2:
+ switch (h)
+ {
+ default:
+ YCbCrtoRGB(cp3[1], pp[13]); /* FALLTHROUGH */
+ case 3:
+ YCbCrtoRGB(cp2[1], pp[9]); /* FALLTHROUGH */
+ case 2:
+ YCbCrtoRGB(cp1[1], pp[5]); /* FALLTHROUGH */
+ case 1:
+ YCbCrtoRGB(cp[1], pp[1]); /* FALLTHROUGH */
+ } /* FALLTHROUGH */
+ case 1:
+ switch (h)
+ {
+ default:
+ YCbCrtoRGB(cp3[0], pp[12]); /* FALLTHROUGH */
+ case 3:
+ YCbCrtoRGB(cp2[0], pp[8]); /* FALLTHROUGH */
+ case 2:
+ YCbCrtoRGB(cp1[0], pp[4]); /* FALLTHROUGH */
+ case 1:
+ YCbCrtoRGB(cp[0], pp[0]); /* FALLTHROUGH */
+ } /* FALLTHROUGH */
}
- if (x < 4) {
- cp += x; cp1 += x; cp2 += x; cp3 += x;
+ if (x < 4)
+ {
+ cp += x;
+ cp1 += x;
+ cp2 += x;
+ cp3 += x;
x = 0;
}
- else {
- cp += 4; cp1 += 4; cp2 += 4; cp3 += 4;
+ else
+ {
+ cp += 4;
+ cp1 += 4;
+ cp2 += 4;
+ cp3 += 4;
x -= 4;
}
pp += 18;
@@ -1978,27 +2207,30 @@ DECLAREContigPutFunc(putcontig8bitYCbCr44tile)
*/
DECLAREContigPutFunc(putcontig8bitYCbCr42tile)
{
- uint32* cp1 = cp+w+toskew;
- int32 incr = 2*toskew+w;
-
- (void) y;
- fromskew = (fromskew / 4) * (4*2+2);
- if ((w & 3) == 0 && (h & 1) == 0) {
- for (; h >= 2; h -= 2) {
- x = w>>2;
- do {
- int32 Cb = pp[8];
- int32 Cr = pp[9];
-
- YCbCrtoRGB(cp [0], pp[0]);
- YCbCrtoRGB(cp [1], pp[1]);
- YCbCrtoRGB(cp [2], pp[2]);
- YCbCrtoRGB(cp [3], pp[3]);
+ uint32_t *cp1 = cp + w + toskew;
+ int32_t incr = 2 * toskew + w;
+
+ (void)y;
+ fromskew = (fromskew / 4) * (4 * 2 + 2);
+ if ((w & 3) == 0 && (h & 1) == 0)
+ {
+ for (; h >= 2; h -= 2)
+ {
+ x = w >> 2;
+ do
+ {
+ int32_t Cb = pp[8];
+ int32_t Cr = pp[9];
+
+ YCbCrtoRGB(cp[0], pp[0]);
+ YCbCrtoRGB(cp[1], pp[1]);
+ YCbCrtoRGB(cp[2], pp[2]);
+ YCbCrtoRGB(cp[3], pp[3]);
YCbCrtoRGB(cp1[0], pp[4]);
YCbCrtoRGB(cp1[1], pp[5]);
YCbCrtoRGB(cp1[2], pp[6]);
YCbCrtoRGB(cp1[3], pp[7]);
-
+
cp += 4;
cp1 += 4;
pp += 10;
@@ -2007,39 +2239,60 @@ DECLAREContigPutFunc(putcontig8bitYCbCr42tile)
cp1 += incr;
pp += fromskew;
}
- } else {
- while (h > 0) {
- for (x = w; x > 0;) {
- int32 Cb = pp[8];
- int32 Cr = pp[9];
- switch (x) {
- default:
- switch (h) {
- default: YCbCrtoRGB(cp1[3], pp[ 7]); /* FALLTHROUGH */
- case 1: YCbCrtoRGB(cp [3], pp[ 3]); /* FALLTHROUGH */
- } /* FALLTHROUGH */
- case 3:
- switch (h) {
- default: YCbCrtoRGB(cp1[2], pp[ 6]); /* FALLTHROUGH */
- case 1: YCbCrtoRGB(cp [2], pp[ 2]); /* FALLTHROUGH */
- } /* FALLTHROUGH */
- case 2:
- switch (h) {
- default: YCbCrtoRGB(cp1[1], pp[ 5]); /* FALLTHROUGH */
- case 1: YCbCrtoRGB(cp [1], pp[ 1]); /* FALLTHROUGH */
- } /* FALLTHROUGH */
- case 1:
- switch (h) {
- default: YCbCrtoRGB(cp1[0], pp[ 4]); /* FALLTHROUGH */
- case 1: YCbCrtoRGB(cp [0], pp[ 0]); /* FALLTHROUGH */
- } /* FALLTHROUGH */
+ }
+ else
+ {
+ while (h > 0)
+ {
+ for (x = w; x > 0;)
+ {
+ int32_t Cb = pp[8];
+ int32_t Cr = pp[9];
+ switch (x)
+ {
+ default:
+ switch (h)
+ {
+ default:
+ YCbCrtoRGB(cp1[3], pp[7]); /* FALLTHROUGH */
+ case 1:
+ YCbCrtoRGB(cp[3], pp[3]); /* FALLTHROUGH */
+ } /* FALLTHROUGH */
+ case 3:
+ switch (h)
+ {
+ default:
+ YCbCrtoRGB(cp1[2], pp[6]); /* FALLTHROUGH */
+ case 1:
+ YCbCrtoRGB(cp[2], pp[2]); /* FALLTHROUGH */
+ } /* FALLTHROUGH */
+ case 2:
+ switch (h)
+ {
+ default:
+ YCbCrtoRGB(cp1[1], pp[5]); /* FALLTHROUGH */
+ case 1:
+ YCbCrtoRGB(cp[1], pp[1]); /* FALLTHROUGH */
+ } /* FALLTHROUGH */
+ case 1:
+ switch (h)
+ {
+ default:
+ YCbCrtoRGB(cp1[0], pp[4]); /* FALLTHROUGH */
+ case 1:
+ YCbCrtoRGB(cp[0], pp[0]); /* FALLTHROUGH */
+ } /* FALLTHROUGH */
}
- if (x < 4) {
- cp += x; cp1 += x;
+ if (x < 4)
+ {
+ cp += x;
+ cp1 += x;
x = 0;
}
- else {
- cp += 4; cp1 += 4;
+ else
+ {
+ cp += 4;
+ cp1 += 4;
x -= 4;
}
pp += 10;
@@ -2059,44 +2312,50 @@ DECLAREContigPutFunc(putcontig8bitYCbCr42tile)
*/
DECLAREContigPutFunc(putcontig8bitYCbCr41tile)
{
- (void) y;
- fromskew = (fromskew / 4) * (4*1+2);
- do {
- x = w>>2;
- while(x>0) {
- int32 Cb = pp[4];
- int32 Cr = pp[5];
-
- YCbCrtoRGB(cp [0], pp[0]);
- YCbCrtoRGB(cp [1], pp[1]);
- YCbCrtoRGB(cp [2], pp[2]);
- YCbCrtoRGB(cp [3], pp[3]);
-
- cp += 4;
- pp += 6;
- x--;
- }
-
- if( (w&3) != 0 )
+ (void)y;
+ fromskew = (fromskew / 4) * (4 * 1 + 2);
+ do
+ {
+ x = w >> 2;
+ while (x > 0)
+ {
+ int32_t Cb = pp[4];
+ int32_t Cr = pp[5];
+
+ YCbCrtoRGB(cp[0], pp[0]);
+ YCbCrtoRGB(cp[1], pp[1]);
+ YCbCrtoRGB(cp[2], pp[2]);
+ YCbCrtoRGB(cp[3], pp[3]);
+
+ cp += 4;
+ pp += 6;
+ x--;
+ }
+
+ if ((w & 3) != 0)
{
- int32 Cb = pp[4];
- int32 Cr = pp[5];
-
- switch( (w&3) ) {
- case 3: YCbCrtoRGB(cp [2], pp[2]); /*-fallthrough*/
- case 2: YCbCrtoRGB(cp [1], pp[1]); /*-fallthrough*/
- case 1: YCbCrtoRGB(cp [0], pp[0]); /*-fallthrough*/
- case 0: break;
+ int32_t Cb = pp[4];
+ int32_t Cr = pp[5];
+
+ switch ((w & 3))
+ {
+ case 3:
+ YCbCrtoRGB(cp[2], pp[2]); /*-fallthrough*/
+ case 2:
+ YCbCrtoRGB(cp[1], pp[1]); /*-fallthrough*/
+ case 1:
+ YCbCrtoRGB(cp[0], pp[0]); /*-fallthrough*/
+ case 0:
+ break;
}
- cp += (w&3);
+ cp += (w & 3);
pp += 6;
}
- cp += toskew;
- pp += fromskew;
+ cp += toskew;
+ pp += fromskew;
} while (--h);
-
}
/*
@@ -2104,57 +2363,63 @@ DECLAREContigPutFunc(putcontig8bitYCbCr41tile)
*/
DECLAREContigPutFunc(putcontig8bitYCbCr22tile)
{
- uint32* cp2;
- int32 incr = 2*toskew+w;
- (void) y;
- fromskew = (fromskew / 2) * (2*2+2);
- cp2 = cp+w+toskew;
- while (h>=2) {
- x = w;
- while (x>=2) {
- uint32 Cb = pp[4];
- uint32 Cr = pp[5];
- YCbCrtoRGB(cp[0], pp[0]);
- YCbCrtoRGB(cp[1], pp[1]);
- YCbCrtoRGB(cp2[0], pp[2]);
- YCbCrtoRGB(cp2[1], pp[3]);
- cp += 2;
- cp2 += 2;
- pp += 6;
- x -= 2;
- }
- if (x==1) {
- uint32 Cb = pp[4];
- uint32 Cr = pp[5];
- YCbCrtoRGB(cp[0], pp[0]);
- YCbCrtoRGB(cp2[0], pp[2]);
- cp ++ ;
- cp2 ++ ;
- pp += 6;
- }
- cp += incr;
- cp2 += incr;
- pp += fromskew;
- h-=2;
- }
- if (h==1) {
- x = w;
- while (x>=2) {
- uint32 Cb = pp[4];
- uint32 Cr = pp[5];
- YCbCrtoRGB(cp[0], pp[0]);
- YCbCrtoRGB(cp[1], pp[1]);
- cp += 2;
- cp2 += 2;
- pp += 6;
- x -= 2;
- }
- if (x==1) {
- uint32 Cb = pp[4];
- uint32 Cr = pp[5];
- YCbCrtoRGB(cp[0], pp[0]);
- }
- }
+ uint32_t *cp2;
+ int32_t incr = 2 * toskew + w;
+ (void)y;
+ fromskew = (fromskew / 2) * (2 * 2 + 2);
+ cp2 = cp + w + toskew;
+ while (h >= 2)
+ {
+ x = w;
+ while (x >= 2)
+ {
+ uint32_t Cb = pp[4];
+ uint32_t Cr = pp[5];
+ YCbCrtoRGB(cp[0], pp[0]);
+ YCbCrtoRGB(cp[1], pp[1]);
+ YCbCrtoRGB(cp2[0], pp[2]);
+ YCbCrtoRGB(cp2[1], pp[3]);
+ cp += 2;
+ cp2 += 2;
+ pp += 6;
+ x -= 2;
+ }
+ if (x == 1)
+ {
+ uint32_t Cb = pp[4];
+ uint32_t Cr = pp[5];
+ YCbCrtoRGB(cp[0], pp[0]);
+ YCbCrtoRGB(cp2[0], pp[2]);
+ cp++;
+ cp2++;
+ pp += 6;
+ }
+ cp += incr;
+ cp2 += incr;
+ pp += fromskew;
+ h -= 2;
+ }
+ if (h == 1)
+ {
+ x = w;
+ while (x >= 2)
+ {
+ uint32_t Cb = pp[4];
+ uint32_t Cr = pp[5];
+ YCbCrtoRGB(cp[0], pp[0]);
+ YCbCrtoRGB(cp[1], pp[1]);
+ cp += 2;
+ cp2 += 2;
+ pp += 6;
+ x -= 2;
+ }
+ if (x == 1)
+ {
+ uint32_t Cb = pp[4];
+ uint32_t Cr = pp[5];
+ YCbCrtoRGB(cp[0], pp[0]);
+ }
+ }
}
/*
@@ -2162,36 +2427,38 @@ DECLAREContigPutFunc(putcontig8bitYCbCr22tile)
*/
DECLAREContigPutFunc(putcontig8bitYCbCr21tile)
{
- (void) y;
- fromskew = (fromskew / 2) * (2*1+2);
- do {
- x = w>>1;
- while(x>0) {
- int32 Cb = pp[2];
- int32 Cr = pp[3];
+ (void)y;
+ fromskew = (fromskew / 2) * (2 * 1 + 2);
+ do
+ {
+ x = w >> 1;
+ while (x > 0)
+ {
+ int32_t Cb = pp[2];
+ int32_t Cr = pp[3];
- YCbCrtoRGB(cp[0], pp[0]);
- YCbCrtoRGB(cp[1], pp[1]);
+ YCbCrtoRGB(cp[0], pp[0]);
+ YCbCrtoRGB(cp[1], pp[1]);
- cp += 2;
- pp += 4;
- x --;
- }
+ cp += 2;
+ pp += 4;
+ x--;
+ }
- if( (w&1) != 0 )
- {
- int32 Cb = pp[2];
- int32 Cr = pp[3];
+ if ((w & 1) != 0)
+ {
+ int32_t Cb = pp[2];
+ int32_t Cr = pp[3];
- YCbCrtoRGB(cp[0], pp[0]);
+ YCbCrtoRGB(cp[0], pp[0]);
- cp += 1;
- pp += 4;
- }
+ cp += 1;
+ pp += 4;
+ }
- cp += toskew;
- pp += fromskew;
- } while (--h);
+ cp += toskew;
+ pp += fromskew;
+ } while (--h);
}
/*
@@ -2199,37 +2466,41 @@ DECLAREContigPutFunc(putcontig8bitYCbCr21tile)
*/
DECLAREContigPutFunc(putcontig8bitYCbCr12tile)
{
- uint32* cp2;
- int32 incr = 2*toskew+w;
- (void) y;
- fromskew = (fromskew / 1) * (1 * 2 + 2);
- cp2 = cp+w+toskew;
- while (h>=2) {
- x = w;
- do {
- uint32 Cb = pp[2];
- uint32 Cr = pp[3];
- YCbCrtoRGB(cp[0], pp[0]);
- YCbCrtoRGB(cp2[0], pp[1]);
- cp ++;
- cp2 ++;
- pp += 4;
- } while (--x);
- cp += incr;
- cp2 += incr;
- pp += fromskew;
- h-=2;
- }
- if (h==1) {
- x = w;
- do {
- uint32 Cb = pp[2];
- uint32 Cr = pp[3];
- YCbCrtoRGB(cp[0], pp[0]);
- cp ++;
- pp += 4;
- } while (--x);
- }
+ uint32_t *cp2;
+ int32_t incr = 2 * toskew + w;
+ (void)y;
+ fromskew = (fromskew / 1) * (1 * 2 + 2);
+ cp2 = cp + w + toskew;
+ while (h >= 2)
+ {
+ x = w;
+ do
+ {
+ uint32_t Cb = pp[2];
+ uint32_t Cr = pp[3];
+ YCbCrtoRGB(cp[0], pp[0]);
+ YCbCrtoRGB(cp2[0], pp[1]);
+ cp++;
+ cp2++;
+ pp += 4;
+ } while (--x);
+ cp += incr;
+ cp2 += incr;
+ pp += fromskew;
+ h -= 2;
+ }
+ if (h == 1)
+ {
+ x = w;
+ do
+ {
+ uint32_t Cb = pp[2];
+ uint32_t Cr = pp[3];
+ YCbCrtoRGB(cp[0], pp[0]);
+ cp++;
+ pp += 4;
+ } while (--x);
+ }
}
/*
@@ -2237,21 +2508,23 @@ DECLAREContigPutFunc(putcontig8bitYCbCr12tile)
*/
DECLAREContigPutFunc(putcontig8bitYCbCr11tile)
{
- (void) y;
- fromskew = (fromskew / 1) * (1 * 1 + 2);
- do {
- x = w; /* was x = w>>1; patched 2000/09/25 warmerda@home.com */
- do {
- int32 Cb = pp[1];
- int32 Cr = pp[2];
+ (void)y;
+ fromskew = (fromskew / 1) * (1 * 1 + 2);
+ do
+ {
+ x = w; /* was x = w>>1; patched 2000/09/25 warmerda@home.com */
+ do
+ {
+ int32_t Cb = pp[1];
+ int32_t Cr = pp[2];
- YCbCrtoRGB(*cp++, pp[0]);
+ YCbCrtoRGB(*cp++, pp[0]);
- pp += 3;
- } while (--x);
- cp += toskew;
- pp += fromskew;
- } while (--h);
+ pp += 3;
+ } while (--x);
+ cp += toskew;
+ pp += fromskew;
+ } while (--h);
}
/*
@@ -2259,19 +2532,22 @@ DECLAREContigPutFunc(putcontig8bitYCbCr11tile)
*/
DECLARESepPutFunc(putseparate8bitYCbCr11tile)
{
- (void) y;
- (void) a;
- /* TODO: naming of input vars is still off, change obfuscating declaration inside define, or resolve obfuscation */
- for( ; h > 0; --h) {
- x = w;
- do {
- uint32 dr, dg, db;
- TIFFYCbCrtoRGB(img->ycbcr,*r++,*g++,*b++,&dr,&dg,&db);
- *cp++ = PACK(dr,dg,db);
- } while (--x);
- SKEW(r, g, b, fromskew);
- cp += toskew;
- }
+ (void)y;
+ (void)a;
+ /* TODO: naming of input vars is still off, change obfuscating declaration
+ * inside define, or resolve obfuscation */
+ for (; h > 0; --h)
+ {
+ x = w;
+ do
+ {
+ uint32_t dr, dg, db;
+ TIFFYCbCrtoRGB(img->ycbcr, *r++, *g++, *b++, &dr, &dg, &db);
+ *cp++ = PACK(dr, dg, db);
+ } while (--x);
+ SKEW(r, g, b, fromskew);
+ cp += toskew;
+ }
}
#undef YCbCrtoRGB
@@ -2280,97 +2556,100 @@ static int isInRefBlackWhiteRange(float f)
return f > (float)(-0x7FFFFFFF + 128) && f < (float)0x7FFFFFFF;
}
-static int
-initYCbCrConversion(TIFFRGBAImage* img)
-{
- static const char module[] = "initYCbCrConversion";
-
- float *luma, *refBlackWhite;
-
- if (img->ycbcr == NULL) {
- img->ycbcr = (TIFFYCbCrToRGB*) _TIFFmalloc(
- TIFFroundup_32(sizeof (TIFFYCbCrToRGB), sizeof (long))
- + 4*256*sizeof (TIFFRGBValue)
- + 2*256*sizeof (int)
- + 3*256*sizeof (int32)
- );
- if (img->ycbcr == NULL) {
- TIFFErrorExt(img->tif->tif_clientdata, module,
- "No space for YCbCr->RGB conversion state");
- return (0);
- }
- }
-
- TIFFGetFieldDefaulted(img->tif, TIFFTAG_YCBCRCOEFFICIENTS, &luma);
- TIFFGetFieldDefaulted(img->tif, TIFFTAG_REFERENCEBLACKWHITE,
- &refBlackWhite);
-
- /* Do some validation to avoid later issues. Detect NaN for now */
- /* and also if lumaGreen is zero since we divide by it later */
- if( luma[0] != luma[0] ||
- luma[1] != luma[1] ||
- luma[1] == 0.0 ||
- luma[2] != luma[2] )
- {
- TIFFErrorExt(img->tif->tif_clientdata, module,
- "Invalid values for YCbCrCoefficients tag");
- return (0);
- }
+static int initYCbCrConversion(TIFFRGBAImage *img)
+{
+ static const char module[] = "initYCbCrConversion";
+
+ float *luma, *refBlackWhite;
- if( !isInRefBlackWhiteRange(refBlackWhite[0]) ||
- !isInRefBlackWhiteRange(refBlackWhite[1]) ||
- !isInRefBlackWhiteRange(refBlackWhite[2]) ||
- !isInRefBlackWhiteRange(refBlackWhite[3]) ||
- !isInRefBlackWhiteRange(refBlackWhite[4]) ||
- !isInRefBlackWhiteRange(refBlackWhite[5]) )
+ if (img->ycbcr == NULL)
+ {
+ img->ycbcr = (TIFFYCbCrToRGB *)_TIFFmallocExt(
+ img->tif, TIFFroundup_32(sizeof(TIFFYCbCrToRGB), sizeof(long)) +
+ 4 * 256 * sizeof(TIFFRGBValue) +
+ 2 * 256 * sizeof(int) + 3 * 256 * sizeof(int32_t));
+ if (img->ycbcr == NULL)
{
- TIFFErrorExt(img->tif->tif_clientdata, module,
- "Invalid values for ReferenceBlackWhite tag");
+ TIFFErrorExtR(img->tif, module,
+ "No space for YCbCr->RGB conversion state");
return (0);
}
+ }
+
+ TIFFGetFieldDefaulted(img->tif, TIFFTAG_YCBCRCOEFFICIENTS, &luma);
+ TIFFGetFieldDefaulted(img->tif, TIFFTAG_REFERENCEBLACKWHITE,
+ &refBlackWhite);
+
+ /* Do some validation to avoid later issues. Detect NaN for now */
+ /* and also if lumaGreen is zero since we divide by it later */
+ if (luma[0] != luma[0] || luma[1] != luma[1] || luma[1] == 0.0 ||
+ luma[2] != luma[2])
+ {
+ TIFFErrorExtR(img->tif, module,
+ "Invalid values for YCbCrCoefficients tag");
+ return (0);
+ }
+
+ if (!isInRefBlackWhiteRange(refBlackWhite[0]) ||
+ !isInRefBlackWhiteRange(refBlackWhite[1]) ||
+ !isInRefBlackWhiteRange(refBlackWhite[2]) ||
+ !isInRefBlackWhiteRange(refBlackWhite[3]) ||
+ !isInRefBlackWhiteRange(refBlackWhite[4]) ||
+ !isInRefBlackWhiteRange(refBlackWhite[5]))
+ {
+ TIFFErrorExtR(img->tif, module,
+ "Invalid values for ReferenceBlackWhite tag");
+ return (0);
+ }
- if (TIFFYCbCrToRGBInit(img->ycbcr, luma, refBlackWhite) < 0)
- return(0);
- return (1);
+ if (TIFFYCbCrToRGBInit(img->ycbcr, luma, refBlackWhite) < 0)
+ return (0);
+ return (1);
}
-static tileContigRoutine
-initCIELabConversion(TIFFRGBAImage* img)
+static tileContigRoutine initCIELabConversion(TIFFRGBAImage *img)
{
- static const char module[] = "initCIELabConversion";
+ static const char module[] = "initCIELabConversion";
+
+ float *whitePoint;
+ float refWhite[3];
- float *whitePoint;
- float refWhite[3];
+ TIFFGetFieldDefaulted(img->tif, TIFFTAG_WHITEPOINT, &whitePoint);
+ if (whitePoint[1] == 0.0f)
+ {
+ TIFFErrorExtR(img->tif, module, "Invalid value for WhitePoint tag.");
+ return NULL;
+ }
- TIFFGetFieldDefaulted(img->tif, TIFFTAG_WHITEPOINT, &whitePoint);
- if (whitePoint[1] == 0.0f ) {
- TIFFErrorExt(img->tif->tif_clientdata, module,
- "Invalid value for WhitePoint tag.");
- return NULL;
+ if (!img->cielab)
+ {
+ img->cielab = (TIFFCIELabToRGB *)_TIFFmallocExt(
+ img->tif, sizeof(TIFFCIELabToRGB));
+ if (!img->cielab)
+ {
+ TIFFErrorExtR(img->tif, module,
+ "No space for CIE L*a*b*->RGB conversion state.");
+ return NULL;
}
+ }
+
+ refWhite[1] = 100.0F;
+ refWhite[0] = whitePoint[0] / whitePoint[1] * refWhite[1];
+ refWhite[2] =
+ (1.0F - whitePoint[0] - whitePoint[1]) / whitePoint[1] * refWhite[1];
+ if (TIFFCIELabToRGBInit(img->cielab, &display_sRGB, refWhite) < 0)
+ {
+ TIFFErrorExtR(img->tif, module,
+ "Failed to initialize CIE L*a*b*->RGB conversion state.");
+ _TIFFfreeExt(img->tif, img->cielab);
+ return NULL;
+ }
- if (!img->cielab) {
- img->cielab = (TIFFCIELabToRGB *)
- _TIFFmalloc(sizeof(TIFFCIELabToRGB));
- if (!img->cielab) {
- TIFFErrorExt(img->tif->tif_clientdata, module,
- "No space for CIE L*a*b*->RGB conversion state.");
- return NULL;
- }
- }
-
- refWhite[1] = 100.0F;
- refWhite[0] = whitePoint[0] / whitePoint[1] * refWhite[1];
- refWhite[2] = (1.0F - whitePoint[0] - whitePoint[1])
- / whitePoint[1] * refWhite[1];
- if (TIFFCIELabToRGBInit(img->cielab, &display_sRGB, refWhite) < 0) {
- TIFFErrorExt(img->tif->tif_clientdata, module,
- "Failed to initialize CIE L*a*b*->RGB conversion state.");
- _TIFFfree(img->cielab);
- return NULL;
- }
-
- return putcontig8bitCIELab;
+ if (img->bitspersample == 8)
+ return putcontig8bitCIELab8;
+ else if (img->bitspersample == 16)
+ return putcontig8bitCIELab16;
+ return NULL;
}
/*
@@ -2380,56 +2659,62 @@ initCIELabConversion(TIFFRGBAImage* img)
* pixel values simply by indexing into the table with one
* number.
*/
-static int
-makebwmap(TIFFRGBAImage* img)
+static int makebwmap(TIFFRGBAImage *img)
{
- TIFFRGBValue* Map = img->Map;
+ TIFFRGBValue *Map = img->Map;
int bitspersample = img->bitspersample;
int nsamples = 8 / bitspersample;
int i;
- uint32* p;
+ uint32_t *p;
- if( nsamples == 0 )
+ if (nsamples == 0)
nsamples = 1;
- img->BWmap = (uint32**) _TIFFmalloc(
- 256*sizeof (uint32 *)+(256*nsamples*sizeof(uint32)));
- if (img->BWmap == NULL) {
- TIFFErrorExt(img->tif->tif_clientdata, TIFFFileName(img->tif), "No space for B&W mapping table");
- return (0);
- }
- p = (uint32*)(img->BWmap + 256);
- for (i = 0; i < 256; i++) {
- TIFFRGBValue c;
- img->BWmap[i] = p;
- switch (bitspersample) {
-#define GREY(x) c = Map[x]; *p++ = PACK(c,c,c);
- case 1:
- GREY(i>>7);
- GREY((i>>6)&1);
- GREY((i>>5)&1);
- GREY((i>>4)&1);
- GREY((i>>3)&1);
- GREY((i>>2)&1);
- GREY((i>>1)&1);
- GREY(i&1);
- break;
- case 2:
- GREY(i>>6);
- GREY((i>>4)&3);
- GREY((i>>2)&3);
- GREY(i&3);
- break;
- case 4:
- GREY(i>>4);
- GREY(i&0xf);
- break;
- case 8:
- case 16:
- GREY(i);
- break;
- }
-#undef GREY
+ img->BWmap = (uint32_t **)_TIFFmallocExt(
+ img->tif,
+ 256 * sizeof(uint32_t *) + (256 * nsamples * sizeof(uint32_t)));
+ if (img->BWmap == NULL)
+ {
+ TIFFErrorExtR(img->tif, TIFFFileName(img->tif),
+ "No space for B&W mapping table");
+ return (0);
+ }
+ p = (uint32_t *)(img->BWmap + 256);
+ for (i = 0; i < 256; i++)
+ {
+ TIFFRGBValue c;
+ img->BWmap[i] = p;
+ switch (bitspersample)
+ {
+#define GREY(x) \
+ c = Map[x]; \
+ *p++ = PACK(c, c, c);
+ case 1:
+ GREY(i >> 7);
+ GREY((i >> 6) & 1);
+ GREY((i >> 5) & 1);
+ GREY((i >> 4) & 1);
+ GREY((i >> 3) & 1);
+ GREY((i >> 2) & 1);
+ GREY((i >> 1) & 1);
+ GREY(i & 1);
+ break;
+ case 2:
+ GREY(i >> 6);
+ GREY((i >> 4) & 3);
+ GREY((i >> 2) & 3);
+ GREY(i & 3);
+ break;
+ case 4:
+ GREY(i >> 4);
+ GREY(i & 0xf);
+ break;
+ case 8:
+ case 16:
+ GREY(i);
+ break;
+ }
+#undef GREY
}
return (1);
}
@@ -2438,75 +2723,79 @@ makebwmap(TIFFRGBAImage* img)
* Construct a mapping table to convert from the range
* of the data samples to [0,255] --for display. This
* process also handles inverting B&W images when needed.
- */
-static int
-setupMap(TIFFRGBAImage* img)
+ */
+static int setupMap(TIFFRGBAImage *img)
{
- int32 x, range;
+ int32_t x, range;
+
+ range = (int32_t)((1L << img->bitspersample) - 1);
- range = (int32)((1L<<img->bitspersample)-1);
-
/* treat 16 bit the same as eight bit */
- if( img->bitspersample == 16 )
- range = (int32) 255;
-
- img->Map = (TIFFRGBValue*) _TIFFmalloc((range+1) * sizeof (TIFFRGBValue));
- if (img->Map == NULL) {
- TIFFErrorExt(img->tif->tif_clientdata, TIFFFileName(img->tif),
- "No space for photometric conversion table");
- return (0);
- }
- if (img->photometric == PHOTOMETRIC_MINISWHITE) {
- for (x = 0; x <= range; x++)
- img->Map[x] = (TIFFRGBValue) (((range - x) * 255) / range);
- } else {
- for (x = 0; x <= range; x++)
- img->Map[x] = (TIFFRGBValue) ((x * 255) / range);
+ if (img->bitspersample == 16)
+ range = (int32_t)255;
+
+ img->Map = (TIFFRGBValue *)_TIFFmallocExt(
+ img->tif, (range + 1) * sizeof(TIFFRGBValue));
+ if (img->Map == NULL)
+ {
+ TIFFErrorExtR(img->tif, TIFFFileName(img->tif),
+ "No space for photometric conversion table");
+ return (0);
+ }
+ if (img->photometric == PHOTOMETRIC_MINISWHITE)
+ {
+ for (x = 0; x <= range; x++)
+ img->Map[x] = (TIFFRGBValue)(((range - x) * 255) / range);
+ }
+ else
+ {
+ for (x = 0; x <= range; x++)
+ img->Map[x] = (TIFFRGBValue)((x * 255) / range);
}
if (img->bitspersample <= 16 &&
- (img->photometric == PHOTOMETRIC_MINISBLACK ||
- img->photometric == PHOTOMETRIC_MINISWHITE)) {
- /*
- * Use photometric mapping table to construct
- * unpacking tables for samples <= 8 bits.
- */
- if (!makebwmap(img))
- return (0);
- /* no longer need Map, free it */
- _TIFFfree(img->Map);
- img->Map = NULL;
+ (img->photometric == PHOTOMETRIC_MINISBLACK ||
+ img->photometric == PHOTOMETRIC_MINISWHITE))
+ {
+ /*
+ * Use photometric mapping table to construct
+ * unpacking tables for samples <= 8 bits.
+ */
+ if (!makebwmap(img))
+ return (0);
+ /* no longer need Map, free it */
+ _TIFFfreeExt(img->tif, img->Map);
+ img->Map = NULL;
}
return (1);
}
-static int
-checkcmap(TIFFRGBAImage* img)
+static int checkcmap(TIFFRGBAImage *img)
{
- uint16* r = img->redcmap;
- uint16* g = img->greencmap;
- uint16* b = img->bluecmap;
- long n = 1L<<img->bitspersample;
+ uint16_t *r = img->redcmap;
+ uint16_t *g = img->greencmap;
+ uint16_t *b = img->bluecmap;
+ long n = 1L << img->bitspersample;
while (n-- > 0)
- if (*r++ >= 256 || *g++ >= 256 || *b++ >= 256)
- return (16);
+ if (*r++ >= 256 || *g++ >= 256 || *b++ >= 256)
+ return (16);
return (8);
}
-static void
-cvtcmap(TIFFRGBAImage* img)
+static void cvtcmap(TIFFRGBAImage *img)
{
- uint16* r = img->redcmap;
- uint16* g = img->greencmap;
- uint16* b = img->bluecmap;
+ uint16_t *r = img->redcmap;
+ uint16_t *g = img->greencmap;
+ uint16_t *b = img->bluecmap;
long i;
- for (i = (1L<<img->bitspersample)-1; i >= 0; i--) {
-#define CVT(x) ((uint16)((x)>>8))
- r[i] = CVT(r[i]);
- g[i] = CVT(g[i]);
- b[i] = CVT(b[i]);
-#undef CVT
+ for (i = (1L << img->bitspersample) - 1; i >= 0; i--)
+ {
+#define CVT(x) ((uint16_t)((x) >> 8))
+ r[i] = CVT(r[i]);
+ g[i] = CVT(g[i]);
+ b[i] = CVT(b[i]);
+#undef CVT
}
}
@@ -2517,93 +2806,100 @@ cvtcmap(TIFFRGBAImage* img)
* pixel values simply by indexing into the table with one
* number.
*/
-static int
-makecmap(TIFFRGBAImage* img)
+static int makecmap(TIFFRGBAImage *img)
{
int bitspersample = img->bitspersample;
int nsamples = 8 / bitspersample;
- uint16* r = img->redcmap;
- uint16* g = img->greencmap;
- uint16* b = img->bluecmap;
- uint32 *p;
+ uint16_t *r = img->redcmap;
+ uint16_t *g = img->greencmap;
+ uint16_t *b = img->bluecmap;
+ uint32_t *p;
int i;
- img->PALmap = (uint32**) _TIFFmalloc(
- 256*sizeof (uint32 *)+(256*nsamples*sizeof(uint32)));
- if (img->PALmap == NULL) {
- TIFFErrorExt(img->tif->tif_clientdata, TIFFFileName(img->tif), "No space for Palette mapping table");
- return (0);
- }
- p = (uint32*)(img->PALmap + 256);
- for (i = 0; i < 256; i++) {
- TIFFRGBValue c;
- img->PALmap[i] = p;
-#define CMAP(x) c = (TIFFRGBValue) x; *p++ = PACK(r[c]&0xff, g[c]&0xff, b[c]&0xff);
- switch (bitspersample) {
- case 1:
- CMAP(i>>7);
- CMAP((i>>6)&1);
- CMAP((i>>5)&1);
- CMAP((i>>4)&1);
- CMAP((i>>3)&1);
- CMAP((i>>2)&1);
- CMAP((i>>1)&1);
- CMAP(i&1);
- break;
- case 2:
- CMAP(i>>6);
- CMAP((i>>4)&3);
- CMAP((i>>2)&3);
- CMAP(i&3);
- break;
- case 4:
- CMAP(i>>4);
- CMAP(i&0xf);
- break;
- case 8:
- CMAP(i);
- break;
- }
+ img->PALmap = (uint32_t **)_TIFFmallocExt(
+ img->tif,
+ 256 * sizeof(uint32_t *) + (256 * nsamples * sizeof(uint32_t)));
+ if (img->PALmap == NULL)
+ {
+ TIFFErrorExtR(img->tif, TIFFFileName(img->tif),
+ "No space for Palette mapping table");
+ return (0);
+ }
+ p = (uint32_t *)(img->PALmap + 256);
+ for (i = 0; i < 256; i++)
+ {
+ TIFFRGBValue c;
+ img->PALmap[i] = p;
+#define CMAP(x) \
+ c = (TIFFRGBValue)x; \
+ *p++ = PACK(r[c] & 0xff, g[c] & 0xff, b[c] & 0xff);
+ switch (bitspersample)
+ {
+ case 1:
+ CMAP(i >> 7);
+ CMAP((i >> 6) & 1);
+ CMAP((i >> 5) & 1);
+ CMAP((i >> 4) & 1);
+ CMAP((i >> 3) & 1);
+ CMAP((i >> 2) & 1);
+ CMAP((i >> 1) & 1);
+ CMAP(i & 1);
+ break;
+ case 2:
+ CMAP(i >> 6);
+ CMAP((i >> 4) & 3);
+ CMAP((i >> 2) & 3);
+ CMAP(i & 3);
+ break;
+ case 4:
+ CMAP(i >> 4);
+ CMAP(i & 0xf);
+ break;
+ case 8:
+ CMAP(i);
+ break;
+ }
#undef CMAP
}
return (1);
}
-/*
+/*
* Construct any mapping table used
* by the associated put routine.
*/
-static int
-buildMap(TIFFRGBAImage* img)
-{
- switch (img->photometric) {
- case PHOTOMETRIC_RGB:
- case PHOTOMETRIC_YCBCR:
- case PHOTOMETRIC_SEPARATED:
- if (img->bitspersample == 8)
- break;
- /* fall through... */
- case PHOTOMETRIC_MINISBLACK:
- case PHOTOMETRIC_MINISWHITE:
- if (!setupMap(img))
- return (0);
- break;
- case PHOTOMETRIC_PALETTE:
- /*
- * Convert 16-bit colormap to 8-bit (unless it looks
- * like an old-style 8-bit colormap).
- */
- if (checkcmap(img) == 16)
- cvtcmap(img);
- else
- TIFFWarningExt(img->tif->tif_clientdata, TIFFFileName(img->tif), "Assuming 8-bit colormap");
- /*
- * Use mapping table and colormap to construct
- * unpacking tables for samples < 8 bits.
- */
- if (img->bitspersample <= 8 && !makecmap(img))
- return (0);
- break;
+static int buildMap(TIFFRGBAImage *img)
+{
+ switch (img->photometric)
+ {
+ case PHOTOMETRIC_RGB:
+ case PHOTOMETRIC_YCBCR:
+ case PHOTOMETRIC_SEPARATED:
+ if (img->bitspersample == 8)
+ break;
+ /* fall through... */
+ case PHOTOMETRIC_MINISBLACK:
+ case PHOTOMETRIC_MINISWHITE:
+ if (!setupMap(img))
+ return (0);
+ break;
+ case PHOTOMETRIC_PALETTE:
+ /*
+ * Convert 16-bit colormap to 8-bit (unless it looks
+ * like an old-style 8-bit colormap).
+ */
+ if (checkcmap(img) == 16)
+ cvtcmap(img);
+ else
+ TIFFWarningExtR(img->tif, TIFFFileName(img->tif),
+ "Assuming 8-bit colormap");
+ /*
+ * Use mapping table and colormap to construct
+ * unpacking tables for samples < 8 bits.
+ */
+ if (img->bitspersample <= 8 && !makecmap(img))
+ return (0);
+ break;
}
return (1);
}
@@ -2611,153 +2907,162 @@ buildMap(TIFFRGBAImage* img)
/*
* Select the appropriate conversion routine for packed data.
*/
-static int
-PickContigCase(TIFFRGBAImage* img)
-{
- img->get = TIFFIsTiled(img->tif) ? gtTileContig : gtStripContig;
- img->put.contig = NULL;
- switch (img->photometric) {
- case PHOTOMETRIC_RGB:
- switch (img->bitspersample) {
- case 8:
- if (img->alpha == EXTRASAMPLE_ASSOCALPHA &&
- img->samplesperpixel >= 4)
- img->put.contig = putRGBAAcontig8bittile;
- else if (img->alpha == EXTRASAMPLE_UNASSALPHA &&
- img->samplesperpixel >= 4)
- {
- if (BuildMapUaToAa(img))
- img->put.contig = putRGBUAcontig8bittile;
- }
- else if( img->samplesperpixel >= 3 )
- img->put.contig = putRGBcontig8bittile;
- break;
- case 16:
- if (img->alpha == EXTRASAMPLE_ASSOCALPHA &&
- img->samplesperpixel >=4 )
- {
- if (BuildMapBitdepth16To8(img))
- img->put.contig = putRGBAAcontig16bittile;
- }
- else if (img->alpha == EXTRASAMPLE_UNASSALPHA &&
- img->samplesperpixel >=4 )
- {
- if (BuildMapBitdepth16To8(img) &&
- BuildMapUaToAa(img))
- img->put.contig = putRGBUAcontig16bittile;
- }
- else if( img->samplesperpixel >=3 )
- {
- if (BuildMapBitdepth16To8(img))
- img->put.contig = putRGBcontig16bittile;
- }
- break;
- }
- break;
- case PHOTOMETRIC_SEPARATED:
- if (img->samplesperpixel >=4 && buildMap(img)) {
- if (img->bitspersample == 8) {
- if (!img->Map)
- img->put.contig = putRGBcontig8bitCMYKtile;
- else
- img->put.contig = putRGBcontig8bitCMYKMaptile;
- }
- }
- break;
- case PHOTOMETRIC_PALETTE:
- if (buildMap(img)) {
- switch (img->bitspersample) {
- case 8:
- img->put.contig = put8bitcmaptile;
- break;
- case 4:
- img->put.contig = put4bitcmaptile;
- break;
- case 2:
- img->put.contig = put2bitcmaptile;
- break;
- case 1:
- img->put.contig = put1bitcmaptile;
- break;
- }
- }
- break;
- case PHOTOMETRIC_MINISWHITE:
- case PHOTOMETRIC_MINISBLACK:
- if (buildMap(img)) {
- switch (img->bitspersample) {
- case 16:
- img->put.contig = put16bitbwtile;
- break;
- case 8:
- if (img->alpha && img->samplesperpixel == 2)
- img->put.contig = putagreytile;
- else
- img->put.contig = putgreytile;
- break;
- case 4:
- img->put.contig = put4bitbwtile;
- break;
- case 2:
- img->put.contig = put2bitbwtile;
- break;
- case 1:
- img->put.contig = put1bitbwtile;
- break;
- }
- }
- break;
- case PHOTOMETRIC_YCBCR:
- if ((img->bitspersample==8) && (img->samplesperpixel==3))
- {
- if (initYCbCrConversion(img)!=0)
- {
- /*
- * The 6.0 spec says that subsampling must be
- * one of 1, 2, or 4, and that vertical subsampling
- * must always be <= horizontal subsampling; so
- * there are only a few possibilities and we just
- * enumerate the cases.
- * Joris: added support for the [1,2] case, nonetheless, to accommodate
- * some OJPEG files
- */
- uint16 SubsamplingHor;
- uint16 SubsamplingVer;
- TIFFGetFieldDefaulted(img->tif, TIFFTAG_YCBCRSUBSAMPLING, &SubsamplingHor, &SubsamplingVer);
- switch ((SubsamplingHor<<4)|SubsamplingVer) {
- case 0x44:
- img->put.contig = putcontig8bitYCbCr44tile;
- break;
- case 0x42:
- img->put.contig = putcontig8bitYCbCr42tile;
- break;
- case 0x41:
- img->put.contig = putcontig8bitYCbCr41tile;
- break;
- case 0x22:
- img->put.contig = putcontig8bitYCbCr22tile;
- break;
- case 0x21:
- img->put.contig = putcontig8bitYCbCr21tile;
- break;
- case 0x12:
- img->put.contig = putcontig8bitYCbCr12tile;
- break;
- case 0x11:
- img->put.contig = putcontig8bitYCbCr11tile;
- break;
- }
- }
- }
- break;
- case PHOTOMETRIC_CIELAB:
- if (img->samplesperpixel == 3 && buildMap(img)) {
- if (img->bitspersample == 8)
- img->put.contig = initCIELabConversion(img);
- break;
- }
- }
- return ((img->get!=NULL) && (img->put.contig!=NULL));
+static int PickContigCase(TIFFRGBAImage *img)
+{
+ img->get = TIFFIsTiled(img->tif) ? gtTileContig : gtStripContig;
+ img->put.contig = NULL;
+ switch (img->photometric)
+ {
+ case PHOTOMETRIC_RGB:
+ switch (img->bitspersample)
+ {
+ case 8:
+ if (img->alpha == EXTRASAMPLE_ASSOCALPHA &&
+ img->samplesperpixel >= 4)
+ img->put.contig = putRGBAAcontig8bittile;
+ else if (img->alpha == EXTRASAMPLE_UNASSALPHA &&
+ img->samplesperpixel >= 4)
+ {
+ if (BuildMapUaToAa(img))
+ img->put.contig = putRGBUAcontig8bittile;
+ }
+ else if (img->samplesperpixel >= 3)
+ img->put.contig = putRGBcontig8bittile;
+ break;
+ case 16:
+ if (img->alpha == EXTRASAMPLE_ASSOCALPHA &&
+ img->samplesperpixel >= 4)
+ {
+ if (BuildMapBitdepth16To8(img))
+ img->put.contig = putRGBAAcontig16bittile;
+ }
+ else if (img->alpha == EXTRASAMPLE_UNASSALPHA &&
+ img->samplesperpixel >= 4)
+ {
+ if (BuildMapBitdepth16To8(img) && BuildMapUaToAa(img))
+ img->put.contig = putRGBUAcontig16bittile;
+ }
+ else if (img->samplesperpixel >= 3)
+ {
+ if (BuildMapBitdepth16To8(img))
+ img->put.contig = putRGBcontig16bittile;
+ }
+ break;
+ }
+ break;
+ case PHOTOMETRIC_SEPARATED:
+ if (img->samplesperpixel >= 4 && buildMap(img))
+ {
+ if (img->bitspersample == 8)
+ {
+ if (!img->Map)
+ img->put.contig = putRGBcontig8bitCMYKtile;
+ else
+ img->put.contig = putRGBcontig8bitCMYKMaptile;
+ }
+ }
+ break;
+ case PHOTOMETRIC_PALETTE:
+ if (buildMap(img))
+ {
+ switch (img->bitspersample)
+ {
+ case 8:
+ img->put.contig = put8bitcmaptile;
+ break;
+ case 4:
+ img->put.contig = put4bitcmaptile;
+ break;
+ case 2:
+ img->put.contig = put2bitcmaptile;
+ break;
+ case 1:
+ img->put.contig = put1bitcmaptile;
+ break;
+ }
+ }
+ break;
+ case PHOTOMETRIC_MINISWHITE:
+ case PHOTOMETRIC_MINISBLACK:
+ if (buildMap(img))
+ {
+ switch (img->bitspersample)
+ {
+ case 16:
+ img->put.contig = put16bitbwtile;
+ break;
+ case 8:
+ if (img->alpha && img->samplesperpixel == 2)
+ img->put.contig = putagreytile;
+ else
+ img->put.contig = putgreytile;
+ break;
+ case 4:
+ img->put.contig = put4bitbwtile;
+ break;
+ case 2:
+ img->put.contig = put2bitbwtile;
+ break;
+ case 1:
+ img->put.contig = put1bitbwtile;
+ break;
+ }
+ }
+ break;
+ case PHOTOMETRIC_YCBCR:
+ if ((img->bitspersample == 8) && (img->samplesperpixel == 3))
+ {
+ if (initYCbCrConversion(img) != 0)
+ {
+ /*
+ * The 6.0 spec says that subsampling must be
+ * one of 1, 2, or 4, and that vertical subsampling
+ * must always be <= horizontal subsampling; so
+ * there are only a few possibilities and we just
+ * enumerate the cases.
+ * Joris: added support for the [1,2] case, nonetheless, to
+ * accommodate some OJPEG files
+ */
+ uint16_t SubsamplingHor;
+ uint16_t SubsamplingVer;
+ TIFFGetFieldDefaulted(img->tif, TIFFTAG_YCBCRSUBSAMPLING,
+ &SubsamplingHor, &SubsamplingVer);
+ switch ((SubsamplingHor << 4) | SubsamplingVer)
+ {
+ case 0x44:
+ img->put.contig = putcontig8bitYCbCr44tile;
+ break;
+ case 0x42:
+ img->put.contig = putcontig8bitYCbCr42tile;
+ break;
+ case 0x41:
+ img->put.contig = putcontig8bitYCbCr41tile;
+ break;
+ case 0x22:
+ img->put.contig = putcontig8bitYCbCr22tile;
+ break;
+ case 0x21:
+ img->put.contig = putcontig8bitYCbCr21tile;
+ break;
+ case 0x12:
+ img->put.contig = putcontig8bitYCbCr12tile;
+ break;
+ case 0x11:
+ img->put.contig = putcontig8bitYCbCr11tile;
+ break;
+ }
+ }
+ }
+ break;
+ case PHOTOMETRIC_CIELAB:
+ if (img->samplesperpixel == 3 && buildMap(img))
+ {
+ if (img->bitspersample == 8 || img->bitspersample == 16)
+ img->put.contig = initCIELabConversion(img);
+ break;
+ }
+ }
+ return ((img->get != NULL) && (img->put.contig != NULL));
}
/*
@@ -2766,116 +3071,117 @@ PickContigCase(TIFFRGBAImage* img)
* NB: we assume that unpacked single channel data is directed
* to the "packed routines.
*/
-static int
-PickSeparateCase(TIFFRGBAImage* img)
-{
- img->get = TIFFIsTiled(img->tif) ? gtTileSeparate : gtStripSeparate;
- img->put.separate = NULL;
- switch (img->photometric) {
- case PHOTOMETRIC_MINISWHITE:
- case PHOTOMETRIC_MINISBLACK:
- /* greyscale images processed pretty much as RGB by gtTileSeparate */
- case PHOTOMETRIC_RGB:
- switch (img->bitspersample) {
- case 8:
- if (img->alpha == EXTRASAMPLE_ASSOCALPHA)
- img->put.separate = putRGBAAseparate8bittile;
- else if (img->alpha == EXTRASAMPLE_UNASSALPHA)
- {
- if (BuildMapUaToAa(img))
- img->put.separate = putRGBUAseparate8bittile;
- }
- else
- img->put.separate = putRGBseparate8bittile;
- break;
- case 16:
- if (img->alpha == EXTRASAMPLE_ASSOCALPHA)
- {
- if (BuildMapBitdepth16To8(img))
- img->put.separate = putRGBAAseparate16bittile;
- }
- else if (img->alpha == EXTRASAMPLE_UNASSALPHA)
- {
- if (BuildMapBitdepth16To8(img) &&
- BuildMapUaToAa(img))
- img->put.separate = putRGBUAseparate16bittile;
- }
- else
- {
- if (BuildMapBitdepth16To8(img))
- img->put.separate = putRGBseparate16bittile;
- }
- break;
- }
- break;
- case PHOTOMETRIC_SEPARATED:
- if (img->bitspersample == 8 && img->samplesperpixel == 4)
- {
- img->alpha = 1; // Not alpha, but seems like the only way to get 4th band
- img->put.separate = putCMYKseparate8bittile;
- }
- break;
- case PHOTOMETRIC_YCBCR:
- if ((img->bitspersample==8) && (img->samplesperpixel==3))
- {
- if (initYCbCrConversion(img)!=0)
- {
- uint16 hs, vs;
- TIFFGetFieldDefaulted(img->tif, TIFFTAG_YCBCRSUBSAMPLING, &hs, &vs);
- switch ((hs<<4)|vs) {
- case 0x11:
- img->put.separate = putseparate8bitYCbCr11tile;
- break;
- /* TODO: add other cases here */
- }
- }
- }
- break;
- }
- return ((img->get!=NULL) && (img->put.separate!=NULL));
-}
-
-static int
-BuildMapUaToAa(TIFFRGBAImage* img)
-{
- static const char module[]="BuildMapUaToAa";
- uint8* m;
- uint16 na,nv;
- assert(img->UaToAa==NULL);
- img->UaToAa=_TIFFmalloc(65536);
- if (img->UaToAa==NULL)
- {
- TIFFErrorExt(img->tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- m=img->UaToAa;
- for (na=0; na<256; na++)
- {
- for (nv=0; nv<256; nv++)
- *m++=(uint8)((nv*na+127)/255);
- }
- return(1);
-}
-
-static int
-BuildMapBitdepth16To8(TIFFRGBAImage* img)
-{
- static const char module[]="BuildMapBitdepth16To8";
- uint8* m;
- uint32 n;
- assert(img->Bitdepth16To8==NULL);
- img->Bitdepth16To8=_TIFFmalloc(65536);
- if (img->Bitdepth16To8==NULL)
- {
- TIFFErrorExt(img->tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- m=img->Bitdepth16To8;
- for (n=0; n<65536; n++)
- *m++=(uint8)((n+128)/257);
- return(1);
+static int PickSeparateCase(TIFFRGBAImage *img)
+{
+ img->get = TIFFIsTiled(img->tif) ? gtTileSeparate : gtStripSeparate;
+ img->put.separate = NULL;
+ switch (img->photometric)
+ {
+ case PHOTOMETRIC_MINISWHITE:
+ case PHOTOMETRIC_MINISBLACK:
+ /* greyscale images processed pretty much as RGB by gtTileSeparate
+ */
+ case PHOTOMETRIC_RGB:
+ switch (img->bitspersample)
+ {
+ case 8:
+ if (img->alpha == EXTRASAMPLE_ASSOCALPHA)
+ img->put.separate = putRGBAAseparate8bittile;
+ else if (img->alpha == EXTRASAMPLE_UNASSALPHA)
+ {
+ if (BuildMapUaToAa(img))
+ img->put.separate = putRGBUAseparate8bittile;
+ }
+ else
+ img->put.separate = putRGBseparate8bittile;
+ break;
+ case 16:
+ if (img->alpha == EXTRASAMPLE_ASSOCALPHA)
+ {
+ if (BuildMapBitdepth16To8(img))
+ img->put.separate = putRGBAAseparate16bittile;
+ }
+ else if (img->alpha == EXTRASAMPLE_UNASSALPHA)
+ {
+ if (BuildMapBitdepth16To8(img) && BuildMapUaToAa(img))
+ img->put.separate = putRGBUAseparate16bittile;
+ }
+ else
+ {
+ if (BuildMapBitdepth16To8(img))
+ img->put.separate = putRGBseparate16bittile;
+ }
+ break;
+ }
+ break;
+ case PHOTOMETRIC_SEPARATED:
+ if (img->bitspersample == 8 && img->samplesperpixel == 4)
+ {
+ img->alpha =
+ 1; // Not alpha, but seems like the only way to get 4th band
+ img->put.separate = putCMYKseparate8bittile;
+ }
+ break;
+ case PHOTOMETRIC_YCBCR:
+ if ((img->bitspersample == 8) && (img->samplesperpixel == 3))
+ {
+ if (initYCbCrConversion(img) != 0)
+ {
+ uint16_t hs, vs;
+ TIFFGetFieldDefaulted(img->tif, TIFFTAG_YCBCRSUBSAMPLING,
+ &hs, &vs);
+ switch ((hs << 4) | vs)
+ {
+ case 0x11:
+ img->put.separate = putseparate8bitYCbCr11tile;
+ break;
+ /* TODO: add other cases here */
+ }
+ }
+ }
+ break;
+ }
+ return ((img->get != NULL) && (img->put.separate != NULL));
+}
+
+static int BuildMapUaToAa(TIFFRGBAImage *img)
+{
+ static const char module[] = "BuildMapUaToAa";
+ uint8_t *m;
+ uint16_t na, nv;
+ assert(img->UaToAa == NULL);
+ img->UaToAa = _TIFFmallocExt(img->tif, 65536);
+ if (img->UaToAa == NULL)
+ {
+ TIFFErrorExtR(img->tif, module, "Out of memory");
+ return (0);
+ }
+ m = img->UaToAa;
+ for (na = 0; na < 256; na++)
+ {
+ for (nv = 0; nv < 256; nv++)
+ *m++ = (uint8_t)((nv * na + 127) / 255);
+ }
+ return (1);
}
+static int BuildMapBitdepth16To8(TIFFRGBAImage *img)
+{
+ static const char module[] = "BuildMapBitdepth16To8";
+ uint8_t *m;
+ uint32_t n;
+ assert(img->Bitdepth16To8 == NULL);
+ img->Bitdepth16To8 = _TIFFmallocExt(img->tif, 65536);
+ if (img->Bitdepth16To8 == NULL)
+ {
+ TIFFErrorExtR(img->tif, module, "Out of memory");
+ return (0);
+ }
+ m = img->Bitdepth16To8;
+ for (n = 0; n < 65536; n++)
+ *m++ = (uint8_t)((n + 128) / 257);
+ return (1);
+}
/*
* Read a whole strip off data from the file, and convert to RGBA form.
@@ -2884,56 +3190,59 @@ BuildMapBitdepth16To8(TIFFRGBAImage* img)
* organized in bottom to top form.
*/
-
-int
-TIFFReadRGBAStrip(TIFF* tif, uint32 row, uint32 * raster )
+int TIFFReadRGBAStrip(TIFF *tif, uint32_t row, uint32_t *raster)
{
- return TIFFReadRGBAStripExt(tif, row, raster, 0 );
+ return TIFFReadRGBAStripExt(tif, row, raster, 0);
}
-int
-TIFFReadRGBAStripExt(TIFF* tif, uint32 row, uint32 * raster, int stop_on_error)
+int TIFFReadRGBAStripExt(TIFF *tif, uint32_t row, uint32_t *raster,
+ int stop_on_error)
{
- char emsg[1024] = "";
+ char emsg[EMSG_BUF_SIZE] = "";
TIFFRGBAImage img;
- int ok;
- uint32 rowsperstrip, rows_to_read;
+ int ok;
+ uint32_t rowsperstrip, rows_to_read;
- if( TIFFIsTiled( tif ) )
+ if (TIFFIsTiled(tif))
{
- TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif),
- "Can't use TIFFReadRGBAStrip() with tiled file.");
- return (0);
+ TIFFErrorExtR(tif, TIFFFileName(tif),
+ "Can't use TIFFReadRGBAStrip() with tiled file.");
+ return (0);
}
-
+
TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
- if( (row % rowsperstrip) != 0 )
+ if ((row % rowsperstrip) != 0)
{
- TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif),
- "Row passed to TIFFReadRGBAStrip() must be first in a strip.");
- return (0);
+ TIFFErrorExtR(
+ tif, TIFFFileName(tif),
+ "Row passed to TIFFReadRGBAStrip() must be first in a strip.");
+ return (0);
}
- if (TIFFRGBAImageOK(tif, emsg) && TIFFRGBAImageBegin(&img, tif, stop_on_error, emsg)) {
+ if (TIFFRGBAImageOK(tif, emsg) &&
+ TIFFRGBAImageBegin(&img, tif, stop_on_error, emsg))
+ {
img.row_offset = row;
img.col_offset = 0;
- if( row + rowsperstrip > img.height )
+ if (row + rowsperstrip > img.height)
rows_to_read = img.height - row;
else
rows_to_read = rowsperstrip;
-
- ok = TIFFRGBAImageGet(&img, raster, img.width, rows_to_read );
-
- TIFFRGBAImageEnd(&img);
- } else {
- TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "%s", emsg);
- ok = 0;
- }
-
+
+ ok = TIFFRGBAImageGet(&img, raster, img.width, rows_to_read);
+
+ TIFFRGBAImageEnd(&img);
+ }
+ else
+ {
+ TIFFErrorExtR(tif, TIFFFileName(tif), "%s", emsg);
+ ok = 0;
+ }
+
return (ok);
}
@@ -2943,54 +3252,53 @@ TIFFReadRGBAStripExt(TIFF* tif, uint32 row, uint32 * raster, int stop_on_error)
* and may include zeroed areas if the tile extends off the image.
*/
-int
-TIFFReadRGBATile(TIFF* tif, uint32 col, uint32 row, uint32 * raster)
+int TIFFReadRGBATile(TIFF *tif, uint32_t col, uint32_t row, uint32_t *raster)
{
- return TIFFReadRGBATileExt(tif, col, row, raster, 0 );
+ return TIFFReadRGBATileExt(tif, col, row, raster, 0);
}
-
-int
-TIFFReadRGBATileExt(TIFF* tif, uint32 col, uint32 row, uint32 * raster, int stop_on_error )
+int TIFFReadRGBATileExt(TIFF *tif, uint32_t col, uint32_t row, uint32_t *raster,
+ int stop_on_error)
{
- char emsg[1024] = "";
+ char emsg[EMSG_BUF_SIZE] = "";
TIFFRGBAImage img;
- int ok;
- uint32 tile_xsize, tile_ysize;
- uint32 read_xsize, read_ysize;
- uint32 i_row;
+ int ok;
+ uint32_t tile_xsize, tile_ysize;
+ uint32_t read_xsize, read_ysize;
+ uint32_t i_row;
/*
* Verify that our request is legal - on a tile file, and on a
* tile boundary.
*/
-
- if( !TIFFIsTiled( tif ) )
+
+ if (!TIFFIsTiled(tif))
{
- TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif),
- "Can't use TIFFReadRGBATile() with striped file.");
- return (0);
+ TIFFErrorExtR(tif, TIFFFileName(tif),
+ "Can't use TIFFReadRGBATile() with striped file.");
+ return (0);
}
-
+
TIFFGetFieldDefaulted(tif, TIFFTAG_TILEWIDTH, &tile_xsize);
TIFFGetFieldDefaulted(tif, TIFFTAG_TILELENGTH, &tile_ysize);
- if( (col % tile_xsize) != 0 || (row % tile_ysize) != 0 )
+ if ((col % tile_xsize) != 0 || (row % tile_ysize) != 0)
{
- TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif),
- "Row/col passed to TIFFReadRGBATile() must be top"
- "left corner of a tile.");
- return (0);
+ TIFFErrorExtR(tif, TIFFFileName(tif),
+ "Row/col passed to TIFFReadRGBATile() must be top"
+ "left corner of a tile.");
+ return (0);
}
/*
* Setup the RGBA reader.
*/
-
- if (!TIFFRGBAImageOK(tif, emsg)
- || !TIFFRGBAImageBegin(&img, tif, stop_on_error, emsg)) {
- TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "%s", emsg);
- return( 0 );
+
+ if (!TIFFRGBAImageOK(tif, emsg) ||
+ !TIFFRGBAImageBegin(&img, tif, stop_on_error, emsg))
+ {
+ TIFFErrorExtR(tif, TIFFFileName(tif), "%s", emsg);
+ return (0);
}
/*
@@ -3000,12 +3308,12 @@ TIFFReadRGBATileExt(TIFF* tif, uint32 col, uint32 row, uint32 * raster, int stop
* a full tile configuration afterwards.
*/
- if( row + tile_ysize > img.height )
+ if (row + tile_ysize > img.height)
read_ysize = img.height - row;
else
read_ysize = tile_ysize;
-
- if( col + tile_xsize > img.width )
+
+ if (col + tile_xsize > img.width)
read_xsize = img.width - col;
else
read_xsize = tile_xsize;
@@ -3013,12 +3321,12 @@ TIFFReadRGBATileExt(TIFF* tif, uint32 col, uint32 row, uint32 * raster, int stop
/*
* Read the chunk of imagery.
*/
-
+
img.row_offset = row;
img.col_offset = col;
- ok = TIFFRGBAImageGet(&img, raster, read_xsize, read_ysize );
-
+ ok = TIFFRGBAImageGet(&img, raster, read_xsize, read_ysize);
+
TIFFRGBAImageEnd(&img);
/*
@@ -3026,33 +3334,27 @@ TIFFReadRGBATileExt(TIFF* tif, uint32 col, uint32 row, uint32 * raster, int stop
* shifting the data around as if a full tile of data is being returned.
*
* This is all the more complicated because the image is organized in
- * bottom to top format.
+ * bottom to top format.
*/
- if( read_xsize == tile_xsize && read_ysize == tile_ysize )
- return( ok );
+ if (read_xsize == tile_xsize && read_ysize == tile_ysize)
+ return (ok);
- for( i_row = 0; i_row < read_ysize; i_row++ ) {
- memmove( raster + (tile_ysize - i_row - 1) * tile_xsize,
- raster + (read_ysize - i_row - 1) * read_xsize,
- read_xsize * sizeof(uint32) );
- _TIFFmemset( raster + (tile_ysize - i_row - 1) * tile_xsize+read_xsize,
- 0, sizeof(uint32) * (tile_xsize - read_xsize) );
+ for (i_row = 0; i_row < read_ysize; i_row++)
+ {
+ memmove(raster + (size_t)(tile_ysize - i_row - 1) * tile_xsize,
+ raster + (size_t)(read_ysize - i_row - 1) * read_xsize,
+ read_xsize * sizeof(uint32_t));
+ _TIFFmemset(raster + (size_t)(tile_ysize - i_row - 1) * tile_xsize +
+ read_xsize,
+ 0, sizeof(uint32_t) * (tile_xsize - read_xsize));
}
- for( i_row = read_ysize; i_row < tile_ysize; i_row++ ) {
- _TIFFmemset( raster + (tile_ysize - i_row - 1) * tile_xsize,
- 0, sizeof(uint32) * tile_xsize );
+ for (i_row = read_ysize; i_row < tile_ysize; i_row++)
+ {
+ _TIFFmemset(raster + (size_t)(tile_ysize - i_row - 1) * tile_xsize, 0,
+ sizeof(uint32_t) * tile_xsize);
}
return (ok);
}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_hash_set.c b/src/3rdparty/libtiff/libtiff/tif_hash_set.c
new file mode 100644
index 0000000..49718ce
--- /dev/null
+++ b/src/3rdparty/libtiff/libtiff/tif_hash_set.c
@@ -0,0 +1,603 @@
+/**********************************************************************
+ *
+ * Name: tif_hash_set.c
+ * Purpose: Hash set functions.
+ * Author: Even Rouault, <even dot rouault at spatialys.com>
+ *
+ **********************************************************************
+ * Copyright (c) 2008-2009, Even Rouault <even dot rouault at spatialys.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ****************************************************************************/
+
+#include "tif_hash_set.h"
+
+#include <assert.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/** List element structure. */
+typedef struct _TIFFList TIFFList;
+
+/** List element structure. */
+struct _TIFFList
+{
+ /*! Pointer to the data object. Should be allocated and freed by the
+ * caller.
+ * */
+ void *pData;
+ /*! Pointer to the next element in list. NULL, if current element is the
+ * last one.
+ */
+ struct _TIFFList *psNext;
+};
+
+struct _TIFFHashSet
+{
+ TIFFHashSetHashFunc fnHashFunc;
+ TIFFHashSetEqualFunc fnEqualFunc;
+ TIFFHashSetFreeEltFunc fnFreeEltFunc;
+ TIFFList **tabList;
+ int nSize;
+ int nIndiceAllocatedSize;
+ int nAllocatedSize;
+ TIFFList *psRecyclingList;
+ int nRecyclingListSize;
+ bool bRehash;
+#ifdef HASH_DEBUG
+ int nCollisions;
+#endif
+};
+
+static const int anPrimes[] = {
+ 53, 97, 193, 389, 769, 1543, 3079,
+ 6151, 12289, 24593, 49157, 98317, 196613, 393241,
+ 786433, 1572869, 3145739, 6291469, 12582917, 25165843, 50331653,
+ 100663319, 201326611, 402653189, 805306457, 1610612741};
+
+/************************************************************************/
+/* TIFFHashSetHashPointer() */
+/************************************************************************/
+
+/**
+ * Hash function for an arbitrary pointer
+ *
+ * @param elt the arbitrary pointer to hash
+ *
+ * @return the hash value of the pointer
+ */
+
+static unsigned long TIFFHashSetHashPointer(const void *elt)
+{
+ return (unsigned long)(uintptr_t)((void *)(elt));
+}
+
+/************************************************************************/
+/* TIFFHashSetEqualPointer() */
+/************************************************************************/
+
+/**
+ * Equality function for arbitrary pointers
+ *
+ * @param elt1 the first arbitrary pointer to compare
+ * @param elt2 the second arbitrary pointer to compare
+ *
+ * @return true if the pointers are equal
+ */
+
+static bool TIFFHashSetEqualPointer(const void *elt1, const void *elt2)
+{
+ return elt1 == elt2;
+}
+
+/************************************************************************/
+/* TIFFHashSetNew() */
+/************************************************************************/
+
+/**
+ * Creates a new hash set
+ *
+ * The hash function must return a hash value for the elements to insert.
+ * If fnHashFunc is NULL, TIFFHashSetHashPointer will be used.
+ *
+ * The equal function must return if two elements are equal.
+ * If fnEqualFunc is NULL, TIFFHashSetEqualPointer will be used.
+ *
+ * The free function is used to free elements inserted in the hash set,
+ * when the hash set is destroyed, when elements are removed or replaced.
+ * If fnFreeEltFunc is NULL, elements inserted into the hash set will not be
+ * freed.
+ *
+ * @param fnHashFunc hash function. May be NULL.
+ * @param fnEqualFunc equal function. May be NULL.
+ * @param fnFreeEltFunc element free function. May be NULL.
+ *
+ * @return a new hash set
+ */
+
+TIFFHashSet *TIFFHashSetNew(TIFFHashSetHashFunc fnHashFunc,
+ TIFFHashSetEqualFunc fnEqualFunc,
+ TIFFHashSetFreeEltFunc fnFreeEltFunc)
+{
+ TIFFHashSet *set = (TIFFHashSet *)malloc(sizeof(TIFFHashSet));
+ if (set == NULL)
+ return NULL;
+ set->fnHashFunc = fnHashFunc ? fnHashFunc : TIFFHashSetHashPointer;
+ set->fnEqualFunc = fnEqualFunc ? fnEqualFunc : TIFFHashSetEqualPointer;
+ set->fnFreeEltFunc = fnFreeEltFunc;
+ set->nSize = 0;
+ set->tabList = (TIFFList **)(calloc(sizeof(TIFFList *), 53));
+ if (set->tabList == NULL)
+ {
+ free(set);
+ return NULL;
+ }
+ set->nIndiceAllocatedSize = 0;
+ set->nAllocatedSize = 53;
+ set->psRecyclingList = NULL;
+ set->nRecyclingListSize = 0;
+ set->bRehash = false;
+#ifdef HASH_DEBUG
+ set->nCollisions = 0;
+#endif
+ return set;
+}
+
+#ifdef notdef
+/************************************************************************/
+/* TIFFHashSetSize() */
+/************************************************************************/
+
+/**
+ * Returns the number of elements inserted in the hash set
+ *
+ * Note: this is not the internal size of the hash set
+ *
+ * @param set the hash set
+ *
+ * @return the number of elements in the hash set
+ */
+
+int TIFFHashSetSize(const TIFFHashSet *set)
+{
+ assert(set != NULL);
+ return set->nSize;
+}
+#endif
+
+/************************************************************************/
+/* TIFFHashSetGetNewListElt() */
+/************************************************************************/
+
+static TIFFList *TIFFHashSetGetNewListElt(TIFFHashSet *set)
+{
+ if (set->psRecyclingList)
+ {
+ TIFFList *psRet = set->psRecyclingList;
+ psRet->pData = NULL;
+ set->nRecyclingListSize--;
+ set->psRecyclingList = psRet->psNext;
+ return psRet;
+ }
+
+ return (TIFFList *)malloc(sizeof(TIFFList));
+}
+
+/************************************************************************/
+/* TIFFHashSetReturnListElt() */
+/************************************************************************/
+
+static void TIFFHashSetReturnListElt(TIFFHashSet *set, TIFFList *psList)
+{
+ if (set->nRecyclingListSize < 128)
+ {
+ psList->psNext = set->psRecyclingList;
+ set->psRecyclingList = psList;
+ set->nRecyclingListSize++;
+ }
+ else
+ {
+ free(psList);
+ }
+}
+
+/************************************************************************/
+/* TIFFHashSetClearInternal() */
+/************************************************************************/
+
+static void TIFFHashSetClearInternal(TIFFHashSet *set, bool bFinalize)
+{
+ assert(set != NULL);
+ for (int i = 0; i < set->nAllocatedSize; i++)
+ {
+ TIFFList *cur = set->tabList[i];
+ while (cur)
+ {
+ if (set->fnFreeEltFunc)
+ set->fnFreeEltFunc(cur->pData);
+ TIFFList *psNext = cur->psNext;
+ if (bFinalize)
+ free(cur);
+ else
+ TIFFHashSetReturnListElt(set, cur);
+ cur = psNext;
+ }
+ set->tabList[i] = NULL;
+ }
+ set->bRehash = false;
+}
+
+/************************************************************************/
+/* TIFFListDestroy() */
+/************************************************************************/
+
+/**
+ * Destroy a list. Caller responsible for freeing data objects contained in
+ * list elements.
+ *
+ * @param psList pointer to list head.
+ *
+ */
+
+static void TIFFListDestroy(TIFFList *psList)
+{
+ TIFFList *psCurrent = psList;
+
+ while (psCurrent)
+ {
+ TIFFList *const psNext = psCurrent->psNext;
+ free(psCurrent);
+ psCurrent = psNext;
+ }
+}
+
+/************************************************************************/
+/* TIFFHashSetDestroy() */
+/************************************************************************/
+
+/**
+ * Destroys an allocated hash set.
+ *
+ * This function also frees the elements if a free function was
+ * provided at the creation of the hash set.
+ *
+ * @param set the hash set
+ */
+
+void TIFFHashSetDestroy(TIFFHashSet *set)
+{
+ if (set)
+ {
+ TIFFHashSetClearInternal(set, true);
+ free(set->tabList);
+ TIFFListDestroy(set->psRecyclingList);
+ free(set);
+ }
+}
+
+#ifdef notused
+/************************************************************************/
+/* TIFFHashSetClear() */
+/************************************************************************/
+
+/**
+ * Clear all elements from a hash set.
+ *
+ * This function also frees the elements if a free function was
+ * provided at the creation of the hash set.
+ *
+ * @param set the hash set
+ */
+
+void TIFFHashSetClear(TIFFHashSet *set)
+{
+ TIFFHashSetClearInternal(set, false);
+ set->nIndiceAllocatedSize = 0;
+ set->nAllocatedSize = 53;
+#ifdef HASH_DEBUG
+ set->nCollisions = 0;
+#endif
+ set->nSize = 0;
+}
+
+/************************************************************************/
+/* TIFFHashSetForeach() */
+/************************************************************************/
+
+/**
+ * Walk through the hash set and runs the provided function on all the
+ * elements
+ *
+ * This function is provided the user_data argument of TIFFHashSetForeach.
+ * It must return true to go on the walk through the hash set, or FALSE to
+ * make it stop.
+ *
+ * Note : the structure of the hash set must *NOT* be modified during the
+ * walk.
+ *
+ * @param set the hash set.
+ * @param fnIterFunc the function called on each element.
+ * @param user_data the user data provided to the function.
+ */
+
+void TIFFHashSetForeach(TIFFHashSet *set, TIFFHashSetIterEltFunc fnIterFunc,
+ void *user_data)
+{
+ assert(set != NULL);
+ if (!fnIterFunc)
+ return;
+
+ for (int i = 0; i < set->nAllocatedSize; i++)
+ {
+ TIFFList *cur = set->tabList[i];
+ while (cur)
+ {
+ if (!fnIterFunc(cur->pData, user_data))
+ return;
+
+ cur = cur->psNext;
+ }
+ }
+}
+#endif
+
+/************************************************************************/
+/* TIFFHashSetRehash() */
+/************************************************************************/
+
+static bool TIFFHashSetRehash(TIFFHashSet *set)
+{
+ int nNewAllocatedSize = anPrimes[set->nIndiceAllocatedSize];
+ TIFFList **newTabList =
+ (TIFFList **)(calloc(sizeof(TIFFList *), nNewAllocatedSize));
+ if (newTabList == NULL)
+ return false;
+#ifdef HASH_DEBUG
+ TIFFDebug("TIFFHASH",
+ "hashSet=%p, nSize=%d, nCollisions=%d, "
+ "fCollisionRate=%.02f",
+ set, set->nSize, set->nCollisions,
+ set->nCollisions * 100.0 / set->nSize);
+ set->nCollisions = 0;
+#endif
+ for (int i = 0; i < set->nAllocatedSize; i++)
+ {
+ TIFFList *cur = set->tabList[i];
+ while (cur)
+ {
+ const unsigned long nNewHashVal =
+ set->fnHashFunc(cur->pData) % nNewAllocatedSize;
+#ifdef HASH_DEBUG
+ if (newTabList[nNewHashVal])
+ set->nCollisions++;
+#endif
+ TIFFList *psNext = cur->psNext;
+ cur->psNext = newTabList[nNewHashVal];
+ newTabList[nNewHashVal] = cur;
+ cur = psNext;
+ }
+ }
+ free(set->tabList);
+ set->tabList = newTabList;
+ set->nAllocatedSize = nNewAllocatedSize;
+ set->bRehash = false;
+ return true;
+}
+
+/************************************************************************/
+/* TIFFHashSetFindPtr() */
+/************************************************************************/
+
+static void **TIFFHashSetFindPtr(TIFFHashSet *set, const void *elt)
+{
+ const unsigned long nHashVal = set->fnHashFunc(elt) % set->nAllocatedSize;
+ TIFFList *cur = set->tabList[nHashVal];
+ while (cur)
+ {
+ if (set->fnEqualFunc(cur->pData, elt))
+ return &cur->pData;
+ cur = cur->psNext;
+ }
+ return NULL;
+}
+
+/************************************************************************/
+/* TIFFHashSetInsert() */
+/************************************************************************/
+
+/**
+ * Inserts an element into a hash set.
+ *
+ * If the element was already inserted in the hash set, the previous
+ * element is replaced by the new element. If a free function was provided,
+ * it is used to free the previously inserted element
+ *
+ * @param set the hash set
+ * @param elt the new element to insert in the hash set
+ *
+ * @return true if success. If false is returned, elt has not been inserted,
+ * but TIFFHashSetInsert() will have run the free function if provided.
+ */
+
+bool TIFFHashSetInsert(TIFFHashSet *set, void *elt)
+{
+ assert(set != NULL);
+ void **pElt = TIFFHashSetFindPtr(set, elt);
+ if (pElt)
+ {
+ if (set->fnFreeEltFunc)
+ set->fnFreeEltFunc(*pElt);
+
+ *pElt = elt;
+ return true;
+ }
+
+ if (set->nSize >= 2 * set->nAllocatedSize / 3 ||
+ (set->bRehash && set->nIndiceAllocatedSize > 0 &&
+ set->nSize <= set->nAllocatedSize / 2))
+ {
+ set->nIndiceAllocatedSize++;
+ if (!TIFFHashSetRehash(set))
+ {
+ set->nIndiceAllocatedSize--;
+ if (set->fnFreeEltFunc)
+ set->fnFreeEltFunc(elt);
+ return false;
+ }
+ }
+
+ const unsigned long nHashVal = set->fnHashFunc(elt) % set->nAllocatedSize;
+#ifdef HASH_DEBUG
+ if (set->tabList[nHashVal])
+ set->nCollisions++;
+#endif
+
+ TIFFList *new_elt = TIFFHashSetGetNewListElt(set);
+ if (new_elt == NULL)
+ {
+ if (set->fnFreeEltFunc)
+ set->fnFreeEltFunc(elt);
+ return false;
+ }
+ new_elt->pData = elt;
+ new_elt->psNext = set->tabList[nHashVal];
+ set->tabList[nHashVal] = new_elt;
+ set->nSize++;
+
+ return true;
+}
+
+/************************************************************************/
+/* TIFFHashSetLookup() */
+/************************************************************************/
+
+/**
+ * Returns the element found in the hash set corresponding to the element to
+ * look up The element must not be modified.
+ *
+ * @param set the hash set
+ * @param elt the element to look up in the hash set
+ *
+ * @return the element found in the hash set or NULL
+ */
+
+void *TIFFHashSetLookup(TIFFHashSet *set, const void *elt)
+{
+ assert(set != NULL);
+ void **pElt = TIFFHashSetFindPtr(set, elt);
+ if (pElt)
+ return *pElt;
+
+ return NULL;
+}
+
+/************************************************************************/
+/* TIFFHashSetRemoveInternal() */
+/************************************************************************/
+
+static bool TIFFHashSetRemoveInternal(TIFFHashSet *set, const void *elt,
+ bool bDeferRehash)
+{
+ assert(set != NULL);
+ if (set->nIndiceAllocatedSize > 0 && set->nSize <= set->nAllocatedSize / 2)
+ {
+ set->nIndiceAllocatedSize--;
+ if (bDeferRehash)
+ set->bRehash = true;
+ else
+ {
+ if (!TIFFHashSetRehash(set))
+ {
+ set->nIndiceAllocatedSize++;
+ return false;
+ }
+ }
+ }
+
+ int nHashVal = (int)(set->fnHashFunc(elt) % set->nAllocatedSize);
+ TIFFList *cur = set->tabList[nHashVal];
+ TIFFList *prev = NULL;
+ while (cur)
+ {
+ if (set->fnEqualFunc(cur->pData, elt))
+ {
+ if (prev)
+ prev->psNext = cur->psNext;
+ else
+ set->tabList[nHashVal] = cur->psNext;
+
+ if (set->fnFreeEltFunc)
+ set->fnFreeEltFunc(cur->pData);
+
+ TIFFHashSetReturnListElt(set, cur);
+#ifdef HASH_DEBUG
+ if (set->tabList[nHashVal])
+ set->nCollisions--;
+#endif
+ set->nSize--;
+ return true;
+ }
+ prev = cur;
+ cur = cur->psNext;
+ }
+ return false;
+}
+
+/************************************************************************/
+/* TIFFHashSetRemove() */
+/************************************************************************/
+
+/**
+ * Removes an element from a hash set
+ *
+ * @param set the hash set
+ * @param elt the new element to remove from the hash set
+ *
+ * @return true if the element was in the hash set
+ */
+
+bool TIFFHashSetRemove(TIFFHashSet *set, const void *elt)
+{
+ return TIFFHashSetRemoveInternal(set, elt, false);
+}
+
+#ifdef notused
+/************************************************************************/
+/* TIFFHashSetRemoveDeferRehash() */
+/************************************************************************/
+
+/**
+ * Removes an element from a hash set.
+ *
+ * This will defer potential rehashing of the set to later calls to
+ * TIFFHashSetInsert() or TIFFHashSetRemove().
+ *
+ * @param set the hash set
+ * @param elt the new element to remove from the hash set
+ *
+ * @return true if the element was in the hash set
+ */
+
+bool TIFFHashSetRemoveDeferRehash(TIFFHashSet *set, const void *elt)
+{
+ return TIFFHashSetRemoveInternal(set, elt, true);
+}
+#endif
diff --git a/src/3rdparty/libtiff/libtiff/tif_hash_set.h b/src/3rdparty/libtiff/libtiff/tif_hash_set.h
new file mode 100644
index 0000000..1a3f8da
--- /dev/null
+++ b/src/3rdparty/libtiff/libtiff/tif_hash_set.h
@@ -0,0 +1,100 @@
+/**********************************************************************
+ * $Id$
+ *
+ * Name: tif_hash_set.h
+ * Project: TIFF - Common Portability Library
+ * Purpose: Hash set functions.
+ * Author: Even Rouault, <even dot rouault at spatialys.com>
+ *
+ **********************************************************************
+ * Copyright (c) 2008-2009, Even Rouault <even dot rouault at spatialys.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ****************************************************************************/
+
+#ifndef TIFF_HASH_SET_H_INCLUDED
+#define TIFF_HASH_SET_H_INCLUDED
+
+#include <stdbool.h>
+
+/**
+ * \file tif_hash_set.h
+ *
+ * Hash set implementation.
+ *
+ * An hash set is a data structure that holds elements that are unique
+ * according to a comparison function. Operations on the hash set, such as
+ * insertion, removal or lookup, are supposed to be fast if an efficient
+ * "hash" function is provided.
+ */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+ /* Types */
+
+ /** Opaque type for a hash set */
+ typedef struct _TIFFHashSet TIFFHashSet;
+
+ /** TIFFHashSetHashFunc */
+ typedef unsigned long (*TIFFHashSetHashFunc)(const void *elt);
+
+ /** TIFFHashSetEqualFunc */
+ typedef bool (*TIFFHashSetEqualFunc)(const void *elt1, const void *elt2);
+
+ /** TIFFHashSetFreeEltFunc */
+ typedef void (*TIFFHashSetFreeEltFunc)(void *elt);
+
+ /* Functions */
+
+ TIFFHashSet *TIFFHashSetNew(TIFFHashSetHashFunc fnHashFunc,
+ TIFFHashSetEqualFunc fnEqualFunc,
+ TIFFHashSetFreeEltFunc fnFreeEltFunc);
+
+ void TIFFHashSetDestroy(TIFFHashSet *set);
+
+#ifdef notused
+ void TIFFHashSetClear(TIFFHashSet *set);
+
+ int TIFFHashSetSize(const TIFFHashSet *set);
+
+ /** TIFFHashSetIterEltFunc */
+ typedef int (*TIFFHashSetIterEltFunc)(void *elt, void *user_data);
+
+ void TIFFHashSetForeach(TIFFHashSet *set, TIFFHashSetIterEltFunc fnIterFunc,
+ void *user_data);
+#endif
+
+ bool TIFFHashSetInsert(TIFFHashSet *set, void *elt);
+
+ void *TIFFHashSetLookup(TIFFHashSet *set, const void *elt);
+
+ bool TIFFHashSetRemove(TIFFHashSet *set, const void *elt);
+
+#ifdef notused
+ bool TIFFHashSetRemoveDeferRehash(TIFFHashSet *set, const void *elt);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* TIFF_HASH_SET_H_INCLUDED */
diff --git a/src/3rdparty/libtiff/libtiff/tif_jbig.c b/src/3rdparty/libtiff/libtiff/tif_jbig.c
index 7ffe885..7e455ad 100644
--- a/src/3rdparty/libtiff/libtiff/tif_jbig.c
+++ b/src/3rdparty/libtiff/libtiff/tif_jbig.c
@@ -35,198 +35,197 @@
#ifdef JBIG_SUPPORT
#include "jbig.h"
-static int JBIGSetupDecode(TIFF* tif)
+static int JBIGSetupDecode(TIFF *tif)
{
- if (TIFFNumberOfStrips(tif) != 1)
- {
- TIFFErrorExt(tif->tif_clientdata, "JBIG", "Multistrip images not supported in decoder");
- return 0;
- }
-
- return 1;
+ if (TIFFNumberOfStrips(tif) != 1)
+ {
+ TIFFErrorExtR(tif, "JBIG",
+ "Multistrip images not supported in decoder");
+ return 0;
+ }
+
+ return 1;
}
-static int JBIGDecode(TIFF* tif, uint8* buffer, tmsize_t size, uint16 s)
+static int JBIGDecode(TIFF *tif, uint8_t *buffer, tmsize_t size, uint16_t s)
{
- struct jbg_dec_state decoder;
- int decodeStatus = 0;
- unsigned char* pImage = NULL;
- unsigned long decodedSize;
- (void) s;
+ struct jbg_dec_state decoder;
+ int decodeStatus = 0;
+ unsigned char *pImage = NULL;
+ unsigned long decodedSize;
+ (void)s;
- if (isFillOrder(tif, tif->tif_dir.td_fillorder))
- {
- TIFFReverseBits(tif->tif_rawcp, tif->tif_rawcc);
- }
+ if (isFillOrder(tif, tif->tif_dir.td_fillorder))
+ {
+ TIFFReverseBits(tif->tif_rawcp, tif->tif_rawcc);
+ }
- jbg_dec_init(&decoder);
+ jbg_dec_init(&decoder);
#if defined(HAVE_JBG_NEWLEN)
- jbg_newlen(tif->tif_rawcp, (size_t)tif->tif_rawcc);
- /*
- * I do not check the return status of jbg_newlen because even if this
- * function fails it does not necessarily mean that decoding the image
- * will fail. It is generally only needed for received fax images
- * that do not contain the actual length of the image in the BIE
- * header. I do not log when an error occurs because that will cause
- * problems when converting JBIG encoded TIFF's to
- * PostScript. As long as the actual image length is contained in the
- * BIE header jbg_dec_in should succeed.
- */
+ jbg_newlen(tif->tif_rawcp, (size_t)tif->tif_rawcc);
+ /*
+ * I do not check the return status of jbg_newlen because even if this
+ * function fails it does not necessarily mean that decoding the image
+ * will fail. It is generally only needed for received fax images
+ * that do not contain the actual length of the image in the BIE
+ * header. I do not log when an error occurs because that will cause
+ * problems when converting JBIG encoded TIFF's to
+ * PostScript. As long as the actual image length is contained in the
+ * BIE header jbg_dec_in should succeed.
+ */
#endif /* HAVE_JBG_NEWLEN */
- decodeStatus = jbg_dec_in(&decoder, (unsigned char*)tif->tif_rawcp,
- (size_t)tif->tif_rawcc, NULL);
- if (JBG_EOK != decodeStatus)
- {
- /*
- * XXX: JBG_EN constant was defined in pre-2.0 releases of the
- * JBIG-KIT. Since the 2.0 the error reporting functions were
- * changed. We will handle both cases here.
- */
- TIFFErrorExt(tif->tif_clientdata,
- "JBIG", "Error (%d) decoding: %s",
- decodeStatus,
+ decodeStatus = jbg_dec_in(&decoder, (unsigned char *)tif->tif_rawcp,
+ (size_t)tif->tif_rawcc, NULL);
+ if (JBG_EOK != decodeStatus)
+ {
+ /*
+ * XXX: JBG_EN constant was defined in pre-2.0 releases of the
+ * JBIG-KIT. Since the 2.0 the error reporting functions were
+ * changed. We will handle both cases here.
+ */
+ TIFFErrorExtR(tif, "JBIG", "Error (%d) decoding: %s", decodeStatus,
#if defined(JBG_EN)
- jbg_strerror(decodeStatus, JBG_EN)
+ jbg_strerror(decodeStatus, JBG_EN)
#else
- jbg_strerror(decodeStatus)
+ jbg_strerror(decodeStatus)
#endif
- );
- jbg_dec_free(&decoder);
- return 0;
- }
-
- decodedSize = jbg_dec_getsize(&decoder);
- if( (tmsize_t)decodedSize < size )
- {
- TIFFWarningExt(tif->tif_clientdata, "JBIG",
- "Only decoded %lu bytes, whereas %lu requested",
- decodedSize, (unsigned long)size);
- }
- else if( (tmsize_t)decodedSize > size )
- {
- TIFFErrorExt(tif->tif_clientdata, "JBIG",
- "Decoded %lu bytes, whereas %lu were requested",
- decodedSize, (unsigned long)size);
- jbg_dec_free(&decoder);
- return 0;
- }
- pImage = jbg_dec_getimage(&decoder, 0);
- _TIFFmemcpy(buffer, pImage, decodedSize);
- jbg_dec_free(&decoder);
-
- tif->tif_rawcp += tif->tif_rawcc;
- tif->tif_rawcc = 0;
-
- return 1;
+ );
+ jbg_dec_free(&decoder);
+ return 0;
+ }
+
+ decodedSize = jbg_dec_getsize(&decoder);
+ if ((tmsize_t)decodedSize < size)
+ {
+ TIFFWarningExtR(tif, "JBIG",
+ "Only decoded %lu bytes, whereas %" TIFF_SSIZE_FORMAT
+ " requested",
+ decodedSize, size);
+ }
+ else if ((tmsize_t)decodedSize > size)
+ {
+ TIFFErrorExtR(tif, "JBIG",
+ "Decoded %lu bytes, whereas %" TIFF_SSIZE_FORMAT
+ " were requested",
+ decodedSize, size);
+ jbg_dec_free(&decoder);
+ return 0;
+ }
+ pImage = jbg_dec_getimage(&decoder, 0);
+ _TIFFmemcpy(buffer, pImage, decodedSize);
+ jbg_dec_free(&decoder);
+
+ tif->tif_rawcp += tif->tif_rawcc;
+ tif->tif_rawcc = 0;
+
+ return 1;
}
-static int JBIGSetupEncode(TIFF* tif)
+static int JBIGSetupEncode(TIFF *tif)
{
- if (TIFFNumberOfStrips(tif) != 1)
- {
- TIFFErrorExt(tif->tif_clientdata, "JBIG", "Multistrip images not supported in encoder");
- return 0;
- }
-
- return 1;
+ if (TIFFNumberOfStrips(tif) != 1)
+ {
+ TIFFErrorExtR(tif, "JBIG",
+ "Multistrip images not supported in encoder");
+ return 0;
+ }
+
+ return 1;
}
-static int JBIGCopyEncodedData(TIFF* tif, unsigned char* pp, size_t cc, uint16 s)
+static int JBIGCopyEncodedData(TIFF *tif, unsigned char *pp, size_t cc,
+ uint16_t s)
{
- (void) s;
- while (cc > 0)
- {
- tmsize_t n = (tmsize_t)cc;
-
- if (tif->tif_rawcc + n > tif->tif_rawdatasize)
- {
- n = tif->tif_rawdatasize - tif->tif_rawcc;
- }
-
- assert(n > 0);
- _TIFFmemcpy(tif->tif_rawcp, pp, n);
- tif->tif_rawcp += n;
- tif->tif_rawcc += n;
- pp += n;
- cc -= (size_t)n;
- if (tif->tif_rawcc >= tif->tif_rawdatasize &&
- !TIFFFlushData1(tif))
- {
- return (-1);
- }
- }
-
- return (1);
+ (void)s;
+ while (cc > 0)
+ {
+ tmsize_t n = (tmsize_t)cc;
+
+ if (tif->tif_rawcc + n > tif->tif_rawdatasize)
+ {
+ n = tif->tif_rawdatasize - tif->tif_rawcc;
+ }
+
+ assert(n > 0);
+ _TIFFmemcpy(tif->tif_rawcp, pp, n);
+ tif->tif_rawcp += n;
+ tif->tif_rawcc += n;
+ pp += n;
+ cc -= (size_t)n;
+ if (tif->tif_rawcc >= tif->tif_rawdatasize && !TIFFFlushData1(tif))
+ {
+ return (-1);
+ }
+ }
+
+ return (1);
}
-static void JBIGOutputBie(unsigned char* buffer, size_t len, void* userData)
+static void JBIGOutputBie(unsigned char *buffer, size_t len, void *userData)
{
- TIFF* tif = (TIFF*)userData;
-
- if (isFillOrder(tif, tif->tif_dir.td_fillorder))
- {
- TIFFReverseBits(buffer, (tmsize_t)len);
- }
+ TIFF *tif = (TIFF *)userData;
- JBIGCopyEncodedData(tif, buffer, len, 0);
-}
+ if (isFillOrder(tif, tif->tif_dir.td_fillorder))
+ {
+ TIFFReverseBits(buffer, (tmsize_t)len);
+ }
-static int JBIGEncode(TIFF* tif, uint8* buffer, tmsize_t size, uint16 s)
-{
- TIFFDirectory* dir = &tif->tif_dir;
- struct jbg_enc_state encoder;
-
- (void) size, (void) s;
-
- jbg_enc_init(&encoder,
- dir->td_imagewidth,
- dir->td_imagelength,
- 1,
- &buffer,
- JBIGOutputBie,
- tif);
- /*
- * jbg_enc_out does the "real" encoding. As data is encoded,
- * JBIGOutputBie is called, which writes the data to the directory.
- */
- jbg_enc_out(&encoder);
- jbg_enc_free(&encoder);
-
- return 1;
+ JBIGCopyEncodedData(tif, buffer, len, 0);
}
-int TIFFInitJBIG(TIFF* tif, int scheme)
+static int JBIGEncode(TIFF *tif, uint8_t *buffer, tmsize_t size, uint16_t s)
{
- assert(scheme == COMPRESSION_JBIG);
+ TIFFDirectory *dir = &tif->tif_dir;
+ struct jbg_enc_state encoder;
- /*
- * These flags are set so the JBIG Codec can control when to reverse
- * bits and when not to and to allow the jbig decoder and bit reverser
- * to write to memory when necessary.
- */
- tif->tif_flags |= TIFF_NOBITREV;
- tif->tif_flags &= ~TIFF_MAPPED;
+ (void)size, (void)s;
- /* Setup the function pointers for encode, decode, and cleanup. */
- tif->tif_setupdecode = JBIGSetupDecode;
- tif->tif_decodestrip = JBIGDecode;
+ jbg_enc_init(&encoder, dir->td_imagewidth, dir->td_imagelength, 1, &buffer,
+ JBIGOutputBie, tif);
+ /*
+ * jbg_enc_out does the "real" encoding. As data is encoded,
+ * JBIGOutputBie is called, which writes the data to the directory.
+ */
+ jbg_enc_out(&encoder);
+ jbg_enc_free(&encoder);
- tif->tif_setupencode = JBIGSetupEncode;
- tif->tif_encodestrip = JBIGEncode;
+ return 1;
+}
- return 1;
+int TIFFInitJBIG(TIFF *tif, int scheme)
+{
+ (void)scheme;
+ assert(scheme == COMPRESSION_JBIG);
+
+ /*
+ * These flags are set so the JBIG Codec can control when to reverse
+ * bits and when not to and to allow the jbig decoder and bit reverser
+ * to write to memory when necessary.
+ */
+ tif->tif_flags |= TIFF_NOBITREV;
+ tif->tif_flags &= ~TIFF_MAPPED;
+ /* We may have read from a previous IFD and thus set TIFF_BUFFERMMAP and
+ * cleared TIFF_MYBUFFER. It is necessary to restore them to their initial
+ * value to be consistent with the state of a non-memory mapped file.
+ */
+ if (tif->tif_flags & TIFF_BUFFERMMAP)
+ {
+ tif->tif_rawdata = NULL;
+ tif->tif_rawdatasize = 0;
+ tif->tif_flags &= ~TIFF_BUFFERMMAP;
+ tif->tif_flags |= TIFF_MYBUFFER;
+ }
+
+ /* Setup the function pointers for encode, decode, and cleanup. */
+ tif->tif_setupdecode = JBIGSetupDecode;
+ tif->tif_decodestrip = JBIGDecode;
+
+ tif->tif_setupencode = JBIGSetupEncode;
+ tif->tif_encodestrip = JBIGEncode;
+
+ return 1;
}
#endif /* JBIG_SUPPORT */
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_jpeg.c b/src/3rdparty/libtiff/libtiff/tif_jpeg.c
index 93ae2ea..250144f 100644
--- a/src/3rdparty/libtiff/libtiff/tif_jpeg.c
+++ b/src/3rdparty/libtiff/libtiff/tif_jpeg.c
@@ -2,23 +2,23 @@
* Copyright (c) 1994-1997 Sam Leffler
* Copyright (c) 1994-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -44,10 +44,34 @@
*/
#include <setjmp.h>
-int TIFFFillStrip(TIFF* tif, uint32 strip);
-int TIFFFillTile(TIFF* tif, uint32 tile);
-int TIFFReInitJPEG_12( TIFF *tif, int scheme, int is_encode );
-int TIFFJPEGIsFullStripRequired_12(TIFF* tif);
+/* Settings that are independent of libjpeg ABI. Used when reinitializing the */
+/* JPEGState from libjpegs 8 bit to libjpeg 12 bits, which have potentially */
+/* different ABI */
+typedef struct
+{
+ TIFFVGetMethod vgetparent; /* super-class method */
+ TIFFVSetMethod vsetparent; /* super-class method */
+ TIFFPrintMethod printdir; /* super-class method */
+ TIFFStripMethod defsparent; /* super-class method */
+ TIFFTileMethod deftparent; /* super-class method */
+
+ /* pseudo-tag fields */
+ void *jpegtables; /* JPEGTables tag value, or NULL */
+ uint32_t jpegtables_length; /* number of bytes in same */
+ int jpegquality; /* Compression quality level */
+ int jpegcolormode; /* Auto RGB<=>YCbCr convert? */
+ int jpegtablesmode; /* What to put in JPEGTables */
+
+ int ycbcrsampling_fetched;
+ int max_allowed_scan_number;
+ int has_warned_about_progressive_mode;
+} JPEGOtherSettings;
+
+int TIFFFillStrip(TIFF *tif, uint32_t strip);
+int TIFFFillTile(TIFF *tif, uint32_t tile);
+int TIFFReInitJPEG_12(TIFF *tif, const JPEGOtherSettings *otherSettings,
+ int scheme, int is_encode);
+int TIFFJPEGIsFullStripRequired_12(TIFF *tif);
/* We undefine FAR to avoid conflict with JPEG definition */
@@ -62,7 +86,7 @@ int TIFFJPEGIsFullStripRequired_12(TIFF* tif);
a conflicting typedef given the headers which are included.
*/
#if defined(__BORLANDC__) || defined(__MINGW32__)
-# define XMD_H 1
+#define XMD_H 1
#endif
/*
@@ -80,24 +104,63 @@ int TIFFJPEGIsFullStripRequired_12(TIFF* tif);
/* Define "boolean" as unsigned char, not int, per Windows custom. */
#if defined(__WIN32__) && !defined(__MINGW32__)
-# ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
- typedef unsigned char boolean;
-# endif
-# define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
+#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
+typedef unsigned char boolean;
+#endif
+#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
#endif
-#include "jpeglib.h"
#include "jerror.h"
+#include "jpeglib.h"
-/*
+/* Do optional compile-time version check */
+#if defined(EXPECTED_JPEG_LIB_VERSION) && !defined(LIBJPEG_12_PATH)
+#if EXPECTED_JPEG_LIB_VERSION != JPEG_LIB_VERSION
+#error EXPECTED_JPEG_LIB_VERSION != JPEG_LIB_VERSION
+#endif
+#endif
+
+/*
* Do we want to do special processing suitable for when JSAMPLE is a
- * 16bit value?
+ * 16bit value?
+ */
+
+/* HAVE_JPEGTURBO_DUAL_MODE_8_12 is defined for libjpeg-turbo >= 2.2 which
+ * adds a dual-mode 8/12 bit API in the same library.
*/
+#if defined(HAVE_JPEGTURBO_DUAL_MODE_8_12)
+#define JPEG_DUAL_MODE_8_12
+/* Start by undefining BITS_IN_JSAMPLE which is always set to 8 in libjpeg-turbo
+ * >= 2.2 Cf
+ * https://github.com/libjpeg-turbo/libjpeg-turbo/commit/8b9bc4b9635a2a047fb23ebe70c9acd728d3f99b
+ */
+#undef BITS_IN_JSAMPLE
+/* libjpeg-turbo >= 2.2 adds J12xxxx datatypes for the 12-bit mode. */
+#if defined(FROM_TIF_JPEG_12)
+#define BITS_IN_JSAMPLE 12
+#define TIFF_JSAMPLE J12SAMPLE
+#define TIFF_JSAMPARRAY J12SAMPARRAY
+#define TIFF_JSAMPIMAGE J12SAMPIMAGE
+#define TIFF_JSAMPROW J12SAMPROW
+#else
+#define BITS_IN_JSAMPLE 8
+#define TIFF_JSAMPLE JSAMPLE
+#define TIFF_JSAMPARRAY JSAMPARRAY
+#define TIFF_JSAMPIMAGE JSAMPIMAGE
+#define TIFF_JSAMPROW JSAMPROW
+#endif
+#else
+#define TIFF_JSAMPLE JSAMPLE
+#define TIFF_JSAMPARRAY JSAMPARRAY
+#define TIFF_JSAMPIMAGE JSAMPIMAGE
+#define TIFF_JSAMPROW JSAMPROW
+#endif
+
#if defined(JPEG_LIB_MK1)
-# define JPEG_LIB_MK1_OR_12BIT 1
+#define JPEG_LIB_MK1_OR_12BIT 1
#elif BITS_IN_JSAMPLE == 12
-# define JPEG_LIB_MK1_OR_12BIT 1
+#define JPEG_LIB_MK1_OR_12BIT 1
#endif
/*
@@ -115,9 +178,9 @@ int TIFFJPEGIsFullStripRequired_12(TIFF* tif);
* On some machines it may be worthwhile to use _setjmp or sigsetjmp
* in place of plain setjmp. These macros will make it easier.
*/
-#define SETJMP(jbuf) setjmp(jbuf)
-#define LONGJMP(jbuf,code) longjmp(jbuf,code)
-#define JMP_BUF jmp_buf
+#define SETJMP(jbuf) setjmp(jbuf)
+#define LONGJMP(jbuf, code) longjmp(jbuf, code)
+#define JMP_BUF jmp_buf
typedef struct jpeg_destination_mgr jpeg_destination_mgr;
typedef struct jpeg_source_mgr jpeg_source_mgr;
@@ -136,68 +199,60 @@ typedef struct jpeg_error_mgr jpeg_error_mgr;
* so we can safely cast JPEGState* -> jpeg_xxx_struct*
* and vice versa!
*/
-typedef struct {
- union {
- struct jpeg_compress_struct c;
- struct jpeg_decompress_struct d;
- struct jpeg_common_struct comm;
- } cinfo; /* NB: must be first */
- int cinfo_initialized;
-
- jpeg_error_mgr err; /* libjpeg error manager */
- JMP_BUF exit_jmpbuf; /* for catching libjpeg failures */
-
- struct jpeg_progress_mgr progress;
- /*
- * The following two members could be a union, but
- * they're small enough that it's not worth the effort.
- */
- jpeg_destination_mgr dest; /* data dest for compression */
- jpeg_source_mgr src; /* data source for decompression */
- /* private state */
- TIFF* tif; /* back link needed by some code */
- uint16 photometric; /* copy of PhotometricInterpretation */
- uint16 h_sampling; /* luminance sampling factors */
- uint16 v_sampling;
- tmsize_t bytesperline; /* decompressed bytes per scanline */
- /* pointers to intermediate buffers when processing downsampled data */
- JSAMPARRAY ds_buffer[MAX_COMPONENTS];
- int scancount; /* number of "scanlines" accumulated */
- int samplesperclump;
-
- TIFFVGetMethod vgetparent; /* super-class method */
- TIFFVSetMethod vsetparent; /* super-class method */
- TIFFPrintMethod printdir; /* super-class method */
- TIFFStripMethod defsparent; /* super-class method */
- TIFFTileMethod deftparent; /* super-class method */
- /* pseudo-tag fields */
- void* jpegtables; /* JPEGTables tag value, or NULL */
- uint32 jpegtables_length; /* number of bytes in same */
- int jpegquality; /* Compression quality level */
- int jpegcolormode; /* Auto RGB<=>YCbCr convert? */
- int jpegtablesmode; /* What to put in JPEGTables */
-
- int ycbcrsampling_fetched;
- int max_allowed_scan_number;
+typedef struct
+{
+ union
+ {
+ struct jpeg_compress_struct c;
+ struct jpeg_decompress_struct d;
+ struct jpeg_common_struct comm;
+ } cinfo; /* NB: must be first */
+ int cinfo_initialized;
+
+ jpeg_error_mgr err; /* libjpeg error manager */
+ JMP_BUF exit_jmpbuf; /* for catching libjpeg failures */
+
+ struct jpeg_progress_mgr progress;
+ /*
+ * The following two members could be a union, but
+ * they're small enough that it's not worth the effort.
+ */
+ jpeg_destination_mgr dest; /* data dest for compression */
+ jpeg_source_mgr src; /* data source for decompression */
+ /* private state */
+ TIFF *tif; /* back link needed by some code */
+ uint16_t photometric; /* copy of PhotometricInterpretation */
+ uint16_t h_sampling; /* luminance sampling factors */
+ uint16_t v_sampling;
+ tmsize_t bytesperline; /* decompressed bytes per scanline */
+ /* pointers to intermediate buffers when processing downsampled data */
+ TIFF_JSAMPARRAY ds_buffer[MAX_COMPONENTS];
+ int scancount; /* number of "scanlines" accumulated */
+ int samplesperclump;
+
+ JPEGOtherSettings otherSettings;
} JPEGState;
-#define JState(tif) ((JPEGState*)(tif)->tif_data)
+#define JState(tif) ((JPEGState *)(tif)->tif_data)
-static int JPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s);
-static int JPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s);
-static int JPEGEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s);
-static int JPEGEncodeRaw(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s);
-static int JPEGInitializeLibJPEG(TIFF * tif, int decode );
-static int DecodeRowError(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s);
+static int JPEGDecode(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s);
+static int JPEGDecodeRaw(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s);
+static int JPEGEncode(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s);
+static int JPEGEncodeRaw(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s);
+static int JPEGInitializeLibJPEG(TIFF *tif, int decode);
+static int DecodeRowError(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s);
-#define FIELD_JPEGTABLES (FIELD_CODEC+0)
+#define FIELD_JPEGTABLES (FIELD_CODEC + 0)
static const TIFFField jpegFields[] = {
- { TIFFTAG_JPEGTABLES, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_C32_UINT8, FIELD_JPEGTABLES, FALSE, TRUE, "JPEGTables", NULL },
- { TIFFTAG_JPEGQUALITY, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "", NULL },
- { TIFFTAG_JPEGCOLORMODE, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "", NULL },
- { TIFFTAG_JPEGTABLESMODE, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "", NULL }
-};
+ {TIFFTAG_JPEGTABLES, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8,
+ TIFF_SETGET_C32_UINT8, FIELD_JPEGTABLES, FALSE, TRUE, "JPEGTables", NULL},
+ {TIFFTAG_JPEGQUALITY, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
+ TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "", NULL},
+ {TIFFTAG_JPEGCOLORMODE, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
+ TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "", NULL},
+ {TIFFTAG_JPEGTABLESMODE, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
+ TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "", NULL}};
/*
* libjpeg interface layer.
@@ -213,16 +268,16 @@ static const TIFFField jpegFields[] = {
* IJG routines from jerror.c). These are used for both
* compression and decompression.
*/
-static void
-TIFFjpeg_error_exit(j_common_ptr cinfo)
+static void TIFFjpeg_error_exit(j_common_ptr cinfo)
{
- JPEGState *sp = (JPEGState *) cinfo; /* NB: cinfo assumed first */
- char buffer[JMSG_LENGTH_MAX];
+ JPEGState *sp = (JPEGState *)cinfo; /* NB: cinfo assumed first */
+ char buffer[JMSG_LENGTH_MAX];
- (*cinfo->err->format_message) (cinfo, buffer);
- TIFFErrorExt(sp->tif->tif_clientdata, "JPEGLib", "%s", buffer); /* display the error message */
- jpeg_abort(cinfo); /* clean up libjpeg state */
- LONGJMP(sp->exit_jmpbuf, 1); /* return to libtiff caller */
+ (*cinfo->err->format_message)(cinfo, buffer);
+ TIFFErrorExtR(sp->tif, "JPEGLib", "%s",
+ buffer); /* display the error message */
+ jpeg_abort(cinfo); /* clean up libjpeg state */
+ LONGJMP(sp->exit_jmpbuf, 1); /* return to libtiff caller */
}
/*
@@ -230,203 +285,216 @@ TIFFjpeg_error_exit(j_common_ptr cinfo)
* since error_exit does its own thing and trace_level
* is never set > 0.
*/
-static void
-TIFFjpeg_output_message(j_common_ptr cinfo)
+static void TIFFjpeg_output_message(j_common_ptr cinfo)
{
- char buffer[JMSG_LENGTH_MAX];
+ char buffer[JMSG_LENGTH_MAX];
- (*cinfo->err->format_message) (cinfo, buffer);
- TIFFWarningExt(((JPEGState *) cinfo)->tif->tif_clientdata, "JPEGLib", "%s", buffer);
+ (*cinfo->err->format_message)(cinfo, buffer);
+ TIFFWarningExtR(((JPEGState *)cinfo)->tif, "JPEGLib", "%s", buffer);
}
/* Avoid the risk of denial-of-service on crafted JPEGs with an insane */
/* number of scans. */
-/* See http://www.libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf */
-static void
-TIFFjpeg_progress_monitor(j_common_ptr cinfo)
+/* See
+ * http://www.libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf
+ */
+static void TIFFjpeg_progress_monitor(j_common_ptr cinfo)
{
- JPEGState *sp = (JPEGState *) cinfo; /* NB: cinfo assumed first */
+ JPEGState *sp = (JPEGState *)cinfo; /* NB: cinfo assumed first */
if (cinfo->is_decompressor)
{
- const int scan_no =
- ((j_decompress_ptr)cinfo)->input_scan_number;
- if (scan_no >= sp->max_allowed_scan_number)
+ const int scan_no = ((j_decompress_ptr)cinfo)->input_scan_number;
+ if (scan_no >= sp->otherSettings.max_allowed_scan_number)
{
- TIFFErrorExt(((JPEGState *) cinfo)->tif->tif_clientdata,
- "TIFFjpeg_progress_monitor",
- "Scan number %d exceeds maximum scans (%d). This limit "
- "can be raised through the LIBTIFF_JPEG_MAX_ALLOWED_SCAN_NUMBER "
- "environment variable.",
- scan_no, sp->max_allowed_scan_number);
-
- jpeg_abort(cinfo); /* clean up libjpeg state */
- LONGJMP(sp->exit_jmpbuf, 1); /* return to libtiff caller */
+ TIFFErrorExtR(
+ ((JPEGState *)cinfo)->tif, "TIFFjpeg_progress_monitor",
+ "Scan number %d exceeds maximum scans (%d). This limit "
+ "can be raised through the "
+ "LIBTIFF_JPEG_MAX_ALLOWED_SCAN_NUMBER "
+ "environment variable.",
+ scan_no, sp->otherSettings.max_allowed_scan_number);
+
+ jpeg_abort(cinfo); /* clean up libjpeg state */
+ LONGJMP(sp->exit_jmpbuf, 1); /* return to libtiff caller */
}
}
}
-
/*
* Interface routines. This layer of routines exists
* primarily to limit side-effects from using setjmp.
* Also, normal/error returns are converted into return
* values per libtiff practice.
*/
-#define CALLJPEG(sp, fail, op) (SETJMP((sp)->exit_jmpbuf) ? (fail) : (op))
-#define CALLVJPEG(sp, op) CALLJPEG(sp, 0, ((op),1))
+#define CALLJPEG(sp, fail, op) (SETJMP((sp)->exit_jmpbuf) ? (fail) : (op))
+#define CALLVJPEG(sp, op) CALLJPEG(sp, 0, ((op), 1))
-static int
-TIFFjpeg_create_compress(JPEGState* sp)
+static int TIFFjpeg_create_compress(JPEGState *sp)
{
- /* initialize JPEG error handling */
- sp->cinfo.c.err = jpeg_std_error(&sp->err);
- sp->err.error_exit = TIFFjpeg_error_exit;
- sp->err.output_message = TIFFjpeg_output_message;
+ /* initialize JPEG error handling */
+ sp->cinfo.c.err = jpeg_std_error(&sp->err);
+ sp->err.error_exit = TIFFjpeg_error_exit;
+ sp->err.output_message = TIFFjpeg_output_message;
- /* set client_data to avoid UMR warning from tools like Purify */
- sp->cinfo.c.client_data = NULL;
+ /* set client_data to avoid UMR warning from tools like Purify */
+ sp->cinfo.c.client_data = NULL;
- return CALLVJPEG(sp, jpeg_create_compress(&sp->cinfo.c));
+ return CALLVJPEG(sp, jpeg_create_compress(&sp->cinfo.c));
}
-static int
-TIFFjpeg_create_decompress(JPEGState* sp)
+static int TIFFjpeg_create_decompress(JPEGState *sp)
{
- /* initialize JPEG error handling */
- sp->cinfo.d.err = jpeg_std_error(&sp->err);
- sp->err.error_exit = TIFFjpeg_error_exit;
- sp->err.output_message = TIFFjpeg_output_message;
+ /* initialize JPEG error handling */
+ sp->cinfo.d.err = jpeg_std_error(&sp->err);
+ sp->err.error_exit = TIFFjpeg_error_exit;
+ sp->err.output_message = TIFFjpeg_output_message;
- /* set client_data to avoid UMR warning from tools like Purify */
- sp->cinfo.d.client_data = NULL;
+ /* set client_data to avoid UMR warning from tools like Purify */
+ sp->cinfo.d.client_data = NULL;
- return CALLVJPEG(sp, jpeg_create_decompress(&sp->cinfo.d));
+ return CALLVJPEG(sp, jpeg_create_decompress(&sp->cinfo.d));
}
-static int
-TIFFjpeg_set_defaults(JPEGState* sp)
+static int TIFFjpeg_set_defaults(JPEGState *sp)
{
- return CALLVJPEG(sp, jpeg_set_defaults(&sp->cinfo.c));
+ return CALLVJPEG(sp, jpeg_set_defaults(&sp->cinfo.c));
}
-static int
-TIFFjpeg_set_colorspace(JPEGState* sp, J_COLOR_SPACE colorspace)
+static int TIFFjpeg_set_colorspace(JPEGState *sp, J_COLOR_SPACE colorspace)
{
- return CALLVJPEG(sp, jpeg_set_colorspace(&sp->cinfo.c, colorspace));
+ return CALLVJPEG(sp, jpeg_set_colorspace(&sp->cinfo.c, colorspace));
}
-static int
-TIFFjpeg_set_quality(JPEGState* sp, int quality, boolean force_baseline)
+static int TIFFjpeg_set_quality(JPEGState *sp, int quality,
+ boolean force_baseline)
{
- return CALLVJPEG(sp,
- jpeg_set_quality(&sp->cinfo.c, quality, force_baseline));
+ return CALLVJPEG(sp,
+ jpeg_set_quality(&sp->cinfo.c, quality, force_baseline));
}
-static int
-TIFFjpeg_suppress_tables(JPEGState* sp, boolean suppress)
+static int TIFFjpeg_suppress_tables(JPEGState *sp, boolean suppress)
{
- return CALLVJPEG(sp, jpeg_suppress_tables(&sp->cinfo.c, suppress));
+ return CALLVJPEG(sp, jpeg_suppress_tables(&sp->cinfo.c, suppress));
}
-static int
-TIFFjpeg_start_compress(JPEGState* sp, boolean write_all_tables)
+static int TIFFjpeg_start_compress(JPEGState *sp, boolean write_all_tables)
{
- return CALLVJPEG(sp,
- jpeg_start_compress(&sp->cinfo.c, write_all_tables));
+ return CALLVJPEG(sp, jpeg_start_compress(&sp->cinfo.c, write_all_tables));
}
-static int
-TIFFjpeg_write_scanlines(JPEGState* sp, JSAMPARRAY scanlines, int num_lines)
+static int TIFFjpeg_write_scanlines(JPEGState *sp, TIFF_JSAMPARRAY scanlines,
+ int num_lines)
{
- return CALLJPEG(sp, -1, (int) jpeg_write_scanlines(&sp->cinfo.c,
- scanlines, (JDIMENSION) num_lines));
+#if defined(HAVE_JPEGTURBO_DUAL_MODE_8_12) && BITS_IN_JSAMPLE == 12
+ return CALLJPEG(sp, -1,
+ (int)jpeg12_write_scanlines(&sp->cinfo.c, scanlines,
+ (JDIMENSION)num_lines));
+#else
+ return CALLJPEG(sp, -1,
+ (int)jpeg_write_scanlines(&sp->cinfo.c, scanlines,
+ (JDIMENSION)num_lines));
+#endif
}
-static int
-TIFFjpeg_write_raw_data(JPEGState* sp, JSAMPIMAGE data, int num_lines)
+static int TIFFjpeg_write_raw_data(JPEGState *sp, TIFF_JSAMPIMAGE data,
+ int num_lines)
{
- return CALLJPEG(sp, -1, (int) jpeg_write_raw_data(&sp->cinfo.c,
- data, (JDIMENSION) num_lines));
+#if defined(HAVE_JPEGTURBO_DUAL_MODE_8_12) && BITS_IN_JSAMPLE == 12
+ return CALLJPEG(
+ sp, -1,
+ (int)jpeg12_write_raw_data(&sp->cinfo.c, data, (JDIMENSION)num_lines));
+#else
+ return CALLJPEG(
+ sp, -1,
+ (int)jpeg_write_raw_data(&sp->cinfo.c, data, (JDIMENSION)num_lines));
+#endif
}
-static int
-TIFFjpeg_finish_compress(JPEGState* sp)
+static int TIFFjpeg_finish_compress(JPEGState *sp)
{
- return CALLVJPEG(sp, jpeg_finish_compress(&sp->cinfo.c));
+ return CALLVJPEG(sp, jpeg_finish_compress(&sp->cinfo.c));
}
-static int
-TIFFjpeg_write_tables(JPEGState* sp)
+static int TIFFjpeg_write_tables(JPEGState *sp)
{
- return CALLVJPEG(sp, jpeg_write_tables(&sp->cinfo.c));
+ return CALLVJPEG(sp, jpeg_write_tables(&sp->cinfo.c));
}
-static int
-TIFFjpeg_read_header(JPEGState* sp, boolean require_image)
+static int TIFFjpeg_read_header(JPEGState *sp, boolean require_image)
{
- return CALLJPEG(sp, -1, jpeg_read_header(&sp->cinfo.d, require_image));
+ return CALLJPEG(sp, -1, jpeg_read_header(&sp->cinfo.d, require_image));
}
-static int
-TIFFjpeg_has_multiple_scans(JPEGState* sp)
+static int TIFFjpeg_has_multiple_scans(JPEGState *sp)
{
- return CALLJPEG(sp, 0, jpeg_has_multiple_scans(&sp->cinfo.d));
+ return CALLJPEG(sp, 0, jpeg_has_multiple_scans(&sp->cinfo.d));
}
-static int
-TIFFjpeg_start_decompress(JPEGState* sp)
+static int TIFFjpeg_start_decompress(JPEGState *sp)
{
- const char* sz_max_allowed_scan_number;
- /* progress monitor */
- sp->cinfo.d.progress = &sp->progress;
- sp->progress.progress_monitor = TIFFjpeg_progress_monitor;
- sp->max_allowed_scan_number = 100;
- sz_max_allowed_scan_number = getenv("LIBTIFF_JPEG_MAX_ALLOWED_SCAN_NUMBER");
- if( sz_max_allowed_scan_number )
- sp->max_allowed_scan_number = atoi(sz_max_allowed_scan_number);
+ const char *sz_max_allowed_scan_number;
+ /* progress monitor */
+ sp->cinfo.d.progress = &sp->progress;
+ sp->progress.progress_monitor = TIFFjpeg_progress_monitor;
+ sp->otherSettings.max_allowed_scan_number = 100;
+ sz_max_allowed_scan_number = getenv("LIBTIFF_JPEG_MAX_ALLOWED_SCAN_NUMBER");
+ if (sz_max_allowed_scan_number)
+ sp->otherSettings.max_allowed_scan_number =
+ atoi(sz_max_allowed_scan_number);
- return CALLVJPEG(sp, jpeg_start_decompress(&sp->cinfo.d));
+ return CALLVJPEG(sp, jpeg_start_decompress(&sp->cinfo.d));
}
-static int
-TIFFjpeg_read_scanlines(JPEGState* sp, JSAMPARRAY scanlines, int max_lines)
+static int TIFFjpeg_read_scanlines(JPEGState *sp, TIFF_JSAMPARRAY scanlines,
+ int max_lines)
{
- return CALLJPEG(sp, -1, (int) jpeg_read_scanlines(&sp->cinfo.d,
- scanlines, (JDIMENSION) max_lines));
+#if defined(HAVE_JPEGTURBO_DUAL_MODE_8_12) && BITS_IN_JSAMPLE == 12
+ return CALLJPEG(sp, -1,
+ (int)jpeg12_read_scanlines(&sp->cinfo.d, scanlines,
+ (JDIMENSION)max_lines));
+#else
+ return CALLJPEG(sp, -1,
+ (int)jpeg_read_scanlines(&sp->cinfo.d, scanlines,
+ (JDIMENSION)max_lines));
+#endif
}
-static int
-TIFFjpeg_read_raw_data(JPEGState* sp, JSAMPIMAGE data, int max_lines)
+static int TIFFjpeg_read_raw_data(JPEGState *sp, TIFF_JSAMPIMAGE data,
+ int max_lines)
{
- return CALLJPEG(sp, -1, (int) jpeg_read_raw_data(&sp->cinfo.d,
- data, (JDIMENSION) max_lines));
+#if defined(HAVE_JPEGTURBO_DUAL_MODE_8_12) && BITS_IN_JSAMPLE == 12
+ return CALLJPEG(
+ sp, -1,
+ (int)jpeg12_read_raw_data(&sp->cinfo.d, data, (JDIMENSION)max_lines));
+#else
+ return CALLJPEG(
+ sp, -1,
+ (int)jpeg_read_raw_data(&sp->cinfo.d, data, (JDIMENSION)max_lines));
+#endif
}
-static int
-TIFFjpeg_finish_decompress(JPEGState* sp)
+static int TIFFjpeg_finish_decompress(JPEGState *sp)
{
- return CALLJPEG(sp, -1, (int) jpeg_finish_decompress(&sp->cinfo.d));
+ return CALLJPEG(sp, -1, (int)jpeg_finish_decompress(&sp->cinfo.d));
}
-static int
-TIFFjpeg_abort(JPEGState* sp)
+static int TIFFjpeg_abort(JPEGState *sp)
{
- return CALLVJPEG(sp, jpeg_abort(&sp->cinfo.comm));
+ return CALLVJPEG(sp, jpeg_abort(&sp->cinfo.comm));
}
-static int
-TIFFjpeg_destroy(JPEGState* sp)
+static int TIFFjpeg_destroy(JPEGState *sp)
{
- return CALLVJPEG(sp, jpeg_destroy(&sp->cinfo.comm));
+ return CALLVJPEG(sp, jpeg_destroy(&sp->cinfo.comm));
}
-static JSAMPARRAY
-TIFFjpeg_alloc_sarray(JPEGState* sp, int pool_id,
- JDIMENSION samplesperrow, JDIMENSION numrows)
+static JSAMPARRAY TIFFjpeg_alloc_sarray(JPEGState *sp, int pool_id,
+ JDIMENSION samplesperrow,
+ JDIMENSION numrows)
{
- return CALLJPEG(sp, (JSAMPARRAY) NULL,
- (*sp->cinfo.comm.mem->alloc_sarray)
- (&sp->cinfo.comm, pool_id, samplesperrow, numrows));
+ return CALLJPEG(sp, (JSAMPARRAY)NULL,
+ (*sp->cinfo.comm.mem->alloc_sarray)(
+ &sp->cinfo.comm, pool_id, samplesperrow, numrows));
}
/*
@@ -435,129 +503,128 @@ TIFFjpeg_alloc_sarray(JPEGState* sp, int pool_id,
* libtiff output buffer.
*/
-static void
-std_init_destination(j_compress_ptr cinfo)
+static void std_init_destination(j_compress_ptr cinfo)
{
- JPEGState* sp = (JPEGState*) cinfo;
- TIFF* tif = sp->tif;
+ JPEGState *sp = (JPEGState *)cinfo;
+ TIFF *tif = sp->tif;
- sp->dest.next_output_byte = (JOCTET*) tif->tif_rawdata;
- sp->dest.free_in_buffer = (size_t) tif->tif_rawdatasize;
+ sp->dest.next_output_byte = (JOCTET *)tif->tif_rawdata;
+ sp->dest.free_in_buffer = (size_t)tif->tif_rawdatasize;
}
-static boolean
-std_empty_output_buffer(j_compress_ptr cinfo)
+static boolean std_empty_output_buffer(j_compress_ptr cinfo)
{
- JPEGState* sp = (JPEGState*) cinfo;
- TIFF* tif = sp->tif;
+ JPEGState *sp = (JPEGState *)cinfo;
+ TIFF *tif = sp->tif;
- /* the entire buffer has been filled */
- tif->tif_rawcc = tif->tif_rawdatasize;
+ /* the entire buffer has been filled */
+ tif->tif_rawcc = tif->tif_rawdatasize;
#ifdef IPPJ_HUFF
- /*
- * The Intel IPP performance library does not necessarily fill up
- * the whole output buffer on each pass, so only dump out the parts
- * that have been filled.
- * http://trac.osgeo.org/gdal/wiki/JpegIPP
- */
- if ( sp->dest.free_in_buffer >= 0 ) {
- tif->tif_rawcc = tif->tif_rawdatasize - sp->dest.free_in_buffer;
- }
+ /*
+ * The Intel IPP performance library does not necessarily fill up
+ * the whole output buffer on each pass, so only dump out the parts
+ * that have been filled.
+ * http://trac.osgeo.org/gdal/wiki/JpegIPP
+ */
+ if (sp->dest.free_in_buffer >= 0)
+ {
+ tif->tif_rawcc = tif->tif_rawdatasize - sp->dest.free_in_buffer;
+ }
#endif
- TIFFFlushData1(tif);
- sp->dest.next_output_byte = (JOCTET*) tif->tif_rawdata;
- sp->dest.free_in_buffer = (size_t) tif->tif_rawdatasize;
+ if (!TIFFFlushData1(tif))
+ return FALSE;
+ sp->dest.next_output_byte = (JOCTET *)tif->tif_rawdata;
+ sp->dest.free_in_buffer = (size_t)tif->tif_rawdatasize;
- return (TRUE);
+ return (TRUE);
}
-static void
-std_term_destination(j_compress_ptr cinfo)
+static void std_term_destination(j_compress_ptr cinfo)
{
- JPEGState* sp = (JPEGState*) cinfo;
- TIFF* tif = sp->tif;
+ JPEGState *sp = (JPEGState *)cinfo;
+ TIFF *tif = sp->tif;
- tif->tif_rawcp = (uint8*) sp->dest.next_output_byte;
- tif->tif_rawcc =
- tif->tif_rawdatasize - (tmsize_t) sp->dest.free_in_buffer;
- /* NB: libtiff does the final buffer flush */
+ tif->tif_rawcp = (uint8_t *)sp->dest.next_output_byte;
+ tif->tif_rawcc = tif->tif_rawdatasize - (tmsize_t)sp->dest.free_in_buffer;
+ /* NB: libtiff does the final buffer flush */
}
-static void
-TIFFjpeg_data_dest(JPEGState* sp, TIFF* tif)
+static void TIFFjpeg_data_dest(JPEGState *sp, TIFF *tif)
{
- (void) tif;
- sp->cinfo.c.dest = &sp->dest;
- sp->dest.init_destination = std_init_destination;
- sp->dest.empty_output_buffer = std_empty_output_buffer;
- sp->dest.term_destination = std_term_destination;
+ (void)tif;
+ sp->cinfo.c.dest = &sp->dest;
+ sp->dest.init_destination = std_init_destination;
+ sp->dest.empty_output_buffer = std_empty_output_buffer;
+ sp->dest.term_destination = std_term_destination;
}
/*
* Alternate destination manager for outputting to JPEGTables field.
*/
-static void
-tables_init_destination(j_compress_ptr cinfo)
+static void tables_init_destination(j_compress_ptr cinfo)
{
- JPEGState* sp = (JPEGState*) cinfo;
+ JPEGState *sp = (JPEGState *)cinfo;
- /* while building, jpegtables_length is allocated buffer size */
- sp->dest.next_output_byte = (JOCTET*) sp->jpegtables;
- sp->dest.free_in_buffer = (size_t) sp->jpegtables_length;
+ /* while building, otherSettings.jpegtables_length is allocated buffer size
+ */
+ sp->dest.next_output_byte = (JOCTET *)sp->otherSettings.jpegtables;
+ sp->dest.free_in_buffer = (size_t)sp->otherSettings.jpegtables_length;
}
-static boolean
-tables_empty_output_buffer(j_compress_ptr cinfo)
+static boolean tables_empty_output_buffer(j_compress_ptr cinfo)
{
- JPEGState* sp = (JPEGState*) cinfo;
- void* newbuf;
+ JPEGState *sp = (JPEGState *)cinfo;
+ void *newbuf;
- /* the entire buffer has been filled; enlarge it by 1000 bytes */
- newbuf = _TIFFrealloc((void*) sp->jpegtables,
- (tmsize_t) (sp->jpegtables_length + 1000));
- if (newbuf == NULL)
- ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 100);
- sp->dest.next_output_byte = (JOCTET*) newbuf + sp->jpegtables_length;
- sp->dest.free_in_buffer = (size_t) 1000;
- sp->jpegtables = newbuf;
- sp->jpegtables_length += 1000;
- return (TRUE);
+ /* the entire buffer has been filled; enlarge it by 1000 bytes */
+ newbuf =
+ _TIFFreallocExt(sp->tif, (void *)sp->otherSettings.jpegtables,
+ (tmsize_t)(sp->otherSettings.jpegtables_length + 1000));
+ if (newbuf == NULL)
+ ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 100);
+ sp->dest.next_output_byte =
+ (JOCTET *)newbuf + sp->otherSettings.jpegtables_length;
+ sp->dest.free_in_buffer = (size_t)1000;
+ sp->otherSettings.jpegtables = newbuf;
+ sp->otherSettings.jpegtables_length += 1000;
+ return (TRUE);
}
-static void
-tables_term_destination(j_compress_ptr cinfo)
+static void tables_term_destination(j_compress_ptr cinfo)
{
- JPEGState* sp = (JPEGState*) cinfo;
+ JPEGState *sp = (JPEGState *)cinfo;
- /* set tables length to number of bytes actually emitted */
- sp->jpegtables_length -= (uint32) sp->dest.free_in_buffer;
+ /* set tables length to number of bytes actually emitted */
+ sp->otherSettings.jpegtables_length -= (uint32_t)sp->dest.free_in_buffer;
}
-static int
-TIFFjpeg_tables_dest(JPEGState* sp, TIFF* tif)
-{
- (void) tif;
- /*
- * Allocate a working buffer for building tables.
- * Initial size is 1000 bytes, which is usually adequate.
- */
- if (sp->jpegtables)
- _TIFFfree(sp->jpegtables);
- sp->jpegtables_length = 1000;
- sp->jpegtables = (void*) _TIFFmalloc((tmsize_t) sp->jpegtables_length);
- if (sp->jpegtables == NULL) {
- sp->jpegtables_length = 0;
- TIFFErrorExt(sp->tif->tif_clientdata, "TIFFjpeg_tables_dest", "No space for JPEGTables");
- return (0);
- }
- sp->cinfo.c.dest = &sp->dest;
- sp->dest.init_destination = tables_init_destination;
- sp->dest.empty_output_buffer = tables_empty_output_buffer;
- sp->dest.term_destination = tables_term_destination;
- return (1);
+static int TIFFjpeg_tables_dest(JPEGState *sp, TIFF *tif)
+{
+ (void)tif;
+ /*
+ * Allocate a working buffer for building tables.
+ * Initial size is 1000 bytes, which is usually adequate.
+ */
+ if (sp->otherSettings.jpegtables)
+ _TIFFfreeExt(tif, sp->otherSettings.jpegtables);
+ sp->otherSettings.jpegtables_length = 1000;
+ sp->otherSettings.jpegtables = (void *)_TIFFmallocExt(
+ tif, (tmsize_t)sp->otherSettings.jpegtables_length);
+ if (sp->otherSettings.jpegtables == NULL)
+ {
+ sp->otherSettings.jpegtables_length = 0;
+ TIFFErrorExtR(sp->tif, "TIFFjpeg_tables_dest",
+ "No space for JPEGTables");
+ return (0);
+ }
+ sp->cinfo.c.dest = &sp->dest;
+ sp->dest.init_destination = tables_init_destination;
+ sp->dest.empty_output_buffer = tables_empty_output_buffer;
+ sp->dest.term_destination = tables_term_destination;
+ return (1);
}
/*
@@ -565,86 +632,86 @@ TIFFjpeg_tables_dest(JPEGState* sp, TIFF* tif)
* These routines supply compressed data to libjpeg.
*/
-static void
-std_init_source(j_decompress_ptr cinfo)
+static void std_init_source(j_decompress_ptr cinfo)
{
- JPEGState* sp = (JPEGState*) cinfo;
- TIFF* tif = sp->tif;
+ JPEGState *sp = (JPEGState *)cinfo;
+ TIFF *tif = sp->tif;
- sp->src.next_input_byte = (const JOCTET*) tif->tif_rawdata;
- sp->src.bytes_in_buffer = (size_t) tif->tif_rawcc;
+ sp->src.next_input_byte = (const JOCTET *)tif->tif_rawdata;
+ sp->src.bytes_in_buffer = (size_t)tif->tif_rawcc;
}
-static boolean
-std_fill_input_buffer(j_decompress_ptr cinfo)
+static boolean std_fill_input_buffer(j_decompress_ptr cinfo)
{
- JPEGState* sp = (JPEGState* ) cinfo;
- static const JOCTET dummy_EOI[2] = { 0xFF, JPEG_EOI };
+ JPEGState *sp = (JPEGState *)cinfo;
+ static const JOCTET dummy_EOI[2] = {0xFF, JPEG_EOI};
#ifdef IPPJ_HUFF
- /*
- * The Intel IPP performance library does not necessarily read the whole
- * input buffer in one pass, so it is possible to get here with data
- * yet to read.
- *
- * We just return without doing anything, until the entire buffer has
- * been read.
- * http://trac.osgeo.org/gdal/wiki/JpegIPP
- */
- if( sp->src.bytes_in_buffer > 0 ) {
- return (TRUE);
- }
+ /*
+ * The Intel IPP performance library does not necessarily read the whole
+ * input buffer in one pass, so it is possible to get here with data
+ * yet to read.
+ *
+ * We just return without doing anything, until the entire buffer has
+ * been read.
+ * http://trac.osgeo.org/gdal/wiki/JpegIPP
+ */
+ if (sp->src.bytes_in_buffer > 0)
+ {
+ return (TRUE);
+ }
#endif
- /*
- * Normally the whole strip/tile is read and so we don't need to do
- * a fill. In the case of CHUNKY_STRIP_READ_SUPPORT we might not have
- * all the data, but the rawdata is refreshed between scanlines and
- * we push this into the io machinery in JPEGDecode().
- * http://trac.osgeo.org/gdal/ticket/3894
- */
-
- WARNMS(cinfo, JWRN_JPEG_EOF);
- /* insert a fake EOI marker */
- sp->src.next_input_byte = dummy_EOI;
- sp->src.bytes_in_buffer = 2;
- return (TRUE);
+ /*
+ * Normally the whole strip/tile is read and so we don't need to do
+ * a fill. In the case of CHUNKY_STRIP_READ_SUPPORT we might not have
+ * all the data, but the rawdata is refreshed between scanlines and
+ * we push this into the io machinery in JPEGDecode().
+ * http://trac.osgeo.org/gdal/ticket/3894
+ */
+
+ WARNMS(cinfo, JWRN_JPEG_EOF);
+ /* insert a fake EOI marker */
+ sp->src.next_input_byte = dummy_EOI;
+ sp->src.bytes_in_buffer = 2;
+ return (TRUE);
}
-static void
-std_skip_input_data(j_decompress_ptr cinfo, long num_bytes)
+static void std_skip_input_data(j_decompress_ptr cinfo, long num_bytes)
{
- JPEGState* sp = (JPEGState*) cinfo;
+ JPEGState *sp = (JPEGState *)cinfo;
- if (num_bytes > 0) {
- if ((size_t)num_bytes > sp->src.bytes_in_buffer) {
- /* oops, buffer overrun */
- (void) std_fill_input_buffer(cinfo);
- } else {
- sp->src.next_input_byte += (size_t) num_bytes;
- sp->src.bytes_in_buffer -= (size_t) num_bytes;
- }
- }
+ if (num_bytes > 0)
+ {
+ if ((size_t)num_bytes > sp->src.bytes_in_buffer)
+ {
+ /* oops, buffer overrun */
+ (void)std_fill_input_buffer(cinfo);
+ }
+ else
+ {
+ sp->src.next_input_byte += (size_t)num_bytes;
+ sp->src.bytes_in_buffer -= (size_t)num_bytes;
+ }
+ }
}
-static void
-std_term_source(j_decompress_ptr cinfo)
+static void std_term_source(j_decompress_ptr cinfo)
{
- /* No work necessary here */
- (void) cinfo;
+ /* No work necessary here */
+ (void)cinfo;
}
-static void
-TIFFjpeg_data_src(JPEGState* sp)
+static void TIFFjpeg_data_src(JPEGState *sp)
{
- sp->cinfo.d.src = &sp->src;
- sp->src.init_source = std_init_source;
- sp->src.fill_input_buffer = std_fill_input_buffer;
- sp->src.skip_input_data = std_skip_input_data;
- sp->src.resync_to_restart = jpeg_resync_to_restart;
- sp->src.term_source = std_term_source;
- sp->src.bytes_in_buffer = 0; /* for safety */
- sp->src.next_input_byte = NULL;
+ sp->cinfo.d.src = &sp->src;
+ sp->src.init_source = std_init_source;
+ sp->src.fill_input_buffer = std_fill_input_buffer;
+ sp->src.skip_input_data = std_skip_input_data;
+ sp->src.resync_to_restart = jpeg_resync_to_restart;
+ sp->src.term_source = std_term_source;
+ sp->src.bytes_in_buffer = 0; /* for safety */
+ sp->src.next_input_byte = NULL;
}
/*
@@ -652,20 +719,18 @@ TIFFjpeg_data_src(JPEGState* sp)
* We can share all the code except for the init routine.
*/
-static void
-tables_init_source(j_decompress_ptr cinfo)
+static void tables_init_source(j_decompress_ptr cinfo)
{
- JPEGState* sp = (JPEGState*) cinfo;
+ JPEGState *sp = (JPEGState *)cinfo;
- sp->src.next_input_byte = (const JOCTET*) sp->jpegtables;
- sp->src.bytes_in_buffer = (size_t) sp->jpegtables_length;
+ sp->src.next_input_byte = (const JOCTET *)sp->otherSettings.jpegtables;
+ sp->src.bytes_in_buffer = (size_t)sp->otherSettings.jpegtables_length;
}
-static void
-TIFFjpeg_tables_src(JPEGState* sp)
+static void TIFFjpeg_tables_src(JPEGState *sp)
{
- TIFFjpeg_data_src(sp);
- sp->src.init_source = tables_init_source;
+ TIFFjpeg_data_src(sp);
+ sp->src.init_source = tables_init_source;
}
/*
@@ -675,31 +740,28 @@ TIFFjpeg_tables_src(JPEGState* sp)
* when done with strip/tile.
* This is also a handy place to compute samplesperclump, bytesperline.
*/
-static int
-alloc_downsampled_buffers(TIFF* tif, jpeg_component_info* comp_info,
- int num_components)
-{
- JPEGState* sp = JState(tif);
- int ci;
- jpeg_component_info* compptr;
- JSAMPARRAY buf;
- int samples_per_clump = 0;
-
- for (ci = 0, compptr = comp_info; ci < num_components;
- ci++, compptr++) {
- samples_per_clump += compptr->h_samp_factor *
- compptr->v_samp_factor;
- buf = TIFFjpeg_alloc_sarray(sp, JPOOL_IMAGE,
- compptr->width_in_blocks * DCTSIZE,
- (JDIMENSION) (compptr->v_samp_factor*DCTSIZE));
- if (buf == NULL)
- return (0);
- sp->ds_buffer[ci] = buf;
- }
- sp->samplesperclump = samples_per_clump;
- return (1);
-}
+static int alloc_downsampled_buffers(TIFF *tif, jpeg_component_info *comp_info,
+ int num_components)
+{
+ JPEGState *sp = JState(tif);
+ int ci;
+ jpeg_component_info *compptr;
+ TIFF_JSAMPARRAY buf;
+ int samples_per_clump = 0;
+ for (ci = 0, compptr = comp_info; ci < num_components; ci++, compptr++)
+ {
+ samples_per_clump += compptr->h_samp_factor * compptr->v_samp_factor;
+ buf = (TIFF_JSAMPARRAY)TIFFjpeg_alloc_sarray(
+ sp, JPOOL_IMAGE, compptr->width_in_blocks * DCTSIZE,
+ (JDIMENSION)(compptr->v_samp_factor * DCTSIZE));
+ if (buf == NULL)
+ return (0);
+ sp->ds_buffer[ci] = buf;
+ }
+ sp->samplesperclump = samples_per_clump;
+ return (1);
+}
/*
* JPEG Decoding.
@@ -721,328 +783,367 @@ alloc_downsampled_buffers(TIFF* tif, jpeg_component_info* comp_info,
#define JPEG_MARKER_COM 0xFE
struct JPEGFixupTagsSubsamplingData
{
- TIFF* tif;
- void* buffer;
- uint32 buffersize;
- uint8* buffercurrentbyte;
- uint32 bufferbytesleft;
- uint64 fileoffset;
- uint64 filebytesleft;
- uint8 filepositioned;
+ TIFF *tif;
+ void *buffer;
+ uint32_t buffersize;
+ uint8_t *buffercurrentbyte;
+ uint32_t bufferbytesleft;
+ uint64_t fileoffset;
+ uint64_t filebytesleft;
+ uint8_t filepositioned;
};
-static void JPEGFixupTagsSubsampling(TIFF* tif);
-static int JPEGFixupTagsSubsamplingSec(struct JPEGFixupTagsSubsamplingData* data);
-static int JPEGFixupTagsSubsamplingReadByte(struct JPEGFixupTagsSubsamplingData* data, uint8* result);
-static int JPEGFixupTagsSubsamplingReadWord(struct JPEGFixupTagsSubsamplingData* data, uint16* result);
-static void JPEGFixupTagsSubsamplingSkip(struct JPEGFixupTagsSubsamplingData* data, uint16 skiplength);
+static void JPEGFixupTagsSubsampling(TIFF *tif);
+static int
+JPEGFixupTagsSubsamplingSec(struct JPEGFixupTagsSubsamplingData *data);
+static int
+JPEGFixupTagsSubsamplingReadByte(struct JPEGFixupTagsSubsamplingData *data,
+ uint8_t *result);
+static int
+JPEGFixupTagsSubsamplingReadWord(struct JPEGFixupTagsSubsamplingData *data,
+ uint16_t *result);
+static void
+JPEGFixupTagsSubsamplingSkip(struct JPEGFixupTagsSubsamplingData *data,
+ uint16_t skiplength);
#endif
-static int
-JPEGFixupTags(TIFF* tif)
+static int JPEGFixupTags(TIFF *tif)
{
#ifdef CHECK_JPEG_YCBCR_SUBSAMPLING
- JPEGState* sp = JState(tif);
- if ((tif->tif_dir.td_photometric==PHOTOMETRIC_YCBCR)&&
- (tif->tif_dir.td_planarconfig==PLANARCONFIG_CONTIG)&&
- (tif->tif_dir.td_samplesperpixel==3) &&
- !sp->ycbcrsampling_fetched)
- JPEGFixupTagsSubsampling(tif);
+ JPEGState *sp = JState(tif);
+ if ((tif->tif_dir.td_photometric == PHOTOMETRIC_YCBCR) &&
+ (tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG) &&
+ (tif->tif_dir.td_samplesperpixel == 3) &&
+ !sp->otherSettings.ycbcrsampling_fetched)
+ JPEGFixupTagsSubsampling(tif);
#endif
-
- return(1);
+
+ return (1);
}
#ifdef CHECK_JPEG_YCBCR_SUBSAMPLING
-static void
-JPEGFixupTagsSubsampling(TIFF* tif)
-{
- /*
- * Some JPEG-in-TIFF produces do not emit the YCBCRSUBSAMPLING values in
- * the TIFF tags, but still use non-default (2,2) values within the jpeg
- * data stream itself. In order for TIFF applications to work properly
- * - for instance to get the strip buffer size right - it is imperative
- * that the subsampling be available before we start reading the image
- * data normally. This function will attempt to analyze the first strip in
- * order to get the sampling values from the jpeg data stream.
- *
- * Note that JPEGPreDeocode() will produce a fairly loud warning when the
- * discovered sampling does not match the default sampling (2,2) or whatever
- * was actually in the tiff tags.
- *
- * See the bug in bugzilla for details:
- *
- * http://bugzilla.remotesensing.org/show_bug.cgi?id=168
- *
- * Frank Warmerdam, July 2002
- * Joris Van Damme, May 2007
- */
- static const char module[] = "JPEGFixupTagsSubsampling";
- struct JPEGFixupTagsSubsamplingData m;
- uint64 fileoffset = TIFFGetStrileOffset(tif, 0);
-
- if( fileoffset == 0 )
- {
- /* Do not even try to check if the first strip/tile does not
- yet exist, as occurs when GDAL has created a new NULL file
- for instance. */
- return;
- }
+static void JPEGFixupTagsSubsampling(TIFF *tif)
+{
+ /*
+ * Some JPEG-in-TIFF produces do not emit the YCBCRSUBSAMPLING values in
+ * the TIFF tags, but still use non-default (2,2) values within the jpeg
+ * data stream itself. In order for TIFF applications to work properly
+ * - for instance to get the strip buffer size right - it is imperative
+ * that the subsampling be available before we start reading the image
+ * data normally. This function will attempt to analyze the first strip in
+ * order to get the sampling values from the jpeg data stream.
+ *
+ * Note that JPEGPreDeocode() will produce a fairly loud warning when the
+ * discovered sampling does not match the default sampling (2,2) or whatever
+ * was actually in the tiff tags.
+ *
+ * See the bug in bugzilla for details:
+ *
+ * http://bugzilla.remotesensing.org/show_bug.cgi?id=168
+ *
+ * Frank Warmerdam, July 2002
+ * Joris Van Damme, May 2007
+ */
+ static const char module[] = "JPEGFixupTagsSubsampling";
+ struct JPEGFixupTagsSubsamplingData m;
+ uint64_t fileoffset = TIFFGetStrileOffset(tif, 0);
+
+ if (fileoffset == 0)
+ {
+ /* Do not even try to check if the first strip/tile does not
+ yet exist, as occurs when GDAL has created a new NULL file
+ for instance. */
+ return;
+ }
- m.tif=tif;
- m.buffersize=2048;
- m.buffer=_TIFFmalloc(m.buffersize);
- if (m.buffer==NULL)
- {
- TIFFWarningExt(tif->tif_clientdata,module,
- "Unable to allocate memory for auto-correcting of subsampling values; auto-correcting skipped");
- return;
- }
- m.buffercurrentbyte=NULL;
- m.bufferbytesleft=0;
- m.fileoffset=fileoffset;
- m.filepositioned=0;
- m.filebytesleft=TIFFGetStrileByteCount(tif, 0);
- if (!JPEGFixupTagsSubsamplingSec(&m))
- TIFFWarningExt(tif->tif_clientdata,module,
- "Unable to auto-correct subsampling values, likely corrupt JPEG compressed data in first strip/tile; auto-correcting skipped");
- _TIFFfree(m.buffer);
+ m.tif = tif;
+ m.buffersize = 2048;
+ m.buffer = _TIFFmallocExt(tif, m.buffersize);
+ if (m.buffer == NULL)
+ {
+ TIFFWarningExtR(tif, module,
+ "Unable to allocate memory for auto-correcting of "
+ "subsampling values; auto-correcting skipped");
+ return;
+ }
+ m.buffercurrentbyte = NULL;
+ m.bufferbytesleft = 0;
+ m.fileoffset = fileoffset;
+ m.filepositioned = 0;
+ m.filebytesleft = TIFFGetStrileByteCount(tif, 0);
+ if (!JPEGFixupTagsSubsamplingSec(&m))
+ TIFFWarningExtR(
+ tif, module,
+ "Unable to auto-correct subsampling values, likely corrupt JPEG "
+ "compressed data in first strip/tile; auto-correcting skipped");
+ _TIFFfreeExt(tif, m.buffer);
}
static int
-JPEGFixupTagsSubsamplingSec(struct JPEGFixupTagsSubsamplingData* data)
-{
- static const char module[] = "JPEGFixupTagsSubsamplingSec";
- uint8 m;
- while (1)
- {
- while (1)
- {
- if (!JPEGFixupTagsSubsamplingReadByte(data,&m))
- return(0);
- if (m==255)
- break;
- }
- while (1)
- {
- if (!JPEGFixupTagsSubsamplingReadByte(data,&m))
- return(0);
- if (m!=255)
- break;
- }
- switch (m)
- {
- case JPEG_MARKER_SOI:
- /* this type of marker has no data and should be skipped */
- break;
- case JPEG_MARKER_COM:
- case JPEG_MARKER_APP0:
- case JPEG_MARKER_APP0+1:
- case JPEG_MARKER_APP0+2:
- case JPEG_MARKER_APP0+3:
- case JPEG_MARKER_APP0+4:
- case JPEG_MARKER_APP0+5:
- case JPEG_MARKER_APP0+6:
- case JPEG_MARKER_APP0+7:
- case JPEG_MARKER_APP0+8:
- case JPEG_MARKER_APP0+9:
- case JPEG_MARKER_APP0+10:
- case JPEG_MARKER_APP0+11:
- case JPEG_MARKER_APP0+12:
- case JPEG_MARKER_APP0+13:
- case JPEG_MARKER_APP0+14:
- case JPEG_MARKER_APP0+15:
- case JPEG_MARKER_DQT:
- case JPEG_MARKER_SOS:
- case JPEG_MARKER_DHT:
- case JPEG_MARKER_DRI:
- /* this type of marker has data, but it has no use to us and should be skipped */
- {
- uint16 n;
- if (!JPEGFixupTagsSubsamplingReadWord(data,&n))
- return(0);
- if (n<2)
- return(0);
- n-=2;
- if (n>0)
- JPEGFixupTagsSubsamplingSkip(data,n);
- }
- break;
- case JPEG_MARKER_SOF0: /* Baseline sequential Huffman */
- case JPEG_MARKER_SOF1: /* Extended sequential Huffman */
- case JPEG_MARKER_SOF2: /* Progressive Huffman: normally not allowed by TechNote, but that doesn't hurt supporting it */
- case JPEG_MARKER_SOF9: /* Extended sequential arithmetic */
- case JPEG_MARKER_SOF10: /* Progressive arithmetic: normally not allowed by TechNote, but that doesn't hurt supporting it */
- /* this marker contains the subsampling factors we're scanning for */
- {
- uint16 n;
- uint16 o;
- uint8 p;
- uint8 ph,pv;
- if (!JPEGFixupTagsSubsamplingReadWord(data,&n))
- return(0);
- if (n!=8+data->tif->tif_dir.td_samplesperpixel*3)
- return(0);
- JPEGFixupTagsSubsamplingSkip(data,7);
- if (!JPEGFixupTagsSubsamplingReadByte(data,&p))
- return(0);
- ph=(p>>4);
- pv=(p&15);
- JPEGFixupTagsSubsamplingSkip(data,1);
- for (o=1; o<data->tif->tif_dir.td_samplesperpixel; o++)
- {
- JPEGFixupTagsSubsamplingSkip(data,1);
- if (!JPEGFixupTagsSubsamplingReadByte(data,&p))
- return(0);
- if (p!=0x11)
- {
- TIFFWarningExt(data->tif->tif_clientdata,module,
- "Subsampling values inside JPEG compressed data have no TIFF equivalent, auto-correction of TIFF subsampling values failed");
- return(1);
- }
- JPEGFixupTagsSubsamplingSkip(data,1);
- }
- if (((ph!=1)&&(ph!=2)&&(ph!=4))||((pv!=1)&&(pv!=2)&&(pv!=4)))
- {
- TIFFWarningExt(data->tif->tif_clientdata,module,
- "Subsampling values inside JPEG compressed data have no TIFF equivalent, auto-correction of TIFF subsampling values failed");
- return(1);
- }
- if ((ph!=data->tif->tif_dir.td_ycbcrsubsampling[0])||(pv!=data->tif->tif_dir.td_ycbcrsubsampling[1]))
- {
- TIFFWarningExt(data->tif->tif_clientdata,module,
- "Auto-corrected former TIFF subsampling values [%d,%d] to match subsampling values inside JPEG compressed data [%d,%d]",
- (int)data->tif->tif_dir.td_ycbcrsubsampling[0],
- (int)data->tif->tif_dir.td_ycbcrsubsampling[1],
- (int)ph,(int)pv);
- data->tif->tif_dir.td_ycbcrsubsampling[0]=ph;
- data->tif->tif_dir.td_ycbcrsubsampling[1]=pv;
- }
- }
- return(1);
- default:
- return(0);
- }
- }
+JPEGFixupTagsSubsamplingSec(struct JPEGFixupTagsSubsamplingData *data)
+{
+ static const char module[] = "JPEGFixupTagsSubsamplingSec";
+ uint8_t m;
+ while (1)
+ {
+ while (1)
+ {
+ if (!JPEGFixupTagsSubsamplingReadByte(data, &m))
+ return (0);
+ if (m == 255)
+ break;
+ }
+ while (1)
+ {
+ if (!JPEGFixupTagsSubsamplingReadByte(data, &m))
+ return (0);
+ if (m != 255)
+ break;
+ }
+ switch (m)
+ {
+ case JPEG_MARKER_SOI:
+ /* this type of marker has no data and should be skipped */
+ break;
+ case JPEG_MARKER_COM:
+ case JPEG_MARKER_APP0:
+ case JPEG_MARKER_APP0 + 1:
+ case JPEG_MARKER_APP0 + 2:
+ case JPEG_MARKER_APP0 + 3:
+ case JPEG_MARKER_APP0 + 4:
+ case JPEG_MARKER_APP0 + 5:
+ case JPEG_MARKER_APP0 + 6:
+ case JPEG_MARKER_APP0 + 7:
+ case JPEG_MARKER_APP0 + 8:
+ case JPEG_MARKER_APP0 + 9:
+ case JPEG_MARKER_APP0 + 10:
+ case JPEG_MARKER_APP0 + 11:
+ case JPEG_MARKER_APP0 + 12:
+ case JPEG_MARKER_APP0 + 13:
+ case JPEG_MARKER_APP0 + 14:
+ case JPEG_MARKER_APP0 + 15:
+ case JPEG_MARKER_DQT:
+ case JPEG_MARKER_SOS:
+ case JPEG_MARKER_DHT:
+ case JPEG_MARKER_DRI:
+ /* this type of marker has data, but it has no use to us and
+ * should be skipped */
+ {
+ uint16_t n;
+ if (!JPEGFixupTagsSubsamplingReadWord(data, &n))
+ return (0);
+ if (n < 2)
+ return (0);
+ n -= 2;
+ if (n > 0)
+ JPEGFixupTagsSubsamplingSkip(data, n);
+ }
+ break;
+ case JPEG_MARKER_SOF0: /* Baseline sequential Huffman */
+ case JPEG_MARKER_SOF1: /* Extended sequential Huffman */
+ case JPEG_MARKER_SOF2: /* Progressive Huffman: normally not allowed
+ by TechNote, but that doesn't hurt
+ supporting it */
+ case JPEG_MARKER_SOF9: /* Extended sequential arithmetic */
+ case JPEG_MARKER_SOF10: /* Progressive arithmetic: normally not
+ allowed by TechNote, but that doesn't
+ hurt supporting it */
+ /* this marker contains the subsampling factors we're scanning
+ * for */
+ {
+ uint16_t n;
+ uint16_t o;
+ uint8_t p;
+ uint8_t ph, pv;
+ if (!JPEGFixupTagsSubsamplingReadWord(data, &n))
+ return (0);
+ if (n != 8 + data->tif->tif_dir.td_samplesperpixel * 3)
+ return (0);
+ JPEGFixupTagsSubsamplingSkip(data, 7);
+ if (!JPEGFixupTagsSubsamplingReadByte(data, &p))
+ return (0);
+ ph = (p >> 4);
+ pv = (p & 15);
+ JPEGFixupTagsSubsamplingSkip(data, 1);
+ for (o = 1; o < data->tif->tif_dir.td_samplesperpixel; o++)
+ {
+ JPEGFixupTagsSubsamplingSkip(data, 1);
+ if (!JPEGFixupTagsSubsamplingReadByte(data, &p))
+ return (0);
+ if (p != 0x11)
+ {
+ TIFFWarningExtR(data->tif, module,
+ "Subsampling values inside JPEG "
+ "compressed data "
+ "have no TIFF equivalent, "
+ "auto-correction of TIFF "
+ "subsampling values failed");
+ return (1);
+ }
+ JPEGFixupTagsSubsamplingSkip(data, 1);
+ }
+ if (((ph != 1) && (ph != 2) && (ph != 4)) ||
+ ((pv != 1) && (pv != 2) && (pv != 4)))
+ {
+ TIFFWarningExtR(data->tif, module,
+ "Subsampling values inside JPEG "
+ "compressed data have no TIFF "
+ "equivalent, auto-correction of TIFF "
+ "subsampling values failed");
+ return (1);
+ }
+ if ((ph != data->tif->tif_dir.td_ycbcrsubsampling[0]) ||
+ (pv != data->tif->tif_dir.td_ycbcrsubsampling[1]))
+ {
+ TIFFWarningExtR(
+ data->tif, module,
+ "Auto-corrected former TIFF subsampling values "
+ "[%" PRIu16 ",%" PRIu16
+ "] to match subsampling values inside JPEG "
+ "compressed data [%" PRIu8 ",%" PRIu8 "]",
+ data->tif->tif_dir.td_ycbcrsubsampling[0],
+ data->tif->tif_dir.td_ycbcrsubsampling[1], ph, pv);
+ data->tif->tif_dir.td_ycbcrsubsampling[0] = ph;
+ data->tif->tif_dir.td_ycbcrsubsampling[1] = pv;
+ }
+ }
+ return (1);
+ default:
+ return (0);
+ }
+ }
}
static int
-JPEGFixupTagsSubsamplingReadByte(struct JPEGFixupTagsSubsamplingData* data, uint8* result)
-{
- if (data->bufferbytesleft==0)
- {
- uint32 m;
- if (data->filebytesleft==0)
- return(0);
- if (!data->filepositioned)
- {
- TIFFSeekFile(data->tif,data->fileoffset,SEEK_SET);
- data->filepositioned=1;
- }
- m=data->buffersize;
- if ((uint64)m>data->filebytesleft)
- m=(uint32)data->filebytesleft;
- assert(m<0x80000000UL);
- if (TIFFReadFile(data->tif,data->buffer,(tmsize_t)m)!=(tmsize_t)m)
- return(0);
- data->buffercurrentbyte=data->buffer;
- data->bufferbytesleft=m;
- data->fileoffset+=m;
- data->filebytesleft-=m;
- }
- *result=*data->buffercurrentbyte;
- data->buffercurrentbyte++;
- data->bufferbytesleft--;
- return(1);
+JPEGFixupTagsSubsamplingReadByte(struct JPEGFixupTagsSubsamplingData *data,
+ uint8_t *result)
+{
+ if (data->bufferbytesleft == 0)
+ {
+ uint32_t m;
+ if (data->filebytesleft == 0)
+ return (0);
+ if (!data->filepositioned)
+ {
+ if (TIFFSeekFile(data->tif, data->fileoffset, SEEK_SET) ==
+ (toff_t)-1)
+ {
+ return 0;
+ }
+ data->filepositioned = 1;
+ }
+ m = data->buffersize;
+ if ((uint64_t)m > data->filebytesleft)
+ m = (uint32_t)data->filebytesleft;
+ assert(m < 0x80000000UL);
+ if (TIFFReadFile(data->tif, data->buffer, (tmsize_t)m) != (tmsize_t)m)
+ return (0);
+ data->buffercurrentbyte = data->buffer;
+ data->bufferbytesleft = m;
+ data->fileoffset += m;
+ data->filebytesleft -= m;
+ }
+ *result = *data->buffercurrentbyte;
+ data->buffercurrentbyte++;
+ data->bufferbytesleft--;
+ return (1);
}
static int
-JPEGFixupTagsSubsamplingReadWord(struct JPEGFixupTagsSubsamplingData* data, uint16* result)
+JPEGFixupTagsSubsamplingReadWord(struct JPEGFixupTagsSubsamplingData *data,
+ uint16_t *result)
{
- uint8 ma;
- uint8 mb;
- if (!JPEGFixupTagsSubsamplingReadByte(data,&ma))
- return(0);
- if (!JPEGFixupTagsSubsamplingReadByte(data,&mb))
- return(0);
- *result=(ma<<8)|mb;
- return(1);
+ uint8_t ma;
+ uint8_t mb;
+ if (!JPEGFixupTagsSubsamplingReadByte(data, &ma))
+ return (0);
+ if (!JPEGFixupTagsSubsamplingReadByte(data, &mb))
+ return (0);
+ *result = (ma << 8) | mb;
+ return (1);
}
static void
-JPEGFixupTagsSubsamplingSkip(struct JPEGFixupTagsSubsamplingData* data, uint16 skiplength)
-{
- if ((uint32)skiplength<=data->bufferbytesleft)
- {
- data->buffercurrentbyte+=skiplength;
- data->bufferbytesleft-=skiplength;
- }
- else
- {
- uint16 m;
- m=(uint16)(skiplength-data->bufferbytesleft);
- if (m<=data->filebytesleft)
- {
- data->bufferbytesleft=0;
- data->fileoffset+=m;
- data->filebytesleft-=m;
- data->filepositioned=0;
- }
- else
- {
- data->bufferbytesleft=0;
- data->filebytesleft=0;
- }
- }
+JPEGFixupTagsSubsamplingSkip(struct JPEGFixupTagsSubsamplingData *data,
+ uint16_t skiplength)
+{
+ if ((uint32_t)skiplength <= data->bufferbytesleft)
+ {
+ data->buffercurrentbyte += skiplength;
+ data->bufferbytesleft -= skiplength;
+ }
+ else
+ {
+ uint16_t m;
+ m = (uint16_t)(skiplength - data->bufferbytesleft);
+ if (m <= data->filebytesleft)
+ {
+ data->bufferbytesleft = 0;
+ data->fileoffset += m;
+ data->filebytesleft -= m;
+ data->filepositioned = 0;
+ }
+ else
+ {
+ data->bufferbytesleft = 0;
+ data->filebytesleft = 0;
+ }
+ }
}
#endif
-
-static int
-JPEGSetupDecode(TIFF* tif)
+static int JPEGSetupDecode(TIFF *tif)
{
- JPEGState* sp = JState(tif);
- TIFFDirectory *td = &tif->tif_dir;
+ JPEGState *sp = JState(tif);
+ TIFFDirectory *td = &tif->tif_dir;
-#if defined(JPEG_DUAL_MODE_8_12) && !defined(TIFFInitJPEG)
- if( tif->tif_dir.td_bitspersample == 12 )
- return TIFFReInitJPEG_12( tif, COMPRESSION_JPEG, 0 );
+#if defined(JPEG_DUAL_MODE_8_12) && !defined(FROM_TIF_JPEG_12)
+ if (tif->tif_dir.td_bitspersample == 12)
+ {
+ /* We pass a pointer to a copy of otherSettings, since */
+ /* TIFFReInitJPEG_12() will clear sp */
+ JPEGOtherSettings savedOtherSettings = sp->otherSettings;
+ return TIFFReInitJPEG_12(tif, &savedOtherSettings, COMPRESSION_JPEG, 0);
+ }
#endif
- JPEGInitializeLibJPEG( tif, TRUE );
-
- assert(sp != NULL);
- assert(sp->cinfo.comm.is_decompressor);
-
- /* Read JPEGTables if it is present */
- if (TIFFFieldSet(tif,FIELD_JPEGTABLES)) {
- TIFFjpeg_tables_src(sp);
- if(TIFFjpeg_read_header(sp,FALSE) != JPEG_HEADER_TABLES_ONLY) {
- TIFFErrorExt(tif->tif_clientdata, "JPEGSetupDecode", "Bogus JPEGTables field");
- return (0);
- }
- }
-
- /* Grab parameters that are same for all strips/tiles */
- sp->photometric = td->td_photometric;
- switch (sp->photometric) {
- case PHOTOMETRIC_YCBCR:
- sp->h_sampling = td->td_ycbcrsubsampling[0];
- sp->v_sampling = td->td_ycbcrsubsampling[1];
- break;
- default:
- /* TIFF 6.0 forbids subsampling of all other color spaces */
- sp->h_sampling = 1;
- sp->v_sampling = 1;
- break;
- }
-
- /* Set up for reading normal data */
- TIFFjpeg_data_src(sp);
- tif->tif_postdecode = _TIFFNoPostDecode; /* override byte swapping */
- return (1);
+ JPEGInitializeLibJPEG(tif, TRUE);
+
+ assert(sp != NULL);
+ assert(sp->cinfo.comm.is_decompressor);
+
+ /* Read JPEGTables if it is present */
+ if (TIFFFieldSet(tif, FIELD_JPEGTABLES))
+ {
+ TIFFjpeg_tables_src(sp);
+ if (TIFFjpeg_read_header(sp, FALSE) != JPEG_HEADER_TABLES_ONLY)
+ {
+ TIFFErrorExtR(tif, "JPEGSetupDecode", "Bogus JPEGTables field");
+ return (0);
+ }
+ }
+
+ /* Grab parameters that are same for all strips/tiles */
+ sp->photometric = td->td_photometric;
+ switch (sp->photometric)
+ {
+ case PHOTOMETRIC_YCBCR:
+ sp->h_sampling = td->td_ycbcrsubsampling[0];
+ sp->v_sampling = td->td_ycbcrsubsampling[1];
+ break;
+ default:
+ /* TIFF 6.0 forbids subsampling of all other color spaces */
+ sp->h_sampling = 1;
+ sp->v_sampling = 1;
+ break;
+ }
+
+ /* Set up for reading normal data */
+ TIFFjpeg_data_src(sp);
+ tif->tif_postdecode = _TIFFNoPostDecode; /* override byte swapping */
+ return (1);
}
/* Returns 1 if the full strip should be read, even when doing scanline per */
@@ -1052,14 +1153,14 @@ JPEGSetupDecode(TIFF* tif)
/* Only reads tif->tif_dir.td_bitspersample, tif->tif_rawdata and */
/* tif->tif_rawcc members. */
/* Can be called independently of the usual setup/predecode/decode states */
-int TIFFJPEGIsFullStripRequired(TIFF* tif)
+int TIFFJPEGIsFullStripRequired(TIFF *tif)
{
int ret;
JPEGState state;
-#if defined(JPEG_DUAL_MODE_8_12) && !defined(TIFFJPEGIsFullStripRequired)
- if( tif->tif_dir.td_bitspersample == 12 )
- return TIFFJPEGIsFullStripRequired_12( tif );
+#if defined(JPEG_DUAL_MODE_8_12) && !defined(FROM_TIF_JPEG_12)
+ if (tif->tif_dir.td_bitspersample == 12)
+ return TIFFJPEGIsFullStripRequired_12(tif);
#endif
memset(&state, 0, sizeof(JPEGState));
@@ -1084,231 +1185,271 @@ int TIFFJPEGIsFullStripRequired(TIFF* tif)
/*
* Set up for decoding a strip or tile.
*/
-/*ARGSUSED*/ static int
-JPEGPreDecode(TIFF* tif, uint16 s)
-{
- JPEGState *sp = JState(tif);
- TIFFDirectory *td = &tif->tif_dir;
- static const char module[] = "JPEGPreDecode";
- uint32 segment_width, segment_height;
- int downsampled_output;
- int ci;
-
- assert(sp != NULL);
-
- if (sp->cinfo.comm.is_decompressor == 0)
- {
- tif->tif_setupdecode( tif );
- }
-
- assert(sp->cinfo.comm.is_decompressor);
- /*
- * Reset decoder state from any previous strip/tile,
- * in case application didn't read the whole strip.
- */
- if (!TIFFjpeg_abort(sp))
- return (0);
- /*
- * Read the header for this strip/tile.
- */
-
- if (TIFFjpeg_read_header(sp, TRUE) != JPEG_HEADER_OK)
- return (0);
-
- tif->tif_rawcp = (uint8*) sp->src.next_input_byte;
- tif->tif_rawcc = sp->src.bytes_in_buffer;
-
- /*
- * Check image parameters and set decompression parameters.
- */
- if (isTiled(tif)) {
- segment_width = td->td_tilewidth;
- segment_height = td->td_tilelength;
- sp->bytesperline = TIFFTileRowSize(tif);
- } else {
- segment_width = td->td_imagewidth;
- segment_height = td->td_imagelength - tif->tif_row;
- if (segment_height > td->td_rowsperstrip)
- segment_height = td->td_rowsperstrip;
- sp->bytesperline = TIFFScanlineSize(tif);
- }
- if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0) {
- /*
- * For PC 2, scale down the expected strip/tile size
- * to match a downsampled component
- */
- segment_width = TIFFhowmany_32(segment_width, sp->h_sampling);
- segment_height = TIFFhowmany_32(segment_height, sp->v_sampling);
- }
- if (sp->cinfo.d.image_width < segment_width ||
- sp->cinfo.d.image_height < segment_height) {
- TIFFWarningExt(tif->tif_clientdata, module,
- "Improper JPEG strip/tile size, "
- "expected %dx%d, got %dx%d",
- segment_width, segment_height,
- sp->cinfo.d.image_width,
- sp->cinfo.d.image_height);
- }
- if( sp->cinfo.d.image_width == segment_width &&
- sp->cinfo.d.image_height > segment_height &&
- tif->tif_row + segment_height == td->td_imagelength &&
- !isTiled(tif) ) {
- /* Some files have a last strip, that should be truncated, */
- /* but their JPEG codestream has still the maximum strip */
- /* height. Warn about this as this is non compliant, but */
- /* we can safely recover from that. */
- TIFFWarningExt(tif->tif_clientdata, module,
- "JPEG strip size exceeds expected dimensions,"
- " expected %dx%d, got %dx%d",
- segment_width, segment_height,
- sp->cinfo.d.image_width, sp->cinfo.d.image_height);
- }
- else if (sp->cinfo.d.image_width > segment_width ||
- sp->cinfo.d.image_height > segment_height) {
- /*
- * This case could be dangerous, if the strip or tile size has
- * been reported as less than the amount of data jpeg will
- * return, some potential security issues arise. Catch this
- * case and error out.
- */
- TIFFErrorExt(tif->tif_clientdata, module,
- "JPEG strip/tile size exceeds expected dimensions,"
- " expected %dx%d, got %dx%d",
- segment_width, segment_height,
- sp->cinfo.d.image_width, sp->cinfo.d.image_height);
- return (0);
- }
- if (sp->cinfo.d.num_components !=
- (td->td_planarconfig == PLANARCONFIG_CONTIG ?
- td->td_samplesperpixel : 1)) {
- TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG component count");
- return (0);
- }
+/*ARGSUSED*/ static int JPEGPreDecode(TIFF *tif, uint16_t s)
+{
+ JPEGState *sp = JState(tif);
+ TIFFDirectory *td = &tif->tif_dir;
+ static const char module[] = "JPEGPreDecode";
+ uint32_t segment_width, segment_height;
+ int downsampled_output;
+ int ci;
+
+ assert(sp != NULL);
+
+ if (sp->cinfo.comm.is_decompressor == 0)
+ {
+ tif->tif_setupdecode(tif);
+ }
+
+ assert(sp->cinfo.comm.is_decompressor);
+ /*
+ * Reset decoder state from any previous strip/tile,
+ * in case application didn't read the whole strip.
+ */
+ if (!TIFFjpeg_abort(sp))
+ return (0);
+ /*
+ * Read the header for this strip/tile.
+ */
+
+ if (TIFFjpeg_read_header(sp, TRUE) != JPEG_HEADER_OK)
+ return (0);
+
+ tif->tif_rawcp = (uint8_t *)sp->src.next_input_byte;
+ tif->tif_rawcc = sp->src.bytes_in_buffer;
+
+ /*
+ * Check image parameters and set decompression parameters.
+ */
+ if (isTiled(tif))
+ {
+ segment_width = td->td_tilewidth;
+ segment_height = td->td_tilelength;
+ sp->bytesperline = TIFFTileRowSize(tif);
+ }
+ else
+ {
+ segment_width = td->td_imagewidth;
+ segment_height = td->td_imagelength - tif->tif_row;
+ if (segment_height > td->td_rowsperstrip)
+ segment_height = td->td_rowsperstrip;
+ sp->bytesperline = TIFFScanlineSize(tif);
+ }
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0)
+ {
+ /*
+ * For PC 2, scale down the expected strip/tile size
+ * to match a downsampled component
+ */
+ segment_width = TIFFhowmany_32(segment_width, sp->h_sampling);
+ segment_height = TIFFhowmany_32(segment_height, sp->v_sampling);
+ }
+ if (sp->cinfo.d.image_width < segment_width ||
+ sp->cinfo.d.image_height < segment_height)
+ {
+ TIFFWarningExtR(tif, module,
+ "Improper JPEG strip/tile size, "
+ "expected %" PRIu32 "x%" PRIu32 ", got %ux%u",
+ segment_width, segment_height, sp->cinfo.d.image_width,
+ sp->cinfo.d.image_height);
+ }
+ if (sp->cinfo.d.image_width == segment_width &&
+ sp->cinfo.d.image_height > segment_height &&
+ tif->tif_row + segment_height == td->td_imagelength && !isTiled(tif))
+ {
+ /* Some files have a last strip, that should be truncated, */
+ /* but their JPEG codestream has still the maximum strip */
+ /* height. Warn about this as this is non compliant, but */
+ /* we can safely recover from that. */
+ TIFFWarningExtR(tif, module,
+ "JPEG strip size exceeds expected dimensions,"
+ " expected %" PRIu32 "x%" PRIu32 ", got %ux%u",
+ segment_width, segment_height, sp->cinfo.d.image_width,
+ sp->cinfo.d.image_height);
+ }
+ else if (sp->cinfo.d.image_width > segment_width ||
+ sp->cinfo.d.image_height > segment_height)
+ {
+ /*
+ * This case could be dangerous, if the strip or tile size has
+ * been reported as less than the amount of data jpeg will
+ * return, some potential security issues arise. Catch this
+ * case and error out.
+ */
+ TIFFErrorExtR(tif, module,
+ "JPEG strip/tile size exceeds expected dimensions,"
+ " expected %" PRIu32 "x%" PRIu32 ", got %ux%u",
+ segment_width, segment_height, sp->cinfo.d.image_width,
+ sp->cinfo.d.image_height);
+ return (0);
+ }
+ if (sp->cinfo.d.num_components !=
+ (td->td_planarconfig == PLANARCONFIG_CONTIG ? td->td_samplesperpixel
+ : 1))
+ {
+ TIFFErrorExtR(tif, module, "Improper JPEG component count");
+ return (0);
+ }
#ifdef JPEG_LIB_MK1
- if (12 != td->td_bitspersample && 8 != td->td_bitspersample) {
- TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG data precision");
- return (0);
- }
- sp->cinfo.d.data_precision = td->td_bitspersample;
- sp->cinfo.d.bits_in_jsample = td->td_bitspersample;
+ if (12 != td->td_bitspersample && 8 != td->td_bitspersample)
+ {
+ TIFFErrorExtR(tif, module, "Improper JPEG data precision");
+ return (0);
+ }
+ sp->cinfo.d.data_precision = td->td_bitspersample;
+ sp->cinfo.d.bits_in_jsample = td->td_bitspersample;
#else
- if (sp->cinfo.d.data_precision != td->td_bitspersample) {
- TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG data precision");
- return (0);
- }
+ if (sp->cinfo.d.data_precision != td->td_bitspersample)
+ {
+ TIFFErrorExtR(tif, module, "Improper JPEG data precision");
+ return (0);
+ }
#endif
- /* In some cases, libjpeg needs to allocate a lot of memory */
- /* http://www.libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf */
- if( TIFFjpeg_has_multiple_scans(sp) )
- {
- /* In this case libjpeg will need to allocate memory or backing */
- /* store for all coefficients */
- /* See call to jinit_d_coef_controller() from master_selection() */
- /* in libjpeg */
- toff_t nRequiredMemory = (toff_t)sp->cinfo.d.image_width *
- sp->cinfo.d.image_height *
- sp->cinfo.d.num_components *
- ((td->td_bitspersample+7)/8);
- /* BLOCK_SMOOTHING_SUPPORTED is generally defined, so we need */
- /* to replicate the logic of jinit_d_coef_controller() */
- if( sp->cinfo.d.progressive_mode )
- nRequiredMemory *= 3;
-
-#ifndef TIFF_LIBJPEG_LARGEST_MEM_ALLOC
-#define TIFF_LIBJPEG_LARGEST_MEM_ALLOC (100 * 1024 * 1024)
-#endif
+ if (sp->cinfo.d.progressive_mode &&
+ !sp->otherSettings.has_warned_about_progressive_mode)
+ {
+ TIFFWarningExtR(tif, module,
+ "The JPEG strip/tile is encoded with progressive mode, "
+ "which is normally not legal for JPEG-in-TIFF.\n"
+ "libtiff should be able to decode it, but it might "
+ "cause compatibility issues with other readers");
+ sp->otherSettings.has_warned_about_progressive_mode = TRUE;
+ }
- if( nRequiredMemory > TIFF_LIBJPEG_LARGEST_MEM_ALLOC &&
- getenv("LIBTIFF_ALLOW_LARGE_LIBJPEG_MEM_ALLOC") == NULL )
+ /* In some cases, libjpeg needs to allocate a lot of memory */
+ /* http://www.libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf
+ */
+ if (TIFFjpeg_has_multiple_scans(sp))
+ {
+ /* In this case libjpeg will need to allocate memory or backing */
+ /* store for all coefficients */
+ /* See call to jinit_d_coef_controller() from master_selection() */
+ /* in libjpeg */
+
+ /* 1 MB for regular libjpeg usage */
+ toff_t nRequiredMemory = 1024 * 1024;
+
+ for (ci = 0; ci < sp->cinfo.d.num_components; ci++)
+ {
+ const jpeg_component_info *compptr = &(sp->cinfo.d.comp_info[ci]);
+ if (compptr->h_samp_factor > 0 && compptr->v_samp_factor > 0)
{
- TIFFErrorExt(tif->tif_clientdata, module,
- "Reading this strip would require libjpeg to allocate "
- "at least %u bytes. "
- "This is disabled since above the %u threshold. "
- "You may override this restriction by defining the "
- "LIBTIFF_ALLOW_LARGE_LIBJPEG_MEM_ALLOC environment variable, "
- "or recompile libtiff by defining the "
- "TIFF_LIBJPEG_LARGEST_MEM_ALLOC macro to a value greater "
- "than %u",
- (unsigned)nRequiredMemory,
- (unsigned)TIFF_LIBJPEG_LARGEST_MEM_ALLOC,
- (unsigned)TIFF_LIBJPEG_LARGEST_MEM_ALLOC);
- return (0);
+ nRequiredMemory +=
+ (toff_t)(((compptr->width_in_blocks +
+ compptr->h_samp_factor - 1) /
+ compptr->h_samp_factor)) *
+ ((compptr->height_in_blocks + compptr->v_samp_factor - 1) /
+ compptr->v_samp_factor) *
+ sizeof(JBLOCK);
}
}
- if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
- /* Component 0 should have expected sampling factors */
- if (sp->cinfo.d.comp_info[0].h_samp_factor != sp->h_sampling ||
- sp->cinfo.d.comp_info[0].v_samp_factor != sp->v_sampling) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Improper JPEG sampling factors %d,%d\n"
- "Apparently should be %d,%d.",
- sp->cinfo.d.comp_info[0].h_samp_factor,
- sp->cinfo.d.comp_info[0].v_samp_factor,
- sp->h_sampling, sp->v_sampling);
- return (0);
- }
- /* Rest should have sampling factors 1,1 */
- for (ci = 1; ci < sp->cinfo.d.num_components; ci++) {
- if (sp->cinfo.d.comp_info[ci].h_samp_factor != 1 ||
- sp->cinfo.d.comp_info[ci].v_samp_factor != 1) {
- TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG sampling factors");
- return (0);
- }
- }
- } else {
- /* PC 2's single component should have sampling factors 1,1 */
- if (sp->cinfo.d.comp_info[0].h_samp_factor != 1 ||
- sp->cinfo.d.comp_info[0].v_samp_factor != 1) {
- TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG sampling factors");
- return (0);
- }
- }
- downsampled_output = FALSE;
- if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
- sp->photometric == PHOTOMETRIC_YCBCR &&
- sp->jpegcolormode == JPEGCOLORMODE_RGB) {
- /* Convert YCbCr to RGB */
- sp->cinfo.d.jpeg_color_space = JCS_YCbCr;
- sp->cinfo.d.out_color_space = JCS_RGB;
- } else {
- /* Suppress colorspace handling */
- sp->cinfo.d.jpeg_color_space = JCS_UNKNOWN;
- sp->cinfo.d.out_color_space = JCS_UNKNOWN;
- if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
- (sp->h_sampling != 1 || sp->v_sampling != 1))
- downsampled_output = TRUE;
- /* XXX what about up-sampling? */
- }
- if (downsampled_output) {
- /* Need to use raw-data interface to libjpeg */
- sp->cinfo.d.raw_data_out = TRUE;
+ if (sp->cinfo.d.mem->max_memory_to_use > 0 &&
+ nRequiredMemory > (toff_t)(sp->cinfo.d.mem->max_memory_to_use) &&
+ getenv("LIBTIFF_ALLOW_LARGE_LIBJPEG_MEM_ALLOC") == NULL)
+ {
+ TIFFErrorExtR(
+ tif, module,
+ "Reading this image would require libjpeg to allocate "
+ "at least %" PRIu64 " bytes. "
+ "This is disabled since above the %ld threshold. "
+ "You may override this restriction by defining the "
+ "LIBTIFF_ALLOW_LARGE_LIBJPEG_MEM_ALLOC environment variable, "
+ "or setting the JPEGMEM environment variable to a value "
+ "greater "
+ "or equal to '%" PRIu64 "M'",
+ nRequiredMemory, sp->cinfo.d.mem->max_memory_to_use,
+ (nRequiredMemory + 1000000u - 1u) / 1000000u);
+ return 0;
+ }
+ }
+
+ if (td->td_planarconfig == PLANARCONFIG_CONTIG)
+ {
+ /* Component 0 should have expected sampling factors */
+ if (sp->cinfo.d.comp_info[0].h_samp_factor != sp->h_sampling ||
+ sp->cinfo.d.comp_info[0].v_samp_factor != sp->v_sampling)
+ {
+ TIFFErrorExtR(tif, module,
+ "Improper JPEG sampling factors %d,%d\n"
+ "Apparently should be %" PRIu16 ",%" PRIu16 ".",
+ sp->cinfo.d.comp_info[0].h_samp_factor,
+ sp->cinfo.d.comp_info[0].v_samp_factor,
+ sp->h_sampling, sp->v_sampling);
+ return (0);
+ }
+ /* Rest should have sampling factors 1,1 */
+ for (ci = 1; ci < sp->cinfo.d.num_components; ci++)
+ {
+ if (sp->cinfo.d.comp_info[ci].h_samp_factor != 1 ||
+ sp->cinfo.d.comp_info[ci].v_samp_factor != 1)
+ {
+ TIFFErrorExtR(tif, module, "Improper JPEG sampling factors");
+ return (0);
+ }
+ }
+ }
+ else
+ {
+ /* PC 2's single component should have sampling factors 1,1 */
+ if (sp->cinfo.d.comp_info[0].h_samp_factor != 1 ||
+ sp->cinfo.d.comp_info[0].v_samp_factor != 1)
+ {
+ TIFFErrorExtR(tif, module, "Improper JPEG sampling factors");
+ return (0);
+ }
+ }
+ downsampled_output = FALSE;
+ if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
+ sp->photometric == PHOTOMETRIC_YCBCR &&
+ sp->otherSettings.jpegcolormode == JPEGCOLORMODE_RGB)
+ {
+ /* Convert YCbCr to RGB */
+ sp->cinfo.d.jpeg_color_space = JCS_YCbCr;
+ sp->cinfo.d.out_color_space = JCS_RGB;
+ }
+ else
+ {
+ /* Suppress colorspace handling */
+ sp->cinfo.d.jpeg_color_space = JCS_UNKNOWN;
+ sp->cinfo.d.out_color_space = JCS_UNKNOWN;
+ if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
+ (sp->h_sampling != 1 || sp->v_sampling != 1))
+ downsampled_output = TRUE;
+ /* XXX what about up-sampling? */
+ }
+ if (downsampled_output)
+ {
+ /* Need to use raw-data interface to libjpeg */
+ sp->cinfo.d.raw_data_out = TRUE;
#if JPEG_LIB_VERSION >= 70
- sp->cinfo.d.do_fancy_upsampling = FALSE;
+ sp->cinfo.d.do_fancy_upsampling = FALSE;
#endif /* JPEG_LIB_VERSION >= 70 */
- tif->tif_decoderow = DecodeRowError;
- tif->tif_decodestrip = JPEGDecodeRaw;
- tif->tif_decodetile = JPEGDecodeRaw;
- } else {
- /* Use normal interface to libjpeg */
- sp->cinfo.d.raw_data_out = FALSE;
- tif->tif_decoderow = JPEGDecode;
- tif->tif_decodestrip = JPEGDecode;
- tif->tif_decodetile = JPEGDecode;
- }
- /* Start JPEG decompressor */
- if (!TIFFjpeg_start_decompress(sp))
- return (0);
- /* Allocate downsampled-data buffers if needed */
- if (downsampled_output) {
- if (!alloc_downsampled_buffers(tif, sp->cinfo.d.comp_info,
- sp->cinfo.d.num_components))
- return (0);
- sp->scancount = DCTSIZE; /* mark buffer empty */
- }
- return (1);
+ tif->tif_decoderow = DecodeRowError;
+ tif->tif_decodestrip = JPEGDecodeRaw;
+ tif->tif_decodetile = JPEGDecodeRaw;
+ }
+ else
+ {
+ /* Use normal interface to libjpeg */
+ sp->cinfo.d.raw_data_out = FALSE;
+ tif->tif_decoderow = JPEGDecode;
+ tif->tif_decodestrip = JPEGDecode;
+ tif->tif_decodetile = JPEGDecode;
+ }
+ /* Start JPEG decompressor */
+ if (!TIFFjpeg_start_decompress(sp))
+ return (0);
+ /* Allocate downsampled-data buffers if needed */
+ if (downsampled_output)
+ {
+ if (!alloc_downsampled_buffers(tif, sp->cinfo.d.comp_info,
+ sp->cinfo.d.num_components))
+ return (0);
+ sp->scancount = DCTSIZE; /* mark buffer empty */
+ }
+ return (1);
}
/*
@@ -1316,177 +1457,179 @@ JPEGPreDecode(TIFF* tif, uint16 s)
* "Standard" case: returned data is not downsampled.
*/
#if !JPEG_LIB_MK1_OR_12BIT
-static int
-JPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
+static int JPEGDecode(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s)
{
- JPEGState *sp = JState(tif);
- tmsize_t nrows;
- (void) s;
+ JPEGState *sp = JState(tif);
+ tmsize_t nrows;
+ (void)s;
- /*
- ** Update available information, buffer may have been refilled
- ** between decode requests
- */
- sp->src.next_input_byte = (const JOCTET*) tif->tif_rawcp;
- sp->src.bytes_in_buffer = (size_t) tif->tif_rawcc;
+ /*
+ ** Update available information, buffer may have been refilled
+ ** between decode requests
+ */
+ sp->src.next_input_byte = (const JOCTET *)tif->tif_rawcp;
+ sp->src.bytes_in_buffer = (size_t)tif->tif_rawcc;
- if( sp->bytesperline == 0 )
- return 0;
-
- nrows = cc / sp->bytesperline;
- if (cc % sp->bytesperline)
- TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
- "fractional scanline not read");
+ if (sp->bytesperline == 0)
+ return 0;
+
+ nrows = cc / sp->bytesperline;
+ if (cc % sp->bytesperline)
+ TIFFWarningExtR(tif, tif->tif_name, "fractional scanline not read");
- if( nrows > (tmsize_t) sp->cinfo.d.image_height )
- nrows = sp->cinfo.d.image_height;
+ if (nrows > (tmsize_t)sp->cinfo.d.image_height)
+ nrows = sp->cinfo.d.image_height;
- /* data is expected to be read in multiples of a scanline */
- if (nrows)
+ /* data is expected to be read in multiples of a scanline */
+ if (nrows)
+ {
+ do
{
- do
- {
- /*
- * In the libjpeg6b-9a 8bit case. We read directly into
- * the TIFF buffer.
- */
- JSAMPROW bufptr = (JSAMPROW)buf;
-
- if (TIFFjpeg_read_scanlines(sp, &bufptr, 1) != 1)
- return (0);
-
- ++tif->tif_row;
- buf += sp->bytesperline;
- cc -= sp->bytesperline;
- } while (--nrows > 0);
- }
+ /*
+ * In the libjpeg6b-9a 8bit case. We read directly into
+ * the TIFF buffer.
+ */
+ JSAMPROW bufptr = (JSAMPROW)buf;
+
+ if (TIFFjpeg_read_scanlines(sp, &bufptr, 1) != 1)
+ return (0);
+
+ ++tif->tif_row;
+ buf += sp->bytesperline;
+ cc -= sp->bytesperline;
+ } while (--nrows > 0);
+ }
+
+ /* Update information on consumed data */
+ tif->tif_rawcp = (uint8_t *)sp->src.next_input_byte;
+ tif->tif_rawcc = sp->src.bytes_in_buffer;
- /* Update information on consumed data */
- tif->tif_rawcp = (uint8*) sp->src.next_input_byte;
- tif->tif_rawcc = sp->src.bytes_in_buffer;
-
- /* Close down the decompressor if we've finished the strip or tile. */
- return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height
- || TIFFjpeg_finish_decompress(sp);
+ /* Close down the decompressor if we've finished the strip or tile. */
+ return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height ||
+ TIFFjpeg_finish_decompress(sp);
}
#endif /* !JPEG_LIB_MK1_OR_12BIT */
#if JPEG_LIB_MK1_OR_12BIT
-/*ARGSUSED*/ static int
-JPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
+/*ARGSUSED*/ static int JPEGDecode(TIFF *tif, uint8_t *buf, tmsize_t cc,
+ uint16_t s)
{
- JPEGState *sp = JState(tif);
- tmsize_t nrows;
- (void) s;
+ JPEGState *sp = JState(tif);
+ tmsize_t nrows;
+ (void)s;
- /*
- ** Update available information, buffer may have been refilled
- ** between decode requests
- */
- sp->src.next_input_byte = (const JOCTET*) tif->tif_rawcp;
- sp->src.bytes_in_buffer = (size_t) tif->tif_rawcc;
+ /*
+ ** Update available information, buffer may have been refilled
+ ** between decode requests
+ */
+ sp->src.next_input_byte = (const JOCTET *)tif->tif_rawcp;
+ sp->src.bytes_in_buffer = (size_t)tif->tif_rawcc;
- if( sp->bytesperline == 0 )
- return 0;
-
- nrows = cc / sp->bytesperline;
- if (cc % sp->bytesperline)
- TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
- "fractional scanline not read");
+ if (sp->bytesperline == 0)
+ return 0;
+
+ nrows = cc / sp->bytesperline;
+ if (cc % sp->bytesperline)
+ TIFFWarningExtR(tif, tif->tif_name, "fractional scanline not read");
- if( nrows > (tmsize_t) sp->cinfo.d.image_height )
- nrows = sp->cinfo.d.image_height;
+ if (nrows > (tmsize_t)sp->cinfo.d.image_height)
+ nrows = sp->cinfo.d.image_height;
+
+ /* data is expected to be read in multiples of a scanline */
+ if (nrows)
+ {
+ TIFF_JSAMPROW line_work_buf = NULL;
- /* data is expected to be read in multiples of a scanline */
- if (nrows)
+ /*
+ * For 6B, only use temporary buffer for 12 bit imagery.
+ * For Mk1 always use it.
+ */
+ if (sp->cinfo.d.data_precision == 12)
{
- JSAMPROW line_work_buf = NULL;
+ line_work_buf = (TIFF_JSAMPROW)_TIFFmallocExt(
+ tif, sizeof(short) * sp->cinfo.d.output_width *
+ sp->cinfo.d.num_components);
+ }
+ do
+ {
+ if (line_work_buf != NULL)
+ {
/*
- * For 6B, only use temporary buffer for 12 bit imagery.
- * For Mk1 always use it.
+ * In the MK1 case, we always read into a 16bit
+ * buffer, and then pack down to 12bit or 8bit.
+ * In 6B case we only read into 16 bit buffer
+ * for 12bit data, which we need to repack.
*/
- if( sp->cinfo.d.data_precision == 12 )
+ if (TIFFjpeg_read_scanlines(sp, &line_work_buf, 1) != 1)
+ return (0);
+
+ if (sp->cinfo.d.data_precision == 12)
+ {
+ int value_pairs = (sp->cinfo.d.output_width *
+ sp->cinfo.d.num_components) /
+ 2;
+ int iPair;
+
+ for (iPair = 0; iPair < value_pairs; iPair++)
+ {
+ unsigned char *out_ptr =
+ ((unsigned char *)buf) + iPair * 3;
+ TIFF_JSAMPLE *in_ptr = line_work_buf + iPair * 2;
+
+ out_ptr[0] = (unsigned char)((in_ptr[0] & 0xff0) >> 4);
+ out_ptr[1] =
+ (unsigned char)(((in_ptr[0] & 0xf) << 4) |
+ ((in_ptr[1] & 0xf00) >> 8));
+ out_ptr[2] = (unsigned char)(((in_ptr[1] & 0xff) >> 0));
+ }
+ }
+ else if (sp->cinfo.d.data_precision == 8)
{
- line_work_buf = (JSAMPROW)
- _TIFFmalloc(sizeof(short) * sp->cinfo.d.output_width
- * sp->cinfo.d.num_components );
+ int value_count =
+ (sp->cinfo.d.output_width * sp->cinfo.d.num_components);
+ int iValue;
+
+ for (iValue = 0; iValue < value_count; iValue++)
+ {
+ ((unsigned char *)buf)[iValue] =
+ line_work_buf[iValue] & 0xff;
+ }
}
+ }
- do
- {
- if( line_work_buf != NULL )
- {
- /*
- * In the MK1 case, we always read into a 16bit
- * buffer, and then pack down to 12bit or 8bit.
- * In 6B case we only read into 16 bit buffer
- * for 12bit data, which we need to repack.
- */
- if (TIFFjpeg_read_scanlines(sp, &line_work_buf, 1) != 1)
- return (0);
-
- if( sp->cinfo.d.data_precision == 12 )
- {
- int value_pairs = (sp->cinfo.d.output_width
- * sp->cinfo.d.num_components) / 2;
- int iPair;
-
- for( iPair = 0; iPair < value_pairs; iPair++ )
- {
- unsigned char *out_ptr =
- ((unsigned char *) buf) + iPair * 3;
- JSAMPLE *in_ptr = line_work_buf + iPair * 2;
-
- out_ptr[0] = (unsigned char)((in_ptr[0] & 0xff0) >> 4);
- out_ptr[1] = (unsigned char)(((in_ptr[0] & 0xf) << 4)
- | ((in_ptr[1] & 0xf00) >> 8));
- out_ptr[2] = (unsigned char)(((in_ptr[1] & 0xff) >> 0));
- }
- }
- else if( sp->cinfo.d.data_precision == 8 )
- {
- int value_count = (sp->cinfo.d.output_width
- * sp->cinfo.d.num_components);
- int iValue;
-
- for( iValue = 0; iValue < value_count; iValue++ )
- {
- ((unsigned char *) buf)[iValue] =
- line_work_buf[iValue] & 0xff;
- }
- }
- }
-
- ++tif->tif_row;
- buf += sp->bytesperline;
- cc -= sp->bytesperline;
- } while (--nrows > 0);
-
- if( line_work_buf != NULL )
- _TIFFfree( line_work_buf );
- }
+ ++tif->tif_row;
+ buf += sp->bytesperline;
+ cc -= sp->bytesperline;
+ } while (--nrows > 0);
+
+ if (line_work_buf != NULL)
+ _TIFFfreeExt(tif, line_work_buf);
+ }
- /* Update information on consumed data */
- tif->tif_rawcp = (uint8*) sp->src.next_input_byte;
- tif->tif_rawcc = sp->src.bytes_in_buffer;
-
- /* Close down the decompressor if we've finished the strip or tile. */
- return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height
- || TIFFjpeg_finish_decompress(sp);
+ /* Update information on consumed data */
+ tif->tif_rawcp = (uint8_t *)sp->src.next_input_byte;
+ tif->tif_rawcc = sp->src.bytes_in_buffer;
+
+ /* Close down the decompressor if we've finished the strip or tile. */
+ return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height ||
+ TIFFjpeg_finish_decompress(sp);
}
#endif /* JPEG_LIB_MK1_OR_12BIT */
-/*ARGSUSED*/ static int
-DecodeRowError(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
+/*ARGSUSED*/ static int DecodeRowError(TIFF *tif, uint8_t *buf, tmsize_t cc,
+ uint16_t s)
{
- (void) buf;
- (void) cc;
- (void) s;
+ (void)buf;
+ (void)cc;
+ (void)s;
- TIFFErrorExt(tif->tif_clientdata, "TIFFReadScanline",
- "scanline oriented access is not supported for downsampled JPEG compressed images, consider enabling TIFF_JPEGCOLORMODE as JPEGCOLORMODE_RGB." );
+ TIFFErrorExtR(
+ tif, "TIFFReadScanline",
+ "scanline oriented access is not supported for downsampled JPEG "
+ "compressed images, consider enabling TIFFTAG_JPEGCOLORMODE as "
+ "JPEGCOLORMODE_RGB.");
return 0;
}
@@ -1494,926 +1637,1079 @@ DecodeRowError(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
* Decode a chunk of pixels.
* Returned data is downsampled per sampling factors.
*/
-/*ARGSUSED*/ static int
-JPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
+/*ARGSUSED*/ static int JPEGDecodeRaw(TIFF *tif, uint8_t *buf, tmsize_t cc,
+ uint16_t s)
{
- JPEGState *sp = JState(tif);
- tmsize_t nrows;
- TIFFDirectory *td = &tif->tif_dir;
- (void) s;
+ JPEGState *sp = JState(tif);
+ tmsize_t nrows;
+ TIFFDirectory *td = &tif->tif_dir;
+ (void)s;
- nrows = sp->cinfo.d.image_height;
- /* For last strip, limit number of rows to its truncated height */
- /* even if the codestream height is larger (which is not compliant, */
- /* but that we tolerate) */
- if( (uint32)nrows > td->td_imagelength - tif->tif_row && !isTiled(tif) )
- nrows = td->td_imagelength - tif->tif_row;
+ nrows = sp->cinfo.d.image_height;
+ /* For last strip, limit number of rows to its truncated height */
+ /* even if the codestream height is larger (which is not compliant, */
+ /* but that we tolerate) */
+ if ((uint32_t)nrows > td->td_imagelength - tif->tif_row && !isTiled(tif))
+ nrows = td->td_imagelength - tif->tif_row;
- /* data is expected to be read in multiples of a scanline */
- if ( nrows != 0 ) {
+#if defined(JPEG_LIB_MK1_OR_12BIT)
+ unsigned short *tmpbuf = NULL;
+#endif
- /* Cb,Cr both have sampling factors 1, so this is correct */
- JDIMENSION clumps_per_line = sp->cinfo.d.comp_info[1].downsampled_width;
- int samples_per_clump = sp->samplesperclump;
+ /* data is expected to be read in multiples of a scanline */
+ if (nrows != 0)
+ {
+
+ /* Cb,Cr both have sampling factors 1, so this is correct */
+ JDIMENSION clumps_per_line = sp->cinfo.d.comp_info[1].downsampled_width;
+ int samples_per_clump = sp->samplesperclump;
#if defined(JPEG_LIB_MK1_OR_12BIT)
- unsigned short* tmpbuf = _TIFFmalloc(sizeof(unsigned short) *
- sp->cinfo.d.output_width *
- sp->cinfo.d.num_components);
- if(tmpbuf==NULL) {
- TIFFErrorExt(tif->tif_clientdata, "JPEGDecodeRaw",
- "Out of memory");
- return 0;
- }
+ tmpbuf = _TIFFmallocExt(tif, sizeof(unsigned short) *
+ sp->cinfo.d.output_width *
+ sp->cinfo.d.num_components);
+ if (tmpbuf == NULL)
+ {
+ TIFFErrorExtR(tif, "JPEGDecodeRaw", "Out of memory");
+ return 0;
+ }
#endif
- do {
- jpeg_component_info *compptr;
- int ci, clumpoffset;
+ do
+ {
+ jpeg_component_info *compptr;
+ int ci, clumpoffset;
- if( cc < sp->bytesperline ) {
- TIFFErrorExt(tif->tif_clientdata, "JPEGDecodeRaw",
- "application buffer not large enough for all data.");
- return 0;
- }
+ if (cc < sp->bytesperline)
+ {
+ TIFFErrorExtR(
+ tif, "JPEGDecodeRaw",
+ "application buffer not large enough for all data.");
+ goto error;
+ }
+
+ /* Reload downsampled-data buffer if needed */
+ if (sp->scancount >= DCTSIZE)
+ {
+ int n = sp->cinfo.d.max_v_samp_factor * DCTSIZE;
+ if (TIFFjpeg_read_raw_data(sp, sp->ds_buffer, n) != n)
+ goto error;
+ sp->scancount = 0;
+ }
+ /*
+ * Fastest way to unseparate data is to make one pass
+ * over the scanline for each row of each component.
+ */
+ clumpoffset = 0; /* first sample in clump */
+ for (ci = 0, compptr = sp->cinfo.d.comp_info;
+ ci < sp->cinfo.d.num_components; ci++, compptr++)
+ {
+ int hsamp = compptr->h_samp_factor;
+ int vsamp = compptr->v_samp_factor;
+ int ypos;
- /* Reload downsampled-data buffer if needed */
- if (sp->scancount >= DCTSIZE) {
- int n = sp->cinfo.d.max_v_samp_factor * DCTSIZE;
- if (TIFFjpeg_read_raw_data(sp, sp->ds_buffer, n) != n)
- return (0);
- sp->scancount = 0;
- }
- /*
- * Fastest way to unseparate data is to make one pass
- * over the scanline for each row of each component.
- */
- clumpoffset = 0; /* first sample in clump */
- for (ci = 0, compptr = sp->cinfo.d.comp_info;
- ci < sp->cinfo.d.num_components;
- ci++, compptr++) {
- int hsamp = compptr->h_samp_factor;
- int vsamp = compptr->v_samp_factor;
- int ypos;
-
- for (ypos = 0; ypos < vsamp; ypos++) {
- JSAMPLE *inptr = sp->ds_buffer[ci][sp->scancount*vsamp + ypos];
- JDIMENSION nclump;
+ for (ypos = 0; ypos < vsamp; ypos++)
+ {
+ TIFF_JSAMPLE *inptr =
+ sp->ds_buffer[ci][sp->scancount * vsamp + ypos];
+ JDIMENSION nclump;
#if defined(JPEG_LIB_MK1_OR_12BIT)
- JSAMPLE *outptr = (JSAMPLE*)tmpbuf + clumpoffset;
+ TIFF_JSAMPLE *outptr = (TIFF_JSAMPLE *)tmpbuf + clumpoffset;
#else
- JSAMPLE *outptr = (JSAMPLE*)buf + clumpoffset;
- if (cc < (tmsize_t)(clumpoffset + (tmsize_t)samples_per_clump*(clumps_per_line-1) + hsamp)) {
- TIFFErrorExt(tif->tif_clientdata, "JPEGDecodeRaw",
- "application buffer not large enough for all data, possible subsampling issue");
- return 0;
- }
+ TIFF_JSAMPLE *outptr = (TIFF_JSAMPLE *)buf + clumpoffset;
+ if (cc < (tmsize_t)(clumpoffset +
+ (tmsize_t)samples_per_clump *
+ (clumps_per_line - 1) +
+ hsamp))
+ {
+ TIFFErrorExtR(
+ tif, "JPEGDecodeRaw",
+ "application buffer not large enough for all data, "
+ "possible subsampling issue");
+ goto error;
+ }
#endif
- if (hsamp == 1) {
- /* fast path for at least Cb and Cr */
- for (nclump = clumps_per_line; nclump-- > 0; ) {
- outptr[0] = *inptr++;
- outptr += samples_per_clump;
- }
- } else {
- int xpos;
-
- /* general case */
- for (nclump = clumps_per_line; nclump-- > 0; ) {
- for (xpos = 0; xpos < hsamp; xpos++)
- outptr[xpos] = *inptr++;
- outptr += samples_per_clump;
- }
- }
- clumpoffset += hsamp;
- }
- }
+ if (hsamp == 1)
+ {
+ /* fast path for at least Cb and Cr */
+ for (nclump = clumps_per_line; nclump-- > 0;)
+ {
+ outptr[0] = *inptr++;
+ outptr += samples_per_clump;
+ }
+ }
+ else
+ {
+ int xpos;
+
+ /* general case */
+ for (nclump = clumps_per_line; nclump-- > 0;)
+ {
+ for (xpos = 0; xpos < hsamp; xpos++)
+ outptr[xpos] = *inptr++;
+ outptr += samples_per_clump;
+ }
+ }
+ clumpoffset += hsamp;
+ }
+ }
#if defined(JPEG_LIB_MK1_OR_12BIT)
- {
- if (sp->cinfo.d.data_precision == 8)
- {
- int i=0;
- int len = sp->cinfo.d.output_width * sp->cinfo.d.num_components;
- for (i=0; i<len; i++)
- {
- ((unsigned char*)buf)[i] = tmpbuf[i] & 0xff;
- }
- }
- else
- { /* 12-bit */
- int value_pairs = (sp->cinfo.d.output_width
- * sp->cinfo.d.num_components) / 2;
- int iPair;
- for( iPair = 0; iPair < value_pairs; iPair++ )
- {
- unsigned char *out_ptr = ((unsigned char *) buf) + iPair * 3;
- JSAMPLE *in_ptr = (JSAMPLE *) (tmpbuf + iPair * 2);
- out_ptr[0] = (unsigned char)((in_ptr[0] & 0xff0) >> 4);
- out_ptr[1] = (unsigned char)(((in_ptr[0] & 0xf) << 4)
- | ((in_ptr[1] & 0xf00) >> 8));
- out_ptr[2] = (unsigned char)(((in_ptr[1] & 0xff) >> 0));
- }
- }
- }
+ {
+ if (sp->cinfo.d.data_precision == 8)
+ {
+ int i = 0;
+ int len =
+ sp->cinfo.d.output_width * sp->cinfo.d.num_components;
+ for (i = 0; i < len; i++)
+ {
+ ((unsigned char *)buf)[i] = tmpbuf[i] & 0xff;
+ }
+ }
+ else
+ { /* 12-bit */
+ int value_pairs = (sp->cinfo.d.output_width *
+ sp->cinfo.d.num_components) /
+ 2;
+ int iPair;
+ for (iPair = 0; iPair < value_pairs; iPair++)
+ {
+ unsigned char *out_ptr =
+ ((unsigned char *)buf) + iPair * 3;
+ JSAMPLE *in_ptr = (JSAMPLE *)(tmpbuf + iPair * 2);
+ out_ptr[0] = (unsigned char)((in_ptr[0] & 0xff0) >> 4);
+ out_ptr[1] =
+ (unsigned char)(((in_ptr[0] & 0xf) << 4) |
+ ((in_ptr[1] & 0xf00) >> 8));
+ out_ptr[2] = (unsigned char)(((in_ptr[1] & 0xff) >> 0));
+ }
+ }
+ }
#endif
- sp->scancount ++;
- tif->tif_row += sp->v_sampling;
+ sp->scancount++;
+ tif->tif_row += sp->v_sampling;
- buf += sp->bytesperline;
- cc -= sp->bytesperline;
+ buf += sp->bytesperline;
+ cc -= sp->bytesperline;
- nrows -= sp->v_sampling;
- } while (nrows > 0);
+ nrows -= sp->v_sampling;
+ } while (nrows > 0);
#if defined(JPEG_LIB_MK1_OR_12BIT)
- _TIFFfree(tmpbuf);
+ _TIFFfreeExt(tif, tmpbuf);
#endif
+ }
- }
+ /* Close down the decompressor if done. */
+ return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height ||
+ TIFFjpeg_finish_decompress(sp);
- /* Close down the decompressor if done. */
- return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height
- || TIFFjpeg_finish_decompress(sp);
+error:
+#if defined(JPEG_LIB_MK1_OR_12BIT)
+ _TIFFfreeExt(tif, tmpbuf);
+#endif
+ return 0;
}
-
/*
* JPEG Encoding.
*/
-static void
-unsuppress_quant_table (JPEGState* sp, int tblno)
+static void unsuppress_quant_table(JPEGState *sp, int tblno)
{
- JQUANT_TBL* qtbl;
+ JQUANT_TBL *qtbl;
- if ((qtbl = sp->cinfo.c.quant_tbl_ptrs[tblno]) != NULL)
- qtbl->sent_table = FALSE;
+ if ((qtbl = sp->cinfo.c.quant_tbl_ptrs[tblno]) != NULL)
+ qtbl->sent_table = FALSE;
}
-static void
-suppress_quant_table (JPEGState* sp, int tblno)
+static void suppress_quant_table(JPEGState *sp, int tblno)
{
- JQUANT_TBL* qtbl;
+ JQUANT_TBL *qtbl;
- if ((qtbl = sp->cinfo.c.quant_tbl_ptrs[tblno]) != NULL)
- qtbl->sent_table = TRUE;
+ if ((qtbl = sp->cinfo.c.quant_tbl_ptrs[tblno]) != NULL)
+ qtbl->sent_table = TRUE;
}
-static void
-unsuppress_huff_table (JPEGState* sp, int tblno)
+static void unsuppress_huff_table(JPEGState *sp, int tblno)
{
- JHUFF_TBL* htbl;
+ JHUFF_TBL *htbl;
- if ((htbl = sp->cinfo.c.dc_huff_tbl_ptrs[tblno]) != NULL)
- htbl->sent_table = FALSE;
- if ((htbl = sp->cinfo.c.ac_huff_tbl_ptrs[tblno]) != NULL)
- htbl->sent_table = FALSE;
+ if ((htbl = sp->cinfo.c.dc_huff_tbl_ptrs[tblno]) != NULL)
+ htbl->sent_table = FALSE;
+ if ((htbl = sp->cinfo.c.ac_huff_tbl_ptrs[tblno]) != NULL)
+ htbl->sent_table = FALSE;
}
-static void
-suppress_huff_table (JPEGState* sp, int tblno)
+static void suppress_huff_table(JPEGState *sp, int tblno)
{
- JHUFF_TBL* htbl;
+ JHUFF_TBL *htbl;
- if ((htbl = sp->cinfo.c.dc_huff_tbl_ptrs[tblno]) != NULL)
- htbl->sent_table = TRUE;
- if ((htbl = sp->cinfo.c.ac_huff_tbl_ptrs[tblno]) != NULL)
- htbl->sent_table = TRUE;
+ if ((htbl = sp->cinfo.c.dc_huff_tbl_ptrs[tblno]) != NULL)
+ htbl->sent_table = TRUE;
+ if ((htbl = sp->cinfo.c.ac_huff_tbl_ptrs[tblno]) != NULL)
+ htbl->sent_table = TRUE;
}
-static int
-prepare_JPEGTables(TIFF* tif)
-{
- JPEGState* sp = JState(tif);
-
- /* Initialize quant tables for current quality setting */
- if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE))
- return (0);
- /* Mark only the tables we want for output */
- /* NB: chrominance tables are currently used only with YCbCr */
- if (!TIFFjpeg_suppress_tables(sp, TRUE))
- return (0);
- if (sp->jpegtablesmode & JPEGTABLESMODE_QUANT) {
- unsuppress_quant_table(sp, 0);
- if (sp->photometric == PHOTOMETRIC_YCBCR)
- unsuppress_quant_table(sp, 1);
- }
- if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF) {
- unsuppress_huff_table(sp, 0);
- if (sp->photometric == PHOTOMETRIC_YCBCR)
- unsuppress_huff_table(sp, 1);
- }
- /* Direct libjpeg output into jpegtables */
- if (!TIFFjpeg_tables_dest(sp, tif))
- return (0);
- /* Emit tables-only datastream */
- if (!TIFFjpeg_write_tables(sp))
- return (0);
-
- return (1);
+static int prepare_JPEGTables(TIFF *tif)
+{
+ JPEGState *sp = JState(tif);
+
+ /* Initialize quant tables for current quality setting */
+ if (!TIFFjpeg_set_quality(sp, sp->otherSettings.jpegquality, FALSE))
+ return (0);
+ /* Mark only the tables we want for output */
+ /* NB: chrominance tables are currently used only with YCbCr */
+ if (!TIFFjpeg_suppress_tables(sp, TRUE))
+ return (0);
+ if (sp->otherSettings.jpegtablesmode & JPEGTABLESMODE_QUANT)
+ {
+ unsuppress_quant_table(sp, 0);
+ if (sp->photometric == PHOTOMETRIC_YCBCR)
+ unsuppress_quant_table(sp, 1);
+ }
+ if (sp->otherSettings.jpegtablesmode & JPEGTABLESMODE_HUFF)
+ {
+ unsuppress_huff_table(sp, 0);
+ if (sp->photometric == PHOTOMETRIC_YCBCR)
+ unsuppress_huff_table(sp, 1);
+ }
+ /* Direct libjpeg output into otherSettings.jpegtables */
+ if (!TIFFjpeg_tables_dest(sp, tif))
+ return (0);
+ /* Emit tables-only datastream */
+ if (!TIFFjpeg_write_tables(sp))
+ return (0);
+
+ return (1);
}
-static int
-JPEGSetupEncode(TIFF* tif)
+#if defined(JPEG_LIB_VERSION_MAJOR) && \
+ (JPEG_LIB_VERSION_MAJOR > 9 || \
+ (JPEG_LIB_VERSION_MAJOR == 9 && JPEG_LIB_VERSION_MINOR >= 4))
+/* This is a modified version of std_huff_tables() from jcparam.c
+ * in libjpeg-9d because it no longer initializes default Huffman
+ * tables in jpeg_set_defaults(). */
+static void TIFF_std_huff_tables(j_compress_ptr cinfo)
{
- JPEGState* sp = JState(tif);
- TIFFDirectory *td = &tif->tif_dir;
- static const char module[] = "JPEGSetupEncode";
-#if defined(JPEG_DUAL_MODE_8_12) && !defined(TIFFInitJPEG)
- if( tif->tif_dir.td_bitspersample == 12 )
- return TIFFReInitJPEG_12( tif, COMPRESSION_JPEG, 1 );
+ if (cinfo->dc_huff_tbl_ptrs[0] == NULL)
+ {
+ (void)jpeg_std_huff_table((j_common_ptr)cinfo, TRUE, 0);
+ }
+ if (cinfo->ac_huff_tbl_ptrs[0] == NULL)
+ {
+ (void)jpeg_std_huff_table((j_common_ptr)cinfo, FALSE, 0);
+ }
+ if (cinfo->dc_huff_tbl_ptrs[1] == NULL)
+ {
+ (void)jpeg_std_huff_table((j_common_ptr)cinfo, TRUE, 1);
+ }
+ if (cinfo->ac_huff_tbl_ptrs[1] == NULL)
+ {
+ (void)jpeg_std_huff_table((j_common_ptr)cinfo, FALSE, 1);
+ }
+}
#endif
- JPEGInitializeLibJPEG( tif, FALSE );
-
- assert(sp != NULL);
- assert(!sp->cinfo.comm.is_decompressor);
-
- sp->photometric = td->td_photometric;
-
- /*
- * Initialize all JPEG parameters to default values.
- * Note that jpeg_set_defaults needs legal values for
- * in_color_space and input_components.
- */
- if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
- sp->cinfo.c.input_components = td->td_samplesperpixel;
- if (sp->photometric == PHOTOMETRIC_YCBCR) {
- if (sp->jpegcolormode == JPEGCOLORMODE_RGB) {
- sp->cinfo.c.in_color_space = JCS_RGB;
- } else {
- sp->cinfo.c.in_color_space = JCS_YCbCr;
- }
- } else {
- if ((td->td_photometric == PHOTOMETRIC_MINISWHITE || td->td_photometric == PHOTOMETRIC_MINISBLACK) && td->td_samplesperpixel == 1)
- sp->cinfo.c.in_color_space = JCS_GRAYSCALE;
- else if (td->td_photometric == PHOTOMETRIC_RGB && td->td_samplesperpixel == 3)
- sp->cinfo.c.in_color_space = JCS_RGB;
- else if (td->td_photometric == PHOTOMETRIC_SEPARATED && td->td_samplesperpixel == 4)
- sp->cinfo.c.in_color_space = JCS_CMYK;
- else
- sp->cinfo.c.in_color_space = JCS_UNKNOWN;
- }
- } else {
- sp->cinfo.c.input_components = 1;
- sp->cinfo.c.in_color_space = JCS_UNKNOWN;
- }
- if (!TIFFjpeg_set_defaults(sp))
- return (0);
- /* Set per-file parameters */
- switch (sp->photometric) {
- case PHOTOMETRIC_YCBCR:
- sp->h_sampling = td->td_ycbcrsubsampling[0];
- sp->v_sampling = td->td_ycbcrsubsampling[1];
- if( sp->h_sampling == 0 || sp->v_sampling == 0 )
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Invalig horizontal/vertical sampling value");
- return (0);
- }
- if( td->td_bitspersample > 16 )
+static int JPEGSetupEncode(TIFF *tif)
+{
+ JPEGState *sp = JState(tif);
+ TIFFDirectory *td = &tif->tif_dir;
+ static const char module[] = "JPEGSetupEncode";
+
+#if defined(JPEG_DUAL_MODE_8_12) && !defined(FROM_TIF_JPEG_12)
+ if (tif->tif_dir.td_bitspersample == 12)
+ {
+ /* We pass a pointer to a copy of otherSettings, since */
+ /* TIFFReInitJPEG_12() will clear sp */
+ JPEGOtherSettings savedOtherSettings = sp->otherSettings;
+ return TIFFReInitJPEG_12(tif, &savedOtherSettings, COMPRESSION_JPEG, 1);
+ }
+#endif
+
+ JPEGInitializeLibJPEG(tif, FALSE);
+
+ assert(sp != NULL);
+ assert(!sp->cinfo.comm.is_decompressor);
+
+ sp->photometric = td->td_photometric;
+
+ /*
+ * Initialize all JPEG parameters to default values.
+ * Note that jpeg_set_defaults needs legal values for
+ * in_color_space and input_components.
+ */
+ if (td->td_planarconfig == PLANARCONFIG_CONTIG)
+ {
+ sp->cinfo.c.input_components = td->td_samplesperpixel;
+ if (sp->photometric == PHOTOMETRIC_YCBCR)
+ {
+ if (sp->otherSettings.jpegcolormode == JPEGCOLORMODE_RGB)
+ {
+ sp->cinfo.c.in_color_space = JCS_RGB;
+ }
+ else
+ {
+ sp->cinfo.c.in_color_space = JCS_YCbCr;
+ }
+ }
+ else
+ {
+ if ((td->td_photometric == PHOTOMETRIC_MINISWHITE ||
+ td->td_photometric == PHOTOMETRIC_MINISBLACK) &&
+ td->td_samplesperpixel == 1)
+ sp->cinfo.c.in_color_space = JCS_GRAYSCALE;
+ else if (td->td_photometric == PHOTOMETRIC_RGB &&
+ td->td_samplesperpixel == 3)
+ sp->cinfo.c.in_color_space = JCS_RGB;
+ else if (td->td_photometric == PHOTOMETRIC_SEPARATED &&
+ td->td_samplesperpixel == 4)
+ sp->cinfo.c.in_color_space = JCS_CMYK;
+ else
+ sp->cinfo.c.in_color_space = JCS_UNKNOWN;
+ }
+ }
+ else
+ {
+ sp->cinfo.c.input_components = 1;
+ sp->cinfo.c.in_color_space = JCS_UNKNOWN;
+ }
+ if (!TIFFjpeg_set_defaults(sp))
+ return (0);
+
+ /* mozjpeg by default enables progressive JPEG, which is illegal in
+ * JPEG-in-TIFF */
+ /* So explicitly disable it. */
+ if (sp->cinfo.c.num_scans != 0 &&
+ (sp->otherSettings.jpegtablesmode & JPEGTABLESMODE_HUFF) != 0)
+ {
+ /* it has been found that mozjpeg could create corrupt strips/tiles */
+ /* in non optimize_coding mode. */
+ TIFFWarningExtR(
+ tif, module,
+ "mozjpeg library likely detected. Disable emission of "
+ "Huffman tables in JpegTables tag, and use optimize_coding "
+ "to avoid potential issues");
+ sp->otherSettings.jpegtablesmode &= ~JPEGTABLESMODE_HUFF;
+ }
+ sp->cinfo.c.num_scans = 0;
+ sp->cinfo.c.scan_info = NULL;
+
+ /* Set per-file parameters */
+ switch (sp->photometric)
+ {
+ case PHOTOMETRIC_YCBCR:
+ sp->h_sampling = td->td_ycbcrsubsampling[0];
+ sp->v_sampling = td->td_ycbcrsubsampling[1];
+ if (sp->h_sampling == 0 || sp->v_sampling == 0)
+ {
+ TIFFErrorExtR(tif, module,
+ "Invalig horizontal/vertical sampling value");
+ return (0);
+ }
+ if (td->td_bitspersample > 16)
+ {
+ TIFFErrorExtR(tif, module,
+ "BitsPerSample %" PRIu16 " not allowed for JPEG",
+ td->td_bitspersample);
+ return (0);
+ }
+
+ /*
+ * A ReferenceBlackWhite field *must* be present since the
+ * default value is inappropriate for YCbCr. Fill in the
+ * proper value if application didn't set it.
+ */
+ {
+ float *ref;
+ if (!TIFFGetField(tif, TIFFTAG_REFERENCEBLACKWHITE, &ref))
{
- TIFFErrorExt(tif->tif_clientdata, module,
- "BitsPerSample %d not allowed for JPEG",
- td->td_bitspersample);
- return (0);
+ float refbw[6];
+ long top = 1L << td->td_bitspersample;
+ refbw[0] = 0;
+ refbw[1] = (float)(top - 1L);
+ refbw[2] = (float)(top >> 1);
+ refbw[3] = refbw[1];
+ refbw[4] = refbw[2];
+ refbw[5] = refbw[1];
+ TIFFSetField(tif, TIFFTAG_REFERENCEBLACKWHITE, refbw);
}
+ }
+ break;
+ case PHOTOMETRIC_PALETTE: /* disallowed by Tech Note */
+ case PHOTOMETRIC_MASK:
+ TIFFErrorExtR(tif, module,
+ "PhotometricInterpretation %" PRIu16
+ " not allowed for JPEG",
+ sp->photometric);
+ return (0);
+ default:
+ /* TIFF 6.0 forbids subsampling of all other color spaces */
+ sp->h_sampling = 1;
+ sp->v_sampling = 1;
+ break;
+ }
+
+ /* Verify miscellaneous parameters */
- /*
- * A ReferenceBlackWhite field *must* be present since the
- * default value is inappropriate for YCbCr. Fill in the
- * proper value if application didn't set it.
- */
- {
- float *ref;
- if (!TIFFGetField(tif, TIFFTAG_REFERENCEBLACKWHITE,
- &ref)) {
- float refbw[6];
- long top = 1L << td->td_bitspersample;
- refbw[0] = 0;
- refbw[1] = (float)(top-1L);
- refbw[2] = (float)(top>>1);
- refbw[3] = refbw[1];
- refbw[4] = refbw[2];
- refbw[5] = refbw[1];
- TIFFSetField(tif, TIFFTAG_REFERENCEBLACKWHITE,
- refbw);
- }
- }
- break;
- case PHOTOMETRIC_PALETTE: /* disallowed by Tech Note */
- case PHOTOMETRIC_MASK:
- TIFFErrorExt(tif->tif_clientdata, module,
- "PhotometricInterpretation %d not allowed for JPEG",
- (int) sp->photometric);
- return (0);
- default:
- /* TIFF 6.0 forbids subsampling of all other color spaces */
- sp->h_sampling = 1;
- sp->v_sampling = 1;
- break;
- }
-
- /* Verify miscellaneous parameters */
-
- /*
- * This would need work if libtiff ever supports different
- * depths for different components, or if libjpeg ever supports
- * run-time selection of depth. Neither is imminent.
- */
+ /*
+ * This would need work if libtiff ever supports different
+ * depths for different components, or if libjpeg ever supports
+ * run-time selection of depth. Neither is imminent.
+ */
#ifdef JPEG_LIB_MK1
- /* BITS_IN_JSAMPLE now permits 8 and 12 --- dgilbert */
- if (td->td_bitspersample != 8 && td->td_bitspersample != 12)
+ /* BITS_IN_JSAMPLE now permits 8 and 12 --- dgilbert */
+ if (td->td_bitspersample != 8 && td->td_bitspersample != 12)
#else
- if (td->td_bitspersample != BITS_IN_JSAMPLE )
+ if (td->td_bitspersample != BITS_IN_JSAMPLE)
#endif
- {
- TIFFErrorExt(tif->tif_clientdata, module, "BitsPerSample %d not allowed for JPEG",
- (int) td->td_bitspersample);
- return (0);
- }
- sp->cinfo.c.data_precision = td->td_bitspersample;
+ {
+ TIFFErrorExtR(tif, module,
+ "BitsPerSample %" PRIu16 " not allowed for JPEG",
+ td->td_bitspersample);
+ return (0);
+ }
+ sp->cinfo.c.data_precision = td->td_bitspersample;
#ifdef JPEG_LIB_MK1
- sp->cinfo.c.bits_in_jsample = td->td_bitspersample;
+ sp->cinfo.c.bits_in_jsample = td->td_bitspersample;
#endif
- if (isTiled(tif)) {
- if ((td->td_tilelength % (sp->v_sampling * DCTSIZE)) != 0) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "JPEG tile height must be multiple of %d",
- sp->v_sampling * DCTSIZE);
- return (0);
- }
- if ((td->td_tilewidth % (sp->h_sampling * DCTSIZE)) != 0) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "JPEG tile width must be multiple of %d",
- sp->h_sampling * DCTSIZE);
- return (0);
- }
- } else {
- if (td->td_rowsperstrip < td->td_imagelength &&
- (td->td_rowsperstrip % (sp->v_sampling * DCTSIZE)) != 0) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "RowsPerStrip must be multiple of %d for JPEG",
- sp->v_sampling * DCTSIZE);
- return (0);
- }
- }
-
- /* Create a JPEGTables field if appropriate */
- if (sp->jpegtablesmode & (JPEGTABLESMODE_QUANT|JPEGTABLESMODE_HUFF)) {
- if( sp->jpegtables == NULL
- || memcmp(sp->jpegtables,"\0\0\0\0\0\0\0\0\0",8) == 0 )
- {
- if (!prepare_JPEGTables(tif))
- return (0);
- /* Mark the field present */
- /* Can't use TIFFSetField since BEENWRITING is already set! */
- tif->tif_flags |= TIFF_DIRTYDIRECT;
- TIFFSetFieldBit(tif, FIELD_JPEGTABLES);
- }
- } else {
- /* We do not support application-supplied JPEGTables, */
- /* so mark the field not present */
- TIFFClrFieldBit(tif, FIELD_JPEGTABLES);
- }
+ if (isTiled(tif))
+ {
+ if ((td->td_tilelength % (sp->v_sampling * DCTSIZE)) != 0)
+ {
+ TIFFErrorExtR(tif, module,
+ "JPEG tile height must be multiple of %" PRIu32,
+ (uint32_t)(sp->v_sampling * DCTSIZE));
+ return (0);
+ }
+ if ((td->td_tilewidth % (sp->h_sampling * DCTSIZE)) != 0)
+ {
+ TIFFErrorExtR(tif, module,
+ "JPEG tile width must be multiple of %" PRIu32,
+ (uint32_t)(sp->h_sampling * DCTSIZE));
+ return (0);
+ }
+ }
+ else
+ {
+ if (td->td_rowsperstrip < td->td_imagelength &&
+ (td->td_rowsperstrip % (sp->v_sampling * DCTSIZE)) != 0)
+ {
+ TIFFErrorExtR(tif, module,
+ "RowsPerStrip must be multiple of %" PRIu32
+ " for JPEG",
+ (uint32_t)(sp->v_sampling * DCTSIZE));
+ return (0);
+ }
+ }
- /* Direct libjpeg output to libtiff's output buffer */
- TIFFjpeg_data_dest(sp, tif);
+ /* Create a JPEGTables field if appropriate */
+ if (sp->otherSettings.jpegtablesmode &
+ (JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF))
+ {
+ if (sp->otherSettings.jpegtables == NULL ||
+ memcmp(sp->otherSettings.jpegtables, "\0\0\0\0\0\0\0\0\0", 8) == 0)
+ {
+#if defined(JPEG_LIB_VERSION_MAJOR) && \
+ (JPEG_LIB_VERSION_MAJOR > 9 || \
+ (JPEG_LIB_VERSION_MAJOR == 9 && JPEG_LIB_VERSION_MINOR >= 4))
+ if ((sp->otherSettings.jpegtablesmode & JPEGTABLESMODE_HUFF) != 0 &&
+ (sp->cinfo.c.dc_huff_tbl_ptrs[0] == NULL ||
+ sp->cinfo.c.dc_huff_tbl_ptrs[1] == NULL ||
+ sp->cinfo.c.ac_huff_tbl_ptrs[0] == NULL ||
+ sp->cinfo.c.ac_huff_tbl_ptrs[1] == NULL))
+ {
+ /* libjpeg-9d no longer initializes default Huffman tables in */
+ /* jpeg_set_defaults() */
+ TIFF_std_huff_tables(&sp->cinfo.c);
+ }
+#endif
- return (1);
+ if (!prepare_JPEGTables(tif))
+ return (0);
+ /* Mark the field present */
+ /* Can't use TIFFSetField since BEENWRITING is already set! */
+ tif->tif_flags |= TIFF_DIRTYDIRECT;
+ TIFFSetFieldBit(tif, FIELD_JPEGTABLES);
+ }
+ }
+ else
+ {
+ /* We do not support application-supplied JPEGTables, */
+ /* so mark the field not present */
+ TIFFClrFieldBit(tif, FIELD_JPEGTABLES);
+ }
+
+ /* Direct libjpeg output to libtiff's output buffer */
+ TIFFjpeg_data_dest(sp, tif);
+
+ return (1);
}
/*
* Set encoding state at the start of a strip or tile.
*/
-static int
-JPEGPreEncode(TIFF* tif, uint16 s)
-{
- JPEGState *sp = JState(tif);
- TIFFDirectory *td = &tif->tif_dir;
- static const char module[] = "JPEGPreEncode";
- uint32 segment_width, segment_height;
- int downsampled_input;
-
- assert(sp != NULL);
-
- if (sp->cinfo.comm.is_decompressor == 1)
- {
- tif->tif_setupencode( tif );
- }
-
- assert(!sp->cinfo.comm.is_decompressor);
- /*
- * Set encoding parameters for this strip/tile.
- */
- if (isTiled(tif)) {
- segment_width = td->td_tilewidth;
- segment_height = td->td_tilelength;
- sp->bytesperline = TIFFTileRowSize(tif);
- } else {
- segment_width = td->td_imagewidth;
- segment_height = td->td_imagelength - tif->tif_row;
- if (segment_height > td->td_rowsperstrip)
- segment_height = td->td_rowsperstrip;
- sp->bytesperline = TIFFScanlineSize(tif);
- }
- if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0) {
- /* for PC 2, scale down the strip/tile size
- * to match a downsampled component
- */
- segment_width = TIFFhowmany_32(segment_width, sp->h_sampling);
- segment_height = TIFFhowmany_32(segment_height, sp->v_sampling);
- }
- if (segment_width > 65535 || segment_height > 65535) {
- TIFFErrorExt(tif->tif_clientdata, module, "Strip/tile too large for JPEG");
- return (0);
- }
- sp->cinfo.c.image_width = segment_width;
- sp->cinfo.c.image_height = segment_height;
- downsampled_input = FALSE;
- if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
- sp->cinfo.c.input_components = td->td_samplesperpixel;
- if (sp->photometric == PHOTOMETRIC_YCBCR) {
- if (sp->jpegcolormode != JPEGCOLORMODE_RGB) {
- if (sp->h_sampling != 1 || sp->v_sampling != 1)
- downsampled_input = TRUE;
- }
- if (!TIFFjpeg_set_colorspace(sp, JCS_YCbCr))
- return (0);
- /*
- * Set Y sampling factors;
- * we assume jpeg_set_colorspace() set the rest to 1
- */
- sp->cinfo.c.comp_info[0].h_samp_factor = sp->h_sampling;
- sp->cinfo.c.comp_info[0].v_samp_factor = sp->v_sampling;
- } else {
- if (!TIFFjpeg_set_colorspace(sp, sp->cinfo.c.in_color_space))
- return (0);
- /* jpeg_set_colorspace set all sampling factors to 1 */
- }
- } else {
- if (!TIFFjpeg_set_colorspace(sp, JCS_UNKNOWN))
- return (0);
- sp->cinfo.c.comp_info[0].component_id = s;
- /* jpeg_set_colorspace() set sampling factors to 1 */
- if (sp->photometric == PHOTOMETRIC_YCBCR && s > 0) {
- sp->cinfo.c.comp_info[0].quant_tbl_no = 1;
- sp->cinfo.c.comp_info[0].dc_tbl_no = 1;
- sp->cinfo.c.comp_info[0].ac_tbl_no = 1;
- }
- }
- /* ensure libjpeg won't write any extraneous markers */
- sp->cinfo.c.write_JFIF_header = FALSE;
- sp->cinfo.c.write_Adobe_marker = FALSE;
- /* set up table handling correctly */
- /* calling TIFFjpeg_set_quality() causes quantization tables to be flagged */
- /* as being to be emitted, which we don't want in the JPEGTABLESMODE_QUANT */
- /* mode, so we must manually suppress them. However TIFFjpeg_set_quality() */
- /* should really be called when dealing with files with directories with */
- /* mixed qualities. see http://trac.osgeo.org/gdal/ticket/3539 */
- if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE))
- return (0);
- if (sp->jpegtablesmode & JPEGTABLESMODE_QUANT) {
- suppress_quant_table(sp, 0);
- suppress_quant_table(sp, 1);
- }
- else {
- unsuppress_quant_table(sp, 0);
- unsuppress_quant_table(sp, 1);
- }
- if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF)
- {
- /* Explicit suppression is only needed if we did not go through the */
- /* prepare_JPEGTables() code path, which may be the case if updating */
- /* an existing file */
- suppress_huff_table(sp, 0);
- suppress_huff_table(sp, 1);
- sp->cinfo.c.optimize_coding = FALSE;
- }
- else
- sp->cinfo.c.optimize_coding = TRUE;
- if (downsampled_input) {
- /* Need to use raw-data interface to libjpeg */
- sp->cinfo.c.raw_data_in = TRUE;
- tif->tif_encoderow = JPEGEncodeRaw;
- tif->tif_encodestrip = JPEGEncodeRaw;
- tif->tif_encodetile = JPEGEncodeRaw;
- } else {
- /* Use normal interface to libjpeg */
- sp->cinfo.c.raw_data_in = FALSE;
- tif->tif_encoderow = JPEGEncode;
- tif->tif_encodestrip = JPEGEncode;
- tif->tif_encodetile = JPEGEncode;
- }
- /* Start JPEG compressor */
- if (!TIFFjpeg_start_compress(sp, FALSE))
- return (0);
- /* Allocate downsampled-data buffers if needed */
- if (downsampled_input) {
- if (!alloc_downsampled_buffers(tif, sp->cinfo.c.comp_info,
- sp->cinfo.c.num_components))
- return (0);
- }
- sp->scancount = 0;
-
- return (1);
+static int JPEGPreEncode(TIFF *tif, uint16_t s)
+{
+ JPEGState *sp = JState(tif);
+ TIFFDirectory *td = &tif->tif_dir;
+ static const char module[] = "JPEGPreEncode";
+ uint32_t segment_width, segment_height;
+ int downsampled_input;
+
+ assert(sp != NULL);
+
+ if (sp->cinfo.comm.is_decompressor == 1)
+ {
+ tif->tif_setupencode(tif);
+ }
+
+ assert(!sp->cinfo.comm.is_decompressor);
+ /*
+ * Set encoding parameters for this strip/tile.
+ */
+ if (isTiled(tif))
+ {
+ segment_width = td->td_tilewidth;
+ segment_height = td->td_tilelength;
+ sp->bytesperline = TIFFTileRowSize(tif);
+ }
+ else
+ {
+ segment_width = td->td_imagewidth;
+ segment_height = td->td_imagelength - tif->tif_row;
+ if (segment_height > td->td_rowsperstrip)
+ segment_height = td->td_rowsperstrip;
+ sp->bytesperline = TIFFScanlineSize(tif);
+ }
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0)
+ {
+ /* for PC 2, scale down the strip/tile size
+ * to match a downsampled component
+ */
+ segment_width = TIFFhowmany_32(segment_width, sp->h_sampling);
+ segment_height = TIFFhowmany_32(segment_height, sp->v_sampling);
+ }
+ if (segment_width > 65535 || segment_height > 65535)
+ {
+ TIFFErrorExtR(tif, module, "Strip/tile too large for JPEG");
+ return (0);
+ }
+ sp->cinfo.c.image_width = segment_width;
+ sp->cinfo.c.image_height = segment_height;
+ downsampled_input = FALSE;
+ if (td->td_planarconfig == PLANARCONFIG_CONTIG)
+ {
+ sp->cinfo.c.input_components = td->td_samplesperpixel;
+ if (sp->photometric == PHOTOMETRIC_YCBCR)
+ {
+ if (sp->otherSettings.jpegcolormode != JPEGCOLORMODE_RGB)
+ {
+ if (sp->h_sampling != 1 || sp->v_sampling != 1)
+ downsampled_input = TRUE;
+ }
+ if (!TIFFjpeg_set_colorspace(sp, JCS_YCbCr))
+ return (0);
+ /*
+ * Set Y sampling factors;
+ * we assume jpeg_set_colorspace() set the rest to 1
+ */
+ sp->cinfo.c.comp_info[0].h_samp_factor = sp->h_sampling;
+ sp->cinfo.c.comp_info[0].v_samp_factor = sp->v_sampling;
+ }
+ else
+ {
+ if (!TIFFjpeg_set_colorspace(sp, sp->cinfo.c.in_color_space))
+ return (0);
+ /* jpeg_set_colorspace set all sampling factors to 1 */
+ }
+ }
+ else
+ {
+ if (!TIFFjpeg_set_colorspace(sp, JCS_UNKNOWN))
+ return (0);
+ sp->cinfo.c.comp_info[0].component_id = s;
+ /* jpeg_set_colorspace() set sampling factors to 1 */
+ if (sp->photometric == PHOTOMETRIC_YCBCR && s > 0)
+ {
+ sp->cinfo.c.comp_info[0].quant_tbl_no = 1;
+ sp->cinfo.c.comp_info[0].dc_tbl_no = 1;
+ sp->cinfo.c.comp_info[0].ac_tbl_no = 1;
+ }
+ }
+ /* ensure libjpeg won't write any extraneous markers */
+ sp->cinfo.c.write_JFIF_header = FALSE;
+ sp->cinfo.c.write_Adobe_marker = FALSE;
+ /* set up table handling correctly */
+ /* calling TIFFjpeg_set_quality() causes quantization tables to be flagged
+ */
+ /* as being to be emitted, which we don't want in the JPEGTABLESMODE_QUANT
+ */
+ /* mode, so we must manually suppress them. However TIFFjpeg_set_quality()
+ */
+ /* should really be called when dealing with files with directories with */
+ /* mixed qualities. see http://trac.osgeo.org/gdal/ticket/3539 */
+ if (!TIFFjpeg_set_quality(sp, sp->otherSettings.jpegquality, FALSE))
+ return (0);
+ if (sp->otherSettings.jpegtablesmode & JPEGTABLESMODE_QUANT)
+ {
+ suppress_quant_table(sp, 0);
+ suppress_quant_table(sp, 1);
+ }
+ else
+ {
+ unsuppress_quant_table(sp, 0);
+ unsuppress_quant_table(sp, 1);
+ }
+ if (sp->otherSettings.jpegtablesmode & JPEGTABLESMODE_HUFF)
+ {
+ /* Explicit suppression is only needed if we did not go through the */
+ /* prepare_JPEGTables() code path, which may be the case if updating */
+ /* an existing file */
+ suppress_huff_table(sp, 0);
+ suppress_huff_table(sp, 1);
+ sp->cinfo.c.optimize_coding = FALSE;
+ }
+ else
+ sp->cinfo.c.optimize_coding = TRUE;
+ if (downsampled_input)
+ {
+ /* Need to use raw-data interface to libjpeg */
+ sp->cinfo.c.raw_data_in = TRUE;
+ tif->tif_encoderow = JPEGEncodeRaw;
+ tif->tif_encodestrip = JPEGEncodeRaw;
+ tif->tif_encodetile = JPEGEncodeRaw;
+ }
+ else
+ {
+ /* Use normal interface to libjpeg */
+ sp->cinfo.c.raw_data_in = FALSE;
+ tif->tif_encoderow = JPEGEncode;
+ tif->tif_encodestrip = JPEGEncode;
+ tif->tif_encodetile = JPEGEncode;
+ }
+ /* Start JPEG compressor */
+ if (!TIFFjpeg_start_compress(sp, FALSE))
+ return (0);
+ /* Allocate downsampled-data buffers if needed */
+ if (downsampled_input)
+ {
+ if (!alloc_downsampled_buffers(tif, sp->cinfo.c.comp_info,
+ sp->cinfo.c.num_components))
+ return (0);
+ }
+ sp->scancount = 0;
+
+ return (1);
}
/*
* Encode a chunk of pixels.
* "Standard" case: incoming data is not downsampled.
*/
-static int
-JPEGEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
-{
- JPEGState *sp = JState(tif);
- tmsize_t nrows;
- JSAMPROW bufptr[1];
- short *line16 = NULL;
- int line16_count = 0;
-
- (void) s;
- assert(sp != NULL);
- /* data is expected to be supplied in multiples of a scanline */
- nrows = cc / sp->bytesperline;
- if (cc % sp->bytesperline)
- TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
- "fractional scanline discarded");
-
- /* The last strip will be limited to image size */
- if( !isTiled(tif) && tif->tif_row+nrows > tif->tif_dir.td_imagelength )
- nrows = tif->tif_dir.td_imagelength - tif->tif_row;
-
- if( sp->cinfo.c.data_precision == 12 )
+static int JPEGEncode(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s)
+{
+ JPEGState *sp = JState(tif);
+ tmsize_t nrows;
+ TIFF_JSAMPROW bufptr[1];
+ short *line16 = NULL;
+ int line16_count = 0;
+
+ (void)s;
+ assert(sp != NULL);
+ /* data is expected to be supplied in multiples of a scanline */
+ nrows = cc / sp->bytesperline;
+ if (cc % sp->bytesperline)
+ TIFFWarningExtR(tif, tif->tif_name, "fractional scanline discarded");
+
+ /* The last strip will be limited to image size */
+ if (!isTiled(tif) && tif->tif_row + nrows > tif->tif_dir.td_imagelength)
+ nrows = tif->tif_dir.td_imagelength - tif->tif_row;
+
+ if (sp->cinfo.c.data_precision == 12)
+ {
+ line16_count = (int)((sp->bytesperline * 2) / 3);
+ line16 = (short *)_TIFFmallocExt(tif, sizeof(short) * line16_count);
+ if (!line16)
{
- line16_count = (int)((sp->bytesperline * 2) / 3);
- line16 = (short *) _TIFFmalloc(sizeof(short) * line16_count);
- if (!line16)
- {
- TIFFErrorExt(tif->tif_clientdata,
- "JPEGEncode",
- "Failed to allocate memory");
+ TIFFErrorExtR(tif, "JPEGEncode", "Failed to allocate memory");
- return 0;
- }
+ return 0;
}
-
- while (nrows-- > 0) {
+ }
- if( sp->cinfo.c.data_precision == 12 )
- {
+ while (nrows-- > 0)
+ {
- int value_pairs = line16_count / 2;
- int iPair;
+ if (sp->cinfo.c.data_precision == 12)
+ {
- bufptr[0] = (JSAMPROW) line16;
+ int value_pairs = line16_count / 2;
+ int iPair;
- for( iPair = 0; iPair < value_pairs; iPair++ )
- {
- unsigned char *in_ptr =
- ((unsigned char *) buf) + iPair * 3;
- JSAMPLE *out_ptr = (JSAMPLE *) (line16 + iPair * 2);
+ bufptr[0] = (TIFF_JSAMPROW)line16;
- out_ptr[0] = (in_ptr[0] << 4) | ((in_ptr[1] & 0xf0) >> 4);
- out_ptr[1] = ((in_ptr[1] & 0x0f) << 8) | in_ptr[2];
- }
- }
- else
+ for (iPair = 0; iPair < value_pairs; iPair++)
{
- bufptr[0] = (JSAMPROW) buf;
- }
- if (TIFFjpeg_write_scanlines(sp, bufptr, 1) != 1)
- return (0);
- if (nrows > 0)
- tif->tif_row++;
- buf += sp->bytesperline;
- }
+ unsigned char *in_ptr = ((unsigned char *)buf) + iPair * 3;
+ TIFF_JSAMPLE *out_ptr = (TIFF_JSAMPLE *)(line16 + iPair * 2);
- if( sp->cinfo.c.data_precision == 12 )
+ out_ptr[0] = (in_ptr[0] << 4) | ((in_ptr[1] & 0xf0) >> 4);
+ out_ptr[1] = ((in_ptr[1] & 0x0f) << 8) | in_ptr[2];
+ }
+ }
+ else
{
- _TIFFfree( line16 );
+ bufptr[0] = (TIFF_JSAMPROW)buf;
}
-
- return (1);
+ if (TIFFjpeg_write_scanlines(sp, bufptr, 1) != 1)
+ return (0);
+ if (nrows > 0)
+ tif->tif_row++;
+ buf += sp->bytesperline;
+ }
+
+ if (sp->cinfo.c.data_precision == 12)
+ {
+ _TIFFfreeExt(tif, line16);
+ }
+
+ return (1);
}
/*
* Encode a chunk of pixels.
* Incoming data is expected to be downsampled per sampling factors.
*/
-static int
-JPEGEncodeRaw(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
-{
- JPEGState *sp = JState(tif);
- JSAMPLE* inptr;
- JSAMPLE* outptr;
- tmsize_t nrows;
- JDIMENSION clumps_per_line, nclump;
- int clumpoffset, ci, xpos, ypos;
- jpeg_component_info* compptr;
- int samples_per_clump = sp->samplesperclump;
- tmsize_t bytesperclumpline;
-
- (void) s;
- assert(sp != NULL);
- /* data is expected to be supplied in multiples of a clumpline */
- /* a clumpline is equivalent to v_sampling desubsampled scanlines */
- /* TODO: the following calculation of bytesperclumpline, should substitute calculation of sp->bytesperline, except that it is per v_sampling lines */
- bytesperclumpline = ((((tmsize_t)sp->cinfo.c.image_width+sp->h_sampling-1)/sp->h_sampling)
- *((tmsize_t)sp->h_sampling*sp->v_sampling+2)*sp->cinfo.c.data_precision+7)
- /8;
-
- nrows = ( cc / bytesperclumpline ) * sp->v_sampling;
- if (cc % bytesperclumpline)
- TIFFWarningExt(tif->tif_clientdata, tif->tif_name, "fractional scanline discarded");
-
- /* Cb,Cr both have sampling factors 1, so this is correct */
- clumps_per_line = sp->cinfo.c.comp_info[1].downsampled_width;
-
- while (nrows > 0) {
- /*
- * Fastest way to separate the data is to make one pass
- * over the scanline for each row of each component.
- */
- clumpoffset = 0; /* first sample in clump */
- for (ci = 0, compptr = sp->cinfo.c.comp_info;
- ci < sp->cinfo.c.num_components;
- ci++, compptr++) {
- int hsamp = compptr->h_samp_factor;
- int vsamp = compptr->v_samp_factor;
- int padding = (int) (compptr->width_in_blocks * DCTSIZE -
- clumps_per_line * hsamp);
- for (ypos = 0; ypos < vsamp; ypos++) {
- inptr = ((JSAMPLE*) buf) + clumpoffset;
- outptr = sp->ds_buffer[ci][sp->scancount*vsamp + ypos];
- if (hsamp == 1) {
- /* fast path for at least Cb and Cr */
- for (nclump = clumps_per_line; nclump-- > 0; ) {
- *outptr++ = inptr[0];
- inptr += samples_per_clump;
- }
- } else {
- /* general case */
- for (nclump = clumps_per_line; nclump-- > 0; ) {
- for (xpos = 0; xpos < hsamp; xpos++)
- *outptr++ = inptr[xpos];
- inptr += samples_per_clump;
- }
- }
- /* pad each scanline as needed */
- for (xpos = 0; xpos < padding; xpos++) {
- *outptr = outptr[-1];
- outptr++;
- }
- clumpoffset += hsamp;
- }
- }
- sp->scancount++;
- if (sp->scancount >= DCTSIZE) {
- int n = sp->cinfo.c.max_v_samp_factor * DCTSIZE;
- if (TIFFjpeg_write_raw_data(sp, sp->ds_buffer, n) != n)
- return (0);
- sp->scancount = 0;
- }
- tif->tif_row += sp->v_sampling;
- buf += bytesperclumpline;
- nrows -= sp->v_sampling;
- }
- return (1);
+static int JPEGEncodeRaw(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s)
+{
+ JPEGState *sp = JState(tif);
+ TIFF_JSAMPLE *inptr;
+ TIFF_JSAMPLE *outptr;
+ tmsize_t nrows;
+ JDIMENSION clumps_per_line, nclump;
+ int clumpoffset, ci, xpos, ypos;
+ jpeg_component_info *compptr;
+ int samples_per_clump = sp->samplesperclump;
+ tmsize_t bytesperclumpline;
+
+ (void)s;
+ assert(sp != NULL);
+ /* data is expected to be supplied in multiples of a clumpline */
+ /* a clumpline is equivalent to v_sampling desubsampled scanlines */
+ /* TODO: the following calculation of bytesperclumpline, should substitute
+ * calculation of sp->bytesperline, except that it is per v_sampling lines
+ */
+ bytesperclumpline =
+ ((((tmsize_t)sp->cinfo.c.image_width + sp->h_sampling - 1) /
+ sp->h_sampling) *
+ ((tmsize_t)sp->h_sampling * sp->v_sampling + 2) *
+ sp->cinfo.c.data_precision +
+ 7) /
+ 8;
+
+ nrows = (cc / bytesperclumpline) * sp->v_sampling;
+ if (cc % bytesperclumpline)
+ TIFFWarningExtR(tif, tif->tif_name, "fractional scanline discarded");
+
+ /* Cb,Cr both have sampling factors 1, so this is correct */
+ clumps_per_line = sp->cinfo.c.comp_info[1].downsampled_width;
+
+ while (nrows > 0)
+ {
+ /*
+ * Fastest way to separate the data is to make one pass
+ * over the scanline for each row of each component.
+ */
+ clumpoffset = 0; /* first sample in clump */
+ for (ci = 0, compptr = sp->cinfo.c.comp_info;
+ ci < sp->cinfo.c.num_components; ci++, compptr++)
+ {
+ int hsamp = compptr->h_samp_factor;
+ int vsamp = compptr->v_samp_factor;
+ int padding = (int)(compptr->width_in_blocks * DCTSIZE -
+ clumps_per_line * hsamp);
+ for (ypos = 0; ypos < vsamp; ypos++)
+ {
+ inptr = ((TIFF_JSAMPLE *)buf) + clumpoffset;
+ outptr = sp->ds_buffer[ci][sp->scancount * vsamp + ypos];
+ if (hsamp == 1)
+ {
+ /* fast path for at least Cb and Cr */
+ for (nclump = clumps_per_line; nclump-- > 0;)
+ {
+ *outptr++ = inptr[0];
+ inptr += samples_per_clump;
+ }
+ }
+ else
+ {
+ /* general case */
+ for (nclump = clumps_per_line; nclump-- > 0;)
+ {
+ for (xpos = 0; xpos < hsamp; xpos++)
+ *outptr++ = inptr[xpos];
+ inptr += samples_per_clump;
+ }
+ }
+ /* pad each scanline as needed */
+ for (xpos = 0; xpos < padding; xpos++)
+ {
+ *outptr = outptr[-1];
+ outptr++;
+ }
+ clumpoffset += hsamp;
+ }
+ }
+ sp->scancount++;
+ if (sp->scancount >= DCTSIZE)
+ {
+ int n = sp->cinfo.c.max_v_samp_factor * DCTSIZE;
+ if (TIFFjpeg_write_raw_data(sp, sp->ds_buffer, n) != n)
+ return (0);
+ sp->scancount = 0;
+ }
+ tif->tif_row += sp->v_sampling;
+ buf += bytesperclumpline;
+ nrows -= sp->v_sampling;
+ }
+ return (1);
}
/*
* Finish up at the end of a strip or tile.
*/
-static int
-JPEGPostEncode(TIFF* tif)
-{
- JPEGState *sp = JState(tif);
-
- if (sp->scancount > 0) {
- /*
- * Need to emit a partial bufferload of downsampled data.
- * Pad the data vertically.
- */
- int ci, ypos, n;
- jpeg_component_info* compptr;
-
- for (ci = 0, compptr = sp->cinfo.c.comp_info;
- ci < sp->cinfo.c.num_components;
- ci++, compptr++) {
- int vsamp = compptr->v_samp_factor;
- tmsize_t row_width = compptr->width_in_blocks * DCTSIZE
- * sizeof(JSAMPLE);
- for (ypos = sp->scancount * vsamp;
- ypos < DCTSIZE * vsamp; ypos++) {
- _TIFFmemcpy((void*)sp->ds_buffer[ci][ypos],
- (void*)sp->ds_buffer[ci][ypos-1],
- row_width);
-
- }
- }
- n = sp->cinfo.c.max_v_samp_factor * DCTSIZE;
- if (TIFFjpeg_write_raw_data(sp, sp->ds_buffer, n) != n)
- return (0);
- }
-
- return (TIFFjpeg_finish_compress(JState(tif)));
+static int JPEGPostEncode(TIFF *tif)
+{
+ JPEGState *sp = JState(tif);
+
+ if (sp->scancount > 0)
+ {
+ /*
+ * Need to emit a partial bufferload of downsampled data.
+ * Pad the data vertically.
+ */
+ int ci, ypos, n;
+ jpeg_component_info *compptr;
+
+ for (ci = 0, compptr = sp->cinfo.c.comp_info;
+ ci < sp->cinfo.c.num_components; ci++, compptr++)
+ {
+ int vsamp = compptr->v_samp_factor;
+ tmsize_t row_width =
+ compptr->width_in_blocks * DCTSIZE * sizeof(JSAMPLE);
+ for (ypos = sp->scancount * vsamp; ypos < DCTSIZE * vsamp; ypos++)
+ {
+ _TIFFmemcpy((void *)sp->ds_buffer[ci][ypos],
+ (void *)sp->ds_buffer[ci][ypos - 1], row_width);
+ }
+ }
+ n = sp->cinfo.c.max_v_samp_factor * DCTSIZE;
+ if (TIFFjpeg_write_raw_data(sp, sp->ds_buffer, n) != n)
+ return (0);
+ }
+
+ return (TIFFjpeg_finish_compress(JState(tif)));
}
-static void
-JPEGCleanup(TIFF* tif)
-{
- JPEGState *sp = JState(tif);
-
- assert(sp != 0);
-
- tif->tif_tagmethods.vgetfield = sp->vgetparent;
- tif->tif_tagmethods.vsetfield = sp->vsetparent;
- tif->tif_tagmethods.printdir = sp->printdir;
- if( sp->cinfo_initialized )
- TIFFjpeg_destroy(sp); /* release libjpeg resources */
- if (sp->jpegtables) /* tag value */
- _TIFFfree(sp->jpegtables);
- _TIFFfree(tif->tif_data); /* release local state */
- tif->tif_data = NULL;
-
- _TIFFSetDefaultCompressionState(tif);
-}
-
-static void
-JPEGResetUpsampled( TIFF* tif )
-{
- JPEGState* sp = JState(tif);
- TIFFDirectory* td = &tif->tif_dir;
-
- /*
- * Mark whether returned data is up-sampled or not so TIFFStripSize
- * and TIFFTileSize return values that reflect the true amount of
- * data.
- */
- tif->tif_flags &= ~TIFF_UPSAMPLED;
- if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
- if (td->td_photometric == PHOTOMETRIC_YCBCR &&
- sp->jpegcolormode == JPEGCOLORMODE_RGB) {
- tif->tif_flags |= TIFF_UPSAMPLED;
- } else {
+static void JPEGCleanup(TIFF *tif)
+{
+ JPEGState *sp = JState(tif);
+
+ assert(sp != 0);
+
+ tif->tif_tagmethods.vgetfield = sp->otherSettings.vgetparent;
+ tif->tif_tagmethods.vsetfield = sp->otherSettings.vsetparent;
+ tif->tif_tagmethods.printdir = sp->otherSettings.printdir;
+ if (sp->cinfo_initialized)
+ TIFFjpeg_destroy(sp); /* release libjpeg resources */
+ if (sp->otherSettings.jpegtables) /* tag value */
+ _TIFFfreeExt(tif, sp->otherSettings.jpegtables);
+ _TIFFfreeExt(tif, tif->tif_data); /* release local state */
+ tif->tif_data = NULL;
+
+ _TIFFSetDefaultCompressionState(tif);
+}
+
+static void JPEGResetUpsampled(TIFF *tif)
+{
+ JPEGState *sp = JState(tif);
+ TIFFDirectory *td = &tif->tif_dir;
+
+ /*
+ * Mark whether returned data is up-sampled or not so TIFFStripSize
+ * and TIFFTileSize return values that reflect the true amount of
+ * data.
+ */
+ tif->tif_flags &= ~TIFF_UPSAMPLED;
+ if (td->td_planarconfig == PLANARCONFIG_CONTIG)
+ {
+ if (td->td_photometric == PHOTOMETRIC_YCBCR &&
+ sp->otherSettings.jpegcolormode == JPEGCOLORMODE_RGB)
+ {
+ tif->tif_flags |= TIFF_UPSAMPLED;
+ }
+ else
+ {
#ifdef notdef
- if (td->td_ycbcrsubsampling[0] != 1 ||
- td->td_ycbcrsubsampling[1] != 1)
- ; /* XXX what about up-sampling? */
+ if (td->td_ycbcrsubsampling[0] != 1 ||
+ td->td_ycbcrsubsampling[1] != 1)
+ ; /* XXX what about up-sampling? */
#endif
- }
- }
+ }
+ }
- /*
- * Must recalculate cached tile size in case sampling state changed.
- * Should we really be doing this now if image size isn't set?
- */
- if( tif->tif_tilesize > 0 )
- tif->tif_tilesize = isTiled(tif) ? TIFFTileSize(tif) : (tmsize_t)(-1);
- if( tif->tif_scanlinesize > 0 )
- tif->tif_scanlinesize = TIFFScanlineSize(tif);
+ /*
+ * Must recalculate cached tile size in case sampling state changed.
+ * Should we really be doing this now if image size isn't set?
+ */
+ if (tif->tif_tilesize > 0)
+ tif->tif_tilesize = isTiled(tif) ? TIFFTileSize(tif) : (tmsize_t)(-1);
+ if (tif->tif_scanlinesize > 0)
+ tif->tif_scanlinesize = TIFFScanlineSize(tif);
}
-static int
-JPEGVSetField(TIFF* tif, uint32 tag, va_list ap)
-{
- JPEGState* sp = JState(tif);
- const TIFFField* fip;
- uint32 v32;
-
- assert(sp != NULL);
-
- switch (tag) {
- case TIFFTAG_JPEGTABLES:
- v32 = (uint32) va_arg(ap, uint32);
- if (v32 == 0) {
- /* XXX */
- return (0);
- }
- _TIFFsetByteArray(&sp->jpegtables, va_arg(ap, void*), v32);
- sp->jpegtables_length = v32;
- TIFFSetFieldBit(tif, FIELD_JPEGTABLES);
- break;
- case TIFFTAG_JPEGQUALITY:
- sp->jpegquality = (int) va_arg(ap, int);
- return (1); /* pseudo tag */
- case TIFFTAG_JPEGCOLORMODE:
- sp->jpegcolormode = (int) va_arg(ap, int);
- JPEGResetUpsampled( tif );
- return (1); /* pseudo tag */
- case TIFFTAG_PHOTOMETRIC:
- {
- int ret_value = (*sp->vsetparent)(tif, tag, ap);
- JPEGResetUpsampled( tif );
- return ret_value;
- }
- case TIFFTAG_JPEGTABLESMODE:
- sp->jpegtablesmode = (int) va_arg(ap, int);
- return (1); /* pseudo tag */
- case TIFFTAG_YCBCRSUBSAMPLING:
- /* mark the fact that we have a real ycbcrsubsampling! */
- sp->ycbcrsampling_fetched = 1;
- /* should we be recomputing upsampling info here? */
- return (*sp->vsetparent)(tif, tag, ap);
- default:
- return (*sp->vsetparent)(tif, tag, ap);
- }
-
- if ((fip = TIFFFieldWithTag(tif, tag)) != NULL) {
- TIFFSetFieldBit(tif, fip->field_bit);
- } else {
- return (0);
- }
-
- tif->tif_flags |= TIFF_DIRTYDIRECT;
- return (1);
+static int JPEGVSetField(TIFF *tif, uint32_t tag, va_list ap)
+{
+ JPEGState *sp = JState(tif);
+ const TIFFField *fip;
+ uint32_t v32;
+
+ assert(sp != NULL);
+
+ switch (tag)
+ {
+ case TIFFTAG_JPEGTABLES:
+ v32 = (uint32_t)va_arg(ap, uint32_t);
+ if (v32 == 0)
+ {
+ /* XXX */
+ return (0);
+ }
+ _TIFFsetByteArrayExt(tif, &sp->otherSettings.jpegtables,
+ va_arg(ap, void *), v32);
+ sp->otherSettings.jpegtables_length = v32;
+ TIFFSetFieldBit(tif, FIELD_JPEGTABLES);
+ break;
+ case TIFFTAG_JPEGQUALITY:
+ sp->otherSettings.jpegquality = (int)va_arg(ap, int);
+ return (1); /* pseudo tag */
+ case TIFFTAG_JPEGCOLORMODE:
+ sp->otherSettings.jpegcolormode = (int)va_arg(ap, int);
+ JPEGResetUpsampled(tif);
+ return (1); /* pseudo tag */
+ case TIFFTAG_PHOTOMETRIC:
+ {
+ int ret_value = (*sp->otherSettings.vsetparent)(tif, tag, ap);
+ JPEGResetUpsampled(tif);
+ return ret_value;
+ }
+ case TIFFTAG_JPEGTABLESMODE:
+ sp->otherSettings.jpegtablesmode = (int)va_arg(ap, int);
+ return (1); /* pseudo tag */
+ case TIFFTAG_YCBCRSUBSAMPLING:
+ /* mark the fact that we have a real ycbcrsubsampling! */
+ sp->otherSettings.ycbcrsampling_fetched = 1;
+ /* should we be recomputing upsampling info here? */
+ return (*sp->otherSettings.vsetparent)(tif, tag, ap);
+ default:
+ return (*sp->otherSettings.vsetparent)(tif, tag, ap);
+ }
+
+ if ((fip = TIFFFieldWithTag(tif, tag)) != NULL)
+ {
+ TIFFSetFieldBit(tif, fip->field_bit);
+ }
+ else
+ {
+ return (0);
+ }
+
+ tif->tif_flags |= TIFF_DIRTYDIRECT;
+ return (1);
}
-static int
-JPEGVGetField(TIFF* tif, uint32 tag, va_list ap)
-{
- JPEGState* sp = JState(tif);
-
- assert(sp != NULL);
-
- switch (tag) {
- case TIFFTAG_JPEGTABLES:
- *va_arg(ap, uint32*) = sp->jpegtables_length;
- *va_arg(ap, void**) = sp->jpegtables;
- break;
- case TIFFTAG_JPEGQUALITY:
- *va_arg(ap, int*) = sp->jpegquality;
- break;
- case TIFFTAG_JPEGCOLORMODE:
- *va_arg(ap, int*) = sp->jpegcolormode;
- break;
- case TIFFTAG_JPEGTABLESMODE:
- *va_arg(ap, int*) = sp->jpegtablesmode;
- break;
- default:
- return (*sp->vgetparent)(tif, tag, ap);
- }
- return (1);
+static int JPEGVGetField(TIFF *tif, uint32_t tag, va_list ap)
+{
+ JPEGState *sp = JState(tif);
+
+ assert(sp != NULL);
+
+ switch (tag)
+ {
+ case TIFFTAG_JPEGTABLES:
+ *va_arg(ap, uint32_t *) = sp->otherSettings.jpegtables_length;
+ *va_arg(ap, const void **) = sp->otherSettings.jpegtables;
+ break;
+ case TIFFTAG_JPEGQUALITY:
+ *va_arg(ap, int *) = sp->otherSettings.jpegquality;
+ break;
+ case TIFFTAG_JPEGCOLORMODE:
+ *va_arg(ap, int *) = sp->otherSettings.jpegcolormode;
+ break;
+ case TIFFTAG_JPEGTABLESMODE:
+ *va_arg(ap, int *) = sp->otherSettings.jpegtablesmode;
+ break;
+ default:
+ return (*sp->otherSettings.vgetparent)(tif, tag, ap);
+ }
+ return (1);
}
-static void
-JPEGPrintDir(TIFF* tif, FILE* fd, long flags)
+static void JPEGPrintDir(TIFF *tif, FILE *fd, long flags)
{
- JPEGState* sp = JState(tif);
+ JPEGState *sp = JState(tif);
- assert(sp != NULL);
- (void) flags;
+ assert(sp != NULL);
+ (void)flags;
- if( sp != NULL ) {
- if (TIFFFieldSet(tif,FIELD_JPEGTABLES))
- fprintf(fd, " JPEG Tables: (%lu bytes)\n",
- (unsigned long) sp->jpegtables_length);
- if (sp->printdir)
- (*sp->printdir)(tif, fd, flags);
- }
+ if (sp != NULL)
+ {
+ if (TIFFFieldSet(tif, FIELD_JPEGTABLES))
+ fprintf(fd, " JPEG Tables: (%" PRIu32 " bytes)\n",
+ sp->otherSettings.jpegtables_length);
+ if (sp->otherSettings.printdir)
+ (*sp->otherSettings.printdir)(tif, fd, flags);
+ }
}
-static uint32
-JPEGDefaultStripSize(TIFF* tif, uint32 s)
+static uint32_t JPEGDefaultStripSize(TIFF *tif, uint32_t s)
{
- JPEGState* sp = JState(tif);
- TIFFDirectory *td = &tif->tif_dir;
+ JPEGState *sp = JState(tif);
+ TIFFDirectory *td = &tif->tif_dir;
- s = (*sp->defsparent)(tif, s);
- if (s < td->td_imagelength)
- s = TIFFroundup_32(s, td->td_ycbcrsubsampling[1] * DCTSIZE);
- return (s);
+ s = (*sp->otherSettings.defsparent)(tif, s);
+ if (s < td->td_imagelength)
+ s = TIFFroundup_32(s, td->td_ycbcrsubsampling[1] * DCTSIZE);
+ return (s);
}
-static void
-JPEGDefaultTileSize(TIFF* tif, uint32* tw, uint32* th)
+static void JPEGDefaultTileSize(TIFF *tif, uint32_t *tw, uint32_t *th)
{
- JPEGState* sp = JState(tif);
- TIFFDirectory *td = &tif->tif_dir;
+ JPEGState *sp = JState(tif);
+ TIFFDirectory *td = &tif->tif_dir;
- (*sp->deftparent)(tif, tw, th);
- *tw = TIFFroundup_32(*tw, td->td_ycbcrsubsampling[0] * DCTSIZE);
- *th = TIFFroundup_32(*th, td->td_ycbcrsubsampling[1] * DCTSIZE);
+ (*sp->otherSettings.deftparent)(tif, tw, th);
+ *tw = TIFFroundup_32(*tw, td->td_ycbcrsubsampling[0] * DCTSIZE);
+ *th = TIFFroundup_32(*th, td->td_ycbcrsubsampling[1] * DCTSIZE);
}
/*
* The JPEG library initialized used to be done in TIFFInitJPEG(), but
* now that we allow a TIFF file to be opened in update mode it is necessary
* to have some way of deciding whether compression or decompression is
- * desired other than looking at tif->tif_mode. We accomplish this by
+ * desired other than looking at tif->tif_mode. We accomplish this by
* examining {TILE/STRIP}BYTECOUNTS to see if there is a non-zero entry.
- * If so, we assume decompression is desired.
+ * If so, we assume decompression is desired.
*
* This is tricky, because TIFFInitJPEG() is called while the directory is
* being read, and generally speaking the BYTECOUNTS tag won't have been read
* at that point. So we try to defer jpeg library initialization till we
* do have that tag ... basically any access that might require the compressor
- * or decompressor that occurs after the reading of the directory.
+ * or decompressor that occurs after the reading of the directory.
*
* In an ideal world compressors or decompressors would be setup
* at the point where a single tile or strip was accessed (for read or write)
@@ -2423,16 +2719,16 @@ JPEGDefaultTileSize(TIFF* tif, uint32* tw, uint32* th)
* NFW, Feb 3rd, 2003.
*/
-static int JPEGInitializeLibJPEG( TIFF * tif, int decompress )
+static int JPEGInitializeLibJPEG(TIFF *tif, int decompress)
{
- JPEGState* sp = JState(tif);
+ JPEGState *sp = JState(tif);
- if(sp->cinfo_initialized)
+ if (sp->cinfo_initialized)
{
- if( !decompress && sp->cinfo.comm.is_decompressor )
- TIFFjpeg_destroy( sp );
- else if( decompress && !sp->cinfo.comm.is_decompressor )
- TIFFjpeg_destroy( sp );
+ if (!decompress && sp->cinfo.comm.is_decompressor)
+ TIFFjpeg_destroy(sp);
+ else if (decompress && !sp->cinfo.comm.is_decompressor)
+ TIFFjpeg_destroy(sp);
else
return 1;
@@ -2442,29 +2738,36 @@ static int JPEGInitializeLibJPEG( TIFF * tif, int decompress )
/*
* Initialize libjpeg.
*/
- if ( decompress ) {
+ if (decompress)
+ {
if (!TIFFjpeg_create_decompress(sp))
return (0);
- } else {
+ }
+ else
+ {
if (!TIFFjpeg_create_compress(sp))
return (0);
#ifndef TIFF_JPEG_MAX_MEMORY_TO_USE
#define TIFF_JPEG_MAX_MEMORY_TO_USE (10 * 1024 * 1024)
#endif
/* libjpeg turbo 1.5.2 honours max_memory_to_use, but has no backing */
- /* store implementation, so better not set max_memory_to_use ourselves. */
+ /* store implementation, so better not set max_memory_to_use ourselves.
+ */
/* See https://github.com/libjpeg-turbo/libjpeg-turbo/issues/162 */
- if( sp->cinfo.c.mem->max_memory_to_use > 0 )
+ if (sp->cinfo.c.mem->max_memory_to_use > 0)
{
/* This is to address bug related in ticket GDAL #1795. */
if (getenv("JPEGMEM") == NULL)
{
- /* Increase the max memory usable. This helps when creating files */
+ /* Increase the max memory usable. This helps when creating
+ * files */
/* with "big" tile, without using libjpeg temporary files. */
/* For example a 512x512 tile with 3 bands */
/* requires 1.5 MB which is above libjpeg 1MB default */
- if( sp->cinfo.c.mem->max_memory_to_use < TIFF_JPEG_MAX_MEMORY_TO_USE )
- sp->cinfo.c.mem->max_memory_to_use = TIFF_JPEG_MAX_MEMORY_TO_USE;
+ if (sp->cinfo.c.mem->max_memory_to_use <
+ TIFF_JPEG_MAX_MEMORY_TO_USE)
+ sp->cinfo.c.mem->max_memory_to_use =
+ TIFF_JPEG_MAX_MEMORY_TO_USE;
}
}
}
@@ -2474,123 +2777,124 @@ static int JPEGInitializeLibJPEG( TIFF * tif, int decompress )
return 1;
}
-int
-TIFFInitJPEG(TIFF* tif, int scheme)
-{
- JPEGState* sp;
-
- assert(scheme == COMPRESSION_JPEG);
-
- /*
- * Merge codec-specific tag information.
- */
- if (!_TIFFMergeFields(tif, jpegFields, TIFFArrayCount(jpegFields))) {
- TIFFErrorExt(tif->tif_clientdata,
- "TIFFInitJPEG",
- "Merging JPEG codec-specific tags failed");
- return 0;
- }
-
- /*
- * Allocate state block so tag methods have storage to record values.
- */
- tif->tif_data = (uint8*) _TIFFmalloc(sizeof (JPEGState));
-
- if (tif->tif_data == NULL) {
- TIFFErrorExt(tif->tif_clientdata,
- "TIFFInitJPEG", "No space for JPEG state block");
- return 0;
- }
- _TIFFmemset(tif->tif_data, 0, sizeof(JPEGState));
-
- sp = JState(tif);
- sp->tif = tif; /* back link */
-
- /*
- * Override parent get/set field methods.
- */
- sp->vgetparent = tif->tif_tagmethods.vgetfield;
- tif->tif_tagmethods.vgetfield = JPEGVGetField; /* hook for codec tags */
- sp->vsetparent = tif->tif_tagmethods.vsetfield;
- tif->tif_tagmethods.vsetfield = JPEGVSetField; /* hook for codec tags */
- sp->printdir = tif->tif_tagmethods.printdir;
- tif->tif_tagmethods.printdir = JPEGPrintDir; /* hook for codec tags */
-
- /* Default values for codec-specific fields */
- sp->jpegtables = NULL;
- sp->jpegtables_length = 0;
- sp->jpegquality = 75; /* Default IJG quality */
- sp->jpegcolormode = JPEGCOLORMODE_RAW;
- sp->jpegtablesmode = JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF;
- sp->ycbcrsampling_fetched = 0;
-
- /*
- * Install codec methods.
- */
- tif->tif_fixuptags = JPEGFixupTags;
- tif->tif_setupdecode = JPEGSetupDecode;
- tif->tif_predecode = JPEGPreDecode;
- tif->tif_decoderow = JPEGDecode;
- tif->tif_decodestrip = JPEGDecode;
- tif->tif_decodetile = JPEGDecode;
- tif->tif_setupencode = JPEGSetupEncode;
- tif->tif_preencode = JPEGPreEncode;
- tif->tif_postencode = JPEGPostEncode;
- tif->tif_encoderow = JPEGEncode;
- tif->tif_encodestrip = JPEGEncode;
- tif->tif_encodetile = JPEGEncode;
- tif->tif_cleanup = JPEGCleanup;
- sp->defsparent = tif->tif_defstripsize;
- tif->tif_defstripsize = JPEGDefaultStripSize;
- sp->deftparent = tif->tif_deftilesize;
- tif->tif_deftilesize = JPEGDefaultTileSize;
- tif->tif_flags |= TIFF_NOBITREV; /* no bit reversal, please */
-
- sp->cinfo_initialized = FALSE;
-
- /*
- ** Create a JPEGTables field if no directory has yet been created.
- ** We do this just to ensure that sufficient space is reserved for
- ** the JPEGTables field. It will be properly created the right
- ** size later.
+/* Common to tif_jpeg.c and tif_jpeg_12.c */
+static void TIFFInitJPEGCommon(TIFF *tif)
+{
+ JPEGState *sp;
+
+ sp = JState(tif);
+ sp->tif = tif; /* back link */
+
+ /* Default values for codec-specific fields */
+ sp->otherSettings.jpegtables = NULL;
+ sp->otherSettings.jpegtables_length = 0;
+ sp->otherSettings.jpegquality = 75; /* Default IJG quality */
+ sp->otherSettings.jpegcolormode = JPEGCOLORMODE_RAW;
+ sp->otherSettings.jpegtablesmode =
+ JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF;
+ sp->otherSettings.ycbcrsampling_fetched = 0;
+
+ tif->tif_tagmethods.vgetfield = JPEGVGetField; /* hook for codec tags */
+ tif->tif_tagmethods.vsetfield = JPEGVSetField; /* hook for codec tags */
+ tif->tif_tagmethods.printdir = JPEGPrintDir; /* hook for codec tags */
+
+ /*
+ * Install codec methods.
+ */
+ tif->tif_fixuptags = JPEGFixupTags;
+ tif->tif_setupdecode = JPEGSetupDecode;
+ tif->tif_predecode = JPEGPreDecode;
+ tif->tif_decoderow = JPEGDecode;
+ tif->tif_decodestrip = JPEGDecode;
+ tif->tif_decodetile = JPEGDecode;
+ tif->tif_setupencode = JPEGSetupEncode;
+ tif->tif_preencode = JPEGPreEncode;
+ tif->tif_postencode = JPEGPostEncode;
+ tif->tif_encoderow = JPEGEncode;
+ tif->tif_encodestrip = JPEGEncode;
+ tif->tif_encodetile = JPEGEncode;
+ tif->tif_cleanup = JPEGCleanup;
+
+ tif->tif_defstripsize = JPEGDefaultStripSize;
+ tif->tif_deftilesize = JPEGDefaultTileSize;
+ tif->tif_flags |= TIFF_NOBITREV; /* no bit reversal, please */
+ sp->cinfo_initialized = FALSE;
+}
+
+int TIFFInitJPEG(TIFF *tif, int scheme)
+{
+ JPEGState *sp;
+
+ (void)scheme;
+ assert(scheme == COMPRESSION_JPEG);
+
+ /*
+ * Merge codec-specific tag information.
+ */
+ if (!_TIFFMergeFields(tif, jpegFields, TIFFArrayCount(jpegFields)))
+ {
+ TIFFErrorExtR(tif, "TIFFInitJPEG",
+ "Merging JPEG codec-specific tags failed");
+ return 0;
+ }
+
+ /*
+ * Allocate state block so tag methods have storage to record values.
+ */
+ tif->tif_data = (uint8_t *)_TIFFmallocExt(tif, sizeof(JPEGState));
+
+ if (tif->tif_data == NULL)
+ {
+ TIFFErrorExtR(tif, "TIFFInitJPEG", "No space for JPEG state block");
+ return 0;
+ }
+ _TIFFmemset(tif->tif_data, 0, sizeof(JPEGState));
+
+ sp = JState(tif);
+ /*
+ * Override parent get/set field methods.
+ */
+ sp->otherSettings.vgetparent = tif->tif_tagmethods.vgetfield;
+ sp->otherSettings.vsetparent = tif->tif_tagmethods.vsetfield;
+ sp->otherSettings.printdir = tif->tif_tagmethods.printdir;
+
+ sp->otherSettings.defsparent = tif->tif_defstripsize;
+ sp->otherSettings.deftparent = tif->tif_deftilesize;
+
+ TIFFInitJPEGCommon(tif);
+
+ /*
+ ** Create a JPEGTables field if no directory has yet been created.
+ ** We do this just to ensure that sufficient space is reserved for
+ ** the JPEGTables field. It will be properly created the right
+ ** size later.
+ */
+ if (tif->tif_diroff == 0)
+ {
+#define SIZE_OF_JPEGTABLES 2000
+ /*
+ The following line assumes incorrectly that all JPEG-in-TIFF files will
+ have a JPEGTABLES tag generated and causes null-filled JPEGTABLES tags
+ to be written when the JPEG data is placed with TIFFWriteRawStrip. The
+ field bit should be set, anyway, later when actual JPEGTABLES header is
+ generated, so removing it here hopefully is harmless.
+ TIFFSetFieldBit(tif, FIELD_JPEGTABLES);
*/
- if( tif->tif_diroff == 0 )
+ sp->otherSettings.jpegtables_length = SIZE_OF_JPEGTABLES;
+ sp->otherSettings.jpegtables =
+ (void *)_TIFFmallocExt(tif, sp->otherSettings.jpegtables_length);
+ if (sp->otherSettings.jpegtables)
{
-#define SIZE_OF_JPEGTABLES 2000
-/*
-The following line assumes incorrectly that all JPEG-in-TIFF files will have
-a JPEGTABLES tag generated and causes null-filled JPEGTABLES tags to be written
-when the JPEG data is placed with TIFFWriteRawStrip. The field bit should be
-set, anyway, later when actual JPEGTABLES header is generated, so removing it
-here hopefully is harmless.
- TIFFSetFieldBit(tif, FIELD_JPEGTABLES);
-*/
- sp->jpegtables_length = SIZE_OF_JPEGTABLES;
- sp->jpegtables = (void *) _TIFFmalloc(sp->jpegtables_length);
- if (sp->jpegtables)
- {
- _TIFFmemset(sp->jpegtables, 0, SIZE_OF_JPEGTABLES);
- }
- else
- {
- TIFFErrorExt(tif->tif_clientdata,
- "TIFFInitJPEG",
- "Failed to allocate memory for JPEG tables");
- return 0;
- }
-#undef SIZE_OF_JPEGTABLES
+ _TIFFmemset(sp->otherSettings.jpegtables, 0, SIZE_OF_JPEGTABLES);
}
-
- return 1;
+ else
+ {
+ TIFFErrorExtR(tif, "TIFFInitJPEG",
+ "Failed to allocate memory for JPEG tables");
+ return 0;
+ }
+#undef SIZE_OF_JPEGTABLES
+ }
+ return 1;
}
#endif /* JPEG_SUPPORT */
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_jpeg_12.c b/src/3rdparty/libtiff/libtiff/tif_jpeg_12.c
index b458c25..406e1cf 100644
--- a/src/3rdparty/libtiff/libtiff/tif_jpeg_12.c
+++ b/src/3rdparty/libtiff/libtiff/tif_jpeg_12.c
@@ -1,69 +1,63 @@
#include "tiffiop.h"
+#if defined(HAVE_JPEGTURBO_DUAL_MODE_8_12)
+#define JPEG_DUAL_MODE_8_12
+#endif
+
#if defined(JPEG_DUAL_MODE_8_12)
-# define TIFFInitJPEG TIFFInitJPEG_12
-# define TIFFJPEGIsFullStripRequired TIFFJPEGIsFullStripRequired_12
+#define FROM_TIF_JPEG_12
+
+#ifdef TIFFInitJPEG
+#undef TIFFInitJPEG
+#endif
+#define TIFFInitJPEG TIFFInitJPEG_12
-int
-TIFFInitJPEG_12(TIFF* tif, int scheme);
+#ifdef TIFFJPEGIsFullStripRequired
+#undef TIFFJPEGIsFullStripRequired
+#endif
+#define TIFFJPEGIsFullStripRequired TIFFJPEGIsFullStripRequired_12
-# include LIBJPEG_12_PATH
+int TIFFInitJPEG_12(TIFF *tif, int scheme);
-# include "tif_jpeg.c"
+#if !defined(HAVE_JPEGTURBO_DUAL_MODE_8_12)
+#include LIBJPEG_12_PATH
+#endif
-int TIFFReInitJPEG_12( TIFF *tif, int scheme, int is_encode )
+#include "tif_jpeg.c"
+int TIFFReInitJPEG_12(TIFF *tif, const JPEGOtherSettings *otherSettings,
+ int scheme, int is_encode)
{
- JPEGState* sp;
+ JPEGState *sp;
+ uint8_t *new_tif_data;
+ (void)scheme;
assert(scheme == COMPRESSION_JPEG);
+ new_tif_data =
+ (uint8_t *)_TIFFreallocExt(tif, tif->tif_data, sizeof(JPEGState));
+
+ if (new_tif_data == NULL)
+ {
+ TIFFErrorExtR(tif, "TIFFReInitJPEG_12",
+ "No space for JPEG state block");
+ return 0;
+ }
+
+ tif->tif_data = new_tif_data;
+ _TIFFmemset(tif->tif_data, 0, sizeof(JPEGState));
+
+ TIFFInitJPEGCommon(tif);
+
sp = JState(tif);
- sp->tif = tif; /* back link */
-
- /*
- * Override parent get/set field methods.
- */
- tif->tif_tagmethods.vgetfield = JPEGVGetField; /* hook for codec tags */
- tif->tif_tagmethods.vsetfield = JPEGVSetField; /* hook for codec tags */
- tif->tif_tagmethods.printdir = JPEGPrintDir; /* hook for codec tags */
-
- /*
- * Install codec methods.
- */
- tif->tif_fixuptags = JPEGFixupTags;
- tif->tif_setupdecode = JPEGSetupDecode;
- tif->tif_predecode = JPEGPreDecode;
- tif->tif_decoderow = JPEGDecode;
- tif->tif_decodestrip = JPEGDecode;
- tif->tif_decodetile = JPEGDecode;
- tif->tif_setupencode = JPEGSetupEncode;
- tif->tif_preencode = JPEGPreEncode;
- tif->tif_postencode = JPEGPostEncode;
- tif->tif_encoderow = JPEGEncode;
- tif->tif_encodestrip = JPEGEncode;
- tif->tif_encodetile = JPEGEncode;
- tif->tif_cleanup = JPEGCleanup;
- tif->tif_defstripsize = JPEGDefaultStripSize;
- tif->tif_deftilesize = JPEGDefaultTileSize;
- tif->tif_flags |= TIFF_NOBITREV; /* no bit reversal, please */
-
- sp->cinfo_initialized = FALSE;
-
- if( is_encode )
+ sp->otherSettings = *otherSettings;
+
+ if (is_encode)
return JPEGSetupEncode(tif);
else
return JPEGSetupDecode(tif);
}
#endif /* defined(JPEG_DUAL_MODE_8_12) */
-
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_lerc.c b/src/3rdparty/libtiff/libtiff/tif_lerc.c
new file mode 100644
index 0000000..99de713
--- /dev/null
+++ b/src/3rdparty/libtiff/libtiff/tif_lerc.c
@@ -0,0 +1,1206 @@
+/*
+ * Copyright (c) 2018, Even Rouault
+ * Author: <even.rouault at spatialys.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "tiffiop.h"
+#ifdef LERC_SUPPORT
+/*
+ * TIFF Library.
+ *
+ * LERC Compression Support
+ *
+ */
+
+#include "Lerc_c_api.h"
+#include "zlib.h"
+#ifdef ZSTD_SUPPORT
+#include "zstd.h"
+#endif
+
+#if LIBDEFLATE_SUPPORT
+#include "libdeflate.h"
+#endif
+#define LIBDEFLATE_MAX_COMPRESSION_LEVEL 12
+
+#include <assert.h>
+
+#define LSTATE_INIT_DECODE 0x01
+#define LSTATE_INIT_ENCODE 0x02
+
+#ifndef LERC_AT_LEAST_VERSION
+#define LERC_AT_LEAST_VERSION(maj, min, patch) 0
+#endif
+
+/*
+ * State block for each open TIFF file using LERC compression/decompression.
+ */
+typedef struct
+{
+ double maxzerror; /* max z error */
+ int lerc_version;
+ int additional_compression;
+ int zstd_compress_level; /* zstd */
+ int zipquality; /* deflate */
+ int state; /* state flags */
+
+ uint32_t segment_width;
+ uint32_t segment_height;
+
+ unsigned int uncompressed_size;
+ unsigned int uncompressed_alloc;
+ uint8_t *uncompressed_buffer;
+ unsigned int uncompressed_offset;
+
+ unsigned int mask_size;
+ uint8_t *mask_buffer;
+
+ unsigned int compressed_size;
+ void *compressed_buffer;
+
+#if LIBDEFLATE_SUPPORT
+ struct libdeflate_decompressor *libdeflate_dec;
+ struct libdeflate_compressor *libdeflate_enc;
+#endif
+
+ TIFFVGetMethod vgetparent; /* super-class method */
+ TIFFVSetMethod vsetparent; /* super-class method */
+} LERCState;
+
+#define LState(tif) ((LERCState *)(tif)->tif_data)
+#define DecoderState(tif) LState(tif)
+#define EncoderState(tif) LState(tif)
+
+static int LERCEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s);
+static int LERCDecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s);
+
+static int LERCFixupTags(TIFF *tif)
+{
+ (void)tif;
+ return 1;
+}
+
+static int LERCSetupDecode(TIFF *tif)
+{
+ LERCState *sp = DecoderState(tif);
+
+ assert(sp != NULL);
+
+ /* if we were last encoding, terminate this mode */
+ if (sp->state & LSTATE_INIT_ENCODE)
+ {
+ sp->state = 0;
+ }
+
+ sp->state |= LSTATE_INIT_DECODE;
+ return 1;
+}
+
+static int GetLercDataType(TIFF *tif)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+ static const char module[] = "GetLercDataType";
+
+ if (td->td_sampleformat == SAMPLEFORMAT_INT && td->td_bitspersample == 8)
+ {
+ return 0;
+ }
+
+ if (td->td_sampleformat == SAMPLEFORMAT_UINT && td->td_bitspersample == 8)
+ {
+ return 1;
+ }
+
+ if (td->td_sampleformat == SAMPLEFORMAT_INT && td->td_bitspersample == 16)
+ {
+ return 2;
+ }
+
+ if (td->td_sampleformat == SAMPLEFORMAT_UINT && td->td_bitspersample == 16)
+ {
+ return 3;
+ }
+
+ if (td->td_sampleformat == SAMPLEFORMAT_INT && td->td_bitspersample == 32)
+ {
+ return 4;
+ }
+
+ if (td->td_sampleformat == SAMPLEFORMAT_UINT && td->td_bitspersample == 32)
+ {
+ return 5;
+ }
+
+ if (td->td_sampleformat == SAMPLEFORMAT_IEEEFP &&
+ td->td_bitspersample == 32)
+ {
+ return 6;
+ }
+
+ if (td->td_sampleformat == SAMPLEFORMAT_IEEEFP &&
+ td->td_bitspersample == 64)
+ {
+ return 7;
+ }
+
+ TIFFErrorExtR(
+ tif, module,
+ "Unsupported combination of SampleFormat and td_bitspersample");
+ return -1;
+}
+
+static int SetupUncompressedBuffer(TIFF *tif, LERCState *sp, const char *module)
+{
+ TIFFDirectory *td = &tif->tif_dir;
+ uint64_t new_size_64;
+ uint64_t new_alloc_64;
+ unsigned int new_size;
+ unsigned int new_alloc;
+
+ sp->uncompressed_offset = 0;
+
+ if (isTiled(tif))
+ {
+ sp->segment_width = td->td_tilewidth;
+ sp->segment_height = td->td_tilelength;
+ }
+ else
+ {
+ sp->segment_width = td->td_imagewidth;
+ sp->segment_height = td->td_imagelength - tif->tif_row;
+ if (sp->segment_height > td->td_rowsperstrip)
+ sp->segment_height = td->td_rowsperstrip;
+ }
+
+ new_size_64 = (uint64_t)sp->segment_width * sp->segment_height *
+ (td->td_bitspersample / 8);
+ if (td->td_planarconfig == PLANARCONFIG_CONTIG)
+ {
+ new_size_64 *= td->td_samplesperpixel;
+ }
+
+ new_size = (unsigned int)new_size_64;
+ sp->uncompressed_size = new_size;
+
+ /* add some margin as we are going to use it also to store deflate/zstd
+ * compressed data */
+ new_alloc_64 = 100 + new_size_64 + new_size_64 / 3;
+#ifdef ZSTD_SUPPORT
+ {
+ size_t zstd_max = ZSTD_compressBound((size_t)new_size_64);
+ if (new_alloc_64 < zstd_max)
+ {
+ new_alloc_64 = zstd_max;
+ }
+ }
+#endif
+ new_alloc = (unsigned int)new_alloc_64;
+ if (new_alloc != new_alloc_64)
+ {
+ TIFFErrorExtR(tif, module, "Too large uncompressed strip/tile");
+ _TIFFfreeExt(tif, sp->uncompressed_buffer);
+ sp->uncompressed_buffer = 0;
+ sp->uncompressed_alloc = 0;
+ return 0;
+ }
+
+ if (sp->uncompressed_alloc < new_alloc)
+ {
+ _TIFFfreeExt(tif, sp->uncompressed_buffer);
+ sp->uncompressed_buffer = _TIFFmallocExt(tif, new_alloc);
+ if (!sp->uncompressed_buffer)
+ {
+ TIFFErrorExtR(tif, module, "Cannot allocate buffer");
+ _TIFFfreeExt(tif, sp->uncompressed_buffer);
+ sp->uncompressed_buffer = 0;
+ sp->uncompressed_alloc = 0;
+ return 0;
+ }
+ sp->uncompressed_alloc = new_alloc;
+ }
+
+ if ((td->td_planarconfig == PLANARCONFIG_CONTIG &&
+ td->td_extrasamples > 0 &&
+ td->td_sampleinfo[td->td_extrasamples - 1] == EXTRASAMPLE_UNASSALPHA &&
+ GetLercDataType(tif) == 1) ||
+ (td->td_sampleformat == SAMPLEFORMAT_IEEEFP &&
+ (td->td_planarconfig == PLANARCONFIG_SEPARATE ||
+ td->td_samplesperpixel == 1) &&
+ (td->td_bitspersample == 32 || td->td_bitspersample == 64)))
+ {
+ unsigned int mask_size = sp->segment_width * sp->segment_height;
+ if (sp->mask_size < mask_size)
+ {
+ void *mask_buffer =
+ _TIFFreallocExt(tif, sp->mask_buffer, mask_size);
+ if (mask_buffer == NULL)
+ {
+ TIFFErrorExtR(tif, module, "Cannot allocate buffer");
+ sp->mask_size = 0;
+ _TIFFfreeExt(tif, sp->uncompressed_buffer);
+ sp->uncompressed_buffer = 0;
+ sp->uncompressed_alloc = 0;
+ return 0;
+ }
+ sp->mask_buffer = (uint8_t *)mask_buffer;
+ sp->mask_size = mask_size;
+ }
+ }
+
+ return 1;
+}
+
+/*
+ * Setup state for decoding a strip.
+ */
+static int LERCPreDecode(TIFF *tif, uint16_t s)
+{
+ static const char module[] = "LERCPreDecode";
+ lerc_status lerc_ret;
+ TIFFDirectory *td = &tif->tif_dir;
+ LERCState *sp = DecoderState(tif);
+ int lerc_data_type;
+ unsigned int infoArray[8];
+ unsigned nomask_bands = td->td_samplesperpixel;
+ int ndims;
+ int use_mask = 0;
+ uint8_t *lerc_data = tif->tif_rawcp;
+ unsigned int lerc_data_size = (unsigned int)tif->tif_rawcc;
+
+ (void)s;
+ assert(sp != NULL);
+ if (sp->state != LSTATE_INIT_DECODE)
+ tif->tif_setupdecode(tif);
+
+ lerc_data_type = GetLercDataType(tif);
+ if (lerc_data_type < 0)
+ return 0;
+
+ if (!SetupUncompressedBuffer(tif, sp, module))
+ return 0;
+
+ if (sp->additional_compression != LERC_ADD_COMPRESSION_NONE)
+ {
+ if (sp->compressed_size < sp->uncompressed_alloc)
+ {
+ _TIFFfreeExt(tif, sp->compressed_buffer);
+ sp->compressed_buffer = _TIFFmallocExt(tif, sp->uncompressed_alloc);
+ if (!sp->compressed_buffer)
+ {
+ sp->compressed_size = 0;
+ return 0;
+ }
+ sp->compressed_size = sp->uncompressed_alloc;
+ }
+ }
+
+ if (sp->additional_compression == LERC_ADD_COMPRESSION_DEFLATE)
+ {
+#if LIBDEFLATE_SUPPORT
+ enum libdeflate_result res;
+ size_t lerc_data_sizet = 0;
+ if (sp->libdeflate_dec == NULL)
+ {
+ sp->libdeflate_dec = libdeflate_alloc_decompressor();
+ if (sp->libdeflate_dec == NULL)
+ {
+ TIFFErrorExtR(tif, module, "Cannot allocate decompressor");
+ return 0;
+ }
+ }
+
+ res = libdeflate_zlib_decompress(
+ sp->libdeflate_dec, tif->tif_rawcp, (size_t)tif->tif_rawcc,
+ sp->compressed_buffer, sp->compressed_size, &lerc_data_sizet);
+ if (res != LIBDEFLATE_SUCCESS)
+ {
+ TIFFErrorExtR(tif, module, "Decoding error at scanline %lu",
+ (unsigned long)tif->tif_row);
+ return 0;
+ }
+ assert(lerc_data_sizet == (unsigned int)lerc_data_sizet);
+ lerc_data = sp->compressed_buffer;
+ lerc_data_size = (unsigned int)lerc_data_sizet;
+#else
+ z_stream strm;
+ int zlib_ret;
+
+ memset(&strm, 0, sizeof(strm));
+ strm.zalloc = NULL;
+ strm.zfree = NULL;
+ strm.opaque = NULL;
+ zlib_ret = inflateInit(&strm);
+ if (zlib_ret != Z_OK)
+ {
+ TIFFErrorExtR(tif, module, "inflateInit() failed");
+ inflateEnd(&strm);
+ return 0;
+ }
+
+ strm.avail_in = (uInt)tif->tif_rawcc;
+ strm.next_in = tif->tif_rawcp;
+ strm.avail_out = sp->compressed_size;
+ strm.next_out = sp->compressed_buffer;
+ zlib_ret = inflate(&strm, Z_FINISH);
+ if (zlib_ret != Z_STREAM_END && zlib_ret != Z_OK)
+ {
+ TIFFErrorExtR(tif, module, "inflate() failed");
+ inflateEnd(&strm);
+ return 0;
+ }
+ lerc_data = sp->compressed_buffer;
+ lerc_data_size = sp->compressed_size - strm.avail_out;
+ inflateEnd(&strm);
+#endif
+ }
+ else if (sp->additional_compression == LERC_ADD_COMPRESSION_ZSTD)
+ {
+#ifdef ZSTD_SUPPORT
+ size_t zstd_ret;
+
+ zstd_ret = ZSTD_decompress(sp->compressed_buffer, sp->compressed_size,
+ tif->tif_rawcp, tif->tif_rawcc);
+ if (ZSTD_isError(zstd_ret))
+ {
+ TIFFErrorExtR(tif, module, "Error in ZSTD_decompress(): %s",
+ ZSTD_getErrorName(zstd_ret));
+ return 0;
+ }
+
+ lerc_data = sp->compressed_buffer;
+ lerc_data_size = (unsigned int)zstd_ret;
+#else
+ TIFFErrorExtR(tif, module, "ZSTD support missing");
+ return 0;
+#endif
+ }
+ else if (sp->additional_compression != LERC_ADD_COMPRESSION_NONE)
+ {
+ TIFFErrorExtR(tif, module, "Unhandled additional compression");
+ return 0;
+ }
+
+ lerc_ret =
+ lerc_getBlobInfo(lerc_data, lerc_data_size, infoArray, NULL, 8, 0);
+ if (lerc_ret != 0)
+ {
+ TIFFErrorExtR(tif, module, "lerc_getBlobInfo() failed");
+ return 0;
+ }
+
+ /* If the configuration is compatible of a LERC mask, and that the */
+ /* LERC info has dim == samplesperpixel - 1, then there is a LERC */
+ /* mask. */
+ if (td->td_planarconfig == PLANARCONFIG_CONTIG && td->td_extrasamples > 0 &&
+ td->td_sampleinfo[td->td_extrasamples - 1] == EXTRASAMPLE_UNASSALPHA &&
+ GetLercDataType(tif) == 1 &&
+ infoArray[2] == td->td_samplesperpixel - 1U)
+ {
+ use_mask = 1;
+ nomask_bands--;
+ }
+ else if (td->td_sampleformat == SAMPLEFORMAT_IEEEFP &&
+ (td->td_planarconfig == PLANARCONFIG_SEPARATE ||
+ td->td_samplesperpixel == 1) &&
+ (td->td_bitspersample == 32 || td->td_bitspersample == 64))
+ {
+ use_mask = 1;
+ }
+
+ ndims = td->td_planarconfig == PLANARCONFIG_CONTIG ? nomask_bands : 1;
+
+ /* Info returned in infoArray is { version, dataType, nDim, nCols,
+ nRows, nBands, nValidPixels, blobSize } */
+ if (infoArray[0] != (unsigned)sp->lerc_version)
+ {
+ TIFFWarningExtR(tif, module,
+ "Unexpected version number: %d. Expected: %d",
+ infoArray[0], sp->lerc_version);
+ }
+ if (infoArray[1] != (unsigned)lerc_data_type)
+ {
+ TIFFErrorExtR(tif, module, "Unexpected dataType: %d. Expected: %d",
+ infoArray[1], lerc_data_type);
+ return 0;
+ }
+ if (infoArray[2] != (unsigned)ndims)
+ {
+ TIFFErrorExtR(tif, module, "Unexpected nDim: %d. Expected: %d",
+ infoArray[2], ndims);
+ return 0;
+ }
+ if (infoArray[3] != sp->segment_width)
+ {
+ TIFFErrorExtR(tif, module, "Unexpected nCols: %d. Expected: %du",
+ infoArray[3], sp->segment_width);
+ return 0;
+ }
+ if (infoArray[4] != sp->segment_height)
+ {
+ TIFFErrorExtR(tif, module, "Unexpected nRows: %d. Expected: %u",
+ infoArray[4], sp->segment_height);
+ return 0;
+ }
+ if (infoArray[5] != 1)
+ {
+ TIFFErrorExtR(tif, module, "Unexpected nBands: %d. Expected: %d",
+ infoArray[5], 1);
+ return 0;
+ }
+ if (infoArray[7] != lerc_data_size)
+ {
+ TIFFErrorExtR(tif, module, "Unexpected blobSize: %d. Expected: %u",
+ infoArray[7], lerc_data_size);
+ return 0;
+ }
+
+ lerc_ret = lerc_decode(lerc_data, lerc_data_size,
+#if LERC_AT_LEAST_VERSION(3, 0, 0)
+ use_mask ? 1 : 0,
+#endif
+ use_mask ? sp->mask_buffer : NULL, ndims,
+ sp->segment_width, sp->segment_height, 1,
+ lerc_data_type, sp->uncompressed_buffer);
+ if (lerc_ret != 0)
+ {
+ TIFFErrorExtR(tif, module, "lerc_decode() failed");
+ return 0;
+ }
+
+ /* Interleave alpha mask with other samples. */
+ if (use_mask && GetLercDataType(tif) == 1)
+ {
+ unsigned src_stride =
+ (td->td_samplesperpixel - 1) * (td->td_bitspersample / 8);
+ unsigned dst_stride =
+ td->td_samplesperpixel * (td->td_bitspersample / 8);
+ unsigned i = sp->segment_width * sp->segment_height;
+ /* Operate from end to begin to be able to move in place */
+ while (i > 0 && i > nomask_bands)
+ {
+ i--;
+ sp->uncompressed_buffer[i * dst_stride + td->td_samplesperpixel -
+ 1] = 255 * sp->mask_buffer[i];
+ memcpy(sp->uncompressed_buffer + i * dst_stride,
+ sp->uncompressed_buffer + i * src_stride, src_stride);
+ }
+ /* First pixels must use memmove due to overlapping areas */
+ while (i > 0)
+ {
+ i--;
+ sp->uncompressed_buffer[i * dst_stride + td->td_samplesperpixel -
+ 1] = 255 * sp->mask_buffer[i];
+ memmove(sp->uncompressed_buffer + i * dst_stride,
+ sp->uncompressed_buffer + i * src_stride, src_stride);
+ }
+ }
+ else if (use_mask && td->td_sampleformat == SAMPLEFORMAT_IEEEFP)
+ {
+ const unsigned nb_pixels = sp->segment_width * sp->segment_height;
+ unsigned i;
+#if HOST_BIGENDIAN
+ const unsigned char nan_bytes[] = {0x7f, 0xc0, 0, 0};
+#else
+ const unsigned char nan_bytes[] = {0, 0, 0xc0, 0x7f};
+#endif
+ float nan_float32;
+ memcpy(&nan_float32, nan_bytes, 4);
+
+ if (td->td_bitspersample == 32)
+ {
+ for (i = 0; i < nb_pixels; i++)
+ {
+ if (sp->mask_buffer[i] == 0)
+ ((float *)sp->uncompressed_buffer)[i] = nan_float32;
+ }
+ }
+ else
+ {
+ const double nan_float64 = nan_float32;
+ for (i = 0; i < nb_pixels; i++)
+ {
+ if (sp->mask_buffer[i] == 0)
+ ((double *)sp->uncompressed_buffer)[i] = nan_float64;
+ }
+ }
+ }
+
+ return 1;
+}
+
+/*
+ * Decode a strip, tile or scanline.
+ */
+static int LERCDecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s)
+{
+ static const char module[] = "LERCDecode";
+ LERCState *sp = DecoderState(tif);
+
+ (void)s;
+ assert(sp != NULL);
+ assert(sp->state == LSTATE_INIT_DECODE);
+
+ if (sp->uncompressed_buffer == 0)
+ {
+ TIFFErrorExtR(tif, module, "Uncompressed buffer not allocated");
+ return 0;
+ }
+
+ if ((uint64_t)sp->uncompressed_offset + (uint64_t)occ >
+ sp->uncompressed_size)
+ {
+ TIFFErrorExtR(tif, module, "Too many bytes read");
+ return 0;
+ }
+
+ memcpy(op, sp->uncompressed_buffer + sp->uncompressed_offset, occ);
+ sp->uncompressed_offset += (unsigned)occ;
+
+ return 1;
+}
+
+static int LERCSetupEncode(TIFF *tif)
+{
+ LERCState *sp = EncoderState(tif);
+
+ assert(sp != NULL);
+ if (sp->state & LSTATE_INIT_DECODE)
+ {
+ sp->state = 0;
+ }
+
+ sp->state |= LSTATE_INIT_ENCODE;
+
+ return 1;
+}
+
+/*
+ * Reset encoding state at the start of a strip.
+ */
+static int LERCPreEncode(TIFF *tif, uint16_t s)
+{
+ static const char module[] = "LERCPreEncode";
+ LERCState *sp = EncoderState(tif);
+ int lerc_data_type;
+
+ (void)s;
+ assert(sp != NULL);
+ if (sp->state != LSTATE_INIT_ENCODE)
+ tif->tif_setupencode(tif);
+
+ lerc_data_type = GetLercDataType(tif);
+ if (lerc_data_type < 0)
+ return 0;
+
+ if (!SetupUncompressedBuffer(tif, sp, module))
+ return 0;
+
+ return 1;
+}
+
+/*
+ * Encode a chunk of pixels.
+ */
+static int LERCEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
+{
+ static const char module[] = "LERCEncode";
+ LERCState *sp = EncoderState(tif);
+
+ (void)s;
+ assert(sp != NULL);
+ assert(sp->state == LSTATE_INIT_ENCODE);
+
+ if ((uint64_t)sp->uncompressed_offset + (uint64_t)cc >
+ sp->uncompressed_size)
+ {
+ TIFFErrorExtR(tif, module, "Too many bytes written");
+ return 0;
+ }
+
+ memcpy(sp->uncompressed_buffer + sp->uncompressed_offset, bp, cc);
+ sp->uncompressed_offset += (unsigned)cc;
+
+ return 1;
+}
+
+/*
+ * Finish off an encoded strip by flushing it.
+ */
+static int LERCPostEncode(TIFF *tif)
+{
+ lerc_status lerc_ret;
+ static const char module[] = "LERCPostEncode";
+ LERCState *sp = EncoderState(tif);
+ unsigned int numBytes = 0;
+ unsigned int numBytesWritten = 0;
+ TIFFDirectory *td = &tif->tif_dir;
+ int use_mask = 0;
+ unsigned dst_nbands = td->td_samplesperpixel;
+
+ if (sp->uncompressed_offset != sp->uncompressed_size)
+ {
+ TIFFErrorExtR(tif, module, "Unexpected number of bytes in the buffer");
+ return 0;
+ }
+
+ /* Extract alpha mask (if containing only 0 and 255 values, */
+ /* and compact array of regular bands */
+ if (td->td_planarconfig == PLANARCONFIG_CONTIG && td->td_extrasamples > 0 &&
+ td->td_sampleinfo[td->td_extrasamples - 1] == EXTRASAMPLE_UNASSALPHA &&
+ GetLercDataType(tif) == 1)
+ {
+ const unsigned dst_stride =
+ (td->td_samplesperpixel - 1) * (td->td_bitspersample / 8);
+ const unsigned src_stride =
+ td->td_samplesperpixel * (td->td_bitspersample / 8);
+ unsigned i = 0;
+ const unsigned nb_pixels = sp->segment_width * sp->segment_height;
+
+ use_mask = 1;
+ for (i = 0; i < nb_pixels; i++)
+ {
+ int v = sp->uncompressed_buffer[i * src_stride +
+ td->td_samplesperpixel - 1];
+ if (v != 0 && v != 255)
+ {
+ use_mask = 0;
+ break;
+ }
+ }
+
+ if (use_mask)
+ {
+ dst_nbands--;
+ /* First pixels must use memmove due to overlapping areas */
+ for (i = 0; i < dst_nbands && i < nb_pixels; i++)
+ {
+ memmove(sp->uncompressed_buffer + i * dst_stride,
+ sp->uncompressed_buffer + i * src_stride, dst_stride);
+ sp->mask_buffer[i] =
+ sp->uncompressed_buffer[i * src_stride +
+ td->td_samplesperpixel - 1];
+ }
+ for (; i < nb_pixels; i++)
+ {
+ memcpy(sp->uncompressed_buffer + i * dst_stride,
+ sp->uncompressed_buffer + i * src_stride, dst_stride);
+ sp->mask_buffer[i] =
+ sp->uncompressed_buffer[i * src_stride +
+ td->td_samplesperpixel - 1];
+ }
+ }
+ }
+ else if (td->td_sampleformat == SAMPLEFORMAT_IEEEFP &&
+ (td->td_planarconfig == PLANARCONFIG_SEPARATE ||
+ dst_nbands == 1) &&
+ (td->td_bitspersample == 32 || td->td_bitspersample == 64))
+ {
+ /* Check for NaN values */
+ unsigned i;
+ const unsigned nb_pixels = sp->segment_width * sp->segment_height;
+ if (td->td_bitspersample == 32)
+ {
+ for (i = 0; i < nb_pixels; i++)
+ {
+ const float val = ((float *)sp->uncompressed_buffer)[i];
+ if (val != val)
+ {
+ use_mask = 1;
+ break;
+ }
+ }
+ }
+ else
+ {
+ for (i = 0; i < nb_pixels; i++)
+ {
+ const double val = ((double *)sp->uncompressed_buffer)[i];
+ if (val != val)
+ {
+ use_mask = 1;
+ break;
+ }
+ }
+ }
+
+ if (use_mask)
+ {
+ if (td->td_bitspersample == 32)
+ {
+ for (i = 0; i < nb_pixels; i++)
+ {
+ const float val = ((float *)sp->uncompressed_buffer)[i];
+ sp->mask_buffer[i] = (val == val) ? 255 : 0;
+ }
+ }
+ else
+ {
+ for (i = 0; i < nb_pixels; i++)
+ {
+ const double val = ((double *)sp->uncompressed_buffer)[i];
+ sp->mask_buffer[i] = (val == val) ? 255 : 0;
+ }
+ }
+ }
+ }
+
+#if 0
+ lerc_ret = lerc_computeCompressedSize(
+ sp->uncompressed_buffer,
+ sp->lerc_version,
+ GetLercDataType(tif),
+ td->td_planarconfig == PLANARCONFIG_CONTIG ?
+ dst_nbands : 1,
+ sp->segment_width,
+ sp->segment_height,
+ 1,
+ use_mask ? sp->mask_buffer : NULL,
+ sp->maxzerror,
+ &numBytes);
+ if( lerc_ret != 0 )
+ {
+ TIFFErrorExtR(tif, module,
+ "lerc_computeCompressedSize() failed");
+ return 0;
+ }
+#else
+ numBytes = sp->uncompressed_alloc;
+#endif
+
+ if (sp->compressed_size < numBytes)
+ {
+ _TIFFfreeExt(tif, sp->compressed_buffer);
+ sp->compressed_buffer = _TIFFmallocExt(tif, numBytes);
+ if (!sp->compressed_buffer)
+ {
+ sp->compressed_size = 0;
+ return 0;
+ }
+ sp->compressed_size = numBytes;
+ }
+
+ lerc_ret = lerc_encodeForVersion(
+ sp->uncompressed_buffer, sp->lerc_version, GetLercDataType(tif),
+ td->td_planarconfig == PLANARCONFIG_CONTIG ? dst_nbands : 1,
+ sp->segment_width, sp->segment_height, 1,
+#if LERC_AT_LEAST_VERSION(3, 0, 0)
+ use_mask ? 1 : 0,
+#endif
+ use_mask ? sp->mask_buffer : NULL, sp->maxzerror, sp->compressed_buffer,
+ sp->compressed_size, &numBytesWritten);
+ if (lerc_ret != 0)
+ {
+ TIFFErrorExtR(tif, module, "lerc_encode() failed");
+ return 0;
+ }
+ assert(numBytesWritten < numBytes);
+
+ if (sp->additional_compression == LERC_ADD_COMPRESSION_DEFLATE)
+ {
+#if LIBDEFLATE_SUPPORT
+ if (sp->libdeflate_enc == NULL)
+ {
+ /* To get results as good as zlib, we ask for an extra */
+ /* level of compression */
+ sp->libdeflate_enc = libdeflate_alloc_compressor(
+ sp->zipquality == Z_DEFAULT_COMPRESSION ? 7
+ : sp->zipquality >= 6 && sp->zipquality <= 9
+ ? sp->zipquality + 1
+ : sp->zipquality);
+ if (sp->libdeflate_enc == NULL)
+ {
+ TIFFErrorExtR(tif, module, "Cannot allocate compressor");
+ return 0;
+ }
+ }
+
+ /* Should not happen normally */
+ if (libdeflate_zlib_compress_bound(
+ sp->libdeflate_enc, numBytesWritten) > sp->uncompressed_alloc)
+ {
+ TIFFErrorExtR(tif, module,
+ "Output buffer for libdeflate too small");
+ return 0;
+ }
+
+ tif->tif_rawcc = libdeflate_zlib_compress(
+ sp->libdeflate_enc, sp->compressed_buffer, numBytesWritten,
+ sp->uncompressed_buffer, sp->uncompressed_alloc);
+
+ if (tif->tif_rawcc == 0)
+ {
+ TIFFErrorExtR(tif, module, "Encoder error at scanline %lu",
+ (unsigned long)tif->tif_row);
+ return 0;
+ }
+#else
+ z_stream strm;
+ int zlib_ret;
+ int cappedQuality = sp->zipquality;
+ if (cappedQuality > Z_BEST_COMPRESSION)
+ cappedQuality = Z_BEST_COMPRESSION;
+
+ memset(&strm, 0, sizeof(strm));
+ strm.zalloc = NULL;
+ strm.zfree = NULL;
+ strm.opaque = NULL;
+ zlib_ret = deflateInit(&strm, cappedQuality);
+ if (zlib_ret != Z_OK)
+ {
+ TIFFErrorExtR(tif, module, "deflateInit() failed");
+ return 0;
+ }
+
+ strm.avail_in = numBytesWritten;
+ strm.next_in = sp->compressed_buffer;
+ strm.avail_out = sp->uncompressed_alloc;
+ strm.next_out = sp->uncompressed_buffer;
+ zlib_ret = deflate(&strm, Z_FINISH);
+ if (zlib_ret == Z_STREAM_END)
+ {
+ tif->tif_rawcc = sp->uncompressed_alloc - strm.avail_out;
+ }
+ deflateEnd(&strm);
+ if (zlib_ret != Z_STREAM_END)
+ {
+ TIFFErrorExtR(tif, module, "deflate() failed");
+ return 0;
+ }
+#endif
+ {
+ int ret;
+ uint8_t *tif_rawdata_backup = tif->tif_rawdata;
+ tif->tif_rawdata = sp->uncompressed_buffer;
+ ret = TIFFFlushData1(tif);
+ tif->tif_rawdata = tif_rawdata_backup;
+ if (!ret)
+ {
+ return 0;
+ }
+ }
+ }
+ else if (sp->additional_compression == LERC_ADD_COMPRESSION_ZSTD)
+ {
+#ifdef ZSTD_SUPPORT
+ size_t zstd_ret = ZSTD_compress(
+ sp->uncompressed_buffer, sp->uncompressed_alloc,
+ sp->compressed_buffer, numBytesWritten, sp->zstd_compress_level);
+ if (ZSTD_isError(zstd_ret))
+ {
+ TIFFErrorExtR(tif, module, "Error in ZSTD_compress(): %s",
+ ZSTD_getErrorName(zstd_ret));
+ return 0;
+ }
+
+ {
+ int ret;
+ uint8_t *tif_rawdata_backup = tif->tif_rawdata;
+ tif->tif_rawdata = sp->uncompressed_buffer;
+ tif->tif_rawcc = zstd_ret;
+ ret = TIFFFlushData1(tif);
+ tif->tif_rawdata = tif_rawdata_backup;
+ if (!ret)
+ {
+ return 0;
+ }
+ }
+#else
+ TIFFErrorExtR(tif, module, "ZSTD support missing");
+ return 0;
+#endif
+ }
+ else if (sp->additional_compression != LERC_ADD_COMPRESSION_NONE)
+ {
+ TIFFErrorExtR(tif, module, "Unhandled additional compression");
+ return 0;
+ }
+ else
+ {
+ int ret;
+ uint8_t *tif_rawdata_backup = tif->tif_rawdata;
+ tif->tif_rawdata = sp->compressed_buffer;
+ tif->tif_rawcc = numBytesWritten;
+ ret = TIFFFlushData1(tif);
+ tif->tif_rawdata = tif_rawdata_backup;
+ if (!ret)
+ return 0;
+ }
+
+ return 1;
+}
+
+static void LERCCleanup(TIFF *tif)
+{
+ LERCState *sp = LState(tif);
+
+ assert(sp != 0);
+
+ tif->tif_tagmethods.vgetfield = sp->vgetparent;
+ tif->tif_tagmethods.vsetfield = sp->vsetparent;
+
+ _TIFFfreeExt(tif, sp->uncompressed_buffer);
+ _TIFFfreeExt(tif, sp->compressed_buffer);
+ _TIFFfreeExt(tif, sp->mask_buffer);
+
+#if LIBDEFLATE_SUPPORT
+ if (sp->libdeflate_dec)
+ libdeflate_free_decompressor(sp->libdeflate_dec);
+ if (sp->libdeflate_enc)
+ libdeflate_free_compressor(sp->libdeflate_enc);
+#endif
+
+ _TIFFfreeExt(tif, sp);
+ tif->tif_data = NULL;
+
+ _TIFFSetDefaultCompressionState(tif);
+}
+
+static const TIFFField LERCFields[] = {
+ {TIFFTAG_LERC_PARAMETERS, TIFF_VARIABLE2, TIFF_VARIABLE2, TIFF_LONG, 0,
+ TIFF_SETGET_C32_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, FALSE, TRUE,
+ "LercParameters", NULL},
+ {TIFFTAG_LERC_MAXZERROR, 0, 0, TIFF_ANY, 0, TIFF_SETGET_DOUBLE,
+ TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "LercMaximumError",
+ NULL},
+ {TIFFTAG_LERC_VERSION, 0, 0, TIFF_ANY, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "LercVersion", NULL},
+ {TIFFTAG_LERC_ADD_COMPRESSION, 0, 0, TIFF_ANY, 0, TIFF_SETGET_UINT32,
+ TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE,
+ "LercAdditionalCompression", NULL},
+ {TIFFTAG_ZSTD_LEVEL, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
+ TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE,
+ "ZSTD zstd_compress_level", NULL},
+ {TIFFTAG_ZIPQUALITY, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
+ TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "", NULL},
+};
+
+static int LERCVSetFieldBase(TIFF *tif, uint32_t tag, ...)
+{
+ LERCState *sp = LState(tif);
+ int ret;
+ va_list ap;
+ va_start(ap, tag);
+ ret = (*sp->vsetparent)(tif, tag, ap);
+ va_end(ap);
+ return ret;
+}
+
+static int LERCVSetField(TIFF *tif, uint32_t tag, va_list ap)
+{
+ static const char module[] = "LERCVSetField";
+ LERCState *sp = LState(tif);
+
+ switch (tag)
+ {
+ case TIFFTAG_LERC_PARAMETERS:
+ {
+ uint32_t count = va_arg(ap, int);
+ int *params = va_arg(ap, int *);
+ if (count < 2)
+ {
+ TIFFErrorExtR(tif, module,
+ "Invalid count for LercParameters: %u", count);
+ return 0;
+ }
+ sp->lerc_version = params[0];
+ sp->additional_compression = params[1];
+ return LERCVSetFieldBase(tif, TIFFTAG_LERC_PARAMETERS, count,
+ params);
+ }
+ case TIFFTAG_LERC_MAXZERROR:
+ sp->maxzerror = va_arg(ap, double);
+ return 1;
+ case TIFFTAG_LERC_VERSION:
+ {
+ int params[2] = {0, 0};
+ int version = va_arg(ap, int);
+ if (version != LERC_VERSION_2_4)
+ {
+ TIFFErrorExtR(tif, module, "Invalid value for LercVersion: %d",
+ version);
+ return 0;
+ }
+ sp->lerc_version = version;
+ params[0] = sp->lerc_version;
+ params[1] = sp->additional_compression;
+ return LERCVSetFieldBase(tif, TIFFTAG_LERC_PARAMETERS, 2, params);
+ }
+ case TIFFTAG_LERC_ADD_COMPRESSION:
+ {
+ int params[2] = {0, 0};
+ int additional_compression = va_arg(ap, int);
+#ifndef ZSTD_SUPPORT
+ if (additional_compression == LERC_ADD_COMPRESSION_ZSTD)
+ {
+ TIFFErrorExtR(tif, module,
+ "LERC_ZSTD requested, but ZSTD not available");
+ return 0;
+ }
+#endif
+ if (additional_compression != LERC_ADD_COMPRESSION_NONE &&
+ additional_compression != LERC_ADD_COMPRESSION_DEFLATE &&
+ additional_compression != LERC_ADD_COMPRESSION_ZSTD)
+ {
+ TIFFErrorExtR(tif, module,
+ "Invalid value for LercAdditionalCompression: %d",
+ additional_compression);
+ return 0;
+ }
+ sp->additional_compression = additional_compression;
+ params[0] = sp->lerc_version;
+ params[1] = sp->additional_compression;
+ return LERCVSetFieldBase(tif, TIFFTAG_LERC_PARAMETERS, 2, params);
+ }
+#ifdef ZSTD_SUPPORT
+ case TIFFTAG_ZSTD_LEVEL:
+ {
+ sp->zstd_compress_level = (int)va_arg(ap, int);
+ if (sp->zstd_compress_level <= 0 ||
+ sp->zstd_compress_level > ZSTD_maxCLevel())
+ {
+ TIFFWarningExtR(tif, module,
+ "ZSTD_LEVEL should be between 1 and %d",
+ ZSTD_maxCLevel());
+ }
+ return 1;
+ }
+#endif
+ case TIFFTAG_ZIPQUALITY:
+ {
+ sp->zipquality = (int)va_arg(ap, int);
+ if (sp->zipquality < Z_DEFAULT_COMPRESSION ||
+ sp->zipquality > LIBDEFLATE_MAX_COMPRESSION_LEVEL)
+ {
+ TIFFErrorExtR(
+ tif, module,
+ "Invalid ZipQuality value. Should be in [-1,%d] range",
+ LIBDEFLATE_MAX_COMPRESSION_LEVEL);
+ return 0;
+ }
+
+#if LIBDEFLATE_SUPPORT
+ if (sp->libdeflate_enc)
+ {
+ libdeflate_free_compressor(sp->libdeflate_enc);
+ sp->libdeflate_enc = NULL;
+ }
+#endif
+
+ return (1);
+ }
+ default:
+ return (*sp->vsetparent)(tif, tag, ap);
+ }
+ /*NOTREACHED*/
+}
+
+static int LERCVGetField(TIFF *tif, uint32_t tag, va_list ap)
+{
+ LERCState *sp = LState(tif);
+
+ switch (tag)
+ {
+ case TIFFTAG_LERC_MAXZERROR:
+ *va_arg(ap, double *) = sp->maxzerror;
+ break;
+ case TIFFTAG_LERC_VERSION:
+ *va_arg(ap, int *) = sp->lerc_version;
+ break;
+ case TIFFTAG_LERC_ADD_COMPRESSION:
+ *va_arg(ap, int *) = sp->additional_compression;
+ break;
+ case TIFFTAG_ZSTD_LEVEL:
+ *va_arg(ap, int *) = sp->zstd_compress_level;
+ break;
+ case TIFFTAG_ZIPQUALITY:
+ *va_arg(ap, int *) = sp->zipquality;
+ break;
+ default:
+ return (*sp->vgetparent)(tif, tag, ap);
+ }
+ return 1;
+}
+
+int TIFFInitLERC(TIFF *tif, int scheme)
+{
+ static const char module[] = "TIFFInitLERC";
+ LERCState *sp;
+
+ (void)scheme;
+ assert(scheme == COMPRESSION_LERC);
+
+ /*
+ * Merge codec-specific tag information.
+ */
+ if (!_TIFFMergeFields(tif, LERCFields, TIFFArrayCount(LERCFields)))
+ {
+ TIFFErrorExtR(tif, module, "Merging LERC codec-specific tags failed");
+ return 0;
+ }
+
+ /*
+ * Allocate state block so tag methods have storage to record values.
+ */
+ tif->tif_data = (uint8_t *)_TIFFcallocExt(tif, 1, sizeof(LERCState));
+ if (tif->tif_data == NULL)
+ goto bad;
+ sp = LState(tif);
+
+ /*
+ * Override parent get/set field methods.
+ */
+ sp->vgetparent = tif->tif_tagmethods.vgetfield;
+ tif->tif_tagmethods.vgetfield = LERCVGetField; /* hook for codec tags */
+ sp->vsetparent = tif->tif_tagmethods.vsetfield;
+ tif->tif_tagmethods.vsetfield = LERCVSetField; /* hook for codec tags */
+
+ /*
+ * Install codec methods.
+ */
+ tif->tif_fixuptags = LERCFixupTags;
+ tif->tif_setupdecode = LERCSetupDecode;
+ tif->tif_predecode = LERCPreDecode;
+ tif->tif_decoderow = LERCDecode;
+ tif->tif_decodestrip = LERCDecode;
+ tif->tif_decodetile = LERCDecode;
+ tif->tif_setupencode = LERCSetupEncode;
+ tif->tif_preencode = LERCPreEncode;
+ tif->tif_postencode = LERCPostEncode;
+ tif->tif_encoderow = LERCEncode;
+ tif->tif_encodestrip = LERCEncode;
+ tif->tif_encodetile = LERCEncode;
+ tif->tif_cleanup = LERCCleanup;
+
+ /* Default values for codec-specific fields */
+ TIFFSetField(tif, TIFFTAG_LERC_VERSION, LERC_VERSION_2_4);
+ TIFFSetField(tif, TIFFTAG_LERC_ADD_COMPRESSION, LERC_ADD_COMPRESSION_NONE);
+ sp->maxzerror = 0.0;
+ sp->zstd_compress_level = 9; /* default comp. level */
+ sp->zipquality = Z_DEFAULT_COMPRESSION; /* default comp. level */
+ sp->state = 0;
+
+ return 1;
+bad:
+ TIFFErrorExtR(tif, module, "No space for LERC state block");
+ return 0;
+}
+#endif /* LERC_SUPPORT */
diff --git a/src/3rdparty/libtiff/libtiff/tif_luv.c b/src/3rdparty/libtiff/libtiff/tif_luv.c
index 6fe4858..051721e 100644
--- a/src/3rdparty/libtiff/libtiff/tif_luv.c
+++ b/src/3rdparty/libtiff/libtiff/tif_luv.c
@@ -2,23 +2,23 @@
* Copyright (c) 1997 Greg Ward Larson
* Copyright (c) 1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler, Greg Larson and Silicon Graphics may not be used in any
* advertising or publicity relating to the software without the specific,
* prior written permission of Sam Leffler, Greg Larson and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER, GREG LARSON OR SILICON GRAPHICS BE LIABLE
* FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -34,7 +34,7 @@
* LogLuv image support uses the TIFF library to store 16 or 10-bit
* log luminance values with 8 bits each of u and v or a 14-bit index.
*
- * The codec can take as input and produce as output 32-bit IEEE float values
+ * The codec can take as input and produce as output 32-bit IEEE float values
* as well as 16-bit integer values. A 16-bit luminance is interpreted
* as a sign bit followed by a 15-bit integer that is converted
* to and from a linear magnitude using the transformation:
@@ -145,9 +145,9 @@
* quantization errors into noise.
*/
+#include <math.h>
#include <stdio.h>
#include <stdlib.h>
-#include <math.h>
/*
* State block for each open TIFF
@@ -155,22 +155,23 @@
*/
typedef struct logLuvState LogLuvState;
-struct logLuvState {
- int encoder_state; /* 1 if encoder correctly initialized */
- int user_datafmt; /* user data format */
- int encode_meth; /* encoding method */
- int pixel_size; /* bytes per pixel */
+struct logLuvState
+{
+ int encoder_state; /* 1 if encoder correctly initialized */
+ int user_datafmt; /* user data format */
+ int encode_meth; /* encoding method */
+ int pixel_size; /* bytes per pixel */
- uint8* tbuf; /* translation buffer */
- tmsize_t tbuflen; /* buffer length */
- void (*tfunc)(LogLuvState*, uint8*, tmsize_t);
+ uint8_t *tbuf; /* translation buffer */
+ tmsize_t tbuflen; /* buffer length */
+ void (*tfunc)(LogLuvState *, uint8_t *, tmsize_t);
- TIFFVSetMethod vgetparent; /* super-class method */
- TIFFVSetMethod vsetparent; /* super-class method */
+ TIFFVSetMethod vgetparent; /* super-class method */
+ TIFFVSetMethod vsetparent; /* super-class method */
};
-#define DecoderState(tif) ((LogLuvState*) (tif)->tif_data)
-#define EncoderState(tif) ((LogLuvState*) (tif)->tif_data)
+#define DecoderState(tif) ((LogLuvState *)(tif)->tif_data)
+#define EncoderState(tif) ((LogLuvState *)(tif)->tif_data)
#define SGILOGDATAFMT_UNKNOWN -1
@@ -179,211 +180,207 @@ struct logLuvState {
/*
* Decode a string of 16-bit gray pixels.
*/
-static int
-LogL16Decode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
+static int LogL16Decode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s)
{
- static const char module[] = "LogL16Decode";
- LogLuvState* sp = DecoderState(tif);
- int shft;
- tmsize_t i;
- tmsize_t npixels;
- unsigned char* bp;
- int16* tp;
- int16 b;
- tmsize_t cc;
- int rc;
-
- assert(s == 0);
- assert(sp != NULL);
-
- npixels = occ / sp->pixel_size;
-
- if (sp->user_datafmt == SGILOGDATAFMT_16BIT)
- tp = (int16*) op;
- else {
- if(sp->tbuflen < npixels) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Translation buffer too short");
- return (0);
- }
- tp = (int16*) sp->tbuf;
- }
- _TIFFmemset((void*) tp, 0, npixels*sizeof (tp[0]));
-
- bp = (unsigned char*) tif->tif_rawcp;
- cc = tif->tif_rawcc;
- /* get each byte string */
- for (shft = 8; shft >= 0; shft -=8) {
- for (i = 0; i < npixels && cc > 0; ) {
- if (*bp >= 128) { /* run */
- if( cc < 2 )
- break;
- rc = *bp++ + (2-128);
- b = (int16)(*bp++ << shft);
- cc -= 2;
- while (rc-- && i < npixels)
- tp[i++] |= b;
- } else { /* non-run */
- rc = *bp++; /* nul is noop */
- while (--cc && rc-- && i < npixels)
- tp[i++] |= (int16)*bp++ << shft;
- }
- }
- if (i != npixels) {
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- TIFFErrorExt(tif->tif_clientdata, module,
- "Not enough data at row %lu (short %I64d pixels)",
- (unsigned long) tif->tif_row,
- (unsigned __int64) (npixels - i));
-#else
- TIFFErrorExt(tif->tif_clientdata, module,
- "Not enough data at row %lu (short %llu pixels)",
- (unsigned long) tif->tif_row,
- (unsigned long long) (npixels - i));
-#endif
- tif->tif_rawcp = (uint8*) bp;
- tif->tif_rawcc = cc;
- return (0);
- }
- }
- (*sp->tfunc)(sp, op, npixels);
- tif->tif_rawcp = (uint8*) bp;
- tif->tif_rawcc = cc;
- return (1);
+ static const char module[] = "LogL16Decode";
+ LogLuvState *sp = DecoderState(tif);
+ int shft;
+ tmsize_t i;
+ tmsize_t npixels;
+ unsigned char *bp;
+ int16_t *tp;
+ int16_t b;
+ tmsize_t cc;
+ int rc;
+
+ (void)s;
+ assert(s == 0);
+ assert(sp != NULL);
+
+ npixels = occ / sp->pixel_size;
+
+ if (sp->user_datafmt == SGILOGDATAFMT_16BIT)
+ tp = (int16_t *)op;
+ else
+ {
+ if (sp->tbuflen < npixels)
+ {
+ TIFFErrorExtR(tif, module, "Translation buffer too short");
+ return (0);
+ }
+ tp = (int16_t *)sp->tbuf;
+ }
+ _TIFFmemset((void *)tp, 0, npixels * sizeof(tp[0]));
+
+ bp = (unsigned char *)tif->tif_rawcp;
+ cc = tif->tif_rawcc;
+ /* get each byte string */
+ for (shft = 8; shft >= 0; shft -= 8)
+ {
+ for (i = 0; i < npixels && cc > 0;)
+ {
+ if (*bp >= 128)
+ { /* run */
+ if (cc < 2)
+ break;
+ rc = *bp++ + (2 - 128);
+ b = (int16_t)(*bp++ << shft);
+ cc -= 2;
+ while (rc-- && i < npixels)
+ tp[i++] |= b;
+ }
+ else
+ { /* non-run */
+ rc = *bp++; /* nul is noop */
+ while (--cc && rc-- && i < npixels)
+ tp[i++] |= (int16_t)*bp++ << shft;
+ }
+ }
+ if (i != npixels)
+ {
+ TIFFErrorExtR(tif, module,
+ "Not enough data at row %" PRIu32
+ " (short %" TIFF_SSIZE_FORMAT " pixels)",
+ tif->tif_row, npixels - i);
+ tif->tif_rawcp = (uint8_t *)bp;
+ tif->tif_rawcc = cc;
+ return (0);
+ }
+ }
+ (*sp->tfunc)(sp, op, npixels);
+ tif->tif_rawcp = (uint8_t *)bp;
+ tif->tif_rawcc = cc;
+ return (1);
}
/*
* Decode a string of 24-bit pixels.
*/
-static int
-LogLuvDecode24(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
+static int LogLuvDecode24(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s)
{
- static const char module[] = "LogLuvDecode24";
- LogLuvState* sp = DecoderState(tif);
- tmsize_t cc;
- tmsize_t i;
- tmsize_t npixels;
- unsigned char* bp;
- uint32* tp;
-
- assert(s == 0);
- assert(sp != NULL);
-
- npixels = occ / sp->pixel_size;
-
- if (sp->user_datafmt == SGILOGDATAFMT_RAW)
- tp = (uint32 *)op;
- else {
- if(sp->tbuflen < npixels) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Translation buffer too short");
- return (0);
- }
- tp = (uint32 *) sp->tbuf;
- }
- /* copy to array of uint32 */
- bp = (unsigned char*) tif->tif_rawcp;
- cc = tif->tif_rawcc;
- for (i = 0; i < npixels && cc >= 3; i++) {
- tp[i] = bp[0] << 16 | bp[1] << 8 | bp[2];
- bp += 3;
- cc -= 3;
- }
- tif->tif_rawcp = (uint8*) bp;
- tif->tif_rawcc = cc;
- if (i != npixels) {
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- TIFFErrorExt(tif->tif_clientdata, module,
- "Not enough data at row %lu (short %I64d pixels)",
- (unsigned long) tif->tif_row,
- (unsigned __int64) (npixels - i));
-#else
- TIFFErrorExt(tif->tif_clientdata, module,
- "Not enough data at row %lu (short %llu pixels)",
- (unsigned long) tif->tif_row,
- (unsigned long long) (npixels - i));
-#endif
- return (0);
- }
- (*sp->tfunc)(sp, op, npixels);
- return (1);
+ static const char module[] = "LogLuvDecode24";
+ LogLuvState *sp = DecoderState(tif);
+ tmsize_t cc;
+ tmsize_t i;
+ tmsize_t npixels;
+ unsigned char *bp;
+ uint32_t *tp;
+
+ (void)s;
+ assert(s == 0);
+ assert(sp != NULL);
+
+ npixels = occ / sp->pixel_size;
+
+ if (sp->user_datafmt == SGILOGDATAFMT_RAW)
+ tp = (uint32_t *)op;
+ else
+ {
+ if (sp->tbuflen < npixels)
+ {
+ TIFFErrorExtR(tif, module, "Translation buffer too short");
+ return (0);
+ }
+ tp = (uint32_t *)sp->tbuf;
+ }
+ /* copy to array of uint32_t */
+ bp = (unsigned char *)tif->tif_rawcp;
+ cc = tif->tif_rawcc;
+ for (i = 0; i < npixels && cc >= 3; i++)
+ {
+ tp[i] = bp[0] << 16 | bp[1] << 8 | bp[2];
+ bp += 3;
+ cc -= 3;
+ }
+ tif->tif_rawcp = (uint8_t *)bp;
+ tif->tif_rawcc = cc;
+ if (i != npixels)
+ {
+ TIFFErrorExtR(tif, module,
+ "Not enough data at row %" PRIu32
+ " (short %" TIFF_SSIZE_FORMAT " pixels)",
+ tif->tif_row, npixels - i);
+ return (0);
+ }
+ (*sp->tfunc)(sp, op, npixels);
+ return (1);
}
/*
* Decode a string of 32-bit pixels.
*/
-static int
-LogLuvDecode32(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
+static int LogLuvDecode32(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s)
{
- static const char module[] = "LogLuvDecode32";
- LogLuvState* sp;
- int shft;
- tmsize_t i;
- tmsize_t npixels;
- unsigned char* bp;
- uint32* tp;
- uint32 b;
- tmsize_t cc;
- int rc;
-
- assert(s == 0);
- sp = DecoderState(tif);
- assert(sp != NULL);
-
- npixels = occ / sp->pixel_size;
-
- if (sp->user_datafmt == SGILOGDATAFMT_RAW)
- tp = (uint32*) op;
- else {
- if(sp->tbuflen < npixels) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Translation buffer too short");
- return (0);
- }
- tp = (uint32*) sp->tbuf;
- }
- _TIFFmemset((void*) tp, 0, npixels*sizeof (tp[0]));
-
- bp = (unsigned char*) tif->tif_rawcp;
- cc = tif->tif_rawcc;
- /* get each byte string */
- for (shft = 24; shft >= 0; shft -=8) {
- for (i = 0; i < npixels && cc > 0; ) {
- if (*bp >= 128) { /* run */
- if( cc < 2 )
- break;
- rc = *bp++ + (2-128);
- b = (uint32)*bp++ << shft;
- cc -= 2;
- while (rc-- && i < npixels)
- tp[i++] |= b;
- } else { /* non-run */
- rc = *bp++; /* nul is noop */
- while (--cc && rc-- && i < npixels)
- tp[i++] |= (uint32)*bp++ << shft;
- }
- }
- if (i != npixels) {
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- TIFFErrorExt(tif->tif_clientdata, module,
- "Not enough data at row %lu (short %I64d pixels)",
- (unsigned long) tif->tif_row,
- (unsigned __int64) (npixels - i));
-#else
- TIFFErrorExt(tif->tif_clientdata, module,
- "Not enough data at row %lu (short %llu pixels)",
- (unsigned long) tif->tif_row,
- (unsigned long long) (npixels - i));
-#endif
- tif->tif_rawcp = (uint8*) bp;
- tif->tif_rawcc = cc;
- return (0);
- }
- }
- (*sp->tfunc)(sp, op, npixels);
- tif->tif_rawcp = (uint8*) bp;
- tif->tif_rawcc = cc;
- return (1);
+ static const char module[] = "LogLuvDecode32";
+ LogLuvState *sp;
+ int shft;
+ tmsize_t i;
+ tmsize_t npixels;
+ unsigned char *bp;
+ uint32_t *tp;
+ uint32_t b;
+ tmsize_t cc;
+ int rc;
+
+ (void)s;
+ assert(s == 0);
+ sp = DecoderState(tif);
+ assert(sp != NULL);
+
+ npixels = occ / sp->pixel_size;
+
+ if (sp->user_datafmt == SGILOGDATAFMT_RAW)
+ tp = (uint32_t *)op;
+ else
+ {
+ if (sp->tbuflen < npixels)
+ {
+ TIFFErrorExtR(tif, module, "Translation buffer too short");
+ return (0);
+ }
+ tp = (uint32_t *)sp->tbuf;
+ }
+ _TIFFmemset((void *)tp, 0, npixels * sizeof(tp[0]));
+
+ bp = (unsigned char *)tif->tif_rawcp;
+ cc = tif->tif_rawcc;
+ /* get each byte string */
+ for (shft = 24; shft >= 0; shft -= 8)
+ {
+ for (i = 0; i < npixels && cc > 0;)
+ {
+ if (*bp >= 128)
+ { /* run */
+ if (cc < 2)
+ break;
+ rc = *bp++ + (2 - 128);
+ b = (uint32_t)*bp++ << shft;
+ cc -= 2;
+ while (rc-- && i < npixels)
+ tp[i++] |= b;
+ }
+ else
+ { /* non-run */
+ rc = *bp++; /* nul is noop */
+ while (--cc && rc-- && i < npixels)
+ tp[i++] |= (uint32_t)*bp++ << shft;
+ }
+ }
+ if (i != npixels)
+ {
+ TIFFErrorExtR(tif, module,
+ "Not enough data at row %" PRIu32
+ " (short %" TIFF_SSIZE_FORMAT " pixels)",
+ tif->tif_row, npixels - i);
+ tif->tif_rawcp = (uint8_t *)bp;
+ tif->tif_rawcc = cc;
+ return (0);
+ }
+ }
+ (*sp->tfunc)(sp, op, npixels);
+ tif->tif_rawcp = (uint8_t *)bp;
+ tif->tif_rawcc = cc;
+ return (1);
}
/*
@@ -391,20 +388,20 @@ LogLuvDecode32(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
* maintain synchrony with the encode algorithm, which
* is row by row.
*/
-static int
-LogLuvDecodeStrip(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
+static int LogLuvDecodeStrip(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
{
- tmsize_t rowlen = TIFFScanlineSize(tif);
-
- if (rowlen == 0)
- return 0;
-
- assert(cc%rowlen == 0);
- while (cc && (*tif->tif_decoderow)(tif, bp, rowlen, s)) {
- bp += rowlen;
- cc -= rowlen;
- }
- return (cc == 0);
+ tmsize_t rowlen = TIFFScanlineSize(tif);
+
+ if (rowlen == 0)
+ return 0;
+
+ assert(cc % rowlen == 0);
+ while (cc && (*tif->tif_decoderow)(tif, bp, rowlen, s))
+ {
+ bp += rowlen;
+ cc -= rowlen;
+ }
+ return (cc == 0);
}
/*
@@ -412,311 +409,342 @@ LogLuvDecodeStrip(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
* maintain synchrony with the encode algorithm, which
* is row by row.
*/
-static int
-LogLuvDecodeTile(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
+static int LogLuvDecodeTile(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
{
- tmsize_t rowlen = TIFFTileRowSize(tif);
-
- if (rowlen == 0)
- return 0;
-
- assert(cc%rowlen == 0);
- while (cc && (*tif->tif_decoderow)(tif, bp, rowlen, s)) {
- bp += rowlen;
- cc -= rowlen;
- }
- return (cc == 0);
+ tmsize_t rowlen = TIFFTileRowSize(tif);
+
+ if (rowlen == 0)
+ return 0;
+
+ assert(cc % rowlen == 0);
+ while (cc && (*tif->tif_decoderow)(tif, bp, rowlen, s))
+ {
+ bp += rowlen;
+ cc -= rowlen;
+ }
+ return (cc == 0);
}
/*
* Encode a row of 16-bit pixels.
*/
-static int
-LogL16Encode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
+static int LogL16Encode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
{
- static const char module[] = "LogL16Encode";
- LogLuvState* sp = EncoderState(tif);
- int shft;
- tmsize_t i;
- tmsize_t j;
- tmsize_t npixels;
- uint8* op;
- int16* tp;
- int16 b;
- tmsize_t occ;
- int rc=0, mask;
- tmsize_t beg;
-
- assert(s == 0);
- assert(sp != NULL);
- npixels = cc / sp->pixel_size;
-
- if (sp->user_datafmt == SGILOGDATAFMT_16BIT)
- tp = (int16*) bp;
- else {
- tp = (int16*) sp->tbuf;
- if(sp->tbuflen < npixels) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Translation buffer too short");
- return (0);
- }
- (*sp->tfunc)(sp, bp, npixels);
- }
- /* compress each byte string */
- op = tif->tif_rawcp;
- occ = tif->tif_rawdatasize - tif->tif_rawcc;
- for (shft = 8; shft >= 0; shft -=8) {
- for (i = 0; i < npixels; i += rc) {
- if (occ < 4) {
- tif->tif_rawcp = op;
- tif->tif_rawcc = tif->tif_rawdatasize - occ;
- if (!TIFFFlushData1(tif))
- return (0);
- op = tif->tif_rawcp;
- occ = tif->tif_rawdatasize - tif->tif_rawcc;
- }
- mask = 0xff << shft; /* find next run */
- for (beg = i; beg < npixels; beg += rc) {
- b = (int16) (tp[beg] & mask);
- rc = 1;
- while (rc < 127+2 && beg+rc < npixels &&
- (tp[beg+rc] & mask) == b)
- rc++;
- if (rc >= MINRUN)
- break; /* long enough */
- }
- if (beg-i > 1 && beg-i < MINRUN) {
- b = (int16) (tp[i] & mask);/*check short run */
- j = i+1;
- while ((tp[j++] & mask) == b)
- if (j == beg) {
- *op++ = (uint8)(128-2+j-i);
- *op++ = (uint8)(b >> shft);
- occ -= 2;
- i = beg;
- break;
- }
- }
- while (i < beg) { /* write out non-run */
- if ((j = beg-i) > 127) j = 127;
- if (occ < j+3) {
- tif->tif_rawcp = op;
- tif->tif_rawcc = tif->tif_rawdatasize - occ;
- if (!TIFFFlushData1(tif))
- return (0);
- op = tif->tif_rawcp;
- occ = tif->tif_rawdatasize - tif->tif_rawcc;
- }
- *op++ = (uint8) j; occ--;
- while (j--) {
- *op++ = (uint8) (tp[i++] >> shft & 0xff);
- occ--;
- }
- }
- if (rc >= MINRUN) { /* write out run */
- *op++ = (uint8) (128-2+rc);
- *op++ = (uint8) (tp[beg] >> shft & 0xff);
- occ -= 2;
- } else
- rc = 0;
- }
- }
- tif->tif_rawcp = op;
- tif->tif_rawcc = tif->tif_rawdatasize - occ;
-
- return (1);
+ static const char module[] = "LogL16Encode";
+ LogLuvState *sp = EncoderState(tif);
+ int shft;
+ tmsize_t i;
+ tmsize_t j;
+ tmsize_t npixels;
+ uint8_t *op;
+ int16_t *tp;
+ int16_t b;
+ tmsize_t occ;
+ int rc = 0, mask;
+ tmsize_t beg;
+
+ (void)s;
+ assert(s == 0);
+ assert(sp != NULL);
+ npixels = cc / sp->pixel_size;
+
+ if (sp->user_datafmt == SGILOGDATAFMT_16BIT)
+ tp = (int16_t *)bp;
+ else
+ {
+ tp = (int16_t *)sp->tbuf;
+ if (sp->tbuflen < npixels)
+ {
+ TIFFErrorExtR(tif, module, "Translation buffer too short");
+ return (0);
+ }
+ (*sp->tfunc)(sp, bp, npixels);
+ }
+ /* compress each byte string */
+ op = tif->tif_rawcp;
+ occ = tif->tif_rawdatasize - tif->tif_rawcc;
+ for (shft = 8; shft >= 0; shft -= 8)
+ {
+ for (i = 0; i < npixels; i += rc)
+ {
+ if (occ < 4)
+ {
+ tif->tif_rawcp = op;
+ tif->tif_rawcc = tif->tif_rawdatasize - occ;
+ if (!TIFFFlushData1(tif))
+ return (0);
+ op = tif->tif_rawcp;
+ occ = tif->tif_rawdatasize - tif->tif_rawcc;
+ }
+ mask = 0xff << shft; /* find next run */
+ for (beg = i; beg < npixels; beg += rc)
+ {
+ b = (int16_t)(tp[beg] & mask);
+ rc = 1;
+ while (rc < 127 + 2 && beg + rc < npixels &&
+ (tp[beg + rc] & mask) == b)
+ rc++;
+ if (rc >= MINRUN)
+ break; /* long enough */
+ }
+ if (beg - i > 1 && beg - i < MINRUN)
+ {
+ b = (int16_t)(tp[i] & mask); /*check short run */
+ j = i + 1;
+ while ((tp[j++] & mask) == b)
+ if (j == beg)
+ {
+ *op++ = (uint8_t)(128 - 2 + j - i);
+ *op++ = (uint8_t)(b >> shft);
+ occ -= 2;
+ i = beg;
+ break;
+ }
+ }
+ while (i < beg)
+ { /* write out non-run */
+ if ((j = beg - i) > 127)
+ j = 127;
+ if (occ < j + 3)
+ {
+ tif->tif_rawcp = op;
+ tif->tif_rawcc = tif->tif_rawdatasize - occ;
+ if (!TIFFFlushData1(tif))
+ return (0);
+ op = tif->tif_rawcp;
+ occ = tif->tif_rawdatasize - tif->tif_rawcc;
+ }
+ *op++ = (uint8_t)j;
+ occ--;
+ while (j--)
+ {
+ *op++ = (uint8_t)(tp[i++] >> shft & 0xff);
+ occ--;
+ }
+ }
+ if (rc >= MINRUN)
+ { /* write out run */
+ *op++ = (uint8_t)(128 - 2 + rc);
+ *op++ = (uint8_t)(tp[beg] >> shft & 0xff);
+ occ -= 2;
+ }
+ else
+ rc = 0;
+ }
+ }
+ tif->tif_rawcp = op;
+ tif->tif_rawcc = tif->tif_rawdatasize - occ;
+
+ return (1);
}
/*
* Encode a row of 24-bit pixels.
*/
-static int
-LogLuvEncode24(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
+static int LogLuvEncode24(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
{
- static const char module[] = "LogLuvEncode24";
- LogLuvState* sp = EncoderState(tif);
- tmsize_t i;
- tmsize_t npixels;
- tmsize_t occ;
- uint8* op;
- uint32* tp;
-
- assert(s == 0);
- assert(sp != NULL);
- npixels = cc / sp->pixel_size;
-
- if (sp->user_datafmt == SGILOGDATAFMT_RAW)
- tp = (uint32*) bp;
- else {
- tp = (uint32*) sp->tbuf;
- if(sp->tbuflen < npixels) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Translation buffer too short");
- return (0);
- }
- (*sp->tfunc)(sp, bp, npixels);
- }
- /* write out encoded pixels */
- op = tif->tif_rawcp;
- occ = tif->tif_rawdatasize - tif->tif_rawcc;
- for (i = npixels; i--; ) {
- if (occ < 3) {
- tif->tif_rawcp = op;
- tif->tif_rawcc = tif->tif_rawdatasize - occ;
- if (!TIFFFlushData1(tif))
- return (0);
- op = tif->tif_rawcp;
- occ = tif->tif_rawdatasize - tif->tif_rawcc;
- }
- *op++ = (uint8)(*tp >> 16);
- *op++ = (uint8)(*tp >> 8 & 0xff);
- *op++ = (uint8)(*tp++ & 0xff);
- occ -= 3;
- }
- tif->tif_rawcp = op;
- tif->tif_rawcc = tif->tif_rawdatasize - occ;
-
- return (1);
+ static const char module[] = "LogLuvEncode24";
+ LogLuvState *sp = EncoderState(tif);
+ tmsize_t i;
+ tmsize_t npixels;
+ tmsize_t occ;
+ uint8_t *op;
+ uint32_t *tp;
+
+ (void)s;
+ assert(s == 0);
+ assert(sp != NULL);
+ npixels = cc / sp->pixel_size;
+
+ if (sp->user_datafmt == SGILOGDATAFMT_RAW)
+ tp = (uint32_t *)bp;
+ else
+ {
+ tp = (uint32_t *)sp->tbuf;
+ if (sp->tbuflen < npixels)
+ {
+ TIFFErrorExtR(tif, module, "Translation buffer too short");
+ return (0);
+ }
+ (*sp->tfunc)(sp, bp, npixels);
+ }
+ /* write out encoded pixels */
+ op = tif->tif_rawcp;
+ occ = tif->tif_rawdatasize - tif->tif_rawcc;
+ for (i = npixels; i--;)
+ {
+ if (occ < 3)
+ {
+ tif->tif_rawcp = op;
+ tif->tif_rawcc = tif->tif_rawdatasize - occ;
+ if (!TIFFFlushData1(tif))
+ return (0);
+ op = tif->tif_rawcp;
+ occ = tif->tif_rawdatasize - tif->tif_rawcc;
+ }
+ *op++ = (uint8_t)(*tp >> 16);
+ *op++ = (uint8_t)(*tp >> 8 & 0xff);
+ *op++ = (uint8_t)(*tp++ & 0xff);
+ occ -= 3;
+ }
+ tif->tif_rawcp = op;
+ tif->tif_rawcc = tif->tif_rawdatasize - occ;
+
+ return (1);
}
/*
* Encode a row of 32-bit pixels.
*/
-static int
-LogLuvEncode32(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
+static int LogLuvEncode32(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
{
- static const char module[] = "LogLuvEncode32";
- LogLuvState* sp = EncoderState(tif);
- int shft;
- tmsize_t i;
- tmsize_t j;
- tmsize_t npixels;
- uint8* op;
- uint32* tp;
- uint32 b;
- tmsize_t occ;
- int rc=0, mask;
- tmsize_t beg;
-
- assert(s == 0);
- assert(sp != NULL);
-
- npixels = cc / sp->pixel_size;
-
- if (sp->user_datafmt == SGILOGDATAFMT_RAW)
- tp = (uint32*) bp;
- else {
- tp = (uint32*) sp->tbuf;
- if(sp->tbuflen < npixels) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Translation buffer too short");
- return (0);
- }
- (*sp->tfunc)(sp, bp, npixels);
- }
- /* compress each byte string */
- op = tif->tif_rawcp;
- occ = tif->tif_rawdatasize - tif->tif_rawcc;
- for (shft = 24; shft >= 0; shft -=8) {
- for (i = 0; i < npixels; i += rc) {
- if (occ < 4) {
- tif->tif_rawcp = op;
- tif->tif_rawcc = tif->tif_rawdatasize - occ;
- if (!TIFFFlushData1(tif))
- return (0);
- op = tif->tif_rawcp;
- occ = tif->tif_rawdatasize - tif->tif_rawcc;
- }
- mask = 0xff << shft; /* find next run */
- for (beg = i; beg < npixels; beg += rc) {
- b = tp[beg] & mask;
- rc = 1;
- while (rc < 127+2 && beg+rc < npixels &&
- (tp[beg+rc] & mask) == b)
- rc++;
- if (rc >= MINRUN)
- break; /* long enough */
- }
- if (beg-i > 1 && beg-i < MINRUN) {
- b = tp[i] & mask; /* check short run */
- j = i+1;
- while ((tp[j++] & mask) == b)
- if (j == beg) {
- *op++ = (uint8)(128-2+j-i);
- *op++ = (uint8)(b >> shft);
- occ -= 2;
- i = beg;
- break;
- }
- }
- while (i < beg) { /* write out non-run */
- if ((j = beg-i) > 127) j = 127;
- if (occ < j+3) {
- tif->tif_rawcp = op;
- tif->tif_rawcc = tif->tif_rawdatasize - occ;
- if (!TIFFFlushData1(tif))
- return (0);
- op = tif->tif_rawcp;
- occ = tif->tif_rawdatasize - tif->tif_rawcc;
- }
- *op++ = (uint8) j; occ--;
- while (j--) {
- *op++ = (uint8)(tp[i++] >> shft & 0xff);
- occ--;
- }
- }
- if (rc >= MINRUN) { /* write out run */
- *op++ = (uint8) (128-2+rc);
- *op++ = (uint8)(tp[beg] >> shft & 0xff);
- occ -= 2;
- } else
- rc = 0;
- }
- }
- tif->tif_rawcp = op;
- tif->tif_rawcc = tif->tif_rawdatasize - occ;
-
- return (1);
+ static const char module[] = "LogLuvEncode32";
+ LogLuvState *sp = EncoderState(tif);
+ int shft;
+ tmsize_t i;
+ tmsize_t j;
+ tmsize_t npixels;
+ uint8_t *op;
+ uint32_t *tp;
+ uint32_t b;
+ tmsize_t occ;
+ int rc = 0;
+ tmsize_t beg;
+
+ (void)s;
+ assert(s == 0);
+ assert(sp != NULL);
+
+ npixels = cc / sp->pixel_size;
+
+ if (sp->user_datafmt == SGILOGDATAFMT_RAW)
+ tp = (uint32_t *)bp;
+ else
+ {
+ tp = (uint32_t *)sp->tbuf;
+ if (sp->tbuflen < npixels)
+ {
+ TIFFErrorExtR(tif, module, "Translation buffer too short");
+ return (0);
+ }
+ (*sp->tfunc)(sp, bp, npixels);
+ }
+ /* compress each byte string */
+ op = tif->tif_rawcp;
+ occ = tif->tif_rawdatasize - tif->tif_rawcc;
+ for (shft = 24; shft >= 0; shft -= 8)
+ {
+ const uint32_t mask = 0xffU << shft; /* find next run */
+ for (i = 0; i < npixels; i += rc)
+ {
+ if (occ < 4)
+ {
+ tif->tif_rawcp = op;
+ tif->tif_rawcc = tif->tif_rawdatasize - occ;
+ if (!TIFFFlushData1(tif))
+ return (0);
+ op = tif->tif_rawcp;
+ occ = tif->tif_rawdatasize - tif->tif_rawcc;
+ }
+ for (beg = i; beg < npixels; beg += rc)
+ {
+ b = tp[beg] & mask;
+ rc = 1;
+ while (rc < 127 + 2 && beg + rc < npixels &&
+ (tp[beg + rc] & mask) == b)
+ rc++;
+ if (rc >= MINRUN)
+ break; /* long enough */
+ }
+ if (beg - i > 1 && beg - i < MINRUN)
+ {
+ b = tp[i] & mask; /* check short run */
+ j = i + 1;
+ while ((tp[j++] & mask) == b)
+ if (j == beg)
+ {
+ *op++ = (uint8_t)(128 - 2 + j - i);
+ *op++ = (uint8_t)(b >> shft);
+ occ -= 2;
+ i = beg;
+ break;
+ }
+ }
+ while (i < beg)
+ { /* write out non-run */
+ if ((j = beg - i) > 127)
+ j = 127;
+ if (occ < j + 3)
+ {
+ tif->tif_rawcp = op;
+ tif->tif_rawcc = tif->tif_rawdatasize - occ;
+ if (!TIFFFlushData1(tif))
+ return (0);
+ op = tif->tif_rawcp;
+ occ = tif->tif_rawdatasize - tif->tif_rawcc;
+ }
+ *op++ = (uint8_t)j;
+ occ--;
+ while (j--)
+ {
+ *op++ = (uint8_t)(tp[i++] >> shft & 0xff);
+ occ--;
+ }
+ }
+ if (rc >= MINRUN)
+ { /* write out run */
+ *op++ = (uint8_t)(128 - 2 + rc);
+ *op++ = (uint8_t)(tp[beg] >> shft & 0xff);
+ occ -= 2;
+ }
+ else
+ rc = 0;
+ }
+ }
+ tif->tif_rawcp = op;
+ tif->tif_rawcc = tif->tif_rawdatasize - occ;
+
+ return (1);
}
/*
* Encode a strip of pixels. We break it into rows to
* avoid encoding runs across row boundaries.
*/
-static int
-LogLuvEncodeStrip(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
+static int LogLuvEncodeStrip(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
{
- tmsize_t rowlen = TIFFScanlineSize(tif);
-
- if (rowlen == 0)
- return 0;
-
- assert(cc%rowlen == 0);
- while (cc && (*tif->tif_encoderow)(tif, bp, rowlen, s) == 1) {
- bp += rowlen;
- cc -= rowlen;
- }
- return (cc == 0);
+ tmsize_t rowlen = TIFFScanlineSize(tif);
+
+ if (rowlen == 0)
+ return 0;
+
+ assert(cc % rowlen == 0);
+ while (cc && (*tif->tif_encoderow)(tif, bp, rowlen, s) == 1)
+ {
+ bp += rowlen;
+ cc -= rowlen;
+ }
+ return (cc == 0);
}
/*
* Encode a tile of pixels. We break it into rows to
* avoid encoding runs across row boundaries.
*/
-static int
-LogLuvEncodeTile(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
+static int LogLuvEncodeTile(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
{
- tmsize_t rowlen = TIFFTileRowSize(tif);
-
- if (rowlen == 0)
- return 0;
-
- assert(cc%rowlen == 0);
- while (cc && (*tif->tif_encoderow)(tif, bp, rowlen, s) == 1) {
- bp += rowlen;
- cc -= rowlen;
- }
- return (cc == 0);
+ tmsize_t rowlen = TIFFTileRowSize(tif);
+
+ if (rowlen == 0)
+ return 0;
+
+ assert(cc % rowlen == 0);
+ while (cc && (*tif->tif_encoderow)(tif, bp, rowlen, s) == 1)
+ {
+ bp += rowlen;
+ cc -= rowlen;
+ }
+ return (cc == 0);
}
/*
@@ -726,190 +754,192 @@ LogLuvEncodeTile(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
#include "uvcode.h"
#ifndef UVSCALE
-#define U_NEU 0.210526316
-#define V_NEU 0.473684211
-#define UVSCALE 410.
+#define U_NEU 0.210526316
+#define V_NEU 0.473684211
+#define UVSCALE 410.
#endif
-#ifndef M_LN2
-#define M_LN2 0.69314718055994530942
+#ifndef M_LN2
+#define M_LN2 0.69314718055994530942
#endif
#ifndef M_PI
-#define M_PI 3.14159265358979323846
+#define M_PI 3.14159265358979323846
#endif
#undef log2 /* Conflict with C'99 function */
-#define log2(x) ((1./M_LN2)*log(x))
-#undef exp2 /* Conflict with C'99 function */
-#define exp2(x) exp(M_LN2*(x))
+#define log2(x) ((1. / M_LN2) * log(x))
+#undef exp2 /* Conflict with C'99 function */
+#define exp2(x) exp(M_LN2 *(x))
-static int itrunc(double x, int m)
+static int tiff_itrunc(double x, int m)
{
- if( m == SGILOGENCODE_NODITHER )
+ if (m == SGILOGENCODE_NODITHER)
return (int)x;
/* Silence CoverityScan warning about bad crypto function */
/* coverity[dont_call] */
- return (int)(x + rand()*(1./RAND_MAX) - .5);
+ return (int)(x + rand() * (1. / RAND_MAX) - .5);
}
#if !LOGLUV_PUBLIC
static
#endif
-double
-LogL16toY(int p16) /* compute luminance from 16-bit LogL */
+ double
+ LogL16toY(int p16) /* compute luminance from 16-bit LogL */
{
- int Le = p16 & 0x7fff;
- double Y;
+ int Le = p16 & 0x7fff;
+ double Y;
- if (!Le)
- return (0.);
- Y = exp(M_LN2/256.*(Le+.5) - M_LN2*64.);
- return (!(p16 & 0x8000) ? Y : -Y);
+ if (!Le)
+ return (0.);
+ Y = exp(M_LN2 / 256. * (Le + .5) - M_LN2 * 64.);
+ return (!(p16 & 0x8000) ? Y : -Y);
}
#if !LOGLUV_PUBLIC
static
#endif
-int
-LogL16fromY(double Y, int em) /* get 16-bit LogL from Y */
+ int
+ LogL16fromY(double Y, int em) /* get 16-bit LogL from Y */
{
- if (Y >= 1.8371976e19)
- return (0x7fff);
- if (Y <= -1.8371976e19)
- return (0xffff);
- if (Y > 5.4136769e-20)
- return itrunc(256.*(log2(Y) + 64.), em);
- if (Y < -5.4136769e-20)
- return (~0x7fff | itrunc(256.*(log2(-Y) + 64.), em));
- return (0);
+ if (Y >= 1.8371976e19)
+ return (0x7fff);
+ if (Y <= -1.8371976e19)
+ return (0xffff);
+ if (Y > 5.4136769e-20)
+ return tiff_itrunc(256. * (log2(Y) + 64.), em);
+ if (Y < -5.4136769e-20)
+ return (~0x7fff | tiff_itrunc(256. * (log2(-Y) + 64.), em));
+ return (0);
}
-static void
-L16toY(LogLuvState* sp, uint8* op, tmsize_t n)
+static void L16toY(LogLuvState *sp, uint8_t *op, tmsize_t n)
{
- int16* l16 = (int16*) sp->tbuf;
- float* yp = (float*) op;
+ int16_t *l16 = (int16_t *)sp->tbuf;
+ float *yp = (float *)op;
- while (n-- > 0)
- *yp++ = (float)LogL16toY(*l16++);
+ while (n-- > 0)
+ *yp++ = (float)LogL16toY(*l16++);
}
-static void
-L16toGry(LogLuvState* sp, uint8* op, tmsize_t n)
+static void L16toGry(LogLuvState *sp, uint8_t *op, tmsize_t n)
{
- int16* l16 = (int16*) sp->tbuf;
- uint8* gp = (uint8*) op;
-
- while (n-- > 0) {
- double Y = LogL16toY(*l16++);
- *gp++ = (uint8) ((Y <= 0.) ? 0 : (Y >= 1.) ? 255 : (int)(256.*sqrt(Y)));
- }
+ int16_t *l16 = (int16_t *)sp->tbuf;
+ uint8_t *gp = (uint8_t *)op;
+
+ while (n-- > 0)
+ {
+ double Y = LogL16toY(*l16++);
+ *gp++ = (uint8_t)((Y <= 0.) ? 0
+ : (Y >= 1.) ? 255
+ : (int)(256. * sqrt(Y)));
+ }
}
-static void
-L16fromY(LogLuvState* sp, uint8* op, tmsize_t n)
+static void L16fromY(LogLuvState *sp, uint8_t *op, tmsize_t n)
{
- int16* l16 = (int16*) sp->tbuf;
- float* yp = (float*) op;
+ int16_t *l16 = (int16_t *)sp->tbuf;
+ float *yp = (float *)op;
- while (n-- > 0)
- *l16++ = (int16) (LogL16fromY(*yp++, sp->encode_meth));
+ while (n-- > 0)
+ *l16++ = (int16_t)(LogL16fromY(*yp++, sp->encode_meth));
}
#if !LOGLUV_PUBLIC
static
#endif
-void
-XYZtoRGB24(float xyz[3], uint8 rgb[3])
+ void
+ XYZtoRGB24(float *xyz, uint8_t *rgb)
{
- double r, g, b;
- /* assume CCIR-709 primaries */
- r = 2.690*xyz[0] + -1.276*xyz[1] + -0.414*xyz[2];
- g = -1.022*xyz[0] + 1.978*xyz[1] + 0.044*xyz[2];
- b = 0.061*xyz[0] + -0.224*xyz[1] + 1.163*xyz[2];
- /* assume 2.0 gamma for speed */
- /* could use integer sqrt approx., but this is probably faster */
- rgb[0] = (uint8)((r<=0.) ? 0 : (r >= 1.) ? 255 : (int)(256.*sqrt(r)));
- rgb[1] = (uint8)((g<=0.) ? 0 : (g >= 1.) ? 255 : (int)(256.*sqrt(g)));
- rgb[2] = (uint8)((b<=0.) ? 0 : (b >= 1.) ? 255 : (int)(256.*sqrt(b)));
+ double r, g, b;
+ /* assume CCIR-709 primaries */
+ r = 2.690 * xyz[0] + -1.276 * xyz[1] + -0.414 * xyz[2];
+ g = -1.022 * xyz[0] + 1.978 * xyz[1] + 0.044 * xyz[2];
+ b = 0.061 * xyz[0] + -0.224 * xyz[1] + 1.163 * xyz[2];
+ /* assume 2.0 gamma for speed */
+ /* could use integer sqrt approx., but this is probably faster */
+ rgb[0] = (uint8_t)((r <= 0.) ? 0 : (r >= 1.) ? 255 : (int)(256. * sqrt(r)));
+ rgb[1] = (uint8_t)((g <= 0.) ? 0 : (g >= 1.) ? 255 : (int)(256. * sqrt(g)));
+ rgb[2] = (uint8_t)((b <= 0.) ? 0 : (b >= 1.) ? 255 : (int)(256. * sqrt(b)));
}
#if !LOGLUV_PUBLIC
static
#endif
-double
-LogL10toY(int p10) /* compute luminance from 10-bit LogL */
+ double
+ LogL10toY(int p10) /* compute luminance from 10-bit LogL */
{
- if (p10 == 0)
- return (0.);
- return (exp(M_LN2/64.*(p10+.5) - M_LN2*12.));
+ if (p10 == 0)
+ return (0.);
+ return (exp(M_LN2 / 64. * (p10 + .5) - M_LN2 * 12.));
}
#if !LOGLUV_PUBLIC
static
#endif
-int
-LogL10fromY(double Y, int em) /* get 10-bit LogL from Y */
+ int
+ LogL10fromY(double Y, int em) /* get 10-bit LogL from Y */
{
- if (Y >= 15.742)
- return (0x3ff);
- else if (Y <= .00024283)
- return (0);
- else
- return itrunc(64.*(log2(Y) + 12.), em);
+ if (Y >= 15.742)
+ return (0x3ff);
+ else if (Y <= .00024283)
+ return (0);
+ else
+ return tiff_itrunc(64. * (log2(Y) + 12.), em);
}
-#define NANGLES 100
-#define uv2ang(u, v) ( (NANGLES*.499999999/M_PI) \
- * atan2((v)-V_NEU,(u)-U_NEU) + .5*NANGLES )
+#define NANGLES 100
+#define uv2ang(u, v) \
+ ((NANGLES * .499999999 / M_PI) * atan2((v)-V_NEU, (u)-U_NEU) + .5 * NANGLES)
-static int
-oog_encode(double u, double v) /* encode out-of-gamut chroma */
+static int oog_encode(double u, double v) /* encode out-of-gamut chroma */
{
- static int oog_table[NANGLES];
- static int initialized = 0;
- register int i;
-
- if (!initialized) { /* set up perimeter table */
- double eps[NANGLES], ua, va, ang, epsa;
- int ui, vi, ustep;
- for (i = NANGLES; i--; )
- eps[i] = 2.;
- for (vi = UV_NVS; vi--; ) {
- va = UV_VSTART + (vi+.5)*UV_SQSIZ;
- ustep = uv_row[vi].nus-1;
- if (vi == UV_NVS-1 || vi == 0 || ustep <= 0)
- ustep = 1;
- for (ui = uv_row[vi].nus-1; ui >= 0; ui -= ustep) {
- ua = uv_row[vi].ustart + (ui+.5)*UV_SQSIZ;
- ang = uv2ang(ua, va);
- i = (int) ang;
- epsa = fabs(ang - (i+.5));
- if (epsa < eps[i]) {
- oog_table[i] = uv_row[vi].ncum + ui;
- eps[i] = epsa;
- }
- }
- }
- for (i = NANGLES; i--; ) /* fill any holes */
- if (eps[i] > 1.5) {
- int i1, i2;
- for (i1 = 1; i1 < NANGLES/2; i1++)
- if (eps[(i+i1)%NANGLES] < 1.5)
- break;
- for (i2 = 1; i2 < NANGLES/2; i2++)
- if (eps[(i+NANGLES-i2)%NANGLES] < 1.5)
- break;
- if (i1 < i2)
- oog_table[i] =
- oog_table[(i+i1)%NANGLES];
- else
- oog_table[i] =
- oog_table[(i+NANGLES-i2)%NANGLES];
- }
- initialized = 1;
- }
- i = (int) uv2ang(u, v); /* look up hue angle */
- return (oog_table[i]);
+ static int oog_table[NANGLES];
+ static int initialized = 0;
+ register int i;
+
+ if (!initialized)
+ { /* set up perimeter table */
+ double eps[NANGLES], ua, va, ang, epsa;
+ int ui, vi, ustep;
+ for (i = NANGLES; i--;)
+ eps[i] = 2.;
+ for (vi = UV_NVS; vi--;)
+ {
+ va = UV_VSTART + (vi + .5) * UV_SQSIZ;
+ ustep = uv_row[vi].nus - 1;
+ if (vi == UV_NVS - 1 || vi == 0 || ustep <= 0)
+ ustep = 1;
+ for (ui = uv_row[vi].nus - 1; ui >= 0; ui -= ustep)
+ {
+ ua = uv_row[vi].ustart + (ui + .5) * UV_SQSIZ;
+ ang = uv2ang(ua, va);
+ i = (int)ang;
+ epsa = fabs(ang - (i + .5));
+ if (epsa < eps[i])
+ {
+ oog_table[i] = uv_row[vi].ncum + ui;
+ eps[i] = epsa;
+ }
+ }
+ }
+ for (i = NANGLES; i--;) /* fill any holes */
+ if (eps[i] > 1.5)
+ {
+ int i1, i2;
+ for (i1 = 1; i1 < NANGLES / 2; i1++)
+ if (eps[(i + i1) % NANGLES] < 1.5)
+ break;
+ for (i2 = 1; i2 < NANGLES / 2; i2++)
+ if (eps[(i + NANGLES - i2) % NANGLES] < 1.5)
+ break;
+ if (i1 < i2)
+ oog_table[i] = oog_table[(i + i1) % NANGLES];
+ else
+ oog_table[i] = oog_table[(i + NANGLES - i2) % NANGLES];
+ }
+ initialized = 1;
+ }
+ i = (int)uv2ang(u, v); /* look up hue angle */
+ return (oog_table[i]);
}
#undef uv2ang
@@ -918,847 +948,884 @@ oog_encode(double u, double v) /* encode out-of-gamut chroma */
#if !LOGLUV_PUBLIC
static
#endif
-int
-uv_encode(double u, double v, int em) /* encode (u',v') coordinates */
+ int
+ uv_encode(double u, double v, int em) /* encode (u',v') coordinates */
{
- register int vi, ui;
-
- if (v < UV_VSTART)
- return oog_encode(u, v);
- vi = itrunc((v - UV_VSTART)*(1./UV_SQSIZ), em);
- if (vi >= UV_NVS)
- return oog_encode(u, v);
- if (u < uv_row[vi].ustart)
- return oog_encode(u, v);
- ui = itrunc((u - uv_row[vi].ustart)*(1./UV_SQSIZ), em);
- if (ui >= uv_row[vi].nus)
- return oog_encode(u, v);
-
- return (uv_row[vi].ncum + ui);
+ register int vi, ui;
+
+ if (v < UV_VSTART)
+ return oog_encode(u, v);
+ vi = tiff_itrunc((v - UV_VSTART) * (1. / UV_SQSIZ), em);
+ if (vi >= UV_NVS)
+ return oog_encode(u, v);
+ if (u < uv_row[vi].ustart)
+ return oog_encode(u, v);
+ ui = tiff_itrunc((u - uv_row[vi].ustart) * (1. / UV_SQSIZ), em);
+ if (ui >= uv_row[vi].nus)
+ return oog_encode(u, v);
+
+ return (uv_row[vi].ncum + ui);
}
#if !LOGLUV_PUBLIC
static
#endif
-int
-uv_decode(double *up, double *vp, int c) /* decode (u',v') index */
+ int
+ uv_decode(double *up, double *vp, int c) /* decode (u',v') index */
{
- int upper, lower;
- register int ui, vi;
-
- if (c < 0 || c >= UV_NDIVS)
- return (-1);
- lower = 0; /* binary search */
- upper = UV_NVS;
- while (upper - lower > 1) {
- vi = (lower + upper) >> 1;
- ui = c - uv_row[vi].ncum;
- if (ui > 0)
- lower = vi;
- else if (ui < 0)
- upper = vi;
- else {
- lower = vi;
- break;
- }
- }
- vi = lower;
- ui = c - uv_row[vi].ncum;
- *up = uv_row[vi].ustart + (ui+.5)*UV_SQSIZ;
- *vp = UV_VSTART + (vi+.5)*UV_SQSIZ;
- return (0);
+ int upper, lower;
+ register int ui, vi;
+
+ if (c < 0 || c >= UV_NDIVS)
+ return (-1);
+ lower = 0; /* binary search */
+ upper = UV_NVS;
+ while (upper - lower > 1)
+ {
+ vi = (lower + upper) >> 1;
+ ui = c - uv_row[vi].ncum;
+ if (ui > 0)
+ lower = vi;
+ else if (ui < 0)
+ upper = vi;
+ else
+ {
+ lower = vi;
+ break;
+ }
+ }
+ vi = lower;
+ ui = c - uv_row[vi].ncum;
+ *up = uv_row[vi].ustart + (ui + .5) * UV_SQSIZ;
+ *vp = UV_VSTART + (vi + .5) * UV_SQSIZ;
+ return (0);
}
#if !LOGLUV_PUBLIC
static
#endif
-void
-LogLuv24toXYZ(uint32 p, float XYZ[3])
+ void
+ LogLuv24toXYZ(uint32_t p, float *XYZ)
{
- int Ce;
- double L, u, v, s, x, y;
- /* decode luminance */
- L = LogL10toY(p>>14 & 0x3ff);
- if (L <= 0.) {
- XYZ[0] = XYZ[1] = XYZ[2] = 0.;
- return;
- }
- /* decode color */
- Ce = p & 0x3fff;
- if (uv_decode(&u, &v, Ce) < 0) {
- u = U_NEU; v = V_NEU;
- }
- s = 1./(6.*u - 16.*v + 12.);
- x = 9.*u * s;
- y = 4.*v * s;
- /* convert to XYZ */
- XYZ[0] = (float)(x/y * L);
- XYZ[1] = (float)L;
- XYZ[2] = (float)((1.-x-y)/y * L);
+ int Ce;
+ double L, u, v, s, x, y;
+ /* decode luminance */
+ L = LogL10toY(p >> 14 & 0x3ff);
+ if (L <= 0.)
+ {
+ XYZ[0] = XYZ[1] = XYZ[2] = 0.;
+ return;
+ }
+ /* decode color */
+ Ce = p & 0x3fff;
+ if (uv_decode(&u, &v, Ce) < 0)
+ {
+ u = U_NEU;
+ v = V_NEU;
+ }
+ s = 1. / (6. * u - 16. * v + 12.);
+ x = 9. * u * s;
+ y = 4. * v * s;
+ /* convert to XYZ */
+ XYZ[0] = (float)(x / y * L);
+ XYZ[1] = (float)L;
+ XYZ[2] = (float)((1. - x - y) / y * L);
}
#if !LOGLUV_PUBLIC
static
#endif
-uint32
-LogLuv24fromXYZ(float XYZ[3], int em)
+ uint32_t
+ LogLuv24fromXYZ(float *XYZ, int em)
{
- int Le, Ce;
- double u, v, s;
- /* encode luminance */
- Le = LogL10fromY(XYZ[1], em);
- /* encode color */
- s = XYZ[0] + 15.*XYZ[1] + 3.*XYZ[2];
- if (!Le || s <= 0.) {
- u = U_NEU;
- v = V_NEU;
- } else {
- u = 4.*XYZ[0] / s;
- v = 9.*XYZ[1] / s;
- }
- Ce = uv_encode(u, v, em);
- if (Ce < 0) /* never happens */
- Ce = uv_encode(U_NEU, V_NEU, SGILOGENCODE_NODITHER);
- /* combine encodings */
- return (Le << 14 | Ce);
+ int Le, Ce;
+ double u, v, s;
+ /* encode luminance */
+ Le = LogL10fromY(XYZ[1], em);
+ /* encode color */
+ s = XYZ[0] + 15. * XYZ[1] + 3. * XYZ[2];
+ if (!Le || s <= 0.)
+ {
+ u = U_NEU;
+ v = V_NEU;
+ }
+ else
+ {
+ u = 4. * XYZ[0] / s;
+ v = 9. * XYZ[1] / s;
+ }
+ Ce = uv_encode(u, v, em);
+ if (Ce < 0) /* never happens */
+ Ce = uv_encode(U_NEU, V_NEU, SGILOGENCODE_NODITHER);
+ /* combine encodings */
+ return (Le << 14 | Ce);
}
-static void
-Luv24toXYZ(LogLuvState* sp, uint8* op, tmsize_t n)
+static void Luv24toXYZ(LogLuvState *sp, uint8_t *op, tmsize_t n)
{
- uint32* luv = (uint32*) sp->tbuf;
- float* xyz = (float*) op;
-
- while (n-- > 0) {
- LogLuv24toXYZ(*luv, xyz);
- xyz += 3;
- luv++;
- }
+ uint32_t *luv = (uint32_t *)sp->tbuf;
+ float *xyz = (float *)op;
+
+ while (n-- > 0)
+ {
+ LogLuv24toXYZ(*luv, xyz);
+ xyz += 3;
+ luv++;
+ }
}
-static void
-Luv24toLuv48(LogLuvState* sp, uint8* op, tmsize_t n)
+static void Luv24toLuv48(LogLuvState *sp, uint8_t *op, tmsize_t n)
{
- uint32* luv = (uint32*) sp->tbuf;
- int16* luv3 = (int16*) op;
-
- while (n-- > 0) {
- double u, v;
-
- *luv3++ = (int16)((*luv >> 12 & 0xffd) + 13314);
- if (uv_decode(&u, &v, *luv&0x3fff) < 0) {
- u = U_NEU;
- v = V_NEU;
- }
- *luv3++ = (int16)(u * (1L<<15));
- *luv3++ = (int16)(v * (1L<<15));
- luv++;
- }
+ uint32_t *luv = (uint32_t *)sp->tbuf;
+ int16_t *luv3 = (int16_t *)op;
+
+ while (n-- > 0)
+ {
+ double u, v;
+
+ *luv3++ = (int16_t)((*luv >> 12 & 0xffd) + 13314);
+ if (uv_decode(&u, &v, *luv & 0x3fff) < 0)
+ {
+ u = U_NEU;
+ v = V_NEU;
+ }
+ *luv3++ = (int16_t)(u * (1L << 15));
+ *luv3++ = (int16_t)(v * (1L << 15));
+ luv++;
+ }
}
-static void
-Luv24toRGB(LogLuvState* sp, uint8* op, tmsize_t n)
+static void Luv24toRGB(LogLuvState *sp, uint8_t *op, tmsize_t n)
{
- uint32* luv = (uint32*) sp->tbuf;
- uint8* rgb = (uint8*) op;
+ uint32_t *luv = (uint32_t *)sp->tbuf;
+ uint8_t *rgb = (uint8_t *)op;
- while (n-- > 0) {
- float xyz[3];
+ while (n-- > 0)
+ {
+ float xyz[3];
- LogLuv24toXYZ(*luv++, xyz);
- XYZtoRGB24(xyz, rgb);
- rgb += 3;
- }
+ LogLuv24toXYZ(*luv++, xyz);
+ XYZtoRGB24(xyz, rgb);
+ rgb += 3;
+ }
}
-static void
-Luv24fromXYZ(LogLuvState* sp, uint8* op, tmsize_t n)
+static void Luv24fromXYZ(LogLuvState *sp, uint8_t *op, tmsize_t n)
{
- uint32* luv = (uint32*) sp->tbuf;
- float* xyz = (float*) op;
-
- while (n-- > 0) {
- *luv++ = LogLuv24fromXYZ(xyz, sp->encode_meth);
- xyz += 3;
- }
+ uint32_t *luv = (uint32_t *)sp->tbuf;
+ float *xyz = (float *)op;
+
+ while (n-- > 0)
+ {
+ *luv++ = LogLuv24fromXYZ(xyz, sp->encode_meth);
+ xyz += 3;
+ }
}
-static void
-Luv24fromLuv48(LogLuvState* sp, uint8* op, tmsize_t n)
+static void Luv24fromLuv48(LogLuvState *sp, uint8_t *op, tmsize_t n)
{
- uint32* luv = (uint32*) sp->tbuf;
- int16* luv3 = (int16*) op;
-
- while (n-- > 0) {
- int Le, Ce;
-
- if (luv3[0] <= 0)
- Le = 0;
- else if (luv3[0] >= (1<<12)+3314)
- Le = (1<<10) - 1;
- else if (sp->encode_meth == SGILOGENCODE_NODITHER)
- Le = (luv3[0]-3314) >> 2;
- else
- Le = itrunc(.25*(luv3[0]-3314.), sp->encode_meth);
-
- Ce = uv_encode((luv3[1]+.5)/(1<<15), (luv3[2]+.5)/(1<<15),
- sp->encode_meth);
- if (Ce < 0) /* never happens */
- Ce = uv_encode(U_NEU, V_NEU, SGILOGENCODE_NODITHER);
- *luv++ = (uint32)Le << 14 | Ce;
- luv3 += 3;
- }
+ uint32_t *luv = (uint32_t *)sp->tbuf;
+ int16_t *luv3 = (int16_t *)op;
+
+ while (n-- > 0)
+ {
+ int Le, Ce;
+
+ if (luv3[0] <= 0)
+ Le = 0;
+ else if (luv3[0] >= (1 << 12) + 3314)
+ Le = (1 << 10) - 1;
+ else if (sp->encode_meth == SGILOGENCODE_NODITHER)
+ Le = (luv3[0] - 3314) >> 2;
+ else
+ Le = tiff_itrunc(.25 * (luv3[0] - 3314.), sp->encode_meth);
+
+ Ce = uv_encode((luv3[1] + .5) / (1 << 15), (luv3[2] + .5) / (1 << 15),
+ sp->encode_meth);
+ if (Ce < 0) /* never happens */
+ Ce = uv_encode(U_NEU, V_NEU, SGILOGENCODE_NODITHER);
+ *luv++ = (uint32_t)Le << 14 | Ce;
+ luv3 += 3;
+ }
}
#if !LOGLUV_PUBLIC
static
#endif
-void
-LogLuv32toXYZ(uint32 p, float XYZ[3])
+ void
+ LogLuv32toXYZ(uint32_t p, float *XYZ)
{
- double L, u, v, s, x, y;
- /* decode luminance */
- L = LogL16toY((int)p >> 16);
- if (L <= 0.) {
- XYZ[0] = XYZ[1] = XYZ[2] = 0.;
- return;
- }
- /* decode color */
- u = 1./UVSCALE * ((p>>8 & 0xff) + .5);
- v = 1./UVSCALE * ((p & 0xff) + .5);
- s = 1./(6.*u - 16.*v + 12.);
- x = 9.*u * s;
- y = 4.*v * s;
- /* convert to XYZ */
- XYZ[0] = (float)(x/y * L);
- XYZ[1] = (float)L;
- XYZ[2] = (float)((1.-x-y)/y * L);
+ double L, u, v, s, x, y;
+ /* decode luminance */
+ L = LogL16toY((int)p >> 16);
+ if (L <= 0.)
+ {
+ XYZ[0] = XYZ[1] = XYZ[2] = 0.;
+ return;
+ }
+ /* decode color */
+ u = 1. / UVSCALE * ((p >> 8 & 0xff) + .5);
+ v = 1. / UVSCALE * ((p & 0xff) + .5);
+ s = 1. / (6. * u - 16. * v + 12.);
+ x = 9. * u * s;
+ y = 4. * v * s;
+ /* convert to XYZ */
+ XYZ[0] = (float)(x / y * L);
+ XYZ[1] = (float)L;
+ XYZ[2] = (float)((1. - x - y) / y * L);
}
#if !LOGLUV_PUBLIC
static
#endif
-uint32
-LogLuv32fromXYZ(float XYZ[3], int em)
+ uint32_t
+ LogLuv32fromXYZ(float *XYZ, int em)
{
- unsigned int Le, ue, ve;
- double u, v, s;
- /* encode luminance */
- Le = (unsigned int)LogL16fromY(XYZ[1], em);
- /* encode color */
- s = XYZ[0] + 15.*XYZ[1] + 3.*XYZ[2];
- if (!Le || s <= 0.) {
- u = U_NEU;
- v = V_NEU;
- } else {
- u = 4.*XYZ[0] / s;
- v = 9.*XYZ[1] / s;
- }
- if (u <= 0.) ue = 0;
- else ue = itrunc(UVSCALE*u, em);
- if (ue > 255) ue = 255;
- if (v <= 0.) ve = 0;
- else ve = itrunc(UVSCALE*v, em);
- if (ve > 255) ve = 255;
- /* combine encodings */
- return (Le << 16 | ue << 8 | ve);
+ unsigned int Le, ue, ve;
+ double u, v, s;
+ /* encode luminance */
+ Le = (unsigned int)LogL16fromY(XYZ[1], em);
+ /* encode color */
+ s = XYZ[0] + 15. * XYZ[1] + 3. * XYZ[2];
+ if (!Le || s <= 0.)
+ {
+ u = U_NEU;
+ v = V_NEU;
+ }
+ else
+ {
+ u = 4. * XYZ[0] / s;
+ v = 9. * XYZ[1] / s;
+ }
+ if (u <= 0.)
+ ue = 0;
+ else
+ ue = tiff_itrunc(UVSCALE * u, em);
+ if (ue > 255)
+ ue = 255;
+ if (v <= 0.)
+ ve = 0;
+ else
+ ve = tiff_itrunc(UVSCALE * v, em);
+ if (ve > 255)
+ ve = 255;
+ /* combine encodings */
+ return (Le << 16 | ue << 8 | ve);
}
-static void
-Luv32toXYZ(LogLuvState* sp, uint8* op, tmsize_t n)
+static void Luv32toXYZ(LogLuvState *sp, uint8_t *op, tmsize_t n)
{
- uint32* luv = (uint32*) sp->tbuf;
- float* xyz = (float*) op;
-
- while (n-- > 0) {
- LogLuv32toXYZ(*luv++, xyz);
- xyz += 3;
- }
+ uint32_t *luv = (uint32_t *)sp->tbuf;
+ float *xyz = (float *)op;
+
+ while (n-- > 0)
+ {
+ LogLuv32toXYZ(*luv++, xyz);
+ xyz += 3;
+ }
}
-static void
-Luv32toLuv48(LogLuvState* sp, uint8* op, tmsize_t n)
+static void Luv32toLuv48(LogLuvState *sp, uint8_t *op, tmsize_t n)
{
- uint32* luv = (uint32*) sp->tbuf;
- int16* luv3 = (int16*) op;
-
- while (n-- > 0) {
- double u, v;
-
- *luv3++ = (int16)(*luv >> 16);
- u = 1./UVSCALE * ((*luv>>8 & 0xff) + .5);
- v = 1./UVSCALE * ((*luv & 0xff) + .5);
- *luv3++ = (int16)(u * (1L<<15));
- *luv3++ = (int16)(v * (1L<<15));
- luv++;
- }
+ uint32_t *luv = (uint32_t *)sp->tbuf;
+ int16_t *luv3 = (int16_t *)op;
+
+ while (n-- > 0)
+ {
+ double u, v;
+
+ *luv3++ = (int16_t)(*luv >> 16);
+ u = 1. / UVSCALE * ((*luv >> 8 & 0xff) + .5);
+ v = 1. / UVSCALE * ((*luv & 0xff) + .5);
+ *luv3++ = (int16_t)(u * (1L << 15));
+ *luv3++ = (int16_t)(v * (1L << 15));
+ luv++;
+ }
}
-static void
-Luv32toRGB(LogLuvState* sp, uint8* op, tmsize_t n)
+static void Luv32toRGB(LogLuvState *sp, uint8_t *op, tmsize_t n)
{
- uint32* luv = (uint32*) sp->tbuf;
- uint8* rgb = (uint8*) op;
+ uint32_t *luv = (uint32_t *)sp->tbuf;
+ uint8_t *rgb = (uint8_t *)op;
- while (n-- > 0) {
- float xyz[3];
+ while (n-- > 0)
+ {
+ float xyz[3];
- LogLuv32toXYZ(*luv++, xyz);
- XYZtoRGB24(xyz, rgb);
- rgb += 3;
- }
+ LogLuv32toXYZ(*luv++, xyz);
+ XYZtoRGB24(xyz, rgb);
+ rgb += 3;
+ }
}
-static void
-Luv32fromXYZ(LogLuvState* sp, uint8* op, tmsize_t n)
+static void Luv32fromXYZ(LogLuvState *sp, uint8_t *op, tmsize_t n)
{
- uint32* luv = (uint32*) sp->tbuf;
- float* xyz = (float*) op;
-
- while (n-- > 0) {
- *luv++ = LogLuv32fromXYZ(xyz, sp->encode_meth);
- xyz += 3;
- }
+ uint32_t *luv = (uint32_t *)sp->tbuf;
+ float *xyz = (float *)op;
+
+ while (n-- > 0)
+ {
+ *luv++ = LogLuv32fromXYZ(xyz, sp->encode_meth);
+ xyz += 3;
+ }
}
-static void
-Luv32fromLuv48(LogLuvState* sp, uint8* op, tmsize_t n)
+static void Luv32fromLuv48(LogLuvState *sp, uint8_t *op, tmsize_t n)
{
- uint32* luv = (uint32*) sp->tbuf;
- int16* luv3 = (int16*) op;
-
- if (sp->encode_meth == SGILOGENCODE_NODITHER) {
- while (n-- > 0) {
- *luv++ = (uint32)luv3[0] << 16 |
- (luv3[1]*(uint32)(UVSCALE+.5) >> 7 & 0xff00) |
- (luv3[2]*(uint32)(UVSCALE+.5) >> 15 & 0xff);
- luv3 += 3;
- }
- return;
- }
- while (n-- > 0) {
- *luv++ = (uint32)luv3[0] << 16 |
- (itrunc(luv3[1]*(UVSCALE/(1<<15)), sp->encode_meth) << 8 & 0xff00) |
- (itrunc(luv3[2]*(UVSCALE/(1<<15)), sp->encode_meth) & 0xff);
- luv3 += 3;
- }
+ uint32_t *luv = (uint32_t *)sp->tbuf;
+ int16_t *luv3 = (int16_t *)op;
+
+ if (sp->encode_meth == SGILOGENCODE_NODITHER)
+ {
+ while (n-- > 0)
+ {
+ *luv++ = (uint32_t)luv3[0] << 16 |
+ (luv3[1] * (uint32_t)(UVSCALE + .5) >> 7 & 0xff00) |
+ (luv3[2] * (uint32_t)(UVSCALE + .5) >> 15 & 0xff);
+ luv3 += 3;
+ }
+ return;
+ }
+ while (n-- > 0)
+ {
+ *luv++ =
+ (uint32_t)luv3[0] << 16 |
+ (tiff_itrunc(luv3[1] * (UVSCALE / (1 << 15)), sp->encode_meth)
+ << 8 &
+ 0xff00) |
+ (tiff_itrunc(luv3[2] * (UVSCALE / (1 << 15)), sp->encode_meth) &
+ 0xff);
+ luv3 += 3;
+ }
}
-static void
-_logLuvNop(LogLuvState* sp, uint8* op, tmsize_t n)
+static void _logLuvNop(LogLuvState *sp, uint8_t *op, tmsize_t n)
{
- (void) sp; (void) op; (void) n;
+ (void)sp;
+ (void)op;
+ (void)n;
}
-static int
-LogL16GuessDataFmt(TIFFDirectory *td)
+static int LogL16GuessDataFmt(TIFFDirectory *td)
{
-#define PACK(s,b,f) (((b)<<6)|((s)<<3)|(f))
- switch (PACK(td->td_samplesperpixel, td->td_bitspersample, td->td_sampleformat)) {
- case PACK(1, 32, SAMPLEFORMAT_IEEEFP):
- return (SGILOGDATAFMT_FLOAT);
- case PACK(1, 16, SAMPLEFORMAT_VOID):
- case PACK(1, 16, SAMPLEFORMAT_INT):
- case PACK(1, 16, SAMPLEFORMAT_UINT):
- return (SGILOGDATAFMT_16BIT);
- case PACK(1, 8, SAMPLEFORMAT_VOID):
- case PACK(1, 8, SAMPLEFORMAT_UINT):
- return (SGILOGDATAFMT_8BIT);
- }
+#define PACK(s, b, f) (((b) << 6) | ((s) << 3) | (f))
+ switch (
+ PACK(td->td_samplesperpixel, td->td_bitspersample, td->td_sampleformat))
+ {
+ case PACK(1, 32, SAMPLEFORMAT_IEEEFP):
+ return (SGILOGDATAFMT_FLOAT);
+ case PACK(1, 16, SAMPLEFORMAT_VOID):
+ case PACK(1, 16, SAMPLEFORMAT_INT):
+ case PACK(1, 16, SAMPLEFORMAT_UINT):
+ return (SGILOGDATAFMT_16BIT);
+ case PACK(1, 8, SAMPLEFORMAT_VOID):
+ case PACK(1, 8, SAMPLEFORMAT_UINT):
+ return (SGILOGDATAFMT_8BIT);
+ }
#undef PACK
- return (SGILOGDATAFMT_UNKNOWN);
+ return (SGILOGDATAFMT_UNKNOWN);
}
-static tmsize_t
-multiply_ms(tmsize_t m1, tmsize_t m2)
+static tmsize_t multiply_ms(tmsize_t m1, tmsize_t m2)
{
- return _TIFFMultiplySSize(NULL, m1, m2, NULL);
+ return _TIFFMultiplySSize(NULL, m1, m2, NULL);
}
-static int
-LogL16InitState(TIFF* tif)
+static int LogL16InitState(TIFF *tif)
{
- static const char module[] = "LogL16InitState";
- TIFFDirectory *td = &tif->tif_dir;
- LogLuvState* sp = DecoderState(tif);
-
- assert(sp != NULL);
- assert(td->td_photometric == PHOTOMETRIC_LOGL);
-
- if( td->td_samplesperpixel != 1 )
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Sorry, can not handle LogL image with %s=%d",
- "Samples/pixel", td->td_samplesperpixel);
- return 0;
- }
-
- /* for some reason, we can't do this in TIFFInitLogL16 */
- if (sp->user_datafmt == SGILOGDATAFMT_UNKNOWN)
- sp->user_datafmt = LogL16GuessDataFmt(td);
- switch (sp->user_datafmt) {
- case SGILOGDATAFMT_FLOAT:
- sp->pixel_size = sizeof (float);
- break;
- case SGILOGDATAFMT_16BIT:
- sp->pixel_size = sizeof (int16);
- break;
- case SGILOGDATAFMT_8BIT:
- sp->pixel_size = sizeof (uint8);
- break;
- default:
- TIFFErrorExt(tif->tif_clientdata, module,
- "No support for converting user data format to LogL");
- return (0);
- }
- if( isTiled(tif) )
- sp->tbuflen = multiply_ms(td->td_tilewidth, td->td_tilelength);
- else if( td->td_rowsperstrip < td->td_imagelength )
- sp->tbuflen = multiply_ms(td->td_imagewidth, td->td_rowsperstrip);
- else
- sp->tbuflen = multiply_ms(td->td_imagewidth, td->td_imagelength);
- if (multiply_ms(sp->tbuflen, sizeof (int16)) == 0 ||
- (sp->tbuf = (uint8*) _TIFFmalloc(sp->tbuflen * sizeof (int16))) == NULL) {
- TIFFErrorExt(tif->tif_clientdata, module, "No space for SGILog translation buffer");
- return (0);
- }
- return (1);
+ static const char module[] = "LogL16InitState";
+ TIFFDirectory *td = &tif->tif_dir;
+ LogLuvState *sp = DecoderState(tif);
+
+ assert(sp != NULL);
+ assert(td->td_photometric == PHOTOMETRIC_LOGL);
+
+ if (td->td_samplesperpixel != 1)
+ {
+ TIFFErrorExtR(tif, module,
+ "Sorry, can not handle LogL image with %s=%" PRIu16,
+ "Samples/pixel", td->td_samplesperpixel);
+ return 0;
+ }
+
+ /* for some reason, we can't do this in TIFFInitLogL16 */
+ if (sp->user_datafmt == SGILOGDATAFMT_UNKNOWN)
+ sp->user_datafmt = LogL16GuessDataFmt(td);
+ switch (sp->user_datafmt)
+ {
+ case SGILOGDATAFMT_FLOAT:
+ sp->pixel_size = sizeof(float);
+ break;
+ case SGILOGDATAFMT_16BIT:
+ sp->pixel_size = sizeof(int16_t);
+ break;
+ case SGILOGDATAFMT_8BIT:
+ sp->pixel_size = sizeof(uint8_t);
+ break;
+ default:
+ TIFFErrorExtR(tif, module,
+ "No support for converting user data format to LogL");
+ return (0);
+ }
+ if (isTiled(tif))
+ sp->tbuflen = multiply_ms(td->td_tilewidth, td->td_tilelength);
+ else if (td->td_rowsperstrip < td->td_imagelength)
+ sp->tbuflen = multiply_ms(td->td_imagewidth, td->td_rowsperstrip);
+ else
+ sp->tbuflen = multiply_ms(td->td_imagewidth, td->td_imagelength);
+ if (multiply_ms(sp->tbuflen, sizeof(int16_t)) == 0 ||
+ (sp->tbuf = (uint8_t *)_TIFFmallocExt(
+ tif, sp->tbuflen * sizeof(int16_t))) == NULL)
+ {
+ TIFFErrorExtR(tif, module, "No space for SGILog translation buffer");
+ return (0);
+ }
+ return (1);
}
-static int
-LogLuvGuessDataFmt(TIFFDirectory *td)
+static int LogLuvGuessDataFmt(TIFFDirectory *td)
{
- int guess;
-
- /*
- * If the user didn't tell us their datafmt,
- * take our best guess from the bitspersample.
- */
-#define PACK(a,b) (((a)<<3)|(b))
- switch (PACK(td->td_bitspersample, td->td_sampleformat)) {
- case PACK(32, SAMPLEFORMAT_IEEEFP):
- guess = SGILOGDATAFMT_FLOAT;
- break;
- case PACK(32, SAMPLEFORMAT_VOID):
- case PACK(32, SAMPLEFORMAT_UINT):
- case PACK(32, SAMPLEFORMAT_INT):
- guess = SGILOGDATAFMT_RAW;
- break;
- case PACK(16, SAMPLEFORMAT_VOID):
- case PACK(16, SAMPLEFORMAT_INT):
- case PACK(16, SAMPLEFORMAT_UINT):
- guess = SGILOGDATAFMT_16BIT;
- break;
- case PACK( 8, SAMPLEFORMAT_VOID):
- case PACK( 8, SAMPLEFORMAT_UINT):
- guess = SGILOGDATAFMT_8BIT;
- break;
- default:
- guess = SGILOGDATAFMT_UNKNOWN;
- break;
+ int guess;
+
+ /*
+ * If the user didn't tell us their datafmt,
+ * take our best guess from the bitspersample.
+ */
+#define PACK(a, b) (((a) << 3) | (b))
+ switch (PACK(td->td_bitspersample, td->td_sampleformat))
+ {
+ case PACK(32, SAMPLEFORMAT_IEEEFP):
+ guess = SGILOGDATAFMT_FLOAT;
+ break;
+ case PACK(32, SAMPLEFORMAT_VOID):
+ case PACK(32, SAMPLEFORMAT_UINT):
+ case PACK(32, SAMPLEFORMAT_INT):
+ guess = SGILOGDATAFMT_RAW;
+ break;
+ case PACK(16, SAMPLEFORMAT_VOID):
+ case PACK(16, SAMPLEFORMAT_INT):
+ case PACK(16, SAMPLEFORMAT_UINT):
+ guess = SGILOGDATAFMT_16BIT;
+ break;
+ case PACK(8, SAMPLEFORMAT_VOID):
+ case PACK(8, SAMPLEFORMAT_UINT):
+ guess = SGILOGDATAFMT_8BIT;
+ break;
+ default:
+ guess = SGILOGDATAFMT_UNKNOWN;
+ break;
#undef PACK
- }
- /*
- * Double-check samples per pixel.
- */
- switch (td->td_samplesperpixel) {
- case 1:
- if (guess != SGILOGDATAFMT_RAW)
- guess = SGILOGDATAFMT_UNKNOWN;
- break;
- case 3:
- if (guess == SGILOGDATAFMT_RAW)
- guess = SGILOGDATAFMT_UNKNOWN;
- break;
- default:
- guess = SGILOGDATAFMT_UNKNOWN;
- break;
- }
- return (guess);
+ }
+ /*
+ * Double-check samples per pixel.
+ */
+ switch (td->td_samplesperpixel)
+ {
+ case 1:
+ if (guess != SGILOGDATAFMT_RAW)
+ guess = SGILOGDATAFMT_UNKNOWN;
+ break;
+ case 3:
+ if (guess == SGILOGDATAFMT_RAW)
+ guess = SGILOGDATAFMT_UNKNOWN;
+ break;
+ default:
+ guess = SGILOGDATAFMT_UNKNOWN;
+ break;
+ }
+ return (guess);
}
-static int
-LogLuvInitState(TIFF* tif)
+static int LogLuvInitState(TIFF *tif)
{
- static const char module[] = "LogLuvInitState";
- TIFFDirectory* td = &tif->tif_dir;
- LogLuvState* sp = DecoderState(tif);
-
- assert(sp != NULL);
- assert(td->td_photometric == PHOTOMETRIC_LOGLUV);
-
- /* for some reason, we can't do this in TIFFInitLogLuv */
- if (td->td_planarconfig != PLANARCONFIG_CONTIG) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "SGILog compression cannot handle non-contiguous data");
- return (0);
- }
- if (sp->user_datafmt == SGILOGDATAFMT_UNKNOWN)
- sp->user_datafmt = LogLuvGuessDataFmt(td);
- switch (sp->user_datafmt) {
- case SGILOGDATAFMT_FLOAT:
- sp->pixel_size = 3*sizeof (float);
- break;
- case SGILOGDATAFMT_16BIT:
- sp->pixel_size = 3*sizeof (int16);
- break;
- case SGILOGDATAFMT_RAW:
- sp->pixel_size = sizeof (uint32);
- break;
- case SGILOGDATAFMT_8BIT:
- sp->pixel_size = 3*sizeof (uint8);
- break;
- default:
- TIFFErrorExt(tif->tif_clientdata, module,
- "No support for converting user data format to LogLuv");
- return (0);
- }
- if( isTiled(tif) )
- sp->tbuflen = multiply_ms(td->td_tilewidth, td->td_tilelength);
- else if( td->td_rowsperstrip < td->td_imagelength )
- sp->tbuflen = multiply_ms(td->td_imagewidth, td->td_rowsperstrip);
- else
- sp->tbuflen = multiply_ms(td->td_imagewidth, td->td_imagelength);
- if (multiply_ms(sp->tbuflen, sizeof (uint32)) == 0 ||
- (sp->tbuf = (uint8*) _TIFFmalloc(sp->tbuflen * sizeof (uint32))) == NULL) {
- TIFFErrorExt(tif->tif_clientdata, module, "No space for SGILog translation buffer");
- return (0);
- }
- return (1);
+ static const char module[] = "LogLuvInitState";
+ TIFFDirectory *td = &tif->tif_dir;
+ LogLuvState *sp = DecoderState(tif);
+
+ assert(sp != NULL);
+ assert(td->td_photometric == PHOTOMETRIC_LOGLUV);
+
+ /* for some reason, we can't do this in TIFFInitLogLuv */
+ if (td->td_planarconfig != PLANARCONFIG_CONTIG)
+ {
+ TIFFErrorExtR(tif, module,
+ "SGILog compression cannot handle non-contiguous data");
+ return (0);
+ }
+ if (sp->user_datafmt == SGILOGDATAFMT_UNKNOWN)
+ sp->user_datafmt = LogLuvGuessDataFmt(td);
+ switch (sp->user_datafmt)
+ {
+ case SGILOGDATAFMT_FLOAT:
+ sp->pixel_size = 3 * sizeof(float);
+ break;
+ case SGILOGDATAFMT_16BIT:
+ sp->pixel_size = 3 * sizeof(int16_t);
+ break;
+ case SGILOGDATAFMT_RAW:
+ sp->pixel_size = sizeof(uint32_t);
+ break;
+ case SGILOGDATAFMT_8BIT:
+ sp->pixel_size = 3 * sizeof(uint8_t);
+ break;
+ default:
+ TIFFErrorExtR(
+ tif, module,
+ "No support for converting user data format to LogLuv");
+ return (0);
+ }
+ if (isTiled(tif))
+ sp->tbuflen = multiply_ms(td->td_tilewidth, td->td_tilelength);
+ else if (td->td_rowsperstrip < td->td_imagelength)
+ sp->tbuflen = multiply_ms(td->td_imagewidth, td->td_rowsperstrip);
+ else
+ sp->tbuflen = multiply_ms(td->td_imagewidth, td->td_imagelength);
+ if (multiply_ms(sp->tbuflen, sizeof(uint32_t)) == 0 ||
+ (sp->tbuf = (uint8_t *)_TIFFmallocExt(
+ tif, sp->tbuflen * sizeof(uint32_t))) == NULL)
+ {
+ TIFFErrorExtR(tif, module, "No space for SGILog translation buffer");
+ return (0);
+ }
+ return (1);
}
-static int
-LogLuvFixupTags(TIFF* tif)
+static int LogLuvFixupTags(TIFF *tif)
{
- (void) tif;
- return (1);
+ (void)tif;
+ return (1);
}
-static int
-LogLuvSetupDecode(TIFF* tif)
+static int LogLuvSetupDecode(TIFF *tif)
{
- static const char module[] = "LogLuvSetupDecode";
- LogLuvState* sp = DecoderState(tif);
- TIFFDirectory* td = &tif->tif_dir;
-
- tif->tif_postdecode = _TIFFNoPostDecode;
- switch (td->td_photometric) {
- case PHOTOMETRIC_LOGLUV:
- if (!LogLuvInitState(tif))
- break;
- if (td->td_compression == COMPRESSION_SGILOG24) {
- tif->tif_decoderow = LogLuvDecode24;
- switch (sp->user_datafmt) {
- case SGILOGDATAFMT_FLOAT:
- sp->tfunc = Luv24toXYZ;
- break;
- case SGILOGDATAFMT_16BIT:
- sp->tfunc = Luv24toLuv48;
- break;
- case SGILOGDATAFMT_8BIT:
- sp->tfunc = Luv24toRGB;
- break;
- }
- } else {
- tif->tif_decoderow = LogLuvDecode32;
- switch (sp->user_datafmt) {
- case SGILOGDATAFMT_FLOAT:
- sp->tfunc = Luv32toXYZ;
- break;
- case SGILOGDATAFMT_16BIT:
- sp->tfunc = Luv32toLuv48;
- break;
- case SGILOGDATAFMT_8BIT:
- sp->tfunc = Luv32toRGB;
- break;
- }
- }
- return (1);
- case PHOTOMETRIC_LOGL:
- if (!LogL16InitState(tif))
- break;
- tif->tif_decoderow = LogL16Decode;
- switch (sp->user_datafmt) {
- case SGILOGDATAFMT_FLOAT:
- sp->tfunc = L16toY;
- break;
- case SGILOGDATAFMT_8BIT:
- sp->tfunc = L16toGry;
- break;
- }
- return (1);
- default:
- TIFFErrorExt(tif->tif_clientdata, module,
- "Inappropriate photometric interpretation %d for SGILog compression; %s",
- td->td_photometric, "must be either LogLUV or LogL");
- break;
- }
- return (0);
+ static const char module[] = "LogLuvSetupDecode";
+ LogLuvState *sp = DecoderState(tif);
+ TIFFDirectory *td = &tif->tif_dir;
+
+ tif->tif_postdecode = _TIFFNoPostDecode;
+ switch (td->td_photometric)
+ {
+ case PHOTOMETRIC_LOGLUV:
+ if (!LogLuvInitState(tif))
+ break;
+ if (td->td_compression == COMPRESSION_SGILOG24)
+ {
+ tif->tif_decoderow = LogLuvDecode24;
+ switch (sp->user_datafmt)
+ {
+ case SGILOGDATAFMT_FLOAT:
+ sp->tfunc = Luv24toXYZ;
+ break;
+ case SGILOGDATAFMT_16BIT:
+ sp->tfunc = Luv24toLuv48;
+ break;
+ case SGILOGDATAFMT_8BIT:
+ sp->tfunc = Luv24toRGB;
+ break;
+ }
+ }
+ else
+ {
+ tif->tif_decoderow = LogLuvDecode32;
+ switch (sp->user_datafmt)
+ {
+ case SGILOGDATAFMT_FLOAT:
+ sp->tfunc = Luv32toXYZ;
+ break;
+ case SGILOGDATAFMT_16BIT:
+ sp->tfunc = Luv32toLuv48;
+ break;
+ case SGILOGDATAFMT_8BIT:
+ sp->tfunc = Luv32toRGB;
+ break;
+ }
+ }
+ return (1);
+ case PHOTOMETRIC_LOGL:
+ if (!LogL16InitState(tif))
+ break;
+ tif->tif_decoderow = LogL16Decode;
+ switch (sp->user_datafmt)
+ {
+ case SGILOGDATAFMT_FLOAT:
+ sp->tfunc = L16toY;
+ break;
+ case SGILOGDATAFMT_8BIT:
+ sp->tfunc = L16toGry;
+ break;
+ }
+ return (1);
+ default:
+ TIFFErrorExtR(tif, module,
+ "Inappropriate photometric interpretation %" PRIu16
+ " for SGILog compression; %s",
+ td->td_photometric, "must be either LogLUV or LogL");
+ break;
+ }
+ return (0);
}
-static int
-LogLuvSetupEncode(TIFF* tif)
+static int LogLuvSetupEncode(TIFF *tif)
{
- static const char module[] = "LogLuvSetupEncode";
- LogLuvState* sp = EncoderState(tif);
- TIFFDirectory* td = &tif->tif_dir;
-
- switch (td->td_photometric) {
- case PHOTOMETRIC_LOGLUV:
- if (!LogLuvInitState(tif))
- return (0);
- if (td->td_compression == COMPRESSION_SGILOG24) {
- tif->tif_encoderow = LogLuvEncode24;
- switch (sp->user_datafmt) {
- case SGILOGDATAFMT_FLOAT:
- sp->tfunc = Luv24fromXYZ;
- break;
- case SGILOGDATAFMT_16BIT:
- sp->tfunc = Luv24fromLuv48;
- break;
- case SGILOGDATAFMT_RAW:
- break;
- default:
- goto notsupported;
- }
- } else {
- tif->tif_encoderow = LogLuvEncode32;
- switch (sp->user_datafmt) {
- case SGILOGDATAFMT_FLOAT:
- sp->tfunc = Luv32fromXYZ;
- break;
- case SGILOGDATAFMT_16BIT:
- sp->tfunc = Luv32fromLuv48;
- break;
- case SGILOGDATAFMT_RAW:
- break;
- default:
- goto notsupported;
- }
- }
- break;
- case PHOTOMETRIC_LOGL:
- if (!LogL16InitState(tif))
- return (0);
- tif->tif_encoderow = LogL16Encode;
- switch (sp->user_datafmt) {
- case SGILOGDATAFMT_FLOAT:
- sp->tfunc = L16fromY;
- break;
- case SGILOGDATAFMT_16BIT:
- break;
- default:
- goto notsupported;
- }
- break;
- default:
- TIFFErrorExt(tif->tif_clientdata, module,
- "Inappropriate photometric interpretation %d for SGILog compression; %s",
- td->td_photometric, "must be either LogLUV or LogL");
- return (0);
- }
- sp->encoder_state = 1;
- return (1);
+ static const char module[] = "LogLuvSetupEncode";
+ LogLuvState *sp = EncoderState(tif);
+ TIFFDirectory *td = &tif->tif_dir;
+
+ switch (td->td_photometric)
+ {
+ case PHOTOMETRIC_LOGLUV:
+ if (!LogLuvInitState(tif))
+ return (0);
+ if (td->td_compression == COMPRESSION_SGILOG24)
+ {
+ tif->tif_encoderow = LogLuvEncode24;
+ switch (sp->user_datafmt)
+ {
+ case SGILOGDATAFMT_FLOAT:
+ sp->tfunc = Luv24fromXYZ;
+ break;
+ case SGILOGDATAFMT_16BIT:
+ sp->tfunc = Luv24fromLuv48;
+ break;
+ case SGILOGDATAFMT_RAW:
+ break;
+ default:
+ goto notsupported;
+ }
+ }
+ else
+ {
+ tif->tif_encoderow = LogLuvEncode32;
+ switch (sp->user_datafmt)
+ {
+ case SGILOGDATAFMT_FLOAT:
+ sp->tfunc = Luv32fromXYZ;
+ break;
+ case SGILOGDATAFMT_16BIT:
+ sp->tfunc = Luv32fromLuv48;
+ break;
+ case SGILOGDATAFMT_RAW:
+ break;
+ default:
+ goto notsupported;
+ }
+ }
+ break;
+ case PHOTOMETRIC_LOGL:
+ if (!LogL16InitState(tif))
+ return (0);
+ tif->tif_encoderow = LogL16Encode;
+ switch (sp->user_datafmt)
+ {
+ case SGILOGDATAFMT_FLOAT:
+ sp->tfunc = L16fromY;
+ break;
+ case SGILOGDATAFMT_16BIT:
+ break;
+ default:
+ goto notsupported;
+ }
+ break;
+ default:
+ TIFFErrorExtR(tif, module,
+ "Inappropriate photometric interpretation %" PRIu16
+ " for SGILog compression; %s",
+ td->td_photometric, "must be either LogLUV or LogL");
+ return (0);
+ }
+ sp->encoder_state = 1;
+ return (1);
notsupported:
- TIFFErrorExt(tif->tif_clientdata, module,
- "SGILog compression supported only for %s, or raw data",
- td->td_photometric == PHOTOMETRIC_LOGL ? "Y, L" : "XYZ, Luv");
- return (0);
+ TIFFErrorExtR(tif, module,
+ "SGILog compression supported only for %s, or raw data",
+ td->td_photometric == PHOTOMETRIC_LOGL ? "Y, L" : "XYZ, Luv");
+ return (0);
}
-static void
-LogLuvClose(TIFF* tif)
+static void LogLuvClose(TIFF *tif)
{
- LogLuvState* sp = (LogLuvState*) tif->tif_data;
- TIFFDirectory *td = &tif->tif_dir;
-
- assert(sp != 0);
- /*
- * For consistency, we always want to write out the same
- * bitspersample and sampleformat for our TIFF file,
- * regardless of the data format being used by the application.
- * Since this routine is called after tags have been set but
- * before they have been recorded in the file, we reset them here.
- * Note: this is really a nasty approach. See PixarLogClose
- */
- if( sp->encoder_state )
- {
- /* See PixarLogClose. Might avoid issues with tags whose size depends
- * on those below, but not completely sure this is enough. */
- td->td_samplesperpixel =
- (td->td_photometric == PHOTOMETRIC_LOGL) ? 1 : 3;
- td->td_bitspersample = 16;
- td->td_sampleformat = SAMPLEFORMAT_INT;
- }
+ LogLuvState *sp = (LogLuvState *)tif->tif_data;
+ TIFFDirectory *td = &tif->tif_dir;
+
+ assert(sp != 0);
+ /*
+ * For consistency, we always want to write out the same
+ * bitspersample and sampleformat for our TIFF file,
+ * regardless of the data format being used by the application.
+ * Since this routine is called after tags have been set but
+ * before they have been recorded in the file, we reset them here.
+ * Note: this is really a nasty approach. See PixarLogClose
+ */
+ if (sp->encoder_state)
+ {
+ /* See PixarLogClose. Might avoid issues with tags whose size depends
+ * on those below, but not completely sure this is enough. */
+ td->td_samplesperpixel =
+ (td->td_photometric == PHOTOMETRIC_LOGL) ? 1 : 3;
+ td->td_bitspersample = 16;
+ td->td_sampleformat = SAMPLEFORMAT_INT;
+ }
}
-static void
-LogLuvCleanup(TIFF* tif)
+static void LogLuvCleanup(TIFF *tif)
{
- LogLuvState* sp = (LogLuvState *)tif->tif_data;
+ LogLuvState *sp = (LogLuvState *)tif->tif_data;
- assert(sp != 0);
+ assert(sp != 0);
- tif->tif_tagmethods.vgetfield = sp->vgetparent;
- tif->tif_tagmethods.vsetfield = sp->vsetparent;
+ tif->tif_tagmethods.vgetfield = sp->vgetparent;
+ tif->tif_tagmethods.vsetfield = sp->vsetparent;
- if (sp->tbuf)
- _TIFFfree(sp->tbuf);
- _TIFFfree(sp);
- tif->tif_data = NULL;
+ if (sp->tbuf)
+ _TIFFfreeExt(tif, sp->tbuf);
+ _TIFFfreeExt(tif, sp);
+ tif->tif_data = NULL;
- _TIFFSetDefaultCompressionState(tif);
+ _TIFFSetDefaultCompressionState(tif);
}
-static int
-LogLuvVSetField(TIFF* tif, uint32 tag, va_list ap)
+static int LogLuvVSetField(TIFF *tif, uint32_t tag, va_list ap)
{
- static const char module[] = "LogLuvVSetField";
- LogLuvState* sp = DecoderState(tif);
- int bps, fmt;
-
- switch (tag) {
- case TIFFTAG_SGILOGDATAFMT:
- sp->user_datafmt = (int) va_arg(ap, int);
- /*
- * Tweak the TIFF header so that the rest of libtiff knows what
- * size of data will be passed between app and library, and
- * assume that the app knows what it is doing and is not
- * confused by these header manipulations...
- */
- switch (sp->user_datafmt) {
- case SGILOGDATAFMT_FLOAT:
- bps = 32;
- fmt = SAMPLEFORMAT_IEEEFP;
- break;
- case SGILOGDATAFMT_16BIT:
- bps = 16;
- fmt = SAMPLEFORMAT_INT;
- break;
- case SGILOGDATAFMT_RAW:
- bps = 32;
- fmt = SAMPLEFORMAT_UINT;
- TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1);
- break;
- case SGILOGDATAFMT_8BIT:
- bps = 8;
- fmt = SAMPLEFORMAT_UINT;
- break;
- default:
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "Unknown data format %d for LogLuv compression",
- sp->user_datafmt);
- return (0);
- }
- TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bps);
- TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, fmt);
- /*
- * Must recalculate sizes should bits/sample change.
- */
- tif->tif_tilesize = isTiled(tif) ? TIFFTileSize(tif) : (tmsize_t) -1;
- tif->tif_scanlinesize = TIFFScanlineSize(tif);
- return (1);
- case TIFFTAG_SGILOGENCODE:
- sp->encode_meth = (int) va_arg(ap, int);
- if (sp->encode_meth != SGILOGENCODE_NODITHER &&
- sp->encode_meth != SGILOGENCODE_RANDITHER) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Unknown encoding %d for LogLuv compression",
- sp->encode_meth);
- return (0);
- }
- return (1);
- default:
- return (*sp->vsetparent)(tif, tag, ap);
- }
+ static const char module[] = "LogLuvVSetField";
+ LogLuvState *sp = DecoderState(tif);
+ int bps, fmt;
+
+ switch (tag)
+ {
+ case TIFFTAG_SGILOGDATAFMT:
+ sp->user_datafmt = (int)va_arg(ap, int);
+ /*
+ * Tweak the TIFF header so that the rest of libtiff knows what
+ * size of data will be passed between app and library, and
+ * assume that the app knows what it is doing and is not
+ * confused by these header manipulations...
+ */
+ switch (sp->user_datafmt)
+ {
+ case SGILOGDATAFMT_FLOAT:
+ bps = 32;
+ fmt = SAMPLEFORMAT_IEEEFP;
+ break;
+ case SGILOGDATAFMT_16BIT:
+ bps = 16;
+ fmt = SAMPLEFORMAT_INT;
+ break;
+ case SGILOGDATAFMT_RAW:
+ bps = 32;
+ fmt = SAMPLEFORMAT_UINT;
+ TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1);
+ break;
+ case SGILOGDATAFMT_8BIT:
+ bps = 8;
+ fmt = SAMPLEFORMAT_UINT;
+ break;
+ default:
+ TIFFErrorExtR(
+ tif, tif->tif_name,
+ "Unknown data format %d for LogLuv compression",
+ sp->user_datafmt);
+ return (0);
+ }
+ TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bps);
+ TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, fmt);
+ /*
+ * Must recalculate sizes should bits/sample change.
+ */
+ tif->tif_tilesize = isTiled(tif) ? TIFFTileSize(tif) : (tmsize_t)-1;
+ tif->tif_scanlinesize = TIFFScanlineSize(tif);
+ return (1);
+ case TIFFTAG_SGILOGENCODE:
+ sp->encode_meth = (int)va_arg(ap, int);
+ if (sp->encode_meth != SGILOGENCODE_NODITHER &&
+ sp->encode_meth != SGILOGENCODE_RANDITHER)
+ {
+ TIFFErrorExtR(tif, module,
+ "Unknown encoding %d for LogLuv compression",
+ sp->encode_meth);
+ return (0);
+ }
+ return (1);
+ default:
+ return (*sp->vsetparent)(tif, tag, ap);
+ }
}
-static int
-LogLuvVGetField(TIFF* tif, uint32 tag, va_list ap)
+static int LogLuvVGetField(TIFF *tif, uint32_t tag, va_list ap)
{
- LogLuvState *sp = (LogLuvState *)tif->tif_data;
-
- switch (tag) {
- case TIFFTAG_SGILOGDATAFMT:
- *va_arg(ap, int*) = sp->user_datafmt;
- return (1);
- default:
- return (*sp->vgetparent)(tif, tag, ap);
- }
+ LogLuvState *sp = (LogLuvState *)tif->tif_data;
+
+ switch (tag)
+ {
+ case TIFFTAG_SGILOGDATAFMT:
+ *va_arg(ap, int *) = sp->user_datafmt;
+ return (1);
+ default:
+ return (*sp->vgetparent)(tif, tag, ap);
+ }
}
static const TIFFField LogLuvFields[] = {
- { TIFFTAG_SGILOGDATAFMT, 0, 0, TIFF_SHORT, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "SGILogDataFmt", NULL},
- { TIFFTAG_SGILOGENCODE, 0, 0, TIFF_SHORT, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "SGILogEncode", NULL}
-};
+ {TIFFTAG_SGILOGDATAFMT, 0, 0, TIFF_SHORT, 0, TIFF_SETGET_INT,
+ TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "SGILogDataFmt", NULL},
+ {TIFFTAG_SGILOGENCODE, 0, 0, TIFF_SHORT, 0, TIFF_SETGET_INT,
+ TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "SGILogEncode", NULL}};
-int
-TIFFInitSGILog(TIFF* tif, int scheme)
+int TIFFInitSGILog(TIFF *tif, int scheme)
{
- static const char module[] = "TIFFInitSGILog";
- LogLuvState* sp;
-
- assert(scheme == COMPRESSION_SGILOG24 || scheme == COMPRESSION_SGILOG);
-
- /*
- * Merge codec-specific tag information.
- */
- if (!_TIFFMergeFields(tif, LogLuvFields,
- TIFFArrayCount(LogLuvFields))) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Merging SGILog codec-specific tags failed");
- return 0;
- }
-
- /*
- * Allocate state block so tag methods have storage to record values.
- */
- tif->tif_data = (uint8*) _TIFFmalloc(sizeof (LogLuvState));
- if (tif->tif_data == NULL)
- goto bad;
- sp = (LogLuvState*) tif->tif_data;
- _TIFFmemset((void*)sp, 0, sizeof (*sp));
- sp->user_datafmt = SGILOGDATAFMT_UNKNOWN;
- sp->encode_meth = (scheme == COMPRESSION_SGILOG24) ?
- SGILOGENCODE_RANDITHER : SGILOGENCODE_NODITHER;
- sp->tfunc = _logLuvNop;
-
- /*
- * Install codec methods.
- * NB: tif_decoderow & tif_encoderow are filled
- * in at setup time.
- */
- tif->tif_fixuptags = LogLuvFixupTags;
- tif->tif_setupdecode = LogLuvSetupDecode;
- tif->tif_decodestrip = LogLuvDecodeStrip;
- tif->tif_decodetile = LogLuvDecodeTile;
- tif->tif_setupencode = LogLuvSetupEncode;
- tif->tif_encodestrip = LogLuvEncodeStrip;
- tif->tif_encodetile = LogLuvEncodeTile;
- tif->tif_close = LogLuvClose;
- tif->tif_cleanup = LogLuvCleanup;
-
- /*
- * Override parent get/set field methods.
- */
- sp->vgetparent = tif->tif_tagmethods.vgetfield;
- tif->tif_tagmethods.vgetfield = LogLuvVGetField; /* hook for codec tags */
- sp->vsetparent = tif->tif_tagmethods.vsetfield;
- tif->tif_tagmethods.vsetfield = LogLuvVSetField; /* hook for codec tags */
-
- return (1);
+ static const char module[] = "TIFFInitSGILog";
+ LogLuvState *sp;
+
+ assert(scheme == COMPRESSION_SGILOG24 || scheme == COMPRESSION_SGILOG);
+
+ /*
+ * Merge codec-specific tag information.
+ */
+ if (!_TIFFMergeFields(tif, LogLuvFields, TIFFArrayCount(LogLuvFields)))
+ {
+ TIFFErrorExtR(tif, module, "Merging SGILog codec-specific tags failed");
+ return 0;
+ }
+
+ /*
+ * Allocate state block so tag methods have storage to record values.
+ */
+ tif->tif_data = (uint8_t *)_TIFFmallocExt(tif, sizeof(LogLuvState));
+ if (tif->tif_data == NULL)
+ goto bad;
+ sp = (LogLuvState *)tif->tif_data;
+ _TIFFmemset((void *)sp, 0, sizeof(*sp));
+ sp->user_datafmt = SGILOGDATAFMT_UNKNOWN;
+ sp->encode_meth = (scheme == COMPRESSION_SGILOG24) ? SGILOGENCODE_RANDITHER
+ : SGILOGENCODE_NODITHER;
+ sp->tfunc = _logLuvNop;
+
+ /*
+ * Install codec methods.
+ * NB: tif_decoderow & tif_encoderow are filled
+ * in at setup time.
+ */
+ tif->tif_fixuptags = LogLuvFixupTags;
+ tif->tif_setupdecode = LogLuvSetupDecode;
+ tif->tif_decodestrip = LogLuvDecodeStrip;
+ tif->tif_decodetile = LogLuvDecodeTile;
+ tif->tif_setupencode = LogLuvSetupEncode;
+ tif->tif_encodestrip = LogLuvEncodeStrip;
+ tif->tif_encodetile = LogLuvEncodeTile;
+ tif->tif_close = LogLuvClose;
+ tif->tif_cleanup = LogLuvCleanup;
+
+ /*
+ * Override parent get/set field methods.
+ */
+ sp->vgetparent = tif->tif_tagmethods.vgetfield;
+ tif->tif_tagmethods.vgetfield = LogLuvVGetField; /* hook for codec tags */
+ sp->vsetparent = tif->tif_tagmethods.vsetfield;
+ tif->tif_tagmethods.vsetfield = LogLuvVSetField; /* hook for codec tags */
+
+ return (1);
bad:
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s: No space for LogLuv state block", tif->tif_name);
- return (0);
+ TIFFErrorExtR(tif, module, "%s: No space for LogLuv state block",
+ tif->tif_name);
+ return (0);
}
#endif /* LOGLUV_SUPPORT */
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_lzma.c b/src/3rdparty/libtiff/libtiff/tif_lzma.c
index 3f6096b..4cfd5e8 100644
--- a/src/3rdparty/libtiff/libtiff/tif_lzma.c
+++ b/src/3rdparty/libtiff/libtiff/tif_lzma.c
@@ -33,468 +33,488 @@
* The codec is derived from ZLIB codec (tif_zip.c).
*/
-#include "tif_predict.h"
#include "lzma.h"
+#include "tif_predict.h"
#include <stdio.h>
/*
* State block for each open TIFF file using LZMA2 compression/decompression.
*/
-typedef struct {
- TIFFPredictorState predict;
- lzma_stream stream;
- lzma_filter filters[LZMA_FILTERS_MAX + 1];
- lzma_options_delta opt_delta; /* delta filter options */
- lzma_options_lzma opt_lzma; /* LZMA2 filter options */
- int preset; /* compression level */
- lzma_check check; /* type of the integrity check */
- int state; /* state flags */
+typedef struct
+{
+ TIFFPredictorState predict;
+ lzma_stream stream;
+ lzma_filter filters[LZMA_FILTERS_MAX + 1];
+ lzma_options_delta opt_delta; /* delta filter options */
+ lzma_options_lzma opt_lzma; /* LZMA2 filter options */
+ int preset; /* compression level */
+ lzma_check check; /* type of the integrity check */
+ int state; /* state flags */
#define LSTATE_INIT_DECODE 0x01
#define LSTATE_INIT_ENCODE 0x02
- TIFFVGetMethod vgetparent; /* super-class method */
- TIFFVSetMethod vsetparent; /* super-class method */
+ TIFFVGetMethod vgetparent; /* super-class method */
+ TIFFVSetMethod vsetparent; /* super-class method */
} LZMAState;
-#define LState(tif) ((LZMAState*) (tif)->tif_data)
-#define DecoderState(tif) LState(tif)
-#define EncoderState(tif) LState(tif)
+#define LState(tif) ((LZMAState *)(tif)->tif_data)
+#define DecoderState(tif) LState(tif)
+#define EncoderState(tif) LState(tif)
-static int LZMAEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s);
-static int LZMADecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s);
+static int LZMAEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s);
+static int LZMADecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s);
-static const char *
-LZMAStrerror(lzma_ret ret)
+static const char *LZMAStrerror(lzma_ret ret)
{
- switch (ret) {
- case LZMA_OK:
- return "operation completed successfully";
- case LZMA_STREAM_END:
- return "end of stream was reached";
- case LZMA_NO_CHECK:
- return "input stream has no integrity check";
- case LZMA_UNSUPPORTED_CHECK:
- return "cannot calculate the integrity check";
- case LZMA_GET_CHECK:
- return "integrity check type is now available";
- case LZMA_MEM_ERROR:
- return "cannot allocate memory";
- case LZMA_MEMLIMIT_ERROR:
- return "memory usage limit was reached";
- case LZMA_FORMAT_ERROR:
- return "file format not recognized";
- case LZMA_OPTIONS_ERROR:
- return "invalid or unsupported options";
- case LZMA_DATA_ERROR:
- return "data is corrupt";
- case LZMA_BUF_ERROR:
- return "no progress is possible (stream is truncated or corrupt)";
- case LZMA_PROG_ERROR:
- return "programming error";
- default:
- return "unidentified liblzma error";
- }
+ switch (ret)
+ {
+ case LZMA_OK:
+ return "operation completed successfully";
+ case LZMA_STREAM_END:
+ return "end of stream was reached";
+ case LZMA_NO_CHECK:
+ return "input stream has no integrity check";
+ case LZMA_UNSUPPORTED_CHECK:
+ return "cannot calculate the integrity check";
+ case LZMA_GET_CHECK:
+ return "integrity check type is now available";
+ case LZMA_MEM_ERROR:
+ return "cannot allocate memory";
+ case LZMA_MEMLIMIT_ERROR:
+ return "memory usage limit was reached";
+ case LZMA_FORMAT_ERROR:
+ return "file format not recognized";
+ case LZMA_OPTIONS_ERROR:
+ return "invalid or unsupported options";
+ case LZMA_DATA_ERROR:
+ return "data is corrupt";
+ case LZMA_BUF_ERROR:
+ return "no progress is possible (stream is truncated or corrupt)";
+ case LZMA_PROG_ERROR:
+ return "programming error";
+ default:
+ return "unidentified liblzma error";
+ }
}
-static int
-LZMAFixupTags(TIFF* tif)
+static int LZMAFixupTags(TIFF *tif)
{
- (void) tif;
- return 1;
+ (void)tif;
+ return 1;
}
-static int
-LZMASetupDecode(TIFF* tif)
+static int LZMASetupDecode(TIFF *tif)
{
- LZMAState* sp = DecoderState(tif);
-
- assert(sp != NULL);
-
- /* if we were last encoding, terminate this mode */
- if (sp->state & LSTATE_INIT_ENCODE) {
- lzma_end(&sp->stream);
- sp->state = 0;
- }
-
- sp->state |= LSTATE_INIT_DECODE;
- return 1;
+ LZMAState *sp = DecoderState(tif);
+
+ assert(sp != NULL);
+
+ /* if we were last encoding, terminate this mode */
+ if (sp->state & LSTATE_INIT_ENCODE)
+ {
+ lzma_end(&sp->stream);
+ sp->state = 0;
+ }
+
+ sp->state |= LSTATE_INIT_DECODE;
+ return 1;
}
/*
* Setup state for decoding a strip.
*/
-static int
-LZMAPreDecode(TIFF* tif, uint16 s)
+static int LZMAPreDecode(TIFF *tif, uint16_t s)
{
- static const char module[] = "LZMAPreDecode";
- LZMAState* sp = DecoderState(tif);
- lzma_ret ret;
-
- (void) s;
- assert(sp != NULL);
-
- if( (sp->state & LSTATE_INIT_DECODE) == 0 )
- tif->tif_setupdecode(tif);
-
- sp->stream.next_in = tif->tif_rawdata;
- sp->stream.avail_in = (size_t) tif->tif_rawcc;
- if ((tmsize_t)sp->stream.avail_in != tif->tif_rawcc) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Liblzma cannot deal with buffers this size");
- return 0;
- }
-
- /*
- * Disable memory limit when decoding. UINT64_MAX is a flag to disable
- * the limit, we are passing (uint64_t)-1 which should be the same.
- */
- ret = lzma_stream_decoder(&sp->stream, (uint64_t)-1, 0);
- if (ret != LZMA_OK) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error initializing the stream decoder, %s",
- LZMAStrerror(ret));
- return 0;
- }
- return 1;
+ static const char module[] = "LZMAPreDecode";
+ LZMAState *sp = DecoderState(tif);
+ lzma_ret ret;
+
+ (void)s;
+ assert(sp != NULL);
+
+ if ((sp->state & LSTATE_INIT_DECODE) == 0)
+ tif->tif_setupdecode(tif);
+
+ sp->stream.next_in = tif->tif_rawdata;
+ sp->stream.avail_in = (size_t)tif->tif_rawcc;
+ if ((tmsize_t)sp->stream.avail_in != tif->tif_rawcc)
+ {
+ TIFFErrorExtR(tif, module,
+ "Liblzma cannot deal with buffers this size");
+ return 0;
+ }
+
+ /*
+ * Disable memory limit when decoding. UINT64_MAX is a flag to disable
+ * the limit, we are passing (uint64_t)-1 which should be the same.
+ */
+ ret = lzma_stream_decoder(&sp->stream, (uint64_t)-1, 0);
+ if (ret != LZMA_OK)
+ {
+ TIFFErrorExtR(tif, module, "Error initializing the stream decoder, %s",
+ LZMAStrerror(ret));
+ return 0;
+ }
+ return 1;
}
-static int
-LZMADecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
+static int LZMADecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s)
{
- static const char module[] = "LZMADecode";
- LZMAState* sp = DecoderState(tif);
-
- (void) s;
- assert(sp != NULL);
- assert(sp->state == LSTATE_INIT_DECODE);
-
- sp->stream.next_in = tif->tif_rawcp;
- sp->stream.avail_in = (size_t) tif->tif_rawcc;
-
- sp->stream.next_out = op;
- sp->stream.avail_out = (size_t) occ;
- if ((tmsize_t)sp->stream.avail_out != occ) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Liblzma cannot deal with buffers this size");
- return 0;
- }
-
- do {
- /*
- * Save the current stream state to properly recover from the
- * decoding errors later.
- */
- const uint8_t *next_in = sp->stream.next_in;
- size_t avail_in = sp->stream.avail_in;
-
- lzma_ret ret = lzma_code(&sp->stream, LZMA_RUN);
- if (ret == LZMA_STREAM_END)
- break;
- if (ret == LZMA_MEMLIMIT_ERROR) {
- lzma_ret r = lzma_stream_decoder(&sp->stream,
- lzma_memusage(&sp->stream), 0);
- if (r != LZMA_OK) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error initializing the stream decoder, %s",
- LZMAStrerror(r));
- break;
- }
- sp->stream.next_in = next_in;
- sp->stream.avail_in = avail_in;
- continue;
- }
- if (ret != LZMA_OK) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Decoding error at scanline %lu, %s",
- (unsigned long) tif->tif_row, LZMAStrerror(ret));
- break;
- }
- } while (sp->stream.avail_out > 0);
- if (sp->stream.avail_out != 0) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Not enough data at scanline %lu (short %lu bytes)",
- (unsigned long) tif->tif_row, (unsigned long) sp->stream.avail_out);
- return 0;
- }
-
- tif->tif_rawcp = (uint8 *)sp->stream.next_in; /* cast away const */
- tif->tif_rawcc = sp->stream.avail_in;
-
- return 1;
+ static const char module[] = "LZMADecode";
+ LZMAState *sp = DecoderState(tif);
+
+ (void)s;
+ assert(sp != NULL);
+ assert(sp->state == LSTATE_INIT_DECODE);
+
+ sp->stream.next_in = tif->tif_rawcp;
+ sp->stream.avail_in = (size_t)tif->tif_rawcc;
+
+ sp->stream.next_out = op;
+ sp->stream.avail_out = (size_t)occ;
+ if ((tmsize_t)sp->stream.avail_out != occ)
+ {
+ TIFFErrorExtR(tif, module,
+ "Liblzma cannot deal with buffers this size");
+ return 0;
+ }
+
+ do
+ {
+ /*
+ * Save the current stream state to properly recover from the
+ * decoding errors later.
+ */
+ const uint8_t *next_in = sp->stream.next_in;
+ size_t avail_in = sp->stream.avail_in;
+
+ lzma_ret ret = lzma_code(&sp->stream, LZMA_RUN);
+ if (ret == LZMA_STREAM_END)
+ break;
+ if (ret == LZMA_MEMLIMIT_ERROR)
+ {
+ lzma_ret r =
+ lzma_stream_decoder(&sp->stream, lzma_memusage(&sp->stream), 0);
+ if (r != LZMA_OK)
+ {
+ TIFFErrorExtR(tif, module,
+ "Error initializing the stream decoder, %s",
+ LZMAStrerror(r));
+ break;
+ }
+ sp->stream.next_in = next_in;
+ sp->stream.avail_in = avail_in;
+ continue;
+ }
+ if (ret != LZMA_OK)
+ {
+ TIFFErrorExtR(tif, module,
+ "Decoding error at scanline %" PRIu32 ", %s",
+ tif->tif_row, LZMAStrerror(ret));
+ break;
+ }
+ } while (sp->stream.avail_out > 0);
+ if (sp->stream.avail_out != 0)
+ {
+ TIFFErrorExtR(tif, module,
+ "Not enough data at scanline %" PRIu32
+ " (short %" TIFF_SIZE_FORMAT " bytes)",
+ tif->tif_row, sp->stream.avail_out);
+ return 0;
+ }
+
+ tif->tif_rawcp = (uint8_t *)sp->stream.next_in; /* cast away const */
+ tif->tif_rawcc = sp->stream.avail_in;
+
+ return 1;
}
-static int
-LZMASetupEncode(TIFF* tif)
+static int LZMASetupEncode(TIFF *tif)
{
- LZMAState* sp = EncoderState(tif);
+ LZMAState *sp = EncoderState(tif);
- assert(sp != NULL);
- if (sp->state & LSTATE_INIT_DECODE) {
- lzma_end(&sp->stream);
- sp->state = 0;
- }
+ assert(sp != NULL);
+ if (sp->state & LSTATE_INIT_DECODE)
+ {
+ lzma_end(&sp->stream);
+ sp->state = 0;
+ }
- sp->state |= LSTATE_INIT_ENCODE;
- return 1;
+ sp->state |= LSTATE_INIT_ENCODE;
+ return 1;
}
/*
* Reset encoding state at the start of a strip.
*/
-static int
-LZMAPreEncode(TIFF* tif, uint16 s)
+static int LZMAPreEncode(TIFF *tif, uint16_t s)
{
- static const char module[] = "LZMAPreEncode";
- LZMAState *sp = EncoderState(tif);
- lzma_ret ret;
-
- (void) s;
- assert(sp != NULL);
- if( sp->state != LSTATE_INIT_ENCODE )
- tif->tif_setupencode(tif);
-
- sp->stream.next_out = tif->tif_rawdata;
- sp->stream.avail_out = (size_t)tif->tif_rawdatasize;
- if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Liblzma cannot deal with buffers this size");
- return 0;
- }
- ret = lzma_stream_encoder(&sp->stream, sp->filters, sp->check);
- if (ret != LZMA_OK) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Error in lzma_stream_encoder(): %s", LZMAStrerror(ret));
- return 0;
- }
- return 1;
+ static const char module[] = "LZMAPreEncode";
+ LZMAState *sp = EncoderState(tif);
+ lzma_ret ret;
+
+ (void)s;
+ assert(sp != NULL);
+ if (sp->state != LSTATE_INIT_ENCODE)
+ tif->tif_setupencode(tif);
+
+ sp->stream.next_out = tif->tif_rawdata;
+ sp->stream.avail_out = (size_t)tif->tif_rawdatasize;
+ if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize)
+ {
+ TIFFErrorExtR(tif, module,
+ "Liblzma cannot deal with buffers this size");
+ return 0;
+ }
+ ret = lzma_stream_encoder(&sp->stream, sp->filters, sp->check);
+ if (ret != LZMA_OK)
+ {
+ TIFFErrorExtR(tif, module, "Error in lzma_stream_encoder(): %s",
+ LZMAStrerror(ret));
+ return 0;
+ }
+ return 1;
}
/*
* Encode a chunk of pixels.
*/
-static int
-LZMAEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
+static int LZMAEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
{
- static const char module[] = "LZMAEncode";
- LZMAState *sp = EncoderState(tif);
-
- assert(sp != NULL);
- assert(sp->state == LSTATE_INIT_ENCODE);
-
- (void) s;
- sp->stream.next_in = bp;
- sp->stream.avail_in = (size_t) cc;
- if ((tmsize_t)sp->stream.avail_in != cc) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Liblzma cannot deal with buffers this size");
- return 0;
- }
- do {
- lzma_ret ret = lzma_code(&sp->stream, LZMA_RUN);
- if (ret != LZMA_OK) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Encoding error at scanline %lu, %s",
- (unsigned long) tif->tif_row, LZMAStrerror(ret));
- return 0;
- }
- if (sp->stream.avail_out == 0) {
- tif->tif_rawcc = tif->tif_rawdatasize;
- TIFFFlushData1(tif);
- sp->stream.next_out = tif->tif_rawdata;
- sp->stream.avail_out = (size_t)tif->tif_rawdatasize; /* this is a safe typecast, as check is made already in LZMAPreEncode */
- }
- } while (sp->stream.avail_in > 0);
- return 1;
+ static const char module[] = "LZMAEncode";
+ LZMAState *sp = EncoderState(tif);
+
+ assert(sp != NULL);
+ assert(sp->state == LSTATE_INIT_ENCODE);
+
+ (void)s;
+ sp->stream.next_in = bp;
+ sp->stream.avail_in = (size_t)cc;
+ if ((tmsize_t)sp->stream.avail_in != cc)
+ {
+ TIFFErrorExtR(tif, module,
+ "Liblzma cannot deal with buffers this size");
+ return 0;
+ }
+ do
+ {
+ lzma_ret ret = lzma_code(&sp->stream, LZMA_RUN);
+ if (ret != LZMA_OK)
+ {
+ TIFFErrorExtR(tif, module,
+ "Encoding error at scanline %" PRIu32 ", %s",
+ tif->tif_row, LZMAStrerror(ret));
+ return 0;
+ }
+ if (sp->stream.avail_out == 0)
+ {
+ tif->tif_rawcc = tif->tif_rawdatasize;
+ if (!TIFFFlushData1(tif))
+ return 0;
+ sp->stream.next_out = tif->tif_rawdata;
+ sp->stream.avail_out =
+ (size_t)
+ tif->tif_rawdatasize; /* this is a safe typecast, as check
+ is made already in LZMAPreEncode */
+ }
+ } while (sp->stream.avail_in > 0);
+ return 1;
}
/*
* Finish off an encoded strip by flushing the last
* string and tacking on an End Of Information code.
*/
-static int
-LZMAPostEncode(TIFF* tif)
+static int LZMAPostEncode(TIFF *tif)
{
- static const char module[] = "LZMAPostEncode";
- LZMAState *sp = EncoderState(tif);
- lzma_ret ret;
-
- sp->stream.avail_in = 0;
- do {
- ret = lzma_code(&sp->stream, LZMA_FINISH);
- switch (ret) {
- case LZMA_STREAM_END:
- case LZMA_OK:
- if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize) {
- tif->tif_rawcc =
- tif->tif_rawdatasize - sp->stream.avail_out;
- TIFFFlushData1(tif);
- sp->stream.next_out = tif->tif_rawdata;
- sp->stream.avail_out = (size_t)tif->tif_rawdatasize; /* this is a safe typecast, as check is made already in ZIPPreEncode */
- }
- break;
- default:
- TIFFErrorExt(tif->tif_clientdata, module, "Liblzma error: %s",
- LZMAStrerror(ret));
- return 0;
- }
- } while (ret != LZMA_STREAM_END);
- return 1;
+ static const char module[] = "LZMAPostEncode";
+ LZMAState *sp = EncoderState(tif);
+ lzma_ret ret;
+
+ sp->stream.avail_in = 0;
+ do
+ {
+ ret = lzma_code(&sp->stream, LZMA_FINISH);
+ switch (ret)
+ {
+ case LZMA_STREAM_END:
+ case LZMA_OK:
+ if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize)
+ {
+ tif->tif_rawcc =
+ tif->tif_rawdatasize - sp->stream.avail_out;
+ if (!TIFFFlushData1(tif))
+ return 0;
+ sp->stream.next_out = tif->tif_rawdata;
+ sp->stream.avail_out =
+ (size_t)
+ tif->tif_rawdatasize; /* this is a safe typecast, as
+ check is made already in
+ ZIPPreEncode */
+ }
+ break;
+ default:
+ TIFFErrorExtR(tif, module, "Liblzma error: %s",
+ LZMAStrerror(ret));
+ return 0;
+ }
+ } while (ret != LZMA_STREAM_END);
+ return 1;
}
-static void
-LZMACleanup(TIFF* tif)
+static void LZMACleanup(TIFF *tif)
{
- LZMAState* sp = LState(tif);
+ LZMAState *sp = LState(tif);
- assert(sp != 0);
+ assert(sp != 0);
- (void)TIFFPredictorCleanup(tif);
+ (void)TIFFPredictorCleanup(tif);
- tif->tif_tagmethods.vgetfield = sp->vgetparent;
- tif->tif_tagmethods.vsetfield = sp->vsetparent;
+ tif->tif_tagmethods.vgetfield = sp->vgetparent;
+ tif->tif_tagmethods.vsetfield = sp->vsetparent;
- if (sp->state) {
- lzma_end(&sp->stream);
- sp->state = 0;
- }
- _TIFFfree(sp);
- tif->tif_data = NULL;
+ if (sp->state)
+ {
+ lzma_end(&sp->stream);
+ sp->state = 0;
+ }
+ _TIFFfreeExt(tif, sp);
+ tif->tif_data = NULL;
- _TIFFSetDefaultCompressionState(tif);
+ _TIFFSetDefaultCompressionState(tif);
}
-static int
-LZMAVSetField(TIFF* tif, uint32 tag, va_list ap)
+static int LZMAVSetField(TIFF *tif, uint32_t tag, va_list ap)
{
- static const char module[] = "LZMAVSetField";
- LZMAState* sp = LState(tif);
-
- switch (tag) {
- case TIFFTAG_LZMAPRESET:
- sp->preset = (int) va_arg(ap, int);
- lzma_lzma_preset(&sp->opt_lzma, sp->preset);
- if (sp->state & LSTATE_INIT_ENCODE) {
- lzma_ret ret = lzma_stream_encoder(&sp->stream,
- sp->filters,
- sp->check);
- if (ret != LZMA_OK) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Liblzma error: %s",
- LZMAStrerror(ret));
- }
- }
- return 1;
- default:
- return (*sp->vsetparent)(tif, tag, ap);
- }
- /*NOTREACHED*/
+ static const char module[] = "LZMAVSetField";
+ LZMAState *sp = LState(tif);
+
+ switch (tag)
+ {
+ case TIFFTAG_LZMAPRESET:
+ sp->preset = (int)va_arg(ap, int);
+ lzma_lzma_preset(&sp->opt_lzma, sp->preset);
+ if (sp->state & LSTATE_INIT_ENCODE)
+ {
+ lzma_ret ret =
+ lzma_stream_encoder(&sp->stream, sp->filters, sp->check);
+ if (ret != LZMA_OK)
+ {
+ TIFFErrorExtR(tif, module, "Liblzma error: %s",
+ LZMAStrerror(ret));
+ }
+ }
+ return 1;
+ default:
+ return (*sp->vsetparent)(tif, tag, ap);
+ }
+ /*NOTREACHED*/
}
-static int
-LZMAVGetField(TIFF* tif, uint32 tag, va_list ap)
+static int LZMAVGetField(TIFF *tif, uint32_t tag, va_list ap)
{
- LZMAState* sp = LState(tif);
-
- switch (tag) {
- case TIFFTAG_LZMAPRESET:
- *va_arg(ap, int*) = sp->preset;
- break;
- default:
- return (*sp->vgetparent)(tif, tag, ap);
- }
- return 1;
+ LZMAState *sp = LState(tif);
+
+ switch (tag)
+ {
+ case TIFFTAG_LZMAPRESET:
+ *va_arg(ap, int *) = sp->preset;
+ break;
+ default:
+ return (*sp->vgetparent)(tif, tag, ap);
+ }
+ return 1;
}
static const TIFFField lzmaFields[] = {
- { TIFFTAG_LZMAPRESET, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED,
- FIELD_PSEUDO, TRUE, FALSE, "LZMA2 Compression Preset", NULL },
+ {TIFFTAG_LZMAPRESET, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
+ TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE,
+ "LZMA2 Compression Preset", NULL},
};
-int
-TIFFInitLZMA(TIFF* tif, int scheme)
+int TIFFInitLZMA(TIFF *tif, int scheme)
{
- static const char module[] = "TIFFInitLZMA";
- LZMAState* sp;
- lzma_stream tmp_stream = LZMA_STREAM_INIT;
-
- assert( scheme == COMPRESSION_LZMA );
-
- /*
- * Merge codec-specific tag information.
- */
- if (!_TIFFMergeFields(tif, lzmaFields, TIFFArrayCount(lzmaFields))) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Merging LZMA2 codec-specific tags failed");
- return 0;
- }
-
- /*
- * Allocate state block so tag methods have storage to record values.
- */
- tif->tif_data = (uint8*) _TIFFmalloc(sizeof(LZMAState));
- if (tif->tif_data == NULL)
- goto bad;
- sp = LState(tif);
- memcpy(&sp->stream, &tmp_stream, sizeof(lzma_stream));
-
- /*
- * Override parent get/set field methods.
- */
- sp->vgetparent = tif->tif_tagmethods.vgetfield;
- tif->tif_tagmethods.vgetfield = LZMAVGetField; /* hook for codec tags */
- sp->vsetparent = tif->tif_tagmethods.vsetfield;
- tif->tif_tagmethods.vsetfield = LZMAVSetField; /* hook for codec tags */
-
- /* Default values for codec-specific fields */
- sp->preset = LZMA_PRESET_DEFAULT; /* default comp. level */
- sp->check = LZMA_CHECK_NONE;
- sp->state = 0;
-
- /* Data filters. So far we are using delta and LZMA2 filters only. */
- sp->opt_delta.type = LZMA_DELTA_TYPE_BYTE;
- /*
- * The sample size in bytes seems to be reasonable distance for delta
- * filter.
- */
- sp->opt_delta.dist = (tif->tif_dir.td_bitspersample % 8) ?
- 1 : tif->tif_dir.td_bitspersample / 8;
- sp->filters[0].id = LZMA_FILTER_DELTA;
- sp->filters[0].options = &sp->opt_delta;
-
- lzma_lzma_preset(&sp->opt_lzma, sp->preset);
- sp->filters[1].id = LZMA_FILTER_LZMA2;
- sp->filters[1].options = &sp->opt_lzma;
-
- sp->filters[2].id = LZMA_VLI_UNKNOWN;
- sp->filters[2].options = NULL;
-
- /*
- * Install codec methods.
- */
- tif->tif_fixuptags = LZMAFixupTags;
- tif->tif_setupdecode = LZMASetupDecode;
- tif->tif_predecode = LZMAPreDecode;
- tif->tif_decoderow = LZMADecode;
- tif->tif_decodestrip = LZMADecode;
- tif->tif_decodetile = LZMADecode;
- tif->tif_setupencode = LZMASetupEncode;
- tif->tif_preencode = LZMAPreEncode;
- tif->tif_postencode = LZMAPostEncode;
- tif->tif_encoderow = LZMAEncode;
- tif->tif_encodestrip = LZMAEncode;
- tif->tif_encodetile = LZMAEncode;
- tif->tif_cleanup = LZMACleanup;
- /*
- * Setup predictor setup.
- */
- (void) TIFFPredictorInit(tif);
- return 1;
+ static const char module[] = "TIFFInitLZMA";
+ LZMAState *sp;
+ lzma_stream tmp_stream = LZMA_STREAM_INIT;
+
+ (void)scheme;
+ assert(scheme == COMPRESSION_LZMA);
+
+ /*
+ * Merge codec-specific tag information.
+ */
+ if (!_TIFFMergeFields(tif, lzmaFields, TIFFArrayCount(lzmaFields)))
+ {
+ TIFFErrorExtR(tif, module, "Merging LZMA2 codec-specific tags failed");
+ return 0;
+ }
+
+ /*
+ * Allocate state block so tag methods have storage to record values.
+ */
+ tif->tif_data = (uint8_t *)_TIFFmallocExt(tif, sizeof(LZMAState));
+ if (tif->tif_data == NULL)
+ goto bad;
+ sp = LState(tif);
+ memcpy(&sp->stream, &tmp_stream, sizeof(lzma_stream));
+
+ /*
+ * Override parent get/set field methods.
+ */
+ sp->vgetparent = tif->tif_tagmethods.vgetfield;
+ tif->tif_tagmethods.vgetfield = LZMAVGetField; /* hook for codec tags */
+ sp->vsetparent = tif->tif_tagmethods.vsetfield;
+ tif->tif_tagmethods.vsetfield = LZMAVSetField; /* hook for codec tags */
+
+ /* Default values for codec-specific fields */
+ sp->preset = LZMA_PRESET_DEFAULT; /* default comp. level */
+ sp->check = LZMA_CHECK_NONE;
+ sp->state = 0;
+
+ /* Data filters. So far we are using delta and LZMA2 filters only. */
+ sp->opt_delta.type = LZMA_DELTA_TYPE_BYTE;
+ /*
+ * The sample size in bytes seems to be reasonable distance for delta
+ * filter.
+ */
+ sp->opt_delta.dist = (tif->tif_dir.td_bitspersample % 8)
+ ? 1
+ : tif->tif_dir.td_bitspersample / 8;
+ sp->filters[0].id = LZMA_FILTER_DELTA;
+ sp->filters[0].options = &sp->opt_delta;
+
+ lzma_lzma_preset(&sp->opt_lzma, sp->preset);
+ sp->filters[1].id = LZMA_FILTER_LZMA2;
+ sp->filters[1].options = &sp->opt_lzma;
+
+ sp->filters[2].id = LZMA_VLI_UNKNOWN;
+ sp->filters[2].options = NULL;
+
+ /*
+ * Install codec methods.
+ */
+ tif->tif_fixuptags = LZMAFixupTags;
+ tif->tif_setupdecode = LZMASetupDecode;
+ tif->tif_predecode = LZMAPreDecode;
+ tif->tif_decoderow = LZMADecode;
+ tif->tif_decodestrip = LZMADecode;
+ tif->tif_decodetile = LZMADecode;
+ tif->tif_setupencode = LZMASetupEncode;
+ tif->tif_preencode = LZMAPreEncode;
+ tif->tif_postencode = LZMAPostEncode;
+ tif->tif_encoderow = LZMAEncode;
+ tif->tif_encodestrip = LZMAEncode;
+ tif->tif_encodetile = LZMAEncode;
+ tif->tif_cleanup = LZMACleanup;
+ /*
+ * Setup predictor setup.
+ */
+ (void)TIFFPredictorInit(tif);
+ return 1;
bad:
- TIFFErrorExt(tif->tif_clientdata, module,
- "No space for LZMA2 state block");
- return 0;
+ TIFFErrorExtR(tif, module, "No space for LZMA2 state block");
+ return 0;
}
#endif /* LZMA_SUPPORT */
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
diff --git a/src/3rdparty/libtiff/libtiff/tif_lzw.c b/src/3rdparty/libtiff/libtiff/tif_lzw.c
index 21064f2..ba75a07 100644
--- a/src/3rdparty/libtiff/libtiff/tif_lzw.c
+++ b/src/3rdparty/libtiff/libtiff/tif_lzw.c
@@ -1,31 +1,32 @@
/*
* Copyright (c) 1988-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ * Copyright (c) 2022 Even Rouault
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
#include "tiffiop.h"
#ifdef LZW_SUPPORT
/*
- * TIFF Library.
+ * TIFF Library.
* Rev 5.0 Lempel-Ziv & Welch Compression Support
*
* This code is derived from the compress program whose code is
@@ -36,7 +37,13 @@
*/
#include "tif_predict.h"
+#include <stdbool.h>
#include <stdio.h>
+#include <stdlib.h>
+
+/* Select the plausible largest natural integer type for the architecture */
+#define SIZEOF_WORDTYPE SIZEOF_SIZE_T
+typedef size_t WordType;
/*
* NB: The 5.0 spec describes a different algorithm than Aldus
@@ -51,34 +58,27 @@
*
* Future revisions to the TIFF spec are expected to "clarify this issue".
*/
-#define LZW_COMPAT /* include backwards compatibility code */
-/*
- * Each strip of data is supposed to be terminated by a CODE_EOI.
- * If the following #define is included, the decoder will also
- * check for end-of-strip w/o seeing this code. This makes the
- * library more robust, but also slower.
- */
-#define LZW_CHECKEOS /* include checks for strips w/o EOI code */
+#define LZW_COMPAT /* include backwards compatibility code */
-#define MAXCODE(n) ((1L<<(n))-1)
+#define MAXCODE(n) ((1L << (n)) - 1)
/*
* The TIFF spec specifies that encoded bit
* strings range from 9 to 12 bits.
*/
-#define BITS_MIN 9 /* start with 9 bits */
-#define BITS_MAX 12 /* max of 12 bit strings */
+#define BITS_MIN 9 /* start with 9 bits */
+#define BITS_MAX 12 /* max of 12 bit strings */
/* predefined codes */
-#define CODE_CLEAR 256 /* code to clear string table */
-#define CODE_EOI 257 /* end-of-information code */
-#define CODE_FIRST 258 /* first free code entry */
-#define CODE_MAX MAXCODE(BITS_MAX)
-#define HSIZE 9001L /* 91% occupancy */
-#define HSHIFT (13-8)
+#define CODE_CLEAR 256 /* code to clear string table */
+#define CODE_EOI 257 /* end-of-information code */
+#define CODE_FIRST 258 /* first free code entry */
+#define CODE_MAX MAXCODE(BITS_MAX)
+#define HSIZE 9001L /* 91% occupancy */
+#define HSHIFT (13 - 8)
#ifdef LZW_COMPAT
/* NB: +1024 is for compatibility with old files */
-#define CSIZE (MAXCODE(BITS_MAX)+1024L)
+#define CSIZE (MAXCODE(BITS_MAX) + 1024L)
#else
-#define CSIZE (MAXCODE(BITS_MAX)+1L)
+#define CSIZE (MAXCODE(BITS_MAX) + 1L)
#endif
/*
@@ -86,725 +86,931 @@
* compression/decompression. Note that the predictor
* state block must be first in this data structure.
*/
-typedef struct {
- TIFFPredictorState predict; /* predictor super class */
+typedef struct
+{
+ TIFFPredictorState predict; /* predictor super class */
- unsigned short nbits; /* # of bits/code */
- unsigned short maxcode; /* maximum code for lzw_nbits */
- unsigned short free_ent; /* next free entry in hash table */
- unsigned long nextdata; /* next bits of i/o */
- long nextbits; /* # of valid bits in lzw_nextdata */
+ unsigned short nbits; /* # of bits/code */
+ unsigned short maxcode; /* maximum code for lzw_nbits */
+ unsigned short free_ent; /* next free entry in hash table */
+ WordType nextdata; /* next bits of i/o */
+ long nextbits; /* # of valid bits in lzw_nextdata */
- int rw_mode; /* preserve rw_mode from init */
+ int rw_mode; /* preserve rw_mode from init */
} LZWBaseState;
-#define lzw_nbits base.nbits
-#define lzw_maxcode base.maxcode
-#define lzw_free_ent base.free_ent
-#define lzw_nextdata base.nextdata
-#define lzw_nextbits base.nextbits
+#define lzw_nbits base.nbits
+#define lzw_maxcode base.maxcode
+#define lzw_free_ent base.free_ent
+#define lzw_nextdata base.nextdata
+#define lzw_nextbits base.nextbits
/*
* Encoding-specific state.
*/
-typedef uint16 hcode_t; /* codes fit in 16 bits */
-typedef struct {
- long hash;
- hcode_t code;
+typedef uint16_t hcode_t; /* codes fit in 16 bits */
+typedef struct
+{
+ long hash;
+ hcode_t code;
} hash_t;
/*
* Decoding-specific state.
*/
-typedef struct code_ent {
- struct code_ent *next;
- unsigned short length; /* string len, including this token */
- unsigned char value; /* data value */
- unsigned char firstchar; /* first token of string */
+typedef struct code_ent
+{
+ struct code_ent *next;
+ unsigned short length; /* string len, including this token */
+ /* firstchar should be placed immediately before value in this structure */
+ unsigned char firstchar; /* first token of string */
+ unsigned char value; /* data value */
+ bool repeated;
} code_t;
-typedef int (*decodeFunc)(TIFF*, uint8*, tmsize_t, uint16);
-
-typedef struct {
- LZWBaseState base;
+typedef int (*decodeFunc)(TIFF *, uint8_t *, tmsize_t, uint16_t);
- /* Decoding specific data */
- long dec_nbitsmask; /* lzw_nbits 1 bits, right adjusted */
- long dec_restart; /* restart count */
-#ifdef LZW_CHECKEOS
- uint64 dec_bitsleft; /* available bits in raw data */
- tmsize_t old_tif_rawcc; /* value of tif_rawcc at the end of the previous TIFLZWDecode() call */
-#endif
- decodeFunc dec_decode; /* regular or backwards compatible */
- code_t* dec_codep; /* current recognized code */
- code_t* dec_oldcodep; /* previously recognized code */
- code_t* dec_free_entp; /* next free entry */
- code_t* dec_maxcodep; /* max available entry */
- code_t* dec_codetab; /* kept separate for small machines */
-
- /* Encoding specific data */
- int enc_oldcode; /* last code encountered */
- long enc_checkpoint; /* point at which to clear table */
-#define CHECK_GAP 10000 /* enc_ratio check interval */
- long enc_ratio; /* current compression ratio */
- long enc_incount; /* (input) data bytes encoded */
- long enc_outcount; /* encoded (output) bytes */
- uint8* enc_rawlimit; /* bound on tif_rawdata buffer */
- hash_t* enc_hashtab; /* kept separate for small machines */
+typedef struct
+{
+ LZWBaseState base;
+
+ /* Decoding specific data */
+ long dec_nbitsmask; /* lzw_nbits 1 bits, right adjusted */
+ tmsize_t dec_restart; /* restart count */
+ uint64_t dec_bitsleft; /* available bits in raw data */
+ tmsize_t old_tif_rawcc; /* value of tif_rawcc at the end of the previous
+ TIFLZWDecode() call */
+ decodeFunc dec_decode; /* regular or backwards compatible */
+ code_t *dec_codep; /* current recognized code */
+ code_t *dec_oldcodep; /* previously recognized code */
+ code_t *dec_free_entp; /* next free entry */
+ code_t *dec_maxcodep; /* max available entry */
+ code_t *dec_codetab; /* kept separate for small machines */
+ int read_error; /* whether a read error has occurred, and which should cause
+ further reads in the same strip/tile to be aborted */
+
+ /* Encoding specific data */
+ int enc_oldcode; /* last code encountered */
+ tmsize_t enc_checkpoint; /* point at which to clear table */
+#define CHECK_GAP 10000 /* enc_ratio check interval */
+ tmsize_t enc_ratio; /* current compression ratio */
+ tmsize_t enc_incount; /* (input) data bytes encoded */
+ tmsize_t enc_outcount; /* encoded (output) bytes */
+ uint8_t *enc_rawlimit; /* bound on tif_rawdata buffer */
+ hash_t *enc_hashtab; /* kept separate for small machines */
} LZWCodecState;
-#define LZWState(tif) ((LZWBaseState*) (tif)->tif_data)
-#define DecoderState(tif) ((LZWCodecState*) LZWState(tif))
-#define EncoderState(tif) ((LZWCodecState*) LZWState(tif))
+#define LZWState(tif) ((LZWBaseState *)(tif)->tif_data)
+#define DecoderState(tif) ((LZWCodecState *)LZWState(tif))
+#define EncoderState(tif) ((LZWCodecState *)LZWState(tif))
-static int LZWDecode(TIFF* tif, uint8* op0, tmsize_t occ0, uint16 s);
+static int LZWDecode(TIFF *tif, uint8_t *op0, tmsize_t occ0, uint16_t s);
#ifdef LZW_COMPAT
-static int LZWDecodeCompat(TIFF* tif, uint8* op0, tmsize_t occ0, uint16 s);
+static int LZWDecodeCompat(TIFF *tif, uint8_t *op0, tmsize_t occ0, uint16_t s);
#endif
-static void cl_hash(LZWCodecState*);
+static void cl_hash(LZWCodecState *);
/*
* LZW Decoder.
*/
-#ifdef LZW_CHECKEOS
-/*
- * This check shouldn't be necessary because each
- * strip is suppose to be terminated with CODE_EOI.
- */
-#define NextCode(_tif, _sp, _bp, _code, _get) { \
- if ((_sp)->dec_bitsleft < (uint64)nbits) { \
- TIFFWarningExt(_tif->tif_clientdata, module, \
- "LZWDecode: Strip %d not terminated with EOI code", \
- _tif->tif_curstrip); \
- _code = CODE_EOI; \
- } else { \
- _get(_sp,_bp,_code); \
- (_sp)->dec_bitsleft -= nbits; \
- } \
-}
-#else
-#define NextCode(tif, sp, bp, code, get) get(sp, bp, code)
-#endif
-
-static int
-LZWFixupTags(TIFF* tif)
+static int LZWFixupTags(TIFF *tif)
{
- (void) tif;
- return (1);
+ (void)tif;
+ return (1);
}
-static int
-LZWSetupDecode(TIFF* tif)
+static int LZWSetupDecode(TIFF *tif)
{
- static const char module[] = "LZWSetupDecode";
- LZWCodecState* sp = DecoderState(tif);
- int code;
-
- if( sp == NULL )
- {
- /*
- * Allocate state block so tag methods have storage to record
- * values.
- */
- tif->tif_data = (uint8*) _TIFFmalloc(sizeof(LZWCodecState));
- if (tif->tif_data == NULL)
- {
- TIFFErrorExt(tif->tif_clientdata, module, "No space for LZW state block");
- return (0);
- }
-
- DecoderState(tif)->dec_codetab = NULL;
- DecoderState(tif)->dec_decode = NULL;
-
- /*
- * Setup predictor setup.
- */
- (void) TIFFPredictorInit(tif);
-
- sp = DecoderState(tif);
- }
-
- assert(sp != NULL);
-
- if (sp->dec_codetab == NULL) {
- sp->dec_codetab = (code_t*)_TIFFmalloc(CSIZE*sizeof (code_t));
- if (sp->dec_codetab == NULL) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "No space for LZW code table");
- return (0);
- }
- /*
- * Pre-load the table.
- */
- code = 255;
- do {
- sp->dec_codetab[code].value = (unsigned char)code;
- sp->dec_codetab[code].firstchar = (unsigned char)code;
- sp->dec_codetab[code].length = 1;
- sp->dec_codetab[code].next = NULL;
- } while (code--);
- /*
- * Zero-out the unused entries
- */
- /* Silence false positive */
- /* coverity[overrun-buffer-arg] */
- _TIFFmemset(&sp->dec_codetab[CODE_CLEAR], 0,
- (CODE_FIRST - CODE_CLEAR) * sizeof (code_t));
- }
- return (1);
+ static const char module[] = "LZWSetupDecode";
+ LZWCodecState *sp = DecoderState(tif);
+ int code;
+
+ if (sp == NULL)
+ {
+ /*
+ * Allocate state block so tag methods have storage to record
+ * values.
+ */
+ tif->tif_data = (uint8_t *)_TIFFmallocExt(tif, sizeof(LZWCodecState));
+ if (tif->tif_data == NULL)
+ {
+ TIFFErrorExtR(tif, module, "No space for LZW state block");
+ return (0);
+ }
+
+ sp = DecoderState(tif);
+ sp->dec_codetab = NULL;
+ sp->dec_decode = NULL;
+
+ /*
+ * Setup predictor setup.
+ */
+ (void)TIFFPredictorInit(tif);
+ }
+
+ if (sp->dec_codetab == NULL)
+ {
+ sp->dec_codetab = (code_t *)_TIFFmallocExt(tif, CSIZE * sizeof(code_t));
+ if (sp->dec_codetab == NULL)
+ {
+ TIFFErrorExtR(tif, module, "No space for LZW code table");
+ return (0);
+ }
+ /*
+ * Pre-load the table.
+ */
+ code = 255;
+ do
+ {
+ sp->dec_codetab[code].firstchar = (unsigned char)code;
+ sp->dec_codetab[code].value = (unsigned char)code;
+ sp->dec_codetab[code].repeated = true;
+ sp->dec_codetab[code].length = 1;
+ sp->dec_codetab[code].next = NULL;
+ } while (code--);
+ /*
+ * Zero-out the unused entries */
+ /* Silence false positive */
+ /* coverity[overrun-buffer-arg] */
+ memset(&sp->dec_codetab[CODE_CLEAR], 0,
+ (CODE_FIRST - CODE_CLEAR) * sizeof(code_t));
+ }
+ return (1);
}
/*
* Setup state for decoding a strip.
*/
-static int
-LZWPreDecode(TIFF* tif, uint16 s)
+static int LZWPreDecode(TIFF *tif, uint16_t s)
{
- static const char module[] = "LZWPreDecode";
- LZWCodecState *sp = DecoderState(tif);
-
- (void) s;
- assert(sp != NULL);
- if( sp->dec_codetab == NULL )
+ static const char module[] = "LZWPreDecode";
+ LZWCodecState *sp = DecoderState(tif);
+
+ (void)s;
+ assert(sp != NULL);
+ if (sp->dec_codetab == NULL)
+ {
+ tif->tif_setupdecode(tif);
+ if (sp->dec_codetab == NULL)
+ return (0);
+ }
+
+ /*
+ * Check for old bit-reversed codes.
+ */
+ if (tif->tif_rawcc >= 2 && tif->tif_rawdata[0] == 0 &&
+ (tif->tif_rawdata[1] & 0x1))
+ {
+#ifdef LZW_COMPAT
+ if (!sp->dec_decode)
{
- tif->tif_setupdecode( tif );
- if( sp->dec_codetab == NULL )
- return (0);
+ TIFFWarningExtR(tif, module, "Old-style LZW codes, convert file");
+ /*
+ * Override default decoding methods with
+ * ones that deal with the old coding.
+ * Otherwise the predictor versions set
+ * above will call the compatibility routines
+ * through the dec_decode method.
+ */
+ tif->tif_decoderow = LZWDecodeCompat;
+ tif->tif_decodestrip = LZWDecodeCompat;
+ tif->tif_decodetile = LZWDecodeCompat;
+ /*
+ * If doing horizontal differencing, must
+ * re-setup the predictor logic since we
+ * switched the basic decoder methods...
+ */
+ (*tif->tif_setupdecode)(tif);
+ sp->dec_decode = LZWDecodeCompat;
}
-
- /*
- * Check for old bit-reversed codes.
- */
- if (tif->tif_rawcc >= 2 &&
- tif->tif_rawdata[0] == 0 && (tif->tif_rawdata[1] & 0x1)) {
-#ifdef LZW_COMPAT
- if (!sp->dec_decode) {
- TIFFWarningExt(tif->tif_clientdata, module,
- "Old-style LZW codes, convert file");
- /*
- * Override default decoding methods with
- * ones that deal with the old coding.
- * Otherwise the predictor versions set
- * above will call the compatibility routines
- * through the dec_decode method.
- */
- tif->tif_decoderow = LZWDecodeCompat;
- tif->tif_decodestrip = LZWDecodeCompat;
- tif->tif_decodetile = LZWDecodeCompat;
- /*
- * If doing horizontal differencing, must
- * re-setup the predictor logic since we
- * switched the basic decoder methods...
- */
- (*tif->tif_setupdecode)(tif);
- sp->dec_decode = LZWDecodeCompat;
- }
- sp->lzw_maxcode = MAXCODE(BITS_MIN);
-#else /* !LZW_COMPAT */
- if (!sp->dec_decode) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Old-style LZW codes not supported");
- sp->dec_decode = LZWDecode;
- }
- return (0);
-#endif/* !LZW_COMPAT */
- } else {
- sp->lzw_maxcode = MAXCODE(BITS_MIN)-1;
- sp->dec_decode = LZWDecode;
- }
- sp->lzw_nbits = BITS_MIN;
- sp->lzw_nextbits = 0;
- sp->lzw_nextdata = 0;
-
- sp->dec_restart = 0;
- sp->dec_nbitsmask = MAXCODE(BITS_MIN);
-#ifdef LZW_CHECKEOS
- sp->dec_bitsleft = 0;
- sp->old_tif_rawcc = 0;
-#endif
- sp->dec_free_entp = sp->dec_codetab + CODE_FIRST;
- /*
- * Zero entries that are not yet filled in. We do
- * this to guard against bogus input data that causes
- * us to index into undefined entries. If you can
- * come up with a way to safely bounds-check input codes
- * while decoding then you can remove this operation.
- */
- _TIFFmemset(sp->dec_free_entp, 0, (CSIZE-CODE_FIRST)*sizeof (code_t));
- sp->dec_oldcodep = &sp->dec_codetab[-1];
- sp->dec_maxcodep = &sp->dec_codetab[sp->dec_nbitsmask-1];
- return (1);
+ sp->lzw_maxcode = MAXCODE(BITS_MIN);
+#else /* !LZW_COMPAT */
+ if (!sp->dec_decode)
+ {
+ TIFFErrorExtR(tif, module, "Old-style LZW codes not supported");
+ sp->dec_decode = LZWDecode;
+ }
+ return (0);
+#endif /* !LZW_COMPAT */
+ }
+ else
+ {
+ sp->lzw_maxcode = MAXCODE(BITS_MIN) - 1;
+ sp->dec_decode = LZWDecode;
+ }
+ sp->lzw_nbits = BITS_MIN;
+ sp->lzw_nextbits = 0;
+ sp->lzw_nextdata = 0;
+
+ sp->dec_restart = 0;
+ sp->dec_nbitsmask = MAXCODE(BITS_MIN);
+ sp->dec_bitsleft = 0;
+ sp->old_tif_rawcc = 0;
+ sp->dec_free_entp = sp->dec_codetab - 1; // + CODE_FIRST;
+ /*
+ * Zero entries that are not yet filled in. We do
+ * this to guard against bogus input data that causes
+ * us to index into undefined entries. If you can
+ * come up with a way to safely bounds-check input codes
+ * while decoding then you can remove this operation.
+ */
+ sp->dec_oldcodep = &sp->dec_codetab[0];
+ sp->dec_maxcodep = &sp->dec_codetab[sp->dec_nbitsmask - 1];
+ sp->read_error = 0;
+ return (1);
}
/*
* Decode a "hunk of data".
*/
-#define GetNextCode(sp, bp, code) { \
- nextdata = (nextdata<<8) | *(bp)++; \
- nextbits += 8; \
- if (nextbits < nbits) { \
- nextdata = (nextdata<<8) | *(bp)++; \
- nextbits += 8; \
- } \
- code = (hcode_t)((nextdata >> (nextbits-nbits)) & nbitsmask); \
- nextbits -= nbits; \
+
+/* Get the next 32 or 64-bit from the input data */
+#ifdef WORDS_BIGENDIAN
+#define GetNextData(nextdata, bp) memcpy(&nextdata, bp, sizeof(nextdata))
+#elif SIZEOF_WORDTYPE == 8
+#if defined(__GNUC__) && defined(__x86_64__)
+#define GetNextData(nextdata, bp) \
+ nextdata = __builtin_bswap64(*(uint64_t *)(bp))
+#elif defined(_M_X64)
+#define GetNextData(nextdata, bp) nextdata = _byteswap_uint64(*(uint64_t *)(bp))
+#elif defined(__GNUC__)
+#define GetNextData(nextdata, bp) \
+ memcpy(&nextdata, bp, sizeof(nextdata)); \
+ nextdata = __builtin_bswap64(nextdata)
+#else
+#define GetNextData(nextdata, bp) \
+ nextdata = (((uint64_t)bp[0]) << 56) | (((uint64_t)bp[1]) << 48) | \
+ (((uint64_t)bp[2]) << 40) | (((uint64_t)bp[3]) << 32) | \
+ (((uint64_t)bp[4]) << 24) | (((uint64_t)bp[5]) << 16) | \
+ (((uint64_t)bp[6]) << 8) | (((uint64_t)bp[7]))
+#endif
+#elif SIZEOF_WORDTYPE == 4
+#if defined(__GNUC__) && defined(__i386__)
+#define GetNextData(nextdata, bp) \
+ nextdata = __builtin_bswap32(*(uint32_t *)(bp))
+#elif defined(_M_X86)
+#define GetNextData(nextdata, bp) \
+ nextdata = _byteswap_ulong(*(unsigned long *)(bp))
+#elif defined(__GNUC__)
+#define GetNextData(nextdata, bp) \
+ memcpy(&nextdata, bp, sizeof(nextdata)); \
+ nextdata = __builtin_bswap32(nextdata)
+#else
+#define GetNextData(nextdata, bp) \
+ nextdata = (((uint32_t)bp[0]) << 24) | (((uint32_t)bp[1]) << 16) | \
+ (((uint32_t)bp[2]) << 8) | (((uint32_t)bp[3]))
+#endif
+#else
+#error "Unhandled SIZEOF_WORDTYPE"
+#endif
+
+#define GetNextCodeLZW() \
+ do \
+ { \
+ nextbits -= nbits; \
+ if (nextbits < 0) \
+ { \
+ if (dec_bitsleft >= 8 * SIZEOF_WORDTYPE) \
+ { \
+ unsigned codetmp = (unsigned)(nextdata << (-nextbits)); \
+ GetNextData(nextdata, bp); \
+ bp += SIZEOF_WORDTYPE; \
+ nextbits += 8 * SIZEOF_WORDTYPE; \
+ dec_bitsleft -= 8 * SIZEOF_WORDTYPE; \
+ code = (WordType)((codetmp | (nextdata >> nextbits)) & \
+ nbitsmask); \
+ break; \
+ } \
+ else \
+ { \
+ if (dec_bitsleft < 8) \
+ { \
+ goto no_eoi; \
+ } \
+ nextdata = (nextdata << 8) | *(bp)++; \
+ nextbits += 8; \
+ dec_bitsleft -= 8; \
+ if (nextbits < 0) \
+ { \
+ if (dec_bitsleft < 8) \
+ { \
+ goto no_eoi; \
+ } \
+ nextdata = (nextdata << 8) | *(bp)++; \
+ nextbits += 8; \
+ dec_bitsleft -= 8; \
+ } \
+ } \
+ } \
+ code = (WordType)((nextdata >> nextbits) & nbitsmask); \
+ } while (0)
+
+static int LZWDecode(TIFF *tif, uint8_t *op0, tmsize_t occ0, uint16_t s)
+{
+ static const char module[] = "LZWDecode";
+ LZWCodecState *sp = DecoderState(tif);
+ uint8_t *op = (uint8_t *)op0;
+ tmsize_t occ = occ0;
+ uint8_t *bp;
+ long nbits, nextbits, nbitsmask;
+ WordType nextdata;
+ code_t *free_entp, *maxcodep, *oldcodep;
+
+ (void)s;
+ assert(sp != NULL);
+ assert(sp->dec_codetab != NULL);
+
+ if (sp->read_error)
+ {
+ return 0;
+ }
+
+ /*
+ * Restart interrupted output operation.
+ */
+ if (sp->dec_restart)
+ {
+ tmsize_t residue;
+
+ code_t *codep = sp->dec_codep;
+ residue = codep->length - sp->dec_restart;
+ if (residue > occ)
+ {
+ /*
+ * Residue from previous decode is sufficient
+ * to satisfy decode request. Skip to the
+ * start of the decoded string, place decoded
+ * values in the output buffer, and return.
+ */
+ sp->dec_restart += occ;
+ do
+ {
+ codep = codep->next;
+ } while (--residue > occ && codep);
+ if (codep)
+ {
+ uint8_t *tp = op + occ;
+ do
+ {
+ *--tp = codep->value;
+ codep = codep->next;
+ } while (--occ && codep);
+ }
+ return (1);
+ }
+ /*
+ * Residue satisfies only part of the decode request.
+ */
+ op += residue;
+ occ -= residue;
+ uint8_t *tp = op;
+ do
+ {
+ *--tp = codep->value;
+ codep = codep->next;
+ } while (--residue && codep);
+ sp->dec_restart = 0;
+ }
+
+ bp = (uint8_t *)tif->tif_rawcp;
+ sp->dec_bitsleft += (((uint64_t)tif->tif_rawcc - sp->old_tif_rawcc) << 3);
+ uint64_t dec_bitsleft = sp->dec_bitsleft;
+ nbits = sp->lzw_nbits;
+ nextdata = sp->lzw_nextdata;
+ nextbits = sp->lzw_nextbits;
+ nbitsmask = sp->dec_nbitsmask;
+ oldcodep = sp->dec_oldcodep;
+ free_entp = sp->dec_free_entp;
+ maxcodep = sp->dec_maxcodep;
+ code_t *const dec_codetab = sp->dec_codetab;
+ code_t *codep;
+
+ if (occ == 0)
+ {
+ goto after_loop;
+ }
+
+begin:
+{
+ WordType code;
+ GetNextCodeLZW();
+ codep = dec_codetab + code;
+ if (code >= CODE_FIRST)
+ goto code_above_or_equal_to_258;
+ if (code < 256)
+ goto code_below_256;
+ if (code == CODE_EOI)
+ goto after_loop;
+ goto code_clear;
+
+code_below_256:
+{
+ if (codep > free_entp)
+ goto error_code;
+ free_entp->next = oldcodep;
+ free_entp->firstchar = oldcodep->firstchar;
+ free_entp->length = oldcodep->length + 1;
+ free_entp->value = (uint8_t)code;
+ free_entp->repeated =
+ (bool)(oldcodep->repeated & (oldcodep->value == code));
+ if (++free_entp > maxcodep)
+ {
+ if (++nbits > BITS_MAX) /* should not happen for a conformant encoder */
+ nbits = BITS_MAX;
+ nbitsmask = MAXCODE(nbits);
+ maxcodep = dec_codetab + nbitsmask - 1;
+ if (free_entp >= &dec_codetab[CSIZE])
+ {
+ /* At that point, the next valid states are either EOI or a */
+ /* CODE_CLEAR. If a regular code is read, at the next */
+ /* attempt at registering a new entry, we will error out */
+ /* due to setting free_entp before any valid code */
+ free_entp = dec_codetab - 1;
+ }
+ }
+ oldcodep = codep;
+ *op++ = (uint8_t)code;
+ occ--;
+ if (occ == 0)
+ goto after_loop;
+ goto begin;
}
-static void
-codeLoop(TIFF* tif, const char* module)
+code_above_or_equal_to_258:
{
- TIFFErrorExt(tif->tif_clientdata, module,
- "Bogus encoding, loop in the code table; scanline %d",
- tif->tif_row);
+ /*
+ * Add the new entry to the code table.
+ */
+
+ if (codep >= free_entp)
+ {
+ if (codep != free_entp)
+ goto error_code;
+ free_entp->value = oldcodep->firstchar;
+ }
+ else
+ {
+ free_entp->value = codep->firstchar;
+ }
+ free_entp->repeated =
+ (bool)(oldcodep->repeated & (oldcodep->value == free_entp->value));
+ free_entp->next = oldcodep;
+
+ free_entp->firstchar = oldcodep->firstchar;
+ free_entp->length = oldcodep->length + 1;
+ if (++free_entp > maxcodep)
+ {
+ if (++nbits > BITS_MAX) /* should not happen for a conformant encoder */
+ nbits = BITS_MAX;
+ nbitsmask = MAXCODE(nbits);
+ maxcodep = dec_codetab + nbitsmask - 1;
+ if (free_entp >= &dec_codetab[CSIZE])
+ {
+ /* At that point, the next valid states are either EOI or a */
+ /* CODE_CLEAR. If a regular code is read, at the next */
+ /* attempt at registering a new entry, we will error out */
+ /* due to setting free_entp before any valid code */
+ free_entp = dec_codetab - 1;
+ }
+ }
+ oldcodep = codep;
+
+ /*
+ * Code maps to a string, copy string
+ * value to output (written in reverse).
+ */
+ /* tiny bit faster on x86_64 to store in unsigned short than int */
+ unsigned short len = codep->length;
+
+ if (len < 3) /* equivalent to len == 2 given all other conditions */
+ {
+ if (occ <= 2)
+ {
+ if (occ == 2)
+ {
+ memcpy(op, &(codep->firstchar), 2);
+ op += 2;
+ occ -= 2;
+ goto after_loop;
+ }
+ goto too_short_buffer;
+ }
+
+ memcpy(op, &(codep->firstchar), 2);
+ op += 2;
+ occ -= 2;
+ goto begin; /* we can save the comparison occ > 0 */
+ }
+
+ if (len == 3)
+ {
+ if (occ <= 3)
+ {
+ if (occ == 3)
+ {
+ op[0] = codep->firstchar;
+ op[1] = codep->next->value;
+ op[2] = codep->value;
+ op += 3;
+ occ -= 3;
+ goto after_loop;
+ }
+ goto too_short_buffer;
+ }
+
+ op[0] = codep->firstchar;
+ op[1] = codep->next->value;
+ op[2] = codep->value;
+ op += 3;
+ occ -= 3;
+ goto begin; /* we can save the comparison occ > 0 */
+ }
+
+ if (len > occ)
+ {
+ goto too_short_buffer;
+ }
+
+ if (codep->repeated)
+ {
+ memset(op, codep->value, len);
+ op += len;
+ occ -= len;
+ if (occ == 0)
+ goto after_loop;
+ goto begin;
+ }
+
+ uint8_t *tp = op + len;
+
+ assert(len >= 4);
+
+ *--tp = codep->value;
+ codep = codep->next;
+ *--tp = codep->value;
+ codep = codep->next;
+ *--tp = codep->value;
+ codep = codep->next;
+ *--tp = codep->value;
+ if (tp > op)
+ {
+ do
+ {
+ codep = codep->next;
+ *--tp = codep->value;
+ } while (tp > op);
+ }
+
+ assert(occ >= len);
+ op += len;
+ occ -= len;
+ if (occ == 0)
+ goto after_loop;
+ goto begin;
}
-static int
-LZWDecode(TIFF* tif, uint8* op0, tmsize_t occ0, uint16 s)
+code_clear:
{
- static const char module[] = "LZWDecode";
- LZWCodecState *sp = DecoderState(tif);
- char *op = (char*) op0;
- long occ = (long) occ0;
- char *tp;
- unsigned char *bp;
- hcode_t code;
- int len;
- long nbits, nextbits, nbitsmask;
- unsigned long nextdata;
- code_t *codep, *free_entp, *maxcodep, *oldcodep;
-
- (void) s;
- assert(sp != NULL);
- assert(sp->dec_codetab != NULL);
-
- /*
- Fail if value does not fit in long.
- */
- if ((tmsize_t) occ != occ0)
- return (0);
- /*
- * Restart interrupted output operation.
- */
- if (sp->dec_restart) {
- long residue;
-
- codep = sp->dec_codep;
- residue = codep->length - sp->dec_restart;
- if (residue > occ) {
- /*
- * Residue from previous decode is sufficient
- * to satisfy decode request. Skip to the
- * start of the decoded string, place decoded
- * values in the output buffer, and return.
- */
- sp->dec_restart += occ;
- do {
- codep = codep->next;
- } while (--residue > occ && codep);
- if (codep) {
- tp = op + occ;
- do {
- *--tp = codep->value;
- codep = codep->next;
- } while (--occ && codep);
- }
- return (1);
- }
- /*
- * Residue satisfies only part of the decode request.
- */
- op += residue;
- occ -= residue;
- tp = op;
- do {
- int t;
- --tp;
- t = codep->value;
- codep = codep->next;
- *tp = (char)t;
- } while (--residue && codep);
- sp->dec_restart = 0;
- }
-
- bp = (unsigned char *)tif->tif_rawcp;
-#ifdef LZW_CHECKEOS
- sp->dec_bitsleft += (((uint64)tif->tif_rawcc - sp->old_tif_rawcc) << 3);
-#endif
- nbits = sp->lzw_nbits;
- nextdata = sp->lzw_nextdata;
- nextbits = sp->lzw_nextbits;
- nbitsmask = sp->dec_nbitsmask;
- oldcodep = sp->dec_oldcodep;
- free_entp = sp->dec_free_entp;
- maxcodep = sp->dec_maxcodep;
-
- while (occ > 0) {
- NextCode(tif, sp, bp, code, GetNextCode);
- if (code == CODE_EOI)
- break;
- if (code == CODE_CLEAR) {
- do {
- free_entp = sp->dec_codetab + CODE_FIRST;
- _TIFFmemset(free_entp, 0,
- (CSIZE - CODE_FIRST) * sizeof (code_t));
- nbits = BITS_MIN;
- nbitsmask = MAXCODE(BITS_MIN);
- maxcodep = sp->dec_codetab + nbitsmask-1;
- NextCode(tif, sp, bp, code, GetNextCode);
- } while (code == CODE_CLEAR); /* consecutive CODE_CLEAR codes */
- if (code == CODE_EOI)
- break;
- if (code > CODE_CLEAR) {
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "LZWDecode: Corrupted LZW table at scanline %d",
- tif->tif_row);
- return (0);
- }
- *op++ = (char)code;
- occ--;
- oldcodep = sp->dec_codetab + code;
- continue;
- }
- codep = sp->dec_codetab + code;
-
- /*
- * Add the new entry to the code table.
- */
- if (free_entp < &sp->dec_codetab[0] ||
- free_entp >= &sp->dec_codetab[CSIZE]) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Corrupted LZW table at scanline %d",
- tif->tif_row);
- return (0);
- }
-
- free_entp->next = oldcodep;
- if (free_entp->next < &sp->dec_codetab[0] ||
- free_entp->next >= &sp->dec_codetab[CSIZE]) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Corrupted LZW table at scanline %d",
- tif->tif_row);
- return (0);
- }
- free_entp->firstchar = free_entp->next->firstchar;
- free_entp->length = free_entp->next->length+1;
- free_entp->value = (codep < free_entp) ?
- codep->firstchar : free_entp->firstchar;
- if (++free_entp > maxcodep) {
- if (++nbits > BITS_MAX) /* should not happen */
- nbits = BITS_MAX;
- nbitsmask = MAXCODE(nbits);
- maxcodep = sp->dec_codetab + nbitsmask-1;
- }
- oldcodep = codep;
- if (code >= 256) {
- /*
- * Code maps to a string, copy string
- * value to output (written in reverse).
- */
- if(codep->length == 0) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Wrong length of decoded string: "
- "data probably corrupted at scanline %d",
- tif->tif_row);
- return (0);
- }
- if (codep->length > occ) {
- /*
- * String is too long for decode buffer,
- * locate portion that will fit, copy to
- * the decode buffer, and setup restart
- * logic for the next decoding call.
- */
- sp->dec_codep = codep;
- do {
- codep = codep->next;
- } while (codep && codep->length > occ);
- if (codep) {
- sp->dec_restart = (long)occ;
- tp = op + occ;
- do {
- *--tp = codep->value;
- codep = codep->next;
- } while (--occ && codep);
- if (codep)
- codeLoop(tif, module);
- }
- break;
- }
- len = codep->length;
- tp = op + len;
- do {
- int t;
- --tp;
- t = codep->value;
- codep = codep->next;
- *tp = (char)t;
- } while (codep && tp > op);
- if (codep) {
- codeLoop(tif, module);
- break;
- }
- assert(occ >= len);
- op += len;
- occ -= len;
- } else {
- *op++ = (char)code;
- occ--;
- }
- }
-
- tif->tif_rawcc -= (tmsize_t)( (uint8*) bp - tif->tif_rawcp );
- tif->tif_rawcp = (uint8*) bp;
-#ifdef LZW_CHECKEOS
- sp->old_tif_rawcc = tif->tif_rawcc;
-#endif
- sp->lzw_nbits = (unsigned short) nbits;
- sp->lzw_nextdata = nextdata;
- sp->lzw_nextbits = nextbits;
- sp->dec_nbitsmask = nbitsmask;
- sp->dec_oldcodep = oldcodep;
- sp->dec_free_entp = free_entp;
- sp->dec_maxcodep = maxcodep;
-
- if (occ > 0) {
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- TIFFErrorExt(tif->tif_clientdata, module,
- "Not enough data at scanline %d (short %I64d bytes)",
- tif->tif_row, (unsigned __int64) occ);
-#else
- TIFFErrorExt(tif->tif_clientdata, module,
- "Not enough data at scanline %d (short %llu bytes)",
- tif->tif_row, (unsigned long long) occ);
-#endif
- return (0);
- }
- return (1);
+ free_entp = dec_codetab + CODE_FIRST;
+ nbits = BITS_MIN;
+ nbitsmask = MAXCODE(BITS_MIN);
+ maxcodep = dec_codetab + nbitsmask - 1;
+ do
+ {
+ GetNextCodeLZW();
+ } while (code == CODE_CLEAR); /* consecutive CODE_CLEAR codes */
+ if (code == CODE_EOI)
+ goto after_loop;
+ if (code > CODE_EOI)
+ {
+ goto error_code;
+ }
+ *op++ = (uint8_t)code;
+ occ--;
+ oldcodep = dec_codetab + code;
+ if (occ == 0)
+ goto after_loop;
+ goto begin;
+}
+}
+
+too_short_buffer:
+{
+ /*
+ * String is too long for decode buffer,
+ * locate portion that will fit, copy to
+ * the decode buffer, and setup restart
+ * logic for the next decoding call.
+ */
+ sp->dec_codep = codep;
+ do
+ {
+ codep = codep->next;
+ } while (codep->length > occ);
+
+ sp->dec_restart = occ;
+ uint8_t *tp = op + occ;
+ do
+ {
+ *--tp = codep->value;
+ codep = codep->next;
+ } while (--occ);
+}
+
+after_loop:
+ tif->tif_rawcc -= (tmsize_t)((uint8_t *)bp - tif->tif_rawcp);
+ tif->tif_rawcp = (uint8_t *)bp;
+ sp->old_tif_rawcc = tif->tif_rawcc;
+ sp->dec_bitsleft = dec_bitsleft;
+ sp->lzw_nbits = (unsigned short)nbits;
+ sp->lzw_nextdata = nextdata;
+ sp->lzw_nextbits = nextbits;
+ sp->dec_nbitsmask = nbitsmask;
+ sp->dec_oldcodep = oldcodep;
+ sp->dec_free_entp = free_entp;
+ sp->dec_maxcodep = maxcodep;
+
+ if (occ > 0)
+ {
+ TIFFErrorExtR(tif, module,
+ "Not enough data at scanline %" PRIu32 " (short %" PRIu64
+ " bytes)",
+ tif->tif_row, (uint64_t)occ);
+ return (0);
+ }
+ return (1);
+
+no_eoi:
+ TIFFErrorExtR(tif, module,
+ "LZWDecode: Strip %" PRIu32 " not terminated with EOI code",
+ tif->tif_curstrip);
+ return 0;
+error_code:
+ sp->read_error = 1;
+ TIFFErrorExtR(tif, tif->tif_name, "Using code not yet in table");
+ return 0;
}
#ifdef LZW_COMPAT
+
/*
- * Decode a "hunk of data" for old images.
+ * This check shouldn't be necessary because each
+ * strip is suppose to be terminated with CODE_EOI.
*/
-#define GetNextCodeCompat(sp, bp, code) { \
- nextdata |= (unsigned long) *(bp)++ << nextbits; \
- nextbits += 8; \
- if (nextbits < nbits) { \
- nextdata |= (unsigned long) *(bp)++ << nextbits;\
- nextbits += 8; \
- } \
- code = (hcode_t)(nextdata & nbitsmask); \
- nextdata >>= nbits; \
- nextbits -= nbits; \
-}
+#define NextCode(_tif, _sp, _bp, _code, _get, dec_bitsleft) \
+ { \
+ if (dec_bitsleft < (uint64_t)nbits) \
+ { \
+ TIFFWarningExtR(_tif, module, \
+ "LZWDecode: Strip %" PRIu32 \
+ " not terminated with EOI code", \
+ _tif->tif_curstrip); \
+ _code = CODE_EOI; \
+ } \
+ else \
+ { \
+ _get(_sp, _bp, _code); \
+ dec_bitsleft -= nbits; \
+ } \
+ }
-static int
-LZWDecodeCompat(TIFF* tif, uint8* op0, tmsize_t occ0, uint16 s)
+/*
+ * Decode a "hunk of data" for old images.
+ */
+#define GetNextCodeCompat(sp, bp, code) \
+ { \
+ nextdata |= (unsigned long)*(bp)++ << nextbits; \
+ nextbits += 8; \
+ if (nextbits < nbits) \
+ { \
+ nextdata |= (unsigned long)*(bp)++ << nextbits; \
+ nextbits += 8; \
+ } \
+ code = (hcode_t)(nextdata & nbitsmask); \
+ nextdata >>= nbits; \
+ nextbits -= nbits; \
+ }
+
+static int LZWDecodeCompat(TIFF *tif, uint8_t *op0, tmsize_t occ0, uint16_t s)
{
- static const char module[] = "LZWDecodeCompat";
- LZWCodecState *sp = DecoderState(tif);
- char *op = (char*) op0;
- long occ = (long) occ0;
- char *tp;
- unsigned char *bp;
- int code, nbits;
- int len;
- long nextbits, nextdata, nbitsmask;
- code_t *codep, *free_entp, *maxcodep, *oldcodep;
-
- (void) s;
- assert(sp != NULL);
-
- /*
- Fail if value does not fit in long.
- */
- if ((tmsize_t) occ != occ0)
- return (0);
-
- /*
- * Restart interrupted output operation.
- */
- if (sp->dec_restart) {
- long residue;
-
- codep = sp->dec_codep;
- residue = codep->length - sp->dec_restart;
- if (residue > occ) {
- /*
- * Residue from previous decode is sufficient
- * to satisfy decode request. Skip to the
- * start of the decoded string, place decoded
- * values in the output buffer, and return.
- */
- sp->dec_restart += occ;
- do {
- codep = codep->next;
- } while (--residue > occ);
- tp = op + occ;
- do {
- *--tp = codep->value;
- codep = codep->next;
- } while (--occ);
- return (1);
- }
- /*
- * Residue satisfies only part of the decode request.
- */
- op += residue;
- occ -= residue;
- tp = op;
- do {
- *--tp = codep->value;
- codep = codep->next;
- } while (--residue);
- sp->dec_restart = 0;
- }
-
- bp = (unsigned char *)tif->tif_rawcp;
-#ifdef LZW_CHECKEOS
- sp->dec_bitsleft += (((uint64)tif->tif_rawcc - sp->old_tif_rawcc) << 3);
-#endif
- nbits = sp->lzw_nbits;
- nextdata = sp->lzw_nextdata;
- nextbits = sp->lzw_nextbits;
- nbitsmask = sp->dec_nbitsmask;
- oldcodep = sp->dec_oldcodep;
- free_entp = sp->dec_free_entp;
- maxcodep = sp->dec_maxcodep;
-
- while (occ > 0) {
- NextCode(tif, sp, bp, code, GetNextCodeCompat);
- if (code == CODE_EOI)
- break;
- if (code == CODE_CLEAR) {
- do {
- free_entp = sp->dec_codetab + CODE_FIRST;
- _TIFFmemset(free_entp, 0,
- (CSIZE - CODE_FIRST) * sizeof (code_t));
- nbits = BITS_MIN;
- nbitsmask = MAXCODE(BITS_MIN);
- maxcodep = sp->dec_codetab + nbitsmask;
- NextCode(tif, sp, bp, code, GetNextCodeCompat);
- } while (code == CODE_CLEAR); /* consecutive CODE_CLEAR codes */
- if (code == CODE_EOI)
- break;
- if (code > CODE_CLEAR) {
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "LZWDecode: Corrupted LZW table at scanline %d",
- tif->tif_row);
- return (0);
- }
- *op++ = (char)code;
- occ--;
- oldcodep = sp->dec_codetab + code;
- continue;
- }
- codep = sp->dec_codetab + code;
-
- /*
- * Add the new entry to the code table.
- */
- if (free_entp < &sp->dec_codetab[0] ||
- free_entp >= &sp->dec_codetab[CSIZE]) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Corrupted LZW table at scanline %d", tif->tif_row);
- return (0);
- }
-
- free_entp->next = oldcodep;
- if (free_entp->next < &sp->dec_codetab[0] ||
- free_entp->next >= &sp->dec_codetab[CSIZE]) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Corrupted LZW table at scanline %d", tif->tif_row);
- return (0);
- }
- free_entp->firstchar = free_entp->next->firstchar;
- free_entp->length = free_entp->next->length+1;
- free_entp->value = (codep < free_entp) ?
- codep->firstchar : free_entp->firstchar;
- if (++free_entp > maxcodep) {
- if (++nbits > BITS_MAX) /* should not happen */
- nbits = BITS_MAX;
- nbitsmask = MAXCODE(nbits);
- maxcodep = sp->dec_codetab + nbitsmask;
- }
- oldcodep = codep;
- if (code >= 256) {
- /*
- * Code maps to a string, copy string
- * value to output (written in reverse).
- */
- if(codep->length == 0) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Wrong length of decoded "
- "string: data probably corrupted at scanline %d",
- tif->tif_row);
- return (0);
- }
- if (codep->length > occ) {
- /*
- * String is too long for decode buffer,
- * locate portion that will fit, copy to
- * the decode buffer, and setup restart
- * logic for the next decoding call.
- */
- sp->dec_codep = codep;
- do {
- codep = codep->next;
- } while (codep->length > occ);
- sp->dec_restart = occ;
- tp = op + occ;
- do {
- *--tp = codep->value;
- codep = codep->next;
- } while (--occ);
- break;
- }
- len = codep->length;
- tp = op + len;
- do {
- int t;
- --tp;
- t = codep->value;
- codep = codep->next;
- *tp = (char)t;
- } while (codep && tp > op);
- assert(occ >= len);
- op += len;
- occ -= len;
- } else {
- *op++ = (char)code;
- occ--;
- }
- }
-
- tif->tif_rawcc -= (tmsize_t)( (uint8*) bp - tif->tif_rawcp );
- tif->tif_rawcp = (uint8*) bp;
-#ifdef LZW_CHECKEOS
- sp->old_tif_rawcc = tif->tif_rawcc;
-#endif
- sp->lzw_nbits = (unsigned short)nbits;
- sp->lzw_nextdata = nextdata;
- sp->lzw_nextbits = nextbits;
- sp->dec_nbitsmask = nbitsmask;
- sp->dec_oldcodep = oldcodep;
- sp->dec_free_entp = free_entp;
- sp->dec_maxcodep = maxcodep;
-
- if (occ > 0) {
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- TIFFErrorExt(tif->tif_clientdata, module,
- "Not enough data at scanline %d (short %I64d bytes)",
- tif->tif_row, (unsigned __int64) occ);
-#else
- TIFFErrorExt(tif->tif_clientdata, module,
- "Not enough data at scanline %d (short %llu bytes)",
- tif->tif_row, (unsigned long long) occ);
-#endif
- return (0);
- }
- return (1);
+ static const char module[] = "LZWDecodeCompat";
+ LZWCodecState *sp = DecoderState(tif);
+ uint8_t *op = (uint8_t *)op0;
+ tmsize_t occ = occ0;
+ uint8_t *tp;
+ uint8_t *bp;
+ int code, nbits;
+ int len;
+ long nextbits, nbitsmask;
+ WordType nextdata;
+ code_t *codep, *free_entp, *maxcodep, *oldcodep;
+
+ (void)s;
+ assert(sp != NULL);
+
+ /*
+ * Restart interrupted output operation.
+ */
+ if (sp->dec_restart)
+ {
+ tmsize_t residue;
+
+ codep = sp->dec_codep;
+ residue = codep->length - sp->dec_restart;
+ if (residue > occ)
+ {
+ /*
+ * Residue from previous decode is sufficient
+ * to satisfy decode request. Skip to the
+ * start of the decoded string, place decoded
+ * values in the output buffer, and return.
+ */
+ sp->dec_restart += occ;
+ do
+ {
+ codep = codep->next;
+ } while (--residue > occ);
+ tp = op + occ;
+ do
+ {
+ *--tp = codep->value;
+ codep = codep->next;
+ } while (--occ);
+ return (1);
+ }
+ /*
+ * Residue satisfies only part of the decode request.
+ */
+ op += residue;
+ occ -= residue;
+ tp = op;
+ do
+ {
+ *--tp = codep->value;
+ codep = codep->next;
+ } while (--residue);
+ sp->dec_restart = 0;
+ }
+
+ bp = (uint8_t *)tif->tif_rawcp;
+
+ sp->dec_bitsleft += (((uint64_t)tif->tif_rawcc - sp->old_tif_rawcc) << 3);
+ uint64_t dec_bitsleft = sp->dec_bitsleft;
+
+ nbits = sp->lzw_nbits;
+ nextdata = sp->lzw_nextdata;
+ nextbits = sp->lzw_nextbits;
+ nbitsmask = sp->dec_nbitsmask;
+ oldcodep = sp->dec_oldcodep;
+ free_entp = sp->dec_free_entp;
+ maxcodep = sp->dec_maxcodep;
+
+ while (occ > 0)
+ {
+ NextCode(tif, sp, bp, code, GetNextCodeCompat, dec_bitsleft);
+ if (code == CODE_EOI)
+ break;
+ if (code == CODE_CLEAR)
+ {
+ do
+ {
+ free_entp = sp->dec_codetab + CODE_FIRST;
+ _TIFFmemset(free_entp, 0,
+ (CSIZE - CODE_FIRST) * sizeof(code_t));
+ nbits = BITS_MIN;
+ nbitsmask = MAXCODE(BITS_MIN);
+ maxcodep = sp->dec_codetab + nbitsmask;
+ NextCode(tif, sp, bp, code, GetNextCodeCompat, dec_bitsleft);
+ } while (code == CODE_CLEAR); /* consecutive CODE_CLEAR codes */
+ if (code == CODE_EOI)
+ break;
+ if (code > CODE_CLEAR)
+ {
+ TIFFErrorExtR(
+ tif, tif->tif_name,
+ "LZWDecode: Corrupted LZW table at scanline %" PRIu32,
+ tif->tif_row);
+ return (0);
+ }
+ *op++ = (uint8_t)code;
+ occ--;
+ oldcodep = sp->dec_codetab + code;
+ continue;
+ }
+ codep = sp->dec_codetab + code;
+
+ /*
+ * Add the new entry to the code table.
+ */
+ if (free_entp < &sp->dec_codetab[0] ||
+ free_entp >= &sp->dec_codetab[CSIZE])
+ {
+ TIFFErrorExtR(tif, module,
+ "Corrupted LZW table at scanline %" PRIu32,
+ tif->tif_row);
+ return (0);
+ }
+
+ free_entp->next = oldcodep;
+ if (free_entp->next < &sp->dec_codetab[0] ||
+ free_entp->next >= &sp->dec_codetab[CSIZE])
+ {
+ TIFFErrorExtR(tif, module,
+ "Corrupted LZW table at scanline %" PRIu32,
+ tif->tif_row);
+ return (0);
+ }
+ free_entp->firstchar = free_entp->next->firstchar;
+ free_entp->length = free_entp->next->length + 1;
+ free_entp->value =
+ (codep < free_entp) ? codep->firstchar : free_entp->firstchar;
+ if (++free_entp > maxcodep)
+ {
+ if (++nbits > BITS_MAX) /* should not happen */
+ nbits = BITS_MAX;
+ nbitsmask = MAXCODE(nbits);
+ maxcodep = sp->dec_codetab + nbitsmask;
+ }
+ oldcodep = codep;
+ if (code >= 256)
+ {
+ /*
+ * Code maps to a string, copy string
+ * value to output (written in reverse).
+ */
+ if (codep->length == 0)
+ {
+ TIFFErrorExtR(
+ tif, module,
+ "Wrong length of decoded "
+ "string: data probably corrupted at scanline %" PRIu32,
+ tif->tif_row);
+ return (0);
+ }
+ if (codep->length > occ)
+ {
+ /*
+ * String is too long for decode buffer,
+ * locate portion that will fit, copy to
+ * the decode buffer, and setup restart
+ * logic for the next decoding call.
+ */
+ sp->dec_codep = codep;
+ do
+ {
+ codep = codep->next;
+ } while (codep->length > occ);
+ sp->dec_restart = occ;
+ tp = op + occ;
+ do
+ {
+ *--tp = codep->value;
+ codep = codep->next;
+ } while (--occ);
+ break;
+ }
+ len = codep->length;
+ tp = op + len;
+ do
+ {
+ *--tp = codep->value;
+ codep = codep->next;
+ } while (codep && tp > op);
+ assert(occ >= len);
+ op += len;
+ occ -= len;
+ }
+ else
+ {
+ *op++ = (uint8_t)code;
+ occ--;
+ }
+ }
+
+ tif->tif_rawcc -= (tmsize_t)((uint8_t *)bp - tif->tif_rawcp);
+ tif->tif_rawcp = (uint8_t *)bp;
+
+ sp->old_tif_rawcc = tif->tif_rawcc;
+ sp->dec_bitsleft = dec_bitsleft;
+
+ sp->lzw_nbits = (unsigned short)nbits;
+ sp->lzw_nextdata = nextdata;
+ sp->lzw_nextbits = nextbits;
+ sp->dec_nbitsmask = nbitsmask;
+ sp->dec_oldcodep = oldcodep;
+ sp->dec_free_entp = free_entp;
+ sp->dec_maxcodep = maxcodep;
+
+ if (occ > 0)
+ {
+ TIFFErrorExtR(tif, module,
+ "Not enough data at scanline %" PRIu32 " (short %" PRIu64
+ " bytes)",
+ tif->tif_row, (uint64_t)occ);
+ return (0);
+ }
+ return (1);
}
#endif /* LZW_COMPAT */
@@ -812,392 +1018,416 @@ LZWDecodeCompat(TIFF* tif, uint8* op0, tmsize_t occ0, uint16 s)
* LZW Encoding.
*/
-static int
-LZWSetupEncode(TIFF* tif)
+static int LZWSetupEncode(TIFF *tif)
{
- static const char module[] = "LZWSetupEncode";
- LZWCodecState* sp = EncoderState(tif);
-
- assert(sp != NULL);
- sp->enc_hashtab = (hash_t*) _TIFFmalloc(HSIZE*sizeof (hash_t));
- if (sp->enc_hashtab == NULL) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "No space for LZW hash table");
- return (0);
- }
- return (1);
+ static const char module[] = "LZWSetupEncode";
+ LZWCodecState *sp = EncoderState(tif);
+
+ assert(sp != NULL);
+ sp->enc_hashtab = (hash_t *)_TIFFmallocExt(tif, HSIZE * sizeof(hash_t));
+ if (sp->enc_hashtab == NULL)
+ {
+ TIFFErrorExtR(tif, module, "No space for LZW hash table");
+ return (0);
+ }
+ return (1);
}
/*
* Reset encoding state at the start of a strip.
*/
-static int
-LZWPreEncode(TIFF* tif, uint16 s)
+static int LZWPreEncode(TIFF *tif, uint16_t s)
{
- LZWCodecState *sp = EncoderState(tif);
-
- (void) s;
- assert(sp != NULL);
-
- if( sp->enc_hashtab == NULL )
- {
- tif->tif_setupencode( tif );
- }
-
- sp->lzw_nbits = BITS_MIN;
- sp->lzw_maxcode = MAXCODE(BITS_MIN);
- sp->lzw_free_ent = CODE_FIRST;
- sp->lzw_nextbits = 0;
- sp->lzw_nextdata = 0;
- sp->enc_checkpoint = CHECK_GAP;
- sp->enc_ratio = 0;
- sp->enc_incount = 0;
- sp->enc_outcount = 0;
- /*
- * The 4 here insures there is space for 2 max-sized
- * codes in LZWEncode and LZWPostDecode.
- */
- sp->enc_rawlimit = tif->tif_rawdata + tif->tif_rawdatasize-1 - 4;
- cl_hash(sp); /* clear hash table */
- sp->enc_oldcode = (hcode_t) -1; /* generates CODE_CLEAR in LZWEncode */
- return (1);
+ LZWCodecState *sp = EncoderState(tif);
+
+ (void)s;
+ assert(sp != NULL);
+
+ if (sp->enc_hashtab == NULL)
+ {
+ tif->tif_setupencode(tif);
+ }
+
+ sp->lzw_nbits = BITS_MIN;
+ sp->lzw_maxcode = MAXCODE(BITS_MIN);
+ sp->lzw_free_ent = CODE_FIRST;
+ sp->lzw_nextbits = 0;
+ sp->lzw_nextdata = 0;
+ sp->enc_checkpoint = CHECK_GAP;
+ sp->enc_ratio = 0;
+ sp->enc_incount = 0;
+ sp->enc_outcount = 0;
+ /*
+ * The 4 here insures there is space for 2 max-sized
+ * codes in LZWEncode and LZWPostDecode.
+ */
+ sp->enc_rawlimit = tif->tif_rawdata + tif->tif_rawdatasize - 1 - 4;
+ cl_hash(sp); /* clear hash table */
+ sp->enc_oldcode = (hcode_t)-1; /* generates CODE_CLEAR in LZWEncode */
+ return (1);
}
-#define CALCRATIO(sp, rat) { \
- if (incount > 0x007fffff) { /* NB: shift will overflow */\
- rat = outcount >> 8; \
- rat = (rat == 0 ? 0x7fffffff : incount/rat); \
- } else \
- rat = (incount<<8) / outcount; \
-}
+#define CALCRATIO(sp, rat) \
+ { \
+ if (incount > 0x007fffff) \
+ { /* NB: shift will overflow */ \
+ rat = outcount >> 8; \
+ rat = (rat == 0 ? 0x7fffffff : incount / rat); \
+ } \
+ else \
+ rat = (incount << 8) / outcount; \
+ }
/* Explicit 0xff masking to make icc -check=conversions happy */
-#define PutNextCode(op, c) { \
- nextdata = (nextdata << nbits) | c; \
- nextbits += nbits; \
- *op++ = (unsigned char)((nextdata >> (nextbits-8))&0xff); \
- nextbits -= 8; \
- if (nextbits >= 8) { \
- *op++ = (unsigned char)((nextdata >> (nextbits-8))&0xff); \
- nextbits -= 8; \
- } \
- outcount += nbits; \
-}
+#define PutNextCode(op, c) \
+ { \
+ nextdata = (nextdata << nbits) | c; \
+ nextbits += nbits; \
+ *op++ = (unsigned char)((nextdata >> (nextbits - 8)) & 0xff); \
+ nextbits -= 8; \
+ if (nextbits >= 8) \
+ { \
+ *op++ = (unsigned char)((nextdata >> (nextbits - 8)) & 0xff); \
+ nextbits -= 8; \
+ } \
+ outcount += nbits; \
+ }
/*
* Encode a chunk of pixels.
*
- * Uses an open addressing double hashing (no chaining) on the
+ * Uses an open addressing double hashing (no chaining) on the
* prefix code/next character combination. We do a variant of
* Knuth's algorithm D (vol. 3, sec. 6.4) along with G. Knott's
* relatively-prime secondary probe. Here, the modular division
- * first probe is gives way to a faster exclusive-or manipulation.
+ * first probe is gives way to a faster exclusive-or manipulation.
* Also do block compression with an adaptive reset, whereby the
* code table is cleared when the compression ratio decreases,
* but after the table fills. The variable-length output codes
* are re-sized at this point, and a CODE_CLEAR is generated
- * for the decoder.
+ * for the decoder.
*/
-static int
-LZWEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
+static int LZWEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
{
- register LZWCodecState *sp = EncoderState(tif);
- register long fcode;
- register hash_t *hp;
- register int h, c;
- hcode_t ent;
- long disp;
- long incount, outcount, checkpoint;
- unsigned long nextdata;
- long nextbits;
- int free_ent, maxcode, nbits;
- uint8* op;
- uint8* limit;
-
- (void) s;
- if (sp == NULL)
- return (0);
-
- assert(sp->enc_hashtab != NULL);
-
- /*
- * Load local state.
- */
- incount = sp->enc_incount;
- outcount = sp->enc_outcount;
- checkpoint = sp->enc_checkpoint;
- nextdata = sp->lzw_nextdata;
- nextbits = sp->lzw_nextbits;
- free_ent = sp->lzw_free_ent;
- maxcode = sp->lzw_maxcode;
- nbits = sp->lzw_nbits;
- op = tif->tif_rawcp;
- limit = sp->enc_rawlimit;
- ent = (hcode_t)sp->enc_oldcode;
-
- if (ent == (hcode_t) -1 && cc > 0) {
- /*
- * NB: This is safe because it can only happen
- * at the start of a strip where we know there
- * is space in the data buffer.
- */
- PutNextCode(op, CODE_CLEAR);
- ent = *bp++; cc--; incount++;
- }
- while (cc > 0) {
- c = *bp++; cc--; incount++;
- fcode = ((long)c << BITS_MAX) + ent;
- h = (c << HSHIFT) ^ ent; /* xor hashing */
+ register LZWCodecState *sp = EncoderState(tif);
+ register long fcode;
+ register hash_t *hp;
+ register int h, c;
+ hcode_t ent;
+ long disp;
+ tmsize_t incount, outcount, checkpoint;
+ WordType nextdata;
+ long nextbits;
+ int free_ent, maxcode, nbits;
+ uint8_t *op;
+ uint8_t *limit;
+
+ (void)s;
+ if (sp == NULL)
+ return (0);
+
+ assert(sp->enc_hashtab != NULL);
+
+ /*
+ * Load local state.
+ */
+ incount = sp->enc_incount;
+ outcount = sp->enc_outcount;
+ checkpoint = sp->enc_checkpoint;
+ nextdata = sp->lzw_nextdata;
+ nextbits = sp->lzw_nextbits;
+ free_ent = sp->lzw_free_ent;
+ maxcode = sp->lzw_maxcode;
+ nbits = sp->lzw_nbits;
+ op = tif->tif_rawcp;
+ limit = sp->enc_rawlimit;
+ ent = (hcode_t)sp->enc_oldcode;
+
+ if (ent == (hcode_t)-1 && cc > 0)
+ {
+ /*
+ * NB: This is safe because it can only happen
+ * at the start of a strip where we know there
+ * is space in the data buffer.
+ */
+ PutNextCode(op, CODE_CLEAR);
+ ent = *bp++;
+ cc--;
+ incount++;
+ }
+ while (cc > 0)
+ {
+ c = *bp++;
+ cc--;
+ incount++;
+ fcode = ((long)c << BITS_MAX) + ent;
+ h = (c << HSHIFT) ^ ent; /* xor hashing */
#ifdef _WINDOWS
- /*
- * Check hash index for an overflow.
- */
- if (h >= HSIZE)
- h -= HSIZE;
+ /*
+ * Check hash index for an overflow.
+ */
+ if (h >= HSIZE)
+ h -= HSIZE;
#endif
- hp = &sp->enc_hashtab[h];
- if (hp->hash == fcode) {
- ent = hp->code;
- continue;
- }
- if (hp->hash >= 0) {
- /*
- * Primary hash failed, check secondary hash.
- */
- disp = HSIZE - h;
- if (h == 0)
- disp = 1;
- do {
- /*
- * Avoid pointer arithmetic because of
- * wraparound problems with segments.
- */
- if ((h -= disp) < 0)
- h += HSIZE;
- hp = &sp->enc_hashtab[h];
- if (hp->hash == fcode) {
- ent = hp->code;
- goto hit;
- }
- } while (hp->hash >= 0);
- }
- /*
- * New entry, emit code and add to table.
- */
- /*
- * Verify there is space in the buffer for the code
- * and any potential Clear code that might be emitted
- * below. The value of limit is setup so that there
- * are at least 4 bytes free--room for 2 codes.
- */
- if (op > limit) {
- tif->tif_rawcc = (tmsize_t)(op - tif->tif_rawdata);
- if( !TIFFFlushData1(tif) )
- return 0;
- op = tif->tif_rawdata;
- }
- PutNextCode(op, ent);
- ent = (hcode_t)c;
- hp->code = (hcode_t)(free_ent++);
- hp->hash = fcode;
- if (free_ent == CODE_MAX-1) {
- /* table is full, emit clear code and reset */
- cl_hash(sp);
- sp->enc_ratio = 0;
- incount = 0;
- outcount = 0;
- free_ent = CODE_FIRST;
- PutNextCode(op, CODE_CLEAR);
- nbits = BITS_MIN;
- maxcode = MAXCODE(BITS_MIN);
- } else {
- /*
- * If the next entry is going to be too big for
- * the code size, then increase it, if possible.
- */
- if (free_ent > maxcode) {
- nbits++;
- assert(nbits <= BITS_MAX);
- maxcode = (int) MAXCODE(nbits);
- } else if (incount >= checkpoint) {
- long rat;
- /*
- * Check compression ratio and, if things seem
- * to be slipping, clear the hash table and
- * reset state. The compression ratio is a
- * 24+8-bit fractional number.
- */
- checkpoint = incount+CHECK_GAP;
- CALCRATIO(sp, rat);
- if (rat <= sp->enc_ratio) {
- cl_hash(sp);
- sp->enc_ratio = 0;
- incount = 0;
- outcount = 0;
- free_ent = CODE_FIRST;
- PutNextCode(op, CODE_CLEAR);
- nbits = BITS_MIN;
- maxcode = MAXCODE(BITS_MIN);
- } else
- sp->enc_ratio = rat;
- }
- }
- hit:
- ;
- }
-
- /*
- * Restore global state.
- */
- sp->enc_incount = incount;
- sp->enc_outcount = outcount;
- sp->enc_checkpoint = checkpoint;
- sp->enc_oldcode = ent;
- sp->lzw_nextdata = nextdata;
- sp->lzw_nextbits = nextbits;
- sp->lzw_free_ent = (unsigned short)free_ent;
- sp->lzw_maxcode = (unsigned short)maxcode;
- sp->lzw_nbits = (unsigned short)nbits;
- tif->tif_rawcp = op;
- return (1);
+ hp = &sp->enc_hashtab[h];
+ if (hp->hash == fcode)
+ {
+ ent = hp->code;
+ continue;
+ }
+ if (hp->hash >= 0)
+ {
+ /*
+ * Primary hash failed, check secondary hash.
+ */
+ disp = HSIZE - h;
+ if (h == 0)
+ disp = 1;
+ do
+ {
+ /*
+ * Avoid pointer arithmetic because of
+ * wraparound problems with segments.
+ */
+ if ((h -= disp) < 0)
+ h += HSIZE;
+ hp = &sp->enc_hashtab[h];
+ if (hp->hash == fcode)
+ {
+ ent = hp->code;
+ goto hit;
+ }
+ } while (hp->hash >= 0);
+ }
+ /*
+ * New entry, emit code and add to table.
+ */
+ /*
+ * Verify there is space in the buffer for the code
+ * and any potential Clear code that might be emitted
+ * below. The value of limit is setup so that there
+ * are at least 4 bytes free--room for 2 codes.
+ */
+ if (op > limit)
+ {
+ tif->tif_rawcc = (tmsize_t)(op - tif->tif_rawdata);
+ if (!TIFFFlushData1(tif))
+ return 0;
+ op = tif->tif_rawdata;
+ }
+ PutNextCode(op, ent);
+ ent = (hcode_t)c;
+ hp->code = (hcode_t)(free_ent++);
+ hp->hash = fcode;
+ if (free_ent == CODE_MAX - 1)
+ {
+ /* table is full, emit clear code and reset */
+ cl_hash(sp);
+ sp->enc_ratio = 0;
+ incount = 0;
+ outcount = 0;
+ free_ent = CODE_FIRST;
+ PutNextCode(op, CODE_CLEAR);
+ nbits = BITS_MIN;
+ maxcode = MAXCODE(BITS_MIN);
+ }
+ else
+ {
+ /*
+ * If the next entry is going to be too big for
+ * the code size, then increase it, if possible.
+ */
+ if (free_ent > maxcode)
+ {
+ nbits++;
+ assert(nbits <= BITS_MAX);
+ maxcode = (int)MAXCODE(nbits);
+ }
+ else if (incount >= checkpoint)
+ {
+ tmsize_t rat;
+ /*
+ * Check compression ratio and, if things seem
+ * to be slipping, clear the hash table and
+ * reset state. The compression ratio is a
+ * 24+8-bit fractional number.
+ */
+ checkpoint = incount + CHECK_GAP;
+ CALCRATIO(sp, rat);
+ if (rat <= sp->enc_ratio)
+ {
+ cl_hash(sp);
+ sp->enc_ratio = 0;
+ incount = 0;
+ outcount = 0;
+ free_ent = CODE_FIRST;
+ PutNextCode(op, CODE_CLEAR);
+ nbits = BITS_MIN;
+ maxcode = MAXCODE(BITS_MIN);
+ }
+ else
+ sp->enc_ratio = rat;
+ }
+ }
+ hit:;
+ }
+
+ /*
+ * Restore global state.
+ */
+ sp->enc_incount = incount;
+ sp->enc_outcount = outcount;
+ sp->enc_checkpoint = checkpoint;
+ sp->enc_oldcode = ent;
+ sp->lzw_nextdata = nextdata;
+ sp->lzw_nextbits = nextbits;
+ sp->lzw_free_ent = (unsigned short)free_ent;
+ sp->lzw_maxcode = (unsigned short)maxcode;
+ sp->lzw_nbits = (unsigned short)nbits;
+ tif->tif_rawcp = op;
+ return (1);
}
/*
* Finish off an encoded strip by flushing the last
* string and tacking on an End Of Information code.
*/
-static int
-LZWPostEncode(TIFF* tif)
+static int LZWPostEncode(TIFF *tif)
{
- register LZWCodecState *sp = EncoderState(tif);
- uint8* op = tif->tif_rawcp;
- long nextbits = sp->lzw_nextbits;
- unsigned long nextdata = sp->lzw_nextdata;
- long outcount = sp->enc_outcount;
- int nbits = sp->lzw_nbits;
-
- if (op > sp->enc_rawlimit) {
- tif->tif_rawcc = (tmsize_t)(op - tif->tif_rawdata);
- if( !TIFFFlushData1(tif) )
- return 0;
- op = tif->tif_rawdata;
- }
- if (sp->enc_oldcode != (hcode_t) -1) {
- int free_ent = sp->lzw_free_ent;
-
- PutNextCode(op, sp->enc_oldcode);
- sp->enc_oldcode = (hcode_t) -1;
- free_ent ++;
-
- if (free_ent == CODE_MAX-1) {
- /* table is full, emit clear code and reset */
- outcount = 0;
- PutNextCode(op, CODE_CLEAR);
- nbits = BITS_MIN;
- } else {
- /*
- * If the next entry is going to be too big for
- * the code size, then increase it, if possible.
- */
- if (free_ent > sp->lzw_maxcode) {
- nbits++;
- assert(nbits <= BITS_MAX);
- }
- }
- }
- PutNextCode(op, CODE_EOI);
- /* Explicit 0xff masking to make icc -check=conversions happy */
- if (nextbits > 0)
- *op++ = (unsigned char)((nextdata << (8-nextbits))&0xff);
- tif->tif_rawcc = (tmsize_t)(op - tif->tif_rawdata);
- return (1);
+ register LZWCodecState *sp = EncoderState(tif);
+ uint8_t *op = tif->tif_rawcp;
+ long nextbits = sp->lzw_nextbits;
+ WordType nextdata = sp->lzw_nextdata;
+ tmsize_t outcount = sp->enc_outcount;
+ int nbits = sp->lzw_nbits;
+
+ if (op > sp->enc_rawlimit)
+ {
+ tif->tif_rawcc = (tmsize_t)(op - tif->tif_rawdata);
+ if (!TIFFFlushData1(tif))
+ return 0;
+ op = tif->tif_rawdata;
+ }
+ if (sp->enc_oldcode != (hcode_t)-1)
+ {
+ int free_ent = sp->lzw_free_ent;
+
+ PutNextCode(op, sp->enc_oldcode);
+ sp->enc_oldcode = (hcode_t)-1;
+ free_ent++;
+
+ if (free_ent == CODE_MAX - 1)
+ {
+ /* table is full, emit clear code and reset */
+ outcount = 0;
+ PutNextCode(op, CODE_CLEAR);
+ nbits = BITS_MIN;
+ }
+ else
+ {
+ /*
+ * If the next entry is going to be too big for
+ * the code size, then increase it, if possible.
+ */
+ if (free_ent > sp->lzw_maxcode)
+ {
+ nbits++;
+ assert(nbits <= BITS_MAX);
+ }
+ }
+ }
+ PutNextCode(op, CODE_EOI);
+ /* Explicit 0xff masking to make icc -check=conversions happy */
+ if (nextbits > 0)
+ *op++ = (unsigned char)((nextdata << (8 - nextbits)) & 0xff);
+ tif->tif_rawcc = (tmsize_t)(op - tif->tif_rawdata);
+ (void)outcount;
+ return (1);
}
/*
* Reset encoding hash table.
*/
-static void
-cl_hash(LZWCodecState* sp)
+static void cl_hash(LZWCodecState *sp)
{
- register hash_t *hp = &sp->enc_hashtab[HSIZE-1];
- register long i = HSIZE-8;
-
- do {
- i -= 8;
- hp[-7].hash = -1;
- hp[-6].hash = -1;
- hp[-5].hash = -1;
- hp[-4].hash = -1;
- hp[-3].hash = -1;
- hp[-2].hash = -1;
- hp[-1].hash = -1;
- hp[ 0].hash = -1;
- hp -= 8;
- } while (i >= 0);
- for (i += 8; i > 0; i--, hp--)
- hp->hash = -1;
+ register hash_t *hp = &sp->enc_hashtab[HSIZE - 1];
+ register long i = HSIZE - 8;
+
+ do
+ {
+ i -= 8;
+ hp[-7].hash = -1;
+ hp[-6].hash = -1;
+ hp[-5].hash = -1;
+ hp[-4].hash = -1;
+ hp[-3].hash = -1;
+ hp[-2].hash = -1;
+ hp[-1].hash = -1;
+ hp[0].hash = -1;
+ hp -= 8;
+ } while (i >= 0);
+ for (i += 8; i > 0; i--, hp--)
+ hp->hash = -1;
}
-static void
-LZWCleanup(TIFF* tif)
+static void LZWCleanup(TIFF *tif)
{
- (void)TIFFPredictorCleanup(tif);
+ (void)TIFFPredictorCleanup(tif);
- assert(tif->tif_data != 0);
+ assert(tif->tif_data != 0);
- if (DecoderState(tif)->dec_codetab)
- _TIFFfree(DecoderState(tif)->dec_codetab);
+ if (DecoderState(tif)->dec_codetab)
+ _TIFFfreeExt(tif, DecoderState(tif)->dec_codetab);
- if (EncoderState(tif)->enc_hashtab)
- _TIFFfree(EncoderState(tif)->enc_hashtab);
+ if (EncoderState(tif)->enc_hashtab)
+ _TIFFfreeExt(tif, EncoderState(tif)->enc_hashtab);
- _TIFFfree(tif->tif_data);
- tif->tif_data = NULL;
+ _TIFFfreeExt(tif, tif->tif_data);
+ tif->tif_data = NULL;
- _TIFFSetDefaultCompressionState(tif);
+ _TIFFSetDefaultCompressionState(tif);
}
-int
-TIFFInitLZW(TIFF* tif, int scheme)
+int TIFFInitLZW(TIFF *tif, int scheme)
{
- static const char module[] = "TIFFInitLZW";
- assert(scheme == COMPRESSION_LZW);
- /*
- * Allocate state block so tag methods have storage to record values.
- */
- tif->tif_data = (uint8*) _TIFFmalloc(sizeof (LZWCodecState));
- if (tif->tif_data == NULL)
- goto bad;
- DecoderState(tif)->dec_codetab = NULL;
- DecoderState(tif)->dec_decode = NULL;
- EncoderState(tif)->enc_hashtab = NULL;
- LZWState(tif)->rw_mode = tif->tif_mode;
-
- /*
- * Install codec methods.
- */
- tif->tif_fixuptags = LZWFixupTags;
- tif->tif_setupdecode = LZWSetupDecode;
- tif->tif_predecode = LZWPreDecode;
- tif->tif_decoderow = LZWDecode;
- tif->tif_decodestrip = LZWDecode;
- tif->tif_decodetile = LZWDecode;
- tif->tif_setupencode = LZWSetupEncode;
- tif->tif_preencode = LZWPreEncode;
- tif->tif_postencode = LZWPostEncode;
- tif->tif_encoderow = LZWEncode;
- tif->tif_encodestrip = LZWEncode;
- tif->tif_encodetile = LZWEncode;
- tif->tif_cleanup = LZWCleanup;
- /*
- * Setup predictor setup.
- */
- (void) TIFFPredictorInit(tif);
- return (1);
+ static const char module[] = "TIFFInitLZW";
+ (void)scheme;
+ assert(scheme == COMPRESSION_LZW);
+ /*
+ * Allocate state block so tag methods have storage to record values.
+ */
+ tif->tif_data = (uint8_t *)_TIFFmallocExt(tif, sizeof(LZWCodecState));
+ if (tif->tif_data == NULL)
+ goto bad;
+ DecoderState(tif)->dec_codetab = NULL;
+ DecoderState(tif)->dec_decode = NULL;
+ EncoderState(tif)->enc_hashtab = NULL;
+ LZWState(tif)->rw_mode = tif->tif_mode;
+
+ /*
+ * Install codec methods.
+ */
+ tif->tif_fixuptags = LZWFixupTags;
+ tif->tif_setupdecode = LZWSetupDecode;
+ tif->tif_predecode = LZWPreDecode;
+ tif->tif_decoderow = LZWDecode;
+ tif->tif_decodestrip = LZWDecode;
+ tif->tif_decodetile = LZWDecode;
+ tif->tif_setupencode = LZWSetupEncode;
+ tif->tif_preencode = LZWPreEncode;
+ tif->tif_postencode = LZWPostEncode;
+ tif->tif_encoderow = LZWEncode;
+ tif->tif_encodestrip = LZWEncode;
+ tif->tif_encodetile = LZWEncode;
+ tif->tif_cleanup = LZWCleanup;
+ /*
+ * Setup predictor setup.
+ */
+ (void)TIFFPredictorInit(tif);
+ return (1);
bad:
- TIFFErrorExt(tif->tif_clientdata, module,
- "No space for LZW state block");
- return (0);
+ TIFFErrorExtR(tif, module, "No space for LZW state block");
+ return (0);
}
/*
@@ -1218,15 +1448,6 @@ bad:
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#endif /* LZW_SUPPORT */
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_next.c b/src/3rdparty/libtiff/libtiff/tif_next.c
index 0ba61ae..f000574 100644
--- a/src/3rdparty/libtiff/libtiff/tif_next.c
+++ b/src/3rdparty/libtiff/libtiff/tif_next.c
@@ -2,23 +2,23 @@
* Copyright (c) 1988-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -30,158 +30,165 @@
* NeXT 2-bit Grey Scale Compression Algorithm Support
*/
-#define SETPIXEL(op, v) { \
- switch (npixels++ & 3) { \
- case 0: op[0] = (unsigned char) ((v) << 6); break; \
- case 1: op[0] |= (v) << 4; break; \
- case 2: op[0] |= (v) << 2; break; \
- case 3: *op++ |= (v); op_offset++; break; \
- } \
-}
+#define SETPIXEL(op, v) \
+ { \
+ switch (npixels++ & 3) \
+ { \
+ case 0: \
+ op[0] = (unsigned char)((v) << 6); \
+ break; \
+ case 1: \
+ op[0] |= (v) << 4; \
+ break; \
+ case 2: \
+ op[0] |= (v) << 2; \
+ break; \
+ case 3: \
+ *op++ |= (v); \
+ op_offset++; \
+ break; \
+ } \
+ }
-#define LITERALROW 0x00
-#define LITERALSPAN 0x40
-#define WHITE ((1<<2)-1)
+#define LITERALROW 0x00
+#define LITERALSPAN 0x40
+#define WHITE ((1 << 2) - 1)
-static int
-NeXTDecode(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s)
+static int NeXTDecode(TIFF *tif, uint8_t *buf, tmsize_t occ, uint16_t s)
{
- static const char module[] = "NeXTDecode";
- unsigned char *bp, *op;
- tmsize_t cc;
- uint8* row;
- tmsize_t scanline, n;
+ static const char module[] = "NeXTDecode";
+ unsigned char *bp, *op;
+ tmsize_t cc;
+ uint8_t *row;
+ tmsize_t scanline, n;
- (void) s;
- /*
- * Each scanline is assumed to start off as all
- * white (we assume a PhotometricInterpretation
- * of ``min-is-black'').
- */
- for (op = (unsigned char*) buf, cc = occ; cc-- > 0;)
- *op++ = 0xff;
+ (void)s;
+ /*
+ * Each scanline is assumed to start off as all
+ * white (we assume a PhotometricInterpretation
+ * of ``min-is-black'').
+ */
+ for (op = (unsigned char *)buf, cc = occ; cc-- > 0;)
+ *op++ = 0xff;
- bp = (unsigned char *)tif->tif_rawcp;
- cc = tif->tif_rawcc;
- scanline = tif->tif_scanlinesize;
- if (occ % scanline)
- {
- TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be read");
- return (0);
- }
- for (row = buf; cc > 0 && occ > 0; occ -= scanline, row += scanline) {
- n = *bp++;
- cc--;
- switch (n) {
- case LITERALROW:
- /*
- * The entire scanline is given as literal values.
- */
- if (cc < scanline)
- goto bad;
- _TIFFmemcpy(row, bp, scanline);
- bp += scanline;
- cc -= scanline;
- break;
- case LITERALSPAN: {
- tmsize_t off;
- /*
- * The scanline has a literal span that begins at some
- * offset.
- */
- if( cc < 4 )
- goto bad;
- off = (bp[0] * 256) + bp[1];
- n = (bp[2] * 256) + bp[3];
- if (cc < 4+n || off+n > scanline)
- goto bad;
- _TIFFmemcpy(row+off, bp+4, n);
- bp += 4+n;
- cc -= 4+n;
- break;
- }
- default: {
- uint32 npixels = 0, grey;
- tmsize_t op_offset = 0;
- uint32 imagewidth = tif->tif_dir.td_imagewidth;
- if( isTiled(tif) )
- imagewidth = tif->tif_dir.td_tilewidth;
+ bp = (unsigned char *)tif->tif_rawcp;
+ cc = tif->tif_rawcc;
+ scanline = tif->tif_scanlinesize;
+ if (occ % scanline)
+ {
+ TIFFErrorExtR(tif, module, "Fractional scanlines cannot be read");
+ return (0);
+ }
+ for (row = buf; cc > 0 && occ > 0; occ -= scanline, row += scanline)
+ {
+ n = *bp++;
+ cc--;
+ switch (n)
+ {
+ case LITERALROW:
+ /*
+ * The entire scanline is given as literal values.
+ */
+ if (cc < scanline)
+ goto bad;
+ _TIFFmemcpy(row, bp, scanline);
+ bp += scanline;
+ cc -= scanline;
+ break;
+ case LITERALSPAN:
+ {
+ tmsize_t off;
+ /*
+ * The scanline has a literal span that begins at some
+ * offset.
+ */
+ if (cc < 4)
+ goto bad;
+ off = (bp[0] * 256) + bp[1];
+ n = (bp[2] * 256) + bp[3];
+ if (cc < 4 + n || off + n > scanline)
+ goto bad;
+ _TIFFmemcpy(row + off, bp + 4, n);
+ bp += 4 + n;
+ cc -= 4 + n;
+ break;
+ }
+ default:
+ {
+ uint32_t npixels = 0, grey;
+ tmsize_t op_offset = 0;
+ uint32_t imagewidth = tif->tif_dir.td_imagewidth;
+ if (isTiled(tif))
+ imagewidth = tif->tif_dir.td_tilewidth;
- /*
- * The scanline is composed of a sequence of constant
- * color ``runs''. We shift into ``run mode'' and
- * interpret bytes as codes of the form
- * <color><npixels> until we've filled the scanline.
- */
- op = row;
- for (;;) {
- grey = (uint32)((n>>6) & 0x3);
- n &= 0x3f;
- /*
- * Ensure the run does not exceed the scanline
- * bounds, potentially resulting in a security
- * issue.
- */
- while (n-- > 0 && npixels < imagewidth && op_offset < scanline)
- SETPIXEL(op, grey);
- if (npixels >= imagewidth)
- break;
- if (op_offset >= scanline ) {
- TIFFErrorExt(tif->tif_clientdata, module, "Invalid data for scanline %ld",
- (long) tif->tif_row);
- return (0);
+ /*
+ * The scanline is composed of a sequence of constant
+ * color ``runs''. We shift into ``run mode'' and
+ * interpret bytes as codes of the form
+ * <color><npixels> until we've filled the scanline.
+ */
+ op = row;
+ for (;;)
+ {
+ grey = (uint32_t)((n >> 6) & 0x3);
+ n &= 0x3f;
+ /*
+ * Ensure the run does not exceed the scanline
+ * bounds, potentially resulting in a security
+ * issue.
+ */
+ while (n-- > 0 && npixels < imagewidth &&
+ op_offset < scanline)
+ SETPIXEL(op, grey);
+ if (npixels >= imagewidth)
+ break;
+ if (op_offset >= scanline)
+ {
+ TIFFErrorExtR(tif, module,
+ "Invalid data for scanline %" PRIu32,
+ tif->tif_row);
+ return (0);
+ }
+ if (cc == 0)
+ goto bad;
+ n = *bp++;
+ cc--;
}
- if (cc == 0)
- goto bad;
- n = *bp++;
- cc--;
- }
- break;
- }
- }
- }
- tif->tif_rawcp = (uint8*) bp;
- tif->tif_rawcc = cc;
- return (1);
+ break;
+ }
+ }
+ }
+ tif->tif_rawcp = (uint8_t *)bp;
+ tif->tif_rawcc = cc;
+ return (1);
bad:
- TIFFErrorExt(tif->tif_clientdata, module, "Not enough data for scanline %ld",
- (long) tif->tif_row);
- return (0);
+ TIFFErrorExtR(tif, module, "Not enough data for scanline %" PRIu32,
+ tif->tif_row);
+ return (0);
}
-static int
-NeXTPreDecode(TIFF* tif, uint16 s)
+static int NeXTPreDecode(TIFF *tif, uint16_t s)
{
- static const char module[] = "NeXTPreDecode";
- TIFFDirectory *td = &tif->tif_dir;
- (void)s;
+ static const char module[] = "NeXTPreDecode";
+ TIFFDirectory *td = &tif->tif_dir;
+ (void)s;
- if( td->td_bitspersample != 2 )
- {
- TIFFErrorExt(tif->tif_clientdata, module, "Unsupported BitsPerSample = %d",
- td->td_bitspersample);
- return (0);
- }
- return (1);
+ if (td->td_bitspersample != 2)
+ {
+ TIFFErrorExtR(tif, module, "Unsupported BitsPerSample = %" PRIu16,
+ td->td_bitspersample);
+ return (0);
+ }
+ return (1);
}
-
-int
-TIFFInitNeXT(TIFF* tif, int scheme)
+
+int TIFFInitNeXT(TIFF *tif, int scheme)
{
- (void) scheme;
- tif->tif_predecode = NeXTPreDecode;
- tif->tif_decoderow = NeXTDecode;
- tif->tif_decodestrip = NeXTDecode;
- tif->tif_decodetile = NeXTDecode;
- return (1);
+ (void)scheme;
+ tif->tif_predecode = NeXTPreDecode;
+ tif->tif_decoderow = NeXTDecode;
+ tif->tif_decodestrip = NeXTDecode;
+ tif->tif_decodetile = NeXTDecode;
+ return (1);
}
#endif /* NEXT_SUPPORT */
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_ojpeg.c b/src/3rdparty/libtiff/libtiff/tif_ojpeg.c
index bf0d1a2..0c915de 100644
--- a/src/3rdparty/libtiff/libtiff/tif_ojpeg.c
+++ b/src/3rdparty/libtiff/libtiff/tif_ojpeg.c
@@ -43,79 +43,83 @@
/* What is what, and what is not?
- This decoder starts with an input stream, that is essentially the JpegInterchangeFormat
- stream, if any, followed by the strile data, if any. This stream is read in
- OJPEGReadByte and related functions.
-
- It analyzes the start of this stream, until it encounters non-marker data, i.e.
- compressed image data. Some of the header markers it sees have no actual content,
- like the SOI marker, and APP/COM markers that really shouldn't even be there. Some
- other markers do have content, and the valuable bits and pieces of information
- in these markers are saved, checking all to verify that the stream is more or
- less within expected bounds. This happens inside the OJPEGReadHeaderInfoSecStreamXxx
+ This decoder starts with an input stream, that is essentially the
+ JpegInterchangeFormat stream, if any, followed by the strile data, if any.
+ This stream is read in OJPEGReadByte and related functions.
+
+ It analyzes the start of this stream, until it encounters non-marker data,
+ i.e. compressed image data. Some of the header markers it sees have no actual
+ content, like the SOI marker, and APP/COM markers that really shouldn't even
+ be there. Some other markers do have content, and the valuable bits and
+ pieces of information in these markers are saved, checking all to verify that
+ the stream is more or less within expected bounds. This happens inside the
+ OJPEGReadHeaderInfoSecStreamXxx functions.
+
+ Some OJPEG imagery contains no valid JPEG header markers. This situation is
+ picked up on if we've seen no SOF marker when we're at the start of the
+ compressed image data. In this case, the tables are read from JpegXxxTables
+ tags, and the other bits and pieces of information is initialized to its most
+ basic value. This is implemented in the OJPEGReadHeaderInfoSecTablesXxx
functions.
- Some OJPEG imagery contains no valid JPEG header markers. This situation is picked
- up on if we've seen no SOF marker when we're at the start of the compressed image
- data. In this case, the tables are read from JpegXxxTables tags, and the other
- bits and pieces of information is initialized to its most basic value. This is
- implemented in the OJPEGReadHeaderInfoSecTablesXxx functions.
-
- When this is complete, a good and valid JPEG header can be assembled, and this is
- passed through to LibJpeg. When that's done, the remainder of the input stream, i.e.
- the compressed image data, can be passed through unchanged. This is done in
- OJPEGWriteStream functions.
-
- LibTiff rightly expects to know the subsampling values before decompression. Just like
- in new-style JPEG-in-TIFF, though, or even more so, actually, the YCbCrsubsampling
- tag is notoriously unreliable. To correct these tag values with the ones inside
- the JPEG stream, the first part of the input stream is pre-scanned in
- OJPEGSubsamplingCorrect, making no note of any other data, reporting no warnings
- or errors, up to the point where either these values are read, or it's clear they
- aren't there. This means that some of the data is read twice, but we feel speed
- in correcting these values is important enough to warrant this sacrifice. Although
- there is currently no define or other configuration mechanism to disable this behaviour,
- the actual header scanning is build to robustly respond with error report if it
- should encounter an uncorrected mismatch of subsampling values. See
+ When this is complete, a good and valid JPEG header can be assembled, and
+ this is passed through to LibJpeg. When that's done, the remainder of the
+ input stream, i.e. the compressed image data, can be passed through
+ unchanged. This is done in OJPEGWriteStream functions.
+
+ LibTiff rightly expects to know the subsampling values before decompression.
+ Just like in new-style JPEG-in-TIFF, though, or even more so, actually, the
+ YCbCrsubsampling tag is notoriously unreliable. To correct these tag values
+ with the ones inside the JPEG stream, the first part of the input stream is
+ pre-scanned in OJPEGSubsamplingCorrect, making no note of any other data,
+ reporting no warnings or errors, up to the point where either these values
+ are read, or it's clear they aren't there. This means that some of the data
+ is read twice, but we feel speed in correcting these values is important
+ enough to warrant this sacrifice. Although there is currently no define or
+ other configuration mechanism to disable this behavior, the actual header
+ scanning is build to robustly respond with error report if it should
+ encounter an uncorrected mismatch of subsampling values. See
OJPEGReadHeaderInfoSecStreamSof.
- The restart interval and restart markers are the most tricky part... The restart
- interval can be specified in a tag. It can also be set inside the input JPEG stream.
- It can be used inside the input JPEG stream. If reading from strile data, we've
- consistently discovered the need to insert restart markers in between the different
- striles, as is also probably the most likely interpretation of the original TIFF 6.0
- specification. With all this setting of interval, and actual use of markers that is not
- predictable at the time of valid JPEG header assembly, the restart thing may turn
- out the Achilles heel of this implementation. Fortunately, most OJPEG writer vendors
- succeed in reading back what they write, which may be the reason why we've been able
- to discover ways that seem to work.
-
- Some special provision is made for planarconfig separate OJPEG files. These seem
- to consistently contain header info, a SOS marker, a plane, SOS marker, plane, SOS,
- and plane. This may or may not be a valid JPEG configuration, we don't know and don't
- care. We want LibTiff to be able to access the planes individually, without huge
- buffering inside LibJpeg, anyway. So we compose headers to feed to LibJpeg, in this
- case, that allow us to pass a single plane such that LibJpeg sees a valid
- single-channel JPEG stream. Locating subsequent SOS markers, and thus subsequent
- planes, is done inside OJPEGReadSecondarySos.
-
- The benefit of the scheme is... that it works, basically. We know of no other that
- does. It works without checking software tag, or otherwise going about things in an
- OJPEG flavor specific manner. Instead, it is a single scheme, that covers the cases
- with and without JpegInterchangeFormat, with and without striles, with part of
- the header in JpegInterchangeFormat and remainder in first strile, etc. It is forgiving
- and robust, may likely work with OJPEG flavors we've not seen yet, and makes most out
- of the data.
-
- Another nice side-effect is that a complete JPEG single valid stream is build if
- planarconfig is not separate (vast majority). We may one day use that to build
- converters to JPEG, and/or to new-style JPEG compression inside TIFF.
-
- A disadvantage is the lack of random access to the individual striles. This is the
- reason for much of the complicated restart-and-position stuff inside OJPEGPreDecode.
- Applications would do well accessing all striles in order, as this will result in
- a single sequential scan of the input stream, and no restarting of LibJpeg decoding
- session.
+ The restart interval and restart markers are the most tricky part... The
+ restart interval can be specified in a tag. It can also be set inside the
+ input JPEG stream. It can be used inside the input JPEG stream. If reading
+ from strile data, we've consistently discovered the need to insert restart
+ markers in between the different striles, as is also probably the most likely
+ interpretation of the original TIFF 6.0 specification. With all this setting
+ of interval, and actual use of markers that is not predictable at the time of
+ valid JPEG header assembly, the restart thing may turn out the Achilles heel
+ of this implementation. Fortunately, most OJPEG writer vendors succeed in
+ reading back what they write, which may be the reason why we've been able to
+ discover ways that seem to work.
+
+ Some special provision is made for planarconfig separate OJPEG files. These
+ seem to consistently contain header info, a SOS marker, a plane, SOS marker,
+ plane, SOS, and plane. This may or may not be a valid JPEG configuration, we
+ don't know and don't care. We want LibTiff to be able to access the planes
+ individually, without huge buffering inside LibJpeg, anyway. So we compose
+ headers to feed to LibJpeg, in this case, that allow us to pass a single
+ plane such that LibJpeg sees a valid single-channel JPEG stream. Locating
+ subsequent SOS markers, and thus subsequent planes, is done inside
+ OJPEGReadSecondarySos.
+
+ The benefit of the scheme is... that it works, basically. We know of no other
+ that does. It works without checking software tag, or otherwise going about
+ things in an OJPEG flavor specific manner. Instead, it is a single scheme,
+ that covers the cases with and without JpegInterchangeFormat, with and
+ without striles, with part of the header in JpegInterchangeFormat and
+ remainder in first strile, etc. It is forgiving and robust, may likely work
+ with OJPEG flavors we've not seen yet, and makes most out of the data.
+
+ Another nice side-effect is that a complete JPEG single valid stream is build
+ if planarconfig is not separate (vast majority). We may one day use that to
+ build converters to JPEG, and/or to new-style JPEG compression inside TIFF.
+
+ A disadvantage is the lack of random access to the individual striles. This
+ is the reason for much of the complicated restart-and-position stuff inside
+ OJPEGPreDecode. Applications would do well accessing all striles in order, as
+ this will result in a single sequential scan of the input stream, and no
+ restarting of LibJpeg decoding session.
*/
#define WIN32_LEAN_AND_MEAN
@@ -125,30 +129,31 @@
#ifdef OJPEG_SUPPORT
/* Configuration defines here are:
- * JPEG_ENCAP_EXTERNAL: The normal way to call libjpeg, uses longjump. In some environments,
- * like eg LibTiffDelphi, this is not possible. For this reason, the actual calls to
- * libjpeg, with longjump stuff, are encapsulated in dedicated functions. When
- * JPEG_ENCAP_EXTERNAL is defined, these encapsulating functions are declared external
- * to this unit, and can be defined elsewhere to use stuff other then longjump.
- * The default mode, without JPEG_ENCAP_EXTERNAL, implements the call encapsulators
- * here, internally, with normal longjump.
- * SETJMP, LONGJMP, JMP_BUF: On some machines/environments a longjump equivalent is
- * conveniently available, but still it may be worthwhile to use _setjmp or sigsetjmp
- * in place of plain setjmp. These macros will make it easier. It is useless
- * to fiddle with these if you define JPEG_ENCAP_EXTERNAL.
- * OJPEG_BUFFER: Define the size of the desired buffer here. Should be small enough so as to guarantee
- * instant processing, optimal streaming and optimal use of processor cache, but also big
- * enough so as to not result in significant call overhead. It should be at least a few
- * bytes to accommodate some structures (this is verified in asserts), but it would not be
- * sensible to make it this small anyway, and it should be at most 64K since it is indexed
- * with uint16. We recommend 2K.
- * EGYPTIANWALK: You could also define EGYPTIANWALK here, but it is not used anywhere and has
- * absolutely no effect. That is why most people insist the EGYPTIANWALK is a bit silly.
+ * JPEG_ENCAP_EXTERNAL: The normal way to call libjpeg, uses longjump. In some
+ * environments, like eg LibTiffDelphi, this is not possible. For this reason,
+ * the actual calls to libjpeg, with longjump stuff, are encapsulated in
+ * dedicated functions. When JPEG_ENCAP_EXTERNAL is defined, these encapsulating
+ * functions are declared external to this unit, and can be defined elsewhere to
+ * use stuff other then longjump. The default mode, without JPEG_ENCAP_EXTERNAL,
+ * implements the call encapsulators here, internally, with normal longjump.
+ * SETJMP, LONGJMP, JMP_BUF: On some machines/environments a longjump equivalent
+ * is conveniently available, but still it may be worthwhile to use _setjmp or
+ * sigsetjmp in place of plain setjmp. These macros will make it easier. It is
+ * useless to fiddle with these if you define JPEG_ENCAP_EXTERNAL. OJPEG_BUFFER:
+ * Define the size of the desired buffer here. Should be small enough so as to
+ * guarantee instant processing, optimal streaming and optimal use of processor
+ * cache, but also big enough so as to not result in significant call overhead.
+ * It should be at least a few bytes to accommodate some structures (this is
+ * verified in asserts), but it would not be sensible to make it this small
+ * anyway, and it should be at most 64K since it is indexed with uint16_t. We
+ * recommend 2K. EGYPTIANWALK: You could also define EGYPTIANWALK here, but it
+ * is not used anywhere and has absolutely no effect. That is why most people
+ * insist the EGYPTIANWALK is a bit silly.
*/
/* define LIBJPEG_ENCAP_EXTERNAL */
#define SETJMP(jbuf) setjmp(jbuf)
-#define LONGJMP(jbuf,code) longjmp(jbuf,code)
+#define LONGJMP(jbuf, code) longjmp(jbuf, code)
#define JMP_BUF jmp_buf
#define OJPEG_BUFFER 2048
/* define EGYPTIANWALK */
@@ -166,22 +171,36 @@
#define JPEG_MARKER_APP0 0xE0
#define JPEG_MARKER_COM 0xFE
-#define FIELD_OJPEG_JPEGINTERCHANGEFORMAT (FIELD_CODEC+0)
-#define FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH (FIELD_CODEC+1)
-#define FIELD_OJPEG_JPEGQTABLES (FIELD_CODEC+2)
-#define FIELD_OJPEG_JPEGDCTABLES (FIELD_CODEC+3)
-#define FIELD_OJPEG_JPEGACTABLES (FIELD_CODEC+4)
-#define FIELD_OJPEG_JPEGPROC (FIELD_CODEC+5)
-#define FIELD_OJPEG_JPEGRESTARTINTERVAL (FIELD_CODEC+6)
+#define FIELD_OJPEG_JPEGINTERCHANGEFORMAT (FIELD_CODEC + 0)
+#define FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH (FIELD_CODEC + 1)
+#define FIELD_OJPEG_JPEGQTABLES (FIELD_CODEC + 2)
+#define FIELD_OJPEG_JPEGDCTABLES (FIELD_CODEC + 3)
+#define FIELD_OJPEG_JPEGACTABLES (FIELD_CODEC + 4)
+#define FIELD_OJPEG_JPEGPROC (FIELD_CODEC + 5)
+#define FIELD_OJPEG_JPEGRESTARTINTERVAL (FIELD_CODEC + 6)
static const TIFFField ojpegFields[] = {
- {TIFFTAG_JPEGIFOFFSET,1,1,TIFF_LONG8,0,TIFF_SETGET_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGINTERCHANGEFORMAT,TRUE,FALSE,"JpegInterchangeFormat",NULL},
- {TIFFTAG_JPEGIFBYTECOUNT,1,1,TIFF_LONG8,0,TIFF_SETGET_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH,TRUE,FALSE,"JpegInterchangeFormatLength",NULL},
- {TIFFTAG_JPEGQTABLES,TIFF_VARIABLE2,TIFF_VARIABLE2,TIFF_LONG8,0,TIFF_SETGET_C32_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGQTABLES,FALSE,TRUE,"JpegQTables",NULL},
- {TIFFTAG_JPEGDCTABLES,TIFF_VARIABLE2,TIFF_VARIABLE2,TIFF_LONG8,0,TIFF_SETGET_C32_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGDCTABLES,FALSE,TRUE,"JpegDcTables",NULL},
- {TIFFTAG_JPEGACTABLES,TIFF_VARIABLE2,TIFF_VARIABLE2,TIFF_LONG8,0,TIFF_SETGET_C32_UINT64,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGACTABLES,FALSE,TRUE,"JpegAcTables",NULL},
- {TIFFTAG_JPEGPROC,1,1,TIFF_SHORT,0,TIFF_SETGET_UINT16,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGPROC,FALSE,FALSE,"JpegProc",NULL},
- {TIFFTAG_JPEGRESTARTINTERVAL,1,1,TIFF_SHORT,0,TIFF_SETGET_UINT16,TIFF_SETGET_UNDEFINED,FIELD_OJPEG_JPEGRESTARTINTERVAL,FALSE,FALSE,"JpegRestartInterval",NULL},
+ {TIFFTAG_JPEGIFOFFSET, 1, 1, TIFF_LONG8, 0, TIFF_SETGET_UINT64,
+ TIFF_SETGET_UNDEFINED, FIELD_OJPEG_JPEGINTERCHANGEFORMAT, TRUE, FALSE,
+ "JpegInterchangeFormat", NULL},
+ {TIFFTAG_JPEGIFBYTECOUNT, 1, 1, TIFF_LONG8, 0, TIFF_SETGET_UINT64,
+ TIFF_SETGET_UNDEFINED, FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH, TRUE,
+ FALSE, "JpegInterchangeFormatLength", NULL},
+ {TIFFTAG_JPEGQTABLES, TIFF_VARIABLE2, TIFF_VARIABLE2, TIFF_LONG8, 0,
+ TIFF_SETGET_C32_UINT64, TIFF_SETGET_UNDEFINED, FIELD_OJPEG_JPEGQTABLES,
+ FALSE, TRUE, "JpegQTables", NULL},
+ {TIFFTAG_JPEGDCTABLES, TIFF_VARIABLE2, TIFF_VARIABLE2, TIFF_LONG8, 0,
+ TIFF_SETGET_C32_UINT64, TIFF_SETGET_UNDEFINED, FIELD_OJPEG_JPEGDCTABLES,
+ FALSE, TRUE, "JpegDcTables", NULL},
+ {TIFFTAG_JPEGACTABLES, TIFF_VARIABLE2, TIFF_VARIABLE2, TIFF_LONG8, 0,
+ TIFF_SETGET_C32_UINT64, TIFF_SETGET_UNDEFINED, FIELD_OJPEG_JPEGACTABLES,
+ FALSE, TRUE, "JpegAcTables", NULL},
+ {TIFFTAG_JPEGPROC, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_OJPEG_JPEGPROC, FALSE, FALSE, "JpegProc",
+ NULL},
+ {TIFFTAG_JPEGRESTARTINTERVAL, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UNDEFINED, FIELD_OJPEG_JPEGRESTARTINTERVAL, FALSE, FALSE,
+ "JpegRestartInterval", NULL},
};
#ifndef LIBJPEG_ENCAP_EXTERNAL
@@ -201,2412 +220,2593 @@ static const TIFFField ojpegFields[] = {
a conflicting typedef given the headers which are included.
*/
#if defined(__BORLANDC__) || defined(__MINGW32__)
-# define XMD_H 1
+#define XMD_H 1
#endif
/* Define "boolean" as unsigned char, not int, per Windows custom. */
#if defined(__WIN32__) && !defined(__MINGW32__)
-# ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
- typedef unsigned char boolean;
-# endif
-# define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
+#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
+typedef unsigned char boolean;
+#endif
+#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
#endif
-#include "jpeglib.h"
#include "jerror.h"
+#include "jpeglib.h"
typedef struct jpeg_error_mgr jpeg_error_mgr;
typedef struct jpeg_common_struct jpeg_common_struct;
typedef struct jpeg_decompress_struct jpeg_decompress_struct;
typedef struct jpeg_source_mgr jpeg_source_mgr;
-typedef enum {
- osibsNotSetYet,
- osibsJpegInterchangeFormat,
- osibsStrile,
- osibsEof
+typedef enum
+{
+ osibsNotSetYet,
+ osibsJpegInterchangeFormat,
+ osibsStrile,
+ osibsEof
} OJPEGStateInBufferSource;
-typedef enum {
- ososSoi,
- ososQTable0,ososQTable1,ososQTable2,ososQTable3,
- ososDcTable0,ososDcTable1,ososDcTable2,ososDcTable3,
- ososAcTable0,ososAcTable1,ososAcTable2,ososAcTable3,
- ososDri,
- ososSof,
- ososSos,
- ososCompressed,
- ososRst,
- ososEoi
+typedef enum
+{
+ ososSoi,
+ ososQTable0,
+ ososQTable1,
+ ososQTable2,
+ ososQTable3,
+ ososDcTable0,
+ ososDcTable1,
+ ososDcTable2,
+ ososDcTable3,
+ ososAcTable0,
+ ososAcTable1,
+ ososAcTable2,
+ ososAcTable3,
+ ososDri,
+ ososSof,
+ ososSos,
+ ososCompressed,
+ ososRst,
+ ososEoi
} OJPEGStateOutState;
-typedef struct {
- TIFF* tif;
- int decoder_ok;
- int error_in_raw_data_decoding;
- #ifndef LIBJPEG_ENCAP_EXTERNAL
- JMP_BUF exit_jmpbuf;
- #endif
- TIFFVGetMethod vgetparent;
- TIFFVSetMethod vsetparent;
- TIFFPrintMethod printdir;
- uint64 file_size;
- uint32 image_width;
- uint32 image_length;
- uint32 strile_width;
- uint32 strile_length;
- uint32 strile_length_total;
- uint8 samples_per_pixel;
- uint8 plane_sample_offset;
- uint8 samples_per_pixel_per_plane;
- uint64 jpeg_interchange_format;
- uint64 jpeg_interchange_format_length;
- uint8 jpeg_proc;
- uint8 subsamplingcorrect;
- uint8 subsamplingcorrect_done;
- uint8 subsampling_tag;
- uint8 subsampling_hor;
- uint8 subsampling_ver;
- uint8 subsampling_force_desubsampling_inside_decompression;
- uint8 qtable_offset_count;
- uint8 dctable_offset_count;
- uint8 actable_offset_count;
- uint64 qtable_offset[3];
- uint64 dctable_offset[3];
- uint64 actable_offset[3];
- uint8* qtable[4];
- uint8* dctable[4];
- uint8* actable[4];
- uint16 restart_interval;
- uint8 restart_index;
- uint8 sof_log;
- uint8 sof_marker_id;
- uint32 sof_x;
- uint32 sof_y;
- uint8 sof_c[3];
- uint8 sof_hv[3];
- uint8 sof_tq[3];
- uint8 sos_cs[3];
- uint8 sos_tda[3];
- struct {
- uint8 log;
- OJPEGStateInBufferSource in_buffer_source;
- uint32 in_buffer_next_strile;
- uint64 in_buffer_file_pos;
- uint64 in_buffer_file_togo;
- } sos_end[3];
- uint8 readheader_done;
- uint8 writeheader_done;
- uint16 write_cursample;
- uint32 write_curstrile;
- uint8 libjpeg_session_active;
- uint8 libjpeg_jpeg_query_style;
- jpeg_error_mgr libjpeg_jpeg_error_mgr;
- jpeg_decompress_struct libjpeg_jpeg_decompress_struct;
- jpeg_source_mgr libjpeg_jpeg_source_mgr;
- uint8 subsampling_convert_log;
- uint32 subsampling_convert_ylinelen;
- uint32 subsampling_convert_ylines;
- uint32 subsampling_convert_clinelen;
- uint32 subsampling_convert_clines;
- uint32 subsampling_convert_ybuflen;
- uint32 subsampling_convert_cbuflen;
- uint32 subsampling_convert_ycbcrbuflen;
- uint8* subsampling_convert_ycbcrbuf;
- uint8* subsampling_convert_ybuf;
- uint8* subsampling_convert_cbbuf;
- uint8* subsampling_convert_crbuf;
- uint32 subsampling_convert_ycbcrimagelen;
- uint8** subsampling_convert_ycbcrimage;
- uint32 subsampling_convert_clinelenout;
- uint32 subsampling_convert_state;
- uint32 bytes_per_line; /* if the codec outputs subsampled data, a 'line' in bytes_per_line */
- uint32 lines_per_strile; /* and lines_per_strile means subsampling_ver desubsampled rows */
- OJPEGStateInBufferSource in_buffer_source;
- uint32 in_buffer_next_strile;
- uint32 in_buffer_strile_count;
- uint64 in_buffer_file_pos;
- uint8 in_buffer_file_pos_log;
- uint64 in_buffer_file_togo;
- uint16 in_buffer_togo;
- uint8* in_buffer_cur;
- uint8 in_buffer[OJPEG_BUFFER];
- OJPEGStateOutState out_state;
- uint8 out_buffer[OJPEG_BUFFER];
- uint8* skip_buffer;
+typedef struct
+{
+ TIFF *tif;
+ int decoder_ok;
+ int error_in_raw_data_decoding;
+#ifndef LIBJPEG_ENCAP_EXTERNAL
+ JMP_BUF exit_jmpbuf;
+#endif
+ TIFFVGetMethod vgetparent;
+ TIFFVSetMethod vsetparent;
+ TIFFPrintMethod printdir;
+ uint64_t file_size;
+ uint32_t image_width;
+ uint32_t image_length;
+ uint32_t strile_width;
+ uint32_t strile_length;
+ uint32_t strile_length_total;
+ uint8_t samples_per_pixel;
+ uint8_t plane_sample_offset;
+ uint8_t samples_per_pixel_per_plane;
+ uint64_t jpeg_interchange_format;
+ uint64_t jpeg_interchange_format_length;
+ uint8_t jpeg_proc;
+ uint8_t subsamplingcorrect;
+ uint8_t subsamplingcorrect_done;
+ uint8_t subsampling_tag;
+ uint8_t subsampling_hor;
+ uint8_t subsampling_ver;
+ uint8_t subsampling_force_desubsampling_inside_decompression;
+ uint8_t qtable_offset_count;
+ uint8_t dctable_offset_count;
+ uint8_t actable_offset_count;
+ uint64_t qtable_offset[3];
+ uint64_t dctable_offset[3];
+ uint64_t actable_offset[3];
+ uint8_t *qtable[4];
+ uint8_t *dctable[4];
+ uint8_t *actable[4];
+ uint16_t restart_interval;
+ uint8_t restart_index;
+ uint8_t sof_log;
+ uint8_t sof_marker_id;
+ uint32_t sof_x;
+ uint32_t sof_y;
+ uint8_t sof_c[3];
+ uint8_t sof_hv[3];
+ uint8_t sof_tq[3];
+ uint8_t sos_cs[3];
+ uint8_t sos_tda[3];
+ struct
+ {
+ uint8_t log;
+ OJPEGStateInBufferSource in_buffer_source;
+ uint32_t in_buffer_next_strile;
+ uint64_t in_buffer_file_pos;
+ uint64_t in_buffer_file_togo;
+ } sos_end[3];
+ uint8_t readheader_done;
+ uint8_t writeheader_done;
+ uint16_t write_cursample;
+ uint32_t write_curstrile;
+ uint8_t libjpeg_session_active;
+ uint8_t libjpeg_jpeg_query_style;
+ jpeg_error_mgr libjpeg_jpeg_error_mgr;
+ jpeg_decompress_struct libjpeg_jpeg_decompress_struct;
+ jpeg_source_mgr libjpeg_jpeg_source_mgr;
+ uint8_t subsampling_convert_log;
+ uint32_t subsampling_convert_ylinelen;
+ uint32_t subsampling_convert_ylines;
+ uint32_t subsampling_convert_clinelen;
+ uint32_t subsampling_convert_clines;
+ uint32_t subsampling_convert_ybuflen;
+ uint32_t subsampling_convert_cbuflen;
+ uint32_t subsampling_convert_ycbcrbuflen;
+ uint8_t *subsampling_convert_ycbcrbuf;
+ uint8_t *subsampling_convert_ybuf;
+ uint8_t *subsampling_convert_cbbuf;
+ uint8_t *subsampling_convert_crbuf;
+ uint32_t subsampling_convert_ycbcrimagelen;
+ uint8_t **subsampling_convert_ycbcrimage;
+ uint32_t subsampling_convert_clinelenout;
+ uint32_t subsampling_convert_state;
+ uint32_t bytes_per_line; /* if the codec outputs subsampled data, a 'line'
+ in bytes_per_line */
+ uint32_t lines_per_strile; /* and lines_per_strile means subsampling_ver
+ desubsampled rows */
+ OJPEGStateInBufferSource in_buffer_source;
+ uint32_t in_buffer_next_strile;
+ uint32_t in_buffer_strile_count;
+ uint64_t in_buffer_file_pos;
+ uint8_t in_buffer_file_pos_log;
+ uint64_t in_buffer_file_togo;
+ uint16_t in_buffer_togo;
+ uint8_t *in_buffer_cur;
+ uint8_t in_buffer[OJPEG_BUFFER];
+ OJPEGStateOutState out_state;
+ uint8_t out_buffer[OJPEG_BUFFER];
+ uint8_t *skip_buffer;
} OJPEGState;
-static int OJPEGVGetField(TIFF* tif, uint32 tag, va_list ap);
-static int OJPEGVSetField(TIFF* tif, uint32 tag, va_list ap);
-static void OJPEGPrintDir(TIFF* tif, FILE* fd, long flags);
-
-static int OJPEGFixupTags(TIFF* tif);
-static int OJPEGSetupDecode(TIFF* tif);
-static int OJPEGPreDecode(TIFF* tif, uint16 s);
-static int OJPEGPreDecodeSkipRaw(TIFF* tif);
-static int OJPEGPreDecodeSkipScanlines(TIFF* tif);
-static int OJPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s);
-static int OJPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc);
-static int OJPEGDecodeScanlines(TIFF* tif, uint8* buf, tmsize_t cc);
-static void OJPEGPostDecode(TIFF* tif, uint8* buf, tmsize_t cc);
-static int OJPEGSetupEncode(TIFF* tif);
-static int OJPEGPreEncode(TIFF* tif, uint16 s);
-static int OJPEGEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s);
-static int OJPEGPostEncode(TIFF* tif);
-static void OJPEGCleanup(TIFF* tif);
-
-static void OJPEGSubsamplingCorrect(TIFF* tif);
-static int OJPEGReadHeaderInfo(TIFF* tif);
-static int OJPEGReadSecondarySos(TIFF* tif, uint16 s);
-static int OJPEGWriteHeaderInfo(TIFF* tif);
-static void OJPEGLibjpegSessionAbort(TIFF* tif);
-
-static int OJPEGReadHeaderInfoSec(TIFF* tif);
-static int OJPEGReadHeaderInfoSecStreamDri(TIFF* tif);
-static int OJPEGReadHeaderInfoSecStreamDqt(TIFF* tif);
-static int OJPEGReadHeaderInfoSecStreamDht(TIFF* tif);
-static int OJPEGReadHeaderInfoSecStreamSof(TIFF* tif, uint8 marker_id);
-static int OJPEGReadHeaderInfoSecStreamSos(TIFF* tif);
-static int OJPEGReadHeaderInfoSecTablesQTable(TIFF* tif);
-static int OJPEGReadHeaderInfoSecTablesDcTable(TIFF* tif);
-static int OJPEGReadHeaderInfoSecTablesAcTable(TIFF* tif);
-
-static int OJPEGReadBufferFill(OJPEGState* sp);
-static int OJPEGReadByte(OJPEGState* sp, uint8* byte);
-static int OJPEGReadBytePeek(OJPEGState* sp, uint8* byte);
-static void OJPEGReadByteAdvance(OJPEGState* sp);
-static int OJPEGReadWord(OJPEGState* sp, uint16* word);
-static int OJPEGReadBlock(OJPEGState* sp, uint16 len, void* mem);
-static void OJPEGReadSkip(OJPEGState* sp, uint16 len);
-
-static int OJPEGWriteStream(TIFF* tif, void** mem, uint32* len);
-static void OJPEGWriteStreamSoi(TIFF* tif, void** mem, uint32* len);
-static void OJPEGWriteStreamQTable(TIFF* tif, uint8 table_index, void** mem, uint32* len);
-static void OJPEGWriteStreamDcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len);
-static void OJPEGWriteStreamAcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len);
-static void OJPEGWriteStreamDri(TIFF* tif, void** mem, uint32* len);
-static void OJPEGWriteStreamSof(TIFF* tif, void** mem, uint32* len);
-static void OJPEGWriteStreamSos(TIFF* tif, void** mem, uint32* len);
-static int OJPEGWriteStreamCompressed(TIFF* tif, void** mem, uint32* len);
-static void OJPEGWriteStreamRst(TIFF* tif, void** mem, uint32* len);
-static void OJPEGWriteStreamEoi(TIFF* tif, void** mem, uint32* len);
+static int OJPEGVGetField(TIFF *tif, uint32_t tag, va_list ap);
+static int OJPEGVSetField(TIFF *tif, uint32_t tag, va_list ap);
+static void OJPEGPrintDir(TIFF *tif, FILE *fd, long flags);
+
+static int OJPEGFixupTags(TIFF *tif);
+static int OJPEGSetupDecode(TIFF *tif);
+static int OJPEGPreDecode(TIFF *tif, uint16_t s);
+static int OJPEGPreDecodeSkipRaw(TIFF *tif);
+static int OJPEGPreDecodeSkipScanlines(TIFF *tif);
+static int OJPEGDecode(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s);
+static int OJPEGDecodeRaw(TIFF *tif, uint8_t *buf, tmsize_t cc);
+static int OJPEGDecodeScanlines(TIFF *tif, uint8_t *buf, tmsize_t cc);
+static void OJPEGPostDecode(TIFF *tif, uint8_t *buf, tmsize_t cc);
+static int OJPEGSetupEncode(TIFF *tif);
+static int OJPEGPreEncode(TIFF *tif, uint16_t s);
+static int OJPEGEncode(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s);
+static int OJPEGPostEncode(TIFF *tif);
+static void OJPEGCleanup(TIFF *tif);
+
+static void OJPEGSubsamplingCorrect(TIFF *tif);
+static int OJPEGReadHeaderInfo(TIFF *tif);
+static int OJPEGReadSecondarySos(TIFF *tif, uint16_t s);
+static int OJPEGWriteHeaderInfo(TIFF *tif);
+static void OJPEGLibjpegSessionAbort(TIFF *tif);
+
+static int OJPEGReadHeaderInfoSec(TIFF *tif);
+static int OJPEGReadHeaderInfoSecStreamDri(TIFF *tif);
+static int OJPEGReadHeaderInfoSecStreamDqt(TIFF *tif);
+static int OJPEGReadHeaderInfoSecStreamDht(TIFF *tif);
+static int OJPEGReadHeaderInfoSecStreamSof(TIFF *tif, uint8_t marker_id);
+static int OJPEGReadHeaderInfoSecStreamSos(TIFF *tif);
+static int OJPEGReadHeaderInfoSecTablesQTable(TIFF *tif);
+static int OJPEGReadHeaderInfoSecTablesDcTable(TIFF *tif);
+static int OJPEGReadHeaderInfoSecTablesAcTable(TIFF *tif);
+
+static int OJPEGReadBufferFill(OJPEGState *sp);
+static int OJPEGReadByte(OJPEGState *sp, uint8_t *byte);
+static int OJPEGReadBytePeek(OJPEGState *sp, uint8_t *byte);
+static void OJPEGReadByteAdvance(OJPEGState *sp);
+static int OJPEGReadWord(OJPEGState *sp, uint16_t *word);
+static int OJPEGReadBlock(OJPEGState *sp, uint16_t len, void *mem);
+static void OJPEGReadSkip(OJPEGState *sp, uint16_t len);
+
+static int OJPEGWriteStream(TIFF *tif, void **mem, uint32_t *len);
+static void OJPEGWriteStreamSoi(TIFF *tif, void **mem, uint32_t *len);
+static void OJPEGWriteStreamQTable(TIFF *tif, uint8_t table_index, void **mem,
+ uint32_t *len);
+static void OJPEGWriteStreamDcTable(TIFF *tif, uint8_t table_index, void **mem,
+ uint32_t *len);
+static void OJPEGWriteStreamAcTable(TIFF *tif, uint8_t table_index, void **mem,
+ uint32_t *len);
+static void OJPEGWriteStreamDri(TIFF *tif, void **mem, uint32_t *len);
+static void OJPEGWriteStreamSof(TIFF *tif, void **mem, uint32_t *len);
+static void OJPEGWriteStreamSos(TIFF *tif, void **mem, uint32_t *len);
+static int OJPEGWriteStreamCompressed(TIFF *tif, void **mem, uint32_t *len);
+static void OJPEGWriteStreamRst(TIFF *tif, void **mem, uint32_t *len);
+static void OJPEGWriteStreamEoi(TIFF *tif, void **mem, uint32_t *len);
#ifdef LIBJPEG_ENCAP_EXTERNAL
-extern int jpeg_create_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo);
-extern int jpeg_read_header_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, uint8 require_image);
-extern int jpeg_start_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo);
-extern int jpeg_read_scanlines_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* scanlines, uint32 max_lines);
-extern int jpeg_read_raw_data_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* data, uint32 max_lines);
-extern void jpeg_encap_unwind(TIFF* tif);
+extern int jpeg_create_decompress_encap(OJPEGState *sp,
+ jpeg_decompress_struct *cinfo);
+extern int jpeg_read_header_encap(OJPEGState *sp, jpeg_decompress_struct *cinfo,
+ uint8_t require_image);
+extern int jpeg_start_decompress_encap(OJPEGState *sp,
+ jpeg_decompress_struct *cinfo);
+extern int jpeg_read_scanlines_encap(OJPEGState *sp,
+ jpeg_decompress_struct *cinfo,
+ void *scanlines, uint32_t max_lines);
+extern int jpeg_read_raw_data_encap(OJPEGState *sp,
+ jpeg_decompress_struct *cinfo, void *data,
+ uint32_t max_lines);
+extern void jpeg_encap_unwind(TIFF *tif);
#else
-static int jpeg_create_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* j);
-static int jpeg_read_header_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, uint8 require_image);
-static int jpeg_start_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo);
-static int jpeg_read_scanlines_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* scanlines, uint32 max_lines);
-static int jpeg_read_raw_data_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* data, uint32 max_lines);
-static void jpeg_encap_unwind(TIFF* tif);
+static int jpeg_create_decompress_encap(OJPEGState *sp,
+ jpeg_decompress_struct *j);
+static int jpeg_read_header_encap(OJPEGState *sp, jpeg_decompress_struct *cinfo,
+ uint8_t require_image);
+static int jpeg_start_decompress_encap(OJPEGState *sp,
+ jpeg_decompress_struct *cinfo);
+static int jpeg_read_scanlines_encap(OJPEGState *sp,
+ jpeg_decompress_struct *cinfo,
+ void *scanlines, uint32_t max_lines);
+static int jpeg_read_raw_data_encap(OJPEGState *sp,
+ jpeg_decompress_struct *cinfo, void *data,
+ uint32_t max_lines);
+static void jpeg_encap_unwind(TIFF *tif);
#endif
-static void OJPEGLibjpegJpegErrorMgrOutputMessage(jpeg_common_struct* cinfo);
-static void OJPEGLibjpegJpegErrorMgrErrorExit(jpeg_common_struct* cinfo);
-static void OJPEGLibjpegJpegSourceMgrInitSource(jpeg_decompress_struct* cinfo);
-static boolean OJPEGLibjpegJpegSourceMgrFillInputBuffer(jpeg_decompress_struct* cinfo);
-static void OJPEGLibjpegJpegSourceMgrSkipInputData(jpeg_decompress_struct* cinfo, long num_bytes);
-static boolean OJPEGLibjpegJpegSourceMgrResyncToRestart(jpeg_decompress_struct* cinfo, int desired);
-static void OJPEGLibjpegJpegSourceMgrTermSource(jpeg_decompress_struct* cinfo);
-
-int
-TIFFInitOJPEG(TIFF* tif, int scheme)
-{
- static const char module[]="TIFFInitOJPEG";
- OJPEGState* sp;
-
- assert(scheme==COMPRESSION_OJPEG);
-
- /*
- * Merge codec-specific tag information.
- */
- if (!_TIFFMergeFields(tif, ojpegFields, TIFFArrayCount(ojpegFields))) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Merging Old JPEG codec-specific tags failed");
- return 0;
- }
-
- /* state block */
- sp=_TIFFmalloc(sizeof(OJPEGState));
- if (sp==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"No space for OJPEG state block");
- return(0);
- }
- _TIFFmemset(sp,0,sizeof(OJPEGState));
- sp->tif=tif;
- sp->jpeg_proc=1;
- sp->subsampling_hor=2;
- sp->subsampling_ver=2;
- TIFFSetField(tif,TIFFTAG_YCBCRSUBSAMPLING,2,2);
- /* tif codec methods */
- tif->tif_fixuptags=OJPEGFixupTags;
- tif->tif_setupdecode=OJPEGSetupDecode;
- tif->tif_predecode=OJPEGPreDecode;
- tif->tif_postdecode=OJPEGPostDecode;
- tif->tif_decoderow=OJPEGDecode;
- tif->tif_decodestrip=OJPEGDecode;
- tif->tif_decodetile=OJPEGDecode;
- tif->tif_setupencode=OJPEGSetupEncode;
- tif->tif_preencode=OJPEGPreEncode;
- tif->tif_postencode=OJPEGPostEncode;
- tif->tif_encoderow=OJPEGEncode;
- tif->tif_encodestrip=OJPEGEncode;
- tif->tif_encodetile=OJPEGEncode;
- tif->tif_cleanup=OJPEGCleanup;
- tif->tif_data=(uint8*)sp;
- /* tif tag methods */
- sp->vgetparent=tif->tif_tagmethods.vgetfield;
- tif->tif_tagmethods.vgetfield=OJPEGVGetField;
- sp->vsetparent=tif->tif_tagmethods.vsetfield;
- tif->tif_tagmethods.vsetfield=OJPEGVSetField;
- sp->printdir=tif->tif_tagmethods.printdir;
- tif->tif_tagmethods.printdir=OJPEGPrintDir;
- /* Some OJPEG files don't have strip or tile offsets or bytecounts tags.
- Some others do, but have totally meaningless or corrupt values
- in these tags. In these cases, the JpegInterchangeFormat stream is
- reliable. In any case, this decoder reads the compressed data itself,
- from the most reliable locations, and we need to notify encapsulating
- LibTiff not to read raw strips or tiles for us. */
- tif->tif_flags|=TIFF_NOREADRAW;
- return(1);
+static void OJPEGLibjpegJpegErrorMgrOutputMessage(jpeg_common_struct *cinfo);
+static void OJPEGLibjpegJpegErrorMgrErrorExit(jpeg_common_struct *cinfo);
+static void OJPEGLibjpegJpegSourceMgrInitSource(jpeg_decompress_struct *cinfo);
+static boolean
+OJPEGLibjpegJpegSourceMgrFillInputBuffer(jpeg_decompress_struct *cinfo);
+static void
+OJPEGLibjpegJpegSourceMgrSkipInputData(jpeg_decompress_struct *cinfo,
+ long num_bytes);
+static boolean
+OJPEGLibjpegJpegSourceMgrResyncToRestart(jpeg_decompress_struct *cinfo,
+ int desired);
+static void OJPEGLibjpegJpegSourceMgrTermSource(jpeg_decompress_struct *cinfo);
+
+int TIFFInitOJPEG(TIFF *tif, int scheme)
+{
+ static const char module[] = "TIFFInitOJPEG";
+ OJPEGState *sp;
+
+ (void)scheme;
+ assert(scheme == COMPRESSION_OJPEG);
+
+ /*
+ * Merge codec-specific tag information.
+ */
+ if (!_TIFFMergeFields(tif, ojpegFields, TIFFArrayCount(ojpegFields)))
+ {
+ TIFFErrorExtR(tif, module,
+ "Merging Old JPEG codec-specific tags failed");
+ return 0;
+ }
+
+ /* state block */
+ sp = _TIFFmallocExt(tif, sizeof(OJPEGState));
+ if (sp == NULL)
+ {
+ TIFFErrorExtR(tif, module, "No space for OJPEG state block");
+ return (0);
+ }
+ _TIFFmemset(sp, 0, sizeof(OJPEGState));
+ sp->tif = tif;
+ sp->jpeg_proc = 1;
+ sp->subsampling_hor = 2;
+ sp->subsampling_ver = 2;
+ TIFFSetField(tif, TIFFTAG_YCBCRSUBSAMPLING, 2, 2);
+ /* tif codec methods */
+ tif->tif_fixuptags = OJPEGFixupTags;
+ tif->tif_setupdecode = OJPEGSetupDecode;
+ tif->tif_predecode = OJPEGPreDecode;
+ tif->tif_postdecode = OJPEGPostDecode;
+ tif->tif_decoderow = OJPEGDecode;
+ tif->tif_decodestrip = OJPEGDecode;
+ tif->tif_decodetile = OJPEGDecode;
+ tif->tif_setupencode = OJPEGSetupEncode;
+ tif->tif_preencode = OJPEGPreEncode;
+ tif->tif_postencode = OJPEGPostEncode;
+ tif->tif_encoderow = OJPEGEncode;
+ tif->tif_encodestrip = OJPEGEncode;
+ tif->tif_encodetile = OJPEGEncode;
+ tif->tif_cleanup = OJPEGCleanup;
+ tif->tif_data = (uint8_t *)sp;
+ /* tif tag methods */
+ sp->vgetparent = tif->tif_tagmethods.vgetfield;
+ tif->tif_tagmethods.vgetfield = OJPEGVGetField;
+ sp->vsetparent = tif->tif_tagmethods.vsetfield;
+ tif->tif_tagmethods.vsetfield = OJPEGVSetField;
+ sp->printdir = tif->tif_tagmethods.printdir;
+ tif->tif_tagmethods.printdir = OJPEGPrintDir;
+ /* Some OJPEG files don't have strip or tile offsets or bytecounts tags.
+ Some others do, but have totally meaningless or corrupt values
+ in these tags. In these cases, the JpegInterchangeFormat stream is
+ reliable. In any case, this decoder reads the compressed data itself,
+ from the most reliable locations, and we need to notify encapsulating
+ LibTiff not to read raw strips or tiles for us. */
+ tif->tif_flags |= TIFF_NOREADRAW;
+ return (1);
}
-static int
-OJPEGVGetField(TIFF* tif, uint32 tag, va_list ap)
-{
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- switch(tag)
- {
- case TIFFTAG_JPEGIFOFFSET:
- *va_arg(ap,uint64*)=(uint64)sp->jpeg_interchange_format;
- break;
- case TIFFTAG_JPEGIFBYTECOUNT:
- *va_arg(ap,uint64*)=(uint64)sp->jpeg_interchange_format_length;
- break;
- case TIFFTAG_YCBCRSUBSAMPLING:
- if (sp->subsamplingcorrect_done==0)
- OJPEGSubsamplingCorrect(tif);
- *va_arg(ap,uint16*)=(uint16)sp->subsampling_hor;
- *va_arg(ap,uint16*)=(uint16)sp->subsampling_ver;
- break;
- case TIFFTAG_JPEGQTABLES:
- *va_arg(ap,uint32*)=(uint32)sp->qtable_offset_count;
- *va_arg(ap,void**)=(void*)sp->qtable_offset;
- break;
- case TIFFTAG_JPEGDCTABLES:
- *va_arg(ap,uint32*)=(uint32)sp->dctable_offset_count;
- *va_arg(ap,void**)=(void*)sp->dctable_offset;
- break;
- case TIFFTAG_JPEGACTABLES:
- *va_arg(ap,uint32*)=(uint32)sp->actable_offset_count;
- *va_arg(ap,void**)=(void*)sp->actable_offset;
- break;
- case TIFFTAG_JPEGPROC:
- *va_arg(ap,uint16*)=(uint16)sp->jpeg_proc;
- break;
- case TIFFTAG_JPEGRESTARTINTERVAL:
- *va_arg(ap,uint16*)=sp->restart_interval;
- break;
- default:
- return (*sp->vgetparent)(tif,tag,ap);
- }
- return (1);
+static int OJPEGVGetField(TIFF *tif, uint32_t tag, va_list ap)
+{
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ switch (tag)
+ {
+ case TIFFTAG_JPEGIFOFFSET:
+ *va_arg(ap, uint64_t *) = (uint64_t)sp->jpeg_interchange_format;
+ break;
+ case TIFFTAG_JPEGIFBYTECOUNT:
+ *va_arg(ap, uint64_t *) =
+ (uint64_t)sp->jpeg_interchange_format_length;
+ break;
+ case TIFFTAG_YCBCRSUBSAMPLING:
+ if (sp->subsamplingcorrect_done == 0)
+ OJPEGSubsamplingCorrect(tif);
+ *va_arg(ap, uint16_t *) = (uint16_t)sp->subsampling_hor;
+ *va_arg(ap, uint16_t *) = (uint16_t)sp->subsampling_ver;
+ break;
+ case TIFFTAG_JPEGQTABLES:
+ *va_arg(ap, uint32_t *) = (uint32_t)sp->qtable_offset_count;
+ *va_arg(ap, const void **) = (const void *)sp->qtable_offset;
+ break;
+ case TIFFTAG_JPEGDCTABLES:
+ *va_arg(ap, uint32_t *) = (uint32_t)sp->dctable_offset_count;
+ *va_arg(ap, const void **) = (const void *)sp->dctable_offset;
+ break;
+ case TIFFTAG_JPEGACTABLES:
+ *va_arg(ap, uint32_t *) = (uint32_t)sp->actable_offset_count;
+ *va_arg(ap, const void **) = (const void *)sp->actable_offset;
+ break;
+ case TIFFTAG_JPEGPROC:
+ *va_arg(ap, uint16_t *) = (uint16_t)sp->jpeg_proc;
+ break;
+ case TIFFTAG_JPEGRESTARTINTERVAL:
+ *va_arg(ap, uint16_t *) = sp->restart_interval;
+ break;
+ default:
+ return (*sp->vgetparent)(tif, tag, ap);
+ }
+ return (1);
}
-static int
-OJPEGVSetField(TIFF* tif, uint32 tag, va_list ap)
-{
- static const char module[]="OJPEGVSetField";
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- uint32 ma;
- uint64* mb;
- uint32 n;
- const TIFFField* fip;
-
- switch(tag)
- {
- case TIFFTAG_JPEGIFOFFSET:
- sp->jpeg_interchange_format=(uint64)va_arg(ap,uint64);
- break;
- case TIFFTAG_JPEGIFBYTECOUNT:
- sp->jpeg_interchange_format_length=(uint64)va_arg(ap,uint64);
- break;
- case TIFFTAG_YCBCRSUBSAMPLING:
- sp->subsampling_tag=1;
- sp->subsampling_hor=(uint8)va_arg(ap,uint16_vap);
- sp->subsampling_ver=(uint8)va_arg(ap,uint16_vap);
- tif->tif_dir.td_ycbcrsubsampling[0]=sp->subsampling_hor;
- tif->tif_dir.td_ycbcrsubsampling[1]=sp->subsampling_ver;
- break;
- case TIFFTAG_JPEGQTABLES:
- ma=(uint32)va_arg(ap,uint32);
- if (ma!=0)
- {
- if (ma>3)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"JpegQTables tag has incorrect count");
- return(0);
- }
- sp->qtable_offset_count=(uint8)ma;
- mb=(uint64*)va_arg(ap,uint64*);
- for (n=0; n<ma; n++)
- sp->qtable_offset[n]=mb[n];
- }
- break;
- case TIFFTAG_JPEGDCTABLES:
- ma=(uint32)va_arg(ap,uint32);
- if (ma!=0)
- {
- if (ma>3)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"JpegDcTables tag has incorrect count");
- return(0);
- }
- sp->dctable_offset_count=(uint8)ma;
- mb=(uint64*)va_arg(ap,uint64*);
- for (n=0; n<ma; n++)
- sp->dctable_offset[n]=mb[n];
- }
- break;
- case TIFFTAG_JPEGACTABLES:
- ma=(uint32)va_arg(ap,uint32);
- if (ma!=0)
- {
- if (ma>3)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"JpegAcTables tag has incorrect count");
- return(0);
- }
- sp->actable_offset_count=(uint8)ma;
- mb=(uint64*)va_arg(ap,uint64*);
- for (n=0; n<ma; n++)
- sp->actable_offset[n]=mb[n];
- }
- break;
- case TIFFTAG_JPEGPROC:
- sp->jpeg_proc=(uint8)va_arg(ap,uint16_vap);
- break;
- case TIFFTAG_JPEGRESTARTINTERVAL:
- sp->restart_interval=(uint16)va_arg(ap,uint16_vap);
- break;
- default:
- return (*sp->vsetparent)(tif,tag,ap);
- }
- fip = TIFFFieldWithTag(tif,tag);
- if( fip == NULL ) /* shouldn't happen */
- return(0);
- TIFFSetFieldBit(tif,fip->field_bit);
- tif->tif_flags|=TIFF_DIRTYDIRECT;
- return(1);
+static int OJPEGVSetField(TIFF *tif, uint32_t tag, va_list ap)
+{
+ static const char module[] = "OJPEGVSetField";
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ uint32_t ma;
+ uint64_t *mb;
+ uint32_t n;
+ const TIFFField *fip;
+
+ switch (tag)
+ {
+ case TIFFTAG_JPEGIFOFFSET:
+ sp->jpeg_interchange_format = (uint64_t)va_arg(ap, uint64_t);
+ break;
+ case TIFFTAG_JPEGIFBYTECOUNT:
+ sp->jpeg_interchange_format_length = (uint64_t)va_arg(ap, uint64_t);
+ break;
+ case TIFFTAG_YCBCRSUBSAMPLING:
+ sp->subsampling_tag = 1;
+ sp->subsampling_hor = (uint8_t)va_arg(ap, uint16_vap);
+ sp->subsampling_ver = (uint8_t)va_arg(ap, uint16_vap);
+ tif->tif_dir.td_ycbcrsubsampling[0] = sp->subsampling_hor;
+ tif->tif_dir.td_ycbcrsubsampling[1] = sp->subsampling_ver;
+ break;
+ case TIFFTAG_JPEGQTABLES:
+ ma = (uint32_t)va_arg(ap, uint32_t);
+ if (ma != 0)
+ {
+ if (ma > 3)
+ {
+ TIFFErrorExtR(tif, module,
+ "JpegQTables tag has incorrect count");
+ return (0);
+ }
+ sp->qtable_offset_count = (uint8_t)ma;
+ mb = (uint64_t *)va_arg(ap, uint64_t *);
+ for (n = 0; n < ma; n++)
+ sp->qtable_offset[n] = mb[n];
+ }
+ break;
+ case TIFFTAG_JPEGDCTABLES:
+ ma = (uint32_t)va_arg(ap, uint32_t);
+ if (ma != 0)
+ {
+ if (ma > 3)
+ {
+ TIFFErrorExtR(tif, module,
+ "JpegDcTables tag has incorrect count");
+ return (0);
+ }
+ sp->dctable_offset_count = (uint8_t)ma;
+ mb = (uint64_t *)va_arg(ap, uint64_t *);
+ for (n = 0; n < ma; n++)
+ sp->dctable_offset[n] = mb[n];
+ }
+ break;
+ case TIFFTAG_JPEGACTABLES:
+ ma = (uint32_t)va_arg(ap, uint32_t);
+ if (ma != 0)
+ {
+ if (ma > 3)
+ {
+ TIFFErrorExtR(tif, module,
+ "JpegAcTables tag has incorrect count");
+ return (0);
+ }
+ sp->actable_offset_count = (uint8_t)ma;
+ mb = (uint64_t *)va_arg(ap, uint64_t *);
+ for (n = 0; n < ma; n++)
+ sp->actable_offset[n] = mb[n];
+ }
+ break;
+ case TIFFTAG_JPEGPROC:
+ sp->jpeg_proc = (uint8_t)va_arg(ap, uint16_vap);
+ break;
+ case TIFFTAG_JPEGRESTARTINTERVAL:
+ sp->restart_interval = (uint16_t)va_arg(ap, uint16_vap);
+ break;
+ default:
+ return (*sp->vsetparent)(tif, tag, ap);
+ }
+ fip = TIFFFieldWithTag(tif, tag);
+ if (fip == NULL) /* shouldn't happen */
+ return (0);
+ TIFFSetFieldBit(tif, fip->field_bit);
+ tif->tif_flags |= TIFF_DIRTYDIRECT;
+ return (1);
}
-static void
-OJPEGPrintDir(TIFF* tif, FILE* fd, long flags)
-{
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- uint8 m;
- (void)flags;
- assert(sp!=NULL);
- if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGINTERCHANGEFORMAT))
- fprintf(fd," JpegInterchangeFormat: " TIFF_UINT64_FORMAT "\n",(TIFF_UINT64_T)sp->jpeg_interchange_format);
- if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH))
- fprintf(fd," JpegInterchangeFormatLength: " TIFF_UINT64_FORMAT "\n",(TIFF_UINT64_T)sp->jpeg_interchange_format_length);
- if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGQTABLES))
- {
- fprintf(fd," JpegQTables:");
- for (m=0; m<sp->qtable_offset_count; m++)
- fprintf(fd," " TIFF_UINT64_FORMAT,(TIFF_UINT64_T)sp->qtable_offset[m]);
- fprintf(fd,"\n");
- }
- if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGDCTABLES))
- {
- fprintf(fd," JpegDcTables:");
- for (m=0; m<sp->dctable_offset_count; m++)
- fprintf(fd," " TIFF_UINT64_FORMAT,(TIFF_UINT64_T)sp->dctable_offset[m]);
- fprintf(fd,"\n");
- }
- if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGACTABLES))
- {
- fprintf(fd," JpegAcTables:");
- for (m=0; m<sp->actable_offset_count; m++)
- fprintf(fd," " TIFF_UINT64_FORMAT,(TIFF_UINT64_T)sp->actable_offset[m]);
- fprintf(fd,"\n");
- }
- if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGPROC))
- fprintf(fd," JpegProc: %u\n",(unsigned int)sp->jpeg_proc);
- if (TIFFFieldSet(tif,FIELD_OJPEG_JPEGRESTARTINTERVAL))
- fprintf(fd," JpegRestartInterval: %u\n",(unsigned int)sp->restart_interval);
- if (sp->printdir)
- (*sp->printdir)(tif, fd, flags);
+static void OJPEGPrintDir(TIFF *tif, FILE *fd, long flags)
+{
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ uint8_t m;
+ (void)flags;
+ assert(sp != NULL);
+ if (TIFFFieldSet(tif, FIELD_OJPEG_JPEGINTERCHANGEFORMAT))
+ fprintf(fd, " JpegInterchangeFormat: %" PRIu64 "\n",
+ (uint64_t)sp->jpeg_interchange_format);
+ if (TIFFFieldSet(tif, FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH))
+ fprintf(fd, " JpegInterchangeFormatLength: %" PRIu64 "\n",
+ (uint64_t)sp->jpeg_interchange_format_length);
+ if (TIFFFieldSet(tif, FIELD_OJPEG_JPEGQTABLES))
+ {
+ fprintf(fd, " JpegQTables:");
+ for (m = 0; m < sp->qtable_offset_count; m++)
+ fprintf(fd, " %" PRIu64, (uint64_t)sp->qtable_offset[m]);
+ fprintf(fd, "\n");
+ }
+ if (TIFFFieldSet(tif, FIELD_OJPEG_JPEGDCTABLES))
+ {
+ fprintf(fd, " JpegDcTables:");
+ for (m = 0; m < sp->dctable_offset_count; m++)
+ fprintf(fd, " %" PRIu64, (uint64_t)sp->dctable_offset[m]);
+ fprintf(fd, "\n");
+ }
+ if (TIFFFieldSet(tif, FIELD_OJPEG_JPEGACTABLES))
+ {
+ fprintf(fd, " JpegAcTables:");
+ for (m = 0; m < sp->actable_offset_count; m++)
+ fprintf(fd, " %" PRIu64, (uint64_t)sp->actable_offset[m]);
+ fprintf(fd, "\n");
+ }
+ if (TIFFFieldSet(tif, FIELD_OJPEG_JPEGPROC))
+ fprintf(fd, " JpegProc: %" PRIu8 "\n", sp->jpeg_proc);
+ if (TIFFFieldSet(tif, FIELD_OJPEG_JPEGRESTARTINTERVAL))
+ fprintf(fd, " JpegRestartInterval: %" PRIu16 "\n",
+ sp->restart_interval);
+ if (sp->printdir)
+ (*sp->printdir)(tif, fd, flags);
}
-static int
-OJPEGFixupTags(TIFF* tif)
+static int OJPEGFixupTags(TIFF *tif)
{
- (void) tif;
- return(1);
+ (void)tif;
+ return (1);
}
-static int
-OJPEGSetupDecode(TIFF* tif)
+static int OJPEGSetupDecode(TIFF *tif)
{
- static const char module[]="OJPEGSetupDecode";
- TIFFWarningExt(tif->tif_clientdata,module,"Depreciated and troublesome old-style JPEG compression mode, please convert to new-style JPEG compression and notify vendor of writing software");
- return(1);
+ static const char module[] = "OJPEGSetupDecode";
+ TIFFWarningExtR(tif, module,
+ "Deprecated and troublesome old-style JPEG compression "
+ "mode, please convert to new-style JPEG compression and "
+ "notify vendor of writing software");
+ return (1);
}
-static int
-OJPEGPreDecode(TIFF* tif, uint16 s)
-{
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- uint32 m;
- if (sp->subsamplingcorrect_done==0)
- OJPEGSubsamplingCorrect(tif);
- if (sp->readheader_done==0)
- {
- if (OJPEGReadHeaderInfo(tif)==0)
- return(0);
- }
- if (sp->sos_end[s].log==0)
- {
- if (OJPEGReadSecondarySos(tif,s)==0)
- return(0);
- }
- if (isTiled(tif))
- m=tif->tif_curtile;
- else
- m=tif->tif_curstrip;
- if ((sp->writeheader_done!=0) && ((sp->write_cursample!=s) || (sp->write_curstrile>m)))
- {
- if (sp->libjpeg_session_active!=0)
- OJPEGLibjpegSessionAbort(tif);
- sp->writeheader_done=0;
- }
- if (sp->writeheader_done==0)
- {
- sp->plane_sample_offset=(uint8)s;
- sp->write_cursample=s;
- sp->write_curstrile=s*tif->tif_dir.td_stripsperimage;
- if ((sp->in_buffer_file_pos_log==0) ||
- (sp->in_buffer_file_pos-sp->in_buffer_togo!=sp->sos_end[s].in_buffer_file_pos))
- {
- sp->in_buffer_source=sp->sos_end[s].in_buffer_source;
- sp->in_buffer_next_strile=sp->sos_end[s].in_buffer_next_strile;
- sp->in_buffer_file_pos=sp->sos_end[s].in_buffer_file_pos;
- sp->in_buffer_file_pos_log=0;
- sp->in_buffer_file_togo=sp->sos_end[s].in_buffer_file_togo;
- sp->in_buffer_togo=0;
- sp->in_buffer_cur=0;
- }
- if (OJPEGWriteHeaderInfo(tif)==0)
- return(0);
- }
- while (sp->write_curstrile<m)
- {
- if (sp->libjpeg_jpeg_query_style==0)
- {
- if (OJPEGPreDecodeSkipRaw(tif)==0)
- return(0);
- }
- else
- {
- if (OJPEGPreDecodeSkipScanlines(tif)==0)
- return(0);
- }
- sp->write_curstrile++;
- }
- sp->decoder_ok = 1;
- return(1);
+static int OJPEGPreDecode(TIFF *tif, uint16_t s)
+{
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ uint32_t m;
+ if (sp->subsamplingcorrect_done == 0)
+ OJPEGSubsamplingCorrect(tif);
+ if (sp->readheader_done == 0)
+ {
+ if (OJPEGReadHeaderInfo(tif) == 0)
+ return (0);
+ }
+ if (sp->sos_end[s].log == 0)
+ {
+ if (OJPEGReadSecondarySos(tif, s) == 0)
+ return (0);
+ }
+ if (isTiled(tif))
+ m = tif->tif_curtile;
+ else
+ m = tif->tif_curstrip;
+ if ((sp->writeheader_done != 0) &&
+ ((sp->write_cursample != s) || (sp->write_curstrile > m)))
+ {
+ if (sp->libjpeg_session_active != 0)
+ OJPEGLibjpegSessionAbort(tif);
+ sp->writeheader_done = 0;
+ }
+ if (sp->writeheader_done == 0)
+ {
+ sp->plane_sample_offset = (uint8_t)s;
+ sp->write_cursample = s;
+ sp->write_curstrile = s * tif->tif_dir.td_stripsperimage;
+ if ((sp->in_buffer_file_pos_log == 0) ||
+ (sp->in_buffer_file_pos - sp->in_buffer_togo !=
+ sp->sos_end[s].in_buffer_file_pos))
+ {
+ sp->in_buffer_source = sp->sos_end[s].in_buffer_source;
+ sp->in_buffer_next_strile = sp->sos_end[s].in_buffer_next_strile;
+ sp->in_buffer_file_pos = sp->sos_end[s].in_buffer_file_pos;
+ sp->in_buffer_file_pos_log = 0;
+ sp->in_buffer_file_togo = sp->sos_end[s].in_buffer_file_togo;
+ sp->in_buffer_togo = 0;
+ sp->in_buffer_cur = 0;
+ }
+ if (OJPEGWriteHeaderInfo(tif) == 0)
+ return (0);
+ }
+ while (sp->write_curstrile < m)
+ {
+ if (sp->libjpeg_jpeg_query_style == 0)
+ {
+ if (OJPEGPreDecodeSkipRaw(tif) == 0)
+ return (0);
+ }
+ else
+ {
+ if (OJPEGPreDecodeSkipScanlines(tif) == 0)
+ return (0);
+ }
+ sp->write_curstrile++;
+ }
+ sp->decoder_ok = 1;
+ return (1);
}
-static int
-OJPEGPreDecodeSkipRaw(TIFF* tif)
-{
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- uint32 m;
- m=sp->lines_per_strile;
- if (sp->subsampling_convert_state!=0)
- {
- if (sp->subsampling_convert_clines-sp->subsampling_convert_state>=m)
- {
- sp->subsampling_convert_state+=m;
- if (sp->subsampling_convert_state==sp->subsampling_convert_clines)
- sp->subsampling_convert_state=0;
- return(1);
- }
- m-=sp->subsampling_convert_clines-sp->subsampling_convert_state;
- sp->subsampling_convert_state=0;
- sp->error_in_raw_data_decoding=0;
- }
- while (m>=sp->subsampling_convert_clines)
- {
- if (jpeg_read_raw_data_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),sp->subsampling_convert_ycbcrimage,sp->subsampling_ver*8)==0)
- return(0);
- m-=sp->subsampling_convert_clines;
- }
- if (m>0)
- {
- if (jpeg_read_raw_data_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),sp->subsampling_convert_ycbcrimage,sp->subsampling_ver*8)==0)
- return(0);
- sp->subsampling_convert_state=m;
- }
- return(1);
+static int OJPEGPreDecodeSkipRaw(TIFF *tif)
+{
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ uint32_t m;
+ m = sp->lines_per_strile;
+ if (sp->subsampling_convert_state != 0)
+ {
+ if (sp->subsampling_convert_clines - sp->subsampling_convert_state >= m)
+ {
+ sp->subsampling_convert_state += m;
+ if (sp->subsampling_convert_state == sp->subsampling_convert_clines)
+ sp->subsampling_convert_state = 0;
+ return (1);
+ }
+ m -= sp->subsampling_convert_clines - sp->subsampling_convert_state;
+ sp->subsampling_convert_state = 0;
+ sp->error_in_raw_data_decoding = 0;
+ }
+ while (m >= sp->subsampling_convert_clines)
+ {
+ if (jpeg_read_raw_data_encap(sp, &(sp->libjpeg_jpeg_decompress_struct),
+ sp->subsampling_convert_ycbcrimage,
+ sp->subsampling_ver * 8) == 0)
+ return (0);
+ m -= sp->subsampling_convert_clines;
+ }
+ if (m > 0)
+ {
+ if (jpeg_read_raw_data_encap(sp, &(sp->libjpeg_jpeg_decompress_struct),
+ sp->subsampling_convert_ycbcrimage,
+ sp->subsampling_ver * 8) == 0)
+ return (0);
+ sp->subsampling_convert_state = m;
+ }
+ return (1);
+}
+
+static int OJPEGPreDecodeSkipScanlines(TIFF *tif)
+{
+ static const char module[] = "OJPEGPreDecodeSkipScanlines";
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ uint32_t m;
+ if (sp->skip_buffer == NULL)
+ {
+ sp->skip_buffer = _TIFFmallocExt(tif, sp->bytes_per_line);
+ if (sp->skip_buffer == NULL)
+ {
+ TIFFErrorExtR(tif, module, "Out of memory");
+ return (0);
+ }
+ }
+ for (m = 0; m < sp->lines_per_strile; m++)
+ {
+ if (jpeg_read_scanlines_encap(sp, &(sp->libjpeg_jpeg_decompress_struct),
+ &sp->skip_buffer, 1) == 0)
+ return (0);
+ }
+ return (1);
}
-static int
-OJPEGPreDecodeSkipScanlines(TIFF* tif)
-{
- static const char module[]="OJPEGPreDecodeSkipScanlines";
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- uint32 m;
- if (sp->skip_buffer==NULL)
- {
- sp->skip_buffer=_TIFFmalloc(sp->bytes_per_line);
- if (sp->skip_buffer==NULL)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- }
- for (m=0; m<sp->lines_per_strile; m++)
- {
- if (jpeg_read_scanlines_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),&sp->skip_buffer,1)==0)
- return(0);
- }
- return(1);
+static int OJPEGDecode(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s)
+{
+ static const char module[] = "OJPEGDecode";
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ (void)s;
+ if (!sp->decoder_ok)
+ {
+ TIFFErrorExtR(tif, module,
+ "Cannot decode: decoder not correctly initialized");
+ return 0;
+ }
+ if (sp->libjpeg_session_active == 0)
+ {
+ /* This should normally not happen, except that it does when */
+ /* using TIFFReadScanline() which calls OJPEGPostDecode() for */
+ /* each scanline, which assumes that a whole strile was read */
+ /* and may thus incorrectly consider it has read the whole image,
+ * causing */
+ /* OJPEGLibjpegSessionAbort() to be called prematurely. */
+ /* Triggered by https://gitlab.com/libtiff/libtiff/-/issues/337 */
+ TIFFErrorExtR(tif, module,
+ "Cannot decode: libjpeg_session_active == 0");
+ return 0;
+ }
+ if (sp->error_in_raw_data_decoding)
+ {
+ return 0;
+ }
+ if (sp->libjpeg_jpeg_query_style == 0)
+ {
+ if (OJPEGDecodeRaw(tif, buf, cc) == 0)
+ return (0);
+ }
+ else
+ {
+ if (OJPEGDecodeScanlines(tif, buf, cc) == 0)
+ return (0);
+ }
+ return (1);
}
-static int
-OJPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
+static int OJPEGDecodeRaw(TIFF *tif, uint8_t *buf, tmsize_t cc)
{
- static const char module[]="OJPEGDecode";
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- (void)s;
- if( !sp->decoder_ok )
+ static const char module[] = "OJPEGDecodeRaw";
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ uint8_t *m;
+ tmsize_t n;
+ uint8_t *oy;
+ uint8_t *ocb;
+ uint8_t *ocr;
+ uint8_t *p;
+ uint32_t q;
+ uint8_t *r;
+ uint8_t sx, sy;
+ if (cc % sp->bytes_per_line != 0)
+ {
+ TIFFErrorExtR(tif, module, "Fractional scanline not read");
+ return (0);
+ }
+ assert(cc > 0);
+ m = buf;
+ n = cc;
+ do
+ {
+ if (sp->subsampling_convert_state == 0)
{
- TIFFErrorExt(tif->tif_clientdata,module,"Cannot decode: decoder not correctly initialized");
- return 0;
+ if (jpeg_read_raw_data_encap(sp,
+ &(sp->libjpeg_jpeg_decompress_struct),
+ sp->subsampling_convert_ycbcrimage,
+ sp->subsampling_ver * 8) == 0)
+ {
+ sp->error_in_raw_data_decoding = 1;
+ return (0);
+ }
}
- if( sp->error_in_raw_data_decoding )
+ oy = sp->subsampling_convert_ybuf +
+ sp->subsampling_convert_state * sp->subsampling_ver *
+ sp->subsampling_convert_ylinelen;
+ ocb = sp->subsampling_convert_cbbuf +
+ sp->subsampling_convert_state * sp->subsampling_convert_clinelen;
+ ocr = sp->subsampling_convert_crbuf +
+ sp->subsampling_convert_state * sp->subsampling_convert_clinelen;
+ p = m;
+ for (q = 0; q < sp->subsampling_convert_clinelenout; q++)
{
- return 0;
+ r = oy;
+ for (sy = 0; sy < sp->subsampling_ver; sy++)
+ {
+ for (sx = 0; sx < sp->subsampling_hor; sx++)
+ *p++ = *r++;
+ r += sp->subsampling_convert_ylinelen - sp->subsampling_hor;
+ }
+ oy += sp->subsampling_hor;
+ *p++ = *ocb++;
+ *p++ = *ocr++;
}
- if (sp->libjpeg_jpeg_query_style==0)
- {
- if (OJPEGDecodeRaw(tif,buf,cc)==0)
- return(0);
- }
- else
- {
- if (OJPEGDecodeScanlines(tif,buf,cc)==0)
- return(0);
- }
- return(1);
+ sp->subsampling_convert_state++;
+ if (sp->subsampling_convert_state == sp->subsampling_convert_clines)
+ sp->subsampling_convert_state = 0;
+ m += sp->bytes_per_line;
+ n -= sp->bytes_per_line;
+ } while (n > 0);
+ return (1);
}
-static int
-OJPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc)
-{
- static const char module[]="OJPEGDecodeRaw";
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- uint8* m;
- tmsize_t n;
- uint8* oy;
- uint8* ocb;
- uint8* ocr;
- uint8* p;
- uint32 q;
- uint8* r;
- uint8 sx,sy;
- if (cc%sp->bytes_per_line!=0)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Fractional scanline not read");
- return(0);
- }
- assert(cc>0);
- m=buf;
- n=cc;
- do
- {
- if (sp->subsampling_convert_state==0)
- {
- const jpeg_decompress_struct* cinfo = &sp->libjpeg_jpeg_decompress_struct;
- int width = 0;
- int last_col_width = 0;
- int jpeg_bytes;
- int expected_bytes;
- int i;
- if (cinfo->MCUs_per_row == 0)
- {
- sp->error_in_raw_data_decoding = 1;
- return 0;
- }
- for (i = 0; i < cinfo->comps_in_scan; ++i)
- {
- const jpeg_component_info* info = cinfo->cur_comp_info[i];
-#if JPEG_LIB_VERSION >= 70
- width += info->MCU_width * info->DCT_h_scaled_size;
- last_col_width += info->last_col_width * info->DCT_h_scaled_size;
-#else
- width += info->MCU_width * info->DCT_scaled_size;
- last_col_width += info->last_col_width * info->DCT_scaled_size;
-#endif
- }
- jpeg_bytes = (cinfo->MCUs_per_row - 1) * width + last_col_width;
- expected_bytes = sp->subsampling_convert_clinelenout * sp->subsampling_ver * sp->subsampling_hor;
- if (jpeg_bytes != expected_bytes)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Inconsistent number of MCU in codestream");
- sp->error_in_raw_data_decoding = 1;
- return(0);
- }
- if (jpeg_read_raw_data_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),sp->subsampling_convert_ycbcrimage,sp->subsampling_ver*8)==0)
- {
- sp->error_in_raw_data_decoding = 1;
- return(0);
- }
- }
- oy=sp->subsampling_convert_ybuf+sp->subsampling_convert_state*sp->subsampling_ver*sp->subsampling_convert_ylinelen;
- ocb=sp->subsampling_convert_cbbuf+sp->subsampling_convert_state*sp->subsampling_convert_clinelen;
- ocr=sp->subsampling_convert_crbuf+sp->subsampling_convert_state*sp->subsampling_convert_clinelen;
- p=m;
- for (q=0; q<sp->subsampling_convert_clinelenout; q++)
- {
- r=oy;
- for (sy=0; sy<sp->subsampling_ver; sy++)
- {
- for (sx=0; sx<sp->subsampling_hor; sx++)
- *p++=*r++;
- r+=sp->subsampling_convert_ylinelen-sp->subsampling_hor;
- }
- oy+=sp->subsampling_hor;
- *p++=*ocb++;
- *p++=*ocr++;
- }
- sp->subsampling_convert_state++;
- if (sp->subsampling_convert_state==sp->subsampling_convert_clines)
- sp->subsampling_convert_state=0;
- m+=sp->bytes_per_line;
- n-=sp->bytes_per_line;
- } while(n>0);
- return(1);
-}
-
-static int
-OJPEGDecodeScanlines(TIFF* tif, uint8* buf, tmsize_t cc)
-{
- static const char module[]="OJPEGDecodeScanlines";
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- uint8* m;
- tmsize_t n;
- if (cc%sp->bytes_per_line!=0)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Fractional scanline not read");
- return(0);
- }
- assert(cc>0);
- m=buf;
- n=cc;
- do
- {
- if (jpeg_read_scanlines_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),&m,1)==0)
- return(0);
- m+=sp->bytes_per_line;
- n-=sp->bytes_per_line;
- } while(n>0);
- return(1);
+static int OJPEGDecodeScanlines(TIFF *tif, uint8_t *buf, tmsize_t cc)
+{
+ static const char module[] = "OJPEGDecodeScanlines";
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ uint8_t *m;
+ tmsize_t n;
+ if (cc % sp->bytes_per_line != 0)
+ {
+ TIFFErrorExtR(tif, module, "Fractional scanline not read");
+ return (0);
+ }
+ assert(cc > 0);
+ m = buf;
+ n = cc;
+ do
+ {
+ if (jpeg_read_scanlines_encap(sp, &(sp->libjpeg_jpeg_decompress_struct),
+ &m, 1) == 0)
+ return (0);
+ m += sp->bytes_per_line;
+ n -= sp->bytes_per_line;
+ } while (n > 0);
+ return (1);
}
-static void
-OJPEGPostDecode(TIFF* tif, uint8* buf, tmsize_t cc)
-{
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- (void)buf;
- (void)cc;
- sp->write_curstrile++;
- if (sp->write_curstrile%tif->tif_dir.td_stripsperimage==0)
- {
- assert(sp->libjpeg_session_active!=0);
- OJPEGLibjpegSessionAbort(tif);
- sp->writeheader_done=0;
- }
+static void OJPEGPostDecode(TIFF *tif, uint8_t *buf, tmsize_t cc)
+{
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ (void)buf;
+ (void)cc;
+ /* This function somehow incorrectly assumes that a whole strile was read,
+ */
+ /* which is not true when TIFFReadScanline() is called, */
+ /* and may thus incorrectly consider it has read the whole image, causing */
+ /* OJPEGLibjpegSessionAbort() to be called prematurely. */
+ /* So this logic should be fixed to take into account cc, or disable */
+ /* the scan line reading interface. */
+ /* Triggered by https://gitlab.com/libtiff/libtiff/-/issues/337 */
+ sp->write_curstrile++;
+ if (sp->write_curstrile % tif->tif_dir.td_stripsperimage == 0)
+ {
+ assert(sp->libjpeg_session_active != 0);
+ OJPEGLibjpegSessionAbort(tif);
+ sp->writeheader_done = 0;
+ }
}
-static int
-OJPEGSetupEncode(TIFF* tif)
+static int OJPEGSetupEncode(TIFF *tif)
{
- static const char module[]="OJPEGSetupEncode";
- TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; use new-style JPEG compression instead");
- return(0);
+ static const char module[] = "OJPEGSetupEncode";
+ TIFFErrorExtR(
+ tif, module,
+ "OJPEG encoding not supported; use new-style JPEG compression instead");
+ return (0);
}
-static int
-OJPEGPreEncode(TIFF* tif, uint16 s)
+static int OJPEGPreEncode(TIFF *tif, uint16_t s)
{
- static const char module[]="OJPEGPreEncode";
- (void)s;
- TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; use new-style JPEG compression instead");
- return(0);
+ static const char module[] = "OJPEGPreEncode";
+ (void)s;
+ TIFFErrorExtR(
+ tif, module,
+ "OJPEG encoding not supported; use new-style JPEG compression instead");
+ return (0);
}
-static int
-OJPEGEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
+static int OJPEGEncode(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s)
{
- static const char module[]="OJPEGEncode";
- (void)buf;
- (void)cc;
- (void)s;
- TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; use new-style JPEG compression instead");
- return(0);
+ static const char module[] = "OJPEGEncode";
+ (void)buf;
+ (void)cc;
+ (void)s;
+ TIFFErrorExtR(
+ tif, module,
+ "OJPEG encoding not supported; use new-style JPEG compression instead");
+ return (0);
}
-static int
-OJPEGPostEncode(TIFF* tif)
+static int OJPEGPostEncode(TIFF *tif)
{
- static const char module[]="OJPEGPostEncode";
- TIFFErrorExt(tif->tif_clientdata,module,"OJPEG encoding not supported; use new-style JPEG compression instead");
- return(0);
+ static const char module[] = "OJPEGPostEncode";
+ TIFFErrorExtR(
+ tif, module,
+ "OJPEG encoding not supported; use new-style JPEG compression instead");
+ return (0);
}
-static void
-OJPEGCleanup(TIFF* tif)
-{
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- if (sp!=0)
- {
- tif->tif_tagmethods.vgetfield=sp->vgetparent;
- tif->tif_tagmethods.vsetfield=sp->vsetparent;
- tif->tif_tagmethods.printdir=sp->printdir;
- if (sp->qtable[0]!=0)
- _TIFFfree(sp->qtable[0]);
- if (sp->qtable[1]!=0)
- _TIFFfree(sp->qtable[1]);
- if (sp->qtable[2]!=0)
- _TIFFfree(sp->qtable[2]);
- if (sp->qtable[3]!=0)
- _TIFFfree(sp->qtable[3]);
- if (sp->dctable[0]!=0)
- _TIFFfree(sp->dctable[0]);
- if (sp->dctable[1]!=0)
- _TIFFfree(sp->dctable[1]);
- if (sp->dctable[2]!=0)
- _TIFFfree(sp->dctable[2]);
- if (sp->dctable[3]!=0)
- _TIFFfree(sp->dctable[3]);
- if (sp->actable[0]!=0)
- _TIFFfree(sp->actable[0]);
- if (sp->actable[1]!=0)
- _TIFFfree(sp->actable[1]);
- if (sp->actable[2]!=0)
- _TIFFfree(sp->actable[2]);
- if (sp->actable[3]!=0)
- _TIFFfree(sp->actable[3]);
- if (sp->libjpeg_session_active!=0)
- OJPEGLibjpegSessionAbort(tif);
- if (sp->subsampling_convert_ycbcrbuf!=0)
- _TIFFfree(sp->subsampling_convert_ycbcrbuf);
- if (sp->subsampling_convert_ycbcrimage!=0)
- _TIFFfree(sp->subsampling_convert_ycbcrimage);
- if (sp->skip_buffer!=0)
- _TIFFfree(sp->skip_buffer);
- _TIFFfree(sp);
- tif->tif_data=NULL;
- _TIFFSetDefaultCompressionState(tif);
- }
+static void OJPEGCleanup(TIFF *tif)
+{
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ if (sp != 0)
+ {
+ tif->tif_tagmethods.vgetfield = sp->vgetparent;
+ tif->tif_tagmethods.vsetfield = sp->vsetparent;
+ tif->tif_tagmethods.printdir = sp->printdir;
+ if (sp->qtable[0] != 0)
+ _TIFFfreeExt(tif, sp->qtable[0]);
+ if (sp->qtable[1] != 0)
+ _TIFFfreeExt(tif, sp->qtable[1]);
+ if (sp->qtable[2] != 0)
+ _TIFFfreeExt(tif, sp->qtable[2]);
+ if (sp->qtable[3] != 0)
+ _TIFFfreeExt(tif, sp->qtable[3]);
+ if (sp->dctable[0] != 0)
+ _TIFFfreeExt(tif, sp->dctable[0]);
+ if (sp->dctable[1] != 0)
+ _TIFFfreeExt(tif, sp->dctable[1]);
+ if (sp->dctable[2] != 0)
+ _TIFFfreeExt(tif, sp->dctable[2]);
+ if (sp->dctable[3] != 0)
+ _TIFFfreeExt(tif, sp->dctable[3]);
+ if (sp->actable[0] != 0)
+ _TIFFfreeExt(tif, sp->actable[0]);
+ if (sp->actable[1] != 0)
+ _TIFFfreeExt(tif, sp->actable[1]);
+ if (sp->actable[2] != 0)
+ _TIFFfreeExt(tif, sp->actable[2]);
+ if (sp->actable[3] != 0)
+ _TIFFfreeExt(tif, sp->actable[3]);
+ if (sp->libjpeg_session_active != 0)
+ OJPEGLibjpegSessionAbort(tif);
+ if (sp->subsampling_convert_ycbcrbuf != 0)
+ _TIFFfreeExt(tif, sp->subsampling_convert_ycbcrbuf);
+ if (sp->subsampling_convert_ycbcrimage != 0)
+ _TIFFfreeExt(tif, sp->subsampling_convert_ycbcrimage);
+ if (sp->skip_buffer != 0)
+ _TIFFfreeExt(tif, sp->skip_buffer);
+ _TIFFfreeExt(tif, sp);
+ tif->tif_data = NULL;
+ _TIFFSetDefaultCompressionState(tif);
+ }
}
-static void
-OJPEGSubsamplingCorrect(TIFF* tif)
-{
- static const char module[]="OJPEGSubsamplingCorrect";
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- uint8 mh;
- uint8 mv;
-
- assert(sp->subsamplingcorrect_done==0);
- if ((tif->tif_dir.td_samplesperpixel!=3) || ((tif->tif_dir.td_photometric!=PHOTOMETRIC_YCBCR) &&
- (tif->tif_dir.td_photometric!=PHOTOMETRIC_ITULAB)))
- {
- if (sp->subsampling_tag!=0)
- TIFFWarningExt(tif->tif_clientdata,module,"Subsampling tag not appropriate for this Photometric and/or SamplesPerPixel");
- sp->subsampling_hor=1;
- sp->subsampling_ver=1;
- sp->subsampling_force_desubsampling_inside_decompression=0;
- }
- else
- {
- sp->subsamplingcorrect_done=1;
- mh=sp->subsampling_hor;
- mv=sp->subsampling_ver;
- sp->subsamplingcorrect=1;
- OJPEGReadHeaderInfoSec(tif);
- if (sp->subsampling_force_desubsampling_inside_decompression!=0)
- {
- sp->subsampling_hor=1;
- sp->subsampling_ver=1;
- }
- sp->subsamplingcorrect=0;
- if (((sp->subsampling_hor!=mh) || (sp->subsampling_ver!=mv)) && (sp->subsampling_force_desubsampling_inside_decompression==0))
- {
- if (sp->subsampling_tag==0)
- TIFFWarningExt(tif->tif_clientdata,module,"Subsampling tag is not set, yet subsampling inside JPEG data [%d,%d] does not match default values [2,2]; assuming subsampling inside JPEG data is correct",sp->subsampling_hor,sp->subsampling_ver);
- else
- TIFFWarningExt(tif->tif_clientdata,module,"Subsampling inside JPEG data [%d,%d] does not match subsampling tag values [%d,%d]; assuming subsampling inside JPEG data is correct",sp->subsampling_hor,sp->subsampling_ver,mh,mv);
- }
- if (sp->subsampling_force_desubsampling_inside_decompression!=0)
- {
- if (sp->subsampling_tag==0)
- TIFFWarningExt(tif->tif_clientdata,module,"Subsampling tag is not set, yet subsampling inside JPEG data does not match default values [2,2] (nor any other values allowed in TIFF); assuming subsampling inside JPEG data is correct and desubsampling inside JPEG decompression");
- else
- TIFFWarningExt(tif->tif_clientdata,module,"Subsampling inside JPEG data does not match subsampling tag values [%d,%d] (nor any other values allowed in TIFF); assuming subsampling inside JPEG data is correct and desubsampling inside JPEG decompression",mh,mv);
- }
- if (sp->subsampling_force_desubsampling_inside_decompression==0)
- {
- if (sp->subsampling_hor<sp->subsampling_ver)
- TIFFWarningExt(tif->tif_clientdata,module,"Subsampling values [%d,%d] are not allowed in TIFF",sp->subsampling_hor,sp->subsampling_ver);
- }
- }
- sp->subsamplingcorrect_done=1;
+static void OJPEGSubsamplingCorrect(TIFF *tif)
+{
+ static const char module[] = "OJPEGSubsamplingCorrect";
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ uint8_t mh;
+ uint8_t mv;
+
+ assert(sp->subsamplingcorrect_done == 0);
+ if ((tif->tif_dir.td_samplesperpixel != 3) ||
+ ((tif->tif_dir.td_photometric != PHOTOMETRIC_YCBCR) &&
+ (tif->tif_dir.td_photometric != PHOTOMETRIC_ITULAB)))
+ {
+ if (sp->subsampling_tag != 0)
+ TIFFWarningExtR(tif, module,
+ "Subsampling tag not appropriate for this "
+ "Photometric and/or SamplesPerPixel");
+ sp->subsampling_hor = 1;
+ sp->subsampling_ver = 1;
+ sp->subsampling_force_desubsampling_inside_decompression = 0;
+ }
+ else
+ {
+ sp->subsamplingcorrect_done = 1;
+ mh = sp->subsampling_hor;
+ mv = sp->subsampling_ver;
+ sp->subsamplingcorrect = 1;
+ OJPEGReadHeaderInfoSec(tif);
+ if (sp->subsampling_force_desubsampling_inside_decompression != 0)
+ {
+ sp->subsampling_hor = 1;
+ sp->subsampling_ver = 1;
+ }
+ sp->subsamplingcorrect = 0;
+ if (((sp->subsampling_hor != mh) || (sp->subsampling_ver != mv)) &&
+ (sp->subsampling_force_desubsampling_inside_decompression == 0))
+ {
+ if (sp->subsampling_tag == 0)
+ TIFFWarningExtR(
+ tif, module,
+ "Subsampling tag is not set, yet subsampling inside JPEG "
+ "data [%" PRIu8 ",%" PRIu8
+ "] does not match default values [2,2]; assuming "
+ "subsampling inside JPEG data is correct",
+ sp->subsampling_hor, sp->subsampling_ver);
+ else
+ TIFFWarningExtR(
+ tif, module,
+ "Subsampling inside JPEG data [%" PRIu8 ",%" PRIu8
+ "] does not match subsampling tag values [%" PRIu8
+ ",%" PRIu8
+ "]; assuming subsampling inside JPEG data is correct",
+ sp->subsampling_hor, sp->subsampling_ver, mh, mv);
+ }
+ if (sp->subsampling_force_desubsampling_inside_decompression != 0)
+ {
+ if (sp->subsampling_tag == 0)
+ TIFFWarningExtR(
+ tif, module,
+ "Subsampling tag is not set, yet subsampling inside JPEG "
+ "data does not match default values [2,2] (nor any other "
+ "values allowed in TIFF); assuming subsampling inside JPEG "
+ "data is correct and desubsampling inside JPEG "
+ "decompression");
+ else
+ TIFFWarningExtR(
+ tif, module,
+ "Subsampling inside JPEG data does not match subsampling "
+ "tag values [%" PRIu8 ",%" PRIu8
+ "] (nor any other values allowed in TIFF); assuming "
+ "subsampling inside JPEG data is correct and desubsampling "
+ "inside JPEG decompression",
+ mh, mv);
+ }
+ if (sp->subsampling_force_desubsampling_inside_decompression == 0)
+ {
+ if (sp->subsampling_hor < sp->subsampling_ver)
+ TIFFWarningExtR(tif, module,
+ "Subsampling values [%" PRIu8 ",%" PRIu8
+ "] are not allowed in TIFF",
+ sp->subsampling_hor, sp->subsampling_ver);
+ }
+ }
+ sp->subsamplingcorrect_done = 1;
}
-static int
-OJPEGReadHeaderInfo(TIFF* tif)
-{
- static const char module[]="OJPEGReadHeaderInfo";
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- assert(sp->readheader_done==0);
- sp->image_width=tif->tif_dir.td_imagewidth;
- sp->image_length=tif->tif_dir.td_imagelength;
- if (isTiled(tif))
- {
- sp->strile_width=tif->tif_dir.td_tilewidth;
- sp->strile_length=tif->tif_dir.td_tilelength;
- sp->strile_length_total=((sp->image_length+sp->strile_length-1)/sp->strile_length)*sp->strile_length;
- }
- else
- {
- sp->strile_width=sp->image_width;
- sp->strile_length=tif->tif_dir.td_rowsperstrip;
- sp->strile_length_total=sp->image_length;
- }
- if (tif->tif_dir.td_samplesperpixel==1)
- {
- sp->samples_per_pixel=1;
- sp->plane_sample_offset=0;
- sp->samples_per_pixel_per_plane=sp->samples_per_pixel;
- sp->subsampling_hor=1;
- sp->subsampling_ver=1;
- }
- else
- {
- if (tif->tif_dir.td_samplesperpixel!=3)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"SamplesPerPixel %d not supported for this compression scheme",sp->samples_per_pixel);
- return(0);
- }
- sp->samples_per_pixel=3;
- sp->plane_sample_offset=0;
- if (tif->tif_dir.td_planarconfig==PLANARCONFIG_CONTIG)
- sp->samples_per_pixel_per_plane=3;
- else
- sp->samples_per_pixel_per_plane=1;
- }
- if (sp->strile_length<sp->image_length)
- {
- if (((sp->subsampling_hor!=1) && (sp->subsampling_hor!=2) && (sp->subsampling_hor!=4)) ||
- ((sp->subsampling_ver!=1) && (sp->subsampling_ver!=2) && (sp->subsampling_ver!=4)))
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Invalid subsampling values");
- return(0);
- }
- if (sp->strile_length%(sp->subsampling_ver*8)!=0)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Incompatible vertical subsampling and image strip/tile length");
- return(0);
- }
- sp->restart_interval=(uint16)(((sp->strile_width+sp->subsampling_hor*8-1)/(sp->subsampling_hor*8))*(sp->strile_length/(sp->subsampling_ver*8)));
- }
- if (OJPEGReadHeaderInfoSec(tif)==0)
- return(0);
- sp->sos_end[0].log=1;
- sp->sos_end[0].in_buffer_source=sp->in_buffer_source;
- sp->sos_end[0].in_buffer_next_strile=sp->in_buffer_next_strile;
- sp->sos_end[0].in_buffer_file_pos=sp->in_buffer_file_pos-sp->in_buffer_togo;
- sp->sos_end[0].in_buffer_file_togo=sp->in_buffer_file_togo+sp->in_buffer_togo;
- sp->readheader_done=1;
- return(1);
+static int OJPEGReadHeaderInfo(TIFF *tif)
+{
+ static const char module[] = "OJPEGReadHeaderInfo";
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ assert(sp->readheader_done == 0);
+ sp->image_width = tif->tif_dir.td_imagewidth;
+ sp->image_length = tif->tif_dir.td_imagelength;
+ if (isTiled(tif))
+ {
+ sp->strile_width = tif->tif_dir.td_tilewidth;
+ sp->strile_length = tif->tif_dir.td_tilelength;
+ sp->strile_length_total =
+ ((sp->image_length + sp->strile_length - 1) / sp->strile_length) *
+ sp->strile_length;
+ }
+ else
+ {
+ sp->strile_width = sp->image_width;
+ sp->strile_length = tif->tif_dir.td_rowsperstrip;
+ if (sp->strile_length == (uint32_t)-1)
+ sp->strile_length = sp->image_length;
+ sp->strile_length_total = sp->image_length;
+ }
+ if (tif->tif_dir.td_samplesperpixel == 1)
+ {
+ sp->samples_per_pixel = 1;
+ sp->plane_sample_offset = 0;
+ sp->samples_per_pixel_per_plane = sp->samples_per_pixel;
+ sp->subsampling_hor = 1;
+ sp->subsampling_ver = 1;
+ }
+ else
+ {
+ if (tif->tif_dir.td_samplesperpixel != 3)
+ {
+ TIFFErrorExtR(tif, module,
+ "SamplesPerPixel %" PRIu8
+ " not supported for this compression scheme",
+ sp->samples_per_pixel);
+ return (0);
+ }
+ sp->samples_per_pixel = 3;
+ sp->plane_sample_offset = 0;
+ if (tif->tif_dir.td_planarconfig == PLANARCONFIG_CONTIG)
+ sp->samples_per_pixel_per_plane = 3;
+ else
+ sp->samples_per_pixel_per_plane = 1;
+ }
+ if (sp->strile_length < sp->image_length)
+ {
+ if (((sp->subsampling_hor != 1) && (sp->subsampling_hor != 2) &&
+ (sp->subsampling_hor != 4)) ||
+ ((sp->subsampling_ver != 1) && (sp->subsampling_ver != 2) &&
+ (sp->subsampling_ver != 4)))
+ {
+ TIFFErrorExtR(tif, module, "Invalid subsampling values");
+ return (0);
+ }
+ if (sp->strile_length % (sp->subsampling_ver * 8) != 0)
+ {
+ TIFFErrorExtR(tif, module,
+ "Incompatible vertical subsampling and image "
+ "strip/tile length");
+ return (0);
+ }
+ sp->restart_interval =
+ (uint16_t)(((sp->strile_width + sp->subsampling_hor * 8 - 1) /
+ (sp->subsampling_hor * 8)) *
+ (sp->strile_length / (sp->subsampling_ver * 8)));
+ }
+ if (OJPEGReadHeaderInfoSec(tif) == 0)
+ return (0);
+ sp->sos_end[0].log = 1;
+ sp->sos_end[0].in_buffer_source = sp->in_buffer_source;
+ sp->sos_end[0].in_buffer_next_strile = sp->in_buffer_next_strile;
+ sp->sos_end[0].in_buffer_file_pos =
+ sp->in_buffer_file_pos - sp->in_buffer_togo;
+ sp->sos_end[0].in_buffer_file_togo =
+ sp->in_buffer_file_togo + sp->in_buffer_togo;
+ sp->readheader_done = 1;
+ return (1);
}
-static int
-OJPEGReadSecondarySos(TIFF* tif, uint16 s)
-{
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- uint8 m;
- assert(s>0);
- assert(s<3);
- assert(sp->sos_end[0].log!=0);
- assert(sp->sos_end[s].log==0);
- sp->plane_sample_offset=(uint8)(s-1);
- while(sp->sos_end[sp->plane_sample_offset].log==0)
- sp->plane_sample_offset--;
- sp->in_buffer_source=sp->sos_end[sp->plane_sample_offset].in_buffer_source;
- sp->in_buffer_next_strile=sp->sos_end[sp->plane_sample_offset].in_buffer_next_strile;
- sp->in_buffer_file_pos=sp->sos_end[sp->plane_sample_offset].in_buffer_file_pos;
- sp->in_buffer_file_pos_log=0;
- sp->in_buffer_file_togo=sp->sos_end[sp->plane_sample_offset].in_buffer_file_togo;
- sp->in_buffer_togo=0;
- sp->in_buffer_cur=0;
- while(sp->plane_sample_offset<s)
- {
- do
- {
- if (OJPEGReadByte(sp,&m)==0)
- return(0);
- if (m==255)
- {
- do
- {
- if (OJPEGReadByte(sp,&m)==0)
- return(0);
- if (m!=255)
- break;
- } while(1);
- if (m==JPEG_MARKER_SOS)
- break;
- }
- } while(1);
- sp->plane_sample_offset++;
- if (OJPEGReadHeaderInfoSecStreamSos(tif)==0)
- return(0);
- sp->sos_end[sp->plane_sample_offset].log=1;
- sp->sos_end[sp->plane_sample_offset].in_buffer_source=sp->in_buffer_source;
- sp->sos_end[sp->plane_sample_offset].in_buffer_next_strile=sp->in_buffer_next_strile;
- sp->sos_end[sp->plane_sample_offset].in_buffer_file_pos=sp->in_buffer_file_pos-sp->in_buffer_togo;
- sp->sos_end[sp->plane_sample_offset].in_buffer_file_togo=sp->in_buffer_file_togo+sp->in_buffer_togo;
- }
- return(1);
+static int OJPEGReadSecondarySos(TIFF *tif, uint16_t s)
+{
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ uint8_t m;
+ assert(s > 0);
+ assert(s < 3);
+ assert(sp->sos_end[0].log != 0);
+ assert(sp->sos_end[s].log == 0);
+ sp->plane_sample_offset = (uint8_t)(s - 1);
+ while (sp->sos_end[sp->plane_sample_offset].log == 0)
+ sp->plane_sample_offset--;
+ sp->in_buffer_source =
+ sp->sos_end[sp->plane_sample_offset].in_buffer_source;
+ sp->in_buffer_next_strile =
+ sp->sos_end[sp->plane_sample_offset].in_buffer_next_strile;
+ sp->in_buffer_file_pos =
+ sp->sos_end[sp->plane_sample_offset].in_buffer_file_pos;
+ sp->in_buffer_file_pos_log = 0;
+ sp->in_buffer_file_togo =
+ sp->sos_end[sp->plane_sample_offset].in_buffer_file_togo;
+ sp->in_buffer_togo = 0;
+ sp->in_buffer_cur = 0;
+ while (sp->plane_sample_offset < s)
+ {
+ do
+ {
+ if (OJPEGReadByte(sp, &m) == 0)
+ return (0);
+ if (m == 255)
+ {
+ do
+ {
+ if (OJPEGReadByte(sp, &m) == 0)
+ return (0);
+ if (m != 255)
+ break;
+ } while (1);
+ if (m == JPEG_MARKER_SOS)
+ break;
+ }
+ } while (1);
+ sp->plane_sample_offset++;
+ if (OJPEGReadHeaderInfoSecStreamSos(tif) == 0)
+ return (0);
+ sp->sos_end[sp->plane_sample_offset].log = 1;
+ sp->sos_end[sp->plane_sample_offset].in_buffer_source =
+ sp->in_buffer_source;
+ sp->sos_end[sp->plane_sample_offset].in_buffer_next_strile =
+ sp->in_buffer_next_strile;
+ sp->sos_end[sp->plane_sample_offset].in_buffer_file_pos =
+ sp->in_buffer_file_pos - sp->in_buffer_togo;
+ sp->sos_end[sp->plane_sample_offset].in_buffer_file_togo =
+ sp->in_buffer_file_togo + sp->in_buffer_togo;
+ }
+ return (1);
}
-static int
-OJPEGWriteHeaderInfo(TIFF* tif)
-{
- static const char module[]="OJPEGWriteHeaderInfo";
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- uint8** m;
- uint32 n;
- /* if a previous attempt failed, don't try again */
- if (sp->libjpeg_session_active != 0)
- return 0;
- sp->out_state=ososSoi;
- sp->restart_index=0;
- jpeg_std_error(&(sp->libjpeg_jpeg_error_mgr));
- sp->libjpeg_jpeg_error_mgr.output_message=OJPEGLibjpegJpegErrorMgrOutputMessage;
- sp->libjpeg_jpeg_error_mgr.error_exit=OJPEGLibjpegJpegErrorMgrErrorExit;
- sp->libjpeg_jpeg_decompress_struct.err=&(sp->libjpeg_jpeg_error_mgr);
- sp->libjpeg_jpeg_decompress_struct.client_data=(void*)tif;
- if (jpeg_create_decompress_encap(sp,&(sp->libjpeg_jpeg_decompress_struct))==0)
- return(0);
- sp->libjpeg_session_active=1;
- sp->libjpeg_jpeg_source_mgr.bytes_in_buffer=0;
- sp->libjpeg_jpeg_source_mgr.init_source=OJPEGLibjpegJpegSourceMgrInitSource;
- sp->libjpeg_jpeg_source_mgr.fill_input_buffer=OJPEGLibjpegJpegSourceMgrFillInputBuffer;
- sp->libjpeg_jpeg_source_mgr.skip_input_data=OJPEGLibjpegJpegSourceMgrSkipInputData;
- sp->libjpeg_jpeg_source_mgr.resync_to_restart=OJPEGLibjpegJpegSourceMgrResyncToRestart;
- sp->libjpeg_jpeg_source_mgr.term_source=OJPEGLibjpegJpegSourceMgrTermSource;
- sp->libjpeg_jpeg_decompress_struct.src=&(sp->libjpeg_jpeg_source_mgr);
- if (jpeg_read_header_encap(sp,&(sp->libjpeg_jpeg_decompress_struct),1)==0)
- return(0);
- if ((sp->subsampling_force_desubsampling_inside_decompression==0) && (sp->samples_per_pixel_per_plane>1))
- {
- sp->libjpeg_jpeg_decompress_struct.raw_data_out=1;
+static int OJPEGWriteHeaderInfo(TIFF *tif)
+{
+ static const char module[] = "OJPEGWriteHeaderInfo";
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ uint8_t **m;
+ uint32_t n;
+ /* if a previous attempt failed, don't try again */
+ if (sp->libjpeg_session_active != 0)
+ return 0;
+ sp->out_state = ososSoi;
+ sp->restart_index = 0;
+ jpeg_std_error(&(sp->libjpeg_jpeg_error_mgr));
+ sp->libjpeg_jpeg_error_mgr.output_message =
+ OJPEGLibjpegJpegErrorMgrOutputMessage;
+ sp->libjpeg_jpeg_error_mgr.error_exit = OJPEGLibjpegJpegErrorMgrErrorExit;
+ sp->libjpeg_jpeg_decompress_struct.err = &(sp->libjpeg_jpeg_error_mgr);
+ sp->libjpeg_jpeg_decompress_struct.client_data = (void *)tif;
+ if (jpeg_create_decompress_encap(
+ sp, &(sp->libjpeg_jpeg_decompress_struct)) == 0)
+ return (0);
+ sp->libjpeg_session_active = 1;
+ sp->libjpeg_jpeg_source_mgr.bytes_in_buffer = 0;
+ sp->libjpeg_jpeg_source_mgr.init_source =
+ OJPEGLibjpegJpegSourceMgrInitSource;
+ sp->libjpeg_jpeg_source_mgr.fill_input_buffer =
+ OJPEGLibjpegJpegSourceMgrFillInputBuffer;
+ sp->libjpeg_jpeg_source_mgr.skip_input_data =
+ OJPEGLibjpegJpegSourceMgrSkipInputData;
+ sp->libjpeg_jpeg_source_mgr.resync_to_restart =
+ OJPEGLibjpegJpegSourceMgrResyncToRestart;
+ sp->libjpeg_jpeg_source_mgr.term_source =
+ OJPEGLibjpegJpegSourceMgrTermSource;
+ sp->libjpeg_jpeg_decompress_struct.src = &(sp->libjpeg_jpeg_source_mgr);
+ if (jpeg_read_header_encap(sp, &(sp->libjpeg_jpeg_decompress_struct), 1) ==
+ 0)
+ return (0);
+ if ((sp->subsampling_force_desubsampling_inside_decompression == 0) &&
+ (sp->samples_per_pixel_per_plane > 1))
+ {
+ sp->libjpeg_jpeg_decompress_struct.raw_data_out = 1;
#if JPEG_LIB_VERSION >= 70
- sp->libjpeg_jpeg_decompress_struct.do_fancy_upsampling=FALSE;
+ sp->libjpeg_jpeg_decompress_struct.do_fancy_upsampling = FALSE;
#endif
- sp->libjpeg_jpeg_query_style=0;
- if (sp->subsampling_convert_log==0)
- {
- assert(sp->subsampling_convert_ycbcrbuf==0);
- assert(sp->subsampling_convert_ycbcrimage==0);
- sp->subsampling_convert_ylinelen=((sp->strile_width+sp->subsampling_hor*8-1)/(sp->subsampling_hor*8)*sp->subsampling_hor*8);
- sp->subsampling_convert_ylines=sp->subsampling_ver*8;
- sp->subsampling_convert_clinelen=sp->subsampling_convert_ylinelen/sp->subsampling_hor;
- sp->subsampling_convert_clines=8;
- sp->subsampling_convert_ybuflen=sp->subsampling_convert_ylinelen*sp->subsampling_convert_ylines;
- sp->subsampling_convert_cbuflen=sp->subsampling_convert_clinelen*sp->subsampling_convert_clines;
- sp->subsampling_convert_ycbcrbuflen=sp->subsampling_convert_ybuflen+2*sp->subsampling_convert_cbuflen;
- /* The calloc is not normally necessary, except in some edge/broken cases */
- /* for example for a tiled image of height 1 with a tile height of 1 and subsampling_hor=subsampling_ver=2 */
- /* In that case, libjpeg will only fill the 8 first lines of the 16 lines */
- /* See https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=16844 */
- /* Even if this case is allowed (?), its handling is broken because OJPEGPreDecode() should also likely */
- /* reset subsampling_convert_state to 0 when changing tile. */
- sp->subsampling_convert_ycbcrbuf=_TIFFcalloc(1, sp->subsampling_convert_ycbcrbuflen);
- if (sp->subsampling_convert_ycbcrbuf==0)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- sp->subsampling_convert_ybuf=sp->subsampling_convert_ycbcrbuf;
- sp->subsampling_convert_cbbuf=sp->subsampling_convert_ybuf+sp->subsampling_convert_ybuflen;
- sp->subsampling_convert_crbuf=sp->subsampling_convert_cbbuf+sp->subsampling_convert_cbuflen;
- sp->subsampling_convert_ycbcrimagelen=3+sp->subsampling_convert_ylines+2*sp->subsampling_convert_clines;
- sp->subsampling_convert_ycbcrimage=_TIFFmalloc(sp->subsampling_convert_ycbcrimagelen*sizeof(uint8*));
- if (sp->subsampling_convert_ycbcrimage==0)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- m=sp->subsampling_convert_ycbcrimage;
- *m++=(uint8*)(sp->subsampling_convert_ycbcrimage+3);
- *m++=(uint8*)(sp->subsampling_convert_ycbcrimage+3+sp->subsampling_convert_ylines);
- *m++=(uint8*)(sp->subsampling_convert_ycbcrimage+3+sp->subsampling_convert_ylines+sp->subsampling_convert_clines);
- for (n=0; n<sp->subsampling_convert_ylines; n++)
- *m++=sp->subsampling_convert_ybuf+n*sp->subsampling_convert_ylinelen;
- for (n=0; n<sp->subsampling_convert_clines; n++)
- *m++=sp->subsampling_convert_cbbuf+n*sp->subsampling_convert_clinelen;
- for (n=0; n<sp->subsampling_convert_clines; n++)
- *m++=sp->subsampling_convert_crbuf+n*sp->subsampling_convert_clinelen;
- sp->subsampling_convert_clinelenout=sp->strile_width/sp->subsampling_hor + ((sp->strile_width % sp->subsampling_hor) != 0 ? 1 : 0);
- sp->subsampling_convert_state=0;
- sp->error_in_raw_data_decoding=0;
- sp->bytes_per_line=sp->subsampling_convert_clinelenout*(sp->subsampling_ver*sp->subsampling_hor+2);
- sp->lines_per_strile=sp->strile_length/sp->subsampling_ver + ((sp->strile_length % sp->subsampling_ver) != 0 ? 1 : 0);
- sp->subsampling_convert_log=1;
- }
- }
- else
- {
- sp->libjpeg_jpeg_decompress_struct.jpeg_color_space=JCS_UNKNOWN;
- sp->libjpeg_jpeg_decompress_struct.out_color_space=JCS_UNKNOWN;
- sp->libjpeg_jpeg_query_style=1;
- sp->bytes_per_line=sp->samples_per_pixel_per_plane*sp->strile_width;
- sp->lines_per_strile=sp->strile_length;
- }
- if (jpeg_start_decompress_encap(sp,&(sp->libjpeg_jpeg_decompress_struct))==0)
- return(0);
- sp->writeheader_done=1;
- return(1);
+ sp->libjpeg_jpeg_query_style = 0;
+ if (sp->subsampling_convert_log == 0)
+ {
+ assert(sp->subsampling_convert_ycbcrbuf == 0);
+ assert(sp->subsampling_convert_ycbcrimage == 0);
+ sp->subsampling_convert_ylinelen =
+ ((sp->strile_width + sp->subsampling_hor * 8 - 1) /
+ (sp->subsampling_hor * 8) * sp->subsampling_hor * 8);
+ sp->subsampling_convert_ylines = sp->subsampling_ver * 8;
+ sp->subsampling_convert_clinelen =
+ sp->subsampling_convert_ylinelen / sp->subsampling_hor;
+ sp->subsampling_convert_clines = 8;
+ sp->subsampling_convert_ybuflen = sp->subsampling_convert_ylinelen *
+ sp->subsampling_convert_ylines;
+ sp->subsampling_convert_cbuflen = sp->subsampling_convert_clinelen *
+ sp->subsampling_convert_clines;
+ sp->subsampling_convert_ycbcrbuflen =
+ sp->subsampling_convert_ybuflen +
+ 2 * sp->subsampling_convert_cbuflen;
+ /* The calloc is not normally necessary, except in some edge/broken
+ * cases */
+ /* for example for a tiled image of height 1 with a tile height of 1
+ * and subsampling_hor=subsampling_ver=2 */
+ /* In that case, libjpeg will only fill the 8 first lines of the 16
+ * lines */
+ /* See https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=16844
+ */
+ /* Even if this case is allowed (?), its handling is broken because
+ * OJPEGPreDecode() should also likely */
+ /* reset subsampling_convert_state to 0 when changing tile. */
+ sp->subsampling_convert_ycbcrbuf =
+ _TIFFcallocExt(tif, 1, sp->subsampling_convert_ycbcrbuflen);
+ if (sp->subsampling_convert_ycbcrbuf == 0)
+ {
+ TIFFErrorExtR(tif, module, "Out of memory");
+ return (0);
+ }
+ sp->subsampling_convert_ybuf = sp->subsampling_convert_ycbcrbuf;
+ sp->subsampling_convert_cbbuf =
+ sp->subsampling_convert_ybuf + sp->subsampling_convert_ybuflen;
+ sp->subsampling_convert_crbuf =
+ sp->subsampling_convert_cbbuf + sp->subsampling_convert_cbuflen;
+ sp->subsampling_convert_ycbcrimagelen =
+ 3 + sp->subsampling_convert_ylines +
+ 2 * sp->subsampling_convert_clines;
+ sp->subsampling_convert_ycbcrimage = _TIFFmallocExt(
+ tif, sp->subsampling_convert_ycbcrimagelen * sizeof(uint8_t *));
+ if (sp->subsampling_convert_ycbcrimage == 0)
+ {
+ TIFFErrorExtR(tif, module, "Out of memory");
+ return (0);
+ }
+ m = sp->subsampling_convert_ycbcrimage;
+ *m++ = (uint8_t *)(sp->subsampling_convert_ycbcrimage + 3);
+ *m++ = (uint8_t *)(sp->subsampling_convert_ycbcrimage + 3 +
+ sp->subsampling_convert_ylines);
+ *m++ = (uint8_t *)(sp->subsampling_convert_ycbcrimage + 3 +
+ sp->subsampling_convert_ylines +
+ sp->subsampling_convert_clines);
+ for (n = 0; n < sp->subsampling_convert_ylines; n++)
+ *m++ = sp->subsampling_convert_ybuf +
+ n * sp->subsampling_convert_ylinelen;
+ for (n = 0; n < sp->subsampling_convert_clines; n++)
+ *m++ = sp->subsampling_convert_cbbuf +
+ n * sp->subsampling_convert_clinelen;
+ for (n = 0; n < sp->subsampling_convert_clines; n++)
+ *m++ = sp->subsampling_convert_crbuf +
+ n * sp->subsampling_convert_clinelen;
+ sp->subsampling_convert_clinelenout =
+ sp->strile_width / sp->subsampling_hor +
+ ((sp->strile_width % sp->subsampling_hor) != 0 ? 1 : 0);
+ sp->subsampling_convert_state = 0;
+ sp->error_in_raw_data_decoding = 0;
+ sp->bytes_per_line =
+ sp->subsampling_convert_clinelenout *
+ (sp->subsampling_ver * sp->subsampling_hor + 2);
+ sp->lines_per_strile =
+ sp->strile_length / sp->subsampling_ver +
+ ((sp->strile_length % sp->subsampling_ver) != 0 ? 1 : 0);
+ sp->subsampling_convert_log = 1;
+ }
+ }
+ else
+ {
+ sp->libjpeg_jpeg_decompress_struct.jpeg_color_space = JCS_UNKNOWN;
+ sp->libjpeg_jpeg_decompress_struct.out_color_space = JCS_UNKNOWN;
+ sp->libjpeg_jpeg_query_style = 1;
+ sp->bytes_per_line = sp->samples_per_pixel_per_plane * sp->strile_width;
+ sp->lines_per_strile = sp->strile_length;
+ }
+ if (jpeg_start_decompress_encap(sp,
+ &(sp->libjpeg_jpeg_decompress_struct)) == 0)
+ return (0);
+ if (sp->libjpeg_jpeg_decompress_struct.image_width != sp->strile_width)
+ {
+ TIFFErrorExtR(tif, module,
+ "jpeg_start_decompress() returned image_width = %u, "
+ "expected %" PRIu32,
+ sp->libjpeg_jpeg_decompress_struct.image_width,
+ sp->strile_width);
+ return 0;
+ }
+ if (sp->libjpeg_jpeg_decompress_struct.max_h_samp_factor !=
+ sp->subsampling_hor ||
+ sp->libjpeg_jpeg_decompress_struct.max_v_samp_factor !=
+ sp->subsampling_ver)
+ {
+ TIFFErrorExtR(tif, module,
+ "jpeg_start_decompress() returned max_h_samp_factor = %d "
+ "and max_v_samp_factor = %d, expected %" PRIu8
+ " and %" PRIu8,
+ sp->libjpeg_jpeg_decompress_struct.max_h_samp_factor,
+ sp->libjpeg_jpeg_decompress_struct.max_v_samp_factor,
+ sp->subsampling_hor, sp->subsampling_ver);
+ return 0;
+ }
+
+ sp->writeheader_done = 1;
+ return (1);
}
-static void
-OJPEGLibjpegSessionAbort(TIFF* tif)
+static void OJPEGLibjpegSessionAbort(TIFF *tif)
+{
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ assert(sp->libjpeg_session_active != 0);
+ jpeg_destroy((jpeg_common_struct *)(&(sp->libjpeg_jpeg_decompress_struct)));
+ sp->libjpeg_session_active = 0;
+}
+
+static int OJPEGReadHeaderInfoSec(TIFF *tif)
{
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- assert(sp->libjpeg_session_active!=0);
- jpeg_destroy((jpeg_common_struct*)(&(sp->libjpeg_jpeg_decompress_struct)));
- sp->libjpeg_session_active=0;
+ static const char module[] = "OJPEGReadHeaderInfoSec";
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ uint8_t m;
+ uint16_t n;
+ uint8_t o;
+ if (sp->file_size == 0)
+ sp->file_size = TIFFGetFileSize(tif);
+ if (sp->jpeg_interchange_format != 0)
+ {
+ if (sp->jpeg_interchange_format >= sp->file_size)
+ {
+ sp->jpeg_interchange_format = 0;
+ sp->jpeg_interchange_format_length = 0;
+ }
+ else
+ {
+ if ((sp->jpeg_interchange_format_length == 0) ||
+ (sp->jpeg_interchange_format >
+ UINT64_MAX - sp->jpeg_interchange_format_length) ||
+ (sp->jpeg_interchange_format +
+ sp->jpeg_interchange_format_length >
+ sp->file_size))
+ sp->jpeg_interchange_format_length =
+ sp->file_size - sp->jpeg_interchange_format;
+ }
+ }
+ sp->in_buffer_source = osibsNotSetYet;
+ sp->in_buffer_next_strile = 0;
+ sp->in_buffer_strile_count = tif->tif_dir.td_nstrips;
+ sp->in_buffer_file_togo = 0;
+ sp->in_buffer_togo = 0;
+ do
+ {
+ if (OJPEGReadBytePeek(sp, &m) == 0)
+ return (0);
+ if (m != 255)
+ break;
+ OJPEGReadByteAdvance(sp);
+ do
+ {
+ if (OJPEGReadByte(sp, &m) == 0)
+ return (0);
+ } while (m == 255);
+ switch (m)
+ {
+ case JPEG_MARKER_SOI:
+ /* this type of marker has no data, and should be skipped */
+ break;
+ case JPEG_MARKER_COM:
+ case JPEG_MARKER_APP0:
+ case JPEG_MARKER_APP0 + 1:
+ case JPEG_MARKER_APP0 + 2:
+ case JPEG_MARKER_APP0 + 3:
+ case JPEG_MARKER_APP0 + 4:
+ case JPEG_MARKER_APP0 + 5:
+ case JPEG_MARKER_APP0 + 6:
+ case JPEG_MARKER_APP0 + 7:
+ case JPEG_MARKER_APP0 + 8:
+ case JPEG_MARKER_APP0 + 9:
+ case JPEG_MARKER_APP0 + 10:
+ case JPEG_MARKER_APP0 + 11:
+ case JPEG_MARKER_APP0 + 12:
+ case JPEG_MARKER_APP0 + 13:
+ case JPEG_MARKER_APP0 + 14:
+ case JPEG_MARKER_APP0 + 15:
+ /* this type of marker has data, but it has no use to us (and no
+ * place here) and should be skipped */
+ if (OJPEGReadWord(sp, &n) == 0)
+ return (0);
+ if (n < 2)
+ {
+ if (sp->subsamplingcorrect == 0)
+ TIFFErrorExtR(tif, module, "Corrupt JPEG data");
+ return (0);
+ }
+ if (n > 2)
+ OJPEGReadSkip(sp, n - 2);
+ break;
+ case JPEG_MARKER_DRI:
+ if (OJPEGReadHeaderInfoSecStreamDri(tif) == 0)
+ return (0);
+ break;
+ case JPEG_MARKER_DQT:
+ if (OJPEGReadHeaderInfoSecStreamDqt(tif) == 0)
+ return (0);
+ break;
+ case JPEG_MARKER_DHT:
+ if (OJPEGReadHeaderInfoSecStreamDht(tif) == 0)
+ return (0);
+ break;
+ case JPEG_MARKER_SOF0:
+ case JPEG_MARKER_SOF1:
+ case JPEG_MARKER_SOF3:
+ if (OJPEGReadHeaderInfoSecStreamSof(tif, m) == 0)
+ return (0);
+ if (sp->subsamplingcorrect != 0)
+ return (1);
+ break;
+ case JPEG_MARKER_SOS:
+ if (sp->subsamplingcorrect != 0)
+ return (1);
+ assert(sp->plane_sample_offset == 0);
+ if (OJPEGReadHeaderInfoSecStreamSos(tif) == 0)
+ return (0);
+ break;
+ default:
+ TIFFErrorExtR(tif, module,
+ "Unknown marker type %" PRIu8 " in JPEG data", m);
+ return (0);
+ }
+ } while (m != JPEG_MARKER_SOS);
+ if (sp->subsamplingcorrect)
+ return (1);
+ if (sp->sof_log == 0)
+ {
+ if (OJPEGReadHeaderInfoSecTablesQTable(tif) == 0)
+ return (0);
+ sp->sof_marker_id = JPEG_MARKER_SOF0;
+ for (o = 0; o < sp->samples_per_pixel; o++)
+ sp->sof_c[o] = o;
+ sp->sof_hv[0] = ((sp->subsampling_hor << 4) | sp->subsampling_ver);
+ for (o = 1; o < sp->samples_per_pixel; o++)
+ sp->sof_hv[o] = 17;
+ sp->sof_x = sp->strile_width;
+ sp->sof_y = sp->strile_length_total;
+ sp->sof_log = 1;
+ if (OJPEGReadHeaderInfoSecTablesDcTable(tif) == 0)
+ return (0);
+ if (OJPEGReadHeaderInfoSecTablesAcTable(tif) == 0)
+ return (0);
+ for (o = 1; o < sp->samples_per_pixel; o++)
+ sp->sos_cs[o] = o;
+ }
+ return (1);
}
-static int
-OJPEGReadHeaderInfoSec(TIFF* tif)
-{
- static const char module[]="OJPEGReadHeaderInfoSec";
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- uint8 m;
- uint16 n;
- uint8 o;
- if (sp->file_size==0)
- sp->file_size=TIFFGetFileSize(tif);
- if (sp->jpeg_interchange_format!=0)
- {
- if (sp->jpeg_interchange_format>=sp->file_size)
- {
- sp->jpeg_interchange_format=0;
- sp->jpeg_interchange_format_length=0;
- }
- else
- {
- if ((sp->jpeg_interchange_format_length==0) ||
- (sp->jpeg_interchange_format > TIFF_UINT64_MAX - sp->jpeg_interchange_format_length) ||
- (sp->jpeg_interchange_format+sp->jpeg_interchange_format_length>sp->file_size))
- sp->jpeg_interchange_format_length=sp->file_size-sp->jpeg_interchange_format;
- }
- }
- sp->in_buffer_source=osibsNotSetYet;
- sp->in_buffer_next_strile=0;
- sp->in_buffer_strile_count=tif->tif_dir.td_nstrips;
- sp->in_buffer_file_togo=0;
- sp->in_buffer_togo=0;
- do
- {
- if (OJPEGReadBytePeek(sp,&m)==0)
- return(0);
- if (m!=255)
- break;
- OJPEGReadByteAdvance(sp);
- do
- {
- if (OJPEGReadByte(sp,&m)==0)
- return(0);
- } while(m==255);
- switch(m)
- {
- case JPEG_MARKER_SOI:
- /* this type of marker has no data, and should be skipped */
- break;
- case JPEG_MARKER_COM:
- case JPEG_MARKER_APP0:
- case JPEG_MARKER_APP0+1:
- case JPEG_MARKER_APP0+2:
- case JPEG_MARKER_APP0+3:
- case JPEG_MARKER_APP0+4:
- case JPEG_MARKER_APP0+5:
- case JPEG_MARKER_APP0+6:
- case JPEG_MARKER_APP0+7:
- case JPEG_MARKER_APP0+8:
- case JPEG_MARKER_APP0+9:
- case JPEG_MARKER_APP0+10:
- case JPEG_MARKER_APP0+11:
- case JPEG_MARKER_APP0+12:
- case JPEG_MARKER_APP0+13:
- case JPEG_MARKER_APP0+14:
- case JPEG_MARKER_APP0+15:
- /* this type of marker has data, but it has no use to us (and no place here) and should be skipped */
- if (OJPEGReadWord(sp,&n)==0)
- return(0);
- if (n<2)
- {
- if (sp->subsamplingcorrect==0)
- TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JPEG data");
- return(0);
- }
- if (n>2)
- OJPEGReadSkip(sp,n-2);
- break;
- case JPEG_MARKER_DRI:
- if (OJPEGReadHeaderInfoSecStreamDri(tif)==0)
- return(0);
- break;
- case JPEG_MARKER_DQT:
- if (OJPEGReadHeaderInfoSecStreamDqt(tif)==0)
- return(0);
- break;
- case JPEG_MARKER_DHT:
- if (OJPEGReadHeaderInfoSecStreamDht(tif)==0)
- return(0);
- break;
- case JPEG_MARKER_SOF0:
- case JPEG_MARKER_SOF1:
- case JPEG_MARKER_SOF3:
- if (OJPEGReadHeaderInfoSecStreamSof(tif,m)==0)
- return(0);
- if (sp->subsamplingcorrect!=0)
- return(1);
- break;
- case JPEG_MARKER_SOS:
- if (sp->subsamplingcorrect!=0)
- return(1);
- assert(sp->plane_sample_offset==0);
- if (OJPEGReadHeaderInfoSecStreamSos(tif)==0)
- return(0);
- break;
- default:
- TIFFErrorExt(tif->tif_clientdata,module,"Unknown marker type %d in JPEG data",m);
- return(0);
- }
- } while(m!=JPEG_MARKER_SOS);
- if (sp->subsamplingcorrect)
- return(1);
- if (sp->sof_log==0)
- {
- if (OJPEGReadHeaderInfoSecTablesQTable(tif)==0)
- return(0);
- sp->sof_marker_id=JPEG_MARKER_SOF0;
- for (o=0; o<sp->samples_per_pixel; o++)
- sp->sof_c[o]=o;
- sp->sof_hv[0]=((sp->subsampling_hor<<4)|sp->subsampling_ver);
- for (o=1; o<sp->samples_per_pixel; o++)
- sp->sof_hv[o]=17;
- sp->sof_x=sp->strile_width;
- sp->sof_y=sp->strile_length_total;
- sp->sof_log=1;
- if (OJPEGReadHeaderInfoSecTablesDcTable(tif)==0)
- return(0);
- if (OJPEGReadHeaderInfoSecTablesAcTable(tif)==0)
- return(0);
- for (o=1; o<sp->samples_per_pixel; o++)
- sp->sos_cs[o]=o;
- }
- return(1);
+static int OJPEGReadHeaderInfoSecStreamDri(TIFF *tif)
+{
+ /* This could easily cause trouble in some cases... but no such cases have
+ occurred so far */
+ static const char module[] = "OJPEGReadHeaderInfoSecStreamDri";
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ uint16_t m;
+ if (OJPEGReadWord(sp, &m) == 0)
+ return (0);
+ if (m != 4)
+ {
+ TIFFErrorExtR(tif, module, "Corrupt DRI marker in JPEG data");
+ return (0);
+ }
+ if (OJPEGReadWord(sp, &m) == 0)
+ return (0);
+ sp->restart_interval = m;
+ return (1);
}
-static int
-OJPEGReadHeaderInfoSecStreamDri(TIFF* tif)
-{
- /* This could easily cause trouble in some cases... but no such cases have
- occurred so far */
- static const char module[]="OJPEGReadHeaderInfoSecStreamDri";
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- uint16 m;
- if (OJPEGReadWord(sp,&m)==0)
- return(0);
- if (m!=4)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DRI marker in JPEG data");
- return(0);
- }
- if (OJPEGReadWord(sp,&m)==0)
- return(0);
- sp->restart_interval=m;
- return(1);
+static int OJPEGReadHeaderInfoSecStreamDqt(TIFF *tif)
+{
+ /* this is a table marker, and it is to be saved as a whole for exact
+ * pushing on the jpeg stream later on */
+ static const char module[] = "OJPEGReadHeaderInfoSecStreamDqt";
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ uint16_t m;
+ uint32_t na;
+ uint8_t *nb;
+ uint8_t o;
+ if (OJPEGReadWord(sp, &m) == 0)
+ return (0);
+ if (m <= 2)
+ {
+ if (sp->subsamplingcorrect == 0)
+ TIFFErrorExtR(tif, module, "Corrupt DQT marker in JPEG data");
+ return (0);
+ }
+ if (sp->subsamplingcorrect != 0)
+ OJPEGReadSkip(sp, m - 2);
+ else
+ {
+ m -= 2;
+ do
+ {
+ if (m < 65)
+ {
+ TIFFErrorExtR(tif, module, "Corrupt DQT marker in JPEG data");
+ return (0);
+ }
+ na = sizeof(uint32_t) + 69;
+ nb = _TIFFmallocExt(tif, na);
+ if (nb == 0)
+ {
+ TIFFErrorExtR(tif, module, "Out of memory");
+ return (0);
+ }
+ *(uint32_t *)nb = na;
+ nb[sizeof(uint32_t)] = 255;
+ nb[sizeof(uint32_t) + 1] = JPEG_MARKER_DQT;
+ nb[sizeof(uint32_t) + 2] = 0;
+ nb[sizeof(uint32_t) + 3] = 67;
+ if (OJPEGReadBlock(sp, 65, &nb[sizeof(uint32_t) + 4]) == 0)
+ {
+ _TIFFfreeExt(tif, nb);
+ return (0);
+ }
+ o = nb[sizeof(uint32_t) + 4] & 15;
+ if (3 < o)
+ {
+ TIFFErrorExtR(tif, module, "Corrupt DQT marker in JPEG data");
+ _TIFFfreeExt(tif, nb);
+ return (0);
+ }
+ if (sp->qtable[o] != 0)
+ _TIFFfreeExt(tif, sp->qtable[o]);
+ sp->qtable[o] = nb;
+ m -= 65;
+ } while (m > 0);
+ }
+ return (1);
}
-static int
-OJPEGReadHeaderInfoSecStreamDqt(TIFF* tif)
-{
- /* this is a table marker, and it is to be saved as a whole for exact pushing on the jpeg stream later on */
- static const char module[]="OJPEGReadHeaderInfoSecStreamDqt";
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- uint16 m;
- uint32 na;
- uint8* nb;
- uint8 o;
- if (OJPEGReadWord(sp,&m)==0)
- return(0);
- if (m<=2)
- {
- if (sp->subsamplingcorrect==0)
- TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DQT marker in JPEG data");
- return(0);
- }
- if (sp->subsamplingcorrect!=0)
- OJPEGReadSkip(sp,m-2);
- else
- {
- m-=2;
- do
- {
- if (m<65)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DQT marker in JPEG data");
- return(0);
- }
- na=sizeof(uint32)+69;
- nb=_TIFFmalloc(na);
- if (nb==0)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- *(uint32*)nb=na;
- nb[sizeof(uint32)]=255;
- nb[sizeof(uint32)+1]=JPEG_MARKER_DQT;
- nb[sizeof(uint32)+2]=0;
- nb[sizeof(uint32)+3]=67;
- if (OJPEGReadBlock(sp,65,&nb[sizeof(uint32)+4])==0) {
- _TIFFfree(nb);
- return(0);
- }
- o=nb[sizeof(uint32)+4]&15;
- if (3<o)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DQT marker in JPEG data");
- _TIFFfree(nb);
- return(0);
- }
- if (sp->qtable[o]!=0)
- _TIFFfree(sp->qtable[o]);
- sp->qtable[o]=nb;
- m-=65;
- } while(m>0);
- }
- return(1);
+static int OJPEGReadHeaderInfoSecStreamDht(TIFF *tif)
+{
+ /* this is a table marker, and it is to be saved as a whole for exact
+ * pushing on the jpeg stream later on */
+ /* TODO: the following assumes there is only one table in this marker... but
+ * i'm not quite sure that assumption is guaranteed correct */
+ static const char module[] = "OJPEGReadHeaderInfoSecStreamDht";
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ uint16_t m;
+ uint32_t na;
+ uint8_t *nb;
+ uint8_t o;
+ if (OJPEGReadWord(sp, &m) == 0)
+ return (0);
+ if (m <= 2)
+ {
+ if (sp->subsamplingcorrect == 0)
+ TIFFErrorExtR(tif, module, "Corrupt DHT marker in JPEG data");
+ return (0);
+ }
+ if (sp->subsamplingcorrect != 0)
+ {
+ OJPEGReadSkip(sp, m - 2);
+ }
+ else
+ {
+ na = sizeof(uint32_t) + 2 + m;
+ nb = _TIFFmallocExt(tif, na);
+ if (nb == 0)
+ {
+ TIFFErrorExtR(tif, module, "Out of memory");
+ return (0);
+ }
+ *(uint32_t *)nb = na;
+ nb[sizeof(uint32_t)] = 255;
+ nb[sizeof(uint32_t) + 1] = JPEG_MARKER_DHT;
+ nb[sizeof(uint32_t) + 2] = (m >> 8);
+ nb[sizeof(uint32_t) + 3] = (m & 255);
+ if (OJPEGReadBlock(sp, m - 2, &nb[sizeof(uint32_t) + 4]) == 0)
+ {
+ _TIFFfreeExt(tif, nb);
+ return (0);
+ }
+ o = nb[sizeof(uint32_t) + 4];
+ if ((o & 240) == 0)
+ {
+ if (3 < o)
+ {
+ TIFFErrorExtR(tif, module, "Corrupt DHT marker in JPEG data");
+ _TIFFfreeExt(tif, nb);
+ return (0);
+ }
+ if (sp->dctable[o] != 0)
+ _TIFFfreeExt(tif, sp->dctable[o]);
+ sp->dctable[o] = nb;
+ }
+ else
+ {
+ if ((o & 240) != 16)
+ {
+ TIFFErrorExtR(tif, module, "Corrupt DHT marker in JPEG data");
+ _TIFFfreeExt(tif, nb);
+ return (0);
+ }
+ o &= 15;
+ if (3 < o)
+ {
+ TIFFErrorExtR(tif, module, "Corrupt DHT marker in JPEG data");
+ _TIFFfreeExt(tif, nb);
+ return (0);
+ }
+ if (sp->actable[o] != 0)
+ _TIFFfreeExt(tif, sp->actable[o]);
+ sp->actable[o] = nb;
+ }
+ }
+ return (1);
}
-static int
-OJPEGReadHeaderInfoSecStreamDht(TIFF* tif)
-{
- /* this is a table marker, and it is to be saved as a whole for exact pushing on the jpeg stream later on */
- /* TODO: the following assumes there is only one table in this marker... but i'm not quite sure that assumption is guaranteed correct */
- static const char module[]="OJPEGReadHeaderInfoSecStreamDht";
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- uint16 m;
- uint32 na;
- uint8* nb;
- uint8 o;
- if (OJPEGReadWord(sp,&m)==0)
- return(0);
- if (m<=2)
- {
- if (sp->subsamplingcorrect==0)
- TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT marker in JPEG data");
- return(0);
- }
- if (sp->subsamplingcorrect!=0)
- {
- OJPEGReadSkip(sp,m-2);
- }
- else
- {
- na=sizeof(uint32)+2+m;
- nb=_TIFFmalloc(na);
- if (nb==0)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- *(uint32*)nb=na;
- nb[sizeof(uint32)]=255;
- nb[sizeof(uint32)+1]=JPEG_MARKER_DHT;
- nb[sizeof(uint32)+2]=(m>>8);
- nb[sizeof(uint32)+3]=(m&255);
- if (OJPEGReadBlock(sp,m-2,&nb[sizeof(uint32)+4])==0) {
- _TIFFfree(nb);
- return(0);
+static int OJPEGReadHeaderInfoSecStreamSof(TIFF *tif, uint8_t marker_id)
+{
+ /* this marker needs to be checked, and part of its data needs to be saved
+ * for regeneration later on */
+ static const char module[] = "OJPEGReadHeaderInfoSecStreamSof";
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ uint16_t m;
+ uint16_t n;
+ uint8_t o;
+ uint16_t p;
+ uint16_t q;
+ if (sp->sof_log != 0)
+ {
+ TIFFErrorExtR(tif, module, "Corrupt JPEG data");
+ return (0);
+ }
+ if (sp->subsamplingcorrect == 0)
+ sp->sof_marker_id = marker_id;
+ /* Lf: data length */
+ if (OJPEGReadWord(sp, &m) == 0)
+ return (0);
+ if (m < 11)
+ {
+ if (sp->subsamplingcorrect == 0)
+ TIFFErrorExtR(tif, module, "Corrupt SOF marker in JPEG data");
+ return (0);
+ }
+ m -= 8;
+ if (m % 3 != 0)
+ {
+ if (sp->subsamplingcorrect == 0)
+ TIFFErrorExtR(tif, module, "Corrupt SOF marker in JPEG data");
+ return (0);
+ }
+ n = m / 3;
+ if (sp->subsamplingcorrect == 0)
+ {
+ if (n != sp->samples_per_pixel)
+ {
+ TIFFErrorExtR(
+ tif, module,
+ "JPEG compressed data indicates unexpected number of samples");
+ return (0);
+ }
+ }
+ /* P: Sample precision */
+ if (OJPEGReadByte(sp, &o) == 0)
+ return (0);
+ if (o != 8)
+ {
+ if (sp->subsamplingcorrect == 0)
+ TIFFErrorExtR(tif, module,
+ "JPEG compressed data indicates unexpected number of "
+ "bits per sample");
+ return (0);
+ }
+ /* Y: Number of lines, X: Number of samples per line */
+ if (sp->subsamplingcorrect)
+ OJPEGReadSkip(sp, 4);
+ else
+ {
+ /* Y: Number of lines */
+ if (OJPEGReadWord(sp, &p) == 0)
+ return (0);
+ if (((uint32_t)p < sp->image_length) &&
+ ((uint32_t)p < sp->strile_length_total))
+ {
+ TIFFErrorExtR(tif, module,
+ "JPEG compressed data indicates unexpected height");
+ return (0);
+ }
+ sp->sof_y = p;
+ /* X: Number of samples per line */
+ if (OJPEGReadWord(sp, &p) == 0)
+ return (0);
+ if (((uint32_t)p < sp->image_width) && ((uint32_t)p < sp->strile_width))
+ {
+ TIFFErrorExtR(tif, module,
+ "JPEG compressed data indicates unexpected width");
+ return (0);
+ }
+ if ((uint32_t)p > sp->strile_width)
+ {
+ TIFFErrorExtR(tif, module,
+ "JPEG compressed data image width exceeds expected "
+ "image width");
+ return (0);
+ }
+ sp->sof_x = p;
+ }
+ /* Nf: Number of image components in frame */
+ if (OJPEGReadByte(sp, &o) == 0)
+ return (0);
+ if (o != n)
+ {
+ if (sp->subsamplingcorrect == 0)
+ TIFFErrorExtR(tif, module, "Corrupt SOF marker in JPEG data");
+ return (0);
+ }
+ /* per component stuff */
+ /* TODO: double-check that flow implies that n cannot be as big as to make
+ * us overflow sof_c, sof_hv and sof_tq arrays */
+ for (q = 0; q < n; q++)
+ {
+ /* C: Component identifier */
+ if (OJPEGReadByte(sp, &o) == 0)
+ return (0);
+ if (sp->subsamplingcorrect == 0)
+ sp->sof_c[q] = o;
+ /* H: Horizontal sampling factor, and V: Vertical sampling factor */
+ if (OJPEGReadByte(sp, &o) == 0)
+ return (0);
+ if (sp->subsamplingcorrect != 0)
+ {
+ if (q == 0)
+ {
+ sp->subsampling_hor = (o >> 4);
+ sp->subsampling_ver = (o & 15);
+ if (((sp->subsampling_hor != 1) && (sp->subsampling_hor != 2) &&
+ (sp->subsampling_hor != 4)) ||
+ ((sp->subsampling_ver != 1) && (sp->subsampling_ver != 2) &&
+ (sp->subsampling_ver != 4)))
+ sp->subsampling_force_desubsampling_inside_decompression =
+ 1;
+ }
+ else
+ {
+ if (o != 17)
+ sp->subsampling_force_desubsampling_inside_decompression =
+ 1;
+ }
+ }
+ else
+ {
+ sp->sof_hv[q] = o;
+ if (sp->subsampling_force_desubsampling_inside_decompression == 0)
+ {
+ if (q == 0)
+ {
+ if (o != ((sp->subsampling_hor << 4) | sp->subsampling_ver))
+ {
+ TIFFErrorExtR(tif, module,
+ "JPEG compressed data indicates "
+ "unexpected subsampling values");
+ return (0);
+ }
+ }
+ else
+ {
+ if (o != 17)
+ {
+ TIFFErrorExtR(tif, module,
+ "JPEG compressed data indicates "
+ "unexpected subsampling values");
+ return (0);
+ }
}
- o=nb[sizeof(uint32)+4];
- if ((o&240)==0)
- {
- if (3<o)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT marker in JPEG data");
- _TIFFfree(nb);
- return(0);
- }
- if (sp->dctable[o]!=0)
- _TIFFfree(sp->dctable[o]);
- sp->dctable[o]=nb;
- }
- else
- {
- if ((o&240)!=16)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT marker in JPEG data");
- _TIFFfree(nb);
- return(0);
- }
- o&=15;
- if (3<o)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DHT marker in JPEG data");
- _TIFFfree(nb);
- return(0);
- }
- if (sp->actable[o]!=0)
- _TIFFfree(sp->actable[o]);
- sp->actable[o]=nb;
- }
- }
- return(1);
+ }
+ }
+ /* Tq: Quantization table destination selector */
+ if (OJPEGReadByte(sp, &o) == 0)
+ return (0);
+ if (sp->subsamplingcorrect == 0)
+ sp->sof_tq[q] = o;
+ }
+ if (sp->subsamplingcorrect == 0)
+ sp->sof_log = 1;
+ return (1);
}
-static int
-OJPEGReadHeaderInfoSecStreamSof(TIFF* tif, uint8 marker_id)
-{
- /* this marker needs to be checked, and part of its data needs to be saved for regeneration later on */
- static const char module[]="OJPEGReadHeaderInfoSecStreamSof";
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- uint16 m;
- uint16 n;
- uint8 o;
- uint16 p;
- uint16 q;
- if (sp->sof_log!=0)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JPEG data");
- return(0);
- }
- if (sp->subsamplingcorrect==0)
- sp->sof_marker_id=marker_id;
- /* Lf: data length */
- if (OJPEGReadWord(sp,&m)==0)
- return(0);
- if (m<11)
- {
- if (sp->subsamplingcorrect==0)
- TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOF marker in JPEG data");
- return(0);
- }
- m-=8;
- if (m%3!=0)
- {
- if (sp->subsamplingcorrect==0)
- TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOF marker in JPEG data");
- return(0);
- }
- n=m/3;
- if (sp->subsamplingcorrect==0)
- {
- if (n!=sp->samples_per_pixel)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected number of samples");
- return(0);
- }
- }
- /* P: Sample precision */
- if (OJPEGReadByte(sp,&o)==0)
- return(0);
- if (o!=8)
- {
- if (sp->subsamplingcorrect==0)
- TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected number of bits per sample");
- return(0);
- }
- /* Y: Number of lines, X: Number of samples per line */
- if (sp->subsamplingcorrect)
- OJPEGReadSkip(sp,4);
- else
- {
- /* Y: Number of lines */
- if (OJPEGReadWord(sp,&p)==0)
- return(0);
- if (((uint32)p<sp->image_length) && ((uint32)p<sp->strile_length_total))
- {
- TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected height");
- return(0);
- }
- sp->sof_y=p;
- /* X: Number of samples per line */
- if (OJPEGReadWord(sp,&p)==0)
- return(0);
- if (((uint32)p<sp->image_width) && ((uint32)p<sp->strile_width))
- {
- TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected width");
- return(0);
- }
- if ((uint32)p>sp->strile_width)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data image width exceeds expected image width");
- return(0);
- }
- sp->sof_x=p;
- }
- /* Nf: Number of image components in frame */
- if (OJPEGReadByte(sp,&o)==0)
- return(0);
- if (o!=n)
- {
- if (sp->subsamplingcorrect==0)
- TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOF marker in JPEG data");
- return(0);
- }
- /* per component stuff */
- /* TODO: double-check that flow implies that n cannot be as big as to make us overflow sof_c, sof_hv and sof_tq arrays */
- for (q=0; q<n; q++)
- {
- /* C: Component identifier */
- if (OJPEGReadByte(sp,&o)==0)
- return(0);
- if (sp->subsamplingcorrect==0)
- sp->sof_c[q]=o;
- /* H: Horizontal sampling factor, and V: Vertical sampling factor */
- if (OJPEGReadByte(sp,&o)==0)
- return(0);
- if (sp->subsamplingcorrect!=0)
- {
- if (q==0)
- {
- sp->subsampling_hor=(o>>4);
- sp->subsampling_ver=(o&15);
- if (((sp->subsampling_hor!=1) && (sp->subsampling_hor!=2) && (sp->subsampling_hor!=4)) ||
- ((sp->subsampling_ver!=1) && (sp->subsampling_ver!=2) && (sp->subsampling_ver!=4)))
- sp->subsampling_force_desubsampling_inside_decompression=1;
- }
- else
- {
- if (o!=17)
- sp->subsampling_force_desubsampling_inside_decompression=1;
- }
- }
- else
- {
- sp->sof_hv[q]=o;
- if (sp->subsampling_force_desubsampling_inside_decompression==0)
- {
- if (q==0)
- {
- if (o!=((sp->subsampling_hor<<4)|sp->subsampling_ver))
- {
- TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected subsampling values");
- return(0);
- }
- }
- else
- {
- if (o!=17)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"JPEG compressed data indicates unexpected subsampling values");
- return(0);
- }
- }
- }
- }
- /* Tq: Quantization table destination selector */
- if (OJPEGReadByte(sp,&o)==0)
- return(0);
- if (sp->subsamplingcorrect==0)
- sp->sof_tq[q]=o;
- }
- if (sp->subsamplingcorrect==0)
- sp->sof_log=1;
- return(1);
+static int OJPEGReadHeaderInfoSecStreamSos(TIFF *tif)
+{
+ /* this marker needs to be checked, and part of its data needs to be saved
+ * for regeneration later on */
+ static const char module[] = "OJPEGReadHeaderInfoSecStreamSos";
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ uint16_t m;
+ uint8_t n;
+ uint8_t o;
+ assert(sp->subsamplingcorrect == 0);
+ if (sp->sof_log == 0)
+ {
+ TIFFErrorExtR(tif, module, "Corrupt SOS marker in JPEG data");
+ return (0);
+ }
+ /* Ls */
+ if (OJPEGReadWord(sp, &m) == 0)
+ return (0);
+ if (m != 6 + sp->samples_per_pixel_per_plane * 2)
+ {
+ TIFFErrorExtR(tif, module, "Corrupt SOS marker in JPEG data");
+ return (0);
+ }
+ /* Ns */
+ if (OJPEGReadByte(sp, &n) == 0)
+ return (0);
+ if (n != sp->samples_per_pixel_per_plane)
+ {
+ TIFFErrorExtR(tif, module, "Corrupt SOS marker in JPEG data");
+ return (0);
+ }
+ /* Cs, Td, and Ta */
+ for (o = 0; o < sp->samples_per_pixel_per_plane; o++)
+ {
+ /* Cs */
+ if (OJPEGReadByte(sp, &n) == 0)
+ return (0);
+ sp->sos_cs[sp->plane_sample_offset + o] = n;
+ /* Td and Ta */
+ if (OJPEGReadByte(sp, &n) == 0)
+ return (0);
+ sp->sos_tda[sp->plane_sample_offset + o] = n;
+ }
+ /* skip Ss, Se, Ah, en Al -> no check, as per Tom Lane recommendation, as
+ * per LibJpeg source */
+ OJPEGReadSkip(sp, 3);
+ return (1);
}
-static int
-OJPEGReadHeaderInfoSecStreamSos(TIFF* tif)
-{
- /* this marker needs to be checked, and part of its data needs to be saved for regeneration later on */
- static const char module[]="OJPEGReadHeaderInfoSecStreamSos";
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- uint16 m;
- uint8 n;
- uint8 o;
- assert(sp->subsamplingcorrect==0);
- if (sp->sof_log==0)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOS marker in JPEG data");
- return(0);
- }
- /* Ls */
- if (OJPEGReadWord(sp,&m)==0)
- return(0);
- if (m!=6+sp->samples_per_pixel_per_plane*2)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOS marker in JPEG data");
- return(0);
- }
- /* Ns */
- if (OJPEGReadByte(sp,&n)==0)
- return(0);
- if (n!=sp->samples_per_pixel_per_plane)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Corrupt SOS marker in JPEG data");
- return(0);
- }
- /* Cs, Td, and Ta */
- for (o=0; o<sp->samples_per_pixel_per_plane; o++)
- {
- /* Cs */
- if (OJPEGReadByte(sp,&n)==0)
- return(0);
- sp->sos_cs[sp->plane_sample_offset+o]=n;
- /* Td and Ta */
- if (OJPEGReadByte(sp,&n)==0)
- return(0);
- sp->sos_tda[sp->plane_sample_offset+o]=n;
- }
- /* skip Ss, Se, Ah, en Al -> no check, as per Tom Lane recommendation, as per LibJpeg source */
- OJPEGReadSkip(sp,3);
- return(1);
+static int OJPEGReadHeaderInfoSecTablesQTable(TIFF *tif)
+{
+ static const char module[] = "OJPEGReadHeaderInfoSecTablesQTable";
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ uint8_t m;
+ uint8_t n;
+ uint32_t oa;
+ uint8_t *ob;
+ uint32_t p;
+ if (sp->qtable_offset[0] == 0)
+ {
+ TIFFErrorExtR(tif, module, "Missing JPEG tables");
+ return (0);
+ }
+ sp->in_buffer_file_pos_log = 0;
+ for (m = 0; m < sp->samples_per_pixel; m++)
+ {
+ if ((sp->qtable_offset[m] != 0) &&
+ ((m == 0) || (sp->qtable_offset[m] != sp->qtable_offset[m - 1])))
+ {
+ for (n = 0; n < m - 1; n++)
+ {
+ if (sp->qtable_offset[m] == sp->qtable_offset[n])
+ {
+ TIFFErrorExtR(tif, module, "Corrupt JpegQTables tag value");
+ return (0);
+ }
+ }
+ oa = sizeof(uint32_t) + 69;
+ ob = _TIFFmallocExt(tif, oa);
+ if (ob == 0)
+ {
+ TIFFErrorExtR(tif, module, "Out of memory");
+ return (0);
+ }
+ *(uint32_t *)ob = oa;
+ ob[sizeof(uint32_t)] = 255;
+ ob[sizeof(uint32_t) + 1] = JPEG_MARKER_DQT;
+ ob[sizeof(uint32_t) + 2] = 0;
+ ob[sizeof(uint32_t) + 3] = 67;
+ ob[sizeof(uint32_t) + 4] = m;
+ TIFFSeekFile(tif, sp->qtable_offset[m], SEEK_SET);
+ p = (uint32_t)TIFFReadFile(tif, &ob[sizeof(uint32_t) + 5], 64);
+ if (p != 64)
+ {
+ _TIFFfreeExt(tif, ob);
+ return (0);
+ }
+ if (sp->qtable[m] != 0)
+ _TIFFfreeExt(tif, sp->qtable[m]);
+ sp->qtable[m] = ob;
+ sp->sof_tq[m] = m;
+ }
+ else
+ sp->sof_tq[m] = sp->sof_tq[m - 1];
+ }
+ return (1);
}
-static int
-OJPEGReadHeaderInfoSecTablesQTable(TIFF* tif)
-{
- static const char module[]="OJPEGReadHeaderInfoSecTablesQTable";
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- uint8 m;
- uint8 n;
- uint32 oa;
- uint8* ob;
- uint32 p;
- if (sp->qtable_offset[0]==0)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Missing JPEG tables");
- return(0);
- }
- sp->in_buffer_file_pos_log=0;
- for (m=0; m<sp->samples_per_pixel; m++)
- {
- if ((sp->qtable_offset[m]!=0) && ((m==0) || (sp->qtable_offset[m]!=sp->qtable_offset[m-1])))
- {
- for (n=0; n<m-1; n++)
- {
- if (sp->qtable_offset[m]==sp->qtable_offset[n])
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JpegQTables tag value");
- return(0);
- }
- }
- oa=sizeof(uint32)+69;
- ob=_TIFFmalloc(oa);
- if (ob==0)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- *(uint32*)ob=oa;
- ob[sizeof(uint32)]=255;
- ob[sizeof(uint32)+1]=JPEG_MARKER_DQT;
- ob[sizeof(uint32)+2]=0;
- ob[sizeof(uint32)+3]=67;
- ob[sizeof(uint32)+4]=m;
- TIFFSeekFile(tif,sp->qtable_offset[m],SEEK_SET);
- p=(uint32)TIFFReadFile(tif,&ob[sizeof(uint32)+5],64);
- if (p!=64)
- {
- _TIFFfree(ob);
- return(0);
- }
- if (sp->qtable[m]!=0)
- _TIFFfree(sp->qtable[m]);
- sp->qtable[m]=ob;
- sp->sof_tq[m]=m;
- }
- else
- sp->sof_tq[m]=sp->sof_tq[m-1];
- }
- return(1);
+static int OJPEGReadHeaderInfoSecTablesDcTable(TIFF *tif)
+{
+ static const char module[] = "OJPEGReadHeaderInfoSecTablesDcTable";
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ uint8_t m;
+ uint8_t n;
+ uint8_t o[16];
+ uint32_t p;
+ uint32_t q;
+ uint32_t ra;
+ uint8_t *rb;
+ if (sp->dctable_offset[0] == 0)
+ {
+ TIFFErrorExtR(tif, module, "Missing JPEG tables");
+ return (0);
+ }
+ sp->in_buffer_file_pos_log = 0;
+ for (m = 0; m < sp->samples_per_pixel; m++)
+ {
+ if ((sp->dctable_offset[m] != 0) &&
+ ((m == 0) || (sp->dctable_offset[m] != sp->dctable_offset[m - 1])))
+ {
+ for (n = 0; n < m - 1; n++)
+ {
+ if (sp->dctable_offset[m] == sp->dctable_offset[n])
+ {
+ TIFFErrorExtR(tif, module,
+ "Corrupt JpegDcTables tag value");
+ return (0);
+ }
+ }
+ TIFFSeekFile(tif, sp->dctable_offset[m], SEEK_SET);
+ p = (uint32_t)TIFFReadFile(tif, o, 16);
+ if (p != 16)
+ return (0);
+ q = 0;
+ for (n = 0; n < 16; n++)
+ q += o[n];
+ ra = sizeof(uint32_t) + 21 + q;
+ rb = _TIFFmallocExt(tif, ra);
+ if (rb == 0)
+ {
+ TIFFErrorExtR(tif, module, "Out of memory");
+ return (0);
+ }
+ *(uint32_t *)rb = ra;
+ rb[sizeof(uint32_t)] = 255;
+ rb[sizeof(uint32_t) + 1] = JPEG_MARKER_DHT;
+ rb[sizeof(uint32_t) + 2] = (uint8_t)((19 + q) >> 8);
+ rb[sizeof(uint32_t) + 3] = ((19 + q) & 255);
+ rb[sizeof(uint32_t) + 4] = m;
+ for (n = 0; n < 16; n++)
+ rb[sizeof(uint32_t) + 5 + n] = o[n];
+ p = (uint32_t)TIFFReadFile(tif, &(rb[sizeof(uint32_t) + 21]), q);
+ if (p != q)
+ {
+ _TIFFfreeExt(tif, rb);
+ return (0);
+ }
+ if (sp->dctable[m] != 0)
+ _TIFFfreeExt(tif, sp->dctable[m]);
+ sp->dctable[m] = rb;
+ sp->sos_tda[m] = (m << 4);
+ }
+ else
+ sp->sos_tda[m] = sp->sos_tda[m - 1];
+ }
+ return (1);
}
-static int
-OJPEGReadHeaderInfoSecTablesDcTable(TIFF* tif)
-{
- static const char module[]="OJPEGReadHeaderInfoSecTablesDcTable";
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- uint8 m;
- uint8 n;
- uint8 o[16];
- uint32 p;
- uint32 q;
- uint32 ra;
- uint8* rb;
- if (sp->dctable_offset[0]==0)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Missing JPEG tables");
- return(0);
- }
- sp->in_buffer_file_pos_log=0;
- for (m=0; m<sp->samples_per_pixel; m++)
- {
- if ((sp->dctable_offset[m]!=0) && ((m==0) || (sp->dctable_offset[m]!=sp->dctable_offset[m-1])))
- {
- for (n=0; n<m-1; n++)
- {
- if (sp->dctable_offset[m]==sp->dctable_offset[n])
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JpegDcTables tag value");
- return(0);
- }
- }
- TIFFSeekFile(tif,sp->dctable_offset[m],SEEK_SET);
- p=(uint32)TIFFReadFile(tif,o,16);
- if (p!=16)
- return(0);
- q=0;
- for (n=0; n<16; n++)
- q+=o[n];
- ra=sizeof(uint32)+21+q;
- rb=_TIFFmalloc(ra);
- if (rb==0)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- *(uint32*)rb=ra;
- rb[sizeof(uint32)]=255;
- rb[sizeof(uint32)+1]=JPEG_MARKER_DHT;
- rb[sizeof(uint32)+2]=(uint8)((19+q)>>8);
- rb[sizeof(uint32)+3]=((19+q)&255);
- rb[sizeof(uint32)+4]=m;
- for (n=0; n<16; n++)
- rb[sizeof(uint32)+5+n]=o[n];
- p=(uint32)TIFFReadFile(tif,&(rb[sizeof(uint32)+21]),q);
- if (p!=q)
- {
- _TIFFfree(rb);
- return(0);
- }
- if (sp->dctable[m]!=0)
- _TIFFfree(sp->dctable[m]);
- sp->dctable[m]=rb;
- sp->sos_tda[m]=(m<<4);
- }
- else
- sp->sos_tda[m]=sp->sos_tda[m-1];
- }
- return(1);
+static int OJPEGReadHeaderInfoSecTablesAcTable(TIFF *tif)
+{
+ static const char module[] = "OJPEGReadHeaderInfoSecTablesAcTable";
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ uint8_t m;
+ uint8_t n;
+ uint8_t o[16];
+ uint32_t p;
+ uint32_t q;
+ uint32_t ra;
+ uint8_t *rb;
+ if (sp->actable_offset[0] == 0)
+ {
+ TIFFErrorExtR(tif, module, "Missing JPEG tables");
+ return (0);
+ }
+ sp->in_buffer_file_pos_log = 0;
+ for (m = 0; m < sp->samples_per_pixel; m++)
+ {
+ if ((sp->actable_offset[m] != 0) &&
+ ((m == 0) || (sp->actable_offset[m] != sp->actable_offset[m - 1])))
+ {
+ for (n = 0; n < m - 1; n++)
+ {
+ if (sp->actable_offset[m] == sp->actable_offset[n])
+ {
+ TIFFErrorExtR(tif, module,
+ "Corrupt JpegAcTables tag value");
+ return (0);
+ }
+ }
+ TIFFSeekFile(tif, sp->actable_offset[m], SEEK_SET);
+ p = (uint32_t)TIFFReadFile(tif, o, 16);
+ if (p != 16)
+ return (0);
+ q = 0;
+ for (n = 0; n < 16; n++)
+ q += o[n];
+ ra = sizeof(uint32_t) + 21 + q;
+ rb = _TIFFmallocExt(tif, ra);
+ if (rb == 0)
+ {
+ TIFFErrorExtR(tif, module, "Out of memory");
+ return (0);
+ }
+ *(uint32_t *)rb = ra;
+ rb[sizeof(uint32_t)] = 255;
+ rb[sizeof(uint32_t) + 1] = JPEG_MARKER_DHT;
+ rb[sizeof(uint32_t) + 2] = (uint8_t)((19 + q) >> 8);
+ rb[sizeof(uint32_t) + 3] = ((19 + q) & 255);
+ rb[sizeof(uint32_t) + 4] = (16 | m);
+ for (n = 0; n < 16; n++)
+ rb[sizeof(uint32_t) + 5 + n] = o[n];
+ p = (uint32_t)TIFFReadFile(tif, &(rb[sizeof(uint32_t) + 21]), q);
+ if (p != q)
+ {
+ _TIFFfreeExt(tif, rb);
+ return (0);
+ }
+ if (sp->actable[m] != 0)
+ _TIFFfreeExt(tif, sp->actable[m]);
+ sp->actable[m] = rb;
+ sp->sos_tda[m] = (sp->sos_tda[m] | m);
+ }
+ else
+ sp->sos_tda[m] = (sp->sos_tda[m] | (sp->sos_tda[m - 1] & 15));
+ }
+ return (1);
}
-static int
-OJPEGReadHeaderInfoSecTablesAcTable(TIFF* tif)
-{
- static const char module[]="OJPEGReadHeaderInfoSecTablesAcTable";
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- uint8 m;
- uint8 n;
- uint8 o[16];
- uint32 p;
- uint32 q;
- uint32 ra;
- uint8* rb;
- if (sp->actable_offset[0]==0)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Missing JPEG tables");
- return(0);
- }
- sp->in_buffer_file_pos_log=0;
- for (m=0; m<sp->samples_per_pixel; m++)
- {
- if ((sp->actable_offset[m]!=0) && ((m==0) || (sp->actable_offset[m]!=sp->actable_offset[m-1])))
- {
- for (n=0; n<m-1; n++)
- {
- if (sp->actable_offset[m]==sp->actable_offset[n])
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Corrupt JpegAcTables tag value");
- return(0);
- }
- }
- TIFFSeekFile(tif,sp->actable_offset[m],SEEK_SET);
- p=(uint32)TIFFReadFile(tif,o,16);
- if (p!=16)
- return(0);
- q=0;
- for (n=0; n<16; n++)
- q+=o[n];
- ra=sizeof(uint32)+21+q;
- rb=_TIFFmalloc(ra);
- if (rb==0)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
- return(0);
- }
- *(uint32*)rb=ra;
- rb[sizeof(uint32)]=255;
- rb[sizeof(uint32)+1]=JPEG_MARKER_DHT;
- rb[sizeof(uint32)+2]=(uint8)((19+q)>>8);
- rb[sizeof(uint32)+3]=((19+q)&255);
- rb[sizeof(uint32)+4]=(16|m);
- for (n=0; n<16; n++)
- rb[sizeof(uint32)+5+n]=o[n];
- p=(uint32)TIFFReadFile(tif,&(rb[sizeof(uint32)+21]),q);
- if (p!=q)
+static int OJPEGReadBufferFill(OJPEGState *sp)
+{
+ uint16_t m;
+ tmsize_t n;
+ /* TODO: double-check: when subsamplingcorrect is set, no call to
+ * TIFFErrorExt or TIFFWarningExt should be made in any other case, seek or
+ * read errors should be passed through */
+ do
+ {
+ if (sp->in_buffer_file_togo != 0)
+ {
+ if (sp->in_buffer_file_pos_log == 0)
+ {
+ TIFFSeekFile(sp->tif, sp->in_buffer_file_pos, SEEK_SET);
+ sp->in_buffer_file_pos_log = 1;
+ }
+ m = OJPEG_BUFFER;
+ if ((uint64_t)m > sp->in_buffer_file_togo)
+ m = (uint16_t)sp->in_buffer_file_togo;
+ n = TIFFReadFile(sp->tif, sp->in_buffer, (tmsize_t)m);
+ if (n == 0)
+ return (0);
+ assert(n > 0);
+ assert(n <= OJPEG_BUFFER);
+ assert(n < 65536);
+ assert((uint64_t)n <= sp->in_buffer_file_togo);
+ m = (uint16_t)n;
+ sp->in_buffer_togo = m;
+ sp->in_buffer_cur = sp->in_buffer;
+ sp->in_buffer_file_togo -= m;
+ sp->in_buffer_file_pos += m;
+ break;
+ }
+ sp->in_buffer_file_pos_log = 0;
+ switch (sp->in_buffer_source)
+ {
+ case osibsNotSetYet:
+ if (sp->jpeg_interchange_format != 0)
+ {
+ sp->in_buffer_file_pos = sp->jpeg_interchange_format;
+ sp->in_buffer_file_togo =
+ sp->jpeg_interchange_format_length;
+ }
+ sp->in_buffer_source = osibsJpegInterchangeFormat;
+ break;
+ case osibsJpegInterchangeFormat:
+ sp->in_buffer_source = osibsStrile;
+ break;
+ case osibsStrile:
+ if (sp->in_buffer_next_strile == sp->in_buffer_strile_count)
+ sp->in_buffer_source = osibsEof;
+ else
+ {
+ int err = 0;
+ sp->in_buffer_file_pos = TIFFGetStrileOffsetWithErr(
+ sp->tif, sp->in_buffer_next_strile, &err);
+ if (err)
+ return 0;
+ if (sp->in_buffer_file_pos != 0)
+ {
+ uint64_t bytecount = TIFFGetStrileByteCountWithErr(
+ sp->tif, sp->in_buffer_next_strile, &err);
+ if (err)
+ return 0;
+ if (sp->in_buffer_file_pos >= sp->file_size)
+ sp->in_buffer_file_pos = 0;
+ else if (bytecount == 0)
+ sp->in_buffer_file_togo =
+ sp->file_size - sp->in_buffer_file_pos;
+ else
{
- _TIFFfree(rb);
- return(0);
+ sp->in_buffer_file_togo = bytecount;
+ if (sp->in_buffer_file_togo == 0)
+ sp->in_buffer_file_pos = 0;
+ else if (sp->in_buffer_file_pos >
+ UINT64_MAX - sp->in_buffer_file_togo ||
+ sp->in_buffer_file_pos +
+ sp->in_buffer_file_togo >
+ sp->file_size)
+ sp->in_buffer_file_togo =
+ sp->file_size - sp->in_buffer_file_pos;
}
- if (sp->actable[m]!=0)
- _TIFFfree(sp->actable[m]);
- sp->actable[m]=rb;
- sp->sos_tda[m]=(sp->sos_tda[m]|m);
- }
- else
- sp->sos_tda[m]=(sp->sos_tda[m]|(sp->sos_tda[m-1]&15));
- }
- return(1);
-}
-
-static int
-OJPEGReadBufferFill(OJPEGState* sp)
-{
- uint16 m;
- tmsize_t n;
- /* TODO: double-check: when subsamplingcorrect is set, no call to TIFFErrorExt or TIFFWarningExt should be made
- * in any other case, seek or read errors should be passed through */
- do
- {
- if (sp->in_buffer_file_togo!=0)
- {
- if (sp->in_buffer_file_pos_log==0)
- {
- TIFFSeekFile(sp->tif,sp->in_buffer_file_pos,SEEK_SET);
- sp->in_buffer_file_pos_log=1;
- }
- m=OJPEG_BUFFER;
- if ((uint64)m>sp->in_buffer_file_togo)
- m=(uint16)sp->in_buffer_file_togo;
- n=TIFFReadFile(sp->tif,sp->in_buffer,(tmsize_t)m);
- if (n==0)
- return(0);
- assert(n>0);
- assert(n<=OJPEG_BUFFER);
- assert(n<65536);
- assert((uint64)n<=sp->in_buffer_file_togo);
- m=(uint16)n;
- sp->in_buffer_togo=m;
- sp->in_buffer_cur=sp->in_buffer;
- sp->in_buffer_file_togo-=m;
- sp->in_buffer_file_pos+=m;
- break;
- }
- sp->in_buffer_file_pos_log=0;
- switch(sp->in_buffer_source)
- {
- case osibsNotSetYet:
- if (sp->jpeg_interchange_format!=0)
- {
- sp->in_buffer_file_pos=sp->jpeg_interchange_format;
- sp->in_buffer_file_togo=sp->jpeg_interchange_format_length;
- }
- sp->in_buffer_source=osibsJpegInterchangeFormat;
- break;
- case osibsJpegInterchangeFormat:
- sp->in_buffer_source=osibsStrile;
- break;
- case osibsStrile:
- if (sp->in_buffer_next_strile==sp->in_buffer_strile_count)
- sp->in_buffer_source=osibsEof;
- else
- {
- int err = 0;
- sp->in_buffer_file_pos=TIFFGetStrileOffsetWithErr(sp->tif, sp->in_buffer_next_strile, &err);
- if( err )
- return 0;
- if (sp->in_buffer_file_pos!=0)
- {
- uint64 bytecount = TIFFGetStrileByteCountWithErr(sp->tif, sp->in_buffer_next_strile, &err);
- if( err )
- return 0;
- if (sp->in_buffer_file_pos>=sp->file_size)
- sp->in_buffer_file_pos=0;
- else if (bytecount==0)
- sp->in_buffer_file_togo=sp->file_size-sp->in_buffer_file_pos;
- else
- {
- sp->in_buffer_file_togo=bytecount;
- if (sp->in_buffer_file_togo==0)
- sp->in_buffer_file_pos=0;
- else if (sp->in_buffer_file_pos > TIFF_UINT64_MAX - sp->in_buffer_file_togo ||
- sp->in_buffer_file_pos+sp->in_buffer_file_togo>sp->file_size)
- sp->in_buffer_file_togo=sp->file_size-sp->in_buffer_file_pos;
- }
- }
- sp->in_buffer_next_strile++;
- }
- break;
- default:
- return(0);
- }
- } while (1);
- return(1);
+ }
+ sp->in_buffer_next_strile++;
+ }
+ break;
+ default:
+ return (0);
+ }
+ } while (1);
+ return (1);
}
-static int
-OJPEGReadByte(OJPEGState* sp, uint8* byte)
-{
- if (sp->in_buffer_togo==0)
- {
- if (OJPEGReadBufferFill(sp)==0)
- return(0);
- assert(sp->in_buffer_togo>0);
- }
- *byte=*(sp->in_buffer_cur);
- sp->in_buffer_cur++;
- sp->in_buffer_togo--;
- return(1);
+static int OJPEGReadByte(OJPEGState *sp, uint8_t *byte)
+{
+ if (sp->in_buffer_togo == 0)
+ {
+ if (OJPEGReadBufferFill(sp) == 0)
+ return (0);
+ assert(sp->in_buffer_togo > 0);
+ }
+ *byte = *(sp->in_buffer_cur);
+ sp->in_buffer_cur++;
+ sp->in_buffer_togo--;
+ return (1);
}
-static int
-OJPEGReadBytePeek(OJPEGState* sp, uint8* byte)
-{
- if (sp->in_buffer_togo==0)
- {
- if (OJPEGReadBufferFill(sp)==0)
- return(0);
- assert(sp->in_buffer_togo>0);
- }
- *byte=*(sp->in_buffer_cur);
- return(1);
+static int OJPEGReadBytePeek(OJPEGState *sp, uint8_t *byte)
+{
+ if (sp->in_buffer_togo == 0)
+ {
+ if (OJPEGReadBufferFill(sp) == 0)
+ return (0);
+ assert(sp->in_buffer_togo > 0);
+ }
+ *byte = *(sp->in_buffer_cur);
+ return (1);
}
-static void
-OJPEGReadByteAdvance(OJPEGState* sp)
+static void OJPEGReadByteAdvance(OJPEGState *sp)
{
- assert(sp->in_buffer_togo>0);
- sp->in_buffer_cur++;
- sp->in_buffer_togo--;
+ assert(sp->in_buffer_togo > 0);
+ sp->in_buffer_cur++;
+ sp->in_buffer_togo--;
}
-static int
-OJPEGReadWord(OJPEGState* sp, uint16* word)
-{
- uint8 m;
- if (OJPEGReadByte(sp,&m)==0)
- return(0);
- *word=(m<<8);
- if (OJPEGReadByte(sp,&m)==0)
- return(0);
- *word|=m;
- return(1);
+static int OJPEGReadWord(OJPEGState *sp, uint16_t *word)
+{
+ uint8_t m;
+ if (OJPEGReadByte(sp, &m) == 0)
+ return (0);
+ *word = (m << 8);
+ if (OJPEGReadByte(sp, &m) == 0)
+ return (0);
+ *word |= m;
+ return (1);
}
-static int
-OJPEGReadBlock(OJPEGState* sp, uint16 len, void* mem)
-{
- uint16 mlen;
- uint8* mmem;
- uint16 n;
- assert(len>0);
- mlen=len;
- mmem=mem;
- do
- {
- if (sp->in_buffer_togo==0)
- {
- if (OJPEGReadBufferFill(sp)==0)
- return(0);
- assert(sp->in_buffer_togo>0);
- }
- n=mlen;
- if (n>sp->in_buffer_togo)
- n=sp->in_buffer_togo;
- _TIFFmemcpy(mmem,sp->in_buffer_cur,n);
- sp->in_buffer_cur+=n;
- sp->in_buffer_togo-=n;
- mlen-=n;
- mmem+=n;
- } while(mlen>0);
- return(1);
+static int OJPEGReadBlock(OJPEGState *sp, uint16_t len, void *mem)
+{
+ uint16_t mlen;
+ uint8_t *mmem;
+ uint16_t n;
+ assert(len > 0);
+ mlen = len;
+ mmem = mem;
+ do
+ {
+ if (sp->in_buffer_togo == 0)
+ {
+ if (OJPEGReadBufferFill(sp) == 0)
+ return (0);
+ assert(sp->in_buffer_togo > 0);
+ }
+ n = mlen;
+ if (n > sp->in_buffer_togo)
+ n = sp->in_buffer_togo;
+ _TIFFmemcpy(mmem, sp->in_buffer_cur, n);
+ sp->in_buffer_cur += n;
+ sp->in_buffer_togo -= n;
+ mlen -= n;
+ mmem += n;
+ } while (mlen > 0);
+ return (1);
}
-static void
-OJPEGReadSkip(OJPEGState* sp, uint16 len)
-{
- uint16 m;
- uint16 n;
- m=len;
- n=m;
- if (n>sp->in_buffer_togo)
- n=sp->in_buffer_togo;
- sp->in_buffer_cur+=n;
- sp->in_buffer_togo-=n;
- m-=n;
- if (m>0)
- {
- assert(sp->in_buffer_togo==0);
- n=m;
- if ((uint64)n>sp->in_buffer_file_togo)
- n=(uint16)sp->in_buffer_file_togo;
- sp->in_buffer_file_pos+=n;
- sp->in_buffer_file_togo-=n;
- sp->in_buffer_file_pos_log=0;
- /* we don't skip past jpeginterchangeformat/strile block...
- * if that is asked from us, we're dealing with totally bazurk
- * data anyway, and we've not seen this happening on any
- * testfile, so we might as well likely cause some other
- * meaningless error to be passed at some later time
- */
- }
+static void OJPEGReadSkip(OJPEGState *sp, uint16_t len)
+{
+ uint16_t m;
+ uint16_t n;
+ m = len;
+ n = m;
+ if (n > sp->in_buffer_togo)
+ n = sp->in_buffer_togo;
+ sp->in_buffer_cur += n;
+ sp->in_buffer_togo -= n;
+ m -= n;
+ if (m > 0)
+ {
+ assert(sp->in_buffer_togo == 0);
+ n = m;
+ if ((uint64_t)n > sp->in_buffer_file_togo)
+ n = (uint16_t)sp->in_buffer_file_togo;
+ sp->in_buffer_file_pos += n;
+ sp->in_buffer_file_togo -= n;
+ sp->in_buffer_file_pos_log = 0;
+ /* we don't skip past jpeginterchangeformat/strile block...
+ * if that is asked from us, we're dealing with totally bazurk
+ * data anyway, and we've not seen this happening on any
+ * testfile, so we might as well likely cause some other
+ * meaningless error to be passed at some later time
+ */
+ }
}
-static int
-OJPEGWriteStream(TIFF* tif, void** mem, uint32* len)
-{
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- *len=0;
- do
- {
- assert(sp->out_state<=ososEoi);
- switch(sp->out_state)
- {
- case ososSoi:
- OJPEGWriteStreamSoi(tif,mem,len);
- break;
- case ososQTable0:
- OJPEGWriteStreamQTable(tif,0,mem,len);
- break;
- case ososQTable1:
- OJPEGWriteStreamQTable(tif,1,mem,len);
- break;
- case ososQTable2:
- OJPEGWriteStreamQTable(tif,2,mem,len);
- break;
- case ososQTable3:
- OJPEGWriteStreamQTable(tif,3,mem,len);
- break;
- case ososDcTable0:
- OJPEGWriteStreamDcTable(tif,0,mem,len);
- break;
- case ososDcTable1:
- OJPEGWriteStreamDcTable(tif,1,mem,len);
- break;
- case ososDcTable2:
- OJPEGWriteStreamDcTable(tif,2,mem,len);
- break;
- case ososDcTable3:
- OJPEGWriteStreamDcTable(tif,3,mem,len);
- break;
- case ososAcTable0:
- OJPEGWriteStreamAcTable(tif,0,mem,len);
- break;
- case ososAcTable1:
- OJPEGWriteStreamAcTable(tif,1,mem,len);
- break;
- case ososAcTable2:
- OJPEGWriteStreamAcTable(tif,2,mem,len);
- break;
- case ososAcTable3:
- OJPEGWriteStreamAcTable(tif,3,mem,len);
- break;
- case ososDri:
- OJPEGWriteStreamDri(tif,mem,len);
- break;
- case ososSof:
- OJPEGWriteStreamSof(tif,mem,len);
- break;
- case ososSos:
- OJPEGWriteStreamSos(tif,mem,len);
- break;
- case ososCompressed:
- if (OJPEGWriteStreamCompressed(tif,mem,len)==0)
- return(0);
- break;
- case ososRst:
- OJPEGWriteStreamRst(tif,mem,len);
- break;
- case ososEoi:
- OJPEGWriteStreamEoi(tif,mem,len);
- break;
- }
- } while (*len==0);
- return(1);
+static int OJPEGWriteStream(TIFF *tif, void **mem, uint32_t *len)
+{
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ *len = 0;
+ do
+ {
+ assert(sp->out_state <= ososEoi);
+ switch (sp->out_state)
+ {
+ case ososSoi:
+ OJPEGWriteStreamSoi(tif, mem, len);
+ break;
+ case ososQTable0:
+ OJPEGWriteStreamQTable(tif, 0, mem, len);
+ break;
+ case ososQTable1:
+ OJPEGWriteStreamQTable(tif, 1, mem, len);
+ break;
+ case ososQTable2:
+ OJPEGWriteStreamQTable(tif, 2, mem, len);
+ break;
+ case ososQTable3:
+ OJPEGWriteStreamQTable(tif, 3, mem, len);
+ break;
+ case ososDcTable0:
+ OJPEGWriteStreamDcTable(tif, 0, mem, len);
+ break;
+ case ososDcTable1:
+ OJPEGWriteStreamDcTable(tif, 1, mem, len);
+ break;
+ case ososDcTable2:
+ OJPEGWriteStreamDcTable(tif, 2, mem, len);
+ break;
+ case ososDcTable3:
+ OJPEGWriteStreamDcTable(tif, 3, mem, len);
+ break;
+ case ososAcTable0:
+ OJPEGWriteStreamAcTable(tif, 0, mem, len);
+ break;
+ case ososAcTable1:
+ OJPEGWriteStreamAcTable(tif, 1, mem, len);
+ break;
+ case ososAcTable2:
+ OJPEGWriteStreamAcTable(tif, 2, mem, len);
+ break;
+ case ososAcTable3:
+ OJPEGWriteStreamAcTable(tif, 3, mem, len);
+ break;
+ case ososDri:
+ OJPEGWriteStreamDri(tif, mem, len);
+ break;
+ case ososSof:
+ OJPEGWriteStreamSof(tif, mem, len);
+ break;
+ case ososSos:
+ OJPEGWriteStreamSos(tif, mem, len);
+ break;
+ case ososCompressed:
+ if (OJPEGWriteStreamCompressed(tif, mem, len) == 0)
+ return (0);
+ break;
+ case ososRst:
+ OJPEGWriteStreamRst(tif, mem, len);
+ break;
+ case ososEoi:
+ OJPEGWriteStreamEoi(tif, mem, len);
+ break;
+ }
+ } while (*len == 0);
+ return (1);
}
-static void
-OJPEGWriteStreamSoi(TIFF* tif, void** mem, uint32* len)
-{
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- assert(OJPEG_BUFFER>=2);
- sp->out_buffer[0]=255;
- sp->out_buffer[1]=JPEG_MARKER_SOI;
- *len=2;
- *mem=(void*)sp->out_buffer;
- sp->out_state++;
+static void OJPEGWriteStreamSoi(TIFF *tif, void **mem, uint32_t *len)
+{
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ assert(OJPEG_BUFFER >= 2);
+ sp->out_buffer[0] = 255;
+ sp->out_buffer[1] = JPEG_MARKER_SOI;
+ *len = 2;
+ *mem = (void *)sp->out_buffer;
+ sp->out_state++;
}
-static void
-OJPEGWriteStreamQTable(TIFF* tif, uint8 table_index, void** mem, uint32* len)
-{
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- if (sp->qtable[table_index]!=0)
- {
- *mem=(void*)(sp->qtable[table_index]+sizeof(uint32));
- *len=*((uint32*)sp->qtable[table_index])-sizeof(uint32);
- }
- sp->out_state++;
+static void OJPEGWriteStreamQTable(TIFF *tif, uint8_t table_index, void **mem,
+ uint32_t *len)
+{
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ if (sp->qtable[table_index] != 0)
+ {
+ *mem = (void *)(sp->qtable[table_index] + sizeof(uint32_t));
+ *len = *((uint32_t *)sp->qtable[table_index]) - sizeof(uint32_t);
+ }
+ sp->out_state++;
}
-static void
-OJPEGWriteStreamDcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len)
-{
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- if (sp->dctable[table_index]!=0)
- {
- *mem=(void*)(sp->dctable[table_index]+sizeof(uint32));
- *len=*((uint32*)sp->dctable[table_index])-sizeof(uint32);
- }
- sp->out_state++;
+static void OJPEGWriteStreamDcTable(TIFF *tif, uint8_t table_index, void **mem,
+ uint32_t *len)
+{
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ if (sp->dctable[table_index] != 0)
+ {
+ *mem = (void *)(sp->dctable[table_index] + sizeof(uint32_t));
+ *len = *((uint32_t *)sp->dctable[table_index]) - sizeof(uint32_t);
+ }
+ sp->out_state++;
}
-static void
-OJPEGWriteStreamAcTable(TIFF* tif, uint8 table_index, void** mem, uint32* len)
-{
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- if (sp->actable[table_index]!=0)
- {
- *mem=(void*)(sp->actable[table_index]+sizeof(uint32));
- *len=*((uint32*)sp->actable[table_index])-sizeof(uint32);
- }
- sp->out_state++;
+static void OJPEGWriteStreamAcTable(TIFF *tif, uint8_t table_index, void **mem,
+ uint32_t *len)
+{
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ if (sp->actable[table_index] != 0)
+ {
+ *mem = (void *)(sp->actable[table_index] + sizeof(uint32_t));
+ *len = *((uint32_t *)sp->actable[table_index]) - sizeof(uint32_t);
+ }
+ sp->out_state++;
}
-static void
-OJPEGWriteStreamDri(TIFF* tif, void** mem, uint32* len)
-{
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- assert(OJPEG_BUFFER>=6);
- if (sp->restart_interval!=0)
- {
- sp->out_buffer[0]=255;
- sp->out_buffer[1]=JPEG_MARKER_DRI;
- sp->out_buffer[2]=0;
- sp->out_buffer[3]=4;
- sp->out_buffer[4]=(sp->restart_interval>>8);
- sp->out_buffer[5]=(sp->restart_interval&255);
- *len=6;
- *mem=(void*)sp->out_buffer;
- }
- sp->out_state++;
+static void OJPEGWriteStreamDri(TIFF *tif, void **mem, uint32_t *len)
+{
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ assert(OJPEG_BUFFER >= 6);
+ if (sp->restart_interval != 0)
+ {
+ sp->out_buffer[0] = 255;
+ sp->out_buffer[1] = JPEG_MARKER_DRI;
+ sp->out_buffer[2] = 0;
+ sp->out_buffer[3] = 4;
+ sp->out_buffer[4] = (sp->restart_interval >> 8);
+ sp->out_buffer[5] = (sp->restart_interval & 255);
+ *len = 6;
+ *mem = (void *)sp->out_buffer;
+ }
+ sp->out_state++;
}
-static void
-OJPEGWriteStreamSof(TIFF* tif, void** mem, uint32* len)
-{
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- uint8 m;
- assert(OJPEG_BUFFER>=2+8+sp->samples_per_pixel_per_plane*3);
- assert(255>=8+sp->samples_per_pixel_per_plane*3);
- sp->out_buffer[0]=255;
- sp->out_buffer[1]=sp->sof_marker_id;
- /* Lf */
- sp->out_buffer[2]=0;
- sp->out_buffer[3]=8+sp->samples_per_pixel_per_plane*3;
- /* P */
- sp->out_buffer[4]=8;
- /* Y */
- sp->out_buffer[5]=(uint8)(sp->sof_y>>8);
- sp->out_buffer[6]=(sp->sof_y&255);
- /* X */
- sp->out_buffer[7]=(uint8)(sp->sof_x>>8);
- sp->out_buffer[8]=(sp->sof_x&255);
- /* Nf */
- sp->out_buffer[9]=sp->samples_per_pixel_per_plane;
- for (m=0; m<sp->samples_per_pixel_per_plane; m++)
- {
- /* C */
- sp->out_buffer[10+m*3]=sp->sof_c[sp->plane_sample_offset+m];
- /* H and V */
- sp->out_buffer[10+m*3+1]=sp->sof_hv[sp->plane_sample_offset+m];
- /* Tq */
- sp->out_buffer[10+m*3+2]=sp->sof_tq[sp->plane_sample_offset+m];
- }
- *len=10+sp->samples_per_pixel_per_plane*3;
- *mem=(void*)sp->out_buffer;
- sp->out_state++;
+static void OJPEGWriteStreamSof(TIFF *tif, void **mem, uint32_t *len)
+{
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ uint8_t m;
+ assert(OJPEG_BUFFER >= 2 + 8 + sp->samples_per_pixel_per_plane * 3);
+ assert(255 >= 8 + sp->samples_per_pixel_per_plane * 3);
+ sp->out_buffer[0] = 255;
+ sp->out_buffer[1] = sp->sof_marker_id;
+ /* Lf */
+ sp->out_buffer[2] = 0;
+ sp->out_buffer[3] = 8 + sp->samples_per_pixel_per_plane * 3;
+ /* P */
+ sp->out_buffer[4] = 8;
+ /* Y */
+ sp->out_buffer[5] = (uint8_t)(sp->sof_y >> 8);
+ sp->out_buffer[6] = (sp->sof_y & 255);
+ /* X */
+ sp->out_buffer[7] = (uint8_t)(sp->sof_x >> 8);
+ sp->out_buffer[8] = (sp->sof_x & 255);
+ /* Nf */
+ sp->out_buffer[9] = sp->samples_per_pixel_per_plane;
+ for (m = 0; m < sp->samples_per_pixel_per_plane; m++)
+ {
+ /* C */
+ sp->out_buffer[10 + m * 3] = sp->sof_c[sp->plane_sample_offset + m];
+ /* H and V */
+ sp->out_buffer[10 + m * 3 + 1] =
+ sp->sof_hv[sp->plane_sample_offset + m];
+ /* Tq */
+ sp->out_buffer[10 + m * 3 + 2] =
+ sp->sof_tq[sp->plane_sample_offset + m];
+ }
+ *len = 10 + sp->samples_per_pixel_per_plane * 3;
+ *mem = (void *)sp->out_buffer;
+ sp->out_state++;
}
-static void
-OJPEGWriteStreamSos(TIFF* tif, void** mem, uint32* len)
-{
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- uint8 m;
- assert(OJPEG_BUFFER>=2+6+sp->samples_per_pixel_per_plane*2);
- assert(255>=6+sp->samples_per_pixel_per_plane*2);
- sp->out_buffer[0]=255;
- sp->out_buffer[1]=JPEG_MARKER_SOS;
- /* Ls */
- sp->out_buffer[2]=0;
- sp->out_buffer[3]=6+sp->samples_per_pixel_per_plane*2;
- /* Ns */
- sp->out_buffer[4]=sp->samples_per_pixel_per_plane;
- for (m=0; m<sp->samples_per_pixel_per_plane; m++)
- {
- /* Cs */
- sp->out_buffer[5+m*2]=sp->sos_cs[sp->plane_sample_offset+m];
- /* Td and Ta */
- sp->out_buffer[5+m*2+1]=sp->sos_tda[sp->plane_sample_offset+m];
- }
- /* Ss */
- sp->out_buffer[5+sp->samples_per_pixel_per_plane*2]=0;
- /* Se */
- sp->out_buffer[5+sp->samples_per_pixel_per_plane*2+1]=63;
- /* Ah and Al */
- sp->out_buffer[5+sp->samples_per_pixel_per_plane*2+2]=0;
- *len=8+sp->samples_per_pixel_per_plane*2;
- *mem=(void*)sp->out_buffer;
- sp->out_state++;
+static void OJPEGWriteStreamSos(TIFF *tif, void **mem, uint32_t *len)
+{
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ uint8_t m;
+ assert(OJPEG_BUFFER >= 2 + 6 + sp->samples_per_pixel_per_plane * 2);
+ assert(255 >= 6 + sp->samples_per_pixel_per_plane * 2);
+ sp->out_buffer[0] = 255;
+ sp->out_buffer[1] = JPEG_MARKER_SOS;
+ /* Ls */
+ sp->out_buffer[2] = 0;
+ sp->out_buffer[3] = 6 + sp->samples_per_pixel_per_plane * 2;
+ /* Ns */
+ sp->out_buffer[4] = sp->samples_per_pixel_per_plane;
+ for (m = 0; m < sp->samples_per_pixel_per_plane; m++)
+ {
+ /* Cs */
+ sp->out_buffer[5 + m * 2] = sp->sos_cs[sp->plane_sample_offset + m];
+ /* Td and Ta */
+ sp->out_buffer[5 + m * 2 + 1] =
+ sp->sos_tda[sp->plane_sample_offset + m];
+ }
+ /* Ss */
+ sp->out_buffer[5 + sp->samples_per_pixel_per_plane * 2] = 0;
+ /* Se */
+ sp->out_buffer[5 + sp->samples_per_pixel_per_plane * 2 + 1] = 63;
+ /* Ah and Al */
+ sp->out_buffer[5 + sp->samples_per_pixel_per_plane * 2 + 2] = 0;
+ *len = 8 + sp->samples_per_pixel_per_plane * 2;
+ *mem = (void *)sp->out_buffer;
+ sp->out_state++;
}
-static int
-OJPEGWriteStreamCompressed(TIFF* tif, void** mem, uint32* len)
-{
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- if (sp->in_buffer_togo==0)
- {
- if (OJPEGReadBufferFill(sp)==0)
- return(0);
- assert(sp->in_buffer_togo>0);
- }
- *len=sp->in_buffer_togo;
- *mem=(void*)sp->in_buffer_cur;
- sp->in_buffer_togo=0;
- if (sp->in_buffer_file_togo==0)
- {
- switch(sp->in_buffer_source)
- {
- case osibsStrile:
- if (sp->in_buffer_next_strile<sp->in_buffer_strile_count)
- sp->out_state=ososRst;
- else
- sp->out_state=ososEoi;
- break;
- case osibsEof:
- sp->out_state=ososEoi;
- break;
- default:
- break;
- }
- }
- return(1);
+static int OJPEGWriteStreamCompressed(TIFF *tif, void **mem, uint32_t *len)
+{
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ if (sp->in_buffer_togo == 0)
+ {
+ if (OJPEGReadBufferFill(sp) == 0)
+ return (0);
+ assert(sp->in_buffer_togo > 0);
+ }
+ *len = sp->in_buffer_togo;
+ *mem = (void *)sp->in_buffer_cur;
+ sp->in_buffer_togo = 0;
+ if (sp->in_buffer_file_togo == 0)
+ {
+ switch (sp->in_buffer_source)
+ {
+ case osibsStrile:
+ if (sp->in_buffer_next_strile < sp->in_buffer_strile_count)
+ sp->out_state = ososRst;
+ else
+ sp->out_state = ososEoi;
+ break;
+ case osibsEof:
+ sp->out_state = ososEoi;
+ break;
+ default:
+ break;
+ }
+ }
+ return (1);
}
-static void
-OJPEGWriteStreamRst(TIFF* tif, void** mem, uint32* len)
-{
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- assert(OJPEG_BUFFER>=2);
- sp->out_buffer[0]=255;
- sp->out_buffer[1]=JPEG_MARKER_RST0+sp->restart_index;
- sp->restart_index++;
- if (sp->restart_index==8)
- sp->restart_index=0;
- *len=2;
- *mem=(void*)sp->out_buffer;
- sp->out_state=ososCompressed;
+static void OJPEGWriteStreamRst(TIFF *tif, void **mem, uint32_t *len)
+{
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ assert(OJPEG_BUFFER >= 2);
+ sp->out_buffer[0] = 255;
+ sp->out_buffer[1] = JPEG_MARKER_RST0 + sp->restart_index;
+ sp->restart_index++;
+ if (sp->restart_index == 8)
+ sp->restart_index = 0;
+ *len = 2;
+ *mem = (void *)sp->out_buffer;
+ sp->out_state = ososCompressed;
}
-static void
-OJPEGWriteStreamEoi(TIFF* tif, void** mem, uint32* len)
-{
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- assert(OJPEG_BUFFER>=2);
- sp->out_buffer[0]=255;
- sp->out_buffer[1]=JPEG_MARKER_EOI;
- *len=2;
- *mem=(void*)sp->out_buffer;
+static void OJPEGWriteStreamEoi(TIFF *tif, void **mem, uint32_t *len)
+{
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ assert(OJPEG_BUFFER >= 2);
+ sp->out_buffer[0] = 255;
+ sp->out_buffer[1] = JPEG_MARKER_EOI;
+ *len = 2;
+ *mem = (void *)sp->out_buffer;
}
#ifndef LIBJPEG_ENCAP_EXTERNAL
-static int
-jpeg_create_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo)
-{
- if( SETJMP(sp->exit_jmpbuf) )
- return 0;
- else {
- jpeg_create_decompress(cinfo);
- return 1;
- }
+static int jpeg_create_decompress_encap(OJPEGState *sp,
+ jpeg_decompress_struct *cinfo)
+{
+ if (SETJMP(sp->exit_jmpbuf))
+ return 0;
+ else
+ {
+ jpeg_create_decompress(cinfo);
+ return 1;
+ }
}
#endif
#ifndef LIBJPEG_ENCAP_EXTERNAL
-static int
-jpeg_read_header_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, uint8 require_image)
-{
- if( SETJMP(sp->exit_jmpbuf) )
- return 0;
- else {
- jpeg_read_header(cinfo,require_image);
- return 1;
- }
+static int jpeg_read_header_encap(OJPEGState *sp, jpeg_decompress_struct *cinfo,
+ uint8_t require_image)
+{
+ if (SETJMP(sp->exit_jmpbuf))
+ return 0;
+ else
+ {
+ jpeg_read_header(cinfo, require_image);
+ return 1;
+ }
}
#endif
#ifndef LIBJPEG_ENCAP_EXTERNAL
-static int
-jpeg_start_decompress_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo)
-{
- if( SETJMP(sp->exit_jmpbuf) )
- return 0;
- else {
- jpeg_start_decompress(cinfo);
- return 1;
- }
+static int jpeg_start_decompress_encap(OJPEGState *sp,
+ jpeg_decompress_struct *cinfo)
+{
+ if (SETJMP(sp->exit_jmpbuf))
+ return 0;
+ else
+ {
+ jpeg_start_decompress(cinfo);
+ return 1;
+ }
}
#endif
#ifndef LIBJPEG_ENCAP_EXTERNAL
-static int
-jpeg_read_scanlines_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* scanlines, uint32 max_lines)
-{
- if( SETJMP(sp->exit_jmpbuf) )
- return 0;
- else {
- jpeg_read_scanlines(cinfo,scanlines,max_lines);
- return 1;
- }
+static int jpeg_read_scanlines_encap(OJPEGState *sp,
+ jpeg_decompress_struct *cinfo,
+ void *scanlines, uint32_t max_lines)
+{
+ if (SETJMP(sp->exit_jmpbuf))
+ return 0;
+ else
+ {
+ jpeg_read_scanlines(cinfo, scanlines, max_lines);
+ return 1;
+ }
}
#endif
#ifndef LIBJPEG_ENCAP_EXTERNAL
-static int
-jpeg_read_raw_data_encap(OJPEGState* sp, jpeg_decompress_struct* cinfo, void* data, uint32 max_lines)
-{
- if( SETJMP(sp->exit_jmpbuf) )
- return 0;
- else {
- jpeg_read_raw_data(cinfo,data,max_lines);
- return 1;
- }
+static int jpeg_read_raw_data_encap(OJPEGState *sp,
+ jpeg_decompress_struct *cinfo, void *data,
+ uint32_t max_lines)
+{
+ if (SETJMP(sp->exit_jmpbuf))
+ return 0;
+ else
+ {
+ jpeg_read_raw_data(cinfo, data, max_lines);
+ return 1;
+ }
}
#endif
#ifndef LIBJPEG_ENCAP_EXTERNAL
-static void
-jpeg_encap_unwind(TIFF* tif)
+static void jpeg_encap_unwind(TIFF *tif)
{
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- LONGJMP(sp->exit_jmpbuf,1);
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ LONGJMP(sp->exit_jmpbuf, 1);
}
#endif
-static void
-OJPEGLibjpegJpegErrorMgrOutputMessage(jpeg_common_struct* cinfo)
+static void OJPEGLibjpegJpegErrorMgrOutputMessage(jpeg_common_struct *cinfo)
{
- char buffer[JMSG_LENGTH_MAX];
- (*cinfo->err->format_message)(cinfo,buffer);
- TIFFWarningExt(((TIFF*)(cinfo->client_data))->tif_clientdata,"LibJpeg","%s",buffer);
+ char buffer[JMSG_LENGTH_MAX];
+ (*cinfo->err->format_message)(cinfo, buffer);
+ TIFFWarningExtR(((TIFF *)(cinfo->client_data)), "LibJpeg", "%s", buffer);
}
-static void
-OJPEGLibjpegJpegErrorMgrErrorExit(jpeg_common_struct* cinfo)
+static void OJPEGLibjpegJpegErrorMgrErrorExit(jpeg_common_struct *cinfo)
{
- char buffer[JMSG_LENGTH_MAX];
- (*cinfo->err->format_message)(cinfo,buffer);
- TIFFErrorExt(((TIFF*)(cinfo->client_data))->tif_clientdata,"LibJpeg","%s",buffer);
- jpeg_encap_unwind((TIFF*)(cinfo->client_data));
+ char buffer[JMSG_LENGTH_MAX];
+ (*cinfo->err->format_message)(cinfo, buffer);
+ TIFFErrorExtR(((TIFF *)(cinfo->client_data)), "LibJpeg", "%s", buffer);
+ jpeg_encap_unwind((TIFF *)(cinfo->client_data));
}
-static void
-OJPEGLibjpegJpegSourceMgrInitSource(jpeg_decompress_struct* cinfo)
+static void OJPEGLibjpegJpegSourceMgrInitSource(jpeg_decompress_struct *cinfo)
{
- (void)cinfo;
+ (void)cinfo;
}
static boolean
-OJPEGLibjpegJpegSourceMgrFillInputBuffer(jpeg_decompress_struct* cinfo)
-{
- TIFF* tif=(TIFF*)cinfo->client_data;
- OJPEGState* sp=(OJPEGState*)tif->tif_data;
- void* mem=0;
- uint32 len=0U;
- if (OJPEGWriteStream(tif,&mem,&len)==0)
- {
- TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Premature end of JPEG data");
- jpeg_encap_unwind(tif);
- }
- sp->libjpeg_jpeg_source_mgr.bytes_in_buffer=len;
- sp->libjpeg_jpeg_source_mgr.next_input_byte=mem;
- return(1);
+OJPEGLibjpegJpegSourceMgrFillInputBuffer(jpeg_decompress_struct *cinfo)
+{
+ TIFF *tif = (TIFF *)cinfo->client_data;
+ OJPEGState *sp = (OJPEGState *)tif->tif_data;
+ void *mem = 0;
+ uint32_t len = 0U;
+ if (OJPEGWriteStream(tif, &mem, &len) == 0)
+ {
+ TIFFErrorExtR(tif, "LibJpeg", "Premature end of JPEG data");
+ jpeg_encap_unwind(tif);
+ }
+ sp->libjpeg_jpeg_source_mgr.bytes_in_buffer = len;
+ sp->libjpeg_jpeg_source_mgr.next_input_byte = mem;
+ return (1);
}
static void
-OJPEGLibjpegJpegSourceMgrSkipInputData(jpeg_decompress_struct* cinfo, long num_bytes)
+OJPEGLibjpegJpegSourceMgrSkipInputData(jpeg_decompress_struct *cinfo,
+ long num_bytes)
{
- TIFF* tif=(TIFF*)cinfo->client_data;
- (void)num_bytes;
- TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Unexpected error");
- jpeg_encap_unwind(tif);
+ TIFF *tif = (TIFF *)cinfo->client_data;
+ (void)num_bytes;
+ TIFFErrorExtR(tif, "LibJpeg", "Unexpected error");
+ jpeg_encap_unwind(tif);
}
#ifdef _MSC_VER
-#pragma warning( push )
-#pragma warning( disable : 4702 ) /* unreachable code */
+#pragma warning(push)
+#pragma warning(disable : 4702) /* unreachable code */
#endif
static boolean
-OJPEGLibjpegJpegSourceMgrResyncToRestart(jpeg_decompress_struct* cinfo, int desired)
+OJPEGLibjpegJpegSourceMgrResyncToRestart(jpeg_decompress_struct *cinfo,
+ int desired)
{
- TIFF* tif=(TIFF*)cinfo->client_data;
- (void)desired;
- TIFFErrorExt(tif->tif_clientdata,"LibJpeg","Unexpected error");
- jpeg_encap_unwind(tif);
- return(0);
+ TIFF *tif = (TIFF *)cinfo->client_data;
+ (void)desired;
+ TIFFErrorExtR(tif, "LibJpeg", "Unexpected error");
+ jpeg_encap_unwind(tif);
+ return (0);
}
#ifdef _MSC_VER
-#pragma warning( pop )
+#pragma warning(pop)
#endif
-static void
-OJPEGLibjpegJpegSourceMgrTermSource(jpeg_decompress_struct* cinfo)
+static void OJPEGLibjpegJpegSourceMgrTermSource(jpeg_decompress_struct *cinfo)
{
- (void)cinfo;
+ (void)cinfo;
}
#endif
-
-
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_open.c b/src/3rdparty/libtiff/libtiff/tif_open.c
index 3cb53d4..8a86a26 100644
--- a/src/3rdparty/libtiff/libtiff/tif_open.c
+++ b/src/3rdparty/libtiff/libtiff/tif_open.c
@@ -2,23 +2,23 @@
* Copyright (c) 1988-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -26,480 +26,622 @@
* TIFF Library.
*/
#include "tiffiop.h"
+#include <limits.h>
/*
* Dummy functions to fill the omitted client procedures.
*/
-static int
-_tiffDummyMapProc(thandle_t fd, void** pbase, toff_t* psize)
+static int _tiffDummyMapProc(thandle_t fd, void **pbase, toff_t *psize)
+{
+ (void)fd;
+ (void)pbase;
+ (void)psize;
+ return (0);
+}
+
+static void _tiffDummyUnmapProc(thandle_t fd, void *base, toff_t size)
+{
+ (void)fd;
+ (void)base;
+ (void)size;
+}
+
+int _TIFFgetMode(TIFFOpenOptions *opts, thandle_t clientdata, const char *mode,
+ const char *module)
{
- (void) fd; (void) pbase; (void) psize;
- return (0);
+ int m = -1;
+
+ switch (mode[0])
+ {
+ case 'r':
+ m = O_RDONLY;
+ if (mode[1] == '+')
+ m = O_RDWR;
+ break;
+ case 'w':
+ case 'a':
+ m = O_RDWR | O_CREAT;
+ if (mode[0] == 'w')
+ m |= O_TRUNC;
+ break;
+ default:
+ _TIFFErrorEarly(opts, clientdata, module, "\"%s\": Bad mode", mode);
+ break;
+ }
+ return (m);
}
-static void
-_tiffDummyUnmapProc(thandle_t fd, void* base, toff_t size)
+TIFFOpenOptions *TIFFOpenOptionsAlloc()
{
- (void) fd; (void) base; (void) size;
+ TIFFOpenOptions *opts =
+ (TIFFOpenOptions *)_TIFFcalloc(1, sizeof(TIFFOpenOptions));
+ return opts;
}
-int
-_TIFFgetMode(const char* mode, const char* module)
+void TIFFOpenOptionsFree(TIFFOpenOptions *opts) { _TIFFfree(opts); }
+
+/** Define a limit in bytes for a single memory allocation done by libtiff.
+ * If max_single_mem_alloc is set to 0, no other limit that the underlying
+ * _TIFFmalloc() will be applied, which is the default.
+ */
+void TIFFOpenOptionsSetMaxSingleMemAlloc(TIFFOpenOptions *opts,
+ tmsize_t max_single_mem_alloc)
{
- int m = -1;
-
- switch (mode[0]) {
- case 'r':
- m = O_RDONLY;
- if (mode[1] == '+')
- m = O_RDWR;
- break;
- case 'w':
- case 'a':
- m = O_RDWR|O_CREAT;
- if (mode[0] == 'w')
- m |= O_TRUNC;
- break;
- default:
- TIFFErrorExt(0, module, "\"%s\": Bad mode", mode);
- break;
- }
- return (m);
+ opts->max_single_mem_alloc = max_single_mem_alloc;
}
-TIFF*
-TIFFClientOpen(
- const char* name, const char* mode,
- thandle_t clientdata,
- TIFFReadWriteProc readproc,
- TIFFReadWriteProc writeproc,
- TIFFSeekProc seekproc,
- TIFFCloseProc closeproc,
- TIFFSizeProc sizeproc,
- TIFFMapFileProc mapproc,
- TIFFUnmapFileProc unmapproc
-)
+void TIFFOpenOptionsSetErrorHandlerExtR(TIFFOpenOptions *opts,
+ TIFFErrorHandlerExtR handler,
+ void *errorhandler_user_data)
{
- static const char module[] = "TIFFClientOpen";
- TIFF *tif;
- int m;
- const char* cp;
-
- /* The following are configuration checks. They should be redundant, but should not
- * compile to any actual code in an optimised release build anyway. If any of them
- * fail, (makefile-based or other) configuration is not correct */
- assert(sizeof(uint8)==1);
- assert(sizeof(int8)==1);
- assert(sizeof(uint16)==2);
- assert(sizeof(int16)==2);
- assert(sizeof(uint32)==4);
- assert(sizeof(int32)==4);
- assert(sizeof(uint64)==8);
- assert(sizeof(int64)==8);
- assert(sizeof(tmsize_t)==sizeof(void*));
- {
- union{
- uint8 a8[2];
- uint16 a16;
- } n;
- n.a8[0]=1;
- n.a8[1]=0;
- #ifdef WORDS_BIGENDIAN
- assert(n.a16==256);
- #else
- assert(n.a16==1);
- #endif
- }
-
- m = _TIFFgetMode(mode, module);
- if (m == -1)
- goto bad2;
- tif = (TIFF *)_TIFFmalloc((tmsize_t)(sizeof (TIFF) + strlen(name) + 1));
- if (tif == NULL) {
- TIFFErrorExt(clientdata, module, "%s: Out of memory (TIFF structure)", name);
- goto bad2;
- }
- _TIFFmemset(tif, 0, sizeof (*tif));
- tif->tif_name = (char *)tif + sizeof (TIFF);
- strcpy(tif->tif_name, name);
- tif->tif_mode = m &~ (O_CREAT|O_TRUNC);
- tif->tif_curdir = (uint16) -1; /* non-existent directory */
- tif->tif_curoff = 0;
- tif->tif_curstrip = (uint32) -1; /* invalid strip */
- tif->tif_row = (uint32) -1; /* read/write pre-increment */
- tif->tif_clientdata = clientdata;
- if (!readproc || !writeproc || !seekproc || !closeproc || !sizeproc) {
- TIFFErrorExt(clientdata, module,
- "One of the client procedures is NULL pointer.");
- _TIFFfree(tif);
- goto bad2;
- }
- tif->tif_readproc = readproc;
- tif->tif_writeproc = writeproc;
- tif->tif_seekproc = seekproc;
- tif->tif_closeproc = closeproc;
- tif->tif_sizeproc = sizeproc;
- if (mapproc)
- tif->tif_mapproc = mapproc;
- else
- tif->tif_mapproc = _tiffDummyMapProc;
- if (unmapproc)
- tif->tif_unmapproc = unmapproc;
- else
- tif->tif_unmapproc = _tiffDummyUnmapProc;
- _TIFFSetDefaultCompressionState(tif); /* setup default state */
- /*
- * Default is to return data MSB2LSB and enable the
- * use of memory-mapped files and strip chopping when
- * a file is opened read-only.
- */
- tif->tif_flags = FILLORDER_MSB2LSB;
- if (m == O_RDONLY )
- tif->tif_flags |= TIFF_MAPPED;
-
- #ifdef STRIPCHOP_DEFAULT
- if (m == O_RDONLY || m == O_RDWR)
- tif->tif_flags |= STRIPCHOP_DEFAULT;
- #endif
-
- /*
- * Process library-specific flags in the open mode string.
- * The following flags may be used to control intrinsic library
- * behaviour that may or may not be desirable (usually for
- * compatibility with some application that claims to support
- * TIFF but only supports some brain dead idea of what the
- * vendor thinks TIFF is):
- *
- * 'l' use little-endian byte order for creating a file
- * 'b' use big-endian byte order for creating a file
- * 'L' read/write information using LSB2MSB bit order
- * 'B' read/write information using MSB2LSB bit order
- * 'H' read/write information using host bit order
- * 'M' enable use of memory-mapped files when supported
- * 'm' disable use of memory-mapped files
- * 'C' enable strip chopping support when reading
- * 'c' disable strip chopping support
- * 'h' read TIFF header only, do not load the first IFD
- * '4' ClassicTIFF for creating a file (default)
- * '8' BigTIFF for creating a file
- * 'D' enable use of deferred strip/tile offset/bytecount array loading.
- * 'O' on-demand loading of values instead of whole array loading (implies D)
- *
- * The use of the 'l' and 'b' flags is strongly discouraged.
- * These flags are provided solely because numerous vendors,
- * typically on the PC, do not correctly support TIFF; they
- * only support the Intel little-endian byte order. This
- * support is not configured by default because it supports
- * the violation of the TIFF spec that says that readers *MUST*
- * support both byte orders. It is strongly recommended that
- * you not use this feature except to deal with busted apps
- * that write invalid TIFF. And even in those cases you should
- * bang on the vendors to fix their software.
- *
- * The 'L', 'B', and 'H' flags are intended for applications
- * that can optimize operations on data by using a particular
- * bit order. By default the library returns data in MSB2LSB
- * bit order for compatibility with older versions of this
- * library. Returning data in the bit order of the native CPU
- * makes the most sense but also requires applications to check
- * the value of the FillOrder tag; something they probably do
- * not do right now.
- *
- * The 'M' and 'm' flags are provided because some virtual memory
- * systems exhibit poor behaviour when large images are mapped.
- * These options permit clients to control the use of memory-mapped
- * files on a per-file basis.
- *
- * The 'C' and 'c' flags are provided because the library support
- * for chopping up large strips into multiple smaller strips is not
- * application-transparent and as such can cause problems. The 'c'
- * option permits applications that only want to look at the tags,
- * for example, to get the unadulterated TIFF tag information.
- */
- for (cp = mode; *cp; cp++)
- switch (*cp) {
- case 'b':
- #ifndef WORDS_BIGENDIAN
- if (m&O_CREAT)
- tif->tif_flags |= TIFF_SWAB;
- #endif
- break;
- case 'l':
- #ifdef WORDS_BIGENDIAN
- if ((m&O_CREAT))
- tif->tif_flags |= TIFF_SWAB;
- #endif
- break;
- case 'B':
- tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORDER) |
- FILLORDER_MSB2LSB;
- break;
- case 'L':
- tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORDER) |
- FILLORDER_LSB2MSB;
- break;
- case 'H':
- tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORDER) |
- HOST_FILLORDER;
- break;
- case 'M':
- if (m == O_RDONLY)
- tif->tif_flags |= TIFF_MAPPED;
- break;
- case 'm':
- if (m == O_RDONLY)
- tif->tif_flags &= ~TIFF_MAPPED;
- break;
- case 'C':
- if (m == O_RDONLY)
- tif->tif_flags |= TIFF_STRIPCHOP;
- break;
- case 'c':
- if (m == O_RDONLY)
- tif->tif_flags &= ~TIFF_STRIPCHOP;
- break;
- case 'h':
- tif->tif_flags |= TIFF_HEADERONLY;
- break;
- case '8':
- if (m&O_CREAT)
- tif->tif_flags |= TIFF_BIGTIFF;
- break;
- case 'D':
- tif->tif_flags |= TIFF_DEFERSTRILELOAD;
- break;
- case 'O':
- if( m == O_RDONLY )
- tif->tif_flags |= (TIFF_LAZYSTRILELOAD | TIFF_DEFERSTRILELOAD);
- break;
- }
+ opts->errorhandler = handler;
+ opts->errorhandler_user_data = errorhandler_user_data;
+}
+
+void TIFFOpenOptionsSetWarningHandlerExtR(TIFFOpenOptions *opts,
+ TIFFErrorHandlerExtR handler,
+ void *warnhandler_user_data)
+{
+ opts->warnhandler = handler;
+ opts->warnhandler_user_data = warnhandler_user_data;
+}
+
+static void _TIFFEmitErrorAboveMaxSingleMemAlloc(TIFF *tif,
+ const char *pszFunction,
+ tmsize_t s)
+{
+ TIFFErrorExtR(tif, pszFunction,
+ "Memory allocation of %" PRIu64
+ " bytes is beyond the %" PRIu64
+ " byte limit defined in open options",
+ (uint64_t)s, (uint64_t)tif->tif_max_single_mem_alloc);
+}
+
+/** malloc() version that takes into account memory-specific open options */
+void *_TIFFmallocExt(TIFF *tif, tmsize_t s)
+{
+ if (tif != NULL && tif->tif_max_single_mem_alloc > 0 &&
+ s > tif->tif_max_single_mem_alloc)
+ {
+ _TIFFEmitErrorAboveMaxSingleMemAlloc(tif, "_TIFFmallocExt", s);
+ return NULL;
+ }
+ return _TIFFmalloc(s);
+}
+
+/** calloc() version that takes into account memory-specific open options */
+void *_TIFFcallocExt(TIFF *tif, tmsize_t nmemb, tmsize_t siz)
+{
+ if (tif != NULL && tif->tif_max_single_mem_alloc > 0)
+ {
+ if (nmemb <= 0 || siz <= 0 || nmemb > TIFF_TMSIZE_T_MAX / siz)
+ return NULL;
+ if (nmemb * siz > tif->tif_max_single_mem_alloc)
+ {
+ _TIFFEmitErrorAboveMaxSingleMemAlloc(tif, "_TIFFcallocExt",
+ nmemb * siz);
+ return NULL;
+ }
+ }
+ return _TIFFcalloc(nmemb, siz);
+}
+
+/** realloc() version that takes into account memory-specific open options */
+void *_TIFFreallocExt(TIFF *tif, void *p, tmsize_t s)
+{
+ if (tif != NULL && tif->tif_max_single_mem_alloc > 0 &&
+ s > tif->tif_max_single_mem_alloc)
+ {
+ _TIFFEmitErrorAboveMaxSingleMemAlloc(tif, "_TIFFreallocExt", s);
+ return NULL;
+ }
+ return _TIFFrealloc(p, s);
+}
+
+/** free() version that takes into account memory-specific open options */
+void _TIFFfreeExt(TIFF *tif, void *p)
+{
+ (void)tif;
+ _TIFFfree(p);
+}
+
+TIFF *TIFFClientOpen(const char *name, const char *mode, thandle_t clientdata,
+ TIFFReadWriteProc readproc, TIFFReadWriteProc writeproc,
+ TIFFSeekProc seekproc, TIFFCloseProc closeproc,
+ TIFFSizeProc sizeproc, TIFFMapFileProc mapproc,
+ TIFFUnmapFileProc unmapproc)
+{
+ return TIFFClientOpenExt(name, mode, clientdata, readproc, writeproc,
+ seekproc, closeproc, sizeproc, mapproc, unmapproc,
+ NULL);
+}
+
+TIFF *TIFFClientOpenExt(const char *name, const char *mode,
+ thandle_t clientdata, TIFFReadWriteProc readproc,
+ TIFFReadWriteProc writeproc, TIFFSeekProc seekproc,
+ TIFFCloseProc closeproc, TIFFSizeProc sizeproc,
+ TIFFMapFileProc mapproc, TIFFUnmapFileProc unmapproc,
+ TIFFOpenOptions *opts)
+{
+ static const char module[] = "TIFFClientOpenExt";
+ TIFF *tif;
+ int m;
+ const char *cp;
+
+ /* The following are configuration checks. They should be redundant, but
+ * should not compile to any actual code in an optimised release build
+ * anyway. If any of them fail, (makefile-based or other) configuration is
+ * not correct */
+ assert(sizeof(uint8_t) == 1);
+ assert(sizeof(int8_t) == 1);
+ assert(sizeof(uint16_t) == 2);
+ assert(sizeof(int16_t) == 2);
+ assert(sizeof(uint32_t) == 4);
+ assert(sizeof(int32_t) == 4);
+ assert(sizeof(uint64_t) == 8);
+ assert(sizeof(int64_t) == 8);
+ {
+ union
+ {
+ uint8_t a8[2];
+ uint16_t a16;
+ } n;
+ n.a8[0] = 1;
+ n.a8[1] = 0;
+ (void)n;
+#ifdef WORDS_BIGENDIAN
+ assert(n.a16 == 256);
+#else
+ assert(n.a16 == 1);
+#endif
+ }
+
+ m = _TIFFgetMode(opts, clientdata, mode, module);
+ if (m == -1)
+ goto bad2;
+ tmsize_t size_to_alloc = (tmsize_t)(sizeof(TIFF) + strlen(name) + 1);
+ if (opts && opts->max_single_mem_alloc > 0 &&
+ size_to_alloc > opts->max_single_mem_alloc)
+ {
+ _TIFFErrorEarly(opts, clientdata, module,
+ "%s: Memory allocation of %" PRIu64
+ " bytes is beyond the %" PRIu64
+ " byte limit defined in open options",
+ name, (uint64_t)size_to_alloc,
+ (uint64_t)opts->max_single_mem_alloc);
+ goto bad2;
+ }
+ tif = (TIFF *)_TIFFmallocExt(NULL, size_to_alloc);
+ if (tif == NULL)
+ {
+ _TIFFErrorEarly(opts, clientdata, module,
+ "%s: Out of memory (TIFF structure)", name);
+ goto bad2;
+ }
+ _TIFFmemset(tif, 0, sizeof(*tif));
+ tif->tif_name = (char *)tif + sizeof(TIFF);
+ strcpy(tif->tif_name, name);
+ tif->tif_mode = m & ~(O_CREAT | O_TRUNC);
+ tif->tif_curdir = TIFF_NON_EXISTENT_DIR_NUMBER; /* non-existent directory */
+ tif->tif_curoff = 0;
+ tif->tif_curstrip = (uint32_t)-1; /* invalid strip */
+ tif->tif_row = (uint32_t)-1; /* read/write pre-increment */
+ tif->tif_clientdata = clientdata;
+ tif->tif_readproc = readproc;
+ tif->tif_writeproc = writeproc;
+ tif->tif_seekproc = seekproc;
+ tif->tif_closeproc = closeproc;
+ tif->tif_sizeproc = sizeproc;
+ tif->tif_mapproc = mapproc ? mapproc : _tiffDummyMapProc;
+ tif->tif_unmapproc = unmapproc ? unmapproc : _tiffDummyUnmapProc;
+ if (opts)
+ {
+ tif->tif_errorhandler = opts->errorhandler;
+ tif->tif_errorhandler_user_data = opts->errorhandler_user_data;
+ tif->tif_warnhandler = opts->warnhandler;
+ tif->tif_warnhandler_user_data = opts->warnhandler_user_data;
+ tif->tif_max_single_mem_alloc = opts->max_single_mem_alloc;
+ }
+
+ if (!readproc || !writeproc || !seekproc || !closeproc || !sizeproc)
+ {
+ TIFFErrorExtR(tif, module,
+ "One of the client procedures is NULL pointer.");
+ _TIFFfreeExt(NULL, tif);
+ goto bad2;
+ }
+
+ _TIFFSetDefaultCompressionState(tif); /* setup default state */
+ /*
+ * Default is to return data MSB2LSB and enable the
+ * use of memory-mapped files and strip chopping when
+ * a file is opened read-only.
+ */
+ tif->tif_flags = FILLORDER_MSB2LSB;
+ if (m == O_RDONLY)
+ tif->tif_flags |= TIFF_MAPPED;
+
+#ifdef STRIPCHOP_DEFAULT
+ if (m == O_RDONLY || m == O_RDWR)
+ tif->tif_flags |= STRIPCHOP_DEFAULT;
+#endif
+
+ /*
+ * Process library-specific flags in the open mode string.
+ * The following flags may be used to control intrinsic library
+ * behavior that may or may not be desirable (usually for
+ * compatibility with some application that claims to support
+ * TIFF but only supports some brain dead idea of what the
+ * vendor thinks TIFF is):
+ *
+ * 'l' use little-endian byte order for creating a file
+ * 'b' use big-endian byte order for creating a file
+ * 'L' read/write information using LSB2MSB bit order
+ * 'B' read/write information using MSB2LSB bit order
+ * 'H' read/write information using host bit order
+ * 'M' enable use of memory-mapped files when supported
+ * 'm' disable use of memory-mapped files
+ * 'C' enable strip chopping support when reading
+ * 'c' disable strip chopping support
+ * 'h' read TIFF header only, do not load the first IFD
+ * '4' ClassicTIFF for creating a file (default)
+ * '8' BigTIFF for creating a file
+ * 'D' enable use of deferred strip/tile offset/bytecount array loading.
+ * 'O' on-demand loading of values instead of whole array loading (implies
+ * D)
+ *
+ * The use of the 'l' and 'b' flags is strongly discouraged.
+ * These flags are provided solely because numerous vendors,
+ * typically on the PC, do not correctly support TIFF; they
+ * only support the Intel little-endian byte order. This
+ * support is not configured by default because it supports
+ * the violation of the TIFF spec that says that readers *MUST*
+ * support both byte orders. It is strongly recommended that
+ * you not use this feature except to deal with busted apps
+ * that write invalid TIFF. And even in those cases you should
+ * bang on the vendors to fix their software.
+ *
+ * The 'L', 'B', and 'H' flags are intended for applications
+ * that can optimize operations on data by using a particular
+ * bit order. By default the library returns data in MSB2LSB
+ * bit order for compatibility with older versions of this
+ * library. Returning data in the bit order of the native CPU
+ * makes the most sense but also requires applications to check
+ * the value of the FillOrder tag; something they probably do
+ * not do right now.
+ *
+ * The 'M' and 'm' flags are provided because some virtual memory
+ * systems exhibit poor behavior when large images are mapped.
+ * These options permit clients to control the use of memory-mapped
+ * files on a per-file basis.
+ *
+ * The 'C' and 'c' flags are provided because the library support
+ * for chopping up large strips into multiple smaller strips is not
+ * application-transparent and as such can cause problems. The 'c'
+ * option permits applications that only want to look at the tags,
+ * for example, to get the unadulterated TIFF tag information.
+ */
+ for (cp = mode; *cp; cp++)
+ switch (*cp)
+ {
+ case 'b':
+#ifndef WORDS_BIGENDIAN
+ if (m & O_CREAT)
+ tif->tif_flags |= TIFF_SWAB;
+#endif
+ break;
+ case 'l':
+#ifdef WORDS_BIGENDIAN
+ if ((m & O_CREAT))
+ tif->tif_flags |= TIFF_SWAB;
+#endif
+ break;
+ case 'B':
+ tif->tif_flags =
+ (tif->tif_flags & ~TIFF_FILLORDER) | FILLORDER_MSB2LSB;
+ break;
+ case 'L':
+ tif->tif_flags =
+ (tif->tif_flags & ~TIFF_FILLORDER) | FILLORDER_LSB2MSB;
+ break;
+ case 'H':
+ tif->tif_flags =
+ (tif->tif_flags & ~TIFF_FILLORDER) | HOST_FILLORDER;
+ break;
+ case 'M':
+ if (m == O_RDONLY)
+ tif->tif_flags |= TIFF_MAPPED;
+ break;
+ case 'm':
+ if (m == O_RDONLY)
+ tif->tif_flags &= ~TIFF_MAPPED;
+ break;
+ case 'C':
+ if (m == O_RDONLY)
+ tif->tif_flags |= TIFF_STRIPCHOP;
+ break;
+ case 'c':
+ if (m == O_RDONLY)
+ tif->tif_flags &= ~TIFF_STRIPCHOP;
+ break;
+ case 'h':
+ tif->tif_flags |= TIFF_HEADERONLY;
+ break;
+ case '8':
+ if (m & O_CREAT)
+ tif->tif_flags |= TIFF_BIGTIFF;
+ break;
+ case 'D':
+ tif->tif_flags |= TIFF_DEFERSTRILELOAD;
+ break;
+ case 'O':
+ if (m == O_RDONLY)
+ tif->tif_flags |=
+ (TIFF_LAZYSTRILELOAD | TIFF_DEFERSTRILELOAD);
+ break;
+ }
#ifdef DEFER_STRILE_LOAD
- /* Compatibility with old DEFER_STRILE_LOAD compilation flag */
- /* Probably unneeded, since to the best of my knowledge (E. Rouault) */
- /* GDAL was the only user of this, and will now use the new 'D' flag */
- tif->tif_flags |= TIFF_DEFERSTRILELOAD;
+ /* Compatibility with old DEFER_STRILE_LOAD compilation flag */
+ /* Probably unneeded, since to the best of my knowledge (E. Rouault) */
+ /* GDAL was the only user of this, and will now use the new 'D' flag */
+ tif->tif_flags |= TIFF_DEFERSTRILELOAD;
#endif
- /*
- * Read in TIFF header.
- */
- if ((m & O_TRUNC) ||
- !ReadOK(tif, &tif->tif_header, sizeof (TIFFHeaderClassic))) {
- if (tif->tif_mode == O_RDONLY) {
- TIFFErrorExt(tif->tif_clientdata, name,
- "Cannot read TIFF header");
- goto bad;
- }
- /*
- * Setup header and write.
- */
- #ifdef WORDS_BIGENDIAN
- tif->tif_header.common.tiff_magic = (tif->tif_flags & TIFF_SWAB)
- ? TIFF_LITTLEENDIAN : TIFF_BIGENDIAN;
- #else
- tif->tif_header.common.tiff_magic = (tif->tif_flags & TIFF_SWAB)
- ? TIFF_BIGENDIAN : TIFF_LITTLEENDIAN;
- #endif
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- {
- tif->tif_header.common.tiff_version = TIFF_VERSION_CLASSIC;
- tif->tif_header.classic.tiff_diroff = 0;
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabShort(&tif->tif_header.common.tiff_version);
- tif->tif_header_size = sizeof(TIFFHeaderClassic);
- }
- else
- {
- tif->tif_header.common.tiff_version = TIFF_VERSION_BIG;
- tif->tif_header.big.tiff_offsetsize = 8;
- tif->tif_header.big.tiff_unused = 0;
- tif->tif_header.big.tiff_diroff = 0;
- if (tif->tif_flags & TIFF_SWAB)
- {
- TIFFSwabShort(&tif->tif_header.common.tiff_version);
- TIFFSwabShort(&tif->tif_header.big.tiff_offsetsize);
- }
- tif->tif_header_size = sizeof (TIFFHeaderBig);
- }
- /*
- * The doc for "fopen" for some STD_C_LIBs says that if you
- * open a file for modify ("+"), then you must fseek (or
- * fflush?) between any freads and fwrites. This is not
- * necessary on most systems, but has been shown to be needed
- * on Solaris.
- */
- TIFFSeekFile( tif, 0, SEEK_SET );
- if (!WriteOK(tif, &tif->tif_header, (tmsize_t)(tif->tif_header_size))) {
- TIFFErrorExt(tif->tif_clientdata, name,
- "Error writing TIFF header");
- goto bad;
- }
- /*
- * Setup the byte order handling.
- */
- if (tif->tif_header.common.tiff_magic == TIFF_BIGENDIAN) {
- #ifndef WORDS_BIGENDIAN
- tif->tif_flags |= TIFF_SWAB;
- #endif
- } else {
- #ifdef WORDS_BIGENDIAN
- tif->tif_flags |= TIFF_SWAB;
- #endif
- }
- /*
- * Setup default directory.
- */
- if (!TIFFDefaultDirectory(tif))
- goto bad;
- tif->tif_diroff = 0;
- tif->tif_dirlist = NULL;
- tif->tif_dirlistsize = 0;
- tif->tif_dirnumber = 0;
- return (tif);
- }
- /*
- * Setup the byte order handling.
- */
- if (tif->tif_header.common.tiff_magic != TIFF_BIGENDIAN &&
- tif->tif_header.common.tiff_magic != TIFF_LITTLEENDIAN
- #if MDI_SUPPORT
- &&
- #if HOST_BIGENDIAN
- tif->tif_header.common.tiff_magic != MDI_BIGENDIAN
- #else
- tif->tif_header.common.tiff_magic != MDI_LITTLEENDIAN
- #endif
- ) {
- TIFFErrorExt(tif->tif_clientdata, name,
- "Not a TIFF or MDI file, bad magic number %d (0x%x)",
- #else
- ) {
- TIFFErrorExt(tif->tif_clientdata, name,
- "Not a TIFF file, bad magic number %d (0x%x)",
- #endif
- tif->tif_header.common.tiff_magic,
- tif->tif_header.common.tiff_magic);
- goto bad;
- }
- if (tif->tif_header.common.tiff_magic == TIFF_BIGENDIAN) {
- #ifndef WORDS_BIGENDIAN
- tif->tif_flags |= TIFF_SWAB;
- #endif
- } else {
- #ifdef WORDS_BIGENDIAN
- tif->tif_flags |= TIFF_SWAB;
- #endif
- }
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabShort(&tif->tif_header.common.tiff_version);
- if ((tif->tif_header.common.tiff_version != TIFF_VERSION_CLASSIC)&&
- (tif->tif_header.common.tiff_version != TIFF_VERSION_BIG)) {
- TIFFErrorExt(tif->tif_clientdata, name,
- "Not a TIFF file, bad version number %d (0x%x)",
- tif->tif_header.common.tiff_version,
- tif->tif_header.common.tiff_version);
- goto bad;
- }
- if (tif->tif_header.common.tiff_version == TIFF_VERSION_CLASSIC)
- {
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabLong(&tif->tif_header.classic.tiff_diroff);
- tif->tif_header_size = sizeof(TIFFHeaderClassic);
- }
- else
- {
- if (!ReadOK(tif, ((uint8*)(&tif->tif_header) + sizeof(TIFFHeaderClassic)), (sizeof(TIFFHeaderBig)-sizeof(TIFFHeaderClassic))))
- {
- TIFFErrorExt(tif->tif_clientdata, name,
- "Cannot read TIFF header");
- goto bad;
- }
- if (tif->tif_flags & TIFF_SWAB)
- {
- TIFFSwabShort(&tif->tif_header.big.tiff_offsetsize);
- TIFFSwabLong8(&tif->tif_header.big.tiff_diroff);
- }
- if (tif->tif_header.big.tiff_offsetsize != 8)
- {
- TIFFErrorExt(tif->tif_clientdata, name,
- "Not a TIFF file, bad BigTIFF offsetsize %d (0x%x)",
- tif->tif_header.big.tiff_offsetsize,
- tif->tif_header.big.tiff_offsetsize);
- goto bad;
- }
- if (tif->tif_header.big.tiff_unused != 0)
- {
- TIFFErrorExt(tif->tif_clientdata, name,
- "Not a TIFF file, bad BigTIFF unused %d (0x%x)",
- tif->tif_header.big.tiff_unused,
- tif->tif_header.big.tiff_unused);
- goto bad;
- }
- tif->tif_header_size = sizeof(TIFFHeaderBig);
- tif->tif_flags |= TIFF_BIGTIFF;
- }
- tif->tif_flags |= TIFF_MYBUFFER;
- tif->tif_rawcp = tif->tif_rawdata = 0;
- tif->tif_rawdatasize = 0;
- tif->tif_rawdataoff = 0;
- tif->tif_rawdataloaded = 0;
-
- switch (mode[0]) {
- case 'r':
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- tif->tif_nextdiroff = tif->tif_header.classic.tiff_diroff;
- else
- tif->tif_nextdiroff = tif->tif_header.big.tiff_diroff;
- /*
- * Try to use a memory-mapped file if the client
- * has not explicitly suppressed usage with the
- * 'm' flag in the open mode (see above).
- */
- if (tif->tif_flags & TIFF_MAPPED)
- {
- toff_t n;
- if (TIFFMapFileContents(tif,(void**)(&tif->tif_base),&n))
- {
- tif->tif_size=(tmsize_t)n;
- assert((toff_t)tif->tif_size==n);
- }
- else
- tif->tif_flags &= ~TIFF_MAPPED;
- }
- /*
- * Sometimes we do not want to read the first directory (for example,
- * it may be broken) and want to proceed to other directories. I this
- * case we use the TIFF_HEADERONLY flag to open file and return
- * immediately after reading TIFF header.
- */
- if (tif->tif_flags & TIFF_HEADERONLY)
- return (tif);
-
- /*
- * Setup initial directory.
- */
- if (TIFFReadDirectory(tif)) {
- tif->tif_rawcc = (tmsize_t)-1;
- tif->tif_flags |= TIFF_BUFFERSETUP;
- return (tif);
- }
- break;
- case 'a':
- /*
- * New directories are automatically append
- * to the end of the directory chain when they
- * are written out (see TIFFWriteDirectory).
- */
- if (!TIFFDefaultDirectory(tif))
- goto bad;
- return (tif);
- }
+ /*
+ * Read in TIFF header.
+ */
+ if ((m & O_TRUNC) ||
+ !ReadOK(tif, &tif->tif_header, sizeof(TIFFHeaderClassic)))
+ {
+ if (tif->tif_mode == O_RDONLY)
+ {
+ TIFFErrorExtR(tif, name, "Cannot read TIFF header");
+ goto bad;
+ }
+/*
+ * Setup header and write.
+ */
+#ifdef WORDS_BIGENDIAN
+ tif->tif_header.common.tiff_magic =
+ (tif->tif_flags & TIFF_SWAB) ? TIFF_LITTLEENDIAN : TIFF_BIGENDIAN;
+#else
+ tif->tif_header.common.tiff_magic =
+ (tif->tif_flags & TIFF_SWAB) ? TIFF_BIGENDIAN : TIFF_LITTLEENDIAN;
+#endif
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ {
+ tif->tif_header.common.tiff_version = TIFF_VERSION_CLASSIC;
+ tif->tif_header.classic.tiff_diroff = 0;
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(&tif->tif_header.common.tiff_version);
+ tif->tif_header_size = sizeof(TIFFHeaderClassic);
+ }
+ else
+ {
+ tif->tif_header.common.tiff_version = TIFF_VERSION_BIG;
+ tif->tif_header.big.tiff_offsetsize = 8;
+ tif->tif_header.big.tiff_unused = 0;
+ tif->tif_header.big.tiff_diroff = 0;
+ if (tif->tif_flags & TIFF_SWAB)
+ {
+ TIFFSwabShort(&tif->tif_header.common.tiff_version);
+ TIFFSwabShort(&tif->tif_header.big.tiff_offsetsize);
+ }
+ tif->tif_header_size = sizeof(TIFFHeaderBig);
+ }
+ /*
+ * The doc for "fopen" for some STD_C_LIBs says that if you
+ * open a file for modify ("+"), then you must fseek (or
+ * fflush?) between any freads and fwrites. This is not
+ * necessary on most systems, but has been shown to be needed
+ * on Solaris.
+ */
+ TIFFSeekFile(tif, 0, SEEK_SET);
+ if (!WriteOK(tif, &tif->tif_header, (tmsize_t)(tif->tif_header_size)))
+ {
+ TIFFErrorExtR(tif, name, "Error writing TIFF header");
+ goto bad;
+ }
+ /*
+ * Setup the byte order handling.
+ */
+ if (tif->tif_header.common.tiff_magic == TIFF_BIGENDIAN)
+ {
+#ifndef WORDS_BIGENDIAN
+ tif->tif_flags |= TIFF_SWAB;
+#endif
+ }
+ else
+ {
+#ifdef WORDS_BIGENDIAN
+ tif->tif_flags |= TIFF_SWAB;
+#endif
+ }
+ /*
+ * Setup default directory.
+ */
+ if (!TIFFDefaultDirectory(tif))
+ goto bad;
+ tif->tif_diroff = 0;
+ tif->tif_lastdiroff = 0;
+ tif->tif_dirnumber = 0;
+ return (tif);
+ }
+ /*
+ * Setup the byte order handling.
+ */
+ if (tif->tif_header.common.tiff_magic != TIFF_BIGENDIAN &&
+ tif->tif_header.common.tiff_magic != TIFF_LITTLEENDIAN
+#if MDI_SUPPORT
+ &&
+#if HOST_BIGENDIAN
+ tif->tif_header.common.tiff_magic != MDI_BIGENDIAN
+#else
+ tif->tif_header.common.tiff_magic != MDI_LITTLEENDIAN
+#endif
+ )
+ {
+ TIFFErrorExtR(tif, name,
+ "Not a TIFF or MDI file, bad magic number %" PRIu16
+ " (0x%" PRIx16 ")",
+#else
+ )
+ {
+ TIFFErrorExtR(tif, name,
+ "Not a TIFF file, bad magic number %" PRIu16
+ " (0x%" PRIx16 ")",
+#endif
+ tif->tif_header.common.tiff_magic,
+ tif->tif_header.common.tiff_magic);
+ goto bad;
+ }
+ if (tif->tif_header.common.tiff_magic == TIFF_BIGENDIAN)
+ {
+#ifndef WORDS_BIGENDIAN
+ tif->tif_flags |= TIFF_SWAB;
+#endif
+ }
+ else
+ {
+#ifdef WORDS_BIGENDIAN
+ tif->tif_flags |= TIFF_SWAB;
+#endif
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabShort(&tif->tif_header.common.tiff_version);
+ if ((tif->tif_header.common.tiff_version != TIFF_VERSION_CLASSIC) &&
+ (tif->tif_header.common.tiff_version != TIFF_VERSION_BIG))
+ {
+ TIFFErrorExtR(tif, name,
+ "Not a TIFF file, bad version number %" PRIu16
+ " (0x%" PRIx16 ")",
+ tif->tif_header.common.tiff_version,
+ tif->tif_header.common.tiff_version);
+ goto bad;
+ }
+ if (tif->tif_header.common.tiff_version == TIFF_VERSION_CLASSIC)
+ {
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabLong(&tif->tif_header.classic.tiff_diroff);
+ tif->tif_header_size = sizeof(TIFFHeaderClassic);
+ }
+ else
+ {
+ if (!ReadOK(tif,
+ ((uint8_t *)(&tif->tif_header) + sizeof(TIFFHeaderClassic)),
+ (sizeof(TIFFHeaderBig) - sizeof(TIFFHeaderClassic))))
+ {
+ TIFFErrorExtR(tif, name, "Cannot read TIFF header");
+ goto bad;
+ }
+ if (tif->tif_flags & TIFF_SWAB)
+ {
+ TIFFSwabShort(&tif->tif_header.big.tiff_offsetsize);
+ TIFFSwabLong8(&tif->tif_header.big.tiff_diroff);
+ }
+ if (tif->tif_header.big.tiff_offsetsize != 8)
+ {
+ TIFFErrorExtR(tif, name,
+ "Not a TIFF file, bad BigTIFF offsetsize %" PRIu16
+ " (0x%" PRIx16 ")",
+ tif->tif_header.big.tiff_offsetsize,
+ tif->tif_header.big.tiff_offsetsize);
+ goto bad;
+ }
+ if (tif->tif_header.big.tiff_unused != 0)
+ {
+ TIFFErrorExtR(tif, name,
+ "Not a TIFF file, bad BigTIFF unused %" PRIu16
+ " (0x%" PRIx16 ")",
+ tif->tif_header.big.tiff_unused,
+ tif->tif_header.big.tiff_unused);
+ goto bad;
+ }
+ tif->tif_header_size = sizeof(TIFFHeaderBig);
+ tif->tif_flags |= TIFF_BIGTIFF;
+ }
+ tif->tif_flags |= TIFF_MYBUFFER;
+ tif->tif_rawcp = tif->tif_rawdata = 0;
+ tif->tif_rawdatasize = 0;
+ tif->tif_rawdataoff = 0;
+ tif->tif_rawdataloaded = 0;
+
+ switch (mode[0])
+ {
+ case 'r':
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ tif->tif_nextdiroff = tif->tif_header.classic.tiff_diroff;
+ else
+ tif->tif_nextdiroff = tif->tif_header.big.tiff_diroff;
+ /*
+ * Try to use a memory-mapped file if the client
+ * has not explicitly suppressed usage with the
+ * 'm' flag in the open mode (see above).
+ */
+ if (tif->tif_flags & TIFF_MAPPED)
+ {
+ toff_t n;
+ if (TIFFMapFileContents(tif, (void **)(&tif->tif_base), &n))
+ {
+ tif->tif_size = (tmsize_t)n;
+ assert((toff_t)tif->tif_size == n);
+ }
+ else
+ tif->tif_flags &= ~TIFF_MAPPED;
+ }
+ /*
+ * Sometimes we do not want to read the first directory (for
+ * example, it may be broken) and want to proceed to other
+ * directories. I this case we use the TIFF_HEADERONLY flag to open
+ * file and return immediately after reading TIFF header.
+ */
+ if (tif->tif_flags & TIFF_HEADERONLY)
+ return (tif);
+
+ /*
+ * Setup initial directory.
+ */
+ if (TIFFReadDirectory(tif))
+ {
+ return (tif);
+ }
+ break;
+ case 'a':
+ /*
+ * New directories are automatically append
+ * to the end of the directory chain when they
+ * are written out (see TIFFWriteDirectory).
+ */
+ if (!TIFFDefaultDirectory(tif))
+ goto bad;
+ return (tif);
+ }
bad:
- tif->tif_mode = O_RDONLY; /* XXX avoid flush */
- TIFFCleanup(tif);
+ tif->tif_mode = O_RDONLY; /* XXX avoid flush */
+ TIFFCleanup(tif);
bad2:
- return ((TIFF*)0);
+ return ((TIFF *)0);
}
/*
@@ -509,233 +651,154 @@ bad2:
/*
* Return open file's name.
*/
-const char *
-TIFFFileName(TIFF* tif)
-{
- return (tif->tif_name);
-}
+const char *TIFFFileName(TIFF *tif) { return (tif->tif_name); }
/*
* Set the file name.
*/
-const char *
-TIFFSetFileName(TIFF* tif, const char *name)
+const char *TIFFSetFileName(TIFF *tif, const char *name)
{
- const char* old_name = tif->tif_name;
- tif->tif_name = (char *)name;
- return (old_name);
+ const char *old_name = tif->tif_name;
+ tif->tif_name = (char *)name;
+ return (old_name);
}
/*
* Return open file's I/O descriptor.
*/
-int
-TIFFFileno(TIFF* tif)
-{
- return (tif->tif_fd);
-}
+int TIFFFileno(TIFF *tif) { return (tif->tif_fd); }
/*
* Set open file's I/O descriptor, and return previous value.
*/
-int
-TIFFSetFileno(TIFF* tif, int fd)
+int TIFFSetFileno(TIFF *tif, int fd)
{
- int old_fd = tif->tif_fd;
- tif->tif_fd = fd;
- return old_fd;
+ int old_fd = tif->tif_fd;
+ tif->tif_fd = fd;
+ return old_fd;
}
/*
* Return open file's clientdata.
*/
-thandle_t
-TIFFClientdata(TIFF* tif)
-{
- return (tif->tif_clientdata);
-}
+thandle_t TIFFClientdata(TIFF *tif) { return (tif->tif_clientdata); }
/*
* Set open file's clientdata, and return previous value.
*/
-thandle_t
-TIFFSetClientdata(TIFF* tif, thandle_t newvalue)
+thandle_t TIFFSetClientdata(TIFF *tif, thandle_t newvalue)
{
- thandle_t m = tif->tif_clientdata;
- tif->tif_clientdata = newvalue;
- return m;
+ thandle_t m = tif->tif_clientdata;
+ tif->tif_clientdata = newvalue;
+ return m;
}
/*
* Return read/write mode.
*/
-int
-TIFFGetMode(TIFF* tif)
-{
- return (tif->tif_mode);
-}
+int TIFFGetMode(TIFF *tif) { return (tif->tif_mode); }
/*
* Return read/write mode.
*/
-int
-TIFFSetMode(TIFF* tif, int mode)
+int TIFFSetMode(TIFF *tif, int mode)
{
- int old_mode = tif->tif_mode;
- tif->tif_mode = mode;
- return (old_mode);
+ int old_mode = tif->tif_mode;
+ tif->tif_mode = mode;
+ return (old_mode);
}
/*
* Return nonzero if file is organized in
* tiles; zero if organized as strips.
*/
-int
-TIFFIsTiled(TIFF* tif)
-{
- return (isTiled(tif));
-}
+int TIFFIsTiled(TIFF *tif) { return (isTiled(tif)); }
/*
* Return current row being read/written.
*/
-uint32
-TIFFCurrentRow(TIFF* tif)
-{
- return (tif->tif_row);
-}
+uint32_t TIFFCurrentRow(TIFF *tif) { return (tif->tif_row); }
/*
* Return index of the current directory.
*/
-uint16
-TIFFCurrentDirectory(TIFF* tif)
-{
- return (tif->tif_curdir);
-}
+tdir_t TIFFCurrentDirectory(TIFF *tif) { return (tif->tif_curdir); }
/*
* Return current strip.
*/
-uint32
-TIFFCurrentStrip(TIFF* tif)
-{
- return (tif->tif_curstrip);
-}
+uint32_t TIFFCurrentStrip(TIFF *tif) { return (tif->tif_curstrip); }
/*
* Return current tile.
*/
-uint32
-TIFFCurrentTile(TIFF* tif)
-{
- return (tif->tif_curtile);
-}
+uint32_t TIFFCurrentTile(TIFF *tif) { return (tif->tif_curtile); }
/*
* Return nonzero if the file has byte-swapped data.
*/
-int
-TIFFIsByteSwapped(TIFF* tif)
-{
- return ((tif->tif_flags & TIFF_SWAB) != 0);
-}
+int TIFFIsByteSwapped(TIFF *tif) { return ((tif->tif_flags & TIFF_SWAB) != 0); }
/*
* Return nonzero if the data is returned up-sampled.
*/
-int
-TIFFIsUpSampled(TIFF* tif)
-{
- return (isUpSampled(tif));
-}
+int TIFFIsUpSampled(TIFF *tif) { return (isUpSampled(tif)); }
/*
* Return nonzero if the data is returned in MSB-to-LSB bit order.
*/
-int
-TIFFIsMSB2LSB(TIFF* tif)
-{
- return (isFillOrder(tif, FILLORDER_MSB2LSB));
-}
+int TIFFIsMSB2LSB(TIFF *tif) { return (isFillOrder(tif, FILLORDER_MSB2LSB)); }
/*
* Return nonzero if given file was written in big-endian order.
*/
-int
-TIFFIsBigEndian(TIFF* tif)
+int TIFFIsBigEndian(TIFF *tif)
{
- return (tif->tif_header.common.tiff_magic == TIFF_BIGENDIAN);
+ return (tif->tif_header.common.tiff_magic == TIFF_BIGENDIAN);
}
/*
- * Return pointer to file read method.
+ * Return nonzero if given file is BigTIFF style.
*/
-TIFFReadWriteProc
-TIFFGetReadProc(TIFF* tif)
+int TIFFIsBigTIFF(TIFF *tif)
{
- return (tif->tif_readproc);
+ return (tif->tif_header.common.tiff_version == TIFF_VERSION_BIG);
}
/*
+ * Return pointer to file read method.
+ */
+TIFFReadWriteProc TIFFGetReadProc(TIFF *tif) { return (tif->tif_readproc); }
+
+/*
* Return pointer to file write method.
*/
-TIFFReadWriteProc
-TIFFGetWriteProc(TIFF* tif)
-{
- return (tif->tif_writeproc);
-}
+TIFFReadWriteProc TIFFGetWriteProc(TIFF *tif) { return (tif->tif_writeproc); }
/*
* Return pointer to file seek method.
*/
-TIFFSeekProc
-TIFFGetSeekProc(TIFF* tif)
-{
- return (tif->tif_seekproc);
-}
+TIFFSeekProc TIFFGetSeekProc(TIFF *tif) { return (tif->tif_seekproc); }
/*
* Return pointer to file close method.
*/
-TIFFCloseProc
-TIFFGetCloseProc(TIFF* tif)
-{
- return (tif->tif_closeproc);
-}
+TIFFCloseProc TIFFGetCloseProc(TIFF *tif) { return (tif->tif_closeproc); }
/*
* Return pointer to file size requesting method.
*/
-TIFFSizeProc
-TIFFGetSizeProc(TIFF* tif)
-{
- return (tif->tif_sizeproc);
-}
+TIFFSizeProc TIFFGetSizeProc(TIFF *tif) { return (tif->tif_sizeproc); }
/*
* Return pointer to memory mapping method.
*/
-TIFFMapFileProc
-TIFFGetMapFileProc(TIFF* tif)
-{
- return (tif->tif_mapproc);
-}
+TIFFMapFileProc TIFFGetMapFileProc(TIFF *tif) { return (tif->tif_mapproc); }
/*
* Return pointer to memory unmapping method.
*/
-TIFFUnmapFileProc
-TIFFGetUnmapFileProc(TIFF* tif)
+TIFFUnmapFileProc TIFFGetUnmapFileProc(TIFF *tif)
{
- return (tif->tif_unmapproc);
+ return (tif->tif_unmapproc);
}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_packbits.c b/src/3rdparty/libtiff/libtiff/tif_packbits.c
index a8f29e8..62849f8 100644
--- a/src/3rdparty/libtiff/libtiff/tif_packbits.c
+++ b/src/3rdparty/libtiff/libtiff/tif_packbits.c
@@ -2,23 +2,23 @@
* Copyright (c) 1988-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -31,157 +31,178 @@
*/
#include <stdio.h>
-static int
-PackBitsPreEncode(TIFF* tif, uint16 s)
+static int PackBitsPreEncode(TIFF *tif, uint16_t s)
{
- (void) s;
+ (void)s;
- tif->tif_data = (uint8*)_TIFFmalloc(sizeof(tmsize_t));
- if (tif->tif_data == NULL)
- return (0);
- /*
- * Calculate the scanline/tile-width size in bytes.
- */
- if (isTiled(tif))
- *(tmsize_t*)tif->tif_data = TIFFTileRowSize(tif);
- else
- *(tmsize_t*)tif->tif_data = TIFFScanlineSize(tif);
- return (1);
+ tif->tif_data = (uint8_t *)_TIFFmallocExt(tif, sizeof(tmsize_t));
+ if (tif->tif_data == NULL)
+ return (0);
+ /*
+ * Calculate the scanline/tile-width size in bytes.
+ */
+ if (isTiled(tif))
+ *(tmsize_t *)tif->tif_data = TIFFTileRowSize(tif);
+ else
+ *(tmsize_t *)tif->tif_data = TIFFScanlineSize(tif);
+ return (1);
}
-static int
-PackBitsPostEncode(TIFF* tif)
+static int PackBitsPostEncode(TIFF *tif)
{
- if (tif->tif_data)
- _TIFFfree(tif->tif_data);
- return (1);
+ if (tif->tif_data)
+ _TIFFfreeExt(tif, tif->tif_data);
+ return (1);
}
/*
* Encode a run of pixels.
*/
-static int
-PackBitsEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
+static int PackBitsEncode(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s)
{
- unsigned char* bp = (unsigned char*) buf;
- uint8* op;
- uint8* ep;
- uint8* lastliteral;
- long n, slop;
- int b;
- enum { BASE, LITERAL, RUN, LITERAL_RUN } state;
+ unsigned char *bp = (unsigned char *)buf;
+ uint8_t *op;
+ uint8_t *ep;
+ uint8_t *lastliteral;
+ long n, slop;
+ int b;
+ enum
+ {
+ BASE,
+ LITERAL,
+ RUN,
+ LITERAL_RUN
+ } state;
- (void) s;
- op = tif->tif_rawcp;
- ep = tif->tif_rawdata + tif->tif_rawdatasize;
- state = BASE;
- lastliteral = 0;
- while (cc > 0) {
- /*
- * Find the longest string of identical bytes.
- */
- b = *bp++;
- cc--;
- n = 1;
- for (; cc > 0 && b == *bp; cc--, bp++)
- n++;
- again:
- if (op + 2 >= ep) { /* insure space for new data */
- /*
- * Be careful about writing the last
- * literal. Must write up to that point
- * and then copy the remainder to the
- * front of the buffer.
- */
- if (state == LITERAL || state == LITERAL_RUN) {
- slop = (long)(op - lastliteral);
- tif->tif_rawcc += (tmsize_t)(lastliteral - tif->tif_rawcp);
- if (!TIFFFlushData1(tif))
- return (0);
- op = tif->tif_rawcp;
- while (slop-- > 0)
- *op++ = *lastliteral++;
- lastliteral = tif->tif_rawcp;
- } else {
- tif->tif_rawcc += (tmsize_t)(op - tif->tif_rawcp);
- if (!TIFFFlushData1(tif))
- return (0);
- op = tif->tif_rawcp;
- }
- }
- switch (state) {
- case BASE: /* initial state, set run/literal */
- if (n > 1) {
- state = RUN;
- if (n > 128) {
- *op++ = (uint8) -127;
- *op++ = (uint8) b;
- n -= 128;
- goto again;
- }
- *op++ = (uint8)(-(n-1));
- *op++ = (uint8) b;
- } else {
- lastliteral = op;
- *op++ = 0;
- *op++ = (uint8) b;
- state = LITERAL;
- }
- break;
- case LITERAL: /* last object was literal string */
- if (n > 1) {
- state = LITERAL_RUN;
- if (n > 128) {
- *op++ = (uint8) -127;
- *op++ = (uint8) b;
- n -= 128;
- goto again;
- }
- *op++ = (uint8)(-(n-1)); /* encode run */
- *op++ = (uint8) b;
- } else { /* extend literal */
- if (++(*lastliteral) == 127)
- state = BASE;
- *op++ = (uint8) b;
- }
- break;
- case RUN: /* last object was run */
- if (n > 1) {
- if (n > 128) {
- *op++ = (uint8) -127;
- *op++ = (uint8) b;
- n -= 128;
- goto again;
- }
- *op++ = (uint8)(-(n-1));
- *op++ = (uint8) b;
- } else {
- lastliteral = op;
- *op++ = 0;
- *op++ = (uint8) b;
- state = LITERAL;
- }
- break;
- case LITERAL_RUN: /* literal followed by a run */
- /*
- * Check to see if previous run should
- * be converted to a literal, in which
- * case we convert literal-run-literal
- * to a single literal.
- */
- if (n == 1 && op[-2] == (uint8) -1 &&
- *lastliteral < 126) {
- state = (((*lastliteral) += 2) == 127 ?
- BASE : LITERAL);
- op[-2] = op[-1]; /* replicate */
- } else
- state = RUN;
- goto again;
- }
- }
- tif->tif_rawcc += (tmsize_t)(op - tif->tif_rawcp);
- tif->tif_rawcp = op;
- return (1);
+ (void)s;
+ op = tif->tif_rawcp;
+ ep = tif->tif_rawdata + tif->tif_rawdatasize;
+ state = BASE;
+ lastliteral = 0;
+ while (cc > 0)
+ {
+ /*
+ * Find the longest string of identical bytes.
+ */
+ b = *bp++;
+ cc--;
+ n = 1;
+ for (; cc > 0 && b == *bp; cc--, bp++)
+ n++;
+ again:
+ if (op + 2 >= ep)
+ { /* insure space for new data */
+ /*
+ * Be careful about writing the last
+ * literal. Must write up to that point
+ * and then copy the remainder to the
+ * front of the buffer.
+ */
+ if (state == LITERAL || state == LITERAL_RUN)
+ {
+ slop = (long)(op - lastliteral);
+ tif->tif_rawcc += (tmsize_t)(lastliteral - tif->tif_rawcp);
+ if (!TIFFFlushData1(tif))
+ return (0);
+ op = tif->tif_rawcp;
+ while (slop-- > 0)
+ *op++ = *lastliteral++;
+ lastliteral = tif->tif_rawcp;
+ }
+ else
+ {
+ tif->tif_rawcc += (tmsize_t)(op - tif->tif_rawcp);
+ if (!TIFFFlushData1(tif))
+ return (0);
+ op = tif->tif_rawcp;
+ }
+ }
+ switch (state)
+ {
+ case BASE: /* initial state, set run/literal */
+ if (n > 1)
+ {
+ state = RUN;
+ if (n > 128)
+ {
+ *op++ = (uint8_t)-127;
+ *op++ = (uint8_t)b;
+ n -= 128;
+ goto again;
+ }
+ *op++ = (uint8_t)(-(n - 1));
+ *op++ = (uint8_t)b;
+ }
+ else
+ {
+ lastliteral = op;
+ *op++ = 0;
+ *op++ = (uint8_t)b;
+ state = LITERAL;
+ }
+ break;
+ case LITERAL: /* last object was literal string */
+ if (n > 1)
+ {
+ state = LITERAL_RUN;
+ if (n > 128)
+ {
+ *op++ = (uint8_t)-127;
+ *op++ = (uint8_t)b;
+ n -= 128;
+ goto again;
+ }
+ *op++ = (uint8_t)(-(n - 1)); /* encode run */
+ *op++ = (uint8_t)b;
+ }
+ else
+ { /* extend literal */
+ if (++(*lastliteral) == 127)
+ state = BASE;
+ *op++ = (uint8_t)b;
+ }
+ break;
+ case RUN: /* last object was run */
+ if (n > 1)
+ {
+ if (n > 128)
+ {
+ *op++ = (uint8_t)-127;
+ *op++ = (uint8_t)b;
+ n -= 128;
+ goto again;
+ }
+ *op++ = (uint8_t)(-(n - 1));
+ *op++ = (uint8_t)b;
+ }
+ else
+ {
+ lastliteral = op;
+ *op++ = 0;
+ *op++ = (uint8_t)b;
+ state = LITERAL;
+ }
+ break;
+ case LITERAL_RUN: /* literal followed by a run */
+ /*
+ * Check to see if previous run should
+ * be converted to a literal, in which
+ * case we convert literal-run-literal
+ * to a single literal.
+ */
+ if (n == 1 && op[-2] == (uint8_t)-1 && *lastliteral < 126)
+ {
+ state = (((*lastliteral) += 2) == 127 ? BASE : LITERAL);
+ op[-2] = op[-1]; /* replicate */
+ }
+ else
+ state = RUN;
+ goto again;
+ }
+ }
+ tif->tif_rawcc += (tmsize_t)(op - tif->tif_rawcp);
+ tif->tif_rawcp = op;
+ return (1);
}
/*
@@ -191,119 +212,112 @@ PackBitsEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
* the decoder if data is read, for example, by scanlines
* when it was encoded by strips.
*/
-static int
-PackBitsEncodeChunk(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
+static int PackBitsEncodeChunk(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
{
- tmsize_t rowsize = *(tmsize_t*)tif->tif_data;
+ tmsize_t rowsize = *(tmsize_t *)tif->tif_data;
+
+ while (cc > 0)
+ {
+ tmsize_t chunk = rowsize;
- while (cc > 0) {
- tmsize_t chunk = rowsize;
-
- if( cc < chunk )
- chunk = cc;
+ if (cc < chunk)
+ chunk = cc;
- if (PackBitsEncode(tif, bp, chunk, s) < 0)
- return (-1);
- bp += chunk;
- cc -= chunk;
- }
- return (1);
+ if (PackBitsEncode(tif, bp, chunk, s) < 0)
+ return (-1);
+ bp += chunk;
+ cc -= chunk;
+ }
+ return (1);
}
-static int
-PackBitsDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
+static int PackBitsDecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s)
{
- static const char module[] = "PackBitsDecode";
- char *bp;
- tmsize_t cc;
- long n;
- int b;
+ static const char module[] = "PackBitsDecode";
+ int8_t *bp;
+ tmsize_t cc;
+ long n;
+ int b;
- (void) s;
- bp = (char*) tif->tif_rawcp;
- cc = tif->tif_rawcc;
- while (cc > 0 && occ > 0) {
- n = (long) *bp++;
- cc--;
- /*
- * Watch out for compilers that
- * don't sign extend chars...
- */
- if (n >= 128)
- n -= 256;
- if (n < 0) { /* replicate next byte -n+1 times */
- if (n == -128) /* nop */
- continue;
- n = -n + 1;
- if( occ < (tmsize_t)n )
- {
- TIFFWarningExt(tif->tif_clientdata, module,
- "Discarding %lu bytes to avoid buffer overrun",
- (unsigned long) ((tmsize_t)n - occ));
- n = (long)occ;
- }
- if( cc == 0 )
- {
- TIFFWarningExt(tif->tif_clientdata, module,
- "Terminating PackBitsDecode due to lack of data.");
- break;
- }
- occ -= n;
- b = *bp++;
- cc--;
- while (n-- > 0)
- *op++ = (uint8) b;
- } else { /* copy next n+1 bytes literally */
- if (occ < (tmsize_t)(n + 1))
- {
- TIFFWarningExt(tif->tif_clientdata, module,
- "Discarding %lu bytes to avoid buffer overrun",
- (unsigned long) ((tmsize_t)n - occ + 1));
- n = (long)occ - 1;
- }
- if (cc < (tmsize_t) (n+1))
- {
- TIFFWarningExt(tif->tif_clientdata, module,
- "Terminating PackBitsDecode due to lack of data.");
- break;
- }
- _TIFFmemcpy(op, bp, ++n);
- op += n; occ -= n;
- bp += n; cc -= n;
- }
- }
- tif->tif_rawcp = (uint8*) bp;
- tif->tif_rawcc = cc;
- if (occ > 0) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Not enough data for scanline %lu",
- (unsigned long) tif->tif_row);
- return (0);
- }
- return (1);
+ (void)s;
+ bp = (int8_t *)tif->tif_rawcp;
+ cc = tif->tif_rawcc;
+ while (cc > 0 && occ > 0)
+ {
+ n = (long)*bp++;
+ cc--;
+ if (n < 0)
+ { /* replicate next byte -n+1 times */
+ if (n == -128) /* nop */
+ continue;
+ n = -n + 1;
+ if (occ < (tmsize_t)n)
+ {
+ TIFFWarningExtR(tif, module,
+ "Discarding %" TIFF_SSIZE_FORMAT
+ " bytes to avoid buffer overrun",
+ (tmsize_t)n - occ);
+ n = (long)occ;
+ }
+ if (cc == 0)
+ {
+ TIFFWarningExtR(
+ tif, module,
+ "Terminating PackBitsDecode due to lack of data.");
+ break;
+ }
+ occ -= n;
+ b = *bp++;
+ cc--;
+ while (n-- > 0)
+ *op++ = (uint8_t)b;
+ }
+ else
+ { /* copy next n+1 bytes literally */
+ if (occ < (tmsize_t)(n + 1))
+ {
+ TIFFWarningExtR(tif, module,
+ "Discarding %" TIFF_SSIZE_FORMAT
+ " bytes to avoid buffer overrun",
+ (tmsize_t)n - occ + 1);
+ n = (long)occ - 1;
+ }
+ if (cc < (tmsize_t)(n + 1))
+ {
+ TIFFWarningExtR(
+ tif, module,
+ "Terminating PackBitsDecode due to lack of data.");
+ break;
+ }
+ _TIFFmemcpy(op, bp, ++n);
+ op += n;
+ occ -= n;
+ bp += n;
+ cc -= n;
+ }
+ }
+ tif->tif_rawcp = (uint8_t *)bp;
+ tif->tif_rawcc = cc;
+ if (occ > 0)
+ {
+ TIFFErrorExtR(tif, module, "Not enough data for scanline %" PRIu32,
+ tif->tif_row);
+ return (0);
+ }
+ return (1);
}
-int
-TIFFInitPackBits(TIFF* tif, int scheme)
+int TIFFInitPackBits(TIFF *tif, int scheme)
{
- (void) scheme;
- tif->tif_decoderow = PackBitsDecode;
- tif->tif_decodestrip = PackBitsDecode;
- tif->tif_decodetile = PackBitsDecode;
- tif->tif_preencode = PackBitsPreEncode;
- tif->tif_postencode = PackBitsPostEncode;
- tif->tif_encoderow = PackBitsEncode;
- tif->tif_encodestrip = PackBitsEncodeChunk;
- tif->tif_encodetile = PackBitsEncodeChunk;
- return (1);
+ (void)scheme;
+ tif->tif_decoderow = PackBitsDecode;
+ tif->tif_decodestrip = PackBitsDecode;
+ tif->tif_decodetile = PackBitsDecode;
+ tif->tif_preencode = PackBitsPreEncode;
+ tif->tif_postencode = PackBitsPostEncode;
+ tif->tif_encoderow = PackBitsEncode;
+ tif->tif_encodestrip = PackBitsEncodeChunk;
+ tif->tif_encodetile = PackBitsEncodeChunk;
+ return (1);
}
#endif /* PACKBITS_SUPPORT */
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_pixarlog.c b/src/3rdparty/libtiff/libtiff/tif_pixarlog.c
index 6264090..5c0346b 100644
--- a/src/3rdparty/libtiff/libtiff/tif_pixarlog.c
+++ b/src/3rdparty/libtiff/libtiff/tif_pixarlog.c
@@ -2,23 +2,23 @@
* Copyright (c) 1996-1997 Sam Leffler
* Copyright (c) 1996 Pixar
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Pixar, Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Pixar, Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL PIXAR, SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -32,10 +32,10 @@
* Contributed by Dan McCoy.
*
* PixarLog film support uses the TIFF library to store companded
- * 11 bit values into a tiff file, which are compressed using the
- * zip compressor.
+ * 11 bit values into a tiff file, which are compressed using the
+ * zip compressor.
*
- * The codec can take as input and produce as output 32-bit IEEE float values
+ * The codec can take as input and produce as output 32-bit IEEE float values
* as well as 16-bit or 8-bit unsigned integer values.
*
* On writing any of the above are converted into the internal
@@ -49,7 +49,7 @@
* than the human eye can perceive with extra room to allow for
* error introduced by further image computation. As with any quantized
* color format, it is possible to perform image calculations which
- * expose the quantization error. This format should certainly be less
+ * expose the quantization error. This format should certainly be less
* susceptible to such errors than standard 8-bit encodings, but more
* susceptible than straight 16-bit or 32-bit encodings.
*
@@ -90,363 +90,429 @@
#include "tif_predict.h"
#include "zlib.h"
+#include <math.h>
#include <stdio.h>
#include <stdlib.h>
-#include <math.h>
/* Tables for converting to/from 11 bit coded values */
-#define TSIZE 2048 /* decode table size (11-bit tokens) */
-#define TSIZEP1 2049 /* Plus one for slop */
-#define ONE 1250 /* token value of 1.0 exactly */
-#define RATIO 1.004 /* nominal ratio for log part */
-
-#define CODE_MASK 0x7ff /* 11 bits. */
-
-static float Fltsize;
-static float LogK1, LogK2;
-
-#define REPEAT(n, op) { int i; i=n; do { i--; op; } while (i>0); }
+#define TSIZE 2048 /* decode table size (11-bit tokens) */
+#define TSIZEP1 2049 /* Plus one for slop */
+#define ONE 1250 /* token value of 1.0 exactly */
+#define RATIO 1.004 /* nominal ratio for log part */
+
+#define CODE_MASK 0x7ff /* 11 bits. */
+
+static float Fltsize;
+static float LogK1, LogK2;
+
+#define REPEAT(n, op) \
+ { \
+ int i; \
+ i = n; \
+ do \
+ { \
+ i--; \
+ op; \
+ } while (i > 0); \
+ }
-static void
-horizontalAccumulateF(uint16 *wp, int n, int stride, float *op,
- float *ToLinearF)
+static void horizontalAccumulateF(uint16_t *wp, int n, int stride, float *op,
+ float *ToLinearF)
{
- register unsigned int cr, cg, cb, ca, mask;
- register float t0, t1, t2, t3;
-
- if (n >= stride) {
- mask = CODE_MASK;
- if (stride == 3) {
- t0 = ToLinearF[cr = (wp[0] & mask)];
- t1 = ToLinearF[cg = (wp[1] & mask)];
- t2 = ToLinearF[cb = (wp[2] & mask)];
- op[0] = t0;
- op[1] = t1;
- op[2] = t2;
- n -= 3;
- while (n > 0) {
- wp += 3;
- op += 3;
- n -= 3;
- t0 = ToLinearF[(cr += wp[0]) & mask];
- t1 = ToLinearF[(cg += wp[1]) & mask];
- t2 = ToLinearF[(cb += wp[2]) & mask];
- op[0] = t0;
- op[1] = t1;
- op[2] = t2;
- }
- } else if (stride == 4) {
- t0 = ToLinearF[cr = (wp[0] & mask)];
- t1 = ToLinearF[cg = (wp[1] & mask)];
- t2 = ToLinearF[cb = (wp[2] & mask)];
- t3 = ToLinearF[ca = (wp[3] & mask)];
- op[0] = t0;
- op[1] = t1;
- op[2] = t2;
- op[3] = t3;
- n -= 4;
- while (n > 0) {
- wp += 4;
- op += 4;
- n -= 4;
- t0 = ToLinearF[(cr += wp[0]) & mask];
- t1 = ToLinearF[(cg += wp[1]) & mask];
- t2 = ToLinearF[(cb += wp[2]) & mask];
- t3 = ToLinearF[(ca += wp[3]) & mask];
- op[0] = t0;
- op[1] = t1;
- op[2] = t2;
- op[3] = t3;
- }
- } else {
- REPEAT(stride, *op = ToLinearF[*wp&mask]; wp++; op++)
- n -= stride;
- while (n > 0) {
- REPEAT(stride,
- wp[stride] += *wp; *op = ToLinearF[*wp&mask]; wp++; op++)
- n -= stride;
- }
- }
+ register unsigned int cr, cg, cb, ca, mask;
+ register float t0, t1, t2, t3;
+
+ if (n >= stride)
+ {
+ mask = CODE_MASK;
+ if (stride == 3)
+ {
+ t0 = ToLinearF[cr = (wp[0] & mask)];
+ t1 = ToLinearF[cg = (wp[1] & mask)];
+ t2 = ToLinearF[cb = (wp[2] & mask)];
+ op[0] = t0;
+ op[1] = t1;
+ op[2] = t2;
+ n -= 3;
+ while (n > 0)
+ {
+ wp += 3;
+ op += 3;
+ n -= 3;
+ t0 = ToLinearF[(cr += wp[0]) & mask];
+ t1 = ToLinearF[(cg += wp[1]) & mask];
+ t2 = ToLinearF[(cb += wp[2]) & mask];
+ op[0] = t0;
+ op[1] = t1;
+ op[2] = t2;
+ }
+ }
+ else if (stride == 4)
+ {
+ t0 = ToLinearF[cr = (wp[0] & mask)];
+ t1 = ToLinearF[cg = (wp[1] & mask)];
+ t2 = ToLinearF[cb = (wp[2] & mask)];
+ t3 = ToLinearF[ca = (wp[3] & mask)];
+ op[0] = t0;
+ op[1] = t1;
+ op[2] = t2;
+ op[3] = t3;
+ n -= 4;
+ while (n > 0)
+ {
+ wp += 4;
+ op += 4;
+ n -= 4;
+ t0 = ToLinearF[(cr += wp[0]) & mask];
+ t1 = ToLinearF[(cg += wp[1]) & mask];
+ t2 = ToLinearF[(cb += wp[2]) & mask];
+ t3 = ToLinearF[(ca += wp[3]) & mask];
+ op[0] = t0;
+ op[1] = t1;
+ op[2] = t2;
+ op[3] = t3;
+ }
+ }
+ else
+ {
+ REPEAT(stride, *op = ToLinearF[*wp & mask]; wp++; op++)
+ n -= stride;
+ while (n > 0)
+ {
+ REPEAT(stride, wp[stride] += *wp; *op = ToLinearF[*wp & mask];
+ wp++; op++)
+ n -= stride;
+ }
+ }
}
}
-static void
-horizontalAccumulate12(uint16 *wp, int n, int stride, int16 *op,
- float *ToLinearF)
+static void horizontalAccumulate12(uint16_t *wp, int n, int stride, int16_t *op,
+ float *ToLinearF)
{
- register unsigned int cr, cg, cb, ca, mask;
- register float t0, t1, t2, t3;
+ register unsigned int cr, cg, cb, ca, mask;
+ register float t0, t1, t2, t3;
#define SCALE12 2048.0F
-#define CLAMP12(t) (((t) < 3071) ? (uint16) (t) : 3071)
-
- if (n >= stride) {
- mask = CODE_MASK;
- if (stride == 3) {
- t0 = ToLinearF[cr = (wp[0] & mask)] * SCALE12;
- t1 = ToLinearF[cg = (wp[1] & mask)] * SCALE12;
- t2 = ToLinearF[cb = (wp[2] & mask)] * SCALE12;
- op[0] = CLAMP12(t0);
- op[1] = CLAMP12(t1);
- op[2] = CLAMP12(t2);
- n -= 3;
- while (n > 0) {
- wp += 3;
- op += 3;
- n -= 3;
- t0 = ToLinearF[(cr += wp[0]) & mask] * SCALE12;
- t1 = ToLinearF[(cg += wp[1]) & mask] * SCALE12;
- t2 = ToLinearF[(cb += wp[2]) & mask] * SCALE12;
- op[0] = CLAMP12(t0);
- op[1] = CLAMP12(t1);
- op[2] = CLAMP12(t2);
- }
- } else if (stride == 4) {
- t0 = ToLinearF[cr = (wp[0] & mask)] * SCALE12;
- t1 = ToLinearF[cg = (wp[1] & mask)] * SCALE12;
- t2 = ToLinearF[cb = (wp[2] & mask)] * SCALE12;
- t3 = ToLinearF[ca = (wp[3] & mask)] * SCALE12;
- op[0] = CLAMP12(t0);
- op[1] = CLAMP12(t1);
- op[2] = CLAMP12(t2);
- op[3] = CLAMP12(t3);
- n -= 4;
- while (n > 0) {
- wp += 4;
- op += 4;
- n -= 4;
- t0 = ToLinearF[(cr += wp[0]) & mask] * SCALE12;
- t1 = ToLinearF[(cg += wp[1]) & mask] * SCALE12;
- t2 = ToLinearF[(cb += wp[2]) & mask] * SCALE12;
- t3 = ToLinearF[(ca += wp[3]) & mask] * SCALE12;
- op[0] = CLAMP12(t0);
- op[1] = CLAMP12(t1);
- op[2] = CLAMP12(t2);
- op[3] = CLAMP12(t3);
- }
- } else {
- REPEAT(stride, t0 = ToLinearF[*wp&mask] * SCALE12;
- *op = CLAMP12(t0); wp++; op++)
- n -= stride;
- while (n > 0) {
- REPEAT(stride,
- wp[stride] += *wp; t0 = ToLinearF[wp[stride]&mask]*SCALE12;
- *op = CLAMP12(t0); wp++; op++)
- n -= stride;
- }
- }
+#define CLAMP12(t) (((t) < 3071) ? (uint16_t)(t) : 3071)
+
+ if (n >= stride)
+ {
+ mask = CODE_MASK;
+ if (stride == 3)
+ {
+ t0 = ToLinearF[cr = (wp[0] & mask)] * SCALE12;
+ t1 = ToLinearF[cg = (wp[1] & mask)] * SCALE12;
+ t2 = ToLinearF[cb = (wp[2] & mask)] * SCALE12;
+ op[0] = CLAMP12(t0);
+ op[1] = CLAMP12(t1);
+ op[2] = CLAMP12(t2);
+ n -= 3;
+ while (n > 0)
+ {
+ wp += 3;
+ op += 3;
+ n -= 3;
+ t0 = ToLinearF[(cr += wp[0]) & mask] * SCALE12;
+ t1 = ToLinearF[(cg += wp[1]) & mask] * SCALE12;
+ t2 = ToLinearF[(cb += wp[2]) & mask] * SCALE12;
+ op[0] = CLAMP12(t0);
+ op[1] = CLAMP12(t1);
+ op[2] = CLAMP12(t2);
+ }
+ }
+ else if (stride == 4)
+ {
+ t0 = ToLinearF[cr = (wp[0] & mask)] * SCALE12;
+ t1 = ToLinearF[cg = (wp[1] & mask)] * SCALE12;
+ t2 = ToLinearF[cb = (wp[2] & mask)] * SCALE12;
+ t3 = ToLinearF[ca = (wp[3] & mask)] * SCALE12;
+ op[0] = CLAMP12(t0);
+ op[1] = CLAMP12(t1);
+ op[2] = CLAMP12(t2);
+ op[3] = CLAMP12(t3);
+ n -= 4;
+ while (n > 0)
+ {
+ wp += 4;
+ op += 4;
+ n -= 4;
+ t0 = ToLinearF[(cr += wp[0]) & mask] * SCALE12;
+ t1 = ToLinearF[(cg += wp[1]) & mask] * SCALE12;
+ t2 = ToLinearF[(cb += wp[2]) & mask] * SCALE12;
+ t3 = ToLinearF[(ca += wp[3]) & mask] * SCALE12;
+ op[0] = CLAMP12(t0);
+ op[1] = CLAMP12(t1);
+ op[2] = CLAMP12(t2);
+ op[3] = CLAMP12(t3);
+ }
+ }
+ else
+ {
+ REPEAT(stride, t0 = ToLinearF[*wp & mask] * SCALE12;
+ *op = CLAMP12(t0); wp++; op++)
+ n -= stride;
+ while (n > 0)
+ {
+ REPEAT(stride, wp[stride] += *wp;
+ t0 = ToLinearF[wp[stride] & mask] * SCALE12;
+ *op = CLAMP12(t0); wp++; op++)
+ n -= stride;
+ }
+ }
}
}
-static void
-horizontalAccumulate16(uint16 *wp, int n, int stride, uint16 *op,
- uint16 *ToLinear16)
+static void horizontalAccumulate16(uint16_t *wp, int n, int stride,
+ uint16_t *op, uint16_t *ToLinear16)
{
- register unsigned int cr, cg, cb, ca, mask;
-
- if (n >= stride) {
- mask = CODE_MASK;
- if (stride == 3) {
- op[0] = ToLinear16[cr = (wp[0] & mask)];
- op[1] = ToLinear16[cg = (wp[1] & mask)];
- op[2] = ToLinear16[cb = (wp[2] & mask)];
- n -= 3;
- while (n > 0) {
- wp += 3;
- op += 3;
- n -= 3;
- op[0] = ToLinear16[(cr += wp[0]) & mask];
- op[1] = ToLinear16[(cg += wp[1]) & mask];
- op[2] = ToLinear16[(cb += wp[2]) & mask];
- }
- } else if (stride == 4) {
- op[0] = ToLinear16[cr = (wp[0] & mask)];
- op[1] = ToLinear16[cg = (wp[1] & mask)];
- op[2] = ToLinear16[cb = (wp[2] & mask)];
- op[3] = ToLinear16[ca = (wp[3] & mask)];
- n -= 4;
- while (n > 0) {
- wp += 4;
- op += 4;
- n -= 4;
- op[0] = ToLinear16[(cr += wp[0]) & mask];
- op[1] = ToLinear16[(cg += wp[1]) & mask];
- op[2] = ToLinear16[(cb += wp[2]) & mask];
- op[3] = ToLinear16[(ca += wp[3]) & mask];
- }
- } else {
- REPEAT(stride, *op = ToLinear16[*wp&mask]; wp++; op++)
- n -= stride;
- while (n > 0) {
- REPEAT(stride,
- wp[stride] += *wp; *op = ToLinear16[*wp&mask]; wp++; op++)
- n -= stride;
- }
- }
+ register unsigned int cr, cg, cb, ca, mask;
+
+ if (n >= stride)
+ {
+ mask = CODE_MASK;
+ if (stride == 3)
+ {
+ op[0] = ToLinear16[cr = (wp[0] & mask)];
+ op[1] = ToLinear16[cg = (wp[1] & mask)];
+ op[2] = ToLinear16[cb = (wp[2] & mask)];
+ n -= 3;
+ while (n > 0)
+ {
+ wp += 3;
+ op += 3;
+ n -= 3;
+ op[0] = ToLinear16[(cr += wp[0]) & mask];
+ op[1] = ToLinear16[(cg += wp[1]) & mask];
+ op[2] = ToLinear16[(cb += wp[2]) & mask];
+ }
+ }
+ else if (stride == 4)
+ {
+ op[0] = ToLinear16[cr = (wp[0] & mask)];
+ op[1] = ToLinear16[cg = (wp[1] & mask)];
+ op[2] = ToLinear16[cb = (wp[2] & mask)];
+ op[3] = ToLinear16[ca = (wp[3] & mask)];
+ n -= 4;
+ while (n > 0)
+ {
+ wp += 4;
+ op += 4;
+ n -= 4;
+ op[0] = ToLinear16[(cr += wp[0]) & mask];
+ op[1] = ToLinear16[(cg += wp[1]) & mask];
+ op[2] = ToLinear16[(cb += wp[2]) & mask];
+ op[3] = ToLinear16[(ca += wp[3]) & mask];
+ }
+ }
+ else
+ {
+ REPEAT(stride, *op = ToLinear16[*wp & mask]; wp++; op++)
+ n -= stride;
+ while (n > 0)
+ {
+ REPEAT(stride, wp[stride] += *wp; *op = ToLinear16[*wp & mask];
+ wp++; op++)
+ n -= stride;
+ }
+ }
}
}
-/*
+/*
* Returns the log encoded 11-bit values with the horizontal
* differencing undone.
*/
-static void
-horizontalAccumulate11(uint16 *wp, int n, int stride, uint16 *op)
+static void horizontalAccumulate11(uint16_t *wp, int n, int stride,
+ uint16_t *op)
{
register unsigned int cr, cg, cb, ca, mask;
- if (n >= stride) {
- mask = CODE_MASK;
- if (stride == 3) {
- op[0] = wp[0]; op[1] = wp[1]; op[2] = wp[2];
- cr = wp[0]; cg = wp[1]; cb = wp[2];
- n -= 3;
- while (n > 0) {
- wp += 3;
- op += 3;
- n -= 3;
- op[0] = (uint16)((cr += wp[0]) & mask);
- op[1] = (uint16)((cg += wp[1]) & mask);
- op[2] = (uint16)((cb += wp[2]) & mask);
- }
- } else if (stride == 4) {
- op[0] = wp[0]; op[1] = wp[1];
- op[2] = wp[2]; op[3] = wp[3];
- cr = wp[0]; cg = wp[1]; cb = wp[2]; ca = wp[3];
- n -= 4;
- while (n > 0) {
- wp += 4;
- op += 4;
- n -= 4;
- op[0] = (uint16)((cr += wp[0]) & mask);
- op[1] = (uint16)((cg += wp[1]) & mask);
- op[2] = (uint16)((cb += wp[2]) & mask);
- op[3] = (uint16)((ca += wp[3]) & mask);
- }
- } else {
- REPEAT(stride, *op = *wp&mask; wp++; op++)
- n -= stride;
- while (n > 0) {
- REPEAT(stride,
- wp[stride] += *wp; *op = *wp&mask; wp++; op++)
- n -= stride;
- }
- }
+ if (n >= stride)
+ {
+ mask = CODE_MASK;
+ if (stride == 3)
+ {
+ op[0] = wp[0];
+ op[1] = wp[1];
+ op[2] = wp[2];
+ cr = wp[0];
+ cg = wp[1];
+ cb = wp[2];
+ n -= 3;
+ while (n > 0)
+ {
+ wp += 3;
+ op += 3;
+ n -= 3;
+ op[0] = (uint16_t)((cr += wp[0]) & mask);
+ op[1] = (uint16_t)((cg += wp[1]) & mask);
+ op[2] = (uint16_t)((cb += wp[2]) & mask);
+ }
+ }
+ else if (stride == 4)
+ {
+ op[0] = wp[0];
+ op[1] = wp[1];
+ op[2] = wp[2];
+ op[3] = wp[3];
+ cr = wp[0];
+ cg = wp[1];
+ cb = wp[2];
+ ca = wp[3];
+ n -= 4;
+ while (n > 0)
+ {
+ wp += 4;
+ op += 4;
+ n -= 4;
+ op[0] = (uint16_t)((cr += wp[0]) & mask);
+ op[1] = (uint16_t)((cg += wp[1]) & mask);
+ op[2] = (uint16_t)((cb += wp[2]) & mask);
+ op[3] = (uint16_t)((ca += wp[3]) & mask);
+ }
+ }
+ else
+ {
+ REPEAT(stride, *op = *wp & mask; wp++; op++)
+ n -= stride;
+ while (n > 0)
+ {
+ REPEAT(stride, wp[stride] += *wp; *op = *wp & mask; wp++; op++)
+ n -= stride;
+ }
+ }
}
}
-static void
-horizontalAccumulate8(uint16 *wp, int n, int stride, unsigned char *op,
- unsigned char *ToLinear8)
+static void horizontalAccumulate8(uint16_t *wp, int n, int stride,
+ unsigned char *op, unsigned char *ToLinear8)
{
- register unsigned int cr, cg, cb, ca, mask;
-
- if (n >= stride) {
- mask = CODE_MASK;
- if (stride == 3) {
- op[0] = ToLinear8[cr = (wp[0] & mask)];
- op[1] = ToLinear8[cg = (wp[1] & mask)];
- op[2] = ToLinear8[cb = (wp[2] & mask)];
- n -= 3;
- while (n > 0) {
- n -= 3;
- wp += 3;
- op += 3;
- op[0] = ToLinear8[(cr += wp[0]) & mask];
- op[1] = ToLinear8[(cg += wp[1]) & mask];
- op[2] = ToLinear8[(cb += wp[2]) & mask];
- }
- } else if (stride == 4) {
- op[0] = ToLinear8[cr = (wp[0] & mask)];
- op[1] = ToLinear8[cg = (wp[1] & mask)];
- op[2] = ToLinear8[cb = (wp[2] & mask)];
- op[3] = ToLinear8[ca = (wp[3] & mask)];
- n -= 4;
- while (n > 0) {
- n -= 4;
- wp += 4;
- op += 4;
- op[0] = ToLinear8[(cr += wp[0]) & mask];
- op[1] = ToLinear8[(cg += wp[1]) & mask];
- op[2] = ToLinear8[(cb += wp[2]) & mask];
- op[3] = ToLinear8[(ca += wp[3]) & mask];
- }
- } else {
- REPEAT(stride, *op = ToLinear8[*wp&mask]; wp++; op++)
- n -= stride;
- while (n > 0) {
- REPEAT(stride,
- wp[stride] += *wp; *op = ToLinear8[*wp&mask]; wp++; op++)
- n -= stride;
- }
- }
+ register unsigned int cr, cg, cb, ca, mask;
+
+ if (n >= stride)
+ {
+ mask = CODE_MASK;
+ if (stride == 3)
+ {
+ op[0] = ToLinear8[cr = (wp[0] & mask)];
+ op[1] = ToLinear8[cg = (wp[1] & mask)];
+ op[2] = ToLinear8[cb = (wp[2] & mask)];
+ n -= 3;
+ while (n > 0)
+ {
+ n -= 3;
+ wp += 3;
+ op += 3;
+ op[0] = ToLinear8[(cr += wp[0]) & mask];
+ op[1] = ToLinear8[(cg += wp[1]) & mask];
+ op[2] = ToLinear8[(cb += wp[2]) & mask];
+ }
+ }
+ else if (stride == 4)
+ {
+ op[0] = ToLinear8[cr = (wp[0] & mask)];
+ op[1] = ToLinear8[cg = (wp[1] & mask)];
+ op[2] = ToLinear8[cb = (wp[2] & mask)];
+ op[3] = ToLinear8[ca = (wp[3] & mask)];
+ n -= 4;
+ while (n > 0)
+ {
+ n -= 4;
+ wp += 4;
+ op += 4;
+ op[0] = ToLinear8[(cr += wp[0]) & mask];
+ op[1] = ToLinear8[(cg += wp[1]) & mask];
+ op[2] = ToLinear8[(cb += wp[2]) & mask];
+ op[3] = ToLinear8[(ca += wp[3]) & mask];
+ }
+ }
+ else
+ {
+ REPEAT(stride, *op = ToLinear8[*wp & mask]; wp++; op++)
+ n -= stride;
+ while (n > 0)
+ {
+ REPEAT(stride, wp[stride] += *wp; *op = ToLinear8[*wp & mask];
+ wp++; op++)
+ n -= stride;
+ }
+ }
}
}
-
-static void
-horizontalAccumulate8abgr(uint16 *wp, int n, int stride, unsigned char *op,
- unsigned char *ToLinear8)
+static void horizontalAccumulate8abgr(uint16_t *wp, int n, int stride,
+ unsigned char *op,
+ unsigned char *ToLinear8)
{
- register unsigned int cr, cg, cb, ca, mask;
- register unsigned char t0, t1, t2, t3;
-
- if (n >= stride) {
- mask = CODE_MASK;
- if (stride == 3) {
- op[0] = 0;
- t1 = ToLinear8[cb = (wp[2] & mask)];
- t2 = ToLinear8[cg = (wp[1] & mask)];
- t3 = ToLinear8[cr = (wp[0] & mask)];
- op[1] = t1;
- op[2] = t2;
- op[3] = t3;
- n -= 3;
- while (n > 0) {
- n -= 3;
- wp += 3;
- op += 4;
- op[0] = 0;
- t1 = ToLinear8[(cb += wp[2]) & mask];
- t2 = ToLinear8[(cg += wp[1]) & mask];
- t3 = ToLinear8[(cr += wp[0]) & mask];
- op[1] = t1;
- op[2] = t2;
- op[3] = t3;
- }
- } else if (stride == 4) {
- t0 = ToLinear8[ca = (wp[3] & mask)];
- t1 = ToLinear8[cb = (wp[2] & mask)];
- t2 = ToLinear8[cg = (wp[1] & mask)];
- t3 = ToLinear8[cr = (wp[0] & mask)];
- op[0] = t0;
- op[1] = t1;
- op[2] = t2;
- op[3] = t3;
- n -= 4;
- while (n > 0) {
- n -= 4;
- wp += 4;
- op += 4;
- t0 = ToLinear8[(ca += wp[3]) & mask];
- t1 = ToLinear8[(cb += wp[2]) & mask];
- t2 = ToLinear8[(cg += wp[1]) & mask];
- t3 = ToLinear8[(cr += wp[0]) & mask];
- op[0] = t0;
- op[1] = t1;
- op[2] = t2;
- op[3] = t3;
- }
- } else {
- REPEAT(stride, *op = ToLinear8[*wp&mask]; wp++; op++)
- n -= stride;
- while (n > 0) {
- REPEAT(stride,
- wp[stride] += *wp; *op = ToLinear8[*wp&mask]; wp++; op++)
- n -= stride;
- }
- }
+ register unsigned int cr, cg, cb, ca, mask;
+ register unsigned char t0, t1, t2, t3;
+
+ if (n >= stride)
+ {
+ mask = CODE_MASK;
+ if (stride == 3)
+ {
+ op[0] = 0;
+ t1 = ToLinear8[cb = (wp[2] & mask)];
+ t2 = ToLinear8[cg = (wp[1] & mask)];
+ t3 = ToLinear8[cr = (wp[0] & mask)];
+ op[1] = t1;
+ op[2] = t2;
+ op[3] = t3;
+ n -= 3;
+ while (n > 0)
+ {
+ n -= 3;
+ wp += 3;
+ op += 4;
+ op[0] = 0;
+ t1 = ToLinear8[(cb += wp[2]) & mask];
+ t2 = ToLinear8[(cg += wp[1]) & mask];
+ t3 = ToLinear8[(cr += wp[0]) & mask];
+ op[1] = t1;
+ op[2] = t2;
+ op[3] = t3;
+ }
+ }
+ else if (stride == 4)
+ {
+ t0 = ToLinear8[ca = (wp[3] & mask)];
+ t1 = ToLinear8[cb = (wp[2] & mask)];
+ t2 = ToLinear8[cg = (wp[1] & mask)];
+ t3 = ToLinear8[cr = (wp[0] & mask)];
+ op[0] = t0;
+ op[1] = t1;
+ op[2] = t2;
+ op[3] = t3;
+ n -= 4;
+ while (n > 0)
+ {
+ n -= 4;
+ wp += 4;
+ op += 4;
+ t0 = ToLinear8[(ca += wp[3]) & mask];
+ t1 = ToLinear8[(cb += wp[2]) & mask];
+ t2 = ToLinear8[(cg += wp[1]) & mask];
+ t3 = ToLinear8[(cr += wp[0]) & mask];
+ op[0] = t0;
+ op[1] = t1;
+ op[2] = t2;
+ op[3] = t3;
+ }
+ }
+ else
+ {
+ REPEAT(stride, *op = ToLinear8[*wp & mask]; wp++; op++)
+ n -= stride;
+ while (n > 0)
+ {
+ REPEAT(stride, wp[stride] += *wp; *op = ToLinear8[*wp & mask];
+ wp++; op++)
+ n -= stride;
+ }
+ }
}
}
@@ -454,110 +520,121 @@ horizontalAccumulate8abgr(uint16 *wp, int n, int stride, unsigned char *op,
* State block for each open TIFF
* file using PixarLog compression/decompression.
*/
-typedef struct {
- TIFFPredictorState predict;
- z_stream stream;
- tmsize_t tbuf_size; /* only set/used on reading for now */
- uint16 *tbuf;
- uint16 stride;
- int state;
- int user_datafmt;
- int quality;
+typedef struct
+{
+ TIFFPredictorState predict;
+ z_stream stream;
+ tmsize_t tbuf_size; /* only set/used on reading for now */
+ uint16_t *tbuf;
+ uint16_t stride;
+ int state;
+ int user_datafmt;
+ int quality;
#define PLSTATE_INIT 1
- TIFFVSetMethod vgetparent; /* super-class method */
- TIFFVSetMethod vsetparent; /* super-class method */
+ TIFFVSetMethod vgetparent; /* super-class method */
+ TIFFVSetMethod vsetparent; /* super-class method */
+
+ float *ToLinearF;
+ uint16_t *ToLinear16;
+ unsigned char *ToLinear8;
+ uint16_t *FromLT2;
+ uint16_t *From14; /* Really for 16-bit data, but we shift down 2 */
+ uint16_t *From8;
- float *ToLinearF;
- uint16 *ToLinear16;
- unsigned char *ToLinear8;
- uint16 *FromLT2;
- uint16 *From14; /* Really for 16-bit data, but we shift down 2 */
- uint16 *From8;
-
} PixarLogState;
-static int
-PixarLogMakeTables(PixarLogState *sp)
+static int PixarLogMakeTables(TIFF *tif, PixarLogState *sp)
{
-/*
- * We make several tables here to convert between various external
- * representations (float, 16-bit, and 8-bit) and the internal
- * 11-bit companded representation. The 11-bit representation has two
- * distinct regions. A linear bottom end up through .018316 in steps
- * of about .000073, and a region of constant ratio up to about 25.
- * These floating point numbers are stored in the main table ToLinearF.
- * All other tables are derived from this one. The tables (and the
- * ratios) are continuous at the internal seam.
- */
+ /*
+ * We make several tables here to convert between various external
+ * representations (float, 16-bit, and 8-bit) and the internal
+ * 11-bit companded representation. The 11-bit representation has two
+ * distinct regions. A linear bottom end up through .018316 in steps
+ * of about .000073, and a region of constant ratio up to about 25.
+ * These floating point numbers are stored in the main table ToLinearF.
+ * All other tables are derived from this one. The tables (and the
+ * ratios) are continuous at the internal seam.
+ */
- int nlin, lt2size;
- int i, j;
- double b, c, linstep, v;
+ int nlin, lt2size;
+ int i, j;
+ double b, c, linstep, v;
float *ToLinearF;
- uint16 *ToLinear16;
+ uint16_t *ToLinear16;
unsigned char *ToLinear8;
- uint16 *FromLT2;
- uint16 *From14; /* Really for 16-bit data, but we shift down 2 */
- uint16 *From8;
-
- c = log(RATIO);
- nlin = (int)(1./c); /* nlin must be an integer */
- c = 1./nlin;
- b = exp(-c*ONE); /* multiplicative scale factor [b*exp(c*ONE) = 1] */
- linstep = b*c*exp(1.);
-
- LogK1 = (float)(1./c); /* if (v >= 2) token = k1*log(v*k2) */
- LogK2 = (float)(1./b);
- lt2size = (int)(2./linstep) + 1;
- FromLT2 = (uint16 *)_TIFFmalloc(lt2size*sizeof(uint16));
- From14 = (uint16 *)_TIFFmalloc(16384*sizeof(uint16));
- From8 = (uint16 *)_TIFFmalloc(256*sizeof(uint16));
- ToLinearF = (float *)_TIFFmalloc(TSIZEP1 * sizeof(float));
- ToLinear16 = (uint16 *)_TIFFmalloc(TSIZEP1 * sizeof(uint16));
- ToLinear8 = (unsigned char *)_TIFFmalloc(TSIZEP1 * sizeof(unsigned char));
- if (FromLT2 == NULL || From14 == NULL || From8 == NULL ||
- ToLinearF == NULL || ToLinear16 == NULL || ToLinear8 == NULL) {
- if (FromLT2) _TIFFfree(FromLT2);
- if (From14) _TIFFfree(From14);
- if (From8) _TIFFfree(From8);
- if (ToLinearF) _TIFFfree(ToLinearF);
- if (ToLinear16) _TIFFfree(ToLinear16);
- if (ToLinear8) _TIFFfree(ToLinear8);
- sp->FromLT2 = NULL;
- sp->From14 = NULL;
- sp->From8 = NULL;
- sp->ToLinearF = NULL;
- sp->ToLinear16 = NULL;
- sp->ToLinear8 = NULL;
- return 0;
+ uint16_t *FromLT2;
+ uint16_t *From14; /* Really for 16-bit data, but we shift down 2 */
+ uint16_t *From8;
+
+ c = log(RATIO);
+ nlin = (int)(1. / c); /* nlin must be an integer */
+ c = 1. / nlin;
+ b = exp(-c * ONE); /* multiplicative scale factor [b*exp(c*ONE) = 1] */
+ linstep = b * c * exp(1.);
+
+ LogK1 = (float)(1. / c); /* if (v >= 2) token = k1*log(v*k2) */
+ LogK2 = (float)(1. / b);
+ lt2size = (int)(2. / linstep) + 1;
+ FromLT2 = (uint16_t *)_TIFFmallocExt(tif, lt2size * sizeof(uint16_t));
+ From14 = (uint16_t *)_TIFFmallocExt(tif, 16384 * sizeof(uint16_t));
+ From8 = (uint16_t *)_TIFFmallocExt(tif, 256 * sizeof(uint16_t));
+ ToLinearF = (float *)_TIFFmallocExt(tif, TSIZEP1 * sizeof(float));
+ ToLinear16 = (uint16_t *)_TIFFmallocExt(tif, TSIZEP1 * sizeof(uint16_t));
+ ToLinear8 =
+ (unsigned char *)_TIFFmallocExt(tif, TSIZEP1 * sizeof(unsigned char));
+ if (FromLT2 == NULL || From14 == NULL || From8 == NULL ||
+ ToLinearF == NULL || ToLinear16 == NULL || ToLinear8 == NULL)
+ {
+ if (FromLT2)
+ _TIFFfreeExt(tif, FromLT2);
+ if (From14)
+ _TIFFfreeExt(tif, From14);
+ if (From8)
+ _TIFFfreeExt(tif, From8);
+ if (ToLinearF)
+ _TIFFfreeExt(tif, ToLinearF);
+ if (ToLinear16)
+ _TIFFfreeExt(tif, ToLinear16);
+ if (ToLinear8)
+ _TIFFfreeExt(tif, ToLinear8);
+ sp->FromLT2 = NULL;
+ sp->From14 = NULL;
+ sp->From8 = NULL;
+ sp->ToLinearF = NULL;
+ sp->ToLinear16 = NULL;
+ sp->ToLinear8 = NULL;
+ return 0;
}
j = 0;
- for (i = 0; i < nlin; i++) {
- v = i * linstep;
- ToLinearF[j++] = (float)v;
+ for (i = 0; i < nlin; i++)
+ {
+ v = i * linstep;
+ ToLinearF[j++] = (float)v;
}
for (i = nlin; i < TSIZE; i++)
- ToLinearF[j++] = (float)(b*exp(c*i));
+ ToLinearF[j++] = (float)(b * exp(c * i));
ToLinearF[2048] = ToLinearF[2047];
- for (i = 0; i < TSIZEP1; i++) {
- v = ToLinearF[i]*65535.0 + 0.5;
- ToLinear16[i] = (v > 65535.0) ? 65535 : (uint16)v;
- v = ToLinearF[i]*255.0 + 0.5;
- ToLinear8[i] = (v > 255.0) ? 255 : (unsigned char)v;
+ for (i = 0; i < TSIZEP1; i++)
+ {
+ v = ToLinearF[i] * 65535.0 + 0.5;
+ ToLinear16[i] = (v > 65535.0) ? 65535 : (uint16_t)v;
+ v = ToLinearF[i] * 255.0 + 0.5;
+ ToLinear8[i] = (v > 255.0) ? 255 : (unsigned char)v;
}
j = 0;
- for (i = 0; i < lt2size; i++) {
- if ((i*linstep)*(i*linstep) > ToLinearF[j]*ToLinearF[j+1])
- j++;
- FromLT2[i] = (uint16)j;
+ for (i = 0; i < lt2size; i++)
+ {
+ if ((i * linstep) * (i * linstep) > ToLinearF[j] * ToLinearF[j + 1])
+ j++;
+ FromLT2[i] = (uint16_t)j;
}
/*
@@ -566,20 +643,22 @@ PixarLogMakeTables(PixarLogState *sp)
* saves a little table space.
*/
j = 0;
- for (i = 0; i < 16384; i++) {
- while ((i/16383.)*(i/16383.) > ToLinearF[j]*ToLinearF[j+1])
- j++;
- From14[i] = (uint16)j;
+ for (i = 0; i < 16384; i++)
+ {
+ while ((i / 16383.) * (i / 16383.) > ToLinearF[j] * ToLinearF[j + 1])
+ j++;
+ From14[i] = (uint16_t)j;
}
j = 0;
- for (i = 0; i < 256; i++) {
- while ((i/255.)*(i/255.) > ToLinearF[j]*ToLinearF[j+1])
- j++;
- From8[i] = (uint16)j;
+ for (i = 0; i < 256; i++)
+ {
+ while ((i / 255.) * (i / 255.) > ToLinearF[j] * ToLinearF[j + 1])
+ j++;
+ From8[i] = (uint16_t)j;
}
- Fltsize = (float)(lt2size/2);
+ Fltsize = (float)(lt2size / 2);
sp->ToLinearF = ToLinearF;
sp->ToLinear16 = ToLinear16;
@@ -591,621 +670,727 @@ PixarLogMakeTables(PixarLogState *sp)
return 1;
}
-#define DecoderState(tif) ((PixarLogState*) (tif)->tif_data)
-#define EncoderState(tif) ((PixarLogState*) (tif)->tif_data)
+#define DecoderState(tif) ((PixarLogState *)(tif)->tif_data)
+#define EncoderState(tif) ((PixarLogState *)(tif)->tif_data)
-static int PixarLogEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s);
-static int PixarLogDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s);
+static int PixarLogEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s);
+static int PixarLogDecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s);
-#define PIXARLOGDATAFMT_UNKNOWN -1
+#define PIXARLOGDATAFMT_UNKNOWN -1
-static int
-PixarLogGuessDataFmt(TIFFDirectory *td)
+static int PixarLogGuessDataFmt(TIFFDirectory *td)
{
- int guess = PIXARLOGDATAFMT_UNKNOWN;
- int format = td->td_sampleformat;
-
- /* If the user didn't tell us his datafmt,
- * take our best guess from the bitspersample.
- */
- switch (td->td_bitspersample) {
- case 32:
- if (format == SAMPLEFORMAT_IEEEFP)
- guess = PIXARLOGDATAFMT_FLOAT;
- break;
- case 16:
- if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_UINT)
- guess = PIXARLOGDATAFMT_16BIT;
- break;
- case 12:
- if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_INT)
- guess = PIXARLOGDATAFMT_12BITPICIO;
- break;
- case 11:
- if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_UINT)
- guess = PIXARLOGDATAFMT_11BITLOG;
- break;
- case 8:
- if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_UINT)
- guess = PIXARLOGDATAFMT_8BIT;
- break;
- }
-
- return guess;
+ int guess = PIXARLOGDATAFMT_UNKNOWN;
+ int format = td->td_sampleformat;
+
+ /* If the user didn't tell us his datafmt,
+ * take our best guess from the bitspersample.
+ */
+ switch (td->td_bitspersample)
+ {
+ case 32:
+ if (format == SAMPLEFORMAT_IEEEFP)
+ guess = PIXARLOGDATAFMT_FLOAT;
+ break;
+ case 16:
+ if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_UINT)
+ guess = PIXARLOGDATAFMT_16BIT;
+ break;
+ case 12:
+ if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_INT)
+ guess = PIXARLOGDATAFMT_12BITPICIO;
+ break;
+ case 11:
+ if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_UINT)
+ guess = PIXARLOGDATAFMT_11BITLOG;
+ break;
+ case 8:
+ if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_UINT)
+ guess = PIXARLOGDATAFMT_8BIT;
+ break;
+ }
+
+ return guess;
}
-static tmsize_t
-multiply_ms(tmsize_t m1, tmsize_t m2)
+static tmsize_t multiply_ms(tmsize_t m1, tmsize_t m2)
{
- return _TIFFMultiplySSize(NULL, m1, m2, NULL);
+ return _TIFFMultiplySSize(NULL, m1, m2, NULL);
}
-static tmsize_t
-add_ms(tmsize_t m1, tmsize_t m2)
+static tmsize_t add_ms(tmsize_t m1, tmsize_t m2)
{
- assert(m1 >= 0 && m2 >= 0);
- /* if either input is zero, assume overflow already occurred */
- if (m1 == 0 || m2 == 0)
- return 0;
- else if (m1 > TIFF_TMSIZE_T_MAX - m2)
- return 0;
-
- return m1 + m2;
+ assert(m1 >= 0 && m2 >= 0);
+ /* if either input is zero, assume overflow already occurred */
+ if (m1 == 0 || m2 == 0)
+ return 0;
+ else if (m1 > TIFF_TMSIZE_T_MAX - m2)
+ return 0;
+
+ return m1 + m2;
}
-static int
-PixarLogFixupTags(TIFF* tif)
+static int PixarLogFixupTags(TIFF *tif)
{
- (void) tif;
- return (1);
+ (void)tif;
+ return (1);
}
-static int
-PixarLogSetupDecode(TIFF* tif)
+static int PixarLogSetupDecode(TIFF *tif)
{
- static const char module[] = "PixarLogSetupDecode";
- TIFFDirectory *td = &tif->tif_dir;
- PixarLogState* sp = DecoderState(tif);
- tmsize_t tbuf_size;
- uint32 strip_height;
-
- assert(sp != NULL);
-
- /* This function can possibly be called several times by */
- /* PredictorSetupDecode() if this function succeeds but */
- /* PredictorSetup() fails */
- if( (sp->state & PLSTATE_INIT) != 0 )
- return 1;
-
- strip_height = td->td_rowsperstrip;
- if( strip_height > td->td_imagelength )
- strip_height = td->td_imagelength;
-
- /* Make sure no byte swapping happens on the data
- * after decompression. */
- tif->tif_postdecode = _TIFFNoPostDecode;
-
- /* for some reason, we can't do this in TIFFInitPixarLog */
-
- sp->stride = (td->td_planarconfig == PLANARCONFIG_CONTIG ?
- td->td_samplesperpixel : 1);
- tbuf_size = multiply_ms(multiply_ms(multiply_ms(sp->stride, td->td_imagewidth),
- strip_height), sizeof(uint16));
- /* add one more stride in case input ends mid-stride */
- tbuf_size = add_ms(tbuf_size, sizeof(uint16) * sp->stride);
- if (tbuf_size == 0)
- return (0); /* TODO: this is an error return without error report through TIFFErrorExt */
- sp->tbuf = (uint16 *) _TIFFmalloc(tbuf_size);
- if (sp->tbuf == NULL)
- return (0);
- sp->tbuf_size = tbuf_size;
- if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN)
- sp->user_datafmt = PixarLogGuessDataFmt(td);
- if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN) {
- _TIFFfree(sp->tbuf);
- sp->tbuf = NULL;
- sp->tbuf_size = 0;
- TIFFErrorExt(tif->tif_clientdata, module,
- "PixarLog compression can't handle bits depth/data format combination (depth: %d)",
- td->td_bitspersample);
- return (0);
- }
-
- if (inflateInit(&sp->stream) != Z_OK) {
- _TIFFfree(sp->tbuf);
- sp->tbuf = NULL;
- sp->tbuf_size = 0;
- TIFFErrorExt(tif->tif_clientdata, module, "%s", sp->stream.msg ? sp->stream.msg : "(null)");
- return (0);
- } else {
- sp->state |= PLSTATE_INIT;
- return (1);
- }
+ static const char module[] = "PixarLogSetupDecode";
+ TIFFDirectory *td = &tif->tif_dir;
+ PixarLogState *sp = DecoderState(tif);
+ tmsize_t tbuf_size;
+ uint32_t strip_height;
+
+ assert(sp != NULL);
+
+ /* This function can possibly be called several times by */
+ /* PredictorSetupDecode() if this function succeeds but */
+ /* PredictorSetup() fails */
+ if ((sp->state & PLSTATE_INIT) != 0)
+ return 1;
+
+ strip_height = td->td_rowsperstrip;
+ if (strip_height > td->td_imagelength)
+ strip_height = td->td_imagelength;
+
+ /* Make sure no byte swapping happens on the data
+ * after decompression. */
+ tif->tif_postdecode = _TIFFNoPostDecode;
+
+ /* for some reason, we can't do this in TIFFInitPixarLog */
+
+ sp->stride =
+ (td->td_planarconfig == PLANARCONFIG_CONTIG ? td->td_samplesperpixel
+ : 1);
+ tbuf_size = multiply_ms(
+ multiply_ms(multiply_ms(sp->stride, td->td_imagewidth), strip_height),
+ sizeof(uint16_t));
+ /* add one more stride in case input ends mid-stride */
+ tbuf_size = add_ms(tbuf_size, sizeof(uint16_t) * sp->stride);
+ if (tbuf_size == 0)
+ return (0); /* TODO: this is an error return without error report
+ through TIFFErrorExt */
+ sp->tbuf = (uint16_t *)_TIFFmallocExt(tif, tbuf_size);
+ if (sp->tbuf == NULL)
+ return (0);
+ sp->tbuf_size = tbuf_size;
+ if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN)
+ sp->user_datafmt = PixarLogGuessDataFmt(td);
+ if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN)
+ {
+ _TIFFfreeExt(tif, sp->tbuf);
+ sp->tbuf = NULL;
+ sp->tbuf_size = 0;
+ TIFFErrorExtR(tif, module,
+ "PixarLog compression can't handle bits depth/data "
+ "format combination (depth: %" PRIu16 ")",
+ td->td_bitspersample);
+ return (0);
+ }
+
+ if (inflateInit(&sp->stream) != Z_OK)
+ {
+ _TIFFfreeExt(tif, sp->tbuf);
+ sp->tbuf = NULL;
+ sp->tbuf_size = 0;
+ TIFFErrorExtR(tif, module, "%s",
+ sp->stream.msg ? sp->stream.msg : "(null)");
+ return (0);
+ }
+ else
+ {
+ sp->state |= PLSTATE_INIT;
+ return (1);
+ }
}
/*
* Setup state for decoding a strip.
*/
-static int
-PixarLogPreDecode(TIFF* tif, uint16 s)
+static int PixarLogPreDecode(TIFF *tif, uint16_t s)
{
- static const char module[] = "PixarLogPreDecode";
- PixarLogState* sp = DecoderState(tif);
-
- (void) s;
- assert(sp != NULL);
- sp->stream.next_in = tif->tif_rawdata;
- assert(sizeof(sp->stream.avail_in)==4); /* if this assert gets raised,
- we need to simplify this code to reflect a ZLib that is likely updated
- to deal with 8byte memory sizes, though this code will respond
- appropriately even before we simplify it */
- sp->stream.avail_in = (uInt) tif->tif_rawcc;
- if ((tmsize_t)sp->stream.avail_in != tif->tif_rawcc)
- {
- TIFFErrorExt(tif->tif_clientdata, module, "ZLib cannot deal with buffers this size");
- return (0);
- }
- return (inflateReset(&sp->stream) == Z_OK);
+ static const char module[] = "PixarLogPreDecode";
+ PixarLogState *sp = DecoderState(tif);
+
+ (void)s;
+ assert(sp != NULL);
+ sp->stream.next_in = tif->tif_rawdata;
+ assert(sizeof(sp->stream.avail_in) == 4); /* if this assert gets raised,
+ we need to simplify this code to reflect a ZLib that is likely updated
+ to deal with 8byte memory sizes, though this code will respond
+ appropriately even before we simplify it */
+ sp->stream.avail_in = (uInt)tif->tif_rawcc;
+ if ((tmsize_t)sp->stream.avail_in != tif->tif_rawcc)
+ {
+ TIFFErrorExtR(tif, module, "ZLib cannot deal with buffers this size");
+ return (0);
+ }
+ return (inflateReset(&sp->stream) == Z_OK);
}
-static int
-PixarLogDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
+static int PixarLogDecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s)
{
- static const char module[] = "PixarLogDecode";
- TIFFDirectory *td = &tif->tif_dir;
- PixarLogState* sp = DecoderState(tif);
- tmsize_t i;
- tmsize_t nsamples;
- int llen;
- uint16 *up;
-
- switch (sp->user_datafmt) {
- case PIXARLOGDATAFMT_FLOAT:
- nsamples = occ / sizeof(float); /* XXX float == 32 bits */
- break;
- case PIXARLOGDATAFMT_16BIT:
- case PIXARLOGDATAFMT_12BITPICIO:
- case PIXARLOGDATAFMT_11BITLOG:
- nsamples = occ / sizeof(uint16); /* XXX uint16 == 16 bits */
- break;
- case PIXARLOGDATAFMT_8BIT:
- case PIXARLOGDATAFMT_8BITABGR:
- nsamples = occ;
- break;
- default:
- TIFFErrorExt(tif->tif_clientdata, module,
- "%d bit input not supported in PixarLog",
- td->td_bitspersample);
- return 0;
- }
-
- llen = sp->stride * td->td_imagewidth;
-
- (void) s;
- assert(sp != NULL);
-
- sp->stream.next_in = tif->tif_rawcp;
- sp->stream.avail_in = (uInt) tif->tif_rawcc;
-
- sp->stream.next_out = (unsigned char *) sp->tbuf;
- assert(sizeof(sp->stream.avail_out)==4); /* if this assert gets raised,
- we need to simplify this code to reflect a ZLib that is likely updated
- to deal with 8byte memory sizes, though this code will respond
- appropriately even before we simplify it */
- sp->stream.avail_out = (uInt) (nsamples * sizeof(uint16));
- if (sp->stream.avail_out != nsamples * sizeof(uint16))
- {
- TIFFErrorExt(tif->tif_clientdata, module, "ZLib cannot deal with buffers this size");
- return (0);
- }
- /* Check that we will not fill more than what was allocated */
- if ((tmsize_t)sp->stream.avail_out > sp->tbuf_size)
- {
- TIFFErrorExt(tif->tif_clientdata, module, "sp->stream.avail_out > sp->tbuf_size");
- return (0);
- }
- do {
- int state = inflate(&sp->stream, Z_PARTIAL_FLUSH);
- if (state == Z_STREAM_END) {
- break; /* XXX */
- }
- if (state == Z_DATA_ERROR) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Decoding error at scanline %lu, %s",
- (unsigned long) tif->tif_row, sp->stream.msg ? sp->stream.msg : "(null)");
- return (0);
- }
- if (state != Z_OK) {
- TIFFErrorExt(tif->tif_clientdata, module, "ZLib error: %s",
- sp->stream.msg ? sp->stream.msg : "(null)");
- return (0);
- }
- } while (sp->stream.avail_out > 0);
-
- /* hopefully, we got all the bytes we needed */
- if (sp->stream.avail_out != 0) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Not enough data at scanline %lu (short " TIFF_UINT64_FORMAT " bytes)",
- (unsigned long) tif->tif_row, (TIFF_UINT64_T) sp->stream.avail_out);
- return (0);
- }
-
- tif->tif_rawcp = sp->stream.next_in;
- tif->tif_rawcc = sp->stream.avail_in;
-
- up = sp->tbuf;
- /* Swap bytes in the data if from a different endian machine. */
- if (tif->tif_flags & TIFF_SWAB)
- TIFFSwabArrayOfShort(up, nsamples);
-
- /*
- * if llen is not an exact multiple of nsamples, the decode operation
- * may overflow the output buffer, so truncate it enough to prevent
- * that but still salvage as much data as possible.
- */
- if (nsamples % llen) {
- TIFFWarningExt(tif->tif_clientdata, module,
- "stride %lu is not a multiple of sample count, "
- "%lu, data truncated.", (unsigned long) llen, (unsigned long) nsamples);
- nsamples -= nsamples % llen;
- }
-
- for (i = 0; i < nsamples; i += llen, up += llen) {
- switch (sp->user_datafmt) {
- case PIXARLOGDATAFMT_FLOAT:
- horizontalAccumulateF(up, llen, sp->stride,
- (float *)op, sp->ToLinearF);
- op += llen * sizeof(float);
- break;
- case PIXARLOGDATAFMT_16BIT:
- horizontalAccumulate16(up, llen, sp->stride,
- (uint16 *)op, sp->ToLinear16);
- op += llen * sizeof(uint16);
- break;
- case PIXARLOGDATAFMT_12BITPICIO:
- horizontalAccumulate12(up, llen, sp->stride,
- (int16 *)op, sp->ToLinearF);
- op += llen * sizeof(int16);
- break;
- case PIXARLOGDATAFMT_11BITLOG:
- horizontalAccumulate11(up, llen, sp->stride,
- (uint16 *)op);
- op += llen * sizeof(uint16);
- break;
- case PIXARLOGDATAFMT_8BIT:
- horizontalAccumulate8(up, llen, sp->stride,
- (unsigned char *)op, sp->ToLinear8);
- op += llen * sizeof(unsigned char);
- break;
- case PIXARLOGDATAFMT_8BITABGR:
- horizontalAccumulate8abgr(up, llen, sp->stride,
- (unsigned char *)op, sp->ToLinear8);
- op += llen * sizeof(unsigned char);
- break;
- default:
- TIFFErrorExt(tif->tif_clientdata, module,
- "Unsupported bits/sample: %d",
- td->td_bitspersample);
- return (0);
- }
- }
-
- return (1);
+ static const char module[] = "PixarLogDecode";
+ TIFFDirectory *td = &tif->tif_dir;
+ PixarLogState *sp = DecoderState(tif);
+ tmsize_t i;
+ tmsize_t nsamples;
+ int llen;
+ uint16_t *up;
+
+ switch (sp->user_datafmt)
+ {
+ case PIXARLOGDATAFMT_FLOAT:
+ nsamples = occ / sizeof(float); /* XXX float == 32 bits */
+ break;
+ case PIXARLOGDATAFMT_16BIT:
+ case PIXARLOGDATAFMT_12BITPICIO:
+ case PIXARLOGDATAFMT_11BITLOG:
+ nsamples = occ / sizeof(uint16_t); /* XXX uint16_t == 16 bits */
+ break;
+ case PIXARLOGDATAFMT_8BIT:
+ case PIXARLOGDATAFMT_8BITABGR:
+ nsamples = occ;
+ break;
+ default:
+ TIFFErrorExtR(tif, module,
+ "%" PRIu16 " bit input not supported in PixarLog",
+ td->td_bitspersample);
+ return 0;
+ }
+
+ llen = sp->stride * td->td_imagewidth;
+
+ (void)s;
+ assert(sp != NULL);
+
+ sp->stream.next_in = tif->tif_rawcp;
+ sp->stream.avail_in = (uInt)tif->tif_rawcc;
+
+ sp->stream.next_out = (unsigned char *)sp->tbuf;
+ assert(sizeof(sp->stream.avail_out) == 4); /* if this assert gets raised,
+ we need to simplify this code to reflect a ZLib that is likely updated
+ to deal with 8byte memory sizes, though this code will respond
+ appropriately even before we simplify it */
+ sp->stream.avail_out = (uInt)(nsamples * sizeof(uint16_t));
+ if (sp->stream.avail_out != nsamples * sizeof(uint16_t))
+ {
+ TIFFErrorExtR(tif, module, "ZLib cannot deal with buffers this size");
+ return (0);
+ }
+ /* Check that we will not fill more than what was allocated */
+ if ((tmsize_t)sp->stream.avail_out > sp->tbuf_size)
+ {
+ TIFFErrorExtR(tif, module, "sp->stream.avail_out > sp->tbuf_size");
+ return (0);
+ }
+ do
+ {
+ int state = inflate(&sp->stream, Z_PARTIAL_FLUSH);
+ if (state == Z_STREAM_END)
+ {
+ break; /* XXX */
+ }
+ if (state == Z_DATA_ERROR)
+ {
+ TIFFErrorExtR(
+ tif, module, "Decoding error at scanline %" PRIu32 ", %s",
+ tif->tif_row, sp->stream.msg ? sp->stream.msg : "(null)");
+ return (0);
+ }
+ if (state != Z_OK)
+ {
+ TIFFErrorExtR(tif, module, "ZLib error: %s",
+ sp->stream.msg ? sp->stream.msg : "(null)");
+ return (0);
+ }
+ } while (sp->stream.avail_out > 0);
+
+ /* hopefully, we got all the bytes we needed */
+ if (sp->stream.avail_out != 0)
+ {
+ TIFFErrorExtR(tif, module,
+ "Not enough data at scanline %" PRIu32
+ " (short %u bytes)",
+ tif->tif_row, sp->stream.avail_out);
+ return (0);
+ }
+
+ tif->tif_rawcp = sp->stream.next_in;
+ tif->tif_rawcc = sp->stream.avail_in;
+
+ up = sp->tbuf;
+ /* Swap bytes in the data if from a different endian machine. */
+ if (tif->tif_flags & TIFF_SWAB)
+ TIFFSwabArrayOfShort(up, nsamples);
+
+ /*
+ * if llen is not an exact multiple of nsamples, the decode operation
+ * may overflow the output buffer, so truncate it enough to prevent
+ * that but still salvage as much data as possible.
+ */
+ if (nsamples % llen)
+ {
+ TIFFWarningExtR(tif, module,
+ "stride %d is not a multiple of sample count, "
+ "%" TIFF_SSIZE_FORMAT ", data truncated.",
+ llen, nsamples);
+ nsamples -= nsamples % llen;
+ }
+
+ for (i = 0; i < nsamples; i += llen, up += llen)
+ {
+ switch (sp->user_datafmt)
+ {
+ case PIXARLOGDATAFMT_FLOAT:
+ horizontalAccumulateF(up, llen, sp->stride, (float *)op,
+ sp->ToLinearF);
+ op += llen * sizeof(float);
+ break;
+ case PIXARLOGDATAFMT_16BIT:
+ horizontalAccumulate16(up, llen, sp->stride, (uint16_t *)op,
+ sp->ToLinear16);
+ op += llen * sizeof(uint16_t);
+ break;
+ case PIXARLOGDATAFMT_12BITPICIO:
+ horizontalAccumulate12(up, llen, sp->stride, (int16_t *)op,
+ sp->ToLinearF);
+ op += llen * sizeof(int16_t);
+ break;
+ case PIXARLOGDATAFMT_11BITLOG:
+ horizontalAccumulate11(up, llen, sp->stride, (uint16_t *)op);
+ op += llen * sizeof(uint16_t);
+ break;
+ case PIXARLOGDATAFMT_8BIT:
+ horizontalAccumulate8(up, llen, sp->stride, (unsigned char *)op,
+ sp->ToLinear8);
+ op += llen * sizeof(unsigned char);
+ break;
+ case PIXARLOGDATAFMT_8BITABGR:
+ horizontalAccumulate8abgr(up, llen, sp->stride,
+ (unsigned char *)op, sp->ToLinear8);
+ op += llen * sizeof(unsigned char);
+ break;
+ default:
+ TIFFErrorExtR(tif, module, "Unsupported bits/sample: %" PRIu16,
+ td->td_bitspersample);
+ return (0);
+ }
+ }
+
+ return (1);
}
-static int
-PixarLogSetupEncode(TIFF* tif)
+static int PixarLogSetupEncode(TIFF *tif)
{
- static const char module[] = "PixarLogSetupEncode";
- TIFFDirectory *td = &tif->tif_dir;
- PixarLogState* sp = EncoderState(tif);
- tmsize_t tbuf_size;
-
- assert(sp != NULL);
-
- /* for some reason, we can't do this in TIFFInitPixarLog */
-
- sp->stride = (td->td_planarconfig == PLANARCONFIG_CONTIG ?
- td->td_samplesperpixel : 1);
- tbuf_size = multiply_ms(multiply_ms(multiply_ms(sp->stride, td->td_imagewidth),
- td->td_rowsperstrip), sizeof(uint16));
- if (tbuf_size == 0)
- return (0); /* TODO: this is an error return without error report through TIFFErrorExt */
- sp->tbuf = (uint16 *) _TIFFmalloc(tbuf_size);
- if (sp->tbuf == NULL)
- return (0);
- if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN)
- sp->user_datafmt = PixarLogGuessDataFmt(td);
- if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN) {
- TIFFErrorExt(tif->tif_clientdata, module, "PixarLog compression can't handle %d bit linear encodings", td->td_bitspersample);
- return (0);
- }
-
- if (deflateInit(&sp->stream, sp->quality) != Z_OK) {
- TIFFErrorExt(tif->tif_clientdata, module, "%s", sp->stream.msg ? sp->stream.msg : "(null)");
- return (0);
- } else {
- sp->state |= PLSTATE_INIT;
- return (1);
- }
+ static const char module[] = "PixarLogSetupEncode";
+ TIFFDirectory *td = &tif->tif_dir;
+ PixarLogState *sp = EncoderState(tif);
+ tmsize_t tbuf_size;
+
+ assert(sp != NULL);
+
+ /* for some reason, we can't do this in TIFFInitPixarLog */
+
+ sp->stride =
+ (td->td_planarconfig == PLANARCONFIG_CONTIG ? td->td_samplesperpixel
+ : 1);
+ tbuf_size =
+ multiply_ms(multiply_ms(multiply_ms(sp->stride, td->td_imagewidth),
+ td->td_rowsperstrip),
+ sizeof(uint16_t));
+ if (tbuf_size == 0)
+ return (0); /* TODO: this is an error return without error report
+ through TIFFErrorExt */
+ sp->tbuf = (uint16_t *)_TIFFmallocExt(tif, tbuf_size);
+ if (sp->tbuf == NULL)
+ return (0);
+ if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN)
+ sp->user_datafmt = PixarLogGuessDataFmt(td);
+ if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN)
+ {
+ TIFFErrorExtR(tif, module,
+ "PixarLog compression can't handle %" PRIu16
+ " bit linear encodings",
+ td->td_bitspersample);
+ return (0);
+ }
+
+ if (deflateInit(&sp->stream, sp->quality) != Z_OK)
+ {
+ TIFFErrorExtR(tif, module, "%s",
+ sp->stream.msg ? sp->stream.msg : "(null)");
+ return (0);
+ }
+ else
+ {
+ sp->state |= PLSTATE_INIT;
+ return (1);
+ }
}
/*
* Reset encoding state at the start of a strip.
*/
-static int
-PixarLogPreEncode(TIFF* tif, uint16 s)
+static int PixarLogPreEncode(TIFF *tif, uint16_t s)
{
- static const char module[] = "PixarLogPreEncode";
- PixarLogState *sp = EncoderState(tif);
-
- (void) s;
- assert(sp != NULL);
- sp->stream.next_out = tif->tif_rawdata;
- assert(sizeof(sp->stream.avail_out)==4); /* if this assert gets raised,
- we need to simplify this code to reflect a ZLib that is likely updated
- to deal with 8byte memory sizes, though this code will respond
- appropriately even before we simplify it */
- sp->stream.avail_out = (uInt)tif->tif_rawdatasize;
- if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize)
- {
- TIFFErrorExt(tif->tif_clientdata, module, "ZLib cannot deal with buffers this size");
- return (0);
- }
- return (deflateReset(&sp->stream) == Z_OK);
+ static const char module[] = "PixarLogPreEncode";
+ PixarLogState *sp = EncoderState(tif);
+
+ (void)s;
+ assert(sp != NULL);
+ sp->stream.next_out = tif->tif_rawdata;
+ assert(sizeof(sp->stream.avail_out) == 4); /* if this assert gets raised,
+ we need to simplify this code to reflect a ZLib that is likely updated
+ to deal with 8byte memory sizes, though this code will respond
+ appropriately even before we simplify it */
+ sp->stream.avail_out = (uInt)tif->tif_rawdatasize;
+ if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize)
+ {
+ TIFFErrorExtR(tif, module, "ZLib cannot deal with buffers this size");
+ return (0);
+ }
+ return (deflateReset(&sp->stream) == Z_OK);
}
-static void
-horizontalDifferenceF(float *ip, int n, int stride, uint16 *wp, uint16 *FromLT2)
+static void horizontalDifferenceF(float *ip, int n, int stride, uint16_t *wp,
+ uint16_t *FromLT2)
{
- int32 r1, g1, b1, a1, r2, g2, b2, a2, mask;
+ int32_t r1, g1, b1, a1, r2, g2, b2, a2, mask;
float fltsize = Fltsize;
-#define CLAMP(v) ( (v<(float)0.) ? 0 \
- : (v<(float)2.) ? FromLT2[(int)(v*fltsize)] \
- : (v>(float)24.2) ? 2047 \
- : LogK1*log(v*LogK2) + 0.5 )
+#define CLAMP(v) \
+ ((v < (float)0.) ? 0 \
+ : (v < (float)2.) ? FromLT2[(int)(v * fltsize)] \
+ : (v > (float)24.2) ? 2047 \
+ : LogK1 * log(v * LogK2) + 0.5)
mask = CODE_MASK;
- if (n >= stride) {
- if (stride == 3) {
- r2 = wp[0] = (uint16) CLAMP(ip[0]);
- g2 = wp[1] = (uint16) CLAMP(ip[1]);
- b2 = wp[2] = (uint16) CLAMP(ip[2]);
- n -= 3;
- while (n > 0) {
- n -= 3;
- wp += 3;
- ip += 3;
- r1 = (int32) CLAMP(ip[0]); wp[0] = (uint16)((r1-r2) & mask); r2 = r1;
- g1 = (int32) CLAMP(ip[1]); wp[1] = (uint16)((g1-g2) & mask); g2 = g1;
- b1 = (int32) CLAMP(ip[2]); wp[2] = (uint16)((b1-b2) & mask); b2 = b1;
- }
- } else if (stride == 4) {
- r2 = wp[0] = (uint16) CLAMP(ip[0]);
- g2 = wp[1] = (uint16) CLAMP(ip[1]);
- b2 = wp[2] = (uint16) CLAMP(ip[2]);
- a2 = wp[3] = (uint16) CLAMP(ip[3]);
- n -= 4;
- while (n > 0) {
- n -= 4;
- wp += 4;
- ip += 4;
- r1 = (int32) CLAMP(ip[0]); wp[0] = (uint16)((r1-r2) & mask); r2 = r1;
- g1 = (int32) CLAMP(ip[1]); wp[1] = (uint16)((g1-g2) & mask); g2 = g1;
- b1 = (int32) CLAMP(ip[2]); wp[2] = (uint16)((b1-b2) & mask); b2 = b1;
- a1 = (int32) CLAMP(ip[3]); wp[3] = (uint16)((a1-a2) & mask); a2 = a1;
- }
- } else {
- REPEAT(stride, wp[0] = (uint16) CLAMP(ip[0]); wp++; ip++)
- n -= stride;
- while (n > 0) {
- REPEAT(stride,
- wp[0] = (uint16)(((int32)CLAMP(ip[0])-(int32)CLAMP(ip[-stride])) & mask);
- wp++; ip++)
+ if (n >= stride)
+ {
+ if (stride == 3)
+ {
+ r2 = wp[0] = (uint16_t)CLAMP(ip[0]);
+ g2 = wp[1] = (uint16_t)CLAMP(ip[1]);
+ b2 = wp[2] = (uint16_t)CLAMP(ip[2]);
+ n -= 3;
+ while (n > 0)
+ {
+ n -= 3;
+ wp += 3;
+ ip += 3;
+ r1 = (int32_t)CLAMP(ip[0]);
+ wp[0] = (uint16_t)((r1 - r2) & mask);
+ r2 = r1;
+ g1 = (int32_t)CLAMP(ip[1]);
+ wp[1] = (uint16_t)((g1 - g2) & mask);
+ g2 = g1;
+ b1 = (int32_t)CLAMP(ip[2]);
+ wp[2] = (uint16_t)((b1 - b2) & mask);
+ b2 = b1;
+ }
+ }
+ else if (stride == 4)
+ {
+ r2 = wp[0] = (uint16_t)CLAMP(ip[0]);
+ g2 = wp[1] = (uint16_t)CLAMP(ip[1]);
+ b2 = wp[2] = (uint16_t)CLAMP(ip[2]);
+ a2 = wp[3] = (uint16_t)CLAMP(ip[3]);
+ n -= 4;
+ while (n > 0)
+ {
+ n -= 4;
+ wp += 4;
+ ip += 4;
+ r1 = (int32_t)CLAMP(ip[0]);
+ wp[0] = (uint16_t)((r1 - r2) & mask);
+ r2 = r1;
+ g1 = (int32_t)CLAMP(ip[1]);
+ wp[1] = (uint16_t)((g1 - g2) & mask);
+ g2 = g1;
+ b1 = (int32_t)CLAMP(ip[2]);
+ wp[2] = (uint16_t)((b1 - b2) & mask);
+ b2 = b1;
+ a1 = (int32_t)CLAMP(ip[3]);
+ wp[3] = (uint16_t)((a1 - a2) & mask);
+ a2 = a1;
+ }
+ }
+ else
+ {
+ REPEAT(stride, wp[0] = (uint16_t)CLAMP(ip[0]); wp++; ip++)
n -= stride;
+ while (n > 0)
+ {
+ REPEAT(stride,
+ wp[0] = (uint16_t)(((int32_t)CLAMP(ip[0]) -
+ (int32_t)CLAMP(ip[-stride])) &
+ mask);
+ wp++; ip++)
+ n -= stride;
+ }
}
- }
}
}
-static void
-horizontalDifference16(unsigned short *ip, int n, int stride,
- unsigned short *wp, uint16 *From14)
+static void horizontalDifference16(unsigned short *ip, int n, int stride,
+ unsigned short *wp, uint16_t *From14)
{
- register int r1, g1, b1, a1, r2, g2, b2, a2, mask;
+ register int r1, g1, b1, a1, r2, g2, b2, a2, mask;
/* assumption is unsigned pixel values */
-#undef CLAMP
-#define CLAMP(v) From14[(v) >> 2]
+#undef CLAMP
+#define CLAMP(v) From14[(v) >> 2]
mask = CODE_MASK;
- if (n >= stride) {
- if (stride == 3) {
- r2 = wp[0] = CLAMP(ip[0]); g2 = wp[1] = CLAMP(ip[1]);
- b2 = wp[2] = CLAMP(ip[2]);
- n -= 3;
- while (n > 0) {
- n -= 3;
- wp += 3;
- ip += 3;
- r1 = CLAMP(ip[0]); wp[0] = (uint16)((r1-r2) & mask); r2 = r1;
- g1 = CLAMP(ip[1]); wp[1] = (uint16)((g1-g2) & mask); g2 = g1;
- b1 = CLAMP(ip[2]); wp[2] = (uint16)((b1-b2) & mask); b2 = b1;
- }
- } else if (stride == 4) {
- r2 = wp[0] = CLAMP(ip[0]); g2 = wp[1] = CLAMP(ip[1]);
- b2 = wp[2] = CLAMP(ip[2]); a2 = wp[3] = CLAMP(ip[3]);
- n -= 4;
- while (n > 0) {
- n -= 4;
- wp += 4;
- ip += 4;
- r1 = CLAMP(ip[0]); wp[0] = (uint16)((r1-r2) & mask); r2 = r1;
- g1 = CLAMP(ip[1]); wp[1] = (uint16)((g1-g2) & mask); g2 = g1;
- b1 = CLAMP(ip[2]); wp[2] = (uint16)((b1-b2) & mask); b2 = b1;
- a1 = CLAMP(ip[3]); wp[3] = (uint16)((a1-a2) & mask); a2 = a1;
- }
- } else {
- REPEAT(stride, wp[0] = CLAMP(ip[0]); wp++; ip++)
- n -= stride;
- while (n > 0) {
- REPEAT(stride,
- wp[0] = (uint16)((CLAMP(ip[0])-CLAMP(ip[-stride])) & mask);
- wp++; ip++)
+ if (n >= stride)
+ {
+ if (stride == 3)
+ {
+ r2 = wp[0] = CLAMP(ip[0]);
+ g2 = wp[1] = CLAMP(ip[1]);
+ b2 = wp[2] = CLAMP(ip[2]);
+ n -= 3;
+ while (n > 0)
+ {
+ n -= 3;
+ wp += 3;
+ ip += 3;
+ r1 = CLAMP(ip[0]);
+ wp[0] = (uint16_t)((r1 - r2) & mask);
+ r2 = r1;
+ g1 = CLAMP(ip[1]);
+ wp[1] = (uint16_t)((g1 - g2) & mask);
+ g2 = g1;
+ b1 = CLAMP(ip[2]);
+ wp[2] = (uint16_t)((b1 - b2) & mask);
+ b2 = b1;
+ }
+ }
+ else if (stride == 4)
+ {
+ r2 = wp[0] = CLAMP(ip[0]);
+ g2 = wp[1] = CLAMP(ip[1]);
+ b2 = wp[2] = CLAMP(ip[2]);
+ a2 = wp[3] = CLAMP(ip[3]);
+ n -= 4;
+ while (n > 0)
+ {
+ n -= 4;
+ wp += 4;
+ ip += 4;
+ r1 = CLAMP(ip[0]);
+ wp[0] = (uint16_t)((r1 - r2) & mask);
+ r2 = r1;
+ g1 = CLAMP(ip[1]);
+ wp[1] = (uint16_t)((g1 - g2) & mask);
+ g2 = g1;
+ b1 = CLAMP(ip[2]);
+ wp[2] = (uint16_t)((b1 - b2) & mask);
+ b2 = b1;
+ a1 = CLAMP(ip[3]);
+ wp[3] = (uint16_t)((a1 - a2) & mask);
+ a2 = a1;
+ }
+ }
+ else
+ {
+ REPEAT(stride, wp[0] = CLAMP(ip[0]); wp++; ip++)
n -= stride;
+ while (n > 0)
+ {
+ REPEAT(stride,
+ wp[0] = (uint16_t)((CLAMP(ip[0]) - CLAMP(ip[-stride])) &
+ mask);
+ wp++; ip++)
+ n -= stride;
+ }
}
- }
}
}
-
-static void
-horizontalDifference8(unsigned char *ip, int n, int stride,
- unsigned short *wp, uint16 *From8)
+static void horizontalDifference8(unsigned char *ip, int n, int stride,
+ unsigned short *wp, uint16_t *From8)
{
- register int r1, g1, b1, a1, r2, g2, b2, a2, mask;
+ register int r1, g1, b1, a1, r2, g2, b2, a2, mask;
-#undef CLAMP
-#define CLAMP(v) (From8[(v)])
+#undef CLAMP
+#define CLAMP(v) (From8[(v)])
mask = CODE_MASK;
- if (n >= stride) {
- if (stride == 3) {
- r2 = wp[0] = CLAMP(ip[0]); g2 = wp[1] = CLAMP(ip[1]);
- b2 = wp[2] = CLAMP(ip[2]);
- n -= 3;
- while (n > 0) {
- n -= 3;
- r1 = CLAMP(ip[3]); wp[3] = (uint16)((r1-r2) & mask); r2 = r1;
- g1 = CLAMP(ip[4]); wp[4] = (uint16)((g1-g2) & mask); g2 = g1;
- b1 = CLAMP(ip[5]); wp[5] = (uint16)((b1-b2) & mask); b2 = b1;
- wp += 3;
- ip += 3;
- }
- } else if (stride == 4) {
- r2 = wp[0] = CLAMP(ip[0]); g2 = wp[1] = CLAMP(ip[1]);
- b2 = wp[2] = CLAMP(ip[2]); a2 = wp[3] = CLAMP(ip[3]);
- n -= 4;
- while (n > 0) {
- n -= 4;
- r1 = CLAMP(ip[4]); wp[4] = (uint16)((r1-r2) & mask); r2 = r1;
- g1 = CLAMP(ip[5]); wp[5] = (uint16)((g1-g2) & mask); g2 = g1;
- b1 = CLAMP(ip[6]); wp[6] = (uint16)((b1-b2) & mask); b2 = b1;
- a1 = CLAMP(ip[7]); wp[7] = (uint16)((a1-a2) & mask); a2 = a1;
- wp += 4;
- ip += 4;
- }
- } else {
- REPEAT(stride, wp[0] = CLAMP(ip[0]); wp++; ip++)
- n -= stride;
- while (n > 0) {
- REPEAT(stride,
- wp[0] = (uint16)((CLAMP(ip[0])-CLAMP(ip[-stride])) & mask);
- wp++; ip++)
+ if (n >= stride)
+ {
+ if (stride == 3)
+ {
+ r2 = wp[0] = CLAMP(ip[0]);
+ g2 = wp[1] = CLAMP(ip[1]);
+ b2 = wp[2] = CLAMP(ip[2]);
+ n -= 3;
+ while (n > 0)
+ {
+ n -= 3;
+ r1 = CLAMP(ip[3]);
+ wp[3] = (uint16_t)((r1 - r2) & mask);
+ r2 = r1;
+ g1 = CLAMP(ip[4]);
+ wp[4] = (uint16_t)((g1 - g2) & mask);
+ g2 = g1;
+ b1 = CLAMP(ip[5]);
+ wp[5] = (uint16_t)((b1 - b2) & mask);
+ b2 = b1;
+ wp += 3;
+ ip += 3;
+ }
+ }
+ else if (stride == 4)
+ {
+ r2 = wp[0] = CLAMP(ip[0]);
+ g2 = wp[1] = CLAMP(ip[1]);
+ b2 = wp[2] = CLAMP(ip[2]);
+ a2 = wp[3] = CLAMP(ip[3]);
+ n -= 4;
+ while (n > 0)
+ {
+ n -= 4;
+ r1 = CLAMP(ip[4]);
+ wp[4] = (uint16_t)((r1 - r2) & mask);
+ r2 = r1;
+ g1 = CLAMP(ip[5]);
+ wp[5] = (uint16_t)((g1 - g2) & mask);
+ g2 = g1;
+ b1 = CLAMP(ip[6]);
+ wp[6] = (uint16_t)((b1 - b2) & mask);
+ b2 = b1;
+ a1 = CLAMP(ip[7]);
+ wp[7] = (uint16_t)((a1 - a2) & mask);
+ a2 = a1;
+ wp += 4;
+ ip += 4;
+ }
+ }
+ else
+ {
+ REPEAT(stride, wp[0] = CLAMP(ip[0]); wp++; ip++)
n -= stride;
+ while (n > 0)
+ {
+ REPEAT(stride,
+ wp[0] = (uint16_t)((CLAMP(ip[0]) - CLAMP(ip[-stride])) &
+ mask);
+ wp++; ip++)
+ n -= stride;
+ }
}
}
- }
}
/*
* Encode a chunk of pixels.
*/
-static int
-PixarLogEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
+static int PixarLogEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
{
- static const char module[] = "PixarLogEncode";
- TIFFDirectory *td = &tif->tif_dir;
- PixarLogState *sp = EncoderState(tif);
- tmsize_t i;
- tmsize_t n;
- int llen;
- unsigned short * up;
-
- (void) s;
-
- switch (sp->user_datafmt) {
- case PIXARLOGDATAFMT_FLOAT:
- n = cc / sizeof(float); /* XXX float == 32 bits */
- break;
- case PIXARLOGDATAFMT_16BIT:
- case PIXARLOGDATAFMT_12BITPICIO:
- case PIXARLOGDATAFMT_11BITLOG:
- n = cc / sizeof(uint16); /* XXX uint16 == 16 bits */
- break;
- case PIXARLOGDATAFMT_8BIT:
- case PIXARLOGDATAFMT_8BITABGR:
- n = cc;
- break;
- default:
- TIFFErrorExt(tif->tif_clientdata, module,
- "%d bit input not supported in PixarLog",
- td->td_bitspersample);
- return 0;
- }
-
- llen = sp->stride * td->td_imagewidth;
- /* Check against the number of elements (of size uint16) of sp->tbuf */
- if( n > ((tmsize_t)td->td_rowsperstrip * llen) )
+ static const char module[] = "PixarLogEncode";
+ TIFFDirectory *td = &tif->tif_dir;
+ PixarLogState *sp = EncoderState(tif);
+ tmsize_t i;
+ tmsize_t n;
+ int llen;
+ unsigned short *up;
+
+ (void)s;
+
+ switch (sp->user_datafmt)
+ {
+ case PIXARLOGDATAFMT_FLOAT:
+ n = cc / sizeof(float); /* XXX float == 32 bits */
+ break;
+ case PIXARLOGDATAFMT_16BIT:
+ case PIXARLOGDATAFMT_12BITPICIO:
+ case PIXARLOGDATAFMT_11BITLOG:
+ n = cc / sizeof(uint16_t); /* XXX uint16_t == 16 bits */
+ break;
+ case PIXARLOGDATAFMT_8BIT:
+ case PIXARLOGDATAFMT_8BITABGR:
+ n = cc;
+ break;
+ default:
+ TIFFErrorExtR(tif, module,
+ "%" PRIu16 " bit input not supported in PixarLog",
+ td->td_bitspersample);
+ return 0;
+ }
+
+ llen = sp->stride * td->td_imagewidth;
+ /* Check against the number of elements (of size uint16_t) of sp->tbuf */
+ if (n > ((tmsize_t)td->td_rowsperstrip * llen))
{
- TIFFErrorExt(tif->tif_clientdata, module,
- "Too many input bytes provided");
+ TIFFErrorExtR(tif, module, "Too many input bytes provided");
return 0;
}
- for (i = 0, up = sp->tbuf; i < n; i += llen, up += llen) {
- switch (sp->user_datafmt) {
- case PIXARLOGDATAFMT_FLOAT:
- horizontalDifferenceF((float *)bp, llen,
- sp->stride, up, sp->FromLT2);
- bp += llen * sizeof(float);
- break;
- case PIXARLOGDATAFMT_16BIT:
- horizontalDifference16((uint16 *)bp, llen,
- sp->stride, up, sp->From14);
- bp += llen * sizeof(uint16);
- break;
- case PIXARLOGDATAFMT_8BIT:
- horizontalDifference8((unsigned char *)bp, llen,
- sp->stride, up, sp->From8);
- bp += llen * sizeof(unsigned char);
- break;
- default:
- TIFFErrorExt(tif->tif_clientdata, module,
- "%d bit input not supported in PixarLog",
- td->td_bitspersample);
- return 0;
- }
- }
-
- sp->stream.next_in = (unsigned char *) sp->tbuf;
- assert(sizeof(sp->stream.avail_in)==4); /* if this assert gets raised,
- we need to simplify this code to reflect a ZLib that is likely updated
- to deal with 8byte memory sizes, though this code will respond
- appropriately even before we simplify it */
- sp->stream.avail_in = (uInt) (n * sizeof(uint16));
- if ((sp->stream.avail_in / sizeof(uint16)) != (uInt) n)
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "ZLib cannot deal with buffers this size");
- return (0);
- }
-
- do {
- if (deflate(&sp->stream, Z_NO_FLUSH) != Z_OK) {
- TIFFErrorExt(tif->tif_clientdata, module, "Encoder error: %s",
- sp->stream.msg ? sp->stream.msg : "(null)");
- return (0);
- }
- if (sp->stream.avail_out == 0) {
- tif->tif_rawcc = tif->tif_rawdatasize;
- TIFFFlushData1(tif);
- sp->stream.next_out = tif->tif_rawdata;
- sp->stream.avail_out = (uInt) tif->tif_rawdatasize; /* this is a safe typecast, as check is made already in PixarLogPreEncode */
- }
- } while (sp->stream.avail_in > 0);
- return (1);
+ for (i = 0, up = sp->tbuf; i < n; i += llen, up += llen)
+ {
+ switch (sp->user_datafmt)
+ {
+ case PIXARLOGDATAFMT_FLOAT:
+ horizontalDifferenceF((float *)bp, llen, sp->stride, up,
+ sp->FromLT2);
+ bp += llen * sizeof(float);
+ break;
+ case PIXARLOGDATAFMT_16BIT:
+ horizontalDifference16((uint16_t *)bp, llen, sp->stride, up,
+ sp->From14);
+ bp += llen * sizeof(uint16_t);
+ break;
+ case PIXARLOGDATAFMT_8BIT:
+ horizontalDifference8((unsigned char *)bp, llen, sp->stride, up,
+ sp->From8);
+ bp += llen * sizeof(unsigned char);
+ break;
+ default:
+ TIFFErrorExtR(tif, module,
+ "%" PRIu16 " bit input not supported in PixarLog",
+ td->td_bitspersample);
+ return 0;
+ }
+ }
+
+ sp->stream.next_in = (unsigned char *)sp->tbuf;
+ assert(sizeof(sp->stream.avail_in) == 4); /* if this assert gets raised,
+ we need to simplify this code to reflect a ZLib that is likely updated
+ to deal with 8byte memory sizes, though this code will respond
+ appropriately even before we simplify it */
+ sp->stream.avail_in = (uInt)(n * sizeof(uint16_t));
+ if ((sp->stream.avail_in / sizeof(uint16_t)) != (uInt)n)
+ {
+ TIFFErrorExtR(tif, module, "ZLib cannot deal with buffers this size");
+ return (0);
+ }
+
+ do
+ {
+ if (deflate(&sp->stream, Z_NO_FLUSH) != Z_OK)
+ {
+ TIFFErrorExtR(tif, module, "Encoder error: %s",
+ sp->stream.msg ? sp->stream.msg : "(null)");
+ return (0);
+ }
+ if (sp->stream.avail_out == 0)
+ {
+ tif->tif_rawcc = tif->tif_rawdatasize;
+ if (!TIFFFlushData1(tif))
+ return 0;
+ sp->stream.next_out = tif->tif_rawdata;
+ sp->stream.avail_out =
+ (uInt)tif
+ ->tif_rawdatasize; /* this is a safe typecast, as check is
+ made already in PixarLogPreEncode */
+ }
+ } while (sp->stream.avail_in > 0);
+ return (1);
}
/*
@@ -1213,265 +1398,273 @@ PixarLogEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
* string and tacking on an End Of Information code.
*/
-static int
-PixarLogPostEncode(TIFF* tif)
+static int PixarLogPostEncode(TIFF *tif)
{
- static const char module[] = "PixarLogPostEncode";
- PixarLogState *sp = EncoderState(tif);
- int state;
-
- sp->stream.avail_in = 0;
-
- do {
- state = deflate(&sp->stream, Z_FINISH);
- switch (state) {
- case Z_STREAM_END:
- case Z_OK:
- if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize) {
- tif->tif_rawcc =
- tif->tif_rawdatasize - sp->stream.avail_out;
- TIFFFlushData1(tif);
- sp->stream.next_out = tif->tif_rawdata;
- sp->stream.avail_out = (uInt) tif->tif_rawdatasize; /* this is a safe typecast, as check is made already in PixarLogPreEncode */
- }
- break;
- default:
- TIFFErrorExt(tif->tif_clientdata, module, "ZLib error: %s",
- sp->stream.msg ? sp->stream.msg : "(null)");
- return (0);
- }
- } while (state != Z_STREAM_END);
- return (1);
+ static const char module[] = "PixarLogPostEncode";
+ PixarLogState *sp = EncoderState(tif);
+ int state;
+
+ sp->stream.avail_in = 0;
+
+ do
+ {
+ state = deflate(&sp->stream, Z_FINISH);
+ switch (state)
+ {
+ case Z_STREAM_END:
+ case Z_OK:
+ if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize)
+ {
+ tif->tif_rawcc =
+ tif->tif_rawdatasize - sp->stream.avail_out;
+ if (!TIFFFlushData1(tif))
+ return 0;
+ sp->stream.next_out = tif->tif_rawdata;
+ sp->stream.avail_out =
+ (uInt)tif->tif_rawdatasize; /* this is a safe typecast,
+ as check is made already
+ in PixarLogPreEncode */
+ }
+ break;
+ default:
+ TIFFErrorExtR(tif, module, "ZLib error: %s",
+ sp->stream.msg ? sp->stream.msg : "(null)");
+ return (0);
+ }
+ } while (state != Z_STREAM_END);
+ return (1);
}
-static void
-PixarLogClose(TIFF* tif)
+static void PixarLogClose(TIFF *tif)
{
- PixarLogState* sp = (PixarLogState*) tif->tif_data;
- TIFFDirectory *td = &tif->tif_dir;
-
- assert(sp != 0);
- /* In a really sneaky (and really incorrect, and untruthful, and
- * troublesome, and error-prone) maneuver that completely goes against
- * the spirit of TIFF, and breaks TIFF, on close, we covertly
- * modify both bitspersample and sampleformat in the directory to
- * indicate 8-bit linear. This way, the decode "just works" even for
- * readers that don't know about PixarLog, or how to set
- * the PIXARLOGDATFMT pseudo-tag.
- */
-
- if (sp->state&PLSTATE_INIT) {
- /* We test the state to avoid an issue such as in
- * http://bugzilla.maptools.org/show_bug.cgi?id=2604
- * What appends in that case is that the bitspersample is 1 and
- * a TransferFunction is set. The size of the TransferFunction
- * depends on 1<<bitspersample. So if we increase it, an access
- * out of the buffer will happen at directory flushing.
- * Another option would be to clear those targs.
- */
- td->td_bitspersample = 8;
- td->td_sampleformat = SAMPLEFORMAT_UINT;
- }
+ PixarLogState *sp = (PixarLogState *)tif->tif_data;
+ TIFFDirectory *td = &tif->tif_dir;
+
+ assert(sp != 0);
+ /* In a really sneaky (and really incorrect, and untruthful, and
+ * troublesome, and error-prone) maneuver that completely goes against
+ * the spirit of TIFF, and breaks TIFF, on close, we covertly
+ * modify both bitspersample and sampleformat in the directory to
+ * indicate 8-bit linear. This way, the decode "just works" even for
+ * readers that don't know about PixarLog, or how to set
+ * the PIXARLOGDATFMT pseudo-tag.
+ */
+
+ if (sp->state & PLSTATE_INIT)
+ {
+ /* We test the state to avoid an issue such as in
+ * http://bugzilla.maptools.org/show_bug.cgi?id=2604
+ * What appends in that case is that the bitspersample is 1 and
+ * a TransferFunction is set. The size of the TransferFunction
+ * depends on 1<<bitspersample. So if we increase it, an access
+ * out of the buffer will happen at directory flushing.
+ * Another option would be to clear those targs.
+ */
+ td->td_bitspersample = 8;
+ td->td_sampleformat = SAMPLEFORMAT_UINT;
+ }
}
-static void
-PixarLogCleanup(TIFF* tif)
+static void PixarLogCleanup(TIFF *tif)
{
- PixarLogState* sp = (PixarLogState*) tif->tif_data;
-
- assert(sp != 0);
-
- (void)TIFFPredictorCleanup(tif);
-
- tif->tif_tagmethods.vgetfield = sp->vgetparent;
- tif->tif_tagmethods.vsetfield = sp->vsetparent;
-
- if (sp->FromLT2) _TIFFfree(sp->FromLT2);
- if (sp->From14) _TIFFfree(sp->From14);
- if (sp->From8) _TIFFfree(sp->From8);
- if (sp->ToLinearF) _TIFFfree(sp->ToLinearF);
- if (sp->ToLinear16) _TIFFfree(sp->ToLinear16);
- if (sp->ToLinear8) _TIFFfree(sp->ToLinear8);
- if (sp->state&PLSTATE_INIT) {
- if (tif->tif_mode == O_RDONLY)
- inflateEnd(&sp->stream);
- else
- deflateEnd(&sp->stream);
- }
- if (sp->tbuf)
- _TIFFfree(sp->tbuf);
- _TIFFfree(sp);
- tif->tif_data = NULL;
-
- _TIFFSetDefaultCompressionState(tif);
+ PixarLogState *sp = (PixarLogState *)tif->tif_data;
+
+ assert(sp != 0);
+
+ (void)TIFFPredictorCleanup(tif);
+
+ tif->tif_tagmethods.vgetfield = sp->vgetparent;
+ tif->tif_tagmethods.vsetfield = sp->vsetparent;
+
+ if (sp->FromLT2)
+ _TIFFfreeExt(tif, sp->FromLT2);
+ if (sp->From14)
+ _TIFFfreeExt(tif, sp->From14);
+ if (sp->From8)
+ _TIFFfreeExt(tif, sp->From8);
+ if (sp->ToLinearF)
+ _TIFFfreeExt(tif, sp->ToLinearF);
+ if (sp->ToLinear16)
+ _TIFFfreeExt(tif, sp->ToLinear16);
+ if (sp->ToLinear8)
+ _TIFFfreeExt(tif, sp->ToLinear8);
+ if (sp->state & PLSTATE_INIT)
+ {
+ if (tif->tif_mode == O_RDONLY)
+ inflateEnd(&sp->stream);
+ else
+ deflateEnd(&sp->stream);
+ }
+ if (sp->tbuf)
+ _TIFFfreeExt(tif, sp->tbuf);
+ _TIFFfreeExt(tif, sp);
+ tif->tif_data = NULL;
+
+ _TIFFSetDefaultCompressionState(tif);
}
-static int
-PixarLogVSetField(TIFF* tif, uint32 tag, va_list ap)
+static int PixarLogVSetField(TIFF *tif, uint32_t tag, va_list ap)
{
static const char module[] = "PixarLogVSetField";
PixarLogState *sp = (PixarLogState *)tif->tif_data;
int result;
- switch (tag) {
- case TIFFTAG_PIXARLOGQUALITY:
- sp->quality = (int) va_arg(ap, int);
- if (tif->tif_mode != O_RDONLY && (sp->state&PLSTATE_INIT)) {
- if (deflateParams(&sp->stream,
- sp->quality, Z_DEFAULT_STRATEGY) != Z_OK) {
- TIFFErrorExt(tif->tif_clientdata, module, "ZLib error: %s",
- sp->stream.msg ? sp->stream.msg : "(null)");
- return (0);
- }
- }
- return (1);
- case TIFFTAG_PIXARLOGDATAFMT:
- sp->user_datafmt = (int) va_arg(ap, int);
- /* Tweak the TIFF header so that the rest of libtiff knows what
- * size of data will be passed between app and library, and
- * assume that the app knows what it is doing and is not
- * confused by these header manipulations...
- */
- switch (sp->user_datafmt) {
- case PIXARLOGDATAFMT_8BIT:
- case PIXARLOGDATAFMT_8BITABGR:
- TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8);
- TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT);
- break;
- case PIXARLOGDATAFMT_11BITLOG:
- TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 16);
- TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT);
- break;
- case PIXARLOGDATAFMT_12BITPICIO:
- TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 16);
- TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_INT);
- break;
- case PIXARLOGDATAFMT_16BIT:
- TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 16);
- TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT);
- break;
- case PIXARLOGDATAFMT_FLOAT:
- TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 32);
- TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP);
- break;
- }
- /*
- * Must recalculate sizes should bits/sample change.
- */
- tif->tif_tilesize = isTiled(tif) ? TIFFTileSize(tif) : (tmsize_t)(-1);
- tif->tif_scanlinesize = TIFFScanlineSize(tif);
- result = 1; /* NB: pseudo tag */
- break;
- default:
- result = (*sp->vsetparent)(tif, tag, ap);
+ switch (tag)
+ {
+ case TIFFTAG_PIXARLOGQUALITY:
+ sp->quality = (int)va_arg(ap, int);
+ if (tif->tif_mode != O_RDONLY && (sp->state & PLSTATE_INIT))
+ {
+ if (deflateParams(&sp->stream, sp->quality,
+ Z_DEFAULT_STRATEGY) != Z_OK)
+ {
+ TIFFErrorExtR(tif, module, "ZLib error: %s",
+ sp->stream.msg ? sp->stream.msg : "(null)");
+ return (0);
+ }
+ }
+ return (1);
+ case TIFFTAG_PIXARLOGDATAFMT:
+ sp->user_datafmt = (int)va_arg(ap, int);
+ /* Tweak the TIFF header so that the rest of libtiff knows what
+ * size of data will be passed between app and library, and
+ * assume that the app knows what it is doing and is not
+ * confused by these header manipulations...
+ */
+ switch (sp->user_datafmt)
+ {
+ case PIXARLOGDATAFMT_8BIT:
+ case PIXARLOGDATAFMT_8BITABGR:
+ TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8);
+ TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT);
+ break;
+ case PIXARLOGDATAFMT_11BITLOG:
+ TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 16);
+ TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT);
+ break;
+ case PIXARLOGDATAFMT_12BITPICIO:
+ TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 16);
+ TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_INT);
+ break;
+ case PIXARLOGDATAFMT_16BIT:
+ TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 16);
+ TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT);
+ break;
+ case PIXARLOGDATAFMT_FLOAT:
+ TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 32);
+ TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT,
+ SAMPLEFORMAT_IEEEFP);
+ break;
+ }
+ /*
+ * Must recalculate sizes should bits/sample change.
+ */
+ tif->tif_tilesize =
+ isTiled(tif) ? TIFFTileSize(tif) : (tmsize_t)(-1);
+ tif->tif_scanlinesize = TIFFScanlineSize(tif);
+ result = 1; /* NB: pseudo tag */
+ break;
+ default:
+ result = (*sp->vsetparent)(tif, tag, ap);
}
return (result);
}
-static int
-PixarLogVGetField(TIFF* tif, uint32 tag, va_list ap)
+static int PixarLogVGetField(TIFF *tif, uint32_t tag, va_list ap)
{
PixarLogState *sp = (PixarLogState *)tif->tif_data;
- switch (tag) {
- case TIFFTAG_PIXARLOGQUALITY:
- *va_arg(ap, int*) = sp->quality;
- break;
- case TIFFTAG_PIXARLOGDATAFMT:
- *va_arg(ap, int*) = sp->user_datafmt;
- break;
- default:
- return (*sp->vgetparent)(tif, tag, ap);
+ switch (tag)
+ {
+ case TIFFTAG_PIXARLOGQUALITY:
+ *va_arg(ap, int *) = sp->quality;
+ break;
+ case TIFFTAG_PIXARLOGDATAFMT:
+ *va_arg(ap, int *) = sp->user_datafmt;
+ break;
+ default:
+ return (*sp->vgetparent)(tif, tag, ap);
}
return (1);
}
static const TIFFField pixarlogFields[] = {
- {TIFFTAG_PIXARLOGDATAFMT, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "", NULL},
- {TIFFTAG_PIXARLOGQUALITY, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "", NULL}
-};
+ {TIFFTAG_PIXARLOGDATAFMT, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
+ TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "", NULL},
+ {TIFFTAG_PIXARLOGQUALITY, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
+ TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, FALSE, FALSE, "", NULL}};
-int
-TIFFInitPixarLog(TIFF* tif, int scheme)
+int TIFFInitPixarLog(TIFF *tif, int scheme)
{
- static const char module[] = "TIFFInitPixarLog";
-
- PixarLogState* sp;
-
- assert(scheme == COMPRESSION_PIXARLOG);
-
- /*
- * Merge codec-specific tag information.
- */
- if (!_TIFFMergeFields(tif, pixarlogFields,
- TIFFArrayCount(pixarlogFields))) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Merging PixarLog codec-specific tags failed");
- return 0;
- }
-
- /*
- * Allocate state block so tag methods have storage to record values.
- */
- tif->tif_data = (uint8*) _TIFFmalloc(sizeof (PixarLogState));
- if (tif->tif_data == NULL)
- goto bad;
- sp = (PixarLogState*) tif->tif_data;
- _TIFFmemset(sp, 0, sizeof (*sp));
- sp->stream.data_type = Z_BINARY;
- sp->user_datafmt = PIXARLOGDATAFMT_UNKNOWN;
-
- /*
- * Install codec methods.
- */
- tif->tif_fixuptags = PixarLogFixupTags;
- tif->tif_setupdecode = PixarLogSetupDecode;
- tif->tif_predecode = PixarLogPreDecode;
- tif->tif_decoderow = PixarLogDecode;
- tif->tif_decodestrip = PixarLogDecode;
- tif->tif_decodetile = PixarLogDecode;
- tif->tif_setupencode = PixarLogSetupEncode;
- tif->tif_preencode = PixarLogPreEncode;
- tif->tif_postencode = PixarLogPostEncode;
- tif->tif_encoderow = PixarLogEncode;
- tif->tif_encodestrip = PixarLogEncode;
- tif->tif_encodetile = PixarLogEncode;
- tif->tif_close = PixarLogClose;
- tif->tif_cleanup = PixarLogCleanup;
-
- /* Override SetField so we can handle our private pseudo-tag */
- sp->vgetparent = tif->tif_tagmethods.vgetfield;
- tif->tif_tagmethods.vgetfield = PixarLogVGetField; /* hook for codec tags */
- sp->vsetparent = tif->tif_tagmethods.vsetfield;
- tif->tif_tagmethods.vsetfield = PixarLogVSetField; /* hook for codec tags */
-
- /* Default values for codec-specific fields */
- sp->quality = Z_DEFAULT_COMPRESSION; /* default comp. level */
- sp->state = 0;
-
- /* we don't wish to use the predictor,
- * the default is none, which predictor value 1
- */
- (void) TIFFPredictorInit(tif);
-
- /*
- * build the companding tables
- */
- PixarLogMakeTables(sp);
-
- return (1);
+ static const char module[] = "TIFFInitPixarLog";
+
+ PixarLogState *sp;
+
+ (void)scheme;
+ assert(scheme == COMPRESSION_PIXARLOG);
+
+ /*
+ * Merge codec-specific tag information.
+ */
+ if (!_TIFFMergeFields(tif, pixarlogFields, TIFFArrayCount(pixarlogFields)))
+ {
+ TIFFErrorExtR(tif, module,
+ "Merging PixarLog codec-specific tags failed");
+ return 0;
+ }
+
+ /*
+ * Allocate state block so tag methods have storage to record values.
+ */
+ tif->tif_data = (uint8_t *)_TIFFmallocExt(tif, sizeof(PixarLogState));
+ if (tif->tif_data == NULL)
+ goto bad;
+ sp = (PixarLogState *)tif->tif_data;
+ _TIFFmemset(sp, 0, sizeof(*sp));
+ sp->stream.data_type = Z_BINARY;
+ sp->user_datafmt = PIXARLOGDATAFMT_UNKNOWN;
+
+ /*
+ * Install codec methods.
+ */
+ tif->tif_fixuptags = PixarLogFixupTags;
+ tif->tif_setupdecode = PixarLogSetupDecode;
+ tif->tif_predecode = PixarLogPreDecode;
+ tif->tif_decoderow = PixarLogDecode;
+ tif->tif_decodestrip = PixarLogDecode;
+ tif->tif_decodetile = PixarLogDecode;
+ tif->tif_setupencode = PixarLogSetupEncode;
+ tif->tif_preencode = PixarLogPreEncode;
+ tif->tif_postencode = PixarLogPostEncode;
+ tif->tif_encoderow = PixarLogEncode;
+ tif->tif_encodestrip = PixarLogEncode;
+ tif->tif_encodetile = PixarLogEncode;
+ tif->tif_close = PixarLogClose;
+ tif->tif_cleanup = PixarLogCleanup;
+
+ /* Override SetField so we can handle our private pseudo-tag */
+ sp->vgetparent = tif->tif_tagmethods.vgetfield;
+ tif->tif_tagmethods.vgetfield = PixarLogVGetField; /* hook for codec tags */
+ sp->vsetparent = tif->tif_tagmethods.vsetfield;
+ tif->tif_tagmethods.vsetfield = PixarLogVSetField; /* hook for codec tags */
+
+ /* Default values for codec-specific fields */
+ sp->quality = Z_DEFAULT_COMPRESSION; /* default comp. level */
+ sp->state = 0;
+
+ /* we don't wish to use the predictor,
+ * the default is none, which predictor value 1
+ */
+ (void)TIFFPredictorInit(tif);
+
+ /*
+ * build the companding tables
+ */
+ PixarLogMakeTables(tif, sp);
+
+ return (1);
bad:
- TIFFErrorExt(tif->tif_clientdata, module,
- "No space for PixarLog state block");
- return (0);
+ TIFFErrorExtR(tif, module, "No space for PixarLog state block");
+ return (0);
}
#endif /* PIXARLOG_SUPPORT */
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_predict.c b/src/3rdparty/libtiff/libtiff/tif_predict.c
index b775663..386b5fe 100644
--- a/src/3rdparty/libtiff/libtiff/tif_predict.c
+++ b/src/3rdparty/libtiff/libtiff/tif_predict.c
@@ -2,23 +2,23 @@
* Copyright (c) 1988-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -27,445 +27,548 @@
*
* Predictor Tag Support (used by multiple codecs).
*/
-#include "tiffiop.h"
#include "tif_predict.h"
+#include "tiffiop.h"
-#define PredictorState(tif) ((TIFFPredictorState*) (tif)->tif_data)
-
-static int horAcc8(TIFF* tif, uint8* cp0, tmsize_t cc);
-static int horAcc16(TIFF* tif, uint8* cp0, tmsize_t cc);
-static int horAcc32(TIFF* tif, uint8* cp0, tmsize_t cc);
-static int swabHorAcc16(TIFF* tif, uint8* cp0, tmsize_t cc);
-static int swabHorAcc32(TIFF* tif, uint8* cp0, tmsize_t cc);
-static int horDiff8(TIFF* tif, uint8* cp0, tmsize_t cc);
-static int horDiff16(TIFF* tif, uint8* cp0, tmsize_t cc);
-static int horDiff32(TIFF* tif, uint8* cp0, tmsize_t cc);
-static int swabHorDiff16(TIFF* tif, uint8* cp0, tmsize_t cc);
-static int swabHorDiff32(TIFF* tif, uint8* cp0, tmsize_t cc);
-static int fpAcc(TIFF* tif, uint8* cp0, tmsize_t cc);
-static int fpDiff(TIFF* tif, uint8* cp0, tmsize_t cc);
-static int PredictorDecodeRow(TIFF* tif, uint8* op0, tmsize_t occ0, uint16 s);
-static int PredictorDecodeTile(TIFF* tif, uint8* op0, tmsize_t occ0, uint16 s);
-static int PredictorEncodeRow(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s);
-static int PredictorEncodeTile(TIFF* tif, uint8* bp0, tmsize_t cc0, uint16 s);
-
-static int
-PredictorSetup(TIFF* tif)
+#define PredictorState(tif) ((TIFFPredictorState *)(tif)->tif_data)
+
+static int horAcc8(TIFF *tif, uint8_t *cp0, tmsize_t cc);
+static int horAcc16(TIFF *tif, uint8_t *cp0, tmsize_t cc);
+static int horAcc32(TIFF *tif, uint8_t *cp0, tmsize_t cc);
+static int horAcc64(TIFF *tif, uint8_t *cp0, tmsize_t cc);
+static int swabHorAcc16(TIFF *tif, uint8_t *cp0, tmsize_t cc);
+static int swabHorAcc32(TIFF *tif, uint8_t *cp0, tmsize_t cc);
+static int swabHorAcc64(TIFF *tif, uint8_t *cp0, tmsize_t cc);
+static int horDiff8(TIFF *tif, uint8_t *cp0, tmsize_t cc);
+static int horDiff16(TIFF *tif, uint8_t *cp0, tmsize_t cc);
+static int horDiff32(TIFF *tif, uint8_t *cp0, tmsize_t cc);
+static int horDiff64(TIFF *tif, uint8_t *cp0, tmsize_t cc);
+static int swabHorDiff16(TIFF *tif, uint8_t *cp0, tmsize_t cc);
+static int swabHorDiff32(TIFF *tif, uint8_t *cp0, tmsize_t cc);
+static int swabHorDiff64(TIFF *tif, uint8_t *cp0, tmsize_t cc);
+static int fpAcc(TIFF *tif, uint8_t *cp0, tmsize_t cc);
+static int fpDiff(TIFF *tif, uint8_t *cp0, tmsize_t cc);
+static int PredictorDecodeRow(TIFF *tif, uint8_t *op0, tmsize_t occ0,
+ uint16_t s);
+static int PredictorDecodeTile(TIFF *tif, uint8_t *op0, tmsize_t occ0,
+ uint16_t s);
+static int PredictorEncodeRow(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s);
+static int PredictorEncodeTile(TIFF *tif, uint8_t *bp0, tmsize_t cc0,
+ uint16_t s);
+
+static int PredictorSetup(TIFF *tif)
{
- static const char module[] = "PredictorSetup";
-
- TIFFPredictorState* sp = PredictorState(tif);
- TIFFDirectory* td = &tif->tif_dir;
-
- switch (sp->predictor) /* no differencing */
- {
- case PREDICTOR_NONE:
- return 1;
- case PREDICTOR_HORIZONTAL:
- if (td->td_bitspersample != 8
- && td->td_bitspersample != 16
- && td->td_bitspersample != 32) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Horizontal differencing \"Predictor\" not supported with %d-bit samples",
- td->td_bitspersample);
- return 0;
- }
- break;
- case PREDICTOR_FLOATINGPOINT:
- if (td->td_sampleformat != SAMPLEFORMAT_IEEEFP) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Floating point \"Predictor\" not supported with %d data format",
- td->td_sampleformat);
- return 0;
- }
- if (td->td_bitspersample != 16
- && td->td_bitspersample != 24
- && td->td_bitspersample != 32
- && td->td_bitspersample != 64) { /* Should 64 be allowed? */
- TIFFErrorExt(tif->tif_clientdata, module,
- "Floating point \"Predictor\" not supported with %d-bit samples",
- td->td_bitspersample);
- return 0;
- }
- break;
- default:
- TIFFErrorExt(tif->tif_clientdata, module,
- "\"Predictor\" value %d not supported",
- sp->predictor);
- return 0;
- }
- sp->stride = (td->td_planarconfig == PLANARCONFIG_CONTIG ?
- td->td_samplesperpixel : 1);
- /*
- * Calculate the scanline/tile-width size in bytes.
- */
- if (isTiled(tif))
- sp->rowsize = TIFFTileRowSize(tif);
- else
- sp->rowsize = TIFFScanlineSize(tif);
- if (sp->rowsize == 0)
- return 0;
-
- return 1;
+ static const char module[] = "PredictorSetup";
+
+ TIFFPredictorState *sp = PredictorState(tif);
+ TIFFDirectory *td = &tif->tif_dir;
+
+ switch (sp->predictor) /* no differencing */
+ {
+ case PREDICTOR_NONE:
+ return 1;
+ case PREDICTOR_HORIZONTAL:
+ if (td->td_bitspersample != 8 && td->td_bitspersample != 16 &&
+ td->td_bitspersample != 32 && td->td_bitspersample != 64)
+ {
+ TIFFErrorExtR(tif, module,
+ "Horizontal differencing \"Predictor\" not "
+ "supported with %" PRIu16 "-bit samples",
+ td->td_bitspersample);
+ return 0;
+ }
+ break;
+ case PREDICTOR_FLOATINGPOINT:
+ if (td->td_sampleformat != SAMPLEFORMAT_IEEEFP)
+ {
+ TIFFErrorExtR(
+ tif, module,
+ "Floating point \"Predictor\" not supported with %" PRIu16
+ " data format",
+ td->td_sampleformat);
+ return 0;
+ }
+ if (td->td_bitspersample != 16 && td->td_bitspersample != 24 &&
+ td->td_bitspersample != 32 && td->td_bitspersample != 64)
+ { /* Should 64 be allowed? */
+ TIFFErrorExtR(
+ tif, module,
+ "Floating point \"Predictor\" not supported with %" PRIu16
+ "-bit samples",
+ td->td_bitspersample);
+ return 0;
+ }
+ break;
+ default:
+ TIFFErrorExtR(tif, module, "\"Predictor\" value %d not supported",
+ sp->predictor);
+ return 0;
+ }
+ sp->stride =
+ (td->td_planarconfig == PLANARCONFIG_CONTIG ? td->td_samplesperpixel
+ : 1);
+ /*
+ * Calculate the scanline/tile-width size in bytes.
+ */
+ if (isTiled(tif))
+ sp->rowsize = TIFFTileRowSize(tif);
+ else
+ sp->rowsize = TIFFScanlineSize(tif);
+ if (sp->rowsize == 0)
+ return 0;
+
+ return 1;
}
-static int
-PredictorSetupDecode(TIFF* tif)
+static int PredictorSetupDecode(TIFF *tif)
{
- TIFFPredictorState* sp = PredictorState(tif);
- TIFFDirectory* td = &tif->tif_dir;
-
- /* Note: when PredictorSetup() fails, the effets of setupdecode() */
- /* will not be "cancelled" so setupdecode() might be robust to */
- /* be called several times. */
- if (!(*sp->setupdecode)(tif) || !PredictorSetup(tif))
- return 0;
-
- if (sp->predictor == 2) {
- switch (td->td_bitspersample) {
- case 8: sp->decodepfunc = horAcc8; break;
- case 16: sp->decodepfunc = horAcc16; break;
- case 32: sp->decodepfunc = horAcc32; break;
- }
- /*
- * Override default decoding method with one that does the
- * predictor stuff.
- */
- if( tif->tif_decoderow != PredictorDecodeRow )
- {
- sp->decoderow = tif->tif_decoderow;
- tif->tif_decoderow = PredictorDecodeRow;
- sp->decodestrip = tif->tif_decodestrip;
- tif->tif_decodestrip = PredictorDecodeTile;
- sp->decodetile = tif->tif_decodetile;
- tif->tif_decodetile = PredictorDecodeTile;
- }
-
- /*
- * If the data is horizontally differenced 16-bit data that
- * requires byte-swapping, then it must be byte swapped before
- * the accumulation step. We do this with a special-purpose
- * routine and override the normal post decoding logic that
- * the library setup when the directory was read.
- */
- if (tif->tif_flags & TIFF_SWAB) {
- if (sp->decodepfunc == horAcc16) {
- sp->decodepfunc = swabHorAcc16;
- tif->tif_postdecode = _TIFFNoPostDecode;
- } else if (sp->decodepfunc == horAcc32) {
- sp->decodepfunc = swabHorAcc32;
- tif->tif_postdecode = _TIFFNoPostDecode;
+ TIFFPredictorState *sp = PredictorState(tif);
+ TIFFDirectory *td = &tif->tif_dir;
+
+ /* Note: when PredictorSetup() fails, the effets of setupdecode() */
+ /* will not be "canceled" so setupdecode() might be robust to */
+ /* be called several times. */
+ if (!(*sp->setupdecode)(tif) || !PredictorSetup(tif))
+ return 0;
+
+ if (sp->predictor == 2)
+ {
+ switch (td->td_bitspersample)
+ {
+ case 8:
+ sp->decodepfunc = horAcc8;
+ break;
+ case 16:
+ sp->decodepfunc = horAcc16;
+ break;
+ case 32:
+ sp->decodepfunc = horAcc32;
+ break;
+ case 64:
+ sp->decodepfunc = horAcc64;
+ break;
+ }
+ /*
+ * Override default decoding method with one that does the
+ * predictor stuff.
+ */
+ if (tif->tif_decoderow != PredictorDecodeRow)
+ {
+ sp->decoderow = tif->tif_decoderow;
+ tif->tif_decoderow = PredictorDecodeRow;
+ sp->decodestrip = tif->tif_decodestrip;
+ tif->tif_decodestrip = PredictorDecodeTile;
+ sp->decodetile = tif->tif_decodetile;
+ tif->tif_decodetile = PredictorDecodeTile;
+ }
+
+ /*
+ * If the data is horizontally differenced 16-bit data that
+ * requires byte-swapping, then it must be byte swapped before
+ * the accumulation step. We do this with a special-purpose
+ * routine and override the normal post decoding logic that
+ * the library setup when the directory was read.
+ */
+ if (tif->tif_flags & TIFF_SWAB)
+ {
+ if (sp->decodepfunc == horAcc16)
+ {
+ sp->decodepfunc = swabHorAcc16;
+ tif->tif_postdecode = _TIFFNoPostDecode;
+ }
+ else if (sp->decodepfunc == horAcc32)
+ {
+ sp->decodepfunc = swabHorAcc32;
+ tif->tif_postdecode = _TIFFNoPostDecode;
}
- }
- }
-
- else if (sp->predictor == 3) {
- sp->decodepfunc = fpAcc;
- /*
- * Override default decoding method with one that does the
- * predictor stuff.
- */
- if( tif->tif_decoderow != PredictorDecodeRow )
- {
- sp->decoderow = tif->tif_decoderow;
- tif->tif_decoderow = PredictorDecodeRow;
- sp->decodestrip = tif->tif_decodestrip;
- tif->tif_decodestrip = PredictorDecodeTile;
- sp->decodetile = tif->tif_decodetile;
- tif->tif_decodetile = PredictorDecodeTile;
- }
- /*
- * The data should not be swapped outside of the floating
- * point predictor, the accumulation routine should return
- * byres in the native order.
- */
- if (tif->tif_flags & TIFF_SWAB) {
- tif->tif_postdecode = _TIFFNoPostDecode;
- }
- /*
- * Allocate buffer to keep the decoded bytes before
- * rearranging in the right order
- */
- }
-
- return 1;
+ else if (sp->decodepfunc == horAcc64)
+ {
+ sp->decodepfunc = swabHorAcc64;
+ tif->tif_postdecode = _TIFFNoPostDecode;
+ }
+ }
+ }
+
+ else if (sp->predictor == 3)
+ {
+ sp->decodepfunc = fpAcc;
+ /*
+ * Override default decoding method with one that does the
+ * predictor stuff.
+ */
+ if (tif->tif_decoderow != PredictorDecodeRow)
+ {
+ sp->decoderow = tif->tif_decoderow;
+ tif->tif_decoderow = PredictorDecodeRow;
+ sp->decodestrip = tif->tif_decodestrip;
+ tif->tif_decodestrip = PredictorDecodeTile;
+ sp->decodetile = tif->tif_decodetile;
+ tif->tif_decodetile = PredictorDecodeTile;
+ }
+ /*
+ * The data should not be swapped outside of the floating
+ * point predictor, the accumulation routine should return
+ * byres in the native order.
+ */
+ if (tif->tif_flags & TIFF_SWAB)
+ {
+ tif->tif_postdecode = _TIFFNoPostDecode;
+ }
+ /*
+ * Allocate buffer to keep the decoded bytes before
+ * rearranging in the right order
+ */
+ }
+
+ return 1;
}
-static int
-PredictorSetupEncode(TIFF* tif)
+static int PredictorSetupEncode(TIFF *tif)
{
- TIFFPredictorState* sp = PredictorState(tif);
- TIFFDirectory* td = &tif->tif_dir;
-
- if (!(*sp->setupencode)(tif) || !PredictorSetup(tif))
- return 0;
-
- if (sp->predictor == 2) {
- switch (td->td_bitspersample) {
- case 8: sp->encodepfunc = horDiff8; break;
- case 16: sp->encodepfunc = horDiff16; break;
- case 32: sp->encodepfunc = horDiff32; break;
- }
- /*
- * Override default encoding method with one that does the
- * predictor stuff.
- */
- if( tif->tif_encoderow != PredictorEncodeRow )
- {
- sp->encoderow = tif->tif_encoderow;
- tif->tif_encoderow = PredictorEncodeRow;
- sp->encodestrip = tif->tif_encodestrip;
- tif->tif_encodestrip = PredictorEncodeTile;
- sp->encodetile = tif->tif_encodetile;
- tif->tif_encodetile = PredictorEncodeTile;
- }
-
- /*
- * If the data is horizontally differenced 16-bit data that
- * requires byte-swapping, then it must be byte swapped after
- * the differentiation step. We do this with a special-purpose
- * routine and override the normal post decoding logic that
- * the library setup when the directory was read.
- */
- if (tif->tif_flags & TIFF_SWAB) {
- if (sp->encodepfunc == horDiff16) {
- sp->encodepfunc = swabHorDiff16;
- tif->tif_postdecode = _TIFFNoPostDecode;
- } else if (sp->encodepfunc == horDiff32) {
- sp->encodepfunc = swabHorDiff32;
- tif->tif_postdecode = _TIFFNoPostDecode;
- }
- }
+ TIFFPredictorState *sp = PredictorState(tif);
+ TIFFDirectory *td = &tif->tif_dir;
+
+ if (!(*sp->setupencode)(tif) || !PredictorSetup(tif))
+ return 0;
+
+ if (sp->predictor == 2)
+ {
+ switch (td->td_bitspersample)
+ {
+ case 8:
+ sp->encodepfunc = horDiff8;
+ break;
+ case 16:
+ sp->encodepfunc = horDiff16;
+ break;
+ case 32:
+ sp->encodepfunc = horDiff32;
+ break;
+ case 64:
+ sp->encodepfunc = horDiff64;
+ break;
+ }
+ /*
+ * Override default encoding method with one that does the
+ * predictor stuff.
+ */
+ if (tif->tif_encoderow != PredictorEncodeRow)
+ {
+ sp->encoderow = tif->tif_encoderow;
+ tif->tif_encoderow = PredictorEncodeRow;
+ sp->encodestrip = tif->tif_encodestrip;
+ tif->tif_encodestrip = PredictorEncodeTile;
+ sp->encodetile = tif->tif_encodetile;
+ tif->tif_encodetile = PredictorEncodeTile;
+ }
+
+ /*
+ * If the data is horizontally differenced 16-bit data that
+ * requires byte-swapping, then it must be byte swapped after
+ * the differentiation step. We do this with a special-purpose
+ * routine and override the normal post decoding logic that
+ * the library setup when the directory was read.
+ */
+ if (tif->tif_flags & TIFF_SWAB)
+ {
+ if (sp->encodepfunc == horDiff16)
+ {
+ sp->encodepfunc = swabHorDiff16;
+ tif->tif_postdecode = _TIFFNoPostDecode;
+ }
+ else if (sp->encodepfunc == horDiff32)
+ {
+ sp->encodepfunc = swabHorDiff32;
+ tif->tif_postdecode = _TIFFNoPostDecode;
+ }
+ else if (sp->encodepfunc == horDiff64)
+ {
+ sp->encodepfunc = swabHorDiff64;
+ tif->tif_postdecode = _TIFFNoPostDecode;
+ }
}
+ }
- else if (sp->predictor == 3) {
- sp->encodepfunc = fpDiff;
- /*
- * Override default encoding method with one that does the
- * predictor stuff.
- */
- if( tif->tif_encoderow != PredictorEncodeRow )
- {
- sp->encoderow = tif->tif_encoderow;
- tif->tif_encoderow = PredictorEncodeRow;
- sp->encodestrip = tif->tif_encodestrip;
- tif->tif_encodestrip = PredictorEncodeTile;
- sp->encodetile = tif->tif_encodetile;
- tif->tif_encodetile = PredictorEncodeTile;
- }
- }
-
- return 1;
+ else if (sp->predictor == 3)
+ {
+ sp->encodepfunc = fpDiff;
+ /*
+ * Override default encoding method with one that does the
+ * predictor stuff.
+ */
+ if (tif->tif_encoderow != PredictorEncodeRow)
+ {
+ sp->encoderow = tif->tif_encoderow;
+ tif->tif_encoderow = PredictorEncodeRow;
+ sp->encodestrip = tif->tif_encodestrip;
+ tif->tif_encodestrip = PredictorEncodeTile;
+ sp->encodetile = tif->tif_encodetile;
+ tif->tif_encodetile = PredictorEncodeTile;
+ }
+ }
+
+ return 1;
}
-#define REPEAT4(n, op) \
- switch (n) { \
- default: { \
- tmsize_t i; for (i = n-4; i > 0; i--) { op; } } /*-fallthrough*/ \
- case 4: op; /*-fallthrough*/ \
- case 3: op; /*-fallthrough*/ \
- case 2: op; /*-fallthrough*/ \
- case 1: op; /*-fallthrough*/ \
- case 0: ; \
+#define REPEAT4(n, op) \
+ switch (n) \
+ { \
+ default: \
+ { \
+ tmsize_t i; \
+ for (i = n - 4; i > 0; i--) \
+ { \
+ op; \
+ } \
+ } /*-fallthrough*/ \
+ case 4: \
+ op; /*-fallthrough*/ \
+ case 3: \
+ op; /*-fallthrough*/ \
+ case 2: \
+ op; /*-fallthrough*/ \
+ case 1: \
+ op; /*-fallthrough*/ \
+ case 0:; \
}
/* Remarks related to C standard compliance in all below functions : */
-/* - to avoid any undefined behaviour, we only operate on unsigned types */
-/* since the behaviour of "overflows" is defined (wrap over) */
+/* - to avoid any undefined behavior, we only operate on unsigned types */
+/* since the behavior of "overflows" is defined (wrap over) */
/* - when storing into the byte stream, we explicitly mask with 0xff so */
/* as to make icc -check=conversions happy (not necessary by the standard) */
TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
-static int
-horAcc8(TIFF* tif, uint8* cp0, tmsize_t cc)
+static int horAcc8(TIFF *tif, uint8_t *cp0, tmsize_t cc)
{
- tmsize_t stride = PredictorState(tif)->stride;
+ tmsize_t stride = PredictorState(tif)->stride;
- unsigned char* cp = (unsigned char*) cp0;
- if((cc%stride)!=0)
+ unsigned char *cp = (unsigned char *)cp0;
+ if ((cc % stride) != 0)
{
- TIFFErrorExt(tif->tif_clientdata, "horAcc8",
- "%s", "(cc%stride)!=0");
+ TIFFErrorExtR(tif, "horAcc8", "%s", "(cc%stride)!=0");
return 0;
}
- if (cc > stride) {
- /*
- * Pipeline the most common cases.
- */
- if (stride == 3) {
- unsigned int cr = cp[0];
- unsigned int cg = cp[1];
- unsigned int cb = cp[2];
- cc -= 3;
- cp += 3;
- while (cc>0) {
- cp[0] = (unsigned char) ((cr += cp[0]) & 0xff);
- cp[1] = (unsigned char) ((cg += cp[1]) & 0xff);
- cp[2] = (unsigned char) ((cb += cp[2]) & 0xff);
- cc -= 3;
- cp += 3;
- }
- } else if (stride == 4) {
- unsigned int cr = cp[0];
- unsigned int cg = cp[1];
- unsigned int cb = cp[2];
- unsigned int ca = cp[3];
- cc -= 4;
- cp += 4;
- while (cc>0) {
- cp[0] = (unsigned char) ((cr += cp[0]) & 0xff);
- cp[1] = (unsigned char) ((cg += cp[1]) & 0xff);
- cp[2] = (unsigned char) ((cb += cp[2]) & 0xff);
- cp[3] = (unsigned char) ((ca += cp[3]) & 0xff);
- cc -= 4;
- cp += 4;
- }
- } else {
- cc -= stride;
- do {
- REPEAT4(stride, cp[stride] =
- (unsigned char) ((cp[stride] + *cp) & 0xff); cp++)
- cc -= stride;
- } while (cc>0);
- }
- }
- return 1;
+ if (cc > stride)
+ {
+ /*
+ * Pipeline the most common cases.
+ */
+ if (stride == 3)
+ {
+ unsigned int cr = cp[0];
+ unsigned int cg = cp[1];
+ unsigned int cb = cp[2];
+ tmsize_t i = stride;
+ for (; i < cc; i += stride)
+ {
+ cp[i + 0] = (unsigned char)((cr += cp[i + 0]) & 0xff);
+ cp[i + 1] = (unsigned char)((cg += cp[i + 1]) & 0xff);
+ cp[i + 2] = (unsigned char)((cb += cp[i + 2]) & 0xff);
+ }
+ }
+ else if (stride == 4)
+ {
+ unsigned int cr = cp[0];
+ unsigned int cg = cp[1];
+ unsigned int cb = cp[2];
+ unsigned int ca = cp[3];
+ tmsize_t i = stride;
+ for (; i < cc; i += stride)
+ {
+ cp[i + 0] = (unsigned char)((cr += cp[i + 0]) & 0xff);
+ cp[i + 1] = (unsigned char)((cg += cp[i + 1]) & 0xff);
+ cp[i + 2] = (unsigned char)((cb += cp[i + 2]) & 0xff);
+ cp[i + 3] = (unsigned char)((ca += cp[i + 3]) & 0xff);
+ }
+ }
+ else
+ {
+ cc -= stride;
+ do
+ {
+ REPEAT4(stride,
+ cp[stride] = (unsigned char)((cp[stride] + *cp) & 0xff);
+ cp++)
+ cc -= stride;
+ } while (cc > 0);
+ }
+ }
+ return 1;
+}
+
+static int swabHorAcc16(TIFF *tif, uint8_t *cp0, tmsize_t cc)
+{
+ uint16_t *wp = (uint16_t *)cp0;
+ tmsize_t wc = cc / 2;
+
+ TIFFSwabArrayOfShort(wp, wc);
+ return horAcc16(tif, cp0, cc);
+}
+
+TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
+static int horAcc16(TIFF *tif, uint8_t *cp0, tmsize_t cc)
+{
+ tmsize_t stride = PredictorState(tif)->stride;
+ uint16_t *wp = (uint16_t *)cp0;
+ tmsize_t wc = cc / 2;
+
+ if ((cc % (2 * stride)) != 0)
+ {
+ TIFFErrorExtR(tif, "horAcc16", "%s", "cc%(2*stride))!=0");
+ return 0;
+ }
+
+ if (wc > stride)
+ {
+ wc -= stride;
+ do
+ {
+ REPEAT4(stride, wp[stride] = (uint16_t)(((unsigned int)wp[stride] +
+ (unsigned int)wp[0]) &
+ 0xffff);
+ wp++)
+ wc -= stride;
+ } while (wc > 0);
+ }
+ return 1;
}
-static int
-swabHorAcc16(TIFF* tif, uint8* cp0, tmsize_t cc)
+static int swabHorAcc32(TIFF *tif, uint8_t *cp0, tmsize_t cc)
{
- uint16* wp = (uint16*) cp0;
- tmsize_t wc = cc / 2;
+ uint32_t *wp = (uint32_t *)cp0;
+ tmsize_t wc = cc / 4;
- TIFFSwabArrayOfShort(wp, wc);
- return horAcc16(tif, cp0, cc);
+ TIFFSwabArrayOfLong(wp, wc);
+ return horAcc32(tif, cp0, cc);
}
TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
-static int
-horAcc16(TIFF* tif, uint8* cp0, tmsize_t cc)
+static int horAcc32(TIFF *tif, uint8_t *cp0, tmsize_t cc)
{
- tmsize_t stride = PredictorState(tif)->stride;
- uint16* wp = (uint16*) cp0;
- tmsize_t wc = cc / 2;
+ tmsize_t stride = PredictorState(tif)->stride;
+ uint32_t *wp = (uint32_t *)cp0;
+ tmsize_t wc = cc / 4;
- if((cc%(2*stride))!=0)
+ if ((cc % (4 * stride)) != 0)
{
- TIFFErrorExt(tif->tif_clientdata, "horAcc16",
- "%s", "cc%(2*stride))!=0");
+ TIFFErrorExtR(tif, "horAcc32", "%s", "cc%(4*stride))!=0");
return 0;
}
- if (wc > stride) {
- wc -= stride;
- do {
- REPEAT4(stride, wp[stride] = (uint16)(((unsigned int)wp[stride] + (unsigned int)wp[0]) & 0xffff); wp++)
- wc -= stride;
- } while (wc > 0);
- }
- return 1;
+ if (wc > stride)
+ {
+ wc -= stride;
+ do
+ {
+ REPEAT4(stride, wp[stride] += wp[0]; wp++)
+ wc -= stride;
+ } while (wc > 0);
+ }
+ return 1;
}
-static int
-swabHorAcc32(TIFF* tif, uint8* cp0, tmsize_t cc)
+static int swabHorAcc64(TIFF *tif, uint8_t *cp0, tmsize_t cc)
{
- uint32* wp = (uint32*) cp0;
- tmsize_t wc = cc / 4;
+ uint64_t *wp = (uint64_t *)cp0;
+ tmsize_t wc = cc / 8;
- TIFFSwabArrayOfLong(wp, wc);
- return horAcc32(tif, cp0, cc);
+ TIFFSwabArrayOfLong8(wp, wc);
+ return horAcc64(tif, cp0, cc);
}
TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
-static int
-horAcc32(TIFF* tif, uint8* cp0, tmsize_t cc)
+static int horAcc64(TIFF *tif, uint8_t *cp0, tmsize_t cc)
{
- tmsize_t stride = PredictorState(tif)->stride;
- uint32* wp = (uint32*) cp0;
- tmsize_t wc = cc / 4;
+ tmsize_t stride = PredictorState(tif)->stride;
+ uint64_t *wp = (uint64_t *)cp0;
+ tmsize_t wc = cc / 8;
- if((cc%(4*stride))!=0)
+ if ((cc % (8 * stride)) != 0)
{
- TIFFErrorExt(tif->tif_clientdata, "horAcc32",
- "%s", "cc%(4*stride))!=0");
+ TIFFErrorExtR(tif, "horAcc64", "%s", "cc%(8*stride))!=0");
return 0;
}
- if (wc > stride) {
- wc -= stride;
- do {
- REPEAT4(stride, wp[stride] += wp[0]; wp++)
- wc -= stride;
- } while (wc > 0);
- }
- return 1;
+ if (wc > stride)
+ {
+ wc -= stride;
+ do
+ {
+ REPEAT4(stride, wp[stride] += wp[0]; wp++)
+ wc -= stride;
+ } while (wc > 0);
+ }
+ return 1;
}
/*
* Floating point predictor accumulation routine.
*/
-static int
-fpAcc(TIFF* tif, uint8* cp0, tmsize_t cc)
+static int fpAcc(TIFF *tif, uint8_t *cp0, tmsize_t cc)
{
- tmsize_t stride = PredictorState(tif)->stride;
- uint32 bps = tif->tif_dir.td_bitspersample / 8;
- tmsize_t wc = cc / bps;
- tmsize_t count = cc;
- uint8 *cp = (uint8 *) cp0;
- uint8 *tmp;
-
- if(cc%(bps*stride)!=0)
+ tmsize_t stride = PredictorState(tif)->stride;
+ uint32_t bps = tif->tif_dir.td_bitspersample / 8;
+ tmsize_t wc = cc / bps;
+ tmsize_t count = cc;
+ uint8_t *cp = (uint8_t *)cp0;
+ uint8_t *tmp;
+
+ if (cc % (bps * stride) != 0)
{
- TIFFErrorExt(tif->tif_clientdata, "fpAcc",
- "%s", "cc%(bps*stride))!=0");
+ TIFFErrorExtR(tif, "fpAcc", "%s", "cc%(bps*stride))!=0");
return 0;
}
- tmp = (uint8 *)_TIFFmalloc(cc);
- if (!tmp)
- return 0;
-
- while (count > stride) {
- REPEAT4(stride, cp[stride] =
- (unsigned char) ((cp[stride] + cp[0]) & 0xff); cp++)
- count -= stride;
- }
-
- _TIFFmemcpy(tmp, cp0, cc);
- cp = (uint8 *) cp0;
- for (count = 0; count < wc; count++) {
- uint32 byte;
- for (byte = 0; byte < bps; byte++) {
- #if WORDS_BIGENDIAN
- cp[bps * count + byte] = tmp[byte * wc + count];
- #else
- cp[bps * count + byte] =
- tmp[(bps - byte - 1) * wc + count];
- #endif
- }
- }
- _TIFFfree(tmp);
+ tmp = (uint8_t *)_TIFFmallocExt(tif, cc);
+ if (!tmp)
+ return 0;
+
+ while (count > stride)
+ {
+ REPEAT4(stride,
+ cp[stride] = (unsigned char)((cp[stride] + cp[0]) & 0xff);
+ cp++)
+ count -= stride;
+ }
+
+ _TIFFmemcpy(tmp, cp0, cc);
+ cp = (uint8_t *)cp0;
+ for (count = 0; count < wc; count++)
+ {
+ uint32_t byte;
+ for (byte = 0; byte < bps; byte++)
+ {
+#if WORDS_BIGENDIAN
+ cp[bps * count + byte] = tmp[byte * wc + count];
+#else
+ cp[bps * count + byte] = tmp[(bps - byte - 1) * wc + count];
+#endif
+ }
+ }
+ _TIFFfreeExt(tif, tmp);
return 1;
}
/*
* Decode a scanline and apply the predictor routine.
*/
-static int
-PredictorDecodeRow(TIFF* tif, uint8* op0, tmsize_t occ0, uint16 s)
+static int PredictorDecodeRow(TIFF *tif, uint8_t *op0, tmsize_t occ0,
+ uint16_t s)
{
- TIFFPredictorState *sp = PredictorState(tif);
+ TIFFPredictorState *sp = PredictorState(tif);
- assert(sp != NULL);
- assert(sp->decoderow != NULL);
- assert(sp->decodepfunc != NULL);
+ assert(sp != NULL);
+ assert(sp->decoderow != NULL);
+ assert(sp->decodepfunc != NULL);
- if ((*sp->decoderow)(tif, op0, occ0, s)) {
- return (*sp->decodepfunc)(tif, op0, occ0);
- } else
- return 0;
+ if ((*sp->decoderow)(tif, op0, occ0, s))
+ {
+ return (*sp->decodepfunc)(tif, op0, occ0);
+ }
+ else
+ return 0;
}
/*
@@ -475,123 +578,152 @@ PredictorDecodeRow(TIFF* tif, uint8* op0, tmsize_t occ0, uint16 s)
* been calculated at pre-decode time according to the
* strip/tile dimensions.
*/
-static int
-PredictorDecodeTile(TIFF* tif, uint8* op0, tmsize_t occ0, uint16 s)
+static int PredictorDecodeTile(TIFF *tif, uint8_t *op0, tmsize_t occ0,
+ uint16_t s)
{
- TIFFPredictorState *sp = PredictorState(tif);
+ TIFFPredictorState *sp = PredictorState(tif);
- assert(sp != NULL);
- assert(sp->decodetile != NULL);
+ assert(sp != NULL);
+ assert(sp->decodetile != NULL);
- if ((*sp->decodetile)(tif, op0, occ0, s)) {
- tmsize_t rowsize = sp->rowsize;
- assert(rowsize > 0);
- if((occ0%rowsize) !=0)
+ if ((*sp->decodetile)(tif, op0, occ0, s))
+ {
+ tmsize_t rowsize = sp->rowsize;
+ assert(rowsize > 0);
+ if ((occ0 % rowsize) != 0)
{
- TIFFErrorExt(tif->tif_clientdata, "PredictorDecodeTile",
- "%s", "occ0%rowsize != 0");
+ TIFFErrorExtR(tif, "PredictorDecodeTile", "%s",
+ "occ0%rowsize != 0");
return 0;
}
- assert(sp->decodepfunc != NULL);
- while (occ0 > 0) {
- if( !(*sp->decodepfunc)(tif, op0, rowsize) )
+ assert(sp->decodepfunc != NULL);
+ while (occ0 > 0)
+ {
+ if (!(*sp->decodepfunc)(tif, op0, rowsize))
return 0;
- occ0 -= rowsize;
- op0 += rowsize;
- }
- return 1;
- } else
- return 0;
+ occ0 -= rowsize;
+ op0 += rowsize;
+ }
+ return 1;
+ }
+ else
+ return 0;
}
TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
-static int
-horDiff8(TIFF* tif, uint8* cp0, tmsize_t cc)
+static int horDiff8(TIFF *tif, uint8_t *cp0, tmsize_t cc)
{
- TIFFPredictorState* sp = PredictorState(tif);
- tmsize_t stride = sp->stride;
- unsigned char* cp = (unsigned char*) cp0;
+ TIFFPredictorState *sp = PredictorState(tif);
+ tmsize_t stride = sp->stride;
+ unsigned char *cp = (unsigned char *)cp0;
- if((cc%stride)!=0)
+ if ((cc % stride) != 0)
{
- TIFFErrorExt(tif->tif_clientdata, "horDiff8",
- "%s", "(cc%stride)!=0");
+ TIFFErrorExtR(tif, "horDiff8", "%s", "(cc%stride)!=0");
return 0;
}
- if (cc > stride) {
- cc -= stride;
- /*
- * Pipeline the most common cases.
- */
- if (stride == 3) {
- unsigned int r1, g1, b1;
- unsigned int r2 = cp[0];
- unsigned int g2 = cp[1];
- unsigned int b2 = cp[2];
- do {
- r1 = cp[3]; cp[3] = (unsigned char)((r1-r2)&0xff); r2 = r1;
- g1 = cp[4]; cp[4] = (unsigned char)((g1-g2)&0xff); g2 = g1;
- b1 = cp[5]; cp[5] = (unsigned char)((b1-b2)&0xff); b2 = b1;
- cp += 3;
- } while ((cc -= 3) > 0);
- } else if (stride == 4) {
- unsigned int r1, g1, b1, a1;
- unsigned int r2 = cp[0];
- unsigned int g2 = cp[1];
- unsigned int b2 = cp[2];
- unsigned int a2 = cp[3];
- do {
- r1 = cp[4]; cp[4] = (unsigned char)((r1-r2)&0xff); r2 = r1;
- g1 = cp[5]; cp[5] = (unsigned char)((g1-g2)&0xff); g2 = g1;
- b1 = cp[6]; cp[6] = (unsigned char)((b1-b2)&0xff); b2 = b1;
- a1 = cp[7]; cp[7] = (unsigned char)((a1-a2)&0xff); a2 = a1;
- cp += 4;
- } while ((cc -= 4) > 0);
- } else {
- cp += cc - 1;
- do {
- REPEAT4(stride, cp[stride] = (unsigned char)((cp[stride] - cp[0])&0xff); cp--)
- } while ((cc -= stride) > 0);
- }
- }
- return 1;
+ if (cc > stride)
+ {
+ cc -= stride;
+ /*
+ * Pipeline the most common cases.
+ */
+ if (stride == 3)
+ {
+ unsigned int r1, g1, b1;
+ unsigned int r2 = cp[0];
+ unsigned int g2 = cp[1];
+ unsigned int b2 = cp[2];
+ do
+ {
+ r1 = cp[3];
+ cp[3] = (unsigned char)((r1 - r2) & 0xff);
+ r2 = r1;
+ g1 = cp[4];
+ cp[4] = (unsigned char)((g1 - g2) & 0xff);
+ g2 = g1;
+ b1 = cp[5];
+ cp[5] = (unsigned char)((b1 - b2) & 0xff);
+ b2 = b1;
+ cp += 3;
+ } while ((cc -= 3) > 0);
+ }
+ else if (stride == 4)
+ {
+ unsigned int r1, g1, b1, a1;
+ unsigned int r2 = cp[0];
+ unsigned int g2 = cp[1];
+ unsigned int b2 = cp[2];
+ unsigned int a2 = cp[3];
+ do
+ {
+ r1 = cp[4];
+ cp[4] = (unsigned char)((r1 - r2) & 0xff);
+ r2 = r1;
+ g1 = cp[5];
+ cp[5] = (unsigned char)((g1 - g2) & 0xff);
+ g2 = g1;
+ b1 = cp[6];
+ cp[6] = (unsigned char)((b1 - b2) & 0xff);
+ b2 = b1;
+ a1 = cp[7];
+ cp[7] = (unsigned char)((a1 - a2) & 0xff);
+ a2 = a1;
+ cp += 4;
+ } while ((cc -= 4) > 0);
+ }
+ else
+ {
+ cp += cc - 1;
+ do
+ {
+ REPEAT4(stride,
+ cp[stride] =
+ (unsigned char)((cp[stride] - cp[0]) & 0xff);
+ cp--)
+ } while ((cc -= stride) > 0);
+ }
+ }
+ return 1;
}
TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
-static int
-horDiff16(TIFF* tif, uint8* cp0, tmsize_t cc)
+static int horDiff16(TIFF *tif, uint8_t *cp0, tmsize_t cc)
{
- TIFFPredictorState* sp = PredictorState(tif);
- tmsize_t stride = sp->stride;
- uint16 *wp = (uint16*) cp0;
- tmsize_t wc = cc/2;
+ TIFFPredictorState *sp = PredictorState(tif);
+ tmsize_t stride = sp->stride;
+ uint16_t *wp = (uint16_t *)cp0;
+ tmsize_t wc = cc / 2;
- if((cc%(2*stride))!=0)
+ if ((cc % (2 * stride)) != 0)
{
- TIFFErrorExt(tif->tif_clientdata, "horDiff8",
- "%s", "(cc%(2*stride))!=0");
+ TIFFErrorExtR(tif, "horDiff8", "%s", "(cc%(2*stride))!=0");
return 0;
}
- if (wc > stride) {
- wc -= stride;
- wp += wc - 1;
- do {
- REPEAT4(stride, wp[stride] = (uint16)(((unsigned int)wp[stride] - (unsigned int)wp[0]) & 0xffff); wp--)
- wc -= stride;
- } while (wc > 0);
- }
- return 1;
+ if (wc > stride)
+ {
+ wc -= stride;
+ wp += wc - 1;
+ do
+ {
+ REPEAT4(stride, wp[stride] = (uint16_t)(((unsigned int)wp[stride] -
+ (unsigned int)wp[0]) &
+ 0xffff);
+ wp--)
+ wc -= stride;
+ } while (wc > 0);
+ }
+ return 1;
}
-static int
-swabHorDiff16(TIFF* tif, uint8* cp0, tmsize_t cc)
+static int swabHorDiff16(TIFF *tif, uint8_t *cp0, tmsize_t cc)
{
- uint16* wp = (uint16*) cp0;
+ uint16_t *wp = (uint16_t *)cp0;
tmsize_t wc = cc / 2;
- if( !horDiff16(tif, cp0, cc) )
+ if (!horDiff16(tif, cp0, cc))
return 0;
TIFFSwabArrayOfShort(wp, wc);
@@ -599,281 +731,316 @@ swabHorDiff16(TIFF* tif, uint8* cp0, tmsize_t cc)
}
TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
-static int
-horDiff32(TIFF* tif, uint8* cp0, tmsize_t cc)
+static int horDiff32(TIFF *tif, uint8_t *cp0, tmsize_t cc)
{
- TIFFPredictorState* sp = PredictorState(tif);
- tmsize_t stride = sp->stride;
- uint32 *wp = (uint32*) cp0;
- tmsize_t wc = cc/4;
+ TIFFPredictorState *sp = PredictorState(tif);
+ tmsize_t stride = sp->stride;
+ uint32_t *wp = (uint32_t *)cp0;
+ tmsize_t wc = cc / 4;
- if((cc%(4*stride))!=0)
+ if ((cc % (4 * stride)) != 0)
{
- TIFFErrorExt(tif->tif_clientdata, "horDiff32",
- "%s", "(cc%(4*stride))!=0");
+ TIFFErrorExtR(tif, "horDiff32", "%s", "(cc%(4*stride))!=0");
return 0;
}
- if (wc > stride) {
- wc -= stride;
- wp += wc - 1;
- do {
- REPEAT4(stride, wp[stride] -= wp[0]; wp--)
- wc -= stride;
- } while (wc > 0);
- }
- return 1;
+ if (wc > stride)
+ {
+ wc -= stride;
+ wp += wc - 1;
+ do
+ {
+ REPEAT4(stride, wp[stride] -= wp[0]; wp--)
+ wc -= stride;
+ } while (wc > 0);
+ }
+ return 1;
}
-static int
-swabHorDiff32(TIFF* tif, uint8* cp0, tmsize_t cc)
+static int swabHorDiff32(TIFF *tif, uint8_t *cp0, tmsize_t cc)
{
- uint32* wp = (uint32*) cp0;
+ uint32_t *wp = (uint32_t *)cp0;
tmsize_t wc = cc / 4;
- if( !horDiff32(tif, cp0, cc) )
+ if (!horDiff32(tif, cp0, cc))
return 0;
TIFFSwabArrayOfLong(wp, wc);
return 1;
}
+TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
+static int horDiff64(TIFF *tif, uint8_t *cp0, tmsize_t cc)
+{
+ TIFFPredictorState *sp = PredictorState(tif);
+ tmsize_t stride = sp->stride;
+ uint64_t *wp = (uint64_t *)cp0;
+ tmsize_t wc = cc / 8;
+
+ if ((cc % (8 * stride)) != 0)
+ {
+ TIFFErrorExtR(tif, "horDiff64", "%s", "(cc%(8*stride))!=0");
+ return 0;
+ }
+
+ if (wc > stride)
+ {
+ wc -= stride;
+ wp += wc - 1;
+ do
+ {
+ REPEAT4(stride, wp[stride] -= wp[0]; wp--)
+ wc -= stride;
+ } while (wc > 0);
+ }
+ return 1;
+}
+
+static int swabHorDiff64(TIFF *tif, uint8_t *cp0, tmsize_t cc)
+{
+ uint64_t *wp = (uint64_t *)cp0;
+ tmsize_t wc = cc / 8;
+
+ if (!horDiff64(tif, cp0, cc))
+ return 0;
+
+ TIFFSwabArrayOfLong8(wp, wc);
+ return 1;
+}
+
/*
* Floating point predictor differencing routine.
*/
TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
-static int
-fpDiff(TIFF* tif, uint8* cp0, tmsize_t cc)
+static int fpDiff(TIFF *tif, uint8_t *cp0, tmsize_t cc)
{
- tmsize_t stride = PredictorState(tif)->stride;
- uint32 bps = tif->tif_dir.td_bitspersample / 8;
- tmsize_t wc = cc / bps;
- tmsize_t count;
- uint8 *cp = (uint8 *) cp0;
- uint8 *tmp;
-
- if((cc%(bps*stride))!=0)
+ tmsize_t stride = PredictorState(tif)->stride;
+ uint32_t bps = tif->tif_dir.td_bitspersample / 8;
+ tmsize_t wc = cc / bps;
+ tmsize_t count;
+ uint8_t *cp = (uint8_t *)cp0;
+ uint8_t *tmp;
+
+ if ((cc % (bps * stride)) != 0)
{
- TIFFErrorExt(tif->tif_clientdata, "fpDiff",
- "%s", "(cc%(bps*stride))!=0");
+ TIFFErrorExtR(tif, "fpDiff", "%s", "(cc%(bps*stride))!=0");
return 0;
}
- tmp = (uint8 *)_TIFFmalloc(cc);
- if (!tmp)
- return 0;
-
- _TIFFmemcpy(tmp, cp0, cc);
- for (count = 0; count < wc; count++) {
- uint32 byte;
- for (byte = 0; byte < bps; byte++) {
- #if WORDS_BIGENDIAN
- cp[byte * wc + count] = tmp[bps * count + byte];
- #else
- cp[(bps - byte - 1) * wc + count] =
- tmp[bps * count + byte];
- #endif
- }
- }
- _TIFFfree(tmp);
-
- cp = (uint8 *) cp0;
- cp += cc - stride - 1;
- for (count = cc; count > stride; count -= stride)
- REPEAT4(stride, cp[stride] = (unsigned char)((cp[stride] - cp[0])&0xff); cp--)
+ tmp = (uint8_t *)_TIFFmallocExt(tif, cc);
+ if (!tmp)
+ return 0;
+
+ _TIFFmemcpy(tmp, cp0, cc);
+ for (count = 0; count < wc; count++)
+ {
+ uint32_t byte;
+ for (byte = 0; byte < bps; byte++)
+ {
+#if WORDS_BIGENDIAN
+ cp[byte * wc + count] = tmp[bps * count + byte];
+#else
+ cp[(bps - byte - 1) * wc + count] = tmp[bps * count + byte];
+#endif
+ }
+ }
+ _TIFFfreeExt(tif, tmp);
+
+ cp = (uint8_t *)cp0;
+ cp += cc - stride - 1;
+ for (count = cc; count > stride; count -= stride)
+ REPEAT4(stride,
+ cp[stride] = (unsigned char)((cp[stride] - cp[0]) & 0xff);
+ cp--)
return 1;
}
-static int
-PredictorEncodeRow(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
+static int PredictorEncodeRow(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
{
- TIFFPredictorState *sp = PredictorState(tif);
+ TIFFPredictorState *sp = PredictorState(tif);
- assert(sp != NULL);
- assert(sp->encodepfunc != NULL);
- assert(sp->encoderow != NULL);
+ assert(sp != NULL);
+ assert(sp->encodepfunc != NULL);
+ assert(sp->encoderow != NULL);
- /* XXX horizontal differencing alters user's data XXX */
- if( !(*sp->encodepfunc)(tif, bp, cc) )
+ /* XXX horizontal differencing alters user's data XXX */
+ if (!(*sp->encodepfunc)(tif, bp, cc))
return 0;
- return (*sp->encoderow)(tif, bp, cc, s);
+ return (*sp->encoderow)(tif, bp, cc, s);
}
-static int
-PredictorEncodeTile(TIFF* tif, uint8* bp0, tmsize_t cc0, uint16 s)
+static int PredictorEncodeTile(TIFF *tif, uint8_t *bp0, tmsize_t cc0,
+ uint16_t s)
{
- static const char module[] = "PredictorEncodeTile";
- TIFFPredictorState *sp = PredictorState(tif);
- uint8 *working_copy;
- tmsize_t cc = cc0, rowsize;
- unsigned char* bp;
- int result_code;
-
- assert(sp != NULL);
- assert(sp->encodepfunc != NULL);
- assert(sp->encodetile != NULL);
-
- /*
- * Do predictor manipulation in a working buffer to avoid altering
- * the callers buffer. http://trac.osgeo.org/gdal/ticket/1965
- */
- working_copy = (uint8*) _TIFFmalloc(cc0);
- if( working_copy == NULL )
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Out of memory allocating " TIFF_SSIZE_FORMAT " byte temp buffer.",
- cc0 );
- return 0;
- }
- memcpy( working_copy, bp0, cc0 );
- bp = working_copy;
+ static const char module[] = "PredictorEncodeTile";
+ TIFFPredictorState *sp = PredictorState(tif);
+ uint8_t *working_copy;
+ tmsize_t cc = cc0, rowsize;
+ unsigned char *bp;
+ int result_code;
+
+ assert(sp != NULL);
+ assert(sp->encodepfunc != NULL);
+ assert(sp->encodetile != NULL);
+
+ /*
+ * Do predictor manipulation in a working buffer to avoid altering
+ * the callers buffer. http://trac.osgeo.org/gdal/ticket/1965
+ */
+ working_copy = (uint8_t *)_TIFFmallocExt(tif, cc0);
+ if (working_copy == NULL)
+ {
+ TIFFErrorExtR(tif, module,
+ "Out of memory allocating %" PRId64 " byte temp buffer.",
+ (int64_t)cc0);
+ return 0;
+ }
+ memcpy(working_copy, bp0, cc0);
+ bp = working_copy;
- rowsize = sp->rowsize;
- assert(rowsize > 0);
- if((cc0%rowsize)!=0)
+ rowsize = sp->rowsize;
+ assert(rowsize > 0);
+ if ((cc0 % rowsize) != 0)
{
- TIFFErrorExt(tif->tif_clientdata, "PredictorEncodeTile",
- "%s", "(cc0%rowsize)!=0");
- _TIFFfree( working_copy );
+ TIFFErrorExtR(tif, "PredictorEncodeTile", "%s", "(cc0%rowsize)!=0");
+ _TIFFfreeExt(tif, working_copy);
return 0;
}
- while (cc > 0) {
- (*sp->encodepfunc)(tif, bp, rowsize);
- cc -= rowsize;
- bp += rowsize;
- }
- result_code = (*sp->encodetile)(tif, working_copy, cc0, s);
+ while (cc > 0)
+ {
+ (*sp->encodepfunc)(tif, bp, rowsize);
+ cc -= rowsize;
+ bp += rowsize;
+ }
+ result_code = (*sp->encodetile)(tif, working_copy, cc0, s);
- _TIFFfree( working_copy );
+ _TIFFfreeExt(tif, working_copy);
- return result_code;
+ return result_code;
}
-#define FIELD_PREDICTOR (FIELD_CODEC+0) /* XXX */
+#define FIELD_PREDICTOR (FIELD_CODEC + 0) /* XXX */
static const TIFFField predictFields[] = {
- { TIFFTAG_PREDICTOR, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UINT16, FIELD_PREDICTOR, FALSE, FALSE, "Predictor", NULL },
+ {TIFFTAG_PREDICTOR, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16,
+ TIFF_SETGET_UINT16, FIELD_PREDICTOR, FALSE, FALSE, "Predictor", NULL},
};
-static int
-PredictorVSetField(TIFF* tif, uint32 tag, va_list ap)
+static int PredictorVSetField(TIFF *tif, uint32_t tag, va_list ap)
{
- TIFFPredictorState *sp = PredictorState(tif);
-
- assert(sp != NULL);
- assert(sp->vsetparent != NULL);
-
- switch (tag) {
- case TIFFTAG_PREDICTOR:
- sp->predictor = (uint16) va_arg(ap, uint16_vap);
- TIFFSetFieldBit(tif, FIELD_PREDICTOR);
- break;
- default:
- return (*sp->vsetparent)(tif, tag, ap);
- }
- tif->tif_flags |= TIFF_DIRTYDIRECT;
- return 1;
+ TIFFPredictorState *sp = PredictorState(tif);
+
+ assert(sp != NULL);
+ assert(sp->vsetparent != NULL);
+
+ switch (tag)
+ {
+ case TIFFTAG_PREDICTOR:
+ sp->predictor = (uint16_t)va_arg(ap, uint16_vap);
+ TIFFSetFieldBit(tif, FIELD_PREDICTOR);
+ break;
+ default:
+ return (*sp->vsetparent)(tif, tag, ap);
+ }
+ tif->tif_flags |= TIFF_DIRTYDIRECT;
+ return 1;
}
-static int
-PredictorVGetField(TIFF* tif, uint32 tag, va_list ap)
+static int PredictorVGetField(TIFF *tif, uint32_t tag, va_list ap)
{
- TIFFPredictorState *sp = PredictorState(tif);
-
- assert(sp != NULL);
- assert(sp->vgetparent != NULL);
-
- switch (tag) {
- case TIFFTAG_PREDICTOR:
- *va_arg(ap, uint16*) = (uint16)sp->predictor;
- break;
- default:
- return (*sp->vgetparent)(tif, tag, ap);
- }
- return 1;
+ TIFFPredictorState *sp = PredictorState(tif);
+
+ assert(sp != NULL);
+ assert(sp->vgetparent != NULL);
+
+ switch (tag)
+ {
+ case TIFFTAG_PREDICTOR:
+ *va_arg(ap, uint16_t *) = (uint16_t)sp->predictor;
+ break;
+ default:
+ return (*sp->vgetparent)(tif, tag, ap);
+ }
+ return 1;
}
-static void
-PredictorPrintDir(TIFF* tif, FILE* fd, long flags)
+static void PredictorPrintDir(TIFF *tif, FILE *fd, long flags)
{
- TIFFPredictorState* sp = PredictorState(tif);
-
- (void) flags;
- if (TIFFFieldSet(tif,FIELD_PREDICTOR)) {
- fprintf(fd, " Predictor: ");
- switch (sp->predictor) {
- case 1: fprintf(fd, "none "); break;
- case 2: fprintf(fd, "horizontal differencing "); break;
- case 3: fprintf(fd, "floating point predictor "); break;
- }
- fprintf(fd, "%d (0x%x)\n", sp->predictor, sp->predictor);
- }
- if (sp->printdir)
- (*sp->printdir)(tif, fd, flags);
+ TIFFPredictorState *sp = PredictorState(tif);
+
+ (void)flags;
+ if (TIFFFieldSet(tif, FIELD_PREDICTOR))
+ {
+ fprintf(fd, " Predictor: ");
+ switch (sp->predictor)
+ {
+ case 1:
+ fprintf(fd, "none ");
+ break;
+ case 2:
+ fprintf(fd, "horizontal differencing ");
+ break;
+ case 3:
+ fprintf(fd, "floating point predictor ");
+ break;
+ }
+ fprintf(fd, "%d (0x%x)\n", sp->predictor, sp->predictor);
+ }
+ if (sp->printdir)
+ (*sp->printdir)(tif, fd, flags);
}
-int
-TIFFPredictorInit(TIFF* tif)
+int TIFFPredictorInit(TIFF *tif)
{
- TIFFPredictorState* sp = PredictorState(tif);
-
- assert(sp != 0);
-
- /*
- * Merge codec-specific tag information.
- */
- if (!_TIFFMergeFields(tif, predictFields,
- TIFFArrayCount(predictFields))) {
- TIFFErrorExt(tif->tif_clientdata, "TIFFPredictorInit",
- "Merging Predictor codec-specific tags failed");
- return 0;
- }
-
- /*
- * Override parent get/set field methods.
- */
- sp->vgetparent = tif->tif_tagmethods.vgetfield;
- tif->tif_tagmethods.vgetfield =
- PredictorVGetField;/* hook for predictor tag */
- sp->vsetparent = tif->tif_tagmethods.vsetfield;
- tif->tif_tagmethods.vsetfield =
- PredictorVSetField;/* hook for predictor tag */
- sp->printdir = tif->tif_tagmethods.printdir;
- tif->tif_tagmethods.printdir =
- PredictorPrintDir; /* hook for predictor tag */
-
- sp->setupdecode = tif->tif_setupdecode;
- tif->tif_setupdecode = PredictorSetupDecode;
- sp->setupencode = tif->tif_setupencode;
- tif->tif_setupencode = PredictorSetupEncode;
-
- sp->predictor = 1; /* default value */
- sp->encodepfunc = NULL; /* no predictor routine */
- sp->decodepfunc = NULL; /* no predictor routine */
- return 1;
+ TIFFPredictorState *sp = PredictorState(tif);
+
+ assert(sp != 0);
+
+ /*
+ * Merge codec-specific tag information.
+ */
+ if (!_TIFFMergeFields(tif, predictFields, TIFFArrayCount(predictFields)))
+ {
+ TIFFErrorExtR(tif, "TIFFPredictorInit",
+ "Merging Predictor codec-specific tags failed");
+ return 0;
+ }
+
+ /*
+ * Override parent get/set field methods.
+ */
+ sp->vgetparent = tif->tif_tagmethods.vgetfield;
+ tif->tif_tagmethods.vgetfield =
+ PredictorVGetField; /* hook for predictor tag */
+ sp->vsetparent = tif->tif_tagmethods.vsetfield;
+ tif->tif_tagmethods.vsetfield =
+ PredictorVSetField; /* hook for predictor tag */
+ sp->printdir = tif->tif_tagmethods.printdir;
+ tif->tif_tagmethods.printdir =
+ PredictorPrintDir; /* hook for predictor tag */
+
+ sp->setupdecode = tif->tif_setupdecode;
+ tif->tif_setupdecode = PredictorSetupDecode;
+ sp->setupencode = tif->tif_setupencode;
+ tif->tif_setupencode = PredictorSetupEncode;
+
+ sp->predictor = 1; /* default value */
+ sp->encodepfunc = NULL; /* no predictor routine */
+ sp->decodepfunc = NULL; /* no predictor routine */
+ return 1;
}
-int
-TIFFPredictorCleanup(TIFF* tif)
+int TIFFPredictorCleanup(TIFF *tif)
{
- TIFFPredictorState* sp = PredictorState(tif);
+ TIFFPredictorState *sp = PredictorState(tif);
- assert(sp != 0);
+ assert(sp != 0);
- tif->tif_tagmethods.vgetfield = sp->vgetparent;
- tif->tif_tagmethods.vsetfield = sp->vsetparent;
- tif->tif_tagmethods.printdir = sp->printdir;
- tif->tif_setupdecode = sp->setupdecode;
- tif->tif_setupencode = sp->setupencode;
+ tif->tif_tagmethods.vgetfield = sp->vgetparent;
+ tif->tif_tagmethods.vsetfield = sp->vsetparent;
+ tif->tif_tagmethods.printdir = sp->printdir;
+ tif->tif_setupdecode = sp->setupdecode;
+ tif->tif_setupencode = sp->setupencode;
- return 1;
+ return 1;
}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_predict.h b/src/3rdparty/libtiff/libtiff/tif_predict.h
index a326b9b..de77328 100644
--- a/src/3rdparty/libtiff/libtiff/tif_predict.h
+++ b/src/3rdparty/libtiff/libtiff/tif_predict.h
@@ -23,7 +23,7 @@
*/
#ifndef _TIFFPREDICT_
-#define _TIFFPREDICT_
+#define _TIFFPREDICT_
#include "tiffio.h"
#include "tiffiop.h"
@@ -32,50 +32,43 @@
* ``Library-private'' Support for the Predictor Tag
*/
-typedef int (*TIFFEncodeDecodeMethod)(TIFF* tif, uint8* buf, tmsize_t size);
+typedef int (*TIFFEncodeDecodeMethod)(TIFF *tif, uint8_t *buf, tmsize_t size);
/*
* Codecs that want to support the Predictor tag must place
* this structure first in their private state block so that
* the predictor code can cast tif_data to find its state.
*/
-typedef struct {
- int predictor; /* predictor tag value */
- tmsize_t stride; /* sample stride over data */
- tmsize_t rowsize; /* tile/strip row size */
+typedef struct
+{
+ int predictor; /* predictor tag value */
+ tmsize_t stride; /* sample stride over data */
+ tmsize_t rowsize; /* tile/strip row size */
- TIFFCodeMethod encoderow; /* parent codec encode/decode row */
- TIFFCodeMethod encodestrip; /* parent codec encode/decode strip */
- TIFFCodeMethod encodetile; /* parent codec encode/decode tile */
- TIFFEncodeDecodeMethod encodepfunc; /* horizontal differencer */
+ TIFFCodeMethod encoderow; /* parent codec encode/decode row */
+ TIFFCodeMethod encodestrip; /* parent codec encode/decode strip */
+ TIFFCodeMethod encodetile; /* parent codec encode/decode tile */
+ TIFFEncodeDecodeMethod encodepfunc; /* horizontal differencer */
- TIFFCodeMethod decoderow; /* parent codec encode/decode row */
- TIFFCodeMethod decodestrip; /* parent codec encode/decode strip */
- TIFFCodeMethod decodetile; /* parent codec encode/decode tile */
- TIFFEncodeDecodeMethod decodepfunc; /* horizontal accumulator */
+ TIFFCodeMethod decoderow; /* parent codec encode/decode row */
+ TIFFCodeMethod decodestrip; /* parent codec encode/decode strip */
+ TIFFCodeMethod decodetile; /* parent codec encode/decode tile */
+ TIFFEncodeDecodeMethod decodepfunc; /* horizontal accumulator */
- TIFFVGetMethod vgetparent; /* super-class method */
- TIFFVSetMethod vsetparent; /* super-class method */
- TIFFPrintMethod printdir; /* super-class method */
- TIFFBoolMethod setupdecode; /* super-class method */
- TIFFBoolMethod setupencode; /* super-class method */
+ TIFFVGetMethod vgetparent; /* super-class method */
+ TIFFVSetMethod vsetparent; /* super-class method */
+ TIFFPrintMethod printdir; /* super-class method */
+ TIFFBoolMethod setupdecode; /* super-class method */
+ TIFFBoolMethod setupencode; /* super-class method */
} TIFFPredictorState;
#if defined(__cplusplus)
-extern "C" {
+extern "C"
+{
#endif
-extern int TIFFPredictorInit(TIFF*);
-extern int TIFFPredictorCleanup(TIFF*);
+ extern int TIFFPredictorInit(TIFF *);
+ extern int TIFFPredictorCleanup(TIFF *);
#if defined(__cplusplus)
}
#endif
#endif /* _TIFFPREDICT_ */
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_print.c b/src/3rdparty/libtiff/libtiff/tif_print.c
index a073794..2b7fd17 100644
--- a/src/3rdparty/libtiff/libtiff/tif_print.c
+++ b/src/3rdparty/libtiff/libtiff/tif_print.c
@@ -2,23 +2,23 @@
* Copyright (c) 1988-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -32,687 +32,724 @@
#include <ctype.h>
-static void
-_TIFFprintAsciiBounded(FILE* fd, const char* cp, size_t max_chars);
-
-static const char * const photoNames[] = {
- "min-is-white", /* PHOTOMETRIC_MINISWHITE */
- "min-is-black", /* PHOTOMETRIC_MINISBLACK */
- "RGB color", /* PHOTOMETRIC_RGB */
- "palette color (RGB from colormap)", /* PHOTOMETRIC_PALETTE */
- "transparency mask", /* PHOTOMETRIC_MASK */
- "separated", /* PHOTOMETRIC_SEPARATED */
- "YCbCr", /* PHOTOMETRIC_YCBCR */
+static void _TIFFprintAsciiBounded(FILE *fd, const char *cp, size_t max_chars);
+
+static const char *const photoNames[] = {
+ "min-is-white", /* PHOTOMETRIC_MINISWHITE */
+ "min-is-black", /* PHOTOMETRIC_MINISBLACK */
+ "RGB color", /* PHOTOMETRIC_RGB */
+ "palette color (RGB from colormap)", /* PHOTOMETRIC_PALETTE */
+ "transparency mask", /* PHOTOMETRIC_MASK */
+ "separated", /* PHOTOMETRIC_SEPARATED */
+ "YCbCr", /* PHOTOMETRIC_YCBCR */
"7 (0x7)",
- "CIE L*a*b*", /* PHOTOMETRIC_CIELAB */
- "ICC L*a*b*", /* PHOTOMETRIC_ICCLAB */
- "ITU L*a*b*" /* PHOTOMETRIC_ITULAB */
+ "CIE L*a*b*", /* PHOTOMETRIC_CIELAB */
+ "ICC L*a*b*", /* PHOTOMETRIC_ICCLAB */
+ "ITU L*a*b*" /* PHOTOMETRIC_ITULAB */
};
-#define NPHOTONAMES (sizeof (photoNames) / sizeof (photoNames[0]))
+#define NPHOTONAMES (sizeof(photoNames) / sizeof(photoNames[0]))
-static const char * const orientNames[] = {
+static const char *const orientNames[] = {
"0 (0x0)",
- "row 0 top, col 0 lhs", /* ORIENTATION_TOPLEFT */
- "row 0 top, col 0 rhs", /* ORIENTATION_TOPRIGHT */
- "row 0 bottom, col 0 rhs", /* ORIENTATION_BOTRIGHT */
- "row 0 bottom, col 0 lhs", /* ORIENTATION_BOTLEFT */
- "row 0 lhs, col 0 top", /* ORIENTATION_LEFTTOP */
- "row 0 rhs, col 0 top", /* ORIENTATION_RIGHTTOP */
- "row 0 rhs, col 0 bottom", /* ORIENTATION_RIGHTBOT */
- "row 0 lhs, col 0 bottom", /* ORIENTATION_LEFTBOT */
+ "row 0 top, col 0 lhs", /* ORIENTATION_TOPLEFT */
+ "row 0 top, col 0 rhs", /* ORIENTATION_TOPRIGHT */
+ "row 0 bottom, col 0 rhs", /* ORIENTATION_BOTRIGHT */
+ "row 0 bottom, col 0 lhs", /* ORIENTATION_BOTLEFT */
+ "row 0 lhs, col 0 top", /* ORIENTATION_LEFTTOP */
+ "row 0 rhs, col 0 top", /* ORIENTATION_RIGHTTOP */
+ "row 0 rhs, col 0 bottom", /* ORIENTATION_RIGHTBOT */
+ "row 0 lhs, col 0 bottom", /* ORIENTATION_LEFTBOT */
+};
+#define NORIENTNAMES (sizeof(orientNames) / sizeof(orientNames[0]))
+
+static const struct tagname
+{
+ uint16_t tag;
+ const char *name;
+} tagnames[] = {
+ {TIFFTAG_GDAL_METADATA, "GDAL Metadata"},
+ {TIFFTAG_GDAL_NODATA, "GDAL NoDataValue"},
};
-#define NORIENTNAMES (sizeof (orientNames) / sizeof (orientNames[0]))
+#define NTAGS (sizeof(tagnames) / sizeof(tagnames[0]))
-static void
-_TIFFPrintField(FILE* fd, const TIFFField *fip,
- uint32 value_count, void *raw_data)
+static void _TIFFPrintField(FILE *fd, const TIFFField *fip,
+ uint32_t value_count, void *raw_data)
{
- uint32 j;
-
- fprintf(fd, " %s: ", fip->field_name);
-
- for(j = 0; j < value_count; j++) {
- if(fip->field_type == TIFF_BYTE)
- fprintf(fd, "%u", ((uint8 *) raw_data)[j]);
- else if(fip->field_type == TIFF_UNDEFINED)
- fprintf(fd, "0x%x",
- (unsigned int) ((unsigned char *) raw_data)[j]);
- else if(fip->field_type == TIFF_SBYTE)
- fprintf(fd, "%d", ((int8 *) raw_data)[j]);
- else if(fip->field_type == TIFF_SHORT)
- fprintf(fd, "%u", ((uint16 *) raw_data)[j]);
- else if(fip->field_type == TIFF_SSHORT)
- fprintf(fd, "%d", ((int16 *) raw_data)[j]);
- else if(fip->field_type == TIFF_LONG)
- fprintf(fd, "%lu",
- (unsigned long)((uint32 *) raw_data)[j]);
- else if(fip->field_type == TIFF_SLONG)
- fprintf(fd, "%ld", (long)((int32 *) raw_data)[j]);
- else if(fip->field_type == TIFF_IFD)
- fprintf(fd, "0x%lx",
- (unsigned long)((uint32 *) raw_data)[j]);
- else if(fip->field_type == TIFF_RATIONAL
- || fip->field_type == TIFF_SRATIONAL
- || fip->field_type == TIFF_FLOAT)
- fprintf(fd, "%f", ((float *) raw_data)[j]);
- else if(fip->field_type == TIFF_LONG8)
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- fprintf(fd, "%I64u",
- (unsigned __int64)((uint64 *) raw_data)[j]);
-#else
- fprintf(fd, "%llu",
- (unsigned long long)((uint64 *) raw_data)[j]);
-#endif
- else if(fip->field_type == TIFF_SLONG8)
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- fprintf(fd, "%I64d", (__int64)((int64 *) raw_data)[j]);
-#else
- fprintf(fd, "%lld", (long long)((int64 *) raw_data)[j]);
-#endif
- else if(fip->field_type == TIFF_IFD8)
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- fprintf(fd, "0x%I64x",
- (unsigned __int64)((uint64 *) raw_data)[j]);
-#else
- fprintf(fd, "0x%llx",
- (unsigned long long)((uint64 *) raw_data)[j]);
-#endif
- else if(fip->field_type == TIFF_FLOAT)
- fprintf(fd, "%f", ((float *)raw_data)[j]);
- else if(fip->field_type == TIFF_DOUBLE)
- fprintf(fd, "%f", ((double *) raw_data)[j]);
- else if(fip->field_type == TIFF_ASCII) {
- fprintf(fd, "%s", (char *) raw_data);
- break;
- }
- else {
- fprintf(fd, "<unsupported data type in TIFFPrint>");
- break;
- }
-
- if(j < value_count - 1)
- fprintf(fd, ",");
- }
-
- fprintf(fd, "\n");
+ uint32_t j;
+
+ /* Print a user-friendly name for tags of relatively common use, but */
+ /* which aren't registered by libtiff itself. */
+ const char *field_name = fip->field_name;
+ if (TIFFFieldIsAnonymous(fip))
+ {
+ for (size_t i = 0; i < NTAGS; ++i)
+ {
+ if (fip->field_tag == tagnames[i].tag)
+ {
+ field_name = tagnames[i].name;
+ break;
+ }
+ }
+ }
+ fprintf(fd, " %s: ", field_name);
+
+ for (j = 0; j < value_count; j++)
+ {
+ if (fip->field_type == TIFF_BYTE)
+ fprintf(fd, "%" PRIu8, ((uint8_t *)raw_data)[j]);
+ else if (fip->field_type == TIFF_UNDEFINED)
+ fprintf(fd, "0x%" PRIx8, ((uint8_t *)raw_data)[j]);
+ else if (fip->field_type == TIFF_SBYTE)
+ fprintf(fd, "%" PRId8, ((int8_t *)raw_data)[j]);
+ else if (fip->field_type == TIFF_SHORT)
+ fprintf(fd, "%" PRIu16, ((uint16_t *)raw_data)[j]);
+ else if (fip->field_type == TIFF_SSHORT)
+ fprintf(fd, "%" PRId16, ((int16_t *)raw_data)[j]);
+ else if (fip->field_type == TIFF_LONG)
+ fprintf(fd, "%" PRIu32, ((uint32_t *)raw_data)[j]);
+ else if (fip->field_type == TIFF_SLONG)
+ fprintf(fd, "%" PRId32, ((int32_t *)raw_data)[j]);
+ else if (fip->field_type == TIFF_IFD)
+ fprintf(fd, "0x%" PRIx32, ((uint32_t *)raw_data)[j]);
+ else if (fip->field_type == TIFF_RATIONAL ||
+ fip->field_type == TIFF_SRATIONAL)
+ {
+ int tv_size = TIFFFieldSetGetSize(fip);
+ if (tv_size == 8)
+ fprintf(fd, "%lf", ((double *)raw_data)[j]);
+ else
+ fprintf(fd, "%f", ((float *)raw_data)[j]);
+ }
+ else if (fip->field_type == TIFF_FLOAT)
+ fprintf(fd, "%f", ((float *)raw_data)[j]);
+ else if (fip->field_type == TIFF_LONG8)
+ fprintf(fd, "%" PRIu64, ((uint64_t *)raw_data)[j]);
+ else if (fip->field_type == TIFF_SLONG8)
+ fprintf(fd, "%" PRId64, ((int64_t *)raw_data)[j]);
+ else if (fip->field_type == TIFF_IFD8)
+ fprintf(fd, "0x%" PRIx64, ((uint64_t *)raw_data)[j]);
+ else if (fip->field_type == TIFF_DOUBLE)
+ fprintf(fd, "%lf", ((double *)raw_data)[j]);
+ else if (fip->field_type == TIFF_ASCII)
+ {
+ fprintf(fd, "%s", (char *)raw_data);
+ break;
+ }
+ else
+ {
+ fprintf(fd, "<unsupported data type in TIFFPrint>");
+ break;
+ }
+
+ if (j < value_count - 1)
+ fprintf(fd, ",");
+ }
+
+ fprintf(fd, "\n");
}
-static int
-_TIFFPrettyPrintField(TIFF* tif, const TIFFField *fip, FILE* fd, uint32 tag,
- uint32 value_count, void *raw_data)
+static int _TIFFPrettyPrintField(TIFF *tif, const TIFFField *fip, FILE *fd,
+ uint32_t tag, uint32_t value_count,
+ void *raw_data)
{
- (void) tif;
-
- /* do not try to pretty print auto-defined fields */
- if (strncmp(fip->field_name,"Tag ", 4) == 0) {
- return 0;
- }
-
- switch (tag)
- {
- case TIFFTAG_INKSET:
- if (value_count == 2 && fip->field_type == TIFF_SHORT) {
- fprintf(fd, " Ink Set: ");
- switch (*((uint16*)raw_data)) {
- case INKSET_CMYK:
- fprintf(fd, "CMYK\n");
- break;
- default:
- fprintf(fd, "%u (0x%x)\n",
- *((uint16*)raw_data),
- *((uint16*)raw_data));
- break;
- }
- return 1;
- }
- return 0;
-
- case TIFFTAG_DOTRANGE:
- if (value_count == 2 && fip->field_type == TIFF_SHORT) {
- fprintf(fd, " Dot Range: %u-%u\n",
- ((uint16*)raw_data)[0], ((uint16*)raw_data)[1]);
- return 1;
- }
- return 0;
-
- case TIFFTAG_WHITEPOINT:
- if (value_count == 2 && fip->field_type == TIFF_RATIONAL) {
- fprintf(fd, " White Point: %g-%g\n",
- ((float *)raw_data)[0], ((float *)raw_data)[1]);
- return 1;
- }
- return 0;
-
- case TIFFTAG_XMLPACKET:
- {
- uint32 i;
-
- fprintf(fd, " XMLPacket (XMP Metadata):\n" );
- for(i = 0; i < value_count; i++)
- fputc(((char *)raw_data)[i], fd);
- fprintf( fd, "\n" );
- return 1;
- }
- case TIFFTAG_RICHTIFFIPTC:
- /*
- * XXX: for some weird reason RichTIFFIPTC tag
- * defined as array of LONG values.
- */
- fprintf(fd,
- " RichTIFFIPTC Data: <present>, %lu bytes\n",
- (unsigned long) value_count * 4);
- return 1;
-
- case TIFFTAG_PHOTOSHOP:
- fprintf(fd, " Photoshop Data: <present>, %lu bytes\n",
- (unsigned long) value_count);
- return 1;
-
- case TIFFTAG_ICCPROFILE:
- fprintf(fd, " ICC Profile: <present>, %lu bytes\n",
- (unsigned long) value_count);
- return 1;
-
- case TIFFTAG_STONITS:
- if (value_count == 1 && fip->field_type == TIFF_DOUBLE) {
- fprintf(fd,
- " Sample to Nits conversion factor: %.4e\n",
- *((double*)raw_data));
- return 1;
- }
- return 0;
- }
-
- return 0;
+ (void)tif;
+
+ /* do not try to pretty print auto-defined fields */
+ if (TIFFFieldIsAnonymous(fip))
+ {
+ return 0;
+ }
+
+ switch (tag)
+ {
+ case TIFFTAG_INKSET:
+ if (value_count == 2 && fip->field_type == TIFF_SHORT)
+ {
+ fprintf(fd, " Ink Set: ");
+ switch (*((uint16_t *)raw_data))
+ {
+ case INKSET_CMYK:
+ fprintf(fd, "CMYK\n");
+ break;
+ default:
+ fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n",
+ *((uint16_t *)raw_data),
+ *((uint16_t *)raw_data));
+ break;
+ }
+ return 1;
+ }
+ return 0;
+
+ case TIFFTAG_DOTRANGE:
+ if (value_count == 2 && fip->field_type == TIFF_SHORT)
+ {
+ fprintf(fd, " Dot Range: %" PRIu16 "-%" PRIu16 "\n",
+ ((uint16_t *)raw_data)[0], ((uint16_t *)raw_data)[1]);
+ return 1;
+ }
+ return 0;
+
+ case TIFFTAG_WHITEPOINT:
+ if (value_count == 2 && fip->field_type == TIFF_RATIONAL)
+ {
+ fprintf(fd, " White Point: %g-%g\n", ((float *)raw_data)[0],
+ ((float *)raw_data)[1]);
+ return 1;
+ }
+ return 0;
+
+ case TIFFTAG_XMLPACKET:
+ {
+ uint32_t i;
+
+ fprintf(fd, " XMLPacket (XMP Metadata):\n");
+ for (i = 0; i < value_count; i++)
+ fputc(((char *)raw_data)[i], fd);
+ fprintf(fd, "\n");
+ return 1;
+ }
+ case TIFFTAG_RICHTIFFIPTC:
+ fprintf(fd, " RichTIFFIPTC Data: <present>, %" PRIu32 " bytes\n",
+ value_count);
+ return 1;
+
+ case TIFFTAG_PHOTOSHOP:
+ fprintf(fd, " Photoshop Data: <present>, %" PRIu32 " bytes\n",
+ value_count);
+ return 1;
+
+ case TIFFTAG_ICCPROFILE:
+ fprintf(fd, " ICC Profile: <present>, %" PRIu32 " bytes\n",
+ value_count);
+ return 1;
+
+ case TIFFTAG_STONITS:
+ if (value_count == 1 && fip->field_type == TIFF_DOUBLE)
+ {
+ fprintf(fd, " Sample to Nits conversion factor: %.4e\n",
+ *((double *)raw_data));
+ return 1;
+ }
+ return 0;
+ }
+
+ return 0;
}
/*
* Print the contents of the current directory
* to the specified stdio file stream.
*/
-void
-TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags)
+void TIFFPrintDirectory(TIFF *tif, FILE *fd, long flags)
{
- TIFFDirectory *td = &tif->tif_dir;
- char *sep;
- long l, n;
-
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- fprintf(fd, "TIFF Directory at offset 0x%I64x (%I64u)\n",
- (unsigned __int64) tif->tif_diroff,
- (unsigned __int64) tif->tif_diroff);
-#else
- fprintf(fd, "TIFF Directory at offset 0x%llx (%llu)\n",
- (unsigned long long) tif->tif_diroff,
- (unsigned long long) tif->tif_diroff);
-#endif
- if (TIFFFieldSet(tif,FIELD_SUBFILETYPE)) {
- fprintf(fd, " Subfile Type:");
- sep = " ";
- if (td->td_subfiletype & FILETYPE_REDUCEDIMAGE) {
- fprintf(fd, "%sreduced-resolution image", sep);
- sep = "/";
- }
- if (td->td_subfiletype & FILETYPE_PAGE) {
- fprintf(fd, "%smulti-page document", sep);
- sep = "/";
- }
- if (td->td_subfiletype & FILETYPE_MASK)
- fprintf(fd, "%stransparency mask", sep);
- fprintf(fd, " (%lu = 0x%lx)\n",
- (unsigned long) td->td_subfiletype, (long) td->td_subfiletype);
- }
- if (TIFFFieldSet(tif,FIELD_IMAGEDIMENSIONS)) {
- fprintf(fd, " Image Width: %lu Image Length: %lu",
- (unsigned long) td->td_imagewidth, (unsigned long) td->td_imagelength);
- if (TIFFFieldSet(tif,FIELD_IMAGEDEPTH))
- fprintf(fd, " Image Depth: %lu",
- (unsigned long) td->td_imagedepth);
- fprintf(fd, "\n");
- }
- if (TIFFFieldSet(tif,FIELD_TILEDIMENSIONS)) {
- fprintf(fd, " Tile Width: %lu Tile Length: %lu",
- (unsigned long) td->td_tilewidth, (unsigned long) td->td_tilelength);
- if (TIFFFieldSet(tif,FIELD_TILEDEPTH))
- fprintf(fd, " Tile Depth: %lu",
- (unsigned long) td->td_tiledepth);
- fprintf(fd, "\n");
- }
- if (TIFFFieldSet(tif,FIELD_RESOLUTION)) {
- fprintf(fd, " Resolution: %g, %g",
- td->td_xresolution, td->td_yresolution);
- if (TIFFFieldSet(tif,FIELD_RESOLUTIONUNIT)) {
- switch (td->td_resolutionunit) {
- case RESUNIT_NONE:
- fprintf(fd, " (unitless)");
- break;
- case RESUNIT_INCH:
- fprintf(fd, " pixels/inch");
- break;
- case RESUNIT_CENTIMETER:
- fprintf(fd, " pixels/cm");
- break;
- default:
- fprintf(fd, " (unit %u = 0x%x)",
- td->td_resolutionunit,
- td->td_resolutionunit);
- break;
- }
- }
- fprintf(fd, "\n");
- }
- if (TIFFFieldSet(tif,FIELD_POSITION))
- fprintf(fd, " Position: %g, %g\n",
- td->td_xposition, td->td_yposition);
- if (TIFFFieldSet(tif,FIELD_BITSPERSAMPLE))
- fprintf(fd, " Bits/Sample: %u\n", td->td_bitspersample);
- if (TIFFFieldSet(tif,FIELD_SAMPLEFORMAT)) {
- fprintf(fd, " Sample Format: ");
- switch (td->td_sampleformat) {
- case SAMPLEFORMAT_VOID:
- fprintf(fd, "void\n");
- break;
- case SAMPLEFORMAT_INT:
- fprintf(fd, "signed integer\n");
- break;
- case SAMPLEFORMAT_UINT:
- fprintf(fd, "unsigned integer\n");
- break;
- case SAMPLEFORMAT_IEEEFP:
- fprintf(fd, "IEEE floating point\n");
- break;
- case SAMPLEFORMAT_COMPLEXINT:
- fprintf(fd, "complex signed integer\n");
- break;
- case SAMPLEFORMAT_COMPLEXIEEEFP:
- fprintf(fd, "complex IEEE floating point\n");
- break;
- default:
- fprintf(fd, "%u (0x%x)\n",
- td->td_sampleformat, td->td_sampleformat);
- break;
- }
- }
- if (TIFFFieldSet(tif,FIELD_COMPRESSION)) {
- const TIFFCodec* c = TIFFFindCODEC(td->td_compression);
- fprintf(fd, " Compression Scheme: ");
- if (c)
- fprintf(fd, "%s\n", c->name);
- else
- fprintf(fd, "%u (0x%x)\n",
- td->td_compression, td->td_compression);
- }
- if (TIFFFieldSet(tif,FIELD_PHOTOMETRIC)) {
- fprintf(fd, " Photometric Interpretation: ");
- if (td->td_photometric < NPHOTONAMES)
- fprintf(fd, "%s\n", photoNames[td->td_photometric]);
- else {
- switch (td->td_photometric) {
- case PHOTOMETRIC_LOGL:
- fprintf(fd, "CIE Log2(L)\n");
- break;
- case PHOTOMETRIC_LOGLUV:
- fprintf(fd, "CIE Log2(L) (u',v')\n");
- break;
- default:
- fprintf(fd, "%u (0x%x)\n",
- td->td_photometric, td->td_photometric);
- break;
- }
- }
- }
- if (TIFFFieldSet(tif,FIELD_EXTRASAMPLES) && td->td_extrasamples) {
- uint16 i;
- fprintf(fd, " Extra Samples: %u<", td->td_extrasamples);
- sep = "";
- for (i = 0; i < td->td_extrasamples; i++) {
- switch (td->td_sampleinfo[i]) {
- case EXTRASAMPLE_UNSPECIFIED:
- fprintf(fd, "%sunspecified", sep);
- break;
- case EXTRASAMPLE_ASSOCALPHA:
- fprintf(fd, "%sassoc-alpha", sep);
- break;
- case EXTRASAMPLE_UNASSALPHA:
- fprintf(fd, "%sunassoc-alpha", sep);
- break;
- default:
- fprintf(fd, "%s%u (0x%x)", sep,
- td->td_sampleinfo[i], td->td_sampleinfo[i]);
- break;
- }
- sep = ", ";
- }
- fprintf(fd, ">\n");
- }
- if (TIFFFieldSet(tif,FIELD_INKNAMES)) {
- char* cp;
- uint16 i;
- fprintf(fd, " Ink Names: ");
- i = td->td_samplesperpixel;
- sep = "";
- for (cp = td->td_inknames;
- i > 0 && cp < td->td_inknames + td->td_inknameslen;
- cp = strchr(cp,'\0')+1, i--) {
- size_t max_chars =
- td->td_inknameslen - (cp - td->td_inknames);
- fputs(sep, fd);
- _TIFFprintAsciiBounded(fd, cp, max_chars);
- sep = ", ";
- }
- fputs("\n", fd);
- }
- if (TIFFFieldSet(tif,FIELD_THRESHHOLDING)) {
- fprintf(fd, " Thresholding: ");
- switch (td->td_threshholding) {
- case THRESHHOLD_BILEVEL:
- fprintf(fd, "bilevel art scan\n");
- break;
- case THRESHHOLD_HALFTONE:
- fprintf(fd, "halftone or dithered scan\n");
- break;
- case THRESHHOLD_ERRORDIFFUSE:
- fprintf(fd, "error diffused\n");
- break;
- default:
- fprintf(fd, "%u (0x%x)\n",
- td->td_threshholding, td->td_threshholding);
- break;
- }
- }
- if (TIFFFieldSet(tif,FIELD_FILLORDER)) {
- fprintf(fd, " FillOrder: ");
- switch (td->td_fillorder) {
- case FILLORDER_MSB2LSB:
- fprintf(fd, "msb-to-lsb\n");
- break;
- case FILLORDER_LSB2MSB:
- fprintf(fd, "lsb-to-msb\n");
- break;
- default:
- fprintf(fd, "%u (0x%x)\n",
- td->td_fillorder, td->td_fillorder);
- break;
- }
- }
- if (TIFFFieldSet(tif,FIELD_YCBCRSUBSAMPLING))
+ TIFFDirectory *td = &tif->tif_dir;
+ char *sep;
+ long l, n;
+
+ fprintf(fd, "TIFF Directory at offset 0x%" PRIx64 " (%" PRIu64 ")\n",
+ tif->tif_diroff, tif->tif_diroff);
+ if (TIFFFieldSet(tif, FIELD_SUBFILETYPE))
+ {
+ fprintf(fd, " Subfile Type:");
+ sep = " ";
+ if (td->td_subfiletype & FILETYPE_REDUCEDIMAGE)
+ {
+ fprintf(fd, "%sreduced-resolution image", sep);
+ sep = "/";
+ }
+ if (td->td_subfiletype & FILETYPE_PAGE)
+ {
+ fprintf(fd, "%smulti-page document", sep);
+ sep = "/";
+ }
+ if (td->td_subfiletype & FILETYPE_MASK)
+ fprintf(fd, "%stransparency mask", sep);
+ fprintf(fd, " (%" PRIu32 " = 0x%" PRIx32 ")\n", td->td_subfiletype,
+ td->td_subfiletype);
+ }
+ if (TIFFFieldSet(tif, FIELD_IMAGEDIMENSIONS))
+ {
+ fprintf(fd, " Image Width: %" PRIu32 " Image Length: %" PRIu32,
+ td->td_imagewidth, td->td_imagelength);
+ if (TIFFFieldSet(tif, FIELD_IMAGEDEPTH))
+ fprintf(fd, " Image Depth: %" PRIu32, td->td_imagedepth);
+ fprintf(fd, "\n");
+ }
+ if (TIFFFieldSet(tif, FIELD_TILEDIMENSIONS))
+ {
+ fprintf(fd, " Tile Width: %" PRIu32 " Tile Length: %" PRIu32,
+ td->td_tilewidth, td->td_tilelength);
+ if (TIFFFieldSet(tif, FIELD_TILEDEPTH))
+ fprintf(fd, " Tile Depth: %" PRIu32, td->td_tiledepth);
+ fprintf(fd, "\n");
+ }
+ if (TIFFFieldSet(tif, FIELD_RESOLUTION))
+ {
+ fprintf(fd, " Resolution: %g, %g", td->td_xresolution,
+ td->td_yresolution);
+ if (TIFFFieldSet(tif, FIELD_RESOLUTIONUNIT))
+ {
+ switch (td->td_resolutionunit)
+ {
+ case RESUNIT_NONE:
+ fprintf(fd, " (unitless)");
+ break;
+ case RESUNIT_INCH:
+ fprintf(fd, " pixels/inch");
+ break;
+ case RESUNIT_CENTIMETER:
+ fprintf(fd, " pixels/cm");
+ break;
+ default:
+ fprintf(fd, " (unit %" PRIu16 " = 0x%" PRIx16 ")",
+ td->td_resolutionunit, td->td_resolutionunit);
+ break;
+ }
+ }
+ fprintf(fd, "\n");
+ }
+ if (TIFFFieldSet(tif, FIELD_POSITION))
+ fprintf(fd, " Position: %g, %g\n", td->td_xposition, td->td_yposition);
+ if (TIFFFieldSet(tif, FIELD_BITSPERSAMPLE))
+ fprintf(fd, " Bits/Sample: %" PRIu16 "\n", td->td_bitspersample);
+ if (TIFFFieldSet(tif, FIELD_SAMPLEFORMAT))
+ {
+ fprintf(fd, " Sample Format: ");
+ switch (td->td_sampleformat)
{
- fprintf(fd, " YCbCr Subsampling: %u, %u\n",
- td->td_ycbcrsubsampling[0], td->td_ycbcrsubsampling[1] );
- }
- if (TIFFFieldSet(tif,FIELD_YCBCRPOSITIONING)) {
- fprintf(fd, " YCbCr Positioning: ");
- switch (td->td_ycbcrpositioning) {
- case YCBCRPOSITION_CENTERED:
- fprintf(fd, "centered\n");
- break;
- case YCBCRPOSITION_COSITED:
- fprintf(fd, "cosited\n");
- break;
- default:
- fprintf(fd, "%u (0x%x)\n",
- td->td_ycbcrpositioning, td->td_ycbcrpositioning);
- break;
- }
- }
- if (TIFFFieldSet(tif,FIELD_HALFTONEHINTS))
- fprintf(fd, " Halftone Hints: light %u dark %u\n",
- td->td_halftonehints[0], td->td_halftonehints[1]);
- if (TIFFFieldSet(tif,FIELD_ORIENTATION)) {
- fprintf(fd, " Orientation: ");
- if (td->td_orientation < NORIENTNAMES)
- fprintf(fd, "%s\n", orientNames[td->td_orientation]);
- else
- fprintf(fd, "%u (0x%x)\n",
- td->td_orientation, td->td_orientation);
- }
- if (TIFFFieldSet(tif,FIELD_SAMPLESPERPIXEL))
- fprintf(fd, " Samples/Pixel: %u\n", td->td_samplesperpixel);
- if (TIFFFieldSet(tif,FIELD_ROWSPERSTRIP)) {
- fprintf(fd, " Rows/Strip: ");
- if (td->td_rowsperstrip == (uint32) -1)
- fprintf(fd, "(infinite)\n");
- else
- fprintf(fd, "%lu\n", (unsigned long) td->td_rowsperstrip);
- }
- if (TIFFFieldSet(tif,FIELD_MINSAMPLEVALUE))
- fprintf(fd, " Min Sample Value: %u\n", td->td_minsamplevalue);
- if (TIFFFieldSet(tif,FIELD_MAXSAMPLEVALUE))
- fprintf(fd, " Max Sample Value: %u\n", td->td_maxsamplevalue);
- if (TIFFFieldSet(tif,FIELD_SMINSAMPLEVALUE)) {
- int i;
- int count = (tif->tif_flags & TIFF_PERSAMPLE) ? td->td_samplesperpixel : 1;
- fprintf(fd, " SMin Sample Value:");
- for (i = 0; i < count; ++i)
- fprintf(fd, " %g", td->td_sminsamplevalue[i]);
- fprintf(fd, "\n");
- }
- if (TIFFFieldSet(tif,FIELD_SMAXSAMPLEVALUE)) {
- int i;
- int count = (tif->tif_flags & TIFF_PERSAMPLE) ? td->td_samplesperpixel : 1;
- fprintf(fd, " SMax Sample Value:");
- for (i = 0; i < count; ++i)
- fprintf(fd, " %g", td->td_smaxsamplevalue[i]);
- fprintf(fd, "\n");
- }
- if (TIFFFieldSet(tif,FIELD_PLANARCONFIG)) {
- fprintf(fd, " Planar Configuration: ");
- switch (td->td_planarconfig) {
- case PLANARCONFIG_CONTIG:
- fprintf(fd, "single image plane\n");
- break;
- case PLANARCONFIG_SEPARATE:
- fprintf(fd, "separate image planes\n");
- break;
- default:
- fprintf(fd, "%u (0x%x)\n",
- td->td_planarconfig, td->td_planarconfig);
- break;
- }
- }
- if (TIFFFieldSet(tif,FIELD_PAGENUMBER))
- fprintf(fd, " Page Number: %u-%u\n",
- td->td_pagenumber[0], td->td_pagenumber[1]);
- if (TIFFFieldSet(tif,FIELD_COLORMAP)) {
- fprintf(fd, " Color Map: ");
- if (flags & TIFFPRINT_COLORMAP) {
- fprintf(fd, "\n");
- n = 1L<<td->td_bitspersample;
- for (l = 0; l < n; l++)
- fprintf(fd, " %5ld: %5u %5u %5u\n",
- l,
- td->td_colormap[0][l],
- td->td_colormap[1][l],
- td->td_colormap[2][l]);
- } else
- fprintf(fd, "(present)\n");
- }
- if (TIFFFieldSet(tif,FIELD_REFBLACKWHITE)) {
- int i;
- fprintf(fd, " Reference Black/White:\n");
- for (i = 0; i < 3; i++)
- fprintf(fd, " %2d: %5g %5g\n", i,
- td->td_refblackwhite[2*i+0],
- td->td_refblackwhite[2*i+1]);
- }
- if (TIFFFieldSet(tif,FIELD_TRANSFERFUNCTION)) {
- fprintf(fd, " Transfer Function: ");
- if (flags & TIFFPRINT_CURVES) {
- fprintf(fd, "\n");
- n = 1L<<td->td_bitspersample;
- for (l = 0; l < n; l++) {
- uint16 i;
- fprintf(fd, " %2ld: %5u",
- l, td->td_transferfunction[0][l]);
- for (i = 1; i < td->td_samplesperpixel - td->td_extrasamples && i < 3; i++)
- fprintf(fd, " %5u",
- td->td_transferfunction[i][l]);
- fputc('\n', fd);
- }
- } else
- fprintf(fd, "(present)\n");
- }
- if (TIFFFieldSet(tif, FIELD_SUBIFD) && (td->td_subifd)) {
- uint16 i;
- fprintf(fd, " SubIFD Offsets:");
- for (i = 0; i < td->td_nsubifd; i++)
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- fprintf(fd, " %5I64u",
- (unsigned __int64) td->td_subifd[i]);
-#else
- fprintf(fd, " %5llu",
- (unsigned long long) td->td_subifd[i]);
-#endif
- fputc('\n', fd);
- }
-
- /*
- ** Custom tag support.
- */
- {
- int i;
- short count;
-
- count = (short) TIFFGetTagListCount(tif);
- for(i = 0; i < count; i++) {
- uint32 tag = TIFFGetTagListEntry(tif, i);
- const TIFFField *fip;
- uint32 value_count;
- int mem_alloc = 0;
- void *raw_data;
-
- fip = TIFFFieldWithTag(tif, tag);
- if(fip == NULL)
- continue;
-
- if(fip->field_passcount) {
- if (fip->field_readcount == TIFF_VARIABLE2 ) {
- if(TIFFGetField(tif, tag, &value_count, &raw_data) != 1)
- continue;
- } else if (fip->field_readcount == TIFF_VARIABLE ) {
- uint16 small_value_count;
- if(TIFFGetField(tif, tag, &small_value_count, &raw_data) != 1)
- continue;
- value_count = small_value_count;
- } else {
- assert (fip->field_readcount == TIFF_VARIABLE
- || fip->field_readcount == TIFF_VARIABLE2);
- continue;
- }
- } else {
- if (fip->field_readcount == TIFF_VARIABLE
- || fip->field_readcount == TIFF_VARIABLE2)
- value_count = 1;
- else if (fip->field_readcount == TIFF_SPP)
- value_count = td->td_samplesperpixel;
- else
- value_count = fip->field_readcount;
- if (fip->field_tag == TIFFTAG_DOTRANGE
- && strcmp(fip->field_name,"DotRange") == 0) {
- /* TODO: This is an evil exception and should not have been
- handled this way ... likely best if we move it into
- the directory structure with an explicit field in
- libtiff 4.1 and assign it a FIELD_ value */
- static uint16 dotrange[2];
- raw_data = dotrange;
- TIFFGetField(tif, tag, dotrange+0, dotrange+1);
- } else if (fip->field_type == TIFF_ASCII
- || fip->field_readcount == TIFF_VARIABLE
- || fip->field_readcount == TIFF_VARIABLE2
- || fip->field_readcount == TIFF_SPP
- || value_count > 1) {
- if(TIFFGetField(tif, tag, &raw_data) != 1)
- continue;
- } else {
- raw_data = _TIFFmalloc(
- _TIFFDataSize(fip->field_type)
- * value_count);
- mem_alloc = 1;
- if(TIFFGetField(tif, tag, raw_data) != 1) {
- _TIFFfree(raw_data);
- continue;
- }
- }
- }
-
- /*
- * Catch the tags which needs to be specially handled
- * and pretty print them. If tag not handled in
- * _TIFFPrettyPrintField() fall down and print it as
- * any other tag.
- */
- if (!_TIFFPrettyPrintField(tif, fip, fd, tag, value_count, raw_data))
- _TIFFPrintField(fd, fip, value_count, raw_data);
-
- if(mem_alloc)
- _TIFFfree(raw_data);
- }
- }
-
- if (tif->tif_tagmethods.printdir)
- (*tif->tif_tagmethods.printdir)(tif, fd, flags);
-
- if ((flags & TIFFPRINT_STRIPS) &&
- TIFFFieldSet(tif,FIELD_STRIPOFFSETS)) {
- uint32 s;
-
- fprintf(fd, " %lu %s:\n",
- (unsigned long) td->td_nstrips,
- isTiled(tif) ? "Tiles" : "Strips");
- for (s = 0; s < td->td_nstrips; s++)
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- fprintf(fd, " %3lu: [%8I64u, %8I64u]\n",
- (unsigned long) s,
- (unsigned __int64) TIFFGetStrileOffset(tif, s),
- (unsigned __int64) TIFFGetStrileByteCount(tif, s));
-#else
- fprintf(fd, " %3lu: [%8llu, %8llu]\n",
- (unsigned long) s,
- (unsigned long long) TIFFGetStrileOffset(tif, s),
- (unsigned long long) TIFFGetStrileByteCount(tif, s));
-#endif
- }
+ case SAMPLEFORMAT_VOID:
+ fprintf(fd, "void\n");
+ break;
+ case SAMPLEFORMAT_INT:
+ fprintf(fd, "signed integer\n");
+ break;
+ case SAMPLEFORMAT_UINT:
+ fprintf(fd, "unsigned integer\n");
+ break;
+ case SAMPLEFORMAT_IEEEFP:
+ fprintf(fd, "IEEE floating point\n");
+ break;
+ case SAMPLEFORMAT_COMPLEXINT:
+ fprintf(fd, "complex signed integer\n");
+ break;
+ case SAMPLEFORMAT_COMPLEXIEEEFP:
+ fprintf(fd, "complex IEEE floating point\n");
+ break;
+ default:
+ fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n",
+ td->td_sampleformat, td->td_sampleformat);
+ break;
+ }
+ }
+ if (TIFFFieldSet(tif, FIELD_COMPRESSION))
+ {
+ const TIFFCodec *c = TIFFFindCODEC(td->td_compression);
+ fprintf(fd, " Compression Scheme: ");
+ if (c)
+ fprintf(fd, "%s\n", c->name);
+ else
+ fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n", td->td_compression,
+ td->td_compression);
+ }
+ if (TIFFFieldSet(tif, FIELD_PHOTOMETRIC))
+ {
+ fprintf(fd, " Photometric Interpretation: ");
+ if (td->td_photometric < NPHOTONAMES)
+ fprintf(fd, "%s\n", photoNames[td->td_photometric]);
+ else
+ {
+ switch (td->td_photometric)
+ {
+ case PHOTOMETRIC_LOGL:
+ fprintf(fd, "CIE Log2(L)\n");
+ break;
+ case PHOTOMETRIC_LOGLUV:
+ fprintf(fd, "CIE Log2(L) (u',v')\n");
+ break;
+ default:
+ fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n",
+ td->td_photometric, td->td_photometric);
+ break;
+ }
+ }
+ }
+ if (TIFFFieldSet(tif, FIELD_EXTRASAMPLES) && td->td_extrasamples)
+ {
+ uint16_t i;
+ fprintf(fd, " Extra Samples: %" PRIu16 "<", td->td_extrasamples);
+ sep = "";
+ for (i = 0; i < td->td_extrasamples; i++)
+ {
+ switch (td->td_sampleinfo[i])
+ {
+ case EXTRASAMPLE_UNSPECIFIED:
+ fprintf(fd, "%sunspecified", sep);
+ break;
+ case EXTRASAMPLE_ASSOCALPHA:
+ fprintf(fd, "%sassoc-alpha", sep);
+ break;
+ case EXTRASAMPLE_UNASSALPHA:
+ fprintf(fd, "%sunassoc-alpha", sep);
+ break;
+ default:
+ fprintf(fd, "%s%" PRIu16 " (0x%" PRIx16 ")", sep,
+ td->td_sampleinfo[i], td->td_sampleinfo[i]);
+ break;
+ }
+ sep = ", ";
+ }
+ fprintf(fd, ">\n");
+ }
+ if (TIFFFieldSet(tif, FIELD_INKNAMES))
+ {
+ char *cp;
+ uint16_t i;
+ fprintf(fd, " Ink Names: ");
+ i = td->td_samplesperpixel;
+ sep = "";
+ for (cp = td->td_inknames;
+ i > 0 && cp < td->td_inknames + td->td_inknameslen;
+ cp = strchr(cp, '\0') + 1, i--)
+ {
+ size_t max_chars = td->td_inknameslen - (cp - td->td_inknames);
+ fputs(sep, fd);
+ _TIFFprintAsciiBounded(fd, cp, max_chars);
+ sep = ", ";
+ }
+ fputs("\n", fd);
+ }
+ if (TIFFFieldSet(tif, FIELD_NUMBEROFINKS))
+ {
+ fprintf(fd, " NumberOfInks: %d\n", td->td_numberofinks);
+ }
+ if (TIFFFieldSet(tif, FIELD_THRESHHOLDING))
+ {
+ fprintf(fd, " Thresholding: ");
+ switch (td->td_threshholding)
+ {
+ case THRESHHOLD_BILEVEL:
+ fprintf(fd, "bilevel art scan\n");
+ break;
+ case THRESHHOLD_HALFTONE:
+ fprintf(fd, "halftone or dithered scan\n");
+ break;
+ case THRESHHOLD_ERRORDIFFUSE:
+ fprintf(fd, "error diffused\n");
+ break;
+ default:
+ fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n",
+ td->td_threshholding, td->td_threshholding);
+ break;
+ }
+ }
+ if (TIFFFieldSet(tif, FIELD_FILLORDER))
+ {
+ fprintf(fd, " FillOrder: ");
+ switch (td->td_fillorder)
+ {
+ case FILLORDER_MSB2LSB:
+ fprintf(fd, "msb-to-lsb\n");
+ break;
+ case FILLORDER_LSB2MSB:
+ fprintf(fd, "lsb-to-msb\n");
+ break;
+ default:
+ fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n", td->td_fillorder,
+ td->td_fillorder);
+ break;
+ }
+ }
+ if (TIFFFieldSet(tif, FIELD_YCBCRSUBSAMPLING))
+ {
+ fprintf(fd, " YCbCr Subsampling: %" PRIu16 ", %" PRIu16 "\n",
+ td->td_ycbcrsubsampling[0], td->td_ycbcrsubsampling[1]);
+ }
+ if (TIFFFieldSet(tif, FIELD_YCBCRPOSITIONING))
+ {
+ fprintf(fd, " YCbCr Positioning: ");
+ switch (td->td_ycbcrpositioning)
+ {
+ case YCBCRPOSITION_CENTERED:
+ fprintf(fd, "centered\n");
+ break;
+ case YCBCRPOSITION_COSITED:
+ fprintf(fd, "cosited\n");
+ break;
+ default:
+ fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n",
+ td->td_ycbcrpositioning, td->td_ycbcrpositioning);
+ break;
+ }
+ }
+ if (TIFFFieldSet(tif, FIELD_HALFTONEHINTS))
+ fprintf(fd, " Halftone Hints: light %" PRIu16 " dark %" PRIu16 "\n",
+ td->td_halftonehints[0], td->td_halftonehints[1]);
+ if (TIFFFieldSet(tif, FIELD_ORIENTATION))
+ {
+ fprintf(fd, " Orientation: ");
+ if (td->td_orientation < NORIENTNAMES)
+ fprintf(fd, "%s\n", orientNames[td->td_orientation]);
+ else
+ fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n", td->td_orientation,
+ td->td_orientation);
+ }
+ if (TIFFFieldSet(tif, FIELD_SAMPLESPERPIXEL))
+ fprintf(fd, " Samples/Pixel: %" PRIx16 "\n", td->td_samplesperpixel);
+ if (TIFFFieldSet(tif, FIELD_ROWSPERSTRIP))
+ {
+ fprintf(fd, " Rows/Strip: ");
+ if (td->td_rowsperstrip == (uint32_t)-1)
+ fprintf(fd, "(infinite)\n");
+ else
+ fprintf(fd, "%" PRIu32 "\n", td->td_rowsperstrip);
+ }
+ if (TIFFFieldSet(tif, FIELD_MINSAMPLEVALUE))
+ fprintf(fd, " Min Sample Value: %" PRIu16 "\n", td->td_minsamplevalue);
+ if (TIFFFieldSet(tif, FIELD_MAXSAMPLEVALUE))
+ fprintf(fd, " Max Sample Value: %" PRIu16 "\n", td->td_maxsamplevalue);
+ if (TIFFFieldSet(tif, FIELD_SMINSAMPLEVALUE))
+ {
+ int i;
+ int count =
+ (tif->tif_flags & TIFF_PERSAMPLE) ? td->td_samplesperpixel : 1;
+ fprintf(fd, " SMin Sample Value:");
+ for (i = 0; i < count; ++i)
+ fprintf(fd, " %g", td->td_sminsamplevalue[i]);
+ fprintf(fd, "\n");
+ }
+ if (TIFFFieldSet(tif, FIELD_SMAXSAMPLEVALUE))
+ {
+ int i;
+ int count =
+ (tif->tif_flags & TIFF_PERSAMPLE) ? td->td_samplesperpixel : 1;
+ fprintf(fd, " SMax Sample Value:");
+ for (i = 0; i < count; ++i)
+ fprintf(fd, " %g", td->td_smaxsamplevalue[i]);
+ fprintf(fd, "\n");
+ }
+ if (TIFFFieldSet(tif, FIELD_PLANARCONFIG))
+ {
+ fprintf(fd, " Planar Configuration: ");
+ switch (td->td_planarconfig)
+ {
+ case PLANARCONFIG_CONTIG:
+ fprintf(fd, "single image plane\n");
+ break;
+ case PLANARCONFIG_SEPARATE:
+ fprintf(fd, "separate image planes\n");
+ break;
+ default:
+ fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n",
+ td->td_planarconfig, td->td_planarconfig);
+ break;
+ }
+ }
+ if (TIFFFieldSet(tif, FIELD_PAGENUMBER))
+ fprintf(fd, " Page Number: %" PRIu16 "-%" PRIu16 "\n",
+ td->td_pagenumber[0], td->td_pagenumber[1]);
+ if (TIFFFieldSet(tif, FIELD_COLORMAP))
+ {
+ fprintf(fd, " Color Map: ");
+ if (flags & TIFFPRINT_COLORMAP)
+ {
+ fprintf(fd, "\n");
+ n = 1L << td->td_bitspersample;
+ for (l = 0; l < n; l++)
+ fprintf(fd, " %5ld: %5" PRIu16 " %5" PRIu16 " %5" PRIu16 "\n",
+ l, td->td_colormap[0][l], td->td_colormap[1][l],
+ td->td_colormap[2][l]);
+ }
+ else
+ fprintf(fd, "(present)\n");
+ }
+ if (TIFFFieldSet(tif, FIELD_REFBLACKWHITE))
+ {
+ int i;
+ fprintf(fd, " Reference Black/White:\n");
+ for (i = 0; i < 3; i++)
+ fprintf(fd, " %2d: %5g %5g\n", i,
+ td->td_refblackwhite[2 * i + 0],
+ td->td_refblackwhite[2 * i + 1]);
+ }
+ if (TIFFFieldSet(tif, FIELD_TRANSFERFUNCTION))
+ {
+ fprintf(fd, " Transfer Function: ");
+ if (flags & TIFFPRINT_CURVES)
+ {
+ fprintf(fd, "\n");
+ n = 1L << td->td_bitspersample;
+ for (l = 0; l < n; l++)
+ {
+ uint16_t i;
+ fprintf(fd, " %2ld: %5" PRIu16, l,
+ td->td_transferfunction[0][l]);
+ for (i = 1;
+ i < td->td_samplesperpixel - td->td_extrasamples && i < 3;
+ i++)
+ fprintf(fd, " %5" PRIu16, td->td_transferfunction[i][l]);
+ fputc('\n', fd);
+ }
+ }
+ else
+ fprintf(fd, "(present)\n");
+ }
+ if (TIFFFieldSet(tif, FIELD_SUBIFD) && (td->td_subifd))
+ {
+ uint16_t i;
+ fprintf(fd, " SubIFD Offsets:");
+ for (i = 0; i < td->td_nsubifd; i++)
+ fprintf(fd, " %5" PRIu64, td->td_subifd[i]);
+ fputc('\n', fd);
+ }
+
+ /*
+ ** Custom tag support.
+ */
+ {
+ int i;
+ short count;
+
+ count = (short)TIFFGetTagListCount(tif);
+ for (i = 0; i < count; i++)
+ {
+ uint32_t tag = TIFFGetTagListEntry(tif, i);
+ const TIFFField *fip;
+ uint32_t value_count;
+ int mem_alloc = 0;
+ void *raw_data = NULL;
+ uint16_t dotrange[2]; /* must be kept in that scope and not moved in
+ the below TIFFTAG_DOTRANGE specific case */
+
+ fip = TIFFFieldWithTag(tif, tag);
+ if (fip == NULL)
+ continue;
+
+ if (fip->field_passcount)
+ {
+ if (fip->field_readcount == TIFF_VARIABLE2)
+ {
+ if (TIFFGetField(tif, tag, &value_count, &raw_data) != 1)
+ continue;
+ }
+ else if (fip->field_readcount == TIFF_VARIABLE)
+ {
+ uint16_t small_value_count;
+ if (TIFFGetField(tif, tag, &small_value_count, &raw_data) !=
+ 1)
+ continue;
+ value_count = small_value_count;
+ }
+ else
+ {
+ assert(fip->field_readcount == TIFF_VARIABLE ||
+ fip->field_readcount == TIFF_VARIABLE2);
+ continue;
+ }
+ }
+ else
+ {
+ if (fip->field_readcount == TIFF_VARIABLE ||
+ fip->field_readcount == TIFF_VARIABLE2)
+ value_count = 1;
+ else if (fip->field_readcount == TIFF_SPP)
+ value_count = td->td_samplesperpixel;
+ else
+ value_count = fip->field_readcount;
+ if (fip->field_tag == TIFFTAG_DOTRANGE &&
+ strcmp(fip->field_name, "DotRange") == 0)
+ {
+ /* TODO: This is an evil exception and should not have been
+ handled this way ... likely best if we move it into
+ the directory structure with an explicit field in
+ libtiff 4.1 and assign it a FIELD_ value */
+ raw_data = dotrange;
+ TIFFGetField(tif, tag, dotrange + 0, dotrange + 1);
+ }
+ else if (fip->field_type == TIFF_ASCII ||
+ fip->field_readcount == TIFF_VARIABLE ||
+ fip->field_readcount == TIFF_VARIABLE2 ||
+ fip->field_readcount == TIFF_SPP || value_count > 1)
+ {
+ if (TIFFGetField(tif, tag, &raw_data) != 1)
+ continue;
+ }
+ else
+ {
+ /*--: Rational2Double: For Rationals evaluate
+ * "set_field_type" to determine internal storage size. */
+ int tv_size = TIFFFieldSetGetSize(fip);
+ raw_data = _TIFFmallocExt(tif, tv_size * value_count);
+ mem_alloc = 1;
+ if (TIFFGetField(tif, tag, raw_data) != 1)
+ {
+ _TIFFfreeExt(tif, raw_data);
+ continue;
+ }
+ }
+ }
+
+ /*
+ * Catch the tags which needs to be specially handled
+ * and pretty print them. If tag not handled in
+ * _TIFFPrettyPrintField() fall down and print it as
+ * any other tag.
+ */
+ if (raw_data != NULL &&
+ !_TIFFPrettyPrintField(tif, fip, fd, tag, value_count,
+ raw_data))
+ _TIFFPrintField(fd, fip, value_count, raw_data);
+
+ if (mem_alloc)
+ _TIFFfreeExt(tif, raw_data);
+ }
+ }
+
+ if (tif->tif_tagmethods.printdir)
+ (*tif->tif_tagmethods.printdir)(tif, fd, flags);
+
+ if ((flags & TIFFPRINT_STRIPS) && TIFFFieldSet(tif, FIELD_STRIPOFFSETS))
+ {
+ uint32_t s;
+
+ fprintf(fd, " %" PRIu32 " %s:\n", td->td_nstrips,
+ isTiled(tif) ? "Tiles" : "Strips");
+ for (s = 0; s < td->td_nstrips; s++)
+ fprintf(fd, " %3" PRIu32 ": [%8" PRIu64 ", %8" PRIu64 "]\n", s,
+ TIFFGetStrileOffset(tif, s),
+ TIFFGetStrileByteCount(tif, s));
+ }
}
-void
-_TIFFprintAscii(FILE* fd, const char* cp)
+void _TIFFprintAscii(FILE *fd, const char *cp)
{
- _TIFFprintAsciiBounded( fd, cp, strlen(cp));
+ _TIFFprintAsciiBounded(fd, cp, strlen(cp));
}
-static void
-_TIFFprintAsciiBounded(FILE* fd, const char* cp, size_t max_chars)
+static void _TIFFprintAsciiBounded(FILE *fd, const char *cp, size_t max_chars)
{
- for (; max_chars > 0 && *cp != '\0'; cp++, max_chars--) {
- const char* tp;
-
- if (isprint((int)*cp)) {
- fputc(*cp, fd);
- continue;
- }
- for (tp = "\tt\bb\rr\nn\vv"; *tp; tp++)
- if (*tp++ == *cp)
- break;
- if (*tp)
- fprintf(fd, "\\%c", *tp);
- else
- fprintf(fd, "\\%03o", *cp & 0xff);
- }
+ for (; max_chars > 0 && *cp != '\0'; cp++, max_chars--)
+ {
+ const char *tp;
+
+ if (isprint((int)*cp))
+ {
+ fputc(*cp, fd);
+ continue;
+ }
+ for (tp = "\tt\bb\rr\nn\vv"; *tp; tp++)
+ if (*tp++ == *cp)
+ break;
+ if (*tp)
+ fprintf(fd, "\\%c", *tp);
+ else
+ fprintf(fd, "\\%03o", *cp & 0xff);
+ }
}
-void
-_TIFFprintAsciiTag(FILE* fd, const char* name, const char* value)
+void _TIFFprintAsciiTag(FILE *fd, const char *name, const char *value)
{
- fprintf(fd, " %s: \"", name);
- _TIFFprintAscii(fd, value);
- fprintf(fd, "\"\n");
+ fprintf(fd, " %s: \"", name);
+ _TIFFprintAscii(fd, value);
+ fprintf(fd, "\"\n");
}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_read.c b/src/3rdparty/libtiff/libtiff/tif_read.c
index 527fadd..4fec839 100644
--- a/src/3rdparty/libtiff/libtiff/tif_read.c
+++ b/src/3rdparty/libtiff/libtiff/tif_read.c
@@ -2,23 +2,23 @@
* Copyright (c) 1988-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -29,292 +29,273 @@
#include "tiffiop.h"
#include <stdio.h>
-int TIFFFillStrip(TIFF* tif, uint32 strip);
-int TIFFFillTile(TIFF* tif, uint32 tile);
-static int TIFFStartStrip(TIFF* tif, uint32 strip);
-static int TIFFStartTile(TIFF* tif, uint32 tile);
-static int TIFFCheckRead(TIFF*, int);
-static tmsize_t
-TIFFReadRawStrip1(TIFF* tif, uint32 strip, void* buf, tmsize_t size,const char* module);
-static tmsize_t
-TIFFReadRawTile1(TIFF* tif, uint32 tile, void* buf, tmsize_t size, const char* module);
+int TIFFFillStrip(TIFF *tif, uint32_t strip);
+int TIFFFillTile(TIFF *tif, uint32_t tile);
+static int TIFFStartStrip(TIFF *tif, uint32_t strip);
+static int TIFFStartTile(TIFF *tif, uint32_t tile);
+static int TIFFCheckRead(TIFF *, int);
+static tmsize_t TIFFReadRawStrip1(TIFF *tif, uint32_t strip, void *buf,
+ tmsize_t size, const char *module);
+static tmsize_t TIFFReadRawTile1(TIFF *tif, uint32_t tile, void *buf,
+ tmsize_t size, const char *module);
-#define NOSTRIP ((uint32)(-1)) /* undefined state */
-#define NOTILE ((uint32)(-1)) /* undefined state */
+#define NOSTRIP ((uint32_t)(-1)) /* undefined state */
+#define NOTILE ((uint32_t)(-1)) /* undefined state */
#define INITIAL_THRESHOLD (1024 * 1024)
#define THRESHOLD_MULTIPLIER 10
-#define MAX_THRESHOLD (THRESHOLD_MULTIPLIER * THRESHOLD_MULTIPLIER * THRESHOLD_MULTIPLIER * INITIAL_THRESHOLD)
+#define MAX_THRESHOLD \
+ (THRESHOLD_MULTIPLIER * THRESHOLD_MULTIPLIER * THRESHOLD_MULTIPLIER * \
+ INITIAL_THRESHOLD)
-#define TIFF_INT64_MAX ((((int64)0x7FFFFFFF) << 32) | 0xFFFFFFFF)
+#define TIFF_INT64_MAX ((((int64_t)0x7FFFFFFF) << 32) | 0xFFFFFFFF)
/* Read 'size' bytes in tif_rawdata buffer starting at offset 'rawdata_offset'
* Returns 1 in case of success, 0 otherwise. */
-static int TIFFReadAndRealloc( TIFF* tif, tmsize_t size,
- tmsize_t rawdata_offset,
- int is_strip, uint32 strip_or_tile,
- const char* module )
+static int TIFFReadAndRealloc(TIFF *tif, tmsize_t size, tmsize_t rawdata_offset,
+ int is_strip, uint32_t strip_or_tile,
+ const char *module)
{
#if SIZEOF_SIZE_T == 8
- tmsize_t threshold = INITIAL_THRESHOLD;
+ tmsize_t threshold = INITIAL_THRESHOLD;
#endif
- tmsize_t already_read = 0;
-
+ tmsize_t already_read = 0;
#if SIZEOF_SIZE_T != 8
- /* On 32 bit processes, if the request is large enough, check against */
- /* file size */
- if( size > 1000 * 1000 * 1000 )
+ /* On 32 bit processes, if the request is large enough, check against */
+ /* file size */
+ if (size > 1000 * 1000 * 1000)
+ {
+ uint64_t filesize = TIFFGetFileSize(tif);
+ if ((uint64_t)size >= filesize)
{
- uint64 filesize = TIFFGetFileSize(tif);
- if( (uint64)size >= filesize )
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Chunk size requested is larger than file size.");
- return 0;
- }
+ TIFFErrorExtR(tif, module,
+ "Chunk size requested is larger than file size.");
+ return 0;
}
+ }
#endif
- /* On 64 bit processes, read first a maximum of 1 MB, then 10 MB, etc */
- /* so as to avoid allocating too much memory in case the file is too */
- /* short. We could ask for the file size, but this might be */
- /* expensive with some I/O layers (think of reading a gzipped file) */
- /* Restrict to 64 bit processes, so as to avoid reallocs() */
- /* on 32 bit processes where virtual memory is scarce. */
- while( already_read < size )
- {
- tmsize_t bytes_read;
- tmsize_t to_read = size - already_read;
+ /* On 64 bit processes, read first a maximum of 1 MB, then 10 MB, etc */
+ /* so as to avoid allocating too much memory in case the file is too */
+ /* short. We could ask for the file size, but this might be */
+ /* expensive with some I/O layers (think of reading a gzipped file) */
+ /* Restrict to 64 bit processes, so as to avoid reallocs() */
+ /* on 32 bit processes where virtual memory is scarce. */
+ while (already_read < size)
+ {
+ tmsize_t bytes_read;
+ tmsize_t to_read = size - already_read;
#if SIZEOF_SIZE_T == 8
- if( to_read >= threshold && threshold < MAX_THRESHOLD &&
- already_read + to_read + rawdata_offset > tif->tif_rawdatasize )
- {
- to_read = threshold;
- threshold *= THRESHOLD_MULTIPLIER;
- }
+ if (to_read >= threshold && threshold < MAX_THRESHOLD &&
+ already_read + to_read + rawdata_offset > tif->tif_rawdatasize)
+ {
+ to_read = threshold;
+ threshold *= THRESHOLD_MULTIPLIER;
+ }
#endif
- if (already_read + to_read + rawdata_offset > tif->tif_rawdatasize) {
- uint8* new_rawdata;
- assert((tif->tif_flags & TIFF_MYBUFFER) != 0);
- tif->tif_rawdatasize = (tmsize_t)TIFFroundup_64(
- (uint64)already_read + to_read + rawdata_offset, 1024);
- if (tif->tif_rawdatasize==0) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Invalid buffer size");
- return 0;
- }
- new_rawdata = (uint8*) _TIFFrealloc(
- tif->tif_rawdata, tif->tif_rawdatasize);
- if( new_rawdata == 0 )
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "No space for data buffer at scanline %lu",
- (unsigned long) tif->tif_row);
- _TIFFfree(tif->tif_rawdata);
- tif->tif_rawdata = 0;
- tif->tif_rawdatasize = 0;
- return 0;
- }
- tif->tif_rawdata = new_rawdata;
+ if (already_read + to_read + rawdata_offset > tif->tif_rawdatasize)
+ {
+ uint8_t *new_rawdata;
+ assert((tif->tif_flags & TIFF_MYBUFFER) != 0);
+ tif->tif_rawdatasize = (tmsize_t)TIFFroundup_64(
+ (uint64_t)already_read + to_read + rawdata_offset, 1024);
+ if (tif->tif_rawdatasize == 0)
+ {
+ TIFFErrorExtR(tif, module, "Invalid buffer size");
+ return 0;
}
- if( tif->tif_rawdata == NULL )
+ new_rawdata =
+ (uint8_t *)_TIFFrealloc(tif->tif_rawdata, tif->tif_rawdatasize);
+ if (new_rawdata == 0)
{
- /* should not happen in practice but helps CoverityScan */
+ TIFFErrorExtR(tif, module,
+ "No space for data buffer at scanline %" PRIu32,
+ tif->tif_row);
+ _TIFFfreeExt(tif, tif->tif_rawdata);
+ tif->tif_rawdata = 0;
+ tif->tif_rawdatasize = 0;
return 0;
}
+ tif->tif_rawdata = new_rawdata;
+ }
+ if (tif->tif_rawdata == NULL)
+ {
+ /* should not happen in practice but helps CoverityScan */
+ return 0;
+ }
- bytes_read = TIFFReadFile(tif,
- tif->tif_rawdata + rawdata_offset + already_read, to_read);
- already_read += bytes_read;
- if (bytes_read != to_read) {
- memset( tif->tif_rawdata + rawdata_offset + already_read, 0,
- tif->tif_rawdatasize - rawdata_offset - already_read );
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- if( is_strip )
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Read error at scanline %lu; got %I64u bytes, "
- "expected %I64u",
- (unsigned long) tif->tif_row,
- (unsigned __int64) already_read,
- (unsigned __int64) size);
- }
- else
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Read error at row %lu, col %lu, tile %lu; "
- "got %I64u bytes, expected %I64u",
- (unsigned long) tif->tif_row,
- (unsigned long) tif->tif_col,
- (unsigned long) strip_or_tile,
- (unsigned __int64) already_read,
- (unsigned __int64) size);
- }
-#else
- if( is_strip )
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Read error at scanline %lu; got %llu bytes, "
- "expected %llu",
- (unsigned long) tif->tif_row,
- (unsigned long long) already_read,
- (unsigned long long) size);
- }
- else
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Read error at row %lu, col %lu, tile %lu; "
- "got %llu bytes, expected %llu",
- (unsigned long) tif->tif_row,
- (unsigned long) tif->tif_col,
- (unsigned long) strip_or_tile,
- (unsigned long long) already_read,
- (unsigned long long) size);
- }
-#endif
- return 0;
+ bytes_read = TIFFReadFile(
+ tif, tif->tif_rawdata + rawdata_offset + already_read, to_read);
+ already_read += bytes_read;
+ if (bytes_read != to_read)
+ {
+ memset(tif->tif_rawdata + rawdata_offset + already_read, 0,
+ tif->tif_rawdatasize - rawdata_offset - already_read);
+ if (is_strip)
+ {
+ TIFFErrorExtR(tif, module,
+ "Read error at scanline %" PRIu32
+ "; got %" TIFF_SSIZE_FORMAT " bytes, "
+ "expected %" TIFF_SSIZE_FORMAT,
+ tif->tif_row, already_read, size);
+ }
+ else
+ {
+ TIFFErrorExtR(tif, module,
+ "Read error at row %" PRIu32 ", col %" PRIu32
+ ", tile %" PRIu32 "; "
+ "got %" TIFF_SSIZE_FORMAT
+ " bytes, expected %" TIFF_SSIZE_FORMAT "",
+ tif->tif_row, tif->tif_col, strip_or_tile,
+ already_read, size);
}
+ return 0;
}
- return 1;
+ }
+ return 1;
}
-
-static int
-TIFFFillStripPartial( TIFF *tif, int strip, tmsize_t read_ahead, int restart )
+static int TIFFFillStripPartial(TIFF *tif, int strip, tmsize_t read_ahead,
+ int restart)
{
- static const char module[] = "TIFFFillStripPartial";
- register TIFFDirectory *td = &tif->tif_dir;
- tmsize_t unused_data;
- uint64 read_offset;
- tmsize_t to_read;
- tmsize_t read_ahead_mod;
- /* tmsize_t bytecountm; */
+ static const char module[] = "TIFFFillStripPartial";
+ register TIFFDirectory *td = &tif->tif_dir;
+ tmsize_t unused_data;
+ uint64_t read_offset;
+ tmsize_t to_read;
+ tmsize_t read_ahead_mod;
+ /* tmsize_t bytecountm; */
+
+ /*
+ * Expand raw data buffer, if needed, to hold data
+ * strip coming from file (perhaps should set upper
+ * bound on the size of a buffer we'll use?).
+ */
+
+ /* bytecountm=(tmsize_t) TIFFGetStrileByteCount(tif, strip); */
+
+ /* Not completely sure where the * 2 comes from, but probably for */
+ /* an exponentional growth strategy of tif_rawdatasize */
+ if (read_ahead < TIFF_TMSIZE_T_MAX / 2)
+ read_ahead_mod = read_ahead * 2;
+ else
+ read_ahead_mod = read_ahead;
+ if (read_ahead_mod > tif->tif_rawdatasize)
+ {
+ assert(restart);
- /*
- * Expand raw data buffer, if needed, to hold data
- * strip coming from file (perhaps should set upper
- * bound on the size of a buffer we'll use?).
- */
+ tif->tif_curstrip = NOSTRIP;
+ if ((tif->tif_flags & TIFF_MYBUFFER) == 0)
+ {
+ TIFFErrorExtR(tif, module,
+ "Data buffer too small to hold part of strip %d",
+ strip);
+ return (0);
+ }
+ }
- /* bytecountm=(tmsize_t) TIFFGetStrileByteCount(tif, strip); */
+ if (restart)
+ {
+ tif->tif_rawdataloaded = 0;
+ tif->tif_rawdataoff = 0;
+ }
- /* Not completely sure where the * 2 comes from, but probably for */
- /* an exponentional growth strategy of tif_rawdatasize */
- if( read_ahead < TIFF_TMSIZE_T_MAX / 2 )
- read_ahead_mod = read_ahead * 2;
- else
- read_ahead_mod = read_ahead;
- if (read_ahead_mod > tif->tif_rawdatasize) {
- assert( restart );
-
- tif->tif_curstrip = NOSTRIP;
- if ((tif->tif_flags & TIFF_MYBUFFER) == 0) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Data buffer too small to hold part of strip %lu",
- (unsigned long) strip);
- return (0);
- }
- }
+ /*
+ ** If we are reading more data, move any unused data to the
+ ** start of the buffer.
+ */
+ if (tif->tif_rawdataloaded > 0)
+ unused_data =
+ tif->tif_rawdataloaded - (tif->tif_rawcp - tif->tif_rawdata);
+ else
+ unused_data = 0;
- if( restart )
- {
- tif->tif_rawdataloaded = 0;
- tif->tif_rawdataoff = 0;
- }
+ if (unused_data > 0)
+ {
+ assert((tif->tif_flags & TIFF_BUFFERMMAP) == 0);
+ memmove(tif->tif_rawdata, tif->tif_rawcp, unused_data);
+ }
- /*
- ** If we are reading more data, move any unused data to the
- ** start of the buffer.
- */
- if( tif->tif_rawdataloaded > 0 )
- unused_data = tif->tif_rawdataloaded - (tif->tif_rawcp - tif->tif_rawdata);
- else
- unused_data = 0;
-
- if( unused_data > 0 )
- {
- assert((tif->tif_flags&TIFF_BUFFERMMAP)==0);
- memmove( tif->tif_rawdata, tif->tif_rawcp, unused_data );
- }
+ /*
+ ** Seek to the point in the file where more data should be read.
+ */
+ read_offset = TIFFGetStrileOffset(tif, strip) + tif->tif_rawdataoff +
+ tif->tif_rawdataloaded;
- /*
- ** Seek to the point in the file where more data should be read.
- */
- read_offset = TIFFGetStrileOffset(tif, strip)
- + tif->tif_rawdataoff + tif->tif_rawdataloaded;
-
- if (!SeekOK(tif, read_offset)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Seek error at scanline %lu, strip %lu",
- (unsigned long) tif->tif_row, (unsigned long) strip);
- return 0;
- }
+ if (!SeekOK(tif, read_offset))
+ {
+ TIFFErrorExtR(tif, module,
+ "Seek error at scanline %" PRIu32 ", strip %d",
+ tif->tif_row, strip);
+ return 0;
+ }
- /*
- ** How much do we want to read?
- */
- if( read_ahead_mod > tif->tif_rawdatasize )
- to_read = read_ahead_mod - unused_data;
- else
- to_read = tif->tif_rawdatasize - unused_data;
- if( (uint64) to_read > TIFFGetStrileByteCount(tif, strip)
- - tif->tif_rawdataoff - tif->tif_rawdataloaded )
- {
- to_read = (tmsize_t) TIFFGetStrileByteCount(tif, strip)
- - tif->tif_rawdataoff - tif->tif_rawdataloaded;
- }
+ /*
+ ** How much do we want to read?
+ */
+ if (read_ahead_mod > tif->tif_rawdatasize)
+ to_read = read_ahead_mod - unused_data;
+ else
+ to_read = tif->tif_rawdatasize - unused_data;
+ if ((uint64_t)to_read > TIFFGetStrileByteCount(tif, strip) -
+ tif->tif_rawdataoff - tif->tif_rawdataloaded)
+ {
+ to_read = (tmsize_t)TIFFGetStrileByteCount(tif, strip) -
+ tif->tif_rawdataoff - tif->tif_rawdataloaded;
+ }
- assert((tif->tif_flags&TIFF_BUFFERMMAP)==0);
- if( !TIFFReadAndRealloc( tif, to_read, unused_data,
- 1, /* is_strip */
- 0, /* strip_or_tile */
- module) )
- {
- return 0;
- }
+ assert((tif->tif_flags & TIFF_BUFFERMMAP) == 0);
+ if (!TIFFReadAndRealloc(tif, to_read, unused_data, 1, /* is_strip */
+ 0, /* strip_or_tile */
+ module))
+ {
+ return 0;
+ }
- tif->tif_rawdataoff = tif->tif_rawdataoff + tif->tif_rawdataloaded - unused_data ;
- tif->tif_rawdataloaded = unused_data + to_read;
+ tif->tif_rawdataoff =
+ tif->tif_rawdataoff + tif->tif_rawdataloaded - unused_data;
+ tif->tif_rawdataloaded = unused_data + to_read;
- tif->tif_rawcc = tif->tif_rawdataloaded;
- tif->tif_rawcp = tif->tif_rawdata;
-
- if (!isFillOrder(tif, td->td_fillorder) &&
- (tif->tif_flags & TIFF_NOBITREV) == 0) {
- assert((tif->tif_flags&TIFF_BUFFERMMAP)==0);
- TIFFReverseBits(tif->tif_rawdata + unused_data, to_read );
- }
+ tif->tif_rawcc = tif->tif_rawdataloaded;
+ tif->tif_rawcp = tif->tif_rawdata;
- /*
- ** When starting a strip from the beginning we need to
- ** restart the decoder.
- */
- if( restart )
- {
+ if (!isFillOrder(tif, td->td_fillorder) &&
+ (tif->tif_flags & TIFF_NOBITREV) == 0)
+ {
+ assert((tif->tif_flags & TIFF_BUFFERMMAP) == 0);
+ TIFFReverseBits(tif->tif_rawdata + unused_data, to_read);
+ }
+
+ /*
+ ** When starting a strip from the beginning we need to
+ ** restart the decoder.
+ */
+ if (restart)
+ {
#ifdef JPEG_SUPPORT
- /* A bit messy since breaks the codec abstraction. Ultimately */
- /* there should be a function pointer for that, but it seems */
- /* only JPEG is affected. */
- /* For JPEG, if there are multiple scans (can generally be known */
- /* with the read_ahead used), we need to read the whole strip */
- if( tif->tif_dir.td_compression==COMPRESSION_JPEG &&
- (uint64)tif->tif_rawcc < TIFFGetStrileByteCount(tif, strip) )
+ /* A bit messy since breaks the codec abstraction. Ultimately */
+ /* there should be a function pointer for that, but it seems */
+ /* only JPEG is affected. */
+ /* For JPEG, if there are multiple scans (can generally be known */
+ /* with the read_ahead used), we need to read the whole strip */
+ if (tif->tif_dir.td_compression == COMPRESSION_JPEG &&
+ (uint64_t)tif->tif_rawcc < TIFFGetStrileByteCount(tif, strip))
+ {
+ if (TIFFJPEGIsFullStripRequired(tif))
{
- if( TIFFJPEGIsFullStripRequired(tif) )
- {
- return TIFFFillStrip(tif, strip);
- }
+ return TIFFFillStrip(tif, strip);
}
+ }
#endif
- return TIFFStartStrip(tif, strip);
- }
- else
- {
- return 1;
- }
+ return TIFFStartStrip(tif, strip);
+ }
+ else
+ {
+ return 1;
+ }
}
/*
@@ -325,159 +306,165 @@ TIFFFillStripPartial( TIFF *tif, int strip, tmsize_t read_ahead, int restart )
* and avoid reading the whole compressed raw data for big
* strips.
*/
-static int
-TIFFSeek(TIFF* tif, uint32 row, uint16 sample )
+static int TIFFSeek(TIFF *tif, uint32_t row, uint16_t sample)
{
- register TIFFDirectory *td = &tif->tif_dir;
- uint32 strip;
- int whole_strip;
- tmsize_t read_ahead = 0;
-
- /*
- ** Establish what strip we are working from.
- */
- if (row >= td->td_imagelength) { /* out of range */
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "%lu: Row out of range, max %lu",
- (unsigned long) row,
- (unsigned long) td->td_imagelength);
- return (0);
- }
- if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
- if (sample >= td->td_samplesperpixel) {
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "%lu: Sample out of range, max %lu",
- (unsigned long) sample, (unsigned long) td->td_samplesperpixel);
- return (0);
- }
- strip = (uint32)sample*td->td_stripsperimage + row/td->td_rowsperstrip;
- } else
- strip = row / td->td_rowsperstrip;
+ register TIFFDirectory *td = &tif->tif_dir;
+ uint32_t strip;
+ int whole_strip;
+ tmsize_t read_ahead = 0;
+
+ /*
+ ** Establish what strip we are working from.
+ */
+ if (row >= td->td_imagelength)
+ { /* out of range */
+ TIFFErrorExtR(tif, tif->tif_name,
+ "%" PRIu32 ": Row out of range, max %" PRIu32 "", row,
+ td->td_imagelength);
+ return (0);
+ }
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
+ {
+ if (sample >= td->td_samplesperpixel)
+ {
+ TIFFErrorExtR(tif, tif->tif_name,
+ "%" PRIu16 ": Sample out of range, max %" PRIu16 "",
+ sample, td->td_samplesperpixel);
+ return (0);
+ }
+ strip = (uint32_t)sample * td->td_stripsperimage +
+ row / td->td_rowsperstrip;
+ }
+ else
+ strip = row / td->td_rowsperstrip;
/*
* Do we want to treat this strip as one whole chunk or
* read it a few lines at a time?
*/
#if defined(CHUNKY_STRIP_READ_SUPPORT)
- whole_strip = TIFFGetStrileByteCount(tif, strip) < 10
- || isMapped(tif);
- if( td->td_compression == COMPRESSION_LERC ||
- td->td_compression == COMPRESSION_JBIG )
- {
- /* Ideally plugins should have a way to declare they don't support
- * chunk strip */
- whole_strip = 1;
- }
-#else
+ whole_strip = TIFFGetStrileByteCount(tif, strip) < 10 || isMapped(tif);
+ if (td->td_compression == COMPRESSION_LERC ||
+ td->td_compression == COMPRESSION_JBIG)
+ {
+ /* Ideally plugins should have a way to declare they don't support
+ * chunk strip */
whole_strip = 1;
+ }
+#else
+ whole_strip = 1;
#endif
-
- if( !whole_strip )
+
+ if (!whole_strip)
+ {
+ /* 16 is for YCbCr mode where we may need to read 16 */
+ /* lines at a time to get a decompressed line, and 5000 */
+ /* is some constant value, for example for JPEG tables */
+ if (tif->tif_scanlinesize < TIFF_TMSIZE_T_MAX / 16 &&
+ tif->tif_scanlinesize * 16 < TIFF_TMSIZE_T_MAX - 5000)
{
- /* 16 is for YCbCr mode where we may need to read 16 */
- /* lines at a time to get a decompressed line, and 5000 */
- /* is some constant value, for example for JPEG tables */
- if( tif->tif_scanlinesize < TIFF_TMSIZE_T_MAX / 16 &&
- tif->tif_scanlinesize * 16 < TIFF_TMSIZE_T_MAX - 5000 )
- {
- read_ahead = tif->tif_scanlinesize * 16 + 5000;
- }
- else
- {
- read_ahead = tif->tif_scanlinesize;
- }
+ read_ahead = tif->tif_scanlinesize * 16 + 5000;
+ }
+ else
+ {
+ read_ahead = tif->tif_scanlinesize;
+ }
+ }
+
+ /*
+ * If we haven't loaded this strip, do so now, possibly
+ * only reading the first part.
+ */
+ if (strip != tif->tif_curstrip)
+ { /* different strip, refill */
+
+ if (whole_strip)
+ {
+ if (!TIFFFillStrip(tif, strip))
+ return (0);
+ }
+ else
+ {
+ if (!TIFFFillStripPartial(tif, strip, read_ahead, 1))
+ return 0;
}
+ }
+ /*
+ ** If we already have some data loaded, do we need to read some more?
+ */
+ else if (!whole_strip)
+ {
+ if (((tif->tif_rawdata + tif->tif_rawdataloaded) - tif->tif_rawcp) <
+ read_ahead &&
+ (uint64_t)tif->tif_rawdataoff + tif->tif_rawdataloaded <
+ TIFFGetStrileByteCount(tif, strip))
+ {
+ if (!TIFFFillStripPartial(tif, strip, read_ahead, 0))
+ return 0;
+ }
+ }
+
+ if (row < tif->tif_row)
+ {
/*
- * If we haven't loaded this strip, do so now, possibly
- * only reading the first part.
+ * Moving backwards within the same strip: backup
+ * to the start and then decode forward (below).
+ *
+ * NB: If you're planning on lots of random access within a
+ * strip, it's better to just read and decode the entire
+ * strip, and then access the decoded data in a random fashion.
*/
- if (strip != tif->tif_curstrip) { /* different strip, refill */
-
- if( whole_strip )
- {
- if (!TIFFFillStrip(tif, strip))
- return (0);
- }
- else
- {
- if( !TIFFFillStripPartial(tif,strip,read_ahead,1) )
- return 0;
- }
- }
- /*
- ** If we already have some data loaded, do we need to read some more?
- */
- else if( !whole_strip )
+ if (tif->tif_rawdataoff != 0)
{
- if( ((tif->tif_rawdata + tif->tif_rawdataloaded) - tif->tif_rawcp) < read_ahead
- && (uint64) tif->tif_rawdataoff+tif->tif_rawdataloaded < TIFFGetStrileByteCount(tif, strip) )
- {
- if( !TIFFFillStripPartial(tif,strip,read_ahead,0) )
- return 0;
- }
+ if (!TIFFFillStripPartial(tif, strip, read_ahead, 1))
+ return 0;
}
+ else
+ {
+ if (!TIFFStartStrip(tif, strip))
+ return (0);
+ }
+ }
- if (row < tif->tif_row) {
- /*
- * Moving backwards within the same strip: backup
- * to the start and then decode forward (below).
- *
- * NB: If you're planning on lots of random access within a
- * strip, it's better to just read and decode the entire
- * strip, and then access the decoded data in a random fashion.
- */
-
- if( tif->tif_rawdataoff != 0 )
- {
- if( !TIFFFillStripPartial(tif,strip,read_ahead,1) )
- return 0;
- }
- else
- {
- if (!TIFFStartStrip(tif, strip))
- return (0);
- }
- }
-
- if (row != tif->tif_row) {
- /*
- * Seek forward to the desired row.
- */
-
- /* TODO: Will this really work with partial buffers? */
-
- if (!(*tif->tif_seek)(tif, row - tif->tif_row))
- return (0);
- tif->tif_row = row;
- }
-
- return (1);
+ if (row != tif->tif_row)
+ {
+ /*
+ * Seek forward to the desired row.
+ */
+
+ /* TODO: Will this really work with partial buffers? */
+
+ if (!(*tif->tif_seek)(tif, row - tif->tif_row))
+ return (0);
+ tif->tif_row = row;
+ }
+
+ return (1);
}
-int
-TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample)
+int TIFFReadScanline(TIFF *tif, void *buf, uint32_t row, uint16_t sample)
{
- int e;
-
- if (!TIFFCheckRead(tif, 0))
- return (-1);
- if( (e = TIFFSeek(tif, row, sample)) != 0) {
- /*
- * Decompress desired row into user buffer.
- */
- e = (*tif->tif_decoderow)
- (tif, (uint8*) buf, tif->tif_scanlinesize, sample);
-
- /* we are now poised at the beginning of the next row */
- tif->tif_row = row + 1;
-
- if (e)
- (*tif->tif_postdecode)(tif, (uint8*) buf,
- tif->tif_scanlinesize);
- }
- return (e > 0 ? 1 : -1);
+ int e;
+
+ if (!TIFFCheckRead(tif, 0))
+ return (-1);
+ if ((e = TIFFSeek(tif, row, sample)) != 0)
+ {
+ /*
+ * Decompress desired row into user buffer.
+ */
+ e = (*tif->tif_decoderow)(tif, (uint8_t *)buf, tif->tif_scanlinesize,
+ sample);
+
+ /* we are now poised at the beginning of the next row */
+ tif->tif_row = row + 1;
+
+ if (e)
+ (*tif->tif_postdecode)(tif, (uint8_t *)buf, tif->tif_scanlinesize);
+ }
+ return (e > 0 ? 1 : -1);
}
/*
@@ -485,471 +472,436 @@ TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample)
* rows in the strip (check for truncated last strip on any
* of the separations).
*/
-static tmsize_t TIFFReadEncodedStripGetStripSize(TIFF* tif, uint32 strip, uint16* pplane)
+static tmsize_t TIFFReadEncodedStripGetStripSize(TIFF *tif, uint32_t strip,
+ uint16_t *pplane)
{
- static const char module[] = "TIFFReadEncodedStrip";
- TIFFDirectory *td = &tif->tif_dir;
- uint32 rowsperstrip;
- uint32 stripsperplane;
- uint32 stripinplane;
- uint32 rows;
- tmsize_t stripsize;
- if (!TIFFCheckRead(tif,0))
- return((tmsize_t)(-1));
- if (strip>=td->td_nstrips)
- {
- TIFFErrorExt(tif->tif_clientdata,module,
- "%lu: Strip out of range, max %lu",(unsigned long)strip,
- (unsigned long)td->td_nstrips);
- return((tmsize_t)(-1));
- }
-
- rowsperstrip=td->td_rowsperstrip;
- if (rowsperstrip>td->td_imagelength)
- rowsperstrip=td->td_imagelength;
- stripsperplane= TIFFhowmany_32_maxuint_compat(td->td_imagelength, rowsperstrip);
- stripinplane=(strip%stripsperplane);
- if( pplane ) *pplane=(uint16)(strip/stripsperplane);
- rows=td->td_imagelength-stripinplane*rowsperstrip;
- if (rows>rowsperstrip)
- rows=rowsperstrip;
- stripsize=TIFFVStripSize(tif,rows);
- if (stripsize==0)
- return((tmsize_t)(-1));
- return stripsize;
+ static const char module[] = "TIFFReadEncodedStrip";
+ TIFFDirectory *td = &tif->tif_dir;
+ uint32_t rowsperstrip;
+ uint32_t stripsperplane;
+ uint32_t stripinplane;
+ uint32_t rows;
+ tmsize_t stripsize;
+ if (!TIFFCheckRead(tif, 0))
+ return ((tmsize_t)(-1));
+ if (strip >= td->td_nstrips)
+ {
+ TIFFErrorExtR(tif, module,
+ "%" PRIu32 ": Strip out of range, max %" PRIu32, strip,
+ td->td_nstrips);
+ return ((tmsize_t)(-1));
+ }
+
+ rowsperstrip = td->td_rowsperstrip;
+ if (rowsperstrip > td->td_imagelength)
+ rowsperstrip = td->td_imagelength;
+ stripsperplane =
+ TIFFhowmany_32_maxuint_compat(td->td_imagelength, rowsperstrip);
+ stripinplane = (strip % stripsperplane);
+ if (pplane)
+ *pplane = (uint16_t)(strip / stripsperplane);
+ rows = td->td_imagelength - stripinplane * rowsperstrip;
+ if (rows > rowsperstrip)
+ rows = rowsperstrip;
+ stripsize = TIFFVStripSize(tif, rows);
+ if (stripsize == 0)
+ return ((tmsize_t)(-1));
+ return stripsize;
}
/*
* Read a strip of data and decompress the specified
* amount into the user-supplied buffer.
*/
-tmsize_t
-TIFFReadEncodedStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size)
+tmsize_t TIFFReadEncodedStrip(TIFF *tif, uint32_t strip, void *buf,
+ tmsize_t size)
{
- static const char module[] = "TIFFReadEncodedStrip";
- TIFFDirectory *td = &tif->tif_dir;
- tmsize_t stripsize;
- uint16 plane;
+ static const char module[] = "TIFFReadEncodedStrip";
+ TIFFDirectory *td = &tif->tif_dir;
+ tmsize_t stripsize;
+ uint16_t plane;
- stripsize=TIFFReadEncodedStripGetStripSize(tif, strip, &plane);
- if (stripsize==((tmsize_t)(-1)))
- return((tmsize_t)(-1));
+ stripsize = TIFFReadEncodedStripGetStripSize(tif, strip, &plane);
+ if (stripsize == ((tmsize_t)(-1)))
+ return ((tmsize_t)(-1));
/* shortcut to avoid an extra memcpy() */
- if( td->td_compression == COMPRESSION_NONE &&
- size!=(tmsize_t)(-1) && size >= stripsize &&
- !isMapped(tif) &&
- ((tif->tif_flags&TIFF_NOREADRAW)==0) )
+ if (td->td_compression == COMPRESSION_NONE && size != (tmsize_t)(-1) &&
+ size >= stripsize && !isMapped(tif) &&
+ ((tif->tif_flags & TIFF_NOREADRAW) == 0))
{
if (TIFFReadRawStrip1(tif, strip, buf, stripsize, module) != stripsize)
return ((tmsize_t)(-1));
if (!isFillOrder(tif, td->td_fillorder) &&
(tif->tif_flags & TIFF_NOBITREV) == 0)
- TIFFReverseBits(buf,stripsize);
+ TIFFReverseBits(buf, stripsize);
- (*tif->tif_postdecode)(tif,buf,stripsize);
+ (*tif->tif_postdecode)(tif, buf, stripsize);
return (stripsize);
}
- if ((size!=(tmsize_t)(-1))&&(size<stripsize))
- stripsize=size;
- if (!TIFFFillStrip(tif,strip))
- return((tmsize_t)(-1));
- if ((*tif->tif_decodestrip)(tif,buf,stripsize,plane)<=0)
- return((tmsize_t)(-1));
- (*tif->tif_postdecode)(tif,buf,stripsize);
- return(stripsize);
+ if ((size != (tmsize_t)(-1)) && (size < stripsize))
+ stripsize = size;
+ if (!TIFFFillStrip(tif, strip))
+ return ((tmsize_t)(-1));
+ if ((*tif->tif_decodestrip)(tif, buf, stripsize, plane) <= 0)
+ return ((tmsize_t)(-1));
+ (*tif->tif_postdecode)(tif, buf, stripsize);
+ return (stripsize);
}
-/* Variant of TIFFReadEncodedStrip() that does
- * * if *buf == NULL, *buf = _TIFFmalloc(bufsizetoalloc) only after TIFFFillStrip() has
- * succeeded. This avoid excessive memory allocation in case of truncated
- * file.
+/* Variant of TIFFReadEncodedStrip() that does
+ * * if *buf == NULL, *buf = _TIFFmallocExt(tif, bufsizetoalloc) only after
+ * TIFFFillStrip() has succeeded. This avoid excessive memory allocation in case
+ * of truncated file.
* * calls regular TIFFReadEncodedStrip() if *buf != NULL
*/
-tmsize_t
-_TIFFReadEncodedStripAndAllocBuffer(TIFF* tif, uint32 strip,
- void **buf, tmsize_t bufsizetoalloc,
- tmsize_t size_to_read)
+tmsize_t _TIFFReadEncodedStripAndAllocBuffer(TIFF *tif, uint32_t strip,
+ void **buf,
+ tmsize_t bufsizetoalloc,
+ tmsize_t size_to_read)
{
tmsize_t this_stripsize;
- uint16 plane;
+ uint16_t plane;
- if( *buf != NULL )
+ if (*buf != NULL)
{
return TIFFReadEncodedStrip(tif, strip, *buf, size_to_read);
}
- this_stripsize=TIFFReadEncodedStripGetStripSize(tif, strip, &plane);
- if (this_stripsize==((tmsize_t)(-1)))
- return((tmsize_t)(-1));
+ this_stripsize = TIFFReadEncodedStripGetStripSize(tif, strip, &plane);
+ if (this_stripsize == ((tmsize_t)(-1)))
+ return ((tmsize_t)(-1));
- if ((size_to_read!=(tmsize_t)(-1))&&(size_to_read<this_stripsize))
- this_stripsize=size_to_read;
- if (!TIFFFillStrip(tif,strip))
- return((tmsize_t)(-1));
+ if ((size_to_read != (tmsize_t)(-1)) && (size_to_read < this_stripsize))
+ this_stripsize = size_to_read;
+ if (!TIFFFillStrip(tif, strip))
+ return ((tmsize_t)(-1));
- *buf = _TIFFmalloc(bufsizetoalloc);
- if (*buf == NULL) {
- TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "No space for strip buffer");
- return((tmsize_t)(-1));
+ *buf = _TIFFmallocExt(tif, bufsizetoalloc);
+ if (*buf == NULL)
+ {
+ TIFFErrorExtR(tif, TIFFFileName(tif), "No space for strip buffer");
+ return ((tmsize_t)(-1));
}
_TIFFmemset(*buf, 0, bufsizetoalloc);
- if ((*tif->tif_decodestrip)(tif,*buf,this_stripsize,plane)<=0)
- return((tmsize_t)(-1));
- (*tif->tif_postdecode)(tif,*buf,this_stripsize);
- return(this_stripsize);
-
-
-}
-
-static tmsize_t
-TIFFReadRawStrip1(TIFF* tif, uint32 strip, void* buf, tmsize_t size,
- const char* module)
-{
- assert((tif->tif_flags&TIFF_NOREADRAW)==0);
- if (!isMapped(tif)) {
- tmsize_t cc;
-
- if (!SeekOK(tif, TIFFGetStrileOffset(tif, strip))) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Seek error at scanline %lu, strip %lu",
- (unsigned long) tif->tif_row, (unsigned long) strip);
- return ((tmsize_t)(-1));
- }
- cc = TIFFReadFile(tif, buf, size);
- if (cc != size) {
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- TIFFErrorExt(tif->tif_clientdata, module,
- "Read error at scanline %lu; got %I64u bytes, expected %I64u",
- (unsigned long) tif->tif_row,
- (unsigned __int64) cc,
- (unsigned __int64) size);
-#else
- TIFFErrorExt(tif->tif_clientdata, module,
- "Read error at scanline %lu; got %llu bytes, expected %llu",
- (unsigned long) tif->tif_row,
- (unsigned long long) cc,
- (unsigned long long) size);
-#endif
- return ((tmsize_t)(-1));
- }
- } else {
- tmsize_t ma = 0;
- tmsize_t n;
- if ((TIFFGetStrileOffset(tif, strip) > (uint64)TIFF_TMSIZE_T_MAX)||
- ((ma=(tmsize_t)TIFFGetStrileOffset(tif, strip))>tif->tif_size))
- {
- n=0;
- }
- else if( ma > TIFF_TMSIZE_T_MAX - size )
- {
- n=0;
- }
- else
- {
- tmsize_t mb=ma+size;
- if (mb>tif->tif_size)
- n=tif->tif_size-ma;
- else
- n=size;
- }
- if (n!=size) {
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- TIFFErrorExt(tif->tif_clientdata, module,
- "Read error at scanline %lu, strip %lu; got %I64u bytes, expected %I64u",
- (unsigned long) tif->tif_row,
- (unsigned long) strip,
- (unsigned __int64) n,
- (unsigned __int64) size);
-#else
- TIFFErrorExt(tif->tif_clientdata, module,
- "Read error at scanline %lu, strip %lu; got %llu bytes, expected %llu",
- (unsigned long) tif->tif_row,
- (unsigned long) strip,
- (unsigned long long) n,
- (unsigned long long) size);
-#endif
- return ((tmsize_t)(-1));
- }
- _TIFFmemcpy(buf, tif->tif_base + ma,
- size);
- }
- return (size);
+ if ((*tif->tif_decodestrip)(tif, *buf, this_stripsize, plane) <= 0)
+ return ((tmsize_t)(-1));
+ (*tif->tif_postdecode)(tif, *buf, this_stripsize);
+ return (this_stripsize);
}
-static tmsize_t
-TIFFReadRawStripOrTile2(TIFF* tif, uint32 strip_or_tile, int is_strip,
- tmsize_t size, const char* module)
+static tmsize_t TIFFReadRawStrip1(TIFF *tif, uint32_t strip, void *buf,
+ tmsize_t size, const char *module)
{
- assert( !isMapped(tif) );
- assert((tif->tif_flags&TIFF_NOREADRAW)==0);
+ assert((tif->tif_flags & TIFF_NOREADRAW) == 0);
+ if (!isMapped(tif))
+ {
+ tmsize_t cc;
- if (!SeekOK(tif, TIFFGetStrileOffset(tif, strip_or_tile))) {
- if( is_strip )
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Seek error at scanline %lu, strip %lu",
- (unsigned long) tif->tif_row,
- (unsigned long) strip_or_tile);
- }
+ if (!SeekOK(tif, TIFFGetStrileOffset(tif, strip)))
+ {
+ TIFFErrorExtR(tif, module,
+ "Seek error at scanline %" PRIu32 ", strip %" PRIu32,
+ tif->tif_row, strip);
+ return ((tmsize_t)(-1));
+ }
+ cc = TIFFReadFile(tif, buf, size);
+ if (cc != size)
+ {
+ TIFFErrorExtR(tif, module,
+ "Read error at scanline %" PRIu32
+ "; got %" TIFF_SSIZE_FORMAT
+ " bytes, expected %" TIFF_SSIZE_FORMAT,
+ tif->tif_row, cc, size);
+ return ((tmsize_t)(-1));
+ }
+ }
+ else
+ {
+ tmsize_t ma = 0;
+ tmsize_t n;
+ if ((TIFFGetStrileOffset(tif, strip) > (uint64_t)TIFF_TMSIZE_T_MAX) ||
+ ((ma = (tmsize_t)TIFFGetStrileOffset(tif, strip)) > tif->tif_size))
+ {
+ n = 0;
+ }
+ else if (ma > TIFF_TMSIZE_T_MAX - size)
+ {
+ n = 0;
+ }
+ else
+ {
+ tmsize_t mb = ma + size;
+ if (mb > tif->tif_size)
+ n = tif->tif_size - ma;
else
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Seek error at row %lu, col %lu, tile %lu",
- (unsigned long) tif->tif_row,
- (unsigned long) tif->tif_col,
- (unsigned long) strip_or_tile);
- }
+ n = size;
+ }
+ if (n != size)
+ {
+ TIFFErrorExtR(tif, module,
+ "Read error at scanline %" PRIu32 ", strip %" PRIu32
+ "; got %" TIFF_SSIZE_FORMAT
+ " bytes, expected %" TIFF_SSIZE_FORMAT,
+ tif->tif_row, strip, n, size);
return ((tmsize_t)(-1));
}
+ _TIFFmemcpy(buf, tif->tif_base + ma, size);
+ }
+ return (size);
+}
+
+static tmsize_t TIFFReadRawStripOrTile2(TIFF *tif, uint32_t strip_or_tile,
+ int is_strip, tmsize_t size,
+ const char *module)
+{
+ assert(!isMapped(tif));
+ assert((tif->tif_flags & TIFF_NOREADRAW) == 0);
- if( !TIFFReadAndRealloc( tif, size, 0, is_strip,
- strip_or_tile, module ) )
+ if (!SeekOK(tif, TIFFGetStrileOffset(tif, strip_or_tile)))
+ {
+ if (is_strip)
{
- return ((tmsize_t)(-1));
+ TIFFErrorExtR(tif, module,
+ "Seek error at scanline %" PRIu32 ", strip %" PRIu32,
+ tif->tif_row, strip_or_tile);
+ }
+ else
+ {
+ TIFFErrorExtR(tif, module,
+ "Seek error at row %" PRIu32 ", col %" PRIu32
+ ", tile %" PRIu32,
+ tif->tif_row, tif->tif_col, strip_or_tile);
}
+ return ((tmsize_t)(-1));
+ }
- return (size);
+ if (!TIFFReadAndRealloc(tif, size, 0, is_strip, strip_or_tile, module))
+ {
+ return ((tmsize_t)(-1));
+ }
+
+ return (size);
}
/*
* Read a strip of data from the file.
*/
-tmsize_t
-TIFFReadRawStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size)
+tmsize_t TIFFReadRawStrip(TIFF *tif, uint32_t strip, void *buf, tmsize_t size)
{
- static const char module[] = "TIFFReadRawStrip";
- TIFFDirectory *td = &tif->tif_dir;
- uint64 bytecount64;
- tmsize_t bytecountm;
-
- if (!TIFFCheckRead(tif, 0))
- return ((tmsize_t)(-1));
- if (strip >= td->td_nstrips) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%lu: Strip out of range, max %lu",
- (unsigned long) strip,
- (unsigned long) td->td_nstrips);
- return ((tmsize_t)(-1));
- }
- if (tif->tif_flags&TIFF_NOREADRAW)
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Compression scheme does not support access to raw uncompressed data");
- return ((tmsize_t)(-1));
- }
- bytecount64 = TIFFGetStrileByteCount(tif, strip);
- if (size != (tmsize_t)(-1) && (uint64)size <= bytecount64)
- bytecountm = size;
- else
- bytecountm = _TIFFCastUInt64ToSSize(tif, bytecount64, module);
- if( bytecountm == 0 ) {
- return ((tmsize_t)(-1));
- }
- return (TIFFReadRawStrip1(tif, strip, buf, bytecountm, module));
+ static const char module[] = "TIFFReadRawStrip";
+ TIFFDirectory *td = &tif->tif_dir;
+ uint64_t bytecount64;
+ tmsize_t bytecountm;
+
+ if (!TIFFCheckRead(tif, 0))
+ return ((tmsize_t)(-1));
+ if (strip >= td->td_nstrips)
+ {
+ TIFFErrorExtR(tif, module,
+ "%" PRIu32 ": Strip out of range, max %" PRIu32, strip,
+ td->td_nstrips);
+ return ((tmsize_t)(-1));
+ }
+ if (tif->tif_flags & TIFF_NOREADRAW)
+ {
+ TIFFErrorExtR(tif, module,
+ "Compression scheme does not support access to raw "
+ "uncompressed data");
+ return ((tmsize_t)(-1));
+ }
+ bytecount64 = TIFFGetStrileByteCount(tif, strip);
+ if (size != (tmsize_t)(-1) && (uint64_t)size <= bytecount64)
+ bytecountm = size;
+ else
+ bytecountm = _TIFFCastUInt64ToSSize(tif, bytecount64, module);
+ if (bytecountm == 0)
+ {
+ return ((tmsize_t)(-1));
+ }
+ return (TIFFReadRawStrip1(tif, strip, buf, bytecountm, module));
}
TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
-static uint64 NoSantizeSubUInt64(uint64 a, uint64 b)
-{
- return a - b;
-}
+static uint64_t NoSanitizeSubUInt64(uint64_t a, uint64_t b) { return a - b; }
/*
* Read the specified strip and setup for decoding. The data buffer is
* expanded, as necessary, to hold the strip's data.
*/
-int
-TIFFFillStrip(TIFF* tif, uint32 strip)
+int TIFFFillStrip(TIFF *tif, uint32_t strip)
{
- static const char module[] = "TIFFFillStrip";
- TIFFDirectory *td = &tif->tif_dir;
-
- if ((tif->tif_flags&TIFF_NOREADRAW)==0)
- {
- uint64 bytecount = TIFFGetStrileByteCount(tif, strip);
- if( bytecount == 0 || bytecount > (uint64)TIFF_INT64_MAX ) {
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- TIFFErrorExt(tif->tif_clientdata, module,
- "Invalid strip byte count %I64u, strip %lu",
- (unsigned __int64) bytecount,
- (unsigned long) strip);
-#else
- TIFFErrorExt(tif->tif_clientdata, module,
- "Invalid strip byte count %llu, strip %lu",
- (unsigned long long) bytecount,
- (unsigned long) strip);
-#endif
- return (0);
- }
+ static const char module[] = "TIFFFillStrip";
+ TIFFDirectory *td = &tif->tif_dir;
+
+ if ((tif->tif_flags & TIFF_NOREADRAW) == 0)
+ {
+ uint64_t bytecount = TIFFGetStrileByteCount(tif, strip);
+ if (bytecount == 0 || bytecount > (uint64_t)TIFF_INT64_MAX)
+ {
+ TIFFErrorExtR(tif, module,
+ "Invalid strip byte count %" PRIu64
+ ", strip %" PRIu32,
+ bytecount, strip);
+ return (0);
+ }
+
+ /* To avoid excessive memory allocations: */
+ /* Byte count should normally not be larger than a number of */
+ /* times the uncompressed size plus some margin */
+ if (bytecount > 1024 * 1024)
+ {
+ /* 10 and 4096 are just values that could be adjusted. */
+ /* Hopefully they are safe enough for all codecs */
+ tmsize_t stripsize = TIFFStripSize(tif);
+ if (stripsize != 0 && (bytecount - 4096) / 10 > (uint64_t)stripsize)
+ {
+ uint64_t newbytecount = (uint64_t)stripsize * 10 + 4096;
+ TIFFErrorExtR(tif, module,
+ "Too large strip byte count %" PRIu64
+ ", strip %" PRIu32 ". Limiting to %" PRIu64,
+ bytecount, strip, newbytecount);
+ bytecount = newbytecount;
+ }
+ }
+
+ if (isMapped(tif))
+ {
+ /*
+ * We must check for overflow, potentially causing
+ * an OOB read. Instead of simple
+ *
+ * TIFFGetStrileOffset(tif, strip)+bytecount > tif->tif_size
+ *
+ * comparison (which can overflow) we do the following
+ * two comparisons:
+ */
+ if (bytecount > (uint64_t)tif->tif_size ||
+ TIFFGetStrileOffset(tif, strip) >
+ (uint64_t)tif->tif_size - bytecount)
+ {
+ /*
+ * This error message might seem strange, but
+ * it's what would happen if a read were done
+ * instead.
+ */
+ TIFFErrorExtR(
+ tif, module,
+
+ "Read error on strip %" PRIu32 "; "
+ "got %" PRIu64 " bytes, expected %" PRIu64,
+ strip,
+ NoSanitizeSubUInt64(tif->tif_size,
+ TIFFGetStrileOffset(tif, strip)),
+ bytecount);
+ tif->tif_curstrip = NOSTRIP;
+ return (0);
+ }
+ }
- /* To avoid excessive memory allocations: */
- /* Byte count should normally not be larger than a number of */
- /* times the uncompressed size plus some margin */
- if( bytecount > 1024 * 1024 )
+ if (isMapped(tif) && (isFillOrder(tif, td->td_fillorder) ||
+ (tif->tif_flags & TIFF_NOBITREV)))
+ {
+ /*
+ * The image is mapped into memory and we either don't
+ * need to flip bits or the compression routine is
+ * going to handle this operation itself. In this
+ * case, avoid copying the raw data and instead just
+ * reference the data from the memory mapped file
+ * image. This assumes that the decompression
+ * routines do not modify the contents of the raw data
+ * buffer (if they try to, the application will get a
+ * fault since the file is mapped read-only).
+ */
+ if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata)
+ {
+ _TIFFfreeExt(tif, tif->tif_rawdata);
+ tif->tif_rawdata = NULL;
+ tif->tif_rawdatasize = 0;
+ }
+ tif->tif_flags &= ~TIFF_MYBUFFER;
+ tif->tif_rawdatasize = (tmsize_t)bytecount;
+ tif->tif_rawdata =
+ tif->tif_base + (tmsize_t)TIFFGetStrileOffset(tif, strip);
+ tif->tif_rawdataoff = 0;
+ tif->tif_rawdataloaded = (tmsize_t)bytecount;
+
+ /*
+ * When we have tif_rawdata reference directly into the memory
+ * mapped file we need to be pretty careful about how we use the
+ * rawdata. It is not a general purpose working buffer as it
+ * normally otherwise is. So we keep track of this fact to avoid
+ * using it improperly.
+ */
+ tif->tif_flags |= TIFF_BUFFERMMAP;
+ }
+ else
+ {
+ /*
+ * Expand raw data buffer, if needed, to hold data
+ * strip coming from file (perhaps should set upper
+ * bound on the size of a buffer we'll use?).
+ */
+ tmsize_t bytecountm;
+ bytecountm = (tmsize_t)bytecount;
+ if ((uint64_t)bytecountm != bytecount)
+ {
+ TIFFErrorExtR(tif, module, "Integer overflow");
+ return (0);
+ }
+ if (bytecountm > tif->tif_rawdatasize)
+ {
+ tif->tif_curstrip = NOSTRIP;
+ if ((tif->tif_flags & TIFF_MYBUFFER) == 0)
{
- /* 10 and 4096 are just values that could be adjusted. */
- /* Hopefully they are safe enough for all codecs */
- tmsize_t stripsize = TIFFStripSize(tif);
- if( stripsize != 0 &&
- (bytecount - 4096) / 10 > (uint64)stripsize )
- {
- uint64 newbytecount = (uint64)stripsize * 10 + 4096;
- if( newbytecount == 0 || newbytecount > (uint64)TIFF_INT64_MAX )
- {
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- TIFFWarningExt(tif->tif_clientdata, module,
- "Too large strip byte count %I64u, strip %lu. Limiting to %I64u",
- (unsigned __int64) bytecount,
- (unsigned long) strip,
- (unsigned __int64) newbytecount);
-#else
- TIFFErrorExt(tif->tif_clientdata, module,
- "Too large strip byte count %llu, strip %lu. Limiting to %llu",
- (unsigned long long) bytecount,
- (unsigned long) strip,
- (unsigned long long) newbytecount);
-#endif
- bytecount = newbytecount;
- }
- }
- }
-
- if (isMapped(tif)) {
- /*
- * We must check for overflow, potentially causing
- * an OOB read. Instead of simple
- *
- * TIFFGetStrileOffset(tif, strip)+bytecount > tif->tif_size
- *
- * comparison (which can overflow) we do the following
- * two comparisons:
- */
- if (bytecount > (uint64)tif->tif_size ||
- TIFFGetStrileOffset(tif, strip) > (uint64)tif->tif_size - bytecount) {
- /*
- * This error message might seem strange, but
- * it's what would happen if a read were done
- * instead.
- */
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- TIFFErrorExt(tif->tif_clientdata, module,
-
- "Read error on strip %lu; "
- "got %I64u bytes, expected %I64u",
- (unsigned long) strip,
- (unsigned __int64) NoSantizeSubUInt64(tif->tif_size, TIFFGetStrileOffset(tif, strip)),
- (unsigned __int64) bytecount);
-#else
- TIFFErrorExt(tif->tif_clientdata, module,
+ TIFFErrorExtR(
+ tif, module,
+ "Data buffer too small to hold strip %" PRIu32, strip);
+ return (0);
+ }
+ }
+ if (tif->tif_flags & TIFF_BUFFERMMAP)
+ {
+ tif->tif_curstrip = NOSTRIP;
+ tif->tif_rawdata = NULL;
+ tif->tif_rawdatasize = 0;
+ tif->tif_flags &= ~TIFF_BUFFERMMAP;
+ }
- "Read error on strip %lu; "
- "got %llu bytes, expected %llu",
- (unsigned long) strip,
- (unsigned long long) NoSantizeSubUInt64(tif->tif_size, TIFFGetStrileOffset(tif, strip)),
- (unsigned long long) bytecount);
-#endif
- tif->tif_curstrip = NOSTRIP;
- return (0);
- }
- }
-
- if (isMapped(tif) &&
- (isFillOrder(tif, td->td_fillorder)
- || (tif->tif_flags & TIFF_NOBITREV))) {
- /*
- * The image is mapped into memory and we either don't
- * need to flip bits or the compression routine is
- * going to handle this operation itself. In this
- * case, avoid copying the raw data and instead just
- * reference the data from the memory mapped file
- * image. This assumes that the decompression
- * routines do not modify the contents of the raw data
- * buffer (if they try to, the application will get a
- * fault since the file is mapped read-only).
- */
- if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) {
- _TIFFfree(tif->tif_rawdata);
- tif->tif_rawdata = NULL;
- tif->tif_rawdatasize = 0;
- }
- tif->tif_flags &= ~TIFF_MYBUFFER;
- tif->tif_rawdatasize = (tmsize_t)bytecount;
- tif->tif_rawdata = tif->tif_base + (tmsize_t)TIFFGetStrileOffset(tif, strip);
- tif->tif_rawdataoff = 0;
- tif->tif_rawdataloaded = (tmsize_t) bytecount;
-
- /*
- * When we have tif_rawdata reference directly into the memory mapped file
- * we need to be pretty careful about how we use the rawdata. It is not
- * a general purpose working buffer as it normally otherwise is. So we
- * keep track of this fact to avoid using it improperly.
- */
- tif->tif_flags |= TIFF_BUFFERMMAP;
- } else {
- /*
- * Expand raw data buffer, if needed, to hold data
- * strip coming from file (perhaps should set upper
- * bound on the size of a buffer we'll use?).
- */
- tmsize_t bytecountm;
- bytecountm=(tmsize_t)bytecount;
- if ((uint64)bytecountm!=bytecount)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Integer overflow");
- return(0);
- }
- if (bytecountm > tif->tif_rawdatasize) {
- tif->tif_curstrip = NOSTRIP;
- if ((tif->tif_flags & TIFF_MYBUFFER) == 0) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Data buffer too small to hold strip %lu",
- (unsigned long) strip);
- return (0);
- }
- }
- if (tif->tif_flags&TIFF_BUFFERMMAP) {
- tif->tif_curstrip = NOSTRIP;
- tif->tif_rawdata = NULL;
- tif->tif_rawdatasize = 0;
- tif->tif_flags &= ~TIFF_BUFFERMMAP;
- }
-
- if( isMapped(tif) )
- {
- if (bytecountm > tif->tif_rawdatasize &&
- !TIFFReadBufferSetup(tif, 0, bytecountm))
- {
- return (0);
- }
- if (TIFFReadRawStrip1(tif, strip, tif->tif_rawdata,
- bytecountm, module) != bytecountm)
- {
- return (0);
- }
- }
- else
- {
- if (TIFFReadRawStripOrTile2(tif, strip, 1,
- bytecountm, module) != bytecountm)
- {
- return (0);
- }
- }
-
-
- tif->tif_rawdataoff = 0;
- tif->tif_rawdataloaded = bytecountm;
-
- if (!isFillOrder(tif, td->td_fillorder) &&
- (tif->tif_flags & TIFF_NOBITREV) == 0)
- TIFFReverseBits(tif->tif_rawdata, bytecountm);
+ if (isMapped(tif))
+ {
+ if (bytecountm > tif->tif_rawdatasize &&
+ !TIFFReadBufferSetup(tif, 0, bytecountm))
+ {
+ return (0);
}
- }
- return (TIFFStartStrip(tif, strip));
+ if (TIFFReadRawStrip1(tif, strip, tif->tif_rawdata, bytecountm,
+ module) != bytecountm)
+ {
+ return (0);
+ }
+ }
+ else
+ {
+ if (TIFFReadRawStripOrTile2(tif, strip, 1, bytecountm,
+ module) != bytecountm)
+ {
+ return (0);
+ }
+ }
+
+ tif->tif_rawdataoff = 0;
+ tif->tif_rawdataloaded = bytecountm;
+
+ if (!isFillOrder(tif, td->td_fillorder) &&
+ (tif->tif_flags & TIFF_NOBITREV) == 0)
+ TIFFReverseBits(tif->tif_rawdata, bytecountm);
+ }
+ }
+ return (TIFFStartStrip(tif, strip));
}
/*
@@ -961,120 +913,162 @@ TIFFFillStrip(TIFF* tif, uint32 strip)
* Read and decompress a tile of data. The
* tile is selected by the (x,y,z,s) coordinates.
*/
-tmsize_t
-TIFFReadTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s)
+tmsize_t TIFFReadTile(TIFF *tif, void *buf, uint32_t x, uint32_t y, uint32_t z,
+ uint16_t s)
{
- if (!TIFFCheckRead(tif, 1) || !TIFFCheckTile(tif, x, y, z, s))
- return ((tmsize_t)(-1));
- return (TIFFReadEncodedTile(tif,
- TIFFComputeTile(tif, x, y, z, s), buf, (tmsize_t)(-1)));
+ if (!TIFFCheckRead(tif, 1) || !TIFFCheckTile(tif, x, y, z, s))
+ return ((tmsize_t)(-1));
+ return (TIFFReadEncodedTile(tif, TIFFComputeTile(tif, x, y, z, s), buf,
+ (tmsize_t)(-1)));
}
/*
* Read a tile of data and decompress the specified
* amount into the user-supplied buffer.
*/
-tmsize_t
-TIFFReadEncodedTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size)
+tmsize_t TIFFReadEncodedTile(TIFF *tif, uint32_t tile, void *buf, tmsize_t size)
{
- static const char module[] = "TIFFReadEncodedTile";
- TIFFDirectory *td = &tif->tif_dir;
- tmsize_t tilesize = tif->tif_tilesize;
-
- if (!TIFFCheckRead(tif, 1))
- return ((tmsize_t)(-1));
- if (tile >= td->td_nstrips) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%lu: Tile out of range, max %lu",
- (unsigned long) tile, (unsigned long) td->td_nstrips);
- return ((tmsize_t)(-1));
- }
+ static const char module[] = "TIFFReadEncodedTile";
+ TIFFDirectory *td = &tif->tif_dir;
+ tmsize_t tilesize = tif->tif_tilesize;
+
+ if (!TIFFCheckRead(tif, 1))
+ return ((tmsize_t)(-1));
+ if (tile >= td->td_nstrips)
+ {
+ TIFFErrorExtR(tif, module,
+ "%" PRIu32 ": Tile out of range, max %" PRIu32, tile,
+ td->td_nstrips);
+ return ((tmsize_t)(-1));
+ }
/* shortcut to avoid an extra memcpy() */
- if( td->td_compression == COMPRESSION_NONE &&
- size!=(tmsize_t)(-1) && size >= tilesize &&
- !isMapped(tif) &&
- ((tif->tif_flags&TIFF_NOREADRAW)==0) )
+ if (td->td_compression == COMPRESSION_NONE && size != (tmsize_t)(-1) &&
+ size >= tilesize && !isMapped(tif) &&
+ ((tif->tif_flags & TIFF_NOREADRAW) == 0))
{
if (TIFFReadRawTile1(tif, tile, buf, tilesize, module) != tilesize)
return ((tmsize_t)(-1));
if (!isFillOrder(tif, td->td_fillorder) &&
(tif->tif_flags & TIFF_NOBITREV) == 0)
- TIFFReverseBits(buf,tilesize);
+ TIFFReverseBits(buf, tilesize);
- (*tif->tif_postdecode)(tif,buf,tilesize);
+ (*tif->tif_postdecode)(tif, buf, tilesize);
return (tilesize);
}
- if (size == (tmsize_t)(-1))
- size = tilesize;
- else if (size > tilesize)
- size = tilesize;
- if (TIFFFillTile(tif, tile) && (*tif->tif_decodetile)(tif,
- (uint8*) buf, size, (uint16)(tile/td->td_stripsperimage))) {
- (*tif->tif_postdecode)(tif, (uint8*) buf, size);
- return (size);
- } else
- return ((tmsize_t)(-1));
+ if (size == (tmsize_t)(-1))
+ size = tilesize;
+ else if (size > tilesize)
+ size = tilesize;
+ if (TIFFFillTile(tif, tile) &&
+ (*tif->tif_decodetile)(tif, (uint8_t *)buf, size,
+ (uint16_t)(tile / td->td_stripsperimage)))
+ {
+ (*tif->tif_postdecode)(tif, (uint8_t *)buf, size);
+ return (size);
+ }
+ else
+ return ((tmsize_t)(-1));
}
-/* Variant of TIFFReadTile() that does
- * * if *buf == NULL, *buf = _TIFFmalloc(bufsizetoalloc) only after TIFFFillTile() has
- * succeeded. This avoid excessive memory allocation in case of truncated
- * file.
+/* Variant of TIFFReadTile() that does
+ * * if *buf == NULL, *buf = _TIFFmallocExt(tif, bufsizetoalloc) only after
+ * TIFFFillTile() has succeeded. This avoid excessive memory allocation in case
+ * of truncated file.
* * calls regular TIFFReadEncodedTile() if *buf != NULL
*/
-tmsize_t
-_TIFFReadTileAndAllocBuffer(TIFF* tif,
- void **buf, tmsize_t bufsizetoalloc,
- uint32 x, uint32 y, uint32 z, uint16 s)
+tmsize_t _TIFFReadTileAndAllocBuffer(TIFF *tif, void **buf,
+ tmsize_t bufsizetoalloc, uint32_t x,
+ uint32_t y, uint32_t z, uint16_t s)
{
if (!TIFFCheckRead(tif, 1) || !TIFFCheckTile(tif, x, y, z, s))
- return ((tmsize_t)(-1));
- return (_TIFFReadEncodedTileAndAllocBuffer(tif,
- TIFFComputeTile(tif, x, y, z, s),
- buf, bufsizetoalloc,
- (tmsize_t)(-1)));
+ return ((tmsize_t)(-1));
+ return (_TIFFReadEncodedTileAndAllocBuffer(
+ tif, TIFFComputeTile(tif, x, y, z, s), buf, bufsizetoalloc,
+ (tmsize_t)(-1)));
}
-/* Variant of TIFFReadEncodedTile() that does
- * * if *buf == NULL, *buf = _TIFFmalloc(bufsizetoalloc) only after TIFFFillTile() has
- * succeeded. This avoid excessive memory allocation in case of truncated
- * file.
+/* Variant of TIFFReadEncodedTile() that does
+ * * if *buf == NULL, *buf = _TIFFmallocExt(tif, bufsizetoalloc) only after
+ * TIFFFillTile() has succeeded. This avoid excessive memory allocation in case
+ * of truncated file.
* * calls regular TIFFReadEncodedTile() if *buf != NULL
*/
-tmsize_t
-_TIFFReadEncodedTileAndAllocBuffer(TIFF* tif, uint32 tile,
- void **buf, tmsize_t bufsizetoalloc,
- tmsize_t size_to_read)
+tmsize_t _TIFFReadEncodedTileAndAllocBuffer(TIFF *tif, uint32_t tile,
+ void **buf, tmsize_t bufsizetoalloc,
+ tmsize_t size_to_read)
{
static const char module[] = "_TIFFReadEncodedTileAndAllocBuffer";
TIFFDirectory *td = &tif->tif_dir;
tmsize_t tilesize = tif->tif_tilesize;
- if( *buf != NULL )
+ if (*buf != NULL)
{
return TIFFReadEncodedTile(tif, tile, *buf, size_to_read);
}
if (!TIFFCheckRead(tif, 1))
+ return ((tmsize_t)(-1));
+ if (tile >= td->td_nstrips)
+ {
+ TIFFErrorExtR(tif, module,
+ "%" PRIu32 ": Tile out of range, max %" PRIu32, tile,
+ td->td_nstrips);
+ return ((tmsize_t)(-1));
+ }
+
+ if (!TIFFFillTile(tif, tile))
+ return ((tmsize_t)(-1));
+
+ /* Sanity checks to avoid excessive memory allocation */
+ /* Cf https://gitlab.com/libtiff/libtiff/-/issues/479 */
+ if (td->td_compression == COMPRESSION_NONE)
+ {
+ if (tif->tif_rawdatasize != tilesize)
+ {
+ TIFFErrorExtR(tif, TIFFFileName(tif),
+ "Invalid tile byte count for tile %u. "
+ "Expected %" PRIu64 ", got %" PRIu64,
+ tile, (uint64_t)tilesize,
+ (uint64_t)tif->tif_rawdatasize);
return ((tmsize_t)(-1));
- if (tile >= td->td_nstrips) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%lu: Tile out of range, max %lu",
- (unsigned long) tile, (unsigned long) td->td_nstrips);
+ }
+ }
+ else
+ {
+ /* Max compression ratio experimentally determined. Might be fragile...
+ * Only apply this heuristics to situations where the memory allocation
+ * would be big, to avoid breaking nominal use cases.
+ */
+ const int maxCompressionRatio =
+ td->td_compression == COMPRESSION_ZSTD ? 33000
+ : td->td_compression == COMPRESSION_JXL
+ ?
+ /* Evaluated on a 8000x8000 tile */
+ 25000 * (td->td_planarconfig == PLANARCONFIG_CONTIG
+ ? td->td_samplesperpixel
+ : 1)
+ : td->td_compression == COMPRESSION_LZMA ? 7000 : 1000;
+ if (bufsizetoalloc > 100 * 1000 * 1000 &&
+ tif->tif_rawdatasize < tilesize / maxCompressionRatio)
+ {
+ TIFFErrorExtR(tif, TIFFFileName(tif),
+ "Likely invalid tile byte count for tile %u. "
+ "Uncompressed tile size is %" PRIu64 ", "
+ "compressed one is %" PRIu64,
+ tile, (uint64_t)tilesize,
+ (uint64_t)tif->tif_rawdatasize);
return ((tmsize_t)(-1));
+ }
}
- if (!TIFFFillTile(tif,tile))
- return((tmsize_t)(-1));
-
- *buf = _TIFFmalloc(bufsizetoalloc);
- if (*buf == NULL) {
- TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif),
- "No space for tile buffer");
- return((tmsize_t)(-1));
+ *buf = _TIFFmallocExt(tif, bufsizetoalloc);
+ if (*buf == NULL)
+ {
+ TIFFErrorExtR(tif, TIFFFileName(tif), "No space for tile buffer");
+ return ((tmsize_t)(-1));
}
_TIFFmemset(*buf, 0, bufsizetoalloc);
@@ -1082,287 +1076,261 @@ _TIFFReadEncodedTileAndAllocBuffer(TIFF* tif, uint32 tile,
size_to_read = tilesize;
else if (size_to_read > tilesize)
size_to_read = tilesize;
- if( (*tif->tif_decodetile)(tif,
- (uint8*) *buf, size_to_read, (uint16)(tile/td->td_stripsperimage))) {
- (*tif->tif_postdecode)(tif, (uint8*) *buf, size_to_read);
+ if ((*tif->tif_decodetile)(tif, (uint8_t *)*buf, size_to_read,
+ (uint16_t)(tile / td->td_stripsperimage)))
+ {
+ (*tif->tif_postdecode)(tif, (uint8_t *)*buf, size_to_read);
return (size_to_read);
- } else
+ }
+ else
return ((tmsize_t)(-1));
}
-static tmsize_t
-TIFFReadRawTile1(TIFF* tif, uint32 tile, void* buf, tmsize_t size, const char* module)
+static tmsize_t TIFFReadRawTile1(TIFF *tif, uint32_t tile, void *buf,
+ tmsize_t size, const char *module)
{
- assert((tif->tif_flags&TIFF_NOREADRAW)==0);
- if (!isMapped(tif)) {
- tmsize_t cc;
-
- if (!SeekOK(tif, TIFFGetStrileOffset(tif, tile))) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Seek error at row %lu, col %lu, tile %lu",
- (unsigned long) tif->tif_row,
- (unsigned long) tif->tif_col,
- (unsigned long) tile);
- return ((tmsize_t)(-1));
- }
- cc = TIFFReadFile(tif, buf, size);
- if (cc != size) {
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- TIFFErrorExt(tif->tif_clientdata, module,
- "Read error at row %lu, col %lu; got %I64u bytes, expected %I64u",
- (unsigned long) tif->tif_row,
- (unsigned long) tif->tif_col,
- (unsigned __int64) cc,
- (unsigned __int64) size);
-#else
- TIFFErrorExt(tif->tif_clientdata, module,
- "Read error at row %lu, col %lu; got %llu bytes, expected %llu",
- (unsigned long) tif->tif_row,
- (unsigned long) tif->tif_col,
- (unsigned long long) cc,
- (unsigned long long) size);
-#endif
- return ((tmsize_t)(-1));
- }
- } else {
- tmsize_t ma,mb;
- tmsize_t n;
- ma=(tmsize_t)TIFFGetStrileOffset(tif, tile);
- mb=ma+size;
- if ((TIFFGetStrileOffset(tif, tile) > (uint64)TIFF_TMSIZE_T_MAX)||(ma>tif->tif_size))
- n=0;
- else if ((mb<ma)||(mb<size)||(mb>tif->tif_size))
- n=tif->tif_size-ma;
- else
- n=size;
- if (n!=size) {
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- TIFFErrorExt(tif->tif_clientdata, module,
-"Read error at row %lu, col %lu, tile %lu; got %I64u bytes, expected %I64u",
- (unsigned long) tif->tif_row,
- (unsigned long) tif->tif_col,
- (unsigned long) tile,
- (unsigned __int64) n,
- (unsigned __int64) size);
-#else
- TIFFErrorExt(tif->tif_clientdata, module,
-"Read error at row %lu, col %lu, tile %lu; got %llu bytes, expected %llu",
- (unsigned long) tif->tif_row,
- (unsigned long) tif->tif_col,
- (unsigned long) tile,
- (unsigned long long) n,
- (unsigned long long) size);
-#endif
- return ((tmsize_t)(-1));
- }
- _TIFFmemcpy(buf, tif->tif_base + ma, size);
- }
- return (size);
+ assert((tif->tif_flags & TIFF_NOREADRAW) == 0);
+ if (!isMapped(tif))
+ {
+ tmsize_t cc;
+
+ if (!SeekOK(tif, TIFFGetStrileOffset(tif, tile)))
+ {
+ TIFFErrorExtR(tif, module,
+ "Seek error at row %" PRIu32 ", col %" PRIu32
+ ", tile %" PRIu32,
+ tif->tif_row, tif->tif_col, tile);
+ return ((tmsize_t)(-1));
+ }
+ cc = TIFFReadFile(tif, buf, size);
+ if (cc != size)
+ {
+ TIFFErrorExtR(tif, module,
+ "Read error at row %" PRIu32 ", col %" PRIu32
+ "; got %" TIFF_SSIZE_FORMAT
+ " bytes, expected %" TIFF_SSIZE_FORMAT,
+ tif->tif_row, tif->tif_col, cc, size);
+ return ((tmsize_t)(-1));
+ }
+ }
+ else
+ {
+ tmsize_t ma, mb;
+ tmsize_t n;
+ ma = (tmsize_t)TIFFGetStrileOffset(tif, tile);
+ mb = ma + size;
+ if ((TIFFGetStrileOffset(tif, tile) > (uint64_t)TIFF_TMSIZE_T_MAX) ||
+ (ma > tif->tif_size))
+ n = 0;
+ else if ((mb < ma) || (mb < size) || (mb > tif->tif_size))
+ n = tif->tif_size - ma;
+ else
+ n = size;
+ if (n != size)
+ {
+ TIFFErrorExtR(tif, module,
+ "Read error at row %" PRIu32 ", col %" PRIu32
+ ", tile %" PRIu32 "; got %" TIFF_SSIZE_FORMAT
+ " bytes, expected %" TIFF_SSIZE_FORMAT,
+ tif->tif_row, tif->tif_col, tile, n, size);
+ return ((tmsize_t)(-1));
+ }
+ _TIFFmemcpy(buf, tif->tif_base + ma, size);
+ }
+ return (size);
}
/*
* Read a tile of data from the file.
*/
-tmsize_t
-TIFFReadRawTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size)
+tmsize_t TIFFReadRawTile(TIFF *tif, uint32_t tile, void *buf, tmsize_t size)
{
- static const char module[] = "TIFFReadRawTile";
- TIFFDirectory *td = &tif->tif_dir;
- uint64 bytecount64;
- tmsize_t bytecountm;
-
- if (!TIFFCheckRead(tif, 1))
- return ((tmsize_t)(-1));
- if (tile >= td->td_nstrips) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%lu: Tile out of range, max %lu",
- (unsigned long) tile, (unsigned long) td->td_nstrips);
- return ((tmsize_t)(-1));
- }
- if (tif->tif_flags&TIFF_NOREADRAW)
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Compression scheme does not support access to raw uncompressed data");
- return ((tmsize_t)(-1));
- }
- bytecount64 = TIFFGetStrileByteCount(tif, tile);
- if (size != (tmsize_t)(-1) && (uint64)size <= bytecount64)
- bytecountm = size;
- else
- bytecountm = _TIFFCastUInt64ToSSize(tif, bytecount64, module);
- if( bytecountm == 0 ) {
- return ((tmsize_t)(-1));
- }
- return (TIFFReadRawTile1(tif, tile, buf, bytecountm, module));
+ static const char module[] = "TIFFReadRawTile";
+ TIFFDirectory *td = &tif->tif_dir;
+ uint64_t bytecount64;
+ tmsize_t bytecountm;
+
+ if (!TIFFCheckRead(tif, 1))
+ return ((tmsize_t)(-1));
+ if (tile >= td->td_nstrips)
+ {
+ TIFFErrorExtR(tif, module,
+ "%" PRIu32 ": Tile out of range, max %" PRIu32, tile,
+ td->td_nstrips);
+ return ((tmsize_t)(-1));
+ }
+ if (tif->tif_flags & TIFF_NOREADRAW)
+ {
+ TIFFErrorExtR(tif, module,
+ "Compression scheme does not support access to raw "
+ "uncompressed data");
+ return ((tmsize_t)(-1));
+ }
+ bytecount64 = TIFFGetStrileByteCount(tif, tile);
+ if (size != (tmsize_t)(-1) && (uint64_t)size <= bytecount64)
+ bytecountm = size;
+ else
+ bytecountm = _TIFFCastUInt64ToSSize(tif, bytecount64, module);
+ if (bytecountm == 0)
+ {
+ return ((tmsize_t)(-1));
+ }
+ return (TIFFReadRawTile1(tif, tile, buf, bytecountm, module));
}
/*
* Read the specified tile and setup for decoding. The data buffer is
* expanded, as necessary, to hold the tile's data.
*/
-int
-TIFFFillTile(TIFF* tif, uint32 tile)
+int TIFFFillTile(TIFF *tif, uint32_t tile)
{
- static const char module[] = "TIFFFillTile";
- TIFFDirectory *td = &tif->tif_dir;
-
- if ((tif->tif_flags&TIFF_NOREADRAW)==0)
- {
- uint64 bytecount = TIFFGetStrileByteCount(tif, tile);
- if( bytecount == 0 || bytecount > (uint64)TIFF_INT64_MAX ) {
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- TIFFErrorExt(tif->tif_clientdata, module,
- "%I64u: Invalid tile byte count, tile %lu",
- (unsigned __int64) bytecount,
- (unsigned long) tile);
-#else
- TIFFErrorExt(tif->tif_clientdata, module,
- "%llu: Invalid tile byte count, tile %lu",
- (unsigned long long) bytecount,
- (unsigned long) tile);
-#endif
- return (0);
- }
+ static const char module[] = "TIFFFillTile";
+ TIFFDirectory *td = &tif->tif_dir;
+
+ if ((tif->tif_flags & TIFF_NOREADRAW) == 0)
+ {
+ uint64_t bytecount = TIFFGetStrileByteCount(tif, tile);
+ if (bytecount == 0 || bytecount > (uint64_t)TIFF_INT64_MAX)
+ {
+ TIFFErrorExtR(tif, module,
+ "%" PRIu64 ": Invalid tile byte count, tile %" PRIu32,
+ bytecount, tile);
+ return (0);
+ }
- /* To avoid excessive memory allocations: */
- /* Byte count should normally not be larger than a number of */
- /* times the uncompressed size plus some margin */
- if( bytecount > 1024 * 1024 )
+ /* To avoid excessive memory allocations: */
+ /* Byte count should normally not be larger than a number of */
+ /* times the uncompressed size plus some margin */
+ if (bytecount > 1024 * 1024)
+ {
+ /* 10 and 4096 are just values that could be adjusted. */
+ /* Hopefully they are safe enough for all codecs */
+ tmsize_t stripsize = TIFFTileSize(tif);
+ if (stripsize != 0 && (bytecount - 4096) / 10 > (uint64_t)stripsize)
+ {
+ uint64_t newbytecount = (uint64_t)stripsize * 10 + 4096;
+ TIFFErrorExtR(tif, module,
+ "Too large tile byte count %" PRIu64
+ ", tile %" PRIu32 ". Limiting to %" PRIu64,
+ bytecount, tile, newbytecount);
+ bytecount = newbytecount;
+ }
+ }
+
+ if (isMapped(tif))
+ {
+ /*
+ * We must check for overflow, potentially causing
+ * an OOB read. Instead of simple
+ *
+ * TIFFGetStrileOffset(tif, tile)+bytecount > tif->tif_size
+ *
+ * comparison (which can overflow) we do the following
+ * two comparisons:
+ */
+ if (bytecount > (uint64_t)tif->tif_size ||
+ TIFFGetStrileOffset(tif, tile) >
+ (uint64_t)tif->tif_size - bytecount)
+ {
+ tif->tif_curtile = NOTILE;
+ return (0);
+ }
+ }
+
+ if (isMapped(tif) && (isFillOrder(tif, td->td_fillorder) ||
+ (tif->tif_flags & TIFF_NOBITREV)))
+ {
+ /*
+ * The image is mapped into memory and we either don't
+ * need to flip bits or the compression routine is
+ * going to handle this operation itself. In this
+ * case, avoid copying the raw data and instead just
+ * reference the data from the memory mapped file
+ * image. This assumes that the decompression
+ * routines do not modify the contents of the raw data
+ * buffer (if they try to, the application will get a
+ * fault since the file is mapped read-only).
+ */
+ if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata)
+ {
+ _TIFFfreeExt(tif, tif->tif_rawdata);
+ tif->tif_rawdata = NULL;
+ tif->tif_rawdatasize = 0;
+ }
+ tif->tif_flags &= ~TIFF_MYBUFFER;
+
+ tif->tif_rawdatasize = (tmsize_t)bytecount;
+ tif->tif_rawdata =
+ tif->tif_base + (tmsize_t)TIFFGetStrileOffset(tif, tile);
+ tif->tif_rawdataoff = 0;
+ tif->tif_rawdataloaded = (tmsize_t)bytecount;
+ tif->tif_flags |= TIFF_BUFFERMMAP;
+ }
+ else
+ {
+ /*
+ * Expand raw data buffer, if needed, to hold data
+ * tile coming from file (perhaps should set upper
+ * bound on the size of a buffer we'll use?).
+ */
+ tmsize_t bytecountm;
+ bytecountm = (tmsize_t)bytecount;
+ if ((uint64_t)bytecountm != bytecount)
+ {
+ TIFFErrorExtR(tif, module, "Integer overflow");
+ return (0);
+ }
+ if (bytecountm > tif->tif_rawdatasize)
+ {
+ tif->tif_curtile = NOTILE;
+ if ((tif->tif_flags & TIFF_MYBUFFER) == 0)
{
- /* 10 and 4096 are just values that could be adjusted. */
- /* Hopefully they are safe enough for all codecs */
- tmsize_t stripsize = TIFFTileSize(tif);
- if( stripsize != 0 &&
- (bytecount - 4096) / 10 > (uint64)stripsize )
- {
- uint64 newbytecount = (uint64)stripsize * 10 + 4096;
- if( newbytecount == 0 || newbytecount > (uint64)TIFF_INT64_MAX )
- {
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- TIFFWarningExt(tif->tif_clientdata, module,
- "Too large tile byte count %I64u, tile %lu. Limiting to %I64u",
- (unsigned __int64) bytecount,
- (unsigned long) tile,
- (unsigned __int64) newbytecount);
-#else
- TIFFErrorExt(tif->tif_clientdata, module,
- "Too large tile byte count %llu, tile %lu. Limiting to %llu",
- (unsigned long long) bytecount,
- (unsigned long) tile,
- (unsigned long long) newbytecount);
-#endif
- bytecount = newbytecount;
- }
- }
- }
-
- if (isMapped(tif)) {
- /*
- * We must check for overflow, potentially causing
- * an OOB read. Instead of simple
- *
- * TIFFGetStrileOffset(tif, tile)+bytecount > tif->tif_size
- *
- * comparison (which can overflow) we do the following
- * two comparisons:
- */
- if (bytecount > (uint64)tif->tif_size ||
- TIFFGetStrileOffset(tif, tile) > (uint64)tif->tif_size - bytecount) {
- tif->tif_curtile = NOTILE;
- return (0);
- }
- }
-
- if (isMapped(tif) &&
- (isFillOrder(tif, td->td_fillorder)
- || (tif->tif_flags & TIFF_NOBITREV))) {
- /*
- * The image is mapped into memory and we either don't
- * need to flip bits or the compression routine is
- * going to handle this operation itself. In this
- * case, avoid copying the raw data and instead just
- * reference the data from the memory mapped file
- * image. This assumes that the decompression
- * routines do not modify the contents of the raw data
- * buffer (if they try to, the application will get a
- * fault since the file is mapped read-only).
- */
- if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) {
- _TIFFfree(tif->tif_rawdata);
- tif->tif_rawdata = NULL;
- tif->tif_rawdatasize = 0;
- }
- tif->tif_flags &= ~TIFF_MYBUFFER;
-
- tif->tif_rawdatasize = (tmsize_t)bytecount;
- tif->tif_rawdata =
- tif->tif_base + (tmsize_t)TIFFGetStrileOffset(tif, tile);
- tif->tif_rawdataoff = 0;
- tif->tif_rawdataloaded = (tmsize_t) bytecount;
- tif->tif_flags |= TIFF_BUFFERMMAP;
- } else {
- /*
- * Expand raw data buffer, if needed, to hold data
- * tile coming from file (perhaps should set upper
- * bound on the size of a buffer we'll use?).
- */
- tmsize_t bytecountm;
- bytecountm=(tmsize_t)bytecount;
- if ((uint64)bytecountm!=bytecount)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Integer overflow");
- return(0);
- }
- if (bytecountm > tif->tif_rawdatasize) {
- tif->tif_curtile = NOTILE;
- if ((tif->tif_flags & TIFF_MYBUFFER) == 0) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Data buffer too small to hold tile %lu",
- (unsigned long) tile);
- return (0);
- }
- }
- if (tif->tif_flags&TIFF_BUFFERMMAP) {
- tif->tif_curtile = NOTILE;
- tif->tif_rawdata = NULL;
- tif->tif_rawdatasize = 0;
- tif->tif_flags &= ~TIFF_BUFFERMMAP;
- }
-
- if( isMapped(tif) )
- {
- if (bytecountm > tif->tif_rawdatasize &&
- !TIFFReadBufferSetup(tif, 0, bytecountm))
- {
- return (0);
- }
- if (TIFFReadRawTile1(tif, tile, tif->tif_rawdata,
- bytecountm, module) != bytecountm)
- {
- return (0);
- }
- }
- else
- {
- if (TIFFReadRawStripOrTile2(tif, tile, 0,
- bytecountm, module) != bytecountm)
- {
- return (0);
- }
- }
-
-
- tif->tif_rawdataoff = 0;
- tif->tif_rawdataloaded = bytecountm;
-
- if (tif->tif_rawdata != NULL &&
- !isFillOrder(tif, td->td_fillorder) &&
- (tif->tif_flags & TIFF_NOBITREV) == 0)
- TIFFReverseBits(tif->tif_rawdata,
- tif->tif_rawdataloaded);
- }
- }
- return (TIFFStartTile(tif, tile));
+ TIFFErrorExtR(tif, module,
+ "Data buffer too small to hold tile %" PRIu32,
+ tile);
+ return (0);
+ }
+ }
+ if (tif->tif_flags & TIFF_BUFFERMMAP)
+ {
+ tif->tif_curtile = NOTILE;
+ tif->tif_rawdata = NULL;
+ tif->tif_rawdatasize = 0;
+ tif->tif_flags &= ~TIFF_BUFFERMMAP;
+ }
+
+ if (isMapped(tif))
+ {
+ if (bytecountm > tif->tif_rawdatasize &&
+ !TIFFReadBufferSetup(tif, 0, bytecountm))
+ {
+ return (0);
+ }
+ if (TIFFReadRawTile1(tif, tile, tif->tif_rawdata, bytecountm,
+ module) != bytecountm)
+ {
+ return (0);
+ }
+ }
+ else
+ {
+ if (TIFFReadRawStripOrTile2(tif, tile, 0, bytecountm, module) !=
+ bytecountm)
+ {
+ return (0);
+ }
+ }
+
+ tif->tif_rawdataoff = 0;
+ tif->tif_rawdataloaded = bytecountm;
+
+ if (tif->tif_rawdata != NULL &&
+ !isFillOrder(tif, td->td_fillorder) &&
+ (tif->tif_flags & TIFF_NOBITREV) == 0)
+ TIFFReverseBits(tif->tif_rawdata, tif->tif_rawdataloaded);
+ }
+ }
+ return (TIFFStartTile(tif, tile));
}
/*
@@ -1374,172 +1342,191 @@ TIFFFillTile(TIFF* tif, uint32 tile)
* large enough to hold any individual strip of
* raw data.
*/
-int
-TIFFReadBufferSetup(TIFF* tif, void* bp, tmsize_t size)
+int TIFFReadBufferSetup(TIFF *tif, void *bp, tmsize_t size)
{
- static const char module[] = "TIFFReadBufferSetup";
-
- assert((tif->tif_flags&TIFF_NOREADRAW)==0);
- tif->tif_flags &= ~TIFF_BUFFERMMAP;
-
- if (tif->tif_rawdata) {
- if (tif->tif_flags & TIFF_MYBUFFER)
- _TIFFfree(tif->tif_rawdata);
- tif->tif_rawdata = NULL;
- tif->tif_rawdatasize = 0;
- }
- if (bp) {
- tif->tif_rawdatasize = size;
- tif->tif_rawdata = (uint8*) bp;
- tif->tif_flags &= ~TIFF_MYBUFFER;
- } else {
- tif->tif_rawdatasize = (tmsize_t)TIFFroundup_64((uint64)size, 1024);
- if (tif->tif_rawdatasize==0) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Invalid buffer size");
- return (0);
- }
- /* Initialize to zero to avoid uninitialized buffers in case of */
- /* short reads (http://bugzilla.maptools.org/show_bug.cgi?id=2651) */
- tif->tif_rawdata = (uint8*) _TIFFcalloc(1, tif->tif_rawdatasize);
- tif->tif_flags |= TIFF_MYBUFFER;
- }
- if (tif->tif_rawdata == NULL) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "No space for data buffer at scanline %lu",
- (unsigned long) tif->tif_row);
- tif->tif_rawdatasize = 0;
- return (0);
- }
- return (1);
+ static const char module[] = "TIFFReadBufferSetup";
+
+ assert((tif->tif_flags & TIFF_NOREADRAW) == 0);
+ tif->tif_flags &= ~TIFF_BUFFERMMAP;
+
+ if (tif->tif_rawdata)
+ {
+ if (tif->tif_flags & TIFF_MYBUFFER)
+ _TIFFfreeExt(tif, tif->tif_rawdata);
+ tif->tif_rawdata = NULL;
+ tif->tif_rawdatasize = 0;
+ }
+ if (bp)
+ {
+ tif->tif_rawdatasize = size;
+ tif->tif_rawdata = (uint8_t *)bp;
+ tif->tif_flags &= ~TIFF_MYBUFFER;
+ }
+ else
+ {
+ tif->tif_rawdatasize = (tmsize_t)TIFFroundup_64((uint64_t)size, 1024);
+ if (tif->tif_rawdatasize == 0)
+ {
+ TIFFErrorExtR(tif, module, "Invalid buffer size");
+ return (0);
+ }
+ /* Initialize to zero to avoid uninitialized buffers in case of */
+ /* short reads (http://bugzilla.maptools.org/show_bug.cgi?id=2651) */
+ tif->tif_rawdata =
+ (uint8_t *)_TIFFcallocExt(tif, 1, tif->tif_rawdatasize);
+ tif->tif_flags |= TIFF_MYBUFFER;
+ }
+ if (tif->tif_rawdata == NULL)
+ {
+ TIFFErrorExtR(tif, module,
+ "No space for data buffer at scanline %" PRIu32,
+ tif->tif_row);
+ tif->tif_rawdatasize = 0;
+ return (0);
+ }
+ return (1);
}
/*
* Set state to appear as if a
* strip has just been read in.
*/
-static int
-TIFFStartStrip(TIFF* tif, uint32 strip)
+static int TIFFStartStrip(TIFF *tif, uint32_t strip)
{
- TIFFDirectory *td = &tif->tif_dir;
-
- if ((tif->tif_flags & TIFF_CODERSETUP) == 0) {
- if (!(*tif->tif_setupdecode)(tif))
- return (0);
- tif->tif_flags |= TIFF_CODERSETUP;
- }
- tif->tif_curstrip = strip;
- tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip;
- tif->tif_flags &= ~TIFF_BUF4WRITE;
-
- if (tif->tif_flags&TIFF_NOREADRAW)
- {
- tif->tif_rawcp = NULL;
- tif->tif_rawcc = 0;
- }
- else
- {
- tif->tif_rawcp = tif->tif_rawdata;
- if( tif->tif_rawdataloaded > 0 )
- tif->tif_rawcc = tif->tif_rawdataloaded;
- else
- tif->tif_rawcc = (tmsize_t)TIFFGetStrileByteCount(tif, strip);
- }
- return ((*tif->tif_predecode)(tif,
- (uint16)(strip / td->td_stripsperimage)));
+ TIFFDirectory *td = &tif->tif_dir;
+
+ if ((tif->tif_flags & TIFF_CODERSETUP) == 0)
+ {
+ if (!(*tif->tif_setupdecode)(tif))
+ return (0);
+ tif->tif_flags |= TIFF_CODERSETUP;
+ }
+ tif->tif_curstrip = strip;
+ tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip;
+ tif->tif_flags &= ~TIFF_BUF4WRITE;
+
+ if (tif->tif_flags & TIFF_NOREADRAW)
+ {
+ tif->tif_rawcp = NULL;
+ tif->tif_rawcc = 0;
+ }
+ else
+ {
+ tif->tif_rawcp = tif->tif_rawdata;
+ if (tif->tif_rawdataloaded > 0)
+ tif->tif_rawcc = tif->tif_rawdataloaded;
+ else
+ tif->tif_rawcc = (tmsize_t)TIFFGetStrileByteCount(tif, strip);
+ }
+ if ((*tif->tif_predecode)(tif, (uint16_t)(strip / td->td_stripsperimage)) ==
+ 0)
+ {
+ /* Needed for example for scanline access, if tif_predecode */
+ /* fails, and we try to read the same strip again. Without invalidating
+ */
+ /* tif_curstrip, we'd call tif_decoderow() on a possibly invalid */
+ /* codec state. */
+ tif->tif_curstrip = NOSTRIP;
+ return 0;
+ }
+ return 1;
}
/*
* Set state to appear as if a
* tile has just been read in.
*/
-static int
-TIFFStartTile(TIFF* tif, uint32 tile)
+static int TIFFStartTile(TIFF *tif, uint32_t tile)
{
- static const char module[] = "TIFFStartTile";
- TIFFDirectory *td = &tif->tif_dir;
- uint32 howmany32;
-
- if ((tif->tif_flags & TIFF_CODERSETUP) == 0) {
- if (!(*tif->tif_setupdecode)(tif))
- return (0);
- tif->tif_flags |= TIFF_CODERSETUP;
- }
- tif->tif_curtile = tile;
- howmany32=TIFFhowmany_32(td->td_imagewidth, td->td_tilewidth);
- if (howmany32 == 0) {
- TIFFErrorExt(tif->tif_clientdata,module,"Zero tiles");
- return 0;
- }
- tif->tif_row = (tile % howmany32) * td->td_tilelength;
- howmany32=TIFFhowmany_32(td->td_imagelength, td->td_tilelength);
- if (howmany32 == 0) {
- TIFFErrorExt(tif->tif_clientdata,module,"Zero tiles");
- return 0;
- }
- tif->tif_col = (tile % howmany32) * td->td_tilewidth;
- tif->tif_flags &= ~TIFF_BUF4WRITE;
- if (tif->tif_flags&TIFF_NOREADRAW)
- {
- tif->tif_rawcp = NULL;
- tif->tif_rawcc = 0;
- }
- else
- {
- tif->tif_rawcp = tif->tif_rawdata;
- if( tif->tif_rawdataloaded > 0 )
- tif->tif_rawcc = tif->tif_rawdataloaded;
- else
- tif->tif_rawcc = (tmsize_t)TIFFGetStrileByteCount(tif, tile);
- }
- return ((*tif->tif_predecode)(tif,
- (uint16)(tile/td->td_stripsperimage)));
+ static const char module[] = "TIFFStartTile";
+ TIFFDirectory *td = &tif->tif_dir;
+ uint32_t howmany32;
+
+ if ((tif->tif_flags & TIFF_CODERSETUP) == 0)
+ {
+ if (!(*tif->tif_setupdecode)(tif))
+ return (0);
+ tif->tif_flags |= TIFF_CODERSETUP;
+ }
+ tif->tif_curtile = tile;
+ howmany32 = TIFFhowmany_32(td->td_imagewidth, td->td_tilewidth);
+ if (howmany32 == 0)
+ {
+ TIFFErrorExtR(tif, module, "Zero tiles");
+ return 0;
+ }
+ tif->tif_row = (tile % howmany32) * td->td_tilelength;
+ howmany32 = TIFFhowmany_32(td->td_imagelength, td->td_tilelength);
+ if (howmany32 == 0)
+ {
+ TIFFErrorExtR(tif, module, "Zero tiles");
+ return 0;
+ }
+ tif->tif_col = (tile % howmany32) * td->td_tilewidth;
+ tif->tif_flags &= ~TIFF_BUF4WRITE;
+ if (tif->tif_flags & TIFF_NOREADRAW)
+ {
+ tif->tif_rawcp = NULL;
+ tif->tif_rawcc = 0;
+ }
+ else
+ {
+ tif->tif_rawcp = tif->tif_rawdata;
+ if (tif->tif_rawdataloaded > 0)
+ tif->tif_rawcc = tif->tif_rawdataloaded;
+ else
+ tif->tif_rawcc = (tmsize_t)TIFFGetStrileByteCount(tif, tile);
+ }
+ return (
+ (*tif->tif_predecode)(tif, (uint16_t)(tile / td->td_stripsperimage)));
}
-static int
-TIFFCheckRead(TIFF* tif, int tiles)
+static int TIFFCheckRead(TIFF *tif, int tiles)
{
- if (tif->tif_mode == O_WRONLY) {
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "File not open for reading");
- return (0);
- }
- if (tiles ^ isTiled(tif)) {
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name, tiles ?
- "Can not read tiles from a striped image" :
- "Can not read scanlines from a tiled image");
- return (0);
- }
- return (1);
+ if (tif->tif_mode == O_WRONLY)
+ {
+ TIFFErrorExtR(tif, tif->tif_name, "File not open for reading");
+ return (0);
+ }
+ if (tiles ^ isTiled(tif))
+ {
+ TIFFErrorExtR(tif, tif->tif_name,
+ tiles ? "Can not read tiles from a striped image"
+ : "Can not read scanlines from a tiled image");
+ return (0);
+ }
+ return (1);
}
/* Use the provided input buffer (inbuf, insize) and decompress it into
* (outbuf, outsize).
- * This function replaces the use of TIFFReadEncodedStrip()/TIFFReadEncodedTile()
- * when the user can provide the buffer for the input data, for example when
- * he wants to avoid libtiff to read the strile offset/count values from the
- * [Strip|Tile][Offsets/ByteCounts] array.
- * inbuf content must be writable (if bit reversal is needed)
- * Returns 1 in case of success, 0 otherwise.
+ * This function replaces the use of
+ * TIFFReadEncodedStrip()/TIFFReadEncodedTile() when the user can provide the
+ * buffer for the input data, for example when he wants to avoid libtiff to read
+ * the strile offset/count values from the [Strip|Tile][Offsets/ByteCounts]
+ * array. inbuf content must be writable (if bit reversal is needed) Returns 1
+ * in case of success, 0 otherwise.
*/
-int TIFFReadFromUserBuffer(TIFF* tif, uint32 strile,
- void* inbuf, tmsize_t insize,
- void* outbuf, tmsize_t outsize)
+int TIFFReadFromUserBuffer(TIFF *tif, uint32_t strile, void *inbuf,
+ tmsize_t insize, void *outbuf, tmsize_t outsize)
{
static const char module[] = "TIFFReadFromUserBuffer";
TIFFDirectory *td = &tif->tif_dir;
int ret = 1;
- uint32 old_tif_flags = tif->tif_flags;
+ uint32_t old_tif_flags = tif->tif_flags;
tmsize_t old_rawdatasize = tif->tif_rawdatasize;
- void* old_rawdata = tif->tif_rawdata;
+ void *old_rawdata = tif->tif_rawdata;
- if (tif->tif_mode == O_WRONLY) {
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "File not open for reading");
+ if (tif->tif_mode == O_WRONLY)
+ {
+ TIFFErrorExtR(tif, tif->tif_name, "File not open for reading");
return 0;
}
- if (tif->tif_flags&TIFF_NOREADRAW)
+ if (tif->tif_flags & TIFF_NOREADRAW)
{
- TIFFErrorExt(tif->tif_clientdata, module,
- "Compression scheme does not support access to raw uncompressed data");
+ TIFFErrorExtR(tif, module,
+ "Compression scheme does not support access to raw "
+ "uncompressed data");
return 0;
}
@@ -1556,32 +1543,33 @@ int TIFFReadFromUserBuffer(TIFF* tif, uint32 strile,
TIFFReverseBits(inbuf, insize);
}
- if( TIFFIsTiled(tif) )
+ if (TIFFIsTiled(tif))
{
- if( !TIFFStartTile(tif, strile) ||
- !(*tif->tif_decodetile)(tif, (uint8*) outbuf, outsize,
- (uint16)(strile/td->td_stripsperimage)) )
+ if (!TIFFStartTile(tif, strile) ||
+ !(*tif->tif_decodetile)(tif, (uint8_t *)outbuf, outsize,
+ (uint16_t)(strile / td->td_stripsperimage)))
{
ret = 0;
}
}
else
{
- uint32 rowsperstrip=td->td_rowsperstrip;
- uint32 stripsperplane;
- if (rowsperstrip>td->td_imagelength)
- rowsperstrip=td->td_imagelength;
- stripsperplane= TIFFhowmany_32_maxuint_compat(td->td_imagelength, rowsperstrip);
- if( !TIFFStartStrip(tif, strile) ||
- !(*tif->tif_decodestrip)(tif, (uint8*) outbuf, outsize,
- (uint16)(strile/stripsperplane)) )
+ uint32_t rowsperstrip = td->td_rowsperstrip;
+ uint32_t stripsperplane;
+ if (rowsperstrip > td->td_imagelength)
+ rowsperstrip = td->td_imagelength;
+ stripsperplane =
+ TIFFhowmany_32_maxuint_compat(td->td_imagelength, rowsperstrip);
+ if (!TIFFStartStrip(tif, strile) ||
+ !(*tif->tif_decodestrip)(tif, (uint8_t *)outbuf, outsize,
+ (uint16_t)(strile / stripsperplane)))
{
ret = 0;
}
}
- if( ret )
+ if (ret)
{
- (*tif->tif_postdecode)(tif, (uint8*) outbuf, outsize);
+ (*tif->tif_postdecode)(tif, (uint8_t *)outbuf, outsize);
}
if (!isFillOrder(tif, td->td_fillorder) &&
@@ -1590,7 +1578,8 @@ int TIFFReadFromUserBuffer(TIFF* tif, uint32 strile,
TIFFReverseBits(inbuf, insize);
}
- tif->tif_flags = old_tif_flags;
+ tif->tif_flags = (old_tif_flags & (TIFF_MYBUFFER | TIFF_BUFFERMMAP)) |
+ (tif->tif_flags & ~(TIFF_MYBUFFER | TIFF_BUFFERMMAP));
tif->tif_rawdatasize = old_rawdatasize;
tif->tif_rawdata = old_rawdata;
tif->tif_rawdataoff = 0;
@@ -1599,49 +1588,37 @@ int TIFFReadFromUserBuffer(TIFF* tif, uint32 strile,
return ret;
}
-void
-_TIFFNoPostDecode(TIFF* tif, uint8* buf, tmsize_t cc)
+void _TIFFNoPostDecode(TIFF *tif, uint8_t *buf, tmsize_t cc)
{
- (void) tif; (void) buf; (void) cc;
+ (void)tif;
+ (void)buf;
+ (void)cc;
}
-void
-_TIFFSwab16BitData(TIFF* tif, uint8* buf, tmsize_t cc)
+void _TIFFSwab16BitData(TIFF *tif, uint8_t *buf, tmsize_t cc)
{
- (void) tif;
+ (void)tif;
assert((cc & 1) == 0);
- TIFFSwabArrayOfShort((uint16*) buf, cc/2);
+ TIFFSwabArrayOfShort((uint16_t *)buf, cc / 2);
}
-void
-_TIFFSwab24BitData(TIFF* tif, uint8* buf, tmsize_t cc)
+void _TIFFSwab24BitData(TIFF *tif, uint8_t *buf, tmsize_t cc)
{
- (void) tif;
+ (void)tif;
assert((cc % 3) == 0);
- TIFFSwabArrayOfTriples((uint8*) buf, cc/3);
+ TIFFSwabArrayOfTriples((uint8_t *)buf, cc / 3);
}
-void
-_TIFFSwab32BitData(TIFF* tif, uint8* buf, tmsize_t cc)
+void _TIFFSwab32BitData(TIFF *tif, uint8_t *buf, tmsize_t cc)
{
- (void) tif;
+ (void)tif;
assert((cc & 3) == 0);
- TIFFSwabArrayOfLong((uint32*) buf, cc/4);
+ TIFFSwabArrayOfLong((uint32_t *)buf, cc / 4);
}
-void
-_TIFFSwab64BitData(TIFF* tif, uint8* buf, tmsize_t cc)
+void _TIFFSwab64BitData(TIFF *tif, uint8_t *buf, tmsize_t cc)
{
- (void) tif;
+ (void)tif;
assert((cc & 7) == 0);
- TIFFSwabArrayOfDouble((double*) buf, cc/8);
+ TIFFSwabArrayOfDouble((double *)buf, cc / 8);
}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_stream.cxx b/src/3rdparty/libtiff/libtiff/tif_stream.cxx
index 7f640a9..92ea273 100644
--- a/src/3rdparty/libtiff/libtiff/tif_stream.cxx
+++ b/src/3rdparty/libtiff/libtiff/tif_stream.cxx
@@ -2,23 +2,23 @@
* Copyright (c) 1988-1996 Sam Leffler
* Copyright (c) 1991-1996 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -28,9 +28,7 @@
#include "tiffiop.h"
#include <iostream>
-#ifndef __VMS
using namespace std;
-#endif
/*
ISO C++ uses a 'std::streamsize' type to define counts. This makes
@@ -76,359 +74,331 @@ using namespace std;
struct tiffis_data;
struct tiffos_data;
-extern "C" {
-
- static tmsize_t _tiffosReadProc(thandle_t, void*, tmsize_t);
- static tmsize_t _tiffisReadProc(thandle_t fd, void* buf, tmsize_t size);
- static tmsize_t _tiffosWriteProc(thandle_t fd, void* buf, tmsize_t size);
- static tmsize_t _tiffisWriteProc(thandle_t, void*, tmsize_t);
- static uint64 _tiffosSeekProc(thandle_t fd, uint64 off, int whence);
- static uint64 _tiffisSeekProc(thandle_t fd, uint64 off, int whence);
- static uint64 _tiffosSizeProc(thandle_t fd);
- static uint64 _tiffisSizeProc(thandle_t fd);
- static int _tiffosCloseProc(thandle_t fd);
- static int _tiffisCloseProc(thandle_t fd);
- static int _tiffDummyMapProc(thandle_t , void** base, toff_t* size );
- static void _tiffDummyUnmapProc(thandle_t , void* base, toff_t size );
- static TIFF* _tiffStreamOpen(const char* name, const char* mode, void *fd);
-
-struct tiffis_data
+extern "C"
{
- istream *stream;
+
+ static tmsize_t _tiffosReadProc(thandle_t, void *, tmsize_t);
+ static tmsize_t _tiffisReadProc(thandle_t fd, void *buf, tmsize_t size);
+ static tmsize_t _tiffosWriteProc(thandle_t fd, void *buf, tmsize_t size);
+ static tmsize_t _tiffisWriteProc(thandle_t, void *, tmsize_t);
+ static uint64_t _tiffosSeekProc(thandle_t fd, uint64_t off, int whence);
+ static uint64_t _tiffisSeekProc(thandle_t fd, uint64_t off, int whence);
+ static uint64_t _tiffosSizeProc(thandle_t fd);
+ static uint64_t _tiffisSizeProc(thandle_t fd);
+ static int _tiffosCloseProc(thandle_t fd);
+ static int _tiffisCloseProc(thandle_t fd);
+ static int _tiffDummyMapProc(thandle_t, void **base, toff_t *size);
+ static void _tiffDummyUnmapProc(thandle_t, void *base, toff_t size);
+ static TIFF *_tiffStreamOpen(const char *name, const char *mode, void *fd);
+
+ struct tiffis_data
+ {
+ istream *stream;
ios::pos_type start_pos;
-};
+ };
-struct tiffos_data
-{
- ostream *stream;
- ios::pos_type start_pos;
-};
+ struct tiffos_data
+ {
+ ostream *stream;
+ ios::pos_type start_pos;
+ };
-static tmsize_t
-_tiffosReadProc(thandle_t, void*, tmsize_t)
-{
- return 0;
-}
+ static tmsize_t _tiffosReadProc(thandle_t, void *, tmsize_t) { return 0; }
-static tmsize_t
-_tiffisReadProc(thandle_t fd, void* buf, tmsize_t size)
-{
- tiffis_data *data = reinterpret_cast<tiffis_data *>(fd);
+ static tmsize_t _tiffisReadProc(thandle_t fd, void *buf, tmsize_t size)
+ {
+ tiffis_data *data = reinterpret_cast<tiffis_data *>(fd);
// Verify that type does not overflow.
streamsize request_size = size;
if (static_cast<tmsize_t>(request_size) != size)
- return static_cast<tmsize_t>(-1);
+ return static_cast<tmsize_t>(-1);
- data->stream->read((char *) buf, request_size);
+ data->stream->read((char *)buf, request_size);
return static_cast<tmsize_t>(data->stream->gcount());
-}
+ }
-static tmsize_t
-_tiffosWriteProc(thandle_t fd, void* buf, tmsize_t size)
-{
- tiffos_data *data = reinterpret_cast<tiffos_data *>(fd);
- ostream *os = data->stream;
- ios::pos_type pos = os->tellp();
+ static tmsize_t _tiffosWriteProc(thandle_t fd, void *buf, tmsize_t size)
+ {
+ tiffos_data *data = reinterpret_cast<tiffos_data *>(fd);
+ ostream *os = data->stream;
+ ios::pos_type pos = os->tellp();
// Verify that type does not overflow.
streamsize request_size = size;
if (static_cast<tmsize_t>(request_size) != size)
- return static_cast<tmsize_t>(-1);
-
- os->write(reinterpret_cast<const char *>(buf), request_size);
-
- return static_cast<tmsize_t>(os->tellp() - pos);
-}
-
-static tmsize_t
-_tiffisWriteProc(thandle_t, void*, tmsize_t)
-{
- return 0;
-}
-
-static uint64
-_tiffosSeekProc(thandle_t fd, uint64 off, int whence)
-{
- tiffos_data *data = reinterpret_cast<tiffos_data *>(fd);
- ostream *os = data->stream;
-
- // if the stream has already failed, don't do anything
- if( os->fail() )
- return static_cast<uint64>(-1);
-
- switch(whence) {
- case SEEK_SET:
- {
- // Compute 64-bit offset
- uint64 new_offset = static_cast<uint64>(data->start_pos) + off;
-
- // Verify that value does not overflow
- ios::off_type offset = static_cast<ios::off_type>(new_offset);
- if (static_cast<uint64>(offset) != new_offset)
- return static_cast<uint64>(-1);
-
- os->seekp(offset, ios::beg);
- break;
- }
- case SEEK_CUR:
- {
- // Verify that value does not overflow
- ios::off_type offset = static_cast<ios::off_type>(off);
- if (static_cast<uint64>(offset) != off)
- return static_cast<uint64>(-1);
-
- os->seekp(offset, ios::cur);
- break;
- }
- case SEEK_END:
- {
- // Verify that value does not overflow
- ios::off_type offset = static_cast<ios::off_type>(off);
- if (static_cast<uint64>(offset) != off)
- return static_cast<uint64>(-1);
-
- os->seekp(offset, ios::end);
- break;
- }
- }
-
- // Attempt to workaround problems with seeking past the end of the
- // stream. ofstream doesn't have a problem with this but
- // ostrstream/ostringstream does. In that situation, add intermediate
- // '\0' characters.
- if( os->fail() ) {
-#ifdef __VMS
- int old_state;
-#else
- ios::iostate old_state;
-#endif
- ios::pos_type origin;
-
- old_state = os->rdstate();
- // reset the fail bit or else tellp() won't work below
- os->clear(os->rdstate() & ~ios::failbit);
- switch( whence ) {
- case SEEK_SET:
- default:
- origin = data->start_pos;
- break;
- case SEEK_CUR:
- origin = os->tellp();
- break;
- case SEEK_END:
- os->seekp(0, ios::end);
- origin = os->tellp();
- break;
- }
- // restore original stream state
- os->clear(old_state);
-
- // only do something if desired seek position is valid
- if( (static_cast<uint64>(origin) + off) > static_cast<uint64>(data->start_pos) ) {
- uint64 num_fill;
-
- // clear the fail bit
- os->clear(os->rdstate() & ~ios::failbit);
-
- // extend the stream to the expected size
- os->seekp(0, ios::end);
- num_fill = (static_cast<uint64>(origin)) + off - os->tellp();
- for( uint64 i = 0; i < num_fill; i++ )
- os->put('\0');
-
- // retry the seek
- os->seekp(static_cast<ios::off_type>(static_cast<uint64>(origin) + off), ios::beg);
- }
- }
-
- return static_cast<uint64>(os->tellp());
-}
-
-static uint64
-_tiffisSeekProc(thandle_t fd, uint64 off, int whence)
-{
- tiffis_data *data = reinterpret_cast<tiffis_data *>(fd);
-
- switch(whence) {
- case SEEK_SET:
- {
- // Compute 64-bit offset
- uint64 new_offset = static_cast<uint64>(data->start_pos) + off;
-
- // Verify that value does not overflow
- ios::off_type offset = static_cast<ios::off_type>(new_offset);
- if (static_cast<uint64>(offset) != new_offset)
- return static_cast<uint64>(-1);
-
- data->stream->seekg(offset, ios::beg);
- break;
- }
- case SEEK_CUR:
- {
- // Verify that value does not overflow
- ios::off_type offset = static_cast<ios::off_type>(off);
- if (static_cast<uint64>(offset) != off)
- return static_cast<uint64>(-1);
-
- data->stream->seekg(offset, ios::cur);
- break;
- }
- case SEEK_END:
- {
- // Verify that value does not overflow
- ios::off_type offset = static_cast<ios::off_type>(off);
- if (static_cast<uint64>(offset) != off)
- return static_cast<uint64>(-1);
-
- data->stream->seekg(offset, ios::end);
- break;
- }
- }
-
- return (uint64) (data->stream->tellg() - data->start_pos);
-}
-
-static uint64
-_tiffosSizeProc(thandle_t fd)
-{
- tiffos_data *data = reinterpret_cast<tiffos_data *>(fd);
- ostream *os = data->stream;
- ios::pos_type pos = os->tellp();
- ios::pos_type len;
-
- os->seekp(0, ios::end);
- len = os->tellp();
- os->seekp(pos);
-
- return (uint64) len;
-}
-
-static uint64
-_tiffisSizeProc(thandle_t fd)
-{
- tiffis_data *data = reinterpret_cast<tiffis_data *>(fd);
- ios::pos_type pos = data->stream->tellg();
- ios::pos_type len;
-
- data->stream->seekg(0, ios::end);
- len = data->stream->tellg();
- data->stream->seekg(pos);
-
- return (uint64) len;
-}
-
-static int
-_tiffosCloseProc(thandle_t fd)
-{
- // Our stream was not allocated by us, so it shouldn't be closed by us.
- delete reinterpret_cast<tiffos_data *>(fd);
- return 0;
-}
-
-static int
-_tiffisCloseProc(thandle_t fd)
-{
- // Our stream was not allocated by us, so it shouldn't be closed by us.
- delete reinterpret_cast<tiffis_data *>(fd);
- return 0;
-}
-
-static int
-_tiffDummyMapProc(thandle_t , void** base, toff_t* size )
-{
- (void) base;
- (void) size;
- return (0);
-}
-
-static void
-_tiffDummyUnmapProc(thandle_t , void* base, toff_t size )
-{
- (void) base;
- (void) size;
-}
+ return static_cast<tmsize_t>(-1);
+
+ os->write(reinterpret_cast<const char *>(buf), request_size);
+
+ return static_cast<tmsize_t>(os->tellp() - pos);
+ }
+
+ static tmsize_t _tiffisWriteProc(thandle_t, void *, tmsize_t) { return 0; }
+
+ static uint64_t _tiffosSeekProc(thandle_t fd, uint64_t off, int whence)
+ {
+ tiffos_data *data = reinterpret_cast<tiffos_data *>(fd);
+ ostream *os = data->stream;
+
+ // if the stream has already failed, don't do anything
+ if (os->fail())
+ return static_cast<uint64_t>(-1);
+
+ switch (whence)
+ {
+ case SEEK_SET:
+ {
+ // Compute 64-bit offset
+ uint64_t new_offset =
+ static_cast<uint64_t>(data->start_pos) + off;
+
+ // Verify that value does not overflow
+ ios::off_type offset = static_cast<ios::off_type>(new_offset);
+ if (static_cast<uint64_t>(offset) != new_offset)
+ return static_cast<uint64_t>(-1);
+
+ os->seekp(offset, ios::beg);
+ break;
+ }
+ case SEEK_CUR:
+ {
+ // Verify that value does not overflow
+ ios::off_type offset = static_cast<ios::off_type>(off);
+ if (static_cast<uint64_t>(offset) != off)
+ return static_cast<uint64_t>(-1);
+
+ os->seekp(offset, ios::cur);
+ break;
+ }
+ case SEEK_END:
+ {
+ // Verify that value does not overflow
+ ios::off_type offset = static_cast<ios::off_type>(off);
+ if (static_cast<uint64_t>(offset) != off)
+ return static_cast<uint64_t>(-1);
+
+ os->seekp(offset, ios::end);
+ break;
+ }
+ }
+
+ // Attempt to workaround problems with seeking past the end of the
+ // stream. ofstream doesn't have a problem with this but
+ // ostrstream/ostringstream does. In that situation, add intermediate
+ // '\0' characters.
+ if (os->fail())
+ {
+ ios::iostate old_state;
+ ios::pos_type origin;
+
+ old_state = os->rdstate();
+ // reset the fail bit or else tellp() won't work below
+ os->clear(os->rdstate() & ~ios::failbit);
+ switch (whence)
+ {
+ case SEEK_SET:
+ default:
+ origin = data->start_pos;
+ break;
+ case SEEK_CUR:
+ origin = os->tellp();
+ break;
+ case SEEK_END:
+ os->seekp(0, ios::end);
+ origin = os->tellp();
+ break;
+ }
+ // restore original stream state
+ os->clear(old_state);
+
+ // only do something if desired seek position is valid
+ if ((static_cast<uint64_t>(origin) + off) >
+ static_cast<uint64_t>(data->start_pos))
+ {
+ uint64_t num_fill;
+
+ // clear the fail bit
+ os->clear(os->rdstate() & ~ios::failbit);
+
+ // extend the stream to the expected size
+ os->seekp(0, ios::end);
+ num_fill = (static_cast<uint64_t>(origin)) + off - os->tellp();
+ for (uint64_t i = 0; i < num_fill; i++)
+ os->put('\0');
+
+ // retry the seek
+ os->seekp(static_cast<ios::off_type>(
+ static_cast<uint64_t>(origin) + off),
+ ios::beg);
+ }
+ }
+
+ return static_cast<uint64_t>(os->tellp());
+ }
+
+ static uint64_t _tiffisSeekProc(thandle_t fd, uint64_t off, int whence)
+ {
+ tiffis_data *data = reinterpret_cast<tiffis_data *>(fd);
+
+ switch (whence)
+ {
+ case SEEK_SET:
+ {
+ // Compute 64-bit offset
+ uint64_t new_offset =
+ static_cast<uint64_t>(data->start_pos) + off;
+
+ // Verify that value does not overflow
+ ios::off_type offset = static_cast<ios::off_type>(new_offset);
+ if (static_cast<uint64_t>(offset) != new_offset)
+ return static_cast<uint64_t>(-1);
+
+ data->stream->seekg(offset, ios::beg);
+ break;
+ }
+ case SEEK_CUR:
+ {
+ // Verify that value does not overflow
+ ios::off_type offset = static_cast<ios::off_type>(off);
+ if (static_cast<uint64_t>(offset) != off)
+ return static_cast<uint64_t>(-1);
+
+ data->stream->seekg(offset, ios::cur);
+ break;
+ }
+ case SEEK_END:
+ {
+ // Verify that value does not overflow
+ ios::off_type offset = static_cast<ios::off_type>(off);
+ if (static_cast<uint64_t>(offset) != off)
+ return static_cast<uint64_t>(-1);
+
+ data->stream->seekg(offset, ios::end);
+ break;
+ }
+ }
+
+ return (uint64_t)(data->stream->tellg() - data->start_pos);
+ }
+
+ static uint64_t _tiffosSizeProc(thandle_t fd)
+ {
+ tiffos_data *data = reinterpret_cast<tiffos_data *>(fd);
+ ostream *os = data->stream;
+ ios::pos_type pos = os->tellp();
+ ios::pos_type len;
+
+ os->seekp(0, ios::end);
+ len = os->tellp();
+ os->seekp(pos);
+
+ return (uint64_t)len;
+ }
+
+ static uint64_t _tiffisSizeProc(thandle_t fd)
+ {
+ tiffis_data *data = reinterpret_cast<tiffis_data *>(fd);
+ ios::pos_type pos = data->stream->tellg();
+ ios::pos_type len;
+
+ data->stream->seekg(0, ios::end);
+ len = data->stream->tellg();
+ data->stream->seekg(pos);
+
+ return (uint64_t)len;
+ }
+
+ static int _tiffosCloseProc(thandle_t fd)
+ {
+ // Our stream was not allocated by us, so it shouldn't be closed by us.
+ delete reinterpret_cast<tiffos_data *>(fd);
+ return 0;
+ }
-/*
- * Open a TIFF file descriptor for read/writing.
- */
-static TIFF*
-_tiffStreamOpen(const char* name, const char* mode, void *fd)
-{
- TIFF* tif;
-
- if( strchr(mode, 'w') ) {
- tiffos_data *data = new tiffos_data;
- data->stream = reinterpret_cast<ostream *>(fd);
- data->start_pos = data->stream->tellp();
-
- // Open for writing.
- tif = TIFFClientOpen(name, mode,
- reinterpret_cast<thandle_t>(data),
- _tiffosReadProc,
- _tiffosWriteProc,
- _tiffosSeekProc,
- _tiffosCloseProc,
- _tiffosSizeProc,
- _tiffDummyMapProc,
- _tiffDummyUnmapProc);
- if (!tif) {
- delete data;
- }
- } else {
- tiffis_data *data = new tiffis_data;
- data->stream = reinterpret_cast<istream *>(fd);
- data->start_pos = data->stream->tellg();
- // Open for reading.
- tif = TIFFClientOpen(name, mode,
- reinterpret_cast<thandle_t>(data),
- _tiffisReadProc,
- _tiffisWriteProc,
- _tiffisSeekProc,
- _tiffisCloseProc,
- _tiffisSizeProc,
- _tiffDummyMapProc,
- _tiffDummyUnmapProc);
- if (!tif) {
- delete data;
- }
- }
-
- return (tif);
-}
+ static int _tiffisCloseProc(thandle_t fd)
+ {
+ // Our stream was not allocated by us, so it shouldn't be closed by us.
+ delete reinterpret_cast<tiffis_data *>(fd);
+ return 0;
+ }
+
+ static int _tiffDummyMapProc(thandle_t, void **base, toff_t *size)
+ {
+ (void)base;
+ (void)size;
+ return (0);
+ }
+
+ static void _tiffDummyUnmapProc(thandle_t, void *base, toff_t size)
+ {
+ (void)base;
+ (void)size;
+ }
+
+ /*
+ * Open a TIFF file descriptor for read/writing.
+ */
+ static TIFF *_tiffStreamOpen(const char *name, const char *mode, void *fd)
+ {
+ TIFF *tif;
+
+ if (strchr(mode, 'w'))
+ {
+ tiffos_data *data = new tiffos_data;
+ data->stream = reinterpret_cast<ostream *>(fd);
+ data->start_pos = data->stream->tellp();
+
+ // Open for writing.
+ tif = TIFFClientOpen(
+ name, mode, reinterpret_cast<thandle_t>(data), _tiffosReadProc,
+ _tiffosWriteProc, _tiffosSeekProc, _tiffosCloseProc,
+ _tiffosSizeProc, _tiffDummyMapProc, _tiffDummyUnmapProc);
+ if (!tif)
+ {
+ delete data;
+ }
+ }
+ else
+ {
+ tiffis_data *data = new tiffis_data;
+ data->stream = reinterpret_cast<istream *>(fd);
+ data->start_pos = data->stream->tellg();
+ // Open for reading.
+ tif = TIFFClientOpen(
+ name, mode, reinterpret_cast<thandle_t>(data), _tiffisReadProc,
+ _tiffisWriteProc, _tiffisSeekProc, _tiffisCloseProc,
+ _tiffisSizeProc, _tiffDummyMapProc, _tiffDummyUnmapProc);
+ if (!tif)
+ {
+ delete data;
+ }
+ }
+
+ return (tif);
+ }
} /* extern "C" */
-TIFF*
-TIFFStreamOpen(const char* name, ostream *os)
+TIFF *TIFFStreamOpen(const char *name, ostream *os)
{
- // If os is either a ostrstream or ostringstream, and has no data
- // written to it yet, then tellp() will return -1 which will break us.
- // We workaround this by writing out a dummy character and
- // then seek back to the beginning.
- if( !os->fail() && static_cast<int>(os->tellp()) < 0 ) {
- *os << '\0';
- os->seekp(0);
- }
-
- // NB: We don't support mapped files with streams so add 'm'
- return _tiffStreamOpen(name, "wm", os);
+ // If os is either a ostrstream or ostringstream, and has no data
+ // written to it yet, then tellp() will return -1 which will break us.
+ // We workaround this by writing out a dummy character and
+ // then seek back to the beginning.
+ if (!os->fail() && static_cast<int>(os->tellp()) < 0)
+ {
+ *os << '\0';
+ os->seekp(0);
+ }
+
+ // NB: We don't support mapped files with streams so add 'm'
+ return _tiffStreamOpen(name, "wm", os);
}
-TIFF*
-TIFFStreamOpen(const char* name, istream *is)
+TIFF *TIFFStreamOpen(const char *name, istream *is)
{
- // NB: We don't support mapped files with streams so add 'm'
- return _tiffStreamOpen(name, "rm", is);
+ // NB: We don't support mapped files with streams so add 'm'
+ return _tiffStreamOpen(name, "rm", is);
}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
-
diff --git a/src/3rdparty/libtiff/libtiff/tif_strip.c b/src/3rdparty/libtiff/libtiff/tif_strip.c
index c08c60a..820a254 100644
--- a/src/3rdparty/libtiff/libtiff/tif_strip.c
+++ b/src/3rdparty/libtiff/libtiff/tif_strip.c
@@ -2,23 +2,23 @@
* Copyright (c) 1991-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -32,153 +32,145 @@
/*
* Compute which strip a (row,sample) value is in.
*/
-uint32
-TIFFComputeStrip(TIFF* tif, uint32 row, uint16 sample)
+uint32_t TIFFComputeStrip(TIFF *tif, uint32_t row, uint16_t sample)
{
- static const char module[] = "TIFFComputeStrip";
- TIFFDirectory *td = &tif->tif_dir;
- uint32 strip;
+ static const char module[] = "TIFFComputeStrip";
+ TIFFDirectory *td = &tif->tif_dir;
+ uint32_t strip;
- strip = row / td->td_rowsperstrip;
- if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
- if (sample >= td->td_samplesperpixel) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%lu: Sample out of range, max %lu",
- (unsigned long) sample, (unsigned long) td->td_samplesperpixel);
- return (0);
- }
- strip += (uint32)sample*td->td_stripsperimage;
- }
- return (strip);
+ strip = row / td->td_rowsperstrip;
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
+ {
+ if (sample >= td->td_samplesperpixel)
+ {
+ TIFFErrorExtR(tif, module, "%lu: Sample out of range, max %lu",
+ (unsigned long)sample,
+ (unsigned long)td->td_samplesperpixel);
+ return (0);
+ }
+ strip += (uint32_t)sample * td->td_stripsperimage;
+ }
+ return (strip);
}
/*
* Compute how many strips are in an image.
*/
-uint32
-TIFFNumberOfStrips(TIFF* tif)
+uint32_t TIFFNumberOfStrips(TIFF *tif)
{
- TIFFDirectory *td = &tif->tif_dir;
- uint32 nstrips;
+ TIFFDirectory *td = &tif->tif_dir;
+ uint32_t nstrips;
- nstrips = (td->td_rowsperstrip == (uint32) -1 ? 1 :
- TIFFhowmany_32(td->td_imagelength, td->td_rowsperstrip));
- if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
- nstrips = _TIFFMultiply32(tif, nstrips, (uint32)td->td_samplesperpixel,
- "TIFFNumberOfStrips");
- return (nstrips);
+ nstrips = (td->td_rowsperstrip == (uint32_t)-1
+ ? 1
+ : TIFFhowmany_32(td->td_imagelength, td->td_rowsperstrip));
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
+ nstrips =
+ _TIFFMultiply32(tif, nstrips, (uint32_t)td->td_samplesperpixel,
+ "TIFFNumberOfStrips");
+ return (nstrips);
}
/*
* Compute the # bytes in a variable height, row-aligned strip.
*/
-uint64
-TIFFVStripSize64(TIFF* tif, uint32 nrows)
+uint64_t TIFFVStripSize64(TIFF *tif, uint32_t nrows)
{
- static const char module[] = "TIFFVStripSize64";
- TIFFDirectory *td = &tif->tif_dir;
- if (nrows==(uint32)(-1))
- nrows=td->td_imagelength;
- if ((td->td_planarconfig==PLANARCONFIG_CONTIG)&&
- (td->td_photometric == PHOTOMETRIC_YCBCR)&&
- (!isUpSampled(tif)))
- {
- /*
- * Packed YCbCr data contain one Cb+Cr for every
- * HorizontalSampling*VerticalSampling Y values.
- * Must also roundup width and height when calculating
- * since images that are not a multiple of the
- * horizontal/vertical subsampling area include
- * YCbCr data for the extended image.
- */
- uint16 ycbcrsubsampling[2];
- uint16 samplingblock_samples;
- uint32 samplingblocks_hor;
- uint32 samplingblocks_ver;
- uint64 samplingrow_samples;
- uint64 samplingrow_size;
- if(td->td_samplesperpixel!=3)
- {
- TIFFErrorExt(tif->tif_clientdata,module,
- "Invalid td_samplesperpixel value");
- return 0;
- }
- TIFFGetFieldDefaulted(tif,TIFFTAG_YCBCRSUBSAMPLING,ycbcrsubsampling+0,
- ycbcrsubsampling+1);
- if ((ycbcrsubsampling[0] != 1 && ycbcrsubsampling[0] != 2 && ycbcrsubsampling[0] != 4)
- ||(ycbcrsubsampling[1] != 1 && ycbcrsubsampling[1] != 2 && ycbcrsubsampling[1] != 4))
- {
- TIFFErrorExt(tif->tif_clientdata,module,
- "Invalid YCbCr subsampling (%dx%d)",
- ycbcrsubsampling[0],
- ycbcrsubsampling[1] );
- return 0;
- }
- samplingblock_samples=ycbcrsubsampling[0]*ycbcrsubsampling[1]+2;
- samplingblocks_hor=TIFFhowmany_32(td->td_imagewidth,ycbcrsubsampling[0]);
- samplingblocks_ver=TIFFhowmany_32(nrows,ycbcrsubsampling[1]);
- samplingrow_samples=_TIFFMultiply64(tif,samplingblocks_hor,samplingblock_samples,module);
- samplingrow_size=TIFFhowmany8_64(_TIFFMultiply64(tif,samplingrow_samples,td->td_bitspersample,module));
- return(_TIFFMultiply64(tif,samplingrow_size,samplingblocks_ver,module));
- }
- else
- return(_TIFFMultiply64(tif,nrows,TIFFScanlineSize64(tif),module));
+ static const char module[] = "TIFFVStripSize64";
+ TIFFDirectory *td = &tif->tif_dir;
+ if (nrows == (uint32_t)(-1))
+ nrows = td->td_imagelength;
+ if ((td->td_planarconfig == PLANARCONFIG_CONTIG) &&
+ (td->td_photometric == PHOTOMETRIC_YCBCR) && (!isUpSampled(tif)))
+ {
+ /*
+ * Packed YCbCr data contain one Cb+Cr for every
+ * HorizontalSampling*VerticalSampling Y values.
+ * Must also roundup width and height when calculating
+ * since images that are not a multiple of the
+ * horizontal/vertical subsampling area include
+ * YCbCr data for the extended image.
+ */
+ uint16_t ycbcrsubsampling[2];
+ uint16_t samplingblock_samples;
+ uint32_t samplingblocks_hor;
+ uint32_t samplingblocks_ver;
+ uint64_t samplingrow_samples;
+ uint64_t samplingrow_size;
+ if (td->td_samplesperpixel != 3)
+ {
+ TIFFErrorExtR(tif, module, "Invalid td_samplesperpixel value");
+ return 0;
+ }
+ TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRSUBSAMPLING,
+ ycbcrsubsampling + 0, ycbcrsubsampling + 1);
+ if ((ycbcrsubsampling[0] != 1 && ycbcrsubsampling[0] != 2 &&
+ ycbcrsubsampling[0] != 4) ||
+ (ycbcrsubsampling[1] != 1 && ycbcrsubsampling[1] != 2 &&
+ ycbcrsubsampling[1] != 4))
+ {
+ TIFFErrorExtR(tif, module, "Invalid YCbCr subsampling (%dx%d)",
+ ycbcrsubsampling[0], ycbcrsubsampling[1]);
+ return 0;
+ }
+ samplingblock_samples = ycbcrsubsampling[0] * ycbcrsubsampling[1] + 2;
+ samplingblocks_hor =
+ TIFFhowmany_32(td->td_imagewidth, ycbcrsubsampling[0]);
+ samplingblocks_ver = TIFFhowmany_32(nrows, ycbcrsubsampling[1]);
+ samplingrow_samples = _TIFFMultiply64(tif, samplingblocks_hor,
+ samplingblock_samples, module);
+ samplingrow_size = TIFFhowmany8_64(_TIFFMultiply64(
+ tif, samplingrow_samples, td->td_bitspersample, module));
+ return (
+ _TIFFMultiply64(tif, samplingrow_size, samplingblocks_ver, module));
+ }
+ else
+ return (_TIFFMultiply64(tif, nrows, TIFFScanlineSize64(tif), module));
}
-tmsize_t
-TIFFVStripSize(TIFF* tif, uint32 nrows)
+tmsize_t TIFFVStripSize(TIFF *tif, uint32_t nrows)
{
- static const char module[] = "TIFFVStripSize";
- uint64 m;
- m=TIFFVStripSize64(tif,nrows);
- return _TIFFCastUInt64ToSSize(tif, m, module);
+ static const char module[] = "TIFFVStripSize";
+ uint64_t m;
+ m = TIFFVStripSize64(tif, nrows);
+ return _TIFFCastUInt64ToSSize(tif, m, module);
}
/*
* Compute the # bytes in a raw strip.
*/
-uint64
-TIFFRawStripSize64(TIFF* tif, uint32 strip)
+uint64_t TIFFRawStripSize64(TIFF *tif, uint32_t strip)
{
- static const char module[] = "TIFFRawStripSize64";
- uint64 bytecount = TIFFGetStrileByteCount(tif, strip);
+ static const char module[] = "TIFFRawStripSize64";
+ uint64_t bytecount = TIFFGetStrileByteCount(tif, strip);
- if (bytecount == 0)
- {
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- TIFFErrorExt(tif->tif_clientdata, module,
- "%I64u: Invalid strip byte count, strip %lu",
- (unsigned __int64) bytecount,
- (unsigned long) strip);
-#else
- TIFFErrorExt(tif->tif_clientdata, module,
- "%llu: Invalid strip byte count, strip %lu",
- (unsigned long long) bytecount,
- (unsigned long) strip);
-#endif
- bytecount = (uint64) -1;
- }
+ if (bytecount == 0)
+ {
+ TIFFErrorExtR(tif, module,
+ "%" PRIu64 ": Invalid strip byte count, strip %lu",
+ (uint64_t)bytecount, (unsigned long)strip);
+ bytecount = (uint64_t)-1;
+ }
- return bytecount;
+ return bytecount;
}
-tmsize_t
-TIFFRawStripSize(TIFF* tif, uint32 strip)
+tmsize_t TIFFRawStripSize(TIFF *tif, uint32_t strip)
{
- static const char module[] = "TIFFRawStripSize";
- uint64 m;
- tmsize_t n;
- m=TIFFRawStripSize64(tif,strip);
- if (m==(uint64)(-1))
- n=(tmsize_t)(-1);
- else
- {
- n=(tmsize_t)m;
- if ((uint64)n!=m)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Integer overflow");
- n=0;
- }
- }
- return(n);
+ static const char module[] = "TIFFRawStripSize";
+ uint64_t m;
+ tmsize_t n;
+ m = TIFFRawStripSize64(tif, strip);
+ if (m == (uint64_t)(-1))
+ n = (tmsize_t)(-1);
+ else
+ {
+ n = (tmsize_t)m;
+ if ((uint64_t)n != m)
+ {
+ TIFFErrorExtR(tif, module, "Integer overflow");
+ n = 0;
+ }
+ }
+ return (n);
}
/*
@@ -189,22 +181,20 @@ TIFFRawStripSize(TIFF* tif, uint32 strip)
* truncated to reflect the actual space required
* to hold the strip.
*/
-uint64
-TIFFStripSize64(TIFF* tif)
+uint64_t TIFFStripSize64(TIFF *tif)
{
- TIFFDirectory* td = &tif->tif_dir;
- uint32 rps = td->td_rowsperstrip;
- if (rps > td->td_imagelength)
- rps = td->td_imagelength;
- return (TIFFVStripSize64(tif, rps));
+ TIFFDirectory *td = &tif->tif_dir;
+ uint32_t rps = td->td_rowsperstrip;
+ if (rps > td->td_imagelength)
+ rps = td->td_imagelength;
+ return (TIFFVStripSize64(tif, rps));
}
-tmsize_t
-TIFFStripSize(TIFF* tif)
+tmsize_t TIFFStripSize(TIFF *tif)
{
- static const char module[] = "TIFFStripSize";
- uint64 m;
- m=TIFFStripSize64(tif);
- return _TIFFCastUInt64ToSSize(tif, m, module);
+ static const char module[] = "TIFFStripSize";
+ uint64_t m;
+ m = TIFFStripSize64(tif);
+ return _TIFFCastUInt64ToSSize(tif, m, module);
}
/*
@@ -213,34 +203,33 @@ TIFFStripSize(TIFF* tif)
* request is <1 then we choose a strip size according
* to certain heuristics.
*/
-uint32
-TIFFDefaultStripSize(TIFF* tif, uint32 request)
+uint32_t TIFFDefaultStripSize(TIFF *tif, uint32_t request)
{
- return (*tif->tif_defstripsize)(tif, request);
+ return (*tif->tif_defstripsize)(tif, request);
}
-uint32
-_TIFFDefaultStripSize(TIFF* tif, uint32 s)
+uint32_t _TIFFDefaultStripSize(TIFF *tif, uint32_t s)
{
- if ((int32) s < 1) {
- /*
- * If RowsPerStrip is unspecified, try to break the
- * image up into strips that are approximately
- * STRIP_SIZE_DEFAULT bytes long.
- */
- uint64 scanlinesize;
- uint64 rows;
- scanlinesize=TIFFScanlineSize64(tif);
- if (scanlinesize==0)
- scanlinesize=1;
- rows=(uint64)STRIP_SIZE_DEFAULT/scanlinesize;
- if (rows==0)
- rows=1;
- else if (rows>0xFFFFFFFF)
- rows=0xFFFFFFFF;
- s=(uint32)rows;
- }
- return (s);
+ if ((int32_t)s < 1)
+ {
+ /*
+ * If RowsPerStrip is unspecified, try to break the
+ * image up into strips that are approximately
+ * STRIP_SIZE_DEFAULT bytes long.
+ */
+ uint64_t scanlinesize;
+ uint64_t rows;
+ scanlinesize = TIFFScanlineSize64(tif);
+ if (scanlinesize == 0)
+ scanlinesize = 1;
+ rows = (uint64_t)STRIP_SIZE_DEFAULT / scanlinesize;
+ if (rows == 0)
+ rows = 1;
+ else if (rows > 0xFFFFFFFF)
+ rows = 0xFFFFFFFF;
+ s = (uint32_t)rows;
+ }
+ return (s);
}
/*
@@ -253,70 +242,79 @@ _TIFFDefaultStripSize(TIFF* tif, uint32 s)
* subsampling lines divided by vertical subsampling. It should thus make
* sense when multiplied by a multiple of vertical subsampling.
*/
-uint64
-TIFFScanlineSize64(TIFF* tif)
+uint64_t TIFFScanlineSize64(TIFF *tif)
{
- static const char module[] = "TIFFScanlineSize64";
- TIFFDirectory *td = &tif->tif_dir;
- uint64 scanline_size;
- if (td->td_planarconfig==PLANARCONFIG_CONTIG)
- {
- if ((td->td_photometric==PHOTOMETRIC_YCBCR)&&
- (td->td_samplesperpixel==3)&&
- (!isUpSampled(tif)))
- {
- uint16 ycbcrsubsampling[2];
- uint16 samplingblock_samples;
- uint32 samplingblocks_hor;
- uint64 samplingrow_samples;
- uint64 samplingrow_size;
- if(td->td_samplesperpixel!=3)
- {
- TIFFErrorExt(tif->tif_clientdata,module,
- "Invalid td_samplesperpixel value");
- return 0;
- }
- TIFFGetFieldDefaulted(tif,TIFFTAG_YCBCRSUBSAMPLING,
- ycbcrsubsampling+0,
- ycbcrsubsampling+1);
- if (((ycbcrsubsampling[0]!=1)&&(ycbcrsubsampling[0]!=2)&&(ycbcrsubsampling[0]!=4)) ||
- ((ycbcrsubsampling[1]!=1)&&(ycbcrsubsampling[1]!=2)&&(ycbcrsubsampling[1]!=4)))
- {
- TIFFErrorExt(tif->tif_clientdata,module,
- "Invalid YCbCr subsampling");
- return 0;
- }
- samplingblock_samples = ycbcrsubsampling[0]*ycbcrsubsampling[1]+2;
- samplingblocks_hor = TIFFhowmany_32(td->td_imagewidth,ycbcrsubsampling[0]);
- samplingrow_samples = _TIFFMultiply64(tif,samplingblocks_hor,samplingblock_samples,module);
- samplingrow_size = TIFFhowmany_64(_TIFFMultiply64(tif,samplingrow_samples,td->td_bitspersample,module),8);
- scanline_size = (samplingrow_size/ycbcrsubsampling[1]);
- }
- else
- {
- uint64 scanline_samples;
- scanline_samples=_TIFFMultiply64(tif,td->td_imagewidth,td->td_samplesperpixel,module);
- scanline_size=TIFFhowmany_64(_TIFFMultiply64(tif,scanline_samples,td->td_bitspersample,module),8);
- }
- }
- else
+ static const char module[] = "TIFFScanlineSize64";
+ TIFFDirectory *td = &tif->tif_dir;
+ uint64_t scanline_size;
+ if (td->td_planarconfig == PLANARCONFIG_CONTIG)
+ {
+ if ((td->td_photometric == PHOTOMETRIC_YCBCR) &&
+ (td->td_samplesperpixel == 3) && (!isUpSampled(tif)))
{
- scanline_size=TIFFhowmany_64(_TIFFMultiply64(tif,td->td_imagewidth,td->td_bitspersample,module),8);
+ uint16_t ycbcrsubsampling[2];
+ uint16_t samplingblock_samples;
+ uint32_t samplingblocks_hor;
+ uint64_t samplingrow_samples;
+ uint64_t samplingrow_size;
+ if (td->td_samplesperpixel != 3)
+ {
+ TIFFErrorExtR(tif, module, "Invalid td_samplesperpixel value");
+ return 0;
+ }
+ TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRSUBSAMPLING,
+ ycbcrsubsampling + 0, ycbcrsubsampling + 1);
+ if (((ycbcrsubsampling[0] != 1) && (ycbcrsubsampling[0] != 2) &&
+ (ycbcrsubsampling[0] != 4)) ||
+ ((ycbcrsubsampling[1] != 1) && (ycbcrsubsampling[1] != 2) &&
+ (ycbcrsubsampling[1] != 4)))
+ {
+ TIFFErrorExtR(tif, module, "Invalid YCbCr subsampling");
+ return 0;
+ }
+ samplingblock_samples =
+ ycbcrsubsampling[0] * ycbcrsubsampling[1] + 2;
+ samplingblocks_hor =
+ TIFFhowmany_32(td->td_imagewidth, ycbcrsubsampling[0]);
+ samplingrow_samples = _TIFFMultiply64(
+ tif, samplingblocks_hor, samplingblock_samples, module);
+ samplingrow_size =
+ TIFFhowmany_64(_TIFFMultiply64(tif, samplingrow_samples,
+ td->td_bitspersample, module),
+ 8);
+ scanline_size = (samplingrow_size / ycbcrsubsampling[1]);
}
- if (scanline_size == 0)
+ else
{
- TIFFErrorExt(tif->tif_clientdata,module,"Computed scanline size is zero");
- return 0;
+ uint64_t scanline_samples;
+ scanline_samples = _TIFFMultiply64(tif, td->td_imagewidth,
+ td->td_samplesperpixel, module);
+ scanline_size =
+ TIFFhowmany_64(_TIFFMultiply64(tif, scanline_samples,
+ td->td_bitspersample, module),
+ 8);
}
- return(scanline_size);
+ }
+ else
+ {
+ scanline_size =
+ TIFFhowmany_64(_TIFFMultiply64(tif, td->td_imagewidth,
+ td->td_bitspersample, module),
+ 8);
+ }
+ if (scanline_size == 0)
+ {
+ TIFFErrorExtR(tif, module, "Computed scanline size is zero");
+ return 0;
+ }
+ return (scanline_size);
}
-tmsize_t
-TIFFScanlineSize(TIFF* tif)
+tmsize_t TIFFScanlineSize(TIFF *tif)
{
- static const char module[] = "TIFFScanlineSize";
- uint64 m;
- m=TIFFScanlineSize64(tif);
- return _TIFFCastUInt64ToSSize(tif, m, module);
+ static const char module[] = "TIFFScanlineSize";
+ uint64_t m;
+ m = TIFFScanlineSize64(tif);
+ return _TIFFCastUInt64ToSSize(tif, m, module);
}
/*
@@ -325,35 +323,28 @@ TIFFScanlineSize(TIFF* tif)
* I/O size returned by TIFFScanlineSize which may be less
* if data is store as separate planes).
*/
-uint64
-TIFFRasterScanlineSize64(TIFF* tif)
+uint64_t TIFFRasterScanlineSize64(TIFF *tif)
{
- static const char module[] = "TIFFRasterScanlineSize64";
- TIFFDirectory *td = &tif->tif_dir;
- uint64 scanline;
+ static const char module[] = "TIFFRasterScanlineSize64";
+ TIFFDirectory *td = &tif->tif_dir;
+ uint64_t scanline;
- scanline = _TIFFMultiply64(tif, td->td_bitspersample, td->td_imagewidth, module);
- if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
- scanline = _TIFFMultiply64(tif, scanline, td->td_samplesperpixel, module);
- return (TIFFhowmany8_64(scanline));
- } else
- return (_TIFFMultiply64(tif, TIFFhowmany8_64(scanline),
- td->td_samplesperpixel, module));
+ scanline =
+ _TIFFMultiply64(tif, td->td_bitspersample, td->td_imagewidth, module);
+ if (td->td_planarconfig == PLANARCONFIG_CONTIG)
+ {
+ scanline =
+ _TIFFMultiply64(tif, scanline, td->td_samplesperpixel, module);
+ return (TIFFhowmany8_64(scanline));
+ }
+ else
+ return (_TIFFMultiply64(tif, TIFFhowmany8_64(scanline),
+ td->td_samplesperpixel, module));
}
-tmsize_t
-TIFFRasterScanlineSize(TIFF* tif)
+tmsize_t TIFFRasterScanlineSize(TIFF *tif)
{
- static const char module[] = "TIFFRasterScanlineSize";
- uint64 m;
- m=TIFFRasterScanlineSize64(tif);
- return _TIFFCastUInt64ToSSize(tif, m, module);
+ static const char module[] = "TIFFRasterScanlineSize";
+ uint64_t m;
+ m = TIFFRasterScanlineSize64(tif);
+ return _TIFFCastUInt64ToSSize(tif, m, module);
}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_swab.c b/src/3rdparty/libtiff/libtiff/tif_swab.c
index b174ba6..827b025 100644
--- a/src/3rdparty/libtiff/libtiff/tif_swab.c
+++ b/src/3rdparty/libtiff/libtiff/tif_swab.c
@@ -2,23 +2,23 @@
* Copyright (c) 1988-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -30,169 +30,218 @@
#include "tiffiop.h"
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabShort)
-void
-TIFFSwabShort(uint16* wp)
+void TIFFSwabShort(uint16_t *wp)
{
- register unsigned char* cp = (unsigned char*) wp;
- unsigned char t;
- assert(sizeof(uint16)==2);
- t = cp[1]; cp[1] = cp[0]; cp[0] = t;
+ register unsigned char *cp = (unsigned char *)wp;
+ unsigned char t;
+ assert(sizeof(uint16_t) == 2);
+ t = cp[1];
+ cp[1] = cp[0];
+ cp[0] = t;
}
#endif
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabLong)
-void
-TIFFSwabLong(uint32* lp)
+void TIFFSwabLong(uint32_t *lp)
{
- register unsigned char* cp = (unsigned char*) lp;
- unsigned char t;
- assert(sizeof(uint32)==4);
- t = cp[3]; cp[3] = cp[0]; cp[0] = t;
- t = cp[2]; cp[2] = cp[1]; cp[1] = t;
+ register unsigned char *cp = (unsigned char *)lp;
+ unsigned char t;
+ assert(sizeof(uint32_t) == 4);
+ t = cp[3];
+ cp[3] = cp[0];
+ cp[0] = t;
+ t = cp[2];
+ cp[2] = cp[1];
+ cp[1] = t;
}
#endif
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabLong8)
-void
-TIFFSwabLong8(uint64* lp)
+void TIFFSwabLong8(uint64_t *lp)
{
- register unsigned char* cp = (unsigned char*) lp;
- unsigned char t;
- assert(sizeof(uint64)==8);
- t = cp[7]; cp[7] = cp[0]; cp[0] = t;
- t = cp[6]; cp[6] = cp[1]; cp[1] = t;
- t = cp[5]; cp[5] = cp[2]; cp[2] = t;
- t = cp[4]; cp[4] = cp[3]; cp[3] = t;
+ register unsigned char *cp = (unsigned char *)lp;
+ unsigned char t;
+ assert(sizeof(uint64_t) == 8);
+ t = cp[7];
+ cp[7] = cp[0];
+ cp[0] = t;
+ t = cp[6];
+ cp[6] = cp[1];
+ cp[1] = t;
+ t = cp[5];
+ cp[5] = cp[2];
+ cp[2] = t;
+ t = cp[4];
+ cp[4] = cp[3];
+ cp[3] = t;
}
#endif
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfShort)
-void
-TIFFSwabArrayOfShort(register uint16* wp, tmsize_t n)
+void TIFFSwabArrayOfShort(register uint16_t *wp, tmsize_t n)
{
- register unsigned char* cp;
- register unsigned char t;
- assert(sizeof(uint16)==2);
- /* XXX unroll loop some */
- while (n-- > 0) {
- cp = (unsigned char*) wp;
- t = cp[1]; cp[1] = cp[0]; cp[0] = t;
- wp++;
- }
+ register unsigned char *cp;
+ register unsigned char t;
+ assert(sizeof(uint16_t) == 2);
+ /* XXX unroll loop some */
+ while (n-- > 0)
+ {
+ cp = (unsigned char *)wp;
+ t = cp[1];
+ cp[1] = cp[0];
+ cp[0] = t;
+ wp++;
+ }
}
#endif
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfTriples)
-void
-TIFFSwabArrayOfTriples(register uint8* tp, tmsize_t n)
+void TIFFSwabArrayOfTriples(register uint8_t *tp, tmsize_t n)
{
- unsigned char* cp;
- unsigned char t;
+ unsigned char *cp;
+ unsigned char t;
- /* XXX unroll loop some */
- while (n-- > 0) {
- cp = (unsigned char*) tp;
- t = cp[2]; cp[2] = cp[0]; cp[0] = t;
- tp += 3;
- }
+ /* XXX unroll loop some */
+ while (n-- > 0)
+ {
+ cp = (unsigned char *)tp;
+ t = cp[2];
+ cp[2] = cp[0];
+ cp[0] = t;
+ tp += 3;
+ }
}
#endif
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfLong)
-void
-TIFFSwabArrayOfLong(register uint32* lp, tmsize_t n)
+void TIFFSwabArrayOfLong(register uint32_t *lp, tmsize_t n)
{
- register unsigned char *cp;
- register unsigned char t;
- assert(sizeof(uint32)==4);
- /* XXX unroll loop some */
- while (n-- > 0) {
- cp = (unsigned char *)lp;
- t = cp[3]; cp[3] = cp[0]; cp[0] = t;
- t = cp[2]; cp[2] = cp[1]; cp[1] = t;
- lp++;
- }
+ register unsigned char *cp;
+ register unsigned char t;
+ assert(sizeof(uint32_t) == 4);
+ /* XXX unroll loop some */
+ while (n-- > 0)
+ {
+ cp = (unsigned char *)lp;
+ t = cp[3];
+ cp[3] = cp[0];
+ cp[0] = t;
+ t = cp[2];
+ cp[2] = cp[1];
+ cp[1] = t;
+ lp++;
+ }
}
#endif
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfLong8)
-void
-TIFFSwabArrayOfLong8(register uint64* lp, tmsize_t n)
+void TIFFSwabArrayOfLong8(register uint64_t *lp, tmsize_t n)
{
- register unsigned char *cp;
- register unsigned char t;
- assert(sizeof(uint64)==8);
- /* XXX unroll loop some */
- while (n-- > 0) {
- cp = (unsigned char *)lp;
- t = cp[7]; cp[7] = cp[0]; cp[0] = t;
- t = cp[6]; cp[6] = cp[1]; cp[1] = t;
- t = cp[5]; cp[5] = cp[2]; cp[2] = t;
- t = cp[4]; cp[4] = cp[3]; cp[3] = t;
- lp++;
- }
+ register unsigned char *cp;
+ register unsigned char t;
+ assert(sizeof(uint64_t) == 8);
+ /* XXX unroll loop some */
+ while (n-- > 0)
+ {
+ cp = (unsigned char *)lp;
+ t = cp[7];
+ cp[7] = cp[0];
+ cp[0] = t;
+ t = cp[6];
+ cp[6] = cp[1];
+ cp[1] = t;
+ t = cp[5];
+ cp[5] = cp[2];
+ cp[2] = t;
+ t = cp[4];
+ cp[4] = cp[3];
+ cp[3] = t;
+ lp++;
+ }
}
#endif
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabFloat)
-void
-TIFFSwabFloat(float* fp)
+void TIFFSwabFloat(float *fp)
{
- register unsigned char* cp = (unsigned char*) fp;
- unsigned char t;
- assert(sizeof(float)==4);
- t = cp[3]; cp[3] = cp[0]; cp[0] = t;
- t = cp[2]; cp[2] = cp[1]; cp[1] = t;
+ register unsigned char *cp = (unsigned char *)fp;
+ unsigned char t;
+ assert(sizeof(float) == 4);
+ t = cp[3];
+ cp[3] = cp[0];
+ cp[0] = t;
+ t = cp[2];
+ cp[2] = cp[1];
+ cp[1] = t;
}
#endif
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfFloat)
-void
-TIFFSwabArrayOfFloat(register float* fp, tmsize_t n)
+void TIFFSwabArrayOfFloat(register float *fp, tmsize_t n)
{
- register unsigned char *cp;
- register unsigned char t;
- assert(sizeof(float)==4);
- /* XXX unroll loop some */
- while (n-- > 0) {
- cp = (unsigned char *)fp;
- t = cp[3]; cp[3] = cp[0]; cp[0] = t;
- t = cp[2]; cp[2] = cp[1]; cp[1] = t;
- fp++;
- }
+ register unsigned char *cp;
+ register unsigned char t;
+ assert(sizeof(float) == 4);
+ /* XXX unroll loop some */
+ while (n-- > 0)
+ {
+ cp = (unsigned char *)fp;
+ t = cp[3];
+ cp[3] = cp[0];
+ cp[0] = t;
+ t = cp[2];
+ cp[2] = cp[1];
+ cp[1] = t;
+ fp++;
+ }
}
#endif
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabDouble)
-void
-TIFFSwabDouble(double *dp)
+void TIFFSwabDouble(double *dp)
{
- register unsigned char* cp = (unsigned char*) dp;
- unsigned char t;
- assert(sizeof(double)==8);
- t = cp[7]; cp[7] = cp[0]; cp[0] = t;
- t = cp[6]; cp[6] = cp[1]; cp[1] = t;
- t = cp[5]; cp[5] = cp[2]; cp[2] = t;
- t = cp[4]; cp[4] = cp[3]; cp[3] = t;
+ register unsigned char *cp = (unsigned char *)dp;
+ unsigned char t;
+ assert(sizeof(double) == 8);
+ t = cp[7];
+ cp[7] = cp[0];
+ cp[0] = t;
+ t = cp[6];
+ cp[6] = cp[1];
+ cp[1] = t;
+ t = cp[5];
+ cp[5] = cp[2];
+ cp[2] = t;
+ t = cp[4];
+ cp[4] = cp[3];
+ cp[3] = t;
}
#endif
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfDouble)
-void
-TIFFSwabArrayOfDouble(double* dp, tmsize_t n)
+void TIFFSwabArrayOfDouble(double *dp, tmsize_t n)
{
- register unsigned char *cp;
- register unsigned char t;
- assert(sizeof(double)==8);
- /* XXX unroll loop some */
- while (n-- > 0) {
- cp = (unsigned char *)dp;
- t = cp[7]; cp[7] = cp[0]; cp[0] = t;
- t = cp[6]; cp[6] = cp[1]; cp[1] = t;
- t = cp[5]; cp[5] = cp[2]; cp[2] = t;
- t = cp[4]; cp[4] = cp[3]; cp[3] = t;
- dp++;
- }
+ register unsigned char *cp;
+ register unsigned char t;
+ assert(sizeof(double) == 8);
+ /* XXX unroll loop some */
+ while (n-- > 0)
+ {
+ cp = (unsigned char *)dp;
+ t = cp[7];
+ cp[7] = cp[0];
+ cp[0] = t;
+ t = cp[6];
+ cp[6] = cp[1];
+ cp[1] = t;
+ t = cp[5];
+ cp[5] = cp[2];
+ cp[2] = t;
+ t = cp[4];
+ cp[4] = cp[3];
+ cp[3] = t;
+ dp++;
+ }
}
#endif
@@ -206,105 +255,75 @@ TIFFSwabArrayOfDouble(double* dp, tmsize_t n)
* do not reverse bit values.
*/
static const unsigned char TIFFBitRevTable[256] = {
- 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
- 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
- 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
- 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
- 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
- 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
- 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
- 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
- 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
- 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
- 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
- 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
- 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
- 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
- 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
- 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
- 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
- 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
- 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
- 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
- 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
- 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
- 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
- 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
- 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
- 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
- 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
- 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
- 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
- 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
- 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
- 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
-};
+ 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0,
+ 0x30, 0xb0, 0x70, 0xf0, 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
+ 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, 0x04, 0x84, 0x44, 0xc4,
+ 0x24, 0xa4, 0x64, 0xe4, 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
+ 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, 0xdc,
+ 0x3c, 0xbc, 0x7c, 0xfc, 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
+ 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, 0x0a, 0x8a, 0x4a, 0xca,
+ 0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
+ 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, 0xd6,
+ 0x36, 0xb6, 0x76, 0xf6, 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
+ 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, 0x01, 0x81, 0x41, 0xc1,
+ 0x21, 0xa1, 0x61, 0xe1, 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
+ 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 0x19, 0x99, 0x59, 0xd9,
+ 0x39, 0xb9, 0x79, 0xf9, 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
+ 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, 0x0d, 0x8d, 0x4d, 0xcd,
+ 0x2d, 0xad, 0x6d, 0xed, 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
+ 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 0x13, 0x93, 0x53, 0xd3,
+ 0x33, 0xb3, 0x73, 0xf3, 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
+ 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, 0x07, 0x87, 0x47, 0xc7,
+ 0x27, 0xa7, 0x67, 0xe7, 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
+ 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 0x1f, 0x9f, 0x5f, 0xdf,
+ 0x3f, 0xbf, 0x7f, 0xff};
static const unsigned char TIFFNoBitRevTable[256] = {
- 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
- 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
- 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
- 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
- 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
- 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
- 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
- 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
- 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
- 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
- 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
- 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
- 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
- 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
- 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
- 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
- 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
- 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
- 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
- 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
- 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
- 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
- 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
- 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
- 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
- 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
- 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
- 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
- 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
- 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
- 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
- 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
+ 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
+ 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
+ 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53,
+ 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
+ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
+ 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
+ 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
+ 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3,
+ 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb,
+ 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3,
+ 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
+ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
+ 0xfc, 0xfd, 0xfe, 0xff,
};
-const unsigned char*
-TIFFGetBitRevTable(int reversed)
+const unsigned char *TIFFGetBitRevTable(int reversed)
{
- return (reversed ? TIFFBitRevTable : TIFFNoBitRevTable);
+ return (reversed ? TIFFBitRevTable : TIFFNoBitRevTable);
}
-void
-TIFFReverseBits(uint8* cp, tmsize_t n)
+void TIFFReverseBits(uint8_t *cp, tmsize_t n)
{
- for (; n > 8; n -= 8) {
- cp[0] = TIFFBitRevTable[cp[0]];
- cp[1] = TIFFBitRevTable[cp[1]];
- cp[2] = TIFFBitRevTable[cp[2]];
- cp[3] = TIFFBitRevTable[cp[3]];
- cp[4] = TIFFBitRevTable[cp[4]];
- cp[5] = TIFFBitRevTable[cp[5]];
- cp[6] = TIFFBitRevTable[cp[6]];
- cp[7] = TIFFBitRevTable[cp[7]];
- cp += 8;
- }
- while (n-- > 0) {
- *cp = TIFFBitRevTable[*cp];
- cp++;
- }
+ for (; n > 8; n -= 8)
+ {
+ cp[0] = TIFFBitRevTable[cp[0]];
+ cp[1] = TIFFBitRevTable[cp[1]];
+ cp[2] = TIFFBitRevTable[cp[2]];
+ cp[3] = TIFFBitRevTable[cp[3]];
+ cp[4] = TIFFBitRevTable[cp[4]];
+ cp[5] = TIFFBitRevTable[cp[5]];
+ cp[6] = TIFFBitRevTable[cp[6]];
+ cp[7] = TIFFBitRevTable[cp[7]];
+ cp += 8;
+ }
+ while (n-- > 0)
+ {
+ *cp = TIFFBitRevTable[*cp];
+ cp++;
+ }
}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_thunder.c b/src/3rdparty/libtiff/libtiff/tif_thunder.c
index db6383a..1f97362 100644
--- a/src/3rdparty/libtiff/libtiff/tif_thunder.c
+++ b/src/3rdparty/libtiff/libtiff/tif_thunder.c
@@ -2,23 +2,23 @@
* Copyright (c) 1988-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -41,166 +41,158 @@
* or 3-bit delta values are used, with the deltas packed
* into a single byte.
*/
-#define THUNDER_DATA 0x3f /* mask for 6-bit data */
-#define THUNDER_CODE 0xc0 /* mask for 2-bit code word */
+#define THUNDER_DATA 0x3f /* mask for 6-bit data */
+#define THUNDER_CODE 0xc0 /* mask for 2-bit code word */
/* code values */
-#define THUNDER_RUN 0x00 /* run of pixels w/ encoded count */
-#define THUNDER_2BITDELTAS 0x40 /* 3 pixels w/ encoded 2-bit deltas */
-#define DELTA2_SKIP 2 /* skip code for 2-bit deltas */
-#define THUNDER_3BITDELTAS 0x80 /* 2 pixels w/ encoded 3-bit deltas */
-#define DELTA3_SKIP 4 /* skip code for 3-bit deltas */
-#define THUNDER_RAW 0xc0 /* raw data encoded */
+#define THUNDER_RUN 0x00 /* run of pixels w/ encoded count */
+#define THUNDER_2BITDELTAS 0x40 /* 3 pixels w/ encoded 2-bit deltas */
+#define DELTA2_SKIP 2 /* skip code for 2-bit deltas */
+#define THUNDER_3BITDELTAS 0x80 /* 2 pixels w/ encoded 3-bit deltas */
+#define DELTA3_SKIP 4 /* skip code for 3-bit deltas */
+#define THUNDER_RAW 0xc0 /* raw data encoded */
-static const int twobitdeltas[4] = { 0, 1, 0, -1 };
-static const int threebitdeltas[8] = { 0, 1, 2, 3, 0, -3, -2, -1 };
+static const int twobitdeltas[4] = {0, 1, 0, -1};
+static const int threebitdeltas[8] = {0, 1, 2, 3, 0, -3, -2, -1};
-#define SETPIXEL(op, v) { \
- lastpixel = (v) & 0xf; \
- if ( npixels < maxpixels ) \
- { \
- if (npixels++ & 1) \
- *op++ |= lastpixel; \
- else \
- op[0] = (uint8) (lastpixel << 4); \
- } \
-}
+#define SETPIXEL(op, v) \
+ { \
+ lastpixel = (v)&0xf; \
+ if (npixels < maxpixels) \
+ { \
+ if (npixels++ & 1) \
+ *op++ |= lastpixel; \
+ else \
+ op[0] = (uint8_t)(lastpixel << 4); \
+ } \
+ }
-static int
-ThunderSetupDecode(TIFF* tif)
+static int ThunderSetupDecode(TIFF *tif)
{
- static const char module[] = "ThunderSetupDecode";
+ static const char module[] = "ThunderSetupDecode";
- if( tif->tif_dir.td_bitspersample != 4 )
- {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Wrong bitspersample value (%d), Thunder decoder only supports 4bits per sample.",
- (int) tif->tif_dir.td_bitspersample );
- return 0;
- }
-
+ if (tif->tif_dir.td_bitspersample != 4)
+ {
+ TIFFErrorExtR(tif, module,
+ "Wrong bitspersample value (%d), Thunder decoder only "
+ "supports 4bits per sample.",
+ (int)tif->tif_dir.td_bitspersample);
+ return 0;
+ }
- return (1);
+ return (1);
}
-static int
-ThunderDecode(TIFF* tif, uint8* op, tmsize_t maxpixels)
+static int ThunderDecode(TIFF *tif, uint8_t *op, tmsize_t maxpixels)
{
- static const char module[] = "ThunderDecode";
- register unsigned char *bp;
- register tmsize_t cc;
- unsigned int lastpixel;
- tmsize_t npixels;
+ static const char module[] = "ThunderDecode";
+ register unsigned char *bp;
+ register tmsize_t cc;
+ unsigned int lastpixel;
+ tmsize_t npixels;
- bp = (unsigned char *)tif->tif_rawcp;
- cc = tif->tif_rawcc;
- lastpixel = 0;
- npixels = 0;
- while (cc > 0 && npixels < maxpixels) {
- int n, delta;
+ bp = (unsigned char *)tif->tif_rawcp;
+ cc = tif->tif_rawcc;
+ lastpixel = 0;
+ npixels = 0;
+ while (cc > 0 && npixels < maxpixels)
+ {
+ int n, delta;
- n = *bp++;
- cc--;
- switch (n & THUNDER_CODE) {
- case THUNDER_RUN: /* pixel run */
- /*
- * Replicate the last pixel n times,
- * where n is the lower-order 6 bits.
- */
- if (npixels & 1) {
- op[0] |= lastpixel;
- lastpixel = *op++; npixels++; n--;
- } else
- lastpixel |= lastpixel << 4;
- npixels += n;
- if (npixels < maxpixels) {
- for (; n > 0; n -= 2)
- *op++ = (uint8) lastpixel;
- }
- if (n == -1)
- *--op &= 0xf0;
- lastpixel &= 0xf;
- break;
- case THUNDER_2BITDELTAS: /* 2-bit deltas */
- if ((delta = ((n >> 4) & 3)) != DELTA2_SKIP)
- SETPIXEL(op, (unsigned)((int)lastpixel + twobitdeltas[delta]));
- if ((delta = ((n >> 2) & 3)) != DELTA2_SKIP)
- SETPIXEL(op, (unsigned)((int)lastpixel + twobitdeltas[delta]));
- if ((delta = (n & 3)) != DELTA2_SKIP)
- SETPIXEL(op, (unsigned)((int)lastpixel + twobitdeltas[delta]));
- break;
- case THUNDER_3BITDELTAS: /* 3-bit deltas */
- if ((delta = ((n >> 3) & 7)) != DELTA3_SKIP)
- SETPIXEL(op, (unsigned)((int)lastpixel + threebitdeltas[delta]));
- if ((delta = (n & 7)) != DELTA3_SKIP)
- SETPIXEL(op, (unsigned)((int)lastpixel + threebitdeltas[delta]));
- break;
- case THUNDER_RAW: /* raw data */
- SETPIXEL(op, n);
- break;
- }
- }
- tif->tif_rawcp = (uint8*) bp;
- tif->tif_rawcc = cc;
- if (npixels != maxpixels) {
-#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s data at scanline %lu (%I64u != %I64u)",
- npixels < maxpixels ? "Not enough" : "Too much",
- (unsigned long) tif->tif_row,
- (unsigned __int64) npixels,
- (unsigned __int64) maxpixels);
-#else
- TIFFErrorExt(tif->tif_clientdata, module,
- "%s data at scanline %lu (%llu != %llu)",
- npixels < maxpixels ? "Not enough" : "Too much",
- (unsigned long) tif->tif_row,
- (unsigned long long) npixels,
- (unsigned long long) maxpixels);
-#endif
- return (0);
- }
+ n = *bp++;
+ cc--;
+ switch (n & THUNDER_CODE)
+ {
+ case THUNDER_RUN: /* pixel run */
+ /*
+ * Replicate the last pixel n times,
+ * where n is the lower-order 6 bits.
+ */
+ if (npixels & 1)
+ {
+ op[0] |= lastpixel;
+ lastpixel = *op++;
+ npixels++;
+ n--;
+ }
+ else
+ lastpixel |= lastpixel << 4;
+ npixels += n;
+ if (npixels < maxpixels)
+ {
+ for (; n > 0; n -= 2)
+ *op++ = (uint8_t)lastpixel;
+ }
+ if (n == -1)
+ *--op &= 0xf0;
+ lastpixel &= 0xf;
+ break;
+ case THUNDER_2BITDELTAS: /* 2-bit deltas */
+ if ((delta = ((n >> 4) & 3)) != DELTA2_SKIP)
+ SETPIXEL(op,
+ (unsigned)((int)lastpixel + twobitdeltas[delta]));
+ if ((delta = ((n >> 2) & 3)) != DELTA2_SKIP)
+ SETPIXEL(op,
+ (unsigned)((int)lastpixel + twobitdeltas[delta]));
+ if ((delta = (n & 3)) != DELTA2_SKIP)
+ SETPIXEL(op,
+ (unsigned)((int)lastpixel + twobitdeltas[delta]));
+ break;
+ case THUNDER_3BITDELTAS: /* 3-bit deltas */
+ if ((delta = ((n >> 3) & 7)) != DELTA3_SKIP)
+ SETPIXEL(
+ op, (unsigned)((int)lastpixel + threebitdeltas[delta]));
+ if ((delta = (n & 7)) != DELTA3_SKIP)
+ SETPIXEL(
+ op, (unsigned)((int)lastpixel + threebitdeltas[delta]));
+ break;
+ case THUNDER_RAW: /* raw data */
+ SETPIXEL(op, n);
+ break;
+ }
+ }
+ tif->tif_rawcp = (uint8_t *)bp;
+ tif->tif_rawcc = cc;
+ if (npixels != maxpixels)
+ {
+ TIFFErrorExtR(tif, module,
+ "%s data at scanline %lu (%" PRIu64 " != %" PRIu64 ")",
+ npixels < maxpixels ? "Not enough" : "Too much",
+ (unsigned long)tif->tif_row, (uint64_t)npixels,
+ (uint64_t)maxpixels);
+ return (0);
+ }
- return (1);
+ return (1);
}
-static int
-ThunderDecodeRow(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s)
+static int ThunderDecodeRow(TIFF *tif, uint8_t *buf, tmsize_t occ, uint16_t s)
{
- static const char module[] = "ThunderDecodeRow";
- uint8* row = buf;
-
- (void) s;
- if (occ % tif->tif_scanlinesize)
- {
- TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be read");
- return (0);
- }
- while (occ > 0) {
- if (!ThunderDecode(tif, row, tif->tif_dir.td_imagewidth))
- return (0);
- occ -= tif->tif_scanlinesize;
- row += tif->tif_scanlinesize;
- }
- return (1);
+ static const char module[] = "ThunderDecodeRow";
+ uint8_t *row = buf;
+
+ (void)s;
+ if (occ % tif->tif_scanlinesize)
+ {
+ TIFFErrorExtR(tif, module, "Fractional scanlines cannot be read");
+ return (0);
+ }
+ while (occ > 0)
+ {
+ if (!ThunderDecode(tif, row, tif->tif_dir.td_imagewidth))
+ return (0);
+ occ -= tif->tif_scanlinesize;
+ row += tif->tif_scanlinesize;
+ }
+ return (1);
}
-int
-TIFFInitThunderScan(TIFF* tif, int scheme)
+int TIFFInitThunderScan(TIFF *tif, int scheme)
{
- (void) scheme;
+ (void)scheme;
- tif->tif_setupdecode = ThunderSetupDecode;
- tif->tif_decoderow = ThunderDecodeRow;
- tif->tif_decodestrip = ThunderDecodeRow;
- return (1);
+ tif->tif_setupdecode = ThunderSetupDecode;
+ tif->tif_decoderow = ThunderDecodeRow;
+ tif->tif_decodestrip = ThunderDecodeRow;
+ return (1);
}
#endif /* THUNDER_SUPPORT */
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_tile.c b/src/3rdparty/libtiff/libtiff/tif_tile.c
index 661cc77..f07032f 100644
--- a/src/3rdparty/libtiff/libtiff/tif_tile.c
+++ b/src/3rdparty/libtiff/libtiff/tif_tile.c
@@ -2,23 +2,23 @@
* Copyright (c) 1991-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -32,234 +32,230 @@
/*
* Compute which tile an (x,y,z,s) value is in.
*/
-uint32
-TIFFComputeTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s)
+uint32_t TIFFComputeTile(TIFF *tif, uint32_t x, uint32_t y, uint32_t z,
+ uint16_t s)
{
- TIFFDirectory *td = &tif->tif_dir;
- uint32 dx = td->td_tilewidth;
- uint32 dy = td->td_tilelength;
- uint32 dz = td->td_tiledepth;
- uint32 tile = 1;
+ TIFFDirectory *td = &tif->tif_dir;
+ uint32_t dx = td->td_tilewidth;
+ uint32_t dy = td->td_tilelength;
+ uint32_t dz = td->td_tiledepth;
+ uint32_t tile = 1;
- if (td->td_imagedepth == 1)
- z = 0;
- if (dx == (uint32) -1)
- dx = td->td_imagewidth;
- if (dy == (uint32) -1)
- dy = td->td_imagelength;
- if (dz == (uint32) -1)
- dz = td->td_imagedepth;
- if (dx != 0 && dy != 0 && dz != 0) {
- uint32 xpt = TIFFhowmany_32(td->td_imagewidth, dx);
- uint32 ypt = TIFFhowmany_32(td->td_imagelength, dy);
- uint32 zpt = TIFFhowmany_32(td->td_imagedepth, dz);
+ if (td->td_imagedepth == 1)
+ z = 0;
+ if (dx == (uint32_t)-1)
+ dx = td->td_imagewidth;
+ if (dy == (uint32_t)-1)
+ dy = td->td_imagelength;
+ if (dz == (uint32_t)-1)
+ dz = td->td_imagedepth;
+ if (dx != 0 && dy != 0 && dz != 0)
+ {
+ uint32_t xpt = TIFFhowmany_32(td->td_imagewidth, dx);
+ uint32_t ypt = TIFFhowmany_32(td->td_imagelength, dy);
+ uint32_t zpt = TIFFhowmany_32(td->td_imagedepth, dz);
- if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
- tile = (xpt*ypt*zpt)*s +
- (xpt*ypt)*(z/dz) +
- xpt*(y/dy) +
- x/dx;
- else
- tile = (xpt*ypt)*(z/dz) + xpt*(y/dy) + x/dx;
- }
- return (tile);
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
+ tile = (xpt * ypt * zpt) * s + (xpt * ypt) * (z / dz) +
+ xpt * (y / dy) + x / dx;
+ else
+ tile = (xpt * ypt) * (z / dz) + xpt * (y / dy) + x / dx;
+ }
+ return (tile);
}
/*
* Check an (x,y,z,s) coordinate
* against the image bounds.
*/
-int
-TIFFCheckTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s)
+int TIFFCheckTile(TIFF *tif, uint32_t x, uint32_t y, uint32_t z, uint16_t s)
{
- TIFFDirectory *td = &tif->tif_dir;
+ TIFFDirectory *td = &tif->tif_dir;
- if (x >= td->td_imagewidth) {
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "%lu: Col out of range, max %lu",
- (unsigned long) x,
- (unsigned long) (td->td_imagewidth - 1));
- return (0);
- }
- if (y >= td->td_imagelength) {
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "%lu: Row out of range, max %lu",
- (unsigned long) y,
- (unsigned long) (td->td_imagelength - 1));
- return (0);
- }
- if (z >= td->td_imagedepth) {
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "%lu: Depth out of range, max %lu",
- (unsigned long) z,
- (unsigned long) (td->td_imagedepth - 1));
- return (0);
- }
- if (td->td_planarconfig == PLANARCONFIG_SEPARATE &&
- s >= td->td_samplesperpixel) {
- TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
- "%lu: Sample out of range, max %lu",
- (unsigned long) s,
- (unsigned long) (td->td_samplesperpixel - 1));
- return (0);
- }
- return (1);
+ if (x >= td->td_imagewidth)
+ {
+ TIFFErrorExtR(tif, tif->tif_name, "%lu: Col out of range, max %lu",
+ (unsigned long)x, (unsigned long)(td->td_imagewidth - 1));
+ return (0);
+ }
+ if (y >= td->td_imagelength)
+ {
+ TIFFErrorExtR(tif, tif->tif_name, "%lu: Row out of range, max %lu",
+ (unsigned long)y,
+ (unsigned long)(td->td_imagelength - 1));
+ return (0);
+ }
+ if (z >= td->td_imagedepth)
+ {
+ TIFFErrorExtR(tif, tif->tif_name, "%lu: Depth out of range, max %lu",
+ (unsigned long)z, (unsigned long)(td->td_imagedepth - 1));
+ return (0);
+ }
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE &&
+ s >= td->td_samplesperpixel)
+ {
+ TIFFErrorExtR(tif, tif->tif_name, "%lu: Sample out of range, max %lu",
+ (unsigned long)s,
+ (unsigned long)(td->td_samplesperpixel - 1));
+ return (0);
+ }
+ return (1);
}
/*
* Compute how many tiles are in an image.
*/
-uint32
-TIFFNumberOfTiles(TIFF* tif)
+uint32_t TIFFNumberOfTiles(TIFF *tif)
{
- TIFFDirectory *td = &tif->tif_dir;
- uint32 dx = td->td_tilewidth;
- uint32 dy = td->td_tilelength;
- uint32 dz = td->td_tiledepth;
- uint32 ntiles;
+ TIFFDirectory *td = &tif->tif_dir;
+ uint32_t dx = td->td_tilewidth;
+ uint32_t dy = td->td_tilelength;
+ uint32_t dz = td->td_tiledepth;
+ uint32_t ntiles;
- if (dx == (uint32) -1)
- dx = td->td_imagewidth;
- if (dy == (uint32) -1)
- dy = td->td_imagelength;
- if (dz == (uint32) -1)
- dz = td->td_imagedepth;
- ntiles = (dx == 0 || dy == 0 || dz == 0) ? 0 :
- _TIFFMultiply32(tif, _TIFFMultiply32(tif, TIFFhowmany_32(td->td_imagewidth, dx),
- TIFFhowmany_32(td->td_imagelength, dy),
- "TIFFNumberOfTiles"),
- TIFFhowmany_32(td->td_imagedepth, dz), "TIFFNumberOfTiles");
- if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
- ntiles = _TIFFMultiply32(tif, ntiles, td->td_samplesperpixel,
- "TIFFNumberOfTiles");
- return (ntiles);
+ if (dx == (uint32_t)-1)
+ dx = td->td_imagewidth;
+ if (dy == (uint32_t)-1)
+ dy = td->td_imagelength;
+ if (dz == (uint32_t)-1)
+ dz = td->td_imagedepth;
+ ntiles =
+ (dx == 0 || dy == 0 || dz == 0)
+ ? 0
+ : _TIFFMultiply32(
+ tif,
+ _TIFFMultiply32(tif, TIFFhowmany_32(td->td_imagewidth, dx),
+ TIFFhowmany_32(td->td_imagelength, dy),
+ "TIFFNumberOfTiles"),
+ TIFFhowmany_32(td->td_imagedepth, dz), "TIFFNumberOfTiles");
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
+ ntiles = _TIFFMultiply32(tif, ntiles, td->td_samplesperpixel,
+ "TIFFNumberOfTiles");
+ return (ntiles);
}
/*
* Compute the # bytes in each row of a tile.
*/
-uint64
-TIFFTileRowSize64(TIFF* tif)
+uint64_t TIFFTileRowSize64(TIFF *tif)
{
- static const char module[] = "TIFFTileRowSize64";
- TIFFDirectory *td = &tif->tif_dir;
- uint64 rowsize;
- uint64 tilerowsize;
+ static const char module[] = "TIFFTileRowSize64";
+ TIFFDirectory *td = &tif->tif_dir;
+ uint64_t rowsize;
+ uint64_t tilerowsize;
- if (td->td_tilelength == 0)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Tile length is zero");
- return 0;
- }
- if (td->td_tilewidth == 0)
+ if (td->td_tilelength == 0)
+ {
+ TIFFErrorExtR(tif, module, "Tile length is zero");
+ return 0;
+ }
+ if (td->td_tilewidth == 0)
+ {
+ TIFFErrorExtR(tif, module, "Tile width is zero");
+ return (0);
+ }
+ rowsize = _TIFFMultiply64(tif, td->td_bitspersample, td->td_tilewidth,
+ "TIFFTileRowSize");
+ if (td->td_planarconfig == PLANARCONFIG_CONTIG)
+ {
+ if (td->td_samplesperpixel == 0)
{
- TIFFErrorExt(tif->tif_clientdata,module,"Tile width is zero");
- return (0);
+ TIFFErrorExtR(tif, module, "Samples per pixel is zero");
+ return 0;
}
- rowsize = _TIFFMultiply64(tif, td->td_bitspersample, td->td_tilewidth,
- "TIFFTileRowSize");
- if (td->td_planarconfig == PLANARCONFIG_CONTIG)
- {
- if (td->td_samplesperpixel == 0)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Samples per pixel is zero");
- return 0;
- }
- rowsize = _TIFFMultiply64(tif, rowsize, td->td_samplesperpixel,
- "TIFFTileRowSize");
- }
- tilerowsize=TIFFhowmany8_64(rowsize);
- if (tilerowsize == 0)
- {
- TIFFErrorExt(tif->tif_clientdata,module,"Computed tile row size is zero");
- return 0;
- }
- return (tilerowsize);
+ rowsize = _TIFFMultiply64(tif, rowsize, td->td_samplesperpixel,
+ "TIFFTileRowSize");
+ }
+ tilerowsize = TIFFhowmany8_64(rowsize);
+ if (tilerowsize == 0)
+ {
+ TIFFErrorExtR(tif, module, "Computed tile row size is zero");
+ return 0;
+ }
+ return (tilerowsize);
}
-tmsize_t
-TIFFTileRowSize(TIFF* tif)
+tmsize_t TIFFTileRowSize(TIFF *tif)
{
- static const char module[] = "TIFFTileRowSize";
- uint64 m;
- m=TIFFTileRowSize64(tif);
- return _TIFFCastUInt64ToSSize(tif, m, module);
+ static const char module[] = "TIFFTileRowSize";
+ uint64_t m;
+ m = TIFFTileRowSize64(tif);
+ return _TIFFCastUInt64ToSSize(tif, m, module);
}
/*
* Compute the # bytes in a variable length, row-aligned tile.
*/
-uint64
-TIFFVTileSize64(TIFF* tif, uint32 nrows)
+uint64_t TIFFVTileSize64(TIFF *tif, uint32_t nrows)
{
- static const char module[] = "TIFFVTileSize64";
- TIFFDirectory *td = &tif->tif_dir;
- if (td->td_tilelength == 0 || td->td_tilewidth == 0 ||
- td->td_tiledepth == 0)
- return (0);
- if ((td->td_planarconfig==PLANARCONFIG_CONTIG)&&
- (td->td_photometric==PHOTOMETRIC_YCBCR)&&
- (td->td_samplesperpixel==3)&&
- (!isUpSampled(tif)))
- {
- /*
- * Packed YCbCr data contain one Cb+Cr for every
- * HorizontalSampling*VerticalSampling Y values.
- * Must also roundup width and height when calculating
- * since images that are not a multiple of the
- * horizontal/vertical subsampling area include
- * YCbCr data for the extended image.
- */
- uint16 ycbcrsubsampling[2];
- uint16 samplingblock_samples;
- uint32 samplingblocks_hor;
- uint32 samplingblocks_ver;
- uint64 samplingrow_samples;
- uint64 samplingrow_size;
- TIFFGetFieldDefaulted(tif,TIFFTAG_YCBCRSUBSAMPLING,ycbcrsubsampling+0,
- ycbcrsubsampling+1);
- if ((ycbcrsubsampling[0] != 1 && ycbcrsubsampling[0] != 2 && ycbcrsubsampling[0] != 4)
- ||(ycbcrsubsampling[1] != 1 && ycbcrsubsampling[1] != 2 && ycbcrsubsampling[1] != 4))
- {
- TIFFErrorExt(tif->tif_clientdata,module,
- "Invalid YCbCr subsampling (%dx%d)",
- ycbcrsubsampling[0],
- ycbcrsubsampling[1] );
- return 0;
- }
- samplingblock_samples=ycbcrsubsampling[0]*ycbcrsubsampling[1]+2;
- samplingblocks_hor=TIFFhowmany_32(td->td_tilewidth,ycbcrsubsampling[0]);
- samplingblocks_ver=TIFFhowmany_32(nrows,ycbcrsubsampling[1]);
- samplingrow_samples=_TIFFMultiply64(tif,samplingblocks_hor,samplingblock_samples,module);
- samplingrow_size=TIFFhowmany8_64(_TIFFMultiply64(tif,samplingrow_samples,td->td_bitspersample,module));
- return(_TIFFMultiply64(tif,samplingrow_size,samplingblocks_ver,module));
- }
- else
- return(_TIFFMultiply64(tif,nrows,TIFFTileRowSize64(tif),module));
+ static const char module[] = "TIFFVTileSize64";
+ TIFFDirectory *td = &tif->tif_dir;
+ if (td->td_tilelength == 0 || td->td_tilewidth == 0 ||
+ td->td_tiledepth == 0)
+ return (0);
+ if ((td->td_planarconfig == PLANARCONFIG_CONTIG) &&
+ (td->td_photometric == PHOTOMETRIC_YCBCR) &&
+ (td->td_samplesperpixel == 3) && (!isUpSampled(tif)))
+ {
+ /*
+ * Packed YCbCr data contain one Cb+Cr for every
+ * HorizontalSampling*VerticalSampling Y values.
+ * Must also roundup width and height when calculating
+ * since images that are not a multiple of the
+ * horizontal/vertical subsampling area include
+ * YCbCr data for the extended image.
+ */
+ uint16_t ycbcrsubsampling[2];
+ uint16_t samplingblock_samples;
+ uint32_t samplingblocks_hor;
+ uint32_t samplingblocks_ver;
+ uint64_t samplingrow_samples;
+ uint64_t samplingrow_size;
+ TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRSUBSAMPLING,
+ ycbcrsubsampling + 0, ycbcrsubsampling + 1);
+ if ((ycbcrsubsampling[0] != 1 && ycbcrsubsampling[0] != 2 &&
+ ycbcrsubsampling[0] != 4) ||
+ (ycbcrsubsampling[1] != 1 && ycbcrsubsampling[1] != 2 &&
+ ycbcrsubsampling[1] != 4))
+ {
+ TIFFErrorExtR(tif, module, "Invalid YCbCr subsampling (%dx%d)",
+ ycbcrsubsampling[0], ycbcrsubsampling[1]);
+ return 0;
+ }
+ samplingblock_samples = ycbcrsubsampling[0] * ycbcrsubsampling[1] + 2;
+ samplingblocks_hor =
+ TIFFhowmany_32(td->td_tilewidth, ycbcrsubsampling[0]);
+ samplingblocks_ver = TIFFhowmany_32(nrows, ycbcrsubsampling[1]);
+ samplingrow_samples = _TIFFMultiply64(tif, samplingblocks_hor,
+ samplingblock_samples, module);
+ samplingrow_size = TIFFhowmany8_64(_TIFFMultiply64(
+ tif, samplingrow_samples, td->td_bitspersample, module));
+ return (
+ _TIFFMultiply64(tif, samplingrow_size, samplingblocks_ver, module));
+ }
+ else
+ return (_TIFFMultiply64(tif, nrows, TIFFTileRowSize64(tif), module));
}
-tmsize_t
-TIFFVTileSize(TIFF* tif, uint32 nrows)
+tmsize_t TIFFVTileSize(TIFF *tif, uint32_t nrows)
{
- static const char module[] = "TIFFVTileSize";
- uint64 m;
- m=TIFFVTileSize64(tif,nrows);
- return _TIFFCastUInt64ToSSize(tif, m, module);
+ static const char module[] = "TIFFVTileSize";
+ uint64_t m;
+ m = TIFFVTileSize64(tif, nrows);
+ return _TIFFCastUInt64ToSSize(tif, m, module);
}
/*
* Compute the # bytes in a row-aligned tile.
*/
-uint64
-TIFFTileSize64(TIFF* tif)
+uint64_t TIFFTileSize64(TIFF *tif)
{
- return (TIFFVTileSize64(tif, tif->tif_dir.td_tilelength));
+ return (TIFFVTileSize64(tif, tif->tif_dir.td_tilelength));
}
-tmsize_t
-TIFFTileSize(TIFF* tif)
+tmsize_t TIFFTileSize(TIFF *tif)
{
- static const char module[] = "TIFFTileSize";
- uint64 m;
- m=TIFFTileSize64(tif);
- return _TIFFCastUInt64ToSSize(tif, m, module);
+ static const char module[] = "TIFFTileSize";
+ uint64_t m;
+ m = TIFFTileSize64(tif);
+ return _TIFFCastUInt64ToSSize(tif, m, module);
}
/*
@@ -268,32 +264,21 @@ TIFFTileSize(TIFF* tif)
* request is <1 then we choose a size according
* to certain heuristics.
*/
-void
-TIFFDefaultTileSize(TIFF* tif, uint32* tw, uint32* th)
+void TIFFDefaultTileSize(TIFF *tif, uint32_t *tw, uint32_t *th)
{
- (*tif->tif_deftilesize)(tif, tw, th);
+ (*tif->tif_deftilesize)(tif, tw, th);
}
-void
-_TIFFDefaultTileSize(TIFF* tif, uint32* tw, uint32* th)
+void _TIFFDefaultTileSize(TIFF *tif, uint32_t *tw, uint32_t *th)
{
- (void) tif;
- if (*(int32*) tw < 1)
- *tw = 256;
- if (*(int32*) th < 1)
- *th = 256;
- /* roundup to a multiple of 16 per the spec */
- if (*tw & 0xf)
- *tw = TIFFroundup_32(*tw, 16);
- if (*th & 0xf)
- *th = TIFFroundup_32(*th, 16);
+ (void)tif;
+ if (*(int32_t *)tw < 1)
+ *tw = 256;
+ if (*(int32_t *)th < 1)
+ *th = 256;
+ /* roundup to a multiple of 16 per the spec */
+ if (*tw & 0xf)
+ *tw = TIFFroundup_32(*tw, 16);
+ if (*th & 0xf)
+ *th = TIFFroundup_32(*th, 16);
}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_unix.c b/src/3rdparty/libtiff/libtiff/tif_unix.c
index 874f1fe..34dd53b 100644
--- a/src/3rdparty/libtiff/libtiff/tif_unix.c
+++ b/src/3rdparty/libtiff/libtiff/tif_unix.c
@@ -30,7 +30,7 @@
#include "tif_config.h"
#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
+#include <sys/types.h>
#endif
#include <errno.h>
@@ -40,215 +40,222 @@
#include <sys/stat.h>
#ifdef HAVE_UNISTD_H
-# include <unistd.h>
+#include <unistd.h>
#endif
#ifdef HAVE_FCNTL_H
-# include <fcntl.h>
+#include <fcntl.h>
#endif
#ifdef HAVE_IO_H
-# include <io.h>
+#include <io.h>
#endif
#include "tiffiop.h"
-
#define TIFF_IO_MAX 2147483647U
-
typedef union fd_as_handle_union
{
- int fd;
- thandle_t h;
+ int fd;
+ thandle_t h;
} fd_as_handle_union_t;
-static tmsize_t
-_tiffReadProc(thandle_t fd, void* buf, tmsize_t size)
+static tmsize_t _tiffReadProc(thandle_t fd, void *buf, tmsize_t size)
{
- fd_as_handle_union_t fdh;
- const size_t bytes_total = (size_t) size;
- size_t bytes_read;
- tmsize_t count = -1;
- if ((tmsize_t) bytes_total != size)
- {
- errno=EINVAL;
- return (tmsize_t) -1;
- }
- fdh.h = fd;
- for (bytes_read=0; bytes_read < bytes_total; bytes_read+=count)
- {
- char *buf_offset = (char *) buf+bytes_read;
- size_t io_size = bytes_total-bytes_read;
- if (io_size > TIFF_IO_MAX)
- io_size = TIFF_IO_MAX;
- count=read(fdh.fd, buf_offset, (TIFFIOSize_t) io_size);
- if (count <= 0)
- break;
- }
- if (count < 0)
- return (tmsize_t)-1;
- return (tmsize_t) bytes_read;
+ fd_as_handle_union_t fdh;
+ const size_t bytes_total = (size_t)size;
+ size_t bytes_read;
+ tmsize_t count = -1;
+ if ((tmsize_t)bytes_total != size)
+ {
+ errno = EINVAL;
+ return (tmsize_t)-1;
+ }
+ fdh.h = fd;
+ for (bytes_read = 0; bytes_read < bytes_total; bytes_read += count)
+ {
+ char *buf_offset = (char *)buf + bytes_read;
+ size_t io_size = bytes_total - bytes_read;
+ if (io_size > TIFF_IO_MAX)
+ io_size = TIFF_IO_MAX;
+ count = read(fdh.fd, buf_offset, (TIFFIOSize_t)io_size);
+ if (count <= 0)
+ break;
+ }
+ if (count < 0)
+ return (tmsize_t)-1;
+ return (tmsize_t)bytes_read;
}
-static tmsize_t
-_tiffWriteProc(thandle_t fd, void* buf, tmsize_t size)
+static tmsize_t _tiffWriteProc(thandle_t fd, void *buf, tmsize_t size)
{
- fd_as_handle_union_t fdh;
- const size_t bytes_total = (size_t) size;
- size_t bytes_written;
- tmsize_t count = -1;
- if ((tmsize_t) bytes_total != size)
- {
- errno=EINVAL;
- return (tmsize_t) -1;
- }
- fdh.h = fd;
- for (bytes_written=0; bytes_written < bytes_total; bytes_written+=count)
- {
- const char *buf_offset = (char *) buf+bytes_written;
- size_t io_size = bytes_total-bytes_written;
- if (io_size > TIFF_IO_MAX)
- io_size = TIFF_IO_MAX;
- count=write(fdh.fd, buf_offset, (TIFFIOSize_t) io_size);
- if (count <= 0)
- break;
- }
- if (count < 0)
- return (tmsize_t)-1;
- return (tmsize_t) bytes_written;
- /* return ((tmsize_t) write(fdh.fd, buf, bytes_total)); */
+ fd_as_handle_union_t fdh;
+ const size_t bytes_total = (size_t)size;
+ size_t bytes_written;
+ tmsize_t count = -1;
+ if ((tmsize_t)bytes_total != size)
+ {
+ errno = EINVAL;
+ return (tmsize_t)-1;
+ }
+ fdh.h = fd;
+ for (bytes_written = 0; bytes_written < bytes_total; bytes_written += count)
+ {
+ const char *buf_offset = (char *)buf + bytes_written;
+ size_t io_size = bytes_total - bytes_written;
+ if (io_size > TIFF_IO_MAX)
+ io_size = TIFF_IO_MAX;
+ count = write(fdh.fd, buf_offset, (TIFFIOSize_t)io_size);
+ if (count <= 0)
+ break;
+ }
+ if (count < 0)
+ return (tmsize_t)-1;
+ return (tmsize_t)bytes_written;
+ /* return ((tmsize_t) write(fdh.fd, buf, bytes_total)); */
}
-static uint64
-_tiffSeekProc(thandle_t fd, uint64 off, int whence)
+static uint64_t _tiffSeekProc(thandle_t fd, uint64_t off, int whence)
{
- fd_as_handle_union_t fdh;
- _TIFF_off_t off_io = (_TIFF_off_t) off;
- if ((uint64) off_io != off)
- {
- errno=EINVAL;
- return (uint64) -1; /* this is really gross */
- }
- fdh.h = fd;
- return((uint64)_TIFF_lseek_f(fdh.fd,off_io,whence));
+ fd_as_handle_union_t fdh;
+ _TIFF_off_t off_io = (_TIFF_off_t)off;
+ if ((uint64_t)off_io != off)
+ {
+ errno = EINVAL;
+ return (uint64_t)-1; /* this is really gross */
+ }
+ fdh.h = fd;
+ return ((uint64_t)_TIFF_lseek_f(fdh.fd, off_io, whence));
}
-static int
-_tiffCloseProc(thandle_t fd)
+static int _tiffCloseProc(thandle_t fd)
{
- fd_as_handle_union_t fdh;
- fdh.h = fd;
- return(close(fdh.fd));
+ fd_as_handle_union_t fdh;
+ fdh.h = fd;
+ return (close(fdh.fd));
}
-static uint64
-_tiffSizeProc(thandle_t fd)
+static uint64_t _tiffSizeProc(thandle_t fd)
{
- _TIFF_stat_s sb;
- fd_as_handle_union_t fdh;
- fdh.h = fd;
- if (_TIFF_fstat_f(fdh.fd,&sb)<0)
- return(0);
- else
- return((uint64)sb.st_size);
+ _TIFF_stat_s sb;
+ fd_as_handle_union_t fdh;
+ fdh.h = fd;
+ if (_TIFF_fstat_f(fdh.fd, &sb) < 0)
+ return (0);
+ else
+ return ((uint64_t)sb.st_size);
}
#ifdef HAVE_MMAP
#include <sys/mman.h>
-static int
-_tiffMapProc(thandle_t fd, void** pbase, toff_t* psize)
+static int _tiffMapProc(thandle_t fd, void **pbase, toff_t *psize)
{
- uint64 size64 = _tiffSizeProc(fd);
- tmsize_t sizem = (tmsize_t)size64;
- if ((uint64)sizem==size64) {
- fd_as_handle_union_t fdh;
- fdh.h = fd;
- *pbase = (void*)
- mmap(0, (size_t)sizem, PROT_READ, MAP_SHARED, fdh.fd, 0);
- if (*pbase != (void*) -1) {
- *psize = (tmsize_t)sizem;
- return (1);
- }
- }
- return (0);
+ uint64_t size64 = _tiffSizeProc(fd);
+ tmsize_t sizem = (tmsize_t)size64;
+ if (size64 && (uint64_t)sizem == size64)
+ {
+ fd_as_handle_union_t fdh;
+ fdh.h = fd;
+ *pbase =
+ (void *)mmap(0, (size_t)sizem, PROT_READ, MAP_SHARED, fdh.fd, 0);
+ if (*pbase != (void *)-1)
+ {
+ *psize = (tmsize_t)sizem;
+ return (1);
+ }
+ }
+ return (0);
}
-static void
-_tiffUnmapProc(thandle_t fd, void* base, toff_t size)
+static void _tiffUnmapProc(thandle_t fd, void *base, toff_t size)
{
- (void) fd;
- (void) munmap(base, (off_t) size);
+ (void)fd;
+ (void)munmap(base, (off_t)size);
}
-#else /* !HAVE_MMAP */
-static int
-_tiffMapProc(thandle_t fd, void** pbase, toff_t* psize)
+#else /* !HAVE_MMAP */
+static int _tiffMapProc(thandle_t fd, void **pbase, toff_t *psize)
{
- (void) fd; (void) pbase; (void) psize;
- return (0);
+ (void)fd;
+ (void)pbase;
+ (void)psize;
+ return (0);
}
-static void
-_tiffUnmapProc(thandle_t fd, void* base, toff_t size)
+static void _tiffUnmapProc(thandle_t fd, void *base, toff_t size)
{
- (void) fd; (void) base; (void) size;
+ (void)fd;
+ (void)base;
+ (void)size;
}
#endif /* !HAVE_MMAP */
/*
* Open a TIFF file descriptor for read/writing.
*/
-TIFF*
-TIFFFdOpen(int fd, const char* name, const char* mode)
+TIFF *TIFFFdOpen(int fd, const char *name, const char *mode)
{
- TIFF* tif;
-
- fd_as_handle_union_t fdh;
- fdh.fd = fd;
- tif = TIFFClientOpen(name, mode,
- fdh.h,
- _tiffReadProc, _tiffWriteProc,
- _tiffSeekProc, _tiffCloseProc, _tiffSizeProc,
- _tiffMapProc, _tiffUnmapProc);
- if (tif)
- tif->tif_fd = fd;
- return (tif);
+ return TIFFFdOpenExt(fd, name, mode, NULL);
+}
+
+TIFF *TIFFFdOpenExt(int fd, const char *name, const char *mode,
+ TIFFOpenOptions *opts)
+{
+ TIFF *tif;
+
+ fd_as_handle_union_t fdh;
+ fdh.fd = fd;
+ tif = TIFFClientOpenExt(name, mode, fdh.h, _tiffReadProc, _tiffWriteProc,
+ _tiffSeekProc, _tiffCloseProc, _tiffSizeProc,
+ _tiffMapProc, _tiffUnmapProc, opts);
+ if (tif)
+ tif->tif_fd = fd;
+ return (tif);
}
/*
* Open a TIFF file for read/writing.
*/
-TIFF*
-TIFFOpen(const char* name, const char* mode)
+TIFF *TIFFOpen(const char *name, const char *mode)
{
- static const char module[] = "TIFFOpen";
- int m, fd;
- TIFF* tif;
+ return TIFFOpenExt(name, mode, NULL);
+}
- m = _TIFFgetMode(mode, module);
- if (m == -1)
- return ((TIFF*)0);
+TIFF *TIFFOpenExt(const char *name, const char *mode, TIFFOpenOptions *opts)
+{
+ static const char module[] = "TIFFOpen";
+ int m, fd;
+ TIFF *tif;
+
+ m = _TIFFgetMode(opts, NULL, mode, module);
+ if (m == -1)
+ return ((TIFF *)0);
/* for cygwin and mingw */
#ifdef O_BINARY
- m |= O_BINARY;
+ m |= O_BINARY;
#endif
- fd = open(name, m, 0666);
- if (fd < 0) {
- if (errno > 0 && strerror(errno) != NULL ) {
- TIFFErrorExt(0, module, "%s: %s", name, strerror(errno) );
- } else {
- TIFFErrorExt(0, module, "%s: Cannot open", name);
- }
- return ((TIFF *)0);
- }
-
- tif = TIFFFdOpen((int)fd, name, mode);
- if(!tif)
- close(fd);
- return tif;
+ fd = open(name, m, 0666);
+ if (fd < 0)
+ {
+ if (errno > 0 && strerror(errno) != NULL)
+ {
+ _TIFFErrorEarly(opts, NULL, module, "%s: %s", name,
+ strerror(errno));
+ }
+ else
+ {
+ _TIFFErrorEarly(opts, NULL, module, "%s: Cannot open", name);
+ }
+ return ((TIFF *)0);
+ }
+
+ tif = TIFFFdOpenExt((int)fd, name, mode, opts);
+ if (!tif)
+ close(fd);
+ return tif;
}
#ifdef __WIN32__
@@ -256,129 +263,108 @@ TIFFOpen(const char* name, const char* mode)
/*
* Open a TIFF file with a Unicode filename, for read/writing.
*/
-TIFF*
-TIFFOpenW(const wchar_t* name, const char* mode)
+TIFF *TIFFOpenW(const wchar_t *name, const char *mode)
{
- static const char module[] = "TIFFOpenW";
- int m, fd;
- int mbsize;
- char *mbname;
- TIFF* tif;
+ return TIFFOpenWExt(name, mode, NULL);
+}
+TIFF *TIFFOpenWExt(const wchar_t *name, const char *mode, TIFFOpenOptions *opts)
+{
+ static const char module[] = "TIFFOpenW";
+ int m, fd;
+ int mbsize;
+ char *mbname;
+ TIFF *tif;
- m = _TIFFgetMode(mode, module);
- if (m == -1)
- return ((TIFF*)0);
+ m = _TIFFgetMode(opts, NULL, mode, module);
+ if (m == -1)
+ return ((TIFF *)0);
/* for cygwin and mingw */
#ifdef O_BINARY
- m |= O_BINARY;
+ m |= O_BINARY;
#endif
- fd = _wopen(name, m, 0666);
- if (fd < 0) {
- TIFFErrorExt(0, module, "%ls: Cannot open", name);
- return ((TIFF *)0);
- }
-
- mbname = NULL;
- mbsize = WideCharToMultiByte(CP_ACP, 0, name, -1, NULL, 0, NULL, NULL);
- if (mbsize > 0) {
- mbname = _TIFFmalloc(mbsize);
- if (!mbname) {
- TIFFErrorExt(0, module,
- "Can't allocate space for filename conversion buffer");
- return ((TIFF*)0);
- }
-
- WideCharToMultiByte(CP_ACP, 0, name, -1, mbname, mbsize,
- NULL, NULL);
- }
-
- tif = TIFFFdOpen((int)fd, (mbname != NULL) ? mbname : "<unknown>",
- mode);
-
- _TIFFfree(mbname);
-
- if(!tif)
- close(fd);
- return tif;
+ fd = _wopen(name, m, 0666);
+ if (fd < 0)
+ {
+ _TIFFErrorEarly(opts, NULL, module, "%ls: Cannot open", name);
+ return ((TIFF *)0);
+ }
+
+ mbname = NULL;
+ mbsize = WideCharToMultiByte(CP_ACP, 0, name, -1, NULL, 0, NULL, NULL);
+ if (mbsize > 0)
+ {
+ mbname = _TIFFmalloc(mbsize);
+ if (!mbname)
+ {
+ _TIFFErrorEarly(
+ opts, NULL, module,
+ "Can't allocate space for filename conversion buffer");
+ return ((TIFF *)0);
+ }
+
+ WideCharToMultiByte(CP_ACP, 0, name, -1, mbname, mbsize, NULL, NULL);
+ }
+
+ tif = TIFFFdOpenExt((int)fd, (mbname != NULL) ? mbname : "<unknown>", mode,
+ opts);
+
+ _TIFFfree(mbname);
+
+ if (!tif)
+ close(fd);
+ return tif;
}
#endif
-void*
-_TIFFmalloc(tmsize_t s)
+void *_TIFFmalloc(tmsize_t s)
{
- if (s == 0)
- return ((void *) NULL);
+ if (s == 0)
+ return ((void *)NULL);
- return (malloc((size_t) s));
+ return (malloc((size_t)s));
}
-void* _TIFFcalloc(tmsize_t nmemb, tmsize_t siz)
+void *_TIFFcalloc(tmsize_t nmemb, tmsize_t siz)
{
- if( nmemb == 0 || siz == 0 )
- return ((void *) NULL);
+ if (nmemb == 0 || siz == 0)
+ return ((void *)NULL);
- return calloc((size_t) nmemb, (size_t)siz);
+ return calloc((size_t)nmemb, (size_t)siz);
}
-void
-_TIFFfree(void* p)
-{
- free(p);
-}
+void _TIFFfree(void *p) { free(p); }
-void*
-_TIFFrealloc(void* p, tmsize_t s)
-{
- return (realloc(p, (size_t) s));
-}
+void *_TIFFrealloc(void *p, tmsize_t s) { return (realloc(p, (size_t)s)); }
-void
-_TIFFmemset(void* p, int v, tmsize_t c)
-{
- memset(p, v, (size_t) c);
-}
+void _TIFFmemset(void *p, int v, tmsize_t c) { memset(p, v, (size_t)c); }
-void
-_TIFFmemcpy(void* d, const void* s, tmsize_t c)
+void _TIFFmemcpy(void *d, const void *s, tmsize_t c)
{
- memcpy(d, s, (size_t) c);
+ memcpy(d, s, (size_t)c);
}
-int
-_TIFFmemcmp(const void* p1, const void* p2, tmsize_t c)
+int _TIFFmemcmp(const void *p1, const void *p2, tmsize_t c)
{
- return (memcmp(p1, p2, (size_t) c));
+ return (memcmp(p1, p2, (size_t)c));
}
-static void
-unixWarningHandler(const char* module, const char* fmt, va_list ap)
+static void unixWarningHandler(const char *module, const char *fmt, va_list ap)
{
- if (module != NULL)
- fprintf(stderr, "%s: ", module);
- fprintf(stderr, "Warning, ");
- vfprintf(stderr, fmt, ap);
- fprintf(stderr, ".\n");
+ if (module != NULL)
+ fprintf(stderr, "%s: ", module);
+ fprintf(stderr, "Warning, ");
+ vfprintf(stderr, fmt, ap);
+ fprintf(stderr, ".\n");
}
TIFFErrorHandler _TIFFwarningHandler = unixWarningHandler;
-static void
-unixErrorHandler(const char* module, const char* fmt, va_list ap)
+static void unixErrorHandler(const char *module, const char *fmt, va_list ap)
{
- if (module != NULL)
- fprintf(stderr, "%s: ", module);
- vfprintf(stderr, fmt, ap);
- fprintf(stderr, ".\n");
+ if (module != NULL)
+ fprintf(stderr, "%s: ", module);
+ vfprintf(stderr, fmt, ap);
+ fprintf(stderr, ".\n");
}
TIFFErrorHandler _TIFFerrorHandler = unixErrorHandler;
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_version.c b/src/3rdparty/libtiff/libtiff/tif_version.c
index 60875bb..0b6c9bc 100644
--- a/src/3rdparty/libtiff/libtiff/tif_version.c
+++ b/src/3rdparty/libtiff/libtiff/tif_version.c
@@ -2,38 +2,27 @@
* Copyright (c) 1992-1997 Sam Leffler
* Copyright (c) 1992-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
#include "tiffiop.h"
static const char TIFFVersion[] = TIFFLIB_VERSION_STR;
-const char*
-TIFFGetVersion(void)
-{
- return (TIFFVersion);
-}
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
+const char *TIFFGetVersion(void) { return (TIFFVersion); }
diff --git a/src/3rdparty/libtiff/libtiff/tif_warning.c b/src/3rdparty/libtiff/libtiff/tif_warning.c
index c482785..5468de5 100644
--- a/src/3rdparty/libtiff/libtiff/tif_warning.c
+++ b/src/3rdparty/libtiff/libtiff/tif_warning.c
@@ -2,23 +2,23 @@
* Copyright (c) 1988-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -29,59 +29,77 @@
TIFFErrorHandlerExt _TIFFwarningHandlerExt = NULL;
-TIFFErrorHandler
-TIFFSetWarningHandler(TIFFErrorHandler handler)
+TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler handler)
{
- TIFFErrorHandler prev = _TIFFwarningHandler;
- _TIFFwarningHandler = handler;
- return (prev);
+ TIFFErrorHandler prev = _TIFFwarningHandler;
+ _TIFFwarningHandler = handler;
+ return (prev);
}
-TIFFErrorHandlerExt
-TIFFSetWarningHandlerExt(TIFFErrorHandlerExt handler)
+TIFFErrorHandlerExt TIFFSetWarningHandlerExt(TIFFErrorHandlerExt handler)
{
- TIFFErrorHandlerExt prev = _TIFFwarningHandlerExt;
- _TIFFwarningHandlerExt = handler;
- return (prev);
+ TIFFErrorHandlerExt prev = _TIFFwarningHandlerExt;
+ _TIFFwarningHandlerExt = handler;
+ return (prev);
}
-void
-TIFFWarning(const char* module, const char* fmt, ...)
+void TIFFWarning(const char *module, const char *fmt, ...)
{
- va_list ap;
- if (_TIFFwarningHandler) {
- va_start(ap, fmt);
- (*_TIFFwarningHandler)(module, fmt, ap);
- va_end(ap);
- }
- if (_TIFFwarningHandlerExt) {
- va_start(ap, fmt);
- (*_TIFFwarningHandlerExt)(0, module, fmt, ap);
- va_end(ap);
- }
+ va_list ap;
+ if (_TIFFwarningHandler)
+ {
+ va_start(ap, fmt);
+ (*_TIFFwarningHandler)(module, fmt, ap);
+ va_end(ap);
+ }
+ if (_TIFFwarningHandlerExt)
+ {
+ va_start(ap, fmt);
+ (*_TIFFwarningHandlerExt)(0, module, fmt, ap);
+ va_end(ap);
+ }
}
-void
-TIFFWarningExt(thandle_t fd, const char* module, const char* fmt, ...)
+void TIFFWarningExt(thandle_t fd, const char *module, const char *fmt, ...)
{
- va_list ap;
- if (_TIFFwarningHandler) {
- va_start(ap, fmt);
- (*_TIFFwarningHandler)(module, fmt, ap);
- va_end(ap);
- }
- if (_TIFFwarningHandlerExt) {
- va_start(ap, fmt);
- (*_TIFFwarningHandlerExt)(fd, module, fmt, ap);
- va_end(ap);
- }
+ va_list ap;
+ if (_TIFFwarningHandler)
+ {
+ va_start(ap, fmt);
+ (*_TIFFwarningHandler)(module, fmt, ap);
+ va_end(ap);
+ }
+ if (_TIFFwarningHandlerExt)
+ {
+ va_start(ap, fmt);
+ (*_TIFFwarningHandlerExt)(fd, module, fmt, ap);
+ va_end(ap);
+ }
}
-
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
+void TIFFWarningExtR(TIFF *tif, const char *module, const char *fmt, ...)
+{
+ va_list ap;
+ if (tif && tif->tif_warnhandler)
+ {
+ va_start(ap, fmt);
+ int stop = (*tif->tif_warnhandler)(tif, tif->tif_warnhandler_user_data,
+ module, fmt, ap);
+ va_end(ap);
+ if (stop)
+ return;
+ }
+ if (_TIFFwarningHandler)
+ {
+ va_start(ap, fmt);
+ (*_TIFFwarningHandler)(module, fmt, ap);
+ va_end(ap);
+ }
+ if (_TIFFwarningHandlerExt)
+ {
+ va_start(ap, fmt);
+ (*_TIFFwarningHandlerExt)(tif ? tif->tif_clientdata : 0, module, fmt,
+ ap);
+ va_end(ap);
+ }
+}
diff --git a/src/3rdparty/libtiff/libtiff/tif_webp.c b/src/3rdparty/libtiff/libtiff/tif_webp.c
new file mode 100644
index 0000000..07db7cc
--- /dev/null
+++ b/src/3rdparty/libtiff/libtiff/tif_webp.c
@@ -0,0 +1,800 @@
+/*
+ * Copyright (c) 2018, Mapbox
+ * Author: <norman.barker at mapbox.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "tiffiop.h"
+#ifdef WEBP_SUPPORT
+/*
+ * TIFF Library.
+ *
+ * WEBP Compression Support
+ *
+ */
+
+#include "webp/decode.h"
+#include "webp/encode.h"
+
+#include <stdbool.h>
+#include <stdio.h>
+
+#define LSTATE_INIT_DECODE 0x01
+#define LSTATE_INIT_ENCODE 0x02
+/*
+ * State block for each open TIFF
+ * file using WEBP compression/decompression.
+ */
+typedef struct
+{
+ uint16_t nSamples; /* number of samples per pixel */
+
+ int lossless; /* lossy/lossless compression */
+ int quality_level; /* compression level */
+ WebPPicture sPicture; /* WebP Picture */
+ WebPConfig sEncoderConfig; /* WebP encoder config */
+ uint8_t *pBuffer; /* buffer to hold raw data on encoding */
+ unsigned int buffer_offset; /* current offset into the buffer */
+ unsigned int buffer_size;
+
+ WebPIDecoder *psDecoder; /* WebPIDecoder */
+ WebPDecBuffer sDecBuffer; /* Decoder buffer */
+ int last_y; /* Last row decoded */
+
+ int state; /* state flags */
+
+ TIFFVGetMethod vgetparent; /* super-class method */
+ TIFFVSetMethod vsetparent; /* super-class method */
+} WebPState;
+
+#define LState(tif) ((WebPState *)(tif)->tif_data)
+#define DecoderState(tif) LState(tif)
+#define EncoderState(tif) LState(tif)
+
+static int TWebPEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s);
+static int TWebPDecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s);
+
+static int TWebPDatasetWriter(const uint8_t *data, size_t data_size,
+ const WebPPicture *const picture)
+{
+ static const char module[] = "TWebPDatasetWriter";
+ TIFF *tif = (TIFF *)(picture->custom_ptr);
+
+ if ((tif->tif_rawcc + (tmsize_t)data_size) > tif->tif_rawdatasize)
+ {
+ TIFFErrorExtR(
+ tif, module, "Buffer too small by %" TIFF_SIZE_FORMAT " bytes.",
+ (size_t)(tif->tif_rawcc + data_size - tif->tif_rawdatasize));
+ return 0;
+ }
+ else
+ {
+ _TIFFmemcpy(tif->tif_rawcp, data, data_size);
+ tif->tif_rawcc += data_size;
+ tif->tif_rawcp += data_size;
+ return 1;
+ }
+}
+
+/*
+ * Encode a chunk of pixels.
+ */
+static int TWebPEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
+{
+ static const char module[] = "TWebPEncode";
+ WebPState *sp = EncoderState(tif);
+ (void)s;
+
+ assert(sp != NULL);
+ assert(sp->state == LSTATE_INIT_ENCODE);
+
+ if ((uint64_t)sp->buffer_offset + (uint64_t)cc > sp->buffer_size)
+ {
+ TIFFErrorExtR(tif, module, "Too many bytes to be written");
+ return 0;
+ }
+
+ memcpy(sp->pBuffer + sp->buffer_offset, bp, cc);
+ sp->buffer_offset += (unsigned)cc;
+
+ return 1;
+}
+
+static int TWebPDecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s)
+{
+ static const char module[] = "WebPDecode";
+ VP8StatusCode status = VP8_STATUS_OK;
+ WebPState *sp = DecoderState(tif);
+ uint32_t segment_width, segment_height;
+ bool decode_whole_strile = false;
+
+ (void)s;
+
+ assert(sp != NULL);
+ assert(sp->state == LSTATE_INIT_DECODE);
+
+ if (sp->psDecoder == NULL)
+ {
+ TIFFDirectory *td = &tif->tif_dir;
+ uint32_t buffer_size;
+
+ if (isTiled(tif))
+ {
+ segment_width = td->td_tilewidth;
+ segment_height = td->td_tilelength;
+ }
+ else
+ {
+ segment_width = td->td_imagewidth;
+ segment_height = td->td_imagelength - tif->tif_row;
+ if (segment_height > td->td_rowsperstrip)
+ segment_height = td->td_rowsperstrip;
+ }
+
+ buffer_size = segment_width * segment_height * sp->nSamples;
+ if (occ == (tmsize_t)buffer_size)
+ {
+ /* If decoding the whole strip/tile, we can directly use the */
+ /* output buffer */
+ decode_whole_strile = true;
+ }
+ else if (sp->pBuffer == NULL || buffer_size > sp->buffer_size)
+ {
+ if (sp->pBuffer != NULL)
+ {
+ _TIFFfreeExt(tif, sp->pBuffer);
+ sp->pBuffer = NULL;
+ }
+
+ sp->pBuffer = _TIFFmallocExt(tif, buffer_size);
+ if (!sp->pBuffer)
+ {
+ TIFFErrorExtR(tif, module, "Cannot allocate buffer");
+ return 0;
+ }
+ sp->buffer_size = buffer_size;
+ }
+
+ sp->last_y = 0;
+
+ WebPInitDecBuffer(&sp->sDecBuffer);
+
+ sp->sDecBuffer.is_external_memory = 1;
+ sp->sDecBuffer.width = segment_width;
+ sp->sDecBuffer.height = segment_height;
+ sp->sDecBuffer.u.RGBA.rgba = decode_whole_strile ? op : sp->pBuffer;
+ sp->sDecBuffer.u.RGBA.stride = segment_width * sp->nSamples;
+ sp->sDecBuffer.u.RGBA.size = buffer_size;
+
+ if (sp->nSamples > 3)
+ {
+ sp->sDecBuffer.colorspace = MODE_RGBA;
+ }
+ else
+ {
+ sp->sDecBuffer.colorspace = MODE_RGB;
+ }
+
+ sp->psDecoder = WebPINewDecoder(&sp->sDecBuffer);
+
+ if (sp->psDecoder == NULL)
+ {
+ TIFFErrorExtR(tif, module, "Unable to allocate WebP decoder.");
+ return 0;
+ }
+ }
+
+ if (occ % sp->sDecBuffer.u.RGBA.stride)
+ {
+ TIFFErrorExtR(tif, module, "Fractional scanlines cannot be read");
+ return 0;
+ }
+
+ status = WebPIAppend(sp->psDecoder, tif->tif_rawcp, tif->tif_rawcc);
+
+ if (status != VP8_STATUS_OK && status != VP8_STATUS_SUSPENDED)
+ {
+ if (status == VP8_STATUS_INVALID_PARAM)
+ {
+ TIFFErrorExtR(tif, module, "Invalid parameter used.");
+ }
+ else if (status == VP8_STATUS_OUT_OF_MEMORY)
+ {
+ TIFFErrorExtR(tif, module, "Out of memory.");
+ }
+ else
+ {
+ TIFFErrorExtR(tif, module, "Unrecognized error.");
+ }
+ return 0;
+ }
+ else
+ {
+ int current_y, stride;
+ uint8_t *buf;
+
+ /* Returns the RGB/A image decoded so far */
+ buf = WebPIDecGetRGB(sp->psDecoder, &current_y, NULL, NULL, &stride);
+
+ if ((buf != NULL) &&
+ (occ <= (tmsize_t)stride * (current_y - sp->last_y)))
+ {
+ const int numberOfExpectedLines =
+ (int)(occ / sp->sDecBuffer.u.RGBA.stride);
+ if (decode_whole_strile)
+ {
+ if (current_y != numberOfExpectedLines)
+ {
+ TIFFErrorExtR(tif, module,
+ "Unable to decode WebP data: less lines than "
+ "expected.");
+ return 0;
+ }
+ }
+ else
+ {
+ memcpy(op, buf + (sp->last_y * stride), occ);
+ }
+
+ tif->tif_rawcp += tif->tif_rawcc;
+ tif->tif_rawcc = 0;
+ sp->last_y += numberOfExpectedLines;
+
+ if (decode_whole_strile)
+ {
+ /* We can now free the decoder as we're completely done */
+ if (sp->psDecoder != NULL)
+ {
+ WebPIDelete(sp->psDecoder);
+ WebPFreeDecBuffer(&sp->sDecBuffer);
+ sp->psDecoder = NULL;
+ }
+ }
+ return 1;
+ }
+ else
+ {
+ TIFFErrorExtR(tif, module, "Unable to decode WebP data.");
+ return 0;
+ }
+ }
+}
+
+static int TWebPFixupTags(TIFF *tif)
+{
+ (void)tif;
+ if (tif->tif_dir.td_planarconfig != PLANARCONFIG_CONTIG)
+ {
+ static const char module[] = "TWebPFixupTags";
+ TIFFErrorExtR(tif, module,
+ "TIFF WEBP requires data to be stored contiguously in "
+ "RGB e.g. RGBRGBRGB "
+#if WEBP_ENCODER_ABI_VERSION >= 0x0100
+ "or RGBARGBARGBA"
+#endif
+ );
+ return 0;
+ }
+ return 1;
+}
+
+static int TWebPSetupDecode(TIFF *tif)
+{
+ static const char module[] = "WebPSetupDecode";
+ uint16_t nBitsPerSample = tif->tif_dir.td_bitspersample;
+ uint16_t sampleFormat = tif->tif_dir.td_sampleformat;
+
+ WebPState *sp = DecoderState(tif);
+ assert(sp != NULL);
+
+ sp->nSamples = tif->tif_dir.td_samplesperpixel;
+
+ /* check band count */
+ if (sp->nSamples != 3
+#if WEBP_ENCODER_ABI_VERSION >= 0x0100
+ && sp->nSamples != 4
+#endif
+ )
+ {
+ TIFFErrorExtR(tif, module,
+ "WEBP driver doesn't support %d bands. Must be 3 (RGB) "
+#if WEBP_ENCODER_ABI_VERSION >= 0x0100
+ "or 4 (RGBA) "
+#endif
+ "bands.",
+ sp->nSamples);
+ return 0;
+ }
+
+ /* check bits per sample and data type */
+ if ((nBitsPerSample != 8) && (sampleFormat != 1))
+ {
+ TIFFErrorExtR(tif, module, "WEBP driver requires 8 bit unsigned data");
+ return 0;
+ }
+
+ /* if we were last encoding, terminate this mode */
+ if (sp->state & LSTATE_INIT_ENCODE)
+ {
+ WebPPictureFree(&sp->sPicture);
+ if (sp->pBuffer != NULL)
+ {
+ _TIFFfreeExt(tif, sp->pBuffer);
+ sp->pBuffer = NULL;
+ }
+ sp->buffer_offset = 0;
+ sp->state = 0;
+ }
+
+ sp->state |= LSTATE_INIT_DECODE;
+
+ return 1;
+}
+
+/*
+ * Setup state for decoding a strip.
+ */
+static int TWebPPreDecode(TIFF *tif, uint16_t s)
+{
+ static const char module[] = "TWebPPreDecode";
+ uint32_t segment_width, segment_height;
+ WebPState *sp = DecoderState(tif);
+ TIFFDirectory *td = &tif->tif_dir;
+ (void)s;
+ assert(sp != NULL);
+
+ if (isTiled(tif))
+ {
+ segment_width = td->td_tilewidth;
+ segment_height = td->td_tilelength;
+ }
+ else
+ {
+ segment_width = td->td_imagewidth;
+ segment_height = td->td_imagelength - tif->tif_row;
+ if (segment_height > td->td_rowsperstrip)
+ segment_height = td->td_rowsperstrip;
+ }
+
+ if (segment_width > 16383 || segment_height > 16383)
+ {
+ TIFFErrorExtR(tif, module,
+ "WEBP maximum image dimensions are 16383 x 16383.");
+ return 0;
+ }
+
+ if ((sp->state & LSTATE_INIT_DECODE) == 0)
+ tif->tif_setupdecode(tif);
+
+ if (sp->psDecoder != NULL)
+ {
+ WebPIDelete(sp->psDecoder);
+ WebPFreeDecBuffer(&sp->sDecBuffer);
+ sp->psDecoder = NULL;
+ }
+
+ return 1;
+}
+
+static int TWebPSetupEncode(TIFF *tif)
+{
+ static const char module[] = "WebPSetupEncode";
+ uint16_t nBitsPerSample = tif->tif_dir.td_bitspersample;
+ uint16_t sampleFormat = tif->tif_dir.td_sampleformat;
+
+ WebPState *sp = EncoderState(tif);
+ assert(sp != NULL);
+
+ sp->nSamples = tif->tif_dir.td_samplesperpixel;
+
+ /* check band count */
+ if (sp->nSamples != 3
+#if WEBP_ENCODER_ABI_VERSION >= 0x0100
+ && sp->nSamples != 4
+#endif
+ )
+ {
+ TIFFErrorExtR(tif, module,
+ "WEBP driver doesn't support %d bands. Must be 3 (RGB) "
+#if WEBP_ENCODER_ABI_VERSION >= 0x0100
+ "or 4 (RGBA) "
+#endif
+ "bands.",
+ sp->nSamples);
+ return 0;
+ }
+
+ /* check bits per sample and data type */
+ if ((nBitsPerSample != 8) || (sampleFormat != SAMPLEFORMAT_UINT))
+ {
+ TIFFErrorExtR(tif, module, "WEBP driver requires 8 bit unsigned data");
+ return 0;
+ }
+
+ if (sp->state & LSTATE_INIT_DECODE)
+ {
+ WebPIDelete(sp->psDecoder);
+ WebPFreeDecBuffer(&sp->sDecBuffer);
+ sp->psDecoder = NULL;
+ sp->last_y = 0;
+ sp->state = 0;
+ }
+
+ sp->state |= LSTATE_INIT_ENCODE;
+
+ if (!WebPPictureInit(&sp->sPicture))
+ {
+ TIFFErrorExtR(tif, module, "Error initializing WebP picture.");
+ return 0;
+ }
+
+ if (!WebPConfigInitInternal(&sp->sEncoderConfig, WEBP_PRESET_DEFAULT,
+ (float)sp->quality_level,
+ WEBP_ENCODER_ABI_VERSION))
+ {
+ TIFFErrorExtR(tif, module,
+ "Error creating WebP encoder configuration.");
+ return 0;
+ }
+
+// WebPConfigInitInternal above sets lossless to false
+#if WEBP_ENCODER_ABI_VERSION >= 0x0100
+ sp->sEncoderConfig.lossless = sp->lossless;
+ if (sp->lossless)
+ {
+ sp->sPicture.use_argb = 1;
+ }
+#endif
+
+ if (!WebPValidateConfig(&sp->sEncoderConfig))
+ {
+ TIFFErrorExtR(tif, module, "Error with WebP encoder configuration.");
+ return 0;
+ }
+
+ return 1;
+}
+
+/*
+ * Reset encoding state at the start of a strip.
+ */
+static int TWebPPreEncode(TIFF *tif, uint16_t s)
+{
+ static const char module[] = "TWebPPreEncode";
+ uint32_t segment_width, segment_height;
+ WebPState *sp = EncoderState(tif);
+ TIFFDirectory *td = &tif->tif_dir;
+
+ (void)s;
+
+ assert(sp != NULL);
+ if (sp->state != LSTATE_INIT_ENCODE)
+ tif->tif_setupencode(tif);
+
+ /*
+ * Set encoding parameters for this strip/tile.
+ */
+ if (isTiled(tif))
+ {
+ segment_width = td->td_tilewidth;
+ segment_height = td->td_tilelength;
+ }
+ else
+ {
+ segment_width = td->td_imagewidth;
+ segment_height = td->td_imagelength - tif->tif_row;
+ if (segment_height > td->td_rowsperstrip)
+ segment_height = td->td_rowsperstrip;
+ }
+
+ if (segment_width > 16383 || segment_height > 16383)
+ {
+ TIFFErrorExtR(tif, module,
+ "WEBP maximum image dimensions are 16383 x 16383.");
+ return 0;
+ }
+
+ /* set up buffer for raw data */
+ /* given above check and that nSamples <= 4, buffer_size is <= 1 GB */
+ sp->buffer_size = segment_width * segment_height * sp->nSamples;
+
+ if (sp->pBuffer != NULL)
+ {
+ _TIFFfreeExt(tif, sp->pBuffer);
+ sp->pBuffer = NULL;
+ }
+
+ sp->pBuffer = _TIFFmallocExt(tif, sp->buffer_size);
+ if (!sp->pBuffer)
+ {
+ TIFFErrorExtR(tif, module, "Cannot allocate buffer");
+ return 0;
+ }
+ sp->buffer_offset = 0;
+
+ sp->sPicture.width = segment_width;
+ sp->sPicture.height = segment_height;
+ sp->sPicture.writer = TWebPDatasetWriter;
+ sp->sPicture.custom_ptr = tif;
+
+ return 1;
+}
+
+/*
+ * Finish off an encoded strip by flushing it.
+ */
+static int TWebPPostEncode(TIFF *tif)
+{
+ static const char module[] = "WebPPostEncode";
+ int64_t stride;
+ WebPState *sp = EncoderState(tif);
+ assert(sp != NULL);
+
+ assert(sp->state == LSTATE_INIT_ENCODE);
+
+ stride = (int64_t)sp->sPicture.width * sp->nSamples;
+
+#if WEBP_ENCODER_ABI_VERSION >= 0x0100
+ if (sp->nSamples == 4)
+ {
+ if (!WebPPictureImportRGBA(&sp->sPicture, sp->pBuffer, (int)stride))
+ {
+ TIFFErrorExtR(tif, module, "WebPPictureImportRGBA() failed");
+ return 0;
+ }
+ }
+ else
+#endif
+ if (!WebPPictureImportRGB(&sp->sPicture, sp->pBuffer, (int)stride))
+ {
+ TIFFErrorExtR(tif, module, "WebPPictureImportRGB() failed");
+ return 0;
+ }
+
+ if (!WebPEncode(&sp->sEncoderConfig, &sp->sPicture))
+ {
+
+#if WEBP_ENCODER_ABI_VERSION >= 0x0100
+ const char *pszErrorMsg = NULL;
+ switch (sp->sPicture.error_code)
+ {
+ case VP8_ENC_ERROR_OUT_OF_MEMORY:
+ pszErrorMsg = "Out of memory";
+ break;
+ case VP8_ENC_ERROR_BITSTREAM_OUT_OF_MEMORY:
+ pszErrorMsg = "Out of memory while flushing bits";
+ break;
+ case VP8_ENC_ERROR_NULL_PARAMETER:
+ pszErrorMsg = "A pointer parameter is NULL";
+ break;
+ case VP8_ENC_ERROR_INVALID_CONFIGURATION:
+ pszErrorMsg = "Configuration is invalid";
+ break;
+ case VP8_ENC_ERROR_BAD_DIMENSION:
+ pszErrorMsg = "Picture has invalid width/height";
+ break;
+ case VP8_ENC_ERROR_PARTITION0_OVERFLOW:
+ pszErrorMsg = "Partition is bigger than 512k. Try using less "
+ "SEGMENTS, or increase PARTITION_LIMIT value";
+ break;
+ case VP8_ENC_ERROR_PARTITION_OVERFLOW:
+ pszErrorMsg = "Partition is bigger than 16M";
+ break;
+ case VP8_ENC_ERROR_BAD_WRITE:
+ pszErrorMsg = "Error while fludshing bytes";
+ break;
+ case VP8_ENC_ERROR_FILE_TOO_BIG:
+ pszErrorMsg = "File is bigger than 4G";
+ break;
+ case VP8_ENC_ERROR_USER_ABORT:
+ pszErrorMsg = "User interrupted";
+ break;
+ default:
+ TIFFErrorExtR(tif, module,
+ "WebPEncode returned an unknown error code: %d",
+ sp->sPicture.error_code);
+ pszErrorMsg = "Unknown WebP error type.";
+ break;
+ }
+ TIFFErrorExtR(tif, module, "WebPEncode() failed : %s", pszErrorMsg);
+#else
+ TIFFErrorExtR(tif, module, "Error in WebPEncode()");
+#endif
+ return 0;
+ }
+
+ sp->sPicture.custom_ptr = NULL;
+
+ if (!TIFFFlushData1(tif))
+ {
+ TIFFErrorExtR(tif, module, "Error flushing TIFF WebP encoder.");
+ return 0;
+ }
+
+ return 1;
+}
+
+static void TWebPCleanup(TIFF *tif)
+{
+ WebPState *sp = LState(tif);
+
+ assert(sp != 0);
+
+ tif->tif_tagmethods.vgetfield = sp->vgetparent;
+ tif->tif_tagmethods.vsetfield = sp->vsetparent;
+
+ if (sp->state & LSTATE_INIT_ENCODE)
+ {
+ WebPPictureFree(&sp->sPicture);
+ }
+
+ if (sp->psDecoder != NULL)
+ {
+ WebPIDelete(sp->psDecoder);
+ WebPFreeDecBuffer(&sp->sDecBuffer);
+ sp->psDecoder = NULL;
+ sp->last_y = 0;
+ }
+
+ if (sp->pBuffer != NULL)
+ {
+ _TIFFfreeExt(tif, sp->pBuffer);
+ sp->pBuffer = NULL;
+ }
+
+ _TIFFfreeExt(tif, tif->tif_data);
+ tif->tif_data = NULL;
+
+ _TIFFSetDefaultCompressionState(tif);
+}
+
+static int TWebPVSetField(TIFF *tif, uint32_t tag, va_list ap)
+{
+ static const char module[] = "WebPVSetField";
+ WebPState *sp = LState(tif);
+
+ switch (tag)
+ {
+ case TIFFTAG_WEBP_LEVEL:
+ sp->quality_level = (int)va_arg(ap, int);
+ if (sp->quality_level <= 0 || sp->quality_level > 100.0f)
+ {
+ TIFFWarningExtR(tif, module,
+ "WEBP_LEVEL should be between 1 and 100");
+ }
+ return 1;
+ case TIFFTAG_WEBP_LOSSLESS:
+#if WEBP_ENCODER_ABI_VERSION >= 0x0100
+ sp->lossless = va_arg(ap, int);
+ if (sp->lossless)
+ {
+ sp->quality_level = 100;
+ }
+ return 1;
+#else
+ TIFFErrorExtR(
+ tif, module,
+ "Need to upgrade WEBP driver, this version doesn't support "
+ "lossless compression.");
+ return 0;
+#endif
+ default:
+ return (*sp->vsetparent)(tif, tag, ap);
+ }
+ /*NOTREACHED*/
+}
+
+static int TWebPVGetField(TIFF *tif, uint32_t tag, va_list ap)
+{
+ WebPState *sp = LState(tif);
+
+ switch (tag)
+ {
+ case TIFFTAG_WEBP_LEVEL:
+ *va_arg(ap, int *) = sp->quality_level;
+ break;
+ case TIFFTAG_WEBP_LOSSLESS:
+ *va_arg(ap, int *) = sp->lossless;
+ break;
+ default:
+ return (*sp->vgetparent)(tif, tag, ap);
+ }
+ return 1;
+}
+
+static const TIFFField TWebPFields[] = {
+ {TIFFTAG_WEBP_LEVEL, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
+ TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "WEBP quality", NULL},
+ {TIFFTAG_WEBP_LOSSLESS, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
+ TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "WEBP lossless/lossy",
+ NULL},
+};
+
+int TIFFInitWebP(TIFF *tif, int scheme)
+{
+ static const char module[] = "TIFFInitWebP";
+ WebPState *sp;
+
+ (void)scheme;
+ assert(scheme == COMPRESSION_WEBP);
+
+ /*
+ * Merge codec-specific tag information.
+ */
+ if (!_TIFFMergeFields(tif, TWebPFields, TIFFArrayCount(TWebPFields)))
+ {
+ TIFFErrorExtR(tif, module, "Merging WebP codec-specific tags failed");
+ return 0;
+ }
+
+ /*
+ * Allocate state block so tag methods have storage to record values.
+ */
+ tif->tif_data = (uint8_t *)_TIFFmallocExt(tif, sizeof(WebPState));
+ if (tif->tif_data == NULL)
+ goto bad;
+ sp = LState(tif);
+
+ /*
+ * Override parent get/set field methods.
+ */
+ sp->vgetparent = tif->tif_tagmethods.vgetfield;
+ tif->tif_tagmethods.vgetfield = TWebPVGetField; /* hook for codec tags */
+ sp->vsetparent = tif->tif_tagmethods.vsetfield;
+ tif->tif_tagmethods.vsetfield = TWebPVSetField; /* hook for codec tags */
+
+ /* Default values for codec-specific fields */
+ sp->quality_level = 75; /* default comp. level */
+ sp->lossless = 0; /* default to false */
+ sp->state = 0;
+ sp->nSamples = 0;
+ sp->psDecoder = NULL;
+ sp->last_y = 0;
+
+ sp->buffer_offset = 0;
+ sp->pBuffer = NULL;
+
+ /*
+ * Install codec methods.
+ * Notes:
+ * encoderow is not supported
+ */
+ tif->tif_fixuptags = TWebPFixupTags;
+ tif->tif_setupdecode = TWebPSetupDecode;
+ tif->tif_predecode = TWebPPreDecode;
+ tif->tif_decoderow = TWebPDecode;
+ tif->tif_decodestrip = TWebPDecode;
+ tif->tif_decodetile = TWebPDecode;
+ tif->tif_setupencode = TWebPSetupEncode;
+ tif->tif_preencode = TWebPPreEncode;
+ tif->tif_postencode = TWebPPostEncode;
+ tif->tif_encoderow = TWebPEncode;
+ tif->tif_encodestrip = TWebPEncode;
+ tif->tif_encodetile = TWebPEncode;
+ tif->tif_cleanup = TWebPCleanup;
+
+ return 1;
+bad:
+ TIFFErrorExtR(tif, module, "No space for WebP state block");
+ return 0;
+}
+
+#endif /* WEBP_SUPPORT */
diff --git a/src/3rdparty/libtiff/libtiff/tif_win32.c b/src/3rdparty/libtiff/libtiff/tif_win32.c
index 088880e..8b47650 100644
--- a/src/3rdparty/libtiff/libtiff/tif_win32.c
+++ b/src/3rdparty/libtiff/libtiff/tif_win32.c
@@ -2,23 +2,23 @@
* Copyright (c) 1988-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -27,142 +27,139 @@
* Scott Wagner (wagner@itek.com), Itek Graphix, Rochester, NY USA
*/
-/*
- CreateFileA/CreateFileW return type 'HANDLE'.
-
- thandle_t is declared like
-
- DECLARE_HANDLE(thandle_t);
+#include "tiffiop.h"
+#include <stdlib.h>
- in tiffio.h.
+#include <windows.h>
- Windows (from winnt.h) DECLARE_HANDLE logic looks like
+/*
+ CreateFileA/CreateFileW return type 'HANDLE' while TIFFFdOpen() takes 'int',
+ which is formally incompatible and can even seemingly be of different size:
+ HANDLE is 64 bit under Win64, while int is still 32 bits there.
- #ifdef STRICT
- typedef void *HANDLE;
- #define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
- #else
- typedef PVOID HANDLE;
- #define DECLARE_HANDLE(name) typedef HANDLE name
- #endif
+ However, only the lower 32 bits of a HANDLE are significant under Win64 as,
+ for interoperability reasons, they must have the same values in 32- and
+ 64-bit programs running on the same system, see
- See http://bugzilla.maptools.org/show_bug.cgi?id=1941 for problems in WIN64
- builds resulting from this. Unfortunately, the proposed patch was lost.
+ https://docs.microsoft.com/en-us/windows/win32/winprog64/interprocess-communication
+ Because of this, it is safe to define the following trivial functions for
+ casting between ints and HANDLEs, which are only really needed to avoid
+ compiler warnings (and, perhaps, to make the code slightly more clear).
+ Note that using the intermediate cast to "intptr_t" is crucial for warning
+ avoidance, as this integer type has the same size as HANDLE in all builds.
*/
-
-#include "tiffiop.h"
-
-#include <windows.h>
-static tmsize_t
-_tiffReadProc(thandle_t fd, void* buf, tmsize_t size)
+static inline thandle_t thandle_from_int(int ifd)
{
- /* tmsize_t is 64bit on 64bit systems, but the WinAPI ReadFile takes
- * 32bit sizes, so we loop through the data in suitable 32bit sized
- * chunks */
- uint8* ma;
- uint64 mb;
- DWORD n;
- DWORD o;
- tmsize_t p;
- ma=(uint8*)buf;
- mb=size;
- p=0;
- while (mb>0)
- {
- n=0x80000000UL;
- if ((uint64)n>mb)
- n=(DWORD)mb;
- if (!ReadFile(fd,(LPVOID)ma,n,&o,NULL))
- return(0);
- ma+=o;
- mb-=o;
- p+=o;
- if (o!=n)
- break;
- }
- return(p);
+ return (thandle_t)(intptr_t)ifd;
}
-static tmsize_t
-_tiffWriteProc(thandle_t fd, void* buf, tmsize_t size)
+static inline int thandle_to_int(thandle_t fd) { return (int)(intptr_t)fd; }
+
+static tmsize_t _tiffReadProc(thandle_t fd, void *buf, tmsize_t size)
{
- /* tmsize_t is 64bit on 64bit systems, but the WinAPI WriteFile takes
- * 32bit sizes, so we loop through the data in suitable 32bit sized
- * chunks */
- uint8* ma;
- uint64 mb;
- DWORD n;
- DWORD o;
- tmsize_t p;
- ma=(uint8*)buf;
- mb=size;
- p=0;
- while (mb>0)
- {
- n=0x80000000UL;
- if ((uint64)n>mb)
- n=(DWORD)mb;
- if (!WriteFile(fd,(LPVOID)ma,n,&o,NULL))
- return(0);
- ma+=o;
- mb-=o;
- p+=o;
- if (o!=n)
- break;
- }
- return(p);
+ /* tmsize_t is 64bit on 64bit systems, but the WinAPI ReadFile takes
+ * 32bit sizes, so we loop through the data in suitable 32bit sized
+ * chunks */
+ uint8_t *ma;
+ uint64_t mb;
+ DWORD n;
+ DWORD o;
+ tmsize_t p;
+ ma = (uint8_t *)buf;
+ mb = size;
+ p = 0;
+ while (mb > 0)
+ {
+ n = 0x80000000UL;
+ if ((uint64_t)n > mb)
+ n = (DWORD)mb;
+ if (!ReadFile(fd, (LPVOID)ma, n, &o, NULL))
+ return (0);
+ ma += o;
+ mb -= o;
+ p += o;
+ if (o != n)
+ break;
+ }
+ return (p);
}
-static uint64
-_tiffSeekProc(thandle_t fd, uint64 off, int whence)
+static tmsize_t _tiffWriteProc(thandle_t fd, void *buf, tmsize_t size)
{
- LARGE_INTEGER offli;
- DWORD dwMoveMethod;
- offli.QuadPart = off;
- switch(whence)
- {
- case SEEK_SET:
- dwMoveMethod = FILE_BEGIN;
- break;
- case SEEK_CUR:
- dwMoveMethod = FILE_CURRENT;
- break;
- case SEEK_END:
- dwMoveMethod = FILE_END;
- break;
- default:
- dwMoveMethod = FILE_BEGIN;
- break;
- }
- offli.LowPart=SetFilePointer(fd,offli.LowPart,&offli.HighPart,dwMoveMethod);
- if ((offli.LowPart==INVALID_SET_FILE_POINTER)&&(GetLastError()!=NO_ERROR))
- offli.QuadPart=0;
- return(offli.QuadPart);
+ /* tmsize_t is 64bit on 64bit systems, but the WinAPI WriteFile takes
+ * 32bit sizes, so we loop through the data in suitable 32bit sized
+ * chunks */
+ uint8_t *ma;
+ uint64_t mb;
+ DWORD n;
+ DWORD o;
+ tmsize_t p;
+ ma = (uint8_t *)buf;
+ mb = size;
+ p = 0;
+ while (mb > 0)
+ {
+ n = 0x80000000UL;
+ if ((uint64_t)n > mb)
+ n = (DWORD)mb;
+ if (!WriteFile(fd, (LPVOID)ma, n, &o, NULL))
+ return (0);
+ ma += o;
+ mb -= o;
+ p += o;
+ if (o != n)
+ break;
+ }
+ return (p);
}
-static int
-_tiffCloseProc(thandle_t fd)
+static uint64_t _tiffSeekProc(thandle_t fd, uint64_t off, int whence)
{
- return (CloseHandle(fd) ? 0 : -1);
+ LARGE_INTEGER offli;
+ DWORD dwMoveMethod;
+ offli.QuadPart = off;
+ switch (whence)
+ {
+ case SEEK_SET:
+ dwMoveMethod = FILE_BEGIN;
+ break;
+ case SEEK_CUR:
+ dwMoveMethod = FILE_CURRENT;
+ break;
+ case SEEK_END:
+ dwMoveMethod = FILE_END;
+ break;
+ default:
+ dwMoveMethod = FILE_BEGIN;
+ break;
+ }
+ offli.LowPart =
+ SetFilePointer(fd, offli.LowPart, &offli.HighPart, dwMoveMethod);
+ if ((offli.LowPart == INVALID_SET_FILE_POINTER) &&
+ (GetLastError() != NO_ERROR))
+ offli.QuadPart = 0;
+ return (offli.QuadPart);
}
-static uint64
-_tiffSizeProc(thandle_t fd)
+static int _tiffCloseProc(thandle_t fd) { return (CloseHandle(fd) ? 0 : -1); }
+
+static uint64_t _tiffSizeProc(thandle_t fd)
{
- ULARGE_INTEGER m;
- m.LowPart=GetFileSize(fd,&m.HighPart);
- return(m.QuadPart);
+ LARGE_INTEGER m;
+ if (GetFileSizeEx(fd, &m))
+ return (m.QuadPart);
+ else
+ return (0);
}
-static int
-_tiffDummyMapProc(thandle_t fd, void** pbase, toff_t* psize)
+static int _tiffDummyMapProc(thandle_t fd, void **pbase, toff_t *psize)
{
- (void) fd;
- (void) pbase;
- (void) psize;
- return (0);
+ (void)fd;
+ (void)pbase;
+ (void)psize;
+ return (0);
}
/*
@@ -176,45 +173,42 @@ _tiffDummyMapProc(thandle_t fd, void** pbase, toff_t* psize)
* This removes a nasty OS dependency and cures a problem
* with Visual C++ 5.0
*/
-static int
-_tiffMapProc(thandle_t fd, void** pbase, toff_t* psize)
+static int _tiffMapProc(thandle_t fd, void **pbase, toff_t *psize)
{
- uint64 size;
- tmsize_t sizem;
- HANDLE hMapFile;
-
- size = _tiffSizeProc(fd);
- sizem = (tmsize_t)size;
- if ((uint64)sizem!=size)
- return (0);
-
- /* By passing in 0 for the maximum file size, it specifies that we
- create a file mapping object for the full file size. */
- hMapFile = CreateFileMapping(fd, NULL, PAGE_READONLY, 0, 0, NULL);
- if (hMapFile == NULL)
- return (0);
- *pbase = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);
- CloseHandle(hMapFile);
- if (*pbase == NULL)
- return (0);
- *psize = size;
- return(1);
+ uint64_t size;
+ tmsize_t sizem;
+ HANDLE hMapFile;
+
+ size = _tiffSizeProc(fd);
+ sizem = (tmsize_t)size;
+ if (!size || (uint64_t)sizem != size)
+ return (0);
+
+ /* By passing in 0 for the maximum file size, it specifies that we
+ create a file mapping object for the full file size. */
+ hMapFile = CreateFileMapping(fd, NULL, PAGE_READONLY, 0, 0, NULL);
+ if (hMapFile == NULL)
+ return (0);
+ *pbase = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);
+ CloseHandle(hMapFile);
+ if (*pbase == NULL)
+ return (0);
+ *psize = size;
+ return (1);
}
-static void
-_tiffDummyUnmapProc(thandle_t fd, void* base, toff_t size)
+static void _tiffDummyUnmapProc(thandle_t fd, void *base, toff_t size)
{
- (void) fd;
- (void) base;
- (void) size;
+ (void)fd;
+ (void)base;
+ (void)size;
}
-static void
-_tiffUnmapProc(thandle_t fd, void* base, toff_t size)
+static void _tiffUnmapProc(thandle_t fd, void *base, toff_t size)
{
- (void) fd;
- (void) size;
- UnmapViewOfFile(base);
+ (void)fd;
+ (void)size;
+ UnmapViewOfFile(base);
}
/*
@@ -222,29 +216,36 @@ _tiffUnmapProc(thandle_t fd, void* base, toff_t size)
* Note that TIFFFdOpen and TIFFOpen recognise the character 'u' in the mode
* string, which forces the file to be opened unmapped.
*/
-TIFF*
-TIFFFdOpen(int ifd, const char* name, const char* mode)
+TIFF *TIFFFdOpen(int ifd, const char *name, const char *mode)
+{
+ return TIFFFdOpenExt(ifd, name, mode, NULL);
+}
+
+TIFF *TIFFFdOpenExt(int ifd, const char *name, const char *mode,
+ TIFFOpenOptions *opts)
{
- TIFF* tif;
- int fSuppressMap;
- int m;
- fSuppressMap=0;
- for (m=0; mode[m]!=0; m++)
- {
- if (mode[m]=='u')
- {
- fSuppressMap=1;
- break;
- }
- }
- tif = TIFFClientOpen(name, mode, (thandle_t)ifd, /* FIXME: WIN64 cast to pointer warning */
- _tiffReadProc, _tiffWriteProc,
- _tiffSeekProc, _tiffCloseProc, _tiffSizeProc,
- fSuppressMap ? _tiffDummyMapProc : _tiffMapProc,
- fSuppressMap ? _tiffDummyUnmapProc : _tiffUnmapProc);
- if (tif)
- tif->tif_fd = ifd;
- return (tif);
+ TIFF *tif;
+ int fSuppressMap;
+ int m;
+
+ fSuppressMap = 0;
+ for (m = 0; mode[m] != 0; m++)
+ {
+ if (mode[m] == 'u')
+ {
+ fSuppressMap = 1;
+ break;
+ }
+ }
+
+ tif = TIFFClientOpenExt(
+ name, mode, thandle_from_int(ifd), _tiffReadProc, _tiffWriteProc,
+ _tiffSeekProc, _tiffCloseProc, _tiffSizeProc,
+ fSuppressMap ? _tiffDummyMapProc : _tiffMapProc,
+ fSuppressMap ? _tiffDummyUnmapProc : _tiffUnmapProc, opts);
+ if (tif)
+ tif->tif_fd = ifd;
+ return (tif);
}
#ifndef _WIN32_WCE
@@ -252,184 +253,190 @@ TIFFFdOpen(int ifd, const char* name, const char* mode)
/*
* Open a TIFF file for read/writing.
*/
-TIFF*
-TIFFOpen(const char* name, const char* mode)
+TIFF *TIFFOpen(const char *name, const char *mode)
{
- static const char module[] = "TIFFOpen";
- thandle_t fd;
- int m;
- DWORD dwMode;
- TIFF* tif;
-
- m = _TIFFgetMode(mode, module);
-
- switch(m) {
- case O_RDONLY: dwMode = OPEN_EXISTING; break;
- case O_RDWR: dwMode = OPEN_ALWAYS; break;
- case O_RDWR|O_CREAT: dwMode = OPEN_ALWAYS; break;
- case O_RDWR|O_TRUNC: dwMode = CREATE_ALWAYS; break;
- case O_RDWR|O_CREAT|O_TRUNC: dwMode = CREATE_ALWAYS; break;
- default: return ((TIFF*)0);
- }
-
- fd = (thandle_t)CreateFileA(name,
- (m == O_RDONLY)?GENERIC_READ:(GENERIC_READ | GENERIC_WRITE),
- FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, dwMode,
- (m == O_RDONLY)?FILE_ATTRIBUTE_READONLY:FILE_ATTRIBUTE_NORMAL,
- NULL);
- if (fd == INVALID_HANDLE_VALUE) {
- TIFFErrorExt(0, module, "%s: Cannot open", name);
- return ((TIFF *)0);
- }
-
- tif = TIFFFdOpen((int)fd, name, mode); /* FIXME: WIN64 cast from pointer to int warning */
- if(!tif)
- CloseHandle(fd);
- return tif;
+ return TIFFOpenExt(name, mode, NULL);
+}
+
+TIFF *TIFFOpenExt(const char *name, const char *mode, TIFFOpenOptions *opts)
+{
+ static const char module[] = "TIFFOpen";
+ thandle_t fd;
+ int m;
+ DWORD dwMode;
+ TIFF *tif;
+
+ m = _TIFFgetMode(opts, NULL, mode, module);
+
+ switch (m)
+ {
+ case O_RDONLY:
+ dwMode = OPEN_EXISTING;
+ break;
+ case O_RDWR:
+ dwMode = OPEN_ALWAYS;
+ break;
+ case O_RDWR | O_CREAT:
+ dwMode = OPEN_ALWAYS;
+ break;
+ case O_RDWR | O_TRUNC:
+ dwMode = CREATE_ALWAYS;
+ break;
+ case O_RDWR | O_CREAT | O_TRUNC:
+ dwMode = CREATE_ALWAYS;
+ break;
+ default:
+ return ((TIFF *)0);
+ }
+
+ fd = (thandle_t)CreateFileA(
+ name, (m == O_RDONLY) ? GENERIC_READ : (GENERIC_READ | GENERIC_WRITE),
+ FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, dwMode,
+ (m == O_RDONLY) ? FILE_ATTRIBUTE_READONLY : FILE_ATTRIBUTE_NORMAL,
+ NULL);
+ if (fd == INVALID_HANDLE_VALUE)
+ {
+ _TIFFErrorEarly(opts, NULL, module, "%s: Cannot open", name);
+ return ((TIFF *)0);
+ }
+
+ tif = TIFFFdOpenExt(thandle_to_int(fd), name, mode, opts);
+ if (!tif)
+ CloseHandle(fd);
+ return tif;
}
/*
* Open a TIFF file with a Unicode filename, for read/writing.
*/
-TIFF*
-TIFFOpenW(const wchar_t* name, const char* mode)
+TIFF *TIFFOpenW(const wchar_t *name, const char *mode)
+{
+ return TIFFOpenWExt(name, mode, NULL);
+}
+
+TIFF *TIFFOpenWExt(const wchar_t *name, const char *mode, TIFFOpenOptions *opts)
{
- static const char module[] = "TIFFOpenW";
- thandle_t fd;
- int m;
- DWORD dwMode;
- int mbsize;
- char *mbname;
- TIFF *tif;
-
- m = _TIFFgetMode(mode, module);
-
- switch(m) {
- case O_RDONLY: dwMode = OPEN_EXISTING; break;
- case O_RDWR: dwMode = OPEN_ALWAYS; break;
- case O_RDWR|O_CREAT: dwMode = OPEN_ALWAYS; break;
- case O_RDWR|O_TRUNC: dwMode = CREATE_ALWAYS; break;
- case O_RDWR|O_CREAT|O_TRUNC: dwMode = CREATE_ALWAYS; break;
- default: return ((TIFF*)0);
- }
-
- fd = (thandle_t)CreateFileW(name,
- (m == O_RDONLY)?GENERIC_READ:(GENERIC_READ|GENERIC_WRITE),
- FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, dwMode,
- (m == O_RDONLY)?FILE_ATTRIBUTE_READONLY:FILE_ATTRIBUTE_NORMAL,
- NULL);
- if (fd == INVALID_HANDLE_VALUE) {
- TIFFErrorExt(0, module, "%S: Cannot open", name);
- return ((TIFF *)0);
- }
-
- mbname = NULL;
- mbsize = WideCharToMultiByte(CP_ACP, 0, name, -1, NULL, 0, NULL, NULL);
- if (mbsize > 0) {
- mbname = (char *)_TIFFmalloc(mbsize);
- if (!mbname) {
- TIFFErrorExt(0, module,
- "Can't allocate space for filename conversion buffer");
- return ((TIFF*)0);
- }
-
- WideCharToMultiByte(CP_ACP, 0, name, -1, mbname, mbsize,
- NULL, NULL);
- }
-
- tif = TIFFFdOpen((int)fd, /* FIXME: WIN64 cast from pointer to int warning */
- (mbname != NULL) ? mbname : "<unknown>", mode);
- if(!tif)
- CloseHandle(fd);
-
- _TIFFfree(mbname);
-
- return tif;
+ static const char module[] = "TIFFOpenW";
+ thandle_t fd;
+ int m;
+ DWORD dwMode;
+ int mbsize;
+ char *mbname;
+ TIFF *tif;
+
+ m = _TIFFgetMode(opts, NULL, mode, module);
+
+ switch (m)
+ {
+ case O_RDONLY:
+ dwMode = OPEN_EXISTING;
+ break;
+ case O_RDWR:
+ dwMode = OPEN_ALWAYS;
+ break;
+ case O_RDWR | O_CREAT:
+ dwMode = OPEN_ALWAYS;
+ break;
+ case O_RDWR | O_TRUNC:
+ dwMode = CREATE_ALWAYS;
+ break;
+ case O_RDWR | O_CREAT | O_TRUNC:
+ dwMode = CREATE_ALWAYS;
+ break;
+ default:
+ return ((TIFF *)0);
+ }
+
+ fd = (thandle_t)CreateFileW(
+ name, (m == O_RDONLY) ? GENERIC_READ : (GENERIC_READ | GENERIC_WRITE),
+ FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, dwMode,
+ (m == O_RDONLY) ? FILE_ATTRIBUTE_READONLY : FILE_ATTRIBUTE_NORMAL,
+ NULL);
+ if (fd == INVALID_HANDLE_VALUE)
+ {
+ _TIFFErrorEarly(opts, NULL, module, "%S: Cannot open", name);
+ return ((TIFF *)0);
+ }
+
+ mbname = NULL;
+ mbsize = WideCharToMultiByte(CP_ACP, 0, name, -1, NULL, 0, NULL, NULL);
+ if (mbsize > 0)
+ {
+ mbname = (char *)_TIFFmalloc(mbsize);
+ if (!mbname)
+ {
+ _TIFFErrorEarly(
+ opts, NULL, module,
+ "Can't allocate space for filename conversion buffer");
+ return ((TIFF *)0);
+ }
+
+ WideCharToMultiByte(CP_ACP, 0, name, -1, mbname, mbsize, NULL, NULL);
+ }
+
+ tif = TIFFFdOpenExt(thandle_to_int(fd),
+ (mbname != NULL) ? mbname : "<unknown>", mode, opts);
+ if (!tif)
+ CloseHandle(fd);
+
+ _TIFFfree(mbname);
+
+ return tif;
}
#endif /* ndef _WIN32_WCE */
-void*
-_TIFFmalloc(tmsize_t s)
+void *_TIFFmalloc(tmsize_t s)
{
- if (s == 0)
- return ((void *) NULL);
+ if (s == 0)
+ return ((void *)NULL);
- return (malloc((size_t) s));
+ return (malloc((size_t)s));
}
-void* _TIFFcalloc(tmsize_t nmemb, tmsize_t siz)
+void *_TIFFcalloc(tmsize_t nmemb, tmsize_t siz)
{
- if( nmemb == 0 || siz == 0 )
- return ((void *) NULL);
+ if (nmemb == 0 || siz == 0)
+ return ((void *)NULL);
- return calloc((size_t) nmemb, (size_t)siz);
+ return calloc((size_t)nmemb, (size_t)siz);
}
-void
-_TIFFfree(void* p)
-{
- free(p);
-}
+void _TIFFfree(void *p) { free(p); }
-void*
-_TIFFrealloc(void* p, tmsize_t s)
-{
- return (realloc(p, (size_t) s));
-}
+void *_TIFFrealloc(void *p, tmsize_t s) { return (realloc(p, (size_t)s)); }
-void
-_TIFFmemset(void* p, int v, tmsize_t c)
-{
- memset(p, v, (size_t) c);
-}
+void _TIFFmemset(void *p, int v, tmsize_t c) { memset(p, v, (size_t)c); }
-void
-_TIFFmemcpy(void* d, const void* s, tmsize_t c)
+void _TIFFmemcpy(void *d, const void *s, tmsize_t c)
{
- memcpy(d, s, (size_t) c);
+ memcpy(d, s, (size_t)c);
}
-int
-_TIFFmemcmp(const void* p1, const void* p2, tmsize_t c)
+int _TIFFmemcmp(const void *p1, const void *p2, tmsize_t c)
{
- return (memcmp(p1, p2, (size_t) c));
+ return (memcmp(p1, p2, (size_t)c));
}
#ifndef _WIN32_WCE
-#if (_MSC_VER < 1500)
-# define vsnprintf _vsnprintf
-#endif
-
-static void
-Win32WarningHandler(const char* module, const char* fmt, va_list ap)
+static void Win32WarningHandler(const char *module, const char *fmt, va_list ap)
{
- if (module != NULL)
- fprintf(stderr, "%s: ", module);
- fprintf(stderr, "Warning, ");
- vfprintf(stderr, fmt, ap);
- fprintf(stderr, ".\n");
+ if (module != NULL)
+ fprintf(stderr, "%s: ", module);
+ fprintf(stderr, "Warning, ");
+ vfprintf(stderr, fmt, ap);
+ fprintf(stderr, ".\n");
}
TIFFErrorHandler _TIFFwarningHandler = Win32WarningHandler;
-static void
-Win32ErrorHandler(const char* module, const char* fmt, va_list ap)
+static void Win32ErrorHandler(const char *module, const char *fmt, va_list ap)
{
- if (module != NULL)
- fprintf(stderr, "%s: ", module);
- vfprintf(stderr, fmt, ap);
- fprintf(stderr, ".\n");
+ if (module != NULL)
+ fprintf(stderr, "%s: ", module);
+ vfprintf(stderr, fmt, ap);
+ fprintf(stderr, ".\n");
}
TIFFErrorHandler _TIFFerrorHandler = Win32ErrorHandler;
#endif /* ndef _WIN32_WCE */
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_write.c b/src/3rdparty/libtiff/libtiff/tif_write.c
index 33e803c..6631a78 100644
--- a/src/3rdparty/libtiff/libtiff/tif_write.c
+++ b/src/3rdparty/libtiff/libtiff/tif_write.c
@@ -30,174 +30,178 @@
#include "tiffiop.h"
#include <stdio.h>
-#define STRIPINCR 20 /* expansion factor on strip array */
+#define STRIPINCR 20 /* expansion factor on strip array */
-#define WRITECHECKSTRIPS(tif, module) \
- (((tif)->tif_flags&TIFF_BEENWRITING) || TIFFWriteCheck((tif),0,module))
-#define WRITECHECKTILES(tif, module) \
- (((tif)->tif_flags&TIFF_BEENWRITING) || TIFFWriteCheck((tif),1,module))
-#define BUFFERCHECK(tif) \
- ((((tif)->tif_flags & TIFF_BUFFERSETUP) && tif->tif_rawdata) || \
- TIFFWriteBufferSetup((tif), NULL, (tmsize_t) -1))
+#define WRITECHECKSTRIPS(tif, module) \
+ (((tif)->tif_flags & TIFF_BEENWRITING) || TIFFWriteCheck((tif), 0, module))
+#define WRITECHECKTILES(tif, module) \
+ (((tif)->tif_flags & TIFF_BEENWRITING) || TIFFWriteCheck((tif), 1, module))
+#define BUFFERCHECK(tif) \
+ ((((tif)->tif_flags & TIFF_BUFFERSETUP) && tif->tif_rawdata) || \
+ TIFFWriteBufferSetup((tif), NULL, (tmsize_t)-1))
-static int TIFFGrowStrips(TIFF* tif, uint32 delta, const char* module);
-static int TIFFAppendToStrip(TIFF* tif, uint32 strip, uint8* data, tmsize_t cc);
+static int TIFFGrowStrips(TIFF *tif, uint32_t delta, const char *module);
+static int TIFFAppendToStrip(TIFF *tif, uint32_t strip, uint8_t *data,
+ tmsize_t cc);
-int
-TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample)
+int TIFFWriteScanline(TIFF *tif, void *buf, uint32_t row, uint16_t sample)
{
- static const char module[] = "TIFFWriteScanline";
- register TIFFDirectory *td;
- int status, imagegrew = 0;
- uint32 strip;
-
- if (!WRITECHECKSTRIPS(tif, module))
- return (-1);
- /*
- * Handle delayed allocation of data buffer. This
- * permits it to be sized more intelligently (using
- * directory information).
- */
- if (!BUFFERCHECK(tif))
- return (-1);
- tif->tif_flags |= TIFF_BUF4WRITE; /* not strictly sure this is right*/
-
- td = &tif->tif_dir;
- /*
- * Extend image length if needed
- * (but only for PlanarConfig=1).
- */
- if (row >= td->td_imagelength) { /* extend image */
- if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Can not change \"ImageLength\" when using separate planes");
- return (-1);
- }
- td->td_imagelength = row+1;
- imagegrew = 1;
- }
- /*
- * Calculate strip and check for crossings.
- */
- if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
- if (sample >= td->td_samplesperpixel) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "%lu: Sample out of range, max %lu",
- (unsigned long) sample, (unsigned long) td->td_samplesperpixel);
- return (-1);
- }
- strip = sample*td->td_stripsperimage + row/td->td_rowsperstrip;
- } else
- strip = row / td->td_rowsperstrip;
- /*
- * Check strip array to make sure there's space. We don't support
- * dynamically growing files that have data organized in separate
- * bitplanes because it's too painful. In that case we require that
- * the imagelength be set properly before the first write (so that the
- * strips array will be fully allocated above).
- */
- if (strip >= td->td_nstrips && !TIFFGrowStrips(tif, 1, module))
- return (-1);
- if (strip != tif->tif_curstrip) {
- /*
- * Changing strips -- flush any data present.
- */
- if (!TIFFFlushData(tif))
- return (-1);
- tif->tif_curstrip = strip;
- /*
- * Watch out for a growing image. The value of strips/image
- * will initially be 1 (since it can't be deduced until the
- * imagelength is known).
- */
- if (strip >= td->td_stripsperimage && imagegrew)
- td->td_stripsperimage =
- TIFFhowmany_32(td->td_imagelength,td->td_rowsperstrip);
- if (td->td_stripsperimage == 0) {
- TIFFErrorExt(tif->tif_clientdata, module, "Zero strips per image");
- return (-1);
- }
- tif->tif_row =
- (strip % td->td_stripsperimage) * td->td_rowsperstrip;
- if ((tif->tif_flags & TIFF_CODERSETUP) == 0) {
- if (!(*tif->tif_setupencode)(tif))
- return (-1);
- tif->tif_flags |= TIFF_CODERSETUP;
- }
-
- tif->tif_rawcc = 0;
- tif->tif_rawcp = tif->tif_rawdata;
-
- if( td->td_stripbytecount_p[strip] > 0 )
- {
- /* if we are writing over existing tiles, zero length */
- td->td_stripbytecount_p[strip] = 0;
-
- /* this forces TIFFAppendToStrip() to do a seek */
- tif->tif_curoff = 0;
- }
-
- if (!(*tif->tif_preencode)(tif, sample))
- return (-1);
- tif->tif_flags |= TIFF_POSTENCODE;
- }
- /*
- * Ensure the write is either sequential or at the
- * beginning of a strip (or that we can randomly
- * access the data -- i.e. no encoding).
- */
- if (row != tif->tif_row) {
- if (row < tif->tif_row) {
- /*
- * Moving backwards within the same strip:
- * backup to the start and then decode
- * forward (below).
- */
- tif->tif_row = (strip % td->td_stripsperimage) *
- td->td_rowsperstrip;
- tif->tif_rawcp = tif->tif_rawdata;
- }
- /*
- * Seek forward to the desired row.
- */
- if (!(*tif->tif_seek)(tif, row - tif->tif_row))
- return (-1);
- tif->tif_row = row;
- }
-
- /* swab if needed - note that source buffer will be altered */
- tif->tif_postdecode( tif, (uint8*) buf, tif->tif_scanlinesize );
-
- status = (*tif->tif_encoderow)(tif, (uint8*) buf,
- tif->tif_scanlinesize, sample);
-
- /* we are now poised at the beginning of the next row */
- tif->tif_row = row + 1;
- return (status);
+ static const char module[] = "TIFFWriteScanline";
+ register TIFFDirectory *td;
+ int status, imagegrew = 0;
+ uint32_t strip;
+
+ if (!WRITECHECKSTRIPS(tif, module))
+ return (-1);
+ /*
+ * Handle delayed allocation of data buffer. This
+ * permits it to be sized more intelligently (using
+ * directory information).
+ */
+ if (!BUFFERCHECK(tif))
+ return (-1);
+ tif->tif_flags |= TIFF_BUF4WRITE; /* not strictly sure this is right*/
+
+ td = &tif->tif_dir;
+ /*
+ * Extend image length if needed
+ * (but only for PlanarConfig=1).
+ */
+ if (row >= td->td_imagelength)
+ { /* extend image */
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
+ {
+ TIFFErrorExtR(
+ tif, module,
+ "Can not change \"ImageLength\" when using separate planes");
+ return (-1);
+ }
+ td->td_imagelength = row + 1;
+ imagegrew = 1;
+ }
+ /*
+ * Calculate strip and check for crossings.
+ */
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
+ {
+ if (sample >= td->td_samplesperpixel)
+ {
+ TIFFErrorExtR(tif, module, "%lu: Sample out of range, max %lu",
+ (unsigned long)sample,
+ (unsigned long)td->td_samplesperpixel);
+ return (-1);
+ }
+ strip = sample * td->td_stripsperimage + row / td->td_rowsperstrip;
+ }
+ else
+ strip = row / td->td_rowsperstrip;
+ /*
+ * Check strip array to make sure there's space. We don't support
+ * dynamically growing files that have data organized in separate
+ * bitplanes because it's too painful. In that case we require that
+ * the imagelength be set properly before the first write (so that the
+ * strips array will be fully allocated above).
+ */
+ if (strip >= td->td_nstrips && !TIFFGrowStrips(tif, 1, module))
+ return (-1);
+ if (strip != tif->tif_curstrip)
+ {
+ /*
+ * Changing strips -- flush any data present.
+ */
+ if (!TIFFFlushData(tif))
+ return (-1);
+ tif->tif_curstrip = strip;
+ /*
+ * Watch out for a growing image. The value of strips/image
+ * will initially be 1 (since it can't be deduced until the
+ * imagelength is known).
+ */
+ if (strip >= td->td_stripsperimage && imagegrew)
+ td->td_stripsperimage =
+ TIFFhowmany_32(td->td_imagelength, td->td_rowsperstrip);
+ if (td->td_stripsperimage == 0)
+ {
+ TIFFErrorExtR(tif, module, "Zero strips per image");
+ return (-1);
+ }
+ tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip;
+ if ((tif->tif_flags & TIFF_CODERSETUP) == 0)
+ {
+ if (!(*tif->tif_setupencode)(tif))
+ return (-1);
+ tif->tif_flags |= TIFF_CODERSETUP;
+ }
+
+ tif->tif_rawcc = 0;
+ tif->tif_rawcp = tif->tif_rawdata;
+
+ /* this informs TIFFAppendToStrip() we have changed strip */
+ tif->tif_curoff = 0;
+
+ if (!(*tif->tif_preencode)(tif, sample))
+ return (-1);
+ tif->tif_flags |= TIFF_POSTENCODE;
+ }
+ /*
+ * Ensure the write is either sequential or at the
+ * beginning of a strip (or that we can randomly
+ * access the data -- i.e. no encoding).
+ */
+ if (row != tif->tif_row)
+ {
+ if (row < tif->tif_row)
+ {
+ /*
+ * Moving backwards within the same strip:
+ * backup to the start and then decode
+ * forward (below).
+ */
+ tif->tif_row =
+ (strip % td->td_stripsperimage) * td->td_rowsperstrip;
+ tif->tif_rawcp = tif->tif_rawdata;
+ }
+ /*
+ * Seek forward to the desired row.
+ */
+ if (!(*tif->tif_seek)(tif, row - tif->tif_row))
+ return (-1);
+ tif->tif_row = row;
+ }
+
+ /* swab if needed - note that source buffer will be altered */
+ tif->tif_postdecode(tif, (uint8_t *)buf, tif->tif_scanlinesize);
+
+ status = (*tif->tif_encoderow)(tif, (uint8_t *)buf, tif->tif_scanlinesize,
+ sample);
+
+ /* we are now poised at the beginning of the next row */
+ tif->tif_row = row + 1;
+ return (status);
}
-/* Make sure that at the first attempt of rewriting a tile/strip, we will have */
+/* Make sure that at the first attempt of rewriting a tile/strip, we will have
+ */
/* more bytes available in the output buffer than the previous byte count, */
-/* so that TIFFAppendToStrip() will detect the overflow when it is called the first */
+/* so that TIFFAppendToStrip() will detect the overflow when it is called the
+ * first */
/* time if the new compressed tile is bigger than the older one. (GDAL #4771) */
-static int _TIFFReserveLargeEnoughWriteBuffer(TIFF* tif, uint32 strip_or_tile)
+static int _TIFFReserveLargeEnoughWriteBuffer(TIFF *tif, uint32_t strip_or_tile)
{
TIFFDirectory *td = &tif->tif_dir;
- if( td->td_stripbytecount_p[strip_or_tile] > 0 )
+ if (td->td_stripbytecount_p[strip_or_tile] > 0)
{
/* The +1 is to ensure at least one extra bytes */
/* The +4 is because the LZW encoder flushes 4 bytes before the limit */
- uint64 safe_buffer_size = (uint64)(td->td_stripbytecount_p[strip_or_tile] + 1 + 4);
- if( tif->tif_rawdatasize <= (tmsize_t)safe_buffer_size )
+ uint64_t safe_buffer_size =
+ (uint64_t)(td->td_stripbytecount_p[strip_or_tile] + 1 + 4);
+ if (tif->tif_rawdatasize <= (tmsize_t)safe_buffer_size)
{
- if( !(TIFFWriteBufferSetup(tif, NULL,
- (tmsize_t)TIFFroundup_64(safe_buffer_size, 1024))) )
+ if (!(TIFFWriteBufferSetup(
+ tif, NULL,
+ (tmsize_t)TIFFroundup_64(safe_buffer_size, 1024))))
return 0;
}
-
- /* Force TIFFAppendToStrip() to consider placing data at end
- of file. */
- tif->tif_curoff = 0;
}
return 1;
}
@@ -208,103 +212,112 @@ static int _TIFFReserveLargeEnoughWriteBuffer(TIFF* tif, uint32 strip_or_tile)
*
* NB: Image length must be setup before writing.
*/
-tmsize_t
-TIFFWriteEncodedStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc)
+tmsize_t TIFFWriteEncodedStrip(TIFF *tif, uint32_t strip, void *data,
+ tmsize_t cc)
{
- static const char module[] = "TIFFWriteEncodedStrip";
- TIFFDirectory *td = &tif->tif_dir;
- uint16 sample;
-
- if (!WRITECHECKSTRIPS(tif, module))
- return ((tmsize_t) -1);
- /*
- * Check strip array to make sure there's space.
- * We don't support dynamically growing files that
- * have data organized in separate bitplanes because
- * it's too painful. In that case we require that
- * the imagelength be set properly before the first
- * write (so that the strips array will be fully
- * allocated above).
- */
- if (strip >= td->td_nstrips) {
- if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Can not grow image by strips when using separate planes");
- return ((tmsize_t) -1);
- }
- if (!TIFFGrowStrips(tif, 1, module))
- return ((tmsize_t) -1);
- td->td_stripsperimage =
- TIFFhowmany_32(td->td_imagelength, td->td_rowsperstrip);
- }
- /*
- * Handle delayed allocation of data buffer. This
- * permits it to be sized according to the directory
- * info.
- */
- if (!BUFFERCHECK(tif))
- return ((tmsize_t) -1);
-
- tif->tif_flags |= TIFF_BUF4WRITE;
- tif->tif_curstrip = strip;
-
- if( !_TIFFReserveLargeEnoughWriteBuffer(tif, strip) ) {
- return ((tmsize_t)(-1));
+ static const char module[] = "TIFFWriteEncodedStrip";
+ TIFFDirectory *td = &tif->tif_dir;
+ uint16_t sample;
+
+ if (!WRITECHECKSTRIPS(tif, module))
+ return ((tmsize_t)-1);
+ /*
+ * Check strip array to make sure there's space.
+ * We don't support dynamically growing files that
+ * have data organized in separate bitplanes because
+ * it's too painful. In that case we require that
+ * the imagelength be set properly before the first
+ * write (so that the strips array will be fully
+ * allocated above).
+ */
+ if (strip >= td->td_nstrips)
+ {
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
+ {
+ TIFFErrorExtR(
+ tif, module,
+ "Can not grow image by strips when using separate planes");
+ return ((tmsize_t)-1);
}
+ if (!TIFFGrowStrips(tif, 1, module))
+ return ((tmsize_t)-1);
+ td->td_stripsperimage =
+ TIFFhowmany_32(td->td_imagelength, td->td_rowsperstrip);
+ }
+ /*
+ * Handle delayed allocation of data buffer. This
+ * permits it to be sized according to the directory
+ * info.
+ */
+ if (!BUFFERCHECK(tif))
+ return ((tmsize_t)-1);
- tif->tif_rawcc = 0;
- tif->tif_rawcp = tif->tif_rawdata;
+ tif->tif_flags |= TIFF_BUF4WRITE;
- if (td->td_stripsperimage == 0) {
- TIFFErrorExt(tif->tif_clientdata, module, "Zero strips per image");
- return ((tmsize_t) -1);
- }
+ tif->tif_curstrip = strip;
+
+ /* this informs TIFFAppendToStrip() we have changed or reset strip */
+ tif->tif_curoff = 0;
+
+ if (!_TIFFReserveLargeEnoughWriteBuffer(tif, strip))
+ {
+ return ((tmsize_t)(-1));
+ }
+
+ tif->tif_rawcc = 0;
+ tif->tif_rawcp = tif->tif_rawdata;
+
+ if (td->td_stripsperimage == 0)
+ {
+ TIFFErrorExtR(tif, module, "Zero strips per image");
+ return ((tmsize_t)-1);
+ }
- tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip;
- if ((tif->tif_flags & TIFF_CODERSETUP) == 0) {
- if (!(*tif->tif_setupencode)(tif))
- return ((tmsize_t) -1);
- tif->tif_flags |= TIFF_CODERSETUP;
- }
+ tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip;
+ if ((tif->tif_flags & TIFF_CODERSETUP) == 0)
+ {
+ if (!(*tif->tif_setupencode)(tif))
+ return ((tmsize_t)-1);
+ tif->tif_flags |= TIFF_CODERSETUP;
+ }
- tif->tif_flags &= ~TIFF_POSTENCODE;
+ tif->tif_flags &= ~TIFF_POSTENCODE;
/* shortcut to avoid an extra memcpy() */
- if( td->td_compression == COMPRESSION_NONE )
+ if (td->td_compression == COMPRESSION_NONE)
{
/* swab if needed - note that source buffer will be altered */
- tif->tif_postdecode( tif, (uint8*) data, cc );
+ tif->tif_postdecode(tif, (uint8_t *)data, cc);
if (!isFillOrder(tif, td->td_fillorder) &&
(tif->tif_flags & TIFF_NOBITREV) == 0)
- TIFFReverseBits((uint8*) data, cc);
+ TIFFReverseBits((uint8_t *)data, cc);
- if (cc > 0 &&
- !TIFFAppendToStrip(tif, strip, (uint8*) data, cc))
- return ((tmsize_t) -1);
+ if (cc > 0 && !TIFFAppendToStrip(tif, strip, (uint8_t *)data, cc))
+ return ((tmsize_t)-1);
return (cc);
}
- sample = (uint16)(strip / td->td_stripsperimage);
- if (!(*tif->tif_preencode)(tif, sample))
- return ((tmsize_t) -1);
+ sample = (uint16_t)(strip / td->td_stripsperimage);
+ if (!(*tif->tif_preencode)(tif, sample))
+ return ((tmsize_t)-1);
- /* swab if needed - note that source buffer will be altered */
- tif->tif_postdecode( tif, (uint8*) data, cc );
-
- if (!(*tif->tif_encodestrip)(tif, (uint8*) data, cc, sample))
- return ((tmsize_t) -1);
- if (!(*tif->tif_postencode)(tif))
- return ((tmsize_t) -1);
- if (!isFillOrder(tif, td->td_fillorder) &&
- (tif->tif_flags & TIFF_NOBITREV) == 0)
- TIFFReverseBits(tif->tif_rawdata, tif->tif_rawcc);
- if (tif->tif_rawcc > 0 &&
- !TIFFAppendToStrip(tif, strip, tif->tif_rawdata, tif->tif_rawcc))
- return ((tmsize_t) -1);
- tif->tif_rawcc = 0;
- tif->tif_rawcp = tif->tif_rawdata;
- return (cc);
+ /* swab if needed - note that source buffer will be altered */
+ tif->tif_postdecode(tif, (uint8_t *)data, cc);
+
+ if (!(*tif->tif_encodestrip)(tif, (uint8_t *)data, cc, sample))
+ return ((tmsize_t)-1);
+ if (!(*tif->tif_postencode)(tif))
+ return ((tmsize_t)-1);
+ if (!isFillOrder(tif, td->td_fillorder) &&
+ (tif->tif_flags & TIFF_NOBITREV) == 0)
+ TIFFReverseBits(tif->tif_rawdata, tif->tif_rawcc);
+ if (tif->tif_rawcc > 0 &&
+ !TIFFAppendToStrip(tif, strip, tif->tif_rawdata, tif->tif_rawcc))
+ return ((tmsize_t)-1);
+ tif->tif_rawcc = 0;
+ tif->tif_rawcp = tif->tif_rawdata;
+ return (cc);
}
/*
@@ -312,67 +325,78 @@ TIFFWriteEncodedStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc)
*
* NB: Image length must be setup before writing.
*/
-tmsize_t
-TIFFWriteRawStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc)
+tmsize_t TIFFWriteRawStrip(TIFF *tif, uint32_t strip, void *data, tmsize_t cc)
{
- static const char module[] = "TIFFWriteRawStrip";
- TIFFDirectory *td = &tif->tif_dir;
-
- if (!WRITECHECKSTRIPS(tif, module))
- return ((tmsize_t) -1);
- /*
- * Check strip array to make sure there's space.
- * We don't support dynamically growing files that
- * have data organized in separate bitplanes because
- * it's too painful. In that case we require that
- * the imagelength be set properly before the first
- * write (so that the strips array will be fully
- * allocated above).
- */
- if (strip >= td->td_nstrips) {
- if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Can not grow image by strips when using separate planes");
- return ((tmsize_t) -1);
- }
- /*
- * Watch out for a growing image. The value of
- * strips/image will initially be 1 (since it
- * can't be deduced until the imagelength is known).
- */
- if (strip >= td->td_stripsperimage)
- td->td_stripsperimage =
- TIFFhowmany_32(td->td_imagelength,td->td_rowsperstrip);
- if (!TIFFGrowStrips(tif, 1, module))
- return ((tmsize_t) -1);
- }
- tif->tif_curstrip = strip;
- if (td->td_stripsperimage == 0) {
- TIFFErrorExt(tif->tif_clientdata, module,"Zero strips per image");
- return ((tmsize_t) -1);
+ static const char module[] = "TIFFWriteRawStrip";
+ TIFFDirectory *td = &tif->tif_dir;
+
+ if (!WRITECHECKSTRIPS(tif, module))
+ return ((tmsize_t)-1);
+ /*
+ * Check strip array to make sure there's space.
+ * We don't support dynamically growing files that
+ * have data organized in separate bitplanes because
+ * it's too painful. In that case we require that
+ * the imagelength be set properly before the first
+ * write (so that the strips array will be fully
+ * allocated above).
+ */
+ if (strip >= td->td_nstrips)
+ {
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
+ {
+ TIFFErrorExtR(
+ tif, module,
+ "Can not grow image by strips when using separate planes");
+ return ((tmsize_t)-1);
}
- tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip;
- return (TIFFAppendToStrip(tif, strip, (uint8*) data, cc) ?
- cc : (tmsize_t) -1);
+ /*
+ * Watch out for a growing image. The value of
+ * strips/image will initially be 1 (since it
+ * can't be deduced until the imagelength is known).
+ */
+ if (strip >= td->td_stripsperimage)
+ td->td_stripsperimage =
+ TIFFhowmany_32(td->td_imagelength, td->td_rowsperstrip);
+ if (!TIFFGrowStrips(tif, 1, module))
+ return ((tmsize_t)-1);
+ }
+
+ if (tif->tif_curstrip != strip)
+ {
+ tif->tif_curstrip = strip;
+
+ /* this informs TIFFAppendToStrip() we have changed or reset strip */
+ tif->tif_curoff = 0;
+ }
+
+ if (td->td_stripsperimage == 0)
+ {
+ TIFFErrorExtR(tif, module, "Zero strips per image");
+ return ((tmsize_t)-1);
+ }
+ tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip;
+ return (TIFFAppendToStrip(tif, strip, (uint8_t *)data, cc) ? cc
+ : (tmsize_t)-1);
}
/*
* Write and compress a tile of data. The
* tile is selected by the (x,y,z,s) coordinates.
*/
-tmsize_t
-TIFFWriteTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s)
+tmsize_t TIFFWriteTile(TIFF *tif, void *buf, uint32_t x, uint32_t y, uint32_t z,
+ uint16_t s)
{
- if (!TIFFCheckTile(tif, x, y, z, s))
- return ((tmsize_t)(-1));
- /*
- * NB: A tile size of -1 is used instead of tif_tilesize knowing
- * that TIFFWriteEncodedTile will clamp this to the tile size.
- * This is done because the tile size may not be defined until
- * after the output buffer is setup in TIFFWriteBufferSetup.
- */
- return (TIFFWriteEncodedTile(tif,
- TIFFComputeTile(tif, x, y, z, s), buf, (tmsize_t)(-1)));
+ if (!TIFFCheckTile(tif, x, y, z, s))
+ return ((tmsize_t)(-1));
+ /*
+ * NB: A tile size of -1 is used instead of tif_tilesize knowing
+ * that TIFFWriteEncodedTile will clamp this to the tile size.
+ * This is done because the tile size may not be defined until
+ * after the output buffer is setup in TIFFWriteBufferSetup.
+ */
+ return (TIFFWriteEncodedTile(tif, TIFFComputeTile(tif, x, y, z, s), buf,
+ (tmsize_t)(-1)));
}
/*
@@ -387,104 +411,111 @@ TIFFWriteTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s)
* interface does not support automatically growing
* the image on each write (as TIFFWriteScanline does).
*/
-tmsize_t
-TIFFWriteEncodedTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc)
+tmsize_t TIFFWriteEncodedTile(TIFF *tif, uint32_t tile, void *data, tmsize_t cc)
{
- static const char module[] = "TIFFWriteEncodedTile";
- TIFFDirectory *td;
- uint16 sample;
- uint32 howmany32;
-
- if (!WRITECHECKTILES(tif, module))
- return ((tmsize_t)(-1));
- td = &tif->tif_dir;
- if (tile >= td->td_nstrips) {
- TIFFErrorExt(tif->tif_clientdata, module, "Tile %lu out of range, max %lu",
- (unsigned long) tile, (unsigned long) td->td_nstrips);
- return ((tmsize_t)(-1));
- }
- /*
- * Handle delayed allocation of data buffer. This
- * permits it to be sized more intelligently (using
- * directory information).
- */
- if (!BUFFERCHECK(tif))
- return ((tmsize_t)(-1));
-
- tif->tif_flags |= TIFF_BUF4WRITE;
- tif->tif_curtile = tile;
-
- if( !_TIFFReserveLargeEnoughWriteBuffer(tif, tile) ) {
+ static const char module[] = "TIFFWriteEncodedTile";
+ TIFFDirectory *td;
+ uint16_t sample;
+ uint32_t howmany32;
+
+ if (!WRITECHECKTILES(tif, module))
+ return ((tmsize_t)(-1));
+ td = &tif->tif_dir;
+ if (tile >= td->td_nstrips)
+ {
+ TIFFErrorExtR(tif, module, "Tile %lu out of range, max %lu",
+ (unsigned long)tile, (unsigned long)td->td_nstrips);
+ return ((tmsize_t)(-1));
+ }
+ /*
+ * Handle delayed allocation of data buffer. This
+ * permits it to be sized more intelligently (using
+ * directory information).
+ */
+ if (!BUFFERCHECK(tif))
+ return ((tmsize_t)(-1));
+
+ tif->tif_flags |= TIFF_BUF4WRITE;
+
+ tif->tif_curtile = tile;
+
+ /* this informs TIFFAppendToStrip() we have changed or reset tile */
+ tif->tif_curoff = 0;
+
+ if (!_TIFFReserveLargeEnoughWriteBuffer(tif, tile))
+ {
+ return ((tmsize_t)(-1));
+ }
+
+ tif->tif_rawcc = 0;
+ tif->tif_rawcp = tif->tif_rawdata;
+
+ /*
+ * Compute tiles per row & per column to compute
+ * current row and column
+ */
+ howmany32 = TIFFhowmany_32(td->td_imagelength, td->td_tilelength);
+ if (howmany32 == 0)
+ {
+ TIFFErrorExtR(tif, module, "Zero tiles");
+ return ((tmsize_t)(-1));
+ }
+ tif->tif_row = (tile % howmany32) * td->td_tilelength;
+ howmany32 = TIFFhowmany_32(td->td_imagewidth, td->td_tilewidth);
+ if (howmany32 == 0)
+ {
+ TIFFErrorExtR(tif, module, "Zero tiles");
+ return ((tmsize_t)(-1));
+ }
+ tif->tif_col = (tile % howmany32) * td->td_tilewidth;
+
+ if ((tif->tif_flags & TIFF_CODERSETUP) == 0)
+ {
+ if (!(*tif->tif_setupencode)(tif))
return ((tmsize_t)(-1));
- }
+ tif->tif_flags |= TIFF_CODERSETUP;
+ }
+ tif->tif_flags &= ~TIFF_POSTENCODE;
- tif->tif_rawcc = 0;
- tif->tif_rawcp = tif->tif_rawdata;
-
- /*
- * Compute tiles per row & per column to compute
- * current row and column
- */
- howmany32=TIFFhowmany_32(td->td_imagelength, td->td_tilelength);
- if (howmany32 == 0) {
- TIFFErrorExt(tif->tif_clientdata,module,"Zero tiles");
- return ((tmsize_t)(-1));
- }
- tif->tif_row = (tile % howmany32) * td->td_tilelength;
- howmany32=TIFFhowmany_32(td->td_imagewidth, td->td_tilewidth);
- if (howmany32 == 0) {
- TIFFErrorExt(tif->tif_clientdata,module,"Zero tiles");
- return ((tmsize_t)(-1));
- }
- tif->tif_col = (tile % howmany32) * td->td_tilewidth;
-
- if ((tif->tif_flags & TIFF_CODERSETUP) == 0) {
- if (!(*tif->tif_setupencode)(tif))
- return ((tmsize_t)(-1));
- tif->tif_flags |= TIFF_CODERSETUP;
- }
- tif->tif_flags &= ~TIFF_POSTENCODE;
-
- /*
- * Clamp write amount to the tile size. This is mostly
- * done so that callers can pass in some large number
- * (e.g. -1) and have the tile size used instead.
- */
- if ( cc < 1 || cc > tif->tif_tilesize)
- cc = tif->tif_tilesize;
+ /*
+ * Clamp write amount to the tile size. This is mostly
+ * done so that callers can pass in some large number
+ * (e.g. -1) and have the tile size used instead.
+ */
+ if (cc < 1 || cc > tif->tif_tilesize)
+ cc = tif->tif_tilesize;
/* shortcut to avoid an extra memcpy() */
- if( td->td_compression == COMPRESSION_NONE )
+ if (td->td_compression == COMPRESSION_NONE)
{
/* swab if needed - note that source buffer will be altered */
- tif->tif_postdecode( tif, (uint8*) data, cc );
+ tif->tif_postdecode(tif, (uint8_t *)data, cc);
if (!isFillOrder(tif, td->td_fillorder) &&
(tif->tif_flags & TIFF_NOBITREV) == 0)
- TIFFReverseBits((uint8*) data, cc);
+ TIFFReverseBits((uint8_t *)data, cc);
- if (cc > 0 &&
- !TIFFAppendToStrip(tif, tile, (uint8*) data, cc))
- return ((tmsize_t) -1);
+ if (cc > 0 && !TIFFAppendToStrip(tif, tile, (uint8_t *)data, cc))
+ return ((tmsize_t)-1);
return (cc);
}
- sample = (uint16)(tile/td->td_stripsperimage);
+ sample = (uint16_t)(tile / td->td_stripsperimage);
if (!(*tif->tif_preencode)(tif, sample))
return ((tmsize_t)(-1));
/* swab if needed - note that source buffer will be altered */
- tif->tif_postdecode( tif, (uint8*) data, cc );
+ tif->tif_postdecode(tif, (uint8_t *)data, cc);
- if (!(*tif->tif_encodetile)(tif, (uint8*) data, cc, sample))
- return ((tmsize_t) -1);
+ if (!(*tif->tif_encodetile)(tif, (uint8_t *)data, cc, sample))
+ return ((tmsize_t)-1);
if (!(*tif->tif_postencode)(tif))
- return ((tmsize_t)(-1));
+ return ((tmsize_t)(-1));
if (!isFillOrder(tif, td->td_fillorder) &&
(tif->tif_flags & TIFF_NOBITREV) == 0)
- TIFFReverseBits((uint8*)tif->tif_rawdata, tif->tif_rawcc);
- if (tif->tif_rawcc > 0 && !TIFFAppendToStrip(tif, tile,
- tif->tif_rawdata, tif->tif_rawcc))
- return ((tmsize_t)(-1));
+ TIFFReverseBits((uint8_t *)tif->tif_rawdata, tif->tif_rawcc);
+ if (tif->tif_rawcc > 0 &&
+ !TIFFAppendToStrip(tif, tile, tif->tif_rawdata, tif->tif_rawcc))
+ return ((tmsize_t)(-1));
tif->tif_rawcc = 0;
tif->tif_rawcp = tif->tif_rawdata;
return (cc);
@@ -499,59 +530,64 @@ TIFFWriteEncodedTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc)
* interface does not support automatically growing
* the image on each write (as TIFFWriteScanline does).
*/
-tmsize_t
-TIFFWriteRawTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc)
+tmsize_t TIFFWriteRawTile(TIFF *tif, uint32_t tile, void *data, tmsize_t cc)
{
- static const char module[] = "TIFFWriteRawTile";
-
- if (!WRITECHECKTILES(tif, module))
- return ((tmsize_t)(-1));
- if (tile >= tif->tif_dir.td_nstrips) {
- TIFFErrorExt(tif->tif_clientdata, module, "Tile %lu out of range, max %lu",
- (unsigned long) tile,
- (unsigned long) tif->tif_dir.td_nstrips);
- return ((tmsize_t)(-1));
- }
- return (TIFFAppendToStrip(tif, tile, (uint8*) data, cc) ?
- cc : (tmsize_t)(-1));
+ static const char module[] = "TIFFWriteRawTile";
+
+ if (!WRITECHECKTILES(tif, module))
+ return ((tmsize_t)(-1));
+ if (tile >= tif->tif_dir.td_nstrips)
+ {
+ TIFFErrorExtR(tif, module, "Tile %lu out of range, max %lu",
+ (unsigned long)tile,
+ (unsigned long)tif->tif_dir.td_nstrips);
+ return ((tmsize_t)(-1));
+ }
+ return (TIFFAppendToStrip(tif, tile, (uint8_t *)data, cc) ? cc
+ : (tmsize_t)(-1));
}
-#define isUnspecified(tif, f) \
- (TIFFFieldSet(tif,f) && (tif)->tif_dir.td_imagelength == 0)
+#define isUnspecified(tif, f) \
+ (TIFFFieldSet(tif, f) && (tif)->tif_dir.td_imagelength == 0)
-int
-TIFFSetupStrips(TIFF* tif)
+int TIFFSetupStrips(TIFF *tif)
{
- TIFFDirectory* td = &tif->tif_dir;
-
- if (isTiled(tif))
- td->td_stripsperimage =
- isUnspecified(tif, FIELD_TILEDIMENSIONS) ?
- td->td_samplesperpixel : TIFFNumberOfTiles(tif);
- else
- td->td_stripsperimage =
- isUnspecified(tif, FIELD_ROWSPERSTRIP) ?
- td->td_samplesperpixel : TIFFNumberOfStrips(tif);
- td->td_nstrips = td->td_stripsperimage;
- if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
- td->td_stripsperimage /= td->td_samplesperpixel;
- td->td_stripoffset_p = (uint64 *)
- _TIFFCheckMalloc(tif, td->td_nstrips, sizeof (uint64),
- "for \"StripOffsets\" array");
- td->td_stripbytecount_p = (uint64 *)
- _TIFFCheckMalloc(tif, td->td_nstrips, sizeof (uint64),
- "for \"StripByteCounts\" array");
- if (td->td_stripoffset_p == NULL || td->td_stripbytecount_p == NULL)
- return (0);
- /*
- * Place data at the end-of-file
- * (by setting offsets to zero).
- */
- _TIFFmemset(td->td_stripoffset_p, 0, td->td_nstrips*sizeof (uint64));
- _TIFFmemset(td->td_stripbytecount_p, 0, td->td_nstrips*sizeof (uint64));
- TIFFSetFieldBit(tif, FIELD_STRIPOFFSETS);
- TIFFSetFieldBit(tif, FIELD_STRIPBYTECOUNTS);
- return (1);
+ TIFFDirectory *td = &tif->tif_dir;
+
+ if (isTiled(tif))
+ td->td_stripsperimage = isUnspecified(tif, FIELD_TILEDIMENSIONS)
+ ? td->td_samplesperpixel
+ : TIFFNumberOfTiles(tif);
+ else
+ td->td_stripsperimage = isUnspecified(tif, FIELD_ROWSPERSTRIP)
+ ? td->td_samplesperpixel
+ : TIFFNumberOfStrips(tif);
+ td->td_nstrips = td->td_stripsperimage;
+ /* TIFFWriteDirectoryTagData has a limitation to 0x80000000U bytes */
+ if (td->td_nstrips >=
+ 0x80000000U / ((tif->tif_flags & TIFF_BIGTIFF) ? 0x8U : 0x4U))
+ {
+ TIFFErrorExtR(tif, "TIFFSetupStrips",
+ "Too large Strip/Tile Offsets/ByteCounts arrays");
+ return 0;
+ }
+ if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
+ td->td_stripsperimage /= td->td_samplesperpixel;
+ td->td_stripoffset_p = (uint64_t *)_TIFFCheckMalloc(
+ tif, td->td_nstrips, sizeof(uint64_t), "for \"StripOffsets\" array");
+ td->td_stripbytecount_p = (uint64_t *)_TIFFCheckMalloc(
+ tif, td->td_nstrips, sizeof(uint64_t), "for \"StripByteCounts\" array");
+ if (td->td_stripoffset_p == NULL || td->td_stripbytecount_p == NULL)
+ return (0);
+ /*
+ * Place data at the end-of-file
+ * (by setting offsets to zero).
+ */
+ _TIFFmemset(td->td_stripoffset_p, 0, td->td_nstrips * sizeof(uint64_t));
+ _TIFFmemset(td->td_stripbytecount_p, 0, td->td_nstrips * sizeof(uint64_t));
+ TIFFSetFieldBit(tif, FIELD_STRIPOFFSETS);
+ TIFFSetFieldBit(tif, FIELD_STRIPBYTECOUNTS);
+ return (1);
}
#undef isUnspecified
@@ -561,237 +597,325 @@ TIFFSetupStrips(TIFF* tif)
* we also "freeze" the state of the directory so
* that important information is not changed.
*/
-int
-TIFFWriteCheck(TIFF* tif, int tiles, const char* module)
+int TIFFWriteCheck(TIFF *tif, int tiles, const char *module)
{
- if (tif->tif_mode == O_RDONLY) {
- TIFFErrorExt(tif->tif_clientdata, module, "File not open for writing");
- return (0);
- }
- if (tiles ^ isTiled(tif)) {
- TIFFErrorExt(tif->tif_clientdata, module, tiles ?
- "Can not write tiles to a striped image" :
- "Can not write scanlines to a tiled image");
- return (0);
- }
-
- _TIFFFillStriles( tif );
-
- /*
- * On the first write verify all the required information
- * has been setup and initialize any data structures that
- * had to wait until directory information was set.
- * Note that a lot of our work is assumed to remain valid
- * because we disallow any of the important parameters
- * from changing after we start writing (i.e. once
- * TIFF_BEENWRITING is set, TIFFSetField will only allow
- * the image's length to be changed).
- */
- if (!TIFFFieldSet(tif, FIELD_IMAGEDIMENSIONS)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Must set \"ImageWidth\" before writing data");
- return (0);
- }
- if (tif->tif_dir.td_samplesperpixel == 1) {
- /*
- * Planarconfiguration is irrelevant in case of single band
- * images and need not be included. We will set it anyway,
- * because this field is used in other parts of library even
- * in the single band case.
- */
- if (!TIFFFieldSet(tif, FIELD_PLANARCONFIG))
- tif->tif_dir.td_planarconfig = PLANARCONFIG_CONTIG;
- } else {
- if (!TIFFFieldSet(tif, FIELD_PLANARCONFIG)) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Must set \"PlanarConfiguration\" before writing data");
- return (0);
- }
- }
- if (tif->tif_dir.td_stripoffset_p == NULL && !TIFFSetupStrips(tif)) {
- tif->tif_dir.td_nstrips = 0;
- TIFFErrorExt(tif->tif_clientdata, module, "No space for %s arrays",
- isTiled(tif) ? "tile" : "strip");
- return (0);
- }
- if (isTiled(tif))
- {
- tif->tif_tilesize = TIFFTileSize(tif);
- if (tif->tif_tilesize == 0)
- return (0);
- }
- else
- tif->tif_tilesize = (tmsize_t)(-1);
- tif->tif_scanlinesize = TIFFScanlineSize(tif);
- if (tif->tif_scanlinesize == 0)
- return (0);
- tif->tif_flags |= TIFF_BEENWRITING;
-
- if( tif->tif_dir.td_stripoffset_entry.tdir_tag != 0 &&
- tif->tif_dir.td_stripoffset_entry.tdir_count == 0 &&
- tif->tif_dir.td_stripoffset_entry.tdir_type == 0 &&
- tif->tif_dir.td_stripoffset_entry.tdir_offset.toff_long8 == 0 &&
- tif->tif_dir.td_stripbytecount_entry.tdir_tag != 0 &&
- tif->tif_dir.td_stripbytecount_entry.tdir_count == 0 &&
- tif->tif_dir.td_stripbytecount_entry.tdir_type == 0 &&
- tif->tif_dir.td_stripbytecount_entry.tdir_offset.toff_long8 == 0 &&
- !(tif->tif_flags & TIFF_DIRTYDIRECT) )
- {
- TIFFForceStrileArrayWriting(tif);
- }
+ if (tif->tif_mode == O_RDONLY)
+ {
+ TIFFErrorExtR(tif, module, "File not open for writing");
+ return (0);
+ }
+ if (tiles ^ isTiled(tif))
+ {
+ TIFFErrorExtR(tif, module,
+ tiles ? "Can not write tiles to a striped image"
+ : "Can not write scanlines to a tiled image");
+ return (0);
+ }
- return (1);
+ _TIFFFillStriles(tif);
+
+ /*
+ * On the first write verify all the required information
+ * has been setup and initialize any data structures that
+ * had to wait until directory information was set.
+ * Note that a lot of our work is assumed to remain valid
+ * because we disallow any of the important parameters
+ * from changing after we start writing (i.e. once
+ * TIFF_BEENWRITING is set, TIFFSetField will only allow
+ * the image's length to be changed).
+ */
+ if (!TIFFFieldSet(tif, FIELD_IMAGEDIMENSIONS))
+ {
+ TIFFErrorExtR(tif, module,
+ "Must set \"ImageWidth\" before writing data");
+ return (0);
+ }
+ if (tif->tif_dir.td_stripoffset_p == NULL && !TIFFSetupStrips(tif))
+ {
+ tif->tif_dir.td_nstrips = 0;
+ TIFFErrorExtR(tif, module, "No space for %s arrays",
+ isTiled(tif) ? "tile" : "strip");
+ return (0);
+ }
+ if (isTiled(tif))
+ {
+ tif->tif_tilesize = TIFFTileSize(tif);
+ if (tif->tif_tilesize == 0)
+ return (0);
+ }
+ else
+ tif->tif_tilesize = (tmsize_t)(-1);
+ tif->tif_scanlinesize = TIFFScanlineSize(tif);
+ if (tif->tif_scanlinesize == 0)
+ return (0);
+ tif->tif_flags |= TIFF_BEENWRITING;
+
+ if (tif->tif_dir.td_stripoffset_entry.tdir_tag != 0 &&
+ tif->tif_dir.td_stripoffset_entry.tdir_count == 0 &&
+ tif->tif_dir.td_stripoffset_entry.tdir_type == 0 &&
+ tif->tif_dir.td_stripoffset_entry.tdir_offset.toff_long8 == 0 &&
+ tif->tif_dir.td_stripbytecount_entry.tdir_tag != 0 &&
+ tif->tif_dir.td_stripbytecount_entry.tdir_count == 0 &&
+ tif->tif_dir.td_stripbytecount_entry.tdir_type == 0 &&
+ tif->tif_dir.td_stripbytecount_entry.tdir_offset.toff_long8 == 0 &&
+ !(tif->tif_flags & TIFF_DIRTYDIRECT))
+ {
+ TIFFForceStrileArrayWriting(tif);
+ }
+
+ return (1);
}
/*
* Setup the raw data buffer used for encoding.
*/
-int
-TIFFWriteBufferSetup(TIFF* tif, void* bp, tmsize_t size)
+int TIFFWriteBufferSetup(TIFF *tif, void *bp, tmsize_t size)
{
- static const char module[] = "TIFFWriteBufferSetup";
-
- if (tif->tif_rawdata) {
- if (tif->tif_flags & TIFF_MYBUFFER) {
- _TIFFfree(tif->tif_rawdata);
- tif->tif_flags &= ~TIFF_MYBUFFER;
- }
- tif->tif_rawdata = NULL;
- }
- if (size == (tmsize_t)(-1)) {
- size = (isTiled(tif) ?
- tif->tif_tilesize : TIFFStripSize(tif));
- /*
- * Make raw data buffer at least 8K
- */
- if (size < 8*1024)
- size = 8*1024;
- bp = NULL; /* NB: force malloc */
- }
- if (bp == NULL) {
- bp = _TIFFmalloc(size);
- if (bp == NULL) {
- TIFFErrorExt(tif->tif_clientdata, module, "No space for output buffer");
- return (0);
- }
- tif->tif_flags |= TIFF_MYBUFFER;
- } else
- tif->tif_flags &= ~TIFF_MYBUFFER;
- tif->tif_rawdata = (uint8*) bp;
- tif->tif_rawdatasize = size;
- tif->tif_rawcc = 0;
- tif->tif_rawcp = tif->tif_rawdata;
- tif->tif_flags |= TIFF_BUFFERSETUP;
- return (1);
+ static const char module[] = "TIFFWriteBufferSetup";
+
+ if (tif->tif_rawdata)
+ {
+ if (tif->tif_flags & TIFF_MYBUFFER)
+ {
+ _TIFFfreeExt(tif, tif->tif_rawdata);
+ tif->tif_flags &= ~TIFF_MYBUFFER;
+ }
+ tif->tif_rawdata = NULL;
+ }
+ if (size == (tmsize_t)(-1))
+ {
+ size = (isTiled(tif) ? tif->tif_tilesize : TIFFStripSize(tif));
+
+ /* Adds 10% margin for cases where compression would expand a bit */
+ if (size < TIFF_TMSIZE_T_MAX - size / 10)
+ size += size / 10;
+ /*
+ * Make raw data buffer at least 8K
+ */
+ if (size < 8 * 1024)
+ size = 8 * 1024;
+ bp = NULL; /* NB: force malloc */
+ }
+ if (bp == NULL)
+ {
+ bp = _TIFFmallocExt(tif, size);
+ if (bp == NULL)
+ {
+ TIFFErrorExtR(tif, module, "No space for output buffer");
+ return (0);
+ }
+ tif->tif_flags |= TIFF_MYBUFFER;
+ }
+ else
+ tif->tif_flags &= ~TIFF_MYBUFFER;
+ tif->tif_rawdata = (uint8_t *)bp;
+ tif->tif_rawdatasize = size;
+ tif->tif_rawcc = 0;
+ tif->tif_rawcp = tif->tif_rawdata;
+ tif->tif_flags |= TIFF_BUFFERSETUP;
+ return (1);
}
/*
* Grow the strip data structures by delta strips.
*/
-static int
-TIFFGrowStrips(TIFF* tif, uint32 delta, const char* module)
+static int TIFFGrowStrips(TIFF *tif, uint32_t delta, const char *module)
{
- TIFFDirectory *td = &tif->tif_dir;
- uint64* new_stripoffset;
- uint64* new_stripbytecount;
-
- assert(td->td_planarconfig == PLANARCONFIG_CONTIG);
- new_stripoffset = (uint64*)_TIFFrealloc(td->td_stripoffset_p,
- (td->td_nstrips + delta) * sizeof (uint64));
- new_stripbytecount = (uint64*)_TIFFrealloc(td->td_stripbytecount_p,
- (td->td_nstrips + delta) * sizeof (uint64));
- if (new_stripoffset == NULL || new_stripbytecount == NULL) {
- if (new_stripoffset)
- _TIFFfree(new_stripoffset);
- if (new_stripbytecount)
- _TIFFfree(new_stripbytecount);
- td->td_nstrips = 0;
- TIFFErrorExt(tif->tif_clientdata, module, "No space to expand strip arrays");
- return (0);
- }
- td->td_stripoffset_p = new_stripoffset;
- td->td_stripbytecount_p = new_stripbytecount;
- _TIFFmemset(td->td_stripoffset_p + td->td_nstrips,
- 0, delta*sizeof (uint64));
- _TIFFmemset(td->td_stripbytecount_p + td->td_nstrips,
- 0, delta*sizeof (uint64));
- td->td_nstrips += delta;
- tif->tif_flags |= TIFF_DIRTYDIRECT;
-
- return (1);
+ TIFFDirectory *td = &tif->tif_dir;
+ uint64_t *new_stripoffset;
+ uint64_t *new_stripbytecount;
+
+ assert(td->td_planarconfig == PLANARCONFIG_CONTIG);
+ new_stripoffset = (uint64_t *)_TIFFreallocExt(
+ tif, td->td_stripoffset_p, (td->td_nstrips + delta) * sizeof(uint64_t));
+ new_stripbytecount = (uint64_t *)_TIFFreallocExt(
+ tif, td->td_stripbytecount_p,
+ (td->td_nstrips + delta) * sizeof(uint64_t));
+ if (new_stripoffset == NULL || new_stripbytecount == NULL)
+ {
+ if (new_stripoffset)
+ _TIFFfreeExt(tif, new_stripoffset);
+ if (new_stripbytecount)
+ _TIFFfreeExt(tif, new_stripbytecount);
+ td->td_nstrips = 0;
+ TIFFErrorExtR(tif, module, "No space to expand strip arrays");
+ return (0);
+ }
+ td->td_stripoffset_p = new_stripoffset;
+ td->td_stripbytecount_p = new_stripbytecount;
+ _TIFFmemset(td->td_stripoffset_p + td->td_nstrips, 0,
+ delta * sizeof(uint64_t));
+ _TIFFmemset(td->td_stripbytecount_p + td->td_nstrips, 0,
+ delta * sizeof(uint64_t));
+ td->td_nstrips += delta;
+ tif->tif_flags |= TIFF_DIRTYDIRECT;
+
+ return (1);
}
/*
* Append the data to the specified strip.
*/
-static int
-TIFFAppendToStrip(TIFF* tif, uint32 strip, uint8* data, tmsize_t cc)
+static int TIFFAppendToStrip(TIFF *tif, uint32_t strip, uint8_t *data,
+ tmsize_t cc)
{
- static const char module[] = "TIFFAppendToStrip";
- TIFFDirectory *td = &tif->tif_dir;
- uint64 m;
- int64 old_byte_count = -1;
+ static const char module[] = "TIFFAppendToStrip";
+ TIFFDirectory *td = &tif->tif_dir;
+ uint64_t m;
+ int64_t old_byte_count = -1;
- if (td->td_stripoffset_p[strip] == 0 || tif->tif_curoff == 0) {
- assert(td->td_nstrips > 0);
+ if (tif->tif_curoff == 0)
+ tif->tif_lastvalidoff = 0;
- if( td->td_stripbytecount_p[strip] != 0
- && td->td_stripoffset_p[strip] != 0
- && td->td_stripbytecount_p[strip] >= (uint64) cc )
- {
- /*
- * There is already tile data on disk, and the new tile
- * data we have will fit in the same space. The only
- * aspect of this that is risky is that there could be
- * more data to append to this strip before we are done
- * depending on how we are getting called.
- */
- if (!SeekOK(tif, td->td_stripoffset_p[strip])) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Seek error at scanline %lu",
- (unsigned long)tif->tif_row);
- return (0);
- }
- }
- else
+ if (td->td_stripoffset_p[strip] == 0 || tif->tif_curoff == 0)
+ {
+ assert(td->td_nstrips > 0);
+
+ if (td->td_stripbytecount_p[strip] != 0 &&
+ td->td_stripoffset_p[strip] != 0 &&
+ td->td_stripbytecount_p[strip] >= (uint64_t)cc)
+ {
+ /*
+ * There is already tile data on disk, and the new tile
+ * data we have will fit in the same space. The only
+ * aspect of this that is risky is that there could be
+ * more data to append to this strip before we are done
+ * depending on how we are getting called.
+ */
+ if (!SeekOK(tif, td->td_stripoffset_p[strip]))
{
- /*
- * Seek to end of file, and set that as our location to
- * write this strip.
- */
- td->td_stripoffset_p[strip] = TIFFSeekFile(tif, 0, SEEK_END);
- tif->tif_flags |= TIFF_DIRTYSTRIP;
+ TIFFErrorExtR(tif, module, "Seek error at scanline %lu",
+ (unsigned long)tif->tif_row);
+ return (0);
}
- tif->tif_curoff = td->td_stripoffset_p[strip];
-
+ tif->tif_lastvalidoff =
+ td->td_stripoffset_p[strip] + td->td_stripbytecount_p[strip];
+ }
+ else
+ {
/*
- * We are starting a fresh strip/tile, so set the size to zero.
+ * Seek to end of file, and set that as our location to
+ * write this strip.
*/
- old_byte_count = td->td_stripbytecount_p[strip];
- td->td_stripbytecount_p[strip] = 0;
- }
-
- m = tif->tif_curoff+cc;
- if (!(tif->tif_flags&TIFF_BIGTIFF))
- m = (uint32)m;
- if ((m<tif->tif_curoff)||(m<(uint64)cc))
- {
- TIFFErrorExt(tif->tif_clientdata, module, "Maximum TIFF file size exceeded");
- return (0);
- }
- if (!WriteOK(tif, data, cc)) {
- TIFFErrorExt(tif->tif_clientdata, module, "Write error at scanline %lu",
- (unsigned long) tif->tif_row);
- return (0);
- }
- tif->tif_curoff = m;
- td->td_stripbytecount_p[strip] += cc;
-
- if( (int64) td->td_stripbytecount_p[strip] != old_byte_count )
+ td->td_stripoffset_p[strip] = TIFFSeekFile(tif, 0, SEEK_END);
tif->tif_flags |= TIFF_DIRTYSTRIP;
-
- return (1);
+ }
+
+ tif->tif_curoff = td->td_stripoffset_p[strip];
+
+ /*
+ * We are starting a fresh strip/tile, so set the size to zero.
+ */
+ old_byte_count = td->td_stripbytecount_p[strip];
+ td->td_stripbytecount_p[strip] = 0;
+ }
+
+ m = tif->tif_curoff + cc;
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ m = (uint32_t)m;
+ if ((m < tif->tif_curoff) || (m < (uint64_t)cc))
+ {
+ TIFFErrorExtR(tif, module, "Maximum TIFF file size exceeded");
+ return (0);
+ }
+
+ if (tif->tif_lastvalidoff != 0 && m > tif->tif_lastvalidoff &&
+ td->td_stripbytecount_p[strip] > 0)
+ {
+ /* Ouch: we have detected that we are rewriting in place a strip/tile */
+ /* with several calls to TIFFAppendToStrip(). The first call was with */
+ /* a size smaller than the previous size of the strip/tile, so we */
+ /* opted to rewrite in place, but a following call causes us to go */
+ /* outsize of the strip/tile area, so we have to finally go for a */
+ /* append-at-end-of-file strategy, and start by moving what we already
+ */
+ /* wrote. */
+ tmsize_t tempSize;
+ void *temp;
+ uint64_t offsetRead;
+ uint64_t offsetWrite;
+ uint64_t toCopy = td->td_stripbytecount_p[strip];
+
+ if (toCopy < 1024 * 1024)
+ tempSize = (tmsize_t)toCopy;
+ else
+ tempSize = 1024 * 1024;
+
+ offsetRead = td->td_stripoffset_p[strip];
+ offsetWrite = TIFFSeekFile(tif, 0, SEEK_END);
+
+ m = offsetWrite + toCopy + cc;
+ if (!(tif->tif_flags & TIFF_BIGTIFF) && m != (uint32_t)m)
+ {
+ TIFFErrorExtR(tif, module, "Maximum TIFF file size exceeded");
+ return (0);
+ }
+
+ temp = _TIFFmallocExt(tif, tempSize);
+ if (temp == NULL)
+ {
+ TIFFErrorExtR(tif, module, "No space for output buffer");
+ return (0);
+ }
+
+ tif->tif_flags |= TIFF_DIRTYSTRIP;
+
+ td->td_stripoffset_p[strip] = offsetWrite;
+ td->td_stripbytecount_p[strip] = 0;
+
+ /* Move data written by previous calls to us at end of file */
+ while (toCopy > 0)
+ {
+ if (!SeekOK(tif, offsetRead))
+ {
+ TIFFErrorExtR(tif, module, "Seek error");
+ _TIFFfreeExt(tif, temp);
+ return (0);
+ }
+ if (!ReadOK(tif, temp, tempSize))
+ {
+ TIFFErrorExtR(tif, module, "Cannot read");
+ _TIFFfreeExt(tif, temp);
+ return (0);
+ }
+ if (!SeekOK(tif, offsetWrite))
+ {
+ TIFFErrorExtR(tif, module, "Seek error");
+ _TIFFfreeExt(tif, temp);
+ return (0);
+ }
+ if (!WriteOK(tif, temp, tempSize))
+ {
+ TIFFErrorExtR(tif, module, "Cannot write");
+ _TIFFfreeExt(tif, temp);
+ return (0);
+ }
+ offsetRead += tempSize;
+ offsetWrite += tempSize;
+ td->td_stripbytecount_p[strip] += tempSize;
+ toCopy -= tempSize;
+ }
+ _TIFFfreeExt(tif, temp);
+
+ /* Append the data of this call */
+ offsetWrite += cc;
+ m = offsetWrite;
+ }
+
+ if (!WriteOK(tif, data, cc))
+ {
+ TIFFErrorExtR(tif, module, "Write error at scanline %lu",
+ (unsigned long)tif->tif_row);
+ return (0);
+ }
+ tif->tif_curoff = m;
+ td->td_stripbytecount_p[strip] += cc;
+
+ if ((int64_t)td->td_stripbytecount_p[strip] != old_byte_count)
+ tif->tif_flags |= TIFF_DIRTYSTRIP;
+
+ return (1);
}
/*
@@ -799,29 +923,28 @@ TIFFAppendToStrip(TIFF* tif, uint32 strip, uint8* data, tmsize_t cc)
* called by ``encodestrip routines'' w/o concern
* for infinite recursion.
*/
-int
-TIFFFlushData1(TIFF* tif)
+int TIFFFlushData1(TIFF *tif)
{
- if (tif->tif_rawcc > 0 && tif->tif_flags & TIFF_BUF4WRITE ) {
- if (!isFillOrder(tif, tif->tif_dir.td_fillorder) &&
- (tif->tif_flags & TIFF_NOBITREV) == 0)
- TIFFReverseBits((uint8*)tif->tif_rawdata,
- tif->tif_rawcc);
- if (!TIFFAppendToStrip(tif,
- isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip,
- tif->tif_rawdata, tif->tif_rawcc))
+ if (tif->tif_rawcc > 0 && tif->tif_flags & TIFF_BUF4WRITE)
+ {
+ if (!isFillOrder(tif, tif->tif_dir.td_fillorder) &&
+ (tif->tif_flags & TIFF_NOBITREV) == 0)
+ TIFFReverseBits((uint8_t *)tif->tif_rawdata, tif->tif_rawcc);
+ if (!TIFFAppendToStrip(
+ tif, isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip,
+ tif->tif_rawdata, tif->tif_rawcc))
{
/* We update those variables even in case of error since there's */
/* code that doesn't really check the return code of this */
/* function */
tif->tif_rawcc = 0;
tif->tif_rawcp = tif->tif_rawdata;
- return (0);
+ return (0);
}
- tif->tif_rawcc = 0;
- tif->tif_rawcp = tif->tif_rawdata;
- }
- return (1);
+ tif->tif_rawcc = 0;
+ tif->tif_rawcp = tif->tif_rawdata;
+ }
+ return (1);
}
/*
@@ -830,17 +953,8 @@ TIFFFlushData1(TIFF* tif)
* (very carefully), or to 0 so that the next write gets
* appended to the end of the file.
*/
-void
-TIFFSetWriteOffset(TIFF* tif, toff_t off)
+void TIFFSetWriteOffset(TIFF *tif, toff_t off)
{
- tif->tif_curoff = off;
+ tif->tif_curoff = off;
+ tif->tif_lastvalidoff = 0;
}
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_zip.c b/src/3rdparty/libtiff/libtiff/tif_zip.c
index c750773..fcf5100 100644
--- a/src/3rdparty/libtiff/libtiff/tif_zip.c
+++ b/src/3rdparty/libtiff/libtiff/tif_zip.c
@@ -2,23 +2,23 @@
* Copyright (c) 1995-1997 Sam Leffler
* Copyright (c) 1995-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
@@ -29,24 +29,22 @@
*
* ZIP (aka Deflate) Compression Support
*
- * This file is simply an interface to the zlib library written by
+ * This file is an interface to the zlib library written by
* Jean-loup Gailly and Mark Adler. You must use version 1.0 or later
- * of the library: this code assumes the 1.0 API and also depends on
- * the ability to write the zlib header multiple times (one per strip)
- * which was not possible with versions prior to 0.95. Note also that
- * older versions of this codec avoided this bug by suppressing the header
- * entirely. This means that files written with the old library cannot
- * be read; they should be converted to a different compression scheme
- * and then reconverted.
+ * of the library.
*
- * The data format used by the zlib library is described in the files
- * zlib-3.1.doc, deflate-1.1.doc and gzip-4.1.doc, available in the
- * directory ftp://ftp.uu.net/pub/archiving/zip/doc. The library was
- * last found at ftp://ftp.uu.net/pub/archiving/zip/zlib/zlib-0.99.tar.gz.
+ * Optionally, libdeflate (https://github.com/ebiggers/libdeflate) may be used
+ * to do the compression and decompression, but only for whole strips and tiles.
+ * For scanline access, zlib will be sued as a fallback.
*/
#include "tif_predict.h"
#include "zlib.h"
+#if LIBDEFLATE_SUPPORT
+#include "libdeflate.h"
+#endif
+#define LIBDEFLATE_MAX_COMPRESSION_LEVEL 12
+
#include <stdio.h>
/*
@@ -59,398 +57,675 @@
#error "Antiquated ZLIB software; you must use version 1.0 or later"
#endif
-#define SAFE_MSG(sp) ((sp)->stream.msg == NULL ? "" : (sp)->stream.msg)
+#define SAFE_MSG(sp) ((sp)->stream.msg == NULL ? "" : (sp)->stream.msg)
/*
* State block for each open TIFF
* file using ZIP compression/decompression.
*/
-typedef struct {
- TIFFPredictorState predict;
- z_stream stream;
- int zipquality; /* compression level */
- int state; /* state flags */
+typedef struct
+{
+ TIFFPredictorState predict;
+ z_stream stream;
+ int zipquality; /* compression level */
+ int state; /* state flags */
+ int subcodec; /* DEFLATE_SUBCODEC_ZLIB or DEFLATE_SUBCODEC_LIBDEFLATE */
+#if LIBDEFLATE_SUPPORT
+ int libdeflate_state; /* -1 = until first time ZIPEncode() / ZIPDecode() is
+ called, 0 = use zlib, 1 = use libdeflate */
+ struct libdeflate_decompressor *libdeflate_dec;
+ struct libdeflate_compressor *libdeflate_enc;
+#endif
#define ZSTATE_INIT_DECODE 0x01
#define ZSTATE_INIT_ENCODE 0x02
- TIFFVGetMethod vgetparent; /* super-class method */
- TIFFVSetMethod vsetparent; /* super-class method */
+ TIFFVGetMethod vgetparent; /* super-class method */
+ TIFFVSetMethod vsetparent; /* super-class method */
} ZIPState;
-#define ZState(tif) ((ZIPState*) (tif)->tif_data)
-#define DecoderState(tif) ZState(tif)
-#define EncoderState(tif) ZState(tif)
+#define ZState(tif) ((ZIPState *)(tif)->tif_data)
+#define DecoderState(tif) ZState(tif)
+#define EncoderState(tif) ZState(tif)
-static int ZIPEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s);
-static int ZIPDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s);
+static int ZIPEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s);
+static int ZIPDecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s);
-static int
-ZIPFixupTags(TIFF* tif)
+static int ZIPFixupTags(TIFF *tif)
{
- (void) tif;
- return (1);
+ (void)tif;
+ return (1);
}
-static int
-ZIPSetupDecode(TIFF* tif)
+static int ZIPSetupDecode(TIFF *tif)
{
- static const char module[] = "ZIPSetupDecode";
- ZIPState* sp = DecoderState(tif);
-
- assert(sp != NULL);
-
- /* if we were last encoding, terminate this mode */
- if (sp->state & ZSTATE_INIT_ENCODE) {
- deflateEnd(&sp->stream);
- sp->state = 0;
- }
-
- /* This function can possibly be called several times by */
- /* PredictorSetupDecode() if this function succeeds but */
- /* PredictorSetup() fails */
- if ((sp->state & ZSTATE_INIT_DECODE) == 0 &&
- inflateInit(&sp->stream) != Z_OK) {
- TIFFErrorExt(tif->tif_clientdata, module, "%s", SAFE_MSG(sp));
- return (0);
- } else {
- sp->state |= ZSTATE_INIT_DECODE;
- return (1);
- }
+ static const char module[] = "ZIPSetupDecode";
+ ZIPState *sp = DecoderState(tif);
+
+ assert(sp != NULL);
+
+ /* if we were last encoding, terminate this mode */
+ if (sp->state & ZSTATE_INIT_ENCODE)
+ {
+ deflateEnd(&sp->stream);
+ sp->state = 0;
+ }
+
+ /* This function can possibly be called several times by */
+ /* PredictorSetupDecode() if this function succeeds but */
+ /* PredictorSetup() fails */
+ if ((sp->state & ZSTATE_INIT_DECODE) == 0 &&
+ inflateInit(&sp->stream) != Z_OK)
+ {
+ TIFFErrorExtR(tif, module, "%s", SAFE_MSG(sp));
+ return (0);
+ }
+ else
+ {
+ sp->state |= ZSTATE_INIT_DECODE;
+ return (1);
+ }
}
/*
* Setup state for decoding a strip.
*/
-static int
-ZIPPreDecode(TIFF* tif, uint16 s)
+static int ZIPPreDecode(TIFF *tif, uint16_t s)
{
- ZIPState* sp = DecoderState(tif);
+ ZIPState *sp = DecoderState(tif);
- (void) s;
- assert(sp != NULL);
+ (void)s;
+ assert(sp != NULL);
- if( (sp->state & ZSTATE_INIT_DECODE) == 0 )
- tif->tif_setupdecode( tif );
+ if ((sp->state & ZSTATE_INIT_DECODE) == 0)
+ tif->tif_setupdecode(tif);
- sp->stream.next_in = tif->tif_rawdata;
- assert(sizeof(sp->stream.avail_in)==4); /* if this assert gets raised,
- we need to simplify this code to reflect a ZLib that is likely updated
- to deal with 8byte memory sizes, though this code will respond
- appropriately even before we simplify it */
- sp->stream.avail_in = (uint64)tif->tif_rawcc < 0xFFFFFFFFU ? (uInt) tif->tif_rawcc : 0xFFFFFFFFU;
- return (inflateReset(&sp->stream) == Z_OK);
+#if LIBDEFLATE_SUPPORT
+ sp->libdeflate_state = -1;
+#endif
+ sp->stream.next_in = tif->tif_rawdata;
+ assert(sizeof(sp->stream.avail_in) == 4); /* if this assert gets raised,
+ we need to simplify this code to reflect a ZLib that is likely updated
+ to deal with 8byte memory sizes, though this code will respond
+ appropriately even before we simplify it */
+ sp->stream.avail_in = (uint64_t)tif->tif_rawcc < 0xFFFFFFFFU
+ ? (uInt)tif->tif_rawcc
+ : 0xFFFFFFFFU;
+ return (inflateReset(&sp->stream) == Z_OK);
}
-static int
-ZIPDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
+static int ZIPDecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s)
{
- static const char module[] = "ZIPDecode";
- ZIPState* sp = DecoderState(tif);
-
- (void) s;
- assert(sp != NULL);
- assert(sp->state == ZSTATE_INIT_DECODE);
-
- sp->stream.next_in = tif->tif_rawcp;
-
- sp->stream.next_out = op;
- assert(sizeof(sp->stream.avail_out)==4); /* if this assert gets raised,
- we need to simplify this code to reflect a ZLib that is likely updated
- to deal with 8byte memory sizes, though this code will respond
- appropriately even before we simplify it */
- do {
- int state;
- uInt avail_in_before = (uint64)tif->tif_rawcc <= 0xFFFFFFFFU ? (uInt)tif->tif_rawcc : 0xFFFFFFFFU;
- uInt avail_out_before = (uint64)occ < 0xFFFFFFFFU ? (uInt) occ : 0xFFFFFFFFU;
- sp->stream.avail_in = avail_in_before;
- sp->stream.avail_out = avail_out_before;
- state = inflate(&sp->stream, Z_PARTIAL_FLUSH);
- tif->tif_rawcc -= (avail_in_before - sp->stream.avail_in);
- occ -= (avail_out_before - sp->stream.avail_out);
- if (state == Z_STREAM_END)
- break;
- if (state == Z_DATA_ERROR) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Decoding error at scanline %lu, %s",
- (unsigned long) tif->tif_row, SAFE_MSG(sp));
- return (0);
- }
- if (state != Z_OK) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "ZLib error: %s", SAFE_MSG(sp));
- return (0);
- }
- } while (occ > 0);
- if (occ != 0) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Not enough data at scanline %lu (short " TIFF_UINT64_FORMAT " bytes)",
- (unsigned long) tif->tif_row, (TIFF_UINT64_T) occ);
- return (0);
- }
-
- tif->tif_rawcp = sp->stream.next_in;
-
- return (1);
+ static const char module[] = "ZIPDecode";
+ ZIPState *sp = DecoderState(tif);
+
+ (void)s;
+ assert(sp != NULL);
+ assert(sp->state == ZSTATE_INIT_DECODE);
+
+#if LIBDEFLATE_SUPPORT
+ if (sp->libdeflate_state == 1)
+ return 0;
+
+ /* If we have libdeflate support and we are asked to read a whole */
+ /* strip/tile, then go for using it */
+ do
+ {
+ TIFFDirectory *td = &tif->tif_dir;
+
+ if (sp->libdeflate_state == 0)
+ break;
+ if (sp->subcodec == DEFLATE_SUBCODEC_ZLIB)
+ break;
+
+ /* Check if we are in the situation where we can use libdeflate */
+ if (isTiled(tif))
+ {
+ if (TIFFTileSize64(tif) != (uint64_t)occ)
+ break;
+ }
+ else
+ {
+ uint32_t strip_height = td->td_imagelength - tif->tif_row;
+ if (strip_height > td->td_rowsperstrip)
+ strip_height = td->td_rowsperstrip;
+ if (TIFFVStripSize64(tif, strip_height) != (uint64_t)occ)
+ break;
+ }
+
+ /* Check for overflow */
+ if ((size_t)tif->tif_rawcc != (uint64_t)tif->tif_rawcc)
+ break;
+ if ((size_t)occ != (uint64_t)occ)
+ break;
+
+ /* Go for decompression using libdeflate */
+ {
+ enum libdeflate_result res;
+ if (sp->libdeflate_dec == NULL)
+ {
+ sp->libdeflate_dec = libdeflate_alloc_decompressor();
+ if (sp->libdeflate_dec == NULL)
+ {
+ break;
+ }
+ }
+
+ sp->libdeflate_state = 1;
+
+ res = libdeflate_zlib_decompress(sp->libdeflate_dec, tif->tif_rawcp,
+ (size_t)tif->tif_rawcc, op,
+ (size_t)occ, NULL);
+
+ tif->tif_rawcp += tif->tif_rawcc;
+ tif->tif_rawcc = 0;
+
+ /* We accept LIBDEFLATE_INSUFFICIENT_SPACE has a return */
+ /* There are odd files in the wild where the last strip, when */
+ /* it is smaller in height than td_rowsperstrip, actually contains
+ */
+ /* data for td_rowsperstrip lines. Just ignore that silently. */
+ if (res != LIBDEFLATE_SUCCESS &&
+ res != LIBDEFLATE_INSUFFICIENT_SPACE)
+ {
+ TIFFErrorExtR(tif, module, "Decoding error at scanline %lu",
+ (unsigned long)tif->tif_row);
+ return 0;
+ }
+
+ return 1;
+ }
+ } while (0);
+ sp->libdeflate_state = 0;
+#endif /* LIBDEFLATE_SUPPORT */
+
+ sp->stream.next_in = tif->tif_rawcp;
+
+ sp->stream.next_out = op;
+ assert(sizeof(sp->stream.avail_out) == 4); /* if this assert gets raised,
+ we need to simplify this code to reflect a ZLib that is likely updated
+ to deal with 8byte memory sizes, though this code will respond
+ appropriately even before we simplify it */
+ do
+ {
+ int state;
+ uInt avail_in_before = (uint64_t)tif->tif_rawcc <= 0xFFFFFFFFU
+ ? (uInt)tif->tif_rawcc
+ : 0xFFFFFFFFU;
+ uInt avail_out_before =
+ (uint64_t)occ < 0xFFFFFFFFU ? (uInt)occ : 0xFFFFFFFFU;
+ sp->stream.avail_in = avail_in_before;
+ sp->stream.avail_out = avail_out_before;
+ /* coverity[overrun-buffer-arg] */
+ state = inflate(&sp->stream, Z_PARTIAL_FLUSH);
+ tif->tif_rawcc -= (avail_in_before - sp->stream.avail_in);
+ occ -= (avail_out_before - sp->stream.avail_out);
+ if (state == Z_STREAM_END)
+ break;
+ if (state == Z_DATA_ERROR)
+ {
+ TIFFErrorExtR(tif, module, "Decoding error at scanline %lu, %s",
+ (unsigned long)tif->tif_row, SAFE_MSG(sp));
+ return (0);
+ }
+ if (state != Z_OK)
+ {
+ TIFFErrorExtR(tif, module, "ZLib error: %s", SAFE_MSG(sp));
+ return (0);
+ }
+ } while (occ > 0);
+ if (occ != 0)
+ {
+ TIFFErrorExtR(tif, module,
+ "Not enough data at scanline %lu (short %" PRIu64
+ " bytes)",
+ (unsigned long)tif->tif_row, (uint64_t)occ);
+ return (0);
+ }
+
+ tif->tif_rawcp = sp->stream.next_in;
+
+ return (1);
}
-static int
-ZIPSetupEncode(TIFF* tif)
+static int ZIPSetupEncode(TIFF *tif)
{
- static const char module[] = "ZIPSetupEncode";
- ZIPState* sp = EncoderState(tif);
-
- assert(sp != NULL);
- if (sp->state & ZSTATE_INIT_DECODE) {
- inflateEnd(&sp->stream);
- sp->state = 0;
- }
-
- if (deflateInit(&sp->stream, sp->zipquality) != Z_OK) {
- TIFFErrorExt(tif->tif_clientdata, module, "%s", SAFE_MSG(sp));
- return (0);
- } else {
- sp->state |= ZSTATE_INIT_ENCODE;
- return (1);
- }
+ static const char module[] = "ZIPSetupEncode";
+ ZIPState *sp = EncoderState(tif);
+ int cappedQuality;
+
+ assert(sp != NULL);
+ if (sp->state & ZSTATE_INIT_DECODE)
+ {
+ inflateEnd(&sp->stream);
+ sp->state = 0;
+ }
+
+ cappedQuality = sp->zipquality;
+ if (cappedQuality > Z_BEST_COMPRESSION)
+ cappedQuality = Z_BEST_COMPRESSION;
+
+ if (deflateInit(&sp->stream, cappedQuality) != Z_OK)
+ {
+ TIFFErrorExtR(tif, module, "%s", SAFE_MSG(sp));
+ return (0);
+ }
+ else
+ {
+ sp->state |= ZSTATE_INIT_ENCODE;
+ return (1);
+ }
}
/*
* Reset encoding state at the start of a strip.
*/
-static int
-ZIPPreEncode(TIFF* tif, uint16 s)
+static int ZIPPreEncode(TIFF *tif, uint16_t s)
{
- ZIPState *sp = EncoderState(tif);
-
- (void) s;
- assert(sp != NULL);
- if( sp->state != ZSTATE_INIT_ENCODE )
- tif->tif_setupencode( tif );
-
- sp->stream.next_out = tif->tif_rawdata;
- assert(sizeof(sp->stream.avail_out)==4); /* if this assert gets raised,
- we need to simplify this code to reflect a ZLib that is likely updated
- to deal with 8byte memory sizes, though this code will respond
- appropriately even before we simplify it */
- sp->stream.avail_out = (uint64)tif->tif_rawdatasize <= 0xFFFFFFFFU ? (uInt)tif->tif_rawdatasize : 0xFFFFFFFFU;
- return (deflateReset(&sp->stream) == Z_OK);
+ ZIPState *sp = EncoderState(tif);
+
+ (void)s;
+ assert(sp != NULL);
+ if (sp->state != ZSTATE_INIT_ENCODE)
+ tif->tif_setupencode(tif);
+
+#if LIBDEFLATE_SUPPORT
+ sp->libdeflate_state = -1;
+#endif
+ sp->stream.next_out = tif->tif_rawdata;
+ assert(sizeof(sp->stream.avail_out) == 4); /* if this assert gets raised,
+ we need to simplify this code to reflect a ZLib that is likely updated
+ to deal with 8byte memory sizes, though this code will respond
+ appropriately even before we simplify it */
+ sp->stream.avail_out = (uint64_t)tif->tif_rawdatasize <= 0xFFFFFFFFU
+ ? (uInt)tif->tif_rawdatasize
+ : 0xFFFFFFFFU;
+ return (deflateReset(&sp->stream) == Z_OK);
}
/*
* Encode a chunk of pixels.
*/
-static int
-ZIPEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
+static int ZIPEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
{
- static const char module[] = "ZIPEncode";
- ZIPState *sp = EncoderState(tif);
-
- assert(sp != NULL);
- assert(sp->state == ZSTATE_INIT_ENCODE);
-
- (void) s;
- sp->stream.next_in = bp;
- assert(sizeof(sp->stream.avail_in)==4); /* if this assert gets raised,
- we need to simplify this code to reflect a ZLib that is likely updated
- to deal with 8byte memory sizes, though this code will respond
- appropriately even before we simplify it */
- do {
- uInt avail_in_before = (uint64)cc <= 0xFFFFFFFFU ? (uInt)cc : 0xFFFFFFFFU;
- sp->stream.avail_in = avail_in_before;
- if (deflate(&sp->stream, Z_NO_FLUSH) != Z_OK) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Encoder error: %s",
- SAFE_MSG(sp));
- return (0);
- }
- if (sp->stream.avail_out == 0) {
- tif->tif_rawcc = tif->tif_rawdatasize;
- TIFFFlushData1(tif);
- sp->stream.next_out = tif->tif_rawdata;
- sp->stream.avail_out = (uint64)tif->tif_rawdatasize <= 0xFFFFFFFFU ? (uInt)tif->tif_rawdatasize : 0xFFFFFFFFU;
- }
- cc -= (avail_in_before - sp->stream.avail_in);
- } while (cc > 0);
- return (1);
+ static const char module[] = "ZIPEncode";
+ ZIPState *sp = EncoderState(tif);
+
+ assert(sp != NULL);
+ assert(sp->state == ZSTATE_INIT_ENCODE);
+
+ (void)s;
+
+#if LIBDEFLATE_SUPPORT
+ if (sp->libdeflate_state == 1)
+ return 0;
+
+ /* If we have libdeflate support and we are asked to write a whole */
+ /* strip/tile, then go for using it */
+ do
+ {
+ TIFFDirectory *td = &tif->tif_dir;
+
+ if (sp->libdeflate_state == 0)
+ break;
+ if (sp->subcodec == DEFLATE_SUBCODEC_ZLIB)
+ break;
+
+ /* Libdeflate does not support the 0-compression level */
+ if (sp->zipquality == Z_NO_COMPRESSION)
+ break;
+
+ /* Check if we are in the situation where we can use libdeflate */
+ if (isTiled(tif))
+ {
+ if (TIFFTileSize64(tif) != (uint64_t)cc)
+ break;
+ }
+ else
+ {
+ uint32_t strip_height = td->td_imagelength - tif->tif_row;
+ if (strip_height > td->td_rowsperstrip)
+ strip_height = td->td_rowsperstrip;
+ if (TIFFVStripSize64(tif, strip_height) != (uint64_t)cc)
+ break;
+ }
+
+ /* Check for overflow */
+ if ((size_t)tif->tif_rawdatasize != (uint64_t)tif->tif_rawdatasize)
+ break;
+ if ((size_t)cc != (uint64_t)cc)
+ break;
+
+ /* Go for compression using libdeflate */
+ {
+ size_t nCompressedBytes;
+ if (sp->libdeflate_enc == NULL)
+ {
+ /* To get results as good as zlib, we asked for an extra */
+ /* level of compression */
+ sp->libdeflate_enc = libdeflate_alloc_compressor(
+ sp->zipquality == Z_DEFAULT_COMPRESSION ? 7
+ : sp->zipquality >= 6 && sp->zipquality <= 9
+ ? sp->zipquality + 1
+ : sp->zipquality);
+ if (sp->libdeflate_enc == NULL)
+ {
+ TIFFErrorExtR(tif, module, "Cannot allocate compressor");
+ break;
+ }
+ }
+
+ /* Make sure the output buffer is large enough for the worse case.
+ */
+ /* In TIFFWriteBufferSetup(), when libtiff allocates the buffer */
+ /* we've taken a 10% margin over the uncompressed size, which should
+ */
+ /* be large enough even for the the worse case scenario. */
+ if (libdeflate_zlib_compress_bound(sp->libdeflate_enc, (size_t)cc) >
+ (size_t)tif->tif_rawdatasize)
+ {
+ break;
+ }
+
+ sp->libdeflate_state = 1;
+ nCompressedBytes = libdeflate_zlib_compress(
+ sp->libdeflate_enc, bp, (size_t)cc, tif->tif_rawdata,
+ (size_t)tif->tif_rawdatasize);
+
+ if (nCompressedBytes == 0)
+ {
+ TIFFErrorExtR(tif, module, "Encoder error at scanline %lu",
+ (unsigned long)tif->tif_row);
+ return 0;
+ }
+
+ tif->tif_rawcc = nCompressedBytes;
+
+ if (!TIFFFlushData1(tif))
+ return 0;
+
+ return 1;
+ }
+ } while (0);
+ sp->libdeflate_state = 0;
+#endif /* LIBDEFLATE_SUPPORT */
+
+ sp->stream.next_in = bp;
+ assert(sizeof(sp->stream.avail_in) == 4); /* if this assert gets raised,
+ we need to simplify this code to reflect a ZLib that is likely updated
+ to deal with 8byte memory sizes, though this code will respond
+ appropriately even before we simplify it */
+ do
+ {
+ uInt avail_in_before =
+ (uint64_t)cc <= 0xFFFFFFFFU ? (uInt)cc : 0xFFFFFFFFU;
+ sp->stream.avail_in = avail_in_before;
+ /* coverity[overrun-buffer-arg] */
+ if (deflate(&sp->stream, Z_NO_FLUSH) != Z_OK)
+ {
+ TIFFErrorExtR(tif, module, "Encoder error: %s", SAFE_MSG(sp));
+ return (0);
+ }
+ if (sp->stream.avail_out == 0)
+ {
+ tif->tif_rawcc = tif->tif_rawdatasize;
+ if (!TIFFFlushData1(tif))
+ return 0;
+ sp->stream.next_out = tif->tif_rawdata;
+ sp->stream.avail_out = (uint64_t)tif->tif_rawdatasize <= 0xFFFFFFFFU
+ ? (uInt)tif->tif_rawdatasize
+ : 0xFFFFFFFFU;
+ }
+ cc -= (avail_in_before - sp->stream.avail_in);
+ } while (cc > 0);
+ return (1);
}
/*
* Finish off an encoded strip by flushing the last
* string and tacking on an End Of Information code.
*/
-static int
-ZIPPostEncode(TIFF* tif)
+static int ZIPPostEncode(TIFF *tif)
{
- static const char module[] = "ZIPPostEncode";
- ZIPState *sp = EncoderState(tif);
- int state;
-
- sp->stream.avail_in = 0;
- do {
- state = deflate(&sp->stream, Z_FINISH);
- switch (state) {
- case Z_STREAM_END:
- case Z_OK:
- if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize)
- {
- tif->tif_rawcc = tif->tif_rawdatasize - sp->stream.avail_out;
- TIFFFlushData1(tif);
- sp->stream.next_out = tif->tif_rawdata;
- sp->stream.avail_out = (uint64)tif->tif_rawdatasize <= 0xFFFFFFFFU ? (uInt)tif->tif_rawdatasize : 0xFFFFFFFFU;
- }
- break;
- default:
- TIFFErrorExt(tif->tif_clientdata, module,
- "ZLib error: %s", SAFE_MSG(sp));
- return (0);
- }
- } while (state != Z_STREAM_END);
- return (1);
-}
+ static const char module[] = "ZIPPostEncode";
+ ZIPState *sp = EncoderState(tif);
+ int state;
-static void
-ZIPCleanup(TIFF* tif)
-{
- ZIPState* sp = ZState(tif);
-
- assert(sp != 0);
+#if LIBDEFLATE_SUPPORT
+ if (sp->libdeflate_state == 1)
+ return 1;
+#endif
- (void)TIFFPredictorCleanup(tif);
+ sp->stream.avail_in = 0;
+ do
+ {
+ state = deflate(&sp->stream, Z_FINISH);
+ switch (state)
+ {
+ case Z_STREAM_END:
+ case Z_OK:
+ if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize)
+ {
+ tif->tif_rawcc =
+ tif->tif_rawdatasize - sp->stream.avail_out;
+ if (!TIFFFlushData1(tif))
+ return 0;
+ sp->stream.next_out = tif->tif_rawdata;
+ sp->stream.avail_out =
+ (uint64_t)tif->tif_rawdatasize <= 0xFFFFFFFFU
+ ? (uInt)tif->tif_rawdatasize
+ : 0xFFFFFFFFU;
+ }
+ break;
+ default:
+ TIFFErrorExtR(tif, module, "ZLib error: %s", SAFE_MSG(sp));
+ return (0);
+ }
+ } while (state != Z_STREAM_END);
+ return (1);
+}
- tif->tif_tagmethods.vgetfield = sp->vgetparent;
- tif->tif_tagmethods.vsetfield = sp->vsetparent;
+static void ZIPCleanup(TIFF *tif)
+{
+ ZIPState *sp = ZState(tif);
+
+ assert(sp != 0);
+
+ (void)TIFFPredictorCleanup(tif);
+
+ tif->tif_tagmethods.vgetfield = sp->vgetparent;
+ tif->tif_tagmethods.vsetfield = sp->vsetparent;
+
+ if (sp->state & ZSTATE_INIT_ENCODE)
+ {
+ deflateEnd(&sp->stream);
+ sp->state = 0;
+ }
+ else if (sp->state & ZSTATE_INIT_DECODE)
+ {
+ inflateEnd(&sp->stream);
+ sp->state = 0;
+ }
+
+#if LIBDEFLATE_SUPPORT
+ if (sp->libdeflate_dec)
+ libdeflate_free_decompressor(sp->libdeflate_dec);
+ if (sp->libdeflate_enc)
+ libdeflate_free_compressor(sp->libdeflate_enc);
+#endif
- if (sp->state & ZSTATE_INIT_ENCODE) {
- deflateEnd(&sp->stream);
- sp->state = 0;
- } else if( sp->state & ZSTATE_INIT_DECODE) {
- inflateEnd(&sp->stream);
- sp->state = 0;
- }
- _TIFFfree(sp);
- tif->tif_data = NULL;
+ _TIFFfreeExt(tif, sp);
+ tif->tif_data = NULL;
- _TIFFSetDefaultCompressionState(tif);
+ _TIFFSetDefaultCompressionState(tif);
}
-static int
-ZIPVSetField(TIFF* tif, uint32 tag, va_list ap)
+static int ZIPVSetField(TIFF *tif, uint32_t tag, va_list ap)
{
- static const char module[] = "ZIPVSetField";
- ZIPState* sp = ZState(tif);
-
- switch (tag) {
- case TIFFTAG_ZIPQUALITY:
- sp->zipquality = (int) va_arg(ap, int);
- if ( sp->state&ZSTATE_INIT_ENCODE ) {
- if (deflateParams(&sp->stream,
- sp->zipquality, Z_DEFAULT_STRATEGY) != Z_OK) {
- TIFFErrorExt(tif->tif_clientdata, module, "ZLib error: %s",
- SAFE_MSG(sp));
- return (0);
- }
- }
- return (1);
- default:
- return (*sp->vsetparent)(tif, tag, ap);
- }
- /*NOTREACHED*/
+ static const char module[] = "ZIPVSetField";
+ ZIPState *sp = ZState(tif);
+
+ switch (tag)
+ {
+ case TIFFTAG_ZIPQUALITY:
+ sp->zipquality = (int)va_arg(ap, int);
+ if (sp->zipquality < Z_DEFAULT_COMPRESSION ||
+ sp->zipquality > LIBDEFLATE_MAX_COMPRESSION_LEVEL)
+ {
+ TIFFErrorExtR(
+ tif, module,
+ "Invalid ZipQuality value. Should be in [-1,%d] range",
+ LIBDEFLATE_MAX_COMPRESSION_LEVEL);
+ return 0;
+ }
+
+ if (sp->state & ZSTATE_INIT_ENCODE)
+ {
+ int cappedQuality = sp->zipquality;
+ if (cappedQuality > Z_BEST_COMPRESSION)
+ cappedQuality = Z_BEST_COMPRESSION;
+ if (deflateParams(&sp->stream, cappedQuality,
+ Z_DEFAULT_STRATEGY) != Z_OK)
+ {
+ TIFFErrorExtR(tif, module, "ZLib error: %s", SAFE_MSG(sp));
+ return (0);
+ }
+ }
+
+#if LIBDEFLATE_SUPPORT
+ if (sp->libdeflate_enc)
+ {
+ libdeflate_free_compressor(sp->libdeflate_enc);
+ sp->libdeflate_enc = NULL;
+ }
+#endif
+
+ return (1);
+
+ case TIFFTAG_DEFLATE_SUBCODEC:
+ sp->subcodec = (int)va_arg(ap, int);
+ if (sp->subcodec != DEFLATE_SUBCODEC_ZLIB &&
+ sp->subcodec != DEFLATE_SUBCODEC_LIBDEFLATE)
+ {
+ TIFFErrorExtR(tif, module, "Invalid DeflateCodec value.");
+ return 0;
+ }
+#if !LIBDEFLATE_SUPPORT
+ if (sp->subcodec == DEFLATE_SUBCODEC_LIBDEFLATE)
+ {
+ TIFFErrorExtR(tif, module,
+ "DeflateCodec = DEFLATE_SUBCODEC_LIBDEFLATE "
+ "unsupported in this build");
+ return 0;
+ }
+#endif
+ return 1;
+
+ default:
+ return (*sp->vsetparent)(tif, tag, ap);
+ }
+ /*NOTREACHED*/
}
-static int
-ZIPVGetField(TIFF* tif, uint32 tag, va_list ap)
+static int ZIPVGetField(TIFF *tif, uint32_t tag, va_list ap)
{
- ZIPState* sp = ZState(tif);
-
- switch (tag) {
- case TIFFTAG_ZIPQUALITY:
- *va_arg(ap, int*) = sp->zipquality;
- break;
- default:
- return (*sp->vgetparent)(tif, tag, ap);
- }
- return (1);
+ ZIPState *sp = ZState(tif);
+
+ switch (tag)
+ {
+ case TIFFTAG_ZIPQUALITY:
+ *va_arg(ap, int *) = sp->zipquality;
+ break;
+
+ case TIFFTAG_DEFLATE_SUBCODEC:
+ *va_arg(ap, int *) = sp->subcodec;
+ break;
+
+ default:
+ return (*sp->vgetparent)(tif, tag, ap);
+ }
+ return (1);
}
static const TIFFField zipFields[] = {
- { TIFFTAG_ZIPQUALITY, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "", NULL },
+ {TIFFTAG_ZIPQUALITY, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
+ TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "", NULL},
+ {TIFFTAG_DEFLATE_SUBCODEC, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
+ TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "", NULL},
};
-int
-TIFFInitZIP(TIFF* tif, int scheme)
+int TIFFInitZIP(TIFF *tif, int scheme)
{
- static const char module[] = "TIFFInitZIP";
- ZIPState* sp;
-
- assert( (scheme == COMPRESSION_DEFLATE)
- || (scheme == COMPRESSION_ADOBE_DEFLATE));
-
- /*
- * Merge codec-specific tag information.
- */
- if (!_TIFFMergeFields(tif, zipFields, TIFFArrayCount(zipFields))) {
- TIFFErrorExt(tif->tif_clientdata, module,
- "Merging Deflate codec-specific tags failed");
- return 0;
- }
-
- /*
- * Allocate state block so tag methods have storage to record values.
- */
- tif->tif_data = (uint8*) _TIFFmalloc(sizeof (ZIPState));
- if (tif->tif_data == NULL)
- goto bad;
- sp = ZState(tif);
- sp->stream.zalloc = NULL;
- sp->stream.zfree = NULL;
- sp->stream.opaque = NULL;
- sp->stream.data_type = Z_BINARY;
-
- /*
- * Override parent get/set field methods.
- */
- sp->vgetparent = tif->tif_tagmethods.vgetfield;
- tif->tif_tagmethods.vgetfield = ZIPVGetField; /* hook for codec tags */
- sp->vsetparent = tif->tif_tagmethods.vsetfield;
- tif->tif_tagmethods.vsetfield = ZIPVSetField; /* hook for codec tags */
-
- /* Default values for codec-specific fields */
- sp->zipquality = Z_DEFAULT_COMPRESSION; /* default comp. level */
- sp->state = 0;
-
- /*
- * Install codec methods.
- */
- tif->tif_fixuptags = ZIPFixupTags;
- tif->tif_setupdecode = ZIPSetupDecode;
- tif->tif_predecode = ZIPPreDecode;
- tif->tif_decoderow = ZIPDecode;
- tif->tif_decodestrip = ZIPDecode;
- tif->tif_decodetile = ZIPDecode;
- tif->tif_setupencode = ZIPSetupEncode;
- tif->tif_preencode = ZIPPreEncode;
- tif->tif_postencode = ZIPPostEncode;
- tif->tif_encoderow = ZIPEncode;
- tif->tif_encodestrip = ZIPEncode;
- tif->tif_encodetile = ZIPEncode;
- tif->tif_cleanup = ZIPCleanup;
- /*
- * Setup predictor setup.
- */
- (void) TIFFPredictorInit(tif);
- return (1);
+ static const char module[] = "TIFFInitZIP";
+ ZIPState *sp;
+
+ assert((scheme == COMPRESSION_DEFLATE) ||
+ (scheme == COMPRESSION_ADOBE_DEFLATE));
+#ifdef NDEBUG
+ (void)scheme;
+#endif
+
+ /*
+ * Merge codec-specific tag information.
+ */
+ if (!_TIFFMergeFields(tif, zipFields, TIFFArrayCount(zipFields)))
+ {
+ TIFFErrorExtR(tif, module,
+ "Merging Deflate codec-specific tags failed");
+ return 0;
+ }
+
+ /*
+ * Allocate state block so tag methods have storage to record values.
+ */
+ tif->tif_data = (uint8_t *)_TIFFcallocExt(tif, sizeof(ZIPState), 1);
+ if (tif->tif_data == NULL)
+ goto bad;
+ sp = ZState(tif);
+ sp->stream.zalloc = NULL;
+ sp->stream.zfree = NULL;
+ sp->stream.opaque = NULL;
+ sp->stream.data_type = Z_BINARY;
+
+ /*
+ * Override parent get/set field methods.
+ */
+ sp->vgetparent = tif->tif_tagmethods.vgetfield;
+ tif->tif_tagmethods.vgetfield = ZIPVGetField; /* hook for codec tags */
+ sp->vsetparent = tif->tif_tagmethods.vsetfield;
+ tif->tif_tagmethods.vsetfield = ZIPVSetField; /* hook for codec tags */
+
+ /* Default values for codec-specific fields */
+ sp->zipquality = Z_DEFAULT_COMPRESSION; /* default comp. level */
+ sp->state = 0;
+#if LIBDEFLATE_SUPPORT
+ sp->subcodec = DEFLATE_SUBCODEC_LIBDEFLATE;
+#else
+ sp->subcodec = DEFLATE_SUBCODEC_ZLIB;
+#endif
+
+ /*
+ * Install codec methods.
+ */
+ tif->tif_fixuptags = ZIPFixupTags;
+ tif->tif_setupdecode = ZIPSetupDecode;
+ tif->tif_predecode = ZIPPreDecode;
+ tif->tif_decoderow = ZIPDecode;
+ tif->tif_decodestrip = ZIPDecode;
+ tif->tif_decodetile = ZIPDecode;
+ tif->tif_setupencode = ZIPSetupEncode;
+ tif->tif_preencode = ZIPPreEncode;
+ tif->tif_postencode = ZIPPostEncode;
+ tif->tif_encoderow = ZIPEncode;
+ tif->tif_encodestrip = ZIPEncode;
+ tif->tif_encodetile = ZIPEncode;
+ tif->tif_cleanup = ZIPCleanup;
+ /*
+ * Setup predictor setup.
+ */
+ (void)TIFFPredictorInit(tif);
+ return (1);
bad:
- TIFFErrorExt(tif->tif_clientdata, module,
- "No space for ZIP state block");
- return (0);
+ TIFFErrorExtR(tif, module, "No space for ZIP state block");
+ return (0);
}
#endif /* ZIP_SUPPORT */
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tif_zstd.c b/src/3rdparty/libtiff/libtiff/tif_zstd.c
new file mode 100644
index 0000000..6469931
--- /dev/null
+++ b/src/3rdparty/libtiff/libtiff/tif_zstd.c
@@ -0,0 +1,436 @@
+/*
+ * Copyright (c) 2017, Planet Labs
+ * Author: <even.rouault at spatialys.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "tiffiop.h"
+#ifdef ZSTD_SUPPORT
+/*
+ * TIFF Library.
+ *
+ * ZSTD Compression Support
+ *
+ */
+
+#include "tif_predict.h"
+#include "zstd.h"
+
+#include <stdio.h>
+
+/*
+ * State block for each open TIFF file using ZSTD compression/decompression.
+ */
+typedef struct
+{
+ TIFFPredictorState predict;
+ ZSTD_DStream *dstream;
+ ZSTD_CStream *cstream;
+ int compression_level; /* compression level */
+ ZSTD_outBuffer out_buffer;
+ int state; /* state flags */
+#define LSTATE_INIT_DECODE 0x01
+#define LSTATE_INIT_ENCODE 0x02
+
+ TIFFVGetMethod vgetparent; /* super-class method */
+ TIFFVSetMethod vsetparent; /* super-class method */
+} ZSTDState;
+
+#define LState(tif) ((ZSTDState *)(tif)->tif_data)
+#define DecoderState(tif) LState(tif)
+#define EncoderState(tif) LState(tif)
+
+static int ZSTDEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s);
+static int ZSTDDecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s);
+
+static int ZSTDFixupTags(TIFF *tif)
+{
+ (void)tif;
+ return 1;
+}
+
+static int ZSTDSetupDecode(TIFF *tif)
+{
+ ZSTDState *sp = DecoderState(tif);
+
+ assert(sp != NULL);
+
+ /* if we were last encoding, terminate this mode */
+ if (sp->state & LSTATE_INIT_ENCODE)
+ {
+ ZSTD_freeCStream(sp->cstream);
+ sp->cstream = NULL;
+ sp->state = 0;
+ }
+
+ sp->state |= LSTATE_INIT_DECODE;
+ return 1;
+}
+
+/*
+ * Setup state for decoding a strip.
+ */
+static int ZSTDPreDecode(TIFF *tif, uint16_t s)
+{
+ static const char module[] = "ZSTDPreDecode";
+ ZSTDState *sp = DecoderState(tif);
+ size_t zstd_ret;
+
+ (void)s;
+ assert(sp != NULL);
+
+ if ((sp->state & LSTATE_INIT_DECODE) == 0)
+ tif->tif_setupdecode(tif);
+
+ if (sp->dstream == NULL)
+ {
+ sp->dstream = ZSTD_createDStream();
+ if (sp->dstream == NULL)
+ {
+ TIFFErrorExtR(tif, module, "Cannot allocate decompression stream");
+ return 0;
+ }
+ }
+
+ zstd_ret = ZSTD_initDStream(sp->dstream);
+ if (ZSTD_isError(zstd_ret))
+ {
+ TIFFErrorExtR(tif, module, "Error in ZSTD_initDStream(): %s",
+ ZSTD_getErrorName(zstd_ret));
+ return 0;
+ }
+
+ return 1;
+}
+
+static int ZSTDDecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s)
+{
+ static const char module[] = "ZSTDDecode";
+ ZSTDState *sp = DecoderState(tif);
+ ZSTD_inBuffer in_buffer;
+ ZSTD_outBuffer out_buffer;
+ size_t zstd_ret;
+
+ (void)s;
+ assert(sp != NULL);
+ assert(sp->state == LSTATE_INIT_DECODE);
+
+ in_buffer.src = tif->tif_rawcp;
+ in_buffer.size = (size_t)tif->tif_rawcc;
+ in_buffer.pos = 0;
+
+ out_buffer.dst = op;
+ out_buffer.size = (size_t)occ;
+ out_buffer.pos = 0;
+
+ do
+ {
+ zstd_ret = ZSTD_decompressStream(sp->dstream, &out_buffer, &in_buffer);
+ if (ZSTD_isError(zstd_ret))
+ {
+ TIFFErrorExtR(tif, module, "Error in ZSTD_decompressStream(): %s",
+ ZSTD_getErrorName(zstd_ret));
+ return 0;
+ }
+ } while (zstd_ret != 0 && in_buffer.pos < in_buffer.size &&
+ out_buffer.pos < out_buffer.size);
+
+ if (out_buffer.pos < (size_t)occ)
+ {
+ TIFFErrorExtR(tif, module,
+ "Not enough data at scanline %lu (short %lu bytes)",
+ (unsigned long)tif->tif_row,
+ (unsigned long)((size_t)occ - out_buffer.pos));
+ return 0;
+ }
+
+ tif->tif_rawcp += in_buffer.pos;
+ tif->tif_rawcc -= in_buffer.pos;
+
+ return 1;
+}
+
+static int ZSTDSetupEncode(TIFF *tif)
+{
+ ZSTDState *sp = EncoderState(tif);
+
+ assert(sp != NULL);
+ if (sp->state & LSTATE_INIT_DECODE)
+ {
+ ZSTD_freeDStream(sp->dstream);
+ sp->dstream = NULL;
+ sp->state = 0;
+ }
+
+ sp->state |= LSTATE_INIT_ENCODE;
+ return 1;
+}
+
+/*
+ * Reset encoding state at the start of a strip.
+ */
+static int ZSTDPreEncode(TIFF *tif, uint16_t s)
+{
+ static const char module[] = "ZSTDPreEncode";
+ ZSTDState *sp = EncoderState(tif);
+ size_t zstd_ret;
+
+ (void)s;
+ assert(sp != NULL);
+ if (sp->state != LSTATE_INIT_ENCODE)
+ tif->tif_setupencode(tif);
+
+ if (sp->cstream == NULL)
+ {
+ sp->cstream = ZSTD_createCStream();
+ if (sp->cstream == NULL)
+ {
+ TIFFErrorExtR(tif, module, "Cannot allocate compression stream");
+ return 0;
+ }
+ }
+
+ zstd_ret = ZSTD_initCStream(sp->cstream, sp->compression_level);
+ if (ZSTD_isError(zstd_ret))
+ {
+ TIFFErrorExtR(tif, module, "Error in ZSTD_initCStream(): %s",
+ ZSTD_getErrorName(zstd_ret));
+ return 0;
+ }
+
+ sp->out_buffer.dst = tif->tif_rawdata;
+ sp->out_buffer.size = (size_t)tif->tif_rawdatasize;
+ sp->out_buffer.pos = 0;
+
+ return 1;
+}
+
+/*
+ * Encode a chunk of pixels.
+ */
+static int ZSTDEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
+{
+ static const char module[] = "ZSTDEncode";
+ ZSTDState *sp = EncoderState(tif);
+ ZSTD_inBuffer in_buffer;
+ size_t zstd_ret;
+
+ assert(sp != NULL);
+ assert(sp->state == LSTATE_INIT_ENCODE);
+
+ (void)s;
+
+ in_buffer.src = bp;
+ in_buffer.size = (size_t)cc;
+ in_buffer.pos = 0;
+
+ do
+ {
+ zstd_ret =
+ ZSTD_compressStream(sp->cstream, &sp->out_buffer, &in_buffer);
+ if (ZSTD_isError(zstd_ret))
+ {
+ TIFFErrorExtR(tif, module, "Error in ZSTD_compressStream(): %s",
+ ZSTD_getErrorName(zstd_ret));
+ return 0;
+ }
+ if (sp->out_buffer.pos == sp->out_buffer.size)
+ {
+ tif->tif_rawcc = tif->tif_rawdatasize;
+ if (!TIFFFlushData1(tif))
+ return 0;
+ sp->out_buffer.dst = tif->tif_rawcp;
+ sp->out_buffer.pos = 0;
+ }
+ } while (in_buffer.pos < in_buffer.size);
+
+ return 1;
+}
+
+/*
+ * Finish off an encoded strip by flushing it.
+ */
+static int ZSTDPostEncode(TIFF *tif)
+{
+ static const char module[] = "ZSTDPostEncode";
+ ZSTDState *sp = EncoderState(tif);
+ size_t zstd_ret;
+
+ do
+ {
+ zstd_ret = ZSTD_endStream(sp->cstream, &sp->out_buffer);
+ if (ZSTD_isError(zstd_ret))
+ {
+ TIFFErrorExtR(tif, module, "Error in ZSTD_endStream(): %s",
+ ZSTD_getErrorName(zstd_ret));
+ return 0;
+ }
+ if (sp->out_buffer.pos > 0)
+ {
+ tif->tif_rawcc = sp->out_buffer.pos;
+ if (!TIFFFlushData1(tif))
+ return 0;
+ sp->out_buffer.dst = tif->tif_rawcp;
+ sp->out_buffer.pos = 0;
+ }
+ } while (zstd_ret != 0);
+ return 1;
+}
+
+static void ZSTDCleanup(TIFF *tif)
+{
+ ZSTDState *sp = LState(tif);
+
+ assert(sp != 0);
+
+ (void)TIFFPredictorCleanup(tif);
+
+ tif->tif_tagmethods.vgetfield = sp->vgetparent;
+ tif->tif_tagmethods.vsetfield = sp->vsetparent;
+
+ if (sp->dstream)
+ {
+ ZSTD_freeDStream(sp->dstream);
+ sp->dstream = NULL;
+ }
+ if (sp->cstream)
+ {
+ ZSTD_freeCStream(sp->cstream);
+ sp->cstream = NULL;
+ }
+ _TIFFfreeExt(tif, sp);
+ tif->tif_data = NULL;
+
+ _TIFFSetDefaultCompressionState(tif);
+}
+
+static int ZSTDVSetField(TIFF *tif, uint32_t tag, va_list ap)
+{
+ static const char module[] = "ZSTDVSetField";
+ ZSTDState *sp = LState(tif);
+
+ switch (tag)
+ {
+ case TIFFTAG_ZSTD_LEVEL:
+ sp->compression_level = (int)va_arg(ap, int);
+ if (sp->compression_level <= 0 ||
+ sp->compression_level > ZSTD_maxCLevel())
+ {
+ TIFFWarningExtR(tif, module,
+ "ZSTD_LEVEL should be between 1 and %d",
+ ZSTD_maxCLevel());
+ }
+ return 1;
+ default:
+ return (*sp->vsetparent)(tif, tag, ap);
+ }
+ /*NOTREACHED*/
+}
+
+static int ZSTDVGetField(TIFF *tif, uint32_t tag, va_list ap)
+{
+ ZSTDState *sp = LState(tif);
+
+ switch (tag)
+ {
+ case TIFFTAG_ZSTD_LEVEL:
+ *va_arg(ap, int *) = sp->compression_level;
+ break;
+ default:
+ return (*sp->vgetparent)(tif, tag, ap);
+ }
+ return 1;
+}
+
+static const TIFFField ZSTDFields[] = {
+ {TIFFTAG_ZSTD_LEVEL, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
+ TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "ZSTD compression_level",
+ NULL},
+};
+
+int TIFFInitZSTD(TIFF *tif, int scheme)
+{
+ static const char module[] = "TIFFInitZSTD";
+ ZSTDState *sp;
+
+ (void)scheme;
+ assert(scheme == COMPRESSION_ZSTD);
+
+ /*
+ * Merge codec-specific tag information.
+ */
+ if (!_TIFFMergeFields(tif, ZSTDFields, TIFFArrayCount(ZSTDFields)))
+ {
+ TIFFErrorExtR(tif, module, "Merging ZSTD codec-specific tags failed");
+ return 0;
+ }
+
+ /*
+ * Allocate state block so tag methods have storage to record values.
+ */
+ tif->tif_data = (uint8_t *)_TIFFmallocExt(tif, sizeof(ZSTDState));
+ if (tif->tif_data == NULL)
+ goto bad;
+ sp = LState(tif);
+
+ /*
+ * Override parent get/set field methods.
+ */
+ sp->vgetparent = tif->tif_tagmethods.vgetfield;
+ tif->tif_tagmethods.vgetfield = ZSTDVGetField; /* hook for codec tags */
+ sp->vsetparent = tif->tif_tagmethods.vsetfield;
+ tif->tif_tagmethods.vsetfield = ZSTDVSetField; /* hook for codec tags */
+
+ /* Default values for codec-specific fields */
+ sp->compression_level = 9; /* default comp. level */
+ sp->state = 0;
+ sp->dstream = 0;
+ sp->cstream = 0;
+ sp->out_buffer.dst = NULL;
+ sp->out_buffer.size = 0;
+ sp->out_buffer.pos = 0;
+
+ /*
+ * Install codec methods.
+ */
+ tif->tif_fixuptags = ZSTDFixupTags;
+ tif->tif_setupdecode = ZSTDSetupDecode;
+ tif->tif_predecode = ZSTDPreDecode;
+ tif->tif_decoderow = ZSTDDecode;
+ tif->tif_decodestrip = ZSTDDecode;
+ tif->tif_decodetile = ZSTDDecode;
+ tif->tif_setupencode = ZSTDSetupEncode;
+ tif->tif_preencode = ZSTDPreEncode;
+ tif->tif_postencode = ZSTDPostEncode;
+ tif->tif_encoderow = ZSTDEncode;
+ tif->tif_encodestrip = ZSTDEncode;
+ tif->tif_encodetile = ZSTDEncode;
+ tif->tif_cleanup = ZSTDCleanup;
+ /*
+ * Setup predictor setup.
+ */
+ (void)TIFFPredictorInit(tif);
+ return 1;
+bad:
+ TIFFErrorExtR(tif, module, "No space for ZSTD state block");
+ return 0;
+}
+#endif /* ZSTD_SUPPORT */
diff --git a/src/3rdparty/libtiff/libtiff/tiff.h b/src/3rdparty/libtiff/libtiff/tiff.h
index 5b0a0c9..285a968 100644
--- a/src/3rdparty/libtiff/libtiff/tiff.h
+++ b/src/3rdparty/libtiff/libtiff/tiff.h
@@ -2,28 +2,28 @@
* Copyright (c) 1988-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
#ifndef _TIFF_
-#define _TIFF_
+#define _TIFF_
#include "tiffconf.h"
@@ -48,32 +48,46 @@
#define TIFF_VERSION_CLASSIC 42
#define TIFF_VERSION_BIG 43
-#define TIFF_BIGENDIAN 0x4d4d
-#define TIFF_LITTLEENDIAN 0x4949
-#define MDI_LITTLEENDIAN 0x5045
-#define MDI_BIGENDIAN 0x4550
+#define TIFF_BIGENDIAN 0x4d4d
+#define TIFF_LITTLEENDIAN 0x4949
+#define MDI_LITTLEENDIAN 0x5045
+#define MDI_BIGENDIAN 0x4550
/*
* Intrinsic data types required by the file format:
*
- * 8-bit quantities int8/uint8
- * 16-bit quantities int16/uint16
- * 32-bit quantities int32/uint32
- * 64-bit quantities int64/uint64
+ * 8-bit quantities int8_t/uint_8_t
+ * 16-bit quantities int16_t/uint_16_t
+ * 32-bit quantities int32_t/uint_32_t
+ * 64-bit quantities int64_t/uint_64_t
* strings unsigned char*
*/
+#ifdef __GNUC__
+#define TIFF_GCC_DEPRECATED __attribute__((deprecated))
+#else
+#define TIFF_GCC_DEPRECATED
+#endif
+#ifdef _MSC_VER
+#define TIFF_MSC_DEPRECATED \
+ __declspec(deprecated("libtiff type deprecated; please use corresponding " \
+ "C99 stdint.h type"))
+#else
+#define TIFF_MSC_DEPRECATED
+#endif
-typedef TIFF_INT8_T int8;
-typedef TIFF_UINT8_T uint8;
+#ifndef TIFF_DISABLE_DEPRECATED
+typedef TIFF_MSC_DEPRECATED int8_t int8 TIFF_GCC_DEPRECATED;
+typedef TIFF_MSC_DEPRECATED uint8_t uint8 TIFF_GCC_DEPRECATED;
-typedef TIFF_INT16_T int16;
-typedef TIFF_UINT16_T uint16;
+typedef TIFF_MSC_DEPRECATED int16_t int16 TIFF_GCC_DEPRECATED;
+typedef TIFF_MSC_DEPRECATED uint16_t uint16 TIFF_GCC_DEPRECATED;
-typedef TIFF_INT32_T int32;
-typedef TIFF_UINT32_T uint32;
+typedef TIFF_MSC_DEPRECATED int32_t int32 TIFF_GCC_DEPRECATED;
+typedef TIFF_MSC_DEPRECATED uint32_t uint32 TIFF_GCC_DEPRECATED;
-typedef TIFF_INT64_T int64;
-typedef TIFF_UINT64_T uint64;
+typedef TIFF_MSC_DEPRECATED int64_t int64 TIFF_GCC_DEPRECATED;
+typedef TIFF_MSC_DEPRECATED uint64_t uint64 TIFF_GCC_DEPRECATED;
+#endif /* TIFF_DISABLE_DEPRECATED */
/*
* Some types as promoted in a variable argument list
@@ -88,24 +102,26 @@ typedef int uint16_vap;
/*
* TIFF header.
*/
-typedef struct {
- uint16 tiff_magic; /* magic number (defines byte order) */
- uint16 tiff_version; /* TIFF version number */
+typedef struct
+{
+ uint16_t tiff_magic; /* magic number (defines byte order) */
+ uint16_t tiff_version; /* TIFF version number */
} TIFFHeaderCommon;
-typedef struct {
- uint16 tiff_magic; /* magic number (defines byte order) */
- uint16 tiff_version; /* TIFF version number */
- uint32 tiff_diroff; /* byte offset to first directory */
+typedef struct
+{
+ uint16_t tiff_magic; /* magic number (defines byte order) */
+ uint16_t tiff_version; /* TIFF version number */
+ uint32_t tiff_diroff; /* byte offset to first directory */
} TIFFHeaderClassic;
-typedef struct {
- uint16 tiff_magic; /* magic number (defines byte order) */
- uint16 tiff_version; /* TIFF version number */
- uint16 tiff_offsetsize; /* size of offsets, should be 8 */
- uint16 tiff_unused; /* unused word, should be 0 */
- uint64 tiff_diroff; /* byte offset to first directory */
+typedef struct
+{
+ uint16_t tiff_magic; /* magic number (defines byte order) */
+ uint16_t tiff_version; /* TIFF version number */
+ uint16_t tiff_offsetsize; /* size of offsets, should be 8 */
+ uint16_t tiff_unused; /* unused word, should be 0 */
+ uint64_t tiff_diroff; /* byte offset to first directory */
} TIFFHeaderBig;
-
/*
* NB: In the comments below,
* - items marked with a + are obsoleted by revision 5.0,
@@ -119,424 +135,545 @@ typedef struct {
* Tag data type information.
*
* Note: RATIONALs are the ratio of two 32-bit integer values.
+ *--:
+ * Note2: TIFF_IFD8 data type is used in tiffFields[]-tag definition in order to
+ distinguish the write-handling of those tags between ClassicTIFF and BigTiff:
+ For ClassicTIFF libtiff writes a 32-bit value and the TIFF_IFD
+ type-id into the file For BigTIFF libtiff writes a 64-bit value and the
+ TIFF_IFD8 type-id into the file
*/
-typedef enum {
- TIFF_NOTYPE = 0, /* placeholder */
- TIFF_BYTE = 1, /* 8-bit unsigned integer */
- TIFF_ASCII = 2, /* 8-bit bytes w/ last byte null */
- TIFF_SHORT = 3, /* 16-bit unsigned integer */
- TIFF_LONG = 4, /* 32-bit unsigned integer */
- TIFF_RATIONAL = 5, /* 64-bit unsigned fraction */
- TIFF_SBYTE = 6, /* !8-bit signed integer */
- TIFF_UNDEFINED = 7, /* !8-bit untyped data */
- TIFF_SSHORT = 8, /* !16-bit signed integer */
- TIFF_SLONG = 9, /* !32-bit signed integer */
- TIFF_SRATIONAL = 10, /* !64-bit signed fraction */
- TIFF_FLOAT = 11, /* !32-bit IEEE floating point */
- TIFF_DOUBLE = 12, /* !64-bit IEEE floating point */
- TIFF_IFD = 13, /* %32-bit unsigned integer (offset) */
- TIFF_LONG8 = 16, /* BigTIFF 64-bit unsigned integer */
- TIFF_SLONG8 = 17, /* BigTIFF 64-bit signed integer */
- TIFF_IFD8 = 18 /* BigTIFF 64-bit unsigned integer (offset) */
+typedef enum
+{
+ TIFF_NOTYPE = 0, /* placeholder */
+ TIFF_BYTE = 1, /* 8-bit unsigned integer */
+ TIFF_ASCII = 2, /* 8-bit bytes w/ last byte null */
+ TIFF_SHORT = 3, /* 16-bit unsigned integer */
+ TIFF_LONG = 4, /* 32-bit unsigned integer */
+ TIFF_RATIONAL = 5, /* 64-bit unsigned fraction */
+ TIFF_SBYTE = 6, /* !8-bit signed integer */
+ TIFF_UNDEFINED = 7, /* !8-bit untyped data */
+ TIFF_SSHORT = 8, /* !16-bit signed integer */
+ TIFF_SLONG = 9, /* !32-bit signed integer */
+ TIFF_SRATIONAL = 10, /* !64-bit signed fraction */
+ TIFF_FLOAT = 11, /* !32-bit IEEE floating point */
+ TIFF_DOUBLE = 12, /* !64-bit IEEE floating point */
+ TIFF_IFD = 13, /* %32-bit unsigned integer (offset) */
+ TIFF_LONG8 = 16, /* BigTIFF 64-bit unsigned integer */
+ TIFF_SLONG8 = 17, /* BigTIFF 64-bit signed integer */
+ TIFF_IFD8 = 18 /* BigTIFF 64-bit unsigned integer (offset) */
} TIFFDataType;
/*
* TIFF Tag Definitions.
*/
-#define TIFFTAG_SUBFILETYPE 254 /* subfile data descriptor */
-#define FILETYPE_REDUCEDIMAGE 0x1 /* reduced resolution version */
-#define FILETYPE_PAGE 0x2 /* one page of many */
-#define FILETYPE_MASK 0x4 /* transparency mask */
-#define TIFFTAG_OSUBFILETYPE 255 /* +kind of data in subfile */
-#define OFILETYPE_IMAGE 1 /* full resolution image data */
-#define OFILETYPE_REDUCEDIMAGE 2 /* reduced size image data */
-#define OFILETYPE_PAGE 3 /* one page of many */
-#define TIFFTAG_IMAGEWIDTH 256 /* image width in pixels */
-#define TIFFTAG_IMAGELENGTH 257 /* image height in pixels */
-#define TIFFTAG_BITSPERSAMPLE 258 /* bits per channel (sample) */
-#define TIFFTAG_COMPRESSION 259 /* data compression technique */
-#define COMPRESSION_NONE 1 /* dump mode */
-#define COMPRESSION_CCITTRLE 2 /* CCITT modified Huffman RLE */
-#define COMPRESSION_CCITTFAX3 3 /* CCITT Group 3 fax encoding */
-#define COMPRESSION_CCITT_T4 3 /* CCITT T.4 (TIFF 6 name) */
-#define COMPRESSION_CCITTFAX4 4 /* CCITT Group 4 fax encoding */
-#define COMPRESSION_CCITT_T6 4 /* CCITT T.6 (TIFF 6 name) */
-#define COMPRESSION_LZW 5 /* Lempel-Ziv & Welch */
-#define COMPRESSION_OJPEG 6 /* !6.0 JPEG */
-#define COMPRESSION_JPEG 7 /* %JPEG DCT compression */
-#define COMPRESSION_T85 9 /* !TIFF/FX T.85 JBIG compression */
-#define COMPRESSION_T43 10 /* !TIFF/FX T.43 colour by layered JBIG compression */
-#define COMPRESSION_NEXT 32766 /* NeXT 2-bit RLE */
-#define COMPRESSION_CCITTRLEW 32771 /* #1 w/ word alignment */
-#define COMPRESSION_PACKBITS 32773 /* Macintosh RLE */
-#define COMPRESSION_THUNDERSCAN 32809 /* ThunderScan RLE */
+#define TIFFTAG_SUBFILETYPE 254 /* subfile data descriptor */
+#define FILETYPE_REDUCEDIMAGE 0x1 /* reduced resolution version */
+#define FILETYPE_PAGE 0x2 /* one page of many */
+#define FILETYPE_MASK 0x4 /* transparency mask */
+#define TIFFTAG_OSUBFILETYPE 255 /* +kind of data in subfile */
+#define OFILETYPE_IMAGE 1 /* full resolution image data */
+#define OFILETYPE_REDUCEDIMAGE 2 /* reduced size image data */
+#define OFILETYPE_PAGE 3 /* one page of many */
+#define TIFFTAG_IMAGEWIDTH 256 /* image width in pixels */
+#define TIFFTAG_IMAGELENGTH 257 /* image height in pixels */
+#define TIFFTAG_BITSPERSAMPLE 258 /* bits per channel (sample) */
+#define TIFFTAG_COMPRESSION 259 /* data compression technique */
+#define COMPRESSION_NONE 1 /* dump mode */
+#define COMPRESSION_CCITTRLE 2 /* CCITT modified Huffman RLE */
+#define COMPRESSION_CCITTFAX3 3 /* CCITT Group 3 fax encoding */
+#define COMPRESSION_CCITT_T4 3 /* CCITT T.4 (TIFF 6 name) */
+#define COMPRESSION_CCITTFAX4 4 /* CCITT Group 4 fax encoding */
+#define COMPRESSION_CCITT_T6 4 /* CCITT T.6 (TIFF 6 name) */
+#define COMPRESSION_LZW 5 /* Lempel-Ziv & Welch */
+#define COMPRESSION_OJPEG 6 /* !6.0 JPEG */
+#define COMPRESSION_JPEG 7 /* %JPEG DCT compression */
+#define COMPRESSION_T85 9 /* !TIFF/FX T.85 JBIG compression */
+#define COMPRESSION_T43 \
+ 10 /* !TIFF/FX T.43 colour by layered JBIG compression */
+#define COMPRESSION_NEXT 32766 /* NeXT 2-bit RLE */
+#define COMPRESSION_CCITTRLEW 32771 /* #1 w/ word alignment */
+#define COMPRESSION_PACKBITS 32773 /* Macintosh RLE */
+#define COMPRESSION_THUNDERSCAN 32809 /* ThunderScan RLE */
/* codes 32895-32898 are reserved for ANSI IT8 TIFF/IT <dkelly@apago.com) */
-#define COMPRESSION_IT8CTPAD 32895 /* IT8 CT w/padding */
-#define COMPRESSION_IT8LW 32896 /* IT8 Linework RLE */
-#define COMPRESSION_IT8MP 32897 /* IT8 Monochrome picture */
-#define COMPRESSION_IT8BL 32898 /* IT8 Binary line art */
+#define COMPRESSION_IT8CTPAD 32895 /* IT8 CT w/padding */
+#define COMPRESSION_IT8LW 32896 /* IT8 Linework RLE */
+#define COMPRESSION_IT8MP 32897 /* IT8 Monochrome picture */
+#define COMPRESSION_IT8BL 32898 /* IT8 Binary line art */
/* compression codes 32908-32911 are reserved for Pixar */
-#define COMPRESSION_PIXARFILM 32908 /* Pixar companded 10bit LZW */
-#define COMPRESSION_PIXARLOG 32909 /* Pixar companded 11bit ZIP */
-#define COMPRESSION_DEFLATE 32946 /* Deflate compression */
-#define COMPRESSION_ADOBE_DEFLATE 8 /* Deflate compression,
- as recognized by Adobe */
+#define COMPRESSION_PIXARFILM 32908 /* Pixar companded 10bit LZW */
+#define COMPRESSION_PIXARLOG 32909 /* Pixar companded 11bit ZIP */
+#define COMPRESSION_DEFLATE 32946 /* Deflate compression, legacy tag */
+#define COMPRESSION_ADOBE_DEFLATE \
+ 8 /* Deflate compression, \
+ as recognized by Adobe */
/* compression code 32947 is reserved for Oceana Matrix <dev@oceana.com> */
-#define COMPRESSION_DCS 32947 /* Kodak DCS encoding */
-#define COMPRESSION_JBIG 34661 /* ISO JBIG */
-#define COMPRESSION_SGILOG 34676 /* SGI Log Luminance RLE */
-#define COMPRESSION_SGILOG24 34677 /* SGI Log 24-bit packed */
-#define COMPRESSION_JP2000 34712 /* Leadtools JPEG2000 */
-#define COMPRESSION_LERC 34887 /* ESRI Lerc codec: https://github.com/Esri/lerc */
+#define COMPRESSION_DCS 32947 /* Kodak DCS encoding */
+#define COMPRESSION_JBIG 34661 /* ISO JBIG */
+#define COMPRESSION_SGILOG 34676 /* SGI Log Luminance RLE */
+#define COMPRESSION_SGILOG24 34677 /* SGI Log 24-bit packed */
+#define COMPRESSION_JP2000 34712 /* Leadtools JPEG2000 */
+#define COMPRESSION_LERC \
+ 34887 /* ESRI Lerc codec: https://github.com/Esri/lerc */
/* compression codes 34887-34889 are reserved for ESRI */
-#define COMPRESSION_LZMA 34925 /* LZMA2 */
-#define COMPRESSION_ZSTD 50000 /* ZSTD: WARNING not registered in Adobe-maintained registry */
-#define COMPRESSION_WEBP 50001 /* WEBP: WARNING not registered in Adobe-maintained registry */
-#define TIFFTAG_PHOTOMETRIC 262 /* photometric interpretation */
-#define PHOTOMETRIC_MINISWHITE 0 /* min value is white */
-#define PHOTOMETRIC_MINISBLACK 1 /* min value is black */
-#define PHOTOMETRIC_RGB 2 /* RGB color model */
-#define PHOTOMETRIC_PALETTE 3 /* color map indexed */
-#define PHOTOMETRIC_MASK 4 /* $holdout mask */
-#define PHOTOMETRIC_SEPARATED 5 /* !color separations */
-#define PHOTOMETRIC_YCBCR 6 /* !CCIR 601 */
-#define PHOTOMETRIC_CIELAB 8 /* !1976 CIE L*a*b* */
-#define PHOTOMETRIC_ICCLAB 9 /* ICC L*a*b* [Adobe TIFF Technote 4] */
-#define PHOTOMETRIC_ITULAB 10 /* ITU L*a*b* */
-#define PHOTOMETRIC_CFA 32803 /* color filter array */
-#define PHOTOMETRIC_LOGL 32844 /* CIE Log2(L) */
-#define PHOTOMETRIC_LOGLUV 32845 /* CIE Log2(L) (u',v') */
-#define TIFFTAG_THRESHHOLDING 263 /* +thresholding used on data */
-#define THRESHHOLD_BILEVEL 1 /* b&w art scan */
-#define THRESHHOLD_HALFTONE 2 /* or dithered scan */
-#define THRESHHOLD_ERRORDIFFUSE 3 /* usually floyd-steinberg */
-#define TIFFTAG_CELLWIDTH 264 /* +dithering matrix width */
-#define TIFFTAG_CELLLENGTH 265 /* +dithering matrix height */
-#define TIFFTAG_FILLORDER 266 /* data order within a byte */
-#define FILLORDER_MSB2LSB 1 /* most significant -> least */
-#define FILLORDER_LSB2MSB 2 /* least significant -> most */
-#define TIFFTAG_DOCUMENTNAME 269 /* name of doc. image is from */
-#define TIFFTAG_IMAGEDESCRIPTION 270 /* info about image */
-#define TIFFTAG_MAKE 271 /* scanner manufacturer name */
-#define TIFFTAG_MODEL 272 /* scanner model name/number */
-#define TIFFTAG_STRIPOFFSETS 273 /* offsets to data strips */
-#define TIFFTAG_ORIENTATION 274 /* +image orientation */
-#define ORIENTATION_TOPLEFT 1 /* row 0 top, col 0 lhs */
-#define ORIENTATION_TOPRIGHT 2 /* row 0 top, col 0 rhs */
-#define ORIENTATION_BOTRIGHT 3 /* row 0 bottom, col 0 rhs */
-#define ORIENTATION_BOTLEFT 4 /* row 0 bottom, col 0 lhs */
-#define ORIENTATION_LEFTTOP 5 /* row 0 lhs, col 0 top */
-#define ORIENTATION_RIGHTTOP 6 /* row 0 rhs, col 0 top */
-#define ORIENTATION_RIGHTBOT 7 /* row 0 rhs, col 0 bottom */
-#define ORIENTATION_LEFTBOT 8 /* row 0 lhs, col 0 bottom */
-#define TIFFTAG_SAMPLESPERPIXEL 277 /* samples per pixel */
-#define TIFFTAG_ROWSPERSTRIP 278 /* rows per strip of data */
-#define TIFFTAG_STRIPBYTECOUNTS 279 /* bytes counts for strips */
-#define TIFFTAG_MINSAMPLEVALUE 280 /* +minimum sample value */
-#define TIFFTAG_MAXSAMPLEVALUE 281 /* +maximum sample value */
-#define TIFFTAG_XRESOLUTION 282 /* pixels/resolution in x */
-#define TIFFTAG_YRESOLUTION 283 /* pixels/resolution in y */
-#define TIFFTAG_PLANARCONFIG 284 /* storage organization */
-#define PLANARCONFIG_CONTIG 1 /* single image plane */
-#define PLANARCONFIG_SEPARATE 2 /* separate planes of data */
-#define TIFFTAG_PAGENAME 285 /* page name image is from */
-#define TIFFTAG_XPOSITION 286 /* x page offset of image lhs */
-#define TIFFTAG_YPOSITION 287 /* y page offset of image lhs */
-#define TIFFTAG_FREEOFFSETS 288 /* +byte offset to free block */
-#define TIFFTAG_FREEBYTECOUNTS 289 /* +sizes of free blocks */
-#define TIFFTAG_GRAYRESPONSEUNIT 290 /* $gray scale curve accuracy */
-#define GRAYRESPONSEUNIT_10S 1 /* tenths of a unit */
-#define GRAYRESPONSEUNIT_100S 2 /* hundredths of a unit */
-#define GRAYRESPONSEUNIT_1000S 3 /* thousandths of a unit */
-#define GRAYRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */
-#define GRAYRESPONSEUNIT_100000S 5 /* hundred-thousandths */
-#define TIFFTAG_GRAYRESPONSECURVE 291 /* $gray scale response curve */
-#define TIFFTAG_GROUP3OPTIONS 292 /* 32 flag bits */
-#define TIFFTAG_T4OPTIONS 292 /* TIFF 6.0 proper name alias */
-#define GROUP3OPT_2DENCODING 0x1 /* 2-dimensional coding */
-#define GROUP3OPT_UNCOMPRESSED 0x2 /* data not compressed */
-#define GROUP3OPT_FILLBITS 0x4 /* fill to byte boundary */
-#define TIFFTAG_GROUP4OPTIONS 293 /* 32 flag bits */
-#define TIFFTAG_T6OPTIONS 293 /* TIFF 6.0 proper name */
-#define GROUP4OPT_UNCOMPRESSED 0x2 /* data not compressed */
-#define TIFFTAG_RESOLUTIONUNIT 296 /* units of resolutions */
-#define RESUNIT_NONE 1 /* no meaningful units */
-#define RESUNIT_INCH 2 /* english */
-#define RESUNIT_CENTIMETER 3 /* metric */
-#define TIFFTAG_PAGENUMBER 297 /* page numbers of multi-page */
-#define TIFFTAG_COLORRESPONSEUNIT 300 /* $color curve accuracy */
-#define COLORRESPONSEUNIT_10S 1 /* tenths of a unit */
-#define COLORRESPONSEUNIT_100S 2 /* hundredths of a unit */
-#define COLORRESPONSEUNIT_1000S 3 /* thousandths of a unit */
-#define COLORRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */
-#define COLORRESPONSEUNIT_100000S 5 /* hundred-thousandths */
-#define TIFFTAG_TRANSFERFUNCTION 301 /* !colorimetry info */
-#define TIFFTAG_SOFTWARE 305 /* name & release */
-#define TIFFTAG_DATETIME 306 /* creation date and time */
-#define TIFFTAG_ARTIST 315 /* creator of image */
-#define TIFFTAG_HOSTCOMPUTER 316 /* machine where created */
-#define TIFFTAG_PREDICTOR 317 /* prediction scheme w/ LZW */
-#define PREDICTOR_NONE 1 /* no prediction scheme used */
-#define PREDICTOR_HORIZONTAL 2 /* horizontal differencing */
-#define PREDICTOR_FLOATINGPOINT 3 /* floating point predictor */
-#define TIFFTAG_WHITEPOINT 318 /* image white point */
-#define TIFFTAG_PRIMARYCHROMATICITIES 319 /* !primary chromaticities */
-#define TIFFTAG_COLORMAP 320 /* RGB map for palette image */
-#define TIFFTAG_HALFTONEHINTS 321 /* !highlight+shadow info */
-#define TIFFTAG_TILEWIDTH 322 /* !tile width in pixels */
-#define TIFFTAG_TILELENGTH 323 /* !tile height in pixels */
-#define TIFFTAG_TILEOFFSETS 324 /* !offsets to data tiles */
-#define TIFFTAG_TILEBYTECOUNTS 325 /* !byte counts for tiles */
-#define TIFFTAG_BADFAXLINES 326 /* lines w/ wrong pixel count */
-#define TIFFTAG_CLEANFAXDATA 327 /* regenerated line info */
-#define CLEANFAXDATA_CLEAN 0 /* no errors detected */
-#define CLEANFAXDATA_REGENERATED 1 /* receiver regenerated lines */
-#define CLEANFAXDATA_UNCLEAN 2 /* uncorrected errors exist */
-#define TIFFTAG_CONSECUTIVEBADFAXLINES 328 /* max consecutive bad lines */
-#define TIFFTAG_SUBIFD 330 /* subimage descriptors */
-#define TIFFTAG_INKSET 332 /* !inks in separated image */
-#define INKSET_CMYK 1 /* !cyan-magenta-yellow-black color */
-#define INKSET_MULTIINK 2 /* !multi-ink or hi-fi color */
-#define TIFFTAG_INKNAMES 333 /* !ascii names of inks */
-#define TIFFTAG_NUMBEROFINKS 334 /* !number of inks */
-#define TIFFTAG_DOTRANGE 336 /* !0% and 100% dot codes */
-#define TIFFTAG_TARGETPRINTER 337 /* !separation target */
-#define TIFFTAG_EXTRASAMPLES 338 /* !info about extra samples */
-#define EXTRASAMPLE_UNSPECIFIED 0 /* !unspecified data */
-#define EXTRASAMPLE_ASSOCALPHA 1 /* !associated alpha data */
-#define EXTRASAMPLE_UNASSALPHA 2 /* !unassociated alpha data */
-#define TIFFTAG_SAMPLEFORMAT 339 /* !data sample format */
-#define SAMPLEFORMAT_UINT 1 /* !unsigned integer data */
-#define SAMPLEFORMAT_INT 2 /* !signed integer data */
-#define SAMPLEFORMAT_IEEEFP 3 /* !IEEE floating point data */
-#define SAMPLEFORMAT_VOID 4 /* !untyped data */
-#define SAMPLEFORMAT_COMPLEXINT 5 /* !complex signed int */
-#define SAMPLEFORMAT_COMPLEXIEEEFP 6 /* !complex ieee floating */
-#define TIFFTAG_SMINSAMPLEVALUE 340 /* !variable MinSampleValue */
-#define TIFFTAG_SMAXSAMPLEVALUE 341 /* !variable MaxSampleValue */
-#define TIFFTAG_CLIPPATH 343 /* %ClipPath
- [Adobe TIFF technote 2] */
-#define TIFFTAG_XCLIPPATHUNITS 344 /* %XClipPathUnits
- [Adobe TIFF technote 2] */
-#define TIFFTAG_YCLIPPATHUNITS 345 /* %YClipPathUnits
- [Adobe TIFF technote 2] */
-#define TIFFTAG_INDEXED 346 /* %Indexed
- [Adobe TIFF Technote 3] */
-#define TIFFTAG_JPEGTABLES 347 /* %JPEG table stream */
-#define TIFFTAG_OPIPROXY 351 /* %OPI Proxy [Adobe TIFF technote] */
+#define COMPRESSION_LZMA 34925 /* LZMA2 */
+#define COMPRESSION_ZSTD \
+ 50000 /* ZSTD: WARNING not registered in Adobe-maintained registry */
+#define COMPRESSION_WEBP \
+ 50001 /* WEBP: WARNING not registered in Adobe-maintained registry */
+#define COMPRESSION_JXL \
+ 50002 /* JPEGXL: WARNING not registered in Adobe-maintained registry */
+#define TIFFTAG_PHOTOMETRIC 262 /* photometric interpretation */
+#define PHOTOMETRIC_MINISWHITE 0 /* min value is white */
+#define PHOTOMETRIC_MINISBLACK 1 /* min value is black */
+#define PHOTOMETRIC_RGB 2 /* RGB color model */
+#define PHOTOMETRIC_PALETTE 3 /* color map indexed */
+#define PHOTOMETRIC_MASK 4 /* $holdout mask */
+#define PHOTOMETRIC_SEPARATED 5 /* !color separations */
+#define PHOTOMETRIC_YCBCR 6 /* !CCIR 601 */
+#define PHOTOMETRIC_CIELAB 8 /* !1976 CIE L*a*b* */
+#define PHOTOMETRIC_ICCLAB 9 /* ICC L*a*b* [Adobe TIFF Technote 4] */
+#define PHOTOMETRIC_ITULAB 10 /* ITU L*a*b* */
+#define PHOTOMETRIC_CFA 32803 /* color filter array */
+#define PHOTOMETRIC_LOGL 32844 /* CIE Log2(L) */
+#define PHOTOMETRIC_LOGLUV 32845 /* CIE Log2(L) (u',v') */
+#define TIFFTAG_THRESHHOLDING 263 /* +thresholding used on data */
+#define THRESHHOLD_BILEVEL 1 /* b&w art scan */
+#define THRESHHOLD_HALFTONE 2 /* or dithered scan */
+#define THRESHHOLD_ERRORDIFFUSE 3 /* usually floyd-steinberg */
+#define TIFFTAG_CELLWIDTH 264 /* +dithering matrix width */
+#define TIFFTAG_CELLLENGTH 265 /* +dithering matrix height */
+#define TIFFTAG_FILLORDER 266 /* data order within a byte */
+#define FILLORDER_MSB2LSB 1 /* most significant -> least */
+#define FILLORDER_LSB2MSB 2 /* least significant -> most */
+#define TIFFTAG_DOCUMENTNAME 269 /* name of doc. image is from */
+#define TIFFTAG_IMAGEDESCRIPTION 270 /* info about image */
+#define TIFFTAG_MAKE 271 /* scanner manufacturer name */
+#define TIFFTAG_MODEL 272 /* scanner model name/number */
+#define TIFFTAG_STRIPOFFSETS 273 /* offsets to data strips */
+#define TIFFTAG_ORIENTATION 274 /* +image orientation */
+#define ORIENTATION_TOPLEFT 1 /* row 0 top, col 0 lhs */
+#define ORIENTATION_TOPRIGHT 2 /* row 0 top, col 0 rhs */
+#define ORIENTATION_BOTRIGHT 3 /* row 0 bottom, col 0 rhs */
+#define ORIENTATION_BOTLEFT 4 /* row 0 bottom, col 0 lhs */
+#define ORIENTATION_LEFTTOP 5 /* row 0 lhs, col 0 top */
+#define ORIENTATION_RIGHTTOP 6 /* row 0 rhs, col 0 top */
+#define ORIENTATION_RIGHTBOT 7 /* row 0 rhs, col 0 bottom */
+#define ORIENTATION_LEFTBOT 8 /* row 0 lhs, col 0 bottom */
+#define TIFFTAG_SAMPLESPERPIXEL 277 /* samples per pixel */
+#define TIFFTAG_ROWSPERSTRIP 278 /* rows per strip of data */
+#define TIFFTAG_STRIPBYTECOUNTS 279 /* bytes counts for strips */
+#define TIFFTAG_MINSAMPLEVALUE 280 /* +minimum sample value */
+#define TIFFTAG_MAXSAMPLEVALUE 281 /* +maximum sample value */
+#define TIFFTAG_XRESOLUTION 282 /* pixels/resolution in x */
+#define TIFFTAG_YRESOLUTION 283 /* pixels/resolution in y */
+#define TIFFTAG_PLANARCONFIG 284 /* storage organization */
+#define PLANARCONFIG_CONTIG 1 /* single image plane */
+#define PLANARCONFIG_SEPARATE 2 /* separate planes of data */
+#define TIFFTAG_PAGENAME 285 /* page name image is from */
+#define TIFFTAG_XPOSITION 286 /* x page offset of image lhs */
+#define TIFFTAG_YPOSITION 287 /* y page offset of image lhs */
+#define TIFFTAG_FREEOFFSETS 288 /* +byte offset to free block */
+#define TIFFTAG_FREEBYTECOUNTS 289 /* +sizes of free blocks */
+#define TIFFTAG_GRAYRESPONSEUNIT 290 /* $gray scale curve accuracy */
+#define GRAYRESPONSEUNIT_10S 1 /* tenths of a unit */
+#define GRAYRESPONSEUNIT_100S 2 /* hundredths of a unit */
+#define GRAYRESPONSEUNIT_1000S 3 /* thousandths of a unit */
+#define GRAYRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */
+#define GRAYRESPONSEUNIT_100000S 5 /* hundred-thousandths */
+#define TIFFTAG_GRAYRESPONSECURVE 291 /* $gray scale response curve */
+#define TIFFTAG_GROUP3OPTIONS 292 /* 32 flag bits */
+#define TIFFTAG_T4OPTIONS 292 /* TIFF 6.0 proper name alias */
+#define GROUP3OPT_2DENCODING 0x1 /* 2-dimensional coding */
+#define GROUP3OPT_UNCOMPRESSED 0x2 /* data not compressed */
+#define GROUP3OPT_FILLBITS 0x4 /* fill to byte boundary */
+#define TIFFTAG_GROUP4OPTIONS 293 /* 32 flag bits */
+#define TIFFTAG_T6OPTIONS 293 /* TIFF 6.0 proper name */
+#define GROUP4OPT_UNCOMPRESSED 0x2 /* data not compressed */
+#define TIFFTAG_RESOLUTIONUNIT 296 /* units of resolutions */
+#define RESUNIT_NONE 1 /* no meaningful units */
+#define RESUNIT_INCH 2 /* english */
+#define RESUNIT_CENTIMETER 3 /* metric */
+#define TIFFTAG_PAGENUMBER 297 /* page numbers of multi-page */
+#define TIFFTAG_COLORRESPONSEUNIT 300 /* $color curve accuracy */
+#define COLORRESPONSEUNIT_10S 1 /* tenths of a unit */
+#define COLORRESPONSEUNIT_100S 2 /* hundredths of a unit */
+#define COLORRESPONSEUNIT_1000S 3 /* thousandths of a unit */
+#define COLORRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */
+#define COLORRESPONSEUNIT_100000S 5 /* hundred-thousandths */
+#define TIFFTAG_TRANSFERFUNCTION 301 /* !colorimetry info */
+#define TIFFTAG_SOFTWARE 305 /* name & release */
+#define TIFFTAG_DATETIME 306 /* creation date and time */
+#define TIFFTAG_ARTIST 315 /* creator of image */
+#define TIFFTAG_HOSTCOMPUTER 316 /* machine where created */
+#define TIFFTAG_PREDICTOR 317 /* prediction scheme w/ LZW */
+#define PREDICTOR_NONE 1 /* no prediction scheme used */
+#define PREDICTOR_HORIZONTAL 2 /* horizontal differencing */
+#define PREDICTOR_FLOATINGPOINT 3 /* floating point predictor */
+#define TIFFTAG_WHITEPOINT 318 /* image white point */
+#define TIFFTAG_PRIMARYCHROMATICITIES 319 /* !primary chromaticities */
+#define TIFFTAG_COLORMAP 320 /* RGB map for palette image */
+#define TIFFTAG_HALFTONEHINTS 321 /* !highlight+shadow info */
+#define TIFFTAG_TILEWIDTH 322 /* !tile width in pixels */
+#define TIFFTAG_TILELENGTH 323 /* !tile height in pixels */
+#define TIFFTAG_TILEOFFSETS 324 /* !offsets to data tiles */
+#define TIFFTAG_TILEBYTECOUNTS 325 /* !byte counts for tiles */
+#define TIFFTAG_BADFAXLINES 326 /* lines w/ wrong pixel count */
+#define TIFFTAG_CLEANFAXDATA 327 /* regenerated line info */
+#define CLEANFAXDATA_CLEAN 0 /* no errors detected */
+#define CLEANFAXDATA_REGENERATED 1 /* receiver regenerated lines */
+#define CLEANFAXDATA_UNCLEAN 2 /* uncorrected errors exist */
+#define TIFFTAG_CONSECUTIVEBADFAXLINES 328 /* max consecutive bad lines */
+#define TIFFTAG_SUBIFD 330 /* subimage descriptors */
+#define TIFFTAG_INKSET 332 /* !inks in separated image */
+#define INKSET_CMYK 1 /* !cyan-magenta-yellow-black color */
+#define INKSET_MULTIINK 2 /* !multi-ink or hi-fi color */
+#define TIFFTAG_INKNAMES 333 /* !ascii names of inks */
+#define TIFFTAG_NUMBEROFINKS 334 /* !number of inks */
+#define TIFFTAG_DOTRANGE 336 /* !0% and 100% dot codes */
+#define TIFFTAG_TARGETPRINTER 337 /* !separation target */
+#define TIFFTAG_EXTRASAMPLES 338 /* !info about extra samples */
+#define EXTRASAMPLE_UNSPECIFIED 0 /* !unspecified data */
+#define EXTRASAMPLE_ASSOCALPHA 1 /* !associated alpha data */
+#define EXTRASAMPLE_UNASSALPHA 2 /* !unassociated alpha data */
+#define TIFFTAG_SAMPLEFORMAT 339 /* !data sample format */
+#define SAMPLEFORMAT_UINT 1 /* !unsigned integer data */
+#define SAMPLEFORMAT_INT 2 /* !signed integer data */
+#define SAMPLEFORMAT_IEEEFP 3 /* !IEEE floating point data */
+#define SAMPLEFORMAT_VOID 4 /* !untyped data */
+#define SAMPLEFORMAT_COMPLEXINT 5 /* !complex signed int */
+#define SAMPLEFORMAT_COMPLEXIEEEFP 6 /* !complex ieee floating */
+#define TIFFTAG_SMINSAMPLEVALUE 340 /* !variable MinSampleValue */
+#define TIFFTAG_SMAXSAMPLEVALUE 341 /* !variable MaxSampleValue */
+#define TIFFTAG_CLIPPATH \
+ 343 /* %ClipPath \
+ [Adobe TIFF technote 2] */
+#define TIFFTAG_XCLIPPATHUNITS \
+ 344 /* %XClipPathUnits \
+ [Adobe TIFF technote 2] */
+#define TIFFTAG_YCLIPPATHUNITS \
+ 345 /* %YClipPathUnits \
+ [Adobe TIFF technote 2] */
+#define TIFFTAG_INDEXED \
+ 346 /* %Indexed \
+ [Adobe TIFF Technote 3] */
+#define TIFFTAG_JPEGTABLES 347 /* %JPEG table stream */
+#define TIFFTAG_OPIPROXY 351 /* %OPI Proxy [Adobe TIFF technote] */
/* Tags 400-435 are from the TIFF/FX spec */
-#define TIFFTAG_GLOBALPARAMETERSIFD 400 /* ! */
-#define TIFFTAG_PROFILETYPE 401 /* ! */
-#define PROFILETYPE_UNSPECIFIED 0 /* ! */
-#define PROFILETYPE_G3_FAX 1 /* ! */
-#define TIFFTAG_FAXPROFILE 402 /* ! */
-#define FAXPROFILE_S 1 /* !TIFF/FX FAX profile S */
-#define FAXPROFILE_F 2 /* !TIFF/FX FAX profile F */
-#define FAXPROFILE_J 3 /* !TIFF/FX FAX profile J */
-#define FAXPROFILE_C 4 /* !TIFF/FX FAX profile C */
-#define FAXPROFILE_L 5 /* !TIFF/FX FAX profile L */
-#define FAXPROFILE_M 6 /* !TIFF/FX FAX profile LM */
-#define TIFFTAG_CODINGMETHODS 403 /* !TIFF/FX coding methods */
-#define CODINGMETHODS_T4_1D (1 << 1) /* !T.4 1D */
-#define CODINGMETHODS_T4_2D (1 << 2) /* !T.4 2D */
-#define CODINGMETHODS_T6 (1 << 3) /* !T.6 */
-#define CODINGMETHODS_T85 (1 << 4) /* !T.85 JBIG */
-#define CODINGMETHODS_T42 (1 << 5) /* !T.42 JPEG */
-#define CODINGMETHODS_T43 (1 << 6) /* !T.43 colour by layered JBIG */
-#define TIFFTAG_VERSIONYEAR 404 /* !TIFF/FX version year */
-#define TIFFTAG_MODENUMBER 405 /* !TIFF/FX mode number */
-#define TIFFTAG_DECODE 433 /* !TIFF/FX decode */
-#define TIFFTAG_IMAGEBASECOLOR 434 /* !TIFF/FX image base colour */
-#define TIFFTAG_T82OPTIONS 435 /* !TIFF/FX T.82 options */
+#define TIFFTAG_GLOBALPARAMETERSIFD 400 /* ! */
+#define TIFFTAG_PROFILETYPE 401 /* ! */
+#define PROFILETYPE_UNSPECIFIED 0 /* ! */
+#define PROFILETYPE_G3_FAX 1 /* ! */
+#define TIFFTAG_FAXPROFILE 402 /* ! */
+#define FAXPROFILE_S 1 /* !TIFF/FX FAX profile S */
+#define FAXPROFILE_F 2 /* !TIFF/FX FAX profile F */
+#define FAXPROFILE_J 3 /* !TIFF/FX FAX profile J */
+#define FAXPROFILE_C 4 /* !TIFF/FX FAX profile C */
+#define FAXPROFILE_L 5 /* !TIFF/FX FAX profile L */
+#define FAXPROFILE_M 6 /* !TIFF/FX FAX profile LM */
+#define TIFFTAG_CODINGMETHODS 403 /* !TIFF/FX coding methods */
+#define CODINGMETHODS_T4_1D (1 << 1) /* !T.4 1D */
+#define CODINGMETHODS_T4_2D (1 << 2) /* !T.4 2D */
+#define CODINGMETHODS_T6 (1 << 3) /* !T.6 */
+#define CODINGMETHODS_T85 (1 << 4) /* !T.85 JBIG */
+#define CODINGMETHODS_T42 (1 << 5) /* !T.42 JPEG */
+#define CODINGMETHODS_T43 (1 << 6) /* !T.43 colour by layered JBIG */
+#define TIFFTAG_VERSIONYEAR 404 /* !TIFF/FX version year */
+#define TIFFTAG_MODENUMBER 405 /* !TIFF/FX mode number */
+#define TIFFTAG_DECODE 433 /* !TIFF/FX decode */
+#define TIFFTAG_IMAGEBASECOLOR 434 /* !TIFF/FX image base colour */
+#define TIFFTAG_T82OPTIONS 435 /* !TIFF/FX T.82 options */
/*
* Tags 512-521 are obsoleted by Technical Note #2 which specifies a
* revised JPEG-in-TIFF scheme.
*/
-#define TIFFTAG_JPEGPROC 512 /* !JPEG processing algorithm */
-#define JPEGPROC_BASELINE 1 /* !baseline sequential */
-#define JPEGPROC_LOSSLESS 14 /* !Huffman coded lossless */
-#define TIFFTAG_JPEGIFOFFSET 513 /* !pointer to SOI marker */
-#define TIFFTAG_JPEGIFBYTECOUNT 514 /* !JFIF stream length */
-#define TIFFTAG_JPEGRESTARTINTERVAL 515 /* !restart interval length */
-#define TIFFTAG_JPEGLOSSLESSPREDICTORS 517 /* !lossless proc predictor */
-#define TIFFTAG_JPEGPOINTTRANSFORM 518 /* !lossless point transform */
-#define TIFFTAG_JPEGQTABLES 519 /* !Q matrix offsets */
-#define TIFFTAG_JPEGDCTABLES 520 /* !DCT table offsets */
-#define TIFFTAG_JPEGACTABLES 521 /* !AC coefficient offsets */
-#define TIFFTAG_YCBCRCOEFFICIENTS 529 /* !RGB -> YCbCr transform */
-#define TIFFTAG_YCBCRSUBSAMPLING 530 /* !YCbCr subsampling factors */
-#define TIFFTAG_YCBCRPOSITIONING 531 /* !subsample positioning */
-#define YCBCRPOSITION_CENTERED 1 /* !as in PostScript Level 2 */
-#define YCBCRPOSITION_COSITED 2 /* !as in CCIR 601-1 */
-#define TIFFTAG_REFERENCEBLACKWHITE 532 /* !colorimetry info */
-#define TIFFTAG_STRIPROWCOUNTS 559 /* !TIFF/FX strip row counts */
-#define TIFFTAG_XMLPACKET 700 /* %XML packet
- [Adobe XMP Specification,
- January 2004 */
-#define TIFFTAG_OPIIMAGEID 32781 /* %OPI ImageID
- [Adobe TIFF technote] */
+#define TIFFTAG_JPEGPROC 512 /* !JPEG processing algorithm */
+#define JPEGPROC_BASELINE 1 /* !baseline sequential */
+#define JPEGPROC_LOSSLESS 14 /* !Huffman coded lossless */
+#define TIFFTAG_JPEGIFOFFSET 513 /* !pointer to SOI marker */
+#define TIFFTAG_JPEGIFBYTECOUNT 514 /* !JFIF stream length */
+#define TIFFTAG_JPEGRESTARTINTERVAL 515 /* !restart interval length */
+#define TIFFTAG_JPEGLOSSLESSPREDICTORS 517 /* !lossless proc predictor */
+#define TIFFTAG_JPEGPOINTTRANSFORM 518 /* !lossless point transform */
+#define TIFFTAG_JPEGQTABLES 519 /* !Q matrix offsets */
+#define TIFFTAG_JPEGDCTABLES 520 /* !DCT table offsets */
+#define TIFFTAG_JPEGACTABLES 521 /* !AC coefficient offsets */
+#define TIFFTAG_YCBCRCOEFFICIENTS 529 /* !RGB -> YCbCr transform */
+#define TIFFTAG_YCBCRSUBSAMPLING 530 /* !YCbCr subsampling factors */
+#define TIFFTAG_YCBCRPOSITIONING 531 /* !subsample positioning */
+#define YCBCRPOSITION_CENTERED 1 /* !as in PostScript Level 2 */
+#define YCBCRPOSITION_COSITED 2 /* !as in CCIR 601-1 */
+#define TIFFTAG_REFERENCEBLACKWHITE 532 /* !colorimetry info */
+#define TIFFTAG_STRIPROWCOUNTS 559 /* !TIFF/FX strip row counts */
+#define TIFFTAG_XMLPACKET \
+ 700 /* %XML packet \
+ [Adobe XMP Specification, \
+ January 2004 */
+#define TIFFTAG_OPIIMAGEID \
+ 32781 /* %OPI ImageID \
+ [Adobe TIFF technote] */
+#define TIFFTAG_TIFFANNOTATIONDATA \
+ 32932 /* http://web.archive.org/web/20050309141348/http://www.kofile.com/support%20pro/faqs/annospec.htm \
+ */
/* tags 32952-32956 are private tags registered to Island Graphics */
-#define TIFFTAG_REFPTS 32953 /* image reference points */
-#define TIFFTAG_REGIONTACKPOINT 32954 /* region-xform tack point */
-#define TIFFTAG_REGIONWARPCORNERS 32955 /* warp quadrilateral */
-#define TIFFTAG_REGIONAFFINE 32956 /* affine transformation mat */
+#define TIFFTAG_REFPTS 32953 /* image reference points */
+#define TIFFTAG_REGIONTACKPOINT 32954 /* region-xform tack point */
+#define TIFFTAG_REGIONWARPCORNERS 32955 /* warp quadrilateral */
+#define TIFFTAG_REGIONAFFINE 32956 /* affine transformation mat */
/* tags 32995-32999 are private tags registered to SGI */
-#define TIFFTAG_MATTEING 32995 /* $use ExtraSamples */
-#define TIFFTAG_DATATYPE 32996 /* $use SampleFormat */
-#define TIFFTAG_IMAGEDEPTH 32997 /* z depth of image */
-#define TIFFTAG_TILEDEPTH 32998 /* z depth/data tile */
+#define TIFFTAG_MATTEING 32995 /* $use ExtraSamples */
+#define TIFFTAG_DATATYPE 32996 /* $use SampleFormat */
+#define TIFFTAG_IMAGEDEPTH 32997 /* z depth of image */
+#define TIFFTAG_TILEDEPTH 32998 /* z depth/data tile */
/* tags 33300-33309 are private tags registered to Pixar */
/*
* TIFFTAG_PIXAR_IMAGEFULLWIDTH and TIFFTAG_PIXAR_IMAGEFULLLENGTH
- * are set when an image has been cropped out of a larger image.
+ * are set when an image has been cropped out of a larger image.
* They reflect the size of the original uncropped image.
* The TIFFTAG_XPOSITION and TIFFTAG_YPOSITION can be used
* to determine the position of the smaller image in the larger one.
*/
-#define TIFFTAG_PIXAR_IMAGEFULLWIDTH 33300 /* full image size in x */
-#define TIFFTAG_PIXAR_IMAGEFULLLENGTH 33301 /* full image size in y */
- /* Tags 33302-33306 are used to identify special image modes and data
- * used by Pixar's texture formats.
- */
-#define TIFFTAG_PIXAR_TEXTUREFORMAT 33302 /* texture map format */
-#define TIFFTAG_PIXAR_WRAPMODES 33303 /* s & t wrap modes */
-#define TIFFTAG_PIXAR_FOVCOT 33304 /* cotan(fov) for env. maps */
+#define TIFFTAG_PIXAR_IMAGEFULLWIDTH 33300 /* full image size in x */
+#define TIFFTAG_PIXAR_IMAGEFULLLENGTH 33301 /* full image size in y */
+/* Tags 33302-33306 are used to identify special image modes and data
+ * used by Pixar's texture formats.
+ */
+#define TIFFTAG_PIXAR_TEXTUREFORMAT 33302 /* texture map format */
+#define TIFFTAG_PIXAR_WRAPMODES 33303 /* s & t wrap modes */
+#define TIFFTAG_PIXAR_FOVCOT 33304 /* cotan(fov) for env. maps */
#define TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN 33305
#define TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA 33306
/* tag 33405 is a private tag registered to Eastman Kodak */
-#define TIFFTAG_WRITERSERIALNUMBER 33405 /* device serial number */
-#define TIFFTAG_CFAREPEATPATTERNDIM 33421 /* dimensions of CFA pattern */
-#define TIFFTAG_CFAPATTERN 33422 /* color filter array pattern */
+#define TIFFTAG_WRITERSERIALNUMBER 33405 /* device serial number */
+#define TIFFTAG_CFAREPEATPATTERNDIM 33421 /* dimensions of CFA pattern */
+#define TIFFTAG_CFAPATTERN 33422 /* color filter array pattern */
/* tag 33432 is listed in the 6.0 spec w/ unknown ownership */
-#define TIFFTAG_COPYRIGHT 33432 /* copyright string */
+#define TIFFTAG_COPYRIGHT 33432 /* copyright string */
+/* Tags 33445-33452 are used for GEL fileformat, see
+ * http://research.stowers-institute.org/mcm/efg/ScientificSoftware/Utility/TiffTags/GEL-FileFormat.pdf
+ */
+#define TIFFTAG_MD_FILETAG \
+ 33445 /* http://research.stowers-institute.org/mcm/efg/ScientificSoftware/Utility/TiffTags/GEL-FileFormat.pdf \
+ */
+#define TIFFTAG_MD_SCALEPIXEL \
+ 33446 /* http://research.stowers-institute.org/mcm/efg/ScientificSoftware/Utility/TiffTags/GEL-FileFormat.pdf \
+ */
+#define TIFFTAG_MD_COLORTABLE \
+ 33447 /* http://research.stowers-institute.org/mcm/efg/ScientificSoftware/Utility/TiffTags/GEL-FileFormat.pdf \
+ */
+#define TIFFTAG_MD_LABNAME \
+ 33448 /* http://research.stowers-institute.org/mcm/efg/ScientificSoftware/Utility/TiffTags/GEL-FileFormat.pdf \
+ */
+#define TIFFTAG_MD_SAMPLEINFO \
+ 33449 /* http://research.stowers-institute.org/mcm/efg/ScientificSoftware/Utility/TiffTags/GEL-FileFormat.pdf \
+ */
+#define TIFFTAG_MD_PREPDATE \
+ 33450 /* http://research.stowers-institute.org/mcm/efg/ScientificSoftware/Utility/TiffTags/GEL-FileFormat.pdf \
+ */
+#define TIFFTAG_MD_PREPTIME \
+ 33451 /* http://research.stowers-institute.org/mcm/efg/ScientificSoftware/Utility/TiffTags/GEL-FileFormat.pdf \
+ */
+#define TIFFTAG_MD_FILEUNITS \
+ 33452 /* http://research.stowers-institute.org/mcm/efg/ScientificSoftware/Utility/TiffTags/GEL-FileFormat.pdf \
+ */
/* IPTC TAG from RichTIFF specifications */
-#define TIFFTAG_RICHTIFFIPTC 33723
+#define TIFFTAG_RICHTIFFIPTC 33723
+#define TIFFTAG_INGR_PACKET_DATA_TAG \
+ 33918 /* Intergraph Application specific storage. */
+#define TIFFTAG_INGR_FLAG_REGISTERS \
+ 33919 /* Intergraph Application specific flags. */
+#define TIFFTAG_IRASB_TRANSORMATION_MATRIX \
+ 33920 /* Originally part of Intergraph's GeoTIFF tags, but likely \
+ understood by IrasB only. */
+#define TIFFTAG_MODELTIEPOINTTAG 33922 /* GeoTIFF */
/* 34016-34029 are reserved for ANSI IT8 TIFF/IT <dkelly@apago.com) */
-#define TIFFTAG_IT8SITE 34016 /* site name */
-#define TIFFTAG_IT8COLORSEQUENCE 34017 /* color seq. [RGB,CMYK,etc] */
-#define TIFFTAG_IT8HEADER 34018 /* DDES Header */
-#define TIFFTAG_IT8RASTERPADDING 34019 /* raster scanline padding */
-#define TIFFTAG_IT8BITSPERRUNLENGTH 34020 /* # of bits in short run */
-#define TIFFTAG_IT8BITSPEREXTENDEDRUNLENGTH 34021/* # of bits in long run */
-#define TIFFTAG_IT8COLORTABLE 34022 /* LW colortable */
-#define TIFFTAG_IT8IMAGECOLORINDICATOR 34023 /* BP/BL image color switch */
-#define TIFFTAG_IT8BKGCOLORINDICATOR 34024 /* BP/BL bg color switch */
-#define TIFFTAG_IT8IMAGECOLORVALUE 34025 /* BP/BL image color value */
-#define TIFFTAG_IT8BKGCOLORVALUE 34026 /* BP/BL bg color value */
-#define TIFFTAG_IT8PIXELINTENSITYRANGE 34027 /* MP pixel intensity value */
-#define TIFFTAG_IT8TRANSPARENCYINDICATOR 34028 /* HC transparency switch */
-#define TIFFTAG_IT8COLORCHARACTERIZATION 34029 /* color character. table */
-#define TIFFTAG_IT8HCUSAGE 34030 /* HC usage indicator */
-#define TIFFTAG_IT8TRAPINDICATOR 34031 /* Trapping indicator
- (untrapped=0, trapped=1) */
-#define TIFFTAG_IT8CMYKEQUIVALENT 34032 /* CMYK color equivalents */
+#define TIFFTAG_IT8SITE 34016 /* site name */
+#define TIFFTAG_IT8COLORSEQUENCE 34017 /* color seq. [RGB,CMYK,etc] */
+#define TIFFTAG_IT8HEADER 34018 /* DDES Header */
+#define TIFFTAG_IT8RASTERPADDING 34019 /* raster scanline padding */
+#define TIFFTAG_IT8BITSPERRUNLENGTH 34020 /* # of bits in short run */
+#define TIFFTAG_IT8BITSPEREXTENDEDRUNLENGTH 34021 /* # of bits in long run */
+#define TIFFTAG_IT8COLORTABLE 34022 /* LW colortable */
+#define TIFFTAG_IT8IMAGECOLORINDICATOR 34023 /* BP/BL image color switch */
+#define TIFFTAG_IT8BKGCOLORINDICATOR 34024 /* BP/BL bg color switch */
+#define TIFFTAG_IT8IMAGECOLORVALUE 34025 /* BP/BL image color value */
+#define TIFFTAG_IT8BKGCOLORVALUE 34026 /* BP/BL bg color value */
+#define TIFFTAG_IT8PIXELINTENSITYRANGE 34027 /* MP pixel intensity value */
+#define TIFFTAG_IT8TRANSPARENCYINDICATOR 34028 /* HC transparency switch */
+#define TIFFTAG_IT8COLORCHARACTERIZATION 34029 /* color character. table */
+#define TIFFTAG_IT8HCUSAGE 34030 /* HC usage indicator */
+#define TIFFTAG_IT8TRAPINDICATOR \
+ 34031 /* Trapping indicator \
+ (untrapped=0, trapped=1) */
+#define TIFFTAG_IT8CMYKEQUIVALENT 34032 /* CMYK color equivalents */
/* tags 34232-34236 are private tags registered to Texas Instruments */
-#define TIFFTAG_FRAMECOUNT 34232 /* Sequence Frame Count */
+#define TIFFTAG_FRAMECOUNT 34232 /* Sequence Frame Count */
+#define TIFFTAG_MODELTRANSFORMATIONTAG \
+ 34264 /* Used in interchangeable GeoTIFF files */
/* tag 34377 is private tag registered to Adobe for PhotoShop */
-#define TIFFTAG_PHOTOSHOP 34377
+#define TIFFTAG_PHOTOSHOP 34377
/* tags 34665, 34853 and 40965 are documented in EXIF specification */
-#define TIFFTAG_EXIFIFD 34665 /* Pointer to EXIF private directory */
+#define TIFFTAG_EXIFIFD 34665 /* Pointer to EXIF private directory */
/* tag 34750 is a private tag registered to Adobe? */
-#define TIFFTAG_ICCPROFILE 34675 /* ICC profile data */
-#define TIFFTAG_IMAGELAYER 34732 /* !TIFF/FX image layer information */
+#define TIFFTAG_ICCPROFILE 34675 /* ICC profile data */
+#define TIFFTAG_IMAGELAYER 34732 /* !TIFF/FX image layer information */
/* tag 34750 is a private tag registered to Pixel Magic */
-#define TIFFTAG_JBIGOPTIONS 34750 /* JBIG options */
-#define TIFFTAG_GPSIFD 34853 /* Pointer to GPS private directory */
+#define TIFFTAG_JBIGOPTIONS 34750 /* JBIG options */
+#define TIFFTAG_GPSIFD 34853 /* Pointer to GPS private directory */
/* tags 34908-34914 are private tags registered to SGI */
-#define TIFFTAG_FAXRECVPARAMS 34908 /* encoded Class 2 ses. parms */
-#define TIFFTAG_FAXSUBADDRESS 34909 /* received SubAddr string */
-#define TIFFTAG_FAXRECVTIME 34910 /* receive time (secs) */
-#define TIFFTAG_FAXDCS 34911 /* encoded fax ses. params, Table 2/T.30 */
+#define TIFFTAG_FAXRECVPARAMS 34908 /* encoded Class 2 ses. params */
+#define TIFFTAG_FAXSUBADDRESS 34909 /* received SubAddr string */
+#define TIFFTAG_FAXRECVTIME 34910 /* receive time (secs) */
+#define TIFFTAG_FAXDCS 34911 /* encoded fax ses. params, Table 2/T.30 */
/* tags 37439-37443 are registered to SGI <gregl@sgi.com> */
-#define TIFFTAG_STONITS 37439 /* Sample value to Nits */
+#define TIFFTAG_STONITS 37439 /* Sample value to Nits */
/* tag 34929 is a private tag registered to FedEx */
-#define TIFFTAG_FEDEX_EDR 34929 /* unknown use */
-#define TIFFTAG_INTEROPERABILITYIFD 40965 /* Pointer to Interoperability private directory */
+#define TIFFTAG_FEDEX_EDR 34929 /* unknown use */
+#define TIFFTAG_IMAGESOURCEDATA \
+ 37724 /* http://justsolve.archiveteam.org/wiki/PSD, \
+ http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ */
+#define TIFFTAG_INTEROPERABILITYIFD \
+ 40965 /* Pointer to Interoperability private directory */
+#define TIFFTAG_GDAL_METADATA 42112 /* Used by the GDAL library */
+#define TIFFTAG_GDAL_NODATA 42113 /* Used by the GDAL library */
+#define TIFFTAG_OCE_SCANJOB_DESCRIPTION \
+ 50215 /* Used in the Oce scanning process */
+#define TIFFTAG_OCE_APPLICATION_SELECTOR \
+ 50216 /* Used in the Oce scanning process. */
+#define TIFFTAG_OCE_IDENTIFICATION_NUMBER 50217
+#define TIFFTAG_OCE_IMAGELOGIC_CHARACTERISTICS 50218
+
/* tags 50674 to 50677 are reserved for ESRI */
-#define TIFFTAG_LERC_PARAMETERS 50674 /* Stores LERC version and additional compression method */
+#define TIFFTAG_LERC_PARAMETERS \
+ 50674 /* Stores LERC version and additional compression method */
/* Adobe Digital Negative (DNG) format tags */
-#define TIFFTAG_DNGVERSION 50706 /* &DNG version number */
-#define TIFFTAG_DNGBACKWARDVERSION 50707 /* &DNG compatibility version */
-#define TIFFTAG_UNIQUECAMERAMODEL 50708 /* &name for the camera model */
-#define TIFFTAG_LOCALIZEDCAMERAMODEL 50709 /* &localized camera model
- name */
-#define TIFFTAG_CFAPLANECOLOR 50710 /* &CFAPattern->LinearRaw space
- mapping */
-#define TIFFTAG_CFALAYOUT 50711 /* &spatial layout of the CFA */
-#define TIFFTAG_LINEARIZATIONTABLE 50712 /* &lookup table description */
-#define TIFFTAG_BLACKLEVELREPEATDIM 50713 /* &repeat pattern size for
- the BlackLevel tag */
-#define TIFFTAG_BLACKLEVEL 50714 /* &zero light encoding level */
-#define TIFFTAG_BLACKLEVELDELTAH 50715 /* &zero light encoding level
- differences (columns) */
-#define TIFFTAG_BLACKLEVELDELTAV 50716 /* &zero light encoding level
- differences (rows) */
-#define TIFFTAG_WHITELEVEL 50717 /* &fully saturated encoding
- level */
-#define TIFFTAG_DEFAULTSCALE 50718 /* &default scale factors */
-#define TIFFTAG_DEFAULTCROPORIGIN 50719 /* &origin of the final image
- area */
-#define TIFFTAG_DEFAULTCROPSIZE 50720 /* &size of the final image
- area */
-#define TIFFTAG_COLORMATRIX1 50721 /* &XYZ->reference color space
- transformation matrix 1 */
-#define TIFFTAG_COLORMATRIX2 50722 /* &XYZ->reference color space
- transformation matrix 2 */
-#define TIFFTAG_CAMERACALIBRATION1 50723 /* &calibration matrix 1 */
-#define TIFFTAG_CAMERACALIBRATION2 50724 /* &calibration matrix 2 */
-#define TIFFTAG_REDUCTIONMATRIX1 50725 /* &dimensionality reduction
- matrix 1 */
-#define TIFFTAG_REDUCTIONMATRIX2 50726 /* &dimensionality reduction
- matrix 2 */
-#define TIFFTAG_ANALOGBALANCE 50727 /* &gain applied the stored raw
- values*/
-#define TIFFTAG_ASSHOTNEUTRAL 50728 /* &selected white balance in
- linear reference space */
-#define TIFFTAG_ASSHOTWHITEXY 50729 /* &selected white balance in
- x-y chromaticity
- coordinates */
-#define TIFFTAG_BASELINEEXPOSURE 50730 /* &how much to move the zero
- point */
-#define TIFFTAG_BASELINENOISE 50731 /* &relative noise level */
-#define TIFFTAG_BASELINESHARPNESS 50732 /* &relative amount of
- sharpening */
-#define TIFFTAG_BAYERGREENSPLIT 50733 /* &how closely the values of
- the green pixels in the
- blue/green rows track the
- values of the green pixels
- in the red/green rows */
-#define TIFFTAG_LINEARRESPONSELIMIT 50734 /* &non-linear encoding range */
-#define TIFFTAG_CAMERASERIALNUMBER 50735 /* &camera's serial number */
-#define TIFFTAG_LENSINFO 50736 /* info about the lens */
-#define TIFFTAG_CHROMABLURRADIUS 50737 /* &chroma blur radius */
-#define TIFFTAG_ANTIALIASSTRENGTH 50738 /* &relative strength of the
- camera's anti-alias filter */
-#define TIFFTAG_SHADOWSCALE 50739 /* &used by Adobe Camera Raw */
-#define TIFFTAG_DNGPRIVATEDATA 50740 /* &manufacturer's private data */
-#define TIFFTAG_MAKERNOTESAFETY 50741 /* &whether the EXIF MakerNote
- tag is safe to preserve
- along with the rest of the
- EXIF data */
-#define TIFFTAG_CALIBRATIONILLUMINANT1 50778 /* &illuminant 1 */
-#define TIFFTAG_CALIBRATIONILLUMINANT2 50779 /* &illuminant 2 */
-#define TIFFTAG_BESTQUALITYSCALE 50780 /* &best quality multiplier */
-#define TIFFTAG_RAWDATAUNIQUEID 50781 /* &unique identifier for
- the raw image data */
-#define TIFFTAG_ORIGINALRAWFILENAME 50827 /* &file name of the original
- raw file */
-#define TIFFTAG_ORIGINALRAWFILEDATA 50828 /* &contents of the original
- raw file */
-#define TIFFTAG_ACTIVEAREA 50829 /* &active (non-masked) pixels
- of the sensor */
-#define TIFFTAG_MASKEDAREAS 50830 /* &list of coordinates
- of fully masked pixels */
-#define TIFFTAG_ASSHOTICCPROFILE 50831 /* &these two tags used to */
-#define TIFFTAG_ASSHOTPREPROFILEMATRIX 50832 /* map cameras's color space
- into ICC profile space */
-#define TIFFTAG_CURRENTICCPROFILE 50833 /* & */
-#define TIFFTAG_CURRENTPREPROFILEMATRIX 50834 /* & */
+#define TIFFTAG_DNGVERSION 50706 /* &DNG version number */
+#define TIFFTAG_DNGBACKWARDVERSION 50707 /* &DNG compatibility version */
+#define TIFFTAG_UNIQUECAMERAMODEL 50708 /* &name for the camera model */
+#define TIFFTAG_LOCALIZEDCAMERAMODEL \
+ 50709 /* &localized camera model \
+ name */
+#define TIFFTAG_CFAPLANECOLOR \
+ 50710 /* &CFAPattern->LinearRaw space \
+ mapping */
+#define TIFFTAG_CFALAYOUT 50711 /* &spatial layout of the CFA */
+#define TIFFTAG_LINEARIZATIONTABLE 50712 /* &lookup table description */
+#define TIFFTAG_BLACKLEVELREPEATDIM \
+ 50713 /* &repeat pattern size for \
+ the BlackLevel tag */
+#define TIFFTAG_BLACKLEVEL 50714 /* &zero light encoding level */
+#define TIFFTAG_BLACKLEVELDELTAH \
+ 50715 /* &zero light encoding level \
+ differences (columns) */
+#define TIFFTAG_BLACKLEVELDELTAV \
+ 50716 /* &zero light encoding level \
+ differences (rows) */
+#define TIFFTAG_WHITELEVEL \
+ 50717 /* &fully saturated encoding \
+ level */
+#define TIFFTAG_DEFAULTSCALE 50718 /* &default scale factors */
+#define TIFFTAG_DEFAULTCROPORIGIN \
+ 50719 /* &origin of the final image \
+ area */
+#define TIFFTAG_DEFAULTCROPSIZE \
+ 50720 /* &size of the final image \
+ area */
+#define TIFFTAG_COLORMATRIX1 \
+ 50721 /* &XYZ->reference color space \
+ transformation matrix 1 */
+#define TIFFTAG_COLORMATRIX2 \
+ 50722 /* &XYZ->reference color space \
+ transformation matrix 2 */
+#define TIFFTAG_CAMERACALIBRATION1 50723 /* &calibration matrix 1 */
+#define TIFFTAG_CAMERACALIBRATION2 50724 /* &calibration matrix 2 */
+#define TIFFTAG_REDUCTIONMATRIX1 \
+ 50725 /* &dimensionality reduction \
+ matrix 1 */
+#define TIFFTAG_REDUCTIONMATRIX2 \
+ 50726 /* &dimensionality reduction \
+ matrix 2 */
+#define TIFFTAG_ANALOGBALANCE \
+ 50727 /* &gain applied the stored raw \
+ values*/
+#define TIFFTAG_ASSHOTNEUTRAL \
+ 50728 /* &selected white balance in \
+ linear reference space */
+#define TIFFTAG_ASSHOTWHITEXY \
+ 50729 /* &selected white balance in \
+ x-y chromaticity \
+ coordinates */
+#define TIFFTAG_BASELINEEXPOSURE \
+ 50730 /* &how much to move the zero \
+ point */
+#define TIFFTAG_BASELINENOISE 50731 /* &relative noise level */
+#define TIFFTAG_BASELINESHARPNESS \
+ 50732 /* &relative amount of \
+ sharpening */
+#define TIFFTAG_BAYERGREENSPLIT \
+ 50733 /* &how closely the values of \
+ the green pixels in the \
+ blue/green rows track the \
+ values of the green pixels \
+ in the red/green rows */
+#define TIFFTAG_LINEARRESPONSELIMIT 50734 /* &non-linear encoding range */
+#define TIFFTAG_CAMERASERIALNUMBER 50735 /* &camera's serial number */
+#define TIFFTAG_LENSINFO 50736 /* info about the lens */
+#define TIFFTAG_CHROMABLURRADIUS 50737 /* &chroma blur radius */
+#define TIFFTAG_ANTIALIASSTRENGTH \
+ 50738 /* &relative strength of the \
+ camera's anti-alias filter */
+#define TIFFTAG_SHADOWSCALE 50739 /* &used by Adobe Camera Raw */
+#define TIFFTAG_DNGPRIVATEDATA 50740 /* &manufacturer's private data */
+#define TIFFTAG_MAKERNOTESAFETY \
+ 50741 /* &whether the EXIF MakerNote \
+ tag is safe to preserve \
+ along with the rest of the \
+ EXIF data */
+#define TIFFTAG_CALIBRATIONILLUMINANT1 50778 /* &illuminant 1 */
+#define TIFFTAG_CALIBRATIONILLUMINANT2 50779 /* &illuminant 2 */
+#define TIFFTAG_BESTQUALITYSCALE 50780 /* &best quality multiplier */
+#define TIFFTAG_RAWDATAUNIQUEID \
+ 50781 /* &unique identifier for \
+ the raw image data */
+#define TIFFTAG_ORIGINALRAWFILENAME \
+ 50827 /* &file name of the original \
+ raw file */
+#define TIFFTAG_ORIGINALRAWFILEDATA \
+ 50828 /* &contents of the original \
+ raw file */
+#define TIFFTAG_ACTIVEAREA \
+ 50829 /* &active (non-masked) pixels \
+ of the sensor */
+#define TIFFTAG_MASKEDAREAS \
+ 50830 /* &list of coordinates \
+ of fully masked pixels */
+#define TIFFTAG_ASSHOTICCPROFILE 50831 /* &these two tags used to */
+#define TIFFTAG_ASSHOTPREPROFILEMATRIX \
+ 50832 /* map cameras's color space \
+ into ICC profile space */
+#define TIFFTAG_CURRENTICCPROFILE 50833 /* & */
+#define TIFFTAG_CURRENTPREPROFILEMATRIX 50834 /* & */
+
+#define TIFFTAG_RPCCOEFFICIENT \
+ 50844 /* Define by GDAL for geospatial georeferencing through RPC: \
+ http://geotiff.maptools.org/rpc_prop.html */
+
+#define TIFFTAG_ALIAS_LAYER_METADATA \
+ 50784 /* Alias Sketchbook Pro layer usage description. */
+
+/* GeoTIFF DGIWG */
+#define TIFFTAG_TIFF_RSID \
+ 50908 /* https://www.awaresystems.be/imaging/tiff/tifftags/tiff_rsid.html \
+ */
+#define TIFFTAG_GEO_METADATA \
+ 50909 /* https://www.awaresystems.be/imaging/tiff/tifftags/geo_metadata.html \
+ */
+
+#define TIFFTAG_EXTRACAMERAPROFILES \
+ 50933 /* http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/products/photoshop/pdfs/dng_spec_1.4.0.0.pdf \
+ */
+
/* tag 65535 is an undefined tag used by Eastman Kodak */
-#define TIFFTAG_DCSHUESHIFTVALUES 65535 /* hue shift correction data */
+#define TIFFTAG_DCSHUESHIFTVALUES 65535 /* hue shift correction data */
/*
* The following are ``pseudo tags'' that can be used to control
@@ -549,147 +686,285 @@ typedef enum {
* http://www.remotesensing.org/libtiff/bugs.html with the appropriate
* C definitions to add.
*/
-#define TIFFTAG_FAXMODE 65536 /* Group 3/4 format control */
-#define FAXMODE_CLASSIC 0x0000 /* default, include RTC */
-#define FAXMODE_NORTC 0x0001 /* no RTC at end of data */
-#define FAXMODE_NOEOL 0x0002 /* no EOL code at end of row */
-#define FAXMODE_BYTEALIGN 0x0004 /* byte align row */
-#define FAXMODE_WORDALIGN 0x0008 /* word align row */
-#define FAXMODE_CLASSF FAXMODE_NORTC /* TIFF Class F */
-#define TIFFTAG_JPEGQUALITY 65537 /* Compression quality level */
+#define TIFFTAG_FAXMODE 65536 /* Group 3/4 format control */
+#define FAXMODE_CLASSIC 0x0000 /* default, include RTC */
+#define FAXMODE_NORTC 0x0001 /* no RTC at end of data */
+#define FAXMODE_NOEOL 0x0002 /* no EOL code at end of row */
+#define FAXMODE_BYTEALIGN 0x0004 /* byte align row */
+#define FAXMODE_WORDALIGN 0x0008 /* word align row */
+#define FAXMODE_CLASSF FAXMODE_NORTC /* TIFF Class F */
+#define TIFFTAG_JPEGQUALITY 65537 /* Compression quality level */
/* Note: quality level is on the IJG 0-100 scale. Default value is 75 */
-#define TIFFTAG_JPEGCOLORMODE 65538 /* Auto RGB<=>YCbCr convert? */
-#define JPEGCOLORMODE_RAW 0x0000 /* no conversion (default) */
-#define JPEGCOLORMODE_RGB 0x0001 /* do auto conversion */
-#define TIFFTAG_JPEGTABLESMODE 65539 /* What to put in JPEGTables */
-#define JPEGTABLESMODE_QUANT 0x0001 /* include quantization tbls */
-#define JPEGTABLESMODE_HUFF 0x0002 /* include Huffman tbls */
+#define TIFFTAG_JPEGCOLORMODE 65538 /* Auto RGB<=>YCbCr convert? */
+#define JPEGCOLORMODE_RAW 0x0000 /* no conversion (default) */
+#define JPEGCOLORMODE_RGB 0x0001 /* do auto conversion */
+#define TIFFTAG_JPEGTABLESMODE 65539 /* What to put in JPEGTables */
+#define JPEGTABLESMODE_QUANT 0x0001 /* include quantization tbls */
+#define JPEGTABLESMODE_HUFF 0x0002 /* include Huffman tbls */
/* Note: default is JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF */
-#define TIFFTAG_FAXFILLFUNC 65540 /* G3/G4 fill function */
-#define TIFFTAG_PIXARLOGDATAFMT 65549 /* PixarLogCodec I/O data sz */
-#define PIXARLOGDATAFMT_8BIT 0 /* regular u_char samples */
-#define PIXARLOGDATAFMT_8BITABGR 1 /* ABGR-order u_chars */
-#define PIXARLOGDATAFMT_11BITLOG 2 /* 11-bit log-encoded (raw) */
-#define PIXARLOGDATAFMT_12BITPICIO 3 /* as per PICIO (1.0==2048) */
-#define PIXARLOGDATAFMT_16BIT 4 /* signed short samples */
-#define PIXARLOGDATAFMT_FLOAT 5 /* IEEE float samples */
+#define TIFFTAG_FAXFILLFUNC 65540 /* G3/G4 fill function */
+#define TIFFTAG_PIXARLOGDATAFMT 65549 /* PixarLogCodec I/O data sz */
+#define PIXARLOGDATAFMT_8BIT 0 /* regular u_char samples */
+#define PIXARLOGDATAFMT_8BITABGR 1 /* ABGR-order u_chars */
+#define PIXARLOGDATAFMT_11BITLOG 2 /* 11-bit log-encoded (raw) */
+#define PIXARLOGDATAFMT_12BITPICIO 3 /* as per PICIO (1.0==2048) */
+#define PIXARLOGDATAFMT_16BIT 4 /* signed short samples */
+#define PIXARLOGDATAFMT_FLOAT 5 /* IEEE float samples */
/* 65550-65556 are allocated to Oceana Matrix <dev@oceana.com> */
-#define TIFFTAG_DCSIMAGERTYPE 65550 /* imager model & filter */
-#define DCSIMAGERMODEL_M3 0 /* M3 chip (1280 x 1024) */
-#define DCSIMAGERMODEL_M5 1 /* M5 chip (1536 x 1024) */
-#define DCSIMAGERMODEL_M6 2 /* M6 chip (3072 x 2048) */
-#define DCSIMAGERFILTER_IR 0 /* infrared filter */
-#define DCSIMAGERFILTER_MONO 1 /* monochrome filter */
-#define DCSIMAGERFILTER_CFA 2 /* color filter array */
-#define DCSIMAGERFILTER_OTHER 3 /* other filter */
-#define TIFFTAG_DCSINTERPMODE 65551 /* interpolation mode */
-#define DCSINTERPMODE_NORMAL 0x0 /* whole image, default */
-#define DCSINTERPMODE_PREVIEW 0x1 /* preview of image (384x256) */
-#define TIFFTAG_DCSBALANCEARRAY 65552 /* color balance values */
-#define TIFFTAG_DCSCORRECTMATRIX 65553 /* color correction values */
-#define TIFFTAG_DCSGAMMA 65554 /* gamma value */
-#define TIFFTAG_DCSTOESHOULDERPTS 65555 /* toe & shoulder points */
-#define TIFFTAG_DCSCALIBRATIONFD 65556 /* calibration file desc */
+#define TIFFTAG_DCSIMAGERTYPE 65550 /* imager model & filter */
+#define DCSIMAGERMODEL_M3 0 /* M3 chip (1280 x 1024) */
+#define DCSIMAGERMODEL_M5 1 /* M5 chip (1536 x 1024) */
+#define DCSIMAGERMODEL_M6 2 /* M6 chip (3072 x 2048) */
+#define DCSIMAGERFILTER_IR 0 /* infrared filter */
+#define DCSIMAGERFILTER_MONO 1 /* monochrome filter */
+#define DCSIMAGERFILTER_CFA 2 /* color filter array */
+#define DCSIMAGERFILTER_OTHER 3 /* other filter */
+#define TIFFTAG_DCSINTERPMODE 65551 /* interpolation mode */
+#define DCSINTERPMODE_NORMAL 0x0 /* whole image, default */
+#define DCSINTERPMODE_PREVIEW 0x1 /* preview of image (384x256) */
+#define TIFFTAG_DCSBALANCEARRAY 65552 /* color balance values */
+#define TIFFTAG_DCSCORRECTMATRIX 65553 /* color correction values */
+#define TIFFTAG_DCSGAMMA 65554 /* gamma value */
+#define TIFFTAG_DCSTOESHOULDERPTS 65555 /* toe & shoulder points */
+#define TIFFTAG_DCSCALIBRATIONFD 65556 /* calibration file desc */
/* Note: quality level is on the ZLIB 1-9 scale. Default value is -1 */
-#define TIFFTAG_ZIPQUALITY 65557 /* compression quality level */
-#define TIFFTAG_PIXARLOGQUALITY 65558 /* PixarLog uses same scale */
+#define TIFFTAG_ZIPQUALITY 65557 /* compression quality level */
+#define TIFFTAG_PIXARLOGQUALITY 65558 /* PixarLog uses same scale */
/* 65559 is allocated to Oceana Matrix <dev@oceana.com> */
-#define TIFFTAG_DCSCLIPRECTANGLE 65559 /* area of image to acquire */
-#define TIFFTAG_SGILOGDATAFMT 65560 /* SGILog user data format */
-#define SGILOGDATAFMT_FLOAT 0 /* IEEE float samples */
-#define SGILOGDATAFMT_16BIT 1 /* 16-bit samples */
-#define SGILOGDATAFMT_RAW 2 /* uninterpreted data */
-#define SGILOGDATAFMT_8BIT 3 /* 8-bit RGB monitor values */
-#define TIFFTAG_SGILOGENCODE 65561 /* SGILog data encoding control*/
-#define SGILOGENCODE_NODITHER 0 /* do not dither encoded values*/
-#define SGILOGENCODE_RANDITHER 1 /* randomly dither encd values */
-#define TIFFTAG_LZMAPRESET 65562 /* LZMA2 preset (compression level) */
-#define TIFFTAG_PERSAMPLE 65563 /* interface for per sample tags */
-#define PERSAMPLE_MERGED 0 /* present as a single value */
-#define PERSAMPLE_MULTI 1 /* present as multiple values */
-#define TIFFTAG_ZSTD_LEVEL 65564 /* ZSTD compression level */
-#define TIFFTAG_LERC_VERSION 65565 /* LERC version */
-#define LERC_VERSION_2_4 4
-#define TIFFTAG_LERC_ADD_COMPRESSION 65566 /* LERC additional compression */
-#define LERC_ADD_COMPRESSION_NONE 0
-#define LERC_ADD_COMPRESSION_DEFLATE 1
-#define LERC_ADD_COMPRESSION_ZSTD 2
-#define TIFFTAG_LERC_MAXZERROR 65567 /* LERC maximum error */
-#define TIFFTAG_WEBP_LEVEL 65568 /* WebP compression level: WARNING not registered in Adobe-maintained registry */
-#define TIFFTAG_WEBP_LOSSLESS 65569 /* WebP lossless/lossy : WARNING not registered in Adobe-maintained registry */
+#define TIFFTAG_DCSCLIPRECTANGLE 65559 /* area of image to acquire */
+#define TIFFTAG_SGILOGDATAFMT 65560 /* SGILog user data format */
+#define SGILOGDATAFMT_FLOAT 0 /* IEEE float samples */
+#define SGILOGDATAFMT_16BIT 1 /* 16-bit samples */
+#define SGILOGDATAFMT_RAW 2 /* uninterpreted data */
+#define SGILOGDATAFMT_8BIT 3 /* 8-bit RGB monitor values */
+#define TIFFTAG_SGILOGENCODE 65561 /* SGILog data encoding control*/
+#define SGILOGENCODE_NODITHER 0 /* do not dither encoded values*/
+#define SGILOGENCODE_RANDITHER 1 /* randomly dither encd values */
+#define TIFFTAG_LZMAPRESET 65562 /* LZMA2 preset (compression level) */
+#define TIFFTAG_PERSAMPLE 65563 /* interface for per sample tags */
+#define PERSAMPLE_MERGED 0 /* present as a single value */
+#define PERSAMPLE_MULTI 1 /* present as multiple values */
+#define TIFFTAG_ZSTD_LEVEL 65564 /* ZSTD compression level */
+#define TIFFTAG_LERC_VERSION 65565 /* LERC version */
+#define LERC_VERSION_2_4 4
+#define TIFFTAG_LERC_ADD_COMPRESSION 65566 /* LERC additional compression */
+#define LERC_ADD_COMPRESSION_NONE 0
+#define LERC_ADD_COMPRESSION_DEFLATE 1
+#define LERC_ADD_COMPRESSION_ZSTD 2
+#define TIFFTAG_LERC_MAXZERROR 65567 /* LERC maximum error */
+#define TIFFTAG_WEBP_LEVEL 65568 /* WebP compression level */
+#define TIFFTAG_WEBP_LOSSLESS 65569 /* WebP lossless/lossy */
+#define TIFFTAG_DEFLATE_SUBCODEC \
+ 65570 /* ZIP codec: to get/set the sub-codec to use. Will default to \
+ libdeflate when available */
+#define DEFLATE_SUBCODEC_ZLIB 0
+#define DEFLATE_SUBCODEC_LIBDEFLATE 1
/*
* EXIF tags
*/
-#define EXIFTAG_EXPOSURETIME 33434 /* Exposure time */
-#define EXIFTAG_FNUMBER 33437 /* F number */
-#define EXIFTAG_EXPOSUREPROGRAM 34850 /* Exposure program */
-#define EXIFTAG_SPECTRALSENSITIVITY 34852 /* Spectral sensitivity */
-#define EXIFTAG_ISOSPEEDRATINGS 34855 /* ISO speed rating */
-#define EXIFTAG_OECF 34856 /* Optoelectric conversion
- factor */
-#define EXIFTAG_EXIFVERSION 36864 /* Exif version */
-#define EXIFTAG_DATETIMEORIGINAL 36867 /* Date and time of original
- data generation */
-#define EXIFTAG_DATETIMEDIGITIZED 36868 /* Date and time of digital
- data generation */
-#define EXIFTAG_COMPONENTSCONFIGURATION 37121 /* Meaning of each component */
-#define EXIFTAG_COMPRESSEDBITSPERPIXEL 37122 /* Image compression mode */
-#define EXIFTAG_SHUTTERSPEEDVALUE 37377 /* Shutter speed */
-#define EXIFTAG_APERTUREVALUE 37378 /* Aperture */
-#define EXIFTAG_BRIGHTNESSVALUE 37379 /* Brightness */
-#define EXIFTAG_EXPOSUREBIASVALUE 37380 /* Exposure bias */
-#define EXIFTAG_MAXAPERTUREVALUE 37381 /* Maximum lens aperture */
-#define EXIFTAG_SUBJECTDISTANCE 37382 /* Subject distance */
-#define EXIFTAG_METERINGMODE 37383 /* Metering mode */
-#define EXIFTAG_LIGHTSOURCE 37384 /* Light source */
-#define EXIFTAG_FLASH 37385 /* Flash */
-#define EXIFTAG_FOCALLENGTH 37386 /* Lens focal length */
-#define EXIFTAG_SUBJECTAREA 37396 /* Subject area */
-#define EXIFTAG_MAKERNOTE 37500 /* Manufacturer notes */
-#define EXIFTAG_USERCOMMENT 37510 /* User comments */
-#define EXIFTAG_SUBSECTIME 37520 /* DateTime subseconds */
-#define EXIFTAG_SUBSECTIMEORIGINAL 37521 /* DateTimeOriginal subseconds */
-#define EXIFTAG_SUBSECTIMEDIGITIZED 37522 /* DateTimeDigitized subseconds */
-#define EXIFTAG_FLASHPIXVERSION 40960 /* Supported Flashpix version */
-#define EXIFTAG_COLORSPACE 40961 /* Color space information */
-#define EXIFTAG_PIXELXDIMENSION 40962 /* Valid image width */
-#define EXIFTAG_PIXELYDIMENSION 40963 /* Valid image height */
-#define EXIFTAG_RELATEDSOUNDFILE 40964 /* Related audio file */
-#define EXIFTAG_FLASHENERGY 41483 /* Flash energy */
-#define EXIFTAG_SPATIALFREQUENCYRESPONSE 41484 /* Spatial frequency response */
-#define EXIFTAG_FOCALPLANEXRESOLUTION 41486 /* Focal plane X resolution */
-#define EXIFTAG_FOCALPLANEYRESOLUTION 41487 /* Focal plane Y resolution */
-#define EXIFTAG_FOCALPLANERESOLUTIONUNIT 41488 /* Focal plane resolution unit */
-#define EXIFTAG_SUBJECTLOCATION 41492 /* Subject location */
-#define EXIFTAG_EXPOSUREINDEX 41493 /* Exposure index */
-#define EXIFTAG_SENSINGMETHOD 41495 /* Sensing method */
-#define EXIFTAG_FILESOURCE 41728 /* File source */
-#define EXIFTAG_SCENETYPE 41729 /* Scene type */
-#define EXIFTAG_CFAPATTERN 41730 /* CFA pattern */
-#define EXIFTAG_CUSTOMRENDERED 41985 /* Custom image processing */
-#define EXIFTAG_EXPOSUREMODE 41986 /* Exposure mode */
-#define EXIFTAG_WHITEBALANCE 41987 /* White balance */
-#define EXIFTAG_DIGITALZOOMRATIO 41988 /* Digital zoom ratio */
-#define EXIFTAG_FOCALLENGTHIN35MMFILM 41989 /* Focal length in 35 mm film */
-#define EXIFTAG_SCENECAPTURETYPE 41990 /* Scene capture type */
-#define EXIFTAG_GAINCONTROL 41991 /* Gain control */
-#define EXIFTAG_CONTRAST 41992 /* Contrast */
-#define EXIFTAG_SATURATION 41993 /* Saturation */
-#define EXIFTAG_SHARPNESS 41994 /* Sharpness */
-#define EXIFTAG_DEVICESETTINGDESCRIPTION 41995 /* Device settings description */
-#define EXIFTAG_SUBJECTDISTANCERANGE 41996 /* Subject distance range */
-#define EXIFTAG_GAINCONTROL 41991 /* Gain control */
-#define EXIFTAG_GAINCONTROL 41991 /* Gain control */
-#define EXIFTAG_IMAGEUNIQUEID 42016 /* Unique image ID */
+#define EXIFTAG_EXPOSURETIME 33434 /* Exposure time */
+#define EXIFTAG_FNUMBER 33437 /* F number */
+#define EXIFTAG_EXPOSUREPROGRAM 34850 /* Exposure program */
+#define EXIFTAG_SPECTRALSENSITIVITY 34852 /* Spectral sensitivity */
+#define EXIFTAG_ISOSPEEDRATINGS 34855 /* ISO speed rating */
+#define EXIFTAG_PHOTOGRAPHICSENSITIVITY \
+ 34855 /* Photographic Sensitivity (new name for tag 34855) */
+#define EXIFTAG_OECF 34856 /* Optoelectric conversion factor */
+#define EXIFTAG_EXIFVERSION 36864 /* Exif version */
+#define EXIFTAG_DATETIMEORIGINAL \
+ 36867 /* Date and time of original \
+ data generation */
+#define EXIFTAG_DATETIMEDIGITIZED \
+ 36868 /* Date and time of digital \
+ data generation */
+#define EXIFTAG_COMPONENTSCONFIGURATION 37121 /* Meaning of each component */
+#define EXIFTAG_COMPRESSEDBITSPERPIXEL 37122 /* Image compression mode */
+#define EXIFTAG_SHUTTERSPEEDVALUE 37377 /* Shutter speed */
+#define EXIFTAG_APERTUREVALUE 37378 /* Aperture */
+#define EXIFTAG_BRIGHTNESSVALUE 37379 /* Brightness */
+#define EXIFTAG_EXPOSUREBIASVALUE 37380 /* Exposure bias */
+#define EXIFTAG_MAXAPERTUREVALUE 37381 /* Maximum lens aperture */
+#define EXIFTAG_SUBJECTDISTANCE 37382 /* Subject distance */
+#define EXIFTAG_METERINGMODE 37383 /* Metering mode */
+#define EXIFTAG_LIGHTSOURCE 37384 /* Light source */
+#define EXIFTAG_FLASH 37385 /* Flash */
+#define EXIFTAG_FOCALLENGTH 37386 /* Lens focal length */
+#define EXIFTAG_SUBJECTAREA 37396 /* Subject area */
+#define EXIFTAG_MAKERNOTE 37500 /* Manufacturer notes */
+#define EXIFTAG_USERCOMMENT 37510 /* User comments */
+#define EXIFTAG_SUBSECTIME 37520 /* DateTime subseconds */
+#define EXIFTAG_SUBSECTIMEORIGINAL 37521 /* DateTimeOriginal subseconds */
+#define EXIFTAG_SUBSECTIMEDIGITIZED 37522 /* DateTimeDigitized subseconds */
+#define EXIFTAG_FLASHPIXVERSION 40960 /* Supported Flashpix version */
+#define EXIFTAG_COLORSPACE 40961 /* Color space information */
+#define EXIFTAG_PIXELXDIMENSION 40962 /* Valid image width */
+#define EXIFTAG_PIXELYDIMENSION 40963 /* Valid image height */
+#define EXIFTAG_RELATEDSOUNDFILE 40964 /* Related audio file */
+#define EXIFTAG_FLASHENERGY 41483 /* Flash energy */
+#define EXIFTAG_SPATIALFREQUENCYRESPONSE \
+ 41484 /* Spatial frequency response \
+ */
+#define EXIFTAG_FOCALPLANEXRESOLUTION 41486 /* Focal plane X resolution */
+#define EXIFTAG_FOCALPLANEYRESOLUTION 41487 /* Focal plane Y resolution */
+#define EXIFTAG_FOCALPLANERESOLUTIONUNIT \
+ 41488 /* Focal plane resolution unit \
+ */
+#define EXIFTAG_SUBJECTLOCATION 41492 /* Subject location */
+#define EXIFTAG_EXPOSUREINDEX 41493 /* Exposure index */
+#define EXIFTAG_SENSINGMETHOD 41495 /* Sensing method */
+#define EXIFTAG_FILESOURCE 41728 /* File source */
+#define EXIFTAG_SCENETYPE 41729 /* Scene type */
+#define EXIFTAG_CFAPATTERN 41730 /* CFA pattern */
+#define EXIFTAG_CUSTOMRENDERED 41985 /* Custom image processing */
+#define EXIFTAG_EXPOSUREMODE 41986 /* Exposure mode */
+#define EXIFTAG_WHITEBALANCE 41987 /* White balance */
+#define EXIFTAG_DIGITALZOOMRATIO 41988 /* Digital zoom ratio */
+#define EXIFTAG_FOCALLENGTHIN35MMFILM 41989 /* Focal length in 35 mm film */
+#define EXIFTAG_SCENECAPTURETYPE 41990 /* Scene capture type */
+#define EXIFTAG_GAINCONTROL 41991 /* Gain control */
+#define EXIFTAG_CONTRAST 41992 /* Contrast */
+#define EXIFTAG_SATURATION 41993 /* Saturation */
+#define EXIFTAG_SHARPNESS 41994 /* Sharpness */
+#define EXIFTAG_DEVICESETTINGDESCRIPTION \
+ 41995 /* Device settings description \
+ */
+#define EXIFTAG_SUBJECTDISTANCERANGE 41996 /* Subject distance range */
+#define EXIFTAG_IMAGEUNIQUEID 42016 /* Unique image ID */
-#endif /* _TIFF_ */
+/*--: New for EXIF-Version 2.32, May 2019 ... */
+#define EXIFTAG_SENSITIVITYTYPE \
+ 34864 /* The SensitivityType tag indicates which one of the parameters of \
+ ISO12232 is the PhotographicSensitivity tag. */
+#define EXIFTAG_STANDARDOUTPUTSENSITIVITY \
+ 34865 /* This tag indicates the standard output sensitivity value of a \
+ camera or input device defined in ISO 12232. */
+#define EXIFTAG_RECOMMENDEDEXPOSUREINDEX \
+ 34866 /* recommended exposure index \
+ */
+#define EXIFTAG_ISOSPEED 34867 /* ISO speed value */
+#define EXIFTAG_ISOSPEEDLATITUDEYYY 34868 /* ISO speed latitude yyy */
+#define EXIFTAG_ISOSPEEDLATITUDEZZZ 34869 /* ISO speed latitude zzz */
+#define EXIFTAG_OFFSETTIME \
+ 36880 /* offset from UTC of the time of DateTime tag. */
+#define EXIFTAG_OFFSETTIMEORIGINAL \
+ 36881 /* offset from UTC of the time of DateTimeOriginal tag. */
+#define EXIFTAG_OFFSETTIMEDIGITIZED \
+ 36882 /* offset from UTC of the time of DateTimeDigitized tag. */
+#define EXIFTAG_TEMPERATURE \
+ 37888 /* Temperature as the ambient situation at the shot in dergee \
+ Celsius */
+#define EXIFTAG_HUMIDITY \
+ 37889 /* Humidity as the ambient situation at the shot in percent */
+#define EXIFTAG_PRESSURE \
+ 37890 /* Pressure as the ambient situation at the shot hecto-Pascal (hPa) \
+ */
+#define EXIFTAG_WATERDEPTH \
+ 37891 /* WaterDepth as the ambient situation at the shot in meter (m) */
+#define EXIFTAG_ACCELERATION \
+ 37892 /* Acceleration (a scalar regardless of direction) as the ambient \
+ situation at the shot in units of mGal (10-5 m/s^2) */
+#define EXIFTAG_CAMERAELEVATIONANGLE \
+ 37893 /* Elevation/depression. angle of the orientation of the \
+ camera(imaging optical axis) as the ambient situation at the shot \
+ in degree from -180deg to +180deg. */
+#define EXIFTAG_CAMERAOWNERNAME 42032 /* owner of a camera */
+#define EXIFTAG_BODYSERIALNUMBER \
+ 42033 /* serial number of the body of the camera */
+#define EXIFTAG_LENSSPECIFICATION \
+ 42034 /* minimum focal length (in mm), maximum focal length (in mm), \
+ minimum F number in the minimum focal length, and minimum F \
+ number in the maximum focal length, */
+#define EXIFTAG_LENSMAKE 42035 /* the lens manufacturer */
+#define EXIFTAG_LENSMODEL 42036 /* the lens model name and model number */
+#define EXIFTAG_LENSSERIALNUMBER \
+ 42037 /* the serial number of the interchangeable lens */
+#define EXIFTAG_GAMMA 42240 /* value of coefficient gamma */
+#define EXIFTAG_COMPOSITEIMAGE 42080 /* composite image */
+#define EXIFTAG_SOURCEIMAGENUMBEROFCOMPOSITEIMAGE \
+ 42081 /* source image number of composite image */
+#define EXIFTAG_SOURCEEXPOSURETIMESOFCOMPOSITEIMAGE \
+ 42082 /* source exposure times of composite image */
-/* vim: set ts=8 sts=8 sw=8 noet: */
/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
+ * EXIF-GPS tags (Version 2.31, July 2016)
*/
+#define GPSTAG_VERSIONID 0 /* Indicates the version of GPSInfoIFD. */
+#define GPSTAG_LATITUDEREF \
+ 1 /* Indicates whether the latitude is north or south latitude. \
+ */
+#define GPSTAG_LATITUDE 2 /* Indicates the latitude. */
+#define GPSTAG_LONGITUDEREF \
+ 3 /* Indicates whether the longitude is east or west longitude. \
+ */
+#define GPSTAG_LONGITUDE 4 /* Indicates the longitude. */
+#define GPSTAG_ALTITUDEREF \
+ 5 /* Indicates the altitude used as the reference altitude. */
+#define GPSTAG_ALTITUDE \
+ 6 /* Indicates the altitude based on the reference in \
+ GPSAltitudeRef. */
+#define GPSTAG_TIMESTAMP \
+ 7 /* Indicates the time as UTC (Coordinated Universal Time). */
+#define GPSTAG_SATELLITES \
+ 8 /* Indicates the GPS satellites used for measurements. */
+#define GPSTAG_STATUS \
+ 9 /* Indicates the status of the GPS receiver when the image is \
+ recorded. */
+#define GPSTAG_MEASUREMODE \
+ 10 /* Indicates the GPS measurement mode. */
+#define GPSTAG_DOP \
+ 11 /* Indicates the GPS DOP (data degree of precision). */
+#define GPSTAG_SPEEDREF \
+ 12 /* Indicates the unit used to express the GPS receiver speed of \
+ movement. */
+#define GPSTAG_SPEED \
+ 13 /* Indicates the speed of GPS receiver movement. */
+#define GPSTAG_TRACKREF \
+ 14 /* Indicates the reference for giving the direction of GPS \
+ receiver movement. */
+#define GPSTAG_TRACK \
+ 15 /* Indicates the direction of GPS receiver movement. */
+#define GPSTAG_IMGDIRECTIONREF \
+ 16 /* Indicates the reference for giving the direction of the image \
+ when it is captured. */
+#define GPSTAG_IMGDIRECTION \
+ 17 /* Indicates the direction of the image when it was captured. \
+ */
+#define GPSTAG_MAPDATUM \
+ 18 /* Indicates the geodetic survey data used by the GPS receiver. \
+ (e.g. WGS-84) */
+#define GPSTAG_DESTLATITUDEREF \
+ 19 /* Indicates whether the latitude of the destination point is \
+ north or south latitude. */
+#define GPSTAG_DESTLATITUDE \
+ 20 /* Indicates the latitude of the destination point. */
+#define GPSTAG_DESTLONGITUDEREF \
+ 21 /* Indicates whether the longitude of the destination point is \
+ east or west longitude. */
+#define GPSTAG_DESTLONGITUDE \
+ 22 /* Indicates the longitude of the destination point. */
+#define GPSTAG_DESTBEARINGREF \
+ 23 /* Indicates the reference used for giving the bearing to the \
+ destination point. */
+#define GPSTAG_DESTBEARING \
+ 24 /* Indicates the bearing to the destination point. */
+#define GPSTAG_DESTDISTANCEREF \
+ 25 /* Indicates the unit used to express the distance to the \
+ destination point. */
+#define GPSTAG_DESTDISTANCE \
+ 26 /* Indicates the distance to the destination point. */
+#define GPSTAG_PROCESSINGMETHOD \
+ 27 /* A character string recording the name of the method used for \
+ location finding. */
+#define GPSTAG_AREAINFORMATION \
+ 28 /* A character string recording the name of the GPS area. */
+#define GPSTAG_DATESTAMP \
+ 29 /* A character string recording date and time information \
+ relative to UTC (Coordinated Universal Time). */
+#define GPSTAG_DIFFERENTIAL \
+ 30 /* Indicates whether differential correction is applied to the \
+ GPS receiver. */
+#define GPSTAG_GPSHPOSITIONINGERROR \
+ 31 /* Indicates horizontal positioning errors in meters. */
+
+#endif /* _TIFF_ */
diff --git a/src/3rdparty/libtiff/libtiff/tiffconf.h b/src/3rdparty/libtiff/libtiff/tiffconf.h
index f37b0b5..57e50df 100644
--- a/src/3rdparty/libtiff/libtiff/tiffconf.h
+++ b/src/3rdparty/libtiff/libtiff/tiffconf.h
@@ -9,29 +9,36 @@
#include <qglobal.h>
+#define TIFF_DISABLE_DEPRECATED 1
+
+#include <stddef.h>
+#include <stdint.h>
+#include <inttypes.h>
+
+
/* Signed 16-bit type */
-#define TIFF_INT16_T qint16
+/* #undef TIFF_INT16_T */
/* Signed 32-bit type */
-#define TIFF_INT32_T qint32
+/* #undef TIFF_INT32_T */
/* Signed 64-bit type */
-#define TIFF_INT64_T qint64
+/* #undef TIFF_INT64_T */
/* Signed 8-bit type */
-#define TIFF_INT8_T qint8
+/* #undef TIFF_INT8_T */
/* Unsigned 16-bit type */
-#define TIFF_UINT16_T quint16
+/* #undef TIFF_UINT16_T */
/* Unsigned 32-bit type */
-#define TIFF_UINT32_T quint32
+/* #undef TIFF_UINT32_T */
/* Unsigned 64-bit type */
-#define TIFF_UINT64_T quint64
+/* #undef TIFF_UINT64_T */
/* Unsigned 8-bit type */
-#define TIFF_UINT8_T quint8
+/* #undef TIFF_UINT8_T */
/* Signed size type */
#if QT_POINTER_SIZE == 4
@@ -40,21 +47,9 @@
#define TIFF_SSIZE_T qint64
#endif
-/* Pointer difference type */
-#define TIFF_PTRDIFF_T ptrdiff_t
-
-/* Define to 1 if the system has the type `int16'. */
-/* #undef HAVE_INT16 */
-
-/* Define to 1 if the system has the type `int32'. */
-/* #undef HAVE_INT32 */
-
-/* Define to 1 if the system has the type `int8'. */
-/* #undef HAVE_INT8 */
-
/* Compatibility stuff. */
-/* Define as 0 or 1 according to the floating point format suported by the
+/* Define as 0 or 1 according to the floating point format supported by the
machine */
#define HAVE_IEEEFP 1
@@ -75,6 +70,12 @@
/* Support JPEG compression (requires IJG JPEG library) */
/* #undef JPEG_SUPPORT */
+/* Support JBIG compression (requires JBIG-KIT library) */
+/* #undef JBIG_SUPPORT */
+
+/* Support LERC compression */
+/* #undef LERC_SUPPORT */
+
/* Support LogLuv high dynamic range encoding */
#define LOGLUV_SUPPORT 1
@@ -100,8 +101,11 @@
/* Support Deflate compression */
#define ZIP_SUPPORT 1
+/* Support libdeflate enhanced compression */
+/* #undef LIBDEFLATE_SUPPORT */
+
/* Support strip chopping (whether or not to convert single-strip uncompressed
- images to mutiple strips of ~8Kb to reduce memory usage) */
+ images to multiple strips of ~8Kb to reduce memory usage) */
#define STRIPCHOP_DEFAULT TIFF_STRIPCHOP
/* Enable SubIFD tag (330) support */
@@ -114,7 +118,7 @@
/* Pick up YCbCr subsampling info from the JPEG data stream to support files
lacking the tag (default enabled). */
-#define CHECK_JPEG_YCBCR_SUBSAMPLING 1
+/* #undef CHECK_JPEG_YCBCR_SUBSAMPLING */
/* Support MS MDI magic number files as TIFF */
#define MDI_SUPPORT 1
diff --git a/src/3rdparty/libtiff/libtiff/tiffconf.vc.h b/src/3rdparty/libtiff/libtiff/tiffconf.h.cmake.in
index fb37a75..5afbf3b 100644
--- a/src/3rdparty/libtiff/libtiff/tiffconf.vc.h
+++ b/src/3rdparty/libtiff/libtiff/tiffconf.h.cmake.in
@@ -7,128 +7,110 @@
#ifndef _TIFFCONF_
#define _TIFFCONF_
-/* The size of a `int', as computed by sizeof. */
-#define SIZEOF_INT 4
-/* Signed 8-bit type */
-#define TIFF_INT8_T signed char
+#include <stddef.h>
+#include <stdint.h>
+#include <inttypes.h>
-/* Unsigned 8-bit type */
-#define TIFF_UINT8_T unsigned char
/* Signed 16-bit type */
-#define TIFF_INT16_T signed short
-
-/* Unsigned 16-bit type */
-#define TIFF_UINT16_T unsigned short
-
-/* Signed 32-bit type formatter */
-#define TIFF_INT32_FORMAT "%d"
+#define TIFF_INT16_T @TIFF_INT16_T@
/* Signed 32-bit type */
-#define TIFF_INT32_T signed int
-
-/* Unsigned 32-bit type formatter */
-#define TIFF_UINT32_FORMAT "%u"
-
-/* Unsigned 32-bit type */
-#define TIFF_UINT32_T unsigned int
-
-/* Signed 64-bit type formatter */
-#define TIFF_INT64_FORMAT "%I64d"
+#define TIFF_INT32_T @TIFF_INT32_T@
/* Signed 64-bit type */
-#define TIFF_INT64_T signed __int64
+#define TIFF_INT64_T @TIFF_INT64_T@
-/* Unsigned 64-bit type formatter */
-#define TIFF_UINT64_FORMAT "%I64u"
+/* Signed 8-bit type */
+#define TIFF_INT8_T @TIFF_INT8_T@
-/* Unsigned 64-bit type */
-#define TIFF_UINT64_T unsigned __int64
+/* Unsigned 16-bit type */
+#define TIFF_UINT16_T @TIFF_UINT16_T@
-#if _WIN64
-/*
- Windows 64-bit build
-*/
+/* Unsigned 32-bit type */
+#define TIFF_UINT32_T @TIFF_UINT32_T@
-/* Signed size type */
-# define TIFF_SSIZE_T TIFF_INT64_T
+/* Unsigned 64-bit type */
+#define TIFF_UINT64_T @TIFF_UINT64_T@
-#else
-/*
- Windows 32-bit build
-*/
+/* Unsigned 8-bit type */
+#define TIFF_UINT8_T @TIFF_UINT8_T@
/* Signed size type */
-# define TIFF_SSIZE_T signed int
-
-#endif
+#define TIFF_SSIZE_T @TIFF_SSIZE_T@
/* Compatibility stuff. */
-/* Define as 0 or 1 according to the floating point format suported by the
+/* Define as 0 or 1 according to the floating point format supported by the
machine */
-#define HAVE_IEEEFP 1
+#cmakedefine HAVE_IEEEFP 1
/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */
-#define HOST_FILLORDER FILLORDER_LSB2MSB
+#define HOST_FILLORDER @HOST_FILLORDER@
/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian
(Intel) */
-#define HOST_BIGENDIAN 0
+#define HOST_BIGENDIAN @HOST_BIG_ENDIAN@
/* Support CCITT Group 3 & 4 algorithms */
-#define CCITT_SUPPORT 1
+#cmakedefine CCITT_SUPPORT 1
/* Support JPEG compression (requires IJG JPEG library) */
-/* #undef JPEG_SUPPORT */
+#cmakedefine JPEG_SUPPORT 1
/* Support JBIG compression (requires JBIG-KIT library) */
-/* #undef JBIG_SUPPORT */
+#cmakedefine JBIG_SUPPORT
+
+/* Support LERC compression */
+#cmakedefine LERC_SUPPORT 1
/* Support LogLuv high dynamic range encoding */
-#define LOGLUV_SUPPORT 1
+#cmakedefine LOGLUV_SUPPORT 1
/* Support LZW algorithm */
-#define LZW_SUPPORT 1
+#cmakedefine LZW_SUPPORT 1
/* Support NeXT 2-bit RLE algorithm */
-#define NEXT_SUPPORT 1
+#cmakedefine NEXT_SUPPORT 1
/* Support Old JPEG compresson (read contrib/ojpeg/README first! Compilation
fails with unpatched IJG JPEG library) */
-/* #undef OJPEG_SUPPORT */
+#cmakedefine OJPEG_SUPPORT 1
/* Support Macintosh PackBits algorithm */
-#define PACKBITS_SUPPORT 1
+#cmakedefine PACKBITS_SUPPORT 1
/* Support Pixar log-format algorithm (requires Zlib) */
-/* #undef PIXARLOG_SUPPORT */
+#cmakedefine PIXARLOG_SUPPORT 1
/* Support ThunderScan 4-bit RLE algorithm */
-#define THUNDER_SUPPORT 1
+#cmakedefine THUNDER_SUPPORT 1
/* Support Deflate compression */
-/* #undef ZIP_SUPPORT */
+#cmakedefine ZIP_SUPPORT 1
+
+/* Support libdeflate enhanced compression */
+#cmakedefine LIBDEFLATE_SUPPORT 1
/* Support strip chopping (whether or not to convert single-strip uncompressed
- images to mutiple strips of ~8Kb to reduce memory usage) */
-#define STRIPCHOP_DEFAULT TIFF_STRIPCHOP
+ images to multiple strips of ~8Kb to reduce memory usage) */
+#cmakedefine STRIPCHOP_DEFAULT TIFF_STRIPCHOP
/* Enable SubIFD tag (330) support */
-#define SUBIFD_SUPPORT 1
+#cmakedefine SUBIFD_SUPPORT 1
/* Treat extra sample as alpha (default enabled). The RGBA interface will
treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many
packages produce RGBA files but don't mark the alpha properly. */
-#define DEFAULT_EXTRASAMPLE_AS_ALPHA 1
+#cmakedefine DEFAULT_EXTRASAMPLE_AS_ALPHA 1
/* Pick up YCbCr subsampling info from the JPEG data stream to support files
lacking the tag (default enabled). */
-#define CHECK_JPEG_YCBCR_SUBSAMPLING 1
+#cmakedefine CHECK_JPEG_YCBCR_SUBSAMPLING 1
/* Support MS MDI magic number files as TIFF */
-/* #undef MDI_SUPPORT */
+#cmakedefine MDI_SUPPORT 1
/*
* Feature support definitions.
@@ -143,10 +125,3 @@
#define IPTC_SUPPORT
#endif /* _TIFFCONF_ */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tiffconf.h.in b/src/3rdparty/libtiff/libtiff/tiffconf.h.in
index 5de30c9..6703eb0 100644
--- a/src/3rdparty/libtiff/libtiff/tiffconf.h.in
+++ b/src/3rdparty/libtiff/libtiff/tiffconf.h.in
@@ -7,6 +7,12 @@
#ifndef _TIFFCONF_
#define _TIFFCONF_
+
+#include <stddef.h>
+#include <stdint.h>
+#include <inttypes.h>
+
+
/* Signed 16-bit type */
#undef TIFF_INT16_T
@@ -34,12 +40,9 @@
/* Signed size type */
#undef TIFF_SSIZE_T
-/* Pointer difference type */
-#undef TIFF_PTRDIFF_T
-
/* Compatibility stuff. */
-/* Define as 0 or 1 according to the floating point format suported by the
+/* Define as 0 or 1 according to the floating point format supported by the
machine */
#undef HAVE_IEEEFP
@@ -59,6 +62,9 @@
/* Support JBIG compression (requires JBIG-KIT library) */
#undef JBIG_SUPPORT
+/* Support LERC compression */
+#undef LERC_SUPPORT
+
/* Support LogLuv high dynamic range encoding */
#undef LOGLUV_SUPPORT
@@ -84,8 +90,11 @@
/* Support Deflate compression */
#undef ZIP_SUPPORT
+/* Support libdeflate enhanced compression */
+#undef LIBDEFLATE_SUPPORT
+
/* Support strip chopping (whether or not to convert single-strip uncompressed
- images to mutiple strips of ~8Kb to reduce memory usage) */
+ images to multiple strips of ~8Kb to reduce memory usage) */
#undef STRIPCHOP_DEFAULT
/* Enable SubIFD tag (330) support */
diff --git a/src/3rdparty/libtiff/libtiff/tiffconf.wince.h b/src/3rdparty/libtiff/libtiff/tiffconf.wince.h
deleted file mode 100644
index 013b096..0000000
--- a/src/3rdparty/libtiff/libtiff/tiffconf.wince.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Windows CE platform tiffconf.wince.h
- * Created by Mateusz Loskot (mateusz@loskot.net)
- *
- * NOTE: Requires WCELIBCEX library with wceex_* functions,
- * It's an extension to C library on Windows CE platform.
- * For example, HAVE_STDIO_H definition indicates there are
- * following files available:
- * stdio.h - from Windows CE / Windows Mobile SDK
- * wce_stdio.h - from WCELIBCEX library
- */
-
-
-/*
- Configuration defines for installed libtiff.
- This file maintained for backward compatibility. Do not use definitions
- from this file in your programs.
-*/
-
-#ifndef _WIN32_WCE
-# error This version of tif_config.h header is dedicated for Windows CE platform!
-#endif
-
-
-#ifndef _TIFFCONF_
-#define _TIFFCONF_
-
-/* The size of a `int', as computed by sizeof. */
-#define SIZEOF_INT 4
-
-/* Compatibility stuff. */
-
-/* Define as 0 or 1 according to the floating point format suported by the
- machine */
-#define HAVE_IEEEFP 1
-
-/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */
-#define HOST_FILLORDER FILLORDER_LSB2MSB
-
-/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian
- (Intel) */
-#define HOST_BIGENDIAN 0
-
-/* Support CCITT Group 3 & 4 algorithms */
-#define CCITT_SUPPORT 1
-
-/* Support JPEG compression (requires IJG JPEG library) */
-/* #undef JPEG_SUPPORT */
-
-/* Support LogLuv high dynamic range encoding */
-#define LOGLUV_SUPPORT 1
-
-/* Support LZW algorithm */
-#define LZW_SUPPORT 1
-
-/* Support NeXT 2-bit RLE algorithm */
-#define NEXT_SUPPORT 1
-
-/* Support Old JPEG compresson (read contrib/ojpeg/README first! Compilation
- fails with unpatched IJG JPEG library) */
-/* #undef OJPEG_SUPPORT */
-
-/* Support Macintosh PackBits algorithm */
-#define PACKBITS_SUPPORT 1
-
-/* Support Pixar log-format algorithm (requires Zlib) */
-/* #undef PIXARLOG_SUPPORT */
-
-/* Support ThunderScan 4-bit RLE algorithm */
-#define THUNDER_SUPPORT 1
-
-/* Support Deflate compression */
-/* #undef ZIP_SUPPORT */
-
-/* Support strip chopping (whether or not to convert single-strip uncompressed
- images to mutiple strips of ~8Kb to reduce memory usage) */
-#define STRIPCHOP_DEFAULT TIFF_STRIPCHOP
-
-/* Enable SubIFD tag (330) support */
-#define SUBIFD_SUPPORT 1
-
-/* Treat extra sample as alpha (default enabled). The RGBA interface will
- treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many
- packages produce RGBA files but don't mark the alpha properly. */
-#define DEFAULT_EXTRASAMPLE_AS_ALPHA 1
-
-/* Pick up YCbCr subsampling info from the JPEG data stream to support files
- lacking the tag (default enabled). */
-#define CHECK_JPEG_YCBCR_SUBSAMPLING 1
-
-/*
- * Feature support definitions.
- * XXX: These macros are obsoleted. Don't use them in your apps!
- * Macros stays here for backward compatibility and should be always defined.
- */
-#define COLORIMETRY_SUPPORT
-#define YCBCR_SUPPORT
-#define CMYK_SUPPORT
-#define ICC_SUPPORT
-#define PHOTOSHOP_SUPPORT
-#define IPTC_SUPPORT
-
-#endif /* _TIFFCONF_ */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tiffio.h b/src/3rdparty/libtiff/libtiff/tiffio.h
index 198481d..4df5766 100644
--- a/src/3rdparty/libtiff/libtiff/tiffio.h
+++ b/src/3rdparty/libtiff/libtiff/tiffio.h
@@ -23,7 +23,7 @@
*/
#ifndef _TIFFIO_
-#define _TIFFIO_
+#define _TIFFIO_
/*
* TIFF I/O Library Definitions.
@@ -60,20 +60,22 @@ typedef struct tiff TIFF;
*/
/*
* this is the machine addressing size type, only it's signed, so make it
- * int32 on 32bit machines, int64 on 64bit machines
+ * int32_t on 32bit machines, int64_t on 64bit machines
*/
typedef TIFF_SSIZE_T tmsize_t;
-typedef uint64 toff_t; /* file offset */
+#define TIFF_TMSIZE_T_MAX (tmsize_t)(SIZE_MAX >> 1)
+
+typedef uint64_t toff_t; /* file offset */
/* the following are deprecated and should be replaced by their defining
counterparts */
-typedef uint32 ttag_t; /* directory tag */
-typedef uint16 tdir_t; /* directory index */
-typedef uint16 tsample_t; /* sample number */
-typedef uint32 tstrile_t; /* strip or tile number */
-typedef tstrile_t tstrip_t; /* strip number */
-typedef tstrile_t ttile_t; /* tile number */
-typedef tmsize_t tsize_t; /* i/o size in bytes */
-typedef void* tdata_t; /* image data ref */
+typedef uint32_t ttag_t; /* directory tag */
+typedef uint32_t tdir_t; /* directory index */
+typedef uint16_t tsample_t; /* sample number */
+typedef uint32_t tstrile_t; /* strip or tile number */
+typedef tstrile_t tstrip_t; /* strip number */
+typedef tstrile_t ttile_t; /* tile number */
+typedef tmsize_t tsize_t; /* i/o size in bytes */
+typedef void *tdata_t; /* image data ref */
#if !defined(__WIN32__) && (defined(_WIN32) || defined(WIN32))
#define __WIN32__
@@ -87,21 +89,22 @@ typedef void* tdata_t; /* image data ref */
*/
#if defined(_WINDOWS) || defined(__WIN32__) || defined(_Windows)
-# if !defined(__CYGWIN) && !defined(AVOID_WIN32_FILEIO) && !defined(USE_WIN32_FILEIO)
-# define AVOID_WIN32_FILEIO
-# endif
+#if !defined(__CYGWIN) && !defined(AVOID_WIN32_FILEIO) && \
+ !defined(USE_WIN32_FILEIO)
+#define AVOID_WIN32_FILEIO
+#endif
#endif
#if defined(USE_WIN32_FILEIO)
-# define VC_EXTRALEAN
-# include <windows.h>
-# ifdef __WIN32__
-DECLARE_HANDLE(thandle_t); /* Win32 file handle */
-# else
-typedef HFILE thandle_t; /* client data handle */
-# endif /* __WIN32__ */
+#define VC_EXTRALEAN
+#include <windows.h>
+#ifdef __WIN32__
+DECLARE_HANDLE(thandle_t); /* Win32 file handle */
+#else
+typedef HFILE thandle_t; /* client data handle */
+#endif /* __WIN32__ */
#else
-typedef void* thandle_t; /* client data handle */
+typedef void *thandle_t; /* client data handle */
#endif /* USE_WIN32_FILEIO */
/*
@@ -110,15 +113,15 @@ typedef void* thandle_t; /* client data handle */
* very large. Bit-or these flags to enable printing
* multiple items.
*/
-#define TIFFPRINT_NONE 0x0 /* no extra info */
-#define TIFFPRINT_STRIPS 0x1 /* strips/tiles info */
-#define TIFFPRINT_CURVES 0x2 /* color/gray response curves */
-#define TIFFPRINT_COLORMAP 0x4 /* colormap */
-#define TIFFPRINT_JPEGQTABLES 0x100 /* JPEG Q matrices */
-#define TIFFPRINT_JPEGACTABLES 0x200 /* JPEG AC tables */
-#define TIFFPRINT_JPEGDCTABLES 0x200 /* JPEG DC tables */
-
-/*
+#define TIFFPRINT_NONE 0x0 /* no extra info */
+#define TIFFPRINT_STRIPS 0x1 /* strips/tiles info */
+#define TIFFPRINT_CURVES 0x2 /* color/gray response curves */
+#define TIFFPRINT_COLORMAP 0x4 /* colormap */
+#define TIFFPRINT_JPEGQTABLES 0x100 /* JPEG Q matrices */
+#define TIFFPRINT_JPEGACTABLES 0x200 /* JPEG AC tables */
+#define TIFFPRINT_JPEGDCTABLES 0x200 /* JPEG DC tables */
+
+/*
* Colour conversion stuff
*/
@@ -133,42 +136,45 @@ typedef void* thandle_t; /* client data handle */
/* Structure for holding information about a display device. */
-typedef unsigned char TIFFRGBValue; /* 8-bit samples */
-
-typedef struct {
- float d_mat[3][3]; /* XYZ -> luminance matrix */
- float d_YCR; /* Light o/p for reference white */
- float d_YCG;
- float d_YCB;
- uint32 d_Vrwr; /* Pixel values for ref. white */
- uint32 d_Vrwg;
- uint32 d_Vrwb;
- float d_Y0R; /* Residual light for black pixel */
- float d_Y0G;
- float d_Y0B;
- float d_gammaR; /* Gamma values for the three guns */
- float d_gammaG;
- float d_gammaB;
+typedef unsigned char TIFFRGBValue; /* 8-bit samples */
+
+typedef struct
+{
+ float d_mat[3][3]; /* XYZ -> luminance matrix */
+ float d_YCR; /* Light o/p for reference white */
+ float d_YCG;
+ float d_YCB;
+ uint32_t d_Vrwr; /* Pixel values for ref. white */
+ uint32_t d_Vrwg;
+ uint32_t d_Vrwb;
+ float d_Y0R; /* Residual light for black pixel */
+ float d_Y0G;
+ float d_Y0B;
+ float d_gammaR; /* Gamma values for the three guns */
+ float d_gammaG;
+ float d_gammaB;
} TIFFDisplay;
-typedef struct { /* YCbCr->RGB support */
- TIFFRGBValue* clamptab; /* range clamping table */
- int* Cr_r_tab;
- int* Cb_b_tab;
- int32* Cr_g_tab;
- int32* Cb_g_tab;
- int32* Y_tab;
+typedef struct
+{ /* YCbCr->RGB support */
+ TIFFRGBValue *clamptab; /* range clamping table */
+ int *Cr_r_tab;
+ int *Cb_b_tab;
+ int32_t *Cr_g_tab;
+ int32_t *Cb_g_tab;
+ int32_t *Y_tab;
} TIFFYCbCrToRGB;
-typedef struct { /* CIE Lab 1976->RGB support */
- int range; /* Size of conversion table */
+typedef struct
+{ /* CIE Lab 1976->RGB support */
+ int range; /* Size of conversion table */
#define CIELABTORGB_TABLE_RANGE 1500
- float rstep, gstep, bstep;
- float X0, Y0, Z0; /* Reference white point */
- TIFFDisplay display;
- float Yr2r[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yr to r */
- float Yg2g[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yg to g */
- float Yb2b[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yb to b */
+ float rstep, gstep, bstep;
+ float X0, Y0, Z0; /* Reference white point */
+ TIFFDisplay display;
+ float Yr2r[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yr to r */
+ float Yg2g[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yg to g */
+ float Yb2b[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yb to b */
} TIFFCIELabToRGB;
/*
@@ -178,63 +184,66 @@ typedef struct _TIFFRGBAImage TIFFRGBAImage;
/*
* The image reading and conversion routines invoke
* ``put routines'' to copy/image/whatever tiles of
- * raw image data. A default set of routines are
+ * raw image data. A default set of routines are
* provided to convert/copy raw image data to 8-bit
* packed ABGR format rasters. Applications can supply
* alternate routines that unpack the data into a
* different format or, for example, unpack the data
* and draw the unpacked raster on the display.
*/
-typedef void (*tileContigRoutine)
- (TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32,
- unsigned char*);
-typedef void (*tileSeparateRoutine)
- (TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32,
- unsigned char*, unsigned char*, unsigned char*, unsigned char*);
+typedef void (*tileContigRoutine)(TIFFRGBAImage *, uint32_t *, uint32_t,
+ uint32_t, uint32_t, uint32_t, int32_t,
+ int32_t, unsigned char *);
+typedef void (*tileSeparateRoutine)(TIFFRGBAImage *, uint32_t *, uint32_t,
+ uint32_t, uint32_t, uint32_t, int32_t,
+ int32_t, unsigned char *, unsigned char *,
+ unsigned char *, unsigned char *);
/*
* RGBA-reader state.
*/
-struct _TIFFRGBAImage {
- TIFF* tif; /* image handle */
- int stoponerr; /* stop on read error */
- int isContig; /* data is packed/separate */
- int alpha; /* type of alpha data present */
- uint32 width; /* image width */
- uint32 height; /* image height */
- uint16 bitspersample; /* image bits/sample */
- uint16 samplesperpixel; /* image samples/pixel */
- uint16 orientation; /* image orientation */
- uint16 req_orientation; /* requested orientation */
- uint16 photometric; /* image photometric interp */
- uint16* redcmap; /* colormap palette */
- uint16* greencmap;
- uint16* bluecmap;
- /* get image data routine */
- int (*get)(TIFFRGBAImage*, uint32*, uint32, uint32);
- /* put decoded strip/tile */
- union {
- void (*any)(TIFFRGBAImage*);
- tileContigRoutine contig;
- tileSeparateRoutine separate;
- } put;
- TIFFRGBValue* Map; /* sample mapping array */
- uint32** BWmap; /* black&white map */
- uint32** PALmap; /* palette image map */
- TIFFYCbCrToRGB* ycbcr; /* YCbCr conversion state */
- TIFFCIELabToRGB* cielab; /* CIE L*a*b conversion state */
-
- uint8* UaToAa; /* Unassociated alpha to associated alpha conversion LUT */
- uint8* Bitdepth16To8; /* LUT for conversion from 16bit to 8bit values */
-
- int row_offset;
- int col_offset;
+struct _TIFFRGBAImage
+{
+ TIFF *tif; /* image handle */
+ int stoponerr; /* stop on read error */
+ int isContig; /* data is packed/separate */
+ int alpha; /* type of alpha data present */
+ uint32_t width; /* image width */
+ uint32_t height; /* image height */
+ uint16_t bitspersample; /* image bits/sample */
+ uint16_t samplesperpixel; /* image samples/pixel */
+ uint16_t orientation; /* image orientation */
+ uint16_t req_orientation; /* requested orientation */
+ uint16_t photometric; /* image photometric interp */
+ uint16_t *redcmap; /* colormap palette */
+ uint16_t *greencmap;
+ uint16_t *bluecmap;
+ /* get image data routine */
+ int (*get)(TIFFRGBAImage *, uint32_t *, uint32_t, uint32_t);
+ /* put decoded strip/tile */
+ union
+ {
+ void (*any)(TIFFRGBAImage *);
+ tileContigRoutine contig;
+ tileSeparateRoutine separate;
+ } put;
+ TIFFRGBValue *Map; /* sample mapping array */
+ uint32_t **BWmap; /* black&white map */
+ uint32_t **PALmap; /* palette image map */
+ TIFFYCbCrToRGB *ycbcr; /* YCbCr conversion state */
+ TIFFCIELabToRGB *cielab; /* CIE L*a*b conversion state */
+
+ uint8_t *UaToAa; /* Unassociated alpha to associated alpha conversion LUT */
+ uint8_t *Bitdepth16To8; /* LUT for conversion from 16bit to 8bit values */
+
+ int row_offset;
+ int col_offset;
};
/*
* Macros for extracting components from the
* packed ABGR form returned by TIFFReadRGBAImage.
*/
-#define TIFFGetR(abgr) ((abgr) & 0xff)
+#define TIFFGetR(abgr) ((abgr)&0xff)
#define TIFFGetG(abgr) (((abgr) >> 8) & 0xff)
#define TIFFGetB(abgr) (((abgr) >> 16) & 0xff)
#define TIFFGetA(abgr) (((abgr) >> 24) & 0xff)
@@ -246,323 +255,393 @@ struct _TIFFRGBAImage {
* More codecs may be registered through calls to the library
* and/or the builtin implementations may be overridden.
*/
-typedef int (*TIFFInitMethod)(TIFF*, int);
-typedef struct {
- char* name;
- uint16 scheme;
- TIFFInitMethod init;
+typedef int (*TIFFInitMethod)(TIFF *, int);
+typedef struct
+{
+ char *name;
+ uint16_t scheme;
+ TIFFInitMethod init;
} TIFFCodec;
-#include <stdio.h>
#include <stdarg.h>
+#include <stdio.h>
/* share internal LogLuv conversion routines? */
#ifndef LOGLUV_PUBLIC
#define LOGLUV_PUBLIC 1
#endif
-#if !defined(__GNUC__) && !defined(__attribute__)
-# define __attribute__(x) /*nothing*/
+#if defined(__GNUC__) || defined(__attribute__)
+#define TIFF_ATTRIBUTE(x) __attribute__(x)
+#else
+#define TIFF_ATTRIBUTE(x) /*nothing*/
#endif
#if defined(c_plusplus) || defined(__cplusplus)
-extern "C" {
+extern "C"
+{
#endif
-typedef void (*TIFFErrorHandler)(const char*, const char*, va_list);
-typedef void (*TIFFErrorHandlerExt)(thandle_t, const char*, const char*, va_list);
-typedef tmsize_t (*TIFFReadWriteProc)(thandle_t, void*, tmsize_t);
-typedef toff_t (*TIFFSeekProc)(thandle_t, toff_t, int);
-typedef int (*TIFFCloseProc)(thandle_t);
-typedef toff_t (*TIFFSizeProc)(thandle_t);
-typedef int (*TIFFMapFileProc)(thandle_t, void** base, toff_t* size);
-typedef void (*TIFFUnmapFileProc)(thandle_t, void* base, toff_t size);
-typedef void (*TIFFExtendProc)(TIFF*);
-
-extern const char* TIFFGetVersion(void);
-
-extern const TIFFCodec* TIFFFindCODEC(uint16);
-extern TIFFCodec* TIFFRegisterCODEC(uint16, const char*, TIFFInitMethod);
-extern void TIFFUnRegisterCODEC(TIFFCodec*);
-extern int TIFFIsCODECConfigured(uint16);
-extern TIFFCodec* TIFFGetConfiguredCODECs(void);
-
-/*
- * Auxiliary functions.
- */
-
-extern void* _TIFFmalloc(tmsize_t s);
-extern void* _TIFFcalloc(tmsize_t nmemb, tmsize_t siz);
-extern void* _TIFFrealloc(void* p, tmsize_t s);
-extern void _TIFFmemset(void* p, int v, tmsize_t c);
-extern void _TIFFmemcpy(void* d, const void* s, tmsize_t c);
-extern int _TIFFmemcmp(const void* p1, const void* p2, tmsize_t c);
-extern void _TIFFfree(void* p);
-
-/*
-** Stuff, related to tag handling and creating custom tags.
-*/
-extern int TIFFGetTagListCount( TIFF * );
-extern uint32 TIFFGetTagListEntry( TIFF *, int tag_index );
-
-#define TIFF_ANY TIFF_NOTYPE /* for field descriptor searching */
-#define TIFF_VARIABLE -1 /* marker for variable length tags */
-#define TIFF_SPP -2 /* marker for SamplesPerPixel tags */
-#define TIFF_VARIABLE2 -3 /* marker for uint32 var-length tags */
-
-#define FIELD_CUSTOM 65
-
-typedef struct _TIFFField TIFFField;
-typedef struct _TIFFFieldArray TIFFFieldArray;
-
-extern const TIFFField* TIFFFindField(TIFF *, uint32, TIFFDataType);
-extern const TIFFField* TIFFFieldWithTag(TIFF*, uint32);
-extern const TIFFField* TIFFFieldWithName(TIFF*, const char *);
-
-extern uint32 TIFFFieldTag(const TIFFField*);
-extern const char* TIFFFieldName(const TIFFField*);
-extern TIFFDataType TIFFFieldDataType(const TIFFField*);
-extern int TIFFFieldPassCount(const TIFFField*);
-extern int TIFFFieldReadCount(const TIFFField*);
-extern int TIFFFieldWriteCount(const TIFFField*);
-
-typedef int (*TIFFVSetMethod)(TIFF*, uint32, va_list);
-typedef int (*TIFFVGetMethod)(TIFF*, uint32, va_list);
-typedef void (*TIFFPrintMethod)(TIFF*, FILE*, long);
-
-typedef struct {
- TIFFVSetMethod vsetfield; /* tag set routine */
- TIFFVGetMethod vgetfield; /* tag get routine */
- TIFFPrintMethod printdir; /* directory print routine */
-} TIFFTagMethods;
-
-extern TIFFTagMethods *TIFFAccessTagMethods(TIFF *);
-extern void *TIFFGetClientInfo(TIFF *, const char *);
-extern void TIFFSetClientInfo(TIFF *, void *, const char *);
-
-extern void TIFFCleanup(TIFF* tif);
-extern void TIFFClose(TIFF* tif);
-extern int TIFFFlush(TIFF* tif);
-extern int TIFFFlushData(TIFF* tif);
-extern int TIFFGetField(TIFF* tif, uint32 tag, ...);
-extern int TIFFVGetField(TIFF* tif, uint32 tag, va_list ap);
-extern int TIFFGetFieldDefaulted(TIFF* tif, uint32 tag, ...);
-extern int TIFFVGetFieldDefaulted(TIFF* tif, uint32 tag, va_list ap);
-extern int TIFFReadDirectory(TIFF* tif);
-extern int TIFFReadCustomDirectory(TIFF* tif, toff_t diroff, const TIFFFieldArray* infoarray);
-extern int TIFFReadEXIFDirectory(TIFF* tif, toff_t diroff);
-extern uint64 TIFFScanlineSize64(TIFF* tif);
-extern tmsize_t TIFFScanlineSize(TIFF* tif);
-extern uint64 TIFFRasterScanlineSize64(TIFF* tif);
-extern tmsize_t TIFFRasterScanlineSize(TIFF* tif);
-extern uint64 TIFFStripSize64(TIFF* tif);
-extern tmsize_t TIFFStripSize(TIFF* tif);
-extern uint64 TIFFRawStripSize64(TIFF* tif, uint32 strip);
-extern tmsize_t TIFFRawStripSize(TIFF* tif, uint32 strip);
-extern uint64 TIFFVStripSize64(TIFF* tif, uint32 nrows);
-extern tmsize_t TIFFVStripSize(TIFF* tif, uint32 nrows);
-extern uint64 TIFFTileRowSize64(TIFF* tif);
-extern tmsize_t TIFFTileRowSize(TIFF* tif);
-extern uint64 TIFFTileSize64(TIFF* tif);
-extern tmsize_t TIFFTileSize(TIFF* tif);
-extern uint64 TIFFVTileSize64(TIFF* tif, uint32 nrows);
-extern tmsize_t TIFFVTileSize(TIFF* tif, uint32 nrows);
-extern uint32 TIFFDefaultStripSize(TIFF* tif, uint32 request);
-extern void TIFFDefaultTileSize(TIFF*, uint32*, uint32*);
-extern int TIFFFileno(TIFF*);
-extern int TIFFSetFileno(TIFF*, int);
-extern thandle_t TIFFClientdata(TIFF*);
-extern thandle_t TIFFSetClientdata(TIFF*, thandle_t);
-extern int TIFFGetMode(TIFF*);
-extern int TIFFSetMode(TIFF*, int);
-extern int TIFFIsTiled(TIFF*);
-extern int TIFFIsByteSwapped(TIFF*);
-extern int TIFFIsUpSampled(TIFF*);
-extern int TIFFIsMSB2LSB(TIFF*);
-extern int TIFFIsBigEndian(TIFF*);
-extern TIFFReadWriteProc TIFFGetReadProc(TIFF*);
-extern TIFFReadWriteProc TIFFGetWriteProc(TIFF*);
-extern TIFFSeekProc TIFFGetSeekProc(TIFF*);
-extern TIFFCloseProc TIFFGetCloseProc(TIFF*);
-extern TIFFSizeProc TIFFGetSizeProc(TIFF*);
-extern TIFFMapFileProc TIFFGetMapFileProc(TIFF*);
-extern TIFFUnmapFileProc TIFFGetUnmapFileProc(TIFF*);
-extern uint32 TIFFCurrentRow(TIFF*);
-extern uint16 TIFFCurrentDirectory(TIFF*);
-extern uint16 TIFFNumberOfDirectories(TIFF*);
-extern uint64 TIFFCurrentDirOffset(TIFF*);
-extern uint32 TIFFCurrentStrip(TIFF*);
-extern uint32 TIFFCurrentTile(TIFF* tif);
-extern int TIFFReadBufferSetup(TIFF* tif, void* bp, tmsize_t size);
-extern int TIFFWriteBufferSetup(TIFF* tif, void* bp, tmsize_t size);
-extern int TIFFSetupStrips(TIFF *);
-extern int TIFFWriteCheck(TIFF*, int, const char *);
-extern void TIFFFreeDirectory(TIFF*);
-extern int TIFFCreateDirectory(TIFF*);
-extern int TIFFCreateCustomDirectory(TIFF*,const TIFFFieldArray*);
-extern int TIFFCreateEXIFDirectory(TIFF*);
-extern int TIFFLastDirectory(TIFF*);
-extern int TIFFSetDirectory(TIFF*, uint16);
-extern int TIFFSetSubDirectory(TIFF*, uint64);
-extern int TIFFUnlinkDirectory(TIFF*, uint16);
-extern int TIFFSetField(TIFF*, uint32, ...);
-extern int TIFFVSetField(TIFF*, uint32, va_list);
-extern int TIFFUnsetField(TIFF*, uint32);
-extern int TIFFWriteDirectory(TIFF *);
-extern int TIFFWriteCustomDirectory(TIFF *, uint64 *);
-extern int TIFFCheckpointDirectory(TIFF *);
-extern int TIFFRewriteDirectory(TIFF *);
-extern int TIFFDeferStrileArrayWriting(TIFF *);
-extern int TIFFForceStrileArrayWriting(TIFF* );
+ typedef void (*TIFFErrorHandler)(const char *, const char *, va_list);
+ typedef void (*TIFFErrorHandlerExt)(thandle_t, const char *, const char *,
+ va_list);
+ typedef int (*TIFFErrorHandlerExtR)(TIFF *, void *user_data, const char *,
+ const char *, va_list);
+ typedef tmsize_t (*TIFFReadWriteProc)(thandle_t, void *, tmsize_t);
+ typedef toff_t (*TIFFSeekProc)(thandle_t, toff_t, int);
+ typedef int (*TIFFCloseProc)(thandle_t);
+ typedef toff_t (*TIFFSizeProc)(thandle_t);
+ typedef int (*TIFFMapFileProc)(thandle_t, void **base, toff_t *size);
+ typedef void (*TIFFUnmapFileProc)(thandle_t, void *base, toff_t size);
+ typedef void (*TIFFExtendProc)(TIFF *);
+
+ extern const char *TIFFGetVersion(void);
+
+ extern const TIFFCodec *TIFFFindCODEC(uint16_t);
+ extern TIFFCodec *TIFFRegisterCODEC(uint16_t, const char *, TIFFInitMethod);
+ extern void TIFFUnRegisterCODEC(TIFFCodec *);
+ extern int TIFFIsCODECConfigured(uint16_t);
+ extern TIFFCodec *TIFFGetConfiguredCODECs(void);
+
+ /*
+ * Auxiliary functions.
+ */
+
+ extern void *_TIFFmalloc(tmsize_t s);
+ extern void *_TIFFcalloc(tmsize_t nmemb, tmsize_t siz);
+ extern void *_TIFFrealloc(void *p, tmsize_t s);
+ extern void _TIFFmemset(void *p, int v, tmsize_t c);
+ extern void _TIFFmemcpy(void *d, const void *s, tmsize_t c);
+ extern int _TIFFmemcmp(const void *p1, const void *p2, tmsize_t c);
+ extern void _TIFFfree(void *p);
+
+ /*
+ ** Stuff, related to tag handling and creating custom tags.
+ */
+ extern int TIFFGetTagListCount(TIFF *);
+ extern uint32_t TIFFGetTagListEntry(TIFF *, int tag_index);
+
+#define TIFF_ANY TIFF_NOTYPE /* for field descriptor searching */
+#define TIFF_VARIABLE -1 /* marker for variable length tags */
+#define TIFF_SPP -2 /* marker for SamplesPerPixel tags */
+#define TIFF_VARIABLE2 -3 /* marker for uint32_t var-length tags */
+
+#define FIELD_CUSTOM 65
+
+ typedef struct _TIFFField TIFFField;
+ typedef struct _TIFFFieldArray TIFFFieldArray;
+
+ extern const TIFFField *TIFFFindField(TIFF *, uint32_t, TIFFDataType);
+ extern const TIFFField *TIFFFieldWithTag(TIFF *, uint32_t);
+ extern const TIFFField *TIFFFieldWithName(TIFF *, const char *);
+
+ extern uint32_t TIFFFieldTag(const TIFFField *);
+ extern const char *TIFFFieldName(const TIFFField *);
+ extern TIFFDataType TIFFFieldDataType(const TIFFField *);
+ extern int TIFFFieldPassCount(const TIFFField *);
+ extern int TIFFFieldReadCount(const TIFFField *);
+ extern int TIFFFieldWriteCount(const TIFFField *);
+ extern int
+ TIFFFieldSetGetSize(const TIFFField *); /* returns internal storage size of
+ TIFFSetGetFieldType in bytes. */
+ extern int TIFFFieldSetGetCountSize(
+ const TIFFField *); /* returns size of count parameter 0=none,
+ 2=uint16_t, 4=uint32_t */
+ extern int TIFFFieldIsAnonymous(const TIFFField *);
+
+ typedef int (*TIFFVSetMethod)(TIFF *, uint32_t, va_list);
+ typedef int (*TIFFVGetMethod)(TIFF *, uint32_t, va_list);
+ typedef void (*TIFFPrintMethod)(TIFF *, FILE *, long);
+
+ typedef struct
+ {
+ TIFFVSetMethod vsetfield; /* tag set routine */
+ TIFFVGetMethod vgetfield; /* tag get routine */
+ TIFFPrintMethod printdir; /* directory print routine */
+ } TIFFTagMethods;
+
+ extern TIFFTagMethods *TIFFAccessTagMethods(TIFF *);
+ extern void *TIFFGetClientInfo(TIFF *, const char *);
+ extern void TIFFSetClientInfo(TIFF *, void *, const char *);
+
+ extern void TIFFCleanup(TIFF *tif);
+ extern void TIFFClose(TIFF *tif);
+ extern int TIFFFlush(TIFF *tif);
+ extern int TIFFFlushData(TIFF *tif);
+ extern int TIFFGetField(TIFF *tif, uint32_t tag, ...);
+ extern int TIFFVGetField(TIFF *tif, uint32_t tag, va_list ap);
+ extern int TIFFGetFieldDefaulted(TIFF *tif, uint32_t tag, ...);
+ extern int TIFFVGetFieldDefaulted(TIFF *tif, uint32_t tag, va_list ap);
+ extern int TIFFReadDirectory(TIFF *tif);
+ extern int TIFFReadCustomDirectory(TIFF *tif, toff_t diroff,
+ const TIFFFieldArray *infoarray);
+ extern int TIFFReadEXIFDirectory(TIFF *tif, toff_t diroff);
+ extern int TIFFReadGPSDirectory(TIFF *tif, toff_t diroff);
+ extern uint64_t TIFFScanlineSize64(TIFF *tif);
+ extern tmsize_t TIFFScanlineSize(TIFF *tif);
+ extern uint64_t TIFFRasterScanlineSize64(TIFF *tif);
+ extern tmsize_t TIFFRasterScanlineSize(TIFF *tif);
+ extern uint64_t TIFFStripSize64(TIFF *tif);
+ extern tmsize_t TIFFStripSize(TIFF *tif);
+ extern uint64_t TIFFRawStripSize64(TIFF *tif, uint32_t strip);
+ extern tmsize_t TIFFRawStripSize(TIFF *tif, uint32_t strip);
+ extern uint64_t TIFFVStripSize64(TIFF *tif, uint32_t nrows);
+ extern tmsize_t TIFFVStripSize(TIFF *tif, uint32_t nrows);
+ extern uint64_t TIFFTileRowSize64(TIFF *tif);
+ extern tmsize_t TIFFTileRowSize(TIFF *tif);
+ extern uint64_t TIFFTileSize64(TIFF *tif);
+ extern tmsize_t TIFFTileSize(TIFF *tif);
+ extern uint64_t TIFFVTileSize64(TIFF *tif, uint32_t nrows);
+ extern tmsize_t TIFFVTileSize(TIFF *tif, uint32_t nrows);
+ extern uint32_t TIFFDefaultStripSize(TIFF *tif, uint32_t request);
+ extern void TIFFDefaultTileSize(TIFF *, uint32_t *, uint32_t *);
+ extern int TIFFFileno(TIFF *);
+ extern int TIFFSetFileno(TIFF *, int);
+ extern thandle_t TIFFClientdata(TIFF *);
+ extern thandle_t TIFFSetClientdata(TIFF *, thandle_t);
+ extern int TIFFGetMode(TIFF *);
+ extern int TIFFSetMode(TIFF *, int);
+ extern int TIFFIsTiled(TIFF *);
+ extern int TIFFIsByteSwapped(TIFF *);
+ extern int TIFFIsUpSampled(TIFF *);
+ extern int TIFFIsMSB2LSB(TIFF *);
+ extern int TIFFIsBigEndian(TIFF *);
+ extern int TIFFIsBigTIFF(TIFF *);
+ extern TIFFReadWriteProc TIFFGetReadProc(TIFF *);
+ extern TIFFReadWriteProc TIFFGetWriteProc(TIFF *);
+ extern TIFFSeekProc TIFFGetSeekProc(TIFF *);
+ extern TIFFCloseProc TIFFGetCloseProc(TIFF *);
+ extern TIFFSizeProc TIFFGetSizeProc(TIFF *);
+ extern TIFFMapFileProc TIFFGetMapFileProc(TIFF *);
+ extern TIFFUnmapFileProc TIFFGetUnmapFileProc(TIFF *);
+ extern uint32_t TIFFCurrentRow(TIFF *);
+ extern tdir_t TIFFCurrentDirectory(TIFF *);
+ extern tdir_t TIFFNumberOfDirectories(TIFF *);
+ extern uint64_t TIFFCurrentDirOffset(TIFF *);
+ extern uint32_t TIFFCurrentStrip(TIFF *);
+ extern uint32_t TIFFCurrentTile(TIFF *tif);
+ extern int TIFFReadBufferSetup(TIFF *tif, void *bp, tmsize_t size);
+ extern int TIFFWriteBufferSetup(TIFF *tif, void *bp, tmsize_t size);
+ extern int TIFFSetupStrips(TIFF *);
+ extern int TIFFWriteCheck(TIFF *, int, const char *);
+ extern void TIFFFreeDirectory(TIFF *);
+ extern int TIFFCreateDirectory(TIFF *);
+ extern int TIFFCreateCustomDirectory(TIFF *, const TIFFFieldArray *);
+ extern int TIFFCreateEXIFDirectory(TIFF *);
+ extern int TIFFCreateGPSDirectory(TIFF *);
+ extern int TIFFLastDirectory(TIFF *);
+ extern int TIFFSetDirectory(TIFF *, tdir_t);
+ extern int TIFFSetSubDirectory(TIFF *, uint64_t);
+ extern int TIFFUnlinkDirectory(TIFF *, tdir_t);
+ extern int TIFFSetField(TIFF *, uint32_t, ...);
+ extern int TIFFVSetField(TIFF *, uint32_t, va_list);
+ extern int TIFFUnsetField(TIFF *, uint32_t);
+ extern int TIFFWriteDirectory(TIFF *);
+ extern int TIFFWriteCustomDirectory(TIFF *, uint64_t *);
+ extern int TIFFCheckpointDirectory(TIFF *);
+ extern int TIFFRewriteDirectory(TIFF *);
+ extern int TIFFDeferStrileArrayWriting(TIFF *);
+ extern int TIFFForceStrileArrayWriting(TIFF *);
#if defined(c_plusplus) || defined(__cplusplus)
-extern void TIFFPrintDirectory(TIFF*, FILE*, long = 0);
-extern int TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample = 0);
-extern int TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample = 0);
-extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int = 0);
-extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*,
- int = ORIENTATION_BOTLEFT, int = 0);
+ extern void TIFFPrintDirectory(TIFF *, FILE *, long = 0);
+ extern int TIFFReadScanline(TIFF *tif, void *buf, uint32_t row,
+ uint16_t sample = 0);
+ extern int TIFFWriteScanline(TIFF *tif, void *buf, uint32_t row,
+ uint16_t sample = 0);
+ extern int TIFFReadRGBAImage(TIFF *, uint32_t, uint32_t, uint32_t *,
+ int = 0);
+ extern int TIFFReadRGBAImageOriented(TIFF *, uint32_t, uint32_t, uint32_t *,
+ int = ORIENTATION_BOTLEFT, int = 0);
#else
-extern void TIFFPrintDirectory(TIFF*, FILE*, long);
-extern int TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample);
-extern int TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample);
-extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int);
-extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*, int, int);
+extern void TIFFPrintDirectory(TIFF *, FILE *, long);
+extern int TIFFReadScanline(TIFF *tif, void *buf, uint32_t row,
+ uint16_t sample);
+extern int TIFFWriteScanline(TIFF *tif, void *buf, uint32_t row,
+ uint16_t sample);
+extern int TIFFReadRGBAImage(TIFF *, uint32_t, uint32_t, uint32_t *, int);
+extern int TIFFReadRGBAImageOriented(TIFF *, uint32_t, uint32_t, uint32_t *,
+ int, int);
#endif
-extern int TIFFReadRGBAStrip(TIFF*, uint32, uint32 * );
-extern int TIFFReadRGBATile(TIFF*, uint32, uint32, uint32 * );
-extern int TIFFReadRGBAStripExt(TIFF*, uint32, uint32 *, int stop_on_error );
-extern int TIFFReadRGBATileExt(TIFF*, uint32, uint32, uint32 *, int stop_on_error );
-extern int TIFFRGBAImageOK(TIFF*, char [1024]);
-extern int TIFFRGBAImageBegin(TIFFRGBAImage*, TIFF*, int, char [1024]);
-extern int TIFFRGBAImageGet(TIFFRGBAImage*, uint32*, uint32, uint32);
-extern void TIFFRGBAImageEnd(TIFFRGBAImage*);
-extern TIFF* TIFFOpen(const char*, const char*);
-# ifdef __WIN32__
-extern TIFF* TIFFOpenW(const wchar_t*, const char*);
-# endif /* __WIN32__ */
-extern TIFF* TIFFFdOpen(int, const char*, const char*);
-extern TIFF* TIFFClientOpen(const char*, const char*,
- thandle_t,
- TIFFReadWriteProc, TIFFReadWriteProc,
- TIFFSeekProc, TIFFCloseProc,
- TIFFSizeProc,
- TIFFMapFileProc, TIFFUnmapFileProc);
-extern const char* TIFFFileName(TIFF*);
-extern const char* TIFFSetFileName(TIFF*, const char *);
-extern void TIFFError(const char*, const char*, ...) __attribute__((__format__ (__printf__,2,3)));
-extern void TIFFErrorExt(thandle_t, const char*, const char*, ...) __attribute__((__format__ (__printf__,3,4)));
-extern void TIFFWarning(const char*, const char*, ...) __attribute__((__format__ (__printf__,2,3)));
-extern void TIFFWarningExt(thandle_t, const char*, const char*, ...) __attribute__((__format__ (__printf__,3,4)));
-extern TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler);
-extern TIFFErrorHandlerExt TIFFSetErrorHandlerExt(TIFFErrorHandlerExt);
-extern TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler);
-extern TIFFErrorHandlerExt TIFFSetWarningHandlerExt(TIFFErrorHandlerExt);
-extern TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc);
-extern uint32 TIFFComputeTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s);
-extern int TIFFCheckTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s);
-extern uint32 TIFFNumberOfTiles(TIFF*);
-extern tmsize_t TIFFReadTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s);
-extern tmsize_t TIFFWriteTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s);
-extern uint32 TIFFComputeStrip(TIFF*, uint32, uint16);
-extern uint32 TIFFNumberOfStrips(TIFF*);
-extern tmsize_t TIFFReadEncodedStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size);
-extern tmsize_t TIFFReadRawStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size);
-extern tmsize_t TIFFReadEncodedTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size);
-extern tmsize_t TIFFReadRawTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size);
-extern int TIFFReadFromUserBuffer(TIFF* tif, uint32 strile,
- void* inbuf, tmsize_t insize,
- void* outbuf, tmsize_t outsize);
-extern tmsize_t TIFFWriteEncodedStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc);
-extern tmsize_t TIFFWriteRawStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc);
-extern tmsize_t TIFFWriteEncodedTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc);
-extern tmsize_t TIFFWriteRawTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc);
-extern int TIFFDataWidth(TIFFDataType); /* table of tag datatype widths */
-extern void TIFFSetWriteOffset(TIFF* tif, toff_t off);
-extern void TIFFSwabShort(uint16*);
-extern void TIFFSwabLong(uint32*);
-extern void TIFFSwabLong8(uint64*);
-extern void TIFFSwabFloat(float*);
-extern void TIFFSwabDouble(double*);
-extern void TIFFSwabArrayOfShort(uint16* wp, tmsize_t n);
-extern void TIFFSwabArrayOfTriples(uint8* tp, tmsize_t n);
-extern void TIFFSwabArrayOfLong(uint32* lp, tmsize_t n);
-extern void TIFFSwabArrayOfLong8(uint64* lp, tmsize_t n);
-extern void TIFFSwabArrayOfFloat(float* fp, tmsize_t n);
-extern void TIFFSwabArrayOfDouble(double* dp, tmsize_t n);
-extern void TIFFReverseBits(uint8* cp, tmsize_t n);
-extern const unsigned char* TIFFGetBitRevTable(int);
-
-extern uint64 TIFFGetStrileOffset(TIFF *tif, uint32 strile);
-extern uint64 TIFFGetStrileByteCount(TIFF *tif, uint32 strile);
-extern uint64 TIFFGetStrileOffsetWithErr(TIFF *tif, uint32 strile, int *pbErr);
-extern uint64 TIFFGetStrileByteCountWithErr(TIFF *tif, uint32 strile, int *pbErr);
+ extern int TIFFReadRGBAStrip(TIFF *, uint32_t, uint32_t *);
+ extern int TIFFReadRGBATile(TIFF *, uint32_t, uint32_t, uint32_t *);
+ extern int TIFFReadRGBAStripExt(TIFF *, uint32_t, uint32_t *,
+ int stop_on_error);
+ extern int TIFFReadRGBATileExt(TIFF *, uint32_t, uint32_t, uint32_t *,
+ int stop_on_error);
+ extern int TIFFRGBAImageOK(TIFF *, char[1024]);
+ extern int TIFFRGBAImageBegin(TIFFRGBAImage *, TIFF *, int, char[1024]);
+ extern int TIFFRGBAImageGet(TIFFRGBAImage *, uint32_t *, uint32_t,
+ uint32_t);
+ extern void TIFFRGBAImageEnd(TIFFRGBAImage *);
+
+ extern const char *TIFFFileName(TIFF *);
+ extern const char *TIFFSetFileName(TIFF *, const char *);
+ extern void TIFFError(const char *, const char *, ...)
+ TIFF_ATTRIBUTE((__format__(__printf__, 2, 3)));
+ extern void TIFFErrorExt(thandle_t, const char *, const char *, ...)
+ TIFF_ATTRIBUTE((__format__(__printf__, 3, 4)));
+ extern void TIFFWarning(const char *, const char *, ...)
+ TIFF_ATTRIBUTE((__format__(__printf__, 2, 3)));
+ extern void TIFFWarningExt(thandle_t, const char *, const char *, ...)
+ TIFF_ATTRIBUTE((__format__(__printf__, 3, 4)));
+ extern TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler);
+ extern TIFFErrorHandlerExt TIFFSetErrorHandlerExt(TIFFErrorHandlerExt);
+ extern TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler);
+ extern TIFFErrorHandlerExt TIFFSetWarningHandlerExt(TIFFErrorHandlerExt);
+
+ extern void TIFFWarningExtR(TIFF *, const char *, const char *, ...)
+ TIFF_ATTRIBUTE((__format__(__printf__, 3, 4)));
+ extern void TIFFErrorExtR(TIFF *, const char *, const char *, ...)
+ TIFF_ATTRIBUTE((__format__(__printf__, 3, 4)));
+
+ typedef struct TIFFOpenOptions TIFFOpenOptions;
+ extern TIFFOpenOptions *TIFFOpenOptionsAlloc(void);
+ extern void TIFFOpenOptionsFree(TIFFOpenOptions *);
+ extern void
+ TIFFOpenOptionsSetMaxSingleMemAlloc(TIFFOpenOptions *opts,
+ tmsize_t max_single_mem_alloc);
+ extern void
+ TIFFOpenOptionsSetErrorHandlerExtR(TIFFOpenOptions *opts,
+ TIFFErrorHandlerExtR handler,
+ void *errorhandler_user_data);
+ extern void
+ TIFFOpenOptionsSetWarningHandlerExtR(TIFFOpenOptions *opts,
+ TIFFErrorHandlerExtR handler,
+ void *warnhandler_user_data);
+
+ extern TIFF *TIFFOpen(const char *, const char *);
+ extern TIFF *TIFFOpenExt(const char *, const char *, TIFFOpenOptions *opts);
+#ifdef __WIN32__
+ extern TIFF *TIFFOpenW(const wchar_t *, const char *);
+ extern TIFF *TIFFOpenWExt(const wchar_t *, const char *,
+ TIFFOpenOptions *opts);
+#endif /* __WIN32__ */
+ extern TIFF *TIFFFdOpen(int, const char *, const char *);
+ extern TIFF *TIFFFdOpenExt(int, const char *, const char *,
+ TIFFOpenOptions *opts);
+ extern TIFF *TIFFClientOpen(const char *, const char *, thandle_t,
+ TIFFReadWriteProc, TIFFReadWriteProc,
+ TIFFSeekProc, TIFFCloseProc, TIFFSizeProc,
+ TIFFMapFileProc, TIFFUnmapFileProc);
+ extern TIFF *TIFFClientOpenExt(const char *, const char *, thandle_t,
+ TIFFReadWriteProc, TIFFReadWriteProc,
+ TIFFSeekProc, TIFFCloseProc, TIFFSizeProc,
+ TIFFMapFileProc, TIFFUnmapFileProc,
+ TIFFOpenOptions *opts);
+ extern TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc);
+ extern uint32_t TIFFComputeTile(TIFF *tif, uint32_t x, uint32_t y,
+ uint32_t z, uint16_t s);
+ extern int TIFFCheckTile(TIFF *tif, uint32_t x, uint32_t y, uint32_t z,
+ uint16_t s);
+ extern uint32_t TIFFNumberOfTiles(TIFF *);
+ extern tmsize_t TIFFReadTile(TIFF *tif, void *buf, uint32_t x, uint32_t y,
+ uint32_t z, uint16_t s);
+ extern tmsize_t TIFFWriteTile(TIFF *tif, void *buf, uint32_t x, uint32_t y,
+ uint32_t z, uint16_t s);
+ extern uint32_t TIFFComputeStrip(TIFF *, uint32_t, uint16_t);
+ extern uint32_t TIFFNumberOfStrips(TIFF *);
+ extern tmsize_t TIFFReadEncodedStrip(TIFF *tif, uint32_t strip, void *buf,
+ tmsize_t size);
+ extern tmsize_t TIFFReadRawStrip(TIFF *tif, uint32_t strip, void *buf,
+ tmsize_t size);
+ extern tmsize_t TIFFReadEncodedTile(TIFF *tif, uint32_t tile, void *buf,
+ tmsize_t size);
+ extern tmsize_t TIFFReadRawTile(TIFF *tif, uint32_t tile, void *buf,
+ tmsize_t size);
+ extern int TIFFReadFromUserBuffer(TIFF *tif, uint32_t strile, void *inbuf,
+ tmsize_t insize, void *outbuf,
+ tmsize_t outsize);
+ extern tmsize_t TIFFWriteEncodedStrip(TIFF *tif, uint32_t strip, void *data,
+ tmsize_t cc);
+ extern tmsize_t TIFFWriteRawStrip(TIFF *tif, uint32_t strip, void *data,
+ tmsize_t cc);
+ extern tmsize_t TIFFWriteEncodedTile(TIFF *tif, uint32_t tile, void *data,
+ tmsize_t cc);
+ extern tmsize_t TIFFWriteRawTile(TIFF *tif, uint32_t tile, void *data,
+ tmsize_t cc);
+ extern int TIFFDataWidth(
+ TIFFDataType); /* table of tag datatype widths within TIFF file. */
+ extern void TIFFSetWriteOffset(TIFF *tif, toff_t off);
+ extern void TIFFSwabShort(uint16_t *);
+ extern void TIFFSwabLong(uint32_t *);
+ extern void TIFFSwabLong8(uint64_t *);
+ extern void TIFFSwabFloat(float *);
+ extern void TIFFSwabDouble(double *);
+ extern void TIFFSwabArrayOfShort(uint16_t *wp, tmsize_t n);
+ extern void TIFFSwabArrayOfTriples(uint8_t *tp, tmsize_t n);
+ extern void TIFFSwabArrayOfLong(uint32_t *lp, tmsize_t n);
+ extern void TIFFSwabArrayOfLong8(uint64_t *lp, tmsize_t n);
+ extern void TIFFSwabArrayOfFloat(float *fp, tmsize_t n);
+ extern void TIFFSwabArrayOfDouble(double *dp, tmsize_t n);
+ extern void TIFFReverseBits(uint8_t *cp, tmsize_t n);
+ extern const unsigned char *TIFFGetBitRevTable(int);
+
+ extern uint64_t TIFFGetStrileOffset(TIFF *tif, uint32_t strile);
+ extern uint64_t TIFFGetStrileByteCount(TIFF *tif, uint32_t strile);
+ extern uint64_t TIFFGetStrileOffsetWithErr(TIFF *tif, uint32_t strile,
+ int *pbErr);
+ extern uint64_t TIFFGetStrileByteCountWithErr(TIFF *tif, uint32_t strile,
+ int *pbErr);
#ifdef LOGLUV_PUBLIC
-#define U_NEU 0.210526316
-#define V_NEU 0.473684211
-#define UVSCALE 410.
-extern double LogL16toY(int);
-extern double LogL10toY(int);
-extern void XYZtoRGB24(float*, uint8*);
-extern int uv_decode(double*, double*, int);
-extern void LogLuv24toXYZ(uint32, float*);
-extern void LogLuv32toXYZ(uint32, float*);
+#define U_NEU 0.210526316
+#define V_NEU 0.473684211
+#define UVSCALE 410.
+ extern double LogL16toY(int);
+ extern double LogL10toY(int);
+ extern void XYZtoRGB24(float *, uint8_t *);
+ extern int uv_decode(double *, double *, int);
+ extern void LogLuv24toXYZ(uint32_t, float *);
+ extern void LogLuv32toXYZ(uint32_t, float *);
#if defined(c_plusplus) || defined(__cplusplus)
-extern int LogL16fromY(double, int = SGILOGENCODE_NODITHER);
-extern int LogL10fromY(double, int = SGILOGENCODE_NODITHER);
-extern int uv_encode(double, double, int = SGILOGENCODE_NODITHER);
-extern uint32 LogLuv24fromXYZ(float*, int = SGILOGENCODE_NODITHER);
-extern uint32 LogLuv32fromXYZ(float*, int = SGILOGENCODE_NODITHER);
+ extern int LogL16fromY(double, int = SGILOGENCODE_NODITHER);
+ extern int LogL10fromY(double, int = SGILOGENCODE_NODITHER);
+ extern int uv_encode(double, double, int = SGILOGENCODE_NODITHER);
+ extern uint32_t LogLuv24fromXYZ(float *, int = SGILOGENCODE_NODITHER);
+ extern uint32_t LogLuv32fromXYZ(float *, int = SGILOGENCODE_NODITHER);
#else
-extern int LogL16fromY(double, int);
-extern int LogL10fromY(double, int);
-extern int uv_encode(double, double, int);
-extern uint32 LogLuv24fromXYZ(float*, int);
-extern uint32 LogLuv32fromXYZ(float*, int);
+ extern int LogL16fromY(double, int);
+ extern int LogL10fromY(double, int);
+ extern int uv_encode(double, double, int);
+ extern uint32_t LogLuv24fromXYZ(float *, int);
+ extern uint32_t LogLuv32fromXYZ(float *, int);
#endif
#endif /* LOGLUV_PUBLIC */
-extern int TIFFCIELabToRGBInit(TIFFCIELabToRGB*, const TIFFDisplay *, float*);
-extern void TIFFCIELabToXYZ(TIFFCIELabToRGB *, uint32, int32, int32,
- float *, float *, float *);
-extern void TIFFXYZToRGB(TIFFCIELabToRGB *, float, float, float,
- uint32 *, uint32 *, uint32 *);
-
-extern int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB*, float*, float*);
-extern void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *, uint32, int32, int32,
- uint32 *, uint32 *, uint32 *);
+ extern int TIFFCIELabToRGBInit(TIFFCIELabToRGB *, const TIFFDisplay *,
+ float *);
+ extern void TIFFCIELabToXYZ(TIFFCIELabToRGB *, uint32_t, int32_t, int32_t,
+ float *, float *, float *);
+ extern void TIFFXYZToRGB(TIFFCIELabToRGB *, float, float, float, uint32_t *,
+ uint32_t *, uint32_t *);
+
+ extern int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB *, float *, float *);
+ extern void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *, uint32_t, int32_t, int32_t,
+ uint32_t *, uint32_t *, uint32_t *);
+
+ /****************************************************************************
+ * O B S O L E T E D I N T E R F A C E S
+ *
+ * Don't use this stuff in your applications, it may be removed in the
+ *future libtiff versions.
+ ****************************************************************************/
+ typedef struct
+ {
+ ttag_t field_tag; /* field's tag */
+ short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */
+ short field_writecount; /* write count/TIFF_VARIABLE */
+ TIFFDataType field_type; /* type of associated data */
+ unsigned short field_bit; /* bit in fieldsset bit vector */
+ unsigned char field_oktochange; /* if true, can change while writing */
+ unsigned char field_passcount; /* if true, pass dir count on set */
+ char *field_name; /* ASCII name */
+ } TIFFFieldInfo;
+
+ extern int TIFFMergeFieldInfo(TIFF *, const TIFFFieldInfo[], uint32_t);
-/****************************************************************************
- * O B S O L E T E D I N T E R F A C E S
- *
- * Don't use this stuff in your applications, it may be removed in the future
- * libtiff versions.
- ****************************************************************************/
-typedef struct {
- ttag_t field_tag; /* field's tag */
- short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */
- short field_writecount; /* write count/TIFF_VARIABLE */
- TIFFDataType field_type; /* type of associated data */
- unsigned short field_bit; /* bit in fieldsset bit vector */
- unsigned char field_oktochange; /* if true, can change while writing */
- unsigned char field_passcount; /* if true, pass dir count on set */
- char *field_name; /* ASCII name */
-} TIFFFieldInfo;
-
-extern int TIFFMergeFieldInfo(TIFF*, const TIFFFieldInfo[], uint32);
-
#if defined(c_plusplus) || defined(__cplusplus)
}
#endif
#endif /* _TIFFIO_ */
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tiffio.hxx b/src/3rdparty/libtiff/libtiff/tiffio.hxx
index df2cbbc..6182449 100644
--- a/src/3rdparty/libtiff/libtiff/tiffio.hxx
+++ b/src/3rdparty/libtiff/libtiff/tiffio.hxx
@@ -2,47 +2,38 @@
* Copyright (c) 1988-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
#ifndef _TIFFIO_HXX_
-#define _TIFFIO_HXX_
+#define _TIFFIO_HXX_
/*
* TIFF I/O library definitions which provide C++ streams API.
*/
-#include <iostream>
#include "tiff.h"
#include "tiffio.h"
+#include <iostream>
-extern TIFF* TIFFStreamOpen(const char*, std::ostream *);
-extern TIFF* TIFFStreamOpen(const char*, std::istream *);
+extern TIFF *TIFFStreamOpen(const char *, std::ostream *);
+extern TIFF *TIFFStreamOpen(const char *, std::istream *);
#endif /* _TIFFIO_HXX_ */
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c++
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tiffiop.h b/src/3rdparty/libtiff/libtiff/tiffiop.h
index 45a7932..791881a 100644
--- a/src/3rdparty/libtiff/libtiff/tiffiop.h
+++ b/src/3rdparty/libtiff/libtiff/tiffiop.h
@@ -2,28 +2,28 @@
* Copyright (c) 1988-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
#ifndef _TIFFIOP_
-#define _TIFFIOP_
+#define _TIFFIOP_
/*
* ``Library-private'' definitions.
*/
@@ -31,66 +31,48 @@
#include "tif_config.h"
#ifdef HAVE_FCNTL_H
-# include <fcntl.h>
+#include <fcntl.h>
#endif
#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
+#include <sys/types.h>
#endif
-#ifdef HAVE_STRING_H
-# include <string.h>
-#endif
+#include <string.h>
#ifdef HAVE_ASSERT_H
-# include <assert.h>
-#else
-# define assert(x)
-#endif
-
-#ifdef HAVE_SEARCH_H
-# include <search.h>
+#include <assert.h>
#else
-extern void *lfind(const void *, const void *, size_t *, size_t,
- int (*)(const void *, const void *));
-#endif
-
-#if !defined(HAVE_SNPRINTF) && !defined(HAVE__SNPRINTF)
-#undef snprintf
-#define snprintf _TIFF_snprintf_f
-extern int snprintf(char* str, size_t size, const char* format, ...);
+#define assert(x)
#endif
+#include "tif_hash_set.h"
#include "tiffio.h"
#include "tif_dir.h"
+#include <limits.h>
+
#ifndef STRIP_SIZE_DEFAULT
-# define STRIP_SIZE_DEFAULT 8192
+#define STRIP_SIZE_DEFAULT 8192
#endif
-#define streq(a,b) (strcmp(a,b) == 0)
-#define strneq(a,b,n) (strncmp(a,b,n) == 0)
-
-#ifndef TRUE
-#define TRUE 1
-#define FALSE 0
+#ifndef TIFF_MAX_DIR_COUNT
+#define TIFF_MAX_DIR_COUNT 1048576
#endif
-#define TIFF_SIZE_T_MAX ((size_t) ~ ((size_t)0))
-#define TIFF_TMSIZE_T_MAX (tmsize_t)(TIFF_SIZE_T_MAX >> 1)
+#define TIFF_NON_EXISTENT_DIR_NUMBER UINT_MAX
-/*
- * Largest 32-bit unsigned integer value.
- */
-#define TIFF_UINT32_MAX 0xFFFFFFFFU
+#define streq(a, b) (strcmp(a, b) == 0)
+#define strneq(a, b, n) (strncmp(a, b, n) == 0)
-/*
- * Largest 64-bit unsigned integer value.
- */
-#define TIFF_UINT64_MAX (((uint64)(TIFF_UINT32_MAX)) << 32 | TIFF_UINT32_MAX)
+#ifndef TRUE
+#define TRUE 1
+#define FALSE 0
+#endif
-typedef struct client_info {
+typedef struct client_info
+{
struct client_info *next;
void *data;
char *name;
@@ -100,187 +82,232 @@ typedef struct client_info {
* Typedefs for ``method pointers'' used internally.
* these are deprecated and provided only for backwards compatibility.
*/
-typedef unsigned char tidataval_t; /* internal image data value type */
-typedef tidataval_t* tidata_t; /* reference to internal image data */
-
-typedef void (*TIFFVoidMethod)(TIFF*);
-typedef int (*TIFFBoolMethod)(TIFF*);
-typedef int (*TIFFPreMethod)(TIFF*, uint16);
-typedef int (*TIFFCodeMethod)(TIFF* tif, uint8* buf, tmsize_t size, uint16 sample);
-typedef int (*TIFFSeekMethod)(TIFF*, uint32);
-typedef void (*TIFFPostMethod)(TIFF* tif, uint8* buf, tmsize_t size);
-typedef uint32 (*TIFFStripMethod)(TIFF*, uint32);
-typedef void (*TIFFTileMethod)(TIFF*, uint32*, uint32*);
-
-struct tiff {
- char* tif_name; /* name of open file */
- int tif_fd; /* open file descriptor */
- int tif_mode; /* open mode (O_*) */
- uint32 tif_flags;
- #define TIFF_FILLORDER 0x00003U /* natural bit fill order for machine */
- #define TIFF_DIRTYHEADER 0x00004U /* header must be written on close */
- #define TIFF_DIRTYDIRECT 0x00008U /* current directory must be written */
- #define TIFF_BUFFERSETUP 0x00010U /* data buffers setup */
- #define TIFF_CODERSETUP 0x00020U /* encoder/decoder setup done */
- #define TIFF_BEENWRITING 0x00040U /* written 1+ scanlines to file */
- #define TIFF_SWAB 0x00080U /* byte swap file information */
- #define TIFF_NOBITREV 0x00100U /* inhibit bit reversal logic */
- #define TIFF_MYBUFFER 0x00200U /* my raw data buffer; free on close */
- #define TIFF_ISTILED 0x00400U /* file is tile, not strip- based */
- #define TIFF_MAPPED 0x00800U /* file is mapped into memory */
- #define TIFF_POSTENCODE 0x01000U /* need call to postencode routine */
- #define TIFF_INSUBIFD 0x02000U /* currently writing a subifd */
- #define TIFF_UPSAMPLED 0x04000U /* library is doing data up-sampling */
- #define TIFF_STRIPCHOP 0x08000U /* enable strip chopping support */
- #define TIFF_HEADERONLY 0x10000U /* read header only, do not process the first directory */
- #define TIFF_NOREADRAW 0x20000U /* skip reading of raw uncompressed image data */
- #define TIFF_INCUSTOMIFD 0x40000U /* currently writing a custom IFD */
- #define TIFF_BIGTIFF 0x80000U /* read/write bigtiff */
- #define TIFF_BUF4WRITE 0x100000U /* rawcc bytes are for writing */
- #define TIFF_DIRTYSTRIP 0x200000U /* stripoffsets/stripbytecount dirty*/
- #define TIFF_PERSAMPLE 0x400000U /* get/set per sample tags as arrays */
- #define TIFF_BUFFERMMAP 0x800000U /* read buffer (tif_rawdata) points into mmap() memory */
- #define TIFF_DEFERSTRILELOAD 0x1000000U /* defer strip/tile offset/bytecount array loading. */
- #define TIFF_LAZYSTRILELOAD 0x2000000U /* lazy/ondemand loading of strip/tile offset/bytecount values. Only used if TIFF_DEFERSTRILELOAD is set and in read-only mode */
- #define TIFF_CHOPPEDUPARRAYS 0x4000000U /* set when allocChoppedUpStripArrays() has modified strip array */
- uint64 tif_diroff; /* file offset of current directory */
- uint64 tif_nextdiroff; /* file offset of following directory */
- uint64* tif_dirlist; /* list of offsets to already seen directories to prevent IFD looping */
- uint16 tif_dirlistsize; /* number of entries in offset list */
- uint16 tif_dirnumber; /* number of already seen directories */
- TIFFDirectory tif_dir; /* internal rep of current directory */
- TIFFDirectory tif_customdir; /* custom IFDs are separated from the main ones */
- union {
- TIFFHeaderCommon common;
- TIFFHeaderClassic classic;
- TIFFHeaderBig big;
- } tif_header;
- uint16 tif_header_size; /* file's header block and its length */
- uint32 tif_row; /* current scanline */
- uint16 tif_curdir; /* current directory (index) */
- uint32 tif_curstrip; /* current strip for read/write */
- uint64 tif_curoff; /* current offset for read/write */
- uint64 tif_dataoff; /* current offset for writing dir */
- /* SubIFD support */
- uint16 tif_nsubifd; /* remaining subifds to write */
- uint64 tif_subifdoff; /* offset for patching SubIFD link */
- /* tiling support */
- uint32 tif_col; /* current column (offset by row too) */
- uint32 tif_curtile; /* current tile for read/write */
- tmsize_t tif_tilesize; /* # of bytes in a tile */
- /* compression scheme hooks */
- int tif_decodestatus;
- TIFFBoolMethod tif_fixuptags; /* called in TIFFReadDirectory */
- TIFFBoolMethod tif_setupdecode; /* called once before predecode */
- TIFFPreMethod tif_predecode; /* pre- row/strip/tile decoding */
- TIFFBoolMethod tif_setupencode; /* called once before preencode */
- int tif_encodestatus;
- TIFFPreMethod tif_preencode; /* pre- row/strip/tile encoding */
- TIFFBoolMethod tif_postencode; /* post- row/strip/tile encoding */
- TIFFCodeMethod tif_decoderow; /* scanline decoding routine */
- TIFFCodeMethod tif_encoderow; /* scanline encoding routine */
- TIFFCodeMethod tif_decodestrip; /* strip decoding routine */
- TIFFCodeMethod tif_encodestrip; /* strip encoding routine */
- TIFFCodeMethod tif_decodetile; /* tile decoding routine */
- TIFFCodeMethod tif_encodetile; /* tile encoding routine */
- TIFFVoidMethod tif_close; /* cleanup-on-close routine */
- TIFFSeekMethod tif_seek; /* position within a strip routine */
- TIFFVoidMethod tif_cleanup; /* cleanup state routine */
- TIFFStripMethod tif_defstripsize; /* calculate/constrain strip size */
- TIFFTileMethod tif_deftilesize; /* calculate/constrain tile size */
- uint8* tif_data; /* compression scheme private data */
- /* input/output buffering */
- tmsize_t tif_scanlinesize; /* # of bytes in a scanline */
- tmsize_t tif_scanlineskew; /* scanline skew for reading strips */
- uint8* tif_rawdata; /* raw data buffer */
- tmsize_t tif_rawdatasize; /* # of bytes in raw data buffer */
- tmsize_t tif_rawdataoff; /* rawdata offset within strip */
- tmsize_t tif_rawdataloaded;/* amount of data in rawdata */
- uint8* tif_rawcp; /* current spot in raw buffer */
- tmsize_t tif_rawcc; /* bytes unread from raw buffer */
- /* memory-mapped file support */
- uint8* tif_base; /* base of mapped file */
- tmsize_t tif_size; /* size of mapped file region (bytes, thus tmsize_t) */
- TIFFMapFileProc tif_mapproc; /* map file method */
- TIFFUnmapFileProc tif_unmapproc; /* unmap file method */
- /* input/output callback methods */
- thandle_t tif_clientdata; /* callback parameter */
- TIFFReadWriteProc tif_readproc; /* read method */
- TIFFReadWriteProc tif_writeproc; /* write method */
- TIFFSeekProc tif_seekproc; /* lseek method */
- TIFFCloseProc tif_closeproc; /* close method */
- TIFFSizeProc tif_sizeproc; /* filesize method */
- /* post-decoding support */
- TIFFPostMethod tif_postdecode; /* post decoding routine */
- /* tag support */
- TIFFField** tif_fields; /* sorted table of registered tags */
- size_t tif_nfields; /* # entries in registered tag table */
- const TIFFField* tif_foundfield; /* cached pointer to already found tag */
- TIFFTagMethods tif_tagmethods; /* tag get/set/print routines */
- TIFFClientInfoLink* tif_clientinfo; /* extra client information. */
- /* Backward compatibility stuff. We need these two fields for
- * setting up an old tag extension scheme. */
- TIFFFieldArray* tif_fieldscompat;
- size_t tif_nfieldscompat;
+typedef unsigned char tidataval_t; /* internal image data value type */
+typedef tidataval_t *tidata_t; /* reference to internal image data */
+
+typedef void (*TIFFVoidMethod)(TIFF *);
+typedef int (*TIFFBoolMethod)(TIFF *);
+typedef int (*TIFFPreMethod)(TIFF *, uint16_t);
+typedef int (*TIFFCodeMethod)(TIFF *tif, uint8_t *buf, tmsize_t size,
+ uint16_t sample);
+typedef int (*TIFFSeekMethod)(TIFF *, uint32_t);
+typedef void (*TIFFPostMethod)(TIFF *tif, uint8_t *buf, tmsize_t size);
+typedef uint32_t (*TIFFStripMethod)(TIFF *, uint32_t);
+typedef void (*TIFFTileMethod)(TIFF *, uint32_t *, uint32_t *);
+
+struct TIFFOffsetAndDirNumber
+{
+ uint64_t offset;
+ tdir_t dirNumber;
+};
+typedef struct TIFFOffsetAndDirNumber TIFFOffsetAndDirNumber;
+
+struct tiff
+{
+ char *tif_name; /* name of open file */
+ int tif_fd; /* open file descriptor */
+ int tif_mode; /* open mode (O_*) */
+ uint32_t tif_flags;
+#define TIFF_FILLORDER 0x00003U /* natural bit fill order for machine */
+#define TIFF_DIRTYHEADER 0x00004U /* header must be written on close */
+#define TIFF_DIRTYDIRECT 0x00008U /* current directory must be written */
+#define TIFF_BUFFERSETUP 0x00010U /* data buffers setup */
+#define TIFF_CODERSETUP 0x00020U /* encoder/decoder setup done */
+#define TIFF_BEENWRITING 0x00040U /* written 1+ scanlines to file */
+#define TIFF_SWAB 0x00080U /* byte swap file information */
+#define TIFF_NOBITREV 0x00100U /* inhibit bit reversal logic */
+#define TIFF_MYBUFFER 0x00200U /* my raw data buffer; free on close */
+#define TIFF_ISTILED 0x00400U /* file is tile, not strip- based */
+#define TIFF_MAPPED 0x00800U /* file is mapped into memory */
+#define TIFF_POSTENCODE 0x01000U /* need call to postencode routine */
+#define TIFF_INSUBIFD 0x02000U /* currently writing a subifd */
+#define TIFF_UPSAMPLED 0x04000U /* library is doing data up-sampling */
+#define TIFF_STRIPCHOP 0x08000U /* enable strip chopping support */
+#define TIFF_HEADERONLY \
+ 0x10000U /* read header only, do not process the first directory */
+#define TIFF_NOREADRAW \
+ 0x20000U /* skip reading of raw uncompressed image data */
+#define TIFF_INCUSTOMIFD 0x40000U /* currently writing a custom IFD */
+#define TIFF_BIGTIFF 0x80000U /* read/write bigtiff */
+#define TIFF_BUF4WRITE 0x100000U /* rawcc bytes are for writing */
+#define TIFF_DIRTYSTRIP 0x200000U /* stripoffsets/stripbytecount dirty*/
+#define TIFF_PERSAMPLE 0x400000U /* get/set per sample tags as arrays */
+#define TIFF_BUFFERMMAP \
+ 0x800000U /* read buffer (tif_rawdata) points into mmap() memory */
+#define TIFF_DEFERSTRILELOAD \
+ 0x1000000U /* defer strip/tile offset/bytecount array loading. */
+#define TIFF_LAZYSTRILELOAD \
+ 0x2000000U /* lazy/ondemand loading of strip/tile offset/bytecount values. \
+ Only used if TIFF_DEFERSTRILELOAD is set and in read-only \
+ mode */
+#define TIFF_CHOPPEDUPARRAYS \
+ 0x4000000U /* set when allocChoppedUpStripArrays() has modified strip \
+ array */
+ uint64_t tif_diroff; /* file offset of current directory */
+ uint64_t tif_nextdiroff; /* file offset of following directory */
+ uint64_t tif_lastdiroff; /* file offset of last directory written so far */
+ uint64_t *tif_dirlistoff; /* list of offsets to already seen directories to
+ prevent IFD looping */
+ TIFFHashSet *tif_map_dir_offset_to_number;
+ TIFFHashSet *tif_map_dir_number_to_offset;
+ tdir_t tif_dirnumber; /* number of already seen directories */
+ TIFFDirectory tif_dir; /* internal rep of current directory */
+ TIFFDirectory
+ tif_customdir; /* custom IFDs are separated from the main ones */
+ union
+ {
+ TIFFHeaderCommon common;
+ TIFFHeaderClassic classic;
+ TIFFHeaderBig big;
+ } tif_header;
+ uint16_t tif_header_size; /* file's header block and its length */
+ uint32_t tif_row; /* current scanline */
+ tdir_t tif_curdir; /* current directory (index) */
+ uint32_t tif_curstrip; /* current strip for read/write */
+ uint64_t tif_curoff; /* current offset for read/write */
+ uint64_t tif_lastvalidoff; /* last valid offset allowed for rewrite in
+ place. Used only by TIFFAppendToStrip() */
+ uint64_t tif_dataoff; /* current offset for writing dir */
+ /* SubIFD support */
+ uint16_t tif_nsubifd; /* remaining subifds to write */
+ uint64_t tif_subifdoff; /* offset for patching SubIFD link */
+ /* tiling support */
+ uint32_t tif_col; /* current column (offset by row too) */
+ uint32_t tif_curtile; /* current tile for read/write */
+ tmsize_t tif_tilesize; /* # of bytes in a tile */
+ /* compression scheme hooks */
+ int tif_decodestatus;
+ TIFFBoolMethod tif_fixuptags; /* called in TIFFReadDirectory */
+ TIFFBoolMethod tif_setupdecode; /* called once before predecode */
+ TIFFPreMethod tif_predecode; /* pre- row/strip/tile decoding */
+ TIFFBoolMethod tif_setupencode; /* called once before preencode */
+ int tif_encodestatus;
+ TIFFPreMethod tif_preencode; /* pre- row/strip/tile encoding */
+ TIFFBoolMethod tif_postencode; /* post- row/strip/tile encoding */
+ TIFFCodeMethod tif_decoderow; /* scanline decoding routine */
+ TIFFCodeMethod tif_encoderow; /* scanline encoding routine */
+ TIFFCodeMethod tif_decodestrip; /* strip decoding routine */
+ TIFFCodeMethod tif_encodestrip; /* strip encoding routine */
+ TIFFCodeMethod tif_decodetile; /* tile decoding routine */
+ TIFFCodeMethod tif_encodetile; /* tile encoding routine */
+ TIFFVoidMethod tif_close; /* cleanup-on-close routine */
+ TIFFSeekMethod tif_seek; /* position within a strip routine */
+ TIFFVoidMethod tif_cleanup; /* cleanup state routine */
+ TIFFStripMethod tif_defstripsize; /* calculate/constrain strip size */
+ TIFFTileMethod tif_deftilesize; /* calculate/constrain tile size */
+ uint8_t *tif_data; /* compression scheme private data */
+ /* input/output buffering */
+ tmsize_t tif_scanlinesize; /* # of bytes in a scanline */
+ tmsize_t tif_scanlineskew; /* scanline skew for reading strips */
+ uint8_t *tif_rawdata; /* raw data buffer */
+ tmsize_t tif_rawdatasize; /* # of bytes in raw data buffer */
+ tmsize_t tif_rawdataoff; /* rawdata offset within strip */
+ tmsize_t tif_rawdataloaded; /* amount of data in rawdata */
+ uint8_t *tif_rawcp; /* current spot in raw buffer */
+ tmsize_t tif_rawcc; /* bytes unread from raw buffer */
+ /* memory-mapped file support */
+ uint8_t *tif_base; /* base of mapped file */
+ tmsize_t tif_size; /* size of mapped file region (bytes, thus tmsize_t) */
+ TIFFMapFileProc tif_mapproc; /* map file method */
+ TIFFUnmapFileProc tif_unmapproc; /* unmap file method */
+ /* input/output callback methods */
+ thandle_t tif_clientdata; /* callback parameter */
+ TIFFReadWriteProc tif_readproc; /* read method */
+ TIFFReadWriteProc tif_writeproc; /* write method */
+ TIFFSeekProc tif_seekproc; /* lseek method */
+ TIFFCloseProc tif_closeproc; /* close method */
+ TIFFSizeProc tif_sizeproc; /* filesize method */
+ /* post-decoding support */
+ TIFFPostMethod tif_postdecode; /* post decoding routine */
+ /* tag support */
+ TIFFField **tif_fields; /* sorted table of registered tags */
+ size_t tif_nfields; /* # entries in registered tag table */
+ const TIFFField *tif_foundfield; /* cached pointer to already found tag */
+ TIFFTagMethods tif_tagmethods; /* tag get/set/print routines */
+ TIFFClientInfoLink *tif_clientinfo; /* extra client information. */
+ /* Backward compatibility stuff. We need these two fields for
+ * setting up an old tag extension scheme. */
+ TIFFFieldArray *tif_fieldscompat;
+ size_t tif_nfieldscompat;
+ /* Error handler support */
+ TIFFErrorHandlerExtR tif_errorhandler;
+ void *tif_errorhandler_user_data;
+ TIFFErrorHandlerExtR tif_warnhandler;
+ void *tif_warnhandler_user_data;
+ tmsize_t tif_max_single_mem_alloc; /* in bytes. 0 for unlimited */
+};
+
+struct TIFFOpenOptions
+{
+ TIFFErrorHandlerExtR errorhandler; /* may be NULL */
+ void *errorhandler_user_data; /* may be NULL */
+ TIFFErrorHandlerExtR warnhandler; /* may be NULL */
+ void *warnhandler_user_data; /* may be NULL */
+ tmsize_t max_single_mem_alloc; /* in bytes. 0 for unlimited */
};
-#define isPseudoTag(t) (t > 0xffff) /* is tag value normal or pseudo */
+#define isPseudoTag(t) (t > 0xffff) /* is tag value normal or pseudo */
#define isTiled(tif) (((tif)->tif_flags & TIFF_ISTILED) != 0)
#define isMapped(tif) (((tif)->tif_flags & TIFF_MAPPED) != 0)
#define isFillOrder(tif, o) (((tif)->tif_flags & (o)) != 0)
#define isUpSampled(tif) (((tif)->tif_flags & TIFF_UPSAMPLED) != 0)
-#define TIFFReadFile(tif, buf, size) \
- ((*(tif)->tif_readproc)((tif)->tif_clientdata,(buf),(size)))
-#define TIFFWriteFile(tif, buf, size) \
- ((*(tif)->tif_writeproc)((tif)->tif_clientdata,(buf),(size)))
-#define TIFFSeekFile(tif, off, whence) \
- ((*(tif)->tif_seekproc)((tif)->tif_clientdata,(off),(whence)))
-#define TIFFCloseFile(tif) \
- ((*(tif)->tif_closeproc)((tif)->tif_clientdata))
-#define TIFFGetFileSize(tif) \
- ((*(tif)->tif_sizeproc)((tif)->tif_clientdata))
-#define TIFFMapFileContents(tif, paddr, psize) \
- ((*(tif)->tif_mapproc)((tif)->tif_clientdata,(paddr),(psize)))
-#define TIFFUnmapFileContents(tif, addr, size) \
- ((*(tif)->tif_unmapproc)((tif)->tif_clientdata,(addr),(size)))
+#define TIFFReadFile(tif, buf, size) \
+ ((*(tif)->tif_readproc)((tif)->tif_clientdata, (buf), (size)))
+#define TIFFWriteFile(tif, buf, size) \
+ ((*(tif)->tif_writeproc)((tif)->tif_clientdata, (buf), (size)))
+#define TIFFSeekFile(tif, off, whence) \
+ ((*(tif)->tif_seekproc)((tif)->tif_clientdata, (off), (whence)))
+#define TIFFCloseFile(tif) ((*(tif)->tif_closeproc)((tif)->tif_clientdata))
+#define TIFFGetFileSize(tif) ((*(tif)->tif_sizeproc)((tif)->tif_clientdata))
+#define TIFFMapFileContents(tif, paddr, psize) \
+ ((*(tif)->tif_mapproc)((tif)->tif_clientdata, (paddr), (psize)))
+#define TIFFUnmapFileContents(tif, addr, size) \
+ ((*(tif)->tif_unmapproc)((tif)->tif_clientdata, (addr), (size)))
/*
* Default Read/Seek/Write definitions.
*/
#ifndef ReadOK
-#define ReadOK(tif, buf, size) \
- (TIFFReadFile((tif),(buf),(size))==(size))
+#define ReadOK(tif, buf, size) (TIFFReadFile((tif), (buf), (size)) == (size))
#endif
#ifndef SeekOK
#define SeekOK(tif, off) _TIFFSeekOK(tif, off)
#endif
#ifndef WriteOK
-#define WriteOK(tif, buf, size) \
- (TIFFWriteFile((tif),(buf),(size))==(size))
+#define WriteOK(tif, buf, size) (TIFFWriteFile((tif), (buf), (size)) == (size))
#endif
-/* NB: the uint32 casts are to silence certain ANSI-C compilers */
-#define TIFFhowmany_32(x, y) (((uint32)x < (0xffffffff - (uint32)(y-1))) ? \
- ((((uint32)(x))+(((uint32)(y))-1))/((uint32)(y))) : \
- 0U)
+/* NB: the uint32_t casts are to silence certain ANSI-C compilers */
+#define TIFFhowmany_32(x, y) \
+ (((uint32_t)x < (0xffffffff - (uint32_t)(y - 1))) \
+ ? ((((uint32_t)(x)) + (((uint32_t)(y)) - 1)) / ((uint32_t)(y))) \
+ : 0U)
/* Variant of TIFFhowmany_32() that doesn't return 0 if x close to MAXUINT. */
/* Caution: TIFFhowmany_32_maxuint_compat(x,y)*y might overflow */
-#define TIFFhowmany_32_maxuint_compat(x, y) \
- (((uint32)(x) / (uint32)(y)) + ((((uint32)(x) % (uint32)(y)) != 0) ? 1 : 0))
-#define TIFFhowmany8_32(x) (((x)&0x07)?((uint32)(x)>>3)+1:(uint32)(x)>>3)
-#define TIFFroundup_32(x, y) (TIFFhowmany_32(x,y)*(y))
-#define TIFFhowmany_64(x, y) ((((uint64)(x))+(((uint64)(y))-1))/((uint64)(y)))
-#define TIFFhowmany8_64(x) (((x)&0x07)?((uint64)(x)>>3)+1:(uint64)(x)>>3)
-#define TIFFroundup_64(x, y) (TIFFhowmany_64(x,y)*(y))
-
-/* Safe multiply which returns zero if there is an *unsigned* integer overflow. This macro is not safe for *signed* integer types */
-#define TIFFSafeMultiply(t,v,m) ((((t)(m) != (t)0) && (((t)(((v)*(m))/(m))) == (t)(v))) ? (t)((v)*(m)) : (t)0)
-
-#define TIFFmax(A,B) ((A)>(B)?(A):(B))
-#define TIFFmin(A,B) ((A)<(B)?(A):(B))
-
-#define TIFFArrayCount(a) (sizeof (a) / sizeof ((a)[0]))
+#define TIFFhowmany_32_maxuint_compat(x, y) \
+ (((uint32_t)(x) / (uint32_t)(y)) + \
+ ((((uint32_t)(x) % (uint32_t)(y)) != 0) ? 1 : 0))
+#define TIFFhowmany8_32(x) \
+ (((x)&0x07) ? ((uint32_t)(x) >> 3) + 1 : (uint32_t)(x) >> 3)
+#define TIFFroundup_32(x, y) (TIFFhowmany_32(x, y) * (y))
+#define TIFFhowmany_64(x, y) \
+ ((((uint64_t)(x)) + (((uint64_t)(y)) - 1)) / ((uint64_t)(y)))
+#define TIFFhowmany8_64(x) \
+ (((x)&0x07) ? ((uint64_t)(x) >> 3) + 1 : (uint64_t)(x) >> 3)
+#define TIFFroundup_64(x, y) (TIFFhowmany_64(x, y) * (y))
+
+/* Safe multiply which returns zero if there is an *unsigned* integer overflow.
+ * This macro is not safe for *signed* integer types */
+#define TIFFSafeMultiply(t, v, m) \
+ ((((t)(m) != (t)0) && (((t)(((v) * (m)) / (m))) == (t)(v))) \
+ ? (t)((v) * (m)) \
+ : (t)0)
+
+#define TIFFmax(A, B) ((A) > (B) ? (A) : (B))
+#define TIFFmin(A, B) ((A) < (B) ? (A) : (B))
+
+#define TIFFArrayCount(a) (sizeof(a) / sizeof((a)[0]))
/*
Support for large files.
@@ -301,28 +328,31 @@ struct tiff {
must be available on the target computer in order for the program to run.
*/
#if defined(HAVE_FSEEKO)
-# define fseek(stream,offset,whence) fseeko(stream,offset,whence)
-# define ftell(stream,offset,whence) ftello(stream,offset,whence)
+#define fseek(stream, offset, whence) fseeko(stream, offset, whence)
+#define ftell(stream, offset, whence) ftello(stream, offset, whence)
#endif
#endif
-#if defined(__WIN32__) && \
- !(defined(_MSC_VER) && _MSC_VER < 1400) && \
- !(defined(__MSVCRT_VERSION__) && __MSVCRT_VERSION__ < 0x800)
+#if defined(__WIN32__) && !(defined(_MSC_VER) && _MSC_VER < 1400) && \
+ !(defined(__MSVCRT_VERSION__) && __MSVCRT_VERSION__ < 0x800)
typedef unsigned int TIFFIOSize_t;
-#define _TIFF_lseek_f(fildes,offset,whence) _lseeki64(fildes,/* __int64 */ offset,whence)
+#define _TIFF_lseek_f(fildes, offset, whence) \
+ _lseeki64(fildes, /* __int64 */ offset, whence)
/* #define _TIFF_tell_f(fildes) /\* __int64 *\/ _telli64(fildes) */
-#define _TIFF_fseek_f(stream,offset,whence) _fseeki64(stream,/* __int64 */ offset,whence)
-#define _TIFF_fstat_f(fildes,stat_buff) _fstati64(fildes,/* struct _stati64 */ stat_buff)
+#define _TIFF_fseek_f(stream, offset, whence) \
+ _fseeki64(stream, /* __int64 */ offset, whence)
+#define _TIFF_fstat_f(fildes, stat_buff) \
+ _fstati64(fildes, /* struct _stati64 */ stat_buff)
/* #define _TIFF_ftell_f(stream) /\* __int64 *\/ _ftelli64(stream) */
-/* #define _TIFF_stat_f(path,stat_buff) _stati64(path,/\* struct _stati64 *\/ stat_buff) */
+/* #define _TIFF_stat_f(path,stat_buff) _stati64(path,/\* struct _stati64 *\/
+ * stat_buff) */
#define _TIFF_stat_s struct _stati64
#define _TIFF_off_t __int64
#else
typedef size_t TIFFIOSize_t;
-#define _TIFF_lseek_f(fildes,offset,whence) lseek(fildes,offset,whence)
+#define _TIFF_lseek_f(fildes, offset, whence) lseek(fildes, offset, whence)
/* #define _TIFF_tell_f(fildes) (_TIFF_lseek_f(fildes,0,SEEK_CUR)) */
-#define _TIFF_fseek_f(stream,offset,whence) fseek(stream,offset,whence)
-#define _TIFF_fstat_f(fildes,stat_buff) fstat(fildes,stat_buff)
+#define _TIFF_fseek_f(stream, offset, whence) fseek(stream, offset, whence)
+#define _TIFF_fstat_f(fildes, stat_buff) fstat(fildes, stat_buff)
/* #define _TIFF_ftell_f(stream) ftell(stream) */
/* #define _TIFF_stat_f(path,stat_buff) stat(path,stat_buff) */
#define _TIFF_stat_s struct stat
@@ -331,7 +361,8 @@ typedef size_t TIFFIOSize_t;
#if defined(__has_attribute) && defined(__clang__)
#if __has_attribute(no_sanitize)
-#define TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW __attribute__((no_sanitize("unsigned-integer-overflow")))
+#define TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW \
+ __attribute__((no_sanitize("unsigned-integer-overflow")))
#else
#define TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
#endif
@@ -339,136 +370,153 @@ typedef size_t TIFFIOSize_t;
#define TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
#endif
-
#if defined(__cplusplus)
-extern "C" {
-#endif
-extern int _TIFFgetMode(const char* mode, const char* module);
-extern int _TIFFNoRowEncode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s);
-extern int _TIFFNoStripEncode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s);
-extern int _TIFFNoTileEncode(TIFF*, uint8* pp, tmsize_t cc, uint16 s);
-extern int _TIFFNoRowDecode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s);
-extern int _TIFFNoStripDecode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s);
-extern int _TIFFNoTileDecode(TIFF*, uint8* pp, tmsize_t cc, uint16 s);
-extern void _TIFFNoPostDecode(TIFF* tif, uint8* buf, tmsize_t cc);
-extern int _TIFFNoPreCode(TIFF* tif, uint16 s);
-extern int _TIFFNoSeek(TIFF* tif, uint32 off);
-extern void _TIFFSwab16BitData(TIFF* tif, uint8* buf, tmsize_t cc);
-extern void _TIFFSwab24BitData(TIFF* tif, uint8* buf, tmsize_t cc);
-extern void _TIFFSwab32BitData(TIFF* tif, uint8* buf, tmsize_t cc);
-extern void _TIFFSwab64BitData(TIFF* tif, uint8* buf, tmsize_t cc);
-extern int TIFFFlushData1(TIFF* tif);
-extern int TIFFDefaultDirectory(TIFF* tif);
-extern void _TIFFSetDefaultCompressionState(TIFF* tif);
-extern int _TIFFRewriteField(TIFF *, uint16, TIFFDataType, tmsize_t, void *);
-extern int TIFFSetCompressionScheme(TIFF* tif, int scheme);
-extern int TIFFSetDefaultCompressionState(TIFF* tif);
-extern uint32 _TIFFDefaultStripSize(TIFF* tif, uint32 s);
-extern void _TIFFDefaultTileSize(TIFF* tif, uint32* tw, uint32* th);
-extern int _TIFFDataSize(TIFFDataType type);
-
-extern void _TIFFsetByteArray(void**, void*, uint32);
-extern void _TIFFsetString(char**, char*);
-extern void _TIFFsetShortArray(uint16**, uint16*, uint32);
-extern void _TIFFsetLongArray(uint32**, uint32*, uint32);
-extern void _TIFFsetFloatArray(float**, float*, uint32);
-extern void _TIFFsetDoubleArray(double**, double*, uint32);
-
-extern void _TIFFprintAscii(FILE*, const char*);
-extern void _TIFFprintAsciiTag(FILE*, const char*, const char*);
-
-extern TIFFErrorHandler _TIFFwarningHandler;
-extern TIFFErrorHandler _TIFFerrorHandler;
-extern TIFFErrorHandlerExt _TIFFwarningHandlerExt;
-extern TIFFErrorHandlerExt _TIFFerrorHandlerExt;
-
-extern uint32 _TIFFMultiply32(TIFF*, uint32, uint32, const char*);
-extern uint64 _TIFFMultiply64(TIFF*, uint64, uint64, const char*);
-extern tmsize_t _TIFFMultiplySSize(TIFF*, tmsize_t, tmsize_t, const char*);
-extern tmsize_t _TIFFCastUInt64ToSSize(TIFF*, uint64, const char*);
-extern void* _TIFFCheckMalloc(TIFF*, tmsize_t, tmsize_t, const char*);
-extern void* _TIFFCheckRealloc(TIFF*, void*, tmsize_t, tmsize_t, const char*);
-
-extern double _TIFFUInt64ToDouble(uint64);
-extern float _TIFFUInt64ToFloat(uint64);
-
-extern float _TIFFClampDoubleToFloat(double);
-
-extern tmsize_t
-_TIFFReadEncodedStripAndAllocBuffer(TIFF* tif, uint32 strip,
- void **buf, tmsize_t bufsizetoalloc,
- tmsize_t size_to_read);
-extern tmsize_t
-_TIFFReadEncodedTileAndAllocBuffer(TIFF* tif, uint32 tile,
- void **buf, tmsize_t bufsizetoalloc,
- tmsize_t size_to_read);
-extern tmsize_t
-_TIFFReadTileAndAllocBuffer(TIFF* tif,
- void **buf, tmsize_t bufsizetoalloc,
- uint32 x, uint32 y, uint32 z, uint16 s);
-extern int _TIFFSeekOK(TIFF* tif, toff_t off);
-
-extern int TIFFInitDumpMode(TIFF*, int);
+extern "C"
+{
+#endif
+ extern int _TIFFgetMode(TIFFOpenOptions *opts, thandle_t clientdata,
+ const char *mode, const char *module);
+ extern int _TIFFNoRowEncode(TIFF *tif, uint8_t *pp, tmsize_t cc,
+ uint16_t s);
+ extern int _TIFFNoStripEncode(TIFF *tif, uint8_t *pp, tmsize_t cc,
+ uint16_t s);
+ extern int _TIFFNoTileEncode(TIFF *, uint8_t *pp, tmsize_t cc, uint16_t s);
+ extern int _TIFFNoRowDecode(TIFF *tif, uint8_t *pp, tmsize_t cc,
+ uint16_t s);
+ extern int _TIFFNoStripDecode(TIFF *tif, uint8_t *pp, tmsize_t cc,
+ uint16_t s);
+ extern int _TIFFNoTileDecode(TIFF *, uint8_t *pp, tmsize_t cc, uint16_t s);
+ extern void _TIFFNoPostDecode(TIFF *tif, uint8_t *buf, tmsize_t cc);
+ extern int _TIFFNoPreCode(TIFF *tif, uint16_t s);
+ extern int _TIFFNoSeek(TIFF *tif, uint32_t off);
+ extern void _TIFFSwab16BitData(TIFF *tif, uint8_t *buf, tmsize_t cc);
+ extern void _TIFFSwab24BitData(TIFF *tif, uint8_t *buf, tmsize_t cc);
+ extern void _TIFFSwab32BitData(TIFF *tif, uint8_t *buf, tmsize_t cc);
+ extern void _TIFFSwab64BitData(TIFF *tif, uint8_t *buf, tmsize_t cc);
+ extern int TIFFFlushData1(TIFF *tif);
+ extern int TIFFDefaultDirectory(TIFF *tif);
+ extern void _TIFFSetDefaultCompressionState(TIFF *tif);
+ extern int _TIFFRewriteField(TIFF *, uint16_t, TIFFDataType, tmsize_t,
+ void *);
+ extern int TIFFSetCompressionScheme(TIFF *tif, int scheme);
+ extern int TIFFSetDefaultCompressionState(TIFF *tif);
+ extern uint32_t _TIFFDefaultStripSize(TIFF *tif, uint32_t s);
+ extern void _TIFFDefaultTileSize(TIFF *tif, uint32_t *tw, uint32_t *th);
+
+ extern void _TIFFsetByteArray(void **, const void *, uint32_t);
+ extern void _TIFFsetByteArrayExt(TIFF *, void **, const void *, uint32_t);
+ extern void _TIFFsetShortArray(uint16_t **, const uint16_t *, uint32_t);
+ extern void _TIFFsetShortArrayExt(TIFF *, uint16_t **, const uint16_t *,
+ uint32_t);
+ extern void _TIFFsetLongArray(uint32_t **, const uint32_t *, uint32_t);
+ extern void _TIFFsetLongArrayExt(TIFF *, uint32_t **, const uint32_t *,
+ uint32_t);
+ extern void _TIFFsetFloatArray(float **, const float *, uint32_t);
+ extern void _TIFFsetFloatArrayExt(TIFF *, float **, const float *,
+ uint32_t);
+ extern void _TIFFsetDoubleArray(double **, const double *, uint32_t);
+ extern void _TIFFsetDoubleArrayExt(TIFF *, double **, const double *,
+ uint32_t);
+
+ extern void _TIFFprintAscii(FILE *, const char *);
+ extern void _TIFFprintAsciiTag(FILE *, const char *, const char *);
+
+ extern TIFFErrorHandler _TIFFwarningHandler;
+ extern TIFFErrorHandler _TIFFerrorHandler;
+ extern TIFFErrorHandlerExt _TIFFwarningHandlerExt;
+ extern TIFFErrorHandlerExt _TIFFerrorHandlerExt;
+ void _TIFFErrorEarly(TIFFOpenOptions *opts, thandle_t clientdata,
+ const char *module, const char *fmt, ...)
+ TIFF_ATTRIBUTE((__format__(__printf__, 4, 5)));
+
+ extern uint32_t _TIFFMultiply32(TIFF *, uint32_t, uint32_t, const char *);
+ extern uint64_t _TIFFMultiply64(TIFF *, uint64_t, uint64_t, const char *);
+ extern tmsize_t _TIFFMultiplySSize(TIFF *, tmsize_t, tmsize_t,
+ const char *);
+ extern tmsize_t _TIFFCastUInt64ToSSize(TIFF *, uint64_t, const char *);
+ extern void *_TIFFCheckMalloc(TIFF *, tmsize_t, tmsize_t, const char *);
+ extern void *_TIFFCheckRealloc(TIFF *, void *, tmsize_t, tmsize_t,
+ const char *);
+
+ extern double _TIFFUInt64ToDouble(uint64_t);
+ extern float _TIFFUInt64ToFloat(uint64_t);
+
+ extern float _TIFFClampDoubleToFloat(double);
+ extern uint32_t _TIFFClampDoubleToUInt32(double);
+
+ extern tmsize_t _TIFFReadEncodedStripAndAllocBuffer(TIFF *tif,
+ uint32_t strip,
+ void **buf,
+ tmsize_t bufsizetoalloc,
+ tmsize_t size_to_read);
+ extern tmsize_t _TIFFReadEncodedTileAndAllocBuffer(TIFF *tif, uint32_t tile,
+ void **buf,
+ tmsize_t bufsizetoalloc,
+ tmsize_t size_to_read);
+ extern tmsize_t _TIFFReadTileAndAllocBuffer(TIFF *tif, void **buf,
+ tmsize_t bufsizetoalloc,
+ uint32_t x, uint32_t y,
+ uint32_t z, uint16_t s);
+ extern int _TIFFSeekOK(TIFF *tif, toff_t off);
+
+ extern int TIFFInitDumpMode(TIFF *, int);
#ifdef PACKBITS_SUPPORT
-extern int TIFFInitPackBits(TIFF*, int);
+ extern int TIFFInitPackBits(TIFF *, int);
#endif
#ifdef CCITT_SUPPORT
-extern int TIFFInitCCITTRLE(TIFF*, int), TIFFInitCCITTRLEW(TIFF*, int);
-extern int TIFFInitCCITTFax3(TIFF*, int), TIFFInitCCITTFax4(TIFF*, int);
+ extern int TIFFInitCCITTRLE(TIFF *, int), TIFFInitCCITTRLEW(TIFF *, int);
+ extern int TIFFInitCCITTFax3(TIFF *, int), TIFFInitCCITTFax4(TIFF *, int);
#endif
#ifdef THUNDER_SUPPORT
-extern int TIFFInitThunderScan(TIFF*, int);
+ extern int TIFFInitThunderScan(TIFF *, int);
#endif
#ifdef NEXT_SUPPORT
-extern int TIFFInitNeXT(TIFF*, int);
+ extern int TIFFInitNeXT(TIFF *, int);
#endif
#ifdef LZW_SUPPORT
-extern int TIFFInitLZW(TIFF*, int);
+ extern int TIFFInitLZW(TIFF *, int);
#endif
#ifdef OJPEG_SUPPORT
-extern int TIFFInitOJPEG(TIFF*, int);
+ extern int TIFFInitOJPEG(TIFF *, int);
#endif
#ifdef JPEG_SUPPORT
-extern int TIFFInitJPEG(TIFF*, int);
-extern int TIFFJPEGIsFullStripRequired(TIFF*);
+ extern int TIFFInitJPEG(TIFF *, int);
+ extern int TIFFJPEGIsFullStripRequired(TIFF *);
#endif
#ifdef JBIG_SUPPORT
-extern int TIFFInitJBIG(TIFF*, int);
+ extern int TIFFInitJBIG(TIFF *, int);
#endif
#ifdef ZIP_SUPPORT
-extern int TIFFInitZIP(TIFF*, int);
+ extern int TIFFInitZIP(TIFF *, int);
#endif
#ifdef PIXARLOG_SUPPORT
-extern int TIFFInitPixarLog(TIFF*, int);
+ extern int TIFFInitPixarLog(TIFF *, int);
#endif
#ifdef LOGLUV_SUPPORT
-extern int TIFFInitSGILog(TIFF*, int);
+ extern int TIFFInitSGILog(TIFF *, int);
+#endif
+#ifdef LERC_SUPPORT
+ extern int TIFFInitLERC(TIFF *tif, int);
#endif
#ifdef LZMA_SUPPORT
-extern int TIFFInitLZMA(TIFF*, int);
+ extern int TIFFInitLZMA(TIFF *, int);
#endif
#ifdef ZSTD_SUPPORT
-extern int TIFFInitZSTD(TIFF*, int);
+ extern int TIFFInitZSTD(TIFF *, int);
#endif
#ifdef WEBP_SUPPORT
-extern int TIFFInitWebP(TIFF*, int);
-#endif
-#ifdef VMS
-extern const TIFFCodec _TIFFBuiltinCODECS[];
-#else
-extern TIFFCodec _TIFFBuiltinCODECS[];
+ extern int TIFFInitWebP(TIFF *, int);
#endif
+ extern const TIFFCodec _TIFFBuiltinCODECS[];
+ extern void TIFFCIELab16ToXYZ(TIFFCIELabToRGB *, uint32_t l, int32_t a,
+ int32_t b, float *, float *, float *);
+
+ extern void *_TIFFmallocExt(TIFF *tif, tmsize_t s);
+ extern void *_TIFFcallocExt(TIFF *tif, tmsize_t nmemb, tmsize_t siz);
+ extern void *_TIFFreallocExt(TIFF *tif, void *p, tmsize_t s);
+ extern void _TIFFfreeExt(TIFF *tif, void *p);
#if defined(__cplusplus)
}
#endif
#endif /* _TIFFIOP_ */
-
-/* vim: set ts=8 sts=8 sw=8 noet: */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/libtiff/tiffvers.h b/src/3rdparty/libtiff/libtiff/tiffvers.h
index aa3f613..552e885 100644
--- a/src/3rdparty/libtiff/libtiff/tiffvers.h
+++ b/src/3rdparty/libtiff/libtiff/tiffvers.h
@@ -1,4 +1,9 @@
-#define TIFFLIB_VERSION_STR "LIBTIFF, Version 4.1.0\nCopyright (c) 1988-1996 Sam Leffler\nCopyright (c) 1991-1996 Silicon Graphics, Inc."
+/* clang-format off */
+
+/* clang-format disabled because FindTIFF.cmake is very sensitive to the
+ * formatting of below line being a single line.
+ */
+#define TIFFLIB_VERSION_STR "LIBTIFF, Version 4.5.0\nCopyright (c) 1988-1996 Sam Leffler\nCopyright (c) 1991-1996 Silicon Graphics, Inc."
/*
* This define can be used in code that requires
* compilation-related definitions specific to a
@@ -6,4 +11,20 @@
* version checking should be done based on the
* string returned by TIFFGetVersion.
*/
-#define TIFFLIB_VERSION 20191103
+#define TIFFLIB_VERSION 20221213
+
+/* The following defines have been added in 4.5.0 */
+#define TIFFLIB_MAJOR_VERSION 4
+#define TIFFLIB_MINOR_VERSION 5
+#define TIFFLIB_MICRO_VERSION 0
+
+/* Macro added in 4.5.0. Returns TRUE if the current libtiff version is
+ * greater or equal to major.minor.micro
+ */
+#define TIFFLIB_AT_LEAST(major, minor, micro) \
+ (TIFFLIB_MAJOR_VERSION > (major) || \
+ (TIFFLIB_MAJOR_VERSION == (major) && TIFFLIB_MINOR_VERSION > (minor)) || \
+ (TIFFLIB_MAJOR_VERSION == (major) && TIFFLIB_MINOR_VERSION == (minor) && \
+ TIFFLIB_MICRO_VERSION >= (micro)))
+
+/* clang-format on */
diff --git a/src/3rdparty/libtiff/libtiff/uvcode.h b/src/3rdparty/libtiff/libtiff/uvcode.h
index 6286cfb..fc87729 100644
--- a/src/3rdparty/libtiff/libtiff/uvcode.h
+++ b/src/3rdparty/libtiff/libtiff/uvcode.h
@@ -1,180 +1,93 @@
/* Version 1.0 generated April 7, 1997 by Greg Ward Larson, SGI */
-#define UV_SQSIZ (float)0.003500
-#define UV_NDIVS 16289
-#define UV_VSTART (float)0.016940
-#define UV_NVS 163
-static const struct {
- float ustart;
- short nus, ncum;
-} uv_row[UV_NVS] = {
- { (float)0.247663, 4, 0 },
- { (float)0.243779, 6, 4 },
- { (float)0.241684, 7, 10 },
- { (float)0.237874, 9, 17 },
- { (float)0.235906, 10, 26 },
- { (float)0.232153, 12, 36 },
- { (float)0.228352, 14, 48 },
- { (float)0.226259, 15, 62 },
- { (float)0.222371, 17, 77 },
- { (float)0.220410, 18, 94 },
- { (float)0.214710, 21, 112 },
- { (float)0.212714, 22, 133 },
- { (float)0.210721, 23, 155 },
- { (float)0.204976, 26, 178 },
- { (float)0.202986, 27, 204 },
- { (float)0.199245, 29, 231 },
- { (float)0.195525, 31, 260 },
- { (float)0.193560, 32, 291 },
- { (float)0.189878, 34, 323 },
- { (float)0.186216, 36, 357 },
- { (float)0.186216, 36, 393 },
- { (float)0.182592, 38, 429 },
- { (float)0.179003, 40, 467 },
- { (float)0.175466, 42, 507 },
- { (float)0.172001, 44, 549 },
- { (float)0.172001, 44, 593 },
- { (float)0.168612, 46, 637 },
- { (float)0.168612, 46, 683 },
- { (float)0.163575, 49, 729 },
- { (float)0.158642, 52, 778 },
- { (float)0.158642, 52, 830 },
- { (float)0.158642, 52, 882 },
- { (float)0.153815, 55, 934 },
- { (float)0.153815, 55, 989 },
- { (float)0.149097, 58, 1044 },
- { (float)0.149097, 58, 1102 },
- { (float)0.142746, 62, 1160 },
- { (float)0.142746, 62, 1222 },
- { (float)0.142746, 62, 1284 },
- { (float)0.138270, 65, 1346 },
- { (float)0.138270, 65, 1411 },
- { (float)0.138270, 65, 1476 },
- { (float)0.132166, 69, 1541 },
- { (float)0.132166, 69, 1610 },
- { (float)0.126204, 73, 1679 },
- { (float)0.126204, 73, 1752 },
- { (float)0.126204, 73, 1825 },
- { (float)0.120381, 77, 1898 },
- { (float)0.120381, 77, 1975 },
- { (float)0.120381, 77, 2052 },
- { (float)0.120381, 77, 2129 },
- { (float)0.112962, 82, 2206 },
- { (float)0.112962, 82, 2288 },
- { (float)0.112962, 82, 2370 },
- { (float)0.107450, 86, 2452 },
- { (float)0.107450, 86, 2538 },
- { (float)0.107450, 86, 2624 },
- { (float)0.107450, 86, 2710 },
- { (float)0.100343, 91, 2796 },
- { (float)0.100343, 91, 2887 },
- { (float)0.100343, 91, 2978 },
- { (float)0.095126, 95, 3069 },
- { (float)0.095126, 95, 3164 },
- { (float)0.095126, 95, 3259 },
- { (float)0.095126, 95, 3354 },
- { (float)0.088276, 100, 3449 },
- { (float)0.088276, 100, 3549 },
- { (float)0.088276, 100, 3649 },
- { (float)0.088276, 100, 3749 },
- { (float)0.081523, 105, 3849 },
- { (float)0.081523, 105, 3954 },
- { (float)0.081523, 105, 4059 },
- { (float)0.081523, 105, 4164 },
- { (float)0.074861, 110, 4269 },
- { (float)0.074861, 110, 4379 },
- { (float)0.074861, 110, 4489 },
- { (float)0.074861, 110, 4599 },
- { (float)0.068290, 115, 4709 },
- { (float)0.068290, 115, 4824 },
- { (float)0.068290, 115, 4939 },
- { (float)0.068290, 115, 5054 },
- { (float)0.063573, 119, 5169 },
- { (float)0.063573, 119, 5288 },
- { (float)0.063573, 119, 5407 },
- { (float)0.063573, 119, 5526 },
- { (float)0.057219, 124, 5645 },
- { (float)0.057219, 124, 5769 },
- { (float)0.057219, 124, 5893 },
- { (float)0.057219, 124, 6017 },
- { (float)0.050985, 129, 6141 },
- { (float)0.050985, 129, 6270 },
- { (float)0.050985, 129, 6399 },
- { (float)0.050985, 129, 6528 },
- { (float)0.050985, 129, 6657 },
- { (float)0.044859, 134, 6786 },
- { (float)0.044859, 134, 6920 },
- { (float)0.044859, 134, 7054 },
- { (float)0.044859, 134, 7188 },
- { (float)0.040571, 138, 7322 },
- { (float)0.040571, 138, 7460 },
- { (float)0.040571, 138, 7598 },
- { (float)0.040571, 138, 7736 },
- { (float)0.036339, 142, 7874 },
- { (float)0.036339, 142, 8016 },
- { (float)0.036339, 142, 8158 },
- { (float)0.036339, 142, 8300 },
- { (float)0.032139, 146, 8442 },
- { (float)0.032139, 146, 8588 },
- { (float)0.032139, 146, 8734 },
- { (float)0.032139, 146, 8880 },
- { (float)0.027947, 150, 9026 },
- { (float)0.027947, 150, 9176 },
- { (float)0.027947, 150, 9326 },
- { (float)0.023739, 154, 9476 },
- { (float)0.023739, 154, 9630 },
- { (float)0.023739, 154, 9784 },
- { (float)0.023739, 154, 9938 },
- { (float)0.019504, 158, 10092 },
- { (float)0.019504, 158, 10250 },
- { (float)0.019504, 158, 10408 },
- { (float)0.016976, 161, 10566 },
- { (float)0.016976, 161, 10727 },
- { (float)0.016976, 161, 10888 },
- { (float)0.016976, 161, 11049 },
- { (float)0.012639, 165, 11210 },
- { (float)0.012639, 165, 11375 },
- { (float)0.012639, 165, 11540 },
- { (float)0.009991, 168, 11705 },
- { (float)0.009991, 168, 11873 },
- { (float)0.009991, 168, 12041 },
- { (float)0.009016, 170, 12209 },
- { (float)0.009016, 170, 12379 },
- { (float)0.009016, 170, 12549 },
- { (float)0.006217, 173, 12719 },
- { (float)0.006217, 173, 12892 },
- { (float)0.005097, 175, 13065 },
- { (float)0.005097, 175, 13240 },
- { (float)0.005097, 175, 13415 },
- { (float)0.003909, 177, 13590 },
- { (float)0.003909, 177, 13767 },
- { (float)0.002340, 177, 13944 },
- { (float)0.002389, 170, 14121 },
- { (float)0.001068, 164, 14291 },
- { (float)0.001653, 157, 14455 },
- { (float)0.000717, 150, 14612 },
- { (float)0.001614, 143, 14762 },
- { (float)0.000270, 136, 14905 },
- { (float)0.000484, 129, 15041 },
- { (float)0.001103, 123, 15170 },
- { (float)0.001242, 115, 15293 },
- { (float)0.001188, 109, 15408 },
- { (float)0.001011, 103, 15517 },
- { (float)0.000709, 97, 15620 },
- { (float)0.000301, 89, 15717 },
- { (float)0.002416, 82, 15806 },
- { (float)0.003251, 76, 15888 },
- { (float)0.003246, 69, 15964 },
- { (float)0.004141, 62, 16033 },
- { (float)0.005963, 55, 16095 },
- { (float)0.008839, 47, 16150 },
- { (float)0.010490, 40, 16197 },
- { (float)0.016994, 31, 16237 },
- { (float)0.023659, 21, 16268 },
+#define UV_SQSIZ (float)0.003500
+#define UV_NDIVS 16289
+#define UV_VSTART (float)0.016940
+#define UV_NVS 163
+static const struct
+{
+ float ustart;
+ short nus, ncum;
+} uv_row[UV_NVS] = {
+ {(float)0.247663, 4, 0}, {(float)0.243779, 6, 4},
+ {(float)0.241684, 7, 10}, {(float)0.237874, 9, 17},
+ {(float)0.235906, 10, 26}, {(float)0.232153, 12, 36},
+ {(float)0.228352, 14, 48}, {(float)0.226259, 15, 62},
+ {(float)0.222371, 17, 77}, {(float)0.220410, 18, 94},
+ {(float)0.214710, 21, 112}, {(float)0.212714, 22, 133},
+ {(float)0.210721, 23, 155}, {(float)0.204976, 26, 178},
+ {(float)0.202986, 27, 204}, {(float)0.199245, 29, 231},
+ {(float)0.195525, 31, 260}, {(float)0.193560, 32, 291},
+ {(float)0.189878, 34, 323}, {(float)0.186216, 36, 357},
+ {(float)0.186216, 36, 393}, {(float)0.182592, 38, 429},
+ {(float)0.179003, 40, 467}, {(float)0.175466, 42, 507},
+ {(float)0.172001, 44, 549}, {(float)0.172001, 44, 593},
+ {(float)0.168612, 46, 637}, {(float)0.168612, 46, 683},
+ {(float)0.163575, 49, 729}, {(float)0.158642, 52, 778},
+ {(float)0.158642, 52, 830}, {(float)0.158642, 52, 882},
+ {(float)0.153815, 55, 934}, {(float)0.153815, 55, 989},
+ {(float)0.149097, 58, 1044}, {(float)0.149097, 58, 1102},
+ {(float)0.142746, 62, 1160}, {(float)0.142746, 62, 1222},
+ {(float)0.142746, 62, 1284}, {(float)0.138270, 65, 1346},
+ {(float)0.138270, 65, 1411}, {(float)0.138270, 65, 1476},
+ {(float)0.132166, 69, 1541}, {(float)0.132166, 69, 1610},
+ {(float)0.126204, 73, 1679}, {(float)0.126204, 73, 1752},
+ {(float)0.126204, 73, 1825}, {(float)0.120381, 77, 1898},
+ {(float)0.120381, 77, 1975}, {(float)0.120381, 77, 2052},
+ {(float)0.120381, 77, 2129}, {(float)0.112962, 82, 2206},
+ {(float)0.112962, 82, 2288}, {(float)0.112962, 82, 2370},
+ {(float)0.107450, 86, 2452}, {(float)0.107450, 86, 2538},
+ {(float)0.107450, 86, 2624}, {(float)0.107450, 86, 2710},
+ {(float)0.100343, 91, 2796}, {(float)0.100343, 91, 2887},
+ {(float)0.100343, 91, 2978}, {(float)0.095126, 95, 3069},
+ {(float)0.095126, 95, 3164}, {(float)0.095126, 95, 3259},
+ {(float)0.095126, 95, 3354}, {(float)0.088276, 100, 3449},
+ {(float)0.088276, 100, 3549}, {(float)0.088276, 100, 3649},
+ {(float)0.088276, 100, 3749}, {(float)0.081523, 105, 3849},
+ {(float)0.081523, 105, 3954}, {(float)0.081523, 105, 4059},
+ {(float)0.081523, 105, 4164}, {(float)0.074861, 110, 4269},
+ {(float)0.074861, 110, 4379}, {(float)0.074861, 110, 4489},
+ {(float)0.074861, 110, 4599}, {(float)0.068290, 115, 4709},
+ {(float)0.068290, 115, 4824}, {(float)0.068290, 115, 4939},
+ {(float)0.068290, 115, 5054}, {(float)0.063573, 119, 5169},
+ {(float)0.063573, 119, 5288}, {(float)0.063573, 119, 5407},
+ {(float)0.063573, 119, 5526}, {(float)0.057219, 124, 5645},
+ {(float)0.057219, 124, 5769}, {(float)0.057219, 124, 5893},
+ {(float)0.057219, 124, 6017}, {(float)0.050985, 129, 6141},
+ {(float)0.050985, 129, 6270}, {(float)0.050985, 129, 6399},
+ {(float)0.050985, 129, 6528}, {(float)0.050985, 129, 6657},
+ {(float)0.044859, 134, 6786}, {(float)0.044859, 134, 6920},
+ {(float)0.044859, 134, 7054}, {(float)0.044859, 134, 7188},
+ {(float)0.040571, 138, 7322}, {(float)0.040571, 138, 7460},
+ {(float)0.040571, 138, 7598}, {(float)0.040571, 138, 7736},
+ {(float)0.036339, 142, 7874}, {(float)0.036339, 142, 8016},
+ {(float)0.036339, 142, 8158}, {(float)0.036339, 142, 8300},
+ {(float)0.032139, 146, 8442}, {(float)0.032139, 146, 8588},
+ {(float)0.032139, 146, 8734}, {(float)0.032139, 146, 8880},
+ {(float)0.027947, 150, 9026}, {(float)0.027947, 150, 9176},
+ {(float)0.027947, 150, 9326}, {(float)0.023739, 154, 9476},
+ {(float)0.023739, 154, 9630}, {(float)0.023739, 154, 9784},
+ {(float)0.023739, 154, 9938}, {(float)0.019504, 158, 10092},
+ {(float)0.019504, 158, 10250}, {(float)0.019504, 158, 10408},
+ {(float)0.016976, 161, 10566}, {(float)0.016976, 161, 10727},
+ {(float)0.016976, 161, 10888}, {(float)0.016976, 161, 11049},
+ {(float)0.012639, 165, 11210}, {(float)0.012639, 165, 11375},
+ {(float)0.012639, 165, 11540}, {(float)0.009991, 168, 11705},
+ {(float)0.009991, 168, 11873}, {(float)0.009991, 168, 12041},
+ {(float)0.009016, 170, 12209}, {(float)0.009016, 170, 12379},
+ {(float)0.009016, 170, 12549}, {(float)0.006217, 173, 12719},
+ {(float)0.006217, 173, 12892}, {(float)0.005097, 175, 13065},
+ {(float)0.005097, 175, 13240}, {(float)0.005097, 175, 13415},
+ {(float)0.003909, 177, 13590}, {(float)0.003909, 177, 13767},
+ {(float)0.002340, 177, 13944}, {(float)0.002389, 170, 14121},
+ {(float)0.001068, 164, 14291}, {(float)0.001653, 157, 14455},
+ {(float)0.000717, 150, 14612}, {(float)0.001614, 143, 14762},
+ {(float)0.000270, 136, 14905}, {(float)0.000484, 129, 15041},
+ {(float)0.001103, 123, 15170}, {(float)0.001242, 115, 15293},
+ {(float)0.001188, 109, 15408}, {(float)0.001011, 103, 15517},
+ {(float)0.000709, 97, 15620}, {(float)0.000301, 89, 15717},
+ {(float)0.002416, 82, 15806}, {(float)0.003251, 76, 15888},
+ {(float)0.003246, 69, 15964}, {(float)0.004141, 62, 16033},
+ {(float)0.005963, 55, 16095}, {(float)0.008839, 47, 16150},
+ {(float)0.010490, 40, 16197}, {(float)0.016994, 31, 16237},
+ {(float)0.023659, 21, 16268},
};
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
diff --git a/src/3rdparty/libtiff/port/dummy.c b/src/3rdparty/libtiff/port/dummy.c
deleted file mode 100644
index 346a07e..0000000
--- a/src/3rdparty/libtiff/port/dummy.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/*
- * Dummy function, just to be ensure that the library always will be created.
- */
-
-void
-libport_dummy_function()
-{
- return;
-}
-
diff --git a/src/3rdparty/libtiff/port/getopt.c b/src/3rdparty/libtiff/port/getopt.c
deleted file mode 100644
index c7bdb11..0000000
--- a/src/3rdparty/libtiff/port/getopt.c
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (c) 1987, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-static char sccsid[] = "@(#)getopt.c 8.3 (Berkeley) 4/27/95";
-__RCSID("$NetBSD: getopt.c,v 1.26 2003/08/07 16:43:40 agc Exp $");
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include "libport.h"
-
-int opterr = 1, /* if error message should be printed */
- optind = 1, /* index into parent argv vector */
- optopt, /* character checked for validity */
- optreset; /* reset getopt */
-char *optarg; /* argument associated with option */
-
-#define BADCH (int)'?'
-#define BADARG (int)':'
-#define EMSG ""
-
-/*
- * getopt --
- * Parse argc/argv argument vector.
- */
-int
-getopt(int argc, char * const argv[], const char *optstring)
-{
- static char *place = EMSG; /* option letter processing */
- char *oli; /* option letter list index */
-
- if (optreset || *place == 0) { /* update scanning pointer */
- optreset = 0;
- place = argv[optind];
- if (optind >= argc || *place++ != '-') {
- /* Argument is absent or is not an option */
- place = EMSG;
- return (-1);
- }
- optopt = *place++;
- if (optopt == '-' && *place == 0) {
- /* "--" => end of options */
- ++optind;
- place = EMSG;
- return (-1);
- }
- if (optopt == 0) {
- /* Solitary '-', treat as a '-' option
- if the program (eg su) is looking for it. */
- place = EMSG;
- if (strchr(optstring, '-') == NULL)
- return -1;
- optopt = '-';
- }
- } else
- optopt = *place++;
-
- /* See if option letter is one the caller wanted... */
- if (optopt == ':' || (oli = strchr(optstring, optopt)) == NULL) {
- if (*place == 0)
- ++optind;
- if (opterr && *optstring != ':')
- (void)fprintf(stderr,
- "unknown option -- %c\n", optopt);
- return (BADCH);
- }
-
- /* Does this option need an argument? */
- if (oli[1] != ':') {
- /* don't need argument */
- optarg = NULL;
- if (*place == 0)
- ++optind;
- } else {
- /* Option-argument is either the rest of this argument or the
- entire next argument. */
- if (*place)
- optarg = place;
- else if (argc > ++optind)
- optarg = argv[optind];
- else {
- /* option-argument absent */
- place = EMSG;
- if (*optstring == ':')
- return (BADARG);
- if (opterr)
- (void)fprintf(stderr,
- "option requires an argument -- %c\n",
- optopt);
- return (BADCH);
- }
- place = EMSG;
- ++optind;
- }
- return (optopt); /* return option letter */
-}
diff --git a/src/3rdparty/libtiff/port/lfind.c b/src/3rdparty/libtiff/port/lfind.c
deleted file mode 100644
index 00ab649..0000000
--- a/src/3rdparty/libtiff/port/lfind.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Roger L. Snyder.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-static char sccsid[] = "@(#)lsearch.c 8.1 (Berkeley) 6/4/93";
-__RCSID("$NetBSD: lsearch.c,v 1.2 2005/07/06 15:47:15 drochner Exp $");
-#endif
-
-#ifdef _WIN32_WCE
-# include <wce_types.h>
-#else
-# include <sys/types.h>
-#endif
-
-#ifndef NULL
-# define NULL 0
-#endif
-
-void *
-lfind(const void *key, const void *base, size_t *nmemb, size_t size,
- int(*compar)(const void *, const void *))
-{
- char *element, *end;
-
- end = (char *)base + *nmemb * size;
- for (element = (char *)base; element < end; element += size)
- if (!compar(element, key)) /* key found */
- return element;
-
- return NULL;
-}
diff --git a/src/3rdparty/libtiff/port/libport.h b/src/3rdparty/libtiff/port/libport.h
deleted file mode 100644
index ff26263..0000000
--- a/src/3rdparty/libtiff/port/libport.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (c) 2009 Frank Warmerdam
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that (i) the above copyright notices and this permission notice appear in
- * all copies of the software and related documentation, and (ii) the names of
- * Sam Leffler and Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
- * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
- * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- * OF THIS SOFTWARE.
- */
-
-#ifndef _LIBPORT_
-#define _LIBPORT_
-
-int getopt(int argc, char * const argv[], const char *optstring);
-extern char *optarg;
-extern int opterr;
-extern int optind;
-extern int optopt;
-
-int strcasecmp(const char *s1, const char *s2);
-
-#ifndef HAVE_GETOPT
-# define HAVE_GETOPT 1
-#endif
-
-#if HAVE_STRTOL
-long strtol(const char *nptr, char **endptr, int base);
-#endif
-#if HAVE_STRTOLL
-long long strtoll(const char *nptr, char **endptr, int base);
-#endif
-#if HAVE_STRTOUL
-unsigned long strtoul(const char *nptr, char **endptr, int base);
-#endif
-#if HAVE_STRTOULL
-unsigned long long strtoull(const char *nptr, char **endptr, int base);
-#endif
-
-#if 0
-void *
-lfind(const void *key, const void *base, size_t *nmemb, size_t size,
- int(*compar)(const void *, const void *));
-#endif
-
-#if !defined(HAVE_SNPRINTF)
-#undef vsnprintf
-#define vsnprintf _TIFF_vsnprintf_f
-
-#undef snprintf
-#define snprintf _TIFF_snprintf_f
-int snprintf(char* str, size_t size, const char* format, ...);
-#endif
-
-#endif /* ndef _LIBPORT_ */
diff --git a/src/3rdparty/libtiff/port/snprintf.c b/src/3rdparty/libtiff/port/snprintf.c
deleted file mode 100644
index 3542ab7..0000000
--- a/src/3rdparty/libtiff/port/snprintf.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * Workaround for lack of snprintf(3) in Visual Studio. See
- * http://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010/8712996#8712996
- * It's a trivial wrapper around the builtin _vsnprintf_s and
- * _vscprintf functions.
- */
-
-#ifdef _MSC_VER
-
-#include <stdio.h>
-#include <stdarg.h>
-#include "libport.h"
-
-int _TIFF_vsnprintf_f(char* str, size_t size, const char* format, va_list ap)
-{
- int count = -1;
-
- if (size != 0)
-#if _MSC_VER <= 1310
- count = _vsnprintf(str, size, format, ap);
-#else
- count = _vsnprintf_s(str, size, _TRUNCATE, format, ap);
-#endif
- if (count == -1)
- count = _vscprintf(format, ap);
-
- return count;
-}
-
-int _TIFF_snprintf_f(char* str, size_t size, const char* format, ...)
-{
- int count;
- va_list ap;
-
- va_start(ap, format);
- count = vsnprintf(str, size, format, ap);
- va_end(ap);
-
- return count;
-}
-
-#endif // _MSC_VER
diff --git a/src/3rdparty/libtiff/port/strcasecmp.c b/src/3rdparty/libtiff/port/strcasecmp.c
deleted file mode 100644
index 65e2b41..0000000
--- a/src/3rdparty/libtiff/port/strcasecmp.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 1987, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-static char sccsid[] = "@(#)strcasecmp.c 8.1 (Berkeley) 6/4/93";
-__RCSID("$NetBSD: strcasecmp.c,v 1.16 2003/08/07 16:43:49 agc Exp $");
-#endif
-
-#include <ctype.h>
-#include <string.h>
-#include "libport.h"
-
-int
-strcasecmp(const char *s1, const char *s2)
-{
- const unsigned char *us1 = (const unsigned char *)s1,
- *us2 = (const unsigned char *)s2;
-
- while (tolower((int) *us1) == tolower((int) *us2++))
- if (*us1++ == '\0')
- return (0);
- return (tolower((int) *us1) - tolower((int) *--us2));
-}
diff --git a/src/3rdparty/libtiff/port/strtoul.c b/src/3rdparty/libtiff/port/strtoul.c
deleted file mode 100644
index dbd44f1..0000000
--- a/src/3rdparty/libtiff/port/strtoul.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* $NetBSD: strtoul.c,v 1.3 2008/08/20 19:58:34 oster Exp $ */
-
-/*-
- * Copyright (c) 2005 The DragonFly Project. All rights reserved.
- * Copyright (c) 2003 Citrus Project,
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-__RCSID("$NetBSD: strtoul.c,v 1.3 2008/08/20 19:58:34 oster Exp $");
-#endif
-
-#include <assert.h>
-#include <ctype.h>
-#include <errno.h>
-#include <limits.h>
-#include <stdlib.h>
-
-#define _FUNCNAME strtoul
-#define __UINT unsigned long int
-#define __UINT_MAX ULONG_MAX
-
-#include "_strtoul.h"
diff --git a/src/3rdparty/libtiff/port/strtoull.c b/src/3rdparty/libtiff/port/strtoull.c
deleted file mode 100644
index 91e4ddf..0000000
--- a/src/3rdparty/libtiff/port/strtoull.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* $NetBSD: strtoul.c,v 1.3 2008/08/20 19:58:34 oster Exp $ */
-
-/*-
- * Copyright (c) 2005 The DragonFly Project. All rights reserved.
- * Copyright (c) 2003 Citrus Project,
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if 0
-__RCSID("$NetBSD: strtoul.c,v 1.3 2008/08/20 19:58:34 oster Exp $");
-#endif
-
-#include <assert.h>
-#include <ctype.h>
-#include <errno.h>
-#include <limits.h>
-#include <stdlib.h>
-
-#define _FUNCNAME strtoull
-#define __UINT unsigned long long int
-#define __UINT_MAX ULLONG_MAX
-
-#include "_strtoul.h"
diff --git a/src/3rdparty/libtiff/qt_attribution.json b/src/3rdparty/libtiff/qt_attribution.json
index d51ee4a..7787e89 100644
--- a/src/3rdparty/libtiff/qt_attribution.json
+++ b/src/3rdparty/libtiff/qt_attribution.json
@@ -6,10 +6,10 @@
"Description": "",
"Homepage": "http://www.simplesystems.org/libtiff/",
- "Version": "4.1.0",
+ "Version": "4.5.0",
"License": "libtiff License",
"LicenseId": "libtiff",
"LicenseFile": "COPYRIGHT",
- "Copyright": "Copyright (c) 1988-1997 Sam Leffler
-Copyright (c) 1991-1997 Silicon Graphics, Inc."
+ "Copyright": "Copyright (c) 1988-1997 Sam Leffler\nCopyright (c) 1991-1997 Silicon Graphics, Inc."
}
+
diff --git a/src/3rdparty/libwebp.pri b/src/3rdparty/libwebp.pri
index c193ddf..c91b2d0 100644
--- a/src/3rdparty/libwebp.pri
+++ b/src/3rdparty/libwebp.pri
@@ -1,5 +1,8 @@
+CONFIG += compile_included_sources
+
INCLUDEPATH += \
$$PWD/libwebp \
+ $$PWD/libwebp/sharpyuv \
$$PWD/libwebp/src \
$$PWD/libwebp/src/dec \
$$PWD/libwebp/src/enc \
@@ -9,6 +12,12 @@ INCLUDEPATH += \
$$PWD/libwebp/src/webp
SOURCES += \
+ $$PWD/libwebp/sharpyuv/sharpyuv.c \
+ $$PWD/libwebp/sharpyuv/sharpyuv_cpu.c \
+ $$PWD/libwebp/sharpyuv/sharpyuv_csp.c \
+ $$PWD/libwebp/sharpyuv/sharpyuv_dsp.c \
+ $$PWD/libwebp/sharpyuv/sharpyuv_gamma.c \
+ $$PWD/libwebp/sharpyuv/sharpyuv_sse2.c \
$$PWD/libwebp/src/dec/alpha_dec.c \
$$PWD/libwebp/src/dec/buffer_dec.c \
$$PWD/libwebp/src/dec/frame_dec.c \
@@ -71,6 +80,7 @@ SOURCES += \
$$PWD/libwebp/src/dsp/yuv.c \
$$PWD/libwebp/src/dsp/yuv_mips_dsp_r2.c \
$$PWD/libwebp/src/dsp/lossless_sse2.c \
+ $$PWD/libwebp/src/dsp/lossless_sse41.c \
$$PWD/libwebp/src/dsp/yuv_mips32.c \
$$PWD/libwebp/src/dsp/yuv_sse2.c \
$$PWD/libwebp/src/dsp/yuv_sse41.c \
@@ -124,6 +134,7 @@ integrity {
}
SOURCES_FOR_NEON += \
+ $$PWD/libwebp/sharpyuv/sharpyuv_neon.c \
$$PWD/libwebp/src/dsp/alpha_processing_neon.c \
$$PWD/libwebp/src/dsp/dec_neon.c \
$$PWD/libwebp/src/dsp/enc_neon.c \
@@ -137,7 +148,7 @@ SOURCES_FOR_NEON += \
android {
arm64-v8a | armeabi-v7a: SOURCES += $$SOURCES_FOR_NEON
-} else: equals(QT_ARCH, arm)|equals(QT_ARCH, arm64) {
+} else:!macos: equals(QT_ARCH, arm)|equals(QT_ARCH, arm64) {
contains(QT_CPU_FEATURES.$$QT_ARCH, neon) {
# Default compiler settings include this feature, so just add to SOURCES
SOURCES += $$SOURCES_FOR_NEON
@@ -155,4 +166,7 @@ android {
silent: neon_comp.commands = @echo compiling[neon] ${QMAKE_FILE_IN} && $$neon_comp.commands
QMAKE_EXTRA_COMPILERS += neon_comp
}
+} else:macos {
+ CONFIG += simd
+ NEON_SOURCES += $$SOURCES_FOR_NEON
}
diff --git a/src/3rdparty/libwebp/AUTHORS b/src/3rdparty/libwebp/AUTHORS
index 67482c1..2f0c537 100644
--- a/src/3rdparty/libwebp/AUTHORS
+++ b/src/3rdparty/libwebp/AUTHORS
@@ -1,13 +1,23 @@
Contributors:
- Aidan O'Loan (aidanol at gmail dot com)
- Alan Browning (browning at google dot com)
+- Alexandru Ardelean (ardeleanalex at gmail dot com)
+- Brian Ledger (brianpl at google dot com)
- Charles Munger (clm at google dot com)
+- Cheng Yi (cyi at google dot com)
- Christian Duvivier (cduvivier at google dot com)
+- Christopher Degawa (ccom at randomderp dot com)
+- Clement Courbet (courbet at google dot com)
- Djordje Pesut (djordje dot pesut at imgtec dot com)
+- Frank Barchard (fbarchard at google dot com)
- Hui Su (huisu at google dot com)
+- H. Vetinari (h dot vetinari at gmx dot com)
+- Ilya Kurdyukov (jpegqs at gmail dot com)
+- Ingvar Stepanyan (rreverser at google dot com)
- James Zern (jzern at google dot com)
- Jan Engelhardt (jengelh at medozas dot de)
- Jehan (jehan at girinstud dot io)
+- Jeremy Maitin-Shepard (jbms at google dot com)
- Johann Koenig (johann dot koenig at duck dot com)
- Jovan Zelincevic (jovan dot zelincevic at imgtec dot com)
- Jyrki Alakuijala (jyrki at google dot com)
@@ -17,15 +27,18 @@ Contributors:
- Mans Rullgard (mans at mansr dot com)
- Marcin Kowalczyk (qrczak at google dot com)
- Martin Olsson (mnemo at minimum dot se)
+- Maryla Ustarroz-Calonge (maryla at google dot com)
- Mikołaj Zalewski (mikolajz at google dot com)
- Mislav Bradac (mislavm at google dot com)
- Nico Weber (thakis at chromium dot org)
- Noel Chromium (noel at chromium dot org)
+- Oliver Wolff (oliver dot wolff at qt dot io)
- Owen Rodley (orodley at google dot com)
- Parag Salasakar (img dot mips1 at gmail dot com)
- Pascal Massimino (pascal dot massimino at gmail dot com)
- Paweł Hajdan, Jr (phajdan dot jr at chromium dot org)
- Pierre Joye (pierre dot php at gmail dot com)
+- Roberto Alanis (alanisbaez at google dot com)
- Sam Clegg (sbc at chromium dot org)
- Scott Hancher (seh at google dot com)
- Scott LaVarnway (slavarnway at google dot com)
@@ -39,5 +52,7 @@ Contributors:
- Vikas Arora (vikasa at google dot com)
- Vincent Rabaud (vrabaud at google dot com)
- Vlad Tsyrklevich (vtsyrklevich at chromium dot org)
+- Wan-Teh Chang (wtc at google dot com)
- Yang Zhang (yang dot zhang at arm dot com)
- Yannis Guyon (yguyon at google dot com)
+- Zhi An Ng (zhin at chromium dot org)
diff --git a/src/3rdparty/libwebp/ChangeLog b/src/3rdparty/libwebp/ChangeLog
index 10ba580..00ef617 100644
--- a/src/3rdparty/libwebp/ChangeLog
+++ b/src/3rdparty/libwebp/ChangeLog
@@ -1,3 +1,524 @@
+0ba77244 update NEWS
+e763eb1e bump version to 1.3.0
+2a8686fc update AUTHORS
+106a57c1 Merge "*/Android.mk: add a check for NDK_ROOT" into main
+c5e841c4 Merge "extras: WebpToSDL -> WebPToSDL" into main
+dbc30715 Merge "xcframeworkbuild.sh: bump MACOSX_CATALYST_MIN_VERSION" into main
+6fc1a9f9 */Android.mk: add a check for NDK_ROOT
+d3e151fc doc/api.md,webp_js/README.md: Webp -> WebP
+ed92a626 extras: WebpToSDL -> WebPToSDL
+6eb0189b xcframeworkbuild.sh: bump MACOSX_CATALYST_MIN_VERSION
+1d58575b CMake: align .pc variables with autoconf
+e5fe2cfc webp-lossless-bitstream-spec,cosmetics: reflow paragraphs
+0ceeeab9 webp-lossless-bitstream-spec: add amendment note
+607611cd Merge "webp-container-spec: normalize section title case" into main
+f853685e lossless: SUBTRACT_GREEN -> SUBTRACT_GREEN_TRANSFORM
+786497e4 webp-lossless-bitstream-spec: fix inv color txfm description
+c6ac672d webp-lossless-bitstream-spec: fix num_code_lengths check
+b5700efb webp-lossless-bitstream-spec,cosmetics: grammar/capitalization
+d8ed8c11 webp-container-spec: normalize section title case
+52ec0b8f Merge changes Ie975dbb5,Ifc8c93af,I6ca7c5d6,I2e8d66f5,I152477b8 into main
+5097ef62 webp-container-spec,cosmetics: grammar/capitalization
+e3ba2b1f webp-lossless-bitstream-spec,cosmetics: reflow abstract
+1e8e3ded webp-lossless-bitstream-spec: reword abstract re alpha
+017cb6fa webp-container-spec,cosmetics: normalize range syntax
+f6a4684b webp-lossless-bitstream-spec,cosmetics: normalize range syntax
+54ebd5a3 webp-lossless-bitstream-spec: limit dist map lut to 69 cols
+44741f9c webp-lossless-bitstream-spec: fix dist mapping example
+fad0ece7 pnmdec.c: use snprintf instead of sprintf
+3f73e8f7 sharpyuv: add SharpYuvGetVersion()
+ce2f2d66 SharpYuvConvert: fix a race on SharpYuvGetCPUInfo
+a458e308 sharpyuv_dsp.h: restore sharpyuv_cpu.h include
+9ba800a7 Merge changes Id72fbf3b,Ic59d23a2 into main
+979c0ebb sharpyuv: add SharpYuvGetCPUInfo
+8bab09a4 Merge "*.pc.in: rename lib_prefix to webp_libname_prefix" into main
+769387c5 cpu.c,cosmetics: fix a typo
+a02978c2 sharpyuv/Makefile.am+cmake: add missing -lm
+28aedcb9 *.pc.in: rename lib_prefix to webp_libname_prefix
+c42e6d5a configure.ac: export an empty lib_prefix variable
+dfc843aa Merge "*.pc.in: add lib prefix to lib names w/MSVC" into main
+2498209b *.pc.in: add lib prefix to lib names w/MSVC
+ac252b61 Merge "analysis_enc.c: fix a dead store warning" into main
+56944762 analysis_enc.c: fix a dead store warning
+d34f9b99 Merge "webp-lossless-bitstream-spec: convert BNF to ABNF" into main
+dc05b4db Merge changes I96bc063c,I45880467,If9e18e5a,I6ee938e4,I0a410b28, ... into main
+83270c7f webp-container-spec: add prose for rendering process
+73b19b64 webp-container-spec: note reserved fields MUST be ignored
+57101d3f webp-lossless-bitstream-spec: improve 'small' color table stmt
+dfd32e45 webp-container-spec: remove redundant sentence
+8a6185dd doc/webp-*: fix some punctuation, grammar
+72776530 webp-lossless-bitstream-spec: convert BNF to ABNF
+d992bb08 cmake: rename cpufeatures target to cpufeatures-webp
+3ed2b275 webp-container-spec: clarify background color note
+951c292d webp-container-spec: come too late -> out of order
+902dd787 webp-container-spec: prefer hex literals
+a8f6b5ee webp-container-spec: change SHOULD to MUST w/ANIM chunk
+1dc59435 webp-container-spec: add unknown fields MUST be ignored
+280a810f webp-container-spec: make padding byte=0 a MUST
+41f0bf68 webp-container-spec: update note on trailing data
+6bdd36db webp-container-spec: clarify Chunk Size is in bytes
+87e36c48 Merge "webp_js/README.md,cosmetics: reflow some lines" into main
+5b01f321 Merge "Update Windows makefile to build libsharpyuv library." into main
+19b1a71c webp_js/README.md,cosmetics: reflow some lines
+780db756 Update Windows makefile to build libsharpyuv library.
+e407d4b3 CMakeLists.txt: replace GLUT_glut_LIBRARY w/GLUT::GLUT
+abf73d62 Merge "WebPConfig.cmake.in: add find_dependency(Threads)" into main
+25807fb4 Merge "cmake: restore compatibility with cmake < 3.12" into main
+5dbc4bfa WebPConfig.cmake.in: add find_dependency(Threads)
+b2a175dd Merge "Update wasm instructions." into main
+cb90f76b Update wasm instructions.
+02d15258 cmake: restore compatibility with cmake < 3.12
+5ba046e2 CMake: add_definitions -> add_compile_options
+e68765af dsp,neon: use vaddv in a few more places
+e8f83de2 Set libsharpyuv include dir to 'webp' subdirectory.
+15a91ab1 cmake,cosmetics: apply cmake-format
+0dd49d1a CMakeLists.txt: set @ONLY in configure_file() calls
+62b1bfe8 Merge changes I2877e7bb,I777cad70,I15af7d1a,I686e6740,If10538a9, ... into main
+95c8fe5f Merge changes Iecea3603,I9dc228ab into main
+e7c805cf picture_csp_enc.c: remove SafeInitSharpYuv
+6af8845a sharpyuv: prefer webp/types.h
+639619ce cmake: fix dll exports
+782ed48c sharpyuv,SharpYuvInit: add mutex protection when available
+cad0d5ad sharyuv_{neon,sse2}.c: merge WEBP_USE_* sections
+ef70ee06 add a few missing <stddef.h> includes for NULL
+f0f9eda4 sharpyuv.h: remove <inttypes.h>
+9b902cba Merge "picture_csp_enc.c,CheckNonOpaque: rm unneeded local" into main
+9c1d457c cmake/cpu.cmake: remove unused variable
+9ac25bcb CMakeLists.txt,win32: match naming convention used by nmake
+76c353ba picture_csp_enc.c,CheckNonOpaque: rm unneeded local
+5000de54 Merge "cwebp: fix WebPPictureHasTransparency call" into main
+e1729309 Merge "WebPPictureHasTransparency: add missing pointer check" into main
+00ff988a vp8l_enc,AddSingleSubGreen: clear int sanitizer warnings
+e2fecc22 dsp/lossless_enc.c: clear int sanitizer warnings
+129cf9e9 dsp/lossless.c: clear int sanitizer warnings
+ad7d1753 dsp/lossless_enc.c: clear int sanitizer warnings
+5037220e VP8LSubtractGreenFromBlueAndRed_C: clear int sanitizer warnings
+2ee786c7 upsampling_sse2.c: clear int sanitizer warnings
+4cc157d4 ParseOptionalChunks: clear int sanitizer warning
+892cf033 BuildHuffmanTable: clear int sanitizer warning
+3a9a4d45 VP8GetSigned: clear int sanitizer warnings
+704a3d0a dsp/lossless.c: quiet int sanitizer warnings
+1a6c109c WebPPictureHasTransparency: add missing pointer check
+c626e7d5 cwebp: fix WebPPictureHasTransparency call
+866e349c Merge tag 'v1.2.4'
+c170df38 Merge "Create libsharpyuv.a in makefile.unix." into main
+9d7ff74a Create libsharpyuv.a in makefile.unix.
+0d1f1254 update ChangeLog (tag: v1.2.4, origin/1.2.4)
+fcbc2d78 Merge "doc/*.txt: restrict code to 69 columns" into main
+4ad0e189 Merge "webp-container-spec.txt: normalize fourcc spelling" into main
+980d2488 update NEWS
+9fde8127 bump version to 1.2.4
+7a0a9935 doc/*.txt: restrict code to 69 columns
+c040a615 webp-container-spec.txt: normalize fourcc spelling
+aff1c546 dsp,x86: normalize types w/_mm_cvtsi128_si32 calls
+ab540ae0 dsp,x86: normalize types w/_mm_cvtsi32_si128 calls
+8980362e dsp,x86: normalize types w/_mm_set* calls (2)
+e626925c lossless: fix crunch mode w/WEBP_REDUCE_SIZE
+83539239 dsp,x86: normalize types w/_mm_set* calls
+8a4576ce webp-container-spec.txt: replace &amp; with &
+db870881 Merge "webp-container-spec.txt: make reserved 0 values a MUST" into main
+01d7d378 webp-lossless-bitstream-spec: number all sections
+337cf69f webp-lossless-bitstream-spec: mv Nomenclature after Intro
+79be856e Merge changes I7111d1f7,I872cd62c into main
+5b87983a webp-container-spec.txt: make reserved 0 values a MUST
+bd939123 Merge changes I7a25b1a6,I51b2c2a0,I87d0cbcf,I6ec60af6,I0a3fe9dc into main
+04764b56 libwebp.pc: add libsharpyuv to requires
+7deee810 libsharpyuv: add pkg-config file
+1a64a7e6 webp-container-spec.txt: clarify some SHOULDs
+bec2c88a webp-container-spec.txt: move ChunkHeader to terminology
+c9359332 webp-container-spec.txt: clarify 'VP8 '/'XMP ' fourccs
+70fe3063 webp-container-spec.txt: rightsize table entries
+ddbf3f3f webp-container-spec.txt: update 'key words' text
+c151e95b utils.h,WEBP_ALIGN: make bitmask unsigned
+748e92bb add WebPInt32ToMem
+3fe15b67 Merge "Build libsharpyuv as a full installable library." into main
+4f402f34 add WebPMemToInt32
+a3b68c19 Build libsharpyuv as a full installable library.
+b4994eaa CMake: set rpath for shared objects
+94cd7117 Merge "CMake: fix dylib versioning" into main
+e91451b6 Fix the lossless specs a bit more.
+231bdfb7 CMake: fix dylib versioning
+bfad7ab5 CMakeLists.txt: correct libwebpmux name in WebPConfig.cmake
+c2e3fd30 Revert "cmake: fix webpmux lib name for cmake linking"
+7366f7f3 Merge "lossless: fix crunch mode w/WEBP_REDUCE_SIZE" into main
+84163d9d lossless: fix crunch mode w/WEBP_REDUCE_SIZE
+d01c1eb3 webp-lossless-bitstream-spec,cosmetics: normalize capitalization
+8813ca8e Merge tag 'v1.2.3'
+3c4a0fbf update ChangeLog (tag: v1.2.3)
+56a480e8 dsp/cpu.h: add missing extern "C"
+62b45bdd update ChangeLog (tag: v1.2.3-rc1)
+8764ec7a Merge changes Idb037953,Id582e395 into 1.2.3
+bcb872c3 vwebp: fix file name display in windows unicode build
+67c44ac5 webpmux: fix -frame option in windows unicode build
+8278825a makefile.unix: add sharpyuv objects to clean target
+14a49e01 update NEWS
+34b1dc33 bump version to 1.2.3
+0b397fda update AUTHORS
+c16488ac update .mailmap
+5a2d929c Merge "unicode.h: set console mode before using wprintf" into main
+169f867f unicode.h: set console mode before using wprintf
+a94b855c Merge "libsharpyuv: add version defines" into main
+f83bdb52 libsharpyuv: add version defines
+bef0d797 unicode_gif.h: fix -Wdeclaration-after-statement
+404c1622 Rename Huffman coding to prefix coding in the bitstream spec
+8895f8a3 Merge "run_static_analysis.sh: fix scan-build archive path" into main
+92a673d2 Merge "Add -fvisibility=hidden flag in CMakeLists." into main
+67c1d722 Merge "add WEBP_MSAN" into main
+1124ff66 Add -fvisibility=hidden flag in CMakeLists.
+e15b3560 add WEBP_MSAN
+ec9e782a sharpyuv: remove minimum image size from sharpyuv library
+7bd07f3b run_static_analysis.sh: fix scan-build archive path
+5ecee06f Merge "sharpyuv: increase precision of gamma<->linear conversion" into main
+f81dd7d6 Merge changes I3d17d529,I53026880,I1bd61639,I6bd4b25d,Icfec8fba into main
+2d607ee6 sharpyuv: increase precision of gamma<->linear conversion
+266cbbc5 sharpyuv: add 32bit version of SharpYuvFilterRow.
+9fc12274 CMake: add src to webpinfo includes
+7d18f40a CMake: add WEBP_BUILD_WEBPINFO to list of checks for exampleutil
+11309aa5 CMake: add WEBP_BUILD_WEBPMUX to list of checks for exampleutil
+4bc762f7 CMake: link imageioutil to exampleutil after defined
+0d1b9bc4 WEBP_DEP_LIBRARIES: use Threads::Threads
+20ef48f0 Merge "sharpyuv: add support for 10/12/16 bit rgb and 10/12 bit yuv." into main
+93c54371 sharpyuv: add support for 10/12/16 bit rgb and 10/12 bit yuv.
+53cf2b49 normalize WebPValidatePicture declaration w/definition
+d3006f4b sharpyuv: slightly improve precision
+ea967098 Merge changes Ia01bd397,Ibf3771af into main
+11bc8410 Merge changes I2d317c4b,I9e77f6db into main
+30453ea4 Add an internal WebPValidatePicture.
+6c43219a Some renamings for consistency.
+4f59fa73 update .mailmap
+e74f8a62 webp-lossless-bitstream-spec,cosmetics: normalize range syntax
+5a709ec0 webp-lossless-bitstream-spec,cosmetics: fix code typo
+a2093acc webp-lossless-bitstream-spec: add amendment note
+86c66930 webp-lossless-bitstream-spec: fix BNF
+232f22da webp-lossless-bitstream-spec: fix 'simple code' snippet
+44dd765d webp-lossless-bitstream-spec: fix ColorTransform impl
+7a7e33e9 webp-lossless-bitstream-spec: fix TR-pixel right border note
+86f94ee0 Update lossless spec with Huffman codes.
+a3927cc8 sharpyuv.c,cosmetics: fix indent
+6c45cef7 Make sure the stride has a minimum value in the importer.
+0c8b0e67 sharpyuv: cleanup/cosmetic changes
+dc3841e0 {histogram,predictor}_enc: quiet int -> float warnings
+a19a25bb Replace doubles by floats in lossless misc cost estimations.
+42888f6c Add an option to enable static builds.
+7efcf3cc Merge "Fix typo in color constants: Marix -> Matrix" into main
+8f4b5c62 Fix typo in color constants: Marix -> Matrix
+90084d84 Merge "demux,IsValidExtendedFormat: remove unused variable" into main
+ed643f61 Merge changes I452d2485,Ic6d75475 into main
+8fa053d1 Rename SharpYUV to SharpYuv for consistency.
+99a87562 SharpYuvComputeConversionMatrix: quiet int->float warnings
+deb426be Makefile.vc: add sharpyuv_csp.obj to SHARPYUV_OBJS
+779597d4 demux,IsValidExtendedFormat: remove unused variable
+40e8aa57 Merge "libsharpyuv: add colorspace utilities" into main
+01a05de1 libsharpyuv: add colorspace utilities
+2de4b05a Merge changes Id9890a60,I376d81e6,I1c958838 into main
+b8bca81f Merge "configure.ac: use LT_INIT if available" into main
+e8e77b9c Merge changes I479bc487,I39864691,I5d486c2c,I186d13be into main
+7e7d5d50 Merge ".gitignore: add Android Studio & VS code dirs" into main
+10c50848 normalize label indent
+89f774e6 mux{edit,internal}: fix leaks on error
+2d3293ad ExUtilInitCommandLineArguments: fix leak on error
+ec34fd70 anim_util: fix leaks on error
+e4717287 gif2webp: fix segfault on OOM
+e3cfafaf GetBackwardReferences: fail on alloc error
+a828a59b BackwardReferencesHashChainDistanceOnly: fix segfault on OOM
+fe153fae VP8LEncodeStream: fix segfault on OOM
+919acc0e .gitignore: add Android Studio & VS code dirs
+efa0731b configure.ac: use LT_INIT if available
+0957fd69 tiffdec: add grayscale support
+e685feef Merge "Make libsharpyuv self-contained by removing dependency on cpu.c" into main
+841960b6 Make libsharpyuv self-contained by removing dependency on cpu.c
+617cf036 image_dec: add WebPGetEnabledInputFileFormats()
+7a68afaa Let SharpArgbToYuv caller pass in an RGB>YUV conversion matrix.
+34bb332c man/cwebp.1: add note about crop/resize order
+f0e9351c webp-lossless-bitstream-spec,cosmetics: fix some typos
+5ccbd6ed vp8l_dec.c,cosmetics: fix a few typos
+c3d0c2d7 fix ios build scripts after sharpyuv dep added
+d0d2292e Merge "Make libwebp depend on libsharpyuv." into main
+03d12190 alpha_processing_neon.c: fix 0x01... typo
+d55d447c Make libwebp depend on libsharpyuv.
+e4cbcdd2 Fix lossless encoding for MIPS.
+924e7ca6 alpha_processing_neon.c: fix Dispatch/ExtractAlpha_NEON
+0fa0ea54 Makefile.vc: use /MANIFEST:EMBED
+29cc95ce Basic version of libsharpyuv in libwebp, in C.
+a30f2190 examples/webpmux.c: fix a couple of typos
+66b3ce23 Fix bad overflow check in ReadTIFF()
+54e61a38 Markdownify libwebp docs and reorganize them.
+b4533deb CMakeLists.txt,cosmetics: break long line
+b9d2f9cd quant_enc.c: use WEBP_RESTRICT qualifier
+ec178f2c Add progress hook granularity in lossless
+26139c73 Rename MAX_COST to MAX_BIT_COST in histogram_enc.c
+13b82816 cmake: fix webpmux lib name for cmake linking
+88b6a396 webp-container-spec.txt,cosmetics: normalize formatting
+6f496540 Merge tag 'v1.2.2'
+4074acf8 dsp.h: bump msvc arm64 version requirement to 16.6
+b0a86089 update ChangeLog (tag: v1.2.2)
+6db8248c libwebp: Fix VP8EncTokenLoop() progress
+827a307f BMP enc: fix the transparency case
+db25f1b4 libwebp: Fix VP8EncTokenLoop() progress
+286e7fce libwebp: do not destroy jpeg codec twice on error
+6e8a4126 libwebp: do not destroy jpeg codec twice on error
+faf21968 Merge "BMP enc: fix the transparency case" into main
+480cd51d BMP enc: fix the transparency case
+9195ea05 update ChangeLog (tag: v1.2.2-rc2)
+4acae017 update NEWS
+883f0633 man/img2webp.1: update date
+567e1f44 Reword img2webp synopsis command line
+1b0c15db man/img2webp.1: update date
+17bade38 Merge "Reword img2webp synopsis command line" into main
+a80954a1 Reword img2webp synopsis command line
+f084244d anim_decode: fix alpha blending with big-endian
+b217b4ff webpinfo: fix fourcc comparison w/big-endian
+ec497b75 Merge "anim_decode: fix alpha blending with big-endian" into main
+e4886716 anim_decode: fix alpha blending with big-endian
+e3cb052c webpinfo: fix fourcc comparison w/big-endian
+a510fedb patch-check: detect duplicated files
+f035d2e4 update ChangeLog (tag: v1.2.2-rc1)
+7031946a update NEWS
+973390b6 bump version to 1.2.2
+abd6664f update AUTHORS
+5b7e7930 Merge "add missing USE_{MSA,NEON} checks in headers" into main
+02ca04c3 add missing USE_{MSA,NEON} checks in headers
+e94716e2 xcframeworkbuild.sh: place headers in a subdir
+c846efd8 patch-check: commit subject length check
+b6f756e8 update http links
+8f5cb4c1 update rfc links
+8ea81561 change VP8LPredictorFunc signature to avoid reading 'left'
+6b1d18c3 webpmux: fix the -bgcolor description
+3368d876 Merge "webpmux: add "-set bgcolor A,R,G,B"" into main
+f213abf6 webpinfo: print the number of warnings
+50c97c30 webpmux: add "-set bgcolor A,R,G,B"
+2c206aaf Remove CMakeLists.txt check in compile.sh
+96e3dfef Merge "infra/common.sh: add shard_should_run()" into main
+0e0f74b7 infra/common.sh: add shard_should_run()
+35b7436a Jenkins scripts port: update shell function comments
+21d24b4c webp-container-spec.txt: remove 'experimental' markers
+cdcf8902 Merge "Port Jenkins script: compile" into main
+dc683cde Jenkins scripts port: static analysis
+0858494e Port Jenkins script: compile
+c2cf6a93 Jenkins scripts port: android compilation
+df0e808f presubmit: Add pylint-2.7 and .pylintrc
+676c57db patch-check: shfmt
+7bb7f747 patch-check: Add shellcheck
+abcd1797 Reformat docstrings and imports
+edaf0895 Port Jenkins scripts: compile js
+b9622063 Set CheckPatchFormatted flags to fail on diffs
+e23cd548 dsp.h: enable NEON w/VS2019+ ARM64 targets
+3875c7de CMakeLists.txt: set minimum version to 3.7
+1a8f0d45 Have a hard-coded value for memset in TrellisQuantizeBlock.
+93480160 Speed up TrellisQuantizeBlock
+45eaacc9 Convert deprecated uint32 to uint32_t.
+42592af8 webp,cmake: Remove unnecessary include dirs
+e298e05f Add patch-check steps in PRESUBMIT.py
+29148919 Merge tag 'v1.2.1'
+9ce5843d update ChangeLog (tag: v1.2.1)
+d9191588 fuzzer/*: normalize src/ includes
+c5bc3624 fuzzer/*: normalize src/ includes
+53b6f762 fix indent
+d2caaba4 fix indent
+731246ba update ChangeLog (tag: v1.2.1-rc2)
+d250f01d dsp/*: use WEBP_HAVE_* to determine Init availability
+1fe31625 dsp/*: use WEBP_HAVE_* to determine Init availability
+3a4d3ecd update NEWS
+b2bc8093 bump version to 1.2.1
+e542fc7a update AUTHORS
+e0241154 Merge "libwebp/CMake: Add <BUILD_INTERFACE> to webp incl" into main
+edea6444 libwebp/CMake: Add <BUILD_INTERFACE> to webp incl
+ece18e55 dsp.h: respect --disable-sse2/sse4.1/neon
+a89a3230 wicdec: support alpha from WebP WIC decoder
+26f4aa01 Merge "alpha_processing: fix visual studio warnings" into main
+8f594663 alpha_processing: fix visual studio warnings
+46d844e6 Merge "cpu.cmake: fix compiler flag detection w/3.17.0+" into main
+298d26ea Merge changes I593adf92,If20675e7,Ifac68eac into main
+a1e5dae0 alpha_processing*: use WEBP_RESTRICT qualifier
+327ef24f cpu.cmake: fix compiler flag detection w/3.17.0+
+f70819de configure: enable libwebpmux by default
+dc7e2b42 configure: add informational notices when disabling binaries
+9df23ddd configure: move lib flag checks before binaries
+a2e18f10 Merge "WebPConfig.config.in: correct WEBP_INCLUDE_DIRS" into main
+e1a8d4f3 Merge "bit_reader_inl_utils: uniformly apply WEBP_RESTRICT" into main
+4de35f43 rescaler.c: fix alignment
+0f13eec7 bit_reader_inl_utils: uniformly apply WEBP_RESTRICT
+277d3074 Fix size_t overflow in WebPRescalerInit
+97adbba5 WebPConfig.config.in: correct WEBP_INCLUDE_DIRS
+b60d4603 advanced_api_fuzzer: add extreme config value coverage
+72fe52f6 anim_encode.c,cosmetics: normalize indent
+116d235c anim_encode: Fix encoded_frames_[] overflow
+6f445b3e CMake: set CMP0072 to NEW
+b1cf887f define WEBP_RESTRICT for MSVC
+3e265136 Add WEBP_RESTRICT & use it in VP8BitReader
+f6d29247 vp8l_dec::ProcessRows: fix int overflow in multiply
+de3b4ba8 CMake: add WEBP_BUILD_LIBWEBPMUX
+7f09d3d1 CMakeLists.txt: rm libwebpmux dep from anim_{diff,dump}
+4edea4a6 Init{RGB,YUV}Rescaler: fix a few more int overflows
+c9e26bdb rescaler_utils: set max valid scaled w/h to INT_MAX/2
+28d488e6 utils.h: add SizeOverflow()
+695bdaa2 Export/EmitRescaledRowsRGBA: fix pointer offset int overflow
+685d073e Init{RGB,YUV}Rescaler: fix int overflows in multiplication
+d38bd0dd WebPFlipBuffer: fix integer overflow
+109ff0f1 utils: allow MALLOC_LIMIT to indicate a max
+a2fce867 WebPRescalerImportRowExpand_C: promote some vals before multiply
+776983d4 AllocateBuffer: fix int multiplication overflow check
+315abbd6 Merge "Revert "Do not use a palette for one color images.""
+eae815d0 Merge changes Ica3bbf75,I82f82954
+afbca5a1 Require Emscripten 2.0.18
+3320416b CMakeLists,emscripten: use EXPORTED_RUNTIME_METHODS
+29145ed6 Update README instructions for using Emscripten
+1f579139 cosmetics: remove use of 'sanity' / 'master'
+29b6129c WebPAnimEncoderNewInternal: remove some unnecessary inits
+b60869a1 Revert "Do not use a palette for one color images."
+6fb4cddc demux: move padded size calc post unpadded validation
+05b72d42 vp8l_enc.c: normalize index types
+b6513fba Do not use a palette for one color images.
+98bbe35b Fix multi-threading with palettes.
+b1674240 Add modified Zeng's method to palette sorting.
+88c90c45 add CONTRIBUTING.md
+6a9916d7 WebPRescalerInit: add missing int64_t promotion
+b6cf52d5 WebPIoInitFromOptions: treat use_scaling as a bool
+3b12b7f4 WebPIoInitFromOptions: treat use_cropping as a bool
+595fa13f add WebPCheckCropDimensions()
+8fdaecb0 Disable cross-color when palette is used.
+8933bac2 WebPIoInitFromOptions: respect incoming bypass_filtering val
+7d416ff0 webpdec,cosmetics: match error text to function call
+ec6cfeb5 Fix typo on WebPPictureAlloc() in README
+7e58a1a2 *.cmake: add license header
+5651a6b2 cmake: fix .so versioning
+25ae67b3 xcframeworkbuild.sh: add arm64 simulator target
+5d4ee4c3 cosmetics: remove use of the term 'dummy'
+01b38ee1 faster CollectColorXXXTransforms_SSE41
+652aa344 Merge "Use BitCtz for FastSLog2Slow_C"
+0320e1e3 add the missing default BitsCtz() code
+8886f620 Use BitCtz for FastSLog2Slow_C
+fae41617 faster CombinedShannonEntropy_SSE2
+5bd2704e Introduce the BitCtz() function.
+fee64287 Merge "wicdec,icc: treat unsupported op as non-fatal"
+33ddb894 lossless_sse{2,41}: remove some unneeded includes
+b27ea852 wicdec,icc: treat unsupported op as non-fatal
+b78494a9 Merge "Fix undefined signed shift."
+e79974cd Fix undefined signed shift.
+a8853394 SSE4.1 versions of BGRA to RGB/BGR color-space conversions
+a09a6472 SSE4.1 version of TransformColorInverse
+401da22b Merge "pngdec: check version before using png_get_chunk_malloc_max"
+26907822 pngdec: check version before using png_get_chunk_malloc_max
+06c1e72e Code cleanup
+8f0d41aa Merge changes Id135bbf4,I99e59797
+373eb170 gif2webp: don't store loop-count if there's only 1 frame
+759b9d5a cmake: add WEBP_USE_THREAD option
+926ce921 cmake: don't install binaries from extras/
+9c367bc6 WebPAnimDecoderNewInternal: validate bitstream before alloc
+47f64f6e filters_sse2: import Chromium change
+cc3577e9 fuzzer/*: use src/ based include paths
+004d77ff Merge tag 'v1.2.0'
+fedac6cc update ChangeLog (tag: v1.2.0-rc3, tag: v1.2.0)
+170a8712 Fix check_c_source_compiles with pthread.
+ceddb5fc Fix check_c_source_compiles with pthread.
+85995719 disable CombinedShannonEntropy_SSE2 on x86
+289757fe TiffDec: enforce stricter mem/dimension limit on tiles
+8af7436f Merge "{ios,xcframework}build.sh: make min version(s) more visible" into 1.2.0
+e56c3c5b pngdec: raise memory limit if needed
+8696147d pngdec: raise memory limit if needed
+13b8e9fe {ios,xcframework}build.sh: make min version(s) more visible
+a9225410 animdecoder_fuzzer: fix memory leak
+d6c2285d update gradle to 6.1.1
+8df77fb1 animdecoder_fuzzer: fix memory leak
+52ce6333 update NEWS
+28c49820 bump version to 1.2.0
+7363dff2 webp/encode.h: restore WEBP_ENCODER_ABI_VERSION to v1.1.0
+826aafa5 update AUTHORS
+63258823 animdecoder_fuzzer: validate canvas size
+9eb26381 CMake: remove duplicate "include(GNUInstallDirs)"
+2e7bed79 WebPPicture: clarify the ownership of user-owned data.
+cccf5e33 webpmux: add an '-set loop <value>' option
+c9a3f6a1 Merge changes Ie29f9867,I289c54c4
+319f56f1 iosbuild.sh: sync some aspects of xcframeworkbuild.sh
+e8e8db98 add xcframeworkbuild.sh
+ae545534 dsp.h: allow config.h to override MSVC SIMD autodetection
+fef789f3 Merge "cmake: fix per-file assembly flags"
+fc14fc03 Have C encoding predictors use decoding predictors.
+7656f0b3 README,cosmetics: fix a couple typos
+d2e245ea cmake: disable webp.js if WEBP_ENABLE_SIMD=1
+96099a79 cmake: fix per-file assembly flags
+5abb5582 Merge "cmake: fix compilation w/Xcode generator"
+8484a120 cmake: fix compilation w/Xcode generator
+d7bf01c9 Merge changes Ifcae0f38,Iee2d7401
+36c81ff6 WASM-SIMD: port 2 patches from rreverser@'s tree
+988b02ab Merge "Couple of fixes to allow SIMD on Emscripten"
+26faf770 wicdec: fail with animated images
+ab2d08a8 [cd]webp: document lack of animated webp support
+52273943 Couple of fixes to allow SIMD on Emscripten
+8870ba7f Fix skia bug #10952
+4b3c6953 Detect if StoreFrame read more than anmf_payload_size bytes
+17fd4ba8 webp/decode.h,cosmetics: normalize 'flip' comment
+411d3677 remove some unreachable break statements
+3700ffd7 WebPPictureHasTransparency: remove unreachable return
+83604bf3 {animencoder,enc_dec}_fuzzer: convert some abort()s to returns
+eb44119c Merge changes I8ae09473,I678c8b1e
+9f6055fc fuzz_utils.h: rename max() to Max()
+695788e7 fuzz_utils.h: make functions WEBP_INLINE
+906c1fcd make ImgIoUtilReadFile use WebPMalloc instead of malloc
+8cb7e536 rename demux_api_fuzzer.c -> mux_demux_api_fuzzer.c
+443db47d add animdecoder_fuzzer.cc
+36a6eea3 Merge "import fuzzers from oss-fuzz/chromium"
+ec5f12c1 Makefile.vc: remove deprecated /Gm option
+64425a08 picture_tools_enc: fix windows build warning
+bd94090a import fuzzers from oss-fuzz/chromium
+cf847cba use WEBP_DSP_INIT_FUNC for Init{GammaTables*,GetCoeffs}
+55a080e5 Add WebPReplaceTransparentPixels() in dsp
+84739717 GetBackgroundColorGIF: promote to uint32_t before << 24
+def64e92 cwebp: Fix -print_psnr for near_lossless
+cf2f88b3 Add palette and spatial for q >= 75 and -m 5
+f0110bae Add no-color cache configuration to the cruncher
+749a8b99 Better estimate of the cache cost.
+4f9f00cc Use spatial predictors on top of palette no matter what.
+7658c686 Add spatial prediction on top of palette in cruncher.
+133ff0e3 webp_js: force WASM=0 option explicitly
+e3c259a2 Fix integer overflow in EmitFancyRGB.
+b3ff0bde man/{gif2,img2}webp,webpmux: normalize some wording
+f9b30586 fix ABI breakage introduced by 6a0ff358
+1d58dcfc README.webp_js: update note about emscripten version
+44070266 README.webp_js: s/fastcomp/upstream/
+2565fa8f README.webp_js: update cmake command
+47309ef5 webp: WEBP_OFFSET_PTR()
+687ab00e DC{4,8,16}_NEON: replace vmovl w/vaddl
+1b92fe75 DC16_NEON,aarch64: use vaddlv
+53f3d8cf dec_neon,DC8_NEON: use vaddlv instead of movl+vaddv
+27d08240 Fix integer overflow in WebPAnimDecoderGetNext()
+69776e38 Merge "remove call to MBAnalyzeBestIntra4Mode for method >= 5"
+a99078c1 remove call to MBAnalyzeBestIntra4Mode for method >= 5
+22e404cc CMakeLists.txt: fix set(CACHE) argument order
+71690b52 fix MSVC warning
+6a0ff358 Enc: add a qmin / qmax range for quality factor
+0fa56f30 Merge tag 'v1.1.0'
+6cf504d0 PNM decoding: handle max_value != 255
+d7844e97 update ChangeLog (tag: v1.1.0-rc2, tag: v1.1.0)
+7f006436 Makefile.vc: fix webp_quality.exe link
+cf047e83 Makefile.vc: fix webp_quality.exe link
+c074c653 update NEWS
+30f09551 bump version to 1.1.0
+a76694a1 update AUTHORS
+6e3ef7b3 extras: fix WEBP_SWAP_16BIT_CSP check
+47178dbd extras: add WebPUnmultiplyARGB() convenience function
+22cbae33 idec_dec: fix 0 offset of NULL pointer
+290dd0b4 muxread: fix 0 offset of NULL pointer
+0df474ac Merge "lossless_(enc_|)sse2: avoid offsetting a NULL pointer"
+c6b75a19 lossless_(enc_|)sse2: avoid offsetting a NULL pointer
+295e5e38 fix UBSAN warning
+e2575e05 DC8_NEON,aarch64: use vaddv
+b0e09e34 dec_neon: Fix build failure under some toolchains
+cf0e903c dsp/lossless: Fix non gcc ARM builds
+bb7bc40b Remove ubsan errors.
+78881b76 CMake: fix GLUT library link
+9f750f7a cmake: fix BUILD_SHARED_LIBS build on mac
+17850e74 libwebp: Remove char-subscripts warning in pnmdec.c
+2fa2552d Merge "Expose WebPMalloc() in addition to WebPFree()"
+a4df4aae Expose WebPMalloc() in addition to WebPFree()
+853ea3d8 imageio/tiff: Return error before allocating bad tile size
+af650c0b Fix a Wxor-used-as-pow false positive
+601ef17c libwebp.py: update to swig 3.0.12
+0e48d889 bugfix: last alpha rows were incorrectly decoded
+24d2ccb4 webp: Fix imageio ReadPNM() TUPLTYPE
+fab8f9cf cosmetics: normalize '*' association
+94138e0e update .gitignore
+0fe1a89d update ChangeLog (tag: v1.0.3-rc1, tag: v1.0.3)
2ad0916d update NEWS
1287362b bump version to 1.0.3
7b968cc2 update AUTHORS
diff --git a/src/3rdparty/libwebp/NEWS b/src/3rdparty/libwebp/NEWS
index 5c0fc8c..c4f8ef7 100644
--- a/src/3rdparty/libwebp/NEWS
+++ b/src/3rdparty/libwebp/NEWS
@@ -1,3 +1,68 @@
+- 12/16/2022: version 1.3.0
+ This is a binary compatible release.
+ * add libsharpyuv, which exposes -sharp_yuv/config.use_sharp_yuv
+ functionality to other libraries; libwebp now depends on this library
+ * major updates to the container and lossless bitstream docs (#448, #546,
+ #551)
+ * miscellaneous warning, bug & build fixes (#576, #583, #584)
+
+- 8/4/2022: version 1.2.4
+ This is a binary compatible release.
+ * restore CMake libwebpmux target name for compatibility with 1.2.2 (#575)
+ * fix lossless crunch mode encoding with WEBP_REDUCE_SIZE
+ (chromium: #1345547, #1345595, #1345772, #1345804)
+
+- 6/30/2022: version 1.2.3
+ This is a binary compatible release.
+ * security fix for lossless encoder (#565, chromium:1313709)
+ * improved progress granularity in WebPReportProgress() when using lossless
+ * improved precision in Sharp YUV (-sharp_yuv) conversion
+ * many corrections to webp-lossless-bitstream-spec.txt (#551)
+ * crash/leak fixes on error/OOM and other bug fixes (#558, #563, #569, #573)
+
+- 1/11/2022: version 1.2.2
+ This is a binary compatible release.
+ * webpmux: add "-set bgcolor A,R,G,B"
+ * add ARM64 NEON support for MSVC builds (#539)
+ * fix duplicate include error in Xcode when using multiple XCFrameworks in a
+ project (#542)
+ * doc updates and bug fixes (#538, #544, #548, #550)
+
+- 7/20/2021: version 1.2.1
+ This is a binary compatible release.
+ * minor lossless encoder improvements and x86 color conversion speed up
+ * add ARM64 simulator support to xcframeworkbuild.sh (#510)
+ * further security related hardening in libwebp & examples
+ (issues: #497, #508, #518)
+ (chromium: #1196480, #1196773, #1196775, #1196777, #1196778, #1196850)
+ (oss-fuzz: #28658, #28978)
+ * toolchain updates and bug fixes (#498, #501, #502, #504, #505, #506, #509,
+ #533)
+ * use more inclusive language within the source (#507)
+
+- 12/23/2020: version 1.2.0
+ * API changes:
+ - libwebp:
+ encode.h: add a qmin / qmax range for quality factor (cwebp adds -qrange)
+ * lossless encoder improvements
+ * SIMD support for Wasm builds
+ * add xcframeworkbuild.sh, supports Mac Catalyst builds
+ * import fuzzers from oss-fuzz & chromium (#409)
+ * webpmux: add an '-set loop <value>' option (#494)
+ * toolchain updates and bug fixes (#449, #463, #470, #475, #477, #478, #479,
+ #488, #491)
+
+- 12/18/2019: version 1.1.0
+ * API changes:
+ - libwebp:
+ WebPMalloc (issue #442)
+ - extras:
+ WebPUnmultiplyARGB
+ * alpha decode fix (issue #439)
+ * toolchain updates and bug fixes
+ (chromium: #1026858, #1027136, #1027409, #1028620, #1028716, #995200)
+ (oss-fuzz: #19430, #19447)
+
- 7/4/2019: version 1.0.3
This is a binary compatible release.
* resize fixes for Nx1 sizes and the addition of non-opaque alpha values for
diff --git a/src/3rdparty/libwebp/README b/src/3rdparty/libwebp/README
index 60da8a2..f6eaf2c 100644
--- a/src/3rdparty/libwebp/README
+++ b/src/3rdparty/libwebp/README
@@ -4,7 +4,7 @@
\__\__/\____/\_____/__/ ____ ___
/ _/ / \ \ / _ \/ _/
/ \_/ / / \ \ __/ \__
- \____/____/\_____/_____/____/v1.0.3
+ \____/____/\_____/_____/____/v1.2.2
Description:
============
@@ -13,13 +13,13 @@ WebP codec: library to encode and decode images in WebP format. This package
contains the library that can be used in other programs to add WebP support,
as well as the command line tools 'cwebp' and 'dwebp'.
-See http://developers.google.com/speed/webp
+See https://developers.google.com/speed/webp
The latest source tree is available at
https://chromium.googlesource.com/webm/libwebp
It is released under the same license as the WebM project.
-See http://www.webmproject.org/license/software/ or the
+See https://www.webmproject.org/license/software/ or the
"COPYING" file for details. An additional intellectual
property rights grant can be found in the file PATENTS.
@@ -113,7 +113,7 @@ make install
CMake:
------
-With CMake, you can compile libwebp, cwebp, dwebp, gif2web, img2webp, webpinfo
+With CMake, you can compile libwebp, cwebp, dwebp, gif2webp, img2webp, webpinfo
and the JS bindings.
Prerequisites:
@@ -225,6 +225,7 @@ Usage:
If input size (-s) for an image is not specified, it is
assumed to be a PNG, JPEG, TIFF or WebP file.
+Note: Animated PNG and WebP files are not supported.
Options:
-h / -help ............. short help
@@ -254,6 +255,8 @@ Options:
-partition_limit <int> . limit quality to fit the 512k limit on
the first partition (0=no degradation ... 100=full)
-pass <int> ............ analysis pass number (1..10)
+ -qrange <min> <max> .... specifies the permissible quality range
+ (default: 0 100)
-crop <x> <y> <w> <h> .. crop picture with the given rectangle
-resize <w> <h> ........ resize picture (after any cropping)
-mt .................... use multi-threading if available
@@ -294,6 +297,7 @@ Experimental Options:
-af .................... auto-adjust filter strength
-pre <int> ............. pre-processing filter
+
The main options you might want to try in order to further tune the
visual quality are:
-preset
@@ -341,7 +345,9 @@ The full list of options is available using -h:
> dwebp -h
Usage: dwebp in_file [options] [-o out_file]
-Decodes the WebP image file to PNG format [Default]
+Decodes the WebP image file to PNG format [Default].
+Note: Animated WebP files are not supported.
+
Use following options to convert into alternate image formats:
-pam ......... save the raw RGBA samples as a color PAM
-ppm ......... save the raw RGB samples as a color PPM
@@ -423,15 +429,15 @@ Prerequisites:
1) OpenGL & OpenGL Utility Toolkit (GLUT)
Linux:
$ sudo apt-get install freeglut3-dev mesa-common-dev
- Mac + XCode:
+ Mac + Xcode:
- These libraries should be available in the OpenGL / GLUT frameworks.
Windows:
http://freeglut.sourceforge.net/index.php#download
2) (Optional) qcms (Quick Color Management System)
i. Download qcms from Mozilla / Chromium:
- http://hg.mozilla.org/mozilla-central/file/0e7639e3bdfb/gfx/qcms
- http://src.chromium.org/viewvc/chrome/trunk/src/third_party/qcms
+ https://hg.mozilla.org/mozilla-central/file/0e7639e3bdfb/gfx/qcms
+ https://source.chromium.org/chromium/chromium/src/+/main:third_party/qcms/;drc=d4a2f8e1ed461d8fc05ed88d1ae2dc94c9773825
ii. Build and archive the source files as libqcms.a / qcms.lib
iii. Update makefile.unix / Makefile.vc
a) Define WEBP_HAVE_QCMS
@@ -450,7 +456,7 @@ modes, etc.
Usage:
- img2webp [file-level options] [image files...] [per-frame options...]
+ img2webp [file_options] [[frame_options] frame_file]...
File-level options (only used at the start of compression):
-min_size ............ minimize size
@@ -613,7 +619,7 @@ The encoding flow looks like:
pic.width = width;
pic.height = height;
// allocated picture of dimension width x height
- if (!WebPPictureAllocate(&pic)) {
+ if (!WebPPictureAlloc(&pic)) {
return 0; // memory error
}
// at this point, 'pic' has been initialized as a container,
@@ -780,10 +786,10 @@ Bugs:
Please report all bugs to the issue tracker:
https://bugs.chromium.org/p/webp
Patches welcome! See this page to get started:
- http://www.webmproject.org/code/contribute/submitting-patches/
+ https://www.webmproject.org/code/contribute/submitting-patches/
Discuss:
========
Email: webp-discuss@webmproject.org
-Web: http://groups.google.com/a/webmproject.org/group/webp-discuss
+Web: https://groups.google.com/a/webmproject.org/group/webp-discuss
diff --git a/src/3rdparty/libwebp/patches/0001-Fix-Windows-build-for-clang-and-neon.patch b/src/3rdparty/libwebp/patches/0001-Fix-Windows-build-for-clang-and-neon.patch
new file mode 100644
index 0000000..2b46f5b
--- /dev/null
+++ b/src/3rdparty/libwebp/patches/0001-Fix-Windows-build-for-clang-and-neon.patch
@@ -0,0 +1,38 @@
+diff --git a/src/3rdparty/libwebp/src/dsp/cpu.h b/src/3rdparty/libwebp/src/dsp/cpu.h
+index 57a40d8..8cf3e92 100644
+--- a/src/3rdparty/libwebp/src/dsp/cpu.h
++++ b/src/3rdparty/libwebp/src/dsp/cpu.h
+@@ -14,6 +14,8 @@
+ #ifndef WEBP_DSP_CPU_H_
+ #define WEBP_DSP_CPU_H_
+
++#include <qglobal.h>
++
+ #ifdef HAVE_CONFIG_H
+ #include "src/webp/config.h"
+ #endif
+@@ -43,12 +45,12 @@
+
+ #if !defined(HAVE_CONFIG_H)
+ #if defined(_MSC_VER) && _MSC_VER > 1310 && \
+- (defined(_M_X64) || defined(_M_IX86))
++ (defined(_M_X64) || defined(_M_IX86)) && !defined(__clang__)
+ #define WEBP_MSC_SSE2 // Visual C++ SSE2 targets
+ #endif
+
+ #if defined(_MSC_VER) && _MSC_VER >= 1500 && \
+- (defined(_M_X64) || defined(_M_IX86))
++ (defined(_M_X64) || defined(_M_IX86)) && !defined(__clang__)
+ #define WEBP_MSC_SSE41 // Visual C++ SSE4.1 targets
+ #endif
+ #endif
+@@ -97,7 +99,8 @@
+ // arm_neon.h. Compile errors were seen with Visual Studio 2019 16.4 with
+ // vtbl4_u8(); a fix was made in 16.6.
+ #if defined(_MSC_VER) && ((_MSC_VER >= 1700 && defined(_M_ARM)) || \
+- (_MSC_VER >= 1926 && defined(_M_ARM64)))
++ (_MSC_VER >= 1926 && defined(_M_ARM64))) && \
++ !defined(__clang__) && (QT_CONFIG_neon == 1)
+ #define WEBP_USE_NEON
+ #define WEBP_USE_INTRINSICS
+ #endif
diff --git a/src/3rdparty/libwebp/qt_attribution.json b/src/3rdparty/libwebp/qt_attribution.json
index 8d15db5..258f7ff 100644
--- a/src/3rdparty/libwebp/qt_attribution.json
+++ b/src/3rdparty/libwebp/qt_attribution.json
@@ -6,7 +6,7 @@
"Description": "WebP is a new image format that provides lossless and lossy compression for images on the web.",
"Homepage": "https://developers.google.com/speed/webp/",
- "Version": "1.0.3",
+ "Version": "1.3.0",
"License": "BSD 3-clause \"New\" or \"Revised\" License",
"LicenseId": "BSD-3-Clause",
"LicenseFile": "COPYING",
diff --git a/src/3rdparty/libwebp/sharpyuv/sharpyuv.c b/src/3rdparty/libwebp/sharpyuv/sharpyuv.c
new file mode 100644
index 0000000..7de34fb
--- /dev/null
+++ b/src/3rdparty/libwebp/sharpyuv/sharpyuv.c
@@ -0,0 +1,526 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// Sharp RGB to YUV conversion.
+//
+// Author: Skal (pascal.massimino@gmail.com)
+
+#include "sharpyuv/sharpyuv.h"
+
+#include <assert.h>
+#include <limits.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "src/webp/types.h"
+#include "sharpyuv/sharpyuv_cpu.h"
+#include "sharpyuv/sharpyuv_dsp.h"
+#include "sharpyuv/sharpyuv_gamma.h"
+
+//------------------------------------------------------------------------------
+
+int SharpYuvGetVersion(void) {
+ return SHARPYUV_VERSION;
+}
+
+//------------------------------------------------------------------------------
+// Sharp RGB->YUV conversion
+
+static const int kNumIterations = 4;
+
+#define YUV_FIX 16 // fixed-point precision for RGB->YUV
+static const int kYuvHalf = 1 << (YUV_FIX - 1);
+
+// Max bit depth so that intermediate calculations fit in 16 bits.
+static const int kMaxBitDepth = 14;
+
+// Returns the precision shift to use based on the input rgb_bit_depth.
+static int GetPrecisionShift(int rgb_bit_depth) {
+ // Try to add 2 bits of precision if it fits in kMaxBitDepth. Otherwise remove
+ // bits if needed.
+ return ((rgb_bit_depth + 2) <= kMaxBitDepth) ? 2
+ : (kMaxBitDepth - rgb_bit_depth);
+}
+
+typedef int16_t fixed_t; // signed type with extra precision for UV
+typedef uint16_t fixed_y_t; // unsigned type with extra precision for W
+
+//------------------------------------------------------------------------------
+
+static uint8_t clip_8b(fixed_t v) {
+ return (!(v & ~0xff)) ? (uint8_t)v : (v < 0) ? 0u : 255u;
+}
+
+static uint16_t clip(fixed_t v, int max) {
+ return (v < 0) ? 0 : (v > max) ? max : (uint16_t)v;
+}
+
+static fixed_y_t clip_bit_depth(int y, int bit_depth) {
+ const int max = (1 << bit_depth) - 1;
+ return (!(y & ~max)) ? (fixed_y_t)y : (y < 0) ? 0 : max;
+}
+
+//------------------------------------------------------------------------------
+
+static int RGBToGray(int64_t r, int64_t g, int64_t b) {
+ const int64_t luma = 13933 * r + 46871 * g + 4732 * b + kYuvHalf;
+ return (int)(luma >> YUV_FIX);
+}
+
+static uint32_t ScaleDown(uint16_t a, uint16_t b, uint16_t c, uint16_t d,
+ int rgb_bit_depth) {
+ const int bit_depth = rgb_bit_depth + GetPrecisionShift(rgb_bit_depth);
+ const uint32_t A = SharpYuvGammaToLinear(a, bit_depth);
+ const uint32_t B = SharpYuvGammaToLinear(b, bit_depth);
+ const uint32_t C = SharpYuvGammaToLinear(c, bit_depth);
+ const uint32_t D = SharpYuvGammaToLinear(d, bit_depth);
+ return SharpYuvLinearToGamma((A + B + C + D + 2) >> 2, bit_depth);
+}
+
+static WEBP_INLINE void UpdateW(const fixed_y_t* src, fixed_y_t* dst, int w,
+ int rgb_bit_depth) {
+ const int bit_depth = rgb_bit_depth + GetPrecisionShift(rgb_bit_depth);
+ int i;
+ for (i = 0; i < w; ++i) {
+ const uint32_t R = SharpYuvGammaToLinear(src[0 * w + i], bit_depth);
+ const uint32_t G = SharpYuvGammaToLinear(src[1 * w + i], bit_depth);
+ const uint32_t B = SharpYuvGammaToLinear(src[2 * w + i], bit_depth);
+ const uint32_t Y = RGBToGray(R, G, B);
+ dst[i] = (fixed_y_t)SharpYuvLinearToGamma(Y, bit_depth);
+ }
+}
+
+static void UpdateChroma(const fixed_y_t* src1, const fixed_y_t* src2,
+ fixed_t* dst, int uv_w, int rgb_bit_depth) {
+ int i;
+ for (i = 0; i < uv_w; ++i) {
+ const int r =
+ ScaleDown(src1[0 * uv_w + 0], src1[0 * uv_w + 1], src2[0 * uv_w + 0],
+ src2[0 * uv_w + 1], rgb_bit_depth);
+ const int g =
+ ScaleDown(src1[2 * uv_w + 0], src1[2 * uv_w + 1], src2[2 * uv_w + 0],
+ src2[2 * uv_w + 1], rgb_bit_depth);
+ const int b =
+ ScaleDown(src1[4 * uv_w + 0], src1[4 * uv_w + 1], src2[4 * uv_w + 0],
+ src2[4 * uv_w + 1], rgb_bit_depth);
+ const int W = RGBToGray(r, g, b);
+ dst[0 * uv_w] = (fixed_t)(r - W);
+ dst[1 * uv_w] = (fixed_t)(g - W);
+ dst[2 * uv_w] = (fixed_t)(b - W);
+ dst += 1;
+ src1 += 2;
+ src2 += 2;
+ }
+}
+
+static void StoreGray(const fixed_y_t* rgb, fixed_y_t* y, int w) {
+ int i;
+ assert(w > 0);
+ for (i = 0; i < w; ++i) {
+ y[i] = RGBToGray(rgb[0 * w + i], rgb[1 * w + i], rgb[2 * w + i]);
+ }
+}
+
+//------------------------------------------------------------------------------
+
+static WEBP_INLINE fixed_y_t Filter2(int A, int B, int W0, int bit_depth) {
+ const int v0 = (A * 3 + B + 2) >> 2;
+ return clip_bit_depth(v0 + W0, bit_depth);
+}
+
+//------------------------------------------------------------------------------
+
+static WEBP_INLINE int Shift(int v, int shift) {
+ return (shift >= 0) ? (v << shift) : (v >> -shift);
+}
+
+static void ImportOneRow(const uint8_t* const r_ptr,
+ const uint8_t* const g_ptr,
+ const uint8_t* const b_ptr,
+ int rgb_step,
+ int rgb_bit_depth,
+ int pic_width,
+ fixed_y_t* const dst) {
+ // Convert the rgb_step from a number of bytes to a number of uint8_t or
+ // uint16_t values depending the bit depth.
+ const int step = (rgb_bit_depth > 8) ? rgb_step / 2 : rgb_step;
+ int i;
+ const int w = (pic_width + 1) & ~1;
+ for (i = 0; i < pic_width; ++i) {
+ const int off = i * step;
+ const int shift = GetPrecisionShift(rgb_bit_depth);
+ if (rgb_bit_depth == 8) {
+ dst[i + 0 * w] = Shift(r_ptr[off], shift);
+ dst[i + 1 * w] = Shift(g_ptr[off], shift);
+ dst[i + 2 * w] = Shift(b_ptr[off], shift);
+ } else {
+ dst[i + 0 * w] = Shift(((uint16_t*)r_ptr)[off], shift);
+ dst[i + 1 * w] = Shift(((uint16_t*)g_ptr)[off], shift);
+ dst[i + 2 * w] = Shift(((uint16_t*)b_ptr)[off], shift);
+ }
+ }
+ if (pic_width & 1) { // replicate rightmost pixel
+ dst[pic_width + 0 * w] = dst[pic_width + 0 * w - 1];
+ dst[pic_width + 1 * w] = dst[pic_width + 1 * w - 1];
+ dst[pic_width + 2 * w] = dst[pic_width + 2 * w - 1];
+ }
+}
+
+static void InterpolateTwoRows(const fixed_y_t* const best_y,
+ const fixed_t* prev_uv,
+ const fixed_t* cur_uv,
+ const fixed_t* next_uv,
+ int w,
+ fixed_y_t* out1,
+ fixed_y_t* out2,
+ int rgb_bit_depth) {
+ const int uv_w = w >> 1;
+ const int len = (w - 1) >> 1; // length to filter
+ int k = 3;
+ const int bit_depth = rgb_bit_depth + GetPrecisionShift(rgb_bit_depth);
+ while (k-- > 0) { // process each R/G/B segments in turn
+ // special boundary case for i==0
+ out1[0] = Filter2(cur_uv[0], prev_uv[0], best_y[0], bit_depth);
+ out2[0] = Filter2(cur_uv[0], next_uv[0], best_y[w], bit_depth);
+
+ SharpYuvFilterRow(cur_uv, prev_uv, len, best_y + 0 + 1, out1 + 1,
+ bit_depth);
+ SharpYuvFilterRow(cur_uv, next_uv, len, best_y + w + 1, out2 + 1,
+ bit_depth);
+
+ // special boundary case for i == w - 1 when w is even
+ if (!(w & 1)) {
+ out1[w - 1] = Filter2(cur_uv[uv_w - 1], prev_uv[uv_w - 1],
+ best_y[w - 1 + 0], bit_depth);
+ out2[w - 1] = Filter2(cur_uv[uv_w - 1], next_uv[uv_w - 1],
+ best_y[w - 1 + w], bit_depth);
+ }
+ out1 += w;
+ out2 += w;
+ prev_uv += uv_w;
+ cur_uv += uv_w;
+ next_uv += uv_w;
+ }
+}
+
+static WEBP_INLINE int RGBToYUVComponent(int r, int g, int b,
+ const int coeffs[4], int sfix) {
+ const int srounder = 1 << (YUV_FIX + sfix - 1);
+ const int luma = coeffs[0] * r + coeffs[1] * g + coeffs[2] * b +
+ coeffs[3] + srounder;
+ return (luma >> (YUV_FIX + sfix));
+}
+
+static int ConvertWRGBToYUV(const fixed_y_t* best_y, const fixed_t* best_uv,
+ uint8_t* y_ptr, int y_stride, uint8_t* u_ptr,
+ int u_stride, uint8_t* v_ptr, int v_stride,
+ int rgb_bit_depth,
+ int yuv_bit_depth, int width, int height,
+ const SharpYuvConversionMatrix* yuv_matrix) {
+ int i, j;
+ const fixed_t* const best_uv_base = best_uv;
+ const int w = (width + 1) & ~1;
+ const int h = (height + 1) & ~1;
+ const int uv_w = w >> 1;
+ const int uv_h = h >> 1;
+ const int sfix = GetPrecisionShift(rgb_bit_depth);
+ const int yuv_max = (1 << yuv_bit_depth) - 1;
+
+ for (best_uv = best_uv_base, j = 0; j < height; ++j) {
+ for (i = 0; i < width; ++i) {
+ const int off = (i >> 1);
+ const int W = best_y[i];
+ const int r = best_uv[off + 0 * uv_w] + W;
+ const int g = best_uv[off + 1 * uv_w] + W;
+ const int b = best_uv[off + 2 * uv_w] + W;
+ const int y = RGBToYUVComponent(r, g, b, yuv_matrix->rgb_to_y, sfix);
+ if (yuv_bit_depth <= 8) {
+ y_ptr[i] = clip_8b(y);
+ } else {
+ ((uint16_t*)y_ptr)[i] = clip(y, yuv_max);
+ }
+ }
+ best_y += w;
+ best_uv += (j & 1) * 3 * uv_w;
+ y_ptr += y_stride;
+ }
+ for (best_uv = best_uv_base, j = 0; j < uv_h; ++j) {
+ for (i = 0; i < uv_w; ++i) {
+ const int off = i;
+ // Note r, g and b values here are off by W, but a constant offset on all
+ // 3 components doesn't change the value of u and v with a YCbCr matrix.
+ const int r = best_uv[off + 0 * uv_w];
+ const int g = best_uv[off + 1 * uv_w];
+ const int b = best_uv[off + 2 * uv_w];
+ const int u = RGBToYUVComponent(r, g, b, yuv_matrix->rgb_to_u, sfix);
+ const int v = RGBToYUVComponent(r, g, b, yuv_matrix->rgb_to_v, sfix);
+ if (yuv_bit_depth <= 8) {
+ u_ptr[i] = clip_8b(u);
+ v_ptr[i] = clip_8b(v);
+ } else {
+ ((uint16_t*)u_ptr)[i] = clip(u, yuv_max);
+ ((uint16_t*)v_ptr)[i] = clip(v, yuv_max);
+ }
+ }
+ best_uv += 3 * uv_w;
+ u_ptr += u_stride;
+ v_ptr += v_stride;
+ }
+ return 1;
+}
+
+//------------------------------------------------------------------------------
+// Main function
+
+static void* SafeMalloc(uint64_t nmemb, size_t size) {
+ const uint64_t total_size = nmemb * (uint64_t)size;
+ if (total_size != (size_t)total_size) return NULL;
+ return malloc((size_t)total_size);
+}
+
+#define SAFE_ALLOC(W, H, T) ((T*)SafeMalloc((W) * (H), sizeof(T)))
+
+static int DoSharpArgbToYuv(const uint8_t* r_ptr, const uint8_t* g_ptr,
+ const uint8_t* b_ptr, int rgb_step, int rgb_stride,
+ int rgb_bit_depth, uint8_t* y_ptr, int y_stride,
+ uint8_t* u_ptr, int u_stride, uint8_t* v_ptr,
+ int v_stride, int yuv_bit_depth, int width,
+ int height,
+ const SharpYuvConversionMatrix* yuv_matrix) {
+ // we expand the right/bottom border if needed
+ const int w = (width + 1) & ~1;
+ const int h = (height + 1) & ~1;
+ const int uv_w = w >> 1;
+ const int uv_h = h >> 1;
+ uint64_t prev_diff_y_sum = ~0;
+ int j, iter;
+
+ // TODO(skal): allocate one big memory chunk. But for now, it's easier
+ // for valgrind debugging to have several chunks.
+ fixed_y_t* const tmp_buffer = SAFE_ALLOC(w * 3, 2, fixed_y_t); // scratch
+ fixed_y_t* const best_y_base = SAFE_ALLOC(w, h, fixed_y_t);
+ fixed_y_t* const target_y_base = SAFE_ALLOC(w, h, fixed_y_t);
+ fixed_y_t* const best_rgb_y = SAFE_ALLOC(w, 2, fixed_y_t);
+ fixed_t* const best_uv_base = SAFE_ALLOC(uv_w * 3, uv_h, fixed_t);
+ fixed_t* const target_uv_base = SAFE_ALLOC(uv_w * 3, uv_h, fixed_t);
+ fixed_t* const best_rgb_uv = SAFE_ALLOC(uv_w * 3, 1, fixed_t);
+ fixed_y_t* best_y = best_y_base;
+ fixed_y_t* target_y = target_y_base;
+ fixed_t* best_uv = best_uv_base;
+ fixed_t* target_uv = target_uv_base;
+ const uint64_t diff_y_threshold = (uint64_t)(3.0 * w * h);
+ int ok;
+ assert(w > 0);
+ assert(h > 0);
+
+ if (best_y_base == NULL || best_uv_base == NULL ||
+ target_y_base == NULL || target_uv_base == NULL ||
+ best_rgb_y == NULL || best_rgb_uv == NULL ||
+ tmp_buffer == NULL) {
+ ok = 0;
+ goto End;
+ }
+
+ // Import RGB samples to W/RGB representation.
+ for (j = 0; j < height; j += 2) {
+ const int is_last_row = (j == height - 1);
+ fixed_y_t* const src1 = tmp_buffer + 0 * w;
+ fixed_y_t* const src2 = tmp_buffer + 3 * w;
+
+ // prepare two rows of input
+ ImportOneRow(r_ptr, g_ptr, b_ptr, rgb_step, rgb_bit_depth, width,
+ src1);
+ if (!is_last_row) {
+ ImportOneRow(r_ptr + rgb_stride, g_ptr + rgb_stride, b_ptr + rgb_stride,
+ rgb_step, rgb_bit_depth, width, src2);
+ } else {
+ memcpy(src2, src1, 3 * w * sizeof(*src2));
+ }
+ StoreGray(src1, best_y + 0, w);
+ StoreGray(src2, best_y + w, w);
+
+ UpdateW(src1, target_y, w, rgb_bit_depth);
+ UpdateW(src2, target_y + w, w, rgb_bit_depth);
+ UpdateChroma(src1, src2, target_uv, uv_w, rgb_bit_depth);
+ memcpy(best_uv, target_uv, 3 * uv_w * sizeof(*best_uv));
+ best_y += 2 * w;
+ best_uv += 3 * uv_w;
+ target_y += 2 * w;
+ target_uv += 3 * uv_w;
+ r_ptr += 2 * rgb_stride;
+ g_ptr += 2 * rgb_stride;
+ b_ptr += 2 * rgb_stride;
+ }
+
+ // Iterate and resolve clipping conflicts.
+ for (iter = 0; iter < kNumIterations; ++iter) {
+ const fixed_t* cur_uv = best_uv_base;
+ const fixed_t* prev_uv = best_uv_base;
+ uint64_t diff_y_sum = 0;
+
+ best_y = best_y_base;
+ best_uv = best_uv_base;
+ target_y = target_y_base;
+ target_uv = target_uv_base;
+ for (j = 0; j < h; j += 2) {
+ fixed_y_t* const src1 = tmp_buffer + 0 * w;
+ fixed_y_t* const src2 = tmp_buffer + 3 * w;
+ {
+ const fixed_t* const next_uv = cur_uv + ((j < h - 2) ? 3 * uv_w : 0);
+ InterpolateTwoRows(best_y, prev_uv, cur_uv, next_uv, w,
+ src1, src2, rgb_bit_depth);
+ prev_uv = cur_uv;
+ cur_uv = next_uv;
+ }
+
+ UpdateW(src1, best_rgb_y + 0 * w, w, rgb_bit_depth);
+ UpdateW(src2, best_rgb_y + 1 * w, w, rgb_bit_depth);
+ UpdateChroma(src1, src2, best_rgb_uv, uv_w, rgb_bit_depth);
+
+ // update two rows of Y and one row of RGB
+ diff_y_sum +=
+ SharpYuvUpdateY(target_y, best_rgb_y, best_y, 2 * w,
+ rgb_bit_depth + GetPrecisionShift(rgb_bit_depth));
+ SharpYuvUpdateRGB(target_uv, best_rgb_uv, best_uv, 3 * uv_w);
+
+ best_y += 2 * w;
+ best_uv += 3 * uv_w;
+ target_y += 2 * w;
+ target_uv += 3 * uv_w;
+ }
+ // test exit condition
+ if (iter > 0) {
+ if (diff_y_sum < diff_y_threshold) break;
+ if (diff_y_sum > prev_diff_y_sum) break;
+ }
+ prev_diff_y_sum = diff_y_sum;
+ }
+
+ // final reconstruction
+ ok = ConvertWRGBToYUV(best_y_base, best_uv_base, y_ptr, y_stride, u_ptr,
+ u_stride, v_ptr, v_stride, rgb_bit_depth, yuv_bit_depth,
+ width, height, yuv_matrix);
+
+ End:
+ free(best_y_base);
+ free(best_uv_base);
+ free(target_y_base);
+ free(target_uv_base);
+ free(best_rgb_y);
+ free(best_rgb_uv);
+ free(tmp_buffer);
+ return ok;
+}
+#undef SAFE_ALLOC
+
+#if defined(WEBP_USE_THREAD) && !defined(_WIN32)
+#include <pthread.h> // NOLINT
+
+#define LOCK_ACCESS \
+ static pthread_mutex_t sharpyuv_lock = PTHREAD_MUTEX_INITIALIZER; \
+ if (pthread_mutex_lock(&sharpyuv_lock)) return
+#define UNLOCK_ACCESS_AND_RETURN \
+ do { \
+ (void)pthread_mutex_unlock(&sharpyuv_lock); \
+ return; \
+ } while (0)
+#else // !(defined(WEBP_USE_THREAD) && !defined(_WIN32))
+#define LOCK_ACCESS do {} while (0)
+#define UNLOCK_ACCESS_AND_RETURN return
+#endif // defined(WEBP_USE_THREAD) && !defined(_WIN32)
+
+// Hidden exported init function.
+// By default SharpYuvConvert calls it with SharpYuvGetCPUInfo. If needed,
+// users can declare it as extern and call it with an alternate VP8CPUInfo
+// function.
+SHARPYUV_EXTERN void SharpYuvInit(VP8CPUInfo cpu_info_func);
+void SharpYuvInit(VP8CPUInfo cpu_info_func) {
+ static volatile VP8CPUInfo sharpyuv_last_cpuinfo_used =
+ (VP8CPUInfo)&sharpyuv_last_cpuinfo_used;
+ LOCK_ACCESS;
+ // Only update SharpYuvGetCPUInfo when called from external code to avoid a
+ // race on reading the value in SharpYuvConvert().
+ if (cpu_info_func != (VP8CPUInfo)&SharpYuvGetCPUInfo) {
+ SharpYuvGetCPUInfo = cpu_info_func;
+ }
+ if (sharpyuv_last_cpuinfo_used == SharpYuvGetCPUInfo) {
+ UNLOCK_ACCESS_AND_RETURN;
+ }
+
+ SharpYuvInitDsp();
+ SharpYuvInitGammaTables();
+
+ sharpyuv_last_cpuinfo_used = SharpYuvGetCPUInfo;
+ UNLOCK_ACCESS_AND_RETURN;
+}
+
+int SharpYuvConvert(const void* r_ptr, const void* g_ptr,
+ const void* b_ptr, int rgb_step, int rgb_stride,
+ int rgb_bit_depth, void* y_ptr, int y_stride,
+ void* u_ptr, int u_stride, void* v_ptr,
+ int v_stride, int yuv_bit_depth, int width,
+ int height, const SharpYuvConversionMatrix* yuv_matrix) {
+ SharpYuvConversionMatrix scaled_matrix;
+ const int rgb_max = (1 << rgb_bit_depth) - 1;
+ const int rgb_round = 1 << (rgb_bit_depth - 1);
+ const int yuv_max = (1 << yuv_bit_depth) - 1;
+ const int sfix = GetPrecisionShift(rgb_bit_depth);
+
+ if (width < 1 || height < 1 || width == INT_MAX || height == INT_MAX ||
+ r_ptr == NULL || g_ptr == NULL || b_ptr == NULL || y_ptr == NULL ||
+ u_ptr == NULL || v_ptr == NULL) {
+ return 0;
+ }
+ if (rgb_bit_depth != 8 && rgb_bit_depth != 10 && rgb_bit_depth != 12 &&
+ rgb_bit_depth != 16) {
+ return 0;
+ }
+ if (yuv_bit_depth != 8 && yuv_bit_depth != 10 && yuv_bit_depth != 12) {
+ return 0;
+ }
+ if (rgb_bit_depth > 8 && (rgb_step % 2 != 0 || rgb_stride %2 != 0)) {
+ // Step/stride should be even for uint16_t buffers.
+ return 0;
+ }
+ if (yuv_bit_depth > 8 &&
+ (y_stride % 2 != 0 || u_stride % 2 != 0 || v_stride % 2 != 0)) {
+ // Stride should be even for uint16_t buffers.
+ return 0;
+ }
+ // The address of the function pointer is used to avoid a read race.
+ SharpYuvInit((VP8CPUInfo)&SharpYuvGetCPUInfo);
+
+ // Add scaling factor to go from rgb_bit_depth to yuv_bit_depth, to the
+ // rgb->yuv conversion matrix.
+ if (rgb_bit_depth == yuv_bit_depth) {
+ memcpy(&scaled_matrix, yuv_matrix, sizeof(scaled_matrix));
+ } else {
+ int i;
+ for (i = 0; i < 3; ++i) {
+ scaled_matrix.rgb_to_y[i] =
+ (yuv_matrix->rgb_to_y[i] * yuv_max + rgb_round) / rgb_max;
+ scaled_matrix.rgb_to_u[i] =
+ (yuv_matrix->rgb_to_u[i] * yuv_max + rgb_round) / rgb_max;
+ scaled_matrix.rgb_to_v[i] =
+ (yuv_matrix->rgb_to_v[i] * yuv_max + rgb_round) / rgb_max;
+ }
+ }
+ // Also incorporate precision change scaling.
+ scaled_matrix.rgb_to_y[3] = Shift(yuv_matrix->rgb_to_y[3], sfix);
+ scaled_matrix.rgb_to_u[3] = Shift(yuv_matrix->rgb_to_u[3], sfix);
+ scaled_matrix.rgb_to_v[3] = Shift(yuv_matrix->rgb_to_v[3], sfix);
+
+ return DoSharpArgbToYuv(r_ptr, g_ptr, b_ptr, rgb_step, rgb_stride,
+ rgb_bit_depth, y_ptr, y_stride, u_ptr, u_stride,
+ v_ptr, v_stride, yuv_bit_depth, width, height,
+ &scaled_matrix);
+}
+
+//------------------------------------------------------------------------------
diff --git a/src/3rdparty/libwebp/sharpyuv/sharpyuv.h b/src/3rdparty/libwebp/sharpyuv/sharpyuv.h
new file mode 100644
index 0000000..181b20a
--- /dev/null
+++ b/src/3rdparty/libwebp/sharpyuv/sharpyuv.h
@@ -0,0 +1,103 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// Sharp RGB to YUV conversion.
+
+#ifndef WEBP_SHARPYUV_SHARPYUV_H_
+#define WEBP_SHARPYUV_SHARPYUV_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef SHARPYUV_EXTERN
+#ifdef WEBP_EXTERN
+#define SHARPYUV_EXTERN WEBP_EXTERN
+#else
+// This explicitly marks library functions and allows for changing the
+// signature for e.g., Windows DLL builds.
+#if defined(__GNUC__) && __GNUC__ >= 4
+#define SHARPYUV_EXTERN extern __attribute__((visibility("default")))
+#else
+#if defined(_MSC_VER) && defined(WEBP_DLL)
+#define SHARPYUV_EXTERN __declspec(dllexport)
+#else
+#define SHARPYUV_EXTERN extern
+#endif /* _MSC_VER && WEBP_DLL */
+#endif /* __GNUC__ >= 4 */
+#endif /* WEBP_EXTERN */
+#endif /* SHARPYUV_EXTERN */
+
+// SharpYUV API version following the convention from semver.org
+#define SHARPYUV_VERSION_MAJOR 0
+#define SHARPYUV_VERSION_MINOR 2
+#define SHARPYUV_VERSION_PATCH 0
+// Version as a uint32_t. The major number is the high 8 bits.
+// The minor number is the middle 8 bits. The patch number is the low 16 bits.
+#define SHARPYUV_MAKE_VERSION(MAJOR, MINOR, PATCH) \
+ (((MAJOR) << 24) | ((MINOR) << 16) | (PATCH))
+#define SHARPYUV_VERSION \
+ SHARPYUV_MAKE_VERSION(SHARPYUV_VERSION_MAJOR, SHARPYUV_VERSION_MINOR, \
+ SHARPYUV_VERSION_PATCH)
+
+// Returns the library's version number, packed in hexadecimal. See
+// SHARPYUV_VERSION.
+SHARPYUV_EXTERN int SharpYuvGetVersion(void);
+
+// RGB to YUV conversion matrix, in 16 bit fixed point.
+// y = rgb_to_y[0] * r + rgb_to_y[1] * g + rgb_to_y[2] * b + rgb_to_y[3]
+// u = rgb_to_u[0] * r + rgb_to_u[1] * g + rgb_to_u[2] * b + rgb_to_u[3]
+// v = rgb_to_v[0] * r + rgb_to_v[1] * g + rgb_to_v[2] * b + rgb_to_v[3]
+// Then y, u and v values are divided by 1<<16 and rounded.
+typedef struct {
+ int rgb_to_y[4];
+ int rgb_to_u[4];
+ int rgb_to_v[4];
+} SharpYuvConversionMatrix;
+
+// Converts RGB to YUV420 using a downsampling algorithm that minimizes
+// artefacts caused by chroma subsampling.
+// This is slower than standard downsampling (averaging of 4 UV values).
+// Assumes that the image will be upsampled using a bilinear filter. If nearest
+// neighbor is used instead, the upsampled image might look worse than with
+// standard downsampling.
+// r_ptr, g_ptr, b_ptr: pointers to the source r, g and b channels. Should point
+// to uint8_t buffers if rgb_bit_depth is 8, or uint16_t buffers otherwise.
+// rgb_step: distance in bytes between two horizontally adjacent pixels on the
+// r, g and b channels. If rgb_bit_depth is > 8, it should be a
+// multiple of 2.
+// rgb_stride: distance in bytes between two vertically adjacent pixels on the
+// r, g, and b channels. If rgb_bit_depth is > 8, it should be a
+// multiple of 2.
+// rgb_bit_depth: number of bits for each r/g/b value. One of: 8, 10, 12, 16.
+// Note: 16 bit input is truncated to 14 bits before conversion to yuv.
+// yuv_bit_depth: number of bits for each y/u/v value. One of: 8, 10, 12.
+// y_ptr, u_ptr, v_ptr: pointers to the destination y, u and v channels. Should
+// point to uint8_t buffers if yuv_bit_depth is 8, or uint16_t buffers
+// otherwise.
+// y_stride, u_stride, v_stride: distance in bytes between two vertically
+// adjacent pixels on the y, u and v channels. If yuv_bit_depth > 8, they
+// should be multiples of 2.
+// width, height: width and height of the image in pixels
+SHARPYUV_EXTERN int SharpYuvConvert(const void* r_ptr, const void* g_ptr,
+ const void* b_ptr, int rgb_step,
+ int rgb_stride, int rgb_bit_depth,
+ void* y_ptr, int y_stride, void* u_ptr,
+ int u_stride, void* v_ptr, int v_stride,
+ int yuv_bit_depth, int width, int height,
+ const SharpYuvConversionMatrix* yuv_matrix);
+
+// TODO(b/194336375): Add YUV444 to YUV420 conversion. Maybe also add 422
+// support (it's rarely used in practice, especially for images).
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif // WEBP_SHARPYUV_SHARPYUV_H_
diff --git a/src/3rdparty/libwebp/sharpyuv/sharpyuv_cpu.c b/src/3rdparty/libwebp/sharpyuv/sharpyuv_cpu.c
new file mode 100644
index 0000000..29425a0
--- /dev/null
+++ b/src/3rdparty/libwebp/sharpyuv/sharpyuv_cpu.c
@@ -0,0 +1,14 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+#include "sharpyuv/sharpyuv_cpu.h"
+
+// Include src/dsp/cpu.c to create SharpYuvGetCPUInfo from VP8GetCPUInfo. The
+// function pointer is renamed in sharpyuv_cpu.h.
+#include "src/dsp/cpu.c"
diff --git a/src/3rdparty/libwebp/sharpyuv/sharpyuv_cpu.h b/src/3rdparty/libwebp/sharpyuv/sharpyuv_cpu.h
new file mode 100644
index 0000000..176ca3e
--- /dev/null
+++ b/src/3rdparty/libwebp/sharpyuv/sharpyuv_cpu.h
@@ -0,0 +1,22 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+#ifndef WEBP_SHARPYUV_SHARPYUV_CPU_H_
+#define WEBP_SHARPYUV_SHARPYUV_CPU_H_
+
+#include "sharpyuv/sharpyuv.h"
+
+// Avoid exporting SharpYuvGetCPUInfo in shared object / DLL builds.
+// SharpYuvInit() replaces the use of the function pointer.
+#undef WEBP_EXTERN
+#define WEBP_EXTERN extern
+#define VP8GetCPUInfo SharpYuvGetCPUInfo
+#include "src/dsp/cpu.h"
+
+#endif // WEBP_SHARPYUV_SHARPYUV_CPU_H_
diff --git a/src/3rdparty/libwebp/sharpyuv/sharpyuv_csp.c b/src/3rdparty/libwebp/sharpyuv/sharpyuv_csp.c
new file mode 100644
index 0000000..0ad22be
--- /dev/null
+++ b/src/3rdparty/libwebp/sharpyuv/sharpyuv_csp.c
@@ -0,0 +1,110 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// Colorspace utilities.
+
+#include "sharpyuv/sharpyuv_csp.h"
+
+#include <assert.h>
+#include <math.h>
+#include <stddef.h>
+
+static int ToFixed16(float f) { return (int)floor(f * (1 << 16) + 0.5f); }
+
+void SharpYuvComputeConversionMatrix(const SharpYuvColorSpace* yuv_color_space,
+ SharpYuvConversionMatrix* matrix) {
+ const float kr = yuv_color_space->kr;
+ const float kb = yuv_color_space->kb;
+ const float kg = 1.0f - kr - kb;
+ const float cr = 0.5f / (1.0f - kb);
+ const float cb = 0.5f / (1.0f - kr);
+
+ const int shift = yuv_color_space->bit_depth - 8;
+
+ const float denom = (float)((1 << yuv_color_space->bit_depth) - 1);
+ float scale_y = 1.0f;
+ float add_y = 0.0f;
+ float scale_u = cr;
+ float scale_v = cb;
+ float add_uv = (float)(128 << shift);
+ assert(yuv_color_space->bit_depth >= 8);
+
+ if (yuv_color_space->range == kSharpYuvRangeLimited) {
+ scale_y *= (219 << shift) / denom;
+ scale_u *= (224 << shift) / denom;
+ scale_v *= (224 << shift) / denom;
+ add_y = (float)(16 << shift);
+ }
+
+ matrix->rgb_to_y[0] = ToFixed16(kr * scale_y);
+ matrix->rgb_to_y[1] = ToFixed16(kg * scale_y);
+ matrix->rgb_to_y[2] = ToFixed16(kb * scale_y);
+ matrix->rgb_to_y[3] = ToFixed16(add_y);
+
+ matrix->rgb_to_u[0] = ToFixed16(-kr * scale_u);
+ matrix->rgb_to_u[1] = ToFixed16(-kg * scale_u);
+ matrix->rgb_to_u[2] = ToFixed16((1 - kb) * scale_u);
+ matrix->rgb_to_u[3] = ToFixed16(add_uv);
+
+ matrix->rgb_to_v[0] = ToFixed16((1 - kr) * scale_v);
+ matrix->rgb_to_v[1] = ToFixed16(-kg * scale_v);
+ matrix->rgb_to_v[2] = ToFixed16(-kb * scale_v);
+ matrix->rgb_to_v[3] = ToFixed16(add_uv);
+}
+
+// Matrices are in YUV_FIX fixed point precision.
+// WebP's matrix, similar but not identical to kRec601LimitedMatrix.
+static const SharpYuvConversionMatrix kWebpMatrix = {
+ {16839, 33059, 6420, 16 << 16},
+ {-9719, -19081, 28800, 128 << 16},
+ {28800, -24116, -4684, 128 << 16},
+};
+// Kr=0.2990f Kb=0.1140f bits=8 range=kSharpYuvRangeLimited
+static const SharpYuvConversionMatrix kRec601LimitedMatrix = {
+ {16829, 33039, 6416, 16 << 16},
+ {-9714, -19071, 28784, 128 << 16},
+ {28784, -24103, -4681, 128 << 16},
+};
+// Kr=0.2990f Kb=0.1140f bits=8 range=kSharpYuvRangeFull
+static const SharpYuvConversionMatrix kRec601FullMatrix = {
+ {19595, 38470, 7471, 0},
+ {-11058, -21710, 32768, 128 << 16},
+ {32768, -27439, -5329, 128 << 16},
+};
+// Kr=0.2126f Kb=0.0722f bits=8 range=kSharpYuvRangeLimited
+static const SharpYuvConversionMatrix kRec709LimitedMatrix = {
+ {11966, 40254, 4064, 16 << 16},
+ {-6596, -22189, 28784, 128 << 16},
+ {28784, -26145, -2639, 128 << 16},
+};
+// Kr=0.2126f Kb=0.0722f bits=8 range=kSharpYuvRangeFull
+static const SharpYuvConversionMatrix kRec709FullMatrix = {
+ {13933, 46871, 4732, 0},
+ {-7509, -25259, 32768, 128 << 16},
+ {32768, -29763, -3005, 128 << 16},
+};
+
+const SharpYuvConversionMatrix* SharpYuvGetConversionMatrix(
+ SharpYuvMatrixType matrix_type) {
+ switch (matrix_type) {
+ case kSharpYuvMatrixWebp:
+ return &kWebpMatrix;
+ case kSharpYuvMatrixRec601Limited:
+ return &kRec601LimitedMatrix;
+ case kSharpYuvMatrixRec601Full:
+ return &kRec601FullMatrix;
+ case kSharpYuvMatrixRec709Limited:
+ return &kRec709LimitedMatrix;
+ case kSharpYuvMatrixRec709Full:
+ return &kRec709FullMatrix;
+ case kSharpYuvMatrixNum:
+ return NULL;
+ }
+ return NULL;
+}
diff --git a/src/3rdparty/libwebp/sharpyuv/sharpyuv_csp.h b/src/3rdparty/libwebp/sharpyuv/sharpyuv_csp.h
new file mode 100644
index 0000000..3214e3a
--- /dev/null
+++ b/src/3rdparty/libwebp/sharpyuv/sharpyuv_csp.h
@@ -0,0 +1,60 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// Colorspace utilities.
+
+#ifndef WEBP_SHARPYUV_SHARPYUV_CSP_H_
+#define WEBP_SHARPYUV_SHARPYUV_CSP_H_
+
+#include "sharpyuv/sharpyuv.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Range of YUV values.
+typedef enum {
+ kSharpYuvRangeFull, // YUV values between [0;255] (for 8 bit)
+ kSharpYuvRangeLimited // Y in [16;235], YUV in [16;240] (for 8 bit)
+} SharpYuvRange;
+
+// Constants that define a YUV color space.
+typedef struct {
+ // Kr and Kb are defined such that:
+ // Y = Kr * r + Kg * g + Kb * b where Kg = 1 - Kr - Kb.
+ float kr;
+ float kb;
+ int bit_depth; // 8, 10 or 12
+ SharpYuvRange range;
+} SharpYuvColorSpace;
+
+// Fills in 'matrix' for the given YUVColorSpace.
+SHARPYUV_EXTERN void SharpYuvComputeConversionMatrix(
+ const SharpYuvColorSpace* yuv_color_space,
+ SharpYuvConversionMatrix* matrix);
+
+// Enums for precomputed conversion matrices.
+typedef enum {
+ kSharpYuvMatrixWebp = 0,
+ kSharpYuvMatrixRec601Limited,
+ kSharpYuvMatrixRec601Full,
+ kSharpYuvMatrixRec709Limited,
+ kSharpYuvMatrixRec709Full,
+ kSharpYuvMatrixNum
+} SharpYuvMatrixType;
+
+// Returns a pointer to a matrix for one of the predefined colorspaces.
+SHARPYUV_EXTERN const SharpYuvConversionMatrix* SharpYuvGetConversionMatrix(
+ SharpYuvMatrixType matrix_type);
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif // WEBP_SHARPYUV_SHARPYUV_CSP_H_
diff --git a/src/3rdparty/libwebp/sharpyuv/sharpyuv_dsp.c b/src/3rdparty/libwebp/sharpyuv/sharpyuv_dsp.c
new file mode 100644
index 0000000..31c272c
--- /dev/null
+++ b/src/3rdparty/libwebp/sharpyuv/sharpyuv_dsp.c
@@ -0,0 +1,103 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// Speed-critical functions for Sharp YUV.
+//
+// Author: Skal (pascal.massimino@gmail.com)
+
+#include "sharpyuv/sharpyuv_dsp.h"
+
+#include <assert.h>
+#include <stdlib.h>
+
+#include "sharpyuv/sharpyuv_cpu.h"
+
+//-----------------------------------------------------------------------------
+
+#if !WEBP_NEON_OMIT_C_CODE
+static uint16_t clip(int v, int max) {
+ return (v < 0) ? 0 : (v > max) ? max : (uint16_t)v;
+}
+
+static uint64_t SharpYuvUpdateY_C(const uint16_t* ref, const uint16_t* src,
+ uint16_t* dst, int len, int bit_depth) {
+ uint64_t diff = 0;
+ int i;
+ const int max_y = (1 << bit_depth) - 1;
+ for (i = 0; i < len; ++i) {
+ const int diff_y = ref[i] - src[i];
+ const int new_y = (int)dst[i] + diff_y;
+ dst[i] = clip(new_y, max_y);
+ diff += (uint64_t)abs(diff_y);
+ }
+ return diff;
+}
+
+static void SharpYuvUpdateRGB_C(const int16_t* ref, const int16_t* src,
+ int16_t* dst, int len) {
+ int i;
+ for (i = 0; i < len; ++i) {
+ const int diff_uv = ref[i] - src[i];
+ dst[i] += diff_uv;
+ }
+}
+
+static void SharpYuvFilterRow_C(const int16_t* A, const int16_t* B, int len,
+ const uint16_t* best_y, uint16_t* out,
+ int bit_depth) {
+ int i;
+ const int max_y = (1 << bit_depth) - 1;
+ for (i = 0; i < len; ++i, ++A, ++B) {
+ const int v0 = (A[0] * 9 + A[1] * 3 + B[0] * 3 + B[1] + 8) >> 4;
+ const int v1 = (A[1] * 9 + A[0] * 3 + B[1] * 3 + B[0] + 8) >> 4;
+ out[2 * i + 0] = clip(best_y[2 * i + 0] + v0, max_y);
+ out[2 * i + 1] = clip(best_y[2 * i + 1] + v1, max_y);
+ }
+}
+#endif // !WEBP_NEON_OMIT_C_CODE
+
+//-----------------------------------------------------------------------------
+
+uint64_t (*SharpYuvUpdateY)(const uint16_t* src, const uint16_t* ref,
+ uint16_t* dst, int len, int bit_depth);
+void (*SharpYuvUpdateRGB)(const int16_t* src, const int16_t* ref, int16_t* dst,
+ int len);
+void (*SharpYuvFilterRow)(const int16_t* A, const int16_t* B, int len,
+ const uint16_t* best_y, uint16_t* out,
+ int bit_depth);
+
+extern void InitSharpYuvSSE2(void);
+extern void InitSharpYuvNEON(void);
+
+void SharpYuvInitDsp(void) {
+#if !WEBP_NEON_OMIT_C_CODE
+ SharpYuvUpdateY = SharpYuvUpdateY_C;
+ SharpYuvUpdateRGB = SharpYuvUpdateRGB_C;
+ SharpYuvFilterRow = SharpYuvFilterRow_C;
+#endif
+
+ if (SharpYuvGetCPUInfo != NULL) {
+#if defined(WEBP_HAVE_SSE2)
+ if (SharpYuvGetCPUInfo(kSSE2)) {
+ InitSharpYuvSSE2();
+ }
+#endif // WEBP_HAVE_SSE2
+ }
+
+#if defined(WEBP_HAVE_NEON)
+ if (WEBP_NEON_OMIT_C_CODE ||
+ (SharpYuvGetCPUInfo != NULL && SharpYuvGetCPUInfo(kNEON))) {
+ InitSharpYuvNEON();
+ }
+#endif // WEBP_HAVE_NEON
+
+ assert(SharpYuvUpdateY != NULL);
+ assert(SharpYuvUpdateRGB != NULL);
+ assert(SharpYuvFilterRow != NULL);
+}
diff --git a/src/3rdparty/libwebp/sharpyuv/sharpyuv_dsp.h b/src/3rdparty/libwebp/sharpyuv/sharpyuv_dsp.h
new file mode 100644
index 0000000..805fbad
--- /dev/null
+++ b/src/3rdparty/libwebp/sharpyuv/sharpyuv_dsp.h
@@ -0,0 +1,28 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// Speed-critical functions for Sharp YUV.
+
+#ifndef WEBP_SHARPYUV_SHARPYUV_DSP_H_
+#define WEBP_SHARPYUV_SHARPYUV_DSP_H_
+
+#include "sharpyuv/sharpyuv_cpu.h"
+#include "src/webp/types.h"
+
+extern uint64_t (*SharpYuvUpdateY)(const uint16_t* src, const uint16_t* ref,
+ uint16_t* dst, int len, int bit_depth);
+extern void (*SharpYuvUpdateRGB)(const int16_t* src, const int16_t* ref,
+ int16_t* dst, int len);
+extern void (*SharpYuvFilterRow)(const int16_t* A, const int16_t* B, int len,
+ const uint16_t* best_y, uint16_t* out,
+ int bit_depth);
+
+void SharpYuvInitDsp(void);
+
+#endif // WEBP_SHARPYUV_SHARPYUV_DSP_H_
diff --git a/src/3rdparty/libwebp/sharpyuv/sharpyuv_gamma.c b/src/3rdparty/libwebp/sharpyuv/sharpyuv_gamma.c
new file mode 100644
index 0000000..20ab2da
--- /dev/null
+++ b/src/3rdparty/libwebp/sharpyuv/sharpyuv_gamma.c
@@ -0,0 +1,113 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// Gamma correction utilities.
+
+#include "sharpyuv/sharpyuv_gamma.h"
+
+#include <assert.h>
+#include <math.h>
+
+#include "src/webp/types.h"
+
+// Gamma correction compensates loss of resolution during chroma subsampling.
+// Size of pre-computed table for converting from gamma to linear.
+#define GAMMA_TO_LINEAR_TAB_BITS 10
+#define GAMMA_TO_LINEAR_TAB_SIZE (1 << GAMMA_TO_LINEAR_TAB_BITS)
+static uint32_t kGammaToLinearTabS[GAMMA_TO_LINEAR_TAB_SIZE + 2];
+#define LINEAR_TO_GAMMA_TAB_BITS 9
+#define LINEAR_TO_GAMMA_TAB_SIZE (1 << LINEAR_TO_GAMMA_TAB_BITS)
+static uint32_t kLinearToGammaTabS[LINEAR_TO_GAMMA_TAB_SIZE + 2];
+
+static const double kGammaF = 1. / 0.45;
+#define GAMMA_TO_LINEAR_BITS 16
+
+static volatile int kGammaTablesSOk = 0;
+void SharpYuvInitGammaTables(void) {
+ assert(GAMMA_TO_LINEAR_BITS <= 16);
+ if (!kGammaTablesSOk) {
+ int v;
+ const double a = 0.09929682680944;
+ const double thresh = 0.018053968510807;
+ const double final_scale = 1 << GAMMA_TO_LINEAR_BITS;
+ // Precompute gamma to linear table.
+ {
+ const double norm = 1. / GAMMA_TO_LINEAR_TAB_SIZE;
+ const double a_rec = 1. / (1. + a);
+ for (v = 0; v <= GAMMA_TO_LINEAR_TAB_SIZE; ++v) {
+ const double g = norm * v;
+ double value;
+ if (g <= thresh * 4.5) {
+ value = g / 4.5;
+ } else {
+ value = pow(a_rec * (g + a), kGammaF);
+ }
+ kGammaToLinearTabS[v] = (uint32_t)(value * final_scale + .5);
+ }
+ // to prevent small rounding errors to cause read-overflow:
+ kGammaToLinearTabS[GAMMA_TO_LINEAR_TAB_SIZE + 1] =
+ kGammaToLinearTabS[GAMMA_TO_LINEAR_TAB_SIZE];
+ }
+ // Precompute linear to gamma table.
+ {
+ const double scale = 1. / LINEAR_TO_GAMMA_TAB_SIZE;
+ for (v = 0; v <= LINEAR_TO_GAMMA_TAB_SIZE; ++v) {
+ const double g = scale * v;
+ double value;
+ if (g <= thresh) {
+ value = 4.5 * g;
+ } else {
+ value = (1. + a) * pow(g, 1. / kGammaF) - a;
+ }
+ kLinearToGammaTabS[v] =
+ (uint32_t)(final_scale * value + 0.5);
+ }
+ // to prevent small rounding errors to cause read-overflow:
+ kLinearToGammaTabS[LINEAR_TO_GAMMA_TAB_SIZE + 1] =
+ kLinearToGammaTabS[LINEAR_TO_GAMMA_TAB_SIZE];
+ }
+ kGammaTablesSOk = 1;
+ }
+}
+
+static WEBP_INLINE int Shift(int v, int shift) {
+ return (shift >= 0) ? (v << shift) : (v >> -shift);
+}
+
+static WEBP_INLINE uint32_t FixedPointInterpolation(int v, uint32_t* tab,
+ int tab_pos_shift_right,
+ int tab_value_shift) {
+ const uint32_t tab_pos = Shift(v, -tab_pos_shift_right);
+ // fractional part, in 'tab_pos_shift' fixed-point precision
+ const uint32_t x = v - (tab_pos << tab_pos_shift_right); // fractional part
+ // v0 / v1 are in kGammaToLinearBits fixed-point precision (range [0..1])
+ const uint32_t v0 = Shift(tab[tab_pos + 0], tab_value_shift);
+ const uint32_t v1 = Shift(tab[tab_pos + 1], tab_value_shift);
+ // Final interpolation.
+ const uint32_t v2 = (v1 - v0) * x; // note: v1 >= v0.
+ const int half =
+ (tab_pos_shift_right > 0) ? 1 << (tab_pos_shift_right - 1) : 0;
+ const uint32_t result = v0 + ((v2 + half) >> tab_pos_shift_right);
+ return result;
+}
+
+uint32_t SharpYuvGammaToLinear(uint16_t v, int bit_depth) {
+ const int shift = GAMMA_TO_LINEAR_TAB_BITS - bit_depth;
+ if (shift > 0) {
+ return kGammaToLinearTabS[v << shift];
+ }
+ return FixedPointInterpolation(v, kGammaToLinearTabS, -shift, 0);
+}
+
+uint16_t SharpYuvLinearToGamma(uint32_t value, int bit_depth) {
+ return FixedPointInterpolation(
+ value, kLinearToGammaTabS,
+ (GAMMA_TO_LINEAR_BITS - LINEAR_TO_GAMMA_TAB_BITS),
+ bit_depth - GAMMA_TO_LINEAR_BITS);
+}
diff --git a/src/3rdparty/libwebp/sharpyuv/sharpyuv_gamma.h b/src/3rdparty/libwebp/sharpyuv/sharpyuv_gamma.h
new file mode 100644
index 0000000..d13aff5
--- /dev/null
+++ b/src/3rdparty/libwebp/sharpyuv/sharpyuv_gamma.h
@@ -0,0 +1,35 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// Gamma correction utilities.
+
+#ifndef WEBP_SHARPYUV_SHARPYUV_GAMMA_H_
+#define WEBP_SHARPYUV_SHARPYUV_GAMMA_H_
+
+#include "src/webp/types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Initializes precomputed tables. Must be called once before calling
+// SharpYuvGammaToLinear or SharpYuvLinearToGamma.
+void SharpYuvInitGammaTables(void);
+
+// Converts a gamma color value on 'bit_depth' bits to a 16 bit linear value.
+uint32_t SharpYuvGammaToLinear(uint16_t v, int bit_depth);
+
+// Converts a 16 bit linear color value to a gamma value on 'bit_depth' bits.
+uint16_t SharpYuvLinearToGamma(uint32_t value, int bit_depth);
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif // WEBP_SHARPYUV_SHARPYUV_GAMMA_H_
diff --git a/src/3rdparty/libwebp/sharpyuv/sharpyuv_neon.c b/src/3rdparty/libwebp/sharpyuv/sharpyuv_neon.c
new file mode 100644
index 0000000..5840914
--- /dev/null
+++ b/src/3rdparty/libwebp/sharpyuv/sharpyuv_neon.c
@@ -0,0 +1,181 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// Speed-critical functions for Sharp YUV.
+//
+// Author: Skal (pascal.massimino@gmail.com)
+
+#include "sharpyuv/sharpyuv_dsp.h"
+
+#if defined(WEBP_USE_NEON)
+#include <assert.h>
+#include <stdlib.h>
+#include <arm_neon.h>
+
+static uint16_t clip_NEON(int v, int max) {
+ return (v < 0) ? 0 : (v > max) ? max : (uint16_t)v;
+}
+
+static uint64_t SharpYuvUpdateY_NEON(const uint16_t* ref, const uint16_t* src,
+ uint16_t* dst, int len, int bit_depth) {
+ const int max_y = (1 << bit_depth) - 1;
+ int i;
+ const int16x8_t zero = vdupq_n_s16(0);
+ const int16x8_t max = vdupq_n_s16(max_y);
+ uint64x2_t sum = vdupq_n_u64(0);
+ uint64_t diff;
+
+ for (i = 0; i + 8 <= len; i += 8) {
+ const int16x8_t A = vreinterpretq_s16_u16(vld1q_u16(ref + i));
+ const int16x8_t B = vreinterpretq_s16_u16(vld1q_u16(src + i));
+ const int16x8_t C = vreinterpretq_s16_u16(vld1q_u16(dst + i));
+ const int16x8_t D = vsubq_s16(A, B); // diff_y
+ const int16x8_t F = vaddq_s16(C, D); // new_y
+ const uint16x8_t H =
+ vreinterpretq_u16_s16(vmaxq_s16(vminq_s16(F, max), zero));
+ const int16x8_t I = vabsq_s16(D); // abs(diff_y)
+ vst1q_u16(dst + i, H);
+ sum = vpadalq_u32(sum, vpaddlq_u16(vreinterpretq_u16_s16(I)));
+ }
+ diff = vgetq_lane_u64(sum, 0) + vgetq_lane_u64(sum, 1);
+ for (; i < len; ++i) {
+ const int diff_y = ref[i] - src[i];
+ const int new_y = (int)(dst[i]) + diff_y;
+ dst[i] = clip_NEON(new_y, max_y);
+ diff += (uint64_t)(abs(diff_y));
+ }
+ return diff;
+}
+
+static void SharpYuvUpdateRGB_NEON(const int16_t* ref, const int16_t* src,
+ int16_t* dst, int len) {
+ int i;
+ for (i = 0; i + 8 <= len; i += 8) {
+ const int16x8_t A = vld1q_s16(ref + i);
+ const int16x8_t B = vld1q_s16(src + i);
+ const int16x8_t C = vld1q_s16(dst + i);
+ const int16x8_t D = vsubq_s16(A, B); // diff_uv
+ const int16x8_t E = vaddq_s16(C, D); // new_uv
+ vst1q_s16(dst + i, E);
+ }
+ for (; i < len; ++i) {
+ const int diff_uv = ref[i] - src[i];
+ dst[i] += diff_uv;
+ }
+}
+
+static void SharpYuvFilterRow16_NEON(const int16_t* A, const int16_t* B,
+ int len, const uint16_t* best_y,
+ uint16_t* out, int bit_depth) {
+ const int max_y = (1 << bit_depth) - 1;
+ int i;
+ const int16x8_t max = vdupq_n_s16(max_y);
+ const int16x8_t zero = vdupq_n_s16(0);
+ for (i = 0; i + 8 <= len; i += 8) {
+ const int16x8_t a0 = vld1q_s16(A + i + 0);
+ const int16x8_t a1 = vld1q_s16(A + i + 1);
+ const int16x8_t b0 = vld1q_s16(B + i + 0);
+ const int16x8_t b1 = vld1q_s16(B + i + 1);
+ const int16x8_t a0b1 = vaddq_s16(a0, b1);
+ const int16x8_t a1b0 = vaddq_s16(a1, b0);
+ const int16x8_t a0a1b0b1 = vaddq_s16(a0b1, a1b0); // A0+A1+B0+B1
+ const int16x8_t a0b1_2 = vaddq_s16(a0b1, a0b1); // 2*(A0+B1)
+ const int16x8_t a1b0_2 = vaddq_s16(a1b0, a1b0); // 2*(A1+B0)
+ const int16x8_t c0 = vshrq_n_s16(vaddq_s16(a0b1_2, a0a1b0b1), 3);
+ const int16x8_t c1 = vshrq_n_s16(vaddq_s16(a1b0_2, a0a1b0b1), 3);
+ const int16x8_t e0 = vrhaddq_s16(c1, a0);
+ const int16x8_t e1 = vrhaddq_s16(c0, a1);
+ const int16x8x2_t f = vzipq_s16(e0, e1);
+ const int16x8_t g0 = vreinterpretq_s16_u16(vld1q_u16(best_y + 2 * i + 0));
+ const int16x8_t g1 = vreinterpretq_s16_u16(vld1q_u16(best_y + 2 * i + 8));
+ const int16x8_t h0 = vaddq_s16(g0, f.val[0]);
+ const int16x8_t h1 = vaddq_s16(g1, f.val[1]);
+ const int16x8_t i0 = vmaxq_s16(vminq_s16(h0, max), zero);
+ const int16x8_t i1 = vmaxq_s16(vminq_s16(h1, max), zero);
+ vst1q_u16(out + 2 * i + 0, vreinterpretq_u16_s16(i0));
+ vst1q_u16(out + 2 * i + 8, vreinterpretq_u16_s16(i1));
+ }
+ for (; i < len; ++i) {
+ const int a0b1 = A[i + 0] + B[i + 1];
+ const int a1b0 = A[i + 1] + B[i + 0];
+ const int a0a1b0b1 = a0b1 + a1b0 + 8;
+ const int v0 = (8 * A[i + 0] + 2 * a1b0 + a0a1b0b1) >> 4;
+ const int v1 = (8 * A[i + 1] + 2 * a0b1 + a0a1b0b1) >> 4;
+ out[2 * i + 0] = clip_NEON(best_y[2 * i + 0] + v0, max_y);
+ out[2 * i + 1] = clip_NEON(best_y[2 * i + 1] + v1, max_y);
+ }
+}
+
+static void SharpYuvFilterRow32_NEON(const int16_t* A, const int16_t* B,
+ int len, const uint16_t* best_y,
+ uint16_t* out, int bit_depth) {
+ const int max_y = (1 << bit_depth) - 1;
+ int i;
+ const uint16x8_t max = vdupq_n_u16(max_y);
+ for (i = 0; i + 4 <= len; i += 4) {
+ const int16x4_t a0 = vld1_s16(A + i + 0);
+ const int16x4_t a1 = vld1_s16(A + i + 1);
+ const int16x4_t b0 = vld1_s16(B + i + 0);
+ const int16x4_t b1 = vld1_s16(B + i + 1);
+ const int32x4_t a0b1 = vaddl_s16(a0, b1);
+ const int32x4_t a1b0 = vaddl_s16(a1, b0);
+ const int32x4_t a0a1b0b1 = vaddq_s32(a0b1, a1b0); // A0+A1+B0+B1
+ const int32x4_t a0b1_2 = vaddq_s32(a0b1, a0b1); // 2*(A0+B1)
+ const int32x4_t a1b0_2 = vaddq_s32(a1b0, a1b0); // 2*(A1+B0)
+ const int32x4_t c0 = vshrq_n_s32(vaddq_s32(a0b1_2, a0a1b0b1), 3);
+ const int32x4_t c1 = vshrq_n_s32(vaddq_s32(a1b0_2, a0a1b0b1), 3);
+ const int32x4_t e0 = vrhaddq_s32(c1, vmovl_s16(a0));
+ const int32x4_t e1 = vrhaddq_s32(c0, vmovl_s16(a1));
+ const int32x4x2_t f = vzipq_s32(e0, e1);
+
+ const int16x8_t g = vreinterpretq_s16_u16(vld1q_u16(best_y + 2 * i));
+ const int32x4_t h0 = vaddw_s16(f.val[0], vget_low_s16(g));
+ const int32x4_t h1 = vaddw_s16(f.val[1], vget_high_s16(g));
+ const uint16x8_t i_16 = vcombine_u16(vqmovun_s32(h0), vqmovun_s32(h1));
+ const uint16x8_t i_clamped = vminq_u16(i_16, max);
+ vst1q_u16(out + 2 * i + 0, i_clamped);
+ }
+ for (; i < len; ++i) {
+ const int a0b1 = A[i + 0] + B[i + 1];
+ const int a1b0 = A[i + 1] + B[i + 0];
+ const int a0a1b0b1 = a0b1 + a1b0 + 8;
+ const int v0 = (8 * A[i + 0] + 2 * a1b0 + a0a1b0b1) >> 4;
+ const int v1 = (8 * A[i + 1] + 2 * a0b1 + a0a1b0b1) >> 4;
+ out[2 * i + 0] = clip_NEON(best_y[2 * i + 0] + v0, max_y);
+ out[2 * i + 1] = clip_NEON(best_y[2 * i + 1] + v1, max_y);
+ }
+}
+
+static void SharpYuvFilterRow_NEON(const int16_t* A, const int16_t* B, int len,
+ const uint16_t* best_y, uint16_t* out,
+ int bit_depth) {
+ if (bit_depth <= 10) {
+ SharpYuvFilterRow16_NEON(A, B, len, best_y, out, bit_depth);
+ } else {
+ SharpYuvFilterRow32_NEON(A, B, len, best_y, out, bit_depth);
+ }
+}
+
+//------------------------------------------------------------------------------
+
+extern void InitSharpYuvNEON(void);
+
+WEBP_TSAN_IGNORE_FUNCTION void InitSharpYuvNEON(void) {
+ SharpYuvUpdateY = SharpYuvUpdateY_NEON;
+ SharpYuvUpdateRGB = SharpYuvUpdateRGB_NEON;
+ SharpYuvFilterRow = SharpYuvFilterRow_NEON;
+}
+
+#else // !WEBP_USE_NEON
+
+extern void InitSharpYuvNEON(void);
+
+void InitSharpYuvNEON(void) {}
+
+#endif // WEBP_USE_NEON
diff --git a/src/3rdparty/libwebp/sharpyuv/sharpyuv_sse2.c b/src/3rdparty/libwebp/sharpyuv/sharpyuv_sse2.c
new file mode 100644
index 0000000..9744d1b
--- /dev/null
+++ b/src/3rdparty/libwebp/sharpyuv/sharpyuv_sse2.c
@@ -0,0 +1,201 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// Speed-critical functions for Sharp YUV.
+//
+// Author: Skal (pascal.massimino@gmail.com)
+
+#include "sharpyuv/sharpyuv_dsp.h"
+
+#if defined(WEBP_USE_SSE2)
+#include <stdlib.h>
+#include <emmintrin.h>
+
+static uint16_t clip_SSE2(int v, int max) {
+ return (v < 0) ? 0 : (v > max) ? max : (uint16_t)v;
+}
+
+static uint64_t SharpYuvUpdateY_SSE2(const uint16_t* ref, const uint16_t* src,
+ uint16_t* dst, int len, int bit_depth) {
+ const int max_y = (1 << bit_depth) - 1;
+ uint64_t diff = 0;
+ uint32_t tmp[4];
+ int i;
+ const __m128i zero = _mm_setzero_si128();
+ const __m128i max = _mm_set1_epi16(max_y);
+ const __m128i one = _mm_set1_epi16(1);
+ __m128i sum = zero;
+
+ for (i = 0; i + 8 <= len; i += 8) {
+ const __m128i A = _mm_loadu_si128((const __m128i*)(ref + i));
+ const __m128i B = _mm_loadu_si128((const __m128i*)(src + i));
+ const __m128i C = _mm_loadu_si128((const __m128i*)(dst + i));
+ const __m128i D = _mm_sub_epi16(A, B); // diff_y
+ const __m128i E = _mm_cmpgt_epi16(zero, D); // sign (-1 or 0)
+ const __m128i F = _mm_add_epi16(C, D); // new_y
+ const __m128i G = _mm_or_si128(E, one); // -1 or 1
+ const __m128i H = _mm_max_epi16(_mm_min_epi16(F, max), zero);
+ const __m128i I = _mm_madd_epi16(D, G); // sum(abs(...))
+ _mm_storeu_si128((__m128i*)(dst + i), H);
+ sum = _mm_add_epi32(sum, I);
+ }
+ _mm_storeu_si128((__m128i*)tmp, sum);
+ diff = tmp[3] + tmp[2] + tmp[1] + tmp[0];
+ for (; i < len; ++i) {
+ const int diff_y = ref[i] - src[i];
+ const int new_y = (int)dst[i] + diff_y;
+ dst[i] = clip_SSE2(new_y, max_y);
+ diff += (uint64_t)abs(diff_y);
+ }
+ return diff;
+}
+
+static void SharpYuvUpdateRGB_SSE2(const int16_t* ref, const int16_t* src,
+ int16_t* dst, int len) {
+ int i = 0;
+ for (i = 0; i + 8 <= len; i += 8) {
+ const __m128i A = _mm_loadu_si128((const __m128i*)(ref + i));
+ const __m128i B = _mm_loadu_si128((const __m128i*)(src + i));
+ const __m128i C = _mm_loadu_si128((const __m128i*)(dst + i));
+ const __m128i D = _mm_sub_epi16(A, B); // diff_uv
+ const __m128i E = _mm_add_epi16(C, D); // new_uv
+ _mm_storeu_si128((__m128i*)(dst + i), E);
+ }
+ for (; i < len; ++i) {
+ const int diff_uv = ref[i] - src[i];
+ dst[i] += diff_uv;
+ }
+}
+
+static void SharpYuvFilterRow16_SSE2(const int16_t* A, const int16_t* B,
+ int len, const uint16_t* best_y,
+ uint16_t* out, int bit_depth) {
+ const int max_y = (1 << bit_depth) - 1;
+ int i;
+ const __m128i kCst8 = _mm_set1_epi16(8);
+ const __m128i max = _mm_set1_epi16(max_y);
+ const __m128i zero = _mm_setzero_si128();
+ for (i = 0; i + 8 <= len; i += 8) {
+ const __m128i a0 = _mm_loadu_si128((const __m128i*)(A + i + 0));
+ const __m128i a1 = _mm_loadu_si128((const __m128i*)(A + i + 1));
+ const __m128i b0 = _mm_loadu_si128((const __m128i*)(B + i + 0));
+ const __m128i b1 = _mm_loadu_si128((const __m128i*)(B + i + 1));
+ const __m128i a0b1 = _mm_add_epi16(a0, b1);
+ const __m128i a1b0 = _mm_add_epi16(a1, b0);
+ const __m128i a0a1b0b1 = _mm_add_epi16(a0b1, a1b0); // A0+A1+B0+B1
+ const __m128i a0a1b0b1_8 = _mm_add_epi16(a0a1b0b1, kCst8);
+ const __m128i a0b1_2 = _mm_add_epi16(a0b1, a0b1); // 2*(A0+B1)
+ const __m128i a1b0_2 = _mm_add_epi16(a1b0, a1b0); // 2*(A1+B0)
+ const __m128i c0 = _mm_srai_epi16(_mm_add_epi16(a0b1_2, a0a1b0b1_8), 3);
+ const __m128i c1 = _mm_srai_epi16(_mm_add_epi16(a1b0_2, a0a1b0b1_8), 3);
+ const __m128i d0 = _mm_add_epi16(c1, a0);
+ const __m128i d1 = _mm_add_epi16(c0, a1);
+ const __m128i e0 = _mm_srai_epi16(d0, 1);
+ const __m128i e1 = _mm_srai_epi16(d1, 1);
+ const __m128i f0 = _mm_unpacklo_epi16(e0, e1);
+ const __m128i f1 = _mm_unpackhi_epi16(e0, e1);
+ const __m128i g0 = _mm_loadu_si128((const __m128i*)(best_y + 2 * i + 0));
+ const __m128i g1 = _mm_loadu_si128((const __m128i*)(best_y + 2 * i + 8));
+ const __m128i h0 = _mm_add_epi16(g0, f0);
+ const __m128i h1 = _mm_add_epi16(g1, f1);
+ const __m128i i0 = _mm_max_epi16(_mm_min_epi16(h0, max), zero);
+ const __m128i i1 = _mm_max_epi16(_mm_min_epi16(h1, max), zero);
+ _mm_storeu_si128((__m128i*)(out + 2 * i + 0), i0);
+ _mm_storeu_si128((__m128i*)(out + 2 * i + 8), i1);
+ }
+ for (; i < len; ++i) {
+ // (9 * A0 + 3 * A1 + 3 * B0 + B1 + 8) >> 4 =
+ // = (8 * A0 + 2 * (A1 + B0) + (A0 + A1 + B0 + B1 + 8)) >> 4
+ // We reuse the common sub-expressions.
+ const int a0b1 = A[i + 0] + B[i + 1];
+ const int a1b0 = A[i + 1] + B[i + 0];
+ const int a0a1b0b1 = a0b1 + a1b0 + 8;
+ const int v0 = (8 * A[i + 0] + 2 * a1b0 + a0a1b0b1) >> 4;
+ const int v1 = (8 * A[i + 1] + 2 * a0b1 + a0a1b0b1) >> 4;
+ out[2 * i + 0] = clip_SSE2(best_y[2 * i + 0] + v0, max_y);
+ out[2 * i + 1] = clip_SSE2(best_y[2 * i + 1] + v1, max_y);
+ }
+}
+
+static WEBP_INLINE __m128i s16_to_s32(__m128i in) {
+ return _mm_srai_epi32(_mm_unpacklo_epi16(in, in), 16);
+}
+
+static void SharpYuvFilterRow32_SSE2(const int16_t* A, const int16_t* B,
+ int len, const uint16_t* best_y,
+ uint16_t* out, int bit_depth) {
+ const int max_y = (1 << bit_depth) - 1;
+ int i;
+ const __m128i kCst8 = _mm_set1_epi32(8);
+ const __m128i max = _mm_set1_epi16(max_y);
+ const __m128i zero = _mm_setzero_si128();
+ for (i = 0; i + 4 <= len; i += 4) {
+ const __m128i a0 = s16_to_s32(_mm_loadl_epi64((const __m128i*)(A + i + 0)));
+ const __m128i a1 = s16_to_s32(_mm_loadl_epi64((const __m128i*)(A + i + 1)));
+ const __m128i b0 = s16_to_s32(_mm_loadl_epi64((const __m128i*)(B + i + 0)));
+ const __m128i b1 = s16_to_s32(_mm_loadl_epi64((const __m128i*)(B + i + 1)));
+ const __m128i a0b1 = _mm_add_epi32(a0, b1);
+ const __m128i a1b0 = _mm_add_epi32(a1, b0);
+ const __m128i a0a1b0b1 = _mm_add_epi32(a0b1, a1b0); // A0+A1+B0+B1
+ const __m128i a0a1b0b1_8 = _mm_add_epi32(a0a1b0b1, kCst8);
+ const __m128i a0b1_2 = _mm_add_epi32(a0b1, a0b1); // 2*(A0+B1)
+ const __m128i a1b0_2 = _mm_add_epi32(a1b0, a1b0); // 2*(A1+B0)
+ const __m128i c0 = _mm_srai_epi32(_mm_add_epi32(a0b1_2, a0a1b0b1_8), 3);
+ const __m128i c1 = _mm_srai_epi32(_mm_add_epi32(a1b0_2, a0a1b0b1_8), 3);
+ const __m128i d0 = _mm_add_epi32(c1, a0);
+ const __m128i d1 = _mm_add_epi32(c0, a1);
+ const __m128i e0 = _mm_srai_epi32(d0, 1);
+ const __m128i e1 = _mm_srai_epi32(d1, 1);
+ const __m128i f0 = _mm_unpacklo_epi32(e0, e1);
+ const __m128i f1 = _mm_unpackhi_epi32(e0, e1);
+ const __m128i g = _mm_loadu_si128((const __m128i*)(best_y + 2 * i + 0));
+ const __m128i h_16 = _mm_add_epi16(g, _mm_packs_epi32(f0, f1));
+ const __m128i final = _mm_max_epi16(_mm_min_epi16(h_16, max), zero);
+ _mm_storeu_si128((__m128i*)(out + 2 * i + 0), final);
+ }
+ for (; i < len; ++i) {
+ // (9 * A0 + 3 * A1 + 3 * B0 + B1 + 8) >> 4 =
+ // = (8 * A0 + 2 * (A1 + B0) + (A0 + A1 + B0 + B1 + 8)) >> 4
+ // We reuse the common sub-expressions.
+ const int a0b1 = A[i + 0] + B[i + 1];
+ const int a1b0 = A[i + 1] + B[i + 0];
+ const int a0a1b0b1 = a0b1 + a1b0 + 8;
+ const int v0 = (8 * A[i + 0] + 2 * a1b0 + a0a1b0b1) >> 4;
+ const int v1 = (8 * A[i + 1] + 2 * a0b1 + a0a1b0b1) >> 4;
+ out[2 * i + 0] = clip_SSE2(best_y[2 * i + 0] + v0, max_y);
+ out[2 * i + 1] = clip_SSE2(best_y[2 * i + 1] + v1, max_y);
+ }
+}
+
+static void SharpYuvFilterRow_SSE2(const int16_t* A, const int16_t* B, int len,
+ const uint16_t* best_y, uint16_t* out,
+ int bit_depth) {
+ if (bit_depth <= 10) {
+ SharpYuvFilterRow16_SSE2(A, B, len, best_y, out, bit_depth);
+ } else {
+ SharpYuvFilterRow32_SSE2(A, B, len, best_y, out, bit_depth);
+ }
+}
+
+//------------------------------------------------------------------------------
+
+extern void InitSharpYuvSSE2(void);
+
+WEBP_TSAN_IGNORE_FUNCTION void InitSharpYuvSSE2(void) {
+ SharpYuvUpdateY = SharpYuvUpdateY_SSE2;
+ SharpYuvUpdateRGB = SharpYuvUpdateRGB_SSE2;
+ SharpYuvFilterRow = SharpYuvFilterRow_SSE2;
+}
+#else // !WEBP_USE_SSE2
+
+extern void InitSharpYuvSSE2(void);
+
+void InitSharpYuvSSE2(void) {}
+
+#endif // WEBP_USE_SSE2
diff --git a/src/3rdparty/libwebp/src/dec/alpha_dec.c b/src/3rdparty/libwebp/src/dec/alpha_dec.c
index bce735b..0b93a30 100644
--- a/src/3rdparty/libwebp/src/dec/alpha_dec.c
+++ b/src/3rdparty/libwebp/src/dec/alpha_dec.c
@@ -183,7 +183,7 @@ const uint8_t* VP8DecompressAlphaRows(VP8Decoder* const dec,
assert(dec != NULL && io != NULL);
if (row < 0 || num_rows <= 0 || row + num_rows > height) {
- return NULL; // sanity check.
+ return NULL;
}
if (!dec->is_alpha_decoded_) {
diff --git a/src/3rdparty/libwebp/src/dec/buffer_dec.c b/src/3rdparty/libwebp/src/dec/buffer_dec.c
index 3cd94eb..4786cf0 100644
--- a/src/3rdparty/libwebp/src/dec/buffer_dec.c
+++ b/src/3rdparty/libwebp/src/dec/buffer_dec.c
@@ -102,7 +102,7 @@ static VP8StatusCode AllocateBuffer(WebPDecBuffer* const buffer) {
int stride;
uint64_t size;
- if ((uint64_t)w * kModeBpp[mode] >= (1ull << 32)) {
+ if ((uint64_t)w * kModeBpp[mode] >= (1ull << 31)) {
return VP8_STATUS_INVALID_PARAM;
}
stride = w * kModeBpp[mode];
@@ -117,7 +117,6 @@ static VP8StatusCode AllocateBuffer(WebPDecBuffer* const buffer) {
}
total_size = size + 2 * uv_size + a_size;
- // Security/sanity checks
output = (uint8_t*)WebPSafeMalloc(total_size, sizeof(*output));
if (output == NULL) {
return VP8_STATUS_OUT_OF_MEMORY;
@@ -156,11 +155,11 @@ VP8StatusCode WebPFlipBuffer(WebPDecBuffer* const buffer) {
}
if (WebPIsRGBMode(buffer->colorspace)) {
WebPRGBABuffer* const buf = &buffer->u.RGBA;
- buf->rgba += (buffer->height - 1) * buf->stride;
+ buf->rgba += (int64_t)(buffer->height - 1) * buf->stride;
buf->stride = -buf->stride;
} else {
WebPYUVABuffer* const buf = &buffer->u.YUVA;
- const int H = buffer->height;
+ const int64_t H = buffer->height;
buf->y += (H - 1) * buf->y_stride;
buf->y_stride = -buf->y_stride;
buf->u += ((H - 1) >> 1) * buf->u_stride;
@@ -188,8 +187,7 @@ VP8StatusCode WebPAllocateDecBuffer(int width, int height,
const int ch = options->crop_height;
const int x = options->crop_left & ~1;
const int y = options->crop_top & ~1;
- if (x < 0 || y < 0 || cw <= 0 || ch <= 0 ||
- x + cw > width || y + ch > height) {
+ if (!WebPCheckCropDimensions(width, height, x, y, cw, ch)) {
return VP8_STATUS_INVALID_PARAM; // out of frame boundary.
}
width = cw;
diff --git a/src/3rdparty/libwebp/src/dec/frame_dec.c b/src/3rdparty/libwebp/src/dec/frame_dec.c
index bda9e1a..91ca1f8 100644
--- a/src/3rdparty/libwebp/src/dec/frame_dec.c
+++ b/src/3rdparty/libwebp/src/dec/frame_dec.c
@@ -705,7 +705,7 @@ static int AllocateMemory(VP8Decoder* const dec) {
+ cache_size + alpha_size + WEBP_ALIGN_CST;
uint8_t* mem;
- if (needed != (size_t)needed) return 0; // check for overflow
+ if (!CheckSizeOverflow(needed)) return 0; // check for overflow
if (needed > dec->mem_size_) {
WebPSafeFree(dec->mem_);
dec->mem_size_ = 0;
@@ -732,7 +732,7 @@ static int AllocateMemory(VP8Decoder* const dec) {
mem += f_info_size;
dec->thread_ctx_.id_ = 0;
dec->thread_ctx_.f_info_ = dec->f_info_;
- if (dec->mt_method_ > 0) {
+ if (dec->filter_type_ > 0 && dec->mt_method_ > 0) {
// secondary cache line. The deblocking process need to make use of the
// filtering strength from previous macroblock row, while the new ones
// are being decoded in parallel. We'll just swap the pointers.
diff --git a/src/3rdparty/libwebp/src/dec/idec_dec.c b/src/3rdparty/libwebp/src/dec/idec_dec.c
index 9bc9166..9035df5 100644
--- a/src/3rdparty/libwebp/src/dec/idec_dec.c
+++ b/src/3rdparty/libwebp/src/dec/idec_dec.c
@@ -166,9 +166,11 @@ static int AppendToMemBuffer(WebPIDecoder* const idec,
VP8Decoder* const dec = (VP8Decoder*)idec->dec_;
MemBuffer* const mem = &idec->mem_;
const int need_compressed_alpha = NeedCompressedAlpha(idec);
- const uint8_t* const old_start = mem->buf_ + mem->start_;
+ const uint8_t* const old_start =
+ (mem->buf_ == NULL) ? NULL : mem->buf_ + mem->start_;
const uint8_t* const old_base =
need_compressed_alpha ? dec->alpha_data_ : old_start;
+ assert(mem->buf_ != NULL || mem->start_ == 0);
assert(mem->mode_ == MEM_MODE_APPEND);
if (data_size > MAX_CHUNK_PAYLOAD) {
// security safeguard: trying to allocate more than what the format
@@ -184,7 +186,7 @@ static int AppendToMemBuffer(WebPIDecoder* const idec,
uint8_t* const new_buf =
(uint8_t*)WebPSafeMalloc(extra_size, sizeof(*new_buf));
if (new_buf == NULL) return 0;
- memcpy(new_buf, old_base, current_size);
+ if (old_base != NULL) memcpy(new_buf, old_base, current_size);
WebPSafeFree(mem->buf_);
mem->buf_ = new_buf;
mem->buf_size_ = (size_t)extra_size;
@@ -192,6 +194,7 @@ static int AppendToMemBuffer(WebPIDecoder* const idec,
mem->end_ = current_size;
}
+ assert(mem->buf_ != NULL);
memcpy(mem->buf_ + mem->end_, data, data_size);
mem->end_ += data_size;
assert(mem->end_ <= mem->buf_size_);
@@ -204,7 +207,9 @@ static int RemapMemBuffer(WebPIDecoder* const idec,
const uint8_t* const data, size_t data_size) {
MemBuffer* const mem = &idec->mem_;
const uint8_t* const old_buf = mem->buf_;
- const uint8_t* const old_start = old_buf + mem->start_;
+ const uint8_t* const old_start =
+ (old_buf == NULL) ? NULL : old_buf + mem->start_;
+ assert(old_buf != NULL || mem->start_ == 0);
assert(mem->mode_ == MEM_MODE_MAP);
if (data_size < mem->buf_size_) return 0; // can't remap to a shorter buffer!
diff --git a/src/3rdparty/libwebp/src/dec/io_dec.c b/src/3rdparty/libwebp/src/dec/io_dec.c
index e603f19..5ef6298 100644
--- a/src/3rdparty/libwebp/src/dec/io_dec.c
+++ b/src/3rdparty/libwebp/src/dec/io_dec.c
@@ -25,21 +25,16 @@
static int EmitYUV(const VP8Io* const io, WebPDecParams* const p) {
WebPDecBuffer* output = p->output;
const WebPYUVABuffer* const buf = &output->u.YUVA;
- uint8_t* const y_dst = buf->y + io->mb_y * buf->y_stride;
- uint8_t* const u_dst = buf->u + (io->mb_y >> 1) * buf->u_stride;
- uint8_t* const v_dst = buf->v + (io->mb_y >> 1) * buf->v_stride;
+ uint8_t* const y_dst = buf->y + (size_t)io->mb_y * buf->y_stride;
+ uint8_t* const u_dst = buf->u + (size_t)(io->mb_y >> 1) * buf->u_stride;
+ uint8_t* const v_dst = buf->v + (size_t)(io->mb_y >> 1) * buf->v_stride;
const int mb_w = io->mb_w;
const int mb_h = io->mb_h;
const int uv_w = (mb_w + 1) / 2;
const int uv_h = (mb_h + 1) / 2;
- int j;
- for (j = 0; j < mb_h; ++j) {
- memcpy(y_dst + j * buf->y_stride, io->y + j * io->y_stride, mb_w);
- }
- for (j = 0; j < uv_h; ++j) {
- memcpy(u_dst + j * buf->u_stride, io->u + j * io->uv_stride, uv_w);
- memcpy(v_dst + j * buf->v_stride, io->v + j * io->uv_stride, uv_w);
- }
+ WebPCopyPlane(io->y, io->y_stride, y_dst, buf->y_stride, mb_w, mb_h);
+ WebPCopyPlane(io->u, io->uv_stride, u_dst, buf->u_stride, uv_w, uv_h);
+ WebPCopyPlane(io->v, io->uv_stride, v_dst, buf->v_stride, uv_w, uv_h);
return io->mb_h;
}
@@ -47,7 +42,7 @@ static int EmitYUV(const VP8Io* const io, WebPDecParams* const p) {
static int EmitSampledRGB(const VP8Io* const io, WebPDecParams* const p) {
WebPDecBuffer* const output = p->output;
WebPRGBABuffer* const buf = &output->u.RGBA;
- uint8_t* const dst = buf->rgba + io->mb_y * buf->stride;
+ uint8_t* const dst = buf->rgba + (size_t)io->mb_y * buf->stride;
WebPSamplerProcessPlane(io->y, io->y_stride,
io->u, io->v, io->uv_stride,
dst, buf->stride, io->mb_w, io->mb_h,
@@ -62,7 +57,7 @@ static int EmitSampledRGB(const VP8Io* const io, WebPDecParams* const p) {
static int EmitFancyRGB(const VP8Io* const io, WebPDecParams* const p) {
int num_lines_out = io->mb_h; // a priori guess
const WebPRGBABuffer* const buf = &p->output->u.RGBA;
- uint8_t* dst = buf->rgba + io->mb_y * buf->stride;
+ uint8_t* dst = buf->rgba + (size_t)io->mb_y * buf->stride;
WebPUpsampleLinePairFunc upsample = WebPUpsamplers[p->output->colorspace];
const uint8_t* cur_y = io->y;
const uint8_t* cur_u = io->u;
@@ -133,7 +128,7 @@ static int EmitAlphaYUV(const VP8Io* const io, WebPDecParams* const p,
const WebPYUVABuffer* const buf = &p->output->u.YUVA;
const int mb_w = io->mb_w;
const int mb_h = io->mb_h;
- uint8_t* dst = buf->a + io->mb_y * buf->a_stride;
+ uint8_t* dst = buf->a + (size_t)io->mb_y * buf->a_stride;
int j;
(void)expected_num_lines_out;
assert(expected_num_lines_out == mb_h);
@@ -186,7 +181,7 @@ static int EmitAlphaRGB(const VP8Io* const io, WebPDecParams* const p,
(colorspace == MODE_ARGB || colorspace == MODE_Argb);
const WebPRGBABuffer* const buf = &p->output->u.RGBA;
int num_rows;
- const int start_y = GetAlphaSourceRow(io, &alpha, &num_rows);
+ const size_t start_y = GetAlphaSourceRow(io, &alpha, &num_rows);
uint8_t* const base_rgba = buf->rgba + start_y * buf->stride;
uint8_t* const dst = base_rgba + (alpha_first ? 0 : 3);
const int has_alpha = WebPDispatchAlpha(alpha, io->width, mb_w,
@@ -210,7 +205,7 @@ static int EmitAlphaRGBA4444(const VP8Io* const io, WebPDecParams* const p,
const WEBP_CSP_MODE colorspace = p->output->colorspace;
const WebPRGBABuffer* const buf = &p->output->u.RGBA;
int num_rows;
- const int start_y = GetAlphaSourceRow(io, &alpha, &num_rows);
+ const size_t start_y = GetAlphaSourceRow(io, &alpha, &num_rows);
uint8_t* const base_rgba = buf->rgba + start_y * buf->stride;
#if (WEBP_SWAP_16BIT_CSP == 1)
uint8_t* alpha_dst = base_rgba;
@@ -276,9 +271,9 @@ static int EmitRescaledYUV(const VP8Io* const io, WebPDecParams* const p) {
static int EmitRescaledAlphaYUV(const VP8Io* const io, WebPDecParams* const p,
int expected_num_lines_out) {
const WebPYUVABuffer* const buf = &p->output->u.YUVA;
- uint8_t* const dst_a = buf->a + p->last_y * buf->a_stride;
+ uint8_t* const dst_a = buf->a + (size_t)p->last_y * buf->a_stride;
if (io->a != NULL) {
- uint8_t* const dst_y = buf->y + p->last_y * buf->y_stride;
+ uint8_t* const dst_y = buf->y + (size_t)p->last_y * buf->y_stride;
const int num_lines_out = Rescale(io->a, io->width, io->mb_h, p->scaler_a);
assert(expected_num_lines_out == num_lines_out);
if (num_lines_out > 0) { // unmultiply the Y
@@ -303,46 +298,57 @@ static int InitYUVRescaler(const VP8Io* const io, WebPDecParams* const p) {
const int uv_out_height = (out_height + 1) >> 1;
const int uv_in_width = (io->mb_w + 1) >> 1;
const int uv_in_height = (io->mb_h + 1) >> 1;
- const size_t work_size = 2 * out_width; // scratch memory for luma rescaler
+ // scratch memory for luma rescaler
+ const size_t work_size = 2 * (size_t)out_width;
const size_t uv_work_size = 2 * uv_out_width; // and for each u/v ones
- size_t tmp_size, rescaler_size;
+ uint64_t total_size;
+ size_t rescaler_size;
rescaler_t* work;
WebPRescaler* scalers;
const int num_rescalers = has_alpha ? 4 : 3;
- tmp_size = (work_size + 2 * uv_work_size) * sizeof(*work);
+ total_size = ((uint64_t)work_size + 2 * uv_work_size) * sizeof(*work);
if (has_alpha) {
- tmp_size += work_size * sizeof(*work);
+ total_size += (uint64_t)work_size * sizeof(*work);
}
rescaler_size = num_rescalers * sizeof(*p->scaler_y) + WEBP_ALIGN_CST;
+ total_size += rescaler_size;
+ if (!CheckSizeOverflow(total_size)) {
+ return 0;
+ }
- p->memory = WebPSafeMalloc(1ULL, tmp_size + rescaler_size);
+ p->memory = WebPSafeMalloc(1ULL, (size_t)total_size);
if (p->memory == NULL) {
return 0; // memory error
}
work = (rescaler_t*)p->memory;
- scalers = (WebPRescaler*)WEBP_ALIGN((const uint8_t*)work + tmp_size);
+ scalers = (WebPRescaler*)WEBP_ALIGN(
+ (const uint8_t*)work + total_size - rescaler_size);
p->scaler_y = &scalers[0];
p->scaler_u = &scalers[1];
p->scaler_v = &scalers[2];
p->scaler_a = has_alpha ? &scalers[3] : NULL;
- WebPRescalerInit(p->scaler_y, io->mb_w, io->mb_h,
- buf->y, out_width, out_height, buf->y_stride, 1,
- work);
- WebPRescalerInit(p->scaler_u, uv_in_width, uv_in_height,
- buf->u, uv_out_width, uv_out_height, buf->u_stride, 1,
- work + work_size);
- WebPRescalerInit(p->scaler_v, uv_in_width, uv_in_height,
- buf->v, uv_out_width, uv_out_height, buf->v_stride, 1,
- work + work_size + uv_work_size);
+ if (!WebPRescalerInit(p->scaler_y, io->mb_w, io->mb_h,
+ buf->y, out_width, out_height, buf->y_stride, 1,
+ work) ||
+ !WebPRescalerInit(p->scaler_u, uv_in_width, uv_in_height,
+ buf->u, uv_out_width, uv_out_height, buf->u_stride, 1,
+ work + work_size) ||
+ !WebPRescalerInit(p->scaler_v, uv_in_width, uv_in_height,
+ buf->v, uv_out_width, uv_out_height, buf->v_stride, 1,
+ work + work_size + uv_work_size)) {
+ return 0;
+ }
p->emit = EmitRescaledYUV;
if (has_alpha) {
- WebPRescalerInit(p->scaler_a, io->mb_w, io->mb_h,
- buf->a, out_width, out_height, buf->a_stride, 1,
- work + work_size + 2 * uv_work_size);
+ if (!WebPRescalerInit(p->scaler_a, io->mb_w, io->mb_h,
+ buf->a, out_width, out_height, buf->a_stride, 1,
+ work + work_size + 2 * uv_work_size)) {
+ return 0;
+ }
p->emit_alpha = EmitRescaledAlphaYUV;
WebPInitAlphaProcessing();
}
@@ -356,7 +362,7 @@ static int ExportRGB(WebPDecParams* const p, int y_pos) {
const WebPYUV444Converter convert =
WebPYUV444Converters[p->output->colorspace];
const WebPRGBABuffer* const buf = &p->output->u.RGBA;
- uint8_t* dst = buf->rgba + y_pos * buf->stride;
+ uint8_t* dst = buf->rgba + (size_t)y_pos * buf->stride;
int num_lines_out = 0;
// For RGB rescaling, because of the YUV420, current scan position
// U/V can be +1/-1 line from the Y one. Hence the double test.
@@ -383,15 +389,15 @@ static int EmitRescaledRGB(const VP8Io* const io, WebPDecParams* const p) {
while (j < mb_h) {
const int y_lines_in =
WebPRescalerImport(p->scaler_y, mb_h - j,
- io->y + j * io->y_stride, io->y_stride);
+ io->y + (size_t)j * io->y_stride, io->y_stride);
j += y_lines_in;
if (WebPRescaleNeededLines(p->scaler_u, uv_mb_h - uv_j)) {
- const int u_lines_in =
- WebPRescalerImport(p->scaler_u, uv_mb_h - uv_j,
- io->u + uv_j * io->uv_stride, io->uv_stride);
- const int v_lines_in =
- WebPRescalerImport(p->scaler_v, uv_mb_h - uv_j,
- io->v + uv_j * io->uv_stride, io->uv_stride);
+ const int u_lines_in = WebPRescalerImport(
+ p->scaler_u, uv_mb_h - uv_j, io->u + (size_t)uv_j * io->uv_stride,
+ io->uv_stride);
+ const int v_lines_in = WebPRescalerImport(
+ p->scaler_v, uv_mb_h - uv_j, io->v + (size_t)uv_j * io->uv_stride,
+ io->uv_stride);
(void)v_lines_in; // remove a gcc warning
assert(u_lines_in == v_lines_in);
uv_j += u_lines_in;
@@ -403,7 +409,7 @@ static int EmitRescaledRGB(const VP8Io* const io, WebPDecParams* const p) {
static int ExportAlpha(WebPDecParams* const p, int y_pos, int max_lines_out) {
const WebPRGBABuffer* const buf = &p->output->u.RGBA;
- uint8_t* const base_rgba = buf->rgba + y_pos * buf->stride;
+ uint8_t* const base_rgba = buf->rgba + (size_t)y_pos * buf->stride;
const WEBP_CSP_MODE colorspace = p->output->colorspace;
const int alpha_first =
(colorspace == MODE_ARGB || colorspace == MODE_Argb);
@@ -431,7 +437,7 @@ static int ExportAlpha(WebPDecParams* const p, int y_pos, int max_lines_out) {
static int ExportAlphaRGBA4444(WebPDecParams* const p, int y_pos,
int max_lines_out) {
const WebPRGBABuffer* const buf = &p->output->u.RGBA;
- uint8_t* const base_rgba = buf->rgba + y_pos * buf->stride;
+ uint8_t* const base_rgba = buf->rgba + (size_t)y_pos * buf->stride;
#if (WEBP_SWAP_16BIT_CSP == 1)
uint8_t* alpha_dst = base_rgba;
#else
@@ -470,7 +476,7 @@ static int EmitRescaledAlphaRGB(const VP8Io* const io, WebPDecParams* const p,
int lines_left = expected_num_out_lines;
const int y_end = p->last_y + lines_left;
while (lines_left > 0) {
- const int row_offset = scaler->src_y - io->mb_y;
+ const int64_t row_offset = (int64_t)scaler->src_y - io->mb_y;
WebPRescalerImport(scaler, io->mb_h + io->mb_y - scaler->src_y,
io->a + row_offset * io->width, io->width);
lines_left -= p->emit_alpha_row(p, y_end - lines_left, lines_left);
@@ -485,51 +491,58 @@ static int InitRGBRescaler(const VP8Io* const io, WebPDecParams* const p) {
const int out_height = io->scaled_height;
const int uv_in_width = (io->mb_w + 1) >> 1;
const int uv_in_height = (io->mb_h + 1) >> 1;
- const size_t work_size = 2 * out_width; // scratch memory for one rescaler
+ // scratch memory for one rescaler
+ const size_t work_size = 2 * (size_t)out_width;
rescaler_t* work; // rescalers work area
uint8_t* tmp; // tmp storage for scaled YUV444 samples before RGB conversion
- size_t tmp_size1, tmp_size2, total_size, rescaler_size;
+ uint64_t tmp_size1, tmp_size2, total_size;
+ size_t rescaler_size;
WebPRescaler* scalers;
const int num_rescalers = has_alpha ? 4 : 3;
- tmp_size1 = 3 * work_size;
- tmp_size2 = 3 * out_width;
- if (has_alpha) {
- tmp_size1 += work_size;
- tmp_size2 += out_width;
- }
+ tmp_size1 = (uint64_t)num_rescalers * work_size;
+ tmp_size2 = (uint64_t)num_rescalers * out_width;
total_size = tmp_size1 * sizeof(*work) + tmp_size2 * sizeof(*tmp);
rescaler_size = num_rescalers * sizeof(*p->scaler_y) + WEBP_ALIGN_CST;
+ total_size += rescaler_size;
+ if (!CheckSizeOverflow(total_size)) {
+ return 0;
+ }
- p->memory = WebPSafeMalloc(1ULL, total_size + rescaler_size);
+ p->memory = WebPSafeMalloc(1ULL, (size_t)total_size);
if (p->memory == NULL) {
return 0; // memory error
}
work = (rescaler_t*)p->memory;
tmp = (uint8_t*)(work + tmp_size1);
- scalers = (WebPRescaler*)WEBP_ALIGN((const uint8_t*)work + total_size);
+ scalers = (WebPRescaler*)WEBP_ALIGN(
+ (const uint8_t*)work + total_size - rescaler_size);
p->scaler_y = &scalers[0];
p->scaler_u = &scalers[1];
p->scaler_v = &scalers[2];
p->scaler_a = has_alpha ? &scalers[3] : NULL;
- WebPRescalerInit(p->scaler_y, io->mb_w, io->mb_h,
- tmp + 0 * out_width, out_width, out_height, 0, 1,
- work + 0 * work_size);
- WebPRescalerInit(p->scaler_u, uv_in_width, uv_in_height,
- tmp + 1 * out_width, out_width, out_height, 0, 1,
- work + 1 * work_size);
- WebPRescalerInit(p->scaler_v, uv_in_width, uv_in_height,
- tmp + 2 * out_width, out_width, out_height, 0, 1,
- work + 2 * work_size);
+ if (!WebPRescalerInit(p->scaler_y, io->mb_w, io->mb_h,
+ tmp + 0 * out_width, out_width, out_height, 0, 1,
+ work + 0 * work_size) ||
+ !WebPRescalerInit(p->scaler_u, uv_in_width, uv_in_height,
+ tmp + 1 * out_width, out_width, out_height, 0, 1,
+ work + 1 * work_size) ||
+ !WebPRescalerInit(p->scaler_v, uv_in_width, uv_in_height,
+ tmp + 2 * out_width, out_width, out_height, 0, 1,
+ work + 2 * work_size)) {
+ return 0;
+ }
p->emit = EmitRescaledRGB;
WebPInitYUV444Converters();
if (has_alpha) {
- WebPRescalerInit(p->scaler_a, io->mb_w, io->mb_h,
- tmp + 3 * out_width, out_width, out_height, 0, 1,
- work + 3 * work_size);
+ if (!WebPRescalerInit(p->scaler_a, io->mb_w, io->mb_h,
+ tmp + 3 * out_width, out_width, out_height, 0, 1,
+ work + 3 * work_size)) {
+ return 0;
+ }
p->emit_alpha = EmitRescaledAlphaRGB;
if (p->output->colorspace == MODE_RGBA_4444 ||
p->output->colorspace == MODE_rgbA_4444) {
diff --git a/src/3rdparty/libwebp/src/dec/vp8_dec.c b/src/3rdparty/libwebp/src/dec/vp8_dec.c
index 57efb69..2003935 100644
--- a/src/3rdparty/libwebp/src/dec/vp8_dec.c
+++ b/src/3rdparty/libwebp/src/dec/vp8_dec.c
@@ -335,7 +335,7 @@ int VP8GetHeaders(VP8Decoder* const dec, VP8Io* const io) {
io->scaled_width = io->width;
io->scaled_height = io->height;
- io->mb_w = io->width; // sanity check
+ io->mb_w = io->width; // for soundness
io->mb_h = io->height; // ditto
VP8ResetProba(&dec->proba_);
@@ -403,7 +403,7 @@ static const uint8_t kZigzag[16] = {
0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
};
-// See section 13-2: http://tools.ietf.org/html/rfc6386#section-13.2
+// See section 13-2: https://datatracker.ietf.org/doc/html/rfc6386#section-13.2
static int GetLargeValue(VP8BitReader* const br, const uint8_t* const p) {
int v;
if (!VP8GetBit(br, p[3], "coeffs")) {
@@ -494,13 +494,11 @@ static int GetCoeffsAlt(VP8BitReader* const br,
return 16;
}
-static WEBP_TSAN_IGNORE_FUNCTION void InitGetCoeffs(void) {
- if (GetCoeffs == NULL) {
- if (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kSlowSSSE3)) {
- GetCoeffs = GetCoeffsAlt;
- } else {
- GetCoeffs = GetCoeffsFast;
- }
+WEBP_DSP_INIT_FUNC(InitGetCoeffs) {
+ if (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kSlowSSSE3)) {
+ GetCoeffs = GetCoeffsAlt;
+ } else {
+ GetCoeffs = GetCoeffsFast;
}
}
diff --git a/src/3rdparty/libwebp/src/dec/vp8i_dec.h b/src/3rdparty/libwebp/src/dec/vp8i_dec.h
index 3de8d86..83791ec 100644
--- a/src/3rdparty/libwebp/src/dec/vp8i_dec.h
+++ b/src/3rdparty/libwebp/src/dec/vp8i_dec.h
@@ -31,8 +31,8 @@ extern "C" {
// version numbers
#define DEC_MAJ_VERSION 1
-#define DEC_MIN_VERSION 0
-#define DEC_REV_VERSION 3
+#define DEC_MIN_VERSION 3
+#define DEC_REV_VERSION 0
// YUV-cache parameters. Cache is 32-bytes wide (= one cacheline).
// Constraints are: We need to store one 16x16 block of luma samples (y),
diff --git a/src/3rdparty/libwebp/src/dec/vp8l_dec.c b/src/3rdparty/libwebp/src/dec/vp8l_dec.c
index d3e2711..c0ea018 100644
--- a/src/3rdparty/libwebp/src/dec/vp8l_dec.c
+++ b/src/3rdparty/libwebp/src/dec/vp8l_dec.c
@@ -84,7 +84,7 @@ static const uint8_t kCodeToPlane[CODE_TO_PLANE_CODES] = {
// to 256 (green component values) + 24 (length prefix values)
// + color_cache_size (between 0 and 2048).
// All values computed for 8-bit first level lookup with Mark Adler's tool:
-// http://www.hdfgroup.org/ftp/lib-external/zlib/zlib-1.2.5/examples/enough.c
+// https://github.com/madler/zlib/blob/v1.2.5/examples/enough.c
#define FIXED_TABLE_SIZE (630 * 3 + 410)
static const uint16_t kTableSize[12] = {
FIXED_TABLE_SIZE + 654,
@@ -178,7 +178,7 @@ static WEBP_INLINE int PlaneCodeToDistance(int xsize, int plane_code) {
//------------------------------------------------------------------------------
// Decodes the next Huffman code from bit-stream.
-// FillBitWindow(br) needs to be called at minimum every second call
+// VP8LFillBitWindow(br) needs to be called at minimum every second call
// to ReadSymbol, in order to pre-fetch enough bits.
static WEBP_INLINE int ReadSymbol(const HuffmanCode* table,
VP8LBitReader* const br) {
@@ -321,7 +321,7 @@ static int ReadHuffmanCode(int alphabet_size, VP8LDecoder* const dec,
// The first code is either 1 bit or 8 bit code.
int symbol = VP8LReadBits(br, (first_symbol_len_code == 0) ? 1 : 8);
code_lengths[symbol] = 1;
- // The second code (if present), is always 8 bit long.
+ // The second code (if present), is always 8 bits long.
if (num_symbols == 2) {
symbol = VP8LReadBits(br, 8);
code_lengths[symbol] = 1;
@@ -559,8 +559,11 @@ static int AllocateAndInitRescaler(VP8LDecoder* const dec, VP8Io* const io) {
memory += work_size * sizeof(*work);
scaled_data = (uint32_t*)memory;
- WebPRescalerInit(dec->rescaler, in_width, in_height, (uint8_t*)scaled_data,
- out_width, out_height, 0, num_channels, work);
+ if (!WebPRescalerInit(dec->rescaler, in_width, in_height,
+ (uint8_t*)scaled_data, out_width, out_height,
+ 0, num_channels, work)) {
+ return 0;
+ }
return 1;
}
#endif // WEBP_REDUCE_SIZE
@@ -574,13 +577,14 @@ static int AllocateAndInitRescaler(VP8LDecoder* const dec, VP8Io* const io) {
static int Export(WebPRescaler* const rescaler, WEBP_CSP_MODE colorspace,
int rgba_stride, uint8_t* const rgba) {
uint32_t* const src = (uint32_t*)rescaler->dst;
+ uint8_t* dst = rgba;
const int dst_width = rescaler->dst_width;
int num_lines_out = 0;
while (WebPRescalerHasPendingOutput(rescaler)) {
- uint8_t* const dst = rgba + num_lines_out * rgba_stride;
WebPRescalerExportRow(rescaler);
WebPMultARGBRow(src, dst_width, 1);
VP8LConvertFromBGRA(src, dst_width, colorspace, dst);
+ dst += rgba_stride;
++num_lines_out;
}
return num_lines_out;
@@ -594,8 +598,8 @@ static int EmitRescaledRowsRGBA(const VP8LDecoder* const dec,
int num_lines_in = 0;
int num_lines_out = 0;
while (num_lines_in < mb_h) {
- uint8_t* const row_in = in + num_lines_in * in_stride;
- uint8_t* const row_out = out + num_lines_out * out_stride;
+ uint8_t* const row_in = in + (uint64_t)num_lines_in * in_stride;
+ uint8_t* const row_out = out + (uint64_t)num_lines_out * out_stride;
const int lines_left = mb_h - num_lines_in;
const int needed_lines = WebPRescaleNeededLines(dec->rescaler, lines_left);
int lines_imported;
@@ -754,11 +758,11 @@ static WEBP_INLINE HTreeGroup* GetHtreeGroupForPos(VP8LMetadata* const hdr,
typedef void (*ProcessRowsFunc)(VP8LDecoder* const dec, int row);
-static void ApplyInverseTransforms(VP8LDecoder* const dec, int num_rows,
+static void ApplyInverseTransforms(VP8LDecoder* const dec,
+ int start_row, int num_rows,
const uint32_t* const rows) {
int n = dec->next_transform_;
const int cache_pixs = dec->width_ * num_rows;
- const int start_row = dec->last_row_;
const int end_row = start_row + num_rows;
const uint32_t* rows_in = rows;
uint32_t* const rows_out = dec->argb_cache_;
@@ -789,15 +793,15 @@ static void ProcessRows(VP8LDecoder* const dec, int row) {
VP8Io* const io = dec->io_;
uint8_t* rows_data = (uint8_t*)dec->argb_cache_;
const int in_stride = io->width * sizeof(uint32_t); // in unit of RGBA
-
- ApplyInverseTransforms(dec, num_rows, rows);
+ ApplyInverseTransforms(dec, dec->last_row_, num_rows, rows);
if (!SetCropWindow(io, dec->last_row_, row, &rows_data, in_stride)) {
// Nothing to output (this time).
} else {
const WebPDecBuffer* const output = dec->output_;
if (WebPIsRGBMode(output->colorspace)) { // convert to RGBA
const WebPRGBABuffer* const buf = &output->u.RGBA;
- uint8_t* const rgba = buf->rgba + dec->last_out_row_ * buf->stride;
+ uint8_t* const rgba =
+ buf->rgba + (int64_t)dec->last_out_row_ * buf->stride;
const int num_rows_out =
#if !defined(WEBP_REDUCE_SIZE)
io->use_scaling ?
@@ -948,7 +952,6 @@ static WEBP_INLINE void CopyBlock8b(uint8_t* const dst, int dist, int length) {
break;
default:
goto Copy;
- break;
}
CopySmallPattern8b(src, dst, length, pattern);
return;
@@ -1193,6 +1196,7 @@ static int DecodeImageData(VP8LDecoder* const dec, uint32_t* const data,
VP8LFillBitWindow(br);
dist_code = GetCopyDistance(dist_symbol, br);
dist = PlaneCodeToDistance(width, dist_code);
+
if (VP8LIsEndOfStream(br)) break;
if (src - data < (ptrdiff_t)dist || src_end - src < (ptrdiff_t)length) {
goto Error;
@@ -1277,7 +1281,7 @@ static int ExpandColorMap(int num_colors, VP8LTransform* const transform) {
uint8_t* const new_data = (uint8_t*)new_color_map;
new_color_map[0] = transform->data_[0];
for (i = 4; i < 4 * num_colors; ++i) {
- // Equivalent to AddPixelEq(), on a byte-basis.
+ // Equivalent to VP8LAddPixels(), on a byte-basis.
new_data[i] = (data[i] + new_data[i - 4]) & 0xff;
}
for (; i < 4 * final_num_colors; ++i) {
@@ -1332,7 +1336,7 @@ static int ReadTransform(int* const xsize, int const* ysize,
ok = ok && ExpandColorMap(num_colors, transform);
break;
}
- case SUBTRACT_GREEN:
+ case SUBTRACT_GREEN_TRANSFORM:
break;
default:
assert(0); // can't happen
@@ -1515,7 +1519,7 @@ static int AllocateInternalBuffers32b(VP8LDecoder* const dec, int final_width) {
assert(dec->width_ <= final_width);
dec->pixels_ = (uint32_t*)WebPSafeMalloc(total_num_pixels, sizeof(uint32_t));
if (dec->pixels_ == NULL) {
- dec->argb_cache_ = NULL; // for sanity check
+ dec->argb_cache_ = NULL; // for soundness
dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
return 0;
}
@@ -1525,7 +1529,7 @@ static int AllocateInternalBuffers32b(VP8LDecoder* const dec, int final_width) {
static int AllocateInternalBuffers8b(VP8LDecoder* const dec) {
const uint64_t total_num_pixels = (uint64_t)dec->width_ * dec->height_;
- dec->argb_cache_ = NULL; // for sanity check
+ dec->argb_cache_ = NULL; // for soundness
dec->pixels_ = (uint32_t*)WebPSafeMalloc(total_num_pixels, sizeof(uint8_t));
if (dec->pixels_ == NULL) {
dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
@@ -1553,7 +1557,7 @@ static void ExtractAlphaRows(VP8LDecoder* const dec, int last_row) {
const int cache_pixs = width * num_rows_to_process;
uint8_t* const dst = output + width * cur_row;
const uint32_t* const src = dec->argb_cache_;
- ApplyInverseTransforms(dec, num_rows_to_process, in);
+ ApplyInverseTransforms(dec, cur_row, num_rows_to_process, in);
WebPExtractGreen(src, dst, cache_pixs);
AlphaApplyFilter(alph_dec,
cur_row, cur_row + num_rows_to_process, dst, width);
@@ -1667,7 +1671,6 @@ int VP8LDecodeImage(VP8LDecoder* const dec) {
VP8Io* io = NULL;
WebPDecParams* params = NULL;
- // Sanity checks.
if (dec == NULL) return 0;
assert(dec->hdr_.huffman_tables_ != NULL);
diff --git a/src/3rdparty/libwebp/src/dec/vp8li_dec.h b/src/3rdparty/libwebp/src/dec/vp8li_dec.h
index 0a4d613..72b2e86 100644
--- a/src/3rdparty/libwebp/src/dec/vp8li_dec.h
+++ b/src/3rdparty/libwebp/src/dec/vp8li_dec.h
@@ -37,7 +37,7 @@ struct VP8LTransform {
int bits_; // subsampling bits defining transform window.
int xsize_; // transform window X index.
int ysize_; // transform window Y index.
- uint32_t *data_; // transform data.
+ uint32_t* data_; // transform data.
};
typedef struct {
@@ -48,23 +48,23 @@ typedef struct {
int huffman_mask_;
int huffman_subsample_bits_;
int huffman_xsize_;
- uint32_t *huffman_image_;
+ uint32_t* huffman_image_;
int num_htree_groups_;
- HTreeGroup *htree_groups_;
- HuffmanCode *huffman_tables_;
+ HTreeGroup* htree_groups_;
+ HuffmanCode* huffman_tables_;
} VP8LMetadata;
typedef struct VP8LDecoder VP8LDecoder;
struct VP8LDecoder {
VP8StatusCode status_;
VP8LDecodeState state_;
- VP8Io *io_;
+ VP8Io* io_;
- const WebPDecBuffer *output_; // shortcut to io->opaque->output
+ const WebPDecBuffer* output_; // shortcut to io->opaque->output
- uint32_t *pixels_; // Internal data: either uint8_t* for alpha
+ uint32_t* pixels_; // Internal data: either uint8_t* for alpha
// or uint32_t* for BGRA.
- uint32_t *argb_cache_; // Scratch buffer for temporary BGRA storage.
+ uint32_t* argb_cache_; // Scratch buffer for temporary BGRA storage.
VP8LBitReader br_;
int incremental_; // if true, incremental decoding is expected
@@ -86,8 +86,8 @@ struct VP8LDecoder {
// or'd bitset storing the transforms types.
uint32_t transforms_seen_;
- uint8_t *rescaler_memory; // Working memory for rescaling work.
- WebPRescaler *rescaler; // Common rescaler for all channels.
+ uint8_t* rescaler_memory; // Working memory for rescaling work.
+ WebPRescaler* rescaler; // Common rescaler for all channels.
};
//------------------------------------------------------------------------------
diff --git a/src/3rdparty/libwebp/src/dec/webp_dec.c b/src/3rdparty/libwebp/src/dec/webp_dec.c
index 42d0988..3f4f7bb 100644
--- a/src/3rdparty/libwebp/src/dec/webp_dec.c
+++ b/src/3rdparty/libwebp/src/dec/webp_dec.c
@@ -179,7 +179,7 @@ static VP8StatusCode ParseOptionalChunks(const uint8_t** const data,
return VP8_STATUS_BITSTREAM_ERROR; // Not a valid chunk size.
}
// For odd-sized chunk-payload, there's one byte padding at the end.
- disk_chunk_size = (CHUNK_HEADER_SIZE + chunk_size + 1) & ~1;
+ disk_chunk_size = (CHUNK_HEADER_SIZE + chunk_size + 1) & ~1u;
total_size += disk_chunk_size;
// Check that total bytes skipped so far does not exceed riff_size.
@@ -785,6 +785,13 @@ VP8StatusCode WebPDecode(const uint8_t* data, size_t data_size,
//------------------------------------------------------------------------------
// Cropping and rescaling.
+int WebPCheckCropDimensions(int image_width, int image_height,
+ int x, int y, int w, int h) {
+ return !(x < 0 || y < 0 || w <= 0 || h <= 0 ||
+ x >= image_width || w > image_width || w > image_width - x ||
+ y >= image_height || h > image_height || h > image_height - y);
+}
+
int WebPIoInitFromOptions(const WebPDecoderOptions* const options,
VP8Io* const io, WEBP_CSP_MODE src_colorspace) {
const int W = io->width;
@@ -792,7 +799,7 @@ int WebPIoInitFromOptions(const WebPDecoderOptions* const options,
int x = 0, y = 0, w = W, h = H;
// Cropping
- io->use_cropping = (options != NULL) && (options->use_cropping > 0);
+ io->use_cropping = (options != NULL) && options->use_cropping;
if (io->use_cropping) {
w = options->crop_width;
h = options->crop_height;
@@ -802,7 +809,7 @@ int WebPIoInitFromOptions(const WebPDecoderOptions* const options,
x &= ~1;
y &= ~1;
}
- if (x < 0 || y < 0 || w <= 0 || h <= 0 || x + w > W || y + h > H) {
+ if (!WebPCheckCropDimensions(W, H, x, y, w, h)) {
return 0; // out of frame boundary error
}
}
@@ -814,7 +821,7 @@ int WebPIoInitFromOptions(const WebPDecoderOptions* const options,
io->mb_h = h;
// Scaling
- io->use_scaling = (options != NULL) && (options->use_scaling > 0);
+ io->use_scaling = (options != NULL) && options->use_scaling;
if (io->use_scaling) {
int scaled_width = options->scaled_width;
int scaled_height = options->scaled_height;
@@ -835,8 +842,8 @@ int WebPIoInitFromOptions(const WebPDecoderOptions* const options,
if (io->use_scaling) {
// disable filter (only for large downscaling ratio).
- io->bypass_filtering = (io->scaled_width < W * 3 / 4) &&
- (io->scaled_height < H * 3 / 4);
+ io->bypass_filtering |= (io->scaled_width < W * 3 / 4) &&
+ (io->scaled_height < H * 3 / 4);
io->fancy_upsampling = 0;
}
return 1;
diff --git a/src/3rdparty/libwebp/src/dec/webpi_dec.h b/src/3rdparty/libwebp/src/dec/webpi_dec.h
index 24baff5..3b97388 100644
--- a/src/3rdparty/libwebp/src/dec/webpi_dec.h
+++ b/src/3rdparty/libwebp/src/dec/webpi_dec.h
@@ -77,6 +77,10 @@ VP8StatusCode WebPParseHeaders(WebPHeaderStructure* const headers);
//------------------------------------------------------------------------------
// Misc utils
+// Returns true if crop dimensions are within image bounds.
+int WebPCheckCropDimensions(int image_width, int image_height,
+ int x, int y, int w, int h);
+
// Initializes VP8Io with custom setup, io and teardown functions. The default
// hooks will use the supplied 'params' as io->opaque handle.
void WebPInitCustomIo(WebPDecParams* const params, VP8Io* const io);
diff --git a/src/3rdparty/libwebp/src/demux/anim_decode.c b/src/3rdparty/libwebp/src/demux/anim_decode.c
index 05dd707..e077ffb 100644
--- a/src/3rdparty/libwebp/src/demux/anim_decode.c
+++ b/src/3rdparty/libwebp/src/demux/anim_decode.c
@@ -23,6 +23,14 @@
#define NUM_CHANNELS 4
+// Channel extraction from a uint32_t representation of a uint8_t RGBA/BGRA
+// buffer.
+#ifdef WORDS_BIGENDIAN
+#define CHANNEL_SHIFT(i) (24 - (i) * 8)
+#else
+#define CHANNEL_SHIFT(i) ((i) * 8)
+#endif
+
typedef void (*BlendRowFunc)(uint32_t* const, const uint32_t* const, int);
static void BlendPixelRowNonPremult(uint32_t* const src,
const uint32_t* const dst, int num_pixels);
@@ -87,11 +95,19 @@ WebPAnimDecoder* WebPAnimDecoderNewInternal(
int abi_version) {
WebPAnimDecoderOptions options;
WebPAnimDecoder* dec = NULL;
+ WebPBitstreamFeatures features;
if (webp_data == NULL ||
WEBP_ABI_IS_INCOMPATIBLE(abi_version, WEBP_DEMUX_ABI_VERSION)) {
return NULL;
}
+ // Validate the bitstream before doing expensive allocations. The demuxer may
+ // be more tolerant than the decoder.
+ if (WebPGetFeatures(webp_data->bytes, webp_data->size, &features) !=
+ VP8_STATUS_OK) {
+ return NULL;
+ }
+
// Note: calloc() so that the pointer members are initialized to NULL.
dec = (WebPAnimDecoder*)WebPSafeCalloc(1ULL, sizeof(*dec));
if (dec == NULL) goto Error;
@@ -145,7 +161,7 @@ static int ZeroFillCanvas(uint8_t* buf, uint32_t canvas_width,
uint32_t canvas_height) {
const uint64_t size =
(uint64_t)canvas_width * canvas_height * NUM_CHANNELS * sizeof(*buf);
- if (size != (size_t)size) return 0;
+ if (!CheckSizeOverflow(size)) return 0;
memset(buf, 0, (size_t)size);
return 1;
}
@@ -166,7 +182,7 @@ static void ZeroFillFrameRect(uint8_t* buf, int buf_stride, int x_offset,
static int CopyCanvas(const uint8_t* src, uint8_t* dst,
uint32_t width, uint32_t height) {
const uint64_t size = (uint64_t)width * height * NUM_CHANNELS;
- if (size != (size_t)size) return 0;
+ if (!CheckSizeOverflow(size)) return 0;
assert(src != NULL && dst != NULL);
memcpy(dst, src, (size_t)size);
return 1;
@@ -201,35 +217,35 @@ static uint8_t BlendChannelNonPremult(uint32_t src, uint8_t src_a,
const uint8_t dst_channel = (dst >> shift) & 0xff;
const uint32_t blend_unscaled = src_channel * src_a + dst_channel * dst_a;
assert(blend_unscaled < (1ULL << 32) / scale);
- return (blend_unscaled * scale) >> 24;
+ return (blend_unscaled * scale) >> CHANNEL_SHIFT(3);
}
// Blend 'src' over 'dst' assuming they are NOT pre-multiplied by alpha.
static uint32_t BlendPixelNonPremult(uint32_t src, uint32_t dst) {
- const uint8_t src_a = (src >> 24) & 0xff;
+ const uint8_t src_a = (src >> CHANNEL_SHIFT(3)) & 0xff;
if (src_a == 0) {
return dst;
} else {
- const uint8_t dst_a = (dst >> 24) & 0xff;
+ const uint8_t dst_a = (dst >> CHANNEL_SHIFT(3)) & 0xff;
// This is the approximate integer arithmetic for the actual formula:
// dst_factor_a = (dst_a * (255 - src_a)) / 255.
const uint8_t dst_factor_a = (dst_a * (256 - src_a)) >> 8;
const uint8_t blend_a = src_a + dst_factor_a;
const uint32_t scale = (1UL << 24) / blend_a;
- const uint8_t blend_r =
- BlendChannelNonPremult(src, src_a, dst, dst_factor_a, scale, 0);
- const uint8_t blend_g =
- BlendChannelNonPremult(src, src_a, dst, dst_factor_a, scale, 8);
- const uint8_t blend_b =
- BlendChannelNonPremult(src, src_a, dst, dst_factor_a, scale, 16);
+ const uint8_t blend_r = BlendChannelNonPremult(
+ src, src_a, dst, dst_factor_a, scale, CHANNEL_SHIFT(0));
+ const uint8_t blend_g = BlendChannelNonPremult(
+ src, src_a, dst, dst_factor_a, scale, CHANNEL_SHIFT(1));
+ const uint8_t blend_b = BlendChannelNonPremult(
+ src, src_a, dst, dst_factor_a, scale, CHANNEL_SHIFT(2));
assert(src_a + dst_factor_a < 256);
- return (blend_r << 0) |
- (blend_g << 8) |
- (blend_b << 16) |
- ((uint32_t)blend_a << 24);
+ return ((uint32_t)blend_r << CHANNEL_SHIFT(0)) |
+ ((uint32_t)blend_g << CHANNEL_SHIFT(1)) |
+ ((uint32_t)blend_b << CHANNEL_SHIFT(2)) |
+ ((uint32_t)blend_a << CHANNEL_SHIFT(3));
}
}
@@ -239,7 +255,7 @@ static void BlendPixelRowNonPremult(uint32_t* const src,
const uint32_t* const dst, int num_pixels) {
int i;
for (i = 0; i < num_pixels; ++i) {
- const uint8_t src_alpha = (src[i] >> 24) & 0xff;
+ const uint8_t src_alpha = (src[i] >> CHANNEL_SHIFT(3)) & 0xff;
if (src_alpha != 0xff) {
src[i] = BlendPixelNonPremult(src[i], dst[i]);
}
@@ -256,7 +272,7 @@ static WEBP_INLINE uint32_t ChannelwiseMultiply(uint32_t pix, uint32_t scale) {
// Blend 'src' over 'dst' assuming they are pre-multiplied by alpha.
static uint32_t BlendPixelPremult(uint32_t src, uint32_t dst) {
- const uint8_t src_a = (src >> 24) & 0xff;
+ const uint8_t src_a = (src >> CHANNEL_SHIFT(3)) & 0xff;
return src + ChannelwiseMultiply(dst, 256 - src_a);
}
@@ -266,7 +282,7 @@ static void BlendPixelRowPremult(uint32_t* const src, const uint32_t* const dst,
int num_pixels) {
int i;
for (i = 0; i < num_pixels; ++i) {
- const uint8_t src_alpha = (src[i] >> 24) & 0xff;
+ const uint8_t src_alpha = (src[i] >> CHANNEL_SHIFT(3)) & 0xff;
if (src_alpha != 0xff) {
src[i] = BlendPixelPremult(src[i], dst[i]);
}
@@ -346,12 +362,15 @@ int WebPAnimDecoderGetNext(WebPAnimDecoder* dec,
{
const uint8_t* in = iter.fragment.bytes;
const size_t in_size = iter.fragment.size;
- const size_t out_offset =
- (iter.y_offset * width + iter.x_offset) * NUM_CHANNELS;
+ const uint32_t stride = width * NUM_CHANNELS; // at most 25 + 2 bits
+ const uint64_t out_offset = (uint64_t)iter.y_offset * stride +
+ (uint64_t)iter.x_offset * NUM_CHANNELS; // 53b
+ const uint64_t size = (uint64_t)iter.height * stride; // at most 25 + 27b
WebPDecoderConfig* const config = &dec->config_;
WebPRGBABuffer* const buf = &config->output.u.RGBA;
- buf->stride = NUM_CHANNELS * width;
- buf->size = buf->stride * iter.height;
+ if ((size_t)size != size) goto Error;
+ buf->stride = (int)stride;
+ buf->size = (size_t)size;
buf->rgba = dec->curr_frame_ + out_offset;
if (WebPDecode(in, in_size, config) != VP8_STATUS_OK) {
diff --git a/src/3rdparty/libwebp/src/demux/demux.c b/src/3rdparty/libwebp/src/demux/demux.c
index ab6433e..324e5eb 100644
--- a/src/3rdparty/libwebp/src/demux/demux.c
+++ b/src/3rdparty/libwebp/src/demux/demux.c
@@ -24,8 +24,8 @@
#include "src/webp/format_constants.h"
#define DMUX_MAJ_VERSION 1
-#define DMUX_MIN_VERSION 0
-#define DMUX_REV_VERSION 3
+#define DMUX_MIN_VERSION 3
+#define DMUX_REV_VERSION 0
typedef struct {
size_t start_; // start location of the data
@@ -221,12 +221,16 @@ static ParseStatus StoreFrame(int frame_num, uint32_t min_size,
const size_t chunk_start_offset = mem->start_;
const uint32_t fourcc = ReadLE32(mem);
const uint32_t payload_size = ReadLE32(mem);
- const uint32_t payload_size_padded = payload_size + (payload_size & 1);
- const size_t payload_available = (payload_size_padded > MemDataSize(mem))
- ? MemDataSize(mem) : payload_size_padded;
- const size_t chunk_size = CHUNK_HEADER_SIZE + payload_available;
+ uint32_t payload_size_padded;
+ size_t payload_available;
+ size_t chunk_size;
if (payload_size > MAX_CHUNK_PAYLOAD) return PARSE_ERROR;
+
+ payload_size_padded = payload_size + (payload_size & 1);
+ payload_available = (payload_size_padded > MemDataSize(mem))
+ ? MemDataSize(mem) : payload_size_padded;
+ chunk_size = CHUNK_HEADER_SIZE + payload_available;
if (SizeIsInvalid(mem, payload_size_padded)) return PARSE_ERROR;
if (payload_size_padded > MemDataSize(mem)) status = PARSE_NEED_MORE_DATA;
@@ -312,6 +316,7 @@ static ParseStatus ParseAnimationFrame(
int bits;
MemBuffer* const mem = &dmux->mem_;
Frame* frame;
+ size_t start_offset;
ParseStatus status =
NewFrame(mem, ANMF_CHUNK_SIZE, frame_chunk_size, &frame);
if (status != PARSE_OK) return status;
@@ -332,7 +337,11 @@ static ParseStatus ParseAnimationFrame(
// Store a frame only if the animation flag is set there is some data for
// this frame is available.
+ start_offset = mem->start_;
status = StoreFrame(dmux->num_frames_ + 1, anmf_payload_size, mem, frame);
+ if (status != PARSE_ERROR && mem->start_ - start_offset > anmf_payload_size) {
+ status = PARSE_ERROR;
+ }
if (status != PARSE_ERROR && is_animation && frame->frame_num_ > 0) {
added_frame = AddFrame(dmux, frame);
if (added_frame) {
@@ -446,9 +455,11 @@ static ParseStatus ParseVP8XChunks(WebPDemuxer* const dmux) {
const size_t chunk_start_offset = mem->start_;
const uint32_t fourcc = ReadLE32(mem);
const uint32_t chunk_size = ReadLE32(mem);
- const uint32_t chunk_size_padded = chunk_size + (chunk_size & 1);
+ uint32_t chunk_size_padded;
if (chunk_size > MAX_CHUNK_PAYLOAD) return PARSE_ERROR;
+
+ chunk_size_padded = chunk_size + (chunk_size & 1);
if (SizeIsInvalid(mem, chunk_size_padded)) return PARSE_ERROR;
switch (fourcc) {
@@ -603,7 +614,6 @@ static int IsValidExtendedFormat(const WebPDemuxer* const dmux) {
while (f != NULL) {
const int cur_frame_set = f->frame_num_;
- int frame_count = 0;
// Check frame properties.
for (; f != NULL && f->frame_num_ == cur_frame_set; f = f->next_) {
@@ -638,8 +648,6 @@ static int IsValidExtendedFormat(const WebPDemuxer* const dmux) {
dmux->canvas_width_, dmux->canvas_height_)) {
return 0;
}
-
- ++frame_count;
}
}
return 1;
diff --git a/src/3rdparty/libwebp/src/dsp/alpha_processing.c b/src/3rdparty/libwebp/src/dsp/alpha_processing.c
index 819d139..1892929 100644
--- a/src/3rdparty/libwebp/src/dsp/alpha_processing.c
+++ b/src/3rdparty/libwebp/src/dsp/alpha_processing.c
@@ -157,7 +157,8 @@ void WebPMultARGBRow_C(uint32_t* const ptr, int width, int inverse) {
}
}
-void WebPMultRow_C(uint8_t* const ptr, const uint8_t* const alpha,
+void WebPMultRow_C(uint8_t* WEBP_RESTRICT const ptr,
+ const uint8_t* WEBP_RESTRICT const alpha,
int width, int inverse) {
int x;
for (x = 0; x < width; ++x) {
@@ -178,7 +179,8 @@ void WebPMultRow_C(uint8_t* const ptr, const uint8_t* const alpha,
#undef MFIX
void (*WebPMultARGBRow)(uint32_t* const ptr, int width, int inverse);
-void (*WebPMultRow)(uint8_t* const ptr, const uint8_t* const alpha,
+void (*WebPMultRow)(uint8_t* WEBP_RESTRICT const ptr,
+ const uint8_t* WEBP_RESTRICT const alpha,
int width, int inverse);
//------------------------------------------------------------------------------
@@ -193,8 +195,8 @@ void WebPMultARGBRows(uint8_t* ptr, int stride, int width, int num_rows,
}
}
-void WebPMultRows(uint8_t* ptr, int stride,
- const uint8_t* alpha, int alpha_stride,
+void WebPMultRows(uint8_t* WEBP_RESTRICT ptr, int stride,
+ const uint8_t* WEBP_RESTRICT alpha, int alpha_stride,
int width, int num_rows, int inverse) {
int n;
for (n = 0; n < num_rows; ++n) {
@@ -290,9 +292,9 @@ static void ApplyAlphaMultiply_16b_C(uint8_t* rgba4444,
}
#if !WEBP_NEON_OMIT_C_CODE
-static int DispatchAlpha_C(const uint8_t* alpha, int alpha_stride,
+static int DispatchAlpha_C(const uint8_t* WEBP_RESTRICT alpha, int alpha_stride,
int width, int height,
- uint8_t* dst, int dst_stride) {
+ uint8_t* WEBP_RESTRICT dst, int dst_stride) {
uint32_t alpha_mask = 0xff;
int i, j;
@@ -309,9 +311,10 @@ static int DispatchAlpha_C(const uint8_t* alpha, int alpha_stride,
return (alpha_mask != 0xff);
}
-static void DispatchAlphaToGreen_C(const uint8_t* alpha, int alpha_stride,
- int width, int height,
- uint32_t* dst, int dst_stride) {
+static void DispatchAlphaToGreen_C(const uint8_t* WEBP_RESTRICT alpha,
+ int alpha_stride, int width, int height,
+ uint32_t* WEBP_RESTRICT dst,
+ int dst_stride) {
int i, j;
for (j = 0; j < height; ++j) {
for (i = 0; i < width; ++i) {
@@ -322,9 +325,9 @@ static void DispatchAlphaToGreen_C(const uint8_t* alpha, int alpha_stride,
}
}
-static int ExtractAlpha_C(const uint8_t* argb, int argb_stride,
+static int ExtractAlpha_C(const uint8_t* WEBP_RESTRICT argb, int argb_stride,
int width, int height,
- uint8_t* alpha, int alpha_stride) {
+ uint8_t* WEBP_RESTRICT alpha, int alpha_stride) {
uint8_t alpha_mask = 0xff;
int i, j;
@@ -340,7 +343,8 @@ static int ExtractAlpha_C(const uint8_t* argb, int argb_stride,
return (alpha_mask == 0xff);
}
-static void ExtractGreen_C(const uint32_t* argb, uint8_t* alpha, int size) {
+static void ExtractGreen_C(const uint32_t* WEBP_RESTRICT argb,
+ uint8_t* WEBP_RESTRICT alpha, int size) {
int i;
for (i = 0; i < size; ++i) alpha[i] = argb[i] >> 8;
}
@@ -359,6 +363,11 @@ static int HasAlpha32b_C(const uint8_t* src, int length) {
return 0;
}
+static void AlphaReplace_C(uint32_t* src, int length, uint32_t color) {
+ int x;
+ for (x = 0; x < length; ++x) if ((src[x] >> 24) == 0) src[x] = color;
+}
+
//------------------------------------------------------------------------------
// Simple channel manipulations.
@@ -367,8 +376,11 @@ static WEBP_INLINE uint32_t MakeARGB32(int a, int r, int g, int b) {
}
#ifdef WORDS_BIGENDIAN
-static void PackARGB_C(const uint8_t* a, const uint8_t* r, const uint8_t* g,
- const uint8_t* b, int len, uint32_t* out) {
+static void PackARGB_C(const uint8_t* WEBP_RESTRICT a,
+ const uint8_t* WEBP_RESTRICT r,
+ const uint8_t* WEBP_RESTRICT g,
+ const uint8_t* WEBP_RESTRICT b,
+ int len, uint32_t* WEBP_RESTRICT out) {
int i;
for (i = 0; i < len; ++i) {
out[i] = MakeARGB32(a[4 * i], r[4 * i], g[4 * i], b[4 * i]);
@@ -376,8 +388,10 @@ static void PackARGB_C(const uint8_t* a, const uint8_t* r, const uint8_t* g,
}
#endif
-static void PackRGB_C(const uint8_t* r, const uint8_t* g, const uint8_t* b,
- int len, int step, uint32_t* out) {
+static void PackRGB_C(const uint8_t* WEBP_RESTRICT r,
+ const uint8_t* WEBP_RESTRICT g,
+ const uint8_t* WEBP_RESTRICT b,
+ int len, int step, uint32_t* WEBP_RESTRICT out) {
int i, offset = 0;
for (i = 0; i < len; ++i) {
out[i] = MakeARGB32(0xff, r[offset], g[offset], b[offset]);
@@ -387,19 +401,26 @@ static void PackRGB_C(const uint8_t* r, const uint8_t* g, const uint8_t* b,
void (*WebPApplyAlphaMultiply)(uint8_t*, int, int, int, int);
void (*WebPApplyAlphaMultiply4444)(uint8_t*, int, int, int);
-int (*WebPDispatchAlpha)(const uint8_t*, int, int, int, uint8_t*, int);
-void (*WebPDispatchAlphaToGreen)(const uint8_t*, int, int, int, uint32_t*, int);
-int (*WebPExtractAlpha)(const uint8_t*, int, int, int, uint8_t*, int);
-void (*WebPExtractGreen)(const uint32_t* argb, uint8_t* alpha, int size);
+int (*WebPDispatchAlpha)(const uint8_t* WEBP_RESTRICT, int, int, int,
+ uint8_t* WEBP_RESTRICT, int);
+void (*WebPDispatchAlphaToGreen)(const uint8_t* WEBP_RESTRICT, int, int, int,
+ uint32_t* WEBP_RESTRICT, int);
+int (*WebPExtractAlpha)(const uint8_t* WEBP_RESTRICT, int, int, int,
+ uint8_t* WEBP_RESTRICT, int);
+void (*WebPExtractGreen)(const uint32_t* WEBP_RESTRICT argb,
+ uint8_t* WEBP_RESTRICT alpha, int size);
#ifdef WORDS_BIGENDIAN
void (*WebPPackARGB)(const uint8_t* a, const uint8_t* r, const uint8_t* g,
const uint8_t* b, int, uint32_t*);
#endif
-void (*WebPPackRGB)(const uint8_t* r, const uint8_t* g, const uint8_t* b,
- int len, int step, uint32_t* out);
+void (*WebPPackRGB)(const uint8_t* WEBP_RESTRICT r,
+ const uint8_t* WEBP_RESTRICT g,
+ const uint8_t* WEBP_RESTRICT b,
+ int len, int step, uint32_t* WEBP_RESTRICT out);
int (*WebPHasAlpha8b)(const uint8_t* src, int length);
int (*WebPHasAlpha32b)(const uint8_t* src, int length);
+void (*WebPAlphaReplace)(uint32_t* src, int length, uint32_t color);
//------------------------------------------------------------------------------
// Init function
@@ -428,13 +449,14 @@ WEBP_DSP_INIT_FUNC(WebPInitAlphaProcessing) {
WebPHasAlpha8b = HasAlpha8b_C;
WebPHasAlpha32b = HasAlpha32b_C;
+ WebPAlphaReplace = AlphaReplace_C;
// If defined, use CPUInfo() to overwrite some pointers with faster versions.
if (VP8GetCPUInfo != NULL) {
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
if (VP8GetCPUInfo(kSSE2)) {
WebPInitAlphaProcessingSSE2();
-#if defined(WEBP_USE_SSE41)
+#if defined(WEBP_HAVE_SSE41)
if (VP8GetCPUInfo(kSSE4_1)) {
WebPInitAlphaProcessingSSE41();
}
@@ -448,7 +470,7 @@ WEBP_DSP_INIT_FUNC(WebPInitAlphaProcessing) {
#endif
}
-#if defined(WEBP_USE_NEON)
+#if defined(WEBP_HAVE_NEON)
if (WEBP_NEON_OMIT_C_CODE ||
(VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) {
WebPInitAlphaProcessingNEON();
@@ -469,4 +491,5 @@ WEBP_DSP_INIT_FUNC(WebPInitAlphaProcessing) {
assert(WebPPackRGB != NULL);
assert(WebPHasAlpha8b != NULL);
assert(WebPHasAlpha32b != NULL);
+ assert(WebPAlphaReplace != NULL);
}
diff --git a/src/3rdparty/libwebp/src/dsp/alpha_processing_neon.c b/src/3rdparty/libwebp/src/dsp/alpha_processing_neon.c
index 9d55421..6716fb7 100644
--- a/src/3rdparty/libwebp/src/dsp/alpha_processing_neon.c
+++ b/src/3rdparty/libwebp/src/dsp/alpha_processing_neon.c
@@ -80,10 +80,10 @@ static void ApplyAlphaMultiply_NEON(uint8_t* rgba, int alpha_first,
//------------------------------------------------------------------------------
-static int DispatchAlpha_NEON(const uint8_t* alpha, int alpha_stride,
- int width, int height,
- uint8_t* dst, int dst_stride) {
- uint32_t alpha_mask = 0xffffffffu;
+static int DispatchAlpha_NEON(const uint8_t* WEBP_RESTRICT alpha,
+ int alpha_stride, int width, int height,
+ uint8_t* WEBP_RESTRICT dst, int dst_stride) {
+ uint32_t alpha_mask = 0xffu;
uint8x8_t mask8 = vdup_n_u8(0xff);
uint32_t tmp[2];
int i, j;
@@ -107,14 +107,16 @@ static int DispatchAlpha_NEON(const uint8_t* alpha, int alpha_stride,
dst += dst_stride;
}
vst1_u8((uint8_t*)tmp, mask8);
+ alpha_mask *= 0x01010101;
alpha_mask &= tmp[0];
alpha_mask &= tmp[1];
return (alpha_mask != 0xffffffffu);
}
-static void DispatchAlphaToGreen_NEON(const uint8_t* alpha, int alpha_stride,
- int width, int height,
- uint32_t* dst, int dst_stride) {
+static void DispatchAlphaToGreen_NEON(const uint8_t* WEBP_RESTRICT alpha,
+ int alpha_stride, int width, int height,
+ uint32_t* WEBP_RESTRICT dst,
+ int dst_stride) {
int i, j;
uint8x8x4_t greens; // leave A/R/B channels zero'd.
greens.val[0] = vdup_n_u8(0);
@@ -131,10 +133,10 @@ static void DispatchAlphaToGreen_NEON(const uint8_t* alpha, int alpha_stride,
}
}
-static int ExtractAlpha_NEON(const uint8_t* argb, int argb_stride,
+static int ExtractAlpha_NEON(const uint8_t* WEBP_RESTRICT argb, int argb_stride,
int width, int height,
- uint8_t* alpha, int alpha_stride) {
- uint32_t alpha_mask = 0xffffffffu;
+ uint8_t* WEBP_RESTRICT alpha, int alpha_stride) {
+ uint32_t alpha_mask = 0xffu;
uint8x8_t mask8 = vdup_n_u8(0xff);
uint32_t tmp[2];
int i, j;
@@ -156,13 +158,14 @@ static int ExtractAlpha_NEON(const uint8_t* argb, int argb_stride,
alpha += alpha_stride;
}
vst1_u8((uint8_t*)tmp, mask8);
+ alpha_mask *= 0x01010101;
alpha_mask &= tmp[0];
alpha_mask &= tmp[1];
return (alpha_mask == 0xffffffffu);
}
-static void ExtractGreen_NEON(const uint32_t* argb,
- uint8_t* alpha, int size) {
+static void ExtractGreen_NEON(const uint32_t* WEBP_RESTRICT argb,
+ uint8_t* WEBP_RESTRICT alpha, int size) {
int i;
for (i = 0; i + 16 <= size; i += 16) {
const uint8x16x4_t rgbX = vld4q_u8((const uint8_t*)(argb + i));
diff --git a/src/3rdparty/libwebp/src/dsp/alpha_processing_sse2.c b/src/3rdparty/libwebp/src/dsp/alpha_processing_sse2.c
index 2871c56..f0843d0 100644
--- a/src/3rdparty/libwebp/src/dsp/alpha_processing_sse2.c
+++ b/src/3rdparty/libwebp/src/dsp/alpha_processing_sse2.c
@@ -18,16 +18,16 @@
//------------------------------------------------------------------------------
-static int DispatchAlpha_SSE2(const uint8_t* alpha, int alpha_stride,
- int width, int height,
- uint8_t* dst, int dst_stride) {
+static int DispatchAlpha_SSE2(const uint8_t* WEBP_RESTRICT alpha,
+ int alpha_stride, int width, int height,
+ uint8_t* WEBP_RESTRICT dst, int dst_stride) {
// alpha_and stores an 'and' operation of all the alpha[] values. The final
// value is not 0xff if any of the alpha[] is not equal to 0xff.
uint32_t alpha_and = 0xff;
int i, j;
const __m128i zero = _mm_setzero_si128();
- const __m128i rgb_mask = _mm_set1_epi32(0xffffff00u); // to preserve RGB
- const __m128i all_0xff = _mm_set_epi32(0, 0, ~0u, ~0u);
+ const __m128i rgb_mask = _mm_set1_epi32((int)0xffffff00); // to preserve RGB
+ const __m128i all_0xff = _mm_set_epi32(0, 0, ~0, ~0);
__m128i all_alphas = all_0xff;
// We must be able to access 3 extra bytes after the last written byte
@@ -72,9 +72,10 @@ static int DispatchAlpha_SSE2(const uint8_t* alpha, int alpha_stride,
return (alpha_and != 0xff);
}
-static void DispatchAlphaToGreen_SSE2(const uint8_t* alpha, int alpha_stride,
- int width, int height,
- uint32_t* dst, int dst_stride) {
+static void DispatchAlphaToGreen_SSE2(const uint8_t* WEBP_RESTRICT alpha,
+ int alpha_stride, int width, int height,
+ uint32_t* WEBP_RESTRICT dst,
+ int dst_stride) {
int i, j;
const __m128i zero = _mm_setzero_si128();
const int limit = width & ~15;
@@ -98,15 +99,15 @@ static void DispatchAlphaToGreen_SSE2(const uint8_t* alpha, int alpha_stride,
}
}
-static int ExtractAlpha_SSE2(const uint8_t* argb, int argb_stride,
+static int ExtractAlpha_SSE2(const uint8_t* WEBP_RESTRICT argb, int argb_stride,
int width, int height,
- uint8_t* alpha, int alpha_stride) {
+ uint8_t* WEBP_RESTRICT alpha, int alpha_stride) {
// alpha_and stores an 'and' operation of all the alpha[] values. The final
// value is not 0xff if any of the alpha[] is not equal to 0xff.
uint32_t alpha_and = 0xff;
int i, j;
- const __m128i a_mask = _mm_set1_epi32(0xffu); // to preserve alpha
- const __m128i all_0xff = _mm_set_epi32(0, 0, ~0u, ~0u);
+ const __m128i a_mask = _mm_set1_epi32(0xff); // to preserve alpha
+ const __m128i all_0xff = _mm_set_epi32(0, 0, ~0, ~0);
__m128i all_alphas = all_0xff;
// We must be able to access 3 extra bytes after the last written byte
@@ -177,7 +178,7 @@ static int ExtractAlpha_SSE2(const uint8_t* argb, int argb_stride,
static void ApplyAlphaMultiply_SSE2(uint8_t* rgba, int alpha_first,
int w, int h, int stride) {
const __m128i zero = _mm_setzero_si128();
- const __m128i kMult = _mm_set1_epi16(0x8081u);
+ const __m128i kMult = _mm_set1_epi16((short)0x8081);
const __m128i kMask = _mm_set_epi16(0, 0xff, 0xff, 0, 0, 0xff, 0xff, 0);
const int kSpan = 4;
while (h-- > 0) {
@@ -265,6 +266,27 @@ static int HasAlpha32b_SSE2(const uint8_t* src, int length) {
return 0;
}
+static void AlphaReplace_SSE2(uint32_t* src, int length, uint32_t color) {
+ const __m128i m_color = _mm_set1_epi32((int)color);
+ const __m128i zero = _mm_setzero_si128();
+ int i = 0;
+ for (; i + 8 <= length; i += 8) {
+ const __m128i a0 = _mm_loadu_si128((const __m128i*)(src + i + 0));
+ const __m128i a1 = _mm_loadu_si128((const __m128i*)(src + i + 4));
+ const __m128i b0 = _mm_srai_epi32(a0, 24);
+ const __m128i b1 = _mm_srai_epi32(a1, 24);
+ const __m128i c0 = _mm_cmpeq_epi32(b0, zero);
+ const __m128i c1 = _mm_cmpeq_epi32(b1, zero);
+ const __m128i d0 = _mm_and_si128(c0, m_color);
+ const __m128i d1 = _mm_and_si128(c1, m_color);
+ const __m128i e0 = _mm_andnot_si128(c0, a0);
+ const __m128i e1 = _mm_andnot_si128(c1, a1);
+ _mm_storeu_si128((__m128i*)(src + i + 0), _mm_or_si128(d0, e0));
+ _mm_storeu_si128((__m128i*)(src + i + 4), _mm_or_si128(d1, e1));
+ }
+ for (; i < length; ++i) if ((src[i] >> 24) == 0) src[i] = color;
+}
+
// -----------------------------------------------------------------------------
// Apply alpha value to rows
@@ -296,7 +318,8 @@ static void MultARGBRow_SSE2(uint32_t* const ptr, int width, int inverse) {
if (width > 0) WebPMultARGBRow_C(ptr + x, width, inverse);
}
-static void MultRow_SSE2(uint8_t* const ptr, const uint8_t* const alpha,
+static void MultRow_SSE2(uint8_t* WEBP_RESTRICT const ptr,
+ const uint8_t* WEBP_RESTRICT const alpha,
int width, int inverse) {
int x = 0;
if (!inverse) {
@@ -334,6 +357,7 @@ WEBP_TSAN_IGNORE_FUNCTION void WebPInitAlphaProcessingSSE2(void) {
WebPHasAlpha8b = HasAlpha8b_SSE2;
WebPHasAlpha32b = HasAlpha32b_SSE2;
+ WebPAlphaReplace = AlphaReplace_SSE2;
}
#else // !WEBP_USE_SSE2
diff --git a/src/3rdparty/libwebp/src/dsp/alpha_processing_sse41.c b/src/3rdparty/libwebp/src/dsp/alpha_processing_sse41.c
index 56040f9..1156ac3 100644
--- a/src/3rdparty/libwebp/src/dsp/alpha_processing_sse41.c
+++ b/src/3rdparty/libwebp/src/dsp/alpha_processing_sse41.c
@@ -19,14 +19,14 @@
//------------------------------------------------------------------------------
-static int ExtractAlpha_SSE41(const uint8_t* argb, int argb_stride,
- int width, int height,
- uint8_t* alpha, int alpha_stride) {
+static int ExtractAlpha_SSE41(const uint8_t* WEBP_RESTRICT argb,
+ int argb_stride, int width, int height,
+ uint8_t* WEBP_RESTRICT alpha, int alpha_stride) {
// alpha_and stores an 'and' operation of all the alpha[] values. The final
// value is not 0xff if any of the alpha[] is not equal to 0xff.
uint32_t alpha_and = 0xff;
int i, j;
- const __m128i all_0xff = _mm_set1_epi32(~0u);
+ const __m128i all_0xff = _mm_set1_epi32(~0);
__m128i all_alphas = all_0xff;
// We must be able to access 3 extra bytes after the last written byte
diff --git a/src/3rdparty/libwebp/src/dsp/cost.c b/src/3rdparty/libwebp/src/dsp/cost.c
index cc681cd..460ec4f 100644
--- a/src/3rdparty/libwebp/src/dsp/cost.c
+++ b/src/3rdparty/libwebp/src/dsp/cost.c
@@ -395,12 +395,12 @@ WEBP_DSP_INIT_FUNC(VP8EncDspCostInit) {
VP8EncDspCostInitMIPSdspR2();
}
#endif
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
if (VP8GetCPUInfo(kSSE2)) {
VP8EncDspCostInitSSE2();
}
#endif
-#if defined(WEBP_USE_NEON)
+#if defined(WEBP_HAVE_NEON)
if (VP8GetCPUInfo(kNEON)) {
VP8EncDspCostInitNEON();
}
diff --git a/src/3rdparty/libwebp/src/dsp/cpu.c b/src/3rdparty/libwebp/src/dsp/cpu.c
index 0fa5b6a..62de73f 100644
--- a/src/3rdparty/libwebp/src/dsp/cpu.c
+++ b/src/3rdparty/libwebp/src/dsp/cpu.c
@@ -11,7 +11,7 @@
//
// Author: Christian Duvivier (cduvivier@google.com)
-#include "src/dsp/dsp.h"
+#include "src/dsp/cpu.h"
#if defined(WEBP_HAVE_NEON_RTCD)
#include <stdio.h>
@@ -55,12 +55,18 @@ static WEBP_INLINE void GetCPUInfo(int cpu_info[4], int info_type) {
: "=a"(cpu_info[0]), "=b"(cpu_info[1]), "=c"(cpu_info[2]), "=d"(cpu_info[3])
: "a"(info_type), "c"(0));
}
-#elif (defined(_M_X64) || defined(_M_IX86)) && \
- defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 150030729 // >= VS2008 SP1
+#elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86))
+
+#if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 150030729 // >= VS2008 SP1
#include <intrin.h>
#define GetCPUInfo(info, type) __cpuidex(info, type, 0) // set ecx=0
-#elif defined(WEBP_MSC_SSE2)
+#define WEBP_HAVE_MSC_CPUID
+#elif _MSC_VER > 1310
+#include <intrin.h>
#define GetCPUInfo __cpuid
+#define WEBP_HAVE_MSC_CPUID
+#endif
+
#endif
// NaCl has no support for xgetbv or the raw opcode.
@@ -94,7 +100,7 @@ static WEBP_INLINE uint64_t xgetbv(void) {
#define xgetbv() 0U // no AVX for older x64 or unrecognized toolchains.
#endif
-#if defined(__i386__) || defined(__x86_64__) || defined(WEBP_MSC_SSE2)
+#if defined(__i386__) || defined(__x86_64__) || defined(WEBP_HAVE_MSC_CPUID)
// helper function for run-time detection of slow SSSE3 platforms
static int CheckSlowModel(int info) {
@@ -179,9 +185,34 @@ static int AndroidCPUInfo(CPUFeature feature) {
return 0;
}
VP8CPUInfo VP8GetCPUInfo = AndroidCPUInfo;
-#elif defined(WEBP_USE_NEON)
-// define a dummy function to enable turning off NEON at runtime by setting
-// VP8DecGetCPUInfo = NULL
+#elif defined(EMSCRIPTEN) // also needs to be before generic NEON test
+// Use compile flags as an indicator of SIMD support instead of a runtime check.
+static int wasmCPUInfo(CPUFeature feature) {
+ switch (feature) {
+#ifdef WEBP_HAVE_SSE2
+ case kSSE2:
+ return 1;
+#endif
+#ifdef WEBP_HAVE_SSE41
+ case kSSE3:
+ case kSlowSSSE3:
+ case kSSE4_1:
+ return 1;
+#endif
+#ifdef WEBP_HAVE_NEON
+ case kNEON:
+ return 1;
+#endif
+ default:
+ break;
+ }
+ return 0;
+}
+VP8CPUInfo VP8GetCPUInfo = wasmCPUInfo;
+#elif defined(WEBP_HAVE_NEON)
+// In most cases this function doesn't check for NEON support (it's assumed by
+// the configuration), but enables turning off NEON at runtime, for testing
+// purposes, by setting VP8GetCPUInfo = NULL.
static int armCPUInfo(CPUFeature feature) {
if (feature != kNEON) return 0;
#if defined(__linux__) && defined(WEBP_HAVE_NEON_RTCD)
diff --git a/src/3rdparty/libwebp/src/dsp/cpu.h b/src/3rdparty/libwebp/src/dsp/cpu.h
new file mode 100644
index 0000000..de32a39
--- /dev/null
+++ b/src/3rdparty/libwebp/src/dsp/cpu.h
@@ -0,0 +1,259 @@
+// Copyright 2022 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// CPU detection functions and macros.
+//
+// Author: Skal (pascal.massimino@gmail.com)
+
+#ifndef WEBP_DSP_CPU_H_
+#define WEBP_DSP_CPU_H_
+
+#include <stddef.h>
+
+#include <qglobal.h>
+
+#ifdef HAVE_CONFIG_H
+#include "src/webp/config.h"
+#endif
+
+#include "src/webp/types.h"
+
+#if defined(__GNUC__)
+#define LOCAL_GCC_VERSION ((__GNUC__ << 8) | __GNUC_MINOR__)
+#define LOCAL_GCC_PREREQ(maj, min) (LOCAL_GCC_VERSION >= (((maj) << 8) | (min)))
+#else
+#define LOCAL_GCC_VERSION 0
+#define LOCAL_GCC_PREREQ(maj, min) 0
+#endif
+
+#if defined(__clang__)
+#define LOCAL_CLANG_VERSION ((__clang_major__ << 8) | __clang_minor__)
+#define LOCAL_CLANG_PREREQ(maj, min) \
+ (LOCAL_CLANG_VERSION >= (((maj) << 8) | (min)))
+#else
+#define LOCAL_CLANG_VERSION 0
+#define LOCAL_CLANG_PREREQ(maj, min) 0
+#endif
+
+#ifndef __has_builtin
+#define __has_builtin(x) 0
+#endif
+
+#if !defined(HAVE_CONFIG_H)
+#if defined(_MSC_VER) && _MSC_VER > 1310 && \
+ (defined(_M_X64) || defined(_M_IX86)) && !defined(__clang__)
+#define WEBP_MSC_SSE2 // Visual C++ SSE2 targets
+#endif
+
+#if defined(_MSC_VER) && _MSC_VER >= 1500 && \
+ (defined(_M_X64) || defined(_M_IX86)) && !defined(__clang__)
+#define WEBP_MSC_SSE41 // Visual C++ SSE4.1 targets
+#endif
+#endif
+
+// WEBP_HAVE_* are used to indicate the presence of the instruction set in dsp
+// files without intrinsics, allowing the corresponding Init() to be called.
+// Files containing intrinsics will need to be built targeting the instruction
+// set so should succeed on one of the earlier tests.
+#if (defined(__SSE2__) || defined(WEBP_MSC_SSE2)) && \
+ (!defined(HAVE_CONFIG_H) || defined(WEBP_HAVE_SSE2))
+#define WEBP_USE_SSE2
+#endif
+
+#if defined(WEBP_USE_SSE2) && !defined(WEBP_HAVE_SSE2)
+#define WEBP_HAVE_SSE2
+#endif
+
+#if (defined(__SSE4_1__) || defined(WEBP_MSC_SSE41)) && \
+ (!defined(HAVE_CONFIG_H) || defined(WEBP_HAVE_SSE41))
+#define WEBP_USE_SSE41
+#endif
+
+#if defined(WEBP_USE_SSE41) && !defined(WEBP_HAVE_SSE41)
+#define WEBP_HAVE_SSE41
+#endif
+
+#undef WEBP_MSC_SSE41
+#undef WEBP_MSC_SSE2
+
+// The intrinsics currently cause compiler errors with arm-nacl-gcc and the
+// inline assembly would need to be modified for use with Native Client.
+#if ((defined(__ARM_NEON__) || defined(__aarch64__)) && \
+ (!defined(HAVE_CONFIG_H) || defined(WEBP_HAVE_NEON))) && \
+ !defined(__native_client__)
+#define WEBP_USE_NEON
+#endif
+
+#if !defined(WEBP_USE_NEON) && defined(__ANDROID__) && \
+ defined(__ARM_ARCH_7A__) && defined(HAVE_CPU_FEATURES_H)
+#define WEBP_ANDROID_NEON // Android targets that may have NEON
+#define WEBP_USE_NEON
+#endif
+
+// Note: ARM64 is supported in Visual Studio 2017, but requires the direct
+// inclusion of arm64_neon.h; Visual Studio 2019 includes this file in
+// arm_neon.h. Compile errors were seen with Visual Studio 2019 16.4 with
+// vtbl4_u8(); a fix was made in 16.6.
+#if defined(_MSC_VER) && ((_MSC_VER >= 1700 && defined(_M_ARM)) || \
+ (_MSC_VER >= 1926 && defined(_M_ARM64))) && \
+ !defined(__clang__) && (QT_CONFIG_neon == 1)
+#define WEBP_USE_NEON
+#define WEBP_USE_INTRINSICS
+#endif
+
+#if defined(WEBP_USE_NEON) && !defined(WEBP_HAVE_NEON)
+#define WEBP_HAVE_NEON
+#endif
+
+#if defined(__mips__) && !defined(__mips64) && defined(__mips_isa_rev) && \
+ (__mips_isa_rev >= 1) && (__mips_isa_rev < 6)
+#define WEBP_USE_MIPS32
+#if (__mips_isa_rev >= 2)
+#define WEBP_USE_MIPS32_R2
+#if defined(__mips_dspr2) || (defined(__mips_dsp_rev) && __mips_dsp_rev >= 2)
+#define WEBP_USE_MIPS_DSP_R2
+#endif
+#endif
+#endif
+
+#if defined(__mips_msa) && defined(__mips_isa_rev) && (__mips_isa_rev >= 5)
+#define WEBP_USE_MSA
+#endif
+
+#ifndef WEBP_DSP_OMIT_C_CODE
+#define WEBP_DSP_OMIT_C_CODE 1
+#endif
+
+#if defined(WEBP_USE_NEON) && WEBP_DSP_OMIT_C_CODE
+#define WEBP_NEON_OMIT_C_CODE 1
+#else
+#define WEBP_NEON_OMIT_C_CODE 0
+#endif
+
+#if !(LOCAL_CLANG_PREREQ(3, 8) || LOCAL_GCC_PREREQ(4, 8) || \
+ defined(__aarch64__))
+#define WEBP_NEON_WORK_AROUND_GCC 1
+#else
+#define WEBP_NEON_WORK_AROUND_GCC 0
+#endif
+
+// This macro prevents thread_sanitizer from reporting known concurrent writes.
+#define WEBP_TSAN_IGNORE_FUNCTION
+#if defined(__has_feature)
+#if __has_feature(thread_sanitizer)
+#undef WEBP_TSAN_IGNORE_FUNCTION
+#define WEBP_TSAN_IGNORE_FUNCTION __attribute__((no_sanitize_thread))
+#endif
+#endif
+
+#if defined(__has_feature)
+#if __has_feature(memory_sanitizer)
+#define WEBP_MSAN
+#endif
+#endif
+
+#if defined(WEBP_USE_THREAD) && !defined(_WIN32)
+#include <pthread.h> // NOLINT
+
+#define WEBP_DSP_INIT(func) \
+ do { \
+ static volatile VP8CPUInfo func##_last_cpuinfo_used = \
+ (VP8CPUInfo)&func##_last_cpuinfo_used; \
+ static pthread_mutex_t func##_lock = PTHREAD_MUTEX_INITIALIZER; \
+ if (pthread_mutex_lock(&func##_lock)) break; \
+ if (func##_last_cpuinfo_used != VP8GetCPUInfo) func(); \
+ func##_last_cpuinfo_used = VP8GetCPUInfo; \
+ (void)pthread_mutex_unlock(&func##_lock); \
+ } while (0)
+#else // !(defined(WEBP_USE_THREAD) && !defined(_WIN32))
+#define WEBP_DSP_INIT(func) \
+ do { \
+ static volatile VP8CPUInfo func##_last_cpuinfo_used = \
+ (VP8CPUInfo)&func##_last_cpuinfo_used; \
+ if (func##_last_cpuinfo_used == VP8GetCPUInfo) break; \
+ func(); \
+ func##_last_cpuinfo_used = VP8GetCPUInfo; \
+ } while (0)
+#endif // defined(WEBP_USE_THREAD) && !defined(_WIN32)
+
+// Defines an Init + helper function that control multiple initialization of
+// function pointers / tables.
+/* Usage:
+ WEBP_DSP_INIT_FUNC(InitFunc) {
+ ...function body
+ }
+*/
+#define WEBP_DSP_INIT_FUNC(name) \
+ static WEBP_TSAN_IGNORE_FUNCTION void name##_body(void); \
+ WEBP_TSAN_IGNORE_FUNCTION void name(void) { WEBP_DSP_INIT(name##_body); } \
+ static WEBP_TSAN_IGNORE_FUNCTION void name##_body(void)
+
+#define WEBP_UBSAN_IGNORE_UNDEF
+#define WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW
+#if defined(__clang__) && defined(__has_attribute)
+#if __has_attribute(no_sanitize)
+// This macro prevents the undefined behavior sanitizer from reporting
+// failures. This is only meant to silence unaligned loads on platforms that
+// are known to support them.
+#undef WEBP_UBSAN_IGNORE_UNDEF
+#define WEBP_UBSAN_IGNORE_UNDEF __attribute__((no_sanitize("undefined")))
+
+// This macro prevents the undefined behavior sanitizer from reporting
+// failures related to unsigned integer overflows. This is only meant to
+// silence cases where this well defined behavior is expected.
+#undef WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW
+#define WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW \
+ __attribute__((no_sanitize("unsigned-integer-overflow")))
+#endif
+#endif
+
+// If 'ptr' is NULL, returns NULL. Otherwise returns 'ptr + off'.
+// Prevents undefined behavior sanitizer nullptr-with-nonzero-offset warning.
+#if !defined(WEBP_OFFSET_PTR)
+#define WEBP_OFFSET_PTR(ptr, off) (((ptr) == NULL) ? NULL : ((ptr) + (off)))
+#endif
+
+// Regularize the definition of WEBP_SWAP_16BIT_CSP (backward compatibility)
+#if !defined(WEBP_SWAP_16BIT_CSP)
+#define WEBP_SWAP_16BIT_CSP 0
+#endif
+
+// some endian fix (e.g.: mips-gcc doesn't define __BIG_ENDIAN__)
+#if !defined(WORDS_BIGENDIAN) && \
+ (defined(__BIG_ENDIAN__) || defined(_M_PPC) || \
+ (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)))
+#define WORDS_BIGENDIAN
+#endif
+
+typedef enum {
+ kSSE2,
+ kSSE3,
+ kSlowSSSE3, // special feature for slow SSSE3 architectures
+ kSSE4_1,
+ kAVX,
+ kAVX2,
+ kNEON,
+ kMIPS32,
+ kMIPSdspR2,
+ kMSA
+} CPUFeature;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// returns true if the CPU supports the feature.
+typedef int (*VP8CPUInfo)(CPUFeature feature);
+WEBP_EXTERN VP8CPUInfo VP8GetCPUInfo;
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif // WEBP_DSP_CPU_H_
diff --git a/src/3rdparty/libwebp/src/dsp/dec.c b/src/3rdparty/libwebp/src/dsp/dec.c
index 1119842..537c701 100644
--- a/src/3rdparty/libwebp/src/dsp/dec.c
+++ b/src/3rdparty/libwebp/src/dsp/dec.c
@@ -807,10 +807,10 @@ WEBP_DSP_INIT_FUNC(VP8DspInit) {
// If defined, use CPUInfo() to overwrite some pointers with faster versions.
if (VP8GetCPUInfo != NULL) {
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
if (VP8GetCPUInfo(kSSE2)) {
VP8DspInitSSE2();
-#if defined(WEBP_USE_SSE41)
+#if defined(WEBP_HAVE_SSE41)
if (VP8GetCPUInfo(kSSE4_1)) {
VP8DspInitSSE41();
}
@@ -834,7 +834,7 @@ WEBP_DSP_INIT_FUNC(VP8DspInit) {
#endif
}
-#if defined(WEBP_USE_NEON)
+#if defined(WEBP_HAVE_NEON)
if (WEBP_NEON_OMIT_C_CODE ||
(VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) {
VP8DspInitNEON();
diff --git a/src/3rdparty/libwebp/src/dsp/dec_neon.c b/src/3rdparty/libwebp/src/dsp/dec_neon.c
index ffa697f..fa85170 100644
--- a/src/3rdparty/libwebp/src/dsp/dec_neon.c
+++ b/src/3rdparty/libwebp/src/dsp/dec_neon.c
@@ -1283,12 +1283,12 @@ static void DC4_NEON(uint8_t* dst) { // DC
const uint8x8_t A = vld1_u8(dst - BPS); // top row
const uint16x4_t p0 = vpaddl_u8(A); // cascading summation of the top
const uint16x4_t p1 = vpadd_u16(p0, p0);
- const uint16x8_t L0 = vmovl_u8(vld1_u8(dst + 0 * BPS - 1));
- const uint16x8_t L1 = vmovl_u8(vld1_u8(dst + 1 * BPS - 1));
- const uint16x8_t L2 = vmovl_u8(vld1_u8(dst + 2 * BPS - 1));
- const uint16x8_t L3 = vmovl_u8(vld1_u8(dst + 3 * BPS - 1));
- const uint16x8_t s0 = vaddq_u16(L0, L1);
- const uint16x8_t s1 = vaddq_u16(L2, L3);
+ const uint8x8_t L0 = vld1_u8(dst + 0 * BPS - 1);
+ const uint8x8_t L1 = vld1_u8(dst + 1 * BPS - 1);
+ const uint8x8_t L2 = vld1_u8(dst + 2 * BPS - 1);
+ const uint8x8_t L3 = vld1_u8(dst + 3 * BPS - 1);
+ const uint16x8_t s0 = vaddl_u8(L0, L1);
+ const uint16x8_t s1 = vaddl_u8(L2, L3);
const uint16x8_t s01 = vaddq_u16(s0, s1);
const uint16x8_t sum = vaddq_u16(s01, vcombine_u16(p1, p1));
const uint8x8_t dc0 = vrshrn_n_u16(sum, 3); // (sum + 4) >> 3
@@ -1361,7 +1361,8 @@ static void RD4_NEON(uint8_t* dst) { // Down-right
const uint32_t J = dst[-1 + 1 * BPS];
const uint32_t K = dst[-1 + 2 * BPS];
const uint32_t L = dst[-1 + 3 * BPS];
- const uint64x1_t LKJI____ = vcreate_u64(L | (K << 8) | (J << 16) | (I << 24));
+ const uint64x1_t LKJI____ =
+ vcreate_u64((uint64_t)L | (K << 8) | (J << 16) | (I << 24));
const uint64x1_t LKJIXABC = vorr_u64(LKJI____, ____XABC);
const uint8x8_t KJIXABC_ = vreinterpret_u8_u64(vshr_n_u64(LKJIXABC, 8));
const uint8x8_t JIXABC__ = vreinterpret_u8_u64(vshr_n_u64(LKJIXABC, 16));
@@ -1427,25 +1428,30 @@ static WEBP_INLINE void DC8_NEON(uint8_t* dst, int do_top, int do_left) {
if (do_top) {
const uint8x8_t A = vld1_u8(dst - BPS); // top row
+#if defined(__aarch64__)
+ const uint16_t p2 = vaddlv_u8(A);
+ sum_top = vdupq_n_u16(p2);
+#else
const uint16x4_t p0 = vpaddl_u8(A); // cascading summation of the top
const uint16x4_t p1 = vpadd_u16(p0, p0);
const uint16x4_t p2 = vpadd_u16(p1, p1);
sum_top = vcombine_u16(p2, p2);
+#endif
}
if (do_left) {
- const uint16x8_t L0 = vmovl_u8(vld1_u8(dst + 0 * BPS - 1));
- const uint16x8_t L1 = vmovl_u8(vld1_u8(dst + 1 * BPS - 1));
- const uint16x8_t L2 = vmovl_u8(vld1_u8(dst + 2 * BPS - 1));
- const uint16x8_t L3 = vmovl_u8(vld1_u8(dst + 3 * BPS - 1));
- const uint16x8_t L4 = vmovl_u8(vld1_u8(dst + 4 * BPS - 1));
- const uint16x8_t L5 = vmovl_u8(vld1_u8(dst + 5 * BPS - 1));
- const uint16x8_t L6 = vmovl_u8(vld1_u8(dst + 6 * BPS - 1));
- const uint16x8_t L7 = vmovl_u8(vld1_u8(dst + 7 * BPS - 1));
- const uint16x8_t s0 = vaddq_u16(L0, L1);
- const uint16x8_t s1 = vaddq_u16(L2, L3);
- const uint16x8_t s2 = vaddq_u16(L4, L5);
- const uint16x8_t s3 = vaddq_u16(L6, L7);
+ const uint8x8_t L0 = vld1_u8(dst + 0 * BPS - 1);
+ const uint8x8_t L1 = vld1_u8(dst + 1 * BPS - 1);
+ const uint8x8_t L2 = vld1_u8(dst + 2 * BPS - 1);
+ const uint8x8_t L3 = vld1_u8(dst + 3 * BPS - 1);
+ const uint8x8_t L4 = vld1_u8(dst + 4 * BPS - 1);
+ const uint8x8_t L5 = vld1_u8(dst + 5 * BPS - 1);
+ const uint8x8_t L6 = vld1_u8(dst + 6 * BPS - 1);
+ const uint8x8_t L7 = vld1_u8(dst + 7 * BPS - 1);
+ const uint16x8_t s0 = vaddl_u8(L0, L1);
+ const uint16x8_t s1 = vaddl_u8(L2, L3);
+ const uint16x8_t s2 = vaddl_u8(L4, L5);
+ const uint16x8_t s3 = vaddl_u8(L6, L7);
const uint16x8_t s01 = vaddq_u16(s0, s1);
const uint16x8_t s23 = vaddq_u16(s2, s3);
sum_left = vaddq_u16(s01, s23);
@@ -1505,29 +1511,34 @@ static WEBP_INLINE void DC16_NEON(uint8_t* dst, int do_top, int do_left) {
if (do_top) {
const uint8x16_t A = vld1q_u8(dst - BPS); // top row
+#if defined(__aarch64__)
+ const uint16_t p3 = vaddlvq_u8(A);
+ sum_top = vdupq_n_u16(p3);
+#else
const uint16x8_t p0 = vpaddlq_u8(A); // cascading summation of the top
const uint16x4_t p1 = vadd_u16(vget_low_u16(p0), vget_high_u16(p0));
const uint16x4_t p2 = vpadd_u16(p1, p1);
const uint16x4_t p3 = vpadd_u16(p2, p2);
sum_top = vcombine_u16(p3, p3);
+#endif
}
if (do_left) {
int i;
sum_left = vdupq_n_u16(0);
for (i = 0; i < 16; i += 8) {
- const uint16x8_t L0 = vmovl_u8(vld1_u8(dst + (i + 0) * BPS - 1));
- const uint16x8_t L1 = vmovl_u8(vld1_u8(dst + (i + 1) * BPS - 1));
- const uint16x8_t L2 = vmovl_u8(vld1_u8(dst + (i + 2) * BPS - 1));
- const uint16x8_t L3 = vmovl_u8(vld1_u8(dst + (i + 3) * BPS - 1));
- const uint16x8_t L4 = vmovl_u8(vld1_u8(dst + (i + 4) * BPS - 1));
- const uint16x8_t L5 = vmovl_u8(vld1_u8(dst + (i + 5) * BPS - 1));
- const uint16x8_t L6 = vmovl_u8(vld1_u8(dst + (i + 6) * BPS - 1));
- const uint16x8_t L7 = vmovl_u8(vld1_u8(dst + (i + 7) * BPS - 1));
- const uint16x8_t s0 = vaddq_u16(L0, L1);
- const uint16x8_t s1 = vaddq_u16(L2, L3);
- const uint16x8_t s2 = vaddq_u16(L4, L5);
- const uint16x8_t s3 = vaddq_u16(L6, L7);
+ const uint8x8_t L0 = vld1_u8(dst + (i + 0) * BPS - 1);
+ const uint8x8_t L1 = vld1_u8(dst + (i + 1) * BPS - 1);
+ const uint8x8_t L2 = vld1_u8(dst + (i + 2) * BPS - 1);
+ const uint8x8_t L3 = vld1_u8(dst + (i + 3) * BPS - 1);
+ const uint8x8_t L4 = vld1_u8(dst + (i + 4) * BPS - 1);
+ const uint8x8_t L5 = vld1_u8(dst + (i + 5) * BPS - 1);
+ const uint8x8_t L6 = vld1_u8(dst + (i + 6) * BPS - 1);
+ const uint8x8_t L7 = vld1_u8(dst + (i + 7) * BPS - 1);
+ const uint16x8_t s0 = vaddl_u8(L0, L1);
+ const uint16x8_t s1 = vaddl_u8(L2, L3);
+ const uint16x8_t s2 = vaddl_u8(L4, L5);
+ const uint16x8_t s3 = vaddl_u8(L6, L7);
const uint16x8_t s01 = vaddq_u16(s0, s1);
const uint16x8_t s23 = vaddq_u16(s2, s3);
const uint16x8_t sum = vaddq_u16(s01, s23);
diff --git a/src/3rdparty/libwebp/src/dsp/dec_sse2.c b/src/3rdparty/libwebp/src/dsp/dec_sse2.c
index 873aa59..01e6bcb 100644
--- a/src/3rdparty/libwebp/src/dsp/dec_sse2.c
+++ b/src/3rdparty/libwebp/src/dsp/dec_sse2.c
@@ -158,10 +158,10 @@ static void Transform_SSE2(const int16_t* in, uint8_t* dst, int do_two) {
dst3 = _mm_loadl_epi64((__m128i*)(dst + 3 * BPS));
} else {
// Load four bytes/pixels per line.
- dst0 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 0 * BPS));
- dst1 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 1 * BPS));
- dst2 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 2 * BPS));
- dst3 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 3 * BPS));
+ dst0 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 0 * BPS));
+ dst1 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 1 * BPS));
+ dst2 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 2 * BPS));
+ dst3 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 3 * BPS));
}
// Convert to 16b.
dst0 = _mm_unpacklo_epi8(dst0, zero);
@@ -187,10 +187,10 @@ static void Transform_SSE2(const int16_t* in, uint8_t* dst, int do_two) {
_mm_storel_epi64((__m128i*)(dst + 3 * BPS), dst3);
} else {
// Store four bytes/pixels per line.
- WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(dst0));
- WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(dst1));
- WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(dst2));
- WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(dst3));
+ WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(dst0));
+ WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(dst1));
+ WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(dst2));
+ WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(dst3));
}
}
}
@@ -213,10 +213,10 @@ static void TransformAC3(const int16_t* in, uint8_t* dst) {
const __m128i m3 = _mm_subs_epi16(B, d4);
const __m128i zero = _mm_setzero_si128();
// Load the source pixels.
- __m128i dst0 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 0 * BPS));
- __m128i dst1 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 1 * BPS));
- __m128i dst2 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 2 * BPS));
- __m128i dst3 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 3 * BPS));
+ __m128i dst0 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 0 * BPS));
+ __m128i dst1 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 1 * BPS));
+ __m128i dst2 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 2 * BPS));
+ __m128i dst3 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 3 * BPS));
// Convert to 16b.
dst0 = _mm_unpacklo_epi8(dst0, zero);
dst1 = _mm_unpacklo_epi8(dst1, zero);
@@ -233,10 +233,10 @@ static void TransformAC3(const int16_t* in, uint8_t* dst) {
dst2 = _mm_packus_epi16(dst2, dst2);
dst3 = _mm_packus_epi16(dst3, dst3);
// Store the results.
- WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(dst0));
- WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(dst1));
- WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(dst2));
- WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(dst3));
+ WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(dst0));
+ WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(dst1));
+ WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(dst2));
+ WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(dst3));
}
#undef MUL
#endif // USE_TRANSFORM_AC3
@@ -477,11 +477,11 @@ static WEBP_INLINE void Load8x4_SSE2(const uint8_t* const b, int stride,
// A0 = 63 62 61 60 23 22 21 20 43 42 41 40 03 02 01 00
// A1 = 73 72 71 70 33 32 31 30 53 52 51 50 13 12 11 10
const __m128i A0 = _mm_set_epi32(
- WebPMemToUint32(&b[6 * stride]), WebPMemToUint32(&b[2 * stride]),
- WebPMemToUint32(&b[4 * stride]), WebPMemToUint32(&b[0 * stride]));
+ WebPMemToInt32(&b[6 * stride]), WebPMemToInt32(&b[2 * stride]),
+ WebPMemToInt32(&b[4 * stride]), WebPMemToInt32(&b[0 * stride]));
const __m128i A1 = _mm_set_epi32(
- WebPMemToUint32(&b[7 * stride]), WebPMemToUint32(&b[3 * stride]),
- WebPMemToUint32(&b[5 * stride]), WebPMemToUint32(&b[1 * stride]));
+ WebPMemToInt32(&b[7 * stride]), WebPMemToInt32(&b[3 * stride]),
+ WebPMemToInt32(&b[5 * stride]), WebPMemToInt32(&b[1 * stride]));
// B0 = 53 43 52 42 51 41 50 40 13 03 12 02 11 01 10 00
// B1 = 73 63 72 62 71 61 70 60 33 23 32 22 31 21 30 20
@@ -540,7 +540,7 @@ static WEBP_INLINE void Store4x4_SSE2(__m128i* const x,
uint8_t* dst, int stride) {
int i;
for (i = 0; i < 4; ++i, dst += stride) {
- WebPUint32ToMem(dst, _mm_cvtsi128_si32(*x));
+ WebPInt32ToMem(dst, _mm_cvtsi128_si32(*x));
*x = _mm_srli_si128(*x, 4);
}
}
@@ -908,10 +908,10 @@ static void VE4_SSE2(uint8_t* dst) { // vertical
const __m128i lsb = _mm_and_si128(_mm_xor_si128(ABCDEFGH, CDEFGH00), one);
const __m128i b = _mm_subs_epu8(a, lsb);
const __m128i avg = _mm_avg_epu8(b, BCDEFGH0);
- const uint32_t vals = _mm_cvtsi128_si32(avg);
+ const int vals = _mm_cvtsi128_si32(avg);
int i;
for (i = 0; i < 4; ++i) {
- WebPUint32ToMem(dst + i * BPS, vals);
+ WebPInt32ToMem(dst + i * BPS, vals);
}
}
@@ -925,10 +925,10 @@ static void LD4_SSE2(uint8_t* dst) { // Down-Left
const __m128i lsb = _mm_and_si128(_mm_xor_si128(ABCDEFGH, CDEFGHH0), one);
const __m128i avg2 = _mm_subs_epu8(avg1, lsb);
const __m128i abcdefg = _mm_avg_epu8(avg2, BCDEFGH0);
- WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcdefg ));
- WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1)));
- WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2)));
- WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3)));
+ WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcdefg ));
+ WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1)));
+ WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2)));
+ WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3)));
}
static void VR4_SSE2(uint8_t* dst) { // Vertical-Right
@@ -946,10 +946,10 @@ static void VR4_SSE2(uint8_t* dst) { // Vertical-Right
const __m128i lsb = _mm_and_si128(_mm_xor_si128(IXABCD, ABCD0), one);
const __m128i avg2 = _mm_subs_epu8(avg1, lsb);
const __m128i efgh = _mm_avg_epu8(avg2, XABCD);
- WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcd ));
- WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( efgh ));
- WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(abcd, 1)));
- WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(efgh, 1)));
+ WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcd ));
+ WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( efgh ));
+ WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(abcd, 1)));
+ WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(efgh, 1)));
// these two are hard to implement in SSE2, so we keep the C-version:
DST(0, 2) = AVG3(J, I, X);
@@ -970,11 +970,12 @@ static void VL4_SSE2(uint8_t* dst) { // Vertical-Left
const __m128i abbc = _mm_or_si128(ab, bc);
const __m128i lsb2 = _mm_and_si128(abbc, lsb1);
const __m128i avg4 = _mm_subs_epu8(avg3, lsb2);
- const uint32_t extra_out = _mm_cvtsi128_si32(_mm_srli_si128(avg4, 4));
- WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( avg1 ));
- WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( avg4 ));
- WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg1, 1)));
- WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg4, 1)));
+ const uint32_t extra_out =
+ (uint32_t)_mm_cvtsi128_si32(_mm_srli_si128(avg4, 4));
+ WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( avg1 ));
+ WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( avg4 ));
+ WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg1, 1)));
+ WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg4, 1)));
// these two are hard to get and irregular
DST(3, 2) = (extra_out >> 0) & 0xff;
@@ -990,7 +991,7 @@ static void RD4_SSE2(uint8_t* dst) { // Down-right
const uint32_t K = dst[-1 + 2 * BPS];
const uint32_t L = dst[-1 + 3 * BPS];
const __m128i LKJI_____ =
- _mm_cvtsi32_si128(L | (K << 8) | (J << 16) | (I << 24));
+ _mm_cvtsi32_si128((int)(L | (K << 8) | (J << 16) | (I << 24)));
const __m128i LKJIXABCD = _mm_or_si128(LKJI_____, ____XABCD);
const __m128i KJIXABCD_ = _mm_srli_si128(LKJIXABCD, 1);
const __m128i JIXABCD__ = _mm_srli_si128(LKJIXABCD, 2);
@@ -998,10 +999,10 @@ static void RD4_SSE2(uint8_t* dst) { // Down-right
const __m128i lsb = _mm_and_si128(_mm_xor_si128(JIXABCD__, LKJIXABCD), one);
const __m128i avg2 = _mm_subs_epu8(avg1, lsb);
const __m128i abcdefg = _mm_avg_epu8(avg2, KJIXABCD_);
- WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32( abcdefg ));
- WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1)));
- WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2)));
- WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3)));
+ WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32( abcdefg ));
+ WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1)));
+ WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2)));
+ WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3)));
}
#undef DST
@@ -1015,13 +1016,13 @@ static WEBP_INLINE void TrueMotion_SSE2(uint8_t* dst, int size) {
const __m128i zero = _mm_setzero_si128();
int y;
if (size == 4) {
- const __m128i top_values = _mm_cvtsi32_si128(WebPMemToUint32(top));
+ const __m128i top_values = _mm_cvtsi32_si128(WebPMemToInt32(top));
const __m128i top_base = _mm_unpacklo_epi8(top_values, zero);
for (y = 0; y < 4; ++y, dst += BPS) {
const int val = dst[-1] - top[-1];
const __m128i base = _mm_set1_epi16(val);
const __m128i out = _mm_packus_epi16(_mm_add_epi16(base, top_base), zero);
- WebPUint32ToMem(dst, _mm_cvtsi128_si32(out));
+ WebPInt32ToMem(dst, _mm_cvtsi128_si32(out));
}
} else if (size == 8) {
const __m128i top_values = _mm_loadl_epi64((const __m128i*)top);
@@ -1062,7 +1063,7 @@ static void VE16_SSE2(uint8_t* dst) {
static void HE16_SSE2(uint8_t* dst) { // horizontal
int j;
for (j = 16; j > 0; --j) {
- const __m128i values = _mm_set1_epi8(dst[-1]);
+ const __m128i values = _mm_set1_epi8((char)dst[-1]);
_mm_storeu_si128((__m128i*)dst, values);
dst += BPS;
}
@@ -1070,7 +1071,7 @@ static void HE16_SSE2(uint8_t* dst) { // horizontal
static WEBP_INLINE void Put16_SSE2(uint8_t v, uint8_t* dst) {
int j;
- const __m128i values = _mm_set1_epi8(v);
+ const __m128i values = _mm_set1_epi8((char)v);
for (j = 0; j < 16; ++j) {
_mm_storeu_si128((__m128i*)(dst + j * BPS), values);
}
@@ -1130,7 +1131,7 @@ static void VE8uv_SSE2(uint8_t* dst) { // vertical
// helper for chroma-DC predictions
static WEBP_INLINE void Put8x8uv_SSE2(uint8_t v, uint8_t* dst) {
int j;
- const __m128i values = _mm_set1_epi8(v);
+ const __m128i values = _mm_set1_epi8((char)v);
for (j = 0; j < 8; ++j) {
_mm_storel_epi64((__m128i*)(dst + j * BPS), values);
}
diff --git a/src/3rdparty/libwebp/src/dsp/dec_sse41.c b/src/3rdparty/libwebp/src/dsp/dec_sse41.c
index 8f18506..08a3630 100644
--- a/src/3rdparty/libwebp/src/dsp/dec_sse41.c
+++ b/src/3rdparty/libwebp/src/dsp/dec_sse41.c
@@ -23,7 +23,7 @@ static void HE16_SSE41(uint8_t* dst) { // horizontal
int j;
const __m128i kShuffle3 = _mm_set1_epi8(3);
for (j = 16; j > 0; --j) {
- const __m128i in = _mm_cvtsi32_si128(WebPMemToUint32(dst - 4));
+ const __m128i in = _mm_cvtsi32_si128(WebPMemToInt32(dst - 4));
const __m128i values = _mm_shuffle_epi8(in, kShuffle3);
_mm_storeu_si128((__m128i*)dst, values);
dst += BPS;
diff --git a/src/3rdparty/libwebp/src/dsp/dsp.h b/src/3rdparty/libwebp/src/dsp/dsp.h
index 0d7f3fb..d2000b8 100644
--- a/src/3rdparty/libwebp/src/dsp/dsp.h
+++ b/src/3rdparty/libwebp/src/dsp/dsp.h
@@ -18,6 +18,7 @@
#include "src/webp/config.h"
#endif
+#include "src/dsp/cpu.h"
#include "src/webp/types.h"
#ifdef __cplusplus
@@ -27,199 +28,22 @@ extern "C" {
#define BPS 32 // this is the common stride for enc/dec
//------------------------------------------------------------------------------
-// CPU detection
-
+// WEBP_RESTRICT
+
+// Declares a pointer with the restrict type qualifier if available.
+// This allows code to hint to the compiler that only this pointer references a
+// particular object or memory region within the scope of the block in which it
+// is declared. This may allow for improved optimizations due to the lack of
+// pointer aliasing. See also:
+// https://en.cppreference.com/w/c/language/restrict
#if defined(__GNUC__)
-# define LOCAL_GCC_VERSION ((__GNUC__ << 8) | __GNUC_MINOR__)
-# define LOCAL_GCC_PREREQ(maj, min) \
- (LOCAL_GCC_VERSION >= (((maj) << 8) | (min)))
-#else
-# define LOCAL_GCC_VERSION 0
-# define LOCAL_GCC_PREREQ(maj, min) 0
-#endif
-
-#if defined(__clang__)
-# define LOCAL_CLANG_VERSION ((__clang_major__ << 8) | __clang_minor__)
-# define LOCAL_CLANG_PREREQ(maj, min) \
- (LOCAL_CLANG_VERSION >= (((maj) << 8) | (min)))
+#define WEBP_RESTRICT __restrict__
+#elif defined(_MSC_VER)
+#define WEBP_RESTRICT __restrict
#else
-# define LOCAL_CLANG_VERSION 0
-# define LOCAL_CLANG_PREREQ(maj, min) 0
-#endif
-
-#ifndef __has_builtin
-# define __has_builtin(x) 0
-#endif
-
-// for now, none of the optimizations below are available in emscripten
-#if !defined(EMSCRIPTEN)
-
-#if defined(_MSC_VER) && _MSC_VER > 1310 && \
- (defined(_M_X64) || defined(_M_IX86)) && !defined(__clang__)
-#define WEBP_MSC_SSE2 // Visual C++ SSE2 targets
-#endif
-
-#if defined(_MSC_VER) && _MSC_VER >= 1500 && \
- (defined(_M_X64) || defined(_M_IX86)) && !defined(__clang__)
-#define WEBP_MSC_SSE41 // Visual C++ SSE4.1 targets
-#endif
-
-// WEBP_HAVE_* are used to indicate the presence of the instruction set in dsp
-// files without intrinsics, allowing the corresponding Init() to be called.
-// Files containing intrinsics will need to be built targeting the instruction
-// set so should succeed on one of the earlier tests.
-#if defined(__SSE2__) || defined(WEBP_MSC_SSE2) || defined(WEBP_HAVE_SSE2)
-#define WEBP_USE_SSE2
-#endif
-
-#if defined(__SSE4_1__) || defined(WEBP_MSC_SSE41) || defined(WEBP_HAVE_SSE41)
-#define WEBP_USE_SSE41
-#endif
-
-// The intrinsics currently cause compiler errors with arm-nacl-gcc and the
-// inline assembly would need to be modified for use with Native Client.
-#if (defined(__ARM_NEON__) || \
- defined(__aarch64__) || defined(WEBP_HAVE_NEON)) && \
- !defined(__native_client__)
-#define WEBP_USE_NEON
-#endif
-
-#if !defined(WEBP_USE_NEON) && defined(__ANDROID__) && \
- defined(__ARM_ARCH_7A__) && defined(HAVE_CPU_FEATURES_H)
-#define WEBP_ANDROID_NEON // Android targets that may have NEON
-#define WEBP_USE_NEON
-#endif
-
-#if defined(_MSC_VER) && _MSC_VER >= 1700 && defined(_M_ARM) && !defined(__clang__)
-#define WEBP_USE_NEON
-#define WEBP_USE_INTRINSICS
+#define WEBP_RESTRICT
#endif
-#if defined(__mips__) && !defined(__mips64) && \
- defined(__mips_isa_rev) && (__mips_isa_rev >= 1) && (__mips_isa_rev < 6)
-#define WEBP_USE_MIPS32
-#if (__mips_isa_rev >= 2)
-#define WEBP_USE_MIPS32_R2
-#if defined(__mips_dspr2) || (defined(__mips_dsp_rev) && __mips_dsp_rev >= 2)
-#define WEBP_USE_MIPS_DSP_R2
-#endif
-#endif
-#endif
-
-#if defined(__mips_msa) && defined(__mips_isa_rev) && (__mips_isa_rev >= 5)
-#define WEBP_USE_MSA
-#endif
-
-#endif /* EMSCRIPTEN */
-
-#ifndef WEBP_DSP_OMIT_C_CODE
-#define WEBP_DSP_OMIT_C_CODE 1
-#endif
-
-#if (defined(__aarch64__) || defined(__ARM_NEON__)) && WEBP_DSP_OMIT_C_CODE
-#define WEBP_NEON_OMIT_C_CODE 1
-#else
-#define WEBP_NEON_OMIT_C_CODE 0
-#endif
-
-#if !(LOCAL_CLANG_PREREQ(3,8) || LOCAL_GCC_PREREQ(4,8) || defined(__aarch64__))
-#define WEBP_NEON_WORK_AROUND_GCC 1
-#else
-#define WEBP_NEON_WORK_AROUND_GCC 0
-#endif
-
-// This macro prevents thread_sanitizer from reporting known concurrent writes.
-#define WEBP_TSAN_IGNORE_FUNCTION
-#if defined(__has_feature)
-#if __has_feature(thread_sanitizer)
-#undef WEBP_TSAN_IGNORE_FUNCTION
-#define WEBP_TSAN_IGNORE_FUNCTION __attribute__((no_sanitize_thread))
-#endif
-#endif
-
-#if defined(WEBP_USE_THREAD) && !defined(_WIN32)
-#include <pthread.h> // NOLINT
-
-#define WEBP_DSP_INIT(func) do { \
- static volatile VP8CPUInfo func ## _last_cpuinfo_used = \
- (VP8CPUInfo)&func ## _last_cpuinfo_used; \
- static pthread_mutex_t func ## _lock = PTHREAD_MUTEX_INITIALIZER; \
- if (pthread_mutex_lock(&func ## _lock)) break; \
- if (func ## _last_cpuinfo_used != VP8GetCPUInfo) func(); \
- func ## _last_cpuinfo_used = VP8GetCPUInfo; \
- (void)pthread_mutex_unlock(&func ## _lock); \
-} while (0)
-#else // !(defined(WEBP_USE_THREAD) && !defined(_WIN32))
-#define WEBP_DSP_INIT(func) do { \
- static volatile VP8CPUInfo func ## _last_cpuinfo_used = \
- (VP8CPUInfo)&func ## _last_cpuinfo_used; \
- if (func ## _last_cpuinfo_used == VP8GetCPUInfo) break; \
- func(); \
- func ## _last_cpuinfo_used = VP8GetCPUInfo; \
-} while (0)
-#endif // defined(WEBP_USE_THREAD) && !defined(_WIN32)
-
-// Defines an Init + helper function that control multiple initialization of
-// function pointers / tables.
-/* Usage:
- WEBP_DSP_INIT_FUNC(InitFunc) {
- ...function body
- }
-*/
-#define WEBP_DSP_INIT_FUNC(name) \
- static WEBP_TSAN_IGNORE_FUNCTION void name ## _body(void); \
- WEBP_TSAN_IGNORE_FUNCTION void name(void) { \
- WEBP_DSP_INIT(name ## _body); \
- } \
- static WEBP_TSAN_IGNORE_FUNCTION void name ## _body(void)
-
-#define WEBP_UBSAN_IGNORE_UNDEF
-#define WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW
-#if defined(__clang__) && defined(__has_attribute)
-#if __has_attribute(no_sanitize)
-// This macro prevents the undefined behavior sanitizer from reporting
-// failures. This is only meant to silence unaligned loads on platforms that
-// are known to support them.
-#undef WEBP_UBSAN_IGNORE_UNDEF
-#define WEBP_UBSAN_IGNORE_UNDEF \
- __attribute__((no_sanitize("undefined")))
-
-// This macro prevents the undefined behavior sanitizer from reporting
-// failures related to unsigned integer overflows. This is only meant to
-// silence cases where this well defined behavior is expected.
-#undef WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW
-#define WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW \
- __attribute__((no_sanitize("unsigned-integer-overflow")))
-#endif
-#endif
-
-// Regularize the definition of WEBP_SWAP_16BIT_CSP (backward compatibility)
-#if !defined(WEBP_SWAP_16BIT_CSP)
-#define WEBP_SWAP_16BIT_CSP 0
-#endif
-
-// some endian fix (e.g.: mips-gcc doesn't define __BIG_ENDIAN__)
-#if !defined(WORDS_BIGENDIAN) && \
- (defined(__BIG_ENDIAN__) || defined(_M_PPC) || \
- (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)))
-#define WORDS_BIGENDIAN
-#endif
-
-typedef enum {
- kSSE2,
- kSSE3,
- kSlowSSSE3, // special feature for slow SSSE3 architectures
- kSSE4_1,
- kAVX,
- kAVX2,
- kNEON,
- kMIPS32,
- kMIPSdspR2,
- kMSA
-} CPUFeature;
-// returns true if the CPU supports the feature.
-typedef int (*VP8CPUInfo)(CPUFeature feature);
-WEBP_EXTERN VP8CPUInfo VP8GetCPUInfo;
//------------------------------------------------------------------------------
// Init stub generator
@@ -246,9 +70,9 @@ extern VP8Fdct VP8FTransform2; // performs two transforms at a time
extern VP8WHT VP8FTransformWHT;
// Predictions
// *dst is the destination block. *top and *left can be NULL.
-typedef void (*VP8IntraPreds)(uint8_t *dst, const uint8_t* left,
+typedef void (*VP8IntraPreds)(uint8_t* dst, const uint8_t* left,
const uint8_t* top);
-typedef void (*VP8Intra4Preds)(uint8_t *dst, const uint8_t* top);
+typedef void (*VP8Intra4Preds)(uint8_t* dst, const uint8_t* top);
extern VP8Intra4Preds VP8EncPredLuma4;
extern VP8IntraPreds VP8EncPredLuma16;
extern VP8IntraPreds VP8EncPredChroma8;
@@ -508,15 +332,6 @@ extern void WebPConvertARGBToUV_C(const uint32_t* argb, uint8_t* u, uint8_t* v,
extern void WebPConvertRGBA32ToUV_C(const uint16_t* rgb,
uint8_t* u, uint8_t* v, int width);
-// utilities for accurate RGB->YUV conversion
-extern uint64_t (*WebPSharpYUVUpdateY)(const uint16_t* src, const uint16_t* ref,
- uint16_t* dst, int len);
-extern void (*WebPSharpYUVUpdateRGB)(const int16_t* src, const int16_t* ref,
- int16_t* dst, int len);
-extern void (*WebPSharpYUVFilterRow)(const int16_t* A, const int16_t* B,
- int len,
- const uint16_t* best_y, uint16_t* out);
-
// Must be called before using the above.
void WebPInitConvertARGBToYUV(void);
@@ -572,26 +387,29 @@ extern void (*WebPApplyAlphaMultiply4444)(
// Dispatch the values from alpha[] plane to the ARGB destination 'dst'.
// Returns true if alpha[] plane has non-trivial values different from 0xff.
-extern int (*WebPDispatchAlpha)(const uint8_t* alpha, int alpha_stride,
- int width, int height,
- uint8_t* dst, int dst_stride);
+extern int (*WebPDispatchAlpha)(const uint8_t* WEBP_RESTRICT alpha,
+ int alpha_stride, int width, int height,
+ uint8_t* WEBP_RESTRICT dst, int dst_stride);
// Transfer packed 8b alpha[] values to green channel in dst[], zero'ing the
// A/R/B values. 'dst_stride' is the stride for dst[] in uint32_t units.
-extern void (*WebPDispatchAlphaToGreen)(const uint8_t* alpha, int alpha_stride,
- int width, int height,
- uint32_t* dst, int dst_stride);
+extern void (*WebPDispatchAlphaToGreen)(const uint8_t* WEBP_RESTRICT alpha,
+ int alpha_stride, int width, int height,
+ uint32_t* WEBP_RESTRICT dst,
+ int dst_stride);
// Extract the alpha values from 32b values in argb[] and pack them into alpha[]
// (this is the opposite of WebPDispatchAlpha).
// Returns true if there's only trivial 0xff alpha values.
-extern int (*WebPExtractAlpha)(const uint8_t* argb, int argb_stride,
- int width, int height,
- uint8_t* alpha, int alpha_stride);
+extern int (*WebPExtractAlpha)(const uint8_t* WEBP_RESTRICT argb,
+ int argb_stride, int width, int height,
+ uint8_t* WEBP_RESTRICT alpha,
+ int alpha_stride);
// Extract the green values from 32b values in argb[] and pack them into alpha[]
// (this is the opposite of WebPDispatchAlphaToGreen).
-extern void (*WebPExtractGreen)(const uint32_t* argb, uint8_t* alpha, int size);
+extern void (*WebPExtractGreen)(const uint32_t* WEBP_RESTRICT argb,
+ uint8_t* WEBP_RESTRICT alpha, int size);
// Pre-Multiply operation transforms x into x * A / 255 (where x=Y,R,G or B).
// Un-Multiply operation transforms x into x * 255 / A.
@@ -604,34 +422,42 @@ void WebPMultARGBRows(uint8_t* ptr, int stride, int width, int num_rows,
int inverse);
// Same for a row of single values, with side alpha values.
-extern void (*WebPMultRow)(uint8_t* const ptr, const uint8_t* const alpha,
+extern void (*WebPMultRow)(uint8_t* WEBP_RESTRICT const ptr,
+ const uint8_t* WEBP_RESTRICT const alpha,
int width, int inverse);
// Same a WebPMultRow(), but for several 'num_rows' rows.
-void WebPMultRows(uint8_t* ptr, int stride,
- const uint8_t* alpha, int alpha_stride,
+void WebPMultRows(uint8_t* WEBP_RESTRICT ptr, int stride,
+ const uint8_t* WEBP_RESTRICT alpha, int alpha_stride,
int width, int num_rows, int inverse);
// Plain-C versions, used as fallback by some implementations.
-void WebPMultRow_C(uint8_t* const ptr, const uint8_t* const alpha,
+void WebPMultRow_C(uint8_t* WEBP_RESTRICT const ptr,
+ const uint8_t* WEBP_RESTRICT const alpha,
int width, int inverse);
void WebPMultARGBRow_C(uint32_t* const ptr, int width, int inverse);
#ifdef WORDS_BIGENDIAN
// ARGB packing function: a/r/g/b input is rgba or bgra order.
-extern void (*WebPPackARGB)(const uint8_t* a, const uint8_t* r,
- const uint8_t* g, const uint8_t* b, int len,
- uint32_t* out);
+extern void (*WebPPackARGB)(const uint8_t* WEBP_RESTRICT a,
+ const uint8_t* WEBP_RESTRICT r,
+ const uint8_t* WEBP_RESTRICT g,
+ const uint8_t* WEBP_RESTRICT b,
+ int len, uint32_t* WEBP_RESTRICT out);
#endif
// RGB packing function. 'step' can be 3 or 4. r/g/b input is rgb or bgr order.
-extern void (*WebPPackRGB)(const uint8_t* r, const uint8_t* g, const uint8_t* b,
- int len, int step, uint32_t* out);
+extern void (*WebPPackRGB)(const uint8_t* WEBP_RESTRICT r,
+ const uint8_t* WEBP_RESTRICT g,
+ const uint8_t* WEBP_RESTRICT b,
+ int len, int step, uint32_t* WEBP_RESTRICT out);
// This function returns true if src[i] contains a value different from 0xff.
extern int (*WebPHasAlpha8b)(const uint8_t* src, int length);
// This function returns true if src[4*i] contains a value different from 0xff.
extern int (*WebPHasAlpha32b)(const uint8_t* src, int length);
+// replaces transparent values in src[] by 'color'.
+extern void (*WebPAlphaReplace)(uint32_t* src, int length, uint32_t color);
// To be called first before using the above.
void WebPInitAlphaProcessing(void);
diff --git a/src/3rdparty/libwebp/src/dsp/enc.c b/src/3rdparty/libwebp/src/dsp/enc.c
index 2fddbc4..ea47a3f 100644
--- a/src/3rdparty/libwebp/src/dsp/enc.c
+++ b/src/3rdparty/libwebp/src/dsp/enc.c
@@ -773,10 +773,10 @@ WEBP_DSP_INIT_FUNC(VP8EncDspInit) {
// If defined, use CPUInfo() to overwrite some pointers with faster versions.
if (VP8GetCPUInfo != NULL) {
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
if (VP8GetCPUInfo(kSSE2)) {
VP8EncDspInitSSE2();
-#if defined(WEBP_USE_SSE41)
+#if defined(WEBP_HAVE_SSE41)
if (VP8GetCPUInfo(kSSE4_1)) {
VP8EncDspInitSSE41();
}
@@ -800,7 +800,7 @@ WEBP_DSP_INIT_FUNC(VP8EncDspInit) {
#endif
}
-#if defined(WEBP_USE_NEON)
+#if defined(WEBP_HAVE_NEON)
if (WEBP_NEON_OMIT_C_CODE ||
(VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) {
VP8EncDspInitNEON();
diff --git a/src/3rdparty/libwebp/src/dsp/enc_neon.c b/src/3rdparty/libwebp/src/dsp/enc_neon.c
index 43bf124..3a04111 100644
--- a/src/3rdparty/libwebp/src/dsp/enc_neon.c
+++ b/src/3rdparty/libwebp/src/dsp/enc_neon.c
@@ -9,7 +9,7 @@
//
// ARM NEON version of speed-critical encoding functions.
//
-// adapted from libvpx (http://www.webmproject.org/code/)
+// adapted from libvpx (https://www.webmproject.org/code/)
#include "src/dsp/dsp.h"
@@ -764,9 +764,14 @@ static WEBP_INLINE void AccumulateSSE16_NEON(const uint8_t* const a,
// Horizontal sum of all four uint32_t values in 'sum'.
static int SumToInt_NEON(uint32x4_t sum) {
+#if defined(__aarch64__)
+ return (int)vaddvq_u32(sum);
+#else
const uint64x2_t sum2 = vpaddlq_u32(sum);
- const uint64_t sum3 = vgetq_lane_u64(sum2, 0) + vgetq_lane_u64(sum2, 1);
- return (int)sum3;
+ const uint32x2_t sum3 = vadd_u32(vreinterpret_u32_u64(vget_low_u64(sum2)),
+ vreinterpret_u32_u64(vget_high_u64(sum2)));
+ return (int)vget_lane_u32(sum3, 0);
+#endif
}
static int SSE16x16_NEON(const uint8_t* a, const uint8_t* b) {
diff --git a/src/3rdparty/libwebp/src/dsp/enc_sse2.c b/src/3rdparty/libwebp/src/dsp/enc_sse2.c
index b2e78ed..1d10556 100644
--- a/src/3rdparty/libwebp/src/dsp/enc_sse2.c
+++ b/src/3rdparty/libwebp/src/dsp/enc_sse2.c
@@ -156,10 +156,10 @@ static void ITransform_SSE2(const uint8_t* ref, const int16_t* in, uint8_t* dst,
ref3 = _mm_loadl_epi64((const __m128i*)&ref[3 * BPS]);
} else {
// Load four bytes/pixels per line.
- ref0 = _mm_cvtsi32_si128(WebPMemToUint32(&ref[0 * BPS]));
- ref1 = _mm_cvtsi32_si128(WebPMemToUint32(&ref[1 * BPS]));
- ref2 = _mm_cvtsi32_si128(WebPMemToUint32(&ref[2 * BPS]));
- ref3 = _mm_cvtsi32_si128(WebPMemToUint32(&ref[3 * BPS]));
+ ref0 = _mm_cvtsi32_si128(WebPMemToInt32(&ref[0 * BPS]));
+ ref1 = _mm_cvtsi32_si128(WebPMemToInt32(&ref[1 * BPS]));
+ ref2 = _mm_cvtsi32_si128(WebPMemToInt32(&ref[2 * BPS]));
+ ref3 = _mm_cvtsi32_si128(WebPMemToInt32(&ref[3 * BPS]));
}
// Convert to 16b.
ref0 = _mm_unpacklo_epi8(ref0, zero);
@@ -185,10 +185,10 @@ static void ITransform_SSE2(const uint8_t* ref, const int16_t* in, uint8_t* dst,
_mm_storel_epi64((__m128i*)&dst[3 * BPS], ref3);
} else {
// Store four bytes/pixels per line.
- WebPUint32ToMem(&dst[0 * BPS], _mm_cvtsi128_si32(ref0));
- WebPUint32ToMem(&dst[1 * BPS], _mm_cvtsi128_si32(ref1));
- WebPUint32ToMem(&dst[2 * BPS], _mm_cvtsi128_si32(ref2));
- WebPUint32ToMem(&dst[3 * BPS], _mm_cvtsi128_si32(ref3));
+ WebPInt32ToMem(&dst[0 * BPS], _mm_cvtsi128_si32(ref0));
+ WebPInt32ToMem(&dst[1 * BPS], _mm_cvtsi128_si32(ref1));
+ WebPInt32ToMem(&dst[2 * BPS], _mm_cvtsi128_si32(ref2));
+ WebPInt32ToMem(&dst[3 * BPS], _mm_cvtsi128_si32(ref3));
}
}
}
@@ -481,7 +481,7 @@ static void CollectHistogram_SSE2(const uint8_t* ref, const uint8_t* pred,
// helper for chroma-DC predictions
static WEBP_INLINE void Put8x8uv_SSE2(uint8_t v, uint8_t* dst) {
int j;
- const __m128i values = _mm_set1_epi8(v);
+ const __m128i values = _mm_set1_epi8((char)v);
for (j = 0; j < 8; ++j) {
_mm_storel_epi64((__m128i*)(dst + j * BPS), values);
}
@@ -489,7 +489,7 @@ static WEBP_INLINE void Put8x8uv_SSE2(uint8_t v, uint8_t* dst) {
static WEBP_INLINE void Put16_SSE2(uint8_t v, uint8_t* dst) {
int j;
- const __m128i values = _mm_set1_epi8(v);
+ const __m128i values = _mm_set1_epi8((char)v);
for (j = 0; j < 16; ++j) {
_mm_store_si128((__m128i*)(dst + j * BPS), values);
}
@@ -540,7 +540,7 @@ static WEBP_INLINE void VerticalPred_SSE2(uint8_t* dst,
static WEBP_INLINE void HE8uv_SSE2(uint8_t* dst, const uint8_t* left) {
int j;
for (j = 0; j < 8; ++j) {
- const __m128i values = _mm_set1_epi8(left[j]);
+ const __m128i values = _mm_set1_epi8((char)left[j]);
_mm_storel_epi64((__m128i*)dst, values);
dst += BPS;
}
@@ -549,7 +549,7 @@ static WEBP_INLINE void HE8uv_SSE2(uint8_t* dst, const uint8_t* left) {
static WEBP_INLINE void HE16_SSE2(uint8_t* dst, const uint8_t* left) {
int j;
for (j = 0; j < 16; ++j) {
- const __m128i values = _mm_set1_epi8(left[j]);
+ const __m128i values = _mm_set1_epi8((char)left[j]);
_mm_store_si128((__m128i*)dst, values);
dst += BPS;
}
@@ -722,10 +722,10 @@ static WEBP_INLINE void VE4_SSE2(uint8_t* dst,
const __m128i lsb = _mm_and_si128(_mm_xor_si128(ABCDEFGH, CDEFGH00), one);
const __m128i b = _mm_subs_epu8(a, lsb);
const __m128i avg = _mm_avg_epu8(b, BCDEFGH0);
- const uint32_t vals = _mm_cvtsi128_si32(avg);
+ const int vals = _mm_cvtsi128_si32(avg);
int i;
for (i = 0; i < 4; ++i) {
- WebPUint32ToMem(dst + i * BPS, vals);
+ WebPInt32ToMem(dst + i * BPS, vals);
}
}
@@ -760,10 +760,10 @@ static WEBP_INLINE void LD4_SSE2(uint8_t* dst,
const __m128i lsb = _mm_and_si128(_mm_xor_si128(ABCDEFGH, CDEFGHH0), one);
const __m128i avg2 = _mm_subs_epu8(avg1, lsb);
const __m128i abcdefg = _mm_avg_epu8(avg2, BCDEFGH0);
- WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcdefg ));
- WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1)));
- WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2)));
- WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3)));
+ WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcdefg ));
+ WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1)));
+ WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2)));
+ WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3)));
}
static WEBP_INLINE void VR4_SSE2(uint8_t* dst,
@@ -782,10 +782,10 @@ static WEBP_INLINE void VR4_SSE2(uint8_t* dst,
const __m128i lsb = _mm_and_si128(_mm_xor_si128(IXABCD, ABCD0), one);
const __m128i avg2 = _mm_subs_epu8(avg1, lsb);
const __m128i efgh = _mm_avg_epu8(avg2, XABCD);
- WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcd ));
- WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( efgh ));
- WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(abcd, 1)));
- WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(efgh, 1)));
+ WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcd ));
+ WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( efgh ));
+ WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(abcd, 1)));
+ WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(efgh, 1)));
// these two are hard to implement in SSE2, so we keep the C-version:
DST(0, 2) = AVG3(J, I, X);
@@ -807,11 +807,12 @@ static WEBP_INLINE void VL4_SSE2(uint8_t* dst,
const __m128i abbc = _mm_or_si128(ab, bc);
const __m128i lsb2 = _mm_and_si128(abbc, lsb1);
const __m128i avg4 = _mm_subs_epu8(avg3, lsb2);
- const uint32_t extra_out = _mm_cvtsi128_si32(_mm_srli_si128(avg4, 4));
- WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( avg1 ));
- WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( avg4 ));
- WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg1, 1)));
- WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg4, 1)));
+ const uint32_t extra_out =
+ (uint32_t)_mm_cvtsi128_si32(_mm_srli_si128(avg4, 4));
+ WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( avg1 ));
+ WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( avg4 ));
+ WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg1, 1)));
+ WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg4, 1)));
// these two are hard to get and irregular
DST(3, 2) = (extra_out >> 0) & 0xff;
@@ -829,10 +830,10 @@ static WEBP_INLINE void RD4_SSE2(uint8_t* dst,
const __m128i lsb = _mm_and_si128(_mm_xor_si128(JIXABCD__, LKJIXABCD), one);
const __m128i avg2 = _mm_subs_epu8(avg1, lsb);
const __m128i abcdefg = _mm_avg_epu8(avg2, KJIXABCD_);
- WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32( abcdefg ));
- WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1)));
- WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2)));
- WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3)));
+ WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32( abcdefg ));
+ WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1)));
+ WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2)));
+ WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3)));
}
static WEBP_INLINE void HU4_SSE2(uint8_t* dst, const uint8_t* top) {
@@ -875,14 +876,14 @@ static WEBP_INLINE void HD4_SSE2(uint8_t* dst, const uint8_t* top) {
static WEBP_INLINE void TM4_SSE2(uint8_t* dst, const uint8_t* top) {
const __m128i zero = _mm_setzero_si128();
- const __m128i top_values = _mm_cvtsi32_si128(WebPMemToUint32(top));
+ const __m128i top_values = _mm_cvtsi32_si128(WebPMemToInt32(top));
const __m128i top_base = _mm_unpacklo_epi8(top_values, zero);
int y;
for (y = 0; y < 4; ++y, dst += BPS) {
const int val = top[-2 - y] - top[-1];
const __m128i base = _mm_set1_epi16(val);
const __m128i out = _mm_packus_epi16(_mm_add_epi16(base, top_base), zero);
- WebPUint32ToMem(dst, _mm_cvtsi128_si32(out));
+ WebPInt32ToMem(dst, _mm_cvtsi128_si32(out));
}
}
diff --git a/src/3rdparty/libwebp/src/dsp/filters.c b/src/3rdparty/libwebp/src/dsp/filters.c
index 9e910d9..4506567 100644
--- a/src/3rdparty/libwebp/src/dsp/filters.c
+++ b/src/3rdparty/libwebp/src/dsp/filters.c
@@ -254,7 +254,7 @@ WEBP_DSP_INIT_FUNC(VP8FiltersInit) {
#endif
if (VP8GetCPUInfo != NULL) {
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
if (VP8GetCPUInfo(kSSE2)) {
VP8FiltersInitSSE2();
}
@@ -271,7 +271,7 @@ WEBP_DSP_INIT_FUNC(VP8FiltersInit) {
#endif
}
-#if defined(WEBP_USE_NEON)
+#if defined(WEBP_HAVE_NEON)
if (WEBP_NEON_OMIT_C_CODE ||
(VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) {
VP8FiltersInitNEON();
diff --git a/src/3rdparty/libwebp/src/dsp/filters_sse2.c b/src/3rdparty/libwebp/src/dsp/filters_sse2.c
index 4b3f2d0..5c33ec1 100644
--- a/src/3rdparty/libwebp/src/dsp/filters_sse2.c
+++ b/src/3rdparty/libwebp/src/dsp/filters_sse2.c
@@ -320,7 +320,12 @@ extern void VP8FiltersInitSSE2(void);
WEBP_TSAN_IGNORE_FUNCTION void VP8FiltersInitSSE2(void) {
WebPUnfilters[WEBP_FILTER_HORIZONTAL] = HorizontalUnfilter_SSE2;
+#if defined(CHROMIUM)
+ // TODO(crbug.com/654974)
+ (void)VerticalUnfilter_SSE2;
+#else
WebPUnfilters[WEBP_FILTER_VERTICAL] = VerticalUnfilter_SSE2;
+#endif
WebPUnfilters[WEBP_FILTER_GRADIENT] = GradientUnfilter_SSE2;
WebPFilters[WEBP_FILTER_HORIZONTAL] = HorizontalFilter_SSE2;
diff --git a/src/3rdparty/libwebp/src/dsp/lossless.c b/src/3rdparty/libwebp/src/dsp/lossless.c
index d05af84..fb86e58 100644
--- a/src/3rdparty/libwebp/src/dsp/lossless.c
+++ b/src/3rdparty/libwebp/src/dsp/lossless.c
@@ -49,7 +49,7 @@ static WEBP_INLINE uint32_t Clip255(uint32_t a) {
}
static WEBP_INLINE int AddSubtractComponentFull(int a, int b, int c) {
- return Clip255(a + b - c);
+ return Clip255((uint32_t)(a + b - c));
}
static WEBP_INLINE uint32_t ClampedAddSubtractFull(uint32_t c0, uint32_t c1,
@@ -66,7 +66,7 @@ static WEBP_INLINE uint32_t ClampedAddSubtractFull(uint32_t c0, uint32_t c1,
}
static WEBP_INLINE int AddSubtractComponentHalf(int a, int b) {
- return Clip255(a + (a - b) / 2);
+ return Clip255((uint32_t)(a + (a - b) / 2));
}
static WEBP_INLINE uint32_t ClampedAddSubtractHalf(uint32_t c0, uint32_t c1,
@@ -81,7 +81,7 @@ static WEBP_INLINE uint32_t ClampedAddSubtractHalf(uint32_t c0, uint32_t c1,
// gcc <= 4.9 on ARM generates incorrect code in Select() when Sub3() is
// inlined.
-#if defined(__arm__) && LOCAL_GCC_VERSION <= 0x409
+#if defined(__arm__) && defined(__GNUC__) && LOCAL_GCC_VERSION <= 0x409
# define LOCAL_INLINE __attribute__ ((noinline))
#else
# define LOCAL_INLINE WEBP_INLINE
@@ -107,88 +107,107 @@ static WEBP_INLINE uint32_t Select(uint32_t a, uint32_t b, uint32_t c) {
//------------------------------------------------------------------------------
// Predictors
-static uint32_t Predictor0_C(uint32_t left, const uint32_t* const top) {
+uint32_t VP8LPredictor0_C(const uint32_t* const left,
+ const uint32_t* const top) {
(void)top;
(void)left;
return ARGB_BLACK;
}
-static uint32_t Predictor1_C(uint32_t left, const uint32_t* const top) {
+uint32_t VP8LPredictor1_C(const uint32_t* const left,
+ const uint32_t* const top) {
(void)top;
- return left;
+ return *left;
}
-static uint32_t Predictor2_C(uint32_t left, const uint32_t* const top) {
+uint32_t VP8LPredictor2_C(const uint32_t* const left,
+ const uint32_t* const top) {
(void)left;
return top[0];
}
-static uint32_t Predictor3_C(uint32_t left, const uint32_t* const top) {
+uint32_t VP8LPredictor3_C(const uint32_t* const left,
+ const uint32_t* const top) {
(void)left;
return top[1];
}
-static uint32_t Predictor4_C(uint32_t left, const uint32_t* const top) {
+uint32_t VP8LPredictor4_C(const uint32_t* const left,
+ const uint32_t* const top) {
(void)left;
return top[-1];
}
-static uint32_t Predictor5_C(uint32_t left, const uint32_t* const top) {
- const uint32_t pred = Average3(left, top[0], top[1]);
+uint32_t VP8LPredictor5_C(const uint32_t* const left,
+ const uint32_t* const top) {
+ const uint32_t pred = Average3(*left, top[0], top[1]);
return pred;
}
-static uint32_t Predictor6_C(uint32_t left, const uint32_t* const top) {
- const uint32_t pred = Average2(left, top[-1]);
+uint32_t VP8LPredictor6_C(const uint32_t* const left,
+ const uint32_t* const top) {
+ const uint32_t pred = Average2(*left, top[-1]);
return pred;
}
-static uint32_t Predictor7_C(uint32_t left, const uint32_t* const top) {
- const uint32_t pred = Average2(left, top[0]);
+uint32_t VP8LPredictor7_C(const uint32_t* const left,
+ const uint32_t* const top) {
+ const uint32_t pred = Average2(*left, top[0]);
return pred;
}
-static uint32_t Predictor8_C(uint32_t left, const uint32_t* const top) {
+uint32_t VP8LPredictor8_C(const uint32_t* const left,
+ const uint32_t* const top) {
const uint32_t pred = Average2(top[-1], top[0]);
(void)left;
return pred;
}
-static uint32_t Predictor9_C(uint32_t left, const uint32_t* const top) {
+uint32_t VP8LPredictor9_C(const uint32_t* const left,
+ const uint32_t* const top) {
const uint32_t pred = Average2(top[0], top[1]);
(void)left;
return pred;
}
-static uint32_t Predictor10_C(uint32_t left, const uint32_t* const top) {
- const uint32_t pred = Average4(left, top[-1], top[0], top[1]);
+uint32_t VP8LPredictor10_C(const uint32_t* const left,
+ const uint32_t* const top) {
+ const uint32_t pred = Average4(*left, top[-1], top[0], top[1]);
return pred;
}
-static uint32_t Predictor11_C(uint32_t left, const uint32_t* const top) {
- const uint32_t pred = Select(top[0], left, top[-1]);
+uint32_t VP8LPredictor11_C(const uint32_t* const left,
+ const uint32_t* const top) {
+ const uint32_t pred = Select(top[0], *left, top[-1]);
return pred;
}
-static uint32_t Predictor12_C(uint32_t left, const uint32_t* const top) {
- const uint32_t pred = ClampedAddSubtractFull(left, top[0], top[-1]);
+uint32_t VP8LPredictor12_C(const uint32_t* const left,
+ const uint32_t* const top) {
+ const uint32_t pred = ClampedAddSubtractFull(*left, top[0], top[-1]);
return pred;
}
-static uint32_t Predictor13_C(uint32_t left, const uint32_t* const top) {
- const uint32_t pred = ClampedAddSubtractHalf(left, top[0], top[-1]);
+uint32_t VP8LPredictor13_C(const uint32_t* const left,
+ const uint32_t* const top) {
+ const uint32_t pred = ClampedAddSubtractHalf(*left, top[0], top[-1]);
return pred;
}
-GENERATE_PREDICTOR_ADD(Predictor0_C, PredictorAdd0_C)
+static void PredictorAdd0_C(const uint32_t* in, const uint32_t* upper,
+ int num_pixels, uint32_t* out) {
+ int x;
+ (void)upper;
+ for (x = 0; x < num_pixels; ++x) out[x] = VP8LAddPixels(in[x], ARGB_BLACK);
+}
static void PredictorAdd1_C(const uint32_t* in, const uint32_t* upper,
int num_pixels, uint32_t* out) {
int i;
uint32_t left = out[-1];
+ (void)upper;
for (i = 0; i < num_pixels; ++i) {
out[i] = left = VP8LAddPixels(in[i], left);
}
- (void)upper;
}
-GENERATE_PREDICTOR_ADD(Predictor2_C, PredictorAdd2_C)
-GENERATE_PREDICTOR_ADD(Predictor3_C, PredictorAdd3_C)
-GENERATE_PREDICTOR_ADD(Predictor4_C, PredictorAdd4_C)
-GENERATE_PREDICTOR_ADD(Predictor5_C, PredictorAdd5_C)
-GENERATE_PREDICTOR_ADD(Predictor6_C, PredictorAdd6_C)
-GENERATE_PREDICTOR_ADD(Predictor7_C, PredictorAdd7_C)
-GENERATE_PREDICTOR_ADD(Predictor8_C, PredictorAdd8_C)
-GENERATE_PREDICTOR_ADD(Predictor9_C, PredictorAdd9_C)
-GENERATE_PREDICTOR_ADD(Predictor10_C, PredictorAdd10_C)
-GENERATE_PREDICTOR_ADD(Predictor11_C, PredictorAdd11_C)
-GENERATE_PREDICTOR_ADD(Predictor12_C, PredictorAdd12_C)
-GENERATE_PREDICTOR_ADD(Predictor13_C, PredictorAdd13_C)
+GENERATE_PREDICTOR_ADD(VP8LPredictor2_C, PredictorAdd2_C)
+GENERATE_PREDICTOR_ADD(VP8LPredictor3_C, PredictorAdd3_C)
+GENERATE_PREDICTOR_ADD(VP8LPredictor4_C, PredictorAdd4_C)
+GENERATE_PREDICTOR_ADD(VP8LPredictor5_C, PredictorAdd5_C)
+GENERATE_PREDICTOR_ADD(VP8LPredictor6_C, PredictorAdd6_C)
+GENERATE_PREDICTOR_ADD(VP8LPredictor7_C, PredictorAdd7_C)
+GENERATE_PREDICTOR_ADD(VP8LPredictor8_C, PredictorAdd8_C)
+GENERATE_PREDICTOR_ADD(VP8LPredictor9_C, PredictorAdd9_C)
+GENERATE_PREDICTOR_ADD(VP8LPredictor10_C, PredictorAdd10_C)
+GENERATE_PREDICTOR_ADD(VP8LPredictor11_C, PredictorAdd11_C)
+GENERATE_PREDICTOR_ADD(VP8LPredictor12_C, PredictorAdd12_C)
+GENERATE_PREDICTOR_ADD(VP8LPredictor13_C, PredictorAdd13_C)
//------------------------------------------------------------------------------
@@ -274,10 +293,10 @@ void VP8LTransformColorInverse_C(const VP8LMultipliers* const m,
const uint32_t red = argb >> 16;
int new_red = red & 0xff;
int new_blue = argb & 0xff;
- new_red += ColorTransformDelta(m->green_to_red_, green);
+ new_red += ColorTransformDelta((int8_t)m->green_to_red_, green);
new_red &= 0xff;
- new_blue += ColorTransformDelta(m->green_to_blue_, green);
- new_blue += ColorTransformDelta(m->red_to_blue_, (int8_t)new_red);
+ new_blue += ColorTransformDelta((int8_t)m->green_to_blue_, green);
+ new_blue += ColorTransformDelta((int8_t)m->red_to_blue_, (int8_t)new_red);
new_blue &= 0xff;
dst[i] = (argb & 0xff00ff00u) | (new_red << 16) | (new_blue);
}
@@ -376,7 +395,7 @@ void VP8LInverseTransform(const VP8LTransform* const transform,
assert(row_start < row_end);
assert(row_end <= transform->ysize_);
switch (transform->type_) {
- case SUBTRACT_GREEN:
+ case SUBTRACT_GREEN_TRANSFORM:
VP8LAddGreenToBlueAndRed(in, (row_end - row_start) * width, out);
break;
case PREDICTOR_TRANSFORM:
@@ -557,7 +576,6 @@ VP8LPredictorFunc VP8LPredictors[16];
// exposed plain-C implementations
VP8LPredictorAddSubFunc VP8LPredictorsAdd_C[16];
-VP8LPredictorFunc VP8LPredictors_C[16];
VP8LTransformColorInverseFunc VP8LTransformColorInverse;
@@ -571,6 +589,7 @@ VP8LMapARGBFunc VP8LMapColor32b;
VP8LMapAlphaFunc VP8LMapColor8b;
extern void VP8LDspInitSSE2(void);
+extern void VP8LDspInitSSE41(void);
extern void VP8LDspInitNEON(void);
extern void VP8LDspInitMIPSdspR2(void);
extern void VP8LDspInitMSA(void);
@@ -595,8 +614,7 @@ extern void VP8LDspInitMSA(void);
} while (0);
WEBP_DSP_INIT_FUNC(VP8LDspInit) {
- COPY_PREDICTOR_ARRAY(Predictor, VP8LPredictors)
- COPY_PREDICTOR_ARRAY(Predictor, VP8LPredictors_C)
+ COPY_PREDICTOR_ARRAY(VP8LPredictor, VP8LPredictors)
COPY_PREDICTOR_ARRAY(PredictorAdd, VP8LPredictorsAdd)
COPY_PREDICTOR_ARRAY(PredictorAdd, VP8LPredictorsAdd_C)
@@ -618,9 +636,14 @@ WEBP_DSP_INIT_FUNC(VP8LDspInit) {
// If defined, use CPUInfo() to overwrite some pointers with faster versions.
if (VP8GetCPUInfo != NULL) {
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
if (VP8GetCPUInfo(kSSE2)) {
VP8LDspInitSSE2();
+#if defined(WEBP_HAVE_SSE41)
+ if (VP8GetCPUInfo(kSSE4_1)) {
+ VP8LDspInitSSE41();
+ }
+#endif
}
#endif
#if defined(WEBP_USE_MIPS_DSP_R2)
@@ -635,7 +658,7 @@ WEBP_DSP_INIT_FUNC(VP8LDspInit) {
#endif
}
-#if defined(WEBP_USE_NEON)
+#if defined(WEBP_HAVE_NEON)
if (WEBP_NEON_OMIT_C_CODE ||
(VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) {
VP8LDspInitNEON();
diff --git a/src/3rdparty/libwebp/src/dsp/lossless.h b/src/3rdparty/libwebp/src/dsp/lossless.h
index f709cc8..de60d95 100644
--- a/src/3rdparty/libwebp/src/dsp/lossless.h
+++ b/src/3rdparty/libwebp/src/dsp/lossless.h
@@ -28,9 +28,39 @@ extern "C" {
//------------------------------------------------------------------------------
// Decoding
-typedef uint32_t (*VP8LPredictorFunc)(uint32_t left, const uint32_t* const top);
+typedef uint32_t (*VP8LPredictorFunc)(const uint32_t* const left,
+ const uint32_t* const top);
extern VP8LPredictorFunc VP8LPredictors[16];
-extern VP8LPredictorFunc VP8LPredictors_C[16];
+
+uint32_t VP8LPredictor0_C(const uint32_t* const left,
+ const uint32_t* const top);
+uint32_t VP8LPredictor1_C(const uint32_t* const left,
+ const uint32_t* const top);
+uint32_t VP8LPredictor2_C(const uint32_t* const left,
+ const uint32_t* const top);
+uint32_t VP8LPredictor3_C(const uint32_t* const left,
+ const uint32_t* const top);
+uint32_t VP8LPredictor4_C(const uint32_t* const left,
+ const uint32_t* const top);
+uint32_t VP8LPredictor5_C(const uint32_t* const left,
+ const uint32_t* const top);
+uint32_t VP8LPredictor6_C(const uint32_t* const left,
+ const uint32_t* const top);
+uint32_t VP8LPredictor7_C(const uint32_t* const left,
+ const uint32_t* const top);
+uint32_t VP8LPredictor8_C(const uint32_t* const left,
+ const uint32_t* const top);
+uint32_t VP8LPredictor9_C(const uint32_t* const left,
+ const uint32_t* const top);
+uint32_t VP8LPredictor10_C(const uint32_t* const left,
+ const uint32_t* const top);
+uint32_t VP8LPredictor11_C(const uint32_t* const left,
+ const uint32_t* const top);
+uint32_t VP8LPredictor12_C(const uint32_t* const left,
+ const uint32_t* const top);
+uint32_t VP8LPredictor13_C(const uint32_t* const left,
+ const uint32_t* const top);
+
// These Add/Sub function expects upper[-1] and out[-1] to be readable.
typedef void (*VP8LPredictorAddSubFunc)(const uint32_t* in,
const uint32_t* upper, int num_pixels,
@@ -152,9 +182,9 @@ extern VP8LPredictorAddSubFunc VP8LPredictorsSub_C[16];
// -----------------------------------------------------------------------------
// Huffman-cost related functions.
-typedef double (*VP8LCostFunc)(const uint32_t* population, int length);
-typedef double (*VP8LCostCombinedFunc)(const uint32_t* X, const uint32_t* Y,
- int length);
+typedef float (*VP8LCostFunc)(const uint32_t* population, int length);
+typedef float (*VP8LCostCombinedFunc)(const uint32_t* X, const uint32_t* Y,
+ int length);
typedef float (*VP8LCombinedShannonEntropyFunc)(const int X[256],
const int Y[256]);
@@ -168,7 +198,7 @@ typedef struct { // small struct to hold counters
} VP8LStreaks;
typedef struct { // small struct to hold bit entropy results
- double entropy; // entropy
+ float entropy; // entropy
uint32_t sum; // sum of the population
int nonzeros; // number of non-zero elements in the population
uint32_t max_val; // maximum value in the population
diff --git a/src/3rdparty/libwebp/src/dsp/lossless_common.h b/src/3rdparty/libwebp/src/dsp/lossless_common.h
index a2648d1..6a2f736 100644
--- a/src/3rdparty/libwebp/src/dsp/lossless_common.h
+++ b/src/3rdparty/libwebp/src/dsp/lossless_common.h
@@ -177,24 +177,13 @@ uint32_t VP8LSubPixels(uint32_t a, uint32_t b) {
static void PREDICTOR_ADD(const uint32_t* in, const uint32_t* upper, \
int num_pixels, uint32_t* out) { \
int x; \
+ assert(upper != NULL); \
for (x = 0; x < num_pixels; ++x) { \
- const uint32_t pred = (PREDICTOR)(out[x - 1], upper + x); \
+ const uint32_t pred = (PREDICTOR)(&out[x - 1], upper + x); \
out[x] = VP8LAddPixels(in[x], pred); \
} \
}
-// It subtracts the prediction from the input pixel and stores the residual
-// in the output pixel.
-#define GENERATE_PREDICTOR_SUB(PREDICTOR, PREDICTOR_SUB) \
-static void PREDICTOR_SUB(const uint32_t* in, const uint32_t* upper, \
- int num_pixels, uint32_t* out) { \
- int x; \
- for (x = 0; x < num_pixels; ++x) { \
- const uint32_t pred = (PREDICTOR)(in[x - 1], upper + x); \
- out[x] = VP8LSubPixels(in[x], pred); \
- } \
-}
-
#ifdef __cplusplus
} // extern "C"
#endif
diff --git a/src/3rdparty/libwebp/src/dsp/lossless_enc.c b/src/3rdparty/libwebp/src/dsp/lossless_enc.c
index 9c36055..b1f9f26 100644
--- a/src/3rdparty/libwebp/src/dsp/lossless_enc.c
+++ b/src/3rdparty/libwebp/src/dsp/lossless_enc.c
@@ -329,6 +329,15 @@ const uint8_t kPrefixEncodeExtraBitsValue[PREFIX_LOOKUP_IDX_MAX] = {
static float FastSLog2Slow_C(uint32_t v) {
assert(v >= LOG_LOOKUP_IDX_MAX);
if (v < APPROX_LOG_WITH_CORRECTION_MAX) {
+#if !defined(WEBP_HAVE_SLOW_CLZ_CTZ)
+ // use clz if available
+ const int log_cnt = BitsLog2Floor(v) - 7;
+ const uint32_t y = 1 << log_cnt;
+ int correction = 0;
+ const float v_f = (float)v;
+ const uint32_t orig_v = v;
+ v >>= log_cnt;
+#else
int log_cnt = 0;
uint32_t y = 1;
int correction = 0;
@@ -339,6 +348,7 @@ static float FastSLog2Slow_C(uint32_t v) {
v = v >> 1;
y = y << 1;
} while (v >= LOG_LOOKUP_IDX_MAX);
+#endif
// vf = (2^log_cnt) * Xf; where y = 2^log_cnt and Xf < 256
// Xf = floor(Xf) * (1 + (v % y) / v)
// log2(Xf) = log2(floor(Xf)) + log2(1 + (v % y) / v)
@@ -355,6 +365,14 @@ static float FastSLog2Slow_C(uint32_t v) {
static float FastLog2Slow_C(uint32_t v) {
assert(v >= LOG_LOOKUP_IDX_MAX);
if (v < APPROX_LOG_WITH_CORRECTION_MAX) {
+#if !defined(WEBP_HAVE_SLOW_CLZ_CTZ)
+ // use clz if available
+ const int log_cnt = BitsLog2Floor(v) - 7;
+ const uint32_t y = 1 << log_cnt;
+ const uint32_t orig_v = v;
+ double log_2;
+ v >>= log_cnt;
+#else
int log_cnt = 0;
uint32_t y = 1;
const uint32_t orig_v = v;
@@ -364,6 +382,7 @@ static float FastLog2Slow_C(uint32_t v) {
v = v >> 1;
y = y << 1;
} while (v >= LOG_LOOKUP_IDX_MAX);
+#endif
log_2 = kLog2Table[v] + log_cnt;
if (orig_v >= APPROX_LOG_MAX) {
// Since the division is still expensive, add this correction factor only
@@ -383,7 +402,7 @@ static float FastLog2Slow_C(uint32_t v) {
// Compute the combined Shanon's entropy for distribution {X} and {X+Y}
static float CombinedShannonEntropy_C(const int X[256], const int Y[256]) {
int i;
- double retval = 0.;
+ float retval = 0.f;
int sumX = 0, sumXY = 0;
for (i = 0; i < 256; ++i) {
const int x = X[i];
@@ -399,7 +418,7 @@ static float CombinedShannonEntropy_C(const int X[256], const int Y[256]) {
}
}
retval += VP8LFastSLog2(sumX) + VP8LFastSLog2(sumXY);
- return (float)retval;
+ return retval;
}
void VP8LBitEntropyInit(VP8LBitEntropy* const entropy) {
@@ -503,11 +522,11 @@ static void GetCombinedEntropyUnrefined_C(const uint32_t X[],
void VP8LSubtractGreenFromBlueAndRed_C(uint32_t* argb_data, int num_pixels) {
int i;
for (i = 0; i < num_pixels; ++i) {
- const int argb = argb_data[i];
+ const int argb = (int)argb_data[i];
const int green = (argb >> 8) & 0xff;
const uint32_t new_r = (((argb >> 16) & 0xff) - green) & 0xff;
const uint32_t new_b = (((argb >> 0) & 0xff) - green) & 0xff;
- argb_data[i] = (argb & 0xff00ff00u) | (new_r << 16) | new_b;
+ argb_data[i] = ((uint32_t)argb & 0xff00ff00u) | (new_r << 16) | new_b;
}
}
@@ -528,10 +547,10 @@ void VP8LTransformColor_C(const VP8LMultipliers* const m, uint32_t* data,
const int8_t red = U32ToS8(argb >> 16);
int new_red = red & 0xff;
int new_blue = argb & 0xff;
- new_red -= ColorTransformDelta(m->green_to_red_, green);
+ new_red -= ColorTransformDelta((int8_t)m->green_to_red_, green);
new_red &= 0xff;
- new_blue -= ColorTransformDelta(m->green_to_blue_, green);
- new_blue -= ColorTransformDelta(m->red_to_blue_, red);
+ new_blue -= ColorTransformDelta((int8_t)m->green_to_blue_, green);
+ new_blue -= ColorTransformDelta((int8_t)m->red_to_blue_, red);
new_blue &= 0xff;
data[i] = (argb & 0xff00ff00u) | (new_red << 16) | (new_blue);
}
@@ -541,7 +560,7 @@ static WEBP_INLINE uint8_t TransformColorRed(uint8_t green_to_red,
uint32_t argb) {
const int8_t green = U32ToS8(argb >> 8);
int new_red = argb >> 16;
- new_red -= ColorTransformDelta(green_to_red, green);
+ new_red -= ColorTransformDelta((int8_t)green_to_red, green);
return (new_red & 0xff);
}
@@ -550,9 +569,9 @@ static WEBP_INLINE uint8_t TransformColorBlue(uint8_t green_to_blue,
uint32_t argb) {
const int8_t green = U32ToS8(argb >> 8);
const int8_t red = U32ToS8(argb >> 16);
- uint8_t new_blue = argb & 0xff;
- new_blue -= ColorTransformDelta(green_to_blue, green);
- new_blue -= ColorTransformDelta(red_to_blue, red);
+ int new_blue = argb & 0xff;
+ new_blue -= ColorTransformDelta((int8_t)green_to_blue, green);
+ new_blue -= ColorTransformDelta((int8_t)red_to_blue, red);
return (new_blue & 0xff);
}
@@ -617,17 +636,17 @@ void VP8LBundleColorMap_C(const uint8_t* const row, int width, int xbits,
//------------------------------------------------------------------------------
-static double ExtraCost_C(const uint32_t* population, int length) {
+static float ExtraCost_C(const uint32_t* population, int length) {
int i;
- double cost = 0.;
+ float cost = 0.f;
for (i = 2; i < length - 2; ++i) cost += (i >> 1) * population[i + 2];
return cost;
}
-static double ExtraCostCombined_C(const uint32_t* X, const uint32_t* Y,
+static float ExtraCostCombined_C(const uint32_t* X, const uint32_t* Y,
int length) {
int i;
- double cost = 0.;
+ float cost = 0.f;
for (i = 2; i < length - 2; ++i) {
const int xy = X[i + 2] + Y[i + 2];
cost += (i >> 1) * xy;
@@ -702,140 +721,6 @@ void VP8LHistogramAdd(const VP8LHistogram* const a,
//------------------------------------------------------------------------------
// Image transforms.
-static WEBP_INLINE uint32_t Average2(uint32_t a0, uint32_t a1) {
- return (((a0 ^ a1) & 0xfefefefeu) >> 1) + (a0 & a1);
-}
-
-static WEBP_INLINE uint32_t Average3(uint32_t a0, uint32_t a1, uint32_t a2) {
- return Average2(Average2(a0, a2), a1);
-}
-
-static WEBP_INLINE uint32_t Average4(uint32_t a0, uint32_t a1,
- uint32_t a2, uint32_t a3) {
- return Average2(Average2(a0, a1), Average2(a2, a3));
-}
-
-static WEBP_INLINE uint32_t Clip255(uint32_t a) {
- if (a < 256) {
- return a;
- }
- // return 0, when a is a negative integer.
- // return 255, when a is positive.
- return ~a >> 24;
-}
-
-static WEBP_INLINE int AddSubtractComponentFull(int a, int b, int c) {
- return Clip255(a + b - c);
-}
-
-static WEBP_INLINE uint32_t ClampedAddSubtractFull(uint32_t c0, uint32_t c1,
- uint32_t c2) {
- const int a = AddSubtractComponentFull(c0 >> 24, c1 >> 24, c2 >> 24);
- const int r = AddSubtractComponentFull((c0 >> 16) & 0xff,
- (c1 >> 16) & 0xff,
- (c2 >> 16) & 0xff);
- const int g = AddSubtractComponentFull((c0 >> 8) & 0xff,
- (c1 >> 8) & 0xff,
- (c2 >> 8) & 0xff);
- const int b = AddSubtractComponentFull(c0 & 0xff, c1 & 0xff, c2 & 0xff);
- return ((uint32_t)a << 24) | (r << 16) | (g << 8) | b;
-}
-
-static WEBP_INLINE int AddSubtractComponentHalf(int a, int b) {
- return Clip255(a + (a - b) / 2);
-}
-
-static WEBP_INLINE uint32_t ClampedAddSubtractHalf(uint32_t c0, uint32_t c1,
- uint32_t c2) {
- const uint32_t ave = Average2(c0, c1);
- const int a = AddSubtractComponentHalf(ave >> 24, c2 >> 24);
- const int r = AddSubtractComponentHalf((ave >> 16) & 0xff, (c2 >> 16) & 0xff);
- const int g = AddSubtractComponentHalf((ave >> 8) & 0xff, (c2 >> 8) & 0xff);
- const int b = AddSubtractComponentHalf((ave >> 0) & 0xff, (c2 >> 0) & 0xff);
- return ((uint32_t)a << 24) | (r << 16) | (g << 8) | b;
-}
-
-// gcc-4.9 on ARM generates incorrect code in Select() when Sub3() is inlined.
-#if defined(__arm__) && \
- (LOCAL_GCC_VERSION == 0x409 || LOCAL_GCC_VERSION == 0x408)
-# define LOCAL_INLINE __attribute__ ((noinline))
-#else
-# define LOCAL_INLINE WEBP_INLINE
-#endif
-
-static LOCAL_INLINE int Sub3(int a, int b, int c) {
- const int pb = b - c;
- const int pa = a - c;
- return abs(pb) - abs(pa);
-}
-
-#undef LOCAL_INLINE
-
-static WEBP_INLINE uint32_t Select(uint32_t a, uint32_t b, uint32_t c) {
- const int pa_minus_pb =
- Sub3((a >> 24) , (b >> 24) , (c >> 24) ) +
- Sub3((a >> 16) & 0xff, (b >> 16) & 0xff, (c >> 16) & 0xff) +
- Sub3((a >> 8) & 0xff, (b >> 8) & 0xff, (c >> 8) & 0xff) +
- Sub3((a ) & 0xff, (b ) & 0xff, (c ) & 0xff);
- return (pa_minus_pb <= 0) ? a : b;
-}
-
-//------------------------------------------------------------------------------
-// Predictors
-
-static uint32_t Predictor2(uint32_t left, const uint32_t* const top) {
- (void)left;
- return top[0];
-}
-static uint32_t Predictor3(uint32_t left, const uint32_t* const top) {
- (void)left;
- return top[1];
-}
-static uint32_t Predictor4(uint32_t left, const uint32_t* const top) {
- (void)left;
- return top[-1];
-}
-static uint32_t Predictor5(uint32_t left, const uint32_t* const top) {
- const uint32_t pred = Average3(left, top[0], top[1]);
- return pred;
-}
-static uint32_t Predictor6(uint32_t left, const uint32_t* const top) {
- const uint32_t pred = Average2(left, top[-1]);
- return pred;
-}
-static uint32_t Predictor7(uint32_t left, const uint32_t* const top) {
- const uint32_t pred = Average2(left, top[0]);
- return pred;
-}
-static uint32_t Predictor8(uint32_t left, const uint32_t* const top) {
- const uint32_t pred = Average2(top[-1], top[0]);
- (void)left;
- return pred;
-}
-static uint32_t Predictor9(uint32_t left, const uint32_t* const top) {
- const uint32_t pred = Average2(top[0], top[1]);
- (void)left;
- return pred;
-}
-static uint32_t Predictor10(uint32_t left, const uint32_t* const top) {
- const uint32_t pred = Average4(left, top[-1], top[0], top[1]);
- return pred;
-}
-static uint32_t Predictor11(uint32_t left, const uint32_t* const top) {
- const uint32_t pred = Select(top[0], left, top[-1]);
- return pred;
-}
-static uint32_t Predictor12(uint32_t left, const uint32_t* const top) {
- const uint32_t pred = ClampedAddSubtractFull(left, top[0], top[-1]);
- return pred;
-}
-static uint32_t Predictor13(uint32_t left, const uint32_t* const top) {
- const uint32_t pred = ClampedAddSubtractHalf(left, top[0], top[-1]);
- return pred;
-}
-
-//------------------------------------------------------------------------------
-
static void PredictorSub0_C(const uint32_t* in, const uint32_t* upper,
int num_pixels, uint32_t* out) {
int i;
@@ -850,18 +735,33 @@ static void PredictorSub1_C(const uint32_t* in, const uint32_t* upper,
(void)upper;
}
-GENERATE_PREDICTOR_SUB(Predictor2, PredictorSub2_C)
-GENERATE_PREDICTOR_SUB(Predictor3, PredictorSub3_C)
-GENERATE_PREDICTOR_SUB(Predictor4, PredictorSub4_C)
-GENERATE_PREDICTOR_SUB(Predictor5, PredictorSub5_C)
-GENERATE_PREDICTOR_SUB(Predictor6, PredictorSub6_C)
-GENERATE_PREDICTOR_SUB(Predictor7, PredictorSub7_C)
-GENERATE_PREDICTOR_SUB(Predictor8, PredictorSub8_C)
-GENERATE_PREDICTOR_SUB(Predictor9, PredictorSub9_C)
-GENERATE_PREDICTOR_SUB(Predictor10, PredictorSub10_C)
-GENERATE_PREDICTOR_SUB(Predictor11, PredictorSub11_C)
-GENERATE_PREDICTOR_SUB(Predictor12, PredictorSub12_C)
-GENERATE_PREDICTOR_SUB(Predictor13, PredictorSub13_C)
+// It subtracts the prediction from the input pixel and stores the residual
+// in the output pixel.
+#define GENERATE_PREDICTOR_SUB(PREDICTOR_I) \
+static void PredictorSub##PREDICTOR_I##_C(const uint32_t* in, \
+ const uint32_t* upper, \
+ int num_pixels, uint32_t* out) { \
+ int x; \
+ assert(upper != NULL); \
+ for (x = 0; x < num_pixels; ++x) { \
+ const uint32_t pred = \
+ VP8LPredictor##PREDICTOR_I##_C(&in[x - 1], upper + x); \
+ out[x] = VP8LSubPixels(in[x], pred); \
+ } \
+}
+
+GENERATE_PREDICTOR_SUB(2)
+GENERATE_PREDICTOR_SUB(3)
+GENERATE_PREDICTOR_SUB(4)
+GENERATE_PREDICTOR_SUB(5)
+GENERATE_PREDICTOR_SUB(6)
+GENERATE_PREDICTOR_SUB(7)
+GENERATE_PREDICTOR_SUB(8)
+GENERATE_PREDICTOR_SUB(9)
+GENERATE_PREDICTOR_SUB(10)
+GENERATE_PREDICTOR_SUB(11)
+GENERATE_PREDICTOR_SUB(12)
+GENERATE_PREDICTOR_SUB(13)
//------------------------------------------------------------------------------
@@ -962,10 +862,10 @@ WEBP_DSP_INIT_FUNC(VP8LEncDspInit) {
// If defined, use CPUInfo() to overwrite some pointers with faster versions.
if (VP8GetCPUInfo != NULL) {
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
if (VP8GetCPUInfo(kSSE2)) {
VP8LEncDspInitSSE2();
-#if defined(WEBP_USE_SSE41)
+#if defined(WEBP_HAVE_SSE41)
if (VP8GetCPUInfo(kSSE4_1)) {
VP8LEncDspInitSSE41();
}
@@ -989,7 +889,7 @@ WEBP_DSP_INIT_FUNC(VP8LEncDspInit) {
#endif
}
-#if defined(WEBP_USE_NEON)
+#if defined(WEBP_HAVE_NEON)
if (WEBP_NEON_OMIT_C_CODE ||
(VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) {
VP8LEncDspInitNEON();
diff --git a/src/3rdparty/libwebp/src/dsp/lossless_enc_mips32.c b/src/3rdparty/libwebp/src/dsp/lossless_enc_mips32.c
index 0412a09..639f786 100644
--- a/src/3rdparty/libwebp/src/dsp/lossless_enc_mips32.c
+++ b/src/3rdparty/libwebp/src/dsp/lossless_enc_mips32.c
@@ -103,8 +103,8 @@ static float FastLog2Slow_MIPS32(uint32_t v) {
// cost += i * *(pop + 1);
// pop += 2;
// }
-// return (double)cost;
-static double ExtraCost_MIPS32(const uint32_t* const population, int length) {
+// return (float)cost;
+static float ExtraCost_MIPS32(const uint32_t* const population, int length) {
int i, temp0, temp1;
const uint32_t* pop = &population[4];
const uint32_t* const LoopEnd = &population[length];
@@ -130,7 +130,7 @@ static double ExtraCost_MIPS32(const uint32_t* const population, int length) {
: "memory", "hi", "lo"
);
- return (double)((int64_t)temp0 << 32 | temp1);
+ return (float)((int64_t)temp0 << 32 | temp1);
}
// C version of this function:
@@ -148,9 +148,9 @@ static double ExtraCost_MIPS32(const uint32_t* const population, int length) {
// pX += 2;
// pY += 2;
// }
-// return (double)cost;
-static double ExtraCostCombined_MIPS32(const uint32_t* const X,
- const uint32_t* const Y, int length) {
+// return (float)cost;
+static float ExtraCostCombined_MIPS32(const uint32_t* const X,
+ const uint32_t* const Y, int length) {
int i, temp0, temp1, temp2, temp3;
const uint32_t* pX = &X[4];
const uint32_t* pY = &Y[4];
@@ -183,7 +183,7 @@ static double ExtraCostCombined_MIPS32(const uint32_t* const X,
: "memory", "hi", "lo"
);
- return (double)((int64_t)temp0 << 32 | temp1);
+ return (float)((int64_t)temp0 << 32 | temp1);
}
#define HUFFMAN_COST_PASS \
@@ -347,24 +347,24 @@ static void GetCombinedEntropyUnrefined_MIPS32(const uint32_t X[],
static void AddVector_MIPS32(const uint32_t* pa, const uint32_t* pb,
uint32_t* pout, int size) {
uint32_t temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7;
- const uint32_t end = ((size) / 4) * 4;
+ const int end = ((size) / 4) * 4;
const uint32_t* const LoopEnd = pa + end;
int i;
ASM_START
ADD_TO_OUT(0, 4, 8, 12, 1, pa, pb, pout)
ASM_END_0
- for (i = end; i < size; ++i) pout[i] = pa[i] + pb[i];
+ for (i = 0; i < size - end; ++i) pout[i] = pa[i] + pb[i];
}
static void AddVectorEq_MIPS32(const uint32_t* pa, uint32_t* pout, int size) {
uint32_t temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7;
- const uint32_t end = ((size) / 4) * 4;
+ const int end = ((size) / 4) * 4;
const uint32_t* const LoopEnd = pa + end;
int i;
ASM_START
ADD_TO_OUT(0, 4, 8, 12, 0, pa, pout, pout)
ASM_END_1
- for (i = end; i < size; ++i) pout[i] += pa[i];
+ for (i = 0; i < size - end; ++i) pout[i] += pa[i];
}
#undef ASM_END_1
diff --git a/src/3rdparty/libwebp/src/dsp/lossless_enc_sse2.c b/src/3rdparty/libwebp/src/dsp/lossless_enc_sse2.c
index 8adc521..66cbaab 100644
--- a/src/3rdparty/libwebp/src/dsp/lossless_enc_sse2.c
+++ b/src/3rdparty/libwebp/src/dsp/lossless_enc_sse2.c
@@ -54,8 +54,8 @@ static void TransformColor_SSE2(const VP8LMultipliers* const m,
const __m128i mults_rb = MK_CST_16(CST_5b(m->green_to_red_),
CST_5b(m->green_to_blue_));
const __m128i mults_b2 = MK_CST_16(CST_5b(m->red_to_blue_), 0);
- const __m128i mask_ag = _mm_set1_epi32(0xff00ff00); // alpha-green masks
- const __m128i mask_rb = _mm_set1_epi32(0x00ff00ff); // red-blue masks
+ const __m128i mask_ag = _mm_set1_epi32((int)0xff00ff00); // alpha-green masks
+ const __m128i mask_rb = _mm_set1_epi32(0x00ff00ff); // red-blue masks
int i;
for (i = 0; i + 4 <= num_pixels; i += 4) {
const __m128i in = _mm_loadu_si128((__m128i*)&argb_data[i]); // argb
@@ -232,76 +232,55 @@ static void AddVectorEq_SSE2(const uint32_t* a, uint32_t* out, int size) {
//------------------------------------------------------------------------------
// Entropy
-// Checks whether the X or Y contribution is worth computing and adding.
-// Used in loop unrolling.
-#define ANALYZE_X_OR_Y(x_or_y, j) \
- do { \
- if ((x_or_y)[i + (j)] != 0) retval -= VP8LFastSLog2((x_or_y)[i + (j)]); \
- } while (0)
-
-// Checks whether the X + Y contribution is worth computing and adding.
-// Used in loop unrolling.
-#define ANALYZE_XY(j) \
- do { \
- if (tmp[j] != 0) { \
- retval -= VP8LFastSLog2(tmp[j]); \
- ANALYZE_X_OR_Y(X, j); \
- } \
- } while (0)
+// TODO(https://crbug.com/webp/499): this function produces different results
+// from the C code due to use of double/float resulting in output differences
+// when compared to -noasm.
+#if !(defined(WEBP_HAVE_SLOW_CLZ_CTZ) || defined(__i386__) || defined(_M_IX86))
static float CombinedShannonEntropy_SSE2(const int X[256], const int Y[256]) {
int i;
- double retval = 0.;
- int sumX, sumXY;
- int32_t tmp[4];
- __m128i zero = _mm_setzero_si128();
- // Sums up X + Y, 4 ints at a time (and will merge it at the end for sumXY).
- __m128i sumXY_128 = zero;
- __m128i sumX_128 = zero;
-
- for (i = 0; i < 256; i += 4) {
- const __m128i x = _mm_loadu_si128((const __m128i*)(X + i));
- const __m128i y = _mm_loadu_si128((const __m128i*)(Y + i));
-
- // Check if any X is non-zero: this actually provides a speedup as X is
- // usually sparse.
- if (_mm_movemask_epi8(_mm_cmpeq_epi32(x, zero)) != 0xFFFF) {
- const __m128i xy_128 = _mm_add_epi32(x, y);
- sumXY_128 = _mm_add_epi32(sumXY_128, xy_128);
-
- sumX_128 = _mm_add_epi32(sumX_128, x);
-
- // Analyze the different X + Y.
- _mm_storeu_si128((__m128i*)tmp, xy_128);
-
- ANALYZE_XY(0);
- ANALYZE_XY(1);
- ANALYZE_XY(2);
- ANALYZE_XY(3);
- } else {
- // X is fully 0, so only deal with Y.
- sumXY_128 = _mm_add_epi32(sumXY_128, y);
-
- ANALYZE_X_OR_Y(Y, 0);
- ANALYZE_X_OR_Y(Y, 1);
- ANALYZE_X_OR_Y(Y, 2);
- ANALYZE_X_OR_Y(Y, 3);
+ float retval = 0.f;
+ int sumX = 0, sumXY = 0;
+ const __m128i zero = _mm_setzero_si128();
+
+ for (i = 0; i < 256; i += 16) {
+ const __m128i x0 = _mm_loadu_si128((const __m128i*)(X + i + 0));
+ const __m128i y0 = _mm_loadu_si128((const __m128i*)(Y + i + 0));
+ const __m128i x1 = _mm_loadu_si128((const __m128i*)(X + i + 4));
+ const __m128i y1 = _mm_loadu_si128((const __m128i*)(Y + i + 4));
+ const __m128i x2 = _mm_loadu_si128((const __m128i*)(X + i + 8));
+ const __m128i y2 = _mm_loadu_si128((const __m128i*)(Y + i + 8));
+ const __m128i x3 = _mm_loadu_si128((const __m128i*)(X + i + 12));
+ const __m128i y3 = _mm_loadu_si128((const __m128i*)(Y + i + 12));
+ const __m128i x4 = _mm_packs_epi16(_mm_packs_epi32(x0, x1),
+ _mm_packs_epi32(x2, x3));
+ const __m128i y4 = _mm_packs_epi16(_mm_packs_epi32(y0, y1),
+ _mm_packs_epi32(y2, y3));
+ const int32_t mx = _mm_movemask_epi8(_mm_cmpgt_epi8(x4, zero));
+ int32_t my = _mm_movemask_epi8(_mm_cmpgt_epi8(y4, zero)) | mx;
+ while (my) {
+ const int32_t j = BitsCtz(my);
+ int xy;
+ if ((mx >> j) & 1) {
+ const int x = X[i + j];
+ sumXY += x;
+ retval -= VP8LFastSLog2(x);
+ }
+ xy = X[i + j] + Y[i + j];
+ sumX += xy;
+ retval -= VP8LFastSLog2(xy);
+ my &= my - 1;
}
}
+ retval += VP8LFastSLog2(sumX) + VP8LFastSLog2(sumXY);
+ return retval;
+}
- // Sum up sumX_128 to get sumX.
- _mm_storeu_si128((__m128i*)tmp, sumX_128);
- sumX = tmp[3] + tmp[2] + tmp[1] + tmp[0];
+#else
- // Sum up sumXY_128 to get sumXY.
- _mm_storeu_si128((__m128i*)tmp, sumXY_128);
- sumXY = tmp[3] + tmp[2] + tmp[1] + tmp[0];
+#define DONT_USE_COMBINED_SHANNON_ENTROPY_SSE2_FUNC // won't be faster
- retval += VP8LFastSLog2(sumX) + VP8LFastSLog2(sumXY);
- return (float)retval;
-}
-#undef ANALYZE_X_OR_Y
-#undef ANALYZE_XY
+#endif
//------------------------------------------------------------------------------
@@ -397,7 +376,7 @@ static void BundleColorMap_SSE2(const uint8_t* const row, int width, int xbits,
break;
}
case 2: {
- const __m128i mask_or = _mm_set1_epi32(0xff000000);
+ const __m128i mask_or = _mm_set1_epi32((int)0xff000000);
const __m128i mul_cst = _mm_set1_epi16(0x0104);
const __m128i mask_mul = _mm_set1_epi16(0x0f00);
for (x = 0; x + 16 <= width; x += 16, dst += 4) {
@@ -448,31 +427,34 @@ static WEBP_INLINE void Average2_m128i(const __m128i* const a0,
static void PredictorSub0_SSE2(const uint32_t* in, const uint32_t* upper,
int num_pixels, uint32_t* out) {
int i;
- const __m128i black = _mm_set1_epi32(ARGB_BLACK);
+ const __m128i black = _mm_set1_epi32((int)ARGB_BLACK);
for (i = 0; i + 4 <= num_pixels; i += 4) {
const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]);
const __m128i res = _mm_sub_epi8(src, black);
_mm_storeu_si128((__m128i*)&out[i], res);
}
if (i != num_pixels) {
- VP8LPredictorsSub_C[0](in + i, upper + i, num_pixels - i, out + i);
+ VP8LPredictorsSub_C[0](in + i, NULL, num_pixels - i, out + i);
}
+ (void)upper;
}
-#define GENERATE_PREDICTOR_1(X, IN) \
-static void PredictorSub##X##_SSE2(const uint32_t* in, const uint32_t* upper, \
- int num_pixels, uint32_t* out) { \
- int i; \
- for (i = 0; i + 4 <= num_pixels; i += 4) { \
- const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]); \
- const __m128i pred = _mm_loadu_si128((const __m128i*)&(IN)); \
- const __m128i res = _mm_sub_epi8(src, pred); \
- _mm_storeu_si128((__m128i*)&out[i], res); \
- } \
- if (i != num_pixels) { \
- VP8LPredictorsSub_C[(X)](in + i, upper + i, num_pixels - i, out + i); \
- } \
-}
+#define GENERATE_PREDICTOR_1(X, IN) \
+ static void PredictorSub##X##_SSE2(const uint32_t* const in, \
+ const uint32_t* const upper, \
+ int num_pixels, uint32_t* const out) { \
+ int i; \
+ for (i = 0; i + 4 <= num_pixels; i += 4) { \
+ const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]); \
+ const __m128i pred = _mm_loadu_si128((const __m128i*)&(IN)); \
+ const __m128i res = _mm_sub_epi8(src, pred); \
+ _mm_storeu_si128((__m128i*)&out[i], res); \
+ } \
+ if (i != num_pixels) { \
+ VP8LPredictorsSub_C[(X)](in + i, WEBP_OFFSET_PTR(upper, i), \
+ num_pixels - i, out + i); \
+ } \
+ }
GENERATE_PREDICTOR_1(1, in[i - 1]) // Predictor1: L
GENERATE_PREDICTOR_1(2, upper[i]) // Predictor2: T
@@ -656,7 +638,9 @@ WEBP_TSAN_IGNORE_FUNCTION void VP8LEncDspInitSSE2(void) {
VP8LCollectColorRedTransforms = CollectColorRedTransforms_SSE2;
VP8LAddVector = AddVector_SSE2;
VP8LAddVectorEq = AddVectorEq_SSE2;
+#if !defined(DONT_USE_COMBINED_SHANNON_ENTROPY_SSE2_FUNC)
VP8LCombinedShannonEntropy = CombinedShannonEntropy_SSE2;
+#endif
VP8LVectorMismatch = VectorMismatch_SSE2;
VP8LBundleColorMap = BundleColorMap_SSE2;
diff --git a/src/3rdparty/libwebp/src/dsp/lossless_enc_sse41.c b/src/3rdparty/libwebp/src/dsp/lossless_enc_sse41.c
index 719d8ed..ad358a6 100644
--- a/src/3rdparty/libwebp/src/dsp/lossless_enc_sse41.c
+++ b/src/3rdparty/libwebp/src/dsp/lossless_enc_sse41.c
@@ -44,46 +44,47 @@ static void SubtractGreenFromBlueAndRed_SSE41(uint32_t* argb_data,
//------------------------------------------------------------------------------
// Color Transform
-#define SPAN 8
+#define MK_CST_16(HI, LO) \
+ _mm_set1_epi32((int)(((uint32_t)(HI) << 16) | ((LO) & 0xffff)))
+
static void CollectColorBlueTransforms_SSE41(const uint32_t* argb, int stride,
int tile_width, int tile_height,
int green_to_blue, int red_to_blue,
int histo[]) {
- const __m128i mults_r = _mm_set1_epi16(CST_5b(red_to_blue));
- const __m128i mults_g = _mm_set1_epi16(CST_5b(green_to_blue));
- const __m128i mask_g = _mm_set1_epi16((short)0xff00); // green mask
- const __m128i mask_gb = _mm_set1_epi32(0xffff); // green/blue mask
- const __m128i mask_b = _mm_set1_epi16(0x00ff); // blue mask
- const __m128i shuffler_lo = _mm_setr_epi8(-1, 2, -1, 6, -1, 10, -1, 14, -1,
- -1, -1, -1, -1, -1, -1, -1);
- const __m128i shuffler_hi = _mm_setr_epi8(-1, -1, -1, -1, -1, -1, -1, -1, -1,
- 2, -1, 6, -1, 10, -1, 14);
- int y;
- for (y = 0; y < tile_height; ++y) {
- const uint32_t* const src = argb + y * stride;
- int i, x;
- for (x = 0; x + SPAN <= tile_width; x += SPAN) {
- uint16_t values[SPAN];
- const __m128i in0 = _mm_loadu_si128((__m128i*)&src[x + 0]);
- const __m128i in1 = _mm_loadu_si128((__m128i*)&src[x + SPAN / 2]);
- const __m128i r0 = _mm_shuffle_epi8(in0, shuffler_lo);
- const __m128i r1 = _mm_shuffle_epi8(in1, shuffler_hi);
- const __m128i r = _mm_or_si128(r0, r1); // r 0
- const __m128i gb0 = _mm_and_si128(in0, mask_gb);
- const __m128i gb1 = _mm_and_si128(in1, mask_gb);
- const __m128i gb = _mm_packus_epi32(gb0, gb1); // g b
- const __m128i g = _mm_and_si128(gb, mask_g); // g 0
- const __m128i A = _mm_mulhi_epi16(r, mults_r); // x dbr
- const __m128i B = _mm_mulhi_epi16(g, mults_g); // x dbg
- const __m128i C = _mm_sub_epi8(gb, B); // x b'
- const __m128i D = _mm_sub_epi8(C, A); // x b''
- const __m128i E = _mm_and_si128(D, mask_b); // 0 b''
- _mm_storeu_si128((__m128i*)values, E);
- for (i = 0; i < SPAN; ++i) ++histo[values[i]];
+ const __m128i mult =
+ MK_CST_16(CST_5b(red_to_blue) + 256,CST_5b(green_to_blue));
+ const __m128i perm =
+ _mm_setr_epi8(-1, 1, -1, 2, -1, 5, -1, 6, -1, 9, -1, 10, -1, 13, -1, 14);
+ if (tile_width >= 4) {
+ int y;
+ for (y = 0; y < tile_height; ++y) {
+ const uint32_t* const src = argb + y * stride;
+ const __m128i A1 = _mm_loadu_si128((const __m128i*)src);
+ const __m128i B1 = _mm_shuffle_epi8(A1, perm);
+ const __m128i C1 = _mm_mulhi_epi16(B1, mult);
+ const __m128i D1 = _mm_sub_epi16(A1, C1);
+ __m128i E = _mm_add_epi16(_mm_srli_epi32(D1, 16), D1);
+ int x;
+ for (x = 4; x + 4 <= tile_width; x += 4) {
+ const __m128i A2 = _mm_loadu_si128((const __m128i*)(src + x));
+ __m128i B2, C2, D2;
+ ++histo[_mm_extract_epi8(E, 0)];
+ B2 = _mm_shuffle_epi8(A2, perm);
+ ++histo[_mm_extract_epi8(E, 4)];
+ C2 = _mm_mulhi_epi16(B2, mult);
+ ++histo[_mm_extract_epi8(E, 8)];
+ D2 = _mm_sub_epi16(A2, C2);
+ ++histo[_mm_extract_epi8(E, 12)];
+ E = _mm_add_epi16(_mm_srli_epi32(D2, 16), D2);
+ }
+ ++histo[_mm_extract_epi8(E, 0)];
+ ++histo[_mm_extract_epi8(E, 4)];
+ ++histo[_mm_extract_epi8(E, 8)];
+ ++histo[_mm_extract_epi8(E, 12)];
}
}
{
- const int left_over = tile_width & (SPAN - 1);
+ const int left_over = tile_width & 3;
if (left_over > 0) {
VP8LCollectColorBlueTransforms_C(argb + tile_width - left_over, stride,
left_over, tile_height,
@@ -95,33 +96,37 @@ static void CollectColorBlueTransforms_SSE41(const uint32_t* argb, int stride,
static void CollectColorRedTransforms_SSE41(const uint32_t* argb, int stride,
int tile_width, int tile_height,
int green_to_red, int histo[]) {
- const __m128i mults_g = _mm_set1_epi16(CST_5b(green_to_red));
- const __m128i mask_g = _mm_set1_epi32(0x00ff00); // green mask
- const __m128i mask = _mm_set1_epi16(0xff);
-
- int y;
- for (y = 0; y < tile_height; ++y) {
- const uint32_t* const src = argb + y * stride;
- int i, x;
- for (x = 0; x + SPAN <= tile_width; x += SPAN) {
- uint16_t values[SPAN];
- const __m128i in0 = _mm_loadu_si128((__m128i*)&src[x + 0]);
- const __m128i in1 = _mm_loadu_si128((__m128i*)&src[x + SPAN / 2]);
- const __m128i g0 = _mm_and_si128(in0, mask_g); // 0 0 | g 0
- const __m128i g1 = _mm_and_si128(in1, mask_g);
- const __m128i g = _mm_packus_epi32(g0, g1); // g 0
- const __m128i A0 = _mm_srli_epi32(in0, 16); // 0 0 | x r
- const __m128i A1 = _mm_srli_epi32(in1, 16);
- const __m128i A = _mm_packus_epi32(A0, A1); // x r
- const __m128i B = _mm_mulhi_epi16(g, mults_g); // x dr
- const __m128i C = _mm_sub_epi8(A, B); // x r'
- const __m128i D = _mm_and_si128(C, mask); // 0 r'
- _mm_storeu_si128((__m128i*)values, D);
- for (i = 0; i < SPAN; ++i) ++histo[values[i]];
+
+ const __m128i mult = MK_CST_16(0, CST_5b(green_to_red));
+ const __m128i mask_g = _mm_set1_epi32(0x0000ff00);
+ if (tile_width >= 4) {
+ int y;
+ for (y = 0; y < tile_height; ++y) {
+ const uint32_t* const src = argb + y * stride;
+ const __m128i A1 = _mm_loadu_si128((const __m128i*)src);
+ const __m128i B1 = _mm_and_si128(A1, mask_g);
+ const __m128i C1 = _mm_madd_epi16(B1, mult);
+ __m128i D = _mm_sub_epi16(A1, C1);
+ int x;
+ for (x = 4; x + 4 <= tile_width; x += 4) {
+ const __m128i A2 = _mm_loadu_si128((const __m128i*)(src + x));
+ __m128i B2, C2;
+ ++histo[_mm_extract_epi8(D, 2)];
+ B2 = _mm_and_si128(A2, mask_g);
+ ++histo[_mm_extract_epi8(D, 6)];
+ C2 = _mm_madd_epi16(B2, mult);
+ ++histo[_mm_extract_epi8(D, 10)];
+ ++histo[_mm_extract_epi8(D, 14)];
+ D = _mm_sub_epi16(A2, C2);
+ }
+ ++histo[_mm_extract_epi8(D, 2)];
+ ++histo[_mm_extract_epi8(D, 6)];
+ ++histo[_mm_extract_epi8(D, 10)];
+ ++histo[_mm_extract_epi8(D, 14)];
}
}
{
- const int left_over = tile_width & (SPAN - 1);
+ const int left_over = tile_width & 3;
if (left_over > 0) {
VP8LCollectColorRedTransforms_C(argb + tile_width - left_over, stride,
left_over, tile_height, green_to_red,
@@ -130,6 +135,8 @@ static void CollectColorRedTransforms_SSE41(const uint32_t* argb, int stride,
}
}
+#undef MK_CST_16
+
//------------------------------------------------------------------------------
// Entry point
diff --git a/src/3rdparty/libwebp/src/dsp/lossless_mips_dsp_r2.c b/src/3rdparty/libwebp/src/dsp/lossless_mips_dsp_r2.c
index 9888854..bfe5ea6 100644
--- a/src/3rdparty/libwebp/src/dsp/lossless_mips_dsp_r2.c
+++ b/src/3rdparty/libwebp/src/dsp/lossless_mips_dsp_r2.c
@@ -188,46 +188,51 @@ static WEBP_INLINE uint32_t Average4(uint32_t a0, uint32_t a1,
return Average2(Average2(a0, a1), Average2(a2, a3));
}
-static uint32_t Predictor5_MIPSdspR2(uint32_t left, const uint32_t* const top) {
- return Average3(left, top[0], top[1]);
+static uint32_t Predictor5_MIPSdspR2(const uint32_t* const left,
+ const uint32_t* const top) {
+ return Average3(*left, top[0], top[1]);
}
-static uint32_t Predictor6_MIPSdspR2(uint32_t left, const uint32_t* const top) {
- return Average2(left, top[-1]);
+static uint32_t Predictor6_MIPSdspR2(const uint32_t* const left,
+ const uint32_t* const top) {
+ return Average2(*left, top[-1]);
}
-static uint32_t Predictor7_MIPSdspR2(uint32_t left, const uint32_t* const top) {
- return Average2(left, top[0]);
+static uint32_t Predictor7_MIPSdspR2(const uint32_t* const left,
+ const uint32_t* const top) {
+ return Average2(*left, top[0]);
}
-static uint32_t Predictor8_MIPSdspR2(uint32_t left, const uint32_t* const top) {
+static uint32_t Predictor8_MIPSdspR2(const uint32_t* const left,
+ const uint32_t* const top) {
(void)left;
return Average2(top[-1], top[0]);
}
-static uint32_t Predictor9_MIPSdspR2(uint32_t left, const uint32_t* const top) {
+static uint32_t Predictor9_MIPSdspR2(const uint32_t* const left,
+ const uint32_t* const top) {
(void)left;
return Average2(top[0], top[1]);
}
-static uint32_t Predictor10_MIPSdspR2(uint32_t left,
+static uint32_t Predictor10_MIPSdspR2(const uint32_t* const left,
const uint32_t* const top) {
- return Average4(left, top[-1], top[0], top[1]);
+ return Average4(*left, top[-1], top[0], top[1]);
}
-static uint32_t Predictor11_MIPSdspR2(uint32_t left,
+static uint32_t Predictor11_MIPSdspR2(const uint32_t* const left,
const uint32_t* const top) {
- return Select(top[0], left, top[-1]);
+ return Select(top[0], *left, top[-1]);
}
-static uint32_t Predictor12_MIPSdspR2(uint32_t left,
+static uint32_t Predictor12_MIPSdspR2(const uint32_t* const left,
const uint32_t* const top) {
- return ClampedAddSubtractFull(left, top[0], top[-1]);
+ return ClampedAddSubtractFull(*left, top[0], top[-1]);
}
-static uint32_t Predictor13_MIPSdspR2(uint32_t left,
+static uint32_t Predictor13_MIPSdspR2(const uint32_t* const left,
const uint32_t* const top) {
- return ClampedAddSubtractHalf(left, top[0], top[-1]);
+ return ClampedAddSubtractHalf(*left, top[0], top[-1]);
}
// Add green to blue and red channels (i.e. perform the inverse transform of
diff --git a/src/3rdparty/libwebp/src/dsp/lossless_neon.c b/src/3rdparty/libwebp/src/dsp/lossless_neon.c
index 76a1b6f..89e3e01 100644
--- a/src/3rdparty/libwebp/src/dsp/lossless_neon.c
+++ b/src/3rdparty/libwebp/src/dsp/lossless_neon.c
@@ -188,17 +188,21 @@ static WEBP_INLINE uint32_t Average3_NEON(uint32_t a0, uint32_t a1,
return avg;
}
-static uint32_t Predictor5_NEON(uint32_t left, const uint32_t* const top) {
- return Average3_NEON(left, top[0], top[1]);
+static uint32_t Predictor5_NEON(const uint32_t* const left,
+ const uint32_t* const top) {
+ return Average3_NEON(*left, top[0], top[1]);
}
-static uint32_t Predictor6_NEON(uint32_t left, const uint32_t* const top) {
- return Average2_NEON(left, top[-1]);
+static uint32_t Predictor6_NEON(const uint32_t* const left,
+ const uint32_t* const top) {
+ return Average2_NEON(*left, top[-1]);
}
-static uint32_t Predictor7_NEON(uint32_t left, const uint32_t* const top) {
- return Average2_NEON(left, top[0]);
+static uint32_t Predictor7_NEON(const uint32_t* const left,
+ const uint32_t* const top) {
+ return Average2_NEON(*left, top[0]);
}
-static uint32_t Predictor13_NEON(uint32_t left, const uint32_t* const top) {
- return ClampedAddSubtractHalf_NEON(left, top[0], top[-1]);
+static uint32_t Predictor13_NEON(const uint32_t* const left,
+ const uint32_t* const top) {
+ return ClampedAddSubtractHalf_NEON(*left, top[0], top[-1]);
}
// Batch versions of those functions.
diff --git a/src/3rdparty/libwebp/src/dsp/lossless_sse2.c b/src/3rdparty/libwebp/src/dsp/lossless_sse2.c
index 17d7576..4b6a532 100644
--- a/src/3rdparty/libwebp/src/dsp/lossless_sse2.c
+++ b/src/3rdparty/libwebp/src/dsp/lossless_sse2.c
@@ -18,7 +18,6 @@
#include "src/dsp/common_sse2.h"
#include "src/dsp/lossless.h"
#include "src/dsp/lossless_common.h"
-#include <assert.h>
#include <emmintrin.h>
//------------------------------------------------------------------------------
@@ -28,23 +27,22 @@ static WEBP_INLINE uint32_t ClampedAddSubtractFull_SSE2(uint32_t c0,
uint32_t c1,
uint32_t c2) {
const __m128i zero = _mm_setzero_si128();
- const __m128i C0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(c0), zero);
- const __m128i C1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(c1), zero);
- const __m128i C2 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(c2), zero);
+ const __m128i C0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c0), zero);
+ const __m128i C1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c1), zero);
+ const __m128i C2 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c2), zero);
const __m128i V1 = _mm_add_epi16(C0, C1);
const __m128i V2 = _mm_sub_epi16(V1, C2);
const __m128i b = _mm_packus_epi16(V2, V2);
- const uint32_t output = _mm_cvtsi128_si32(b);
- return output;
+ return (uint32_t)_mm_cvtsi128_si32(b);
}
static WEBP_INLINE uint32_t ClampedAddSubtractHalf_SSE2(uint32_t c0,
uint32_t c1,
uint32_t c2) {
const __m128i zero = _mm_setzero_si128();
- const __m128i C0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(c0), zero);
- const __m128i C1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(c1), zero);
- const __m128i B0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(c2), zero);
+ const __m128i C0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c0), zero);
+ const __m128i C1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c1), zero);
+ const __m128i B0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c2), zero);
const __m128i avg = _mm_add_epi16(C1, C0);
const __m128i A0 = _mm_srli_epi16(avg, 1);
const __m128i A1 = _mm_sub_epi16(A0, B0);
@@ -53,16 +51,15 @@ static WEBP_INLINE uint32_t ClampedAddSubtractHalf_SSE2(uint32_t c0,
const __m128i A3 = _mm_srai_epi16(A2, 1);
const __m128i A4 = _mm_add_epi16(A0, A3);
const __m128i A5 = _mm_packus_epi16(A4, A4);
- const uint32_t output = _mm_cvtsi128_si32(A5);
- return output;
+ return (uint32_t)_mm_cvtsi128_si32(A5);
}
static WEBP_INLINE uint32_t Select_SSE2(uint32_t a, uint32_t b, uint32_t c) {
int pa_minus_pb;
const __m128i zero = _mm_setzero_si128();
- const __m128i A0 = _mm_cvtsi32_si128(a);
- const __m128i B0 = _mm_cvtsi32_si128(b);
- const __m128i C0 = _mm_cvtsi32_si128(c);
+ const __m128i A0 = _mm_cvtsi32_si128((int)a);
+ const __m128i B0 = _mm_cvtsi32_si128((int)b);
+ const __m128i C0 = _mm_cvtsi32_si128((int)c);
const __m128i AC0 = _mm_subs_epu8(A0, C0);
const __m128i CA0 = _mm_subs_epu8(C0, A0);
const __m128i BC0 = _mm_subs_epu8(B0, C0);
@@ -95,8 +92,8 @@ static WEBP_INLINE void Average2_uint32_SSE2(const uint32_t a0,
__m128i* const avg) {
// (a + b) >> 1 = ((a + b + 1) >> 1) - ((a ^ b) & 1)
const __m128i ones = _mm_set1_epi8(1);
- const __m128i A0 = _mm_cvtsi32_si128(a0);
- const __m128i A1 = _mm_cvtsi32_si128(a1);
+ const __m128i A0 = _mm_cvtsi32_si128((int)a0);
+ const __m128i A1 = _mm_cvtsi32_si128((int)a1);
const __m128i avg1 = _mm_avg_epu8(A0, A1);
const __m128i one = _mm_and_si128(_mm_xor_si128(A0, A1), ones);
*avg = _mm_sub_epi8(avg1, one);
@@ -104,8 +101,8 @@ static WEBP_INLINE void Average2_uint32_SSE2(const uint32_t a0,
static WEBP_INLINE __m128i Average2_uint32_16_SSE2(uint32_t a0, uint32_t a1) {
const __m128i zero = _mm_setzero_si128();
- const __m128i A0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(a0), zero);
- const __m128i A1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(a1), zero);
+ const __m128i A0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)a0), zero);
+ const __m128i A1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)a1), zero);
const __m128i sum = _mm_add_epi16(A1, A0);
return _mm_srli_epi16(sum, 1);
}
@@ -113,19 +110,18 @@ static WEBP_INLINE __m128i Average2_uint32_16_SSE2(uint32_t a0, uint32_t a1) {
static WEBP_INLINE uint32_t Average2_SSE2(uint32_t a0, uint32_t a1) {
__m128i output;
Average2_uint32_SSE2(a0, a1, &output);
- return _mm_cvtsi128_si32(output);
+ return (uint32_t)_mm_cvtsi128_si32(output);
}
static WEBP_INLINE uint32_t Average3_SSE2(uint32_t a0, uint32_t a1,
uint32_t a2) {
const __m128i zero = _mm_setzero_si128();
const __m128i avg1 = Average2_uint32_16_SSE2(a0, a2);
- const __m128i A1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(a1), zero);
+ const __m128i A1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)a1), zero);
const __m128i sum = _mm_add_epi16(avg1, A1);
const __m128i avg2 = _mm_srli_epi16(sum, 1);
const __m128i A2 = _mm_packus_epi16(avg2, avg2);
- const uint32_t output = _mm_cvtsi128_si32(A2);
- return output;
+ return (uint32_t)_mm_cvtsi128_si32(A2);
}
static WEBP_INLINE uint32_t Average4_SSE2(uint32_t a0, uint32_t a1,
@@ -135,46 +131,54 @@ static WEBP_INLINE uint32_t Average4_SSE2(uint32_t a0, uint32_t a1,
const __m128i sum = _mm_add_epi16(avg2, avg1);
const __m128i avg3 = _mm_srli_epi16(sum, 1);
const __m128i A0 = _mm_packus_epi16(avg3, avg3);
- const uint32_t output = _mm_cvtsi128_si32(A0);
- return output;
+ return (uint32_t)_mm_cvtsi128_si32(A0);
}
-static uint32_t Predictor5_SSE2(uint32_t left, const uint32_t* const top) {
- const uint32_t pred = Average3_SSE2(left, top[0], top[1]);
+static uint32_t Predictor5_SSE2(const uint32_t* const left,
+ const uint32_t* const top) {
+ const uint32_t pred = Average3_SSE2(*left, top[0], top[1]);
return pred;
}
-static uint32_t Predictor6_SSE2(uint32_t left, const uint32_t* const top) {
- const uint32_t pred = Average2_SSE2(left, top[-1]);
+static uint32_t Predictor6_SSE2(const uint32_t* const left,
+ const uint32_t* const top) {
+ const uint32_t pred = Average2_SSE2(*left, top[-1]);
return pred;
}
-static uint32_t Predictor7_SSE2(uint32_t left, const uint32_t* const top) {
- const uint32_t pred = Average2_SSE2(left, top[0]);
+static uint32_t Predictor7_SSE2(const uint32_t* const left,
+ const uint32_t* const top) {
+ const uint32_t pred = Average2_SSE2(*left, top[0]);
return pred;
}
-static uint32_t Predictor8_SSE2(uint32_t left, const uint32_t* const top) {
+static uint32_t Predictor8_SSE2(const uint32_t* const left,
+ const uint32_t* const top) {
const uint32_t pred = Average2_SSE2(top[-1], top[0]);
(void)left;
return pred;
}
-static uint32_t Predictor9_SSE2(uint32_t left, const uint32_t* const top) {
+static uint32_t Predictor9_SSE2(const uint32_t* const left,
+ const uint32_t* const top) {
const uint32_t pred = Average2_SSE2(top[0], top[1]);
(void)left;
return pred;
}
-static uint32_t Predictor10_SSE2(uint32_t left, const uint32_t* const top) {
- const uint32_t pred = Average4_SSE2(left, top[-1], top[0], top[1]);
+static uint32_t Predictor10_SSE2(const uint32_t* const left,
+ const uint32_t* const top) {
+ const uint32_t pred = Average4_SSE2(*left, top[-1], top[0], top[1]);
return pred;
}
-static uint32_t Predictor11_SSE2(uint32_t left, const uint32_t* const top) {
- const uint32_t pred = Select_SSE2(top[0], left, top[-1]);
+static uint32_t Predictor11_SSE2(const uint32_t* const left,
+ const uint32_t* const top) {
+ const uint32_t pred = Select_SSE2(top[0], *left, top[-1]);
return pred;
}
-static uint32_t Predictor12_SSE2(uint32_t left, const uint32_t* const top) {
- const uint32_t pred = ClampedAddSubtractFull_SSE2(left, top[0], top[-1]);
+static uint32_t Predictor12_SSE2(const uint32_t* const left,
+ const uint32_t* const top) {
+ const uint32_t pred = ClampedAddSubtractFull_SSE2(*left, top[0], top[-1]);
return pred;
}
-static uint32_t Predictor13_SSE2(uint32_t left, const uint32_t* const top) {
- const uint32_t pred = ClampedAddSubtractHalf_SSE2(left, top[0], top[-1]);
+static uint32_t Predictor13_SSE2(const uint32_t* const left,
+ const uint32_t* const top) {
+ const uint32_t pred = ClampedAddSubtractHalf_SSE2(*left, top[0], top[-1]);
return pred;
}
@@ -184,22 +188,23 @@ static uint32_t Predictor13_SSE2(uint32_t left, const uint32_t* const top) {
static void PredictorAdd0_SSE2(const uint32_t* in, const uint32_t* upper,
int num_pixels, uint32_t* out) {
int i;
- const __m128i black = _mm_set1_epi32(ARGB_BLACK);
+ const __m128i black = _mm_set1_epi32((int)ARGB_BLACK);
for (i = 0; i + 4 <= num_pixels; i += 4) {
const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]);
const __m128i res = _mm_add_epi8(src, black);
_mm_storeu_si128((__m128i*)&out[i], res);
}
if (i != num_pixels) {
- VP8LPredictorsAdd_C[0](in + i, upper + i, num_pixels - i, out + i);
+ VP8LPredictorsAdd_C[0](in + i, NULL, num_pixels - i, out + i);
}
+ (void)upper;
}
// Predictor1: left.
static void PredictorAdd1_SSE2(const uint32_t* in, const uint32_t* upper,
int num_pixels, uint32_t* out) {
int i;
- __m128i prev = _mm_set1_epi32(out[-1]);
+ __m128i prev = _mm_set1_epi32((int)out[-1]);
for (i = 0; i + 4 <= num_pixels; i += 4) {
// a | b | c | d
const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]);
@@ -276,12 +281,12 @@ GENERATE_PREDICTOR_2(9, upper[i + 1])
#undef GENERATE_PREDICTOR_2
// Predictor10: average of (average of (L,TL), average of (T, TR)).
-#define DO_PRED10(OUT) do { \
- __m128i avgLTL, avg; \
- Average2_m128i(&L, &TL, &avgLTL); \
- Average2_m128i(&avgTTR, &avgLTL, &avg); \
- L = _mm_add_epi8(avg, src); \
- out[i + (OUT)] = _mm_cvtsi128_si32(L); \
+#define DO_PRED10(OUT) do { \
+ __m128i avgLTL, avg; \
+ Average2_m128i(&L, &TL, &avgLTL); \
+ Average2_m128i(&avgTTR, &avgLTL, &avg); \
+ L = _mm_add_epi8(avg, src); \
+ out[i + (OUT)] = (uint32_t)_mm_cvtsi128_si32(L); \
} while (0)
#define DO_PRED10_SHIFT do { \
@@ -294,7 +299,7 @@ GENERATE_PREDICTOR_2(9, upper[i + 1])
static void PredictorAdd10_SSE2(const uint32_t* in, const uint32_t* upper,
int num_pixels, uint32_t* out) {
int i;
- __m128i L = _mm_cvtsi32_si128(out[-1]);
+ __m128i L = _mm_cvtsi32_si128((int)out[-1]);
for (i = 0; i + 4 <= num_pixels; i += 4) {
__m128i src = _mm_loadu_si128((const __m128i*)&in[i]);
__m128i TL = _mm_loadu_si128((const __m128i*)&upper[i - 1]);
@@ -327,7 +332,7 @@ static void PredictorAdd10_SSE2(const uint32_t* in, const uint32_t* upper,
const __m128i B = _mm_andnot_si128(mask, T); \
const __m128i pred = _mm_or_si128(A, B); /* pred = (pa > b)? L : T*/ \
L = _mm_add_epi8(src, pred); \
- out[i + (OUT)] = _mm_cvtsi128_si32(L); \
+ out[i + (OUT)] = (uint32_t)_mm_cvtsi128_si32(L); \
} while (0)
#define DO_PRED11_SHIFT do { \
@@ -342,7 +347,7 @@ static void PredictorAdd11_SSE2(const uint32_t* in, const uint32_t* upper,
int num_pixels, uint32_t* out) {
int i;
__m128i pa;
- __m128i L = _mm_cvtsi32_si128(out[-1]);
+ __m128i L = _mm_cvtsi32_si128((int)out[-1]);
for (i = 0; i + 4 <= num_pixels; i += 4) {
__m128i T = _mm_loadu_si128((const __m128i*)&upper[i]);
__m128i TL = _mm_loadu_si128((const __m128i*)&upper[i - 1]);
@@ -375,12 +380,12 @@ static void PredictorAdd11_SSE2(const uint32_t* in, const uint32_t* upper,
#undef DO_PRED11_SHIFT
// Predictor12: ClampedAddSubtractFull.
-#define DO_PRED12(DIFF, LANE, OUT) do { \
- const __m128i all = _mm_add_epi16(L, (DIFF)); \
- const __m128i alls = _mm_packus_epi16(all, all); \
- const __m128i res = _mm_add_epi8(src, alls); \
- out[i + (OUT)] = _mm_cvtsi128_si32(res); \
- L = _mm_unpacklo_epi8(res, zero); \
+#define DO_PRED12(DIFF, LANE, OUT) do { \
+ const __m128i all = _mm_add_epi16(L, (DIFF)); \
+ const __m128i alls = _mm_packus_epi16(all, all); \
+ const __m128i res = _mm_add_epi8(src, alls); \
+ out[i + (OUT)] = (uint32_t)_mm_cvtsi128_si32(res); \
+ L = _mm_unpacklo_epi8(res, zero); \
} while (0)
#define DO_PRED12_SHIFT(DIFF, LANE) do { \
@@ -393,7 +398,7 @@ static void PredictorAdd12_SSE2(const uint32_t* in, const uint32_t* upper,
int num_pixels, uint32_t* out) {
int i;
const __m128i zero = _mm_setzero_si128();
- const __m128i L8 = _mm_cvtsi32_si128(out[-1]);
+ const __m128i L8 = _mm_cvtsi32_si128((int)out[-1]);
__m128i L = _mm_unpacklo_epi8(L8, zero);
for (i = 0; i + 4 <= num_pixels; i += 4) {
// Load 4 pixels at a time.
@@ -459,7 +464,7 @@ static void TransformColorInverse_SSE2(const VP8LMultipliers* const m,
const __m128i mults_b2 = MK_CST_16(CST(red_to_blue_), 0);
#undef MK_CST_16
#undef CST
- const __m128i mask_ag = _mm_set1_epi32(0xff00ff00); // alpha-green masks
+ const __m128i mask_ag = _mm_set1_epi32((int)0xff00ff00); // alpha-green masks
int i;
for (i = 0; i + 4 <= num_pixels; i += 4) {
const __m128i in = _mm_loadu_si128((const __m128i*)&src[i]); // argb
@@ -523,7 +528,7 @@ static void ConvertBGRAToRGB_SSE2(const uint32_t* src, int num_pixels,
static void ConvertBGRAToRGBA_SSE2(const uint32_t* src,
int num_pixels, uint8_t* dst) {
- const __m128i red_blue_mask = _mm_set1_epi32(0x00ff00ffu);
+ const __m128i red_blue_mask = _mm_set1_epi32(0x00ff00ff);
const __m128i* in = (const __m128i*)src;
__m128i* out = (__m128i*)dst;
while (num_pixels >= 8) {
@@ -552,7 +557,7 @@ static void ConvertBGRAToRGBA_SSE2(const uint32_t* src,
static void ConvertBGRAToRGBA4444_SSE2(const uint32_t* src,
int num_pixels, uint8_t* dst) {
const __m128i mask_0x0f = _mm_set1_epi8(0x0f);
- const __m128i mask_0xf0 = _mm_set1_epi8(0xf0);
+ const __m128i mask_0xf0 = _mm_set1_epi8((char)0xf0);
const __m128i* in = (const __m128i*)src;
__m128i* out = (__m128i*)dst;
while (num_pixels >= 8) {
@@ -587,8 +592,8 @@ static void ConvertBGRAToRGBA4444_SSE2(const uint32_t* src,
static void ConvertBGRAToRGB565_SSE2(const uint32_t* src,
int num_pixels, uint8_t* dst) {
- const __m128i mask_0xe0 = _mm_set1_epi8(0xe0);
- const __m128i mask_0xf8 = _mm_set1_epi8(0xf8);
+ const __m128i mask_0xe0 = _mm_set1_epi8((char)0xe0);
+ const __m128i mask_0xf8 = _mm_set1_epi8((char)0xf8);
const __m128i mask_0x07 = _mm_set1_epi8(0x07);
const __m128i* in = (const __m128i*)src;
__m128i* out = (__m128i*)dst;
diff --git a/src/3rdparty/libwebp/src/dsp/lossless_sse41.c b/src/3rdparty/libwebp/src/dsp/lossless_sse41.c
new file mode 100644
index 0000000..bb7ce76
--- /dev/null
+++ b/src/3rdparty/libwebp/src/dsp/lossless_sse41.c
@@ -0,0 +1,133 @@
+// Copyright 2021 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// SSE41 variant of methods for lossless decoder
+
+#include "src/dsp/dsp.h"
+
+#if defined(WEBP_USE_SSE41)
+
+#include "src/dsp/common_sse41.h"
+#include "src/dsp/lossless.h"
+#include "src/dsp/lossless_common.h"
+
+//------------------------------------------------------------------------------
+// Color-space conversion functions
+
+static void TransformColorInverse_SSE41(const VP8LMultipliers* const m,
+ const uint32_t* const src,
+ int num_pixels, uint32_t* dst) {
+// sign-extended multiplying constants, pre-shifted by 5.
+#define CST(X) (((int16_t)(m->X << 8)) >> 5) // sign-extend
+ const __m128i mults_rb =
+ _mm_set1_epi32((int)((uint32_t)CST(green_to_red_) << 16 |
+ (CST(green_to_blue_) & 0xffff)));
+ const __m128i mults_b2 = _mm_set1_epi32(CST(red_to_blue_));
+#undef CST
+ const __m128i mask_ag = _mm_set1_epi32((int)0xff00ff00);
+ const __m128i perm1 = _mm_setr_epi8(-1, 1, -1, 1, -1, 5, -1, 5,
+ -1, 9, -1, 9, -1, 13, -1, 13);
+ const __m128i perm2 = _mm_setr_epi8(-1, 2, -1, -1, -1, 6, -1, -1,
+ -1, 10, -1, -1, -1, 14, -1, -1);
+ int i;
+ for (i = 0; i + 4 <= num_pixels; i += 4) {
+ const __m128i A = _mm_loadu_si128((const __m128i*)(src + i));
+ const __m128i B = _mm_shuffle_epi8(A, perm1); // argb -> g0g0
+ const __m128i C = _mm_mulhi_epi16(B, mults_rb);
+ const __m128i D = _mm_add_epi8(A, C);
+ const __m128i E = _mm_shuffle_epi8(D, perm2);
+ const __m128i F = _mm_mulhi_epi16(E, mults_b2);
+ const __m128i G = _mm_add_epi8(D, F);
+ const __m128i out = _mm_blendv_epi8(G, A, mask_ag);
+ _mm_storeu_si128((__m128i*)&dst[i], out);
+ }
+ // Fall-back to C-version for left-overs.
+ if (i != num_pixels) {
+ VP8LTransformColorInverse_C(m, src + i, num_pixels - i, dst + i);
+ }
+}
+
+//------------------------------------------------------------------------------
+
+#define ARGB_TO_RGB_SSE41 do { \
+ while (num_pixels >= 16) { \
+ const __m128i in0 = _mm_loadu_si128(in + 0); \
+ const __m128i in1 = _mm_loadu_si128(in + 1); \
+ const __m128i in2 = _mm_loadu_si128(in + 2); \
+ const __m128i in3 = _mm_loadu_si128(in + 3); \
+ const __m128i a0 = _mm_shuffle_epi8(in0, perm0); \
+ const __m128i a1 = _mm_shuffle_epi8(in1, perm1); \
+ const __m128i a2 = _mm_shuffle_epi8(in2, perm2); \
+ const __m128i a3 = _mm_shuffle_epi8(in3, perm3); \
+ const __m128i b0 = _mm_blend_epi16(a0, a1, 0xc0); \
+ const __m128i b1 = _mm_blend_epi16(a1, a2, 0xf0); \
+ const __m128i b2 = _mm_blend_epi16(a2, a3, 0xfc); \
+ _mm_storeu_si128(out + 0, b0); \
+ _mm_storeu_si128(out + 1, b1); \
+ _mm_storeu_si128(out + 2, b2); \
+ in += 4; \
+ out += 3; \
+ num_pixels -= 16; \
+ } \
+} while (0)
+
+static void ConvertBGRAToRGB_SSE41(const uint32_t* src, int num_pixels,
+ uint8_t* dst) {
+ const __m128i* in = (const __m128i*)src;
+ __m128i* out = (__m128i*)dst;
+ const __m128i perm0 = _mm_setr_epi8(2, 1, 0, 6, 5, 4, 10, 9,
+ 8, 14, 13, 12, -1, -1, -1, -1);
+ const __m128i perm1 = _mm_shuffle_epi32(perm0, 0x39);
+ const __m128i perm2 = _mm_shuffle_epi32(perm0, 0x4e);
+ const __m128i perm3 = _mm_shuffle_epi32(perm0, 0x93);
+
+ ARGB_TO_RGB_SSE41;
+
+ // left-overs
+ if (num_pixels > 0) {
+ VP8LConvertBGRAToRGB_C((const uint32_t*)in, num_pixels, (uint8_t*)out);
+ }
+}
+
+static void ConvertBGRAToBGR_SSE41(const uint32_t* src,
+ int num_pixels, uint8_t* dst) {
+ const __m128i* in = (const __m128i*)src;
+ __m128i* out = (__m128i*)dst;
+ const __m128i perm0 = _mm_setr_epi8(0, 1, 2, 4, 5, 6, 8, 9, 10,
+ 12, 13, 14, -1, -1, -1, -1);
+ const __m128i perm1 = _mm_shuffle_epi32(perm0, 0x39);
+ const __m128i perm2 = _mm_shuffle_epi32(perm0, 0x4e);
+ const __m128i perm3 = _mm_shuffle_epi32(perm0, 0x93);
+
+ ARGB_TO_RGB_SSE41;
+
+ // left-overs
+ if (num_pixels > 0) {
+ VP8LConvertBGRAToBGR_C((const uint32_t*)in, num_pixels, (uint8_t*)out);
+ }
+}
+
+#undef ARGB_TO_RGB_SSE41
+
+//------------------------------------------------------------------------------
+// Entry point
+
+extern void VP8LDspInitSSE41(void);
+
+WEBP_TSAN_IGNORE_FUNCTION void VP8LDspInitSSE41(void) {
+ VP8LTransformColorInverse = TransformColorInverse_SSE41;
+ VP8LConvertBGRAToRGB = ConvertBGRAToRGB_SSE41;
+ VP8LConvertBGRAToBGR = ConvertBGRAToBGR_SSE41;
+}
+
+#else // !WEBP_USE_SSE41
+
+WEBP_DSP_INIT_STUB(VP8LDspInitSSE41)
+
+#endif // WEBP_USE_SSE41
diff --git a/src/3rdparty/libwebp/src/dsp/msa_macro.h b/src/3rdparty/libwebp/src/dsp/msa_macro.h
index de026a1..51f6c64 100644
--- a/src/3rdparty/libwebp/src/dsp/msa_macro.h
+++ b/src/3rdparty/libwebp/src/dsp/msa_macro.h
@@ -14,6 +14,10 @@
#ifndef WEBP_DSP_MSA_MACRO_H_
#define WEBP_DSP_MSA_MACRO_H_
+#include "src/dsp/dsp.h"
+
+#if defined(WEBP_USE_MSA)
+
#include <stdint.h>
#include <msa.h>
@@ -1389,4 +1393,5 @@ static WEBP_INLINE uint32_t func_hadd_uh_u32(v8u16 in) {
} while (0)
#define AVER_UB2_UB(...) AVER_UB2(v16u8, __VA_ARGS__)
+#endif // WEBP_USE_MSA
#endif // WEBP_DSP_MSA_MACRO_H_
diff --git a/src/3rdparty/libwebp/src/dsp/neon.h b/src/3rdparty/libwebp/src/dsp/neon.h
index aa1dea1..c591f9b 100644
--- a/src/3rdparty/libwebp/src/dsp/neon.h
+++ b/src/3rdparty/libwebp/src/dsp/neon.h
@@ -12,10 +12,12 @@
#ifndef WEBP_DSP_NEON_H_
#define WEBP_DSP_NEON_H_
-#include <arm_neon.h>
-
#include "src/dsp/dsp.h"
+#if defined(WEBP_USE_NEON)
+
+#include <arm_neon.h>
+
// Right now, some intrinsics functions seem slower, so we disable them
// everywhere except newer clang/gcc or aarch64 where the inline assembly is
// incompatible.
@@ -98,4 +100,5 @@ static WEBP_INLINE int32x4x4_t Transpose4x4_NEON(const int32x4x4_t rows) {
} while (0)
#endif
+#endif // WEBP_USE_NEON
#endif // WEBP_DSP_NEON_H_
diff --git a/src/3rdparty/libwebp/src/dsp/quant.h b/src/3rdparty/libwebp/src/dsp/quant.h
index 5e8dba8..fc099bf 100644
--- a/src/3rdparty/libwebp/src/dsp/quant.h
+++ b/src/3rdparty/libwebp/src/dsp/quant.h
@@ -21,10 +21,15 @@
#define IsFlat IsFlat_NEON
-static uint32x2_t horizontal_add_uint32x4(const uint32x4_t a) {
+static uint32_t horizontal_add_uint32x4(const uint32x4_t a) {
+#if defined(__aarch64__)
+ return vaddvq_u32(a);
+#else
const uint64x2_t b = vpaddlq_u32(a);
- return vadd_u32(vreinterpret_u32_u64(vget_low_u64(b)),
- vreinterpret_u32_u64(vget_high_u64(b)));
+ const uint32x2_t c = vadd_u32(vreinterpret_u32_u64(vget_low_u64(b)),
+ vreinterpret_u32_u64(vget_high_u64(b)));
+ return vget_lane_u32(c, 0);
+#endif
}
static WEBP_INLINE int IsFlat(const int16_t* levels, int num_blocks,
@@ -45,7 +50,7 @@ static WEBP_INLINE int IsFlat(const int16_t* levels, int num_blocks,
levels += 16;
}
- return thresh >= (int32_t)vget_lane_u32(horizontal_add_uint32x4(sum), 0);
+ return thresh >= (int)horizontal_add_uint32x4(sum);
}
#else
diff --git a/src/3rdparty/libwebp/src/dsp/rescaler.c b/src/3rdparty/libwebp/src/dsp/rescaler.c
index c5a01e8..14620ce 100644
--- a/src/3rdparty/libwebp/src/dsp/rescaler.c
+++ b/src/3rdparty/libwebp/src/dsp/rescaler.c
@@ -38,8 +38,9 @@ void WebPRescalerImportRowExpand_C(WebPRescaler* const wrk,
int x_out = channel;
// simple bilinear interpolation
int accum = wrk->x_add;
- int left = src[x_in];
- int right = (wrk->src_width > 1) ? src[x_in + x_stride] : left;
+ rescaler_t left = (rescaler_t)src[x_in];
+ rescaler_t right =
+ (wrk->src_width > 1) ? (rescaler_t)src[x_in + x_stride] : left;
x_in += x_stride;
while (1) {
wrk->frow[x_out] = right * wrk->x_add + (left - right) * accum;
@@ -50,7 +51,7 @@ void WebPRescalerImportRowExpand_C(WebPRescaler* const wrk,
left = right;
x_in += x_stride;
assert(x_in < wrk->src_width * x_stride);
- right = src[x_in];
+ right = (rescaler_t)src[x_in];
accum += wrk->x_add;
}
}
@@ -213,7 +214,7 @@ WEBP_DSP_INIT_FUNC(WebPRescalerDspInit) {
WebPRescalerImportRowShrink = WebPRescalerImportRowShrink_C;
if (VP8GetCPUInfo != NULL) {
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
if (VP8GetCPUInfo(kSSE2)) {
WebPRescalerDspInitSSE2();
}
@@ -235,7 +236,7 @@ WEBP_DSP_INIT_FUNC(WebPRescalerDspInit) {
#endif
}
-#if defined(WEBP_USE_NEON)
+#if defined(WEBP_HAVE_NEON)
if (WEBP_NEON_OMIT_C_CODE ||
(VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) {
WebPRescalerDspInitNEON();
diff --git a/src/3rdparty/libwebp/src/dsp/rescaler_sse2.c b/src/3rdparty/libwebp/src/dsp/rescaler_sse2.c
index d7effea..3f18e94 100644
--- a/src/3rdparty/libwebp/src/dsp/rescaler_sse2.c
+++ b/src/3rdparty/libwebp/src/dsp/rescaler_sse2.c
@@ -85,7 +85,7 @@ static void RescalerImportRowExpand_SSE2(WebPRescaler* const wrk,
const __m128i mult = _mm_cvtsi32_si128(((x_add - accum) << 16) | accum);
const __m128i out = _mm_madd_epi16(cur_pixels, mult);
assert(sizeof(*frow) == sizeof(uint32_t));
- WebPUint32ToMem((uint8_t*)frow, _mm_cvtsi128_si32(out));
+ WebPInt32ToMem((uint8_t*)frow, _mm_cvtsi128_si32(out));
frow += 1;
if (frow >= frow_end) break;
accum -= wrk->x_sub;
@@ -132,7 +132,7 @@ static void RescalerImportRowShrink_SSE2(WebPRescaler* const wrk,
__m128i base = zero;
accum += wrk->x_add;
while (accum > 0) {
- const __m128i A = _mm_cvtsi32_si128(WebPMemToUint32(src));
+ const __m128i A = _mm_cvtsi32_si128(WebPMemToInt32(src));
src += 4;
base = _mm_unpacklo_epi8(A, zero);
// To avoid overflow, we need: base * x_add / x_sub < 32768
@@ -198,7 +198,7 @@ static WEBP_INLINE void ProcessRow_SSE2(const __m128i* const A0,
const __m128i* const mult,
uint8_t* const dst) {
const __m128i rounder = _mm_set_epi32(0, ROUNDER, 0, ROUNDER);
- const __m128i mask = _mm_set_epi32(0xffffffffu, 0, 0xffffffffu, 0);
+ const __m128i mask = _mm_set_epi32(~0, 0, ~0, 0);
const __m128i B0 = _mm_mul_epu32(*A0, *mult);
const __m128i B1 = _mm_mul_epu32(*A1, *mult);
const __m128i B2 = _mm_mul_epu32(*A2, *mult);
diff --git a/src/3rdparty/libwebp/src/dsp/ssim.c b/src/3rdparty/libwebp/src/dsp/ssim.c
index 989ce82..f85c2e6 100644
--- a/src/3rdparty/libwebp/src/dsp/ssim.c
+++ b/src/3rdparty/libwebp/src/dsp/ssim.c
@@ -150,7 +150,7 @@ WEBP_DSP_INIT_FUNC(VP8SSIMDspInit) {
#endif
if (VP8GetCPUInfo != NULL) {
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
if (VP8GetCPUInfo(kSSE2)) {
VP8SSIMDspInitSSE2();
}
diff --git a/src/3rdparty/libwebp/src/dsp/upsampling.c b/src/3rdparty/libwebp/src/dsp/upsampling.c
index 9b60da5..87f771f 100644
--- a/src/3rdparty/libwebp/src/dsp/upsampling.c
+++ b/src/3rdparty/libwebp/src/dsp/upsampling.c
@@ -233,12 +233,12 @@ WEBP_DSP_INIT_FUNC(WebPInitYUV444Converters) {
WebPYUV444Converters[MODE_rgbA_4444] = WebPYuv444ToRgba4444_C;
if (VP8GetCPUInfo != NULL) {
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
if (VP8GetCPUInfo(kSSE2)) {
WebPInitYUV444ConvertersSSE2();
}
#endif
-#if defined(WEBP_USE_SSE41)
+#if defined(WEBP_HAVE_SSE41)
if (VP8GetCPUInfo(kSSE4_1)) {
WebPInitYUV444ConvertersSSE41();
}
@@ -278,12 +278,12 @@ WEBP_DSP_INIT_FUNC(WebPInitUpsamplers) {
// If defined, use CPUInfo() to overwrite some pointers with faster versions.
if (VP8GetCPUInfo != NULL) {
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
if (VP8GetCPUInfo(kSSE2)) {
WebPInitUpsamplersSSE2();
}
#endif
-#if defined(WEBP_USE_SSE41)
+#if defined(WEBP_HAVE_SSE41)
if (VP8GetCPUInfo(kSSE4_1)) {
WebPInitUpsamplersSSE41();
}
@@ -300,7 +300,7 @@ WEBP_DSP_INIT_FUNC(WebPInitUpsamplers) {
#endif
}
-#if defined(WEBP_USE_NEON)
+#if defined(WEBP_HAVE_NEON)
if (WEBP_NEON_OMIT_C_CODE ||
(VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) {
WebPInitUpsamplersNEON();
diff --git a/src/3rdparty/libwebp/src/dsp/upsampling_msa.c b/src/3rdparty/libwebp/src/dsp/upsampling_msa.c
index 99eea70..f2e03e8 100644
--- a/src/3rdparty/libwebp/src/dsp/upsampling_msa.c
+++ b/src/3rdparty/libwebp/src/dsp/upsampling_msa.c
@@ -576,9 +576,9 @@ static void FUNC_NAME(const uint8_t* top_y, const uint8_t* bot_y, \
const uint32_t l_uv = ((cur_u[0]) | ((cur_v[0]) << 16)); \
const uint32_t uv0 = (3 * tl_uv + l_uv + 0x00020002u) >> 2; \
const uint8_t* ptop_y = &top_y[1]; \
- uint8_t *ptop_dst = top_dst + XSTEP; \
+ uint8_t* ptop_dst = top_dst + XSTEP; \
const uint8_t* pbot_y = &bot_y[1]; \
- uint8_t *pbot_dst = bot_dst + XSTEP; \
+ uint8_t* pbot_dst = bot_dst + XSTEP; \
\
FUNC(top_y[0], uv0 & 0xff, (uv0 >> 16), top_dst); \
if (bot_y != NULL) { \
diff --git a/src/3rdparty/libwebp/src/dsp/upsampling_neon.c b/src/3rdparty/libwebp/src/dsp/upsampling_neon.c
index 17cbc9f..6ba71a7 100644
--- a/src/3rdparty/libwebp/src/dsp/upsampling_neon.c
+++ b/src/3rdparty/libwebp/src/dsp/upsampling_neon.c
@@ -58,8 +58,8 @@
} while (0)
// Turn the macro into a function for reducing code-size when non-critical
-static void Upsample16Pixels_NEON(const uint8_t *r1, const uint8_t *r2,
- uint8_t *out) {
+static void Upsample16Pixels_NEON(const uint8_t* r1, const uint8_t* r2,
+ uint8_t* out) {
UPSAMPLE_16PIXELS(r1, r2, out);
}
@@ -190,14 +190,14 @@ static const int16_t kCoeffs1[4] = { 19077, 26149, 6419, 13320 };
}
#define NEON_UPSAMPLE_FUNC(FUNC_NAME, FMT, XSTEP) \
-static void FUNC_NAME(const uint8_t *top_y, const uint8_t *bottom_y, \
- const uint8_t *top_u, const uint8_t *top_v, \
- const uint8_t *cur_u, const uint8_t *cur_v, \
- uint8_t *top_dst, uint8_t *bottom_dst, int len) { \
+static void FUNC_NAME(const uint8_t* top_y, const uint8_t* bottom_y, \
+ const uint8_t* top_u, const uint8_t* top_v, \
+ const uint8_t* cur_u, const uint8_t* cur_v, \
+ uint8_t* top_dst, uint8_t* bottom_dst, int len) { \
int block; \
/* 16 byte aligned array to cache reconstructed u and v */ \
uint8_t uv_buf[2 * 32 + 15]; \
- uint8_t *const r_uv = (uint8_t*)((uintptr_t)(uv_buf + 15) & ~15); \
+ uint8_t* const r_uv = (uint8_t*)((uintptr_t)(uv_buf + 15) & ~15); \
const int uv_len = (len + 1) >> 1; \
/* 9 pixels must be read-able for each block */ \
const int num_blocks = (uv_len - 1) >> 3; \
diff --git a/src/3rdparty/libwebp/src/dsp/upsampling_sse2.c b/src/3rdparty/libwebp/src/dsp/upsampling_sse2.c
index 340f1e2..08b6d0b 100644
--- a/src/3rdparty/libwebp/src/dsp/upsampling_sse2.c
+++ b/src/3rdparty/libwebp/src/dsp/upsampling_sse2.c
@@ -121,7 +121,7 @@ static void FUNC_NAME(const uint8_t* top_y, const uint8_t* bottom_y, \
int uv_pos, pos; \
/* 16byte-aligned array to cache reconstructed u and v */ \
uint8_t uv_buf[14 * 32 + 15] = { 0 }; \
- uint8_t* const r_u = (uint8_t*)((uintptr_t)(uv_buf + 15) & ~15); \
+ uint8_t* const r_u = (uint8_t*)((uintptr_t)(uv_buf + 15) & ~(uintptr_t)15); \
uint8_t* const r_v = r_u + 32; \
\
assert(top_y != NULL); \
diff --git a/src/3rdparty/libwebp/src/dsp/yuv.c b/src/3rdparty/libwebp/src/dsp/yuv.c
index 14e67fc..d16c13d 100644
--- a/src/3rdparty/libwebp/src/dsp/yuv.c
+++ b/src/3rdparty/libwebp/src/dsp/yuv.c
@@ -90,16 +90,16 @@ WEBP_DSP_INIT_FUNC(WebPInitSamplers) {
// If defined, use CPUInfo() to overwrite some pointers with faster versions.
if (VP8GetCPUInfo != NULL) {
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
if (VP8GetCPUInfo(kSSE2)) {
WebPInitSamplersSSE2();
}
-#endif // WEBP_USE_SSE2
-#if defined(WEBP_USE_SSE41)
+#endif // WEBP_HAVE_SSE2
+#if defined(WEBP_HAVE_SSE41)
if (VP8GetCPUInfo(kSSE4_1)) {
WebPInitSamplersSSE41();
}
-#endif // WEBP_USE_SSE41
+#endif // WEBP_HAVE_SSE41
#if defined(WEBP_USE_MIPS32)
if (VP8GetCPUInfo(kMIPS32)) {
WebPInitSamplersMIPS32();
@@ -194,50 +194,6 @@ void WebPConvertRGBA32ToUV_C(const uint16_t* rgb,
//-----------------------------------------------------------------------------
-#if !WEBP_NEON_OMIT_C_CODE
-#define MAX_Y ((1 << 10) - 1) // 10b precision over 16b-arithmetic
-static uint16_t clip_y(int v) {
- return (v < 0) ? 0 : (v > MAX_Y) ? MAX_Y : (uint16_t)v;
-}
-
-static uint64_t SharpYUVUpdateY_C(const uint16_t* ref, const uint16_t* src,
- uint16_t* dst, int len) {
- uint64_t diff = 0;
- int i;
- for (i = 0; i < len; ++i) {
- const int diff_y = ref[i] - src[i];
- const int new_y = (int)dst[i] + diff_y;
- dst[i] = clip_y(new_y);
- diff += (uint64_t)abs(diff_y);
- }
- return diff;
-}
-
-static void SharpYUVUpdateRGB_C(const int16_t* ref, const int16_t* src,
- int16_t* dst, int len) {
- int i;
- for (i = 0; i < len; ++i) {
- const int diff_uv = ref[i] - src[i];
- dst[i] += diff_uv;
- }
-}
-
-static void SharpYUVFilterRow_C(const int16_t* A, const int16_t* B, int len,
- const uint16_t* best_y, uint16_t* out) {
- int i;
- for (i = 0; i < len; ++i, ++A, ++B) {
- const int v0 = (A[0] * 9 + A[1] * 3 + B[0] * 3 + B[1] + 8) >> 4;
- const int v1 = (A[1] * 9 + A[0] * 3 + B[1] * 3 + B[0] + 8) >> 4;
- out[2 * i + 0] = clip_y(best_y[2 * i + 0] + v0);
- out[2 * i + 1] = clip_y(best_y[2 * i + 1] + v1);
- }
-}
-#endif // !WEBP_NEON_OMIT_C_CODE
-
-#undef MAX_Y
-
-//-----------------------------------------------------------------------------
-
void (*WebPConvertRGB24ToY)(const uint8_t* rgb, uint8_t* y, int width);
void (*WebPConvertBGR24ToY)(const uint8_t* bgr, uint8_t* y, int width);
void (*WebPConvertRGBA32ToUV)(const uint16_t* rgb,
@@ -247,18 +203,9 @@ void (*WebPConvertARGBToY)(const uint32_t* argb, uint8_t* y, int width);
void (*WebPConvertARGBToUV)(const uint32_t* argb, uint8_t* u, uint8_t* v,
int src_width, int do_store);
-uint64_t (*WebPSharpYUVUpdateY)(const uint16_t* ref, const uint16_t* src,
- uint16_t* dst, int len);
-void (*WebPSharpYUVUpdateRGB)(const int16_t* ref, const int16_t* src,
- int16_t* dst, int len);
-void (*WebPSharpYUVFilterRow)(const int16_t* A, const int16_t* B, int len,
- const uint16_t* best_y, uint16_t* out);
-
extern void WebPInitConvertARGBToYUVSSE2(void);
extern void WebPInitConvertARGBToYUVSSE41(void);
extern void WebPInitConvertARGBToYUVNEON(void);
-extern void WebPInitSharpYUVSSE2(void);
-extern void WebPInitSharpYUVNEON(void);
WEBP_DSP_INIT_FUNC(WebPInitConvertARGBToYUV) {
WebPConvertARGBToY = ConvertARGBToY_C;
@@ -269,40 +216,29 @@ WEBP_DSP_INIT_FUNC(WebPInitConvertARGBToYUV) {
WebPConvertRGBA32ToUV = WebPConvertRGBA32ToUV_C;
-#if !WEBP_NEON_OMIT_C_CODE
- WebPSharpYUVUpdateY = SharpYUVUpdateY_C;
- WebPSharpYUVUpdateRGB = SharpYUVUpdateRGB_C;
- WebPSharpYUVFilterRow = SharpYUVFilterRow_C;
-#endif
-
if (VP8GetCPUInfo != NULL) {
-#if defined(WEBP_USE_SSE2)
+#if defined(WEBP_HAVE_SSE2)
if (VP8GetCPUInfo(kSSE2)) {
WebPInitConvertARGBToYUVSSE2();
- WebPInitSharpYUVSSE2();
}
-#endif // WEBP_USE_SSE2
-#if defined(WEBP_USE_SSE41)
+#endif // WEBP_HAVE_SSE2
+#if defined(WEBP_HAVE_SSE41)
if (VP8GetCPUInfo(kSSE4_1)) {
WebPInitConvertARGBToYUVSSE41();
}
-#endif // WEBP_USE_SSE41
+#endif // WEBP_HAVE_SSE41
}
-#if defined(WEBP_USE_NEON)
+#if defined(WEBP_HAVE_NEON)
if (WEBP_NEON_OMIT_C_CODE ||
(VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) {
WebPInitConvertARGBToYUVNEON();
- WebPInitSharpYUVNEON();
}
-#endif // WEBP_USE_NEON
+#endif // WEBP_HAVE_NEON
assert(WebPConvertARGBToY != NULL);
assert(WebPConvertARGBToUV != NULL);
assert(WebPConvertRGB24ToY != NULL);
assert(WebPConvertBGR24ToY != NULL);
assert(WebPConvertRGBA32ToUV != NULL);
- assert(WebPSharpYUVUpdateY != NULL);
- assert(WebPSharpYUVUpdateRGB != NULL);
- assert(WebPSharpYUVFilterRow != NULL);
}
diff --git a/src/3rdparty/libwebp/src/dsp/yuv.h b/src/3rdparty/libwebp/src/dsp/yuv.h
index c12be1d..66a397d 100644
--- a/src/3rdparty/libwebp/src/dsp/yuv.h
+++ b/src/3rdparty/libwebp/src/dsp/yuv.h
@@ -10,7 +10,7 @@
// inline YUV<->RGB conversion function
//
// The exact naming is Y'CbCr, following the ITU-R BT.601 standard.
-// More information at: http://en.wikipedia.org/wiki/YCbCr
+// More information at: https://en.wikipedia.org/wiki/YCbCr
// Y = 0.2569 * R + 0.5044 * G + 0.0979 * B + 16
// U = -0.1483 * R - 0.2911 * G + 0.4394 * B + 128
// V = 0.4394 * R - 0.3679 * G - 0.0715 * B + 128
diff --git a/src/3rdparty/libwebp/src/dsp/yuv_neon.c b/src/3rdparty/libwebp/src/dsp/yuv_neon.c
index a34d602..ff77b00 100644
--- a/src/3rdparty/libwebp/src/dsp/yuv_neon.c
+++ b/src/3rdparty/libwebp/src/dsp/yuv_neon.c
@@ -173,116 +173,8 @@ WEBP_TSAN_IGNORE_FUNCTION void WebPInitConvertARGBToYUVNEON(void) {
WebPConvertRGBA32ToUV = ConvertRGBA32ToUV_NEON;
}
-//------------------------------------------------------------------------------
-
-#define MAX_Y ((1 << 10) - 1) // 10b precision over 16b-arithmetic
-static uint16_t clip_y_NEON(int v) {
- return (v < 0) ? 0 : (v > MAX_Y) ? MAX_Y : (uint16_t)v;
-}
-
-static uint64_t SharpYUVUpdateY_NEON(const uint16_t* ref, const uint16_t* src,
- uint16_t* dst, int len) {
- int i;
- const int16x8_t zero = vdupq_n_s16(0);
- const int16x8_t max = vdupq_n_s16(MAX_Y);
- uint64x2_t sum = vdupq_n_u64(0);
- uint64_t diff;
-
- for (i = 0; i + 8 <= len; i += 8) {
- const int16x8_t A = vreinterpretq_s16_u16(vld1q_u16(ref + i));
- const int16x8_t B = vreinterpretq_s16_u16(vld1q_u16(src + i));
- const int16x8_t C = vreinterpretq_s16_u16(vld1q_u16(dst + i));
- const int16x8_t D = vsubq_s16(A, B); // diff_y
- const int16x8_t F = vaddq_s16(C, D); // new_y
- const uint16x8_t H =
- vreinterpretq_u16_s16(vmaxq_s16(vminq_s16(F, max), zero));
- const int16x8_t I = vabsq_s16(D); // abs(diff_y)
- vst1q_u16(dst + i, H);
- sum = vpadalq_u32(sum, vpaddlq_u16(vreinterpretq_u16_s16(I)));
- }
- diff = vgetq_lane_u64(sum, 0) + vgetq_lane_u64(sum, 1);
- for (; i < len; ++i) {
- const int diff_y = ref[i] - src[i];
- const int new_y = (int)(dst[i]) + diff_y;
- dst[i] = clip_y_NEON(new_y);
- diff += (uint64_t)(abs(diff_y));
- }
- return diff;
-}
-
-static void SharpYUVUpdateRGB_NEON(const int16_t* ref, const int16_t* src,
- int16_t* dst, int len) {
- int i;
- for (i = 0; i + 8 <= len; i += 8) {
- const int16x8_t A = vld1q_s16(ref + i);
- const int16x8_t B = vld1q_s16(src + i);
- const int16x8_t C = vld1q_s16(dst + i);
- const int16x8_t D = vsubq_s16(A, B); // diff_uv
- const int16x8_t E = vaddq_s16(C, D); // new_uv
- vst1q_s16(dst + i, E);
- }
- for (; i < len; ++i) {
- const int diff_uv = ref[i] - src[i];
- dst[i] += diff_uv;
- }
-}
-
-static void SharpYUVFilterRow_NEON(const int16_t* A, const int16_t* B, int len,
- const uint16_t* best_y, uint16_t* out) {
- int i;
- const int16x8_t max = vdupq_n_s16(MAX_Y);
- const int16x8_t zero = vdupq_n_s16(0);
- for (i = 0; i + 8 <= len; i += 8) {
- const int16x8_t a0 = vld1q_s16(A + i + 0);
- const int16x8_t a1 = vld1q_s16(A + i + 1);
- const int16x8_t b0 = vld1q_s16(B + i + 0);
- const int16x8_t b1 = vld1q_s16(B + i + 1);
- const int16x8_t a0b1 = vaddq_s16(a0, b1);
- const int16x8_t a1b0 = vaddq_s16(a1, b0);
- const int16x8_t a0a1b0b1 = vaddq_s16(a0b1, a1b0); // A0+A1+B0+B1
- const int16x8_t a0b1_2 = vaddq_s16(a0b1, a0b1); // 2*(A0+B1)
- const int16x8_t a1b0_2 = vaddq_s16(a1b0, a1b0); // 2*(A1+B0)
- const int16x8_t c0 = vshrq_n_s16(vaddq_s16(a0b1_2, a0a1b0b1), 3);
- const int16x8_t c1 = vshrq_n_s16(vaddq_s16(a1b0_2, a0a1b0b1), 3);
- const int16x8_t d0 = vaddq_s16(c1, a0);
- const int16x8_t d1 = vaddq_s16(c0, a1);
- const int16x8_t e0 = vrshrq_n_s16(d0, 1);
- const int16x8_t e1 = vrshrq_n_s16(d1, 1);
- const int16x8x2_t f = vzipq_s16(e0, e1);
- const int16x8_t g0 = vreinterpretq_s16_u16(vld1q_u16(best_y + 2 * i + 0));
- const int16x8_t g1 = vreinterpretq_s16_u16(vld1q_u16(best_y + 2 * i + 8));
- const int16x8_t h0 = vaddq_s16(g0, f.val[0]);
- const int16x8_t h1 = vaddq_s16(g1, f.val[1]);
- const int16x8_t i0 = vmaxq_s16(vminq_s16(h0, max), zero);
- const int16x8_t i1 = vmaxq_s16(vminq_s16(h1, max), zero);
- vst1q_u16(out + 2 * i + 0, vreinterpretq_u16_s16(i0));
- vst1q_u16(out + 2 * i + 8, vreinterpretq_u16_s16(i1));
- }
- for (; i < len; ++i) {
- const int a0b1 = A[i + 0] + B[i + 1];
- const int a1b0 = A[i + 1] + B[i + 0];
- const int a0a1b0b1 = a0b1 + a1b0 + 8;
- const int v0 = (8 * A[i + 0] + 2 * a1b0 + a0a1b0b1) >> 4;
- const int v1 = (8 * A[i + 1] + 2 * a0b1 + a0a1b0b1) >> 4;
- out[2 * i + 0] = clip_y_NEON(best_y[2 * i + 0] + v0);
- out[2 * i + 1] = clip_y_NEON(best_y[2 * i + 1] + v1);
- }
-}
-#undef MAX_Y
-
-//------------------------------------------------------------------------------
-
-extern void WebPInitSharpYUVNEON(void);
-
-WEBP_TSAN_IGNORE_FUNCTION void WebPInitSharpYUVNEON(void) {
- WebPSharpYUVUpdateY = SharpYUVUpdateY_NEON;
- WebPSharpYUVUpdateRGB = SharpYUVUpdateRGB_NEON;
- WebPSharpYUVFilterRow = SharpYUVFilterRow_NEON;
-}
-
#else // !WEBP_USE_NEON
WEBP_DSP_INIT_STUB(WebPInitConvertARGBToYUVNEON)
-WEBP_DSP_INIT_STUB(WebPInitSharpYUVNEON)
#endif // WEBP_USE_NEON
diff --git a/src/3rdparty/libwebp/src/dsp/yuv_sse2.c b/src/3rdparty/libwebp/src/dsp/yuv_sse2.c
index baa48d5..01a48f9 100644
--- a/src/3rdparty/libwebp/src/dsp/yuv_sse2.c
+++ b/src/3rdparty/libwebp/src/dsp/yuv_sse2.c
@@ -15,10 +15,12 @@
#if defined(WEBP_USE_SSE2)
-#include "src/dsp/common_sse2.h"
#include <stdlib.h>
#include <emmintrin.h>
+#include "src/dsp/common_sse2.h"
+#include "src/utils/utils.h"
+
//-----------------------------------------------------------------------------
// Convert spans of 32 pixels to various RGB formats for the fancy upsampler.
@@ -74,7 +76,7 @@ static WEBP_INLINE __m128i Load_HI_16_SSE2(const uint8_t* src) {
// Load and replicate the U/V samples
static WEBP_INLINE __m128i Load_UV_HI_8_SSE2(const uint8_t* src) {
const __m128i zero = _mm_setzero_si128();
- const __m128i tmp0 = _mm_cvtsi32_si128(*(const uint32_t*)src);
+ const __m128i tmp0 = _mm_cvtsi32_si128(WebPMemToInt32(src));
const __m128i tmp1 = _mm_unpacklo_epi8(zero, tmp0);
return _mm_unpacklo_epi16(tmp1, tmp1); // replicate samples
}
@@ -130,7 +132,7 @@ static WEBP_INLINE void PackAndStore4444_SSE2(const __m128i* const R,
const __m128i rg0 = _mm_packus_epi16(*B, *A);
const __m128i ba0 = _mm_packus_epi16(*R, *G);
#endif
- const __m128i mask_0xf0 = _mm_set1_epi8(0xf0);
+ const __m128i mask_0xf0 = _mm_set1_epi8((char)0xf0);
const __m128i rb1 = _mm_unpacklo_epi8(rg0, ba0); // rbrbrbrbrb...
const __m128i ga1 = _mm_unpackhi_epi8(rg0, ba0); // gagagagaga...
const __m128i rb2 = _mm_and_si128(rb1, mask_0xf0);
@@ -147,9 +149,10 @@ static WEBP_INLINE void PackAndStore565_SSE2(const __m128i* const R,
const __m128i r0 = _mm_packus_epi16(*R, *R);
const __m128i g0 = _mm_packus_epi16(*G, *G);
const __m128i b0 = _mm_packus_epi16(*B, *B);
- const __m128i r1 = _mm_and_si128(r0, _mm_set1_epi8(0xf8));
+ const __m128i r1 = _mm_and_si128(r0, _mm_set1_epi8((char)0xf8));
const __m128i b1 = _mm_and_si128(_mm_srli_epi16(b0, 3), _mm_set1_epi8(0x1f));
- const __m128i g1 = _mm_srli_epi16(_mm_and_si128(g0, _mm_set1_epi8(0xe0)), 5);
+ const __m128i g1 =
+ _mm_srli_epi16(_mm_and_si128(g0, _mm_set1_epi8((char)0xe0)), 5);
const __m128i g2 = _mm_slli_epi16(_mm_and_si128(g0, _mm_set1_epi8(0x1c)), 3);
const __m128i rg = _mm_or_si128(r1, g1);
const __m128i gb = _mm_or_si128(g2, b1);
@@ -747,128 +750,9 @@ WEBP_TSAN_IGNORE_FUNCTION void WebPInitConvertARGBToYUVSSE2(void) {
WebPConvertRGBA32ToUV = ConvertRGBA32ToUV_SSE2;
}
-//------------------------------------------------------------------------------
-
-#define MAX_Y ((1 << 10) - 1) // 10b precision over 16b-arithmetic
-static uint16_t clip_y(int v) {
- return (v < 0) ? 0 : (v > MAX_Y) ? MAX_Y : (uint16_t)v;
-}
-
-static uint64_t SharpYUVUpdateY_SSE2(const uint16_t* ref, const uint16_t* src,
- uint16_t* dst, int len) {
- uint64_t diff = 0;
- uint32_t tmp[4];
- int i;
- const __m128i zero = _mm_setzero_si128();
- const __m128i max = _mm_set1_epi16(MAX_Y);
- const __m128i one = _mm_set1_epi16(1);
- __m128i sum = zero;
-
- for (i = 0; i + 8 <= len; i += 8) {
- const __m128i A = _mm_loadu_si128((const __m128i*)(ref + i));
- const __m128i B = _mm_loadu_si128((const __m128i*)(src + i));
- const __m128i C = _mm_loadu_si128((const __m128i*)(dst + i));
- const __m128i D = _mm_sub_epi16(A, B); // diff_y
- const __m128i E = _mm_cmpgt_epi16(zero, D); // sign (-1 or 0)
- const __m128i F = _mm_add_epi16(C, D); // new_y
- const __m128i G = _mm_or_si128(E, one); // -1 or 1
- const __m128i H = _mm_max_epi16(_mm_min_epi16(F, max), zero);
- const __m128i I = _mm_madd_epi16(D, G); // sum(abs(...))
- _mm_storeu_si128((__m128i*)(dst + i), H);
- sum = _mm_add_epi32(sum, I);
- }
- _mm_storeu_si128((__m128i*)tmp, sum);
- diff = tmp[3] + tmp[2] + tmp[1] + tmp[0];
- for (; i < len; ++i) {
- const int diff_y = ref[i] - src[i];
- const int new_y = (int)dst[i] + diff_y;
- dst[i] = clip_y(new_y);
- diff += (uint64_t)abs(diff_y);
- }
- return diff;
-}
-
-static void SharpYUVUpdateRGB_SSE2(const int16_t* ref, const int16_t* src,
- int16_t* dst, int len) {
- int i = 0;
- for (i = 0; i + 8 <= len; i += 8) {
- const __m128i A = _mm_loadu_si128((const __m128i*)(ref + i));
- const __m128i B = _mm_loadu_si128((const __m128i*)(src + i));
- const __m128i C = _mm_loadu_si128((const __m128i*)(dst + i));
- const __m128i D = _mm_sub_epi16(A, B); // diff_uv
- const __m128i E = _mm_add_epi16(C, D); // new_uv
- _mm_storeu_si128((__m128i*)(dst + i), E);
- }
- for (; i < len; ++i) {
- const int diff_uv = ref[i] - src[i];
- dst[i] += diff_uv;
- }
-}
-
-static void SharpYUVFilterRow_SSE2(const int16_t* A, const int16_t* B, int len,
- const uint16_t* best_y, uint16_t* out) {
- int i;
- const __m128i kCst8 = _mm_set1_epi16(8);
- const __m128i max = _mm_set1_epi16(MAX_Y);
- const __m128i zero = _mm_setzero_si128();
- for (i = 0; i + 8 <= len; i += 8) {
- const __m128i a0 = _mm_loadu_si128((const __m128i*)(A + i + 0));
- const __m128i a1 = _mm_loadu_si128((const __m128i*)(A + i + 1));
- const __m128i b0 = _mm_loadu_si128((const __m128i*)(B + i + 0));
- const __m128i b1 = _mm_loadu_si128((const __m128i*)(B + i + 1));
- const __m128i a0b1 = _mm_add_epi16(a0, b1);
- const __m128i a1b0 = _mm_add_epi16(a1, b0);
- const __m128i a0a1b0b1 = _mm_add_epi16(a0b1, a1b0); // A0+A1+B0+B1
- const __m128i a0a1b0b1_8 = _mm_add_epi16(a0a1b0b1, kCst8);
- const __m128i a0b1_2 = _mm_add_epi16(a0b1, a0b1); // 2*(A0+B1)
- const __m128i a1b0_2 = _mm_add_epi16(a1b0, a1b0); // 2*(A1+B0)
- const __m128i c0 = _mm_srai_epi16(_mm_add_epi16(a0b1_2, a0a1b0b1_8), 3);
- const __m128i c1 = _mm_srai_epi16(_mm_add_epi16(a1b0_2, a0a1b0b1_8), 3);
- const __m128i d0 = _mm_add_epi16(c1, a0);
- const __m128i d1 = _mm_add_epi16(c0, a1);
- const __m128i e0 = _mm_srai_epi16(d0, 1);
- const __m128i e1 = _mm_srai_epi16(d1, 1);
- const __m128i f0 = _mm_unpacklo_epi16(e0, e1);
- const __m128i f1 = _mm_unpackhi_epi16(e0, e1);
- const __m128i g0 = _mm_loadu_si128((const __m128i*)(best_y + 2 * i + 0));
- const __m128i g1 = _mm_loadu_si128((const __m128i*)(best_y + 2 * i + 8));
- const __m128i h0 = _mm_add_epi16(g0, f0);
- const __m128i h1 = _mm_add_epi16(g1, f1);
- const __m128i i0 = _mm_max_epi16(_mm_min_epi16(h0, max), zero);
- const __m128i i1 = _mm_max_epi16(_mm_min_epi16(h1, max), zero);
- _mm_storeu_si128((__m128i*)(out + 2 * i + 0), i0);
- _mm_storeu_si128((__m128i*)(out + 2 * i + 8), i1);
- }
- for (; i < len; ++i) {
- // (9 * A0 + 3 * A1 + 3 * B0 + B1 + 8) >> 4 =
- // = (8 * A0 + 2 * (A1 + B0) + (A0 + A1 + B0 + B1 + 8)) >> 4
- // We reuse the common sub-expressions.
- const int a0b1 = A[i + 0] + B[i + 1];
- const int a1b0 = A[i + 1] + B[i + 0];
- const int a0a1b0b1 = a0b1 + a1b0 + 8;
- const int v0 = (8 * A[i + 0] + 2 * a1b0 + a0a1b0b1) >> 4;
- const int v1 = (8 * A[i + 1] + 2 * a0b1 + a0a1b0b1) >> 4;
- out[2 * i + 0] = clip_y(best_y[2 * i + 0] + v0);
- out[2 * i + 1] = clip_y(best_y[2 * i + 1] + v1);
- }
-}
-
-#undef MAX_Y
-
-//------------------------------------------------------------------------------
-
-extern void WebPInitSharpYUVSSE2(void);
-
-WEBP_TSAN_IGNORE_FUNCTION void WebPInitSharpYUVSSE2(void) {
- WebPSharpYUVUpdateY = SharpYUVUpdateY_SSE2;
- WebPSharpYUVUpdateRGB = SharpYUVUpdateRGB_SSE2;
- WebPSharpYUVFilterRow = SharpYUVFilterRow_SSE2;
-}
-
#else // !WEBP_USE_SSE2
WEBP_DSP_INIT_STUB(WebPInitSamplersSSE2)
WEBP_DSP_INIT_STUB(WebPInitConvertARGBToYUVSSE2)
-WEBP_DSP_INIT_STUB(WebPInitSharpYUVSSE2)
#endif // WEBP_USE_SSE2
diff --git a/src/3rdparty/libwebp/src/dsp/yuv_sse41.c b/src/3rdparty/libwebp/src/dsp/yuv_sse41.c
index 579d1f7..f79b802 100644
--- a/src/3rdparty/libwebp/src/dsp/yuv_sse41.c
+++ b/src/3rdparty/libwebp/src/dsp/yuv_sse41.c
@@ -15,10 +15,12 @@
#if defined(WEBP_USE_SSE41)
-#include "src/dsp/common_sse41.h"
#include <stdlib.h>
#include <smmintrin.h>
+#include "src/dsp/common_sse41.h"
+#include "src/utils/utils.h"
+
//-----------------------------------------------------------------------------
// Convert spans of 32 pixels to various RGB formats for the fancy upsampler.
@@ -74,7 +76,7 @@ static WEBP_INLINE __m128i Load_HI_16_SSE41(const uint8_t* src) {
// Load and replicate the U/V samples
static WEBP_INLINE __m128i Load_UV_HI_8_SSE41(const uint8_t* src) {
const __m128i zero = _mm_setzero_si128();
- const __m128i tmp0 = _mm_cvtsi32_si128(*(const uint32_t*)src);
+ const __m128i tmp0 = _mm_cvtsi32_si128(WebPMemToInt32(src));
const __m128i tmp1 = _mm_unpacklo_epi8(zero, tmp0);
return _mm_unpacklo_epi16(tmp1, tmp1); // replicate samples
}
diff --git a/src/3rdparty/libwebp/src/enc/alpha_enc.c b/src/3rdparty/libwebp/src/enc/alpha_enc.c
index dce9ca9..f7c0269 100644
--- a/src/3rdparty/libwebp/src/enc/alpha_enc.c
+++ b/src/3rdparty/libwebp/src/enc/alpha_enc.c
@@ -86,7 +86,7 @@ static int EncodeLossless(const uint8_t* const data, int width, int height,
// a decoder bug related to alpha with color cache.
// See: https://code.google.com/p/webp/issues/detail?id=239
// Need to re-enable this later.
- ok = (VP8LEncodeStream(&config, &picture, bw, 0 /*use_cache*/) == VP8_ENC_OK);
+ ok = VP8LEncodeStream(&config, &picture, bw, /*use_cache=*/0);
WebPPictureFree(&picture);
ok = ok && !bw->error_;
if (!ok) {
@@ -303,7 +303,7 @@ static int EncodeAlpha(VP8Encoder* const enc,
int ok = 1;
const int reduce_levels = (quality < 100);
- // quick sanity checks
+ // quick correctness checks
assert((uint64_t)data_size == (uint64_t)width * height); // as per spec
assert(enc != NULL && pic != NULL && pic->a != NULL);
assert(output != NULL && output_size != NULL);
@@ -361,7 +361,7 @@ static int EncodeAlpha(VP8Encoder* const enc,
//------------------------------------------------------------------------------
// Main calls
-static int CompressAlphaJob(void* arg1, void* dummy) {
+static int CompressAlphaJob(void* arg1, void* unused) {
VP8Encoder* const enc = (VP8Encoder*)arg1;
const WebPConfig* config = enc->config_;
uint8_t* alpha_data = NULL;
@@ -375,13 +375,13 @@ static int CompressAlphaJob(void* arg1, void* dummy) {
filter, effort_level, &alpha_data, &alpha_size)) {
return 0;
}
- if (alpha_size != (uint32_t)alpha_size) { // Sanity check.
+ if (alpha_size != (uint32_t)alpha_size) { // Soundness check.
WebPSafeFree(alpha_data);
return 0;
}
enc->alpha_data_size_ = (uint32_t)alpha_size;
enc->alpha_data_ = alpha_data;
- (void)dummy;
+ (void)unused;
return 1;
}
diff --git a/src/3rdparty/libwebp/src/enc/analysis_enc.c b/src/3rdparty/libwebp/src/enc/analysis_enc.c
index 687757a..a0001ac 100644
--- a/src/3rdparty/libwebp/src/enc/analysis_enc.c
+++ b/src/3rdparty/libwebp/src/enc/analysis_enc.c
@@ -126,16 +126,6 @@ static void InitHistogram(VP8Histogram* const histo) {
histo->last_non_zero = 1;
}
-static void MergeHistograms(const VP8Histogram* const in,
- VP8Histogram* const out) {
- if (in->max_value > out->max_value) {
- out->max_value = in->max_value;
- }
- if (in->last_non_zero > out->last_non_zero) {
- out->last_non_zero = in->last_non_zero;
- }
-}
-
//------------------------------------------------------------------------------
// Simplified k-Means, to assign Nb segments based on alpha-histogram
@@ -285,49 +275,6 @@ static int FastMBAnalyze(VP8EncIterator* const it) {
return 0;
}
-static int MBAnalyzeBestIntra4Mode(VP8EncIterator* const it,
- int best_alpha) {
- uint8_t modes[16];
- const int max_mode = MAX_INTRA4_MODE;
- int i4_alpha;
- VP8Histogram total_histo;
- int cur_histo = 0;
- InitHistogram(&total_histo);
-
- VP8IteratorStartI4(it);
- do {
- int mode;
- int best_mode_alpha = DEFAULT_ALPHA;
- VP8Histogram histos[2];
- const uint8_t* const src = it->yuv_in_ + Y_OFF_ENC + VP8Scan[it->i4_];
-
- VP8MakeIntra4Preds(it);
- for (mode = 0; mode < max_mode; ++mode) {
- int alpha;
-
- InitHistogram(&histos[cur_histo]);
- VP8CollectHistogram(src, it->yuv_p_ + VP8I4ModeOffsets[mode],
- 0, 1, &histos[cur_histo]);
- alpha = GetAlpha(&histos[cur_histo]);
- if (IS_BETTER_ALPHA(alpha, best_mode_alpha)) {
- best_mode_alpha = alpha;
- modes[it->i4_] = mode;
- cur_histo ^= 1; // keep track of best histo so far.
- }
- }
- // accumulate best histogram
- MergeHistograms(&histos[cur_histo ^ 1], &total_histo);
- // Note: we reuse the original samples for predictors
- } while (VP8IteratorRotateI4(it, it->yuv_in_ + Y_OFF_ENC));
-
- i4_alpha = GetAlpha(&total_histo);
- if (IS_BETTER_ALPHA(i4_alpha, best_alpha)) {
- VP8SetIntra4Mode(it, modes);
- best_alpha = i4_alpha;
- }
- return best_alpha;
-}
-
static int MBAnalyzeBestUVMode(VP8EncIterator* const it) {
int best_alpha = DEFAULT_ALPHA;
int smallest_alpha = 0;
@@ -371,13 +318,6 @@ static void MBAnalyze(VP8EncIterator* const it,
best_alpha = FastMBAnalyze(it);
} else {
best_alpha = MBAnalyzeBestIntra16Mode(it);
- if (enc->method_ >= 5) {
- // We go and make a fast decision for intra4/intra16.
- // It's usually not a good and definitive pick, but helps seeding the
- // stats about level bit-cost.
- // TODO(skal): improve criterion.
- best_alpha = MBAnalyzeBestIntra4Mode(it, best_alpha);
- }
}
best_uv_alpha = MBAnalyzeBestUVMode(it);
@@ -451,12 +391,14 @@ static int DoSegmentsJob(void* arg1, void* arg2) {
return ok;
}
+#ifdef WEBP_USE_THREAD
static void MergeJobs(const SegmentJob* const src, SegmentJob* const dst) {
int i;
for (i = 0; i <= MAX_ALPHA; ++i) dst->alphas[i] += src->alphas[i];
dst->alpha += src->alpha;
dst->uv_alpha += src->uv_alpha;
}
+#endif
// initialize the job struct with some tasks to perform
static void InitSegmentJob(VP8Encoder* const enc, SegmentJob* const job,
@@ -485,10 +427,10 @@ int VP8EncAnalyze(VP8Encoder* const enc) {
(enc->method_ <= 1); // for method 0 - 1, we need preds_[] to be filled.
if (do_segments) {
const int last_row = enc->mb_h_;
- // We give a little more than a half work to the main thread.
- const int split_row = (9 * last_row + 15) >> 4;
const int total_mb = last_row * enc->mb_w_;
#ifdef WEBP_USE_THREAD
+ // We give a little more than a half work to the main thread.
+ const int split_row = (9 * last_row + 15) >> 4;
const int kMinSplitRow = 2; // minimal rows needed for mt to be worth it
const int do_mt = (enc->thread_level_ > 0) && (split_row >= kMinSplitRow);
#else
@@ -498,6 +440,7 @@ int VP8EncAnalyze(VP8Encoder* const enc) {
WebPGetWorkerInterface();
SegmentJob main_job;
if (do_mt) {
+#ifdef WEBP_USE_THREAD
SegmentJob side_job;
// Note the use of '&' instead of '&&' because we must call the functions
// no matter what.
@@ -515,6 +458,7 @@ int VP8EncAnalyze(VP8Encoder* const enc) {
}
worker_interface->End(&side_job.worker);
if (ok) MergeJobs(&side_job, &main_job); // merge results together
+#endif // WEBP_USE_THREAD
} else {
// Even for single-thread case, we use the generic Worker tools.
InitSegmentJob(enc, &main_job, 0, last_row);
diff --git a/src/3rdparty/libwebp/src/enc/backward_references_cost_enc.c b/src/3rdparty/libwebp/src/enc/backward_references_cost_enc.c
index 516abd7..6968ef3 100644
--- a/src/3rdparty/libwebp/src/enc/backward_references_cost_enc.c
+++ b/src/3rdparty/libwebp/src/enc/backward_references_cost_enc.c
@@ -15,10 +15,11 @@
//
#include <assert.h>
+#include <float.h>
+#include "src/dsp/lossless_common.h"
#include "src/enc/backward_references_enc.h"
#include "src/enc/histogram_enc.h"
-#include "src/dsp/lossless_common.h"
#include "src/utils/color_cache_utils.h"
#include "src/utils/utils.h"
@@ -30,15 +31,15 @@ extern void VP8LBackwardRefsCursorAdd(VP8LBackwardRefs* const refs,
const PixOrCopy v);
typedef struct {
- double alpha_[VALUES_IN_BYTE];
- double red_[VALUES_IN_BYTE];
- double blue_[VALUES_IN_BYTE];
- double distance_[NUM_DISTANCE_CODES];
- double* literal_;
+ float alpha_[VALUES_IN_BYTE];
+ float red_[VALUES_IN_BYTE];
+ float blue_[VALUES_IN_BYTE];
+ float distance_[NUM_DISTANCE_CODES];
+ float* literal_;
} CostModel;
static void ConvertPopulationCountTableToBitEstimates(
- int num_symbols, const uint32_t population_counts[], double output[]) {
+ int num_symbols, const uint32_t population_counts[], float output[]) {
uint32_t sum = 0;
int nonzeros = 0;
int i;
@@ -51,7 +52,7 @@ static void ConvertPopulationCountTableToBitEstimates(
if (nonzeros <= 1) {
memset(output, 0, num_symbols * sizeof(*output));
} else {
- const double logsum = VP8LFastLog2(sum);
+ const float logsum = VP8LFastLog2(sum);
for (i = 0; i < num_symbols; ++i) {
output[i] = logsum - VP8LFastLog2(population_counts[i]);
}
@@ -75,8 +76,8 @@ static int CostModelBuild(CostModel* const m, int xsize, int cache_bits,
}
ConvertPopulationCountTableToBitEstimates(
- VP8LHistogramNumCodes(histo->palette_code_bits_),
- histo->literal_, m->literal_);
+ VP8LHistogramNumCodes(histo->palette_code_bits_), histo->literal_,
+ m->literal_);
ConvertPopulationCountTableToBitEstimates(
VALUES_IN_BYTE, histo->red_, m->red_);
ConvertPopulationCountTableToBitEstimates(
@@ -92,27 +93,27 @@ static int CostModelBuild(CostModel* const m, int xsize, int cache_bits,
return ok;
}
-static WEBP_INLINE double GetLiteralCost(const CostModel* const m, uint32_t v) {
+static WEBP_INLINE float GetLiteralCost(const CostModel* const m, uint32_t v) {
return m->alpha_[v >> 24] +
m->red_[(v >> 16) & 0xff] +
m->literal_[(v >> 8) & 0xff] +
m->blue_[v & 0xff];
}
-static WEBP_INLINE double GetCacheCost(const CostModel* const m, uint32_t idx) {
+static WEBP_INLINE float GetCacheCost(const CostModel* const m, uint32_t idx) {
const int literal_idx = VALUES_IN_BYTE + NUM_LENGTH_CODES + idx;
return m->literal_[literal_idx];
}
-static WEBP_INLINE double GetLengthCost(const CostModel* const m,
- uint32_t length) {
+static WEBP_INLINE float GetLengthCost(const CostModel* const m,
+ uint32_t length) {
int code, extra_bits;
VP8LPrefixEncodeBits(length, &code, &extra_bits);
return m->literal_[VALUES_IN_BYTE + code] + extra_bits;
}
-static WEBP_INLINE double GetDistanceCost(const CostModel* const m,
- uint32_t distance) {
+static WEBP_INLINE float GetDistanceCost(const CostModel* const m,
+ uint32_t distance) {
int code, extra_bits;
VP8LPrefixEncodeBits(distance, &code, &extra_bits);
return m->distance_[code] + extra_bits;
@@ -122,20 +123,20 @@ static WEBP_INLINE void AddSingleLiteralWithCostModel(
const uint32_t* const argb, VP8LColorCache* const hashers,
const CostModel* const cost_model, int idx, int use_color_cache,
float prev_cost, float* const cost, uint16_t* const dist_array) {
- double cost_val = prev_cost;
+ float cost_val = prev_cost;
const uint32_t color = argb[idx];
const int ix = use_color_cache ? VP8LColorCacheContains(hashers, color) : -1;
if (ix >= 0) {
// use_color_cache is true and hashers contains color
- const double mul0 = 0.68;
+ const float mul0 = 0.68f;
cost_val += GetCacheCost(cost_model, ix) * mul0;
} else {
- const double mul1 = 0.82;
+ const float mul1 = 0.82f;
if (use_color_cache) VP8LColorCacheInsert(hashers, color);
cost_val += GetLiteralCost(cost_model, color) * mul1;
}
if (cost[idx] > cost_val) {
- cost[idx] = (float)cost_val;
+ cost[idx] = cost_val;
dist_array[idx] = 1; // only one is inserted.
}
}
@@ -172,7 +173,7 @@ struct CostInterval {
// The GetLengthCost(cost_model, k) are cached in a CostCacheInterval.
typedef struct {
- double cost_;
+ float cost_;
int start_;
int end_; // Exclusive.
} CostCacheInterval;
@@ -187,7 +188,7 @@ typedef struct {
int count_; // The number of stored intervals.
CostCacheInterval* cache_intervals_;
size_t cache_intervals_size_;
- double cost_cache_[MAX_LENGTH]; // Contains the GetLengthCost(cost_model, k).
+ float cost_cache_[MAX_LENGTH]; // Contains the GetLengthCost(cost_model, k).
float* costs_;
uint16_t* dist_array_;
// Most of the time, we only need few intervals -> use a free-list, to avoid
@@ -262,10 +263,13 @@ static int CostManagerInit(CostManager* const manager,
CostManagerInitFreeList(manager);
// Fill in the cost_cache_.
+ // Has to be done in two passes due to a GCC bug on i686
+ // related to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=323
+ for (i = 0; i < cost_cache_size; ++i) {
+ manager->cost_cache_[i] = GetLengthCost(cost_model, i);
+ }
manager->cache_intervals_size_ = 1;
- manager->cost_cache_[0] = GetLengthCost(cost_model, 0);
for (i = 1; i < cost_cache_size; ++i) {
- manager->cost_cache_[i] = GetLengthCost(cost_model, i);
// Get the number of bound intervals.
if (manager->cost_cache_[i] != manager->cost_cache_[i - 1]) {
++manager->cache_intervals_size_;
@@ -294,7 +298,7 @@ static int CostManagerInit(CostManager* const manager,
cur->end_ = 1;
cur->cost_ = manager->cost_cache_[0];
for (i = 1; i < cost_cache_size; ++i) {
- const double cost_val = manager->cost_cache_[i];
+ const float cost_val = manager->cost_cache_[i];
if (cost_val != cur->cost_) {
++cur;
// Initialize an interval.
@@ -303,6 +307,8 @@ static int CostManagerInit(CostManager* const manager,
}
cur->end_ = i + 1;
}
+ assert((size_t)(cur - manager->cache_intervals_) + 1 ==
+ manager->cache_intervals_size_);
}
manager->costs_ = (float*)WebPSafeMalloc(pix_count, sizeof(*manager->costs_));
@@ -311,7 +317,7 @@ static int CostManagerInit(CostManager* const manager,
return 0;
}
// Set the initial costs_ high for every pixel as we will keep the minimum.
- for (i = 0; i < pix_count; ++i) manager->costs_[i] = 1e38f;
+ for (i = 0; i < pix_count; ++i) manager->costs_[i] = FLT_MAX;
return 1;
}
@@ -457,7 +463,7 @@ static WEBP_INLINE void InsertInterval(CostManager* const manager,
// If handling the interval or one of its subintervals becomes to heavy, its
// contribution is added to the costs right away.
static WEBP_INLINE void PushInterval(CostManager* const manager,
- double distance_cost, int position,
+ float distance_cost, int position,
int len) {
size_t i;
CostInterval* interval = manager->head_;
@@ -474,7 +480,7 @@ static WEBP_INLINE void PushInterval(CostManager* const manager,
const int k = j - position;
float cost_tmp;
assert(k >= 0 && k < MAX_LENGTH);
- cost_tmp = (float)(distance_cost + manager->cost_cache_[k]);
+ cost_tmp = distance_cost + manager->cost_cache_[k];
if (manager->costs_[j] > cost_tmp) {
manager->costs_[j] = cost_tmp;
@@ -492,7 +498,7 @@ static WEBP_INLINE void PushInterval(CostManager* const manager,
const int end = position + (cost_cache_intervals[i].end_ > len
? len
: cost_cache_intervals[i].end_);
- const float cost = (float)(distance_cost + cost_cache_intervals[i].cost_);
+ const float cost = distance_cost + cost_cache_intervals[i].cost_;
for (; interval != NULL && interval->start_ < end;
interval = interval_next) {
@@ -570,22 +576,21 @@ static int BackwardReferencesHashChainDistanceOnly(
const int pix_count = xsize * ysize;
const int use_color_cache = (cache_bits > 0);
const size_t literal_array_size =
- sizeof(double) * (NUM_LITERAL_CODES + NUM_LENGTH_CODES +
- ((cache_bits > 0) ? (1 << cache_bits) : 0));
+ sizeof(float) * (VP8LHistogramNumCodes(cache_bits));
const size_t cost_model_size = sizeof(CostModel) + literal_array_size;
CostModel* const cost_model =
(CostModel*)WebPSafeCalloc(1ULL, cost_model_size);
VP8LColorCache hashers;
CostManager* cost_manager =
- (CostManager*)WebPSafeMalloc(1ULL, sizeof(*cost_manager));
+ (CostManager*)WebPSafeCalloc(1ULL, sizeof(*cost_manager));
int offset_prev = -1, len_prev = -1;
- double offset_cost = -1;
+ float offset_cost = -1.f;
int first_offset_is_constant = -1; // initialized with 'impossible' value
int reach = 0;
if (cost_model == NULL || cost_manager == NULL) goto Error;
- cost_model->literal_ = (double*)(cost_model + 1);
+ cost_model->literal_ = (float*)(cost_model + 1);
if (use_color_cache) {
cc_init = VP8LColorCacheInit(&hashers, cache_bits);
if (!cc_init) goto Error;
@@ -675,7 +680,7 @@ static int BackwardReferencesHashChainDistanceOnly(
}
ok = !refs->error_;
-Error:
+ Error:
if (cc_init) VP8LColorCacheClear(&hashers);
CostManagerClear(cost_manager);
WebPSafeFree(cost_model);
diff --git a/src/3rdparty/libwebp/src/enc/backward_references_enc.c b/src/3rdparty/libwebp/src/enc/backward_references_enc.c
index d445b40..49a0fac 100644
--- a/src/3rdparty/libwebp/src/enc/backward_references_enc.c
+++ b/src/3rdparty/libwebp/src/enc/backward_references_enc.c
@@ -10,16 +10,20 @@
// Author: Jyrki Alakuijala (jyrki@google.com)
//
+#include "src/enc/backward_references_enc.h"
+
#include <assert.h>
+#include <float.h>
#include <math.h>
-#include "src/enc/backward_references_enc.h"
-#include "src/enc/histogram_enc.h"
+#include "src/dsp/dsp.h"
#include "src/dsp/lossless.h"
#include "src/dsp/lossless_common.h"
-#include "src/dsp/dsp.h"
+#include "src/enc/histogram_enc.h"
+#include "src/enc/vp8i_enc.h"
#include "src/utils/color_cache_utils.h"
#include "src/utils/utils.h"
+#include "src/webp/encode.h"
#define MIN_BLOCK_SIZE 256 // minimum block size for backward references
@@ -103,6 +107,20 @@ void VP8LBackwardRefsClear(VP8LBackwardRefs* const refs) {
}
}
+// Swaps the content of two VP8LBackwardRefs.
+static void BackwardRefsSwap(VP8LBackwardRefs* const refs1,
+ VP8LBackwardRefs* const refs2) {
+ const int point_to_refs1 =
+ (refs1->tail_ != NULL && refs1->tail_ == &refs1->refs_);
+ const int point_to_refs2 =
+ (refs2->tail_ != NULL && refs2->tail_ == &refs2->refs_);
+ const VP8LBackwardRefs tmp = *refs1;
+ *refs1 = *refs2;
+ *refs2 = tmp;
+ if (point_to_refs2) refs1->tail_ = &refs1->refs_;
+ if (point_to_refs1) refs2->tail_ = &refs2->refs_;
+}
+
void VP8LBackwardRefsInit(VP8LBackwardRefs* const refs, int block_size) {
assert(refs != NULL);
memset(refs, 0, sizeof(*refs));
@@ -154,6 +172,22 @@ static PixOrCopyBlock* BackwardRefsNewBlock(VP8LBackwardRefs* const refs) {
return b;
}
+// Return 1 on success, 0 on error.
+static int BackwardRefsClone(const VP8LBackwardRefs* const from,
+ VP8LBackwardRefs* const to) {
+ const PixOrCopyBlock* block_from = from->refs_;
+ VP8LClearBackwardRefs(to);
+ while (block_from != NULL) {
+ PixOrCopyBlock* const block_to = BackwardRefsNewBlock(to);
+ if (block_to == NULL) return 0;
+ memcpy(block_to->start_, block_from->start_,
+ block_from->size_ * sizeof(PixOrCopy));
+ block_to->size_ = block_from->size_;
+ block_from = block_from->next_;
+ }
+ return 1;
+}
+
extern void VP8LBackwardRefsCursorAdd(VP8LBackwardRefs* const refs,
const PixOrCopy v);
void VP8LBackwardRefsCursorAdd(VP8LBackwardRefs* const refs,
@@ -224,10 +258,13 @@ static WEBP_INLINE int MaxFindCopyLength(int len) {
int VP8LHashChainFill(VP8LHashChain* const p, int quality,
const uint32_t* const argb, int xsize, int ysize,
- int low_effort) {
+ int low_effort, const WebPPicture* const pic,
+ int percent_range, int* const percent) {
const int size = xsize * ysize;
const int iter_max = GetMaxItersForQuality(quality);
const uint32_t window_size = GetWindowSizeForHashChain(quality, xsize);
+ int remaining_percent = percent_range;
+ int percent_start = *percent;
int pos;
int argb_comp;
uint32_t base_position;
@@ -245,7 +282,13 @@ int VP8LHashChainFill(VP8LHashChain* const p, int quality,
hash_to_first_index =
(int32_t*)WebPSafeMalloc(HASH_SIZE, sizeof(*hash_to_first_index));
- if (hash_to_first_index == NULL) return 0;
+ if (hash_to_first_index == NULL) {
+ WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+ return 0;
+ }
+
+ percent_range = remaining_percent / 2;
+ remaining_percent -= percent_range;
// Set the int32_t array to -1.
memset(hash_to_first_index, 0xff, HASH_SIZE * sizeof(*hash_to_first_index));
@@ -292,12 +335,22 @@ int VP8LHashChainFill(VP8LHashChain* const p, int quality,
hash_to_first_index[hash_code] = pos++;
argb_comp = argb_comp_next;
}
+
+ if (!WebPReportProgress(
+ pic, percent_start + percent_range * pos / (size - 2), percent)) {
+ WebPSafeFree(hash_to_first_index);
+ return 0;
+ }
}
// Process the penultimate pixel.
chain[pos] = hash_to_first_index[GetPixPairHash64(argb + pos)];
WebPSafeFree(hash_to_first_index);
+ percent_start += percent_range;
+ if (!WebPReportProgress(pic, percent_start, percent)) return 0;
+ percent_range = remaining_percent;
+
// Find the best match interval at each pixel, defined by an offset to the
// pixel and a length. The right-most pixel cannot match anything to the right
// (hence a best length of 0) and the left-most pixel nothing to the left
@@ -386,8 +439,17 @@ int VP8LHashChainFill(VP8LHashChain* const p, int quality,
max_base_position = base_position;
}
}
+
+ if (!WebPReportProgress(pic,
+ percent_start + percent_range *
+ (size - 2 - base_position) /
+ (size - 2),
+ percent)) {
+ return 0;
+ }
}
- return 1;
+
+ return WebPReportProgress(pic, percent_start + percent_range, percent);
}
static WEBP_INLINE void AddSingleLiteral(uint32_t pixel, int use_color_cache,
@@ -697,7 +759,7 @@ static int CalculateBestCacheSize(const uint32_t* argb, int quality,
int* const best_cache_bits) {
int i;
const int cache_bits_max = (quality <= 25) ? 0 : *best_cache_bits;
- double entropy_min = MAX_ENTROPY;
+ float entropy_min = MAX_ENTROPY;
int cc_init[MAX_COLOR_CACHE_BITS + 1] = { 0 };
VP8LColorCache hashers[MAX_COLOR_CACHE_BITS + 1];
VP8LRefsCursor c = VP8LRefsCursorInit(refs);
@@ -753,12 +815,18 @@ static int CalculateBestCacheSize(const uint32_t* argb, int quality,
}
}
} else {
+ int code, extra_bits, extra_bits_value;
// We should compute the contribution of the (distance,length)
// histograms but those are the same independently from the cache size.
// As those constant contributions are in the end added to the other
- // histogram contributions, we can safely ignore them.
+ // histogram contributions, we can ignore them, except for the length
+ // prefix that is part of the literal_ histogram.
int len = PixOrCopyLength(v);
uint32_t argb_prev = *argb ^ 0xffffffffu;
+ VP8LPrefixEncode(len, &code, &extra_bits, &extra_bits_value);
+ for (i = 0; i <= cache_bits_max; ++i) {
+ ++histos[i]->literal_[NUM_LITERAL_CODES + code];
+ }
// Update the color caches.
do {
if (*argb != argb_prev) {
@@ -776,14 +844,14 @@ static int CalculateBestCacheSize(const uint32_t* argb, int quality,
}
for (i = 0; i <= cache_bits_max; ++i) {
- const double entropy = VP8LHistogramEstimateBits(histos[i]);
+ const float entropy = VP8LHistogramEstimateBits(histos[i]);
if (i == 0 || entropy < entropy_min) {
entropy_min = entropy;
*best_cache_bits = i;
}
}
ok = 1;
-Error:
+ Error:
for (i = 0; i <= cache_bits_max; ++i) {
if (cc_init[i]) VP8LColorCacheClear(&hashers[i]);
VP8LFreeHistogram(histos[i]);
@@ -842,16 +910,21 @@ extern int VP8LBackwardReferencesTraceBackwards(
int xsize, int ysize, const uint32_t* const argb, int cache_bits,
const VP8LHashChain* const hash_chain,
const VP8LBackwardRefs* const refs_src, VP8LBackwardRefs* const refs_dst);
-static VP8LBackwardRefs* GetBackwardReferences(
- int width, int height, const uint32_t* const argb, int quality,
- int lz77_types_to_try, int* const cache_bits,
- const VP8LHashChain* const hash_chain, VP8LBackwardRefs* best,
- VP8LBackwardRefs* worst) {
- const int cache_bits_initial = *cache_bits;
- double bit_cost_best = -1;
+static int GetBackwardReferences(int width, int height,
+ const uint32_t* const argb, int quality,
+ int lz77_types_to_try, int cache_bits_max,
+ int do_no_cache,
+ const VP8LHashChain* const hash_chain,
+ VP8LBackwardRefs* const refs,
+ int* const cache_bits_best) {
VP8LHistogram* histo = NULL;
- int lz77_type, lz77_type_best = 0;
+ int i, lz77_type;
+ // Index 0 is for a color cache, index 1 for no cache (if needed).
+ int lz77_types_best[2] = {0, 0};
+ float bit_costs_best[2] = {FLT_MAX, FLT_MAX};
VP8LHashChain hash_chain_box;
+ VP8LBackwardRefs* const refs_tmp = &refs[do_no_cache ? 2 : 1];
+ int status = 0;
memset(&hash_chain_box, 0, sizeof(hash_chain_box));
histo = VP8LAllocateHistogram(MAX_COLOR_CACHE_BITS);
@@ -860,86 +933,136 @@ static VP8LBackwardRefs* GetBackwardReferences(
for (lz77_type = 1; lz77_types_to_try;
lz77_types_to_try &= ~lz77_type, lz77_type <<= 1) {
int res = 0;
- double bit_cost;
- int cache_bits_tmp = cache_bits_initial;
+ float bit_cost = 0.f;
if ((lz77_types_to_try & lz77_type) == 0) continue;
switch (lz77_type) {
case kLZ77RLE:
- res = BackwardReferencesRle(width, height, argb, 0, worst);
+ res = BackwardReferencesRle(width, height, argb, 0, refs_tmp);
break;
case kLZ77Standard:
// Compute LZ77 with no cache (0 bits), as the ideal LZ77 with a color
// cache is not that different in practice.
- res = BackwardReferencesLz77(width, height, argb, 0, hash_chain, worst);
+ res = BackwardReferencesLz77(width, height, argb, 0, hash_chain,
+ refs_tmp);
break;
case kLZ77Box:
if (!VP8LHashChainInit(&hash_chain_box, width * height)) goto Error;
res = BackwardReferencesLz77Box(width, height, argb, 0, hash_chain,
- &hash_chain_box, worst);
+ &hash_chain_box, refs_tmp);
break;
default:
assert(0);
}
if (!res) goto Error;
- // Next, try with a color cache and update the references.
- if (!CalculateBestCacheSize(argb, quality, worst, &cache_bits_tmp)) {
- goto Error;
- }
- if (cache_bits_tmp > 0) {
- if (!BackwardRefsWithLocalCache(argb, cache_bits_tmp, worst)) {
- goto Error;
+ // Start with the no color cache case.
+ for (i = 1; i >= 0; --i) {
+ int cache_bits = (i == 1) ? 0 : cache_bits_max;
+
+ if (i == 1 && !do_no_cache) continue;
+
+ if (i == 0) {
+ // Try with a color cache.
+ if (!CalculateBestCacheSize(argb, quality, refs_tmp, &cache_bits)) {
+ goto Error;
+ }
+ if (cache_bits > 0) {
+ if (!BackwardRefsWithLocalCache(argb, cache_bits, refs_tmp)) {
+ goto Error;
+ }
+ }
+ }
+
+ if (i == 0 && do_no_cache && cache_bits == 0) {
+ // No need to re-compute bit_cost as it was computed at i == 1.
+ } else {
+ VP8LHistogramCreate(histo, refs_tmp, cache_bits);
+ bit_cost = VP8LHistogramEstimateBits(histo);
}
- }
- // Keep the best backward references.
- VP8LHistogramCreate(histo, worst, cache_bits_tmp);
- bit_cost = VP8LHistogramEstimateBits(histo);
- if (lz77_type_best == 0 || bit_cost < bit_cost_best) {
- VP8LBackwardRefs* const tmp = worst;
- worst = best;
- best = tmp;
- bit_cost_best = bit_cost;
- *cache_bits = cache_bits_tmp;
- lz77_type_best = lz77_type;
+ if (bit_cost < bit_costs_best[i]) {
+ if (i == 1) {
+ // Do not swap as the full cache analysis would have the wrong
+ // VP8LBackwardRefs to start with.
+ if (!BackwardRefsClone(refs_tmp, &refs[1])) goto Error;
+ } else {
+ BackwardRefsSwap(refs_tmp, &refs[0]);
+ }
+ bit_costs_best[i] = bit_cost;
+ lz77_types_best[i] = lz77_type;
+ if (i == 0) *cache_bits_best = cache_bits;
+ }
}
}
- assert(lz77_type_best > 0);
+ assert(lz77_types_best[0] > 0);
+ assert(!do_no_cache || lz77_types_best[1] > 0);
// Improve on simple LZ77 but only for high quality (TraceBackwards is
// costly).
- if ((lz77_type_best == kLZ77Standard || lz77_type_best == kLZ77Box) &&
- quality >= 25) {
- const VP8LHashChain* const hash_chain_tmp =
- (lz77_type_best == kLZ77Standard) ? hash_chain : &hash_chain_box;
- if (VP8LBackwardReferencesTraceBackwards(width, height, argb, *cache_bits,
- hash_chain_tmp, best, worst)) {
- double bit_cost_trace;
- VP8LHistogramCreate(histo, worst, *cache_bits);
+ for (i = 1; i >= 0; --i) {
+ if (i == 1 && !do_no_cache) continue;
+ if ((lz77_types_best[i] == kLZ77Standard ||
+ lz77_types_best[i] == kLZ77Box) &&
+ quality >= 25) {
+ const VP8LHashChain* const hash_chain_tmp =
+ (lz77_types_best[i] == kLZ77Standard) ? hash_chain : &hash_chain_box;
+ const int cache_bits = (i == 1) ? 0 : *cache_bits_best;
+ float bit_cost_trace;
+ if (!VP8LBackwardReferencesTraceBackwards(width, height, argb, cache_bits,
+ hash_chain_tmp, &refs[i],
+ refs_tmp)) {
+ goto Error;
+ }
+ VP8LHistogramCreate(histo, refs_tmp, cache_bits);
bit_cost_trace = VP8LHistogramEstimateBits(histo);
- if (bit_cost_trace < bit_cost_best) best = worst;
+ if (bit_cost_trace < bit_costs_best[i]) {
+ BackwardRefsSwap(refs_tmp, &refs[i]);
+ }
}
- }
- BackwardReferences2DLocality(width, best);
+ BackwardReferences2DLocality(width, &refs[i]);
+
+ if (i == 1 && lz77_types_best[0] == lz77_types_best[1] &&
+ *cache_bits_best == 0) {
+ // If the best cache size is 0 and we have the same best LZ77, just copy
+ // the data over and stop here.
+ if (!BackwardRefsClone(&refs[1], &refs[0])) goto Error;
+ break;
+ }
+ }
+ status = 1;
-Error:
+ Error:
VP8LHashChainClear(&hash_chain_box);
VP8LFreeHistogram(histo);
- return best;
+ return status;
}
-VP8LBackwardRefs* VP8LGetBackwardReferences(
+int VP8LGetBackwardReferences(
int width, int height, const uint32_t* const argb, int quality,
- int low_effort, int lz77_types_to_try, int* const cache_bits,
- const VP8LHashChain* const hash_chain, VP8LBackwardRefs* const refs_tmp1,
- VP8LBackwardRefs* const refs_tmp2) {
+ int low_effort, int lz77_types_to_try, int cache_bits_max, int do_no_cache,
+ const VP8LHashChain* const hash_chain, VP8LBackwardRefs* const refs,
+ int* const cache_bits_best, const WebPPicture* const pic, int percent_range,
+ int* const percent) {
if (low_effort) {
- return GetBackwardReferencesLowEffort(width, height, argb, cache_bits,
- hash_chain, refs_tmp1);
+ VP8LBackwardRefs* refs_best;
+ *cache_bits_best = cache_bits_max;
+ refs_best = GetBackwardReferencesLowEffort(
+ width, height, argb, cache_bits_best, hash_chain, refs);
+ if (refs_best == NULL) {
+ WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+ return 0;
+ }
+ // Set it in first position.
+ BackwardRefsSwap(refs_best, &refs[0]);
} else {
- return GetBackwardReferences(width, height, argb, quality,
- lz77_types_to_try, cache_bits, hash_chain,
- refs_tmp1, refs_tmp2);
+ if (!GetBackwardReferences(width, height, argb, quality, lz77_types_to_try,
+ cache_bits_max, do_no_cache, hash_chain, refs,
+ cache_bits_best)) {
+ WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+ return 0;
+ }
}
+
+ return WebPReportProgress(pic, *percent + percent_range, percent);
}
diff --git a/src/3rdparty/libwebp/src/enc/backward_references_enc.h b/src/3rdparty/libwebp/src/enc/backward_references_enc.h
index 103ddfd..4dff1c2 100644
--- a/src/3rdparty/libwebp/src/enc/backward_references_enc.h
+++ b/src/3rdparty/libwebp/src/enc/backward_references_enc.h
@@ -16,6 +16,7 @@
#include <assert.h>
#include <stdlib.h>
#include "src/webp/types.h"
+#include "src/webp/encode.h"
#include "src/webp/format_constants.h"
#ifdef __cplusplus
@@ -133,10 +134,11 @@ struct VP8LHashChain {
// Must be called first, to set size.
int VP8LHashChainInit(VP8LHashChain* const p, int size);
-// Pre-compute the best matches for argb.
+// Pre-compute the best matches for argb. pic and percent are for progress.
int VP8LHashChainFill(VP8LHashChain* const p, int quality,
const uint32_t* const argb, int xsize, int ysize,
- int low_effort);
+ int low_effort, const WebPPicture* const pic,
+ int percent_range, int* const percent);
void VP8LHashChainClear(VP8LHashChain* const p); // release memory
static WEBP_INLINE int VP8LHashChainFindOffset(const VP8LHashChain* const p,
@@ -218,14 +220,22 @@ enum VP8LLZ77Type {
// Evaluates best possible backward references for specified quality.
// The input cache_bits to 'VP8LGetBackwardReferences' sets the maximum cache
// bits to use (passing 0 implies disabling the local color cache).
-// The optimal cache bits is evaluated and set for the *cache_bits parameter.
-// The return value is the pointer to the best of the two backward refs viz,
-// refs[0] or refs[1].
-VP8LBackwardRefs* VP8LGetBackwardReferences(
+// The optimal cache bits is evaluated and set for the *cache_bits_best
+// parameter with the matching refs_best.
+// If do_no_cache == 0, refs is an array of 2 values and the best
+// VP8LBackwardRefs is put in the first element.
+// If do_no_cache != 0, refs is an array of 3 values and the best
+// VP8LBackwardRefs is put in the first element, the best value with no-cache in
+// the second element.
+// In both cases, the last element is used as temporary internally.
+// pic and percent are for progress.
+// Returns false in case of error (stored in pic->error_code).
+int VP8LGetBackwardReferences(
int width, int height, const uint32_t* const argb, int quality,
- int low_effort, int lz77_types_to_try, int* const cache_bits,
- const VP8LHashChain* const hash_chain, VP8LBackwardRefs* const refs_tmp1,
- VP8LBackwardRefs* const refs_tmp2);
+ int low_effort, int lz77_types_to_try, int cache_bits_max, int do_no_cache,
+ const VP8LHashChain* const hash_chain, VP8LBackwardRefs* const refs,
+ int* const cache_bits_best, const WebPPicture* const pic, int percent_range,
+ int* const percent);
#ifdef __cplusplus
}
diff --git a/src/3rdparty/libwebp/src/enc/config_enc.c b/src/3rdparty/libwebp/src/enc/config_enc.c
index 9d48289..3518b41 100644
--- a/src/3rdparty/libwebp/src/enc/config_enc.c
+++ b/src/3rdparty/libwebp/src/enc/config_enc.c
@@ -39,6 +39,8 @@ int WebPConfigInitInternal(WebPConfig* config,
config->partitions = 0;
config->segments = 4;
config->pass = 1;
+ config->qmin = 0;
+ config->qmax = 100;
config->show_compressed = 0;
config->preprocessing = 0;
config->autofilter = 0;
@@ -106,6 +108,9 @@ int WebPValidateConfig(const WebPConfig* config) {
if (config->filter_type < 0 || config->filter_type > 1) return 0;
if (config->autofilter < 0 || config->autofilter > 1) return 0;
if (config->pass < 1 || config->pass > 10) return 0;
+ if (config->qmin < 0 || config->qmax > 100 || config->qmin > config->qmax) {
+ return 0;
+ }
if (config->show_compressed < 0 || config->show_compressed > 1) return 0;
if (config->preprocessing < 0 || config->preprocessing > 7) return 0;
if (config->partitions < 0 || config->partitions > 3) return 0;
diff --git a/src/3rdparty/libwebp/src/enc/frame_enc.c b/src/3rdparty/libwebp/src/enc/frame_enc.c
index 1aec376..b93d9e5 100644
--- a/src/3rdparty/libwebp/src/enc/frame_enc.c
+++ b/src/3rdparty/libwebp/src/enc/frame_enc.c
@@ -31,10 +31,15 @@
// we allow 2k of extra head-room in PARTITION0 limit.
#define PARTITION0_SIZE_LIMIT ((VP8_MAX_PARTITION0_SIZE - 2048ULL) << 11)
+static float Clamp(float v, float min, float max) {
+ return (v < min) ? min : (v > max) ? max : v;
+}
+
typedef struct { // struct for organizing convergence in either size or PSNR
int is_first;
float dq;
float q, last_q;
+ float qmin, qmax;
double value, last_value; // PSNR or size
double target;
int do_size_search;
@@ -47,7 +52,9 @@ static int InitPassStats(const VP8Encoder* const enc, PassStats* const s) {
s->is_first = 1;
s->dq = 10.f;
- s->q = s->last_q = enc->config_->quality;
+ s->qmin = 1.f * enc->config_->qmin;
+ s->qmax = 1.f * enc->config_->qmax;
+ s->q = s->last_q = Clamp(enc->config_->quality, s->qmin, s->qmax);
s->target = do_size_search ? (double)target_size
: (target_PSNR > 0.) ? target_PSNR
: 40.; // default, just in case
@@ -56,10 +63,6 @@ static int InitPassStats(const VP8Encoder* const enc, PassStats* const s) {
return do_size_search;
}
-static float Clamp(float v, float min, float max) {
- return (v < min) ? min : (v > max) ? max : v;
-}
-
static float ComputeNextQ(PassStats* const s) {
float dq;
if (s->is_first) {
@@ -75,7 +78,7 @@ static float ComputeNextQ(PassStats* const s) {
s->dq = Clamp(dq, -30.f, 30.f);
s->last_q = s->q;
s->last_value = s->value;
- s->q = Clamp(s->q + s->dq, 0.f, 100.f);
+ s->q = Clamp(s->q + s->dq, s->qmin, s->qmax);
return s->q;
}
@@ -775,6 +778,7 @@ int VP8EncTokenLoop(VP8Encoder* const enc) {
// Roughly refresh the proba eight times per pass
int max_count = (enc->mb_w_ * enc->mb_h_) >> 3;
int num_pass_left = enc->config_->pass;
+ int remaining_progress = 40; // percents
const int do_search = enc->do_search_;
VP8EncIterator it;
VP8EncProba* const proba = &enc->proba_;
@@ -802,6 +806,9 @@ int VP8EncTokenLoop(VP8Encoder* const enc) {
uint64_t size_p0 = 0;
uint64_t distortion = 0;
int cnt = max_count;
+ // The final number of passes is not trivial to know in advance.
+ const int pass_progress = remaining_progress / (2 + num_pass_left);
+ remaining_progress -= pass_progress;
VP8IteratorInit(enc, &it);
SetLoopParams(enc, stats.q);
if (is_last_pass) {
@@ -829,7 +836,7 @@ int VP8EncTokenLoop(VP8Encoder* const enc) {
StoreSideInfo(&it);
VP8StoreFilterStats(&it);
VP8IteratorExport(&it);
- ok = VP8IteratorProgress(&it, 20);
+ ok = VP8IteratorProgress(&it, pass_progress);
}
VP8IteratorSaveBoundary(&it);
} while (ok && VP8IteratorNext(&it));
@@ -848,9 +855,10 @@ int VP8EncTokenLoop(VP8Encoder* const enc) {
}
#if (DEBUG_SEARCH > 0)
- printf("#%2d metric:%.1lf -> %.1lf last_q=%.2lf q=%.2lf dq=%.2lf\n",
+ printf("#%2d metric:%.1lf -> %.1lf last_q=%.2lf q=%.2lf dq=%.2lf "
+ " range:[%.1f, %.1f]\n",
num_pass_left, stats.last_value, stats.value,
- stats.last_q, stats.q, stats.dq);
+ stats.last_q, stats.q, stats.dq, stats.qmin, stats.qmax);
#endif
if (enc->max_i4_header_bits_ > 0 && size_p0 > PARTITION0_SIZE_LIMIT) {
++num_pass_left;
@@ -874,7 +882,8 @@ int VP8EncTokenLoop(VP8Encoder* const enc) {
ok = VP8EmitTokens(&enc->tokens_, enc->parts_ + 0,
(const uint8_t*)proba->coeffs_, 1);
}
- ok = ok && WebPReportProgress(enc->pic_, enc->percent_ + 20, &enc->percent_);
+ ok = ok && WebPReportProgress(enc->pic_, enc->percent_ + remaining_progress,
+ &enc->percent_);
return PostLoopFinalize(&it, ok);
}
diff --git a/src/3rdparty/libwebp/src/enc/histogram_enc.c b/src/3rdparty/libwebp/src/enc/histogram_enc.c
index d89b985..8418def 100644
--- a/src/3rdparty/libwebp/src/enc/histogram_enc.c
+++ b/src/3rdparty/libwebp/src/enc/histogram_enc.c
@@ -13,15 +13,17 @@
#include "src/webp/config.h"
#endif
+#include <float.h>
#include <math.h>
-#include "src/enc/backward_references_enc.h"
-#include "src/enc/histogram_enc.h"
#include "src/dsp/lossless.h"
#include "src/dsp/lossless_common.h"
+#include "src/enc/backward_references_enc.h"
+#include "src/enc/histogram_enc.h"
+#include "src/enc/vp8i_enc.h"
#include "src/utils/utils.h"
-#define MAX_COST 1.e38
+#define MAX_BIT_COST FLT_MAX
// Number of partitions for the three dominant (literal, red and blue) symbol
// costs.
@@ -208,6 +210,7 @@ void VP8LHistogramAddSinglePixOrCopy(VP8LHistogram* const histo,
} else if (PixOrCopyIsCacheIdx(v)) {
const int literal_ix =
NUM_LITERAL_CODES + NUM_LENGTH_CODES + PixOrCopyCacheIdx(v);
+ assert(histo->palette_code_bits_ != 0);
++histo->literal_[literal_ix];
} else {
int code, extra_bits;
@@ -227,8 +230,8 @@ void VP8LHistogramAddSinglePixOrCopy(VP8LHistogram* const histo,
// -----------------------------------------------------------------------------
// Entropy-related functions.
-static WEBP_INLINE double BitsEntropyRefine(const VP8LBitEntropy* entropy) {
- double mix;
+static WEBP_INLINE float BitsEntropyRefine(const VP8LBitEntropy* entropy) {
+ float mix;
if (entropy->nonzeros < 5) {
if (entropy->nonzeros <= 1) {
return 0;
@@ -237,67 +240,67 @@ static WEBP_INLINE double BitsEntropyRefine(const VP8LBitEntropy* entropy) {
// Let's mix in a bit of entropy to favor good clustering when
// distributions of these are combined.
if (entropy->nonzeros == 2) {
- return 0.99 * entropy->sum + 0.01 * entropy->entropy;
+ return 0.99f * entropy->sum + 0.01f * entropy->entropy;
}
// No matter what the entropy says, we cannot be better than min_limit
// with Huffman coding. I am mixing a bit of entropy into the
// min_limit since it produces much better (~0.5 %) compression results
// perhaps because of better entropy clustering.
if (entropy->nonzeros == 3) {
- mix = 0.95;
+ mix = 0.95f;
} else {
- mix = 0.7; // nonzeros == 4.
+ mix = 0.7f; // nonzeros == 4.
}
} else {
- mix = 0.627;
+ mix = 0.627f;
}
{
- double min_limit = 2 * entropy->sum - entropy->max_val;
- min_limit = mix * min_limit + (1.0 - mix) * entropy->entropy;
+ float min_limit = 2.f * entropy->sum - entropy->max_val;
+ min_limit = mix * min_limit + (1.f - mix) * entropy->entropy;
return (entropy->entropy < min_limit) ? min_limit : entropy->entropy;
}
}
-double VP8LBitsEntropy(const uint32_t* const array, int n) {
+float VP8LBitsEntropy(const uint32_t* const array, int n) {
VP8LBitEntropy entropy;
VP8LBitsEntropyUnrefined(array, n, &entropy);
return BitsEntropyRefine(&entropy);
}
-static double InitialHuffmanCost(void) {
+static float InitialHuffmanCost(void) {
// Small bias because Huffman code length is typically not stored in
// full length.
static const int kHuffmanCodeOfHuffmanCodeSize = CODE_LENGTH_CODES * 3;
- static const double kSmallBias = 9.1;
+ static const float kSmallBias = 9.1f;
return kHuffmanCodeOfHuffmanCodeSize - kSmallBias;
}
// Finalize the Huffman cost based on streak numbers and length type (<3 or >=3)
-static double FinalHuffmanCost(const VP8LStreaks* const stats) {
+static float FinalHuffmanCost(const VP8LStreaks* const stats) {
// The constants in this function are experimental and got rounded from
// their original values in 1/8 when switched to 1/1024.
- double retval = InitialHuffmanCost();
+ float retval = InitialHuffmanCost();
// Second coefficient: Many zeros in the histogram are covered efficiently
// by a run-length encode. Originally 2/8.
- retval += stats->counts[0] * 1.5625 + 0.234375 * stats->streaks[0][1];
+ retval += stats->counts[0] * 1.5625f + 0.234375f * stats->streaks[0][1];
// Second coefficient: Constant values are encoded less efficiently, but still
// RLE'ed. Originally 6/8.
- retval += stats->counts[1] * 2.578125 + 0.703125 * stats->streaks[1][1];
+ retval += stats->counts[1] * 2.578125f + 0.703125f * stats->streaks[1][1];
// 0s are usually encoded more efficiently than non-0s.
// Originally 15/8.
- retval += 1.796875 * stats->streaks[0][0];
+ retval += 1.796875f * stats->streaks[0][0];
// Originally 26/8.
- retval += 3.28125 * stats->streaks[1][0];
+ retval += 3.28125f * stats->streaks[1][0];
return retval;
}
// Get the symbol entropy for the distribution 'population'.
// Set 'trivial_sym', if there's only one symbol present in the distribution.
-static double PopulationCost(const uint32_t* const population, int length,
- uint32_t* const trivial_sym,
- uint8_t* const is_used) {
+static float PopulationCost(const uint32_t* const population, int length,
+ uint32_t* const trivial_sym,
+ uint8_t* const is_used) {
VP8LBitEntropy bit_entropy;
VP8LStreaks stats;
VP8LGetEntropyUnrefined(population, length, &bit_entropy, &stats);
@@ -313,11 +316,10 @@ static double PopulationCost(const uint32_t* const population, int length,
// trivial_at_end is 1 if the two histograms only have one element that is
// non-zero: both the zero-th one, or both the last one.
-static WEBP_INLINE double GetCombinedEntropy(const uint32_t* const X,
- const uint32_t* const Y,
- int length, int is_X_used,
- int is_Y_used,
- int trivial_at_end) {
+static WEBP_INLINE float GetCombinedEntropy(const uint32_t* const X,
+ const uint32_t* const Y, int length,
+ int is_X_used, int is_Y_used,
+ int trivial_at_end) {
VP8LStreaks stats;
if (trivial_at_end) {
// This configuration is due to palettization that transforms an indexed
@@ -355,7 +357,7 @@ static WEBP_INLINE double GetCombinedEntropy(const uint32_t* const X,
}
// Estimates the Entropy + Huffman + other block overhead size cost.
-double VP8LHistogramEstimateBits(VP8LHistogram* const p) {
+float VP8LHistogramEstimateBits(VP8LHistogram* const p) {
return
PopulationCost(p->literal_, VP8LHistogramNumCodes(p->palette_code_bits_),
NULL, &p->is_used_[0])
@@ -372,8 +374,7 @@ double VP8LHistogramEstimateBits(VP8LHistogram* const p) {
static int GetCombinedHistogramEntropy(const VP8LHistogram* const a,
const VP8LHistogram* const b,
- double cost_threshold,
- double* cost) {
+ float cost_threshold, float* cost) {
const int palette_code_bits = a->palette_code_bits_;
int trivial_at_end = 0;
assert(a->palette_code_bits_ == b->palette_code_bits_);
@@ -438,12 +439,11 @@ static WEBP_INLINE void HistogramAdd(const VP8LHistogram* const a,
// Since the previous score passed is 'cost_threshold', we only need to compare
// the partial cost against 'cost_threshold + C(a) + C(b)' to possibly bail-out
// early.
-static double HistogramAddEval(const VP8LHistogram* const a,
- const VP8LHistogram* const b,
- VP8LHistogram* const out,
- double cost_threshold) {
- double cost = 0;
- const double sum_cost = a->bit_cost_ + b->bit_cost_;
+static float HistogramAddEval(const VP8LHistogram* const a,
+ const VP8LHistogram* const b,
+ VP8LHistogram* const out, float cost_threshold) {
+ float cost = 0;
+ const float sum_cost = a->bit_cost_ + b->bit_cost_;
cost_threshold += sum_cost;
if (GetCombinedHistogramEntropy(a, b, cost_threshold, &cost)) {
@@ -458,10 +458,10 @@ static double HistogramAddEval(const VP8LHistogram* const a,
// Same as HistogramAddEval(), except that the resulting histogram
// is not stored. Only the cost C(a+b) - C(a) is evaluated. We omit
// the term C(b) which is constant over all the evaluations.
-static double HistogramAddThresh(const VP8LHistogram* const a,
- const VP8LHistogram* const b,
- double cost_threshold) {
- double cost;
+static float HistogramAddThresh(const VP8LHistogram* const a,
+ const VP8LHistogram* const b,
+ float cost_threshold) {
+ float cost;
assert(a != NULL && b != NULL);
cost = -a->bit_cost_;
GetCombinedHistogramEntropy(a, b, cost_threshold, &cost);
@@ -472,24 +472,22 @@ static double HistogramAddThresh(const VP8LHistogram* const a,
// The structure to keep track of cost range for the three dominant entropy
// symbols.
-// TODO(skal): Evaluate if float can be used here instead of double for
-// representing the entropy costs.
typedef struct {
- double literal_max_;
- double literal_min_;
- double red_max_;
- double red_min_;
- double blue_max_;
- double blue_min_;
+ float literal_max_;
+ float literal_min_;
+ float red_max_;
+ float red_min_;
+ float blue_max_;
+ float blue_min_;
} DominantCostRange;
static void DominantCostRangeInit(DominantCostRange* const c) {
c->literal_max_ = 0.;
- c->literal_min_ = MAX_COST;
+ c->literal_min_ = MAX_BIT_COST;
c->red_max_ = 0.;
- c->red_min_ = MAX_COST;
+ c->red_min_ = MAX_BIT_COST;
c->blue_max_ = 0.;
- c->blue_min_ = MAX_COST;
+ c->blue_min_ = MAX_BIT_COST;
}
static void UpdateDominantCostRange(
@@ -504,10 +502,9 @@ static void UpdateDominantCostRange(
static void UpdateHistogramCost(VP8LHistogram* const h) {
uint32_t alpha_sym, red_sym, blue_sym;
- const double alpha_cost =
- PopulationCost(h->alpha_, NUM_LITERAL_CODES, &alpha_sym,
- &h->is_used_[3]);
- const double distance_cost =
+ const float alpha_cost =
+ PopulationCost(h->alpha_, NUM_LITERAL_CODES, &alpha_sym, &h->is_used_[3]);
+ const float distance_cost =
PopulationCost(h->distance_, NUM_DISTANCE_CODES, NULL, &h->is_used_[4]) +
VP8LExtraCost(h->distance_, NUM_DISTANCE_CODES);
const int num_codes = VP8LHistogramNumCodes(h->palette_code_bits_);
@@ -528,10 +525,10 @@ static void UpdateHistogramCost(VP8LHistogram* const h) {
}
}
-static int GetBinIdForEntropy(double min, double max, double val) {
- const double range = max - min;
+static int GetBinIdForEntropy(float min, float max, float val) {
+ const float range = max - min;
if (range > 0.) {
- const double delta = val - min;
+ const float delta = val - min;
return (int)((NUM_PARTITIONS - 1e-6) * delta / range);
} else {
return 0;
@@ -640,15 +637,11 @@ static void HistogramAnalyzeEntropyBin(VP8LHistogramSet* const image_histo,
// Merges some histograms with same bin_id together if it's advantageous.
// Sets the remaining histograms to NULL.
-static void HistogramCombineEntropyBin(VP8LHistogramSet* const image_histo,
- int *num_used,
- const uint16_t* const clusters,
- uint16_t* const cluster_mappings,
- VP8LHistogram* cur_combo,
- const uint16_t* const bin_map,
- int num_bins,
- double combine_cost_factor,
- int low_effort) {
+static void HistogramCombineEntropyBin(
+ VP8LHistogramSet* const image_histo, int* num_used,
+ const uint16_t* const clusters, uint16_t* const cluster_mappings,
+ VP8LHistogram* cur_combo, const uint16_t* const bin_map, int num_bins,
+ float combine_cost_factor, int low_effort) {
VP8LHistogram** const histograms = image_histo->histograms;
int idx;
struct {
@@ -678,11 +671,10 @@ static void HistogramCombineEntropyBin(VP8LHistogramSet* const image_histo,
cluster_mappings[clusters[idx]] = clusters[first];
} else {
// try to merge #idx into #first (both share the same bin_id)
- const double bit_cost = histograms[idx]->bit_cost_;
- const double bit_cost_thresh = -bit_cost * combine_cost_factor;
- const double curr_cost_diff =
- HistogramAddEval(histograms[first], histograms[idx],
- cur_combo, bit_cost_thresh);
+ const float bit_cost = histograms[idx]->bit_cost_;
+ const float bit_cost_thresh = -bit_cost * combine_cost_factor;
+ const float curr_cost_diff = HistogramAddEval(
+ histograms[first], histograms[idx], cur_combo, bit_cost_thresh);
if (curr_cost_diff < bit_cost_thresh) {
// Try to merge two histograms only if the combo is a trivial one or
// the two candidate histograms are already non-trivial.
@@ -730,8 +722,8 @@ static uint32_t MyRand(uint32_t* const seed) {
typedef struct {
int idx1;
int idx2;
- double cost_diff;
- double cost_combo;
+ float cost_diff;
+ float cost_combo;
} HistogramPair;
typedef struct {
@@ -786,10 +778,9 @@ static void HistoQueueUpdateHead(HistoQueue* const histo_queue,
// Update the cost diff and combo of a pair of histograms. This needs to be
// called when the the histograms have been merged with a third one.
static void HistoQueueUpdatePair(const VP8LHistogram* const h1,
- const VP8LHistogram* const h2,
- double threshold,
+ const VP8LHistogram* const h2, float threshold,
HistogramPair* const pair) {
- const double sum_cost = h1->bit_cost_ + h2->bit_cost_;
+ const float sum_cost = h1->bit_cost_ + h2->bit_cost_;
pair->cost_combo = 0.;
GetCombinedHistogramEntropy(h1, h2, sum_cost + threshold, &pair->cost_combo);
pair->cost_diff = pair->cost_combo - sum_cost;
@@ -798,9 +789,9 @@ static void HistoQueueUpdatePair(const VP8LHistogram* const h1,
// Create a pair from indices "idx1" and "idx2" provided its cost
// is inferior to "threshold", a negative entropy.
// It returns the cost of the pair, or 0. if it superior to threshold.
-static double HistoQueuePush(HistoQueue* const histo_queue,
- VP8LHistogram** const histograms, int idx1,
- int idx2, double threshold) {
+static float HistoQueuePush(HistoQueue* const histo_queue,
+ VP8LHistogram** const histograms, int idx1,
+ int idx2, float threshold) {
const VP8LHistogram* h1;
const VP8LHistogram* h2;
HistogramPair pair;
@@ -944,8 +935,8 @@ static int HistogramCombineStochastic(VP8LHistogramSet* const image_histo,
++tries_with_no_success < num_tries_no_success;
++iter) {
int* mapping_index;
- double best_cost =
- (histo_queue.size == 0) ? 0. : histo_queue.queue[0].cost_diff;
+ float best_cost =
+ (histo_queue.size == 0) ? 0.f : histo_queue.queue[0].cost_diff;
int best_idx1 = -1, best_idx2 = 1;
const uint32_t rand_range = (*num_used - 1) * (*num_used);
// (*num_used) / 2 was chosen empirically. Less means faster but worse
@@ -954,7 +945,7 @@ static int HistogramCombineStochastic(VP8LHistogramSet* const image_histo,
// Pick random samples.
for (j = 0; *num_used >= 2 && j < num_tries; ++j) {
- double curr_cost;
+ float curr_cost;
// Choose two different histograms at random and try to combine them.
const uint32_t tmp = MyRand(&seed) % rand_range;
uint32_t idx1 = tmp / (*num_used - 1);
@@ -1033,7 +1024,7 @@ static int HistogramCombineStochastic(VP8LHistogramSet* const image_histo,
*do_greedy = (*num_used <= min_cluster_size);
ok = 1;
-End:
+ End:
HistoQueueClear(&histo_queue);
WebPSafeFree(mappings);
return ok;
@@ -1056,7 +1047,7 @@ static void HistogramRemap(const VP8LHistogramSet* const in,
if (out_size > 1) {
for (i = 0; i < in_size; ++i) {
int best_out = 0;
- double best_bits = MAX_COST;
+ float best_bits = MAX_BIT_COST;
int k;
if (in_histo[i] == NULL) {
// Arbitrarily set to the previous value if unused to help future LZ77.
@@ -1064,7 +1055,7 @@ static void HistogramRemap(const VP8LHistogramSet* const in,
continue;
}
for (k = 0; k < out_size; ++k) {
- double cur_bits;
+ float cur_bits;
cur_bits = HistogramAddThresh(out_histo[k], in_histo[i], best_bits);
if (k == 0 || cur_bits < best_bits) {
best_bits = cur_bits;
@@ -1092,13 +1083,13 @@ static void HistogramRemap(const VP8LHistogramSet* const in,
}
}
-static double GetCombineCostFactor(int histo_size, int quality) {
- double combine_cost_factor = 0.16;
+static float GetCombineCostFactor(int histo_size, int quality) {
+ float combine_cost_factor = 0.16f;
if (quality < 90) {
- if (histo_size > 256) combine_cost_factor /= 2.;
- if (histo_size > 512) combine_cost_factor /= 2.;
- if (histo_size > 1024) combine_cost_factor /= 2.;
- if (quality <= 50) combine_cost_factor /= 2.;
+ if (histo_size > 256) combine_cost_factor /= 2.f;
+ if (histo_size > 512) combine_cost_factor /= 2.f;
+ if (histo_size > 1024) combine_cost_factor /= 2.f;
+ if (quality <= 50) combine_cost_factor /= 2.f;
}
return combine_cost_factor;
}
@@ -1168,15 +1159,17 @@ static void RemoveEmptyHistograms(VP8LHistogramSet* const image_histo) {
}
int VP8LGetHistoImageSymbols(int xsize, int ysize,
- const VP8LBackwardRefs* const refs,
- int quality, int low_effort,
- int histo_bits, int cache_bits,
+ const VP8LBackwardRefs* const refs, int quality,
+ int low_effort, int histogram_bits, int cache_bits,
VP8LHistogramSet* const image_histo,
VP8LHistogram* const tmp_histo,
- uint16_t* const histogram_symbols) {
- int ok = 0;
- const int histo_xsize = histo_bits ? VP8LSubSampleSize(xsize, histo_bits) : 1;
- const int histo_ysize = histo_bits ? VP8LSubSampleSize(ysize, histo_bits) : 1;
+ uint16_t* const histogram_symbols,
+ const WebPPicture* const pic, int percent_range,
+ int* const percent) {
+ const int histo_xsize =
+ histogram_bits ? VP8LSubSampleSize(xsize, histogram_bits) : 1;
+ const int histo_ysize =
+ histogram_bits ? VP8LSubSampleSize(ysize, histogram_bits) : 1;
const int image_histo_raw_size = histo_xsize * histo_ysize;
VP8LHistogramSet* const orig_histo =
VP8LAllocateHistogramSet(image_histo_raw_size, cache_bits);
@@ -1189,10 +1182,13 @@ int VP8LGetHistoImageSymbols(int xsize, int ysize,
WebPSafeMalloc(2 * image_histo_raw_size, sizeof(map_tmp));
uint16_t* const cluster_mappings = map_tmp + image_histo_raw_size;
int num_used = image_histo_raw_size;
- if (orig_histo == NULL || map_tmp == NULL) goto Error;
+ if (orig_histo == NULL || map_tmp == NULL) {
+ WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+ goto Error;
+ }
// Construct the histograms from backward references.
- HistogramBuild(xsize, histo_bits, refs, orig_histo);
+ HistogramBuild(xsize, histogram_bits, refs, orig_histo);
// Copies the histograms and computes its bit_cost.
// histogram_symbols is optimized
HistogramCopyAndAnalyze(orig_histo, image_histo, &num_used,
@@ -1203,16 +1199,15 @@ int VP8LGetHistoImageSymbols(int xsize, int ysize,
if (entropy_combine) {
uint16_t* const bin_map = map_tmp;
- const double combine_cost_factor =
+ const float combine_cost_factor =
GetCombineCostFactor(image_histo_raw_size, quality);
const uint32_t num_clusters = num_used;
HistogramAnalyzeEntropyBin(image_histo, bin_map, low_effort);
// Collapse histograms with similar entropy.
- HistogramCombineEntropyBin(image_histo, &num_used, histogram_symbols,
- cluster_mappings, tmp_histo, bin_map,
- entropy_combine_num_bins, combine_cost_factor,
- low_effort);
+ HistogramCombineEntropyBin(
+ image_histo, &num_used, histogram_symbols, cluster_mappings, tmp_histo,
+ bin_map, entropy_combine_num_bins, combine_cost_factor, low_effort);
OptimizeHistogramSymbols(image_histo, cluster_mappings, num_clusters,
map_tmp, histogram_symbols);
}
@@ -1226,11 +1221,13 @@ int VP8LGetHistoImageSymbols(int xsize, int ysize,
int do_greedy;
if (!HistogramCombineStochastic(image_histo, &num_used, threshold_size,
&do_greedy)) {
+ WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
goto Error;
}
if (do_greedy) {
RemoveEmptyHistograms(image_histo);
if (!HistogramCombineGreedy(image_histo, &num_used)) {
+ WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
goto Error;
}
}
@@ -1240,10 +1237,12 @@ int VP8LGetHistoImageSymbols(int xsize, int ysize,
RemoveEmptyHistograms(image_histo);
HistogramRemap(orig_histo, image_histo, histogram_symbols);
- ok = 1;
+ if (!WebPReportProgress(pic, *percent + percent_range, percent)) {
+ goto Error;
+ }
Error:
VP8LFreeHistogramSet(orig_histo);
WebPSafeFree(map_tmp);
- return ok;
+ return (pic->error_code == VP8_ENC_OK);
}
diff --git a/src/3rdparty/libwebp/src/enc/histogram_enc.h b/src/3rdparty/libwebp/src/enc/histogram_enc.h
index 54c2d21..4c0bb97 100644
--- a/src/3rdparty/libwebp/src/enc/histogram_enc.h
+++ b/src/3rdparty/libwebp/src/enc/histogram_enc.h
@@ -40,10 +40,10 @@ typedef struct {
int palette_code_bits_;
uint32_t trivial_symbol_; // True, if histograms for Red, Blue & Alpha
// literal symbols are single valued.
- double bit_cost_; // cached value of bit cost.
- double literal_cost_; // Cached values of dominant entropy costs:
- double red_cost_; // literal, red & blue.
- double blue_cost_;
+ float bit_cost_; // cached value of bit cost.
+ float literal_cost_; // Cached values of dominant entropy costs:
+ float red_cost_; // literal, red & blue.
+ float blue_cost_;
uint8_t is_used_[5]; // 5 for literal, red, blue, alpha, distance
} VP8LHistogram;
@@ -64,8 +64,8 @@ void VP8LHistogramCreate(VP8LHistogram* const p,
const VP8LBackwardRefs* const refs,
int palette_code_bits);
-// Return the size of the histogram for a given palette_code_bits.
-int VP8LGetHistogramSize(int palette_code_bits);
+// Return the size of the histogram for a given cache_bits.
+int VP8LGetHistogramSize(int cache_bits);
// Set the palette_code_bits and reset the stats.
// If init_arrays is true, the arrays are also filled with 0's.
@@ -105,21 +105,23 @@ static WEBP_INLINE int VP8LHistogramNumCodes(int palette_code_bits) {
((palette_code_bits > 0) ? (1 << palette_code_bits) : 0);
}
-// Builds the histogram image.
+// Builds the histogram image. pic and percent are for progress.
+// Returns false in case of error (stored in pic->error_code).
int VP8LGetHistoImageSymbols(int xsize, int ysize,
- const VP8LBackwardRefs* const refs,
- int quality, int low_effort,
- int histogram_bits, int cache_bits,
- VP8LHistogramSet* const image_in,
+ const VP8LBackwardRefs* const refs, int quality,
+ int low_effort, int histogram_bits, int cache_bits,
+ VP8LHistogramSet* const image_histo,
VP8LHistogram* const tmp_histo,
- uint16_t* const histogram_symbols);
+ uint16_t* const histogram_symbols,
+ const WebPPicture* const pic, int percent_range,
+ int* const percent);
// Returns the entropy for the symbols in the input array.
-double VP8LBitsEntropy(const uint32_t* const array, int n);
+float VP8LBitsEntropy(const uint32_t* const array, int n);
// Estimate how many bits the combined entropy of literals and distance
// approximately maps to.
-double VP8LHistogramEstimateBits(VP8LHistogram* const p);
+float VP8LHistogramEstimateBits(VP8LHistogram* const p);
#ifdef __cplusplus
}
diff --git a/src/3rdparty/libwebp/src/enc/picture_csp_enc.c b/src/3rdparty/libwebp/src/enc/picture_csp_enc.c
index 02d9df7..78c8ca4 100644
--- a/src/3rdparty/libwebp/src/enc/picture_csp_enc.c
+++ b/src/3rdparty/libwebp/src/enc/picture_csp_enc.c
@@ -15,12 +15,19 @@
#include <stdlib.h>
#include <math.h>
+#include "sharpyuv/sharpyuv.h"
+#include "sharpyuv/sharpyuv_csp.h"
#include "src/enc/vp8i_enc.h"
#include "src/utils/random_utils.h"
#include "src/utils/utils.h"
#include "src/dsp/dsp.h"
#include "src/dsp/lossless.h"
#include "src/dsp/yuv.h"
+#include "src/dsp/cpu.h"
+
+#if defined(WEBP_USE_THREAD) && !defined(_WIN32)
+#include <pthread.h>
+#endif
// Uncomment to disable gamma-compression during RGB->U/V averaging
#define USE_GAMMA_COMPRESSION
@@ -29,11 +36,15 @@
#define USE_INVERSE_ALPHA_TABLE
#ifdef WORDS_BIGENDIAN
-#define ALPHA_OFFSET 0 // uint32_t 0xff000000 is 0xff,00,00,00 in memory
+// uint32_t 0xff000000 is 0xff,00,00,00 in memory
+#define CHANNEL_OFFSET(i) (i)
#else
-#define ALPHA_OFFSET 3 // uint32_t 0xff000000 is 0x00,00,00,ff in memory
+// uint32_t 0xff000000 is 0x00,00,00,ff in memory
+#define CHANNEL_OFFSET(i) (3-(i))
#endif
+#define ALPHA_OFFSET CHANNEL_OFFSET(0)
+
//------------------------------------------------------------------------------
// Detection of non-trivial transparency
@@ -57,16 +68,16 @@ static int CheckNonOpaque(const uint8_t* alpha, int width, int height,
// Checking for the presence of non-opaque alpha.
int WebPPictureHasTransparency(const WebPPicture* picture) {
if (picture == NULL) return 0;
- if (!picture->use_argb) {
- return CheckNonOpaque(picture->a, picture->width, picture->height,
- 1, picture->a_stride);
- } else {
- const int alpha_offset = ALPHA_OFFSET;
- return CheckNonOpaque((const uint8_t*)picture->argb + alpha_offset,
- picture->width, picture->height,
- 4, picture->argb_stride * sizeof(*picture->argb));
+ if (picture->use_argb) {
+ if (picture->argb != NULL) {
+ return CheckNonOpaque((const uint8_t*)picture->argb + ALPHA_OFFSET,
+ picture->width, picture->height,
+ 4, picture->argb_stride * sizeof(*picture->argb));
+ }
+ return 0;
}
- return 0;
+ return CheckNonOpaque(picture->a, picture->width, picture->height,
+ 1, picture->a_stride);
}
//------------------------------------------------------------------------------
@@ -74,29 +85,30 @@ int WebPPictureHasTransparency(const WebPPicture* picture) {
#if defined(USE_GAMMA_COMPRESSION)
-// gamma-compensates loss of resolution during chroma subsampling
-#define kGamma 0.80 // for now we use a different gamma value than kGammaF
-#define kGammaFix 12 // fixed-point precision for linear values
-#define kGammaScale ((1 << kGammaFix) - 1)
-#define kGammaTabFix 7 // fixed-point fractional bits precision
-#define kGammaTabScale (1 << kGammaTabFix)
-#define kGammaTabRounder (kGammaTabScale >> 1)
-#define kGammaTabSize (1 << (kGammaFix - kGammaTabFix))
+// Gamma correction compensates loss of resolution during chroma subsampling.
+#define GAMMA_FIX 12 // fixed-point precision for linear values
+#define GAMMA_TAB_FIX 7 // fixed-point fractional bits precision
+#define GAMMA_TAB_SIZE (1 << (GAMMA_FIX - GAMMA_TAB_FIX))
+static const double kGamma = 0.80;
+static const int kGammaScale = ((1 << GAMMA_FIX) - 1);
+static const int kGammaTabScale = (1 << GAMMA_TAB_FIX);
+static const int kGammaTabRounder = (1 << GAMMA_TAB_FIX >> 1);
-static int kLinearToGammaTab[kGammaTabSize + 1];
+static int kLinearToGammaTab[GAMMA_TAB_SIZE + 1];
static uint16_t kGammaToLinearTab[256];
static volatile int kGammaTablesOk = 0;
+static void InitGammaTables(void);
-static WEBP_TSAN_IGNORE_FUNCTION void InitGammaTables(void) {
+WEBP_DSP_INIT_FUNC(InitGammaTables) {
if (!kGammaTablesOk) {
int v;
- const double scale = (double)(1 << kGammaTabFix) / kGammaScale;
+ const double scale = (double)(1 << GAMMA_TAB_FIX) / kGammaScale;
const double norm = 1. / 255.;
for (v = 0; v <= 255; ++v) {
kGammaToLinearTab[v] =
(uint16_t)(pow(norm * v, kGamma) * kGammaScale + .5);
}
- for (v = 0; v <= kGammaTabSize; ++v) {
+ for (v = 0; v <= GAMMA_TAB_SIZE; ++v) {
kLinearToGammaTab[v] = (int)(255. * pow(scale * v, 1. / kGamma) + .5);
}
kGammaTablesOk = 1;
@@ -108,12 +120,12 @@ static WEBP_INLINE uint32_t GammaToLinear(uint8_t v) {
}
static WEBP_INLINE int Interpolate(int v) {
- const int tab_pos = v >> (kGammaTabFix + 2); // integer part
+ const int tab_pos = v >> (GAMMA_TAB_FIX + 2); // integer part
const int x = v & ((kGammaTabScale << 2) - 1); // fractional part
const int v0 = kLinearToGammaTab[tab_pos];
const int v1 = kLinearToGammaTab[tab_pos + 1];
const int y = v1 * x + v0 * ((kGammaTabScale << 2) - x); // interpolate
- assert(tab_pos + 1 < kGammaTabSize + 1);
+ assert(tab_pos + 1 < GAMMA_TAB_SIZE + 1);
return y;
}
@@ -121,7 +133,7 @@ static WEBP_INLINE int Interpolate(int v) {
// U/V value, suitable for RGBToU/V calls.
static WEBP_INLINE int LinearToGamma(uint32_t base_value, int shift) {
const int y = Interpolate(base_value << shift); // final uplifted value
- return (y + kGammaTabRounder) >> kGammaTabFix; // descale
+ return (y + kGammaTabRounder) >> GAMMA_TAB_FIX; // descale
}
#else
@@ -155,414 +167,26 @@ static int RGBToV(int r, int g, int b, VP8Random* const rg) {
//------------------------------------------------------------------------------
// Sharp RGB->YUV conversion
-static const int kNumIterations = 4;
static const int kMinDimensionIterativeConversion = 4;
-// We could use SFIX=0 and only uint8_t for fixed_y_t, but it produces some
-// banding sometimes. Better use extra precision.
-#define SFIX 2 // fixed-point precision of RGB and Y/W
-typedef int16_t fixed_t; // signed type with extra SFIX precision for UV
-typedef uint16_t fixed_y_t; // unsigned type with extra SFIX precision for W
-
-#define SHALF (1 << SFIX >> 1)
-#define MAX_Y_T ((256 << SFIX) - 1)
-#define SROUNDER (1 << (YUV_FIX + SFIX - 1))
-
-#if defined(USE_GAMMA_COMPRESSION)
-
-// We use tables of different size and precision for the Rec709 / BT2020
-// transfer function.
-#define kGammaF (1./0.45)
-static uint32_t kLinearToGammaTabS[kGammaTabSize + 2];
-#define GAMMA_TO_LINEAR_BITS 14
-static uint32_t kGammaToLinearTabS[MAX_Y_T + 1]; // size scales with Y_FIX
-static volatile int kGammaTablesSOk = 0;
-
-static WEBP_TSAN_IGNORE_FUNCTION void InitGammaTablesS(void) {
- assert(2 * GAMMA_TO_LINEAR_BITS < 32); // we use uint32_t intermediate values
- if (!kGammaTablesSOk) {
- int v;
- const double norm = 1. / MAX_Y_T;
- const double scale = 1. / kGammaTabSize;
- const double a = 0.09929682680944;
- const double thresh = 0.018053968510807;
- const double final_scale = 1 << GAMMA_TO_LINEAR_BITS;
- for (v = 0; v <= MAX_Y_T; ++v) {
- const double g = norm * v;
- double value;
- if (g <= thresh * 4.5) {
- value = g / 4.5;
- } else {
- const double a_rec = 1. / (1. + a);
- value = pow(a_rec * (g + a), kGammaF);
- }
- kGammaToLinearTabS[v] = (uint32_t)(value * final_scale + .5);
- }
- for (v = 0; v <= kGammaTabSize; ++v) {
- const double g = scale * v;
- double value;
- if (g <= thresh) {
- value = 4.5 * g;
- } else {
- value = (1. + a) * pow(g, 1. / kGammaF) - a;
- }
- // we already incorporate the 1/2 rounding constant here
- kLinearToGammaTabS[v] =
- (uint32_t)(MAX_Y_T * value) + (1 << GAMMA_TO_LINEAR_BITS >> 1);
- }
- // to prevent small rounding errors to cause read-overflow:
- kLinearToGammaTabS[kGammaTabSize + 1] = kLinearToGammaTabS[kGammaTabSize];
- kGammaTablesSOk = 1;
- }
-}
-
-// return value has a fixed-point precision of GAMMA_TO_LINEAR_BITS
-static WEBP_INLINE uint32_t GammaToLinearS(int v) {
- return kGammaToLinearTabS[v];
-}
-
-static WEBP_INLINE uint32_t LinearToGammaS(uint32_t value) {
- // 'value' is in GAMMA_TO_LINEAR_BITS fractional precision
- const uint32_t v = value * kGammaTabSize;
- const uint32_t tab_pos = v >> GAMMA_TO_LINEAR_BITS;
- // fractional part, in GAMMA_TO_LINEAR_BITS fixed-point precision
- const uint32_t x = v - (tab_pos << GAMMA_TO_LINEAR_BITS); // fractional part
- // v0 / v1 are in GAMMA_TO_LINEAR_BITS fixed-point precision (range [0..1])
- const uint32_t v0 = kLinearToGammaTabS[tab_pos + 0];
- const uint32_t v1 = kLinearToGammaTabS[tab_pos + 1];
- // Final interpolation. Note that rounding is already included.
- const uint32_t v2 = (v1 - v0) * x; // note: v1 >= v0.
- const uint32_t result = v0 + (v2 >> GAMMA_TO_LINEAR_BITS);
- return result;
-}
-
-#else
-
-static void InitGammaTablesS(void) {}
-static WEBP_INLINE uint32_t GammaToLinearS(int v) {
- return (v << GAMMA_TO_LINEAR_BITS) / MAX_Y_T;
-}
-static WEBP_INLINE uint32_t LinearToGammaS(uint32_t value) {
- return (MAX_Y_T * value) >> GAMMA_TO_LINEAR_BITS;
-}
-
-#endif // USE_GAMMA_COMPRESSION
-
-//------------------------------------------------------------------------------
-
-static uint8_t clip_8b(fixed_t v) {
- return (!(v & ~0xff)) ? (uint8_t)v : (v < 0) ? 0u : 255u;
-}
-
-static fixed_y_t clip_y(int y) {
- return (!(y & ~MAX_Y_T)) ? (fixed_y_t)y : (y < 0) ? 0 : MAX_Y_T;
-}
-
-//------------------------------------------------------------------------------
-
-static int RGBToGray(int r, int g, int b) {
- const int luma = 13933 * r + 46871 * g + 4732 * b + YUV_HALF;
- return (luma >> YUV_FIX);
-}
-
-static uint32_t ScaleDown(int a, int b, int c, int d) {
- const uint32_t A = GammaToLinearS(a);
- const uint32_t B = GammaToLinearS(b);
- const uint32_t C = GammaToLinearS(c);
- const uint32_t D = GammaToLinearS(d);
- return LinearToGammaS((A + B + C + D + 2) >> 2);
-}
-
-static WEBP_INLINE void UpdateW(const fixed_y_t* src, fixed_y_t* dst, int w) {
- int i;
- for (i = 0; i < w; ++i) {
- const uint32_t R = GammaToLinearS(src[0 * w + i]);
- const uint32_t G = GammaToLinearS(src[1 * w + i]);
- const uint32_t B = GammaToLinearS(src[2 * w + i]);
- const uint32_t Y = RGBToGray(R, G, B);
- dst[i] = (fixed_y_t)LinearToGammaS(Y);
- }
-}
-
-static void UpdateChroma(const fixed_y_t* src1, const fixed_y_t* src2,
- fixed_t* dst, int uv_w) {
- int i;
- for (i = 0; i < uv_w; ++i) {
- const int r = ScaleDown(src1[0 * uv_w + 0], src1[0 * uv_w + 1],
- src2[0 * uv_w + 0], src2[0 * uv_w + 1]);
- const int g = ScaleDown(src1[2 * uv_w + 0], src1[2 * uv_w + 1],
- src2[2 * uv_w + 0], src2[2 * uv_w + 1]);
- const int b = ScaleDown(src1[4 * uv_w + 0], src1[4 * uv_w + 1],
- src2[4 * uv_w + 0], src2[4 * uv_w + 1]);
- const int W = RGBToGray(r, g, b);
- dst[0 * uv_w] = (fixed_t)(r - W);
- dst[1 * uv_w] = (fixed_t)(g - W);
- dst[2 * uv_w] = (fixed_t)(b - W);
- dst += 1;
- src1 += 2;
- src2 += 2;
- }
-}
-
-static void StoreGray(const fixed_y_t* rgb, fixed_y_t* y, int w) {
- int i;
- for (i = 0; i < w; ++i) {
- y[i] = RGBToGray(rgb[0 * w + i], rgb[1 * w + i], rgb[2 * w + i]);
- }
-}
-
-//------------------------------------------------------------------------------
-
-static WEBP_INLINE fixed_y_t Filter2(int A, int B, int W0) {
- const int v0 = (A * 3 + B + 2) >> 2;
- return clip_y(v0 + W0);
-}
-
-//------------------------------------------------------------------------------
-
-static WEBP_INLINE fixed_y_t UpLift(uint8_t a) { // 8bit -> SFIX
- return ((fixed_y_t)a << SFIX) | SHALF;
-}
-
-static void ImportOneRow(const uint8_t* const r_ptr,
- const uint8_t* const g_ptr,
- const uint8_t* const b_ptr,
- int step,
- int pic_width,
- fixed_y_t* const dst) {
- int i;
- const int w = (pic_width + 1) & ~1;
- for (i = 0; i < pic_width; ++i) {
- const int off = i * step;
- dst[i + 0 * w] = UpLift(r_ptr[off]);
- dst[i + 1 * w] = UpLift(g_ptr[off]);
- dst[i + 2 * w] = UpLift(b_ptr[off]);
- }
- if (pic_width & 1) { // replicate rightmost pixel
- dst[pic_width + 0 * w] = dst[pic_width + 0 * w - 1];
- dst[pic_width + 1 * w] = dst[pic_width + 1 * w - 1];
- dst[pic_width + 2 * w] = dst[pic_width + 2 * w - 1];
- }
-}
-
-static void InterpolateTwoRows(const fixed_y_t* const best_y,
- const fixed_t* prev_uv,
- const fixed_t* cur_uv,
- const fixed_t* next_uv,
- int w,
- fixed_y_t* out1,
- fixed_y_t* out2) {
- const int uv_w = w >> 1;
- const int len = (w - 1) >> 1; // length to filter
- int k = 3;
- while (k-- > 0) { // process each R/G/B segments in turn
- // special boundary case for i==0
- out1[0] = Filter2(cur_uv[0], prev_uv[0], best_y[0]);
- out2[0] = Filter2(cur_uv[0], next_uv[0], best_y[w]);
-
- WebPSharpYUVFilterRow(cur_uv, prev_uv, len, best_y + 0 + 1, out1 + 1);
- WebPSharpYUVFilterRow(cur_uv, next_uv, len, best_y + w + 1, out2 + 1);
-
- // special boundary case for i == w - 1 when w is even
- if (!(w & 1)) {
- out1[w - 1] = Filter2(cur_uv[uv_w - 1], prev_uv[uv_w - 1],
- best_y[w - 1 + 0]);
- out2[w - 1] = Filter2(cur_uv[uv_w - 1], next_uv[uv_w - 1],
- best_y[w - 1 + w]);
- }
- out1 += w;
- out2 += w;
- prev_uv += uv_w;
- cur_uv += uv_w;
- next_uv += uv_w;
- }
-}
-
-static WEBP_INLINE uint8_t ConvertRGBToY(int r, int g, int b) {
- const int luma = 16839 * r + 33059 * g + 6420 * b + SROUNDER;
- return clip_8b(16 + (luma >> (YUV_FIX + SFIX)));
-}
-
-static WEBP_INLINE uint8_t ConvertRGBToU(int r, int g, int b) {
- const int u = -9719 * r - 19081 * g + 28800 * b + SROUNDER;
- return clip_8b(128 + (u >> (YUV_FIX + SFIX)));
-}
-
-static WEBP_INLINE uint8_t ConvertRGBToV(int r, int g, int b) {
- const int v = +28800 * r - 24116 * g - 4684 * b + SROUNDER;
- return clip_8b(128 + (v >> (YUV_FIX + SFIX)));
-}
-
-static int ConvertWRGBToYUV(const fixed_y_t* best_y, const fixed_t* best_uv,
- WebPPicture* const picture) {
- int i, j;
- uint8_t* dst_y = picture->y;
- uint8_t* dst_u = picture->u;
- uint8_t* dst_v = picture->v;
- const fixed_t* const best_uv_base = best_uv;
- const int w = (picture->width + 1) & ~1;
- const int h = (picture->height + 1) & ~1;
- const int uv_w = w >> 1;
- const int uv_h = h >> 1;
- for (best_uv = best_uv_base, j = 0; j < picture->height; ++j) {
- for (i = 0; i < picture->width; ++i) {
- const int off = (i >> 1);
- const int W = best_y[i];
- const int r = best_uv[off + 0 * uv_w] + W;
- const int g = best_uv[off + 1 * uv_w] + W;
- const int b = best_uv[off + 2 * uv_w] + W;
- dst_y[i] = ConvertRGBToY(r, g, b);
- }
- best_y += w;
- best_uv += (j & 1) * 3 * uv_w;
- dst_y += picture->y_stride;
- }
- for (best_uv = best_uv_base, j = 0; j < uv_h; ++j) {
- for (i = 0; i < uv_w; ++i) {
- const int off = i;
- const int r = best_uv[off + 0 * uv_w];
- const int g = best_uv[off + 1 * uv_w];
- const int b = best_uv[off + 2 * uv_w];
- dst_u[i] = ConvertRGBToU(r, g, b);
- dst_v[i] = ConvertRGBToV(r, g, b);
- }
- best_uv += 3 * uv_w;
- dst_u += picture->uv_stride;
- dst_v += picture->uv_stride;
- }
- return 1;
-}
-
//------------------------------------------------------------------------------
// Main function
-#define SAFE_ALLOC(W, H, T) ((T*)WebPSafeMalloc((W) * (H), sizeof(T)))
-
static int PreprocessARGB(const uint8_t* r_ptr,
const uint8_t* g_ptr,
const uint8_t* b_ptr,
int step, int rgb_stride,
WebPPicture* const picture) {
- // we expand the right/bottom border if needed
- const int w = (picture->width + 1) & ~1;
- const int h = (picture->height + 1) & ~1;
- const int uv_w = w >> 1;
- const int uv_h = h >> 1;
- uint64_t prev_diff_y_sum = ~0;
- int j, iter;
-
- // TODO(skal): allocate one big memory chunk. But for now, it's easier
- // for valgrind debugging to have several chunks.
- fixed_y_t* const tmp_buffer = SAFE_ALLOC(w * 3, 2, fixed_y_t); // scratch
- fixed_y_t* const best_y_base = SAFE_ALLOC(w, h, fixed_y_t);
- fixed_y_t* const target_y_base = SAFE_ALLOC(w, h, fixed_y_t);
- fixed_y_t* const best_rgb_y = SAFE_ALLOC(w, 2, fixed_y_t);
- fixed_t* const best_uv_base = SAFE_ALLOC(uv_w * 3, uv_h, fixed_t);
- fixed_t* const target_uv_base = SAFE_ALLOC(uv_w * 3, uv_h, fixed_t);
- fixed_t* const best_rgb_uv = SAFE_ALLOC(uv_w * 3, 1, fixed_t);
- fixed_y_t* best_y = best_y_base;
- fixed_y_t* target_y = target_y_base;
- fixed_t* best_uv = best_uv_base;
- fixed_t* target_uv = target_uv_base;
- const uint64_t diff_y_threshold = (uint64_t)(3.0 * w * h);
- int ok;
-
- if (best_y_base == NULL || best_uv_base == NULL ||
- target_y_base == NULL || target_uv_base == NULL ||
- best_rgb_y == NULL || best_rgb_uv == NULL ||
- tmp_buffer == NULL) {
- ok = WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
- goto End;
- }
- assert(picture->width >= kMinDimensionIterativeConversion);
- assert(picture->height >= kMinDimensionIterativeConversion);
-
- WebPInitConvertARGBToYUV();
-
- // Import RGB samples to W/RGB representation.
- for (j = 0; j < picture->height; j += 2) {
- const int is_last_row = (j == picture->height - 1);
- fixed_y_t* const src1 = tmp_buffer + 0 * w;
- fixed_y_t* const src2 = tmp_buffer + 3 * w;
-
- // prepare two rows of input
- ImportOneRow(r_ptr, g_ptr, b_ptr, step, picture->width, src1);
- if (!is_last_row) {
- ImportOneRow(r_ptr + rgb_stride, g_ptr + rgb_stride, b_ptr + rgb_stride,
- step, picture->width, src2);
- } else {
- memcpy(src2, src1, 3 * w * sizeof(*src2));
- }
- StoreGray(src1, best_y + 0, w);
- StoreGray(src2, best_y + w, w);
-
- UpdateW(src1, target_y, w);
- UpdateW(src2, target_y + w, w);
- UpdateChroma(src1, src2, target_uv, uv_w);
- memcpy(best_uv, target_uv, 3 * uv_w * sizeof(*best_uv));
- best_y += 2 * w;
- best_uv += 3 * uv_w;
- target_y += 2 * w;
- target_uv += 3 * uv_w;
- r_ptr += 2 * rgb_stride;
- g_ptr += 2 * rgb_stride;
- b_ptr += 2 * rgb_stride;
- }
-
- // Iterate and resolve clipping conflicts.
- for (iter = 0; iter < kNumIterations; ++iter) {
- const fixed_t* cur_uv = best_uv_base;
- const fixed_t* prev_uv = best_uv_base;
- uint64_t diff_y_sum = 0;
-
- best_y = best_y_base;
- best_uv = best_uv_base;
- target_y = target_y_base;
- target_uv = target_uv_base;
- for (j = 0; j < h; j += 2) {
- fixed_y_t* const src1 = tmp_buffer + 0 * w;
- fixed_y_t* const src2 = tmp_buffer + 3 * w;
- {
- const fixed_t* const next_uv = cur_uv + ((j < h - 2) ? 3 * uv_w : 0);
- InterpolateTwoRows(best_y, prev_uv, cur_uv, next_uv, w, src1, src2);
- prev_uv = cur_uv;
- cur_uv = next_uv;
- }
-
- UpdateW(src1, best_rgb_y + 0 * w, w);
- UpdateW(src2, best_rgb_y + 1 * w, w);
- UpdateChroma(src1, src2, best_rgb_uv, uv_w);
-
- // update two rows of Y and one row of RGB
- diff_y_sum += WebPSharpYUVUpdateY(target_y, best_rgb_y, best_y, 2 * w);
- WebPSharpYUVUpdateRGB(target_uv, best_rgb_uv, best_uv, 3 * uv_w);
-
- best_y += 2 * w;
- best_uv += 3 * uv_w;
- target_y += 2 * w;
- target_uv += 3 * uv_w;
- }
- // test exit condition
- if (iter > 0) {
- if (diff_y_sum < diff_y_threshold) break;
- if (diff_y_sum > prev_diff_y_sum) break;
- }
- prev_diff_y_sum = diff_y_sum;
+ const int ok = SharpYuvConvert(
+ r_ptr, g_ptr, b_ptr, step, rgb_stride, /*rgb_bit_depth=*/8,
+ picture->y, picture->y_stride, picture->u, picture->uv_stride, picture->v,
+ picture->uv_stride, /*yuv_bit_depth=*/8, picture->width,
+ picture->height, SharpYuvGetConversionMatrix(kSharpYuvMatrixWebp));
+ if (!ok) {
+ return WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
}
- // final reconstruction
- ok = ConvertWRGBToYUV(best_y_base, best_uv_base, picture);
-
- End:
- WebPSafeFree(best_y_base);
- WebPSafeFree(best_uv_base);
- WebPSafeFree(target_y_base);
- WebPSafeFree(target_uv_base);
- WebPSafeFree(best_rgb_y);
- WebPSafeFree(best_rgb_uv);
- WebPSafeFree(tmp_buffer);
return ok;
}
-#undef SAFE_ALLOC
//------------------------------------------------------------------------------
// "Fast" regular RGB->YUV
@@ -587,8 +211,8 @@ static const int kAlphaFix = 19;
// and constant are adjusted very tightly to fit 32b arithmetic.
// In particular, they use the fact that the operands for 'v / a' are actually
// derived as v = (a0.p0 + a1.p1 + a2.p2 + a3.p3) and a = a0 + a1 + a2 + a3
-// with ai in [0..255] and pi in [0..1<<kGammaFix). The constraint to avoid
-// overflow is: kGammaFix + kAlphaFix <= 31.
+// with ai in [0..255] and pi in [0..1<<GAMMA_FIX). The constraint to avoid
+// overflow is: GAMMA_FIX + kAlphaFix <= 31.
static const uint32_t kInvAlpha[4 * 0xff + 1] = {
0, /* alpha = 0 */
524288, 262144, 174762, 131072, 104857, 87381, 74898, 65536,
@@ -814,11 +438,20 @@ static WEBP_INLINE void AccumulateRGB(const uint8_t* const r_ptr,
dst[0] = SUM4(r_ptr + j, step);
dst[1] = SUM4(g_ptr + j, step);
dst[2] = SUM4(b_ptr + j, step);
+ // MemorySanitizer may raise false positives with data that passes through
+ // RGBA32PackedToPlanar_16b_SSE41() due to incorrect modeling of shuffles.
+ // See https://crbug.com/webp/573.
+#ifdef WEBP_MSAN
+ dst[3] = 0;
+#endif
}
if (width & 1) {
dst[0] = SUM2(r_ptr + j);
dst[1] = SUM2(g_ptr + j);
dst[2] = SUM2(b_ptr + j);
+#ifdef WEBP_MSAN
+ dst[3] = 0;
+#endif
}
}
@@ -835,6 +468,8 @@ static WEBP_INLINE void ConvertRowsToUV(const uint16_t* rgb,
}
}
+extern void SharpYuvInit(VP8CPUInfo cpu_info_func);
+
static int ImportYUVAFromRGBA(const uint8_t* r_ptr,
const uint8_t* g_ptr,
const uint8_t* b_ptr,
@@ -859,18 +494,18 @@ static int ImportYUVAFromRGBA(const uint8_t* r_ptr,
use_iterative_conversion = 0;
}
- if (!WebPPictureAllocYUVA(picture, width, height)) {
+ if (!WebPPictureAllocYUVA(picture)) {
return 0;
}
if (has_alpha) {
assert(step == 4);
#if defined(USE_GAMMA_COMPRESSION) && defined(USE_INVERSE_ALPHA_TABLE)
- assert(kAlphaFix + kGammaFix <= 31);
+ assert(kAlphaFix + GAMMA_FIX <= 31);
#endif
}
if (use_iterative_conversion) {
- InitGammaTablesS();
+ SharpYuvInit(VP8GetCPUInfo);
if (!PreprocessARGB(r_ptr, g_ptr, b_ptr, step, rgb_stride, picture)) {
return 0;
}
@@ -997,10 +632,10 @@ static int PictureARGBToYUVA(WebPPicture* picture, WebPEncCSP colorspace,
return WebPEncodingSetError(picture, VP8_ENC_ERROR_INVALID_CONFIGURATION);
} else {
const uint8_t* const argb = (const uint8_t*)picture->argb;
- const uint8_t* const a = argb + (0 ^ ALPHA_OFFSET);
- const uint8_t* const r = argb + (1 ^ ALPHA_OFFSET);
- const uint8_t* const g = argb + (2 ^ ALPHA_OFFSET);
- const uint8_t* const b = argb + (3 ^ ALPHA_OFFSET);
+ const uint8_t* const a = argb + CHANNEL_OFFSET(0);
+ const uint8_t* const r = argb + CHANNEL_OFFSET(1);
+ const uint8_t* const g = argb + CHANNEL_OFFSET(2);
+ const uint8_t* const b = argb + CHANNEL_OFFSET(3);
picture->colorspace = WEBP_YUV420;
return ImportYUVAFromRGBA(r, g, b, a, 4, 4 * picture->argb_stride,
@@ -1040,7 +675,7 @@ int WebPPictureYUVAToARGB(WebPPicture* picture) {
return WebPEncodingSetError(picture, VP8_ENC_ERROR_INVALID_CONFIGURATION);
}
// Allocate a new argb buffer (discarding the previous one).
- if (!WebPPictureAllocARGB(picture, picture->width, picture->height)) return 0;
+ if (!WebPPictureAllocARGB(picture)) return 0;
picture->use_argb = 1;
// Convert
@@ -1050,7 +685,7 @@ int WebPPictureYUVAToARGB(WebPPicture* picture) {
const int height = picture->height;
const int argb_stride = 4 * picture->argb_stride;
uint8_t* dst = (uint8_t*)picture->argb;
- const uint8_t *cur_u = picture->u, *cur_v = picture->v, *cur_y = picture->y;
+ const uint8_t* cur_u = picture->u, *cur_v = picture->v, *cur_y = picture->y;
WebPUpsampleLinePairFunc upsample =
WebPGetLinePairConverter(ALPHA_OFFSET > 0);
@@ -1102,6 +737,8 @@ static int Import(WebPPicture* const picture,
const int width = picture->width;
const int height = picture->height;
+ if (abs(rgb_stride) < (import_alpha ? 4 : 3) * width) return 0;
+
if (!picture->use_argb) {
const uint8_t* a_ptr = import_alpha ? rgb + 3 : NULL;
return ImportYUVAFromRGBA(r_ptr, g_ptr, b_ptr, a_ptr, step, rgb_stride,
@@ -1159,24 +796,24 @@ static int Import(WebPPicture* const picture,
#if !defined(WEBP_REDUCE_CSP)
int WebPPictureImportBGR(WebPPicture* picture,
- const uint8_t* rgb, int rgb_stride) {
- return (picture != NULL && rgb != NULL)
- ? Import(picture, rgb, rgb_stride, 3, 1, 0)
+ const uint8_t* bgr, int bgr_stride) {
+ return (picture != NULL && bgr != NULL)
+ ? Import(picture, bgr, bgr_stride, 3, 1, 0)
: 0;
}
int WebPPictureImportBGRA(WebPPicture* picture,
- const uint8_t* rgba, int rgba_stride) {
- return (picture != NULL && rgba != NULL)
- ? Import(picture, rgba, rgba_stride, 4, 1, 1)
+ const uint8_t* bgra, int bgra_stride) {
+ return (picture != NULL && bgra != NULL)
+ ? Import(picture, bgra, bgra_stride, 4, 1, 1)
: 0;
}
int WebPPictureImportBGRX(WebPPicture* picture,
- const uint8_t* rgba, int rgba_stride) {
- return (picture != NULL && rgba != NULL)
- ? Import(picture, rgba, rgba_stride, 4, 1, 0)
+ const uint8_t* bgrx, int bgrx_stride) {
+ return (picture != NULL && bgrx != NULL)
+ ? Import(picture, bgrx, bgrx_stride, 4, 1, 0)
: 0;
}
@@ -1197,9 +834,9 @@ int WebPPictureImportRGBA(WebPPicture* picture,
}
int WebPPictureImportRGBX(WebPPicture* picture,
- const uint8_t* rgba, int rgba_stride) {
- return (picture != NULL && rgba != NULL)
- ? Import(picture, rgba, rgba_stride, 4, 0, 0)
+ const uint8_t* rgbx, int rgbx_stride) {
+ return (picture != NULL && rgbx != NULL)
+ ? Import(picture, rgbx, rgbx_stride, 4, 0, 0)
: 0;
}
diff --git a/src/3rdparty/libwebp/src/enc/picture_enc.c b/src/3rdparty/libwebp/src/enc/picture_enc.c
index c691622..3af6383 100644
--- a/src/3rdparty/libwebp/src/enc/picture_enc.c
+++ b/src/3rdparty/libwebp/src/enc/picture_enc.c
@@ -45,6 +45,22 @@ int WebPPictureInitInternal(WebPPicture* picture, int version) {
//------------------------------------------------------------------------------
+int WebPValidatePicture(const WebPPicture* const picture) {
+ if (picture == NULL) return 0;
+ if (picture->width <= 0 || picture->height <= 0) {
+ return WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION);
+ }
+ if (picture->width <= 0 || picture->width / 4 > INT_MAX / 4 ||
+ picture->height <= 0 || picture->height / 4 > INT_MAX / 4) {
+ return WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION);
+ }
+ if (picture->colorspace != WEBP_YUV420 &&
+ picture->colorspace != WEBP_YUV420A) {
+ return WebPEncodingSetError(picture, VP8_ENC_ERROR_INVALID_CONFIGURATION);
+ }
+ return 1;
+}
+
static void WebPPictureResetBufferARGB(WebPPicture* const picture) {
picture->memory_argb_ = NULL;
picture->argb = NULL;
@@ -63,18 +79,17 @@ void WebPPictureResetBuffers(WebPPicture* const picture) {
WebPPictureResetBufferYUVA(picture);
}
-int WebPPictureAllocARGB(WebPPicture* const picture, int width, int height) {
+int WebPPictureAllocARGB(WebPPicture* const picture) {
void* memory;
+ const int width = picture->width;
+ const int height = picture->height;
const uint64_t argb_size = (uint64_t)width * height;
- assert(picture != NULL);
+ if (!WebPValidatePicture(picture)) return 0;
WebPSafeFree(picture->memory_argb_);
WebPPictureResetBufferARGB(picture);
- if (width <= 0 || height <= 0) {
- return WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION);
- }
// allocate a new buffer.
memory = WebPSafeMalloc(argb_size + WEBP_ALIGN_CST, sizeof(*picture->argb));
if (memory == NULL) {
@@ -86,10 +101,10 @@ int WebPPictureAllocARGB(WebPPicture* const picture, int width, int height) {
return 1;
}
-int WebPPictureAllocYUVA(WebPPicture* const picture, int width, int height) {
- const WebPEncCSP uv_csp =
- (WebPEncCSP)((int)picture->colorspace & WEBP_CSP_UV_MASK);
+int WebPPictureAllocYUVA(WebPPicture* const picture) {
const int has_alpha = (int)picture->colorspace & WEBP_CSP_ALPHA_BIT;
+ const int width = picture->width;
+ const int height = picture->height;
const int y_stride = width;
const int uv_width = (int)(((int64_t)width + 1) >> 1);
const int uv_height = (int)(((int64_t)height + 1) >> 1);
@@ -98,15 +113,11 @@ int WebPPictureAllocYUVA(WebPPicture* const picture, int width, int height) {
uint64_t y_size, uv_size, a_size, total_size;
uint8_t* mem;
- assert(picture != NULL);
+ if (!WebPValidatePicture(picture)) return 0;
WebPSafeFree(picture->memory_);
WebPPictureResetBufferYUVA(picture);
- if (uv_csp != WEBP_YUV420) {
- return WebPEncodingSetError(picture, VP8_ENC_ERROR_INVALID_CONFIGURATION);
- }
-
// alpha
a_width = has_alpha ? width : 0;
a_stride = a_width;
@@ -152,15 +163,12 @@ int WebPPictureAllocYUVA(WebPPicture* const picture, int width, int height) {
int WebPPictureAlloc(WebPPicture* picture) {
if (picture != NULL) {
- const int width = picture->width;
- const int height = picture->height;
-
WebPPictureFree(picture); // erase previous buffer
if (!picture->use_argb) {
- return WebPPictureAllocYUVA(picture, width, height);
+ return WebPPictureAllocYUVA(picture);
} else {
- return WebPPictureAllocARGB(picture, width, height);
+ return WebPPictureAllocARGB(picture);
}
}
return 1;
diff --git a/src/3rdparty/libwebp/src/enc/picture_rescale_enc.c b/src/3rdparty/libwebp/src/enc/picture_rescale_enc.c
index 58a6ae7..839f91c 100644
--- a/src/3rdparty/libwebp/src/enc/picture_rescale_enc.c
+++ b/src/3rdparty/libwebp/src/enc/picture_rescale_enc.c
@@ -13,14 +13,15 @@
#include "src/webp/encode.h"
-#if !defined(WEBP_REDUCE_SIZE)
-
#include <assert.h>
#include <stdlib.h>
#include "src/enc/vp8i_enc.h"
+
+#if !defined(WEBP_REDUCE_SIZE)
#include "src/utils/rescaler_utils.h"
#include "src/utils/utils.h"
+#endif // !defined(WEBP_REDUCE_SIZE)
#define HALVE(x) (((x) + 1) >> 1)
@@ -56,6 +57,7 @@ static int AdjustAndCheckRectangle(const WebPPicture* const pic,
return 1;
}
+#if !defined(WEBP_REDUCE_SIZE)
int WebPPictureCopy(const WebPPicture* src, WebPPicture* dst) {
if (src == NULL || dst == NULL) return 0;
if (src == dst) return 1;
@@ -81,6 +83,7 @@ int WebPPictureCopy(const WebPPicture* src, WebPPicture* dst) {
}
return 1;
}
+#endif // !defined(WEBP_REDUCE_SIZE)
int WebPPictureIsView(const WebPPicture* picture) {
if (picture == NULL) return 0;
@@ -120,6 +123,7 @@ int WebPPictureView(const WebPPicture* src,
return 1;
}
+#if !defined(WEBP_REDUCE_SIZE)
//------------------------------------------------------------------------------
// Picture cropping
@@ -164,22 +168,25 @@ int WebPPictureCrop(WebPPicture* pic,
//------------------------------------------------------------------------------
// Simple picture rescaler
-static void RescalePlane(const uint8_t* src,
- int src_width, int src_height, int src_stride,
- uint8_t* dst,
- int dst_width, int dst_height, int dst_stride,
- rescaler_t* const work,
- int num_channels) {
+static int RescalePlane(const uint8_t* src,
+ int src_width, int src_height, int src_stride,
+ uint8_t* dst,
+ int dst_width, int dst_height, int dst_stride,
+ rescaler_t* const work,
+ int num_channels) {
WebPRescaler rescaler;
int y = 0;
- WebPRescalerInit(&rescaler, src_width, src_height,
- dst, dst_width, dst_height, dst_stride,
- num_channels, work);
+ if (!WebPRescalerInit(&rescaler, src_width, src_height,
+ dst, dst_width, dst_height, dst_stride,
+ num_channels, work)) {
+ return 0;
+ }
while (y < src_height) {
y += WebPRescalerImport(&rescaler, src_height - y,
src + y * src_stride, src_stride);
WebPRescalerExport(&rescaler);
}
+ return 1;
}
static void AlphaMultiplyARGB(WebPPicture* const pic, int inverse) {
@@ -195,52 +202,53 @@ static void AlphaMultiplyY(WebPPicture* const pic, int inverse) {
}
}
-int WebPPictureRescale(WebPPicture* pic, int width, int height) {
+int WebPPictureRescale(WebPPicture* picture, int width, int height) {
WebPPicture tmp;
int prev_width, prev_height;
rescaler_t* work;
- if (pic == NULL) return 0;
- prev_width = pic->width;
- prev_height = pic->height;
+ if (picture == NULL) return 0;
+ prev_width = picture->width;
+ prev_height = picture->height;
if (!WebPRescalerGetScaledDimensions(
prev_width, prev_height, &width, &height)) {
return 0;
}
- PictureGrabSpecs(pic, &tmp);
+ PictureGrabSpecs(picture, &tmp);
tmp.width = width;
tmp.height = height;
if (!WebPPictureAlloc(&tmp)) return 0;
- if (!pic->use_argb) {
+ if (!picture->use_argb) {
work = (rescaler_t*)WebPSafeMalloc(2ULL * width, sizeof(*work));
if (work == NULL) {
WebPPictureFree(&tmp);
return 0;
}
// If present, we need to rescale alpha first (for AlphaMultiplyY).
- if (pic->a != NULL) {
+ if (picture->a != NULL) {
WebPInitAlphaProcessing();
- RescalePlane(pic->a, prev_width, prev_height, pic->a_stride,
- tmp.a, width, height, tmp.a_stride, work, 1);
+ if (!RescalePlane(picture->a, prev_width, prev_height, picture->a_stride,
+ tmp.a, width, height, tmp.a_stride, work, 1)) {
+ return 0;
+ }
}
// We take transparency into account on the luma plane only. That's not
// totally exact blending, but still is a good approximation.
- AlphaMultiplyY(pic, 0);
- RescalePlane(pic->y, prev_width, prev_height, pic->y_stride,
- tmp.y, width, height, tmp.y_stride, work, 1);
+ AlphaMultiplyY(picture, 0);
+ if (!RescalePlane(picture->y, prev_width, prev_height, picture->y_stride,
+ tmp.y, width, height, tmp.y_stride, work, 1) ||
+ !RescalePlane(picture->u, HALVE(prev_width), HALVE(prev_height),
+ picture->uv_stride, tmp.u, HALVE(width), HALVE(height),
+ tmp.uv_stride, work, 1) ||
+ !RescalePlane(picture->v, HALVE(prev_width), HALVE(prev_height),
+ picture->uv_stride, tmp.v, HALVE(width), HALVE(height),
+ tmp.uv_stride, work, 1)) {
+ return 0;
+ }
AlphaMultiplyY(&tmp, 1);
-
- RescalePlane(pic->u,
- HALVE(prev_width), HALVE(prev_height), pic->uv_stride,
- tmp.u,
- HALVE(width), HALVE(height), tmp.uv_stride, work, 1);
- RescalePlane(pic->v,
- HALVE(prev_width), HALVE(prev_height), pic->uv_stride,
- tmp.v,
- HALVE(width), HALVE(height), tmp.uv_stride, work, 1);
} else {
work = (rescaler_t*)WebPSafeMalloc(2ULL * width * 4, sizeof(*work));
if (work == NULL) {
@@ -251,17 +259,17 @@ int WebPPictureRescale(WebPPicture* pic, int width, int height) {
// weighting first (black-matting), scale the RGB values, and remove
// the premultiplication afterward (while preserving the alpha channel).
WebPInitAlphaProcessing();
- AlphaMultiplyARGB(pic, 0);
- RescalePlane((const uint8_t*)pic->argb, prev_width, prev_height,
- pic->argb_stride * 4,
- (uint8_t*)tmp.argb, width, height,
- tmp.argb_stride * 4,
- work, 4);
+ AlphaMultiplyARGB(picture, 0);
+ if (!RescalePlane((const uint8_t*)picture->argb, prev_width, prev_height,
+ picture->argb_stride * 4, (uint8_t*)tmp.argb, width,
+ height, tmp.argb_stride * 4, work, 4)) {
+ return 0;
+ }
AlphaMultiplyARGB(&tmp, 1);
}
- WebPPictureFree(pic);
+ WebPPictureFree(picture);
WebPSafeFree(work);
- *pic = tmp;
+ *picture = tmp;
return 1;
}
@@ -273,23 +281,6 @@ int WebPPictureCopy(const WebPPicture* src, WebPPicture* dst) {
return 0;
}
-int WebPPictureIsView(const WebPPicture* picture) {
- (void)picture;
- return 0;
-}
-
-int WebPPictureView(const WebPPicture* src,
- int left, int top, int width, int height,
- WebPPicture* dst) {
- (void)src;
- (void)left;
- (void)top;
- (void)width;
- (void)height;
- (void)dst;
- return 0;
-}
-
int WebPPictureCrop(WebPPicture* pic,
int left, int top, int width, int height) {
(void)pic;
diff --git a/src/3rdparty/libwebp/src/enc/picture_tools_enc.c b/src/3rdparty/libwebp/src/enc/picture_tools_enc.c
index d0e8a49..147cc18 100644
--- a/src/3rdparty/libwebp/src/enc/picture_tools_enc.c
+++ b/src/3rdparty/libwebp/src/enc/picture_tools_enc.c
@@ -83,6 +83,19 @@ static int SmoothenBlock(const uint8_t* a_ptr, int a_stride, uint8_t* y_ptr,
return (count == 0);
}
+void WebPReplaceTransparentPixels(WebPPicture* const pic, uint32_t color) {
+ if (pic != NULL && pic->use_argb) {
+ int y = pic->height;
+ uint32_t* argb = pic->argb;
+ color &= 0xffffffu; // force alpha=0
+ WebPInitAlphaProcessing();
+ while (y-- > 0) {
+ WebPAlphaReplace(argb, pic->width, color);
+ argb += pic->argb_stride;
+ }
+ }
+}
+
void WebPCleanupTransparentArea(WebPPicture* pic) {
int x, y, w, h;
if (pic == NULL) return;
@@ -165,24 +178,6 @@ void WebPCleanupTransparentArea(WebPPicture* pic) {
#undef SIZE
#undef SIZE2
-void WebPCleanupTransparentAreaLossless(WebPPicture* const pic) {
- int x, y, w, h;
- uint32_t* argb;
- assert(pic != NULL && pic->use_argb);
- w = pic->width;
- h = pic->height;
- argb = pic->argb;
-
- for (y = 0; y < h; ++y) {
- for (x = 0; x < w; ++x) {
- if ((argb[x] & 0xff000000) == 0) {
- argb[x] = 0x00000000;
- }
- }
- argb += pic->argb_stride;
- }
-}
-
//------------------------------------------------------------------------------
// Blend color and remove transparency info
@@ -195,27 +190,28 @@ static WEBP_INLINE uint32_t MakeARGB32(int r, int g, int b) {
return (0xff000000u | (r << 16) | (g << 8) | b);
}
-void WebPBlendAlpha(WebPPicture* pic, uint32_t background_rgb) {
+void WebPBlendAlpha(WebPPicture* picture, uint32_t background_rgb) {
const int red = (background_rgb >> 16) & 0xff;
const int green = (background_rgb >> 8) & 0xff;
const int blue = (background_rgb >> 0) & 0xff;
int x, y;
- if (pic == NULL) return;
- if (!pic->use_argb) {
- const int uv_width = (pic->width >> 1); // omit last pixel during u/v loop
+ if (picture == NULL) return;
+ if (!picture->use_argb) {
+ // omit last pixel during u/v loop
+ const int uv_width = (picture->width >> 1);
const int Y0 = VP8RGBToY(red, green, blue, YUV_HALF);
// VP8RGBToU/V expects the u/v values summed over four pixels
const int U0 = VP8RGBToU(4 * red, 4 * green, 4 * blue, 4 * YUV_HALF);
const int V0 = VP8RGBToV(4 * red, 4 * green, 4 * blue, 4 * YUV_HALF);
- const int has_alpha = pic->colorspace & WEBP_CSP_ALPHA_BIT;
- uint8_t* y_ptr = pic->y;
- uint8_t* u_ptr = pic->u;
- uint8_t* v_ptr = pic->v;
- uint8_t* a_ptr = pic->a;
+ const int has_alpha = picture->colorspace & WEBP_CSP_ALPHA_BIT;
+ uint8_t* y_ptr = picture->y;
+ uint8_t* u_ptr = picture->u;
+ uint8_t* v_ptr = picture->v;
+ uint8_t* a_ptr = picture->a;
if (!has_alpha || a_ptr == NULL) return; // nothing to do
- for (y = 0; y < pic->height; ++y) {
+ for (y = 0; y < picture->height; ++y) {
// Luma blending
- for (x = 0; x < pic->width; ++x) {
+ for (x = 0; x < picture->width; ++x) {
const uint8_t alpha = a_ptr[x];
if (alpha < 0xff) {
y_ptr[x] = BLEND(Y0, y_ptr[x], alpha);
@@ -224,7 +220,7 @@ void WebPBlendAlpha(WebPPicture* pic, uint32_t background_rgb) {
// Chroma blending every even line
if ((y & 1) == 0) {
uint8_t* const a_ptr2 =
- (y + 1 == pic->height) ? a_ptr : a_ptr + pic->a_stride;
+ (y + 1 == picture->height) ? a_ptr : a_ptr + picture->a_stride;
for (x = 0; x < uv_width; ++x) {
// Average four alpha values into a single blending weight.
// TODO(skal): might lead to visible contouring. Can we do better?
@@ -234,24 +230,24 @@ void WebPBlendAlpha(WebPPicture* pic, uint32_t background_rgb) {
u_ptr[x] = BLEND_10BIT(U0, u_ptr[x], alpha);
v_ptr[x] = BLEND_10BIT(V0, v_ptr[x], alpha);
}
- if (pic->width & 1) { // rightmost pixel
+ if (picture->width & 1) { // rightmost pixel
const uint32_t alpha = 2 * (a_ptr[2 * x + 0] + a_ptr2[2 * x + 0]);
u_ptr[x] = BLEND_10BIT(U0, u_ptr[x], alpha);
v_ptr[x] = BLEND_10BIT(V0, v_ptr[x], alpha);
}
} else {
- u_ptr += pic->uv_stride;
- v_ptr += pic->uv_stride;
+ u_ptr += picture->uv_stride;
+ v_ptr += picture->uv_stride;
}
- memset(a_ptr, 0xff, pic->width); // reset alpha value to opaque
- a_ptr += pic->a_stride;
- y_ptr += pic->y_stride;
+ memset(a_ptr, 0xff, picture->width); // reset alpha value to opaque
+ a_ptr += picture->a_stride;
+ y_ptr += picture->y_stride;
}
} else {
- uint32_t* argb = pic->argb;
+ uint32_t* argb = picture->argb;
const uint32_t background = MakeARGB32(red, green, blue);
- for (y = 0; y < pic->height; ++y) {
- for (x = 0; x < pic->width; ++x) {
+ for (y = 0; y < picture->height; ++y) {
+ for (x = 0; x < picture->width; ++x) {
const int alpha = (argb[x] >> 24) & 0xff;
if (alpha != 0xff) {
if (alpha > 0) {
@@ -267,7 +263,7 @@ void WebPBlendAlpha(WebPPicture* pic, uint32_t background_rgb) {
}
}
}
- argb += pic->argb_stride;
+ argb += picture->argb_stride;
}
}
}
diff --git a/src/3rdparty/libwebp/src/enc/predictor_enc.c b/src/3rdparty/libwebp/src/enc/predictor_enc.c
index 2e6762e..b3d44b5 100644
--- a/src/3rdparty/libwebp/src/enc/predictor_enc.c
+++ b/src/3rdparty/libwebp/src/enc/predictor_enc.c
@@ -16,6 +16,7 @@
#include "src/dsp/lossless.h"
#include "src/dsp/lossless_common.h"
+#include "src/enc/vp8i_enc.h"
#include "src/enc/vp8li_enc.h"
#define MAX_DIFF_COST (1e30f)
@@ -31,10 +32,10 @@ static WEBP_INLINE int GetMin(int a, int b) { return (a > b) ? b : a; }
// Methods to calculate Entropy (Shannon).
static float PredictionCostSpatial(const int counts[256], int weight_0,
- double exp_val) {
+ float exp_val) {
const int significant_symbols = 256 >> 4;
- const double exp_decay_factor = 0.6;
- double bits = weight_0 * counts[0];
+ const float exp_decay_factor = 0.6f;
+ float bits = (float)weight_0 * counts[0];
int i;
for (i = 1; i < significant_symbols; ++i) {
bits += exp_val * (counts[i] + counts[256 - i]);
@@ -46,9 +47,9 @@ static float PredictionCostSpatial(const int counts[256], int weight_0,
static float PredictionCostSpatialHistogram(const int accumulated[4][256],
const int tile[4][256]) {
int i;
- double retval = 0;
+ float retval = 0.f;
for (i = 0; i < 4; ++i) {
- const double kExpValue = 0.94;
+ const float kExpValue = 0.94f;
retval += PredictionCostSpatial(tile[i], 1, kExpValue);
retval += VP8LCombinedShannonEntropy(tile[i], accumulated[i]);
}
@@ -249,7 +250,7 @@ static WEBP_INLINE void GetResidual(
} else if (x == 0) {
predict = upper_row[x]; // Top.
} else {
- predict = pred_func(current_row[x - 1], upper_row + x);
+ predict = pred_func(&current_row[x - 1], upper_row + x);
}
#if (WEBP_NEAR_LOSSLESS == 1)
if (max_quantization == 1 || mode == 0 || y == 0 || y == height - 1 ||
@@ -472,12 +473,15 @@ static void CopyImageWithPrediction(int width, int height,
// with respect to predictions. If near_lossless_quality < 100, applies
// near lossless processing, shaving off more bits of residuals for lower
// qualities.
-void VP8LResidualImage(int width, int height, int bits, int low_effort,
- uint32_t* const argb, uint32_t* const argb_scratch,
- uint32_t* const image, int near_lossless_quality,
- int exact, int used_subtract_green) {
+int VP8LResidualImage(int width, int height, int bits, int low_effort,
+ uint32_t* const argb, uint32_t* const argb_scratch,
+ uint32_t* const image, int near_lossless_quality,
+ int exact, int used_subtract_green,
+ const WebPPicture* const pic, int percent_range,
+ int* const percent) {
const int tiles_per_row = VP8LSubSampleSize(width, bits);
const int tiles_per_col = VP8LSubSampleSize(height, bits);
+ int percent_start = *percent;
int tile_y;
int histo[4][256];
const int max_quantization = 1 << VP8LNearLosslessBits(near_lossless_quality);
@@ -491,17 +495,24 @@ void VP8LResidualImage(int width, int height, int bits, int low_effort,
for (tile_y = 0; tile_y < tiles_per_col; ++tile_y) {
int tile_x;
for (tile_x = 0; tile_x < tiles_per_row; ++tile_x) {
- const int pred = GetBestPredictorForTile(width, height, tile_x, tile_y,
- bits, histo, argb_scratch, argb, max_quantization, exact,
- used_subtract_green, image);
+ const int pred = GetBestPredictorForTile(
+ width, height, tile_x, tile_y, bits, histo, argb_scratch, argb,
+ max_quantization, exact, used_subtract_green, image);
image[tile_y * tiles_per_row + tile_x] = ARGB_BLACK | (pred << 8);
}
+
+ if (!WebPReportProgress(
+ pic, percent_start + percent_range * tile_y / tiles_per_col,
+ percent)) {
+ return 0;
+ }
}
}
CopyImageWithPrediction(width, height, bits, image, argb_scratch, argb,
low_effort, max_quantization, exact,
used_subtract_green);
+ return WebPReportProgress(pic, percent_start + percent_range, percent);
}
//------------------------------------------------------------------------------
@@ -532,7 +543,7 @@ static float PredictionCostCrossColor(const int accumulated[256],
const int counts[256]) {
// Favor low entropy, locally and globally.
// Favor small absolute values for PredictionCostSpatial
- static const double kExpValue = 2.4;
+ static const float kExpValue = 2.4f;
return VP8LCombinedShannonEntropy(counts, accumulated) +
PredictionCostSpatial(counts, 3, kExpValue);
}
@@ -714,11 +725,14 @@ static void CopyTileWithColorTransform(int xsize, int ysize,
}
}
-void VP8LColorSpaceTransform(int width, int height, int bits, int quality,
- uint32_t* const argb, uint32_t* image) {
+int VP8LColorSpaceTransform(int width, int height, int bits, int quality,
+ uint32_t* const argb, uint32_t* image,
+ const WebPPicture* const pic, int percent_range,
+ int* const percent) {
const int max_tile_size = 1 << bits;
const int tile_xsize = VP8LSubSampleSize(width, bits);
const int tile_ysize = VP8LSubSampleSize(height, bits);
+ int percent_start = *percent;
int accumulated_red_histo[256] = { 0 };
int accumulated_blue_histo[256] = { 0 };
int tile_x, tile_y;
@@ -768,5 +782,11 @@ void VP8LColorSpaceTransform(int width, int height, int bits, int quality,
}
}
}
+ if (!WebPReportProgress(
+ pic, percent_start + percent_range * tile_y / tile_ysize,
+ percent)) {
+ return 0;
+ }
}
+ return 1;
}
diff --git a/src/3rdparty/libwebp/src/enc/quant_enc.c b/src/3rdparty/libwebp/src/enc/quant_enc.c
index 01eb565..6d8202d 100644
--- a/src/3rdparty/libwebp/src/enc/quant_enc.c
+++ b/src/3rdparty/libwebp/src/enc/quant_enc.c
@@ -533,7 +533,8 @@ static void InitScore(VP8ModeScore* const rd) {
rd->score = MAX_COST;
}
-static void CopyScore(VP8ModeScore* const dst, const VP8ModeScore* const src) {
+static void CopyScore(VP8ModeScore* WEBP_RESTRICT const dst,
+ const VP8ModeScore* WEBP_RESTRICT const src) {
dst->D = src->D;
dst->SD = src->SD;
dst->R = src->R;
@@ -542,7 +543,8 @@ static void CopyScore(VP8ModeScore* const dst, const VP8ModeScore* const src) {
dst->score = src->score;
}
-static void AddScore(VP8ModeScore* const dst, const VP8ModeScore* const src) {
+static void AddScore(VP8ModeScore* WEBP_RESTRICT const dst,
+ const VP8ModeScore* WEBP_RESTRICT const src) {
dst->D += src->D;
dst->SD += src->SD;
dst->R += src->R;
@@ -585,15 +587,18 @@ static WEBP_INLINE score_t RDScoreTrellis(int lambda, score_t rate,
return rate * lambda + RD_DISTO_MULT * distortion;
}
-static int TrellisQuantizeBlock(const VP8Encoder* const enc,
+// Coefficient type.
+enum { TYPE_I16_AC = 0, TYPE_I16_DC = 1, TYPE_CHROMA_A = 2, TYPE_I4_AC = 3 };
+
+static int TrellisQuantizeBlock(const VP8Encoder* WEBP_RESTRICT const enc,
int16_t in[16], int16_t out[16],
int ctx0, int coeff_type,
- const VP8Matrix* const mtx,
+ const VP8Matrix* WEBP_RESTRICT const mtx,
int lambda) {
const ProbaArray* const probas = enc->proba_.coeffs_[coeff_type];
CostArrayPtr const costs =
(CostArrayPtr)enc->proba_.remapped_costs_[coeff_type];
- const int first = (coeff_type == 0) ? 1 : 0;
+ const int first = (coeff_type == TYPE_I16_AC) ? 1 : 0;
Node nodes[16][NUM_NODES];
ScoreState score_states[2][NUM_NODES];
ScoreState* ss_cur = &SCORE_STATE(0, MIN_DELTA);
@@ -657,16 +662,17 @@ static int TrellisQuantizeBlock(const VP8Encoder* const enc,
// test all alternate level values around level0.
for (m = -MIN_DELTA; m <= MAX_DELTA; ++m) {
Node* const cur = &NODE(n, m);
- int level = level0 + m;
+ const int level = level0 + m;
const int ctx = (level > 2) ? 2 : level;
const int band = VP8EncBands[n + 1];
score_t base_score;
- score_t best_cur_score = MAX_COST;
- int best_prev = 0; // default, in case
+ score_t best_cur_score;
+ int best_prev;
+ score_t cost, score;
- ss_cur[m].score = MAX_COST;
ss_cur[m].costs = costs[n + 1][ctx];
if (level < 0 || level > thresh_level) {
+ ss_cur[m].score = MAX_COST;
// Node is dead.
continue;
}
@@ -682,18 +688,24 @@ static int TrellisQuantizeBlock(const VP8Encoder* const enc,
}
// Inspect all possible non-dead predecessors. Retain only the best one.
- for (p = -MIN_DELTA; p <= MAX_DELTA; ++p) {
+ // The base_score is added to all scores so it is only added for the final
+ // value after the loop.
+ cost = VP8LevelCost(ss_prev[-MIN_DELTA].costs, level);
+ best_cur_score =
+ ss_prev[-MIN_DELTA].score + RDScoreTrellis(lambda, cost, 0);
+ best_prev = -MIN_DELTA;
+ for (p = -MIN_DELTA + 1; p <= MAX_DELTA; ++p) {
// Dead nodes (with ss_prev[p].score >= MAX_COST) are automatically
// eliminated since their score can't be better than the current best.
- const score_t cost = VP8LevelCost(ss_prev[p].costs, level);
+ cost = VP8LevelCost(ss_prev[p].costs, level);
// Examine node assuming it's a non-terminal one.
- const score_t score =
- base_score + ss_prev[p].score + RDScoreTrellis(lambda, cost, 0);
+ score = ss_prev[p].score + RDScoreTrellis(lambda, cost, 0);
if (score < best_cur_score) {
best_cur_score = score;
best_prev = p;
}
}
+ best_cur_score += base_score;
// Store best finding in current node.
cur->sign = sign;
cur->level = level;
@@ -701,11 +713,11 @@ static int TrellisQuantizeBlock(const VP8Encoder* const enc,
ss_cur[m].score = best_cur_score;
// Now, record best terminal node (and thus best entry in the graph).
- if (level != 0) {
+ if (level != 0 && best_cur_score < best_score) {
const score_t last_pos_cost =
(n < 15) ? VP8BitCost(0, probas[band][ctx][0]) : 0;
const score_t last_pos_score = RDScoreTrellis(lambda, last_pos_cost, 0);
- const score_t score = best_cur_score + last_pos_score;
+ score = best_cur_score + last_pos_score;
if (score < best_score) {
best_score = score;
best_path[0] = n; // best eob position
@@ -717,10 +729,16 @@ static int TrellisQuantizeBlock(const VP8Encoder* const enc,
}
// Fresh start
- memset(in + first, 0, (16 - first) * sizeof(*in));
- memset(out + first, 0, (16 - first) * sizeof(*out));
+ // Beware! We must preserve in[0]/out[0] value for TYPE_I16_AC case.
+ if (coeff_type == TYPE_I16_AC) {
+ memset(in + 1, 0, 15 * sizeof(*in));
+ memset(out + 1, 0, 15 * sizeof(*out));
+ } else {
+ memset(in, 0, 16 * sizeof(*in));
+ memset(out, 0, 16 * sizeof(*out));
+ }
if (best_path[0] == -1) {
- return 0; // skip!
+ return 0; // skip!
}
{
@@ -751,9 +769,9 @@ static int TrellisQuantizeBlock(const VP8Encoder* const enc,
// all at once. Output is the reconstructed block in *yuv_out, and the
// quantized levels in *levels.
-static int ReconstructIntra16(VP8EncIterator* const it,
- VP8ModeScore* const rd,
- uint8_t* const yuv_out,
+static int ReconstructIntra16(VP8EncIterator* WEBP_RESTRICT const it,
+ VP8ModeScore* WEBP_RESTRICT const rd,
+ uint8_t* WEBP_RESTRICT const yuv_out,
int mode) {
const VP8Encoder* const enc = it->enc_;
const uint8_t* const ref = it->yuv_p_ + VP8I16ModeOffsets[mode];
@@ -775,9 +793,9 @@ static int ReconstructIntra16(VP8EncIterator* const it,
for (y = 0, n = 0; y < 4; ++y) {
for (x = 0; x < 4; ++x, ++n) {
const int ctx = it->top_nz_[x] + it->left_nz_[y];
- const int non_zero =
- TrellisQuantizeBlock(enc, tmp[n], rd->y_ac_levels[n], ctx, 0,
- &dqm->y1_, dqm->lambda_trellis_i16_);
+ const int non_zero = TrellisQuantizeBlock(
+ enc, tmp[n], rd->y_ac_levels[n], ctx, TYPE_I16_AC, &dqm->y1_,
+ dqm->lambda_trellis_i16_);
it->top_nz_[x] = it->left_nz_[y] = non_zero;
rd->y_ac_levels[n][0] = 0;
nz |= non_zero << n;
@@ -803,10 +821,10 @@ static int ReconstructIntra16(VP8EncIterator* const it,
return nz;
}
-static int ReconstructIntra4(VP8EncIterator* const it,
+static int ReconstructIntra4(VP8EncIterator* WEBP_RESTRICT const it,
int16_t levels[16],
- const uint8_t* const src,
- uint8_t* const yuv_out,
+ const uint8_t* WEBP_RESTRICT const src,
+ uint8_t* WEBP_RESTRICT const yuv_out,
int mode) {
const VP8Encoder* const enc = it->enc_;
const uint8_t* const ref = it->yuv_p_ + VP8I4ModeOffsets[mode];
@@ -818,7 +836,7 @@ static int ReconstructIntra4(VP8EncIterator* const it,
if (DO_TRELLIS_I4 && it->do_trellis_) {
const int x = it->i4_ & 3, y = it->i4_ >> 2;
const int ctx = it->top_nz_[x] + it->left_nz_[y];
- nz = TrellisQuantizeBlock(enc, tmp, levels, ctx, 3, &dqm->y1_,
+ nz = TrellisQuantizeBlock(enc, tmp, levels, ctx, TYPE_I4_AC, &dqm->y1_,
dqm->lambda_trellis_i4_);
} else {
nz = VP8EncQuantizeBlock(tmp, levels, &dqm->y1_);
@@ -839,7 +857,8 @@ static int ReconstructIntra4(VP8EncIterator* const it,
// Quantize as usual, but also compute and return the quantization error.
// Error is already divided by DSHIFT.
-static int QuantizeSingle(int16_t* const v, const VP8Matrix* const mtx) {
+static int QuantizeSingle(int16_t* WEBP_RESTRICT const v,
+ const VP8Matrix* WEBP_RESTRICT const mtx) {
int V = *v;
const int sign = (V < 0);
if (sign) V = -V;
@@ -853,9 +872,10 @@ static int QuantizeSingle(int16_t* const v, const VP8Matrix* const mtx) {
return (sign ? -V : V) >> DSCALE;
}
-static void CorrectDCValues(const VP8EncIterator* const it,
- const VP8Matrix* const mtx,
- int16_t tmp[][16], VP8ModeScore* const rd) {
+static void CorrectDCValues(const VP8EncIterator* WEBP_RESTRICT const it,
+ const VP8Matrix* WEBP_RESTRICT const mtx,
+ int16_t tmp[][16],
+ VP8ModeScore* WEBP_RESTRICT const rd) {
// | top[0] | top[1]
// --------+--------+---------
// left[0] | tmp[0] tmp[1] <-> err0 err1
@@ -886,8 +906,8 @@ static void CorrectDCValues(const VP8EncIterator* const it,
}
}
-static void StoreDiffusionErrors(VP8EncIterator* const it,
- const VP8ModeScore* const rd) {
+static void StoreDiffusionErrors(VP8EncIterator* WEBP_RESTRICT const it,
+ const VP8ModeScore* WEBP_RESTRICT const rd) {
int ch;
for (ch = 0; ch <= 1; ++ch) {
int8_t* const top = it->top_derr_[it->x_][ch];
@@ -906,8 +926,9 @@ static void StoreDiffusionErrors(VP8EncIterator* const it,
//------------------------------------------------------------------------------
-static int ReconstructUV(VP8EncIterator* const it, VP8ModeScore* const rd,
- uint8_t* const yuv_out, int mode) {
+static int ReconstructUV(VP8EncIterator* WEBP_RESTRICT const it,
+ VP8ModeScore* WEBP_RESTRICT const rd,
+ uint8_t* WEBP_RESTRICT const yuv_out, int mode) {
const VP8Encoder* const enc = it->enc_;
const uint8_t* const ref = it->yuv_p_ + VP8UVModeOffsets[mode];
const uint8_t* const src = it->yuv_in_ + U_OFF_ENC;
@@ -927,9 +948,9 @@ static int ReconstructUV(VP8EncIterator* const it, VP8ModeScore* const rd,
for (y = 0; y < 2; ++y) {
for (x = 0; x < 2; ++x, ++n) {
const int ctx = it->top_nz_[4 + ch + x] + it->left_nz_[4 + ch + y];
- const int non_zero =
- TrellisQuantizeBlock(enc, tmp[n], rd->uv_levels[n], ctx, 2,
- &dqm->uv_, dqm->lambda_trellis_uv_);
+ const int non_zero = TrellisQuantizeBlock(
+ enc, tmp[n], rd->uv_levels[n], ctx, TYPE_CHROMA_A, &dqm->uv_,
+ dqm->lambda_trellis_uv_);
it->top_nz_[4 + ch + x] = it->left_nz_[4 + ch + y] = non_zero;
nz |= non_zero << n;
}
@@ -978,7 +999,8 @@ static void SwapOut(VP8EncIterator* const it) {
SwapPtr(&it->yuv_out_, &it->yuv_out2_);
}
-static void PickBestIntra16(VP8EncIterator* const it, VP8ModeScore* rd) {
+static void PickBestIntra16(VP8EncIterator* WEBP_RESTRICT const it,
+ VP8ModeScore* WEBP_RESTRICT rd) {
const int kNumBlocks = 16;
VP8SegmentInfo* const dqm = &it->enc_->dqm_[it->mb_->segment_];
const int lambda = dqm->lambda_i16_;
@@ -1038,7 +1060,7 @@ static void PickBestIntra16(VP8EncIterator* const it, VP8ModeScore* rd) {
//------------------------------------------------------------------------------
// return the cost array corresponding to the surrounding prediction modes.
-static const uint16_t* GetCostModeI4(VP8EncIterator* const it,
+static const uint16_t* GetCostModeI4(VP8EncIterator* WEBP_RESTRICT const it,
const uint8_t modes[16]) {
const int preds_w = it->enc_->preds_w_;
const int x = (it->i4_ & 3), y = it->i4_ >> 2;
@@ -1047,7 +1069,8 @@ static const uint16_t* GetCostModeI4(VP8EncIterator* const it,
return VP8FixedCostsI4[top][left];
}
-static int PickBestIntra4(VP8EncIterator* const it, VP8ModeScore* const rd) {
+static int PickBestIntra4(VP8EncIterator* WEBP_RESTRICT const it,
+ VP8ModeScore* WEBP_RESTRICT const rd) {
const VP8Encoder* const enc = it->enc_;
const VP8SegmentInfo* const dqm = &enc->dqm_[it->mb_->segment_];
const int lambda = dqm->lambda_i4_;
@@ -1143,7 +1166,8 @@ static int PickBestIntra4(VP8EncIterator* const it, VP8ModeScore* const rd) {
//------------------------------------------------------------------------------
-static void PickBestUV(VP8EncIterator* const it, VP8ModeScore* const rd) {
+static void PickBestUV(VP8EncIterator* WEBP_RESTRICT const it,
+ VP8ModeScore* WEBP_RESTRICT const rd) {
const int kNumBlocks = 8;
const VP8SegmentInfo* const dqm = &it->enc_->dqm_[it->mb_->segment_];
const int lambda = dqm->lambda_uv_;
@@ -1195,7 +1219,8 @@ static void PickBestUV(VP8EncIterator* const it, VP8ModeScore* const rd) {
//------------------------------------------------------------------------------
// Final reconstruction and quantization.
-static void SimpleQuantize(VP8EncIterator* const it, VP8ModeScore* const rd) {
+static void SimpleQuantize(VP8EncIterator* WEBP_RESTRICT const it,
+ VP8ModeScore* WEBP_RESTRICT const rd) {
const VP8Encoder* const enc = it->enc_;
const int is_i16 = (it->mb_->type_ == 1);
int nz = 0;
@@ -1220,9 +1245,9 @@ static void SimpleQuantize(VP8EncIterator* const it, VP8ModeScore* const rd) {
}
// Refine intra16/intra4 sub-modes based on distortion only (not rate).
-static void RefineUsingDistortion(VP8EncIterator* const it,
+static void RefineUsingDistortion(VP8EncIterator* WEBP_RESTRICT const it,
int try_both_modes, int refine_uv_mode,
- VP8ModeScore* const rd) {
+ VP8ModeScore* WEBP_RESTRICT const rd) {
score_t best_score = MAX_COST;
int nz = 0;
int mode;
@@ -1336,7 +1361,8 @@ static void RefineUsingDistortion(VP8EncIterator* const it,
//------------------------------------------------------------------------------
// Entry point
-int VP8Decimate(VP8EncIterator* const it, VP8ModeScore* const rd,
+int VP8Decimate(VP8EncIterator* WEBP_RESTRICT const it,
+ VP8ModeScore* WEBP_RESTRICT const rd,
VP8RDLevel rd_opt) {
int is_skipped;
const int method = it->enc_->method_;
diff --git a/src/3rdparty/libwebp/src/enc/syntax_enc.c b/src/3rdparty/libwebp/src/enc/syntax_enc.c
index a9e5a6c..e18cf65 100644
--- a/src/3rdparty/libwebp/src/enc/syntax_enc.c
+++ b/src/3rdparty/libwebp/src/enc/syntax_enc.c
@@ -349,7 +349,7 @@ int VP8EncWrite(VP8Encoder* const enc) {
(enc->alpha_data_size_ & 1);
riff_size += CHUNK_HEADER_SIZE + padded_alpha_size;
}
- // Sanity check.
+ // RIFF size should fit in 32-bits.
if (riff_size > 0xfffffffeU) {
return WebPEncodingSetError(pic, VP8_ENC_ERROR_FILE_TOO_BIG);
}
diff --git a/src/3rdparty/libwebp/src/enc/vp8i_enc.h b/src/3rdparty/libwebp/src/enc/vp8i_enc.h
index 24e1944..c9927c4 100644
--- a/src/3rdparty/libwebp/src/enc/vp8i_enc.h
+++ b/src/3rdparty/libwebp/src/enc/vp8i_enc.h
@@ -31,8 +31,8 @@ extern "C" {
// version numbers
#define ENC_MAJ_VERSION 1
-#define ENC_MIN_VERSION 0
-#define ENC_REV_VERSION 3
+#define ENC_MIN_VERSION 3
+#define ENC_REV_VERSION 0
enum { MAX_LF_LEVELS = 64, // Maximum loop filter level
MAX_VARIABLE_LEVEL = 67, // last (inclusive) level with variable cost
@@ -249,7 +249,7 @@ typedef struct {
int percent0_; // saved initial progress percent
DError left_derr_; // left error diffusion (u/v)
- DError *top_derr_; // top diffusion error - NULL if disabled
+ DError* top_derr_; // top diffusion error - NULL if disabled
uint8_t* y_left_; // left luma samples (addressable from index -1 to 15).
uint8_t* u_left_; // left u samples (addressable from index -1 to 7)
@@ -286,8 +286,7 @@ int VP8IteratorNext(VP8EncIterator* const it);
// save the yuv_out_ boundary values to top_/left_ arrays for next iterations.
void VP8IteratorSaveBoundary(VP8EncIterator* const it);
// Report progression based on macroblock rows. Return 0 for user-abort request.
-int VP8IteratorProgress(const VP8EncIterator* const it,
- int final_delta_percent);
+int VP8IteratorProgress(const VP8EncIterator* const it, int delta);
// Intra4x4 iterations
void VP8IteratorStartI4(VP8EncIterator* const it);
// returns true if not done.
@@ -471,7 +470,8 @@ int VP8EncAnalyze(VP8Encoder* const enc);
// Sets up segment's quantization values, base_quant_ and filter strengths.
void VP8SetSegmentParams(VP8Encoder* const enc, float quality);
// Pick best modes and fills the levels. Returns true if skipped.
-int VP8Decimate(VP8EncIterator* const it, VP8ModeScore* const rd,
+int VP8Decimate(VP8EncIterator* WEBP_RESTRICT const it,
+ VP8ModeScore* WEBP_RESTRICT const rd,
VP8RDLevel rd_opt);
// in alpha.c
@@ -491,23 +491,28 @@ int VP8FilterStrengthFromDelta(int sharpness, int delta);
// misc utils for picture_*.c:
+// Returns true if 'picture' is non-NULL and dimensions/colorspace are within
+// their valid ranges. If returning false, the 'error_code' in 'picture' is
+// updated.
+int WebPValidatePicture(const WebPPicture* const picture);
+
// Remove reference to the ARGB/YUVA buffer (doesn't free anything).
void WebPPictureResetBuffers(WebPPicture* const picture);
-// Allocates ARGB buffer of given dimension (previous one is always free'd).
-// Preserves the YUV(A) buffer. Returns false in case of error (invalid param,
-// out-of-memory).
-int WebPPictureAllocARGB(WebPPicture* const picture, int width, int height);
+// Allocates ARGB buffer according to set width/height (previous one is
+// always free'd). Preserves the YUV(A) buffer. Returns false in case of error
+// (invalid param, out-of-memory).
+int WebPPictureAllocARGB(WebPPicture* const picture);
-// Allocates YUVA buffer of given dimension (previous one is always free'd).
-// Uses picture->csp to determine whether an alpha buffer is needed.
+// Allocates YUVA buffer according to set width/height (previous one is always
+// free'd). Uses picture->csp to determine whether an alpha buffer is needed.
// Preserves the ARGB buffer.
// Returns false in case of error (invalid param, out-of-memory).
-int WebPPictureAllocYUVA(WebPPicture* const picture, int width, int height);
+int WebPPictureAllocYUVA(WebPPicture* const picture);
-// Clean-up the RGB samples under fully transparent area, to help lossless
-// compressibility (no guarantee, though). Assumes that pic->use_argb is true.
-void WebPCleanupTransparentAreaLossless(WebPPicture* const pic);
+// Replace samples that are fully transparent by 'color' to help compressibility
+// (no guarantee, though). Assumes pic->use_argb is true.
+void WebPReplaceTransparentPixels(WebPPicture* const pic, uint32_t color);
//------------------------------------------------------------------------------
diff --git a/src/3rdparty/libwebp/src/enc/vp8l_enc.c b/src/3rdparty/libwebp/src/enc/vp8l_enc.c
index 2efd403..0b07e52 100644
--- a/src/3rdparty/libwebp/src/enc/vp8l_enc.c
+++ b/src/3rdparty/libwebp/src/enc/vp8l_enc.c
@@ -15,15 +15,16 @@
#include <assert.h>
#include <stdlib.h>
+#include "src/dsp/lossless.h"
+#include "src/dsp/lossless_common.h"
#include "src/enc/backward_references_enc.h"
#include "src/enc/histogram_enc.h"
#include "src/enc/vp8i_enc.h"
#include "src/enc/vp8li_enc.h"
-#include "src/dsp/lossless.h"
-#include "src/dsp/lossless_common.h"
#include "src/utils/bit_writer_utils.h"
#include "src/utils/huffman_encode_utils.h"
#include "src/utils/utils.h"
+#include "src/webp/encode.h"
#include "src/webp/format_constants.h"
// Maximum number of histogram images (sub-blocks).
@@ -65,25 +66,22 @@ static WEBP_INLINE void SwapColor(uint32_t* const col1, uint32_t* const col2) {
*col2 = tmp;
}
-static void GreedyMinimizeDeltas(uint32_t palette[], int num_colors) {
- // Find greedily always the closest color of the predicted color to minimize
- // deltas in the palette. This reduces storage needs since the
- // palette is stored with delta encoding.
- uint32_t predict = 0x00000000;
- int i, k;
- for (i = 0; i < num_colors; ++i) {
- int best_ix = i;
- uint32_t best_score = ~0U;
- for (k = i; k < num_colors; ++k) {
- const uint32_t cur_score = PaletteColorDistance(palette[k], predict);
- if (best_score > cur_score) {
- best_score = cur_score;
- best_ix = k;
- }
+static WEBP_INLINE int SearchColorNoIdx(const uint32_t sorted[], uint32_t color,
+ int num_colors) {
+ int low = 0, hi = num_colors;
+ if (sorted[low] == color) return low; // loop invariant: sorted[low] != color
+ while (1) {
+ const int mid = (low + hi) >> 1;
+ if (sorted[mid] == color) {
+ return mid;
+ } else if (sorted[mid] < color) {
+ low = mid;
+ } else {
+ hi = mid;
}
- SwapColor(&palette[best_ix], &palette[i]);
- predict = palette[i];
}
+ assert(0);
+ return 0;
}
// The palette has been sorted by alpha. This function checks if the other
@@ -92,7 +90,8 @@ static void GreedyMinimizeDeltas(uint32_t palette[], int num_colors) {
// no benefit to re-organize them greedily. A monotonic development
// would be spotted in green-only situations (like lossy alpha) or gray-scale
// images.
-static int PaletteHasNonMonotonousDeltas(uint32_t palette[], int num_colors) {
+static int PaletteHasNonMonotonousDeltas(const uint32_t* const palette,
+ int num_colors) {
uint32_t predict = 0x000000;
int i;
uint8_t sign_found = 0x00;
@@ -115,28 +114,218 @@ static int PaletteHasNonMonotonousDeltas(uint32_t palette[], int num_colors) {
return (sign_found & (sign_found << 1)) != 0; // two consequent signs.
}
+static void PaletteSortMinimizeDeltas(const uint32_t* const palette_sorted,
+ int num_colors, uint32_t* const palette) {
+ uint32_t predict = 0x00000000;
+ int i, k;
+ memcpy(palette, palette_sorted, num_colors * sizeof(*palette));
+ if (!PaletteHasNonMonotonousDeltas(palette_sorted, num_colors)) return;
+ // Find greedily always the closest color of the predicted color to minimize
+ // deltas in the palette. This reduces storage needs since the
+ // palette is stored with delta encoding.
+ for (i = 0; i < num_colors; ++i) {
+ int best_ix = i;
+ uint32_t best_score = ~0U;
+ for (k = i; k < num_colors; ++k) {
+ const uint32_t cur_score = PaletteColorDistance(palette[k], predict);
+ if (best_score > cur_score) {
+ best_score = cur_score;
+ best_ix = k;
+ }
+ }
+ SwapColor(&palette[best_ix], &palette[i]);
+ predict = palette[i];
+ }
+}
+
+// Sort palette in increasing order and prepare an inverse mapping array.
+static void PrepareMapToPalette(const uint32_t palette[], uint32_t num_colors,
+ uint32_t sorted[], uint32_t idx_map[]) {
+ uint32_t i;
+ memcpy(sorted, palette, num_colors * sizeof(*sorted));
+ qsort(sorted, num_colors, sizeof(*sorted), PaletteCompareColorsForQsort);
+ for (i = 0; i < num_colors; ++i) {
+ idx_map[SearchColorNoIdx(sorted, palette[i], num_colors)] = i;
+ }
+}
+
// -----------------------------------------------------------------------------
-// Palette
+// Modified Zeng method from "A Survey on Palette Reordering
+// Methods for Improving the Compression of Color-Indexed Images" by Armando J.
+// Pinho and Antonio J. R. Neves.
+
+// Finds the biggest cooccurrence in the matrix.
+static void CoOccurrenceFindMax(const uint32_t* const cooccurrence,
+ uint32_t num_colors, uint8_t* const c1,
+ uint8_t* const c2) {
+ // Find the index that is most frequently located adjacent to other
+ // (different) indexes.
+ uint32_t best_sum = 0u;
+ uint32_t i, j, best_cooccurrence;
+ *c1 = 0u;
+ for (i = 0; i < num_colors; ++i) {
+ uint32_t sum = 0;
+ for (j = 0; j < num_colors; ++j) sum += cooccurrence[i * num_colors + j];
+ if (sum > best_sum) {
+ best_sum = sum;
+ *c1 = i;
+ }
+ }
+ // Find the index that is most frequently found adjacent to *c1.
+ *c2 = 0u;
+ best_cooccurrence = 0u;
+ for (i = 0; i < num_colors; ++i) {
+ if (cooccurrence[*c1 * num_colors + i] > best_cooccurrence) {
+ best_cooccurrence = cooccurrence[*c1 * num_colors + i];
+ *c2 = i;
+ }
+ }
+ assert(*c1 != *c2);
+}
-// If number of colors in the image is less than or equal to MAX_PALETTE_SIZE,
-// creates a palette and returns true, else returns false.
-static int AnalyzeAndCreatePalette(const WebPPicture* const pic,
- int low_effort,
- uint32_t palette[MAX_PALETTE_SIZE],
- int* const palette_size) {
- const int num_colors = WebPGetColorPalette(pic, palette);
- if (num_colors > MAX_PALETTE_SIZE) {
- *palette_size = 0;
+// Builds the cooccurrence matrix
+static int CoOccurrenceBuild(const WebPPicture* const pic,
+ const uint32_t* const palette, uint32_t num_colors,
+ uint32_t* cooccurrence) {
+ uint32_t *lines, *line_top, *line_current, *line_tmp;
+ int x, y;
+ const uint32_t* src = pic->argb;
+ uint32_t prev_pix = ~src[0];
+ uint32_t prev_idx = 0u;
+ uint32_t idx_map[MAX_PALETTE_SIZE] = {0};
+ uint32_t palette_sorted[MAX_PALETTE_SIZE];
+ lines = (uint32_t*)WebPSafeMalloc(2 * pic->width, sizeof(*lines));
+ if (lines == NULL) {
+ WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
return 0;
}
- *palette_size = num_colors;
- qsort(palette, num_colors, sizeof(*palette), PaletteCompareColorsForQsort);
- if (!low_effort && PaletteHasNonMonotonousDeltas(palette, num_colors)) {
- GreedyMinimizeDeltas(palette, num_colors);
+ line_top = &lines[0];
+ line_current = &lines[pic->width];
+ PrepareMapToPalette(palette, num_colors, palette_sorted, idx_map);
+ for (y = 0; y < pic->height; ++y) {
+ for (x = 0; x < pic->width; ++x) {
+ const uint32_t pix = src[x];
+ if (pix != prev_pix) {
+ prev_idx = idx_map[SearchColorNoIdx(palette_sorted, pix, num_colors)];
+ prev_pix = pix;
+ }
+ line_current[x] = prev_idx;
+ // 4-connectivity is what works best as mentioned in "On the relation
+ // between Memon's and the modified Zeng's palette reordering methods".
+ if (x > 0 && prev_idx != line_current[x - 1]) {
+ const uint32_t left_idx = line_current[x - 1];
+ ++cooccurrence[prev_idx * num_colors + left_idx];
+ ++cooccurrence[left_idx * num_colors + prev_idx];
+ }
+ if (y > 0 && prev_idx != line_top[x]) {
+ const uint32_t top_idx = line_top[x];
+ ++cooccurrence[prev_idx * num_colors + top_idx];
+ ++cooccurrence[top_idx * num_colors + prev_idx];
+ }
+ }
+ line_tmp = line_top;
+ line_top = line_current;
+ line_current = line_tmp;
+ src += pic->argb_stride;
}
+ WebPSafeFree(lines);
return 1;
}
+struct Sum {
+ uint8_t index;
+ uint32_t sum;
+};
+
+// Implements the modified Zeng method from "A Survey on Palette Reordering
+// Methods for Improving the Compression of Color-Indexed Images" by Armando J.
+// Pinho and Antonio J. R. Neves.
+static int PaletteSortModifiedZeng(
+ const WebPPicture* const pic, const uint32_t* const palette_sorted,
+ uint32_t num_colors, uint32_t* const palette) {
+ uint32_t i, j, ind;
+ uint8_t remapping[MAX_PALETTE_SIZE];
+ uint32_t* cooccurrence;
+ struct Sum sums[MAX_PALETTE_SIZE];
+ uint32_t first, last;
+ uint32_t num_sums;
+ // TODO(vrabaud) check whether one color images should use palette or not.
+ if (num_colors <= 1) return 1;
+ // Build the co-occurrence matrix.
+ cooccurrence =
+ (uint32_t*)WebPSafeCalloc(num_colors * num_colors, sizeof(*cooccurrence));
+ if (cooccurrence == NULL) {
+ WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+ return 0;
+ }
+ if (!CoOccurrenceBuild(pic, palette_sorted, num_colors, cooccurrence)) {
+ return 0;
+ }
+
+ // Initialize the mapping list with the two best indices.
+ CoOccurrenceFindMax(cooccurrence, num_colors, &remapping[0], &remapping[1]);
+
+ // We need to append and prepend to the list of remapping. To this end, we
+ // actually define the next start/end of the list as indices in a vector (with
+ // a wrap around when the end is reached).
+ first = 0;
+ last = 1;
+ num_sums = num_colors - 2; // -2 because we know the first two values
+ if (num_sums > 0) {
+ // Initialize the sums with the first two remappings and find the best one
+ struct Sum* best_sum = &sums[0];
+ best_sum->index = 0u;
+ best_sum->sum = 0u;
+ for (i = 0, j = 0; i < num_colors; ++i) {
+ if (i == remapping[0] || i == remapping[1]) continue;
+ sums[j].index = i;
+ sums[j].sum = cooccurrence[i * num_colors + remapping[0]] +
+ cooccurrence[i * num_colors + remapping[1]];
+ if (sums[j].sum > best_sum->sum) best_sum = &sums[j];
+ ++j;
+ }
+
+ while (num_sums > 0) {
+ const uint8_t best_index = best_sum->index;
+ // Compute delta to know if we need to prepend or append the best index.
+ int32_t delta = 0;
+ const int32_t n = num_colors - num_sums;
+ for (ind = first, j = 0; (ind + j) % num_colors != last + 1; ++j) {
+ const uint16_t l_j = remapping[(ind + j) % num_colors];
+ delta += (n - 1 - 2 * (int32_t)j) *
+ (int32_t)cooccurrence[best_index * num_colors + l_j];
+ }
+ if (delta > 0) {
+ first = (first == 0) ? num_colors - 1 : first - 1;
+ remapping[first] = best_index;
+ } else {
+ ++last;
+ remapping[last] = best_index;
+ }
+ // Remove best_sum from sums.
+ *best_sum = sums[num_sums - 1];
+ --num_sums;
+ // Update all the sums and find the best one.
+ best_sum = &sums[0];
+ for (i = 0; i < num_sums; ++i) {
+ sums[i].sum += cooccurrence[best_index * num_colors + sums[i].index];
+ if (sums[i].sum > best_sum->sum) best_sum = &sums[i];
+ }
+ }
+ }
+ assert((last + 1) % num_colors == first);
+ WebPSafeFree(cooccurrence);
+
+ // Re-map the palette.
+ for (i = 0; i < num_colors; ++i) {
+ palette[i] = palette_sorted[remapping[(first + i) % num_colors]];
+ }
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+// Palette
+
// These five modes are evaluated and their respective entropy is computed.
typedef enum {
kDirect = 0,
@@ -144,10 +333,18 @@ typedef enum {
kSubGreen = 2,
kSpatialSubGreen = 3,
kPalette = 4,
- kNumEntropyIx = 5
+ kPaletteAndSpatial = 5,
+ kNumEntropyIx = 6
} EntropyIx;
typedef enum {
+ kSortedDefault = 0,
+ kMinimizeDelta = 1,
+ kModifiedZeng = 2,
+ kUnusedPalette = 3,
+} PaletteSorting;
+
+typedef enum {
kHistoAlpha = 0,
kHistoAlphaPred,
kHistoGreen,
@@ -164,10 +361,11 @@ typedef enum {
kHistoTotal // Must be last.
} HistoIx;
-static void AddSingleSubGreen(int p, uint32_t* const r, uint32_t* const b) {
- const int green = p >> 8; // The upper bits are masked away later.
- ++r[((p >> 16) - green) & 0xff];
- ++b[((p >> 0) - green) & 0xff];
+static void AddSingleSubGreen(uint32_t p,
+ uint32_t* const r, uint32_t* const b) {
+ const int green = (int)p >> 8; // The upper bits are masked away later.
+ ++r[(((int)p >> 16) - green) & 0xff];
+ ++b[(((int)p >> 0) - green) & 0xff];
}
static void AddSingle(uint32_t p,
@@ -241,8 +439,8 @@ static int AnalyzeEntropy(const uint32_t* argb,
curr_row += argb_stride;
}
{
- double entropy_comp[kHistoTotal];
- double entropy[kNumEntropyIx];
+ float entropy_comp[kHistoTotal];
+ float entropy[kNumEntropyIx];
int k;
int last_mode_to_analyze = use_palette ? kPalette : kSpatialSubGreen;
int j;
@@ -354,14 +552,21 @@ static int GetTransformBits(int method, int histo_bits) {
}
// Set of parameters to be used in each iteration of the cruncher.
-#define CRUNCH_CONFIGS_LZ77_MAX 2
+#define CRUNCH_SUBCONFIGS_MAX 2
+typedef struct {
+ int lz77_;
+ int do_no_cache_;
+} CrunchSubConfig;
typedef struct {
int entropy_idx_;
- int lz77s_types_to_try_[CRUNCH_CONFIGS_LZ77_MAX];
- int lz77s_types_to_try_size_;
+ PaletteSorting palette_sorting_type_;
+ CrunchSubConfig sub_configs_[CRUNCH_SUBCONFIGS_MAX];
+ int sub_configs_size_;
} CrunchConfig;
-#define CRUNCH_CONFIGS_MAX kNumEntropyIx
+// +2 because we add a palette sorting configuration for kPalette and
+// kPaletteAndSpatial.
+#define CRUNCH_CONFIGS_MAX (kNumEntropyIx + 2)
static int EncoderAnalyze(VP8LEncoder* const enc,
CrunchConfig crunch_configs[CRUNCH_CONFIGS_MAX],
@@ -376,11 +581,20 @@ static int EncoderAnalyze(VP8LEncoder* const enc,
int i;
int use_palette;
int n_lz77s;
+ // If set to 0, analyze the cache with the computed cache value. If 1, also
+ // analyze with no-cache.
+ int do_no_cache = 0;
assert(pic != NULL && pic->argb != NULL);
- use_palette =
- AnalyzeAndCreatePalette(pic, low_effort,
- enc->palette_, &enc->palette_size_);
+ // Check whether a palette is possible.
+ enc->palette_size_ = WebPGetColorPalette(pic, enc->palette_sorted_);
+ use_palette = (enc->palette_size_ <= MAX_PALETTE_SIZE);
+ if (!use_palette) {
+ enc->palette_size_ = 0;
+ } else {
+ qsort(enc->palette_sorted_, enc->palette_size_,
+ sizeof(*enc->palette_sorted_), PaletteCompareColorsForQsort);
+ }
// Empirical bit sizes.
enc->histo_bits_ = GetHistoBits(method, use_palette,
@@ -390,6 +604,8 @@ static int EncoderAnalyze(VP8LEncoder* const enc,
if (low_effort) {
// AnalyzeEntropy is somewhat slow.
crunch_configs[0].entropy_idx_ = use_palette ? kPalette : kSpatialSubGreen;
+ crunch_configs[0].palette_sorting_type_ =
+ use_palette ? kSortedDefault : kUnusedPalette;
n_lz77s = 1;
*crunch_configs_size = 1;
} else {
@@ -402,29 +618,59 @@ static int EncoderAnalyze(VP8LEncoder* const enc,
return 0;
}
if (method == 6 && config->quality == 100) {
+ do_no_cache = 1;
// Go brute force on all transforms.
*crunch_configs_size = 0;
for (i = 0; i < kNumEntropyIx; ++i) {
- if (i != kPalette || use_palette) {
+ // We can only apply kPalette or kPaletteAndSpatial if we can indeed use
+ // a palette.
+ if ((i != kPalette && i != kPaletteAndSpatial) || use_palette) {
assert(*crunch_configs_size < CRUNCH_CONFIGS_MAX);
- crunch_configs[(*crunch_configs_size)++].entropy_idx_ = i;
+ crunch_configs[(*crunch_configs_size)].entropy_idx_ = i;
+ if (use_palette && (i == kPalette || i == kPaletteAndSpatial)) {
+ crunch_configs[(*crunch_configs_size)].palette_sorting_type_ =
+ kMinimizeDelta;
+ ++*crunch_configs_size;
+ // Also add modified Zeng's method.
+ crunch_configs[(*crunch_configs_size)].entropy_idx_ = i;
+ crunch_configs[(*crunch_configs_size)].palette_sorting_type_ =
+ kModifiedZeng;
+ } else {
+ crunch_configs[(*crunch_configs_size)].palette_sorting_type_ =
+ kUnusedPalette;
+ }
+ ++*crunch_configs_size;
}
}
} else {
// Only choose the guessed best transform.
*crunch_configs_size = 1;
crunch_configs[0].entropy_idx_ = min_entropy_ix;
+ crunch_configs[0].palette_sorting_type_ =
+ use_palette ? kMinimizeDelta : kUnusedPalette;
+ if (config->quality >= 75 && method == 5) {
+ // Test with and without color cache.
+ do_no_cache = 1;
+ // If we have a palette, also check in combination with spatial.
+ if (min_entropy_ix == kPalette) {
+ *crunch_configs_size = 2;
+ crunch_configs[1].entropy_idx_ = kPaletteAndSpatial;
+ crunch_configs[1].palette_sorting_type_ = kMinimizeDelta;
+ }
+ }
}
}
// Fill in the different LZ77s.
- assert(n_lz77s <= CRUNCH_CONFIGS_LZ77_MAX);
+ assert(n_lz77s <= CRUNCH_SUBCONFIGS_MAX);
for (i = 0; i < *crunch_configs_size; ++i) {
int j;
for (j = 0; j < n_lz77s; ++j) {
- crunch_configs[i].lz77s_types_to_try_[j] =
+ assert(j < CRUNCH_SUBCONFIGS_MAX);
+ crunch_configs[i].sub_configs_[j].lz77_ =
(j == 0) ? kLZ77Standard | kLZ77RLE : kLZ77Box;
+ crunch_configs[i].sub_configs_[j].do_no_cache_ = do_no_cache;
}
- crunch_configs[i].lz77s_types_to_try_size_ = n_lz77s;
+ crunch_configs[i].sub_configs_size_ = n_lz77s;
}
return 1;
}
@@ -440,7 +686,7 @@ static int EncoderInit(VP8LEncoder* const enc) {
int i;
if (!VP8LHashChainInit(&enc->hash_chain_, pix_cnt)) return 0;
- for (i = 0; i < 3; ++i) VP8LBackwardRefsInit(&enc->refs_[i], refs_block_size);
+ for (i = 0; i < 4; ++i) VP8LBackwardRefsInit(&enc->refs_[i], refs_block_size);
return 1;
}
@@ -708,11 +954,11 @@ static WEBP_INLINE void WriteHuffmanCodeWithExtraBits(
VP8LPutBits(bw, (bits << depth) | symbol, depth + n_bits);
}
-static WebPEncodingError StoreImageToBitMask(
+static int StoreImageToBitMask(
VP8LBitWriter* const bw, int width, int histo_bits,
const VP8LBackwardRefs* const refs,
const uint16_t* histogram_symbols,
- const HuffmanTreeCode* const huffman_codes) {
+ const HuffmanTreeCode* const huffman_codes, const WebPPicture* const pic) {
const int histo_xsize = histo_bits ? VP8LSubSampleSize(width, histo_bits) : 1;
const int tile_mask = (histo_bits == 0) ? 0 : -(1 << histo_bits);
// x and y trace the position in the image.
@@ -765,49 +1011,53 @@ static WebPEncodingError StoreImageToBitMask(
}
VP8LRefsCursorNext(&c);
}
- return bw->error_ ? VP8_ENC_ERROR_OUT_OF_MEMORY : VP8_ENC_OK;
+ if (bw->error_) {
+ WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+ return 0;
+ }
+ return 1;
}
-// Special case of EncodeImageInternal() for cache-bits=0, histo_bits=31
-static WebPEncodingError EncodeImageNoHuffman(VP8LBitWriter* const bw,
- const uint32_t* const argb,
- VP8LHashChain* const hash_chain,
- VP8LBackwardRefs* const refs_tmp1,
- VP8LBackwardRefs* const refs_tmp2,
- int width, int height,
- int quality, int low_effort) {
+// Special case of EncodeImageInternal() for cache-bits=0, histo_bits=31.
+// pic and percent are for progress.
+static int EncodeImageNoHuffman(VP8LBitWriter* const bw,
+ const uint32_t* const argb,
+ VP8LHashChain* const hash_chain,
+ VP8LBackwardRefs* const refs_array, int width,
+ int height, int quality, int low_effort,
+ const WebPPicture* const pic, int percent_range,
+ int* const percent) {
int i;
int max_tokens = 0;
- WebPEncodingError err = VP8_ENC_OK;
VP8LBackwardRefs* refs;
HuffmanTreeToken* tokens = NULL;
- HuffmanTreeCode huffman_codes[5] = { { 0, NULL, NULL } };
- const uint16_t histogram_symbols[1] = { 0 }; // only one tree, one symbol
+ HuffmanTreeCode huffman_codes[5] = {{0, NULL, NULL}};
+ const uint16_t histogram_symbols[1] = {0}; // only one tree, one symbol
int cache_bits = 0;
VP8LHistogramSet* histogram_image = NULL;
HuffmanTree* const huff_tree = (HuffmanTree*)WebPSafeMalloc(
- 3ULL * CODE_LENGTH_CODES, sizeof(*huff_tree));
+ 3ULL * CODE_LENGTH_CODES, sizeof(*huff_tree));
if (huff_tree == NULL) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+ WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
goto Error;
}
// Calculate backward references from ARGB image.
- if (!VP8LHashChainFill(hash_chain, quality, argb, width, height,
- low_effort)) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+ if (!VP8LHashChainFill(hash_chain, quality, argb, width, height, low_effort,
+ pic, percent_range / 2, percent)) {
goto Error;
}
- refs = VP8LGetBackwardReferences(width, height, argb, quality, 0,
- kLZ77Standard | kLZ77RLE, &cache_bits,
- hash_chain, refs_tmp1, refs_tmp2);
- if (refs == NULL) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+ if (!VP8LGetBackwardReferences(width, height, argb, quality, /*low_effort=*/0,
+ kLZ77Standard | kLZ77RLE, cache_bits,
+ /*do_no_cache=*/0, hash_chain, refs_array,
+ &cache_bits, pic,
+ percent_range - percent_range / 2, percent)) {
goto Error;
}
+ refs = &refs_array[0];
histogram_image = VP8LAllocateHistogramSet(1, cache_bits);
if (histogram_image == NULL) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+ WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
goto Error;
}
VP8LHistogramSetClear(histogram_image);
@@ -818,7 +1068,7 @@ static WebPEncodingError EncodeImageNoHuffman(VP8LBitWriter* const bw,
// Create Huffman bit lengths and codes for each histogram image.
assert(histogram_image->size == 1);
if (!GetHuffBitLengthsAndCodes(histogram_image, huffman_codes)) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+ WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
goto Error;
}
@@ -835,7 +1085,7 @@ static WebPEncodingError EncodeImageNoHuffman(VP8LBitWriter* const bw,
tokens = (HuffmanTreeToken*)WebPSafeMalloc(max_tokens, sizeof(*tokens));
if (tokens == NULL) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+ WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
goto Error;
}
@@ -847,27 +1097,32 @@ static WebPEncodingError EncodeImageNoHuffman(VP8LBitWriter* const bw,
}
// Store actual literals.
- err = StoreImageToBitMask(bw, width, 0, refs, histogram_symbols,
- huffman_codes);
+ if (!StoreImageToBitMask(bw, width, 0, refs, histogram_symbols, huffman_codes,
+ pic)) {
+ goto Error;
+ }
Error:
WebPSafeFree(tokens);
WebPSafeFree(huff_tree);
VP8LFreeHistogramSet(histogram_image);
WebPSafeFree(huffman_codes[0].codes);
- return err;
+ return (pic->error_code == VP8_ENC_OK);
}
-static WebPEncodingError EncodeImageInternal(
+// pic and percent are for progress.
+static int EncodeImageInternal(
VP8LBitWriter* const bw, const uint32_t* const argb,
- VP8LHashChain* const hash_chain, VP8LBackwardRefs refs_array[3], int width,
+ VP8LHashChain* const hash_chain, VP8LBackwardRefs refs_array[4], int width,
int height, int quality, int low_effort, int use_cache,
const CrunchConfig* const config, int* cache_bits, int histogram_bits,
- size_t init_byte_position, int* const hdr_size, int* const data_size) {
- WebPEncodingError err = VP8_ENC_OK;
+ size_t init_byte_position, int* const hdr_size, int* const data_size,
+ const WebPPicture* const pic, int percent_range, int* const percent) {
const uint32_t histogram_image_xysize =
VP8LSubSampleSize(width, histogram_bits) *
VP8LSubSampleSize(height, histogram_bits);
+ int remaining_percent = percent_range;
+ int percent_start = *percent;
VP8LHistogramSet* histogram_image = NULL;
VP8LHistogram* tmp_histo = NULL;
int histogram_image_size = 0;
@@ -876,112 +1131,135 @@ static WebPEncodingError EncodeImageInternal(
3ULL * CODE_LENGTH_CODES, sizeof(*huff_tree));
HuffmanTreeToken* tokens = NULL;
HuffmanTreeCode* huffman_codes = NULL;
- VP8LBackwardRefs* refs_best;
- VP8LBackwardRefs* refs_tmp;
- uint16_t* const histogram_symbols =
- (uint16_t*)WebPSafeMalloc(histogram_image_xysize,
- sizeof(*histogram_symbols));
- int lz77s_idx;
+ uint16_t* const histogram_symbols = (uint16_t*)WebPSafeMalloc(
+ histogram_image_xysize, sizeof(*histogram_symbols));
+ int sub_configs_idx;
+ int cache_bits_init, write_histogram_image;
VP8LBitWriter bw_init = *bw, bw_best;
int hdr_size_tmp;
+ VP8LHashChain hash_chain_histogram; // histogram image hash chain
+ size_t bw_size_best = ~(size_t)0;
assert(histogram_bits >= MIN_HUFFMAN_BITS);
assert(histogram_bits <= MAX_HUFFMAN_BITS);
assert(hdr_size != NULL);
assert(data_size != NULL);
- if (histogram_symbols == NULL) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+ memset(&hash_chain_histogram, 0, sizeof(hash_chain_histogram));
+ if (!VP8LBitWriterInit(&bw_best, 0)) {
+ WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+ goto Error;
+ }
+
+ // Make sure we can allocate the different objects.
+ if (huff_tree == NULL || histogram_symbols == NULL ||
+ !VP8LHashChainInit(&hash_chain_histogram, histogram_image_xysize)) {
+ WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
goto Error;
}
+ percent_range = remaining_percent / 5;
+ if (!VP8LHashChainFill(hash_chain, quality, argb, width, height,
+ low_effort, pic, percent_range, percent)) {
+ goto Error;
+ }
+ percent_start += percent_range;
+ remaining_percent -= percent_range;
+
if (use_cache) {
// If the value is different from zero, it has been set during the
// palette analysis.
- if (*cache_bits == 0) *cache_bits = MAX_COLOR_CACHE_BITS;
+ cache_bits_init = (*cache_bits == 0) ? MAX_COLOR_CACHE_BITS : *cache_bits;
} else {
- *cache_bits = 0;
+ cache_bits_init = 0;
}
- // 'best_refs' is the reference to the best backward refs and points to one
- // of refs_array[0] or refs_array[1].
- // Calculate backward references from ARGB image.
- if (huff_tree == NULL ||
- !VP8LHashChainFill(hash_chain, quality, argb, width, height,
- low_effort) ||
- !VP8LBitWriterInit(&bw_best, 0) ||
- (config->lz77s_types_to_try_size_ > 1 &&
- !VP8LBitWriterClone(bw, &bw_best))) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+ // If several iterations will happen, clone into bw_best.
+ if ((config->sub_configs_size_ > 1 || config->sub_configs_[0].do_no_cache_) &&
+ !VP8LBitWriterClone(bw, &bw_best)) {
+ WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
goto Error;
}
- for (lz77s_idx = 0; lz77s_idx < config->lz77s_types_to_try_size_;
- ++lz77s_idx) {
- refs_best = VP8LGetBackwardReferences(
- width, height, argb, quality, low_effort,
- config->lz77s_types_to_try_[lz77s_idx], cache_bits, hash_chain,
- &refs_array[0], &refs_array[1]);
- if (refs_best == NULL) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
- goto Error;
- }
- // Keep the best references aside and use the other element from the first
- // two as a temporary for later usage.
- refs_tmp = &refs_array[refs_best == &refs_array[0] ? 1 : 0];
-
- histogram_image =
- VP8LAllocateHistogramSet(histogram_image_xysize, *cache_bits);
- tmp_histo = VP8LAllocateHistogram(*cache_bits);
- if (histogram_image == NULL || tmp_histo == NULL) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
- goto Error;
- }
- // Build histogram image and symbols from backward references.
- if (!VP8LGetHistoImageSymbols(width, height, refs_best, quality, low_effort,
- histogram_bits, *cache_bits, histogram_image,
- tmp_histo, histogram_symbols)) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
- goto Error;
- }
- // Create Huffman bit lengths and codes for each histogram image.
- histogram_image_size = histogram_image->size;
- bit_array_size = 5 * histogram_image_size;
- huffman_codes = (HuffmanTreeCode*)WebPSafeCalloc(bit_array_size,
- sizeof(*huffman_codes));
- // Note: some histogram_image entries may point to tmp_histos[], so the
- // latter need to outlive the following call to GetHuffBitLengthsAndCodes().
- if (huffman_codes == NULL ||
- !GetHuffBitLengthsAndCodes(histogram_image, huffman_codes)) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+ for (sub_configs_idx = 0; sub_configs_idx < config->sub_configs_size_;
+ ++sub_configs_idx) {
+ const CrunchSubConfig* const sub_config =
+ &config->sub_configs_[sub_configs_idx];
+ int cache_bits_best, i_cache;
+ int i_remaining_percent = remaining_percent / config->sub_configs_size_;
+ int i_percent_range = i_remaining_percent / 4;
+ i_remaining_percent -= i_percent_range;
+
+ if (!VP8LGetBackwardReferences(
+ width, height, argb, quality, low_effort, sub_config->lz77_,
+ cache_bits_init, sub_config->do_no_cache_, hash_chain,
+ &refs_array[0], &cache_bits_best, pic, i_percent_range, percent)) {
goto Error;
}
- // Free combined histograms.
- VP8LFreeHistogramSet(histogram_image);
- histogram_image = NULL;
- // Free scratch histograms.
- VP8LFreeHistogram(tmp_histo);
- tmp_histo = NULL;
+ for (i_cache = 0; i_cache < (sub_config->do_no_cache_ ? 2 : 1); ++i_cache) {
+ const int cache_bits_tmp = (i_cache == 0) ? cache_bits_best : 0;
+ // Speed-up: no need to study the no-cache case if it was already studied
+ // in i_cache == 0.
+ if (i_cache == 1 && cache_bits_best == 0) break;
+
+ // Reset the bit writer for this iteration.
+ VP8LBitWriterReset(&bw_init, bw);
+
+ // Build histogram image and symbols from backward references.
+ histogram_image =
+ VP8LAllocateHistogramSet(histogram_image_xysize, cache_bits_tmp);
+ tmp_histo = VP8LAllocateHistogram(cache_bits_tmp);
+ if (histogram_image == NULL || tmp_histo == NULL) {
+ WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+ goto Error;
+ }
- // Color Cache parameters.
- if (*cache_bits > 0) {
- VP8LPutBits(bw, 1, 1);
- VP8LPutBits(bw, *cache_bits, 4);
- } else {
- VP8LPutBits(bw, 0, 1);
- }
+ i_percent_range = i_remaining_percent / 3;
+ i_remaining_percent -= i_percent_range;
+ if (!VP8LGetHistoImageSymbols(
+ width, height, &refs_array[i_cache], quality, low_effort,
+ histogram_bits, cache_bits_tmp, histogram_image, tmp_histo,
+ histogram_symbols, pic, i_percent_range, percent)) {
+ goto Error;
+ }
+ // Create Huffman bit lengths and codes for each histogram image.
+ histogram_image_size = histogram_image->size;
+ bit_array_size = 5 * histogram_image_size;
+ huffman_codes = (HuffmanTreeCode*)WebPSafeCalloc(bit_array_size,
+ sizeof(*huffman_codes));
+ // Note: some histogram_image entries may point to tmp_histos[], so the
+ // latter need to outlive the following call to
+ // GetHuffBitLengthsAndCodes().
+ if (huffman_codes == NULL ||
+ !GetHuffBitLengthsAndCodes(histogram_image, huffman_codes)) {
+ WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+ goto Error;
+ }
+ // Free combined histograms.
+ VP8LFreeHistogramSet(histogram_image);
+ histogram_image = NULL;
+
+ // Free scratch histograms.
+ VP8LFreeHistogram(tmp_histo);
+ tmp_histo = NULL;
+
+ // Color Cache parameters.
+ if (cache_bits_tmp > 0) {
+ VP8LPutBits(bw, 1, 1);
+ VP8LPutBits(bw, cache_bits_tmp, 4);
+ } else {
+ VP8LPutBits(bw, 0, 1);
+ }
- // Huffman image + meta huffman.
- {
- const int write_histogram_image = (histogram_image_size > 1);
+ // Huffman image + meta huffman.
+ write_histogram_image = (histogram_image_size > 1);
VP8LPutBits(bw, write_histogram_image, 1);
if (write_histogram_image) {
- uint32_t* const histogram_argb =
- (uint32_t*)WebPSafeMalloc(histogram_image_xysize,
- sizeof(*histogram_argb));
+ uint32_t* const histogram_argb = (uint32_t*)WebPSafeMalloc(
+ histogram_image_xysize, sizeof(*histogram_argb));
int max_index = 0;
uint32_t i;
if (histogram_argb == NULL) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+ WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
goto Error;
}
for (i = 0; i < histogram_image_xysize; ++i) {
@@ -994,73 +1272,81 @@ static WebPEncodingError EncodeImageInternal(
histogram_image_size = max_index;
VP8LPutBits(bw, histogram_bits - 2, 3);
- err = EncodeImageNoHuffman(
- bw, histogram_argb, hash_chain, refs_tmp, &refs_array[2],
- VP8LSubSampleSize(width, histogram_bits),
- VP8LSubSampleSize(height, histogram_bits), quality, low_effort);
+ i_percent_range = i_remaining_percent / 2;
+ i_remaining_percent -= i_percent_range;
+ if (!EncodeImageNoHuffman(
+ bw, histogram_argb, &hash_chain_histogram, &refs_array[2],
+ VP8LSubSampleSize(width, histogram_bits),
+ VP8LSubSampleSize(height, histogram_bits), quality, low_effort,
+ pic, i_percent_range, percent)) {
+ WebPSafeFree(histogram_argb);
+ goto Error;
+ }
WebPSafeFree(histogram_argb);
- if (err != VP8_ENC_OK) goto Error;
}
- }
- // Store Huffman codes.
- {
- int i;
- int max_tokens = 0;
- // Find maximum number of symbols for the huffman tree-set.
- for (i = 0; i < 5 * histogram_image_size; ++i) {
- HuffmanTreeCode* const codes = &huffman_codes[i];
- if (max_tokens < codes->num_symbols) {
- max_tokens = codes->num_symbols;
+ // Store Huffman codes.
+ {
+ int i;
+ int max_tokens = 0;
+ // Find maximum number of symbols for the huffman tree-set.
+ for (i = 0; i < 5 * histogram_image_size; ++i) {
+ HuffmanTreeCode* const codes = &huffman_codes[i];
+ if (max_tokens < codes->num_symbols) {
+ max_tokens = codes->num_symbols;
+ }
+ }
+ tokens = (HuffmanTreeToken*)WebPSafeMalloc(max_tokens, sizeof(*tokens));
+ if (tokens == NULL) goto Error;
+ for (i = 0; i < 5 * histogram_image_size; ++i) {
+ HuffmanTreeCode* const codes = &huffman_codes[i];
+ StoreHuffmanCode(bw, huff_tree, tokens, codes);
+ ClearHuffmanTreeIfOnlyOneSymbol(codes);
}
}
- tokens = (HuffmanTreeToken*)WebPSafeMalloc(max_tokens, sizeof(*tokens));
- if (tokens == NULL) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+ // Store actual literals.
+ hdr_size_tmp = (int)(VP8LBitWriterNumBytes(bw) - init_byte_position);
+ if (!StoreImageToBitMask(bw, width, histogram_bits, &refs_array[i_cache],
+ histogram_symbols, huffman_codes, pic)) {
goto Error;
}
- for (i = 0; i < 5 * histogram_image_size; ++i) {
- HuffmanTreeCode* const codes = &huffman_codes[i];
- StoreHuffmanCode(bw, huff_tree, tokens, codes);
- ClearHuffmanTreeIfOnlyOneSymbol(codes);
+ // Keep track of the smallest image so far.
+ if (VP8LBitWriterNumBytes(bw) < bw_size_best) {
+ bw_size_best = VP8LBitWriterNumBytes(bw);
+ *cache_bits = cache_bits_tmp;
+ *hdr_size = hdr_size_tmp;
+ *data_size =
+ (int)(VP8LBitWriterNumBytes(bw) - init_byte_position - *hdr_size);
+ VP8LBitWriterSwap(bw, &bw_best);
+ }
+ WebPSafeFree(tokens);
+ tokens = NULL;
+ if (huffman_codes != NULL) {
+ WebPSafeFree(huffman_codes->codes);
+ WebPSafeFree(huffman_codes);
+ huffman_codes = NULL;
}
- }
- // Store actual literals.
- hdr_size_tmp = (int)(VP8LBitWriterNumBytes(bw) - init_byte_position);
- err = StoreImageToBitMask(bw, width, histogram_bits, refs_best,
- histogram_symbols, huffman_codes);
- // Keep track of the smallest image so far.
- if (lz77s_idx == 0 ||
- VP8LBitWriterNumBytes(bw) < VP8LBitWriterNumBytes(&bw_best)) {
- *hdr_size = hdr_size_tmp;
- *data_size =
- (int)(VP8LBitWriterNumBytes(bw) - init_byte_position - *hdr_size);
- VP8LBitWriterSwap(bw, &bw_best);
- }
- // Reset the bit writer for the following iteration if any.
- if (config->lz77s_types_to_try_size_ > 1) VP8LBitWriterReset(&bw_init, bw);
- WebPSafeFree(tokens);
- tokens = NULL;
- if (huffman_codes != NULL) {
- WebPSafeFree(huffman_codes->codes);
- WebPSafeFree(huffman_codes);
- huffman_codes = NULL;
}
}
VP8LBitWriterSwap(bw, &bw_best);
+ if (!WebPReportProgress(pic, percent_start + remaining_percent, percent)) {
+ goto Error;
+ }
+
Error:
WebPSafeFree(tokens);
WebPSafeFree(huff_tree);
VP8LFreeHistogramSet(histogram_image);
VP8LFreeHistogram(tmp_histo);
+ VP8LHashChainClear(&hash_chain_histogram);
if (huffman_codes != NULL) {
WebPSafeFree(huffman_codes->codes);
WebPSafeFree(huffman_codes);
}
WebPSafeFree(histogram_symbols);
VP8LBitWriterWipeOut(&bw_best);
- return err;
+ return (pic->error_code == VP8_ENC_OK);
}
// -----------------------------------------------------------------------------
@@ -1069,72 +1355,73 @@ static WebPEncodingError EncodeImageInternal(
static void ApplySubtractGreen(VP8LEncoder* const enc, int width, int height,
VP8LBitWriter* const bw) {
VP8LPutBits(bw, TRANSFORM_PRESENT, 1);
- VP8LPutBits(bw, SUBTRACT_GREEN, 2);
+ VP8LPutBits(bw, SUBTRACT_GREEN_TRANSFORM, 2);
VP8LSubtractGreenFromBlueAndRed(enc->argb_, width * height);
}
-static WebPEncodingError ApplyPredictFilter(const VP8LEncoder* const enc,
- int width, int height,
- int quality, int low_effort,
- int used_subtract_green,
- VP8LBitWriter* const bw) {
+static int ApplyPredictFilter(const VP8LEncoder* const enc, int width,
+ int height, int quality, int low_effort,
+ int used_subtract_green, VP8LBitWriter* const bw,
+ int percent_range, int* const percent) {
const int pred_bits = enc->transform_bits_;
const int transform_width = VP8LSubSampleSize(width, pred_bits);
const int transform_height = VP8LSubSampleSize(height, pred_bits);
// we disable near-lossless quantization if palette is used.
- const int near_lossless_strength = enc->use_palette_ ? 100
- : enc->config_->near_lossless;
+ const int near_lossless_strength =
+ enc->use_palette_ ? 100 : enc->config_->near_lossless;
- VP8LResidualImage(width, height, pred_bits, low_effort, enc->argb_,
- enc->argb_scratch_, enc->transform_data_,
- near_lossless_strength, enc->config_->exact,
- used_subtract_green);
+ if (!VP8LResidualImage(
+ width, height, pred_bits, low_effort, enc->argb_, enc->argb_scratch_,
+ enc->transform_data_, near_lossless_strength, enc->config_->exact,
+ used_subtract_green, enc->pic_, percent_range / 2, percent)) {
+ return 0;
+ }
VP8LPutBits(bw, TRANSFORM_PRESENT, 1);
VP8LPutBits(bw, PREDICTOR_TRANSFORM, 2);
assert(pred_bits >= 2);
VP8LPutBits(bw, pred_bits - 2, 3);
return EncodeImageNoHuffman(
bw, enc->transform_data_, (VP8LHashChain*)&enc->hash_chain_,
- (VP8LBackwardRefs*)&enc->refs_[0], // cast const away
- (VP8LBackwardRefs*)&enc->refs_[1], transform_width, transform_height,
- quality, low_effort);
+ (VP8LBackwardRefs*)&enc->refs_[0], transform_width, transform_height,
+ quality, low_effort, enc->pic_, percent_range - percent_range / 2,
+ percent);
}
-static WebPEncodingError ApplyCrossColorFilter(const VP8LEncoder* const enc,
- int width, int height,
- int quality, int low_effort,
- VP8LBitWriter* const bw) {
+static int ApplyCrossColorFilter(const VP8LEncoder* const enc, int width,
+ int height, int quality, int low_effort,
+ VP8LBitWriter* const bw, int percent_range,
+ int* const percent) {
const int ccolor_transform_bits = enc->transform_bits_;
const int transform_width = VP8LSubSampleSize(width, ccolor_transform_bits);
const int transform_height = VP8LSubSampleSize(height, ccolor_transform_bits);
- VP8LColorSpaceTransform(width, height, ccolor_transform_bits, quality,
- enc->argb_, enc->transform_data_);
+ if (!VP8LColorSpaceTransform(width, height, ccolor_transform_bits, quality,
+ enc->argb_, enc->transform_data_, enc->pic_,
+ percent_range / 2, percent)) {
+ return 0;
+ }
VP8LPutBits(bw, TRANSFORM_PRESENT, 1);
VP8LPutBits(bw, CROSS_COLOR_TRANSFORM, 2);
assert(ccolor_transform_bits >= 2);
VP8LPutBits(bw, ccolor_transform_bits - 2, 3);
return EncodeImageNoHuffman(
bw, enc->transform_data_, (VP8LHashChain*)&enc->hash_chain_,
- (VP8LBackwardRefs*)&enc->refs_[0], // cast const away
- (VP8LBackwardRefs*)&enc->refs_[1], transform_width, transform_height,
- quality, low_effort);
+ (VP8LBackwardRefs*)&enc->refs_[0], transform_width, transform_height,
+ quality, low_effort, enc->pic_, percent_range - percent_range / 2,
+ percent);
}
// -----------------------------------------------------------------------------
-static WebPEncodingError WriteRiffHeader(const WebPPicture* const pic,
- size_t riff_size, size_t vp8l_size) {
+static int WriteRiffHeader(const WebPPicture* const pic, size_t riff_size,
+ size_t vp8l_size) {
uint8_t riff[RIFF_HEADER_SIZE + CHUNK_HEADER_SIZE + VP8L_SIGNATURE_SIZE] = {
'R', 'I', 'F', 'F', 0, 0, 0, 0, 'W', 'E', 'B', 'P',
'V', 'P', '8', 'L', 0, 0, 0, 0, VP8L_MAGIC_BYTE,
};
PutLE32(riff + TAG_SIZE, (uint32_t)riff_size);
PutLE32(riff + RIFF_HEADER_SIZE + TAG_SIZE, (uint32_t)vp8l_size);
- if (!pic->writer(riff, sizeof(riff), pic)) {
- return VP8_ENC_ERROR_BAD_WRITE;
- }
- return VP8_ENC_OK;
+ return pic->writer(riff, sizeof(riff), pic);
}
static int WriteImageSize(const WebPPicture* const pic,
@@ -1154,36 +1441,29 @@ static int WriteRealAlphaAndVersion(VP8LBitWriter* const bw, int has_alpha) {
return !bw->error_;
}
-static WebPEncodingError WriteImage(const WebPPicture* const pic,
- VP8LBitWriter* const bw,
- size_t* const coded_size) {
- WebPEncodingError err = VP8_ENC_OK;
+static int WriteImage(const WebPPicture* const pic, VP8LBitWriter* const bw,
+ size_t* const coded_size) {
const uint8_t* const webpll_data = VP8LBitWriterFinish(bw);
const size_t webpll_size = VP8LBitWriterNumBytes(bw);
const size_t vp8l_size = VP8L_SIGNATURE_SIZE + webpll_size;
const size_t pad = vp8l_size & 1;
const size_t riff_size = TAG_SIZE + CHUNK_HEADER_SIZE + vp8l_size + pad;
- err = WriteRiffHeader(pic, riff_size, vp8l_size);
- if (err != VP8_ENC_OK) goto Error;
-
- if (!pic->writer(webpll_data, webpll_size, pic)) {
- err = VP8_ENC_ERROR_BAD_WRITE;
- goto Error;
+ if (!WriteRiffHeader(pic, riff_size, vp8l_size) ||
+ !pic->writer(webpll_data, webpll_size, pic)) {
+ WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_WRITE);
+ return 0;
}
if (pad) {
const uint8_t pad_byte[1] = { 0 };
if (!pic->writer(pad_byte, 1, pic)) {
- err = VP8_ENC_ERROR_BAD_WRITE;
- goto Error;
+ WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_WRITE);
+ return 0;
}
}
*coded_size = CHUNK_HEADER_SIZE + riff_size;
- return VP8_ENC_OK;
-
- Error:
- return err;
+ return 1;
}
// -----------------------------------------------------------------------------
@@ -1199,18 +1479,16 @@ static void ClearTransformBuffer(VP8LEncoder* const enc) {
// Flags influencing the memory allocated:
// enc->transform_bits_
// enc->use_predict_, enc->use_cross_color_
-static WebPEncodingError AllocateTransformBuffer(VP8LEncoder* const enc,
- int width, int height) {
- WebPEncodingError err = VP8_ENC_OK;
+static int AllocateTransformBuffer(VP8LEncoder* const enc, int width,
+ int height) {
const uint64_t image_size = width * height;
// VP8LResidualImage needs room for 2 scanlines of uint32 pixels with an extra
// pixel in each, plus 2 regular scanlines of bytes.
// TODO(skal): Clean up by using arithmetic in bytes instead of words.
const uint64_t argb_scratch_size =
- enc->use_predict_
- ? (width + 1) * 2 +
- (width * 2 + sizeof(uint32_t) - 1) / sizeof(uint32_t)
- : 0;
+ enc->use_predict_ ? (width + 1) * 2 + (width * 2 + sizeof(uint32_t) - 1) /
+ sizeof(uint32_t)
+ : 0;
const uint64_t transform_data_size =
(enc->use_predict_ || enc->use_cross_color_)
? VP8LSubSampleSize(width, enc->transform_bits_) *
@@ -1218,17 +1496,16 @@ static WebPEncodingError AllocateTransformBuffer(VP8LEncoder* const enc,
: 0;
const uint64_t max_alignment_in_words =
(WEBP_ALIGN_CST + sizeof(uint32_t) - 1) / sizeof(uint32_t);
- const uint64_t mem_size =
- image_size + max_alignment_in_words +
- argb_scratch_size + max_alignment_in_words +
- transform_data_size;
+ const uint64_t mem_size = image_size + max_alignment_in_words +
+ argb_scratch_size + max_alignment_in_words +
+ transform_data_size;
uint32_t* mem = enc->transform_mem_;
if (mem == NULL || mem_size > enc->transform_mem_size_) {
ClearTransformBuffer(enc);
mem = (uint32_t*)WebPSafeMalloc(mem_size, sizeof(*mem));
if (mem == NULL) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
- goto Error;
+ WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY);
+ return 0;
}
enc->transform_mem_ = mem;
enc->transform_mem_size_ = (size_t)mem_size;
@@ -1241,19 +1518,16 @@ static WebPEncodingError AllocateTransformBuffer(VP8LEncoder* const enc,
enc->transform_data_ = mem;
enc->current_width_ = width;
- Error:
- return err;
+ return 1;
}
-static WebPEncodingError MakeInputImageCopy(VP8LEncoder* const enc) {
- WebPEncodingError err = VP8_ENC_OK;
+static int MakeInputImageCopy(VP8LEncoder* const enc) {
const WebPPicture* const picture = enc->pic_;
const int width = picture->width;
const int height = picture->height;
- err = AllocateTransformBuffer(enc, width, height);
- if (err != VP8_ENC_OK) return err;
- if (enc->argb_content_ == kEncoderARGB) return VP8_ENC_OK;
+ if (!AllocateTransformBuffer(enc, width, height)) return 0;
+ if (enc->argb_content_ == kEncoderARGB) return 1;
{
uint32_t* dst = enc->argb_;
@@ -1267,27 +1541,11 @@ static WebPEncodingError MakeInputImageCopy(VP8LEncoder* const enc) {
}
enc->argb_content_ = kEncoderARGB;
assert(enc->current_width_ == width);
- return VP8_ENC_OK;
+ return 1;
}
// -----------------------------------------------------------------------------
-static WEBP_INLINE int SearchColorNoIdx(const uint32_t sorted[], uint32_t color,
- int hi) {
- int low = 0;
- if (sorted[low] == color) return low; // loop invariant: sorted[low] != color
- while (1) {
- const int mid = (low + hi) >> 1;
- if (sorted[mid] == color) {
- return mid;
- } else if (sorted[mid] < color) {
- low = mid;
- } else {
- hi = mid;
- }
- }
-}
-
#define APPLY_PALETTE_GREEDY_MAX 4
static WEBP_INLINE uint32_t SearchColorGreedy(const uint32_t palette[],
@@ -1322,17 +1580,6 @@ static WEBP_INLINE uint32_t ApplyPaletteHash2(uint32_t color) {
(32 - PALETTE_INV_SIZE_BITS);
}
-// Sort palette in increasing order and prepare an inverse mapping array.
-static void PrepareMapToPalette(const uint32_t palette[], int num_colors,
- uint32_t sorted[], uint32_t idx_map[]) {
- int i;
- memcpy(sorted, palette, num_colors * sizeof(*sorted));
- qsort(sorted, num_colors, sizeof(*sorted), PaletteCompareColorsForQsort);
- for (i = 0; i < num_colors; ++i) {
- idx_map[SearchColorNoIdx(sorted, palette[i], num_colors)] = i;
- }
-}
-
// Use 1 pixel cache for ARGB pixels.
#define APPLY_PALETTE_FOR(COLOR_INDEX) do { \
uint32_t prev_pix = palette[0]; \
@@ -1356,16 +1603,19 @@ static void PrepareMapToPalette(const uint32_t palette[], int num_colors,
// using 'row' as a temporary buffer of size 'width'.
// We assume that all src[] values have a corresponding entry in the palette.
// Note: src[] can be the same as dst[]
-static WebPEncodingError ApplyPalette(const uint32_t* src, uint32_t src_stride,
- uint32_t* dst, uint32_t dst_stride,
- const uint32_t* palette, int palette_size,
- int width, int height, int xbits) {
+static int ApplyPalette(const uint32_t* src, uint32_t src_stride, uint32_t* dst,
+ uint32_t dst_stride, const uint32_t* palette,
+ int palette_size, int width, int height, int xbits,
+ const WebPPicture* const pic) {
// TODO(skal): this tmp buffer is not needed if VP8LBundleColorMap() can be
// made to work in-place.
uint8_t* const tmp_row = (uint8_t*)WebPSafeMalloc(width, sizeof(*tmp_row));
int x, y;
- if (tmp_row == NULL) return VP8_ENC_ERROR_OUT_OF_MEMORY;
+ if (tmp_row == NULL) {
+ WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+ return 0;
+ }
if (palette_size < APPLY_PALETTE_GREEDY_MAX) {
APPLY_PALETTE_FOR(SearchColorGreedy(palette, palette_size, pix));
@@ -1410,7 +1660,7 @@ static WebPEncodingError ApplyPalette(const uint32_t* src, uint32_t src_stride,
}
}
WebPSafeFree(tmp_row);
- return VP8_ENC_OK;
+ return 1;
}
#undef APPLY_PALETTE_FOR
#undef PALETTE_INV_SIZE_BITS
@@ -1418,9 +1668,7 @@ static WebPEncodingError ApplyPalette(const uint32_t* src, uint32_t src_stride,
#undef APPLY_PALETTE_GREEDY_MAX
// Note: Expects "enc->palette_" to be set properly.
-static WebPEncodingError MapImageFromPalette(VP8LEncoder* const enc,
- int in_place) {
- WebPEncodingError err = VP8_ENC_OK;
+static int MapImageFromPalette(VP8LEncoder* const enc, int in_place) {
const WebPPicture* const pic = enc->pic_;
const int width = pic->width;
const int height = pic->height;
@@ -1438,19 +1686,22 @@ static WebPEncodingError MapImageFromPalette(VP8LEncoder* const enc,
xbits = (palette_size <= 16) ? 1 : 0;
}
- err = AllocateTransformBuffer(enc, VP8LSubSampleSize(width, xbits), height);
- if (err != VP8_ENC_OK) return err;
-
- err = ApplyPalette(src, src_stride,
+ if (!AllocateTransformBuffer(enc, VP8LSubSampleSize(width, xbits), height)) {
+ return 0;
+ }
+ if (!ApplyPalette(src, src_stride,
enc->argb_, enc->current_width_,
- palette, palette_size, width, height, xbits);
+ palette, palette_size, width, height, xbits, pic)) {
+ return 0;
+ }
enc->argb_content_ = kEncoderPalette;
- return err;
+ return 1;
}
// Save palette_[] to bitstream.
static WebPEncodingError EncodePalette(VP8LBitWriter* const bw, int low_effort,
- VP8LEncoder* const enc) {
+ VP8LEncoder* const enc,
+ int percent_range, int* const percent) {
int i;
uint32_t tmp_palette[MAX_PALETTE_SIZE];
const int palette_size = enc->palette_size_;
@@ -1464,8 +1715,8 @@ static WebPEncodingError EncodePalette(VP8LBitWriter* const bw, int low_effort,
}
tmp_palette[0] = palette[0];
return EncodeImageNoHuffman(bw, tmp_palette, &enc->hash_chain_,
- &enc->refs_[0], &enc->refs_[1], palette_size, 1,
- 20 /* quality */, low_effort);
+ &enc->refs_[0], palette_size, 1, /*quality=*/20,
+ low_effort, enc->pic_, percent_range, percent);
}
// -----------------------------------------------------------------------------
@@ -1491,7 +1742,7 @@ static void VP8LEncoderDelete(VP8LEncoder* enc) {
if (enc != NULL) {
int i;
VP8LHashChainClear(&enc->hash_chain_);
- for (i = 0; i < 3; ++i) VP8LBackwardRefsClear(&enc->refs_[i]);
+ for (i = 0; i < 4; ++i) VP8LBackwardRefsClear(&enc->refs_[i]);
ClearTransformBuffer(enc);
WebPSafeFree(enc);
}
@@ -1509,7 +1760,6 @@ typedef struct {
CrunchConfig crunch_configs_[CRUNCH_CONFIGS_MAX];
int num_crunch_configs_;
int red_and_blue_always_zero_;
- WebPEncodingError err_;
WebPAuxStats* stats_;
} StreamEncodeContext;
@@ -1526,7 +1776,6 @@ static int EncodeStreamHook(void* input, void* data2) {
#if !defined(WEBP_DISABLE_STATS)
WebPAuxStats* const stats = params->stats_;
#endif
- WebPEncodingError err = VP8_ENC_OK;
const int quality = (int)config->quality;
const int low_effort = (config->method == 0);
#if (WEBP_NEAR_LOSSLESS == 1)
@@ -1534,6 +1783,7 @@ static int EncodeStreamHook(void* input, void* data2) {
#endif
const int height = picture->height;
const size_t byte_position = VP8LBitWriterNumBytes(bw);
+ int percent = 2; // for WebPProgressHook
#if (WEBP_NEAR_LOSSLESS == 1)
int use_near_lossless = 0;
#endif
@@ -1541,24 +1791,28 @@ static int EncodeStreamHook(void* input, void* data2) {
int data_size = 0;
int use_delta_palette = 0;
int idx;
- size_t best_size = 0;
+ size_t best_size = ~(size_t)0;
VP8LBitWriter bw_init = *bw, bw_best;
(void)data2;
if (!VP8LBitWriterInit(&bw_best, 0) ||
(num_crunch_configs > 1 && !VP8LBitWriterClone(bw, &bw_best))) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+ WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
goto Error;
}
for (idx = 0; idx < num_crunch_configs; ++idx) {
const int entropy_idx = crunch_configs[idx].entropy_idx_;
- enc->use_palette_ = (entropy_idx == kPalette);
+ int remaining_percent = 97 / num_crunch_configs, percent_range;
+ enc->use_palette_ =
+ (entropy_idx == kPalette) || (entropy_idx == kPaletteAndSpatial);
enc->use_subtract_green_ =
(entropy_idx == kSubGreen) || (entropy_idx == kSpatialSubGreen);
- enc->use_predict_ =
- (entropy_idx == kSpatial) || (entropy_idx == kSpatialSubGreen);
- if (low_effort) {
+ enc->use_predict_ = (entropy_idx == kSpatial) ||
+ (entropy_idx == kSpatialSubGreen) ||
+ (entropy_idx == kPaletteAndSpatial);
+ // When using a palette, R/B==0, hence no need to test for cross-color.
+ if (low_effort || enc->use_palette_) {
enc->use_cross_color_ = 0;
} else {
enc->use_cross_color_ = red_and_blue_always_zero ? 0 : enc->use_predict_;
@@ -1573,11 +1827,10 @@ static int EncodeStreamHook(void* input, void* data2) {
use_near_lossless = (config->near_lossless < 100) && !enc->use_palette_ &&
!enc->use_predict_;
if (use_near_lossless) {
- err = AllocateTransformBuffer(enc, width, height);
- if (err != VP8_ENC_OK) goto Error;
+ if (!AllocateTransformBuffer(enc, width, height)) goto Error;
if ((enc->argb_content_ != kEncoderNearLossless) &&
!VP8ApplyNearLossless(picture, config->near_lossless, enc->argb_)) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+ WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
goto Error;
}
enc->argb_content_ = kEncoderNearLossless;
@@ -1590,10 +1843,26 @@ static int EncodeStreamHook(void* input, void* data2) {
// Encode palette
if (enc->use_palette_) {
- err = EncodePalette(bw, low_effort, enc);
- if (err != VP8_ENC_OK) goto Error;
- err = MapImageFromPalette(enc, use_delta_palette);
- if (err != VP8_ENC_OK) goto Error;
+ if (crunch_configs[idx].palette_sorting_type_ == kSortedDefault) {
+ // Nothing to do, we have already sorted the palette.
+ memcpy(enc->palette_, enc->palette_sorted_,
+ enc->palette_size_ * sizeof(*enc->palette_));
+ } else if (crunch_configs[idx].palette_sorting_type_ == kMinimizeDelta) {
+ PaletteSortMinimizeDeltas(enc->palette_sorted_, enc->palette_size_,
+ enc->palette_);
+ } else {
+ assert(crunch_configs[idx].palette_sorting_type_ == kModifiedZeng);
+ if (!PaletteSortModifiedZeng(enc->pic_, enc->palette_sorted_,
+ enc->palette_size_, enc->palette_)) {
+ goto Error;
+ }
+ }
+ percent_range = remaining_percent / 4;
+ if (!EncodePalette(bw, low_effort, enc, percent_range, &percent)) {
+ goto Error;
+ }
+ remaining_percent -= percent_range;
+ if (!MapImageFromPalette(enc, use_delta_palette)) goto Error;
// If using a color cache, do not have it bigger than the number of
// colors.
if (use_cache && enc->palette_size_ < (1 << MAX_COLOR_CACHE_BITS)) {
@@ -1604,8 +1873,7 @@ static int EncodeStreamHook(void* input, void* data2) {
// In case image is not packed.
if (enc->argb_content_ != kEncoderNearLossless &&
enc->argb_content_ != kEncoderPalette) {
- err = MakeInputImageCopy(enc);
- if (err != VP8_ENC_OK) goto Error;
+ if (!MakeInputImageCopy(enc)) goto Error;
}
// -----------------------------------------------------------------------
@@ -1616,15 +1884,22 @@ static int EncodeStreamHook(void* input, void* data2) {
}
if (enc->use_predict_) {
- err = ApplyPredictFilter(enc, enc->current_width_, height, quality,
- low_effort, enc->use_subtract_green_, bw);
- if (err != VP8_ENC_OK) goto Error;
+ percent_range = remaining_percent / 3;
+ if (!ApplyPredictFilter(enc, enc->current_width_, height, quality,
+ low_effort, enc->use_subtract_green_, bw,
+ percent_range, &percent)) {
+ goto Error;
+ }
+ remaining_percent -= percent_range;
}
if (enc->use_cross_color_) {
- err = ApplyCrossColorFilter(enc, enc->current_width_, height, quality,
- low_effort, bw);
- if (err != VP8_ENC_OK) goto Error;
+ percent_range = remaining_percent / 2;
+ if (!ApplyCrossColorFilter(enc, enc->current_width_, height, quality,
+ low_effort, bw, percent_range, &percent)) {
+ goto Error;
+ }
+ remaining_percent -= percent_range;
}
}
@@ -1632,15 +1907,16 @@ static int EncodeStreamHook(void* input, void* data2) {
// -------------------------------------------------------------------------
// Encode and write the transformed image.
- err = EncodeImageInternal(bw, enc->argb_, &enc->hash_chain_, enc->refs_,
- enc->current_width_, height, quality, low_effort,
- use_cache, &crunch_configs[idx],
- &enc->cache_bits_, enc->histo_bits_,
- byte_position, &hdr_size, &data_size);
- if (err != VP8_ENC_OK) goto Error;
+ if (!EncodeImageInternal(
+ bw, enc->argb_, &enc->hash_chain_, enc->refs_, enc->current_width_,
+ height, quality, low_effort, use_cache, &crunch_configs[idx],
+ &enc->cache_bits_, enc->histo_bits_, byte_position, &hdr_size,
+ &data_size, picture, remaining_percent, &percent)) {
+ goto Error;
+ }
// If we are better than what we already have.
- if (idx == 0 || VP8LBitWriterNumBytes(bw) < best_size) {
+ if (VP8LBitWriterNumBytes(bw) < best_size) {
best_size = VP8LBitWriterNumBytes(bw);
// Store the BitWriter.
VP8LBitWriterSwap(bw, &bw_best);
@@ -1667,18 +1943,15 @@ static int EncodeStreamHook(void* input, void* data2) {
}
VP8LBitWriterSwap(&bw_best, bw);
-Error:
+ Error:
VP8LBitWriterWipeOut(&bw_best);
- params->err_ = err;
// The hook should return false in case of error.
- return (err == VP8_ENC_OK);
+ return (params->picture_->error_code == VP8_ENC_OK);
}
-WebPEncodingError VP8LEncodeStream(const WebPConfig* const config,
- const WebPPicture* const picture,
- VP8LBitWriter* const bw_main,
- int use_cache) {
- WebPEncodingError err = VP8_ENC_OK;
+int VP8LEncodeStream(const WebPConfig* const config,
+ const WebPPicture* const picture,
+ VP8LBitWriter* const bw_main, int use_cache) {
VP8LEncoder* const enc_main = VP8LEncoderNew(config, picture);
VP8LEncoder* enc_side = NULL;
CrunchConfig crunch_configs[CRUNCH_CONFIGS_MAX];
@@ -1690,15 +1963,24 @@ WebPEncodingError VP8LEncodeStream(const WebPConfig* const config,
// The main thread uses picture->stats, the side thread uses stats_side.
WebPAuxStats stats_side;
VP8LBitWriter bw_side;
+ WebPPicture picture_side;
const WebPWorkerInterface* const worker_interface = WebPGetWorkerInterface();
int ok_main;
+ if (enc_main == NULL || !VP8LBitWriterInit(&bw_side, 0)) {
+ WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
+ VP8LEncoderDelete(enc_main);
+ return 0;
+ }
+
+ // Avoid "garbage value" error from Clang's static analysis tool.
+ WebPPictureInit(&picture_side);
+
// Analyze image (entropy, num_palettes etc)
- if (enc_main == NULL ||
- !EncoderAnalyze(enc_main, crunch_configs, &num_crunch_configs_main,
+ if (!EncoderAnalyze(enc_main, crunch_configs, &num_crunch_configs_main,
&red_and_blue_always_zero) ||
- !EncoderInit(enc_main) || !VP8LBitWriterInit(&bw_side, 0)) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+ !EncoderInit(enc_main)) {
+ WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
goto Error;
}
@@ -1727,25 +2009,32 @@ WebPEncodingError VP8LEncodeStream(const WebPConfig* const config,
StreamEncodeContext* const param =
(idx == 0) ? &params_main : &params_side;
param->config_ = config;
- param->picture_ = picture;
param->use_cache_ = use_cache;
param->red_and_blue_always_zero_ = red_and_blue_always_zero;
if (idx == 0) {
+ param->picture_ = picture;
param->stats_ = picture->stats;
param->bw_ = bw_main;
param->enc_ = enc_main;
} else {
+ // Create a side picture (error_code is not thread-safe).
+ if (!WebPPictureView(picture, /*left=*/0, /*top=*/0, picture->width,
+ picture->height, &picture_side)) {
+ assert(0);
+ }
+ picture_side.progress_hook = NULL; // Progress hook is not thread-safe.
+ param->picture_ = &picture_side; // No need to free a view afterwards.
param->stats_ = (picture->stats == NULL) ? NULL : &stats_side;
// Create a side bit writer.
if (!VP8LBitWriterClone(bw_main, &bw_side)) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+ WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
goto Error;
}
param->bw_ = &bw_side;
// Create a side encoder.
- enc_side = VP8LEncoderNew(config, picture);
+ enc_side = VP8LEncoderNew(config, &picture_side);
if (enc_side == NULL || !EncoderInit(enc_side)) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+ WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
goto Error;
}
// Copy the values that were computed for the main encoder.
@@ -1754,6 +2043,8 @@ WebPEncodingError VP8LEncodeStream(const WebPConfig* const config,
enc_side->palette_size_ = enc_main->palette_size_;
memcpy(enc_side->palette_, enc_main->palette_,
sizeof(enc_main->palette_));
+ memcpy(enc_side->palette_sorted_, enc_main->palette_sorted_,
+ sizeof(enc_main->palette_sorted_));
param->enc_ = enc_side;
}
// Create the workers.
@@ -1767,7 +2058,7 @@ WebPEncodingError VP8LEncodeStream(const WebPConfig* const config,
// Start the second thread if needed.
if (num_crunch_configs_side != 0) {
if (!worker_interface->Reset(&worker_side)) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+ WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
goto Error;
}
#if !defined(WEBP_DISABLE_STATS)
@@ -1777,8 +2068,6 @@ WebPEncodingError VP8LEncodeStream(const WebPConfig* const config,
memcpy(&stats_side, picture->stats, sizeof(stats_side));
}
#endif
- // This line is only useful to remove a Clang static analyzer warning.
- params_side.err_ = VP8_ENC_OK;
worker_interface->Launch(&worker_side);
}
// Execute the main thread.
@@ -1790,7 +2079,10 @@ WebPEncodingError VP8LEncodeStream(const WebPConfig* const config,
const int ok_side = worker_interface->Sync(&worker_side);
worker_interface->End(&worker_side);
if (!ok_main || !ok_side) {
- err = ok_main ? params_side.err_ : params_main.err_;
+ if (picture->error_code == VP8_ENC_OK) {
+ assert(picture_side.error_code != VP8_ENC_OK);
+ WebPEncodingSetError(picture, picture_side.error_code);
+ }
goto Error;
}
if (VP8LBitWriterNumBytes(&bw_side) < VP8LBitWriterNumBytes(bw_main)) {
@@ -1801,22 +2093,17 @@ WebPEncodingError VP8LEncodeStream(const WebPConfig* const config,
}
#endif
}
- } else {
- if (!ok_main) {
- err = params_main.err_;
- goto Error;
- }
}
-Error:
+ Error:
VP8LBitWriterWipeOut(&bw_side);
VP8LEncoderDelete(enc_main);
VP8LEncoderDelete(enc_side);
- return err;
+ return (picture->error_code == VP8_ENC_OK);
}
#undef CRUNCH_CONFIGS_MAX
-#undef CRUNCH_CONFIGS_LZ77_MAX
+#undef CRUNCH_SUBCONFIGS_MAX
int VP8LEncodeImage(const WebPConfig* const config,
const WebPPicture* const picture) {
@@ -1825,14 +2112,12 @@ int VP8LEncodeImage(const WebPConfig* const config,
size_t coded_size;
int percent = 0;
int initial_size;
- WebPEncodingError err = VP8_ENC_OK;
VP8LBitWriter bw;
if (picture == NULL) return 0;
if (config == NULL || picture->argb == NULL) {
- err = VP8_ENC_ERROR_NULL_PARAMETER;
- WebPEncodingSetError(picture, err);
+ WebPEncodingSetError(picture, VP8_ENC_ERROR_NULL_PARAMETER);
return 0;
}
@@ -1843,13 +2128,13 @@ int VP8LEncodeImage(const WebPConfig* const config,
initial_size = (config->image_hint == WEBP_HINT_GRAPH) ?
width * height : width * height * 2;
if (!VP8LBitWriterInit(&bw, initial_size)) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+ WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
goto Error;
}
if (!WebPReportProgress(picture, 1, &percent)) {
UserAbort:
- err = VP8_ENC_ERROR_USER_ABORT;
+ WebPEncodingSetError(picture, VP8_ENC_ERROR_USER_ABORT);
goto Error;
}
// Reset stats (for pure lossless coding)
@@ -1865,28 +2150,26 @@ int VP8LEncodeImage(const WebPConfig* const config,
// Write image size.
if (!WriteImageSize(picture, &bw)) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+ WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
goto Error;
}
has_alpha = WebPPictureHasTransparency(picture);
// Write the non-trivial Alpha flag and lossless version.
if (!WriteRealAlphaAndVersion(&bw, has_alpha)) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
+ WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
goto Error;
}
- if (!WebPReportProgress(picture, 5, &percent)) goto UserAbort;
+ if (!WebPReportProgress(picture, 2, &percent)) goto UserAbort;
// Encode main image stream.
- err = VP8LEncodeStream(config, picture, &bw, 1 /*use_cache*/);
- if (err != VP8_ENC_OK) goto Error;
+ if (!VP8LEncodeStream(config, picture, &bw, 1 /*use_cache*/)) goto Error;
- if (!WebPReportProgress(picture, 90, &percent)) goto UserAbort;
+ if (!WebPReportProgress(picture, 99, &percent)) goto UserAbort;
// Finish the RIFF chunk.
- err = WriteImage(picture, &bw, &coded_size);
- if (err != VP8_ENC_OK) goto Error;
+ if (!WriteImage(picture, &bw, &coded_size)) goto Error;
if (!WebPReportProgress(picture, 100, &percent)) goto UserAbort;
@@ -1905,13 +2188,11 @@ int VP8LEncodeImage(const WebPConfig* const config,
}
Error:
- if (bw.error_) err = VP8_ENC_ERROR_OUT_OF_MEMORY;
- VP8LBitWriterWipeOut(&bw);
- if (err != VP8_ENC_OK) {
- WebPEncodingSetError(picture, err);
- return 0;
+ if (bw.error_) {
+ WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
}
- return 1;
+ VP8LBitWriterWipeOut(&bw);
+ return (picture->error_code == VP8_ENC_OK);
}
//------------------------------------------------------------------------------
diff --git a/src/3rdparty/libwebp/src/enc/vp8li_enc.h b/src/3rdparty/libwebp/src/enc/vp8li_enc.h
index d2d0fc5..3d35e16 100644
--- a/src/3rdparty/libwebp/src/enc/vp8li_enc.h
+++ b/src/3rdparty/libwebp/src/enc/vp8li_enc.h
@@ -69,9 +69,11 @@ typedef struct {
int use_palette_;
int palette_size_;
uint32_t palette_[MAX_PALETTE_SIZE];
+ // Sorted version of palette_ for cache purposes.
+ uint32_t palette_sorted_[MAX_PALETTE_SIZE];
// Some 'scratch' (potentially large) objects.
- struct VP8LBackwardRefs refs_[3]; // Backward Refs array for temporaries.
+ struct VP8LBackwardRefs refs_[4]; // Backward Refs array for temporaries.
VP8LHashChain hash_chain_; // HashChain data for constructing
// backward references.
} VP8LEncoder;
@@ -87,9 +89,10 @@ int VP8LEncodeImage(const WebPConfig* const config,
// Encodes the main image stream using the supplied bit writer.
// If 'use_cache' is false, disables the use of color cache.
-WebPEncodingError VP8LEncodeStream(const WebPConfig* const config,
- const WebPPicture* const picture,
- VP8LBitWriter* const bw, int use_cache);
+// Returns false in case of error (stored in picture->error_code).
+int VP8LEncodeStream(const WebPConfig* const config,
+ const WebPPicture* const picture, VP8LBitWriter* const bw,
+ int use_cache);
#if (WEBP_NEAR_LOSSLESS == 1)
// in near_lossless.c
@@ -101,13 +104,18 @@ int VP8ApplyNearLossless(const WebPPicture* const picture, int quality,
//------------------------------------------------------------------------------
// Image transforms in predictor.c.
-void VP8LResidualImage(int width, int height, int bits, int low_effort,
- uint32_t* const argb, uint32_t* const argb_scratch,
- uint32_t* const image, int near_lossless, int exact,
- int used_subtract_green);
-
-void VP8LColorSpaceTransform(int width, int height, int bits, int quality,
- uint32_t* const argb, uint32_t* image);
+// pic and percent are for progress.
+// Returns false in case of error (stored in pic->error_code).
+int VP8LResidualImage(int width, int height, int bits, int low_effort,
+ uint32_t* const argb, uint32_t* const argb_scratch,
+ uint32_t* const image, int near_lossless, int exact,
+ int used_subtract_green, const WebPPicture* const pic,
+ int percent_range, int* const percent);
+
+int VP8LColorSpaceTransform(int width, int height, int bits, int quality,
+ uint32_t* const argb, uint32_t* image,
+ const WebPPicture* const pic, int percent_range,
+ int* const percent);
//------------------------------------------------------------------------------
diff --git a/src/3rdparty/libwebp/src/enc/webp_enc.c b/src/3rdparty/libwebp/src/enc/webp_enc.c
index 9f4b10c..9620e05 100644
--- a/src/3rdparty/libwebp/src/enc/webp_enc.c
+++ b/src/3rdparty/libwebp/src/enc/webp_enc.c
@@ -336,9 +336,7 @@ int WebPEncode(const WebPConfig* config, WebPPicture* pic) {
if (!WebPValidateConfig(config)) {
return WebPEncodingSetError(pic, VP8_ENC_ERROR_INVALID_CONFIGURATION);
}
- if (pic->width <= 0 || pic->height <= 0) {
- return WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_DIMENSION);
- }
+ if (!WebPValidatePicture(pic)) return 0;
if (pic->width > WEBP_MAX_DIMENSION || pic->height > WEBP_MAX_DIMENSION) {
return WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_DIMENSION);
}
@@ -400,7 +398,7 @@ int WebPEncode(const WebPConfig* config, WebPPicture* pic) {
}
if (!config->exact) {
- WebPCleanupTransparentAreaLossless(pic);
+ WebPReplaceTransparentPixels(pic, 0x000000);
}
ok = VP8LEncodeImage(config, pic); // Sets pic->error in case of problem.
diff --git a/src/3rdparty/libwebp/src/mux/anim_encode.c b/src/3rdparty/libwebp/src/mux/anim_encode.c
index 7be9906..7078d9a 100644
--- a/src/3rdparty/libwebp/src/mux/anim_encode.c
+++ b/src/3rdparty/libwebp/src/mux/anim_encode.c
@@ -248,9 +248,6 @@ WebPAnimEncoder* WebPAnimEncoderNewInternal(
enc = (WebPAnimEncoder*)WebPSafeCalloc(1, sizeof(*enc));
if (enc == NULL) return NULL;
- // sanity inits, so we can call WebPAnimEncoderDelete():
- enc->encoded_frames_ = NULL;
- enc->mux_ = NULL;
MarkNoError(enc);
// Dimensions and options.
@@ -421,7 +418,7 @@ static void MinimizeChangeRectangle(const WebPPicture* const src,
const int max_allowed_diff_lossy = QualityToMaxDiff(quality);
const int max_allowed_diff = is_lossless ? 0 : max_allowed_diff_lossy;
- // Sanity checks.
+ // Assumption/correctness checks.
assert(src->width == dst->width && src->height == dst->height);
assert(rect->x_offset_ + rect->width_ <= dst->width);
assert(rect->y_offset_ + rect->height_ <= dst->height);
@@ -949,7 +946,8 @@ static int IncreasePreviousDuration(WebPAnimEncoder* const enc, int duration) {
int new_duration;
assert(enc->count_ >= 1);
- assert(prev_enc_frame->sub_frame_.duration ==
+ assert(!prev_enc_frame->is_key_frame_ ||
+ prev_enc_frame->sub_frame_.duration ==
prev_enc_frame->key_frame_.duration);
assert(prev_enc_frame->sub_frame_.duration ==
(prev_enc_frame->sub_frame_.duration & (MAX_DURATION - 1)));
@@ -966,7 +964,7 @@ static int IncreasePreviousDuration(WebPAnimEncoder* const enc, int duration) {
0x10, 0x88, 0x88, 0x08
};
const WebPData lossless_1x1 = {
- lossless_1x1_bytes, sizeof(lossless_1x1_bytes)
+ lossless_1x1_bytes, sizeof(lossless_1x1_bytes)
};
const uint8_t lossy_1x1_bytes[] = {
0x52, 0x49, 0x46, 0x46, 0x40, 0x00, 0x00, 0x00, 0x57, 0x45, 0x42, 0x50,
@@ -1358,6 +1356,12 @@ int WebPAnimEncoderAdd(WebPAnimEncoder* enc, WebPPicture* frame, int timestamp,
if (!IncreasePreviousDuration(enc, (int)prev_frame_duration)) {
return 0;
}
+ // IncreasePreviousDuration() may add a frame to avoid exceeding
+ // MAX_DURATION which could cause CacheFrame() to over read encoded_frames_
+ // before the next flush.
+ if (enc->count_ == enc->size_ && !FlushFrames(enc)) {
+ return 0;
+ }
} else {
enc->first_timestamp_ = timestamp;
}
diff --git a/src/3rdparty/libwebp/src/mux/muxedit.c b/src/3rdparty/libwebp/src/mux/muxedit.c
index ccf14b2..63e71a0 100644
--- a/src/3rdparty/libwebp/src/mux/muxedit.c
+++ b/src/3rdparty/libwebp/src/mux/muxedit.c
@@ -70,6 +70,7 @@ void WebPMuxDelete(WebPMux* mux) {
err = ChunkAssignData(&chunk, data, copy_data, tag); \
if (err == WEBP_MUX_OK) { \
err = ChunkSetHead(&chunk, (LIST)); \
+ if (err != WEBP_MUX_OK) ChunkRelease(&chunk); \
} \
return err; \
}
@@ -235,7 +236,6 @@ WebPMuxError WebPMuxSetImage(WebPMux* mux, const WebPData* bitstream,
WebPMuxImage wpi;
WebPMuxError err;
- // Sanity checks.
if (mux == NULL || bitstream == NULL || bitstream->bytes == NULL ||
bitstream->size > MAX_CHUNK_PAYLOAD) {
return WEBP_MUX_INVALID_ARGUMENT;
@@ -267,7 +267,6 @@ WebPMuxError WebPMuxPushFrame(WebPMux* mux, const WebPMuxFrameInfo* info,
WebPMuxImage wpi;
WebPMuxError err;
- // Sanity checks.
if (mux == NULL || info == NULL) return WEBP_MUX_INVALID_ARGUMENT;
if (info->id != WEBP_CHUNK_ANMF) return WEBP_MUX_INVALID_ARGUMENT;
diff --git a/src/3rdparty/libwebp/src/mux/muxi.h b/src/3rdparty/libwebp/src/mux/muxi.h
index 7bc0b07..7929138 100644
--- a/src/3rdparty/libwebp/src/mux/muxi.h
+++ b/src/3rdparty/libwebp/src/mux/muxi.h
@@ -28,8 +28,8 @@ extern "C" {
// Defines and constants.
#define MUX_MAJ_VERSION 1
-#define MUX_MIN_VERSION 0
-#define MUX_REV_VERSION 3
+#define MUX_MIN_VERSION 3
+#define MUX_REV_VERSION 0
// Chunk object.
typedef struct WebPChunk WebPChunk;
diff --git a/src/3rdparty/libwebp/src/mux/muxinternal.c b/src/3rdparty/libwebp/src/mux/muxinternal.c
index b9ee671..75b6b41 100644
--- a/src/3rdparty/libwebp/src/mux/muxinternal.c
+++ b/src/3rdparty/libwebp/src/mux/muxinternal.c
@@ -155,17 +155,18 @@ WebPMuxError ChunkSetHead(WebPChunk* const chunk,
WebPMuxError ChunkAppend(WebPChunk* const chunk,
WebPChunk*** const chunk_list) {
+ WebPMuxError err;
assert(chunk_list != NULL && *chunk_list != NULL);
if (**chunk_list == NULL) {
- ChunkSetHead(chunk, *chunk_list);
+ err = ChunkSetHead(chunk, *chunk_list);
} else {
WebPChunk* last_chunk = **chunk_list;
while (last_chunk->next_ != NULL) last_chunk = last_chunk->next_;
- ChunkSetHead(chunk, &last_chunk->next_);
- *chunk_list = &last_chunk->next_;
+ err = ChunkSetHead(chunk, &last_chunk->next_);
+ if (err == WEBP_MUX_OK) *chunk_list = &last_chunk->next_;
}
- return WEBP_MUX_OK;
+ return err;
}
//------------------------------------------------------------------------------
diff --git a/src/3rdparty/libwebp/src/mux/muxread.c b/src/3rdparty/libwebp/src/mux/muxread.c
index 268f6ac..8005039 100644
--- a/src/3rdparty/libwebp/src/mux/muxread.c
+++ b/src/3rdparty/libwebp/src/mux/muxread.c
@@ -56,7 +56,7 @@ static WebPMuxError ChunkVerifyAndAssign(WebPChunk* chunk,
uint32_t chunk_size;
WebPData chunk_data;
- // Sanity checks.
+ // Correctness checks.
if (data_size < CHUNK_HEADER_SIZE) return WEBP_MUX_NOT_ENOUGH_DATA;
chunk_size = GetLE32(data + TAG_SIZE);
if (chunk_size > MAX_CHUNK_PAYLOAD) return WEBP_MUX_BAD_DATA;
@@ -100,7 +100,7 @@ static int MuxImageParse(const WebPChunk* const chunk, int copy_data,
WebPMuxImage* const wpi) {
const uint8_t* bytes = chunk->data_.bytes;
size_t size = chunk->data_.size;
- const uint8_t* const last = bytes + size;
+ const uint8_t* const last = (bytes == NULL) ? NULL : bytes + size;
WebPChunk subchunk;
size_t subchunk_size;
WebPChunk** unknown_chunk_list = &wpi->unknown_;
@@ -155,7 +155,6 @@ static int MuxImageParse(const WebPChunk* const chunk, int copy_data,
break;
default:
goto Fail;
- break;
}
subchunk_size = ChunkDiskSize(&subchunk);
bytes += subchunk_size;
@@ -187,7 +186,6 @@ WebPMux* WebPMuxCreateInternal(const WebPData* bitstream, int copy_data,
WebPChunk** chunk_list_ends[WEBP_CHUNK_NIL + 1] = { NULL };
ChunkInit(&chunk);
- // Sanity checks.
if (WEBP_ABI_IS_INCOMPATIBLE(version, WEBP_MUX_ABI_VERSION)) {
return NULL; // version mismatch
}
@@ -264,7 +262,6 @@ WebPMux* WebPMuxCreateInternal(const WebPData* bitstream, int copy_data,
if (!MuxImageParse(&chunk, copy_data, wpi)) goto Err;
ChunkRelease(&chunk);
goto PushImage;
- break;
default: // A non-image chunk.
if (wpi->is_partial_) goto Err; // Encountered a non-image chunk before
// getting all chunks of an image.
@@ -483,7 +480,6 @@ WebPMuxError WebPMuxGetFrame(
WebPMuxError err;
WebPMuxImage* wpi;
- // Sanity checks.
if (mux == NULL || frame == NULL) {
return WEBP_MUX_INVALID_ARGUMENT;
}
diff --git a/src/3rdparty/libwebp/src/utils/bit_reader_inl_utils.h b/src/3rdparty/libwebp/src/utils/bit_reader_inl_utils.h
index 46b3880..24f3af7 100644
--- a/src/3rdparty/libwebp/src/utils/bit_reader_inl_utils.h
+++ b/src/3rdparty/libwebp/src/utils/bit_reader_inl_utils.h
@@ -55,7 +55,7 @@ void VP8LoadFinalBytes(VP8BitReader* const br);
// makes sure br->value_ has at least BITS bits worth of data
static WEBP_UBSAN_IGNORE_UNDEF WEBP_INLINE
-void VP8LoadNewBytes(VP8BitReader* const br) {
+void VP8LoadNewBytes(VP8BitReader* WEBP_RESTRICT const br) {
assert(br != NULL && br->buf_ != NULL);
// Read 'BITS' bits at a time if possible.
if (br->buf_ < br->buf_max_) {
@@ -104,7 +104,7 @@ void VP8LoadNewBytes(VP8BitReader* const br) {
}
// Read a bit with proba 'prob'. Speed-critical function!
-static WEBP_INLINE int VP8GetBit(VP8BitReader* const br,
+static WEBP_INLINE int VP8GetBit(VP8BitReader* WEBP_RESTRICT const br,
int prob, const char label[]) {
// Don't move this declaration! It makes a big speed difference to store
// 'range' *before* calling VP8LoadNewBytes(), even if this function doesn't
@@ -137,7 +137,8 @@ static WEBP_INLINE int VP8GetBit(VP8BitReader* const br,
// simplified version of VP8GetBit() for prob=0x80 (note shift is always 1 here)
static WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW WEBP_INLINE
-int VP8GetSigned(VP8BitReader* const br, int v, const char label[]) {
+int VP8GetSigned(VP8BitReader* WEBP_RESTRICT const br, int v,
+ const char label[]) {
if (br->bits_ < 0) {
VP8LoadNewBytes(br);
}
@@ -147,15 +148,15 @@ int VP8GetSigned(VP8BitReader* const br, int v, const char label[]) {
const range_t value = (range_t)(br->value_ >> pos);
const int32_t mask = (int32_t)(split - value) >> 31; // -1 or 0
br->bits_ -= 1;
- br->range_ += mask;
+ br->range_ += (range_t)mask;
br->range_ |= 1;
- br->value_ -= (bit_t)((split + 1) & mask) << pos;
+ br->value_ -= (bit_t)((split + 1) & (uint32_t)mask) << pos;
BT_TRACK(br);
return (v ^ mask) - mask;
}
}
-static WEBP_INLINE int VP8GetBitAlt(VP8BitReader* const br,
+static WEBP_INLINE int VP8GetBitAlt(VP8BitReader* WEBP_RESTRICT const br,
int prob, const char label[]) {
// Don't move this declaration! It makes a big speed difference to store
// 'range' *before* calling VP8LoadNewBytes(), even if this function doesn't
diff --git a/src/3rdparty/libwebp/src/utils/bit_writer_utils.c b/src/3rdparty/libwebp/src/utils/bit_writer_utils.c
index bef0e31..2f40850 100644
--- a/src/3rdparty/libwebp/src/utils/bit_writer_utils.c
+++ b/src/3rdparty/libwebp/src/utils/bit_writer_utils.c
@@ -278,7 +278,7 @@ void VP8LPutBitsFlushBits(VP8LBitWriter* const bw) {
// If needed, make some room by flushing some bits out.
if (bw->cur_ + VP8L_WRITER_BYTES > bw->end_) {
const uint64_t extra_size = (bw->end_ - bw->buf_) + MIN_EXTRA_SIZE;
- if (extra_size != (size_t)extra_size ||
+ if (!CheckSizeOverflow(extra_size) ||
!VP8LBitWriterResize(bw, (size_t)extra_size)) {
bw->cur_ = bw->buf_;
bw->error_ = 1;
@@ -314,7 +314,7 @@ void VP8LPutBitsInternal(VP8LBitWriter* const bw, uint32_t bits, int n_bits) {
while (used >= VP8L_WRITER_BITS) {
if (bw->cur_ + VP8L_WRITER_BYTES > bw->end_) {
const uint64_t extra_size = (bw->end_ - bw->buf_) + MIN_EXTRA_SIZE;
- if (extra_size != (size_t)extra_size ||
+ if (!CheckSizeOverflow(extra_size) ||
!VP8LBitWriterResize(bw, (size_t)extra_size)) {
bw->cur_ = bw->buf_;
bw->error_ = 1;
diff --git a/src/3rdparty/libwebp/src/utils/color_cache_utils.c b/src/3rdparty/libwebp/src/utils/color_cache_utils.c
index b09f538..7b5222b 100644
--- a/src/3rdparty/libwebp/src/utils/color_cache_utils.c
+++ b/src/3rdparty/libwebp/src/utils/color_cache_utils.c
@@ -20,22 +20,22 @@
//------------------------------------------------------------------------------
// VP8LColorCache.
-int VP8LColorCacheInit(VP8LColorCache* const cc, int hash_bits) {
+int VP8LColorCacheInit(VP8LColorCache* const color_cache, int hash_bits) {
const int hash_size = 1 << hash_bits;
- assert(cc != NULL);
+ assert(color_cache != NULL);
assert(hash_bits > 0);
- cc->colors_ = (uint32_t*)WebPSafeCalloc((uint64_t)hash_size,
- sizeof(*cc->colors_));
- if (cc->colors_ == NULL) return 0;
- cc->hash_shift_ = 32 - hash_bits;
- cc->hash_bits_ = hash_bits;
+ color_cache->colors_ = (uint32_t*)WebPSafeCalloc(
+ (uint64_t)hash_size, sizeof(*color_cache->colors_));
+ if (color_cache->colors_ == NULL) return 0;
+ color_cache->hash_shift_ = 32 - hash_bits;
+ color_cache->hash_bits_ = hash_bits;
return 1;
}
-void VP8LColorCacheClear(VP8LColorCache* const cc) {
- if (cc != NULL) {
- WebPSafeFree(cc->colors_);
- cc->colors_ = NULL;
+void VP8LColorCacheClear(VP8LColorCache* const color_cache) {
+ if (color_cache != NULL) {
+ WebPSafeFree(color_cache->colors_);
+ color_cache->colors_ = NULL;
}
}
diff --git a/src/3rdparty/libwebp/src/utils/color_cache_utils.h b/src/3rdparty/libwebp/src/utils/color_cache_utils.h
index ec21d51..b45d47c 100644
--- a/src/3rdparty/libwebp/src/utils/color_cache_utils.h
+++ b/src/3rdparty/libwebp/src/utils/color_cache_utils.h
@@ -26,7 +26,7 @@ extern "C" {
// Main color cache struct.
typedef struct {
- uint32_t *colors_; // color entries
+ uint32_t* colors_; // color entries
int hash_shift_; // Hash shift: 32 - hash_bits_.
int hash_bits_;
} VP8LColorCache;
diff --git a/src/3rdparty/libwebp/src/utils/huffman_encode_utils.c b/src/3rdparty/libwebp/src/utils/huffman_encode_utils.c
index 6f3b1bb..585db91 100644
--- a/src/3rdparty/libwebp/src/utils/huffman_encode_utils.c
+++ b/src/3rdparty/libwebp/src/utils/huffman_encode_utils.c
@@ -161,7 +161,7 @@ static void SetBitDepths(const HuffmanTree* const tree,
// especially when population counts are longer than 2**tree_limit, but
// we are not planning to use this with extremely long blocks.
//
-// See http://en.wikipedia.org/wiki/Huffman_coding
+// See https://en.wikipedia.org/wiki/Huffman_coding
static void GenerateOptimalTree(const uint32_t* const histogram,
int histogram_size,
HuffmanTree* tree, int tree_depth_limit,
@@ -404,8 +404,7 @@ static void ConvertBitDepthsToSymbols(HuffmanTreeCode* const tree) {
// Main entry point
void VP8LCreateHuffmanTree(uint32_t* const histogram, int tree_depth_limit,
- uint8_t* const buf_rle,
- HuffmanTree* const huff_tree,
+ uint8_t* const buf_rle, HuffmanTree* const huff_tree,
HuffmanTreeCode* const huff_code) {
const int num_symbols = huff_code->num_symbols;
memset(buf_rle, 0, num_symbols * sizeof(*buf_rle));
diff --git a/src/3rdparty/libwebp/src/utils/huffman_encode_utils.h b/src/3rdparty/libwebp/src/utils/huffman_encode_utils.h
index 3e6763c..3f7f1d8 100644
--- a/src/3rdparty/libwebp/src/utils/huffman_encode_utils.h
+++ b/src/3rdparty/libwebp/src/utils/huffman_encode_utils.h
@@ -51,7 +51,7 @@ int VP8LCreateCompressedHuffmanTree(const HuffmanTreeCode* const tree,
// huffman code tree.
void VP8LCreateHuffmanTree(uint32_t* const histogram, int tree_depth_limit,
uint8_t* const buf_rle, HuffmanTree* const huff_tree,
- HuffmanTreeCode* const tree);
+ HuffmanTreeCode* const huff_code);
#ifdef __cplusplus
}
diff --git a/src/3rdparty/libwebp/src/utils/huffman_utils.c b/src/3rdparty/libwebp/src/utils/huffman_utils.c
index 0cba0fb..90c2fbf 100644
--- a/src/3rdparty/libwebp/src/utils/huffman_utils.c
+++ b/src/3rdparty/libwebp/src/utils/huffman_utils.c
@@ -142,7 +142,7 @@ static int BuildHuffmanTable(HuffmanCode* const root_table, int root_bits,
{
int step; // step size to replicate values in current table
- uint32_t low = -1; // low bits for current root entry
+ uint32_t low = 0xffffffffu; // low bits for current root entry
uint32_t mask = total_size - 1; // mask for low bits
uint32_t key = 0; // reversed prefix code
int num_nodes = 1; // number of Huffman tree nodes
diff --git a/src/3rdparty/libwebp/src/utils/quant_levels_dec_utils.c b/src/3rdparty/libwebp/src/utils/quant_levels_dec_utils.c
index f65b6cd..97e7893 100644
--- a/src/3rdparty/libwebp/src/utils/quant_levels_dec_utils.c
+++ b/src/3rdparty/libwebp/src/utils/quant_levels_dec_utils.c
@@ -30,7 +30,7 @@
#define DFIX 4 // extra precision for ordered dithering
#define DSIZE 4 // dithering size (must be a power of two)
-// cf. http://en.wikipedia.org/wiki/Ordered_dithering
+// cf. https://en.wikipedia.org/wiki/Ordered_dithering
static const uint8_t kOrderedDither[DSIZE][DSIZE] = {
{ 0, 8, 2, 10 }, // coefficients are in DFIX fixed-point precision
{ 12, 4, 14, 6 },
diff --git a/src/3rdparty/libwebp/src/utils/rescaler_utils.c b/src/3rdparty/libwebp/src/utils/rescaler_utils.c
index 4bcae24..a0581a1 100644
--- a/src/3rdparty/libwebp/src/utils/rescaler_utils.c
+++ b/src/3rdparty/libwebp/src/utils/rescaler_utils.c
@@ -12,66 +12,74 @@
// Author: Skal (pascal.massimino@gmail.com)
#include <assert.h>
+#include <limits.h>
#include <stdlib.h>
#include <string.h>
#include "src/dsp/dsp.h"
#include "src/utils/rescaler_utils.h"
+#include "src/utils/utils.h"
//------------------------------------------------------------------------------
-void WebPRescalerInit(WebPRescaler* const wrk, int src_width, int src_height,
- uint8_t* const dst,
- int dst_width, int dst_height, int dst_stride,
- int num_channels, rescaler_t* const work) {
+int WebPRescalerInit(WebPRescaler* const rescaler,
+ int src_width, int src_height,
+ uint8_t* const dst,
+ int dst_width, int dst_height, int dst_stride,
+ int num_channels, rescaler_t* const work) {
const int x_add = src_width, x_sub = dst_width;
const int y_add = src_height, y_sub = dst_height;
- wrk->x_expand = (src_width < dst_width);
- wrk->y_expand = (src_height < dst_height);
- wrk->src_width = src_width;
- wrk->src_height = src_height;
- wrk->dst_width = dst_width;
- wrk->dst_height = dst_height;
- wrk->src_y = 0;
- wrk->dst_y = 0;
- wrk->dst = dst;
- wrk->dst_stride = dst_stride;
- wrk->num_channels = num_channels;
+ const uint64_t total_size = 2ull * dst_width * num_channels * sizeof(*work);
+ if (!CheckSizeOverflow(total_size)) return 0;
+
+ rescaler->x_expand = (src_width < dst_width);
+ rescaler->y_expand = (src_height < dst_height);
+ rescaler->src_width = src_width;
+ rescaler->src_height = src_height;
+ rescaler->dst_width = dst_width;
+ rescaler->dst_height = dst_height;
+ rescaler->src_y = 0;
+ rescaler->dst_y = 0;
+ rescaler->dst = dst;
+ rescaler->dst_stride = dst_stride;
+ rescaler->num_channels = num_channels;
// for 'x_expand', we use bilinear interpolation
- wrk->x_add = wrk->x_expand ? (x_sub - 1) : x_add;
- wrk->x_sub = wrk->x_expand ? (x_add - 1) : x_sub;
- if (!wrk->x_expand) { // fx_scale is not used otherwise
- wrk->fx_scale = WEBP_RESCALER_FRAC(1, wrk->x_sub);
+ rescaler->x_add = rescaler->x_expand ? (x_sub - 1) : x_add;
+ rescaler->x_sub = rescaler->x_expand ? (x_add - 1) : x_sub;
+ if (!rescaler->x_expand) { // fx_scale is not used otherwise
+ rescaler->fx_scale = WEBP_RESCALER_FRAC(1, rescaler->x_sub);
}
// vertical scaling parameters
- wrk->y_add = wrk->y_expand ? y_add - 1 : y_add;
- wrk->y_sub = wrk->y_expand ? y_sub - 1 : y_sub;
- wrk->y_accum = wrk->y_expand ? wrk->y_sub : wrk->y_add;
- if (!wrk->y_expand) {
+ rescaler->y_add = rescaler->y_expand ? y_add - 1 : y_add;
+ rescaler->y_sub = rescaler->y_expand ? y_sub - 1 : y_sub;
+ rescaler->y_accum = rescaler->y_expand ? rescaler->y_sub : rescaler->y_add;
+ if (!rescaler->y_expand) {
// This is WEBP_RESCALER_FRAC(dst_height, x_add * y_add) without the cast.
- // Its value is <= WEBP_RESCALER_ONE, because dst_height <= wrk->y_add, and
- // wrk->x_add >= 1;
- const uint64_t ratio =
- (uint64_t)dst_height * WEBP_RESCALER_ONE / (wrk->x_add * wrk->y_add);
+ // Its value is <= WEBP_RESCALER_ONE, because dst_height <= rescaler->y_add
+ // and rescaler->x_add >= 1;
+ const uint64_t num = (uint64_t)dst_height * WEBP_RESCALER_ONE;
+ const uint64_t den = (uint64_t)rescaler->x_add * rescaler->y_add;
+ const uint64_t ratio = num / den;
if (ratio != (uint32_t)ratio) {
// When ratio == WEBP_RESCALER_ONE, we can't represent the ratio with the
// current fixed-point precision. This happens when src_height ==
- // wrk->y_add (which == src_height), and wrk->x_add == 1.
+ // rescaler->y_add (which == src_height), and rescaler->x_add == 1.
// => We special-case fxy_scale = 0, in WebPRescalerExportRow().
- wrk->fxy_scale = 0;
+ rescaler->fxy_scale = 0;
} else {
- wrk->fxy_scale = (uint32_t)ratio;
+ rescaler->fxy_scale = (uint32_t)ratio;
}
- wrk->fy_scale = WEBP_RESCALER_FRAC(1, wrk->y_sub);
+ rescaler->fy_scale = WEBP_RESCALER_FRAC(1, rescaler->y_sub);
} else {
- wrk->fy_scale = WEBP_RESCALER_FRAC(1, wrk->x_add);
- // wrk->fxy_scale is unused here.
+ rescaler->fy_scale = WEBP_RESCALER_FRAC(1, rescaler->x_add);
+ // rescaler->fxy_scale is unused here.
}
- wrk->irow = work;
- wrk->frow = work + num_channels * dst_width;
- memset(work, 0, 2 * dst_width * num_channels * sizeof(*work));
+ rescaler->irow = work;
+ rescaler->frow = work + num_channels * dst_width;
+ memset(work, 0, (size_t)total_size);
WebPRescalerDspInit();
+ return 1;
}
int WebPRescalerGetScaledDimensions(int src_width, int src_height,
@@ -82,6 +90,7 @@ int WebPRescalerGetScaledDimensions(int src_width, int src_height,
{
int width = *scaled_width;
int height = *scaled_height;
+ const int max_size = INT_MAX / 2;
// if width is unspecified, scale original proportionally to height ratio.
if (width == 0 && src_height > 0) {
@@ -94,7 +103,7 @@ int WebPRescalerGetScaledDimensions(int src_width, int src_height,
(int)(((uint64_t)src_height * width + src_width - 1) / src_width);
}
// Check if the overall dimensions still make sense.
- if (width <= 0 || height <= 0) {
+ if (width <= 0 || height <= 0 || width > max_size || height > max_size) {
return 0;
}
@@ -107,31 +116,34 @@ int WebPRescalerGetScaledDimensions(int src_width, int src_height,
//------------------------------------------------------------------------------
// all-in-one calls
-int WebPRescaleNeededLines(const WebPRescaler* const wrk, int max_num_lines) {
- const int num_lines = (wrk->y_accum + wrk->y_sub - 1) / wrk->y_sub;
+int WebPRescaleNeededLines(const WebPRescaler* const rescaler,
+ int max_num_lines) {
+ const int num_lines =
+ (rescaler->y_accum + rescaler->y_sub - 1) / rescaler->y_sub;
return (num_lines > max_num_lines) ? max_num_lines : num_lines;
}
-int WebPRescalerImport(WebPRescaler* const wrk, int num_lines,
+int WebPRescalerImport(WebPRescaler* const rescaler, int num_lines,
const uint8_t* src, int src_stride) {
int total_imported = 0;
- while (total_imported < num_lines && !WebPRescalerHasPendingOutput(wrk)) {
- if (wrk->y_expand) {
- rescaler_t* const tmp = wrk->irow;
- wrk->irow = wrk->frow;
- wrk->frow = tmp;
+ while (total_imported < num_lines &&
+ !WebPRescalerHasPendingOutput(rescaler)) {
+ if (rescaler->y_expand) {
+ rescaler_t* const tmp = rescaler->irow;
+ rescaler->irow = rescaler->frow;
+ rescaler->frow = tmp;
}
- WebPRescalerImportRow(wrk, src);
- if (!wrk->y_expand) { // Accumulate the contribution of the new row.
+ WebPRescalerImportRow(rescaler, src);
+ if (!rescaler->y_expand) { // Accumulate the contribution of the new row.
int x;
- for (x = 0; x < wrk->num_channels * wrk->dst_width; ++x) {
- wrk->irow[x] += wrk->frow[x];
+ for (x = 0; x < rescaler->num_channels * rescaler->dst_width; ++x) {
+ rescaler->irow[x] += rescaler->frow[x];
}
}
- ++wrk->src_y;
+ ++rescaler->src_y;
src += src_stride;
++total_imported;
- wrk->y_accum -= wrk->y_sub;
+ rescaler->y_accum -= rescaler->y_sub;
}
return total_imported;
}
diff --git a/src/3rdparty/libwebp/src/utils/rescaler_utils.h b/src/3rdparty/libwebp/src/utils/rescaler_utils.h
index ca41e42..ef201ef 100644
--- a/src/3rdparty/libwebp/src/utils/rescaler_utils.h
+++ b/src/3rdparty/libwebp/src/utils/rescaler_utils.h
@@ -47,12 +47,13 @@ struct WebPRescaler {
};
// Initialize a rescaler given scratch area 'work' and dimensions of src & dst.
-void WebPRescalerInit(WebPRescaler* const rescaler,
- int src_width, int src_height,
- uint8_t* const dst,
- int dst_width, int dst_height, int dst_stride,
- int num_channels,
- rescaler_t* const work);
+// Returns false in case of error.
+int WebPRescalerInit(WebPRescaler* const rescaler,
+ int src_width, int src_height,
+ uint8_t* const dst,
+ int dst_width, int dst_height, int dst_stride,
+ int num_channels,
+ rescaler_t* const work);
// If either 'scaled_width' or 'scaled_height' (but not both) is 0 the value
// will be calculated preserving the aspect ratio, otherwise the values are
diff --git a/src/3rdparty/libwebp/src/utils/thread_utils.c b/src/3rdparty/libwebp/src/utils/thread_utils.c
index 438296b..4e470e1 100644
--- a/src/3rdparty/libwebp/src/utils/thread_utils.c
+++ b/src/3rdparty/libwebp/src/utils/thread_utils.c
@@ -73,7 +73,7 @@ typedef struct {
#endif
static int pthread_create(pthread_t* const thread, const void* attr,
- unsigned int (__stdcall *start)(void*), void* arg) {
+ unsigned int (__stdcall* start)(void*), void* arg) {
(void)attr;
#ifdef USE_CREATE_THREAD
*thread = CreateThread(NULL, /* lpThreadAttributes */
diff --git a/src/3rdparty/libwebp/src/utils/utils.c b/src/3rdparty/libwebp/src/utils/utils.c
index 44d5c14..a7c3a70 100644
--- a/src/3rdparty/libwebp/src/utils/utils.c
+++ b/src/3rdparty/libwebp/src/utils/utils.c
@@ -23,7 +23,7 @@
// alloc/free etc) is printed. For debugging/tuning purpose only (it's slow,
// and not multi-thread safe!).
// An interesting alternative is valgrind's 'massif' tool:
-// http://valgrind.org/docs/manual/ms-manual.html
+// https://valgrind.org/docs/manual/ms-manual.html
// Here is an example command line:
/* valgrind --tool=massif --massif-out-file=massif.out \
--stacks=yes --alloc-fn=WebPSafeMalloc --alloc-fn=WebPSafeCalloc
@@ -101,6 +101,9 @@ static void Increment(int* const v) {
#if defined(MALLOC_LIMIT)
{
const char* const malloc_limit_str = getenv("MALLOC_LIMIT");
+#if MALLOC_LIMIT > 1
+ mem_limit = (size_t)MALLOC_LIMIT;
+#endif
if (malloc_limit_str != NULL) {
mem_limit = atoi(malloc_limit_str);
}
@@ -169,16 +172,16 @@ static int CheckSizeArgumentsOverflow(uint64_t nmemb, size_t size) {
const uint64_t total_size = nmemb * size;
if (nmemb == 0) return 1;
if ((uint64_t)size > WEBP_MAX_ALLOCABLE_MEMORY / nmemb) return 0;
- if (total_size != (size_t)total_size) return 0;
+ if (!CheckSizeOverflow(total_size)) return 0;
#if defined(PRINT_MEM_INFO) && defined(MALLOC_FAIL_AT)
if (countdown_to_fail > 0 && --countdown_to_fail == 0) {
return 0; // fake fail!
}
#endif
-#if defined(MALLOC_LIMIT)
+#if defined(PRINT_MEM_INFO) && defined(MALLOC_LIMIT)
if (mem_limit > 0) {
const uint64_t new_total_mem = (uint64_t)total_mem + total_size;
- if (new_total_mem != (size_t)new_total_mem ||
+ if (!CheckSizeOverflow(new_total_mem) ||
new_total_mem > mem_limit) {
return 0; // fake fail!
}
@@ -216,9 +219,14 @@ void WebPSafeFree(void* const ptr) {
free(ptr);
}
-// Public API function.
+// Public API functions.
+
+void* WebPMalloc(size_t size) {
+ return WebPSafeMalloc(1, size);
+}
+
void WebPFree(void* ptr) {
- free(ptr);
+ WebPSafeFree(ptr);
}
//------------------------------------------------------------------------------
@@ -226,7 +234,7 @@ void WebPFree(void* ptr) {
void WebPCopyPlane(const uint8_t* src, int src_stride,
uint8_t* dst, int dst_stride, int width, int height) {
assert(src != NULL && dst != NULL);
- assert(src_stride >= width && dst_stride >= width);
+ assert(abs(src_stride) >= width && abs(dst_stride) >= width);
while (height-- > 0) {
memcpy(dst, src, width);
src += src_stride;
diff --git a/src/3rdparty/libwebp/src/utils/utils.h b/src/3rdparty/libwebp/src/utils/utils.h
index 2a3ec92..c5ee873 100644
--- a/src/3rdparty/libwebp/src/utils/utils.h
+++ b/src/3rdparty/libwebp/src/utils/utils.h
@@ -42,6 +42,10 @@ extern "C" {
#endif
#endif // WEBP_MAX_ALLOCABLE_MEMORY
+static WEBP_INLINE int CheckSizeOverflow(uint64_t size) {
+ return size == (size_t)size;
+}
+
// size-checking safe malloc/calloc: verify that the requested size is not too
// large, or return NULL. You don't need to call these for constructs like
// malloc(sizeof(foo)), but only if there's picture-dependent size involved
@@ -60,7 +64,8 @@ WEBP_EXTERN void WebPSafeFree(void* const ptr);
// Alignment
#define WEBP_ALIGN_CST 31
-#define WEBP_ALIGN(PTR) (((uintptr_t)(PTR) + WEBP_ALIGN_CST) & ~WEBP_ALIGN_CST)
+#define WEBP_ALIGN(PTR) (((uintptr_t)(PTR) + WEBP_ALIGN_CST) & \
+ ~(uintptr_t)WEBP_ALIGN_CST)
#include <string.h>
// memcpy() is the safe way of moving potentially unaligned 32b memory.
@@ -69,10 +74,19 @@ static WEBP_INLINE uint32_t WebPMemToUint32(const uint8_t* const ptr) {
memcpy(&A, ptr, sizeof(A));
return A;
}
+
+static WEBP_INLINE int32_t WebPMemToInt32(const uint8_t* const ptr) {
+ return (int32_t)WebPMemToUint32(ptr);
+}
+
static WEBP_INLINE void WebPUint32ToMem(uint8_t* const ptr, uint32_t val) {
memcpy(ptr, &val, sizeof(val));
}
+static WEBP_INLINE void WebPInt32ToMem(uint8_t* const ptr, int val) {
+ WebPUint32ToMem(ptr, (uint32_t)val);
+}
+
//------------------------------------------------------------------------------
// Reading/writing data.
@@ -107,24 +121,33 @@ static WEBP_INLINE void PutLE32(uint8_t* const data, uint32_t val) {
PutLE16(data + 2, (int)(val >> 16));
}
-// Returns (int)floor(log2(n)). n must be > 0.
// use GNU builtins where available.
#if defined(__GNUC__) && \
((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ >= 4)
+// Returns (int)floor(log2(n)). n must be > 0.
static WEBP_INLINE int BitsLog2Floor(uint32_t n) {
return 31 ^ __builtin_clz(n);
}
+// counts the number of trailing zero
+static WEBP_INLINE int BitsCtz(uint32_t n) { return __builtin_ctz(n); }
#elif defined(_MSC_VER) && _MSC_VER > 1310 && \
(defined(_M_X64) || defined(_M_IX86))
#include <intrin.h>
#pragma intrinsic(_BitScanReverse)
+#pragma intrinsic(_BitScanForward)
static WEBP_INLINE int BitsLog2Floor(uint32_t n) {
- unsigned long first_set_bit;
+ unsigned long first_set_bit; // NOLINT (runtime/int)
_BitScanReverse(&first_set_bit, n);
return first_set_bit;
}
-#else // default: use the C-version.
+static WEBP_INLINE int BitsCtz(uint32_t n) {
+ unsigned long first_set_bit; // NOLINT (runtime/int)
+ _BitScanForward(&first_set_bit, n);
+ return first_set_bit;
+}
+#else // default: use the (slow) C-version.
+#define WEBP_HAVE_SLOW_CLZ_CTZ // signal that the Clz/Ctz function are slow
// Returns 31 ^ clz(n) = log2(n). This is the default C-implementation, either
// based on table or not. Can be used as fallback if clz() is not available.
#define WEBP_NEED_LOG_TABLE_8BIT
@@ -139,6 +162,15 @@ static WEBP_INLINE int WebPLog2FloorC(uint32_t n) {
}
static WEBP_INLINE int BitsLog2Floor(uint32_t n) { return WebPLog2FloorC(n); }
+
+static WEBP_INLINE int BitsCtz(uint32_t n) {
+ int i;
+ for (i = 0; i < 32; ++i, n >>= 1) {
+ if (n & 1) return i;
+ }
+ return 32;
+}
+
#endif
//------------------------------------------------------------------------------
diff --git a/src/3rdparty/libwebp/src/webp/config.h b/src/3rdparty/libwebp/src/webp/config.h
index 80bb1f0..7b1a617 100644
--- a/src/3rdparty/libwebp/src/webp/config.h
+++ b/src/3rdparty/libwebp/src/webp/config.h
@@ -29,9 +29,6 @@
/* Define to 1 if you have the <inttypes.h> header file. */
/* #undef HAVE_INTTYPES_H */
-/* Define to 1 if you have the <memory.h> header file. */
-/* #undef HAVE_MEMORY_H */
-
/* Define to 1 if you have the <OpenGL/glut.h> header file. */
/* #undef HAVE_OPENGL_GLUT_H */
@@ -44,6 +41,9 @@
/* Define to 1 if you have the <stdint.h> header file. */
/* #undef HAVE_STDINT_H */
+/* Define to 1 if you have the <stdio.h> header file. */
+/* #undef HAVE_STDIO_H */
+
/* Define to 1 if you have the <stdlib.h> header file. */
/* #undef HAVE_STDLIB_H */
@@ -81,7 +81,7 @@
#define PACKAGE_NAME "libwebp"
/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "libwebp 1.0.3"
+#define PACKAGE_STRING "libwebp 1.2.4"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "libwebp"
@@ -90,17 +90,19 @@
#define PACKAGE_URL "http://developers.google.com/speed/webp"
/* Define to the version of this package. */
-#define PACKAGE_VERSION "1.0.3"
+#define PACKAGE_VERSION "1.2.4"
/* Define to necessary symbol if this constant uses a non-standard name on
your system. */
/* #undef PTHREAD_CREATE_JOINABLE */
-/* Define to 1 if you have the ANSI C header files. */
+/* Define to 1 if all of the C90 standard headers exist (not just the ones
+ required in a freestanding environment). This macro is provided for
+ backward compatibility; new code need not use it. */
/* #undef STDC_HEADERS */
/* Version number of package */
-#define VERSION "1.0.3"
+#define VERSION "1.2.4"
/* Enable experimental code */
/* #undef WEBP_EXPERIMENTAL_FEATURES */
diff --git a/src/3rdparty/libwebp/src/webp/decode.h b/src/3rdparty/libwebp/src/webp/decode.h
index ae8bfe8..d982475 100644
--- a/src/3rdparty/libwebp/src/webp/decode.h
+++ b/src/3rdparty/libwebp/src/webp/decode.h
@@ -20,7 +20,7 @@
extern "C" {
#endif
-#define WEBP_DECODER_ABI_VERSION 0x0208 // MAJOR(8b) + MINOR(8b)
+#define WEBP_DECODER_ABI_VERSION 0x0209 // MAJOR(8b) + MINOR(8b)
// Note: forward declaring enumerations is not allowed in (strict) C and C++,
// the types are left here for reference.
@@ -85,15 +85,12 @@ WEBP_EXTERN uint8_t* WebPDecodeBGR(const uint8_t* data, size_t data_size,
// Upon return, the Y buffer has a stride returned as '*stride', while U and V
// have a common stride returned as '*uv_stride'.
// Return NULL in case of error.
-// (*) Also named Y'CbCr. See: http://en.wikipedia.org/wiki/YCbCr
+// (*) Also named Y'CbCr. See: https://en.wikipedia.org/wiki/YCbCr
WEBP_EXTERN uint8_t* WebPDecodeYUV(const uint8_t* data, size_t data_size,
int* width, int* height,
uint8_t** u, uint8_t** v,
int* stride, int* uv_stride);
-// Releases memory returned by the WebPDecode*() functions above.
-WEBP_EXTERN void WebPFree(void* ptr);
-
// These five functions are variants of the above ones, that decode the image
// directly into a pre-allocated buffer 'output_buffer'. The maximum storage
// available in this buffer is indicated by 'output_buffer_size'. If this
@@ -456,7 +453,7 @@ struct WebPDecoderOptions {
int scaled_width, scaled_height; // final resolution
int use_threads; // if true, use multi-threaded decoding
int dithering_strength; // dithering strength (0=Off, 100=full)
- int flip; // flip output vertically
+ int flip; // if true, flip output vertically
int alpha_dithering_strength; // alpha dithering strength in [0..100]
uint32_t pad[5]; // padding for later use
diff --git a/src/3rdparty/libwebp/src/webp/encode.h b/src/3rdparty/libwebp/src/webp/encode.h
index 339f881..56b68e2 100644
--- a/src/3rdparty/libwebp/src/webp/encode.h
+++ b/src/3rdparty/libwebp/src/webp/encode.h
@@ -20,7 +20,7 @@
extern "C" {
#endif
-#define WEBP_ENCODER_ABI_VERSION 0x020e // MAJOR(8b) + MINOR(8b)
+#define WEBP_ENCODER_ABI_VERSION 0x020f // MAJOR(8b) + MINOR(8b)
// Note: forward declaring enumerations is not allowed in (strict) C and C++,
// the types are left here for reference.
@@ -79,9 +79,6 @@ WEBP_EXTERN size_t WebPEncodeLosslessBGRA(const uint8_t* bgra,
int width, int height, int stride,
uint8_t** output);
-// Releases memory returned by the WebPEncode*() functions above.
-WEBP_EXTERN void WebPFree(void* ptr);
-
//------------------------------------------------------------------------------
// Coding parameters
@@ -151,7 +148,8 @@ struct WebPConfig {
int use_delta_palette; // reserved for future lossless feature
int use_sharp_yuv; // if needed, use sharp (and slow) RGB->YUV conversion
- uint32_t pad[2]; // padding for later use
+ int qmin; // minimum permissible quality factor
+ int qmax; // maximum permissible quality factor
};
// Enumerate some predefined settings for WebPConfig, depending on the type
@@ -294,6 +292,11 @@ typedef enum WebPEncodingError {
#define WEBP_MAX_DIMENSION 16383
// Main exchange structure (input samples, output bytes, statistics)
+//
+// Once WebPPictureInit() has been called, it's ok to make all the INPUT fields
+// (use_argb, y/u/v, argb, ...) point to user-owned data, even if
+// WebPPictureAlloc() has been called. Depending on the value use_argb,
+// it's guaranteed that either *argb or *y/*u/*v content will be kept untouched.
struct WebPPicture {
// INPUT
//////////////
@@ -306,7 +309,7 @@ struct WebPPicture {
// YUV input (mostly used for input to lossy compression)
WebPEncCSP colorspace; // colorspace: should be YUV420 for now (=Y'CbCr).
int width, height; // dimensions (less or equal to WEBP_MAX_DIMENSION)
- uint8_t *y, *u, *v; // pointers to luma/chroma planes.
+ uint8_t* y, *u, *v; // pointers to luma/chroma planes.
int y_stride, uv_stride; // luma/chroma strides.
uint8_t* a; // pointer to the alpha plane
int a_stride; // stride of the alpha plane
@@ -350,7 +353,7 @@ struct WebPPicture {
uint32_t pad3[3]; // padding for later use
// Unused for now
- uint8_t *pad4, *pad5;
+ uint8_t* pad4, *pad5;
uint32_t pad6[8]; // padding for later use
// PRIVATE FIELDS
@@ -438,7 +441,7 @@ WEBP_EXTERN int WebPPictureCrop(WebPPicture* picture,
// the original dimension will be lost). Picture 'dst' need not be initialized
// with WebPPictureInit() if it is different from 'src', since its content will
// be overwritten.
-// Returns false in case of memory allocation error or invalid parameters.
+// Returns false in case of invalid parameters.
WEBP_EXTERN int WebPPictureView(const WebPPicture* src,
int left, int top, int width, int height,
WebPPicture* dst);
@@ -452,7 +455,7 @@ WEBP_EXTERN int WebPPictureIsView(const WebPPicture* picture);
// dimension will be calculated preserving the aspect ratio.
// No gamma correction is applied.
// Returns false in case of error (invalid parameter or insufficient memory).
-WEBP_EXTERN int WebPPictureRescale(WebPPicture* pic, int width, int height);
+WEBP_EXTERN int WebPPictureRescale(WebPPicture* picture, int width, int height);
// Colorspace conversion function to import RGB samples.
// Previous buffer will be free'd, if any.
@@ -523,7 +526,7 @@ WEBP_EXTERN int WebPPictureHasTransparency(const WebPPicture* picture);
// Remove the transparency information (if present) by blending the color with
// the background color 'background_rgb' (specified as 24bit RGB triplet).
// After this call, all alpha values are reset to 0xff.
-WEBP_EXTERN void WebPBlendAlpha(WebPPicture* pic, uint32_t background_rgb);
+WEBP_EXTERN void WebPBlendAlpha(WebPPicture* picture, uint32_t background_rgb);
//------------------------------------------------------------------------------
// Main call
diff --git a/src/3rdparty/libwebp/src/webp/format_constants.h b/src/3rdparty/libwebp/src/webp/format_constants.h
index eca6981..999035c 100644
--- a/src/3rdparty/libwebp/src/webp/format_constants.h
+++ b/src/3rdparty/libwebp/src/webp/format_constants.h
@@ -55,7 +55,7 @@
typedef enum {
PREDICTOR_TRANSFORM = 0,
CROSS_COLOR_TRANSFORM = 1,
- SUBTRACT_GREEN = 2,
+ SUBTRACT_GREEN_TRANSFORM = 2,
COLOR_INDEXING_TRANSFORM = 3
} VP8LImageTransformType;
diff --git a/src/3rdparty/libwebp/src/webp/mux.h b/src/3rdparty/libwebp/src/webp/mux.h
index 66096a9..7d27489 100644
--- a/src/3rdparty/libwebp/src/webp/mux.h
+++ b/src/3rdparty/libwebp/src/webp/mux.h
@@ -57,7 +57,7 @@ extern "C" {
WebPMuxGetChunk(mux, "ICCP", &icc_profile);
// ... (Consume icc_data).
WebPMuxDelete(mux);
- free(data);
+ WebPFree(data);
*/
// Note: forward declaring enumerations is not allowed in (strict) C and C++,
@@ -245,7 +245,7 @@ WEBP_EXTERN WebPMuxError WebPMuxPushFrame(
WebPMux* mux, const WebPMuxFrameInfo* frame, int copy_data);
// Gets the nth frame from the mux object.
-// The content of 'frame->bitstream' is allocated using malloc(), and NOT
+// The content of 'frame->bitstream' is allocated using WebPMalloc(), and NOT
// owned by the 'mux' object. It MUST be deallocated by the caller by calling
// WebPDataClear().
// nth=0 has a special meaning - last position.
@@ -376,10 +376,10 @@ WEBP_EXTERN WebPMuxError WebPMuxNumChunks(const WebPMux* mux,
// Assembles all chunks in WebP RIFF format and returns in 'assembled_data'.
// This function also validates the mux object.
// Note: The content of 'assembled_data' will be ignored and overwritten.
-// Also, the content of 'assembled_data' is allocated using malloc(), and NOT
-// owned by the 'mux' object. It MUST be deallocated by the caller by calling
-// WebPDataClear(). It's always safe to call WebPDataClear() upon return,
-// even in case of error.
+// Also, the content of 'assembled_data' is allocated using WebPMalloc(), and
+// NOT owned by the 'mux' object. It MUST be deallocated by the caller by
+// calling WebPDataClear(). It's always safe to call WebPDataClear() upon
+// return, even in case of error.
// Parameters:
// mux - (in/out) object whose chunks are to be assembled
// assembled_data - (out) assembled WebP data
diff --git a/src/3rdparty/libwebp/src/webp/mux_types.h b/src/3rdparty/libwebp/src/webp/mux_types.h
index ceea77d..2fe8195 100644
--- a/src/3rdparty/libwebp/src/webp/mux_types.h
+++ b/src/3rdparty/libwebp/src/webp/mux_types.h
@@ -14,7 +14,6 @@
#ifndef WEBP_WEBP_MUX_TYPES_H_
#define WEBP_WEBP_MUX_TYPES_H_
-#include <stdlib.h> // free()
#include <string.h> // memset()
#include "./types.h"
@@ -56,6 +55,7 @@ typedef enum WebPMuxAnimBlend {
// Data type used to describe 'raw' data, e.g., chunk data
// (ICC profile, metadata) and WebP compressed image data.
+// 'bytes' memory must be allocated using WebPMalloc() and such.
struct WebPData {
const uint8_t* bytes;
size_t size;
@@ -68,11 +68,11 @@ static WEBP_INLINE void WebPDataInit(WebPData* webp_data) {
}
}
-// Clears the contents of the 'webp_data' object by calling free(). Does not
-// deallocate the object itself.
+// Clears the contents of the 'webp_data' object by calling WebPFree().
+// Does not deallocate the object itself.
static WEBP_INLINE void WebPDataClear(WebPData* webp_data) {
if (webp_data != NULL) {
- free((void*)webp_data->bytes);
+ WebPFree((void*)webp_data->bytes);
WebPDataInit(webp_data);
}
}
@@ -83,7 +83,7 @@ static WEBP_INLINE int WebPDataCopy(const WebPData* src, WebPData* dst) {
if (src == NULL || dst == NULL) return 0;
WebPDataInit(dst);
if (src->bytes != NULL && src->size != 0) {
- dst->bytes = (uint8_t*)malloc(src->size);
+ dst->bytes = (uint8_t*)WebPMalloc(src->size);
if (dst->bytes == NULL) return 0;
memcpy((void*)dst->bytes, src->bytes, src->size);
dst->size = src->size;
diff --git a/src/3rdparty/libwebp/src/webp/types.h b/src/3rdparty/libwebp/src/webp/types.h
index 0ce2622..f255432 100644
--- a/src/3rdparty/libwebp/src/webp/types.h
+++ b/src/3rdparty/libwebp/src/webp/types.h
@@ -7,7 +7,7 @@
// be found in the AUTHORS file in the root of the source tree.
// -----------------------------------------------------------------------------
//
-// Common types
+// Common types + memory wrappers
//
// Author: Skal (pascal.massimino@gmail.com)
@@ -42,11 +42,31 @@ typedef long long int int64_t;
# if defined(__GNUC__) && __GNUC__ >= 4
# define WEBP_EXTERN extern __attribute__ ((visibility ("default")))
# else
-# define WEBP_EXTERN extern
+# if defined(_MSC_VER) && defined(WEBP_DLL)
+# define WEBP_EXTERN __declspec(dllexport)
+# else
+# define WEBP_EXTERN extern
+# endif
# endif /* __GNUC__ >= 4 */
#endif /* WEBP_EXTERN */
// Macro to check ABI compatibility (same major revision number)
#define WEBP_ABI_IS_INCOMPATIBLE(a, b) (((a) >> 8) != ((b) >> 8))
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Allocates 'size' bytes of memory. Returns NULL upon error. Memory
+// must be deallocated by calling WebPFree(). This function is made available
+// by the core 'libwebp' library.
+WEBP_EXTERN void* WebPMalloc(size_t size);
+
+// Releases memory returned by the WebPDecode*() functions (from decode.h).
+WEBP_EXTERN void WebPFree(void* ptr);
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
#endif // WEBP_WEBP_TYPES_H_
diff --git a/src/imageformats/configure.json b/src/imageformats/configure.json
index 4718398..5b876c3 100644
--- a/src/imageformats/configure.json
+++ b/src/imageformats/configure.json
@@ -155,7 +155,7 @@
"webp": {
"label": "WEBP",
"disable": "input.webp == 'no'",
- "condition": "features.imageformatplugin && !(config.winrt && arch.arm)",
+ "condition": "features.imageformatplugin",
"output": [
"privateFeature"
]
diff --git a/src/plugins/imageformats/dds/qddshandler.cpp b/src/plugins/imageformats/dds/qddshandler.cpp
index 845f9b3..a0ac19b 100644
--- a/src/plugins/imageformats/dds/qddshandler.cpp
+++ b/src/plugins/imageformats/dds/qddshandler.cpp
@@ -1382,13 +1382,6 @@ QDDSHandler::QDDSHandler() :
{
}
-#if QT_DEPRECATED_SINCE(5, 13)
-QByteArray QDDSHandler::name() const
-{
- return QByteArrayLiteral("dds");
-}
-#endif
-
bool QDDSHandler::canRead() const
{
if (m_scanState == ScanNotScanned && !canRead(device()))
diff --git a/src/plugins/imageformats/dds/qddshandler.h b/src/plugins/imageformats/dds/qddshandler.h
index f4bc888..0c6449a 100644
--- a/src/plugins/imageformats/dds/qddshandler.h
+++ b/src/plugins/imageformats/dds/qddshandler.h
@@ -53,10 +53,6 @@ class QDDSHandler : public QImageIOHandler
public:
QDDSHandler();
-#if QT_DEPRECATED_SINCE(5, 13)
- QByteArray name() const override;
-#endif
-
bool canRead() const override;
bool read(QImage *image) override;
bool write(const QImage &image) override;
diff --git a/src/plugins/imageformats/icns/main.cpp b/src/plugins/imageformats/icns/main.cpp
index 70dd034..6a5af47 100644
--- a/src/plugins/imageformats/icns/main.cpp
+++ b/src/plugins/imageformats/icns/main.cpp
@@ -60,12 +60,12 @@ QImageIOPlugin::Capabilities QICNSPlugin::capabilities(QIODevice *device, const
{
if (format == QByteArrayLiteral("icns"))
return Capabilities(CanRead | CanWrite);
+ Capabilities cap;
if (!format.isEmpty())
- return 0;
+ return cap;
if (!device || !device->isOpen())
- return 0;
+ return cap;
- Capabilities cap;
if (device->isReadable() && QICNSHandler::canRead(device))
cap |= CanRead;
if (device->isWritable())
diff --git a/src/plugins/imageformats/icns/qicnshandler.cpp b/src/plugins/imageformats/icns/qicnshandler.cpp
index 9733ed7..1bf9074 100644
--- a/src/plugins/imageformats/icns/qicnshandler.cpp
+++ b/src/plugins/imageformats/icns/qicnshandler.cpp
@@ -462,8 +462,12 @@ static bool parseIconEntryInfo(ICNSEntry &icon)
if (isIconCompressed(icon))
return true;
// Icon depth:
- if (!depth.isEmpty())
- icon.depth = ICNSEntry::Depth(depth.toUInt());
+ if (!depth.isEmpty()) {
+ const uint depthUInt = depth.toUInt();
+ if (depthUInt > 32)
+ return false;
+ icon.depth = ICNSEntry::Depth(depthUInt);
+ }
// Try mono if depth not found
if (icon.depth == ICNSEntry::DepthUnknown)
icon.depth = ICNSEntry::DepthMono;
@@ -515,6 +519,9 @@ static bool parseIconEntryInfo(ICNSEntry &icon)
}
icon.height = icon.width;
}
+ // Sanity check
+ if (icon.width == 0 || icon.width > 4096)
+ return false;
return true;
}
@@ -651,13 +658,6 @@ QICNSHandler::QICNSHandler() :
{
}
-#if QT_DEPRECATED_SINCE(5, 13)
-QByteArray QICNSHandler::name() const
-{
- return QByteArrayLiteral("icns");
-}
-#endif
-
bool QICNSHandler::canRead(QIODevice *device)
{
if (!device || !device->isReadable()) {
@@ -692,7 +692,7 @@ bool QICNSHandler::canRead() const
bool QICNSHandler::read(QImage *outImage)
{
QImage img;
- if (!ensureScanned()) {
+ if (!ensureScanned() || m_currentIconIndex >= m_icons.size()) {
qWarning("QICNSHandler::read(): The device wasn't parsed properly!");
return false;
}
@@ -899,7 +899,7 @@ bool QICNSHandler::scanDevice()
return false;
const qint64 blockDataOffset = device()->pos();
- if (!isBlockHeaderValid(blockHeader)) {
+ if (!isBlockHeaderValid(blockHeader, ICNSBlockHeaderSize + filelength - blockDataOffset)) {
qWarning("QICNSHandler::scanDevice(): Failed, bad header at pos %s. OSType \"%s\", length %u",
QByteArray::number(blockDataOffset).constData(),
nameFromOSType(blockHeader.ostype).constData(), blockHeader.length);
@@ -934,11 +934,14 @@ bool QICNSHandler::scanDevice()
case ICNSBlockHeader::TypeOdrp:
// Icns container seems to have an embedded icon variant container
// Let's start a scan for entries
- while (device()->pos() < nextBlockOffset) {
+ while (!stream.atEnd() && device()->pos() < nextBlockOffset) {
ICNSBlockHeader icon;
stream >> icon;
+ if (stream.status() != QDataStream::Ok)
+ return false;
// Check for incorrect variant entry header and stop scan
- if (!isBlockHeaderValid(icon, blockDataLength))
+ quint64 remaining = blockDataLength - (device()->pos() - blockDataOffset);
+ if (!isBlockHeaderValid(icon, ICNSBlockHeaderSize + remaining))
break;
if (!addEntry(icon, device()->pos(), blockHeader.ostype))
return false;
@@ -1010,7 +1013,7 @@ bool QICNSHandler::scanDevice()
break;
}
}
- return true;
+ return (m_icons.size() > 0);
}
const ICNSEntry &QICNSHandler::getIconMask(const ICNSEntry &icon) const
diff --git a/src/plugins/imageformats/icns/qicnshandler_p.h b/src/plugins/imageformats/icns/qicnshandler_p.h
index b532045..e83d4eb 100644
--- a/src/plugins/imageformats/icns/qicnshandler_p.h
+++ b/src/plugins/imageformats/icns/qicnshandler_p.h
@@ -132,10 +132,6 @@ public:
bool read(QImage *image) override;
bool write(const QImage &image) override;
-#if QT_DEPRECATED_SINCE(5, 13)
- QByteArray name() const override;
-#endif
-
bool supportsOption(ImageOption option) const override;
QVariant option(ImageOption option) const override;
diff --git a/src/plugins/imageformats/jp2/main.cpp b/src/plugins/imageformats/jp2/main.cpp
index a1f1281..22368a5 100644
--- a/src/plugins/imageformats/jp2/main.cpp
+++ b/src/plugins/imageformats/jp2/main.cpp
@@ -64,12 +64,12 @@ QImageIOPlugin::Capabilities QJp2Plugin::capabilities(QIODevice *device, const Q
{
if (format == "jp2" || format == "j2k")
return Capabilities(CanRead | CanWrite);
+ Capabilities cap;
if (!format.isEmpty())
- return 0;
+ return cap;
if (!device->isOpen())
- return 0;
+ return cap;
- Capabilities cap;
if (device->isReadable() && QJp2Handler::canRead(device, 0))
cap |= CanRead;
if (device->isWritable())
diff --git a/src/plugins/imageformats/jp2/qjp2handler.cpp b/src/plugins/imageformats/jp2/qjp2handler.cpp
index ce23480..cb34374 100644
--- a/src/plugins/imageformats/jp2/qjp2handler.cpp
+++ b/src/plugins/imageformats/jp2/qjp2handler.cpp
@@ -43,8 +43,10 @@
#include "qimage.h"
#include "qvariant.h"
#include "qcolor.h"
+#include "qimagereader.h"
#include <jasper/jasper.h>
+#include <math.h> // for pow
QT_BEGIN_NAMESPACE
@@ -308,17 +310,6 @@ bool QJp2Handler::supportsOption(ImageOption option) const
return (option == Quality || option == SubType);
}
-#if QT_DEPRECATED_SINCE(5, 13)
-/*!
- Return the common identifier of the format.
- For JPEG 2000 this will return "jp2".
- */
-QByteArray QJp2Handler::name() const
-{
- return QByteArrayLiteral("jp2");
-}
-#endif
-
/*!
Automatic resource handling for a jas_image_t*.
*/
@@ -343,16 +334,46 @@ private:
Jpeg2000JasperReader::Jpeg2000JasperReader(QIODevice *iod, SubFormat format)
: jasperOk(true), ioDevice(iod), format(format), hasAlpha(false)
{
+#if JAS_VERSION_MAJOR < 3
if (jas_init()) {
jasperOk = false;
qDebug("Jasper Library initialization failed");
}
+#else
+ jas_conf_clear();
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+ jas_conf_set_max_mem_usage(QImageReader::allocationLimit() * 1024 * 1024);
+#else
+ // 128MB seems to be enough.
+ jas_conf_set_max_mem_usage(128 * 1024 * 1024);
+#endif
+ if (jas_init_library()) {
+ jasperOk = false;
+ qDebug("Jasper library initialization failed");
+ }
+ if (jas_init_thread()) {
+ jas_cleanup_library();
+ jasperOk = false;
+ qDebug("Jasper thread initialization failed");
+ }
+#endif
}
Jpeg2000JasperReader::~Jpeg2000JasperReader()
{
+#if JAS_VERSION_MAJOR < 3
if (jasperOk)
jas_cleanup();
+#else
+ if (jasperOk) {
+ if (jas_cleanup_thread()) {
+ qDebug("Jasper thread cleanup failed");
+ }
+ if (jas_cleanup_library()) {
+ qDebug("Jasper library cleanup failed");
+ }
+ }
+#endif
}
/*! \internal
@@ -867,7 +888,7 @@ bool Jpeg2000JasperReader::write(const QImage &image, int quality)
}
// Open an empty jasper stream that grows automatically
- jas_stream_t * memory_stream = jas_stream_memopen(0, -1);
+ jas_stream_t * memory_stream = jas_stream_memopen(0, 0);
// Jasper wants a non-const string.
char *str = qstrdup(jasperFormatString.toLatin1().constData());
diff --git a/src/plugins/imageformats/jp2/qjp2handler_p.h b/src/plugins/imageformats/jp2/qjp2handler_p.h
index 16ddc8a..bdaf601 100644
--- a/src/plugins/imageformats/jp2/qjp2handler_p.h
+++ b/src/plugins/imageformats/jp2/qjp2handler_p.h
@@ -64,9 +64,6 @@ public:
QVariant option(ImageOption option) const override;
void setOption(ImageOption option, const QVariant &value) override;
bool supportsOption(ImageOption option) const override;
-#if QT_DEPRECATED_SINCE(5, 13)
- QByteArray name() const override;
-#endif
private:
Q_DECLARE_PRIVATE(QJp2Handler)
diff --git a/src/plugins/imageformats/macheif/main.cpp b/src/plugins/imageformats/macheif/main.cpp
index 12d9a4a..785ad1f 100644
--- a/src/plugins/imageformats/macheif/main.cpp
+++ b/src/plugins/imageformats/macheif/main.cpp
@@ -58,16 +58,16 @@ QImageIOPlugin::Capabilities QMacHeifPlugin::capabilities(QIODevice *device, con
{
static const Capabilities sysCaps = QIIOFHelpers::systemCapabilities(QStringLiteral("public.heic"));
+ Capabilities cap;
if (!sysCaps)
- return 0;
+ return cap;
if (format == "heic" || format == "heif")
return sysCaps;
if (!format.isEmpty())
- return 0;
+ return cap;
if (!device->isOpen())
- return 0;
+ return cap;
- Capabilities cap;
if (sysCaps.testFlag(CanRead) && device->isReadable() && QMacHeifHandler::canRead(device))
cap |= CanRead;
if (sysCaps.testFlag(CanWrite) && device->isWritable())
diff --git a/src/plugins/imageformats/macjp2/main.cpp b/src/plugins/imageformats/macjp2/main.cpp
index 08b497e..ea0cf44 100644
--- a/src/plugins/imageformats/macjp2/main.cpp
+++ b/src/plugins/imageformats/macjp2/main.cpp
@@ -57,12 +57,12 @@ QImageIOPlugin::Capabilities QMacJp2Plugin::capabilities(QIODevice *device, cons
{
if (format == "jp2")
return Capabilities(CanRead | CanWrite);
+ Capabilities cap;
if (!format.isEmpty())
- return 0;
+ return cap;
if (!device->isOpen())
- return 0;
+ return cap;
- Capabilities cap;
if (device->isReadable() && QMacJp2Handler::canRead(device))
cap |= CanRead;
if (device->isWritable())
diff --git a/src/plugins/imageformats/macjp2/qmacjp2handler.cpp b/src/plugins/imageformats/macjp2/qmacjp2handler.cpp
index 72f753a..11df94a 100644
--- a/src/plugins/imageformats/macjp2/qmacjp2handler.cpp
+++ b/src/plugins/imageformats/macjp2/qmacjp2handler.cpp
@@ -118,10 +118,4 @@ bool QMacJp2Handler::supportsOption(ImageOption option) const
return (option == Quality);
}
-QByteArray QMacJp2Handler::name() const
-{
- return QByteArrayLiteral("jp2");
-}
-
-
QT_END_NAMESPACE
diff --git a/src/plugins/imageformats/macjp2/qmacjp2handler.h b/src/plugins/imageformats/macjp2/qmacjp2handler.h
index bf0496d..e1deaf7 100644
--- a/src/plugins/imageformats/macjp2/qmacjp2handler.h
+++ b/src/plugins/imageformats/macjp2/qmacjp2handler.h
@@ -63,7 +63,6 @@ public:
QVariant option(ImageOption option) const override;
void setOption(ImageOption option, const QVariant &value) override;
bool supportsOption(ImageOption option) const override;
- QByteArray name() const override;
static bool canRead(QIODevice *iod);
diff --git a/src/plugins/imageformats/mng/main.cpp b/src/plugins/imageformats/mng/main.cpp
index 5e5b0a3..be82312 100644
--- a/src/plugins/imageformats/mng/main.cpp
+++ b/src/plugins/imageformats/mng/main.cpp
@@ -66,12 +66,12 @@ QImageIOPlugin::Capabilities QMngPlugin::capabilities(QIODevice *device, const Q
{
if (format == "mng")
return Capabilities(CanRead);
+ Capabilities cap;
if (!format.isEmpty())
- return 0;
+ return cap;
if (!device->isOpen())
- return 0;
+ return cap;
- Capabilities cap;
if (device->isReadable() && QMngHandler::canRead(device))
cap |= CanRead;
return cap;
diff --git a/src/plugins/imageformats/mng/qmnghandler.cpp b/src/plugins/imageformats/mng/qmnghandler.cpp
index 4106ba6..b37dca1 100644
--- a/src/plugins/imageformats/mng/qmnghandler.cpp
+++ b/src/plugins/imageformats/mng/qmnghandler.cpp
@@ -403,12 +403,6 @@ bool QMngHandler::canRead(QIODevice *device)
}
/*! \reimp */
-QByteArray QMngHandler::name() const
-{
- return "mng";
-}
-
-/*! \reimp */
bool QMngHandler::read(QImage *image)
{
Q_D(QMngHandler);
diff --git a/src/plugins/imageformats/mng/qmnghandler_p.h b/src/plugins/imageformats/mng/qmnghandler_p.h
index 0f9a207..de2ff5c 100644
--- a/src/plugins/imageformats/mng/qmnghandler_p.h
+++ b/src/plugins/imageformats/mng/qmnghandler_p.h
@@ -57,7 +57,6 @@ class QMngHandler : public QImageIOHandler
QMngHandler();
~QMngHandler();
bool canRead() const override;
- QByteArray name() const override;
bool read(QImage *image) override;
bool write(const QImage &image) override;
int currentImageNumber() const override;
diff --git a/src/plugins/imageformats/tga/main.cpp b/src/plugins/imageformats/tga/main.cpp
index 22fd3be..9177aa8 100644
--- a/src/plugins/imageformats/tga/main.cpp
+++ b/src/plugins/imageformats/tga/main.cpp
@@ -64,12 +64,12 @@ QImageIOPlugin::Capabilities QTgaPlugin::capabilities(QIODevice *device, const Q
{
if (format == "tga")
return Capabilities(CanRead);
+ Capabilities cap;
if (!format.isEmpty())
- return 0;
+ return cap;
if (!device->isOpen())
- return 0;
+ return cap;
- Capabilities cap;
if (device->isReadable() && QTgaHandler::canRead(device))
cap |= CanRead;
return cap;
diff --git a/src/plugins/imageformats/tga/qtgafile.cpp b/src/plugins/imageformats/tga/qtgafile.cpp
index 5d086c6..3961c16 100644
--- a/src/plugins/imageformats/tga/qtgafile.cpp
+++ b/src/plugins/imageformats/tga/qtgafile.cpp
@@ -220,9 +220,18 @@ QImage QTgaFile::readImage()
int offset = mHeader[IdLength]; // Mostly always zero
- // Even in TrueColor files a color pallette may be present
- if (mHeader[ColorMapType] == 1)
- offset += littleEndianInt(&mHeader[CMapLength]) * littleEndianInt(&mHeader[CMapDepth]);
+ // Even in TrueColor files a color palette may be present so we have to check it here
+ // even we only support image type 2 (= uncompressed true-color image)
+ if (mHeader[ColorMapType] == 1) {
+ int cmapDepth = mHeader[CMapDepth];
+ if (cmapDepth == 15) // 15 bit is stored as 16 bit + ignoring the highest bit (no alpha)
+ cmapDepth = 16;
+ if (cmapDepth != 16 && cmapDepth != 24 && cmapDepth != 32) {
+ mErrorMessage = tr("Invalid color map depth (%1)").arg(cmapDepth);
+ return {};
+ }
+ offset += littleEndianInt(&mHeader[CMapLength]) * cmapDepth / 8;
+ }
mDevice->seek(HeaderSize + offset);
diff --git a/src/plugins/imageformats/tga/qtgahandler.cpp b/src/plugins/imageformats/tga/qtgahandler.cpp
index 9277e50..53a16d0 100644
--- a/src/plugins/imageformats/tga/qtgahandler.cpp
+++ b/src/plugins/imageformats/tga/qtgahandler.cpp
@@ -66,6 +66,7 @@ bool QTgaHandler::canRead() const
setFormat("tga");
return true;
}
+ qWarning("QTgaHandler::canRead(): %s", qPrintable(tga->errorMessage()));
return false;
}
@@ -98,13 +99,6 @@ bool QTgaHandler::read(QImage *image)
return !image->isNull();
}
-#if QT_DEPRECATED_SINCE(5, 13)
-QByteArray QTgaHandler::name() const
-{
- return "tga";
-}
-#endif
-
QVariant QTgaHandler::option(ImageOption option) const
{
if (option == Size && canRead()) {
diff --git a/src/plugins/imageformats/tga/qtgahandler.h b/src/plugins/imageformats/tga/qtgahandler.h
index 6550a11..8e16bb6 100644
--- a/src/plugins/imageformats/tga/qtgahandler.h
+++ b/src/plugins/imageformats/tga/qtgahandler.h
@@ -55,10 +55,6 @@ public:
bool canRead() const override;
bool read(QImage *image) override;
-#if QT_DEPRECATED_SINCE(5, 13)
- QByteArray name() const override;
-#endif
-
static bool canRead(QIODevice *device);
QVariant option(ImageOption option) const override;
diff --git a/src/plugins/imageformats/tiff/CMakeLists.txt b/src/plugins/imageformats/tiff/CMakeLists.txt
new file mode 100644
index 0000000..d38a8ec
--- /dev/null
+++ b/src/plugins/imageformats/tiff/CMakeLists.txt
@@ -0,0 +1,100 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+# Generated from tiff.pro.
+
+#####################################################################
+## QTiffPlugin Plugin:
+#####################################################################
+
+# special case begin
+# Handle the conditional finding of either system zlib or qt zlib.
+if(NOT QT_FEATURE_system_zlib)
+ find_package(Qt6 COMPONENTS ZlibPrivate)
+elseif(NOT TARGET WrapZLIB::WrapZLIB)
+ qt_find_package(WrapZLIB PROVIDED_TARGETS WrapZLIB::WrapZLIB)
+endif()
+# special case end
+
+qt_internal_add_plugin(QTiffPlugin
+ OUTPUT_NAME qtiff
+ PLUGIN_TYPE imageformats
+ SOURCES
+ main.cpp
+ qtiffhandler.cpp qtiffhandler_p.h
+ LIBRARIES
+ Qt::Core
+ Qt::Gui
+)
+
+#### Keys ignored in scope 1:.:.:tiff.pro:<TRUE>:
+# OTHER_FILES = "tiff.json"
+# QT_FOR_CONFIG = "imageformats-private"
+
+## Scopes:
+#####################################################################
+
+qt_internal_extend_target(QTiffPlugin CONDITION QT_FEATURE_system_tiff
+ LIBRARIES
+ TIFF::TIFF
+)
+
+qt_internal_extend_target(QTiffPlugin CONDITION NOT QT_FEATURE_system_tiff
+ SOURCES
+ ../../../3rdparty/libtiff/libtiff/tif_aux.c
+ ../../../3rdparty/libtiff/libtiff/tif_close.c
+ ../../../3rdparty/libtiff/libtiff/tif_codec.c
+ ../../../3rdparty/libtiff/libtiff/tif_color.c
+ ../../../3rdparty/libtiff/libtiff/tif_compress.c
+ ../../../3rdparty/libtiff/libtiff/tif_dir.c
+ ../../../3rdparty/libtiff/libtiff/tif_dirinfo.c
+ ../../../3rdparty/libtiff/libtiff/tif_dirread.c
+ ../../../3rdparty/libtiff/libtiff/tif_dirwrite.c
+ ../../../3rdparty/libtiff/libtiff/tif_dumpmode.c
+ ../../../3rdparty/libtiff/libtiff/tif_error.c
+ ../../../3rdparty/libtiff/libtiff/tif_extension.c
+ ../../../3rdparty/libtiff/libtiff/tif_fax3.c
+ ../../../3rdparty/libtiff/libtiff/tif_fax3sm.c
+ ../../../3rdparty/libtiff/libtiff/tif_flush.c
+ ../../../3rdparty/libtiff/libtiff/tif_getimage.c
+ ../../../3rdparty/libtiff/libtiff/tif_hash_set.c
+ ../../../3rdparty/libtiff/libtiff/tif_luv.c
+ ../../../3rdparty/libtiff/libtiff/tif_lzw.c
+ ../../../3rdparty/libtiff/libtiff/tif_next.c
+ ../../../3rdparty/libtiff/libtiff/tif_open.c
+ ../../../3rdparty/libtiff/libtiff/tif_packbits.c
+ ../../../3rdparty/libtiff/libtiff/tif_pixarlog.c
+ ../../../3rdparty/libtiff/libtiff/tif_predict.c
+ ../../../3rdparty/libtiff/libtiff/tif_print.c
+ ../../../3rdparty/libtiff/libtiff/tif_read.c
+ ../../../3rdparty/libtiff/libtiff/tif_strip.c
+ ../../../3rdparty/libtiff/libtiff/tif_swab.c
+ ../../../3rdparty/libtiff/libtiff/tif_thunder.c
+ ../../../3rdparty/libtiff/libtiff/tif_tile.c
+ ../../../3rdparty/libtiff/libtiff/tif_version.c
+ ../../../3rdparty/libtiff/libtiff/tif_warning.c
+ ../../../3rdparty/libtiff/libtiff/tif_write.c
+ ../../../3rdparty/libtiff/libtiff/tif_zip.c
+ INCLUDE_DIRECTORIES
+ ../../../3rdparty/libtiff/libtiff
+)
+
+qt_internal_extend_target(QTiffPlugin CONDITION WIN32 AND NOT QT_FEATURE_system_tiff
+ SOURCES
+ ../../../3rdparty/libtiff/libtiff/tif_win32.c
+)
+
+qt_internal_extend_target(QTiffPlugin CONDITION UNIX AND NOT QT_FEATURE_system_tiff
+ SOURCES
+ ../../../3rdparty/libtiff/libtiff/tif_unix.c
+)
+
+qt_internal_extend_target(QTiffPlugin CONDITION QT_FEATURE_system_zlib AND NOT QT_FEATURE_system_tiff
+ LIBRARIES
+ WrapZLIB::WrapZLIB
+)
+
+qt_internal_extend_target(QTiffPlugin CONDITION NOT QT_FEATURE_system_tiff AND NOT QT_FEATURE_system_zlib
+ LIBRARIES
+ Qt::ZlibPrivate
+)
diff --git a/src/plugins/imageformats/tiff/main.cpp b/src/plugins/imageformats/tiff/main.cpp
index 2c34097..8882f35 100644
--- a/src/plugins/imageformats/tiff/main.cpp
+++ b/src/plugins/imageformats/tiff/main.cpp
@@ -60,12 +60,12 @@ QImageIOPlugin::Capabilities QTiffPlugin::capabilities(QIODevice *device, const
{
if (format == "tiff" || format == "tif")
return Capabilities(CanRead | CanWrite);
+ Capabilities cap;
if (!format.isEmpty())
- return 0;
+ return cap;
if (!device->isOpen())
- return 0;
+ return cap;
- Capabilities cap;
if (device->isReadable() && QTiffHandler::canRead(device))
cap |= CanRead;
if (device->isWritable())
diff --git a/src/plugins/imageformats/tiff/qtiffhandler.cpp b/src/plugins/imageformats/tiff/qtiffhandler.cpp
index 65873e1..f0dfe7f 100644
--- a/src/plugins/imageformats/tiff/qtiffhandler.cpp
+++ b/src/plugins/imageformats/tiff/qtiffhandler.cpp
@@ -43,6 +43,9 @@
#include <qdebug.h>
#include <qimage.h>
#include <qglobal.h>
+#include <qbuffer.h>
+#include <qfiledevice.h>
+
extern "C" {
#include "tiffio.h"
}
@@ -90,13 +93,33 @@ toff_t qtiffSizeProc(thandle_t fd)
return static_cast<QIODevice *>(fd)->size();
}
-int qtiffMapProc(thandle_t /*fd*/, tdata_t* /*pbase*/, toff_t* /*psize*/)
+int qtiffMapProc(thandle_t fd, void **base, toff_t *size)
{
+ QIODevice *device = static_cast<QIODevice *>(fd);
+
+ QFileDevice *file = qobject_cast<QFileDevice *>(device);
+ if (file) {
+ *base = file->map(0, file->size());
+ if (*base != nullptr) {
+ *size = file->size();
+ return 1;
+ }
+ } else {
+ QBuffer *buf = qobject_cast<QBuffer *>(device);
+ if (buf) {
+ *base = const_cast<char *>(buf->data().constData());
+ *size = buf->size();
+ return 1;
+ }
+ }
return 0;
}
-void qtiffUnmapProc(thandle_t /*fd*/, tdata_t /*base*/, toff_t /*size*/)
+void qtiffUnmapProc(thandle_t fd, void *base, toff_t /*size*/)
{
+ QFileDevice *file = qobject_cast<QFileDevice *>(static_cast<QIODevice *>(fd));
+ if (file && base)
+ file->unmap(static_cast<uchar *>(base));
}
@@ -116,7 +139,7 @@ public:
QImageIOHandler::Transformations transformation;
QImage::Format format;
QSize size;
- uint16 photometric;
+ uint16_t photometric;
bool grayscale;
bool headersRead;
int currentDirectory;
@@ -205,9 +228,14 @@ bool QTiffHandlerPrivate::canRead(QIODevice *device)
// current implementation uses TIFFClientOpen which needs to be
// able to seek, so sequential devices are not supported
- QByteArray header = device->peek(4);
- return header == QByteArray::fromRawData("\x49\x49\x2A\x00", 4)
- || header == QByteArray::fromRawData("\x4D\x4D\x00\x2A", 4);
+ char h[4];
+ if (device->peek(h, 4) != 4)
+ return false;
+ if ((h[0] == 0x49 && h[1] == 0x49) && (h[2] == 0x2a || h[2] == 0x2b) && h[3] == 0)
+ return true; // Little endian, classic or bigtiff
+ if ((h[0] == 0x4d && h[1] == 0x4d) && h[2] == 0 && (h[3] == 0x2a || h[3] == 0x2b))
+ return true; // Big endian, classic or bigtiff
+ return false;
}
bool QTiffHandlerPrivate::openForRead(QIODevice *device)
@@ -245,8 +273,8 @@ bool QTiffHandlerPrivate::readHeaders(QIODevice *device)
TIFFSetDirectory(tiff, currentDirectory);
- uint32 width;
- uint32 height;
+ uint32_t width;
+ uint32_t height;
if (!TIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &width)
|| !TIFFGetField(tiff, TIFFTAG_IMAGELENGTH, &height)
|| !TIFFGetField(tiff, TIFFTAG_PHOTOMETRIC, &photometric)) {
@@ -255,15 +283,15 @@ bool QTiffHandlerPrivate::readHeaders(QIODevice *device)
}
size = QSize(width, height);
- uint16 orientationTag;
+ uint16_t orientationTag;
if (TIFFGetField(tiff, TIFFTAG_ORIENTATION, &orientationTag))
transformation = exif2Qt(orientationTag);
// BitsPerSample defaults to 1 according to the TIFF spec.
- uint16 bitPerSample;
+ uint16_t bitPerSample;
if (!TIFFGetField(tiff, TIFFTAG_BITSPERSAMPLE, &bitPerSample))
bitPerSample = 1;
- uint16 samplesPerPixel; // they may be e.g. grayscale with 2 samples per pixel
+ uint16_t samplesPerPixel; // they may be e.g. grayscale with 2 samples per pixel
if (!TIFFGetField(tiff, TIFFTAG_SAMPLESPERPIXEL, &samplesPerPixel))
samplesPerPixel = 1;
@@ -278,13 +306,13 @@ bool QTiffHandlerPrivate::readHeaders(QIODevice *device)
else if ((grayscale || photometric == PHOTOMETRIC_PALETTE) && bitPerSample == 8 && samplesPerPixel == 1)
format = QImage::Format_Indexed8;
else if (samplesPerPixel < 4)
- if (bitPerSample > 8 && photometric == PHOTOMETRIC_RGB)
+ if (bitPerSample == 16 && photometric == PHOTOMETRIC_RGB)
format = QImage::Format_RGBX64;
else
format = QImage::Format_RGB32;
else {
- uint16 count;
- uint16 *extrasamples;
+ uint16_t count;
+ uint16_t *extrasamples;
// If there is any definition of the alpha-channel, libtiff will return premultiplied
// data to us. If there is none, libtiff will not touch it and we assume it to be
// non-premultiplied, matching behavior of tested image editors, and how older Qt
@@ -294,7 +322,7 @@ bool QTiffHandlerPrivate::readHeaders(QIODevice *device)
if (!gotField || !count || extrasamples[0] == EXTRASAMPLE_UNSPECIFIED)
premultiplied = false;
- if (bitPerSample > 8 && photometric == PHOTOMETRIC_RGB) {
+ if (bitPerSample == 16 && photometric == PHOTOMETRIC_RGB) {
// We read 64-bit raw, so unassoc remains unpremultiplied.
if (gotField && count && extrasamples[0] == EXTRASAMPLE_UNASSALPHA)
premultiplied = false;
@@ -356,6 +384,8 @@ bool QTiffHandler::read(QImage *image)
}
TIFF *const tiff = d->tiff;
+ if (TIFFIsTiled(tiff) && TIFFTileSize64(tiff) > uint64_t(image->sizeInBytes())) // Corrupt image
+ return false;
const quint32 width = d->size.width();
const quint32 height = d->size.height();
@@ -372,7 +402,7 @@ bool QTiffHandler::read(QImage *image)
}
image->setColorTable(colortable);
} else if (format == QImage::Format_Indexed8) {
- const uint16 tableSize = 256;
+ const uint16_t tableSize = 256;
QVector<QRgb> qtColorTable(tableSize);
if (d->grayscale) {
for (int i = 0; i<tableSize; ++i) {
@@ -381,9 +411,9 @@ bool QTiffHandler::read(QImage *image)
}
} else {
// create the color table
- uint16 *redTable = 0;
- uint16 *greenTable = 0;
- uint16 *blueTable = 0;
+ uint16_t *redTable = 0;
+ uint16_t *greenTable = 0;
+ uint16_t *blueTable = 0;
if (!TIFFGetField(tiff, TIFFTAG_COLORMAP, &redTable, &greenTable, &blueTable)) {
d->close();
return false;
@@ -418,14 +448,19 @@ bool QTiffHandler::read(QImage *image)
quint32 tileWidth, tileLength;
TIFFGetField(tiff, TIFFTAG_TILEWIDTH, &tileWidth);
TIFFGetField(tiff, TIFFTAG_TILELENGTH, &tileLength);
- uchar *buf = (uchar *)_TIFFmalloc(TIFFTileSize(tiff));
- if (!tileWidth || !tileLength || !buf) {
- _TIFFfree(buf);
+ if (!tileWidth || !tileLength || tileWidth % 16 || tileLength % 16) {
d->close();
return false;
}
quint32 byteWidth = (format == QImage::Format_Mono) ? (width + 7)/8 : (width * bytesPerPixel);
quint32 byteTileWidth = (format == QImage::Format_Mono) ? tileWidth/8 : (tileWidth * bytesPerPixel);
+ tmsize_t byteTileSize = TIFFTileSize(tiff);
+ uchar *buf = (uchar *)_TIFFmalloc(byteTileSize);
+ if (!buf || byteTileSize / tileLength < byteTileWidth) {
+ _TIFFfree(buf);
+ d->close();
+ return false;
+ }
for (quint32 y = 0; y < height; y += tileLength) {
for (quint32 x = 0; x < width; x += tileWidth) {
if (TIFFReadTile(tiff, buf, x, y, 0, 0) < 0) {
@@ -443,7 +478,11 @@ bool QTiffHandler::read(QImage *image)
}
_TIFFfree(buf);
} else {
- for (uint32 y=0; y<height; ++y) {
+ if (image->bytesPerLine() < TIFFScanlineSize(tiff)) {
+ d->close();
+ return false;
+ }
+ for (uint32_t y=0; y<height; ++y) {
if (TIFFReadScanline(tiff, image->scanLine(y), y, 0) < 0) {
d->close();
return false;
@@ -454,8 +493,8 @@ bool QTiffHandler::read(QImage *image)
rgb48fixup(image);
} else {
const int stopOnError = 1;
- if (TIFFReadRGBAImageOriented(tiff, width, height, reinterpret_cast<uint32 *>(image->bits()), qt2Exif(d->transformation), stopOnError)) {
- for (uint32 y=0; y<height; ++y)
+ if (TIFFReadRGBAImageOriented(tiff, width, height, reinterpret_cast<uint32_t *>(image->bits()), qt2Exif(d->transformation), stopOnError)) {
+ for (uint32_t y=0; y<height; ++y)
convert32BitOrder(image->scanLine(y), width);
} else {
d->close();
@@ -466,7 +505,7 @@ bool QTiffHandler::read(QImage *image)
float resX = 0;
float resY = 0;
- uint16 resUnit;
+ uint16_t resUnit;
if (!TIFFGetField(tiff, TIFFTAG_RESOLUTIONUNIT, &resUnit))
resUnit = RESUNIT_INCH;
@@ -489,7 +528,7 @@ bool QTiffHandler::read(QImage *image)
}
}
- uint32 count;
+ uint32_t count;
void *profile;
if (TIFFGetField(tiff, TIFFTAG_ICCPROFILE, &count, &profile)) {
QByteArray iccProfile(reinterpret_cast<const char *>(profile), count);
@@ -613,7 +652,7 @@ bool QTiffHandler::write(const QImage &image)
// configure image depth
const QImage::Format format = image.format();
if (format == QImage::Format_Mono || format == QImage::Format_MonoLSB) {
- uint16 photometric = PHOTOMETRIC_MINISBLACK;
+ uint16_t photometric = PHOTOMETRIC_MINISBLACK;
if (image.colorTable().at(0) == 0xffffffff)
photometric = PHOTOMETRIC_MINISWHITE;
if (!TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, photometric)
@@ -635,7 +674,7 @@ bool QTiffHandler::write(const QImage &image)
int chunkStart = y;
int chunkEnd = y + chunk.height();
while (y < chunkEnd) {
- if (TIFFWriteScanline(tiff, reinterpret_cast<uint32 *>(chunk.scanLine(y - chunkStart)), y) != 1) {
+ if (TIFFWriteScanline(tiff, reinterpret_cast<uint32_t *>(chunk.scanLine(y - chunkStart)), y) != 1) {
TIFFClose(tiff);
return false;
}
@@ -650,7 +689,7 @@ bool QTiffHandler::write(const QImage &image)
QVector<QRgb> colorTable = effectiveColorTable(image);
bool isGrayscale = checkGrayscale(colorTable);
if (isGrayscale) {
- uint16 photometric = PHOTOMETRIC_MINISBLACK;
+ uint16_t photometric = PHOTOMETRIC_MINISBLACK;
if (colorTable.at(0) == 0xffffffff)
photometric = PHOTOMETRIC_MINISWHITE;
if (!TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, photometric)
@@ -672,9 +711,9 @@ bool QTiffHandler::write(const QImage &image)
// allocate the color tables
const int tableSize = colorTable.size();
Q_ASSERT(tableSize <= 256);
- QVarLengthArray<uint16> redTable(tableSize);
- QVarLengthArray<uint16> greenTable(tableSize);
- QVarLengthArray<uint16> blueTable(tableSize);
+ QVarLengthArray<uint16_t> redTable(tableSize);
+ QVarLengthArray<uint16_t> greenTable(tableSize);
+ QVarLengthArray<uint16_t> blueTable(tableSize);
// set the color table
for (int i = 0; i<tableSize; ++i) {
@@ -727,7 +766,7 @@ bool QTiffHandler::write(const QImage &image)
} else if (format == QImage::Format_RGBA64
|| format == QImage::Format_RGBA64_Premultiplied) {
const bool premultiplied = image.format() != QImage::Format_RGBA64;
- const uint16 extrasamples = premultiplied ? EXTRASAMPLE_ASSOCALPHA : EXTRASAMPLE_UNASSALPHA;
+ const uint16_t extrasamples = premultiplied ? EXTRASAMPLE_ASSOCALPHA : EXTRASAMPLE_UNASSALPHA;
if (!TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB)
|| !TIFFSetField(tiff, TIFFTAG_COMPRESSION, compression == NoCompression ? COMPRESSION_NONE : COMPRESSION_LZW)
|| !TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, 4)
@@ -775,7 +814,7 @@ bool QTiffHandler::write(const QImage &image)
} else {
const bool premultiplied = image.format() != QImage::Format_ARGB32
&& image.format() != QImage::Format_RGBA8888;
- const uint16 extrasamples = premultiplied ? EXTRASAMPLE_ASSOCALPHA : EXTRASAMPLE_UNASSALPHA;
+ const uint16_t extrasamples = premultiplied ? EXTRASAMPLE_ASSOCALPHA : EXTRASAMPLE_UNASSALPHA;
if (!TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB)
|| !TIFFSetField(tiff, TIFFTAG_COMPRESSION, compression == NoCompression ? COMPRESSION_NONE : COMPRESSION_LZW)
|| !TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, 4)
@@ -811,13 +850,6 @@ bool QTiffHandler::write(const QImage &image)
return true;
}
-#if QT_DEPRECATED_SINCE(5, 13)
-QByteArray QTiffHandler::name() const
-{
- return "tiff";
-}
-#endif
-
QVariant QTiffHandler::option(ImageOption option) const
{
if (option == Size && canRead()) {
@@ -896,9 +928,9 @@ int QTiffHandler::currentImageNumber() const
void QTiffHandler::convert32BitOrder(void *buffer, int width)
{
- uint32 *target = reinterpret_cast<uint32 *>(buffer);
- for (int32 x=0; x<width; ++x) {
- uint32 p = target[x];
+ uint32_t *target = reinterpret_cast<uint32_t *>(buffer);
+ for (int32_t x=0; x<width; ++x) {
+ uint32_t p = target[x];
// convert between ARGB and ABGR
target[x] = (p & 0xff000000)
| ((p & 0x00ff0000) >> 16)
@@ -915,7 +947,7 @@ void QTiffHandler::rgb48fixup(QImage *image)
uchar *scanline = image->bits();
const qsizetype bpl = image->bytesPerLine();
for (int y = 0; y < h; ++y) {
- quint16 *dst = reinterpret_cast<uint16 *>(scanline);
+ quint16 *dst = reinterpret_cast<uint16_t *>(scanline);
for (int x = w - 1; x >= 0; --x) {
dst[x * 4 + 3] = 0xffff;
dst[x * 4 + 2] = dst[x * 3 + 2];
diff --git a/src/plugins/imageformats/tiff/qtiffhandler_p.h b/src/plugins/imageformats/tiff/qtiffhandler_p.h
index c2eb412..97a63e1 100644
--- a/src/plugins/imageformats/tiff/qtiffhandler_p.h
+++ b/src/plugins/imageformats/tiff/qtiffhandler_p.h
@@ -55,10 +55,6 @@ public:
bool read(QImage *image) override;
bool write(const QImage &image) override;
-#if QT_DEPRECATED_SINCE(5, 13)
- QByteArray name() const override;
-#endif
-
static bool canRead(QIODevice *device);
QVariant option(ImageOption option) const override;
diff --git a/src/plugins/imageformats/wbmp/main.cpp b/src/plugins/imageformats/wbmp/main.cpp
index 45da0ca..5e8206e 100644
--- a/src/plugins/imageformats/wbmp/main.cpp
+++ b/src/plugins/imageformats/wbmp/main.cpp
@@ -64,13 +64,13 @@ QImageIOPlugin::Capabilities QWbmpPlugin::capabilities(QIODevice *device, const
if (format == "wbmp")
return Capabilities(CanRead | CanWrite);
+ Capabilities cap;
if (!format.isEmpty())
- return 0;
+ return cap;
if (!device->isOpen())
- return 0;
+ return cap;
- Capabilities cap;
if (device->isReadable() && QWbmpHandler::canRead(device))
cap |= CanRead;
diff --git a/src/plugins/imageformats/webp/CMakeLists.txt b/src/plugins/imageformats/webp/CMakeLists.txt
new file mode 100644
index 0000000..fbbcc1c
--- /dev/null
+++ b/src/plugins/imageformats/webp/CMakeLists.txt
@@ -0,0 +1,208 @@
+# Generated from webp.pro.
+
+#####################################################################
+## QWebpPlugin Plugin:
+#####################################################################
+
+qt_internal_add_plugin(QWebpPlugin
+ OUTPUT_NAME qwebp
+ PLUGIN_TYPE imageformats
+ SOURCES
+ main.cpp
+ qwebphandler.cpp qwebphandler_p.h
+ LIBRARIES
+ Qt::Core
+ Qt::Gui
+)
+
+#### Keys ignored in scope 1:.:.:webp.pro:<TRUE>:
+# OTHER_FILES = "webp.json"
+# QT_FOR_CONFIG = "imageformats-private"
+
+## Scopes:
+#####################################################################
+
+qt_internal_extend_target(QWebpPlugin CONDITION QT_FEATURE_system_webp
+ LIBRARIES
+ WrapWebP::WrapWebP
+)
+
+qt_internal_extend_target(QWebpPlugin CONDITION NOT QT_FEATURE_system_webp
+ SOURCES
+ ../../../3rdparty/libwebp/sharpyuv/sharpyuv.c
+ ../../../3rdparty/libwebp/sharpyuv/sharpyuv_cpu.c
+ ../../../3rdparty/libwebp/sharpyuv/sharpyuv_csp.c
+ ../../../3rdparty/libwebp/sharpyuv/sharpyuv_dsp.c
+ ../../../3rdparty/libwebp/sharpyuv/sharpyuv_gamma.c
+ ../../../3rdparty/libwebp/sharpyuv/sharpyuv_sse2.c
+ ../../../3rdparty/libwebp/src/dec/alpha_dec.c
+ ../../../3rdparty/libwebp/src/dec/buffer_dec.c
+ ../../../3rdparty/libwebp/src/dec/frame_dec.c
+ ../../../3rdparty/libwebp/src/dec/idec_dec.c
+ ../../../3rdparty/libwebp/src/dec/io_dec.c
+ ../../../3rdparty/libwebp/src/dec/quant_dec.c
+ ../../../3rdparty/libwebp/src/dec/tree_dec.c
+ ../../../3rdparty/libwebp/src/dec/vp8_dec.c
+ ../../../3rdparty/libwebp/src/dec/vp8l_dec.c
+ ../../../3rdparty/libwebp/src/dec/webp_dec.c
+ ../../../3rdparty/libwebp/src/demux/anim_decode.c
+ ../../../3rdparty/libwebp/src/demux/demux.c
+ ../../../3rdparty/libwebp/src/dsp/alpha_processing.c
+ ../../../3rdparty/libwebp/src/dsp/alpha_processing_mips_dsp_r2.c
+ ../../../3rdparty/libwebp/src/dsp/alpha_processing_sse2.c
+ ../../../3rdparty/libwebp/src/dsp/alpha_processing_sse41.c
+ ../../../3rdparty/libwebp/src/dsp/cost.c
+ ../../../3rdparty/libwebp/src/dsp/cost_mips32.c
+ ../../../3rdparty/libwebp/src/dsp/cost_mips_dsp_r2.c
+ ../../../3rdparty/libwebp/src/dsp/cost_neon.c
+ ../../../3rdparty/libwebp/src/dsp/cost_sse2.c
+ ../../../3rdparty/libwebp/src/dsp/cpu.c
+ ../../../3rdparty/libwebp/src/dsp/dec.c
+ ../../../3rdparty/libwebp/src/dsp/dec_clip_tables.c
+ ../../../3rdparty/libwebp/src/dsp/dec_mips32.c
+ ../../../3rdparty/libwebp/src/dsp/dec_mips_dsp_r2.c
+ ../../../3rdparty/libwebp/src/dsp/dec_msa.c
+ ../../../3rdparty/libwebp/src/dsp/dec_sse2.c
+ ../../../3rdparty/libwebp/src/dsp/dec_sse41.c
+ ../../../3rdparty/libwebp/src/dsp/enc.c
+ ../../../3rdparty/libwebp/src/dsp/enc_mips32.c
+ ../../../3rdparty/libwebp/src/dsp/enc_mips_dsp_r2.c
+ ../../../3rdparty/libwebp/src/dsp/enc_msa.c
+ ../../../3rdparty/libwebp/src/dsp/enc_sse2.c
+ ../../../3rdparty/libwebp/src/dsp/enc_sse41.c
+ ../../../3rdparty/libwebp/src/dsp/filters.c
+ ../../../3rdparty/libwebp/src/dsp/filters_mips_dsp_r2.c
+ ../../../3rdparty/libwebp/src/dsp/filters_msa.c
+ ../../../3rdparty/libwebp/src/dsp/filters_sse2.c
+ ../../../3rdparty/libwebp/src/dsp/lossless.c
+ ../../../3rdparty/libwebp/src/dsp/lossless_enc.c
+ ../../../3rdparty/libwebp/src/dsp/lossless_enc_mips32.c
+ ../../../3rdparty/libwebp/src/dsp/lossless_enc_mips_dsp_r2.c
+ ../../../3rdparty/libwebp/src/dsp/lossless_enc_msa.c
+ ../../../3rdparty/libwebp/src/dsp/lossless_enc_sse2.c
+ ../../../3rdparty/libwebp/src/dsp/lossless_enc_sse41.c
+ ../../../3rdparty/libwebp/src/dsp/lossless_mips_dsp_r2.c
+ ../../../3rdparty/libwebp/src/dsp/lossless_sse2.c
+ ../../../3rdparty/libwebp/src/dsp/lossless_sse41.c
+ ../../../3rdparty/libwebp/src/dsp/rescaler.c
+ ../../../3rdparty/libwebp/src/dsp/rescaler_mips32.c
+ ../../../3rdparty/libwebp/src/dsp/rescaler_mips_dsp_r2.c
+ ../../../3rdparty/libwebp/src/dsp/rescaler_msa.c
+ ../../../3rdparty/libwebp/src/dsp/rescaler_sse2.c
+ ../../../3rdparty/libwebp/src/dsp/ssim.c
+ ../../../3rdparty/libwebp/src/dsp/ssim_sse2.c
+ ../../../3rdparty/libwebp/src/dsp/upsampling.c
+ ../../../3rdparty/libwebp/src/dsp/upsampling_mips_dsp_r2.c
+ ../../../3rdparty/libwebp/src/dsp/upsampling_msa.c
+ ../../../3rdparty/libwebp/src/dsp/upsampling_sse2.c
+ ../../../3rdparty/libwebp/src/dsp/upsampling_sse41.c
+ ../../../3rdparty/libwebp/src/dsp/yuv.c
+ ../../../3rdparty/libwebp/src/dsp/yuv_mips32.c
+ ../../../3rdparty/libwebp/src/dsp/yuv_mips_dsp_r2.c
+ ../../../3rdparty/libwebp/src/dsp/yuv_sse2.c
+ ../../../3rdparty/libwebp/src/dsp/yuv_sse41.c
+ ../../../3rdparty/libwebp/src/enc/alpha_enc.c
+ ../../../3rdparty/libwebp/src/enc/analysis_enc.c
+ ../../../3rdparty/libwebp/src/enc/backward_references_cost_enc.c
+ ../../../3rdparty/libwebp/src/enc/backward_references_enc.c
+ ../../../3rdparty/libwebp/src/enc/config_enc.c
+ ../../../3rdparty/libwebp/src/enc/cost_enc.c
+ ../../../3rdparty/libwebp/src/enc/filter_enc.c
+ ../../../3rdparty/libwebp/src/enc/frame_enc.c
+ ../../../3rdparty/libwebp/src/enc/histogram_enc.c
+ ../../../3rdparty/libwebp/src/enc/iterator_enc.c
+ ../../../3rdparty/libwebp/src/enc/near_lossless_enc.c
+ ../../../3rdparty/libwebp/src/enc/picture_csp_enc.c
+ ../../../3rdparty/libwebp/src/enc/picture_enc.c
+ ../../../3rdparty/libwebp/src/enc/picture_psnr_enc.c
+ ../../../3rdparty/libwebp/src/enc/picture_rescale_enc.c
+ ../../../3rdparty/libwebp/src/enc/picture_tools_enc.c
+ ../../../3rdparty/libwebp/src/enc/predictor_enc.c
+ ../../../3rdparty/libwebp/src/enc/quant_enc.c
+ ../../../3rdparty/libwebp/src/enc/syntax_enc.c
+ ../../../3rdparty/libwebp/src/enc/token_enc.c
+ ../../../3rdparty/libwebp/src/enc/tree_enc.c
+ ../../../3rdparty/libwebp/src/enc/vp8l_enc.c
+ ../../../3rdparty/libwebp/src/enc/webp_enc.c
+ ../../../3rdparty/libwebp/src/mux/anim_encode.c
+ ../../../3rdparty/libwebp/src/mux/muxedit.c
+ ../../../3rdparty/libwebp/src/mux/muxinternal.c
+ ../../../3rdparty/libwebp/src/mux/muxread.c
+ ../../../3rdparty/libwebp/src/utils/bit_reader_utils.c
+ ../../../3rdparty/libwebp/src/utils/bit_writer_utils.c
+ ../../../3rdparty/libwebp/src/utils/color_cache_utils.c
+ ../../../3rdparty/libwebp/src/utils/filters_utils.c
+ ../../../3rdparty/libwebp/src/utils/huffman_encode_utils.c
+ ../../../3rdparty/libwebp/src/utils/huffman_utils.c
+ ../../../3rdparty/libwebp/src/utils/quant_levels_dec_utils.c
+ ../../../3rdparty/libwebp/src/utils/quant_levels_utils.c
+ ../../../3rdparty/libwebp/src/utils/random_utils.c
+ ../../../3rdparty/libwebp/src/utils/rescaler_utils.c
+ ../../../3rdparty/libwebp/src/utils/thread_utils.c
+ ../../../3rdparty/libwebp/src/utils/utils.c
+ INCLUDE_DIRECTORIES
+ ../../../3rdparty/libwebp
+ ../../../3rdparty/libwebp/sharpyuv
+ ../../../3rdparty/libwebp/src
+ ../../../3rdparty/libwebp/src/dec
+ ../../../3rdparty/libwebp/src/dsp
+ ../../../3rdparty/libwebp/src/enc
+ ../../../3rdparty/libwebp/src/mux
+ ../../../3rdparty/libwebp/src/utils
+ ../../../3rdparty/libwebp/src/webp
+)
+
+qt_internal_extend_target(QWebpPlugin CONDITION ANDROID AND NOT ANDROID_EMBEDDED AND NOT QT_FEATURE_system_webp
+ SOURCES
+ ${CMAKE_ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c # special case
+ INCLUDE_DIRECTORIES
+ ${CMAKE_ANDROID_NDK}/sources/android/cpufeatures # special case
+)
+
+# special case begin
+set(neon_sources
+ ../../../3rdparty/libwebp/sharpyuv/sharpyuv_neon.c
+ ../../../3rdparty/libwebp/src/dsp/alpha_processing_neon.c
+ ../../../3rdparty/libwebp/src/dsp/dec_neon.c
+ ../../../3rdparty/libwebp/src/dsp/enc_neon.c
+ ../../../3rdparty/libwebp/src/dsp/filters_neon.c
+ ../../../3rdparty/libwebp/src/dsp/lossless_enc_neon.c
+ ../../../3rdparty/libwebp/src/dsp/lossless_neon.c
+ ../../../3rdparty/libwebp/src/dsp/rescaler_neon.c
+ ../../../3rdparty/libwebp/src/dsp/upsampling_neon.c
+ ../../../3rdparty/libwebp/src/dsp/yuv_neon.c
+)
+
+if(NOT QT_FEATURE_system_webp)
+ if(ANDROID)
+ qt_internal_extend_target(QWebpPlugin
+ CONDITION (CMAKE_ANDROID_ARM_NEON OR CMAKE_ANDROID_ARCH_ABI STREQUAL "arm64-v8a")
+ SOURCES ${neon_sources}
+ )
+ else()
+ # For universal macOS and iOS, and other platforms that support neon
+ qt_internal_add_simd_part(QWebpPlugin SIMD neon SOURCES ${neon_sources})
+ endif()
+endif()
+# special case end
+
+#### Keys ignored in scope 6:.:../../../3rdparty:../../../3rdparty/libwebp.pri:INTEGRITY:
+# QMAKE_CFLAGS = "-c99"
+
+#### Keys ignored in scope 12:.:../../../3rdparty:../../../3rdparty/libwebp.pri:else:
+# QMAKE_EXTRA_COMPILERS = "neon_comp"
+# neon_comp.commands = "$$QMAKE_CC" "-c" "$(CFLAGS)" "$$QMAKE_CFLAGS_NEON" "$(INCPATH)" "${QMAKE_FILE_IN}"
+# neon_comp.dependency_type = "TYPE_C"
+# neon_comp.input = "SOURCES_FOR_NEON"
+# neon_comp.name = "compiling[neon]" "${QMAKE_FILE_IN}"
+# neon_comp.output = "${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${firstQMAKE_EXT_OBJ}"
+# neon_comp.variable_out = "OBJECTS"
+
+#### Keys ignored in scope 13:.:../../../3rdparty:../../../3rdparty/libwebp.pri:MSVC:
+# neon_comp.commands = "-Fo${QMAKE_FILE_OUT}"
+
+#### Keys ignored in scope 14:.:../../../3rdparty:../../../3rdparty/libwebp.pri:else:
+# neon_comp.commands = "-o" "${QMAKE_FILE_OUT}"
+
+#### Keys ignored in scope 15:.:../../../3rdparty:../../../3rdparty/libwebp.pri:silent:
+# neon_comp.commands = "@echo" "compiling[neon]" "${QMAKE_FILE_IN}" "&&"
diff --git a/src/plugins/imageformats/webp/main.cpp b/src/plugins/imageformats/webp/main.cpp
index 7e9405b..02a3ed4 100644
--- a/src/plugins/imageformats/webp/main.cpp
+++ b/src/plugins/imageformats/webp/main.cpp
@@ -64,12 +64,12 @@ QWebpPlugin::Capabilities QWebpPlugin::capabilities(QIODevice *device, const QBy
if (format == "webp")
return Capabilities(CanRead | CanWrite);
+ Capabilities cap;
if (!format.isEmpty())
- return 0;
+ return cap;
if (!device->isOpen())
- return 0;
+ return cap;
- Capabilities cap;
if (device->isReadable() && QWebpHandler::canRead(device))
cap |= CanRead;
if (device->isWritable())
diff --git a/src/plugins/imageformats/webp/qwebphandler.cpp b/src/plugins/imageformats/webp/qwebphandler.cpp
index aab7aad..82d38cb 100644
--- a/src/plugins/imageformats/webp/qwebphandler.cpp
+++ b/src/plugins/imageformats/webp/qwebphandler.cpp
@@ -167,8 +167,11 @@ bool QWebpHandler::read(QImage *image)
// Read global meta-data chunks first
WebPChunkIterator metaDataIter;
if ((m_formatFlags & ICCP_FLAG) && WebPDemuxGetChunk(m_demuxer, "ICCP", 1, &metaDataIter)) {
- const QByteArray iccProfile = QByteArray::fromRawData(reinterpret_cast<const char *>(metaDataIter.chunk.bytes),
- metaDataIter.chunk.size);
+ QByteArray iccProfile = QByteArray::fromRawData(reinterpret_cast<const char *>(metaDataIter.chunk.bytes),
+ metaDataIter.chunk.size);
+ // Ensure the profile is 4-byte aligned.
+ if (reinterpret_cast<qintptr>(iccProfile.constData()) & 0x3)
+ iccProfile.detach();
m_colorSpace = QColorSpace::fromIccProfile(iccProfile);
// ### consider parsing EXIF and/or XMP metadata too.
WebPDemuxReleaseChunkIterator(&metaDataIter);
@@ -288,6 +291,7 @@ bool QWebpHandler::write(const QImage &image)
if (!WebPEncode(&config, &picture)) {
qWarning() << "failed to encode webp picture, error code: " << picture.error_code;
WebPPictureFree(&picture);
+ WebPMemoryWriterClear(&writer);
return false;
}
@@ -336,6 +340,7 @@ bool QWebpHandler::write(const QImage &image)
static_cast<size_t>(device()->write(reinterpret_cast<const char *>(writer.mem), writer.size)));
}
WebPPictureFree(&picture);
+ WebPMemoryWriterClear(&writer);
return res;
}
@@ -379,13 +384,6 @@ bool QWebpHandler::supportsOption(ImageOption option) const
|| option == BackgroundColor;
}
-#if QT_DEPRECATED_SINCE(5, 13)
-QByteArray QWebpHandler::name() const
-{
- return QByteArrayLiteral("webp");
-}
-#endif
-
int QWebpHandler::imageCount() const
{
if (!ensureScanned())
diff --git a/src/plugins/imageformats/webp/qwebphandler_p.h b/src/plugins/imageformats/webp/qwebphandler_p.h
index 96a8811..849afe3 100644
--- a/src/plugins/imageformats/webp/qwebphandler_p.h
+++ b/src/plugins/imageformats/webp/qwebphandler_p.h
@@ -57,10 +57,6 @@ public:
~QWebpHandler();
public:
-#if QT_DEPRECATED_SINCE(5, 13)
- QByteArray name() const override;
-#endif
-
bool canRead() const override;
bool read(QImage *image) override;
diff --git a/tests/auto/icns/tst_qicns.cpp b/tests/auto/icns/tst_qicns.cpp
index a9e8016..99f0cf5 100644
--- a/tests/auto/icns/tst_qicns.cpp
+++ b/tests/auto/icns/tst_qicns.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2022 The Qt Company Ltd.
** Copyright (C) 2016 Alex Char.
** Contact: https://www.qt.io/licensing/
**
@@ -40,6 +40,8 @@ private slots:
void readIcons();
void writeIcons_data();
void writeIcons();
+ void ossFuzz_data();
+ void ossFuzz();
};
void tst_qicns::initTestCase()
@@ -120,5 +122,25 @@ void tst_qicns::writeIcons()
QVERIFY(image == QImage(distPath));
}
+void tst_qicns::ossFuzz_data()
+{
+ QTest::addColumn<QByteArray>("data");
+ QTest::addColumn<QByteArrayList>("ignoredMessages");
+ QTest::newRow("47415") << QByteArray::fromRawData("icns\0\0\0\0", 8)
+ << QByteArrayList({"QICNSHandler::scanDevice(): Failed, bad header at "
+ "pos 8. OSType \"icns\", length 0",
+ "QICNSHandler::read(): The device wasn't parsed "
+ "properly!"});
+}
+
+void tst_qicns::ossFuzz()
+{
+ QFETCH(QByteArray, data);
+ QFETCH(QByteArrayList, ignoredMessages);
+ for (auto msg: ignoredMessages)
+ QTest::ignoreMessage(QtWarningMsg, msg.data());
+ QImage().loadFromData(data);
+}
+
QTEST_MAIN(tst_qicns)
#include "tst_qicns.moc"
diff --git a/tests/auto/tiff/tst_qtiff.cpp b/tests/auto/tiff/tst_qtiff.cpp
index be02460..e411f66 100644
--- a/tests/auto/tiff/tst_qtiff.cpp
+++ b/tests/auto/tiff/tst_qtiff.cpp
@@ -90,6 +90,9 @@ private slots:
void colorSpace_data();
void colorSpace();
+ void bigtiff_data();
+ void bigtiff();
+
private:
QString prefix;
};
@@ -173,6 +176,10 @@ void tst_qtiff::readImage_data()
QTest::newRow("tiled_oddsize_mono") << QString("tiled_oddsize_mono.tiff") << QSize(59, 71);
QTest::newRow("16bpc") << QString("16bpc.tiff") << QSize(64, 46);
QTest::newRow("gray16") << QString("gray16.tiff") << QSize(64, 46);
+ QTest::newRow("big_rgb") << QString("big_rgb.tiff") << QSize(64, 64);
+ QTest::newRow("big_rgb_bigendian") << QString("big_rgb_bigendian.tiff") << QSize(64, 64);
+ QTest::newRow("big_grayscale") << QString("big_grayscale.tiff") << QSize(64, 64);
+ QTest::newRow("big_16bpc") << QString("big_16bpc.tiff") << QSize(64, 46);
}
void tst_qtiff::readImage()
@@ -665,5 +672,27 @@ void tst_qtiff::colorSpace()
QCOMPARE(image2, image);
}
+void tst_qtiff::bigtiff_data()
+{
+ QTest::addColumn<QString>("expectedFile");
+ QTest::addColumn<QString>("bigtiffFile");
+
+ QTest::newRow("big_rgb") << QString("original_rgb.tiff") << QString("big_rgb.tiff");
+ QTest::newRow("big_rgb_bigendian") << QString("original_rgb.tiff") << QString("big_rgb_bigendian.tiff");
+ QTest::newRow("big_grayscale") << QString("original_grayscale.tiff") << QString("big_grayscale.tiff");
+ QTest::newRow("big_16bpc") << QString("16bpc.tiff") << QString("big_16bpc.tiff");
+}
+
+void tst_qtiff::bigtiff()
+{
+ QFETCH(QString, expectedFile);
+ QFETCH(QString, bigtiffFile);
+
+ QImage expectedImage(prefix + expectedFile);
+ QImage bigtiffImage(prefix + bigtiffFile);
+ QVERIFY(!bigtiffImage.isNull());
+ QCOMPARE(expectedImage, bigtiffImage);
+}
+
QTEST_MAIN(tst_qtiff)
#include "tst_qtiff.moc"
diff --git a/tests/shared/images/tiff.qrc b/tests/shared/images/tiff.qrc
index e1ce9da..2c876af 100644
--- a/tests/shared/images/tiff.qrc
+++ b/tests/shared/images/tiff.qrc
@@ -52,5 +52,9 @@
<file>tiff/oddsize_mono.tiff</file>
<file>tiff/tiled_rgb.tiff</file>
<file>tiff/gray16.tiff</file>
+ <file>tiff/big_rgb.tiff</file>
+ <file>tiff/big_16bpc.tiff</file>
+ <file>tiff/big_grayscale.tiff</file>
+ <file>tiff/big_rgb_bigendian.tiff</file>
</qresource>
</RCC>
diff --git a/tests/shared/images/tiff/big_16bpc.tiff b/tests/shared/images/tiff/big_16bpc.tiff
new file mode 100644
index 0000000..09f949c
--- /dev/null
+++ b/tests/shared/images/tiff/big_16bpc.tiff
Binary files differ
diff --git a/tests/shared/images/tiff/big_grayscale.tiff b/tests/shared/images/tiff/big_grayscale.tiff
new file mode 100644
index 0000000..244f8fc
--- /dev/null
+++ b/tests/shared/images/tiff/big_grayscale.tiff
Binary files differ
diff --git a/tests/shared/images/tiff/big_rgb.tiff b/tests/shared/images/tiff/big_rgb.tiff
new file mode 100644
index 0000000..18eecf2
--- /dev/null
+++ b/tests/shared/images/tiff/big_rgb.tiff
Binary files differ
diff --git a/tests/shared/images/tiff/big_rgb_bigendian.tiff b/tests/shared/images/tiff/big_rgb_bigendian.tiff
new file mode 100644
index 0000000..0d1a11f
--- /dev/null
+++ b/tests/shared/images/tiff/big_rgb_bigendian.tiff
Binary files differ